Kaynağa Gözat

2024-07-03 新增/修改

新增:
1. 客户资料模块,新增查看关联邀请方界面

修改:

1. selector_list样式调整
2. 部分代码调整
3. BUG修复
zhaiy 11 ay önce
ebeveyn
işleme
6991fc9f6e
42 değiştirilmiş dosya ile 1992 ekleme ve 138 silme
  1. 10 6
      app/src/main/AndroidManifest.xml
  2. 6 0
      app/src/main/java/com/pan_american/android/OASystem.kt
  3. 7 0
      app/src/main/java/com/pan_american/android/base/BaseActivity.kt
  4. 7 0
      app/src/main/java/com/pan_american/android/base/BaseFragment.kt
  5. 1 0
      app/src/main/java/com/pan_american/android/data/model/common/entity/Selector.kt
  6. 17 0
      app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/entity/RelatedInviteeGroupListItem.kt
  7. 20 0
      app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/entity/RelatedInviteeListItem.kt
  8. 5 0
      app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/network/RelatedInviteeCityDataResourceRequest.kt
  9. 7 0
      app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/network/RelatedInviteeDataResourceRequest.kt
  10. 11 0
      app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/network/RelatedInviteeListRequest.kt
  11. 6 0
      app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/network/RelatedInviteeListResponse.kt
  12. 2 1
      app/src/main/java/com/pan_american/android/data/model/document/network/DocumentGroupListRequest.kt
  13. 3 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_op/GroupTravelListGenerateRequest.kt
  14. 5 0
      app/src/main/java/com/pan_american/android/data/model/document/network/group_op/GroupTravelListGenerateResponse.kt
  15. 43 1
      app/src/main/java/com/pan_american/android/data/network/APIService.kt
  16. 0 1
      app/src/main/java/com/pan_american/android/ui/customer_resource/company_customer/MarketCustomerActivity.kt
  17. 36 0
      app/src/main/java/com/pan_american/android/ui/customer_resource/related_invitee/RelatedInviteeActivity.kt
  18. 223 0
      app/src/main/java/com/pan_american/android/ui/customer_resource/related_invitee/RelatedInviteeListFragment.kt
  19. 714 0
      app/src/main/java/com/pan_american/android/ui/customer_resource/related_invitee/RelatedInviteeSearchFragment.kt
  20. 127 101
      app/src/main/java/com/pan_american/android/ui/document/DocumentFragment.kt
  21. 64 3
      app/src/main/java/com/pan_american/android/ui/document/DocumentGroupListActivity.kt
  22. 7 3
      app/src/main/java/com/pan_american/android/ui/efficiency_tools/exchange_tool/ExchangeToolActivity.kt
  23. 4 0
      app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_data/AddInviteDataActivity.kt
  24. 3 3
      app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_data/InviteDataListFragment.kt
  25. 20 0
      app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_data/InviteDataSearchFragment.kt
  26. 4 0
      app/src/main/java/com/pan_american/android/ui/group_op/ground_convey_payment_insert/AddGroundConveyInfoActivity.kt
  27. 4 0
      app/src/main/java/com/pan_american/android/ui/resource_management/airplane_three_code/AirplaneThreeCodeSearchFragment.kt
  28. 4 0
      app/src/main/java/com/pan_american/android/ui/resource_management/car_resource/CarResourceSearchFragment.kt
  29. 4 0
      app/src/main/java/com/pan_american/android/ui/resource_management/guide_resource/GuideResourceSearchFragment.kt
  30. 4 0
      app/src/main/java/com/pan_american/android/ui/resource_management/hotel_resource/HotelResourceSearchFragment.kt
  31. 2 0
      app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceActivity.kt
  32. 17 1
      app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt
  33. 21 0
      app/src/main/res/layout/activity_related_invitee.xml
  34. 13 14
      app/src/main/res/layout/fragment_document.xml
  35. 33 0
      app/src/main/res/layout/fragment_related_invitee_list.xml
  36. 162 0
      app/src/main/res/layout/fragment_related_invitee_search.xml
  37. 27 0
      app/src/main/res/layout/fragment_workspace.xml
  38. 295 0
      app/src/main/res/layout/item_related_invitee_group_list.xml
  39. 21 4
      app/src/main/res/layout/popup_selector.xml
  40. 26 0
      app/src/main/res/layout/popup_table.xml
  41. BIN
      app/src/main/res/mipmap-xxhdpi/icon_related_invitee.png
  42. 7 0
      app/src/main/res/values/strings.xml

+ 10 - 6
app/src/main/AndroidManifest.xml

@@ -26,30 +26,34 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         tools:targetApi="31">
+        <activity
+            android:name=".ui.customer_resource.related_invitee.RelatedInviteeActivity"
+            android:exported="false"
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.customer_resource.market_sales_revenue.AddCustomerVisitHistoryActivity"
             android:exported="false"
-            android:launchMode="singleTop"/>
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.customer_resource.market_sales_revenue.SalesCustomerVisitListActivity"
             android:exported="false"
-            android:launchMode="singleTop"/>
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.customer_resource.market_sales_revenue.MarketSalesRevenueActivity"
             android:exported="false"
-            android:launchMode="singleTop"/>
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.document.DocumentGroupListActivity"
             android:exported="false"
-            android:launchMode="singleTop"/>
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.group_invite_official.invite_data.AddInviteDataActivity"
             android:exported="false"
-            android:launchMode="singleTop"/>
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.group_invite_official.invite_data.InviteDataActivity"
             android:exported="false"
-            android:launchMode="singleTop"/>
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.message.MessageListActivity"
             android:exported="false"

+ 6 - 0
app/src/main/java/com/pan_american/android/OASystem.kt

@@ -250,6 +250,9 @@ class OASystem : Application() {
         //市场部营业额
         const val MARKET_SALES_REVENUE = 180
 
+        //查看关联邀请方
+        const val RELATED_INVITEE = 184
+
         //CTableId
         //酒店预定
         const val C_TABLE_HOTEL_PREDETERMINE = 76
@@ -269,6 +272,9 @@ class OASystem : Application() {
         //机票费用
         const val C_TABLE_AIRPLANE_TICKET = 85
 
+        //文档下载
+        const val C_TABLE_DOCUMENT_DOWNLOAD = 1081
+
         //支付方式-保险 ID
         const val PAYMENT_WAY_INSURANCE_ID = 1057
 

+ 7 - 0
app/src/main/java/com/pan_american/android/base/BaseActivity.kt

@@ -24,6 +24,7 @@ import androidx.recyclerview.widget.RecyclerView
 import androidx.viewbinding.ViewBinding
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
+import com.scwang.smart.refresh.layout.SmartRefreshLayout
 import java.util.Calendar
 
 abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
@@ -39,6 +40,8 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
     //筛选列表组件
     lateinit var selector: RecyclerView
 
+    lateinit var selectorContainer: SmartRefreshLayout
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
@@ -174,6 +177,10 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
         showPopupWindow {
 
             selector = selectorPopView.findViewById(R.id.selector_list)
+            selectorContainer = selectorPopView.findViewById(R.id.selector_refresh_container)
+
+            selectorContainer.setEnableRefresh(false)
+            selectorContainer.setEnableLoadMore(false)
 
             val layoutManager = LinearLayoutManager(this)
             selector.layoutManager = layoutManager

+ 7 - 0
app/src/main/java/com/pan_american/android/base/BaseFragment.kt

@@ -19,6 +19,7 @@ import androidx.recyclerview.widget.RecyclerView
 import androidx.viewbinding.ViewBinding
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
+import com.scwang.smart.refresh.layout.SmartRefreshLayout
 import java.util.Calendar
 
 abstract class BaseFragment<T: ViewBinding>: Fragment() {
@@ -34,6 +35,8 @@ abstract class BaseFragment<T: ViewBinding>: Fragment() {
     //筛选列表组件
     lateinit var selector: RecyclerView
 
+    lateinit var selectorContainer: SmartRefreshLayout
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
@@ -120,6 +123,10 @@ abstract class BaseFragment<T: ViewBinding>: Fragment() {
         showPopupWindow {
 
             selector = selectorPopView.findViewById(R.id.selector_list)
+            selectorContainer = selectorPopView.findViewById(R.id.selector_refresh_container)
+
+            selectorContainer.setEnableRefresh(false)
+            selectorContainer.setEnableLoadMore(false)
 
             val layoutManager = LinearLayoutManager(OASystem.context)
             selector.layoutManager = layoutManager

+ 1 - 0
app/src/main/java/com/pan_american/android/data/model/common/entity/Selector.kt

@@ -17,6 +17,7 @@ class Selector {
     var pinyin = ""
 
     var unitArea = ""
+    var unitName = ""
 
     var isChecked = false
 

+ 17 - 0
app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/entity/RelatedInviteeGroupListItem.kt

@@ -0,0 +1,17 @@
+package com.pan_american.android.data.model.customer_resource.related_invitee.entity
+
+class RelatedInviteeGroupListItem {
+    var id = 0
+    var teamName = ""
+    var visitStartDate = ""
+    var visitEndDate = ""
+//    var teamDid = ""
+//    var teamLevSId = ""
+    var visitCountry = ""
+    var visitDays = 0
+    var visitPNumber = 0
+    var jietuanOperator = ""
+    var clientName = ""
+    var clientUnit = ""
+    val invitingInfos = ArrayList<RelatedInviteeListItem>()
+}

+ 20 - 0
app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/entity/RelatedInviteeListItem.kt

@@ -0,0 +1,20 @@
+package com.pan_american.android.data.model.customer_resource.related_invitee.entity
+
+import com.bin.david.form.annotation.SmartColumn
+import com.bin.david.form.annotation.SmartTable
+
+@SmartTable(name = "关联邀请方信息")
+class RelatedInviteeListItem {
+    var id = 0
+    var diId = 0
+    @SmartColumn(id = 2, name = "国家")
+    var country = ""
+    @SmartColumn(id = 3, name = "地区")
+    var area = ""
+    @SmartColumn(id = 4, name = "单位")
+    var client = ""
+    @SmartColumn(id = 1, name = "联系人", fixed = true)
+    var contact = ""
+    @SmartColumn(id = 5, name = "职位")
+    var job = ""
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/network/RelatedInviteeCityDataResourceRequest.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.customer_resource.related_invitee.network
+
+class RelatedInviteeCityDataResourceRequest(): RelatedInviteeDataResourceRequest() {
+    var countiesId = 0
+}

+ 7 - 0
app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/network/RelatedInviteeDataResourceRequest.kt

@@ -0,0 +1,7 @@
+package com.pan_american.android.data.model.customer_resource.related_invitee.network
+
+import com.pan_american.android.base.BaseRequest
+
+open class RelatedInviteeDataResourceRequest: BaseRequest() {
+    var search = ""
+}

+ 11 - 0
app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/network/RelatedInviteeListRequest.kt

@@ -0,0 +1,11 @@
+package com.pan_american.android.data.model.customer_resource.related_invitee.network
+
+import com.pan_american.android.base.BaseRequest
+
+class RelatedInviteeListRequest: BaseRequest() {
+
+    var counrty = ""
+    var area = ""
+    var teamName = ""
+    var unitName = ""
+}

+ 6 - 0
app/src/main/java/com/pan_american/android/data/model/customer_resource/related_invitee/network/RelatedInviteeListResponse.kt

@@ -0,0 +1,6 @@
+package com.pan_american.android.data.model.customer_resource.related_invitee.network
+
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.customer_resource.related_invitee.entity.RelatedInviteeGroupListItem
+
+class RelatedInviteeListResponse(val data: ArrayList<RelatedInviteeGroupListItem>): BaseResponse()

+ 2 - 1
app/src/main/java/com/pan_american/android/data/model/document/network/DocumentGroupListRequest.kt

@@ -4,6 +4,7 @@ import com.pan_american.android.OASystem
 import com.pan_american.android.base.BaseRequest
 
 class DocumentGroupListRequest: BaseRequest() {
-    var groupName = ""
+    var teamName = ""
     val userId = OASystem.userInfo.userId
+    val cTable = OASystem.C_TABLE_DOCUMENT_DOWNLOAD
 }

+ 3 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_op/GroupTravelListGenerateRequest.kt

@@ -0,0 +1,3 @@
+package com.pan_american.android.data.model.document.network.group_op
+
+class GroupTravelListGenerateRequest(val diid: Int, val isPDF: Int)

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/document/network/group_op/GroupTravelListGenerateResponse.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.document.network.group_op
+
+import com.pan_american.android.base.BaseResponse
+
+class GroupTravelListGenerateResponse(val data: String): BaseResponse()

+ 43 - 1
app/src/main/java/com/pan_american/android/data/network/APIService.kt

@@ -42,6 +42,10 @@ import com.pan_american.android.data.model.customer_resource.market_sales_revenu
 import com.pan_american.android.data.model.customer_resource.market_sales_revenue.network.MarketSalesStatisticsResponse
 import com.pan_american.android.data.model.customer_resource.market_sales_revenue.network.MarketSalesVisitHistoryRequest
 import com.pan_american.android.data.model.customer_resource.market_sales_revenue.network.MarketSalesVisitHistoryResponse
+import com.pan_american.android.data.model.customer_resource.related_invitee.network.RelatedInviteeCityDataResourceRequest
+import com.pan_american.android.data.model.customer_resource.related_invitee.network.RelatedInviteeDataResourceRequest
+import com.pan_american.android.data.model.customer_resource.related_invitee.network.RelatedInviteeListRequest
+import com.pan_american.android.data.model.customer_resource.related_invitee.network.RelatedInviteeListResponse
 import com.pan_american.android.data.model.daily_payment.network.AddDailyPaymentRequest
 import com.pan_american.android.data.model.daily_payment.network.DailyPaymentDetailRequest
 import com.pan_american.android.data.model.daily_payment.network.DailyPaymentDetailResponse
@@ -60,6 +64,8 @@ import com.pan_american.android.data.model.document.network.group_management.Gro
 import com.pan_american.android.data.model.document.network.group_management.GroupEnterExitCostGenerateRequest
 import com.pan_american.android.data.model.document.network.group_management.GroupManagerDocumentGenerateResponse
 import com.pan_american.android.data.model.document.network.group_management.GroupReverseTableGenerateRequest
+import com.pan_american.android.data.model.document.network.group_op.GroupTravelListGenerateRequest
+import com.pan_american.android.data.model.document.network.group_op.GroupTravelListGenerateResponse
 import com.pan_american.android.data.model.group_airplane_ticket.airplane_payment_insert.network.AirplaneCostDetailResponse
 import com.pan_american.android.data.model.group_airplane_ticket.airplane_payment_insert.network.AirplaneTicketDetailRequest
 import com.pan_american.android.data.model.group_airplane_ticket.airplane_payment_insert.network.AirplaneTicketDetailResponse
@@ -755,7 +761,7 @@ interface APIService {
     /**
      * 文档下载 团组list
      */
-    @POST("api/Business/PostGroupNameScreen")
+    @POST("api/Business/PostGroupListByCTableAndUserId")
     fun documentGroupList(@Body documentGroupListRequest: DocumentGroupListRequest): Call<SelectorResponse>
 
     /**
@@ -806,6 +812,12 @@ interface APIService {
     @POST("api/Groups/PostEnterExitCostDownload")
     fun groupEnterExitCostGenerate(@Body groupEnterExitCostGenerateRequest: GroupEnterExitCostGenerateRequest): Call<GroupManagerDocumentGenerateResponse>
 
+    /**
+     * 文档下载,导出行程单
+     */
+    @POST("api/Groups/ExportTravel")
+    fun groupTravelListGenerate(@Body groupTravelListGenerateRequest: GroupTravelListGenerateRequest): Call<GroupTravelListGenerateResponse>
+
     /**
      * 市场部营业额,基础数据源(公司、人员、月份、季度)
      */
@@ -854,4 +866,34 @@ interface APIService {
      */
     @POST("api/Statistics/PostMarketingSalesVCOperate")
     fun updateMarketSalesVisitHistory(@Body marketSalesAddVisitHistoryRequest: MarketSalesAddVisitHistoryRequest): Call<BaseResponse>
+
+    /**
+     * 查看关联邀请方,搜索基础数据源,邀请方
+     */
+    @POST("api/Groups/PostGroupLinkInvitingUnitNameInit")
+    fun getGroupRelatedDataSourceInviteeName(@Body relatedInviteeDataResourceRequest: RelatedInviteeDataResourceRequest): Call<SelectorResponse>
+
+    /**
+     * 查看关联邀请方,搜索基础数据源,国家
+     */
+    @POST("api/Groups/PostGroupLinkInvitingCountryInit")
+    fun getGroupRelatedDataSourceCountryName(@Body relatedInviteeDataResourceRequest: RelatedInviteeDataResourceRequest): Call<SelectorResponse>
+
+    /**
+     * 查看关联邀请方,搜索基础数据源,城市
+     */
+    @POST("api/Groups/PostGroupLinkInvitingCityInit")
+    fun getGroupRelatedDataSourceCityName(@Body relatedInviteeCityDataResourceRequest: RelatedInviteeCityDataResourceRequest): Call<SelectorResponse>
+
+    /**
+     * 查看关联邀请方,搜索基础数据源,团组名称
+     */
+    @POST("api/Groups/PostGroupLinkInvitingGroupInit")
+    fun getGroupRelatedDataSourceGroupName(@Body relatedInviteeDataResourceRequest: RelatedInviteeDataResourceRequest): Call<SelectorResponse>
+
+    /**
+     * 关联邀请方,获取符合筛选条件的团组list
+     */
+    @POST("api/Groups/PostGroupLinkInvitingPageList")
+    fun getRelatedInviteeGroupList(@Body relatedInviteeListRequest: RelatedInviteeListRequest): Call<RelatedInviteeListResponse>
 }

+ 0 - 1
app/src/main/java/com/pan_american/android/ui/customer_resource/company_customer/MarketCustomerActivity.kt

@@ -324,7 +324,6 @@ class MarketCustomerActivity : BaseActivity<ActivityMarketCustomerBinding>() {
 
                                 if (marketCustomerListItemList.size == 0) {
                                     showMessage(resources.getString(R.string.no_data))
-                                    return
                                 }
 
                                 when (type) {

+ 36 - 0
app/src/main/java/com/pan_american/android/ui/customer_resource/related_invitee/RelatedInviteeActivity.kt

@@ -0,0 +1,36 @@
+package com.pan_american.android.ui.customer_resource.related_invitee
+
+import android.os.Bundle
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseActivity
+import com.pan_american.android.databinding.ActivityRelatedInviteeBinding
+import com.pan_american.android.databinding.LayoutTitleBinding
+
+class RelatedInviteeActivity : BaseActivity<ActivityRelatedInviteeBinding>() {
+
+    private lateinit var titleBinding: LayoutTitleBinding
+
+    override fun getViewBinding() = ActivityRelatedInviteeBinding.inflate(layoutInflater)
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        initTitle()
+        initViews()
+    }
+
+    override fun initTitle() {
+        titleBinding = LayoutTitleBinding.bind(binding.root).apply {
+            titleText.text = resources.getString(R.string.group_related_invitee)
+
+            backButton.setOnClickListener {
+                back()
+            }
+        }
+    }
+
+    override fun initViews() {
+        supportFragmentManager.beginTransaction().addToBackStack(null)
+            .replace(binding.relatedInviteeContainer.id, RelatedInviteeSearchFragment()).commit()
+    }
+}

+ 223 - 0
app/src/main/java/com/pan_american/android/ui/customer_resource/related_invitee/RelatedInviteeListFragment.kt

@@ -0,0 +1,223 @@
+package com.pan_american.android.ui.customer_resource.related_invitee
+
+import android.os.Bundle
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.PopupWindow
+import android.widget.TextView
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.bin.david.form.core.SmartTable
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseFragment
+import com.pan_american.android.base.ListAdapter
+import com.pan_american.android.data.model.customer_resource.related_invitee.entity.RelatedInviteeGroupListItem
+import com.pan_american.android.data.model.customer_resource.related_invitee.entity.RelatedInviteeListItem
+import com.pan_american.android.data.model.customer_resource.related_invitee.network.RelatedInviteeListRequest
+import com.pan_american.android.data.model.customer_resource.related_invitee.network.RelatedInviteeListResponse
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.FragmentRelatedInviteeListBinding
+import com.scwang.smart.refresh.footer.ClassicsFooter
+import com.scwang.smart.refresh.header.ClassicsHeader
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class RelatedInviteeListFragment : BaseFragment<FragmentRelatedInviteeListBinding>() {
+
+    private val relatedInviteeListRequest = RelatedInviteeListRequest()
+
+    private var pageIndex = 1
+
+    private var totalPage = 0
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    private var listInit = false
+
+    private var relatedInviteeGroupList = ArrayList<RelatedInviteeGroupListItem>()
+
+    override fun getViewBinding(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        bundle: Bundle?
+    ) = FragmentRelatedInviteeListBinding.inflate(layoutInflater, container, false)
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        requireArguments().apply {
+            relatedInviteeListRequest.counrty = getString("country", "")
+            relatedInviteeListRequest.area = getString("city", "")
+            relatedInviteeListRequest.teamName = getString("group_name", "")
+            relatedInviteeListRequest.unitName = getString("invitee_name", "")
+        }
+    }
+
+    override fun onStart() {
+        super.onStart()
+
+        relatedInviteeListRequest.pageIndex = pageIndex
+        relatedInviteeListRequest.pageSize = 10
+
+        initViews()
+    }
+
+    override fun initViews() {
+        binding.relatedInviteeListContainer.setRefreshHeader(ClassicsHeader(OASystem.context))
+        binding.relatedInviteeListContainer.setRefreshFooter(ClassicsFooter(OASystem.context))
+
+        initRelatedInviteeGroupList(1)
+    }
+
+    private fun initRelatedInviteeGroupList(type: Int) {
+
+        if (!isAdded) {
+            return
+        }
+
+        if (!listInit) {
+            apiService.getRelatedInviteeGroupList(relatedInviteeListRequest).enqueue(object :
+                Callback<RelatedInviteeListResponse> {
+                override fun onResponse(
+                    p0: Call<RelatedInviteeListResponse>,
+                    response: Response<RelatedInviteeListResponse>
+                ) {
+                    val listResponse = response.body()
+
+                    if (listResponse != null) {
+                        if (listResponse.code == 200) {
+
+                            for (item in listResponse.data) {
+                                relatedInviteeGroupList.add(item)
+                            }
+
+                            when (type) {
+                                1 -> {
+                                    totalPage = getTotalPage(listResponse.count)
+                                    binding.relatedInviteeListContainer.setEnableLoadMore(pageIndex < totalPage)
+                                    initList()
+                                    listInit = true
+                                }
+
+                                2 -> {
+                                    binding.relatedInviteeListContainer.finishRefresh()
+                                    totalPage = getTotalPage(listResponse.count)
+                                    binding.relatedInviteeListContainer.setEnableLoadMore(pageIndex < totalPage)
+                                    initList()
+                                    listInit = true
+                                }
+
+                                3 -> {
+                                    binding.relatedInviteeListContainer.finishLoadMore()
+                                    binding.relatedInviteeListContainer.setEnableLoadMore(pageIndex < totalPage)
+                                    binding.relatedInviteeList.adapter!!.notifyItemInserted(relatedInviteeGroupList.size)
+                                    listInit = true
+                                }
+                            }
+
+                        } else {
+                            showMessage(listResponse.msg)
+                        }
+                    }
+                }
+
+                override fun onFailure(p0: Call<RelatedInviteeListResponse>, p1: Throwable) {
+                    showErrorInfo(R.string.group_list_get_failed)
+                }
+            })
+        }
+    }
+
+    private fun initList() {
+        if (relatedInviteeGroupList.size == 0) {
+            return
+        }
+
+        val layoutManager = LinearLayoutManager(OASystem.context)
+        binding.relatedInviteeList.layoutManager = layoutManager
+
+        val adapter = ListAdapter.Builder<RelatedInviteeGroupListItem>().apply {
+            setData(relatedInviteeGroupList)
+            setLayoutId(R.layout.item_related_invitee_group_list)
+            addBindView { itemView, data ->
+                itemView.findViewById<TextView>(R.id.group_name).text = data.teamName
+                itemView.findViewById<TextView>(R.id.customer_company).text = data.clientUnit
+                itemView.findViewById<TextView>(R.id.client_name).text = data.clientName
+                itemView.findViewById<TextView>(R.id.start_time).text = data.visitStartDate.substring(0, 10)
+                itemView.findViewById<TextView>(R.id.end_time).text = data.visitEndDate.substring(0, 10)
+                itemView.findViewById<TextView>(R.id.days).text = data.visitDays.toString()
+                itemView.findViewById<TextView>(R.id.members).text = data.visitPNumber.toString()
+                itemView.findViewById<TextView>(R.id.country).text = data.visitCountry
+                itemView.findViewById<TextView>(R.id.director).text = data.jietuanOperator
+            }
+        }.create()
+
+        binding.relatedInviteeList.adapter = adapter
+
+        adapter.onRecyclerViewItemClick = object : ListAdapter.OnRecyclerViewItemClick<RelatedInviteeGroupListItem> {
+            override fun onItemClick(position: Int) {
+                val relatedInviteePopView = View.inflate(OASystem.context, R.layout.popup_table, null)
+                popupWindow = PopupWindow(relatedInviteePopView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+
+                showPopupWindow {
+                    val relatedInviteeTable = relatedInviteePopView.findViewById<SmartTable<RelatedInviteeListItem>>(R.id.table)
+                    val title = relatedInviteePopView.findViewById<TextView>(R.id.title)
+
+                    title.text = resources.getString(R.string.group_related_invitee)
+
+                    relatedInviteeTable.config.apply {
+                        isShowTableTitle = false
+                        isShowXSequence = false
+                        isShowYSequence = false
+                        verticalPadding = resources.getDimensionPixelSize(R.dimen.common_padding)
+//                        columnTitleStyle = FontStyle(resources.getDimensionPixelSize(R.dimen.text_size_large), ResourcesCompat.getColor(resources, R.color.text_color, null))
+//                        contentStyle = FontStyle(resources.getDimensionPixelSize(R.dimen.text_size_medium), ResourcesCompat.getColor(resources, R.color.text_color, null))
+                    }
+
+                    relatedInviteeTable.apply {
+                        setZoom(false)
+                        setData(relatedInviteeGroupList[position].invitingInfos)
+                    }
+
+                    popupWindow.showAtLocation(binding.root, Gravity.BOTTOM, 0, 0)
+                }
+            }
+        }
+
+        binding.relatedInviteeListContainer.setOnRefreshLoadMoreListener(object :
+            OnRefreshLoadMoreListener {
+            override fun onRefresh(refreshLayout: RefreshLayout) {
+                pageIndex = 1
+                relatedInviteeListRequest.pageIndex = pageIndex
+                relatedInviteeGroupList.clear()
+                binding.relatedInviteeList.adapter!!.notifyItemRangeRemoved(0, relatedInviteeGroupList.size)
+                listInit = false
+                initRelatedInviteeGroupList(2)
+            }
+
+            override fun onLoadMore(refreshLayout: RefreshLayout) {
+                if (pageIndex < totalPage) {
+                    pageIndex += 1
+                    relatedInviteeListRequest.pageIndex = pageIndex
+                    listInit = false
+                    initRelatedInviteeGroupList(3)
+                }
+            }
+        })
+    }
+
+    private fun getTotalPage(dataCount: Int): Int {
+        var totalPage = dataCount / 10
+        if (dataCount % 10 != 0) {
+            totalPage++
+        }
+
+        return totalPage
+    }
+}

+ 714 - 0
app/src/main/java/com/pan_american/android/ui/customer_resource/related_invitee/RelatedInviteeSearchFragment.kt

@@ -0,0 +1,714 @@
+package com.pan_american.android.ui.customer_resource.related_invitee
+
+import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.EditText
+import android.widget.LinearLayout
+import android.widget.PopupWindow
+import android.widget.TextView
+import androidx.core.content.res.ResourcesCompat
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseFragment
+import com.pan_american.android.base.ListAdapter
+import com.pan_american.android.data.model.common.entity.Selector
+import com.pan_american.android.data.model.common.network.SelectorResponse
+import com.pan_american.android.data.model.customer_resource.related_invitee.network.RelatedInviteeCityDataResourceRequest
+import com.pan_american.android.data.model.customer_resource.related_invitee.network.RelatedInviteeDataResourceRequest
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.FragmentRelatedInviteeSearchBinding
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class RelatedInviteeSearchFragment : BaseFragment<FragmentRelatedInviteeSearchBinding>() {
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    private val countryDataRequest = RelatedInviteeDataResourceRequest()
+
+    private val countryDataList = ArrayList<Selector>()
+
+    private var countryId = 0
+
+    private var countrySelected = false
+
+    private val cityDataRequest = RelatedInviteeCityDataResourceRequest()
+
+    private val cityDataList = ArrayList<Selector>()
+
+    private val groupNameDataRequest = RelatedInviteeDataResourceRequest()
+
+    private val groupNameList = ArrayList<Selector>()
+
+    private val inviteeNameDataRequest = RelatedInviteeDataResourceRequest()
+
+    private val inviteeNameList = ArrayList<Selector>()
+
+    override fun getViewBinding(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        bundle: Bundle?
+    ) = FragmentRelatedInviteeSearchBinding.inflate(layoutInflater, container, false)
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        binding.commit.setText(resources.getString(R.string.search))
+    }
+
+    override fun onStart() {
+        super.onStart()
+
+        initEvents()
+    }
+
+    override fun initEvents() {
+        binding.country.setOnClickListener {
+            countryDataRequest.apply {
+                pageIndex = 1
+                pageSize = 12
+                search = ""
+            }
+
+            countryDataList.clear()
+
+            getCountryResource(1)
+        }
+
+        binding.area.setOnClickListener {
+            if (!countrySelected) {
+                showMessage(resources.getString(R.string.country_select_hint))
+                return@setOnClickListener
+            }
+
+            cityDataRequest.apply {
+                pageIndex = 1
+                pageSize = 12
+                search = ""
+                countiesId = countryId
+            }
+
+            cityDataList.clear()
+
+            getCityResource(1)
+        }
+
+        binding.groupName.setOnClickListener {
+            groupNameDataRequest.apply {
+                pageIndex = 1
+                pageSize = 12
+                search = ""
+            }
+
+            groupNameList.clear()
+
+            getGroupNameResource(1)
+        }
+
+        binding.inviteeName.setOnClickListener {
+            inviteeNameDataRequest.apply {
+                pageIndex = 1
+                pageSize = 12
+                search = ""
+            }
+
+            inviteeNameList.clear()
+
+            getInviteeNameResource(1)
+        }
+
+        binding.commit.setOnClickListener{
+            val relatedInviteeListFragment = RelatedInviteeListFragment()
+
+            val bundle = Bundle().apply {
+                putString("country", binding.country.text.toString())
+                putString("city", binding.area.text.toString())
+                putString("group_name", binding.groupName.text.toString())
+                putString("invitee_name", binding.inviteeName.text.toString())
+            }
+
+            relatedInviteeListFragment.arguments = bundle
+
+            parentFragmentManager.beginTransaction().setCustomAnimations(
+                R.anim.slide_right_in,
+                R.anim.slide_left_out,
+                R.anim.slide_left_in,
+                R.anim.slide_right_out
+            ).addToBackStack(null)
+                .replace(R.id.related_invitee_container, relatedInviteeListFragment).commit()
+        }
+    }
+
+    private fun getCountryResource(type: Int) {
+        apiService.getGroupRelatedDataSourceCountryName(countryDataRequest).enqueue(object : Callback<SelectorResponse> {
+            override fun onResponse(p0: Call<SelectorResponse>, response: Response<SelectorResponse>) {
+                val resourceResponse = response.body()
+
+                if (resourceResponse != null) {
+                    if (resourceResponse.code == 200) {
+
+                        for (item in resourceResponse.data) {
+                            countryDataList.add(item)
+                        }
+
+                        when(type) {
+                            1 -> {
+
+                                val popView = View.inflate(OASystem.context, R.layout.popup_selector, null)
+                                popupWindow = PopupWindow(popView, RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT)
+
+                                showPopupWindow {
+                                    val searchView: LinearLayout = popView.findViewById(R.id.search_view)
+                                    searchView.visibility = View.VISIBLE
+
+                                    val searchText: EditText = popView.findViewById(R.id.search_text)
+
+                                    selector = popView.findViewById(R.id.selector_list)
+
+                                    selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                                    selectorContainer.setEnableRefresh(true)
+                                    selectorContainer.setEnableLoadMore(true)
+
+                                    val layoutManager = LinearLayoutManager(OASystem.context)
+                                    selector.layoutManager = layoutManager
+
+                                    val adapter = ListAdapter.Builder<Selector>().apply {
+                                        setData(countryDataList)
+                                        setLayoutId(R.layout.item_selector)
+                                        addBindView { itemView, data ->
+                                            itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+                                                text = data.name
+
+                                                if (countryId == data.id) {
+                                                    setTextColor(ResourcesCompat.getColor(resources, R.color.text_color_blue, null))
+                                                } else {
+                                                    setTextColor(ResourcesCompat.getColor(resources, R.color.text_color, null))
+                                                }
+                                            }
+                                        }
+                                    }.create()
+
+                                    selector.adapter = adapter
+
+                                    adapter.onRecyclerViewItemClick =
+                                        object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                                            override fun onItemClick(position: Int) {
+                                                countryDataList[position].apply {
+                                                    binding.country.text = name
+
+                                                    countryId = id
+
+                                                    countrySelected = true
+
+                                                    popupWindow.dismiss()
+                                                }
+                                            }
+                                        }
+
+                                    selectorContainer.setOnRefreshLoadMoreListener(object :
+                                        OnRefreshLoadMoreListener {
+                                        override fun onRefresh(p0: RefreshLayout) {
+                                            countryDataRequest.pageIndex = 1
+
+                                            selector.adapter!!.notifyItemRangeRemoved(0, countryDataList.size)
+
+                                            countryDataList.clear()
+
+                                            getCountryResource(2)
+                                        }
+
+                                        override fun onLoadMore(p0: RefreshLayout) {
+                                            countryDataRequest.pageIndex += 1
+
+                                            getCountryResource(3)
+                                        }
+                                    })
+
+                                    searchText.addTextChangedListener(object : TextWatcher {
+                                        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                                        }
+
+                                        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                                        }
+
+                                        override fun afterTextChanged(editable: Editable?) {
+
+                                            adapter.notifyItemRangeRemoved(0, countryDataList.size)
+
+                                            countryDataList.clear()
+
+                                            countryDataRequest.apply {
+                                                pageIndex = 1
+                                                search = editable.toString()
+                                            }
+
+                                            getCountryResource(2)
+                                        }
+                                    })
+
+                                    popupWindow.showAtLocation(binding.root, Gravity.BOTTOM, 0, 0)
+                                }
+
+                                selectorContainer.setEnableLoadMore(countryDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(0)
+                            }
+
+                            2 -> {
+                                selectorContainer.finishRefresh()
+                                selectorContainer.setEnableLoadMore(countryDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(0)
+                            }
+
+                            3 -> {
+                                selectorContainer.finishLoadMore()
+                                selectorContainer.setEnableLoadMore(countryDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(countryDataList.size)
+                            }
+                        }
+
+                    } else {
+                        showMessage(resourceResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<SelectorResponse>, p1: Throwable) {
+                showErrorInfo(R.string.base_resource_data_get_failed)
+            }
+        })
+    }
+
+    private fun getCityResource(type: Int) {
+        apiService.getGroupRelatedDataSourceCityName(cityDataRequest).enqueue(object : Callback<SelectorResponse> {
+            override fun onResponse(p0: Call<SelectorResponse>, response: Response<SelectorResponse>) {
+                val resourceResponse = response.body()
+
+                if (resourceResponse != null) {
+                    if (resourceResponse.code == 200) {
+
+                        for (item in resourceResponse.data) {
+                            cityDataList.add(item)
+                        }
+
+                        when(type) {
+                            1 -> {
+
+                                val popView = View.inflate(OASystem.context, R.layout.popup_selector, null)
+                                popupWindow = PopupWindow(popView, RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT)
+
+                                showPopupWindow {
+                                    val searchView: LinearLayout = popView.findViewById(R.id.search_view)
+                                    searchView.visibility = View.VISIBLE
+
+                                    val searchText: EditText = popView.findViewById(R.id.search_text)
+
+                                    selector = popView.findViewById(R.id.selector_list)
+
+                                    selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                                    selectorContainer.setEnableRefresh(true)
+                                    selectorContainer.setEnableLoadMore(true)
+
+                                    val layoutManager = LinearLayoutManager(OASystem.context)
+                                    selector.layoutManager = layoutManager
+
+                                    val adapter = ListAdapter.Builder<Selector>().apply {
+                                        setData(cityDataList)
+                                        setLayoutId(R.layout.item_selector)
+                                        addBindView { itemView, data ->
+                                            itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+                                                text = data.name
+
+                                                if (binding.area.text == data.name) {
+                                                    setTextColor(ResourcesCompat.getColor(resources, R.color.text_color_blue, null))
+                                                } else {
+                                                    setTextColor(ResourcesCompat.getColor(resources, R.color.text_color, null))
+                                                }
+                                            }
+                                        }
+                                    }.create()
+
+                                    selector.adapter = adapter
+
+                                    adapter.onRecyclerViewItemClick =
+                                        object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                                            override fun onItemClick(position: Int) {
+                                                cityDataList[position].apply {
+                                                    binding.area.text = name
+
+                                                    popupWindow.dismiss()
+                                                }
+                                            }
+                                        }
+
+                                    selectorContainer.setOnRefreshLoadMoreListener(object :
+                                        OnRefreshLoadMoreListener {
+                                        override fun onRefresh(p0: RefreshLayout) {
+                                            cityDataRequest.pageIndex = 1
+
+                                            selector.adapter!!.notifyItemRangeRemoved(0, cityDataList.size)
+
+                                            cityDataList.clear()
+
+                                            getCityResource(2)
+                                        }
+
+                                        override fun onLoadMore(p0: RefreshLayout) {
+                                            cityDataRequest.pageIndex += 1
+
+                                            getCityResource(3)
+                                        }
+                                    })
+
+                                    searchText.addTextChangedListener(object : TextWatcher {
+                                        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                                        }
+
+                                        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                                        }
+
+                                        override fun afterTextChanged(editable: Editable?) {
+
+                                            adapter.notifyItemRangeRemoved(0, cityDataList.size)
+
+                                            cityDataList.clear()
+
+                                            cityDataRequest.apply {
+                                                pageIndex = 1
+                                                search = editable.toString()
+                                            }
+
+                                            getCityResource(2)
+                                        }
+                                    })
+
+                                    popupWindow.showAtLocation(binding.root, Gravity.BOTTOM, 0, 0)
+                                }
+
+                                selectorContainer.setEnableLoadMore(cityDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(0)
+                            }
+
+                            2 -> {
+                                selectorContainer.finishRefresh()
+                                selectorContainer.setEnableLoadMore(cityDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(0)
+                            }
+
+                            3 -> {
+                                selectorContainer.finishLoadMore()
+                                selectorContainer.setEnableLoadMore(cityDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(cityDataList.size)
+                            }
+                        }
+
+                    } else {
+                        showMessage(resourceResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<SelectorResponse>, p1: Throwable) {
+                showErrorInfo(R.string.base_resource_data_get_failed)
+            }
+        })
+    }
+
+    private fun getGroupNameResource(type: Int) {
+        apiService.getGroupRelatedDataSourceGroupName(groupNameDataRequest).enqueue(object : Callback<SelectorResponse> {
+            override fun onResponse(p0: Call<SelectorResponse>, response: Response<SelectorResponse>) {
+                val resourceResponse = response.body()
+
+                if (resourceResponse != null) {
+                    if (resourceResponse.code == 200) {
+
+                        for (item in resourceResponse.data) {
+                            groupNameList.add(item)
+                        }
+
+                        when(type) {
+                            1 -> {
+
+                                val popView = View.inflate(OASystem.context, R.layout.popup_selector, null)
+                                popupWindow = PopupWindow(popView, RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT)
+
+                                showPopupWindow {
+                                    val searchView: LinearLayout = popView.findViewById(R.id.search_view)
+                                    searchView.visibility = View.VISIBLE
+
+                                    val searchText: EditText = popView.findViewById(R.id.search_text)
+
+                                    selector = popView.findViewById(R.id.selector_list)
+
+                                    selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                                    selectorContainer.setEnableRefresh(true)
+                                    selectorContainer.setEnableLoadMore(true)
+
+                                    val layoutManager = LinearLayoutManager(OASystem.context)
+                                    selector.layoutManager = layoutManager
+
+                                    val adapter = ListAdapter.Builder<Selector>().apply {
+                                        setData(groupNameList)
+                                        setLayoutId(R.layout.item_selector)
+                                        addBindView { itemView, data ->
+                                            itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+                                                text = data.name
+
+                                                if (binding.groupName.text == data.name) {
+                                                    setTextColor(ResourcesCompat.getColor(resources, R.color.text_color_blue, null))
+                                                } else {
+                                                    setTextColor(ResourcesCompat.getColor(resources, R.color.text_color, null))
+                                                }
+                                            }
+                                        }
+                                    }.create()
+
+                                    selector.adapter = adapter
+
+                                    adapter.onRecyclerViewItemClick =
+                                        object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                                            override fun onItemClick(position: Int) {
+                                                groupNameList[position].apply {
+                                                    binding.groupName.text = name
+
+                                                    popupWindow.dismiss()
+                                                }
+                                            }
+                                        }
+
+                                    selectorContainer.setOnRefreshLoadMoreListener(object :
+                                        OnRefreshLoadMoreListener {
+                                        override fun onRefresh(p0: RefreshLayout) {
+                                            groupNameDataRequest.pageIndex = 1
+
+                                            selector.adapter!!.notifyItemRangeRemoved(0, groupNameList.size)
+
+                                            groupNameList.clear()
+
+                                            getGroupNameResource(2)
+                                        }
+
+                                        override fun onLoadMore(p0: RefreshLayout) {
+                                            groupNameDataRequest.pageIndex += 1
+
+                                            getGroupNameResource(3)
+                                        }
+                                    })
+
+                                    searchText.addTextChangedListener(object : TextWatcher {
+                                        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                                        }
+
+                                        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                                        }
+
+                                        override fun afterTextChanged(editable: Editable?) {
+
+                                            adapter.notifyItemRangeRemoved(0, groupNameList.size)
+
+                                            groupNameList.clear()
+
+                                            groupNameDataRequest.apply {
+                                                pageIndex = 1
+                                                search = editable.toString()
+                                            }
+
+                                            getGroupNameResource(2)
+                                        }
+                                    })
+
+                                    popupWindow.showAtLocation(binding.root, Gravity.BOTTOM, 0, 0)
+                                }
+
+                                selectorContainer.setEnableLoadMore(groupNameDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(0)
+                            }
+
+                            2 -> {
+                                selectorContainer.finishRefresh()
+                                selectorContainer.setEnableLoadMore(groupNameDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(0)
+                            }
+
+                            3 -> {
+                                selectorContainer.finishLoadMore()
+                                selectorContainer.setEnableLoadMore(groupNameDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(groupNameList.size)
+                            }
+                        }
+
+                    } else {
+                        showMessage(resourceResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<SelectorResponse>, p1: Throwable) {
+                showErrorInfo(R.string.base_resource_data_get_failed)
+            }
+        })
+    }
+
+    private fun getInviteeNameResource(type: Int) {
+        apiService.getGroupRelatedDataSourceInviteeName(inviteeNameDataRequest).enqueue(object : Callback<SelectorResponse> {
+            override fun onResponse(p0: Call<SelectorResponse>, response: Response<SelectorResponse>) {
+                val resourceResponse = response.body()
+
+                if (resourceResponse != null) {
+                    if (resourceResponse.code == 200) {
+
+                        for (item in resourceResponse.data) {
+                            inviteeNameList.add(item)
+                        }
+
+                        when(type) {
+                            1 -> {
+
+                                val popView = View.inflate(OASystem.context, R.layout.popup_selector, null)
+                                popupWindow = PopupWindow(popView, RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT)
+
+                                showPopupWindow {
+                                    val searchView: LinearLayout = popView.findViewById(R.id.search_view)
+                                    searchView.visibility = View.VISIBLE
+
+                                    val searchText: EditText = popView.findViewById(R.id.search_text)
+
+                                    selector = popView.findViewById(R.id.selector_list)
+
+                                    selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                                    selectorContainer.setEnableRefresh(true)
+                                    selectorContainer.setEnableLoadMore(true)
+
+                                    val layoutManager = LinearLayoutManager(OASystem.context)
+                                    selector.layoutManager = layoutManager
+
+                                    val adapter = ListAdapter.Builder<Selector>().apply {
+                                        setData(inviteeNameList)
+                                        setLayoutId(R.layout.item_selector)
+                                        addBindView { itemView, data ->
+                                            itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+                                                text = data.unitName
+
+                                                if (binding.inviteeName.text == data.unitName) {
+                                                    setTextColor(ResourcesCompat.getColor(resources, R.color.text_color_blue, null))
+                                                } else {
+                                                    setTextColor(ResourcesCompat.getColor(resources, R.color.text_color, null))
+                                                }
+                                            }
+                                        }
+                                    }.create()
+
+                                    selector.adapter = adapter
+
+                                    adapter.onRecyclerViewItemClick =
+                                        object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                                            override fun onItemClick(position: Int) {
+                                                inviteeNameList[position].apply {
+                                                    binding.inviteeName.text = name
+
+                                                    popupWindow.dismiss()
+                                                }
+                                            }
+                                        }
+
+                                    selectorContainer.setOnRefreshLoadMoreListener(object :
+                                        OnRefreshLoadMoreListener {
+                                        override fun onRefresh(p0: RefreshLayout) {
+                                            inviteeNameDataRequest.pageIndex = 1
+
+                                            selector.adapter!!.notifyItemRangeRemoved(0, inviteeNameList.size)
+
+                                            inviteeNameList.clear()
+
+                                            getInviteeNameResource(2)
+                                        }
+
+                                        override fun onLoadMore(p0: RefreshLayout) {
+                                            inviteeNameDataRequest.pageIndex += 1
+
+                                            getInviteeNameResource(3)
+                                        }
+                                    })
+
+                                    searchText.addTextChangedListener(object : TextWatcher {
+                                        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                                        }
+
+                                        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+
+                                        }
+
+                                        override fun afterTextChanged(editable: Editable?) {
+
+                                            adapter.notifyItemRangeRemoved(0, inviteeNameList.size)
+
+                                            inviteeNameList.clear()
+
+                                            inviteeNameDataRequest.apply {
+                                                pageIndex = 1
+                                                search = editable.toString()
+                                            }
+
+                                            getInviteeNameResource(2)
+                                        }
+                                    })
+
+                                    popupWindow.showAtLocation(binding.root, Gravity.BOTTOM, 0, 0)
+                                }
+
+                                selectorContainer.setEnableLoadMore(inviteeNameDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(0)
+                            }
+
+                            2 -> {
+                                selectorContainer.finishRefresh()
+                                selectorContainer.setEnableLoadMore(inviteeNameDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(0)
+                            }
+
+                            3 -> {
+                                selectorContainer.finishLoadMore()
+                                selectorContainer.setEnableLoadMore(inviteeNameDataRequest.pageIndex < getTotalPage(resourceResponse.count))
+                                selector.adapter!!.notifyItemInserted(inviteeNameList.size)
+                            }
+                        }
+
+                    } else {
+                        showMessage(resourceResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<SelectorResponse>, p1: Throwable) {
+                showErrorInfo(R.string.base_resource_data_get_failed)
+            }
+        })
+    }
+
+    private fun getTotalPage(count: Int): Int {
+        var pageCount = count / 10
+
+        if (count % 10 > 0) {
+            pageCount += 1
+        }
+
+        return pageCount
+    }
+}

+ 127 - 101
app/src/main/java/com/pan_american/android/ui/document/DocumentFragment.kt

@@ -21,111 +21,136 @@ class DocumentFragment : BaseFragment<FragmentDocumentBinding>(), OnClickListene
     override fun onStart() {
         super.onStart()
 
-        initViews()
+        initEvents()
     }
 
-    override fun initViews() {
-
-        for (item in OASystem.authData) {
-            when (item.pageId) {
-
-                OASystem.HOTEL_PREDETERMINE -> {
-                    if (OASystem.authorization(OASystem.HOTEL_PREDETERMINE, OASystem.DOWNLOAD)) {
-                        if (binding.groupHotel.visibility == View.GONE) {
-                            binding.groupHotel.visibility = View.VISIBLE
-                        }
-
-                        binding.voucher.setOnClickListener(this)
-                        binding.confirmList.setOnClickListener(this)
-                        binding.predetermineCost.setOnClickListener(this)
-
-                        if (OASystem.userInfo.depName == "市场部") {
-                            binding.predetermineCost.visibility = View.GONE
-                        }
-                    }
-                }
-
-                OASystem.AIRPLANE_PAYMENT_INSERT -> {
-                    if (OASystem.authorization(OASystem.AIRPLANE_PAYMENT_INSERT, OASystem.DOWNLOAD)) {
-                        if (binding.groupAirplaneTicket.visibility == View.GONE) {
-                            binding.groupAirplaneTicket.visibility = View.VISIBLE
-                        }
-
-                        binding.airplaneReportForm.setOnClickListener(this)
-                        binding.chTravelItinerary.setOnClickListener(this)
-                        binding.enTravelItinerary.setOnClickListener(this)
-
-                        if (OASystem.userInfo.depName == "市场部") {
-                            binding.airplaneReportForm.visibility = View.GONE
-                        }
-                    }
-                }
-
-                OASystem.OP_TRAVEL_ITINERARY -> {
-                    if (OASystem.authorization(OASystem.OP_TRAVEL_ITINERARY, OASystem.DOWNLOAD)) {
-                        if (binding.groupOp.visibility == View.GONE) {
-                            binding.groupOp.visibility = View.VISIBLE
-                        }
-
-                        binding.opTravelItineraryWord.setOnClickListener(this)
-                        binding.opTravelItineraryPdf.setOnClickListener(this)
-                    }
-                }
-
-                OASystem.GROUP_CLIENT_LIST -> {
-                    if (OASystem.authorization(OASystem.GROUP_CLIENT_LIST, OASystem.DOWNLOAD)) {
-                        if (binding.groupManager.visibility == View.GONE) {
-                            binding.groupManager.visibility = View.VISIBLE
-                        }
-
-                        binding.groupCustomerListCh.visibility = View.VISIBLE
-                        binding.groupCustomerListCh.setOnClickListener(this)
-
-                        binding.groupCustomerListEn.visibility = View.VISIBLE
-                        binding.groupCustomerListEn.setOnClickListener(this)
-                    }
-                }
-
-                OASystem.REVERSE_TABLE -> {
-                    if (OASystem.authorization(OASystem.REVERSE_TABLE, OASystem.DOWNLOAD)) {
-                        if (binding.groupManager.visibility == View.GONE) {
-                            binding.groupManager.visibility = View.VISIBLE
-                        }
-
-                        binding.reverseTable.visibility = View.VISIBLE
-                        binding.reverseTable.setOnClickListener(this)
-                    }
-                }
-
-                OASystem.ENTER_AND_LEAVE_PAYMENT_DETAIL -> {
-                    if (OASystem.authorization(OASystem.ENTER_AND_LEAVE_PAYMENT_DETAIL, OASystem.DOWNLOAD)) {
-                        if (binding.groupManager.visibility == View.GONE) {
-                            binding.groupManager.visibility = View.VISIBLE
-                        }
-
-                        binding.foundsExamineForm.visibility = View.VISIBLE
-                        binding.foundsExamineForm.setOnClickListener(this)
-
-                        binding.foundsCalculateForm.visibility = View.VISIBLE
-                        binding.foundsCalculateForm.setOnClickListener(this)
-
-                        binding.provinceExamineForm.visibility = View.VISIBLE
-                        binding.provinceExamineForm.setOnClickListener(this)
-
-                        binding.cityExamineForm.visibility = View.VISIBLE
-                        binding.cityExamineForm.setOnClickListener(this)
-
-                        binding.leaveExamineForm.visibility = View.VISIBLE
-                        binding.leaveExamineForm.setOnClickListener(this)
-
-                        binding.reimbursementForm.visibility = View.VISIBLE
-                        binding.reimbursementForm.setOnClickListener(this)
-                    }
-                }
-            }
-        }
+    override fun initEvents() {
+        binding.voucher.setOnClickListener(this)
+        binding.confirmList.setOnClickListener(this)
+        binding.predetermineCost.setOnClickListener(this)
+
+        binding.airplaneReportForm.setOnClickListener(this)
+        binding.chTravelItinerary.setOnClickListener(this)
+        binding.enTravelItinerary.setOnClickListener(this)
+
+        binding.opTravelItineraryWord.setOnClickListener(this)
+        binding.opTravelItineraryPdf.setOnClickListener(this)
+
+        binding.groupCustomerListCh.setOnClickListener(this)
+        binding.groupCustomerListEn.setOnClickListener(this)
+
+        binding.reverseTable.setOnClickListener(this)
+
+        binding.foundsExamineForm.setOnClickListener(this)
+        binding.foundsCalculateForm.setOnClickListener(this)
+        binding.provinceExamineForm.setOnClickListener(this)
+        binding.cityExamineForm.setOnClickListener(this)
+        binding.leaveExamineForm.setOnClickListener(this)
+        binding.reimbursementForm.setOnClickListener(this)
     }
 
+//    override fun initViews() {
+//
+//        for (item in OASystem.authData) {
+//            when (item.pageId) {
+//
+//                OASystem.HOTEL_PREDETERMINE -> {
+//                    if (OASystem.authorization(OASystem.HOTEL_PREDETERMINE, OASystem.DOWNLOAD)) {
+//                        if (binding.groupHotel.visibility == View.GONE) {
+//                            binding.groupHotel.visibility = View.VISIBLE
+//                        }
+//
+//                        binding.voucher.setOnClickListener(this)
+//                        binding.confirmList.setOnClickListener(this)
+//                        binding.predetermineCost.setOnClickListener(this)
+//
+//                        if (OASystem.userInfo.depName == "市场部") {
+//                            binding.predetermineCost.visibility = View.GONE
+//                        }
+//                    }
+//                }
+//
+//                OASystem.AIRPLANE_PAYMENT_INSERT -> {
+//                    if (OASystem.authorization(OASystem.AIRPLANE_PAYMENT_INSERT, OASystem.DOWNLOAD)) {
+//                        if (binding.groupAirplaneTicket.visibility == View.GONE) {
+//                            binding.groupAirplaneTicket.visibility = View.VISIBLE
+//                        }
+//
+//                        binding.airplaneReportForm.setOnClickListener(this)
+//                        binding.chTravelItinerary.setOnClickListener(this)
+//                        binding.enTravelItinerary.setOnClickListener(this)
+//
+//                        if (OASystem.userInfo.depName == "市场部") {
+//                            binding.airplaneReportForm.visibility = View.GONE
+//                        }
+//                    }
+//                }
+//
+//                OASystem.OP_TRAVEL_ITINERARY -> {
+//                    if (OASystem.authorization(OASystem.OP_TRAVEL_ITINERARY, OASystem.DOWNLOAD)) {
+//                        if (binding.groupOp.visibility == View.GONE) {
+//                            binding.groupOp.visibility = View.VISIBLE
+//                        }
+//
+//                        binding.opTravelItineraryWord.setOnClickListener(this)
+//                        binding.opTravelItineraryPdf.setOnClickListener(this)
+//                    }
+//                }
+//
+//                OASystem.GROUP_CLIENT_LIST -> {
+//                    if (OASystem.authorization(OASystem.GROUP_CLIENT_LIST, OASystem.DOWNLOAD)) {
+//                        if (binding.groupManager.visibility == View.GONE) {
+//                            binding.groupManager.visibility = View.VISIBLE
+//                        }
+//
+//                        binding.groupCustomerListCh.visibility = View.VISIBLE
+//                        binding.groupCustomerListCh.setOnClickListener(this)
+//
+//                        binding.groupCustomerListEn.visibility = View.VISIBLE
+//                        binding.groupCustomerListEn.setOnClickListener(this)
+//                    }
+//                }
+//
+//                OASystem.REVERSE_TABLE -> {
+//                    if (OASystem.authorization(OASystem.REVERSE_TABLE, OASystem.DOWNLOAD)) {
+//                        if (binding.groupManager.visibility == View.GONE) {
+//                            binding.groupManager.visibility = View.VISIBLE
+//                        }
+//
+//                        binding.reverseTable.visibility = View.VISIBLE
+//                        binding.reverseTable.setOnClickListener(this)
+//                    }
+//                }
+//
+//                OASystem.ENTER_AND_LEAVE_PAYMENT_DETAIL -> {
+//                    if (OASystem.authorization(OASystem.ENTER_AND_LEAVE_PAYMENT_DETAIL, OASystem.DOWNLOAD)) {
+//                        if (binding.groupManager.visibility == View.GONE) {
+//                            binding.groupManager.visibility = View.VISIBLE
+//                        }
+//
+//                        binding.foundsExamineForm.visibility = View.VISIBLE
+//                        binding.foundsExamineForm.setOnClickListener(this)
+//
+//                        binding.foundsCalculateForm.visibility = View.VISIBLE
+//                        binding.foundsCalculateForm.setOnClickListener(this)
+//
+//                        binding.provinceExamineForm.visibility = View.VISIBLE
+//                        binding.provinceExamineForm.setOnClickListener(this)
+//
+//                        binding.cityExamineForm.visibility = View.VISIBLE
+//                        binding.cityExamineForm.setOnClickListener(this)
+//
+//                        binding.leaveExamineForm.visibility = View.VISIBLE
+//                        binding.leaveExamineForm.setOnClickListener(this)
+//
+//                        binding.reimbursementForm.visibility = View.VISIBLE
+//                        binding.reimbursementForm.setOnClickListener(this)
+//                    }
+//                }
+//            }
+//        }
+//    }
+
     override fun onClick(view: View) {
 
         val intent = Intent(OASystem.context, DocumentGroupListActivity::class.java)
@@ -135,6 +160,7 @@ class DocumentFragment : BaseFragment<FragmentDocumentBinding>(), OnClickListene
         when(view.id) {
             binding.voucher.id -> {
                 tag = "voucher"
+
             }
 
             binding.confirmList.id -> {

+ 64 - 3
app/src/main/java/com/pan_american/android/ui/document/DocumentGroupListActivity.kt

@@ -5,9 +5,11 @@ import android.net.Uri
 import android.os.Bundle
 import android.text.Editable
 import android.text.TextWatcher
+import android.util.Log
 import android.view.View
 import android.widget.TextView
 import androidx.recyclerview.widget.LinearLayoutManager
+import com.google.gson.Gson
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseActivity
@@ -25,6 +27,8 @@ import com.pan_american.android.data.model.document.network.group_management.Gro
 import com.pan_american.android.data.model.document.network.group_management.GroupEnterExitCostGenerateRequest
 import com.pan_american.android.data.model.document.network.group_management.GroupManagerDocumentGenerateResponse
 import com.pan_american.android.data.model.document.network.group_management.GroupReverseTableGenerateRequest
+import com.pan_american.android.data.model.document.network.group_op.GroupTravelListGenerateRequest
+import com.pan_american.android.data.model.document.network.group_op.GroupTravelListGenerateResponse
 import com.pan_american.android.data.network.APIService
 import com.pan_american.android.data.network.ServiceCreator
 import com.pan_american.android.databinding.ActivityDocumentGroupListBinding
@@ -86,9 +90,9 @@ class DocumentGroupListActivity : BaseActivity<ActivityDocumentGroupListBinding>
                     groupNameListRequest.pageIndex = 1
 
                     if (searchText.text.isNullOrBlank()) {
-                        groupNameListRequest.groupName = ""
+                        groupNameListRequest.teamName = ""
                     } else {
-                        groupNameListRequest.groupName = p0.toString()
+                        groupNameListRequest.teamName = p0.toString()
                     }
 
                     pageIndex = 1
@@ -121,6 +125,7 @@ class DocumentGroupListActivity : BaseActivity<ActivityDocumentGroupListBinding>
     private fun getGroupList(type: Int) {
 
         if (!listInit) {
+            Log.e("request", Gson().toJson(groupNameListRequest))
             apiService.documentGroupList(groupNameListRequest).enqueue(object : Callback<SelectorResponse> {
                 override fun onResponse(
                     call: Call<SelectorResponse>,
@@ -195,7 +200,7 @@ class DocumentGroupListActivity : BaseActivity<ActivityDocumentGroupListBinding>
             setLayoutId(R.layout.item_group_name_list)
             setData(groupNameList)
             addBindView { itemView, data ->
-                itemView.findViewById<TextView>(R.id.selector_item_name).text = data.groupName
+                itemView.findViewById<TextView>(R.id.selector_item_name).text = data.teamName
             }
         }.create()
 
@@ -409,12 +414,68 @@ class DocumentGroupListActivity : BaseActivity<ActivityDocumentGroupListBinding>
 
                         //OP行程单word
                         "opTravelItineraryWord" -> {
+                            apiService.groupTravelListGenerate(GroupTravelListGenerateRequest(groupNameList[position].id, 0)).enqueue(object : Callback<GroupTravelListGenerateResponse> {
+                                override fun onResponse(
+                                    p0: Call<GroupTravelListGenerateResponse>,
+                                    response: Response<GroupTravelListGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.op_travel_itinerary_word_version)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
 
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    p0: Call<GroupTravelListGenerateResponse>,
+                                    p1: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
                         }
 
                         //OP行程单pdf
                         "opTravelItineraryPdf" -> {
+                            apiService.groupTravelListGenerate(GroupTravelListGenerateRequest(groupNameList[position].id, 1)).enqueue(object : Callback<GroupTravelListGenerateResponse> {
+                                override fun onResponse(
+                                    p0: Call<GroupTravelListGenerateResponse>,
+                                    response: Response<GroupTravelListGenerateResponse>
+                                ) {
+                                    val downloadResponse = response.body()
+
+                                    if (downloadResponse != null) {
+                                        if (downloadResponse.code == 200) {
+
+                                            docTypeName = resources.getString(R.string.op_travel_itinerary_pdf_version)
+
+                                            downloadUrl = downloadResponse.data
+
+                                            showDownloadHintDialog(groupNameList[position].groupName, docTypeName, downloadUrl)
 
+                                        } else {
+                                            showMessage(downloadResponse.msg)
+                                        }
+                                    }
+                                }
+
+                                override fun onFailure(
+                                    p0: Call<GroupTravelListGenerateResponse>,
+                                    p1: Throwable
+                                ) {
+                                    showErrorInfo(R.string.interface_request_error)
+                                }
+                            })
                         }
 
                         //接团客户名单(中文版)

+ 7 - 3
app/src/main/java/com/pan_american/android/ui/efficiency_tools/exchange_tool/ExchangeToolActivity.kt

@@ -161,7 +161,11 @@ class ExchangeToolActivity : BaseActivity<ActivityExchangeToolBinding>() {
 
         showPopupWindow {
             //初始化RecyclerView
-            val areaSelector: RecyclerView = popView.findViewById(R.id.selector_list)
+            selector = popView.findViewById(R.id.selector_list)
+
+            selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+            selectorContainer.setEnableRefresh(false)
+            selectorContainer.setEnableLoadMore(false)
 
             val adapter = ListAdapter.Builder<Currency>().setData(currencyList)
                 .setLayoutId(R.layout.item_selector).addBindView { itemView, data ->
@@ -193,9 +197,9 @@ class ExchangeToolActivity : BaseActivity<ActivityExchangeToolBinding>() {
                 }.create()
 
             val layoutManager = LinearLayoutManager(this)
-            areaSelector.layoutManager = layoutManager
+            selector.layoutManager = layoutManager
 
-            areaSelector.adapter = adapter
+            selector.adapter = adapter
 
             adapter.onRecyclerViewItemClick =
                 object : ListAdapter.OnRecyclerViewItemClick<Currency> {

+ 4 - 0
app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_data/AddInviteDataActivity.kt

@@ -203,6 +203,10 @@ class AddInviteDataActivity : BaseActivity<ActivityAddInviteDataBinding>() {
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 

+ 3 - 3
app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_data/InviteDataListFragment.kt

@@ -3,6 +3,7 @@ package com.pan_american.android.ui.group_invite_official.invite_data
 import android.content.Intent
 import android.os.Bundle
 import android.view.LayoutInflater
+import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
 import androidx.recyclerview.widget.LinearLayoutManager
@@ -47,8 +48,8 @@ class InviteDataListFragment : BaseFragment<FragmentInviteDataListBinding>() {
         bundle: Bundle?
     ) = FragmentInviteDataListBinding.inflate(layoutInflater, container, false)
 
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
 
         requireArguments().apply {
             inviteDataListRequest.country = getString("country", "")
@@ -99,7 +100,6 @@ class InviteDataListFragment : BaseFragment<FragmentInviteDataListBinding>() {
 
                             if (listResponse.data.size == 0) {
                                 showMessage(resources.getString(R.string.no_data))
-                                return
                             }
 
                             for (item in listResponse.data) {

+ 20 - 0
app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_data/InviteDataSearchFragment.kt

@@ -138,6 +138,10 @@ class InviteDataSearchFragment : BaseFragment<FragmentInviteDataSearchBinding>()
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 
@@ -234,6 +238,10 @@ class InviteDataSearchFragment : BaseFragment<FragmentInviteDataSearchBinding>()
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 
@@ -330,6 +338,10 @@ class InviteDataSearchFragment : BaseFragment<FragmentInviteDataSearchBinding>()
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 
@@ -426,6 +438,10 @@ class InviteDataSearchFragment : BaseFragment<FragmentInviteDataSearchBinding>()
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 
@@ -557,6 +573,10 @@ class InviteDataSearchFragment : BaseFragment<FragmentInviteDataSearchBinding>()
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 

+ 4 - 0
app/src/main/java/com/pan_american/android/ui/group_op/ground_convey_payment_insert/AddGroundConveyInfoActivity.kt

@@ -172,6 +172,10 @@ class AddGroundConveyInfoActivity : BaseActivity<ActivityAddGroupOpPaymentBindin
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 

+ 4 - 0
app/src/main/java/com/pan_american/android/ui/resource_management/airplane_three_code/AirplaneThreeCodeSearchFragment.kt

@@ -125,6 +125,10 @@ class AirplaneThreeCodeSearchFragment : BaseFragment<FragmentAirplaneThreeCodeSe
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 

+ 4 - 0
app/src/main/java/com/pan_american/android/ui/resource_management/car_resource/CarResourceSearchFragment.kt

@@ -109,6 +109,10 @@ class CarResourceSearchFragment : BaseFragment<FragmentCarResourceSearchBinding>
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 

+ 4 - 0
app/src/main/java/com/pan_american/android/ui/resource_management/guide_resource/GuideResourceSearchFragment.kt

@@ -110,6 +110,10 @@ class GuideResourceSearchFragment : BaseFragment<FragmentGuideResourceSearchBind
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 

+ 4 - 0
app/src/main/java/com/pan_american/android/ui/resource_management/hotel_resource/HotelResourceSearchFragment.kt

@@ -114,6 +114,10 @@ class HotelResourceSearchFragment : BaseFragment<FragmentHotelResourceSearchBind
 
                 selector = popView.findViewById(R.id.selector_list)
 
+                selectorContainer = popView.findViewById(R.id.selector_refresh_container)
+                selectorContainer.setEnableRefresh(false)
+                selectorContainer.setEnableLoadMore(false)
+
                 val layoutManager = LinearLayoutManager(OASystem.context)
                 selector.layoutManager = layoutManager
 

+ 2 - 0
app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceActivity.kt

@@ -215,6 +215,7 @@ class WorkspaceActivity : BaseActivity<ActivityWorkspaceBinding>() {
 
     private fun initBottomNavigation() {
         binding.navView.itemIconTintList = null
+        binding.navView.removeBadge(R.id.navigation_document)
         //将所有的fragment添加到viewpager2中
         val fragmentList: MutableList<Fragment> = ArrayList()
         fragmentList.add(MessageFragment())
@@ -257,6 +258,7 @@ class WorkspaceActivity : BaseActivity<ActivityWorkspaceBinding>() {
                 R.id.navigation_document -> {
                     binding.navViewpage2.currentItem = 3
                     return@setOnItemSelectedListener true
+//                    showMessage(resources.getString(R.string.permission_denied))
                 }
             }
             false

+ 17 - 1
app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt

@@ -12,6 +12,7 @@ import com.pan_american.android.base.BaseFragment
 import com.pan_american.android.databinding.FragmentWorkspaceBinding
 import com.pan_american.android.ui.customer_resource.company_customer.MarketCustomerActivity
 import com.pan_american.android.ui.customer_resource.market_sales_revenue.MarketSalesRevenueActivity
+import com.pan_american.android.ui.customer_resource.related_invitee.RelatedInviteeActivity
 import com.pan_american.android.ui.efficiency_tools.address_book.AddressBookActivity
 import com.pan_american.android.ui.efficiency_tools.daily_payment.DailyPaymentListActivity
 import com.pan_american.android.ui.efficiency_tools.exchange_tool.ExchangeToolActivity
@@ -208,7 +209,7 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                 }
 
                 OASystem.MARKET_SALES_REVENUE -> {
-                    if (OASystem.authorization(OASystem.MARKET_CUSTOMER, OASystem.VIEW)) {
+                    if (OASystem.authorization(OASystem.MARKET_SALES_REVENUE, OASystem.VIEW)) {
                         if (binding.customerResource.visibility == View.GONE) {
                             binding.customerResource.visibility = View.VISIBLE
                         }
@@ -217,6 +218,16 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                     }
                 }
 
+                OASystem.RELATED_INVITEE -> {
+                    if (OASystem.authorization(OASystem.RELATED_INVITEE, OASystem.VIEW)) {
+                        if (binding.customerResource.visibility == View.GONE) {
+                            binding.customerResource.visibility = View.VISIBLE
+                        }
+                        binding.relatedInvitee.visibility = View.VISIBLE
+                        binding.relatedInvitee.setOnClickListener(this)
+                    }
+                }
+
                 //团组机票
                 OASystem.THREE_CODE_RESOURCE -> {
                     if (OASystem.authorization(OASystem.THREE_CODE_RESOURCE, OASystem.VIEW)) {
@@ -322,6 +333,11 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                 startActivity(intent)
             }
 
+            binding.relatedInvitee.id -> {
+                val intent = Intent(OASystem.context, RelatedInviteeActivity::class.java)
+                startActivity(intent)
+            }
+
             binding.airplaneThreeCode.id -> {
                 val intent = Intent(OASystem.context, AirplaneThreeCodeActivity::class.java)
                 startActivity(intent)

+ 21 - 0
app/src/main/res/layout/activity_related_invitee.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <include
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        layout="@layout/layout_title" />
+
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/related_invitee_container"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"/>
+
+</LinearLayout>

+ 13 - 14
app/src/main/res/layout/fragment_document.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/background_color"
@@ -41,7 +40,7 @@
                 android:layout_height="wrap_content"
                 android:background="@color/white"
                 android:orientation="vertical"
-                android:visibility="gone">
+                android:visibility="visible">
 
                 <View
                     android:layout_width="match_parent"
@@ -156,7 +155,7 @@
                 android:layout_height="wrap_content"
                 android:background="@color/white"
                 android:orientation="vertical"
-                android:visibility="gone">
+                android:visibility="visible">
 
                 <View
                     android:layout_width="match_parent"
@@ -266,7 +265,7 @@
                 android:layout_height="wrap_content"
                 android:background="@color/white"
                 android:orientation="vertical"
-                android:visibility="gone">
+                android:visibility="visible">
 
                 <View
                     android:layout_width="match_parent"
@@ -351,7 +350,7 @@
                 android:layout_height="wrap_content"
                 android:background="@color/white"
                 android:orientation="vertical"
-                android:visibility="gone">
+                android:visibility="visible">
 
                 <View
                     android:layout_width="match_parent"
@@ -385,7 +384,7 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <TextView
                             android:layout_width="match_parent"
@@ -412,7 +411,7 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <TextView
                             android:layout_width="match_parent"
@@ -439,7 +438,7 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <TextView
                             android:layout_width="match_parent"
@@ -466,7 +465,7 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <TextView
                             android:layout_width="match_parent"
@@ -493,7 +492,7 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <TextView
                             android:layout_width="match_parent"
@@ -520,7 +519,7 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <TextView
                             android:layout_width="match_parent"
@@ -547,7 +546,7 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <TextView
                             android:layout_width="match_parent"
@@ -576,7 +575,7 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <TextView
                             android:layout_width="match_parent"
@@ -603,7 +602,7 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:visibility="gone">
+                        android:visibility="visible">
 
                         <TextView
                             android:layout_width="match_parent"

+ 33 - 0
app/src/main/res/layout/fragment_related_invitee_list.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@color/background_color">
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/related_invitee_list_container"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_margin="@dimen/common_padding"
+        android:layout_weight="1"
+        app:srlEnablePreviewInEditMode="true">
+
+        <com.scwang.smart.refresh.header.ClassicsHeader
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/related_invitee_list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never" />
+
+        <com.scwang.smart.refresh.footer.ClassicsFooter
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</LinearLayout>

+ 162 - 0
app/src/main/res/layout/fragment_related_invitee_search.xml

@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/search_condition"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/common_padding_heavy"
+        android:layout_marginTop="@dimen/common_padding_huge"
+        android:layout_marginEnd="@dimen/common_padding_heavy"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/country"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/country"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_weight="1"
+                android:gravity="end"
+                android:hint="@string/please_select"
+                android:singleLine="true"
+                android:textColorHint="@color/hint_text_color"
+                android:textSize="@dimen/text_size_medium" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/area"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/area"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_weight="1"
+                android:gravity="end"
+                android:hint="@string/please_select"
+                android:singleLine="true"
+                android:textColorHint="@color/hint_text_color"
+                android:textSize="@dimen/text_size_medium" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/group_name"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/group_name"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_weight="1"
+                android:gravity="end"
+                android:hint="@string/please_select"
+                android:singleLine="true"
+                android:textColorHint="@color/hint_text_color"
+                android:textSize="@dimen/text_size_medium" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/invitee_name"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/invitee_name"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_weight="1"
+                android:gravity="end"
+                android:hint="@string/please_select"
+                android:singleLine="true"
+                android:textColorHint="@color/hint_text_color"
+                android:textSize="@dimen/text_size_medium" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding_huge"
+        android:orientation="horizontal">
+
+        <com.pan_american.android.util.CommitButton
+            android:id="@+id/commit"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/button_height" />
+
+    </LinearLayout>
+</LinearLayout>

+ 27 - 0
app/src/main/res/layout/fragment_workspace.xml

@@ -804,6 +804,33 @@
 
                     </LinearLayout>
 
+                    <LinearLayout
+                        android:id="@+id/related_invitee"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="@dimen/common_padding"
+                            android:gravity="center_vertical"
+                            android:paddingTop="@dimen/common_padding"
+                            android:paddingBottom="@dimen/common_padding"
+                            android:text="@string/group_related_invitee"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_related_invitee" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
                     <LinearLayout
                         android:id="@+id/service_resource"
                         android:layout_width="match_parent"

+ 295 - 0
app/src/main/res/layout/item_related_invitee_group_list.xml

@@ -0,0 +1,295 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="@dimen/common_padding"
+    android:layout_marginBottom="@dimen/common_padding"
+    android:background="@drawable/shape_corner_stroke_white"
+    android:orientation="vertical"
+    tools:viewBindingIgnore="true">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/group_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textColor="@color/text_color_blue"
+            android:textSize="@dimen/text_size_medium"
+            android:textStyle="bold"
+            android:maxLines="1"
+            android:ellipsize="end"/>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/customer_company"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/customer_company"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/common_padding"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/client_name"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/client_name"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/common_padding"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/start_time"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/start_time"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/common_padding"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/end_time"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/end_time"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/common_padding"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/visit_days"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/days"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/common_padding"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/visit_members"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/members"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/common_padding"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/visit_country"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/country"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/common_padding"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:layout_marginBottom="@dimen/common_padding_huge"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/group_pick_up_person"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/director"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/common_padding"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+</LinearLayout>

+ 21 - 4
app/src/main/res/layout/popup_selector.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
@@ -44,10 +45,26 @@
 
     </LinearLayout>
 
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/selector_list"
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/selector_refresh_container"
         android:layout_width="match_parent"
-        android:layout_height="400dp"
-        android:layout_margin="@dimen/common_padding" />
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding"
+        app:srlEnablePreviewInEditMode="true">
+
+        <com.scwang.smart.refresh.header.ClassicsHeader
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/selector_list"
+            android:layout_width="match_parent"
+            android:layout_height="400dp"
+            android:layout_margin="@dimen/common_padding" />
+
+        <com.scwang.smart.refresh.footer.ClassicsFooter
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
 
 </LinearLayout>

+ 26 - 0
app/src/main/res/layout/popup_table.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/shape_corner_white"
+    android:orientation="vertical"
+    tools:viewBindingIgnore="true">
+
+    <TextView
+        android:id="@+id/title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding"
+        android:gravity="center"
+        android:textColor="@color/text_color"
+        android:textSize="@dimen/text_size_large"
+        android:textStyle="bold" />
+
+    <com.bin.david.form.core.SmartTable
+        android:id="@+id/table"
+        android:layout_width="match_parent"
+        android:layout_height="500dp"
+        android:layout_margin="@dimen/common_padding" />
+
+</LinearLayout>

BIN
app/src/main/res/mipmap-xxhdpi/icon_related_invitee.png


+ 7 - 0
app/src/main/res/values/strings.xml

@@ -988,6 +988,13 @@
 
     <string name="visit_history_list_get_error">拜访记录列表获取失败</string>
 
+    <!-- 查看关联邀请方 -->
+    <string name="group_related_invitee">团组关联邀请方</string>
+
+    <string name="country_select_hint">请选择国家</string>
+
+    <string name="group_pick_up_person">接团人</string>
+
     <!-- TODO: Remove or change this placeholder text -->
     <string name="hello_blank_fragment">Hello blank fragment</string>