Browse Source

2025-02-21 修改

修改:
1. 三公费用详细 文档下载 整合
2. 三公费用详细 - 草稿 bug修改
3. 三公费用详细 - 草稿 同步团组功能
4. 三公费用详细 - 草稿 文档下载功能
5. 部分页面逻辑修改
zhaiy 10 months ago
parent
commit
81b6aae6ff
30 changed files with 869 additions and 699 deletions
  1. 0 0
      .kotlin/sessions/kotlin-compiler-774406720352134893.salive
  2. 0 1
      app/src/main/java/com/pan_american/android/data/model/common/entity/Selector.kt
  3. 3 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/entity/EntryAndExitFileItem.kt
  4. 9 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitDocumentListResponse.kt
  5. 3 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitFileDownloadRequest.kt
  6. 5 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitFileDownloadResponse.kt
  7. 9 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/DraftFileTypeResponse.kt
  8. 3 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/DraftWordFileDownloadRequest.kt
  9. 5 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/DraftWordFileDownloadResponse.kt
  10. 1 1
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitDraftPaymentListResponse.kt
  11. 2 1
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/InBoardDraftDetailResponse.kt
  12. 5 0
      app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/SynchronizeDraftToGroupRequest.kt
  13. 237 205
      app/src/main/java/com/pan_american/android/data/network/APIService.kt
  14. 0 57
      app/src/main/java/com/pan_american/android/ui/document/DocumentFragment.kt
  15. 0 194
      app/src/main/java/com/pan_american/android/ui/document/DocumentGroupListActivity.kt
  16. 2 3
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeGroupListActivity.kt
  17. 118 35
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeTotalFragment.kt
  18. 3 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitDraftPaymentDetailActivity.kt
  19. 5 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitFeeDraftListActivity.kt
  20. 421 13
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitFeeDraftTotalFragment.kt
  21. 5 9
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitPaymentDraftListFragment.kt
  22. 5 0
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/InBoardFeeDraftFragment.kt
  23. 5 5
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/OtherPaymentDraftActivity.kt
  24. 3 4
      app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/OtherPaymentDraftFragment.kt
  25. 1 1
      app/src/main/res/layout/activity_entry_and_exit_fee_draft.xml
  26. 2 164
      app/src/main/res/layout/fragment_document.xml
  27. 2 2
      app/src/main/res/layout/fragment_entry_and_exit_fee_total.xml
  28. 4 0
      app/src/main/res/layout/fragment_international_travel_fee_draft.xml
  29. 5 3
      app/src/main/res/layout/popup_add_new_draft.xml
  30. 6 1
      app/src/main/res/values/strings.xml

.kotlin/sessions/kotlin-compiler-1351832969662180354.salive → .kotlin/sessions/kotlin-compiler-774406720352134893.salive


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

@@ -39,7 +39,6 @@ class Selector {
     var text = ""
 
     var isNull = false
-    var isEdit = false
     var isView = false
 
     var draftName = ""

+ 3 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/entity/EntryAndExitFileItem.kt

@@ -0,0 +1,3 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.entity
+
+class EntryAndExitFileItem(val parentId: Int, val id: Int, val name: String)

+ 9 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitDocumentListResponse.kt

@@ -0,0 +1,9 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.entity.EntryAndExitFileItem
+
+class EntryAndExitDocumentListResponse(val data: Data): BaseResponse() {
+
+    inner class Data (val fileTypeData: ArrayList<EntryAndExitFileItem>)
+}

+ 3 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitFileDownloadRequest.kt

@@ -0,0 +1,3 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network
+
+class EntryAndExitFileDownloadRequest(val portType: Int = 2, val diId: Int, val exportType: Int, val subTypeId: Int)

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_detail/network/EntryAndExitFileDownloadResponse.kt

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

+ 9 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/DraftFileTypeResponse.kt

@@ -0,0 +1,9 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network
+
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.common.entity.Selector
+
+class DraftFileTypeResponse(val data: Data): BaseResponse() {
+
+    inner class Data (val wordTypeData: ArrayList<Selector>)
+}

+ 3 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/DraftWordFileDownloadRequest.kt

@@ -0,0 +1,3 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network
+
+class DraftWordFileDownloadRequest(val portType: Int = 2, val id: Int, val exportType: Int = 1, val subTypeId: Int)

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/DraftWordFileDownloadResponse.kt

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

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitDraftPaymentListResponse.kt

@@ -1,4 +1,4 @@
-package com.pan_american.android.ui.group_management.entry_and_exit_fee_draft
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network
 
 import com.pan_american.android.base.BaseResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.entity.EntryAndExitDraftPaymentListItem

+ 2 - 1
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/InBoardDraftDetailResponse.kt

@@ -12,6 +12,7 @@ class InBoardDraftDetailResponse(val data: Data): BaseResponse() {
         val heSuan: Double,
         val service: Double,
         val ticket: Double,
-        val safe: Double
+        val safe: Double,
+        val firstItemRemark: String
     )
 }

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/group_management/entry_and_exit_fee_draft/network/SynchronizeDraftToGroupRequest.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network
+
+import com.pan_american.android.OASystem
+
+class SynchronizeDraftToGroupRequest(val portType: Int = 2, val userId: Int = OASystem.userInfo.userId, val draftId: Int, val groupId: Int)

File diff suppressed because it is too large
+ 237 - 205
app/src/main/java/com/pan_american/android/data/network/APIService.kt


+ 0 - 57
app/src/main/java/com/pan_american/android/ui/document/DocumentFragment.kt

@@ -41,13 +41,6 @@ class DocumentFragment : BaseFragment<FragmentDocumentBinding>(), OnClickListene
         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() {
@@ -122,32 +115,6 @@ class DocumentFragment : BaseFragment<FragmentDocumentBinding>(), OnClickListene
                         binding.reverseTable.setOnClickListener(this)
                     }
                 }
-
-                OASystem.ENTRY_AND_EXIT_FEE_DETAIL -> {
-                    if (OASystem.authorization(OASystem.ENTRY_AND_EXIT_FEE_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)
-                    }
-                }
             }
         }
     }
@@ -213,30 +180,6 @@ class DocumentFragment : BaseFragment<FragmentDocumentBinding>(), OnClickListene
             binding.reverseTable.id -> {
                 tag = "reverseTable"
             }
-
-            binding.foundsExamineForm.id -> {
-                tag = "foundsExamineForm"
-            }
-
-            binding.foundsCalculateForm.id -> {
-                tag = "foundsCalculateForm"
-            }
-
-            binding.provinceExamineForm.id -> {
-                tag = "provinceExamineForm"
-            }
-
-            binding.cityExamineForm.id -> {
-                tag = "cityExamineForm"
-            }
-
-            binding.leaveExamineForm.id -> {
-                tag = "leaveExamineForm"
-            }
-
-            binding.reimbursementForm.id -> {
-                tag = "reimbursementForm"
-            }
         }
 
         intent.putExtra("tag", tag)

+ 0 - 194
app/src/main/java/com/pan_american/android/ui/document/DocumentGroupListActivity.kt

@@ -22,7 +22,6 @@ import com.pan_american.android.data.model.document.network.group_airplane_ticke
 import com.pan_american.android.data.model.document.network.group_hotel.HotelDocumentGenerateRequest
 import com.pan_american.android.data.model.document.network.group_hotel.HotelDocumentGenerateResponse
 import com.pan_american.android.data.model.document.network.group_management.GroupCustomerListGenerateRequest
-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
@@ -570,199 +569,6 @@ class DocumentGroupListActivity : BaseActivity<ActivityDocumentGroupListBinding>
                                 }
                             })
                         }
-
-                        //出国费用明细
-                        "foundsExamineForm" -> {
-                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 1, 1005)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
-                                override fun onResponse(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    response: Response<GroupManagerDocumentGenerateResponse>
-                                ) {
-                                    val downloadResponse = response.body()
-
-                                    if (downloadResponse != null) {
-                                        if (downloadResponse.code == 200) {
-
-                                            docTypeName = resources.getString(R.string.founds_examine_form)
-
-                                            downloadUrl = downloadResponse.data
-
-                                            showDownloadHintDialog(groupNameList[position].teamName, docTypeName, downloadUrl)
-
-                                        } else {
-                                            showMessage(downloadResponse.msg)
-                                        }
-                                    }
-                                }
-
-                                override fun onFailure(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    t: Throwable
-                                ) {
-                                    showErrorInfo(R.string.interface_request_error)
-                                }
-                            })
-                        }
-
-                        "foundsCalculateForm" -> {
-                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 1, 1006)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
-                                override fun onResponse(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    response: Response<GroupManagerDocumentGenerateResponse>
-                                ) {
-                                    val downloadResponse = response.body()
-
-                                    if (downloadResponse != null) {
-                                        if (downloadResponse.code == 200) {
-
-                                            docTypeName = resources.getString(R.string.founds_calculate_form)
-
-                                            downloadUrl = downloadResponse.data
-
-                                            showDownloadHintDialog(groupNameList[position].teamName, docTypeName, downloadUrl)
-
-                                        } else {
-                                            showMessage(downloadResponse.msg)
-                                        }
-                                    }
-                                }
-
-                                override fun onFailure(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    t: Throwable
-                                ) {
-                                    showErrorInfo(R.string.interface_request_error)
-                                }
-                            })
-                        }
-
-                        "provinceExamineForm" -> {
-                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 1, 1007)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
-                                override fun onResponse(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    response: Response<GroupManagerDocumentGenerateResponse>
-                                ) {
-                                    val downloadResponse = response.body()
-
-                                    if (downloadResponse != null) {
-                                        if (downloadResponse.code == 200) {
-
-                                            docTypeName = resources.getString(R.string.province_examine_form)
-
-                                            downloadUrl = downloadResponse.data
-
-                                            showDownloadHintDialog(groupNameList[position].teamName, docTypeName, downloadUrl)
-
-                                        } else {
-                                            showMessage(downloadResponse.msg)
-                                        }
-                                    }
-                                }
-
-                                override fun onFailure(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    t: Throwable
-                                ) {
-                                    showErrorInfo(R.string.interface_request_error)
-                                }
-                            })
-                        }
-
-                        "cityExamineForm" -> {
-                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 1, 1066)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
-                                override fun onResponse(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    response: Response<GroupManagerDocumentGenerateResponse>
-                                ) {
-                                    val downloadResponse = response.body()
-
-                                    if (downloadResponse != null) {
-                                        if (downloadResponse.code == 200) {
-
-                                            docTypeName = resources.getString(R.string.city_examine_form)
-
-                                            downloadUrl = downloadResponse.data
-
-                                            showDownloadHintDialog(groupNameList[position].teamName, docTypeName, downloadUrl)
-
-                                        } else {
-                                            showMessage(downloadResponse.msg)
-                                        }
-                                    }
-                                }
-
-                                override fun onFailure(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    t: Throwable
-                                ) {
-                                    showErrorInfo(R.string.interface_request_error)
-                                }
-                            })
-                        }
-
-                        "leaveExamineForm" -> {
-                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 2, 1008)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
-                                override fun onResponse(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    response: Response<GroupManagerDocumentGenerateResponse>
-                                ) {
-                                    val downloadResponse = response.body()
-
-                                    if (downloadResponse != null) {
-                                        if (downloadResponse.code == 200) {
-
-                                            docTypeName = resources.getString(R.string.leave_examine_form)
-
-                                            downloadUrl = downloadResponse.data
-
-                                            showDownloadHintDialog(groupNameList[position].teamName, docTypeName, downloadUrl)
-
-                                        } else {
-                                            showMessage(downloadResponse.msg)
-                                        }
-                                    }
-                                }
-
-                                override fun onFailure(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    t: Throwable
-                                ) {
-                                    showErrorInfo(R.string.interface_request_error)
-                                }
-                            })
-                        }
-
-                        "reimbursementForm" -> {
-                            apiService.groupEnterExitCostGenerate(GroupEnterExitCostGenerateRequest(groupNameList[position].id, 2, 1009)).enqueue(object : Callback<GroupManagerDocumentGenerateResponse> {
-                                override fun onResponse(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    response: Response<GroupManagerDocumentGenerateResponse>
-                                ) {
-                                    val downloadResponse = response.body()
-
-                                    if (downloadResponse != null) {
-                                        if (downloadResponse.code == 200) {
-
-                                            docTypeName = resources.getString(R.string.reimbursement_form)
-
-                                            downloadUrl = downloadResponse.data
-
-                                            showDownloadHintDialog(groupNameList[position].teamName, docTypeName, downloadUrl)
-
-                                        } else {
-                                            showMessage(downloadResponse.msg)
-                                        }
-                                    }
-                                }
-
-                                override fun onFailure(
-                                    call: Call<GroupManagerDocumentGenerateResponse>,
-                                    t: Throwable
-                                ) {
-                                    showErrorInfo(R.string.interface_request_error)
-                                }
-                            })
-                        }
                     }
                 }
             }

+ 2 - 3
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeGroupListActivity.kt

@@ -158,11 +158,10 @@ class EntryAndExitFeeGroupListActivity : BaseActivity<ActivityEntryAndExitGroupL
             addBindView { itemView, data ->
                 itemView.findViewById<TextView>(R.id.selector_item_name).apply {
 
-                    if (data.isView) {
+                    if (data.isNull) {
                         setTextColor(ResourcesCompat.getColor(resources, R.color.text_color, null))
                     } else {
-                        setTextColor(ResourcesCompat.getColor(resources, R.color.hint_text_color, null))
-
+                        setTextColor(ResourcesCompat.getColor(resources, R.color.text_color_blue, null))
                     }
 
                     text = data.groupName

+ 118 - 35
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_detail/EntryAndExitFeeTotalFragment.kt

@@ -6,14 +6,19 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.TextView
 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.BaseRequest
 import com.pan_american.android.base.BaseResponse
 import com.pan_american.android.base.CustomAlertDialog
-import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.DownloadCustomerListRequest
-import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.DownloadCustomerListResponse
+import com.pan_american.android.base.ListAdapter
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.entity.EntryAndExitFileItem
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDetailResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitDocumentListResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitFileDownloadRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitFileDownloadResponse
 import com.pan_american.android.data.network.APIService
 import com.pan_american.android.data.network.ServiceCreator
 import com.pan_american.android.databinding.FragmentEntryAndExitFeeTotalBinding
@@ -28,6 +33,8 @@ class EntryAndExitFeeTotalFragment : BaseFragment<FragmentEntryAndExitFeeTotalBi
 
     private val apiService = ServiceCreator.create<APIService>()
 
+    private val documentFileList = ArrayList<EntryAndExitFileItem>()
+
     override fun getViewBinding(
         inflater: LayoutInflater,
         container: ViewGroup?,
@@ -81,28 +88,34 @@ class EntryAndExitFeeTotalFragment : BaseFragment<FragmentEntryAndExitFeeTotalBi
             binding.checkEconomyClass.isChecked = choiceTwoJJ == 1
 
             if (choiceTwoJJ == 1) {
-                binding.economyClass.text = String.format(resources.getString(R.string.economy_class_price), outsideJJPay)
+                binding.economyClass.text =
+                    String.format(resources.getString(R.string.economy_class_price), outsideJJPay)
                 economyTotalPayment += outsideJJPay
             } else {
-                binding.economyClass.text = String.format(resources.getString(R.string.economy_class_price), 0.0)
+                binding.economyClass.text =
+                    String.format(resources.getString(R.string.economy_class_price), 0.0)
             }
 
             binding.checkBusinessClass.isChecked = choiceTwoGW == 1
 
             if (choiceTwoGW == 1) {
-                binding.businessClass.text = String.format(resources.getString(R.string.business_class_price), outsideGWPay)
+                binding.businessClass.text =
+                    String.format(resources.getString(R.string.business_class_price), outsideGWPay)
                 bussinessTotalPayment += outsideGWPay
             } else {
-                binding.businessClass.text = String.format(resources.getString(R.string.business_class_price), 0.0)
+                binding.businessClass.text =
+                    String.format(resources.getString(R.string.business_class_price), 0.0)
             }
 
             binding.checkFirstClass.isChecked = choiceTwoTD == 1
 
             if (choiceTwoTD == 1) {
-                binding.firstClass.text = String.format(resources.getString(R.string.first_class_price), outsideTDPay)
+                binding.firstClass.text =
+                    String.format(resources.getString(R.string.first_class_price), outsideTDPay)
                 firstClassTotalPayment += outsideTDPay
             } else {
-                binding.firstClass.text = String.format(resources.getString(R.string.first_class_price), 0.0)
+                binding.firstClass.text =
+                    String.format(resources.getString(R.string.first_class_price), 0.0)
             }
 
             binding.checkAccommodationFee.isChecked = choiceThree == 1
@@ -348,8 +361,9 @@ class EntryAndExitFeeTotalFragment : BaseFragment<FragmentEntryAndExitFeeTotalBi
             }
         }
 
-        binding.downloadGroupMembersList.setOnClickListener {
-            downloadCustomerList()
+        binding.documentDownload.setOnClickListener {
+            documentFileList.clear()
+            getDocumentList()
         }
     }
 
@@ -367,7 +381,10 @@ class EntryAndExitFeeTotalFragment : BaseFragment<FragmentEntryAndExitFeeTotalBi
         apiService.exportPaymentToCollectionBill(groupId = OASystem.entryAndExitDetailResponse.diId)
             .enqueue(object :
                 Callback<BaseResponse> {
-                override fun onResponse(call: Call<BaseResponse>, response: Response<BaseResponse>) {
+                override fun onResponse(
+                    call: Call<BaseResponse>,
+                    response: Response<BaseResponse>
+                ) {
                     val addResponse = response.body()
 
                     if (addResponse != null) {
@@ -385,44 +402,110 @@ class EntryAndExitFeeTotalFragment : BaseFragment<FragmentEntryAndExitFeeTotalBi
             })
     }
 
-    private fun downloadCustomerList() {
+    private fun getDocumentList() {
+        apiService.getEntryAndExitDocumentList(BaseRequest())
+            .enqueue(object : Callback<EntryAndExitDocumentListResponse> {
+                override fun onResponse(
+                    call: Call<EntryAndExitDocumentListResponse>,
+                    response: Response<EntryAndExitDocumentListResponse>
+                ) {
+                    val fileListResponse = response.body()
 
-        if (!isAdded) {
-            return
+                    if (fileListResponse != null) {
+                        if (fileListResponse.code == 200) {
+
+                            for (item in fileListResponse.data.fileTypeData) {
+                                documentFileList.add(item)
+                            }
+
+                            showFileListPopupWindow()
+
+                        } else {
+                            showMessage(fileListResponse.msg)
+                        }
+                    }
+                }
+
+                override fun onFailure(p0: Call<EntryAndExitDocumentListResponse>, p1: Throwable) {
+                    showErrorInfo(R.string.interface_request_error)
+                }
+            })
+    }
+
+    private fun showFileListPopupWindow() {
+        showSelector {
+            val adapter = ListAdapter.Builder<EntryAndExitFileItem>().apply {
+                setData(documentFileList)
+                setLayoutId(R.layout.item_selector)
+                addBindView { itemView, data ->
+                    itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+                        text = data.name
+                    }
+                }
+            }.create()
+
+            selector.adapter = adapter
+
+            adapter.onRecyclerViewItemClick =
+                object : ListAdapter.OnRecyclerViewItemClick<EntryAndExitFileItem> {
+                    override fun onItemClick(position: Int) {
+                        downloadFile(documentFileList[position])
+                        popupWindow.dismiss()
+                    }
+                }
         }
+    }
 
-        apiService.downloadCustomerList(DownloadCustomerListRequest(diId = OASystem.entryAndExitDetailResponse.diId)).enqueue(object : Callback<DownloadCustomerListResponse> {
+    private fun downloadFile(fileItem: EntryAndExitFileItem) {
+        apiService.downloadEntryAndExitFile(
+            EntryAndExitFileDownloadRequest(
+                diId = OASystem.entryAndExitDetailResponse.diId,
+                exportType = fileItem.parentId,
+                subTypeId = fileItem.id
+            )
+        ).enqueue(object : Callback<EntryAndExitFileDownloadResponse> {
             override fun onResponse(
-                call: Call<DownloadCustomerListResponse>,
-                response: Response<DownloadCustomerListResponse>
+                call: Call<EntryAndExitFileDownloadResponse>,
+                response: Response<EntryAndExitFileDownloadResponse>
             ) {
-                val dataResponse = response.body()
-                if (dataResponse != null) {
-                    if (dataResponse.code == 200) {
-
-                        CustomAlertDialog.Builder(OASystem.context).apply {
-                            setTitle(resources.getString(R.string.hint))
-                            setMessage(resources.getString(R.string.group_members_list_generated))
-                            setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
-                                dialog.dismiss()
-                            }
-                            setPositiveButtonAndListener(resources.getString(R.string.confirm)) { dialog, _ ->
-                                val uri = Uri.parse(dataResponse.data)
-                                startActivity(Intent(Intent.ACTION_VIEW, uri))
+                val downloadResponse = response.body()
 
-                                dialog.dismiss()
-                            }
-                        }
+                if (downloadResponse != null) {
+                    if (downloadResponse.code == 200) {
+
+                        showDownloadHintDialog(fileItem.name, downloadResponse.data)
 
                     } else {
-                        showMessage(dataResponse.msg)
+                        showMessage(downloadResponse.msg)
                     }
                 }
             }
 
-            override fun onFailure(p0: Call<DownloadCustomerListResponse>, p1: Throwable) {
+            override fun onFailure(p0: Call<EntryAndExitFileDownloadResponse>, p1: Throwable) {
                 showErrorInfo(R.string.interface_request_error)
             }
         })
     }
+
+    private fun showDownloadHintDialog(docType: String, url: String) {
+        CustomAlertDialog.Builder().apply {
+            setTitle(resources.getString(R.string.hint))
+            setMessage(
+                String.format(
+                    resources.getString(R.string.entry_and_exit_file_download_hint),
+                    docType
+                )
+            )
+            setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
+                dialog.dismiss()
+            }
+            setPositiveButtonAndListener(resources.getString(R.string.confirm)) { dialog, _ ->
+                val uri = Uri.parse(url)
+                startActivity(Intent(Intent.ACTION_VIEW, uri))
+
+                dialog.dismiss()
+            }
+            setCancelable(false)
+        }.show()
+    }
 }

+ 3 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitDraftPaymentDetailActivity.kt

@@ -3,6 +3,7 @@ package com.pan_american.android.ui.group_management.entry_and_exit_fee_draft
 import android.os.Bundle
 import android.text.Editable
 import android.text.TextWatcher
+import android.util.Log
 import android.view.Gravity
 import android.view.View
 import android.view.ViewGroup
@@ -12,6 +13,7 @@ import android.widget.PopupWindow
 import android.widget.TextView
 import androidx.core.content.res.ResourcesCompat
 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
@@ -460,6 +462,7 @@ class EntryAndExitDraftPaymentDetailActivity : BaseActivity<ActivityEntryAndExit
     }
 
     private fun updateEntryAndExitPaymentDetail() {
+        Log.e("request", Gson().toJson(updateEntryAndExitDraftPaymentDetailRequest))
         apiService.updateEntryAndExitDraftPaymentDetail(updateEntryAndExitDraftPaymentDetailRequest).enqueue(object :
             Callback<BaseResponse> {
             override fun onResponse(call: Call<BaseResponse>, response: Response<BaseResponse>) {

+ 5 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitFeeDraftListActivity.kt

@@ -2,6 +2,7 @@ package com.pan_american.android.ui.group_management.entry_and_exit_fee_draft
 
 import android.content.Intent
 import android.os.Bundle
+import android.view.Gravity
 import android.view.View
 import android.view.ViewGroup
 import android.widget.EditText
@@ -97,6 +98,8 @@ class EntryAndExitFeeDraftListActivity : BaseActivity<ActivityEntryAndExitFeeDra
                     commitButton.setOnClickListener {
                         addNewDraft(draftNameEditText.getText().toString())
                     }
+
+                    popupWindow.showAtLocation(binding.root, Gravity.CENTER, 0, 0)
                 }
             }
 
@@ -259,6 +262,8 @@ class EntryAndExitFeeDraftListActivity : BaseActivity<ActivityEntryAndExitFeeDra
 
                             popupWindow.dismiss()
 
+                            binding.draftNameList.adapter!!.notifyItemRangeRemoved(0, draftNameList.size)
+                            draftNameList.clear()
                             getDraftList(2)
 
                             val intent =

+ 421 - 13
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitFeeDraftTotalFragment.kt

@@ -1,24 +1,61 @@
 package com.pan_american.android.ui.group_management.entry_and_exit_fee_draft
 
+import android.content.Intent
+import android.net.Uri
 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 com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseFragment
+import com.pan_american.android.base.BaseRequest
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.base.CustomAlertDialog
+import com.pan_american.android.base.ListAdapter
+import com.pan_american.android.data.model.common.entity.Selector
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitGroupListRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_detail.network.EntryAndExitGroupListResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DraftFileTypeResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DraftWordFileDownloadRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DraftWordFileDownloadResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.EntryAndExitDraftTotalResponse
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.SynchronizeDraftToGroupRequest
 import com.pan_american.android.data.network.APIService
 import com.pan_american.android.data.network.ServiceCreator
 import com.pan_american.android.databinding.FragmentEntryAndEntryFeeDraftTotalBinding
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
 
-class EntryAndExitFeeDraftTotalFragment : BaseFragment<FragmentEntryAndEntryFeeDraftTotalBinding>() {
+class EntryAndExitFeeDraftTotalFragment :
+    BaseFragment<FragmentEntryAndEntryFeeDraftTotalBinding>() {
 
     private val apiService = ServiceCreator.create<APIService>()
 
+    private val entryAndExitGroupListRequest = EntryAndExitGroupListRequest().apply {
+        pageIndex = 1
+        pageSize = 10
+    }
+
+    private val groupNameList = ArrayList<Selector>()
+
+    private val wordTypeData = ArrayList<Selector>()
+
     override fun getViewBinding(
         inflater: LayoutInflater,
         container: ViewGroup?,
@@ -74,28 +111,34 @@ class EntryAndExitFeeDraftTotalFragment : BaseFragment<FragmentEntryAndEntryFeeD
             binding.checkEconomyClass.isChecked = choiceTwoJJ == 1
 
             if (choiceTwoJJ == 1) {
-                binding.economyClass.text = String.format(resources.getString(R.string.economy_class_price), outsideJJPay)
+                binding.economyClass.text =
+                    String.format(resources.getString(R.string.economy_class_price), outsideJJPay)
                 economyTotalPayment += outsideJJPay
             } else {
-                binding.economyClass.text = String.format(resources.getString(R.string.economy_class_price), 0.0)
+                binding.economyClass.text =
+                    String.format(resources.getString(R.string.economy_class_price), 0.0)
             }
 
             binding.checkBusinessClass.isChecked = choiceTwoGW == 1
 
             if (choiceTwoGW == 1) {
-                binding.businessClass.text = String.format(resources.getString(R.string.business_class_price), outsideGWPay)
+                binding.businessClass.text =
+                    String.format(resources.getString(R.string.business_class_price), outsideGWPay)
                 bussinessTotalPayment += outsideGWPay
             } else {
-                binding.businessClass.text = String.format(resources.getString(R.string.business_class_price), 0.0)
+                binding.businessClass.text =
+                    String.format(resources.getString(R.string.business_class_price), 0.0)
             }
 
             binding.checkFirstClass.isChecked = choiceTwoTD == 1
 
             if (choiceTwoTD == 1) {
-                binding.firstClass.text = String.format(resources.getString(R.string.first_class_price), outsideTDPay)
+                binding.firstClass.text =
+                    String.format(resources.getString(R.string.first_class_price), outsideTDPay)
                 firstClassTotalPayment += outsideTDPay
             } else {
-                binding.firstClass.text = String.format(resources.getString(R.string.first_class_price), 0.0)
+                binding.firstClass.text =
+                    String.format(resources.getString(R.string.first_class_price), 0.0)
             }
 
             binding.checkAccommodationFee.isChecked = choiceThree == 1
@@ -194,10 +237,6 @@ class EntryAndExitFeeDraftTotalFragment : BaseFragment<FragmentEntryAndEntryFeeD
 
     override fun initEvents() {
 
-        binding.draftName.setOnClickListener {
-
-        }
-
         binding.inBoardFee.setOnClickListener {
 
             val bundle = Bundle().apply {
@@ -331,11 +370,11 @@ class EntryAndExitFeeDraftTotalFragment : BaseFragment<FragmentEntryAndEntryFeeD
         }
 
         binding.synchronizeToGroup.setOnClickListener {
-
+            getGroupList(1)
         }
 
         binding.exportDetailList.setOnClickListener {
-
+            getFileList()
         }
     }
 
@@ -343,4 +382,373 @@ class EntryAndExitFeeDraftTotalFragment : BaseFragment<FragmentEntryAndEntryFeeD
     fun updateView(response: EntryAndExitDraftTotalResponse) {
         initViews()
     }
+
+    private fun getGroupList(type: Int) {
+        apiService.getEntryAndExitGroupList(entryAndExitGroupListRequest).enqueue(object :
+            Callback<EntryAndExitGroupListResponse> {
+            override fun onResponse(
+                call: Call<EntryAndExitGroupListResponse>,
+                response: Response<EntryAndExitGroupListResponse>
+            ) {
+                val listResponse = response.body()
+
+                if (listResponse != null) {
+                    if (listResponse.code == 200) {
+                        if (listResponse.data.size == 0) {
+                            showMessage(resources.getString(R.string.no_data))
+                        } else {
+
+                            for (item in listResponse.data) {
+                                groupNameList.add(item)
+                            }
+
+                            when (type) {
+                                1 -> {
+
+                                    val popView = View.inflate(
+                                        OASystem.context,
+                                        R.layout.popup_smart_refresh_selector,
+                                        null
+                                    )
+                                    popupWindow = PopupWindow(
+                                        popView,
+                                        ViewGroup.LayoutParams.MATCH_PARENT,
+                                        ViewGroup.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 {
+                                                                if (data.isNull) {
+                                                                    setTextColor(
+                                                                        ResourcesCompat.getColor(
+                                                                            resources,
+                                                                            R.color.text_color,
+                                                                            null
+                                                                        )
+                                                                    )
+                                                                } else {
+                                                                    setTextColor(
+                                                                        ResourcesCompat.getColor(
+                                                                            resources,
+                                                                            R.color.text_color_blue,
+                                                                            null
+                                                                        )
+                                                                    )
+                                                                }
+
+                                                                text = data.groupName
+                                                            }
+                                                    }
+                                                }.create()
+
+                                        selector.adapter = adapter
+
+                                        adapter.onRecyclerViewItemClick =
+                                            object :
+                                                ListAdapter.OnRecyclerViewItemClick<Selector> {
+                                                override fun onItemClick(position: Int) {
+                                                    groupNameList[position].apply {
+                                                        showGroupSynchronizePopup(this)
+                                                    }
+
+                                                    popupWindow.dismiss()
+                                                }
+                                            }
+
+                                        selectorContainer.setOnRefreshLoadMoreListener(object :
+                                            OnRefreshLoadMoreListener {
+                                            override fun onRefresh(p0: RefreshLayout) {
+                                                entryAndExitGroupListRequest.pageIndex = 1
+
+                                                selector.adapter!!.notifyItemRangeRemoved(
+                                                    0,
+                                                    groupNameList.size
+                                                )
+
+                                                groupNameList.clear()
+
+                                                getGroupList(2)
+                                            }
+
+                                            override fun onLoadMore(p0: RefreshLayout) {
+                                                entryAndExitGroupListRequest.pageIndex += 1
+
+                                                getGroupList(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()
+
+                                                entryAndExitGroupListRequest.apply {
+                                                    pageIndex = 1
+                                                    groupName = editable.toString()
+                                                }
+
+                                                getGroupList(2)
+                                            }
+                                        })
+
+                                        popupWindow.showAtLocation(
+                                            binding.root,
+                                            Gravity.BOTTOM,
+                                            0,
+                                            0
+                                        )
+                                    }
+
+                                    selectorContainer.setEnableLoadMore(
+                                        entryAndExitGroupListRequest.pageIndex < getTotalPage(
+                                            listResponse.count
+                                        )
+                                    )
+                                    selector.adapter!!.notifyItemInserted(0)
+                                }
+
+                                2 -> {
+                                    selectorContainer.finishRefresh()
+                                    selectorContainer.setEnableLoadMore(
+                                        entryAndExitGroupListRequest.pageIndex < getTotalPage(
+                                            listResponse.count
+                                        )
+                                    )
+                                    selector.adapter!!.notifyItemInserted(0)
+                                }
+
+                                3 -> {
+                                    selectorContainer.finishLoadMore()
+                                    selectorContainer.setEnableLoadMore(
+                                        entryAndExitGroupListRequest.pageIndex < getTotalPage(
+                                            listResponse.count
+                                        )
+                                    )
+                                    selector.adapter!!.notifyItemInserted(groupNameList.size)
+                                }
+                            }
+                        }
+
+                    } else {
+                        showMessage(listResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<EntryAndExitGroupListResponse>, p1: Throwable) {
+                showErrorInfo(R.string.group_list_get_failed)
+            }
+        })
+    }
+
+    private fun getTotalPage(count: Int): Int {
+        var pageCount = count / 10
+
+        if (count % 10 > 0) {
+            pageCount += 1
+        }
+
+        return pageCount
+    }
+
+    private fun showGroupSynchronizePopup(groupInfo: Selector) {
+        CustomAlertDialog.Builder(OASystem.context).apply {
+            setTitle(resources.getString(R.string.alert))
+            setMessage(
+                String.format(
+                    resources.getString(R.string.synchronize_draft_to_group_hint),
+                    OASystem.entryAndExitDraftResponse.draftName,
+                    groupInfo.name
+                )
+            )
+            setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
+                dialog.dismiss()
+            }
+            setPositiveButtonAndListener(resources.getString(R.string.confirm)) { dialog, _ ->
+                synchronizeDraftToGroup(groupInfo.id, OASystem.entryAndExitDraftResponse.id)
+
+                dialog.dismiss()
+            }
+        }.show()
+    }
+
+    private fun synchronizeDraftToGroup(groupId: Int, draftId: Int) {
+        apiService.synchronizeDraftToGroup(
+            SynchronizeDraftToGroupRequest(
+                groupId = groupId,
+                draftId = draftId
+            )
+        ).enqueue(object : Callback<BaseResponse> {
+            override fun onResponse(call: Call<BaseResponse>, response: Response<BaseResponse>) {
+
+                val synchronizeResponse = response.body()
+
+                if (synchronizeResponse != null) {
+                    if (synchronizeResponse.code == 200) {
+                        showMessage(resources.getString(R.string.operate_success))
+                    } else {
+                        showMessage(synchronizeResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<BaseResponse>, p1: Throwable) {
+                showErrorInfo(R.string.interface_request_error)
+            }
+        })
+    }
+
+    private fun getFileList() {
+
+        wordTypeData.clear()
+
+        apiService.getDraftFileList(BaseRequest())
+            .enqueue(object : Callback<DraftFileTypeResponse> {
+                override fun onResponse(
+                    call: Call<DraftFileTypeResponse>,
+                    response: Response<DraftFileTypeResponse>
+                ) {
+                    val listResponse = response.body()
+
+                    if (listResponse != null) {
+                        if (listResponse.code == 200) {
+
+                            for (item in listResponse.data.wordTypeData) {
+                                wordTypeData.add(item)
+                            }
+
+                            showWordTypeSelector()
+
+                        } else {
+                            showMessage(listResponse.msg)
+                        }
+                    }
+                }
+
+                override fun onFailure(p0: Call<DraftFileTypeResponse>, p1: Throwable) {
+                    showErrorInfo(R.string.interface_request_error)
+                }
+            })
+    }
+
+    private fun showWordTypeSelector() {
+        showSelector {
+            val adapter = ListAdapter.Builder<Selector>().apply {
+                setData(wordTypeData)
+                setLayoutId(R.layout.item_selector)
+                addBindView { itemView, data ->
+                    itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+                        text = data.name
+                    }
+                }
+            }.create()
+
+            selector.adapter = adapter
+
+            adapter.onRecyclerViewItemClick =
+                object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                    override fun onItemClick(position: Int) {
+                        downloadWordFile(wordTypeData[position])
+                        popupWindow.dismiss()
+                    }
+                }
+        }
+    }
+
+    private fun downloadWordFile(type: Selector) {
+
+        apiService.downloadDraftWordFile(
+            DraftWordFileDownloadRequest(
+                id = OASystem.entryAndExitDraftResponse.id,
+                subTypeId = type.id
+            )
+        ).enqueue(object : Callback<DraftWordFileDownloadResponse> {
+            override fun onResponse(
+                call: Call<DraftWordFileDownloadResponse>,
+                response: Response<DraftWordFileDownloadResponse>
+            ) {
+                val urlResponse = response.body()
+
+                if (urlResponse != null) {
+                    if (urlResponse.code == 200) {
+
+                        CustomAlertDialog.Builder(OASystem.context).apply {
+                            setTitle(resources.getString(R.string.hint))
+                            setMessage(
+                                String.format(
+                                    resources.getString(R.string.draft_document_generated),
+                                    OASystem.entryAndExitDraftResponse.draftName,
+                                    type.name
+                                )
+                            )
+                            setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
+                                dialog.dismiss()
+                            }
+                            setPositiveButtonAndListener(resources.getString(R.string.confirm)) { dialog, _ ->
+
+                                val uri = Uri.parse(urlResponse.data)
+                                startActivity(Intent(Intent.ACTION_VIEW, uri))
+
+                                dialog.dismiss()
+                            }
+                        }.show()
+
+                    } else {
+                        showMessage(urlResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<DraftWordFileDownloadResponse>, p1: Throwable) {
+                showErrorInfo(R.string.interface_request_error)
+            }
+        })
+    }
 }

+ 5 - 9
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/EntryAndExitPaymentDraftListFragment.kt

@@ -19,13 +19,13 @@ import com.pan_american.android.base.CustomAlertDialog
 import com.pan_american.android.data.model.common.entity.Selector
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.entity.EntryAndExitDraftPaymentListItem
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.DeleteEntryAndExitDraftPaymentItemRequest
+import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.EntryAndExitDraftPaymentListResponse
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.EntryAndExitDraftPaymentTypeRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateEntryAndExitDraftCurrencyRateRequest
 import com.pan_american.android.data.model.group_management.entry_and_exit_fee_draft.network.UpdateEntryAndExitDraftTypeStatusRequest
 import com.pan_american.android.data.network.APIService
 import com.pan_american.android.data.network.ServiceCreator
 import com.pan_american.android.databinding.FragmentEntryAndExitPaymentDraftListBinding
-import com.pan_american.android.ui.group_management.entry_and_exit_fee_detail.EntryAndExitPaymentDetailActivity
 import com.pan_american.android.util.MoneyInputFilter
 import org.greenrobot.eventbus.EventBus
 import retrofit2.Call
@@ -55,7 +55,7 @@ class EntryAndExitPaymentDraftListFragment : BaseFragment<FragmentEntryAndExitPa
 
         requireArguments().apply {
             typeId = getInt("type")
-            draftId = getInt("groupId")
+            draftId = getInt("draftId")
         }
 
         initViews()
@@ -128,10 +128,6 @@ class EntryAndExitPaymentDraftListFragment : BaseFragment<FragmentEntryAndExitPa
     }
 
     override fun initViews() {
-//        if (!OASystem.entryAndExitDetailCanBeEdit) {
-//            binding.isSelected.isEnabled = false
-//            binding.addPayment.visibility = View.GONE
-//        }
 
         when (typeId) {
             3 -> {
@@ -172,7 +168,7 @@ class EntryAndExitPaymentDraftListFragment : BaseFragment<FragmentEntryAndExitPa
 
         binding.addPayment.setOnClickListener {
             val intent =
-                Intent(OASystem.context, EntryAndExitPaymentDetailActivity::class.java).apply {
+                Intent(OASystem.context, EntryAndExitDraftPaymentDetailActivity::class.java).apply {
                     putExtra("fromList", false)
                     putExtra("draftId", draftId)
                     putExtra("feeType", typeId)
@@ -210,7 +206,7 @@ class EntryAndExitPaymentDraftListFragment : BaseFragment<FragmentEntryAndExitPa
 
                     val intent = Intent(
                         OASystem.context,
-                        EntryAndExitPaymentDetailActivity::class.java
+                        EntryAndExitDraftPaymentDetailActivity::class.java
                     ).apply {
                         putExtra("fromList", true)
                         putExtra("id", item.subId)
@@ -221,7 +217,7 @@ class EntryAndExitPaymentDraftListFragment : BaseFragment<FragmentEntryAndExitPa
                         putExtra("currency", item.currency)
                         putExtra("currencyName", item.currencyName)
                         putExtra("subTotal", item.subTotal)
-                        putExtra("diId", draftId)
+                        putExtra("draftId", draftId)
                         putExtra("feeType", typeId)
                     }
 

+ 5 - 0
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/InBoardFeeDraftFragment.kt

@@ -1,9 +1,11 @@
 package com.pan_american.android.ui.group_management.entry_and_exit_fee_draft
 
 import android.os.Bundle
+import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import com.google.gson.Gson
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseFragment
@@ -92,6 +94,7 @@ class InBoardFeeDraftFragment : BaseFragment<FragmentInBoardFeeDraftBinding>() {
                             binding.servicePrice.setText("$service")
                             binding.insurancePrice.setText("$safe")
                             binding.ticketPrice.setText("$ticket")
+                            binding.remark.setText(firstItemRemark)
                         }
 
                     } else {
@@ -206,6 +209,8 @@ class InBoardFeeDraftFragment : BaseFragment<FragmentInBoardFeeDraftBinding>() {
 
     private fun updateInBoardPayment(updateInBoardPaymentRequest: UpdateInBoardDraftPaymentRequest) {
 
+        Log.e("request", Gson().toJson(updateInBoardPaymentRequest))
+
         if (!isAdded) {
             return
         }

+ 5 - 5
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/OtherPaymentDraftActivity.kt

@@ -280,7 +280,7 @@ class OtherPaymentDraftActivity : BaseActivity<ActivityOtherPaymentDraftBinding>
                                 for (item in groupOtherRateData) {
                                     when (item.currencyCode) {
                                         "USD" -> {
-                                            for (currency in OASystem.entryAndExitDetailResponse.currencys) {
+                                            for (currency in OASystem.entryAndExitDraftResponse.currencys) {
                                                 if (item.currencyCode == currency.currencyCode) {
                                                     item.rate = currency.rate
                                                 }
@@ -288,7 +288,7 @@ class OtherPaymentDraftActivity : BaseActivity<ActivityOtherPaymentDraftBinding>
                                         }
 
                                         "EUR" -> {
-                                            for (currency in OASystem.entryAndExitDetailResponse.currencys) {
+                                            for (currency in OASystem.entryAndExitDraftResponse.currencys) {
                                                 if (item.currencyCode == currency.currencyCode) {
                                                     item.rate = currency.rate
                                                 }
@@ -296,7 +296,7 @@ class OtherPaymentDraftActivity : BaseActivity<ActivityOtherPaymentDraftBinding>
                                         }
 
                                         "GBP" -> {
-                                            for (currency in OASystem.entryAndExitDetailResponse.currencys) {
+                                            for (currency in OASystem.entryAndExitDraftResponse.currencys) {
                                                 if (item.currencyCode == currency.currencyCode) {
                                                     item.rate = currency.rate
                                                 }
@@ -304,7 +304,7 @@ class OtherPaymentDraftActivity : BaseActivity<ActivityOtherPaymentDraftBinding>
                                         }
 
                                         "JPY" -> {
-                                            for (currency in OASystem.entryAndExitDetailResponse.currencys) {
+                                            for (currency in OASystem.entryAndExitDraftResponse.currencys) {
                                                 if (item.currencyCode == currency.currencyCode) {
                                                     item.rate = currency.rate
                                                 }
@@ -312,7 +312,7 @@ class OtherPaymentDraftActivity : BaseActivity<ActivityOtherPaymentDraftBinding>
                                         }
 
                                         "HKD" -> {
-                                            for (currency in OASystem.entryAndExitDetailResponse.currencys) {
+                                            for (currency in OASystem.entryAndExitDraftResponse.currencys) {
                                                 if (item.currencyCode == currency.currencyCode) {
                                                     item.rate = currency.rate
                                                 }

+ 3 - 4
app/src/main/java/com/pan_american/android/ui/group_management/entry_and_exit_fee_draft/OtherPaymentDraftFragment.kt

@@ -26,7 +26,6 @@ import com.pan_american.android.data.model.group_management.entry_and_exit_fee_d
 import com.pan_american.android.data.network.APIService
 import com.pan_american.android.data.network.ServiceCreator
 import com.pan_american.android.databinding.FragmentOtherPaymentDraftBinding
-import com.pan_american.android.ui.group_management.entry_and_exit_fee_detail.OtherPaymentDetailActivity
 import com.pan_american.android.util.MoneyInputFilter
 import com.pan_american.android.util.ScrollEditText
 import org.greenrobot.eventbus.EventBus
@@ -147,9 +146,9 @@ class OtherPaymentDraftFragment : BaseFragment<FragmentOtherPaymentDraftBinding>
 
         binding.addPayment.setOnClickListener {
             val intent =
-                Intent(OASystem.context, OtherPaymentDetailActivity::class.java).apply {
+                Intent(OASystem.context, OtherPaymentDraftActivity::class.java).apply {
                     putExtra("fromList", false)
-                    putExtra("diId", draftId)
+                    putExtra("draftId", draftId)
                     putExtra("index", if (paymentList.size == 0) {
                         1
                     } else {
@@ -193,7 +192,7 @@ class OtherPaymentDraftFragment : BaseFragment<FragmentOtherPaymentDraftBinding>
 
                     val intent = Intent(
                         OASystem.context,
-                        OtherPaymentDetailActivity::class.java
+                        OtherPaymentDraftActivity::class.java
                     ).apply {
                         putExtra("fromList", true)
                         putExtra("draftId", draftId)

+ 1 - 1
app/src/main/res/layout/activity_entry_and_exit_fee_draft.xml

@@ -15,6 +15,6 @@
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1"
-        tools:layout="@layout/fragment_entry_and_exit_fee_total" />
+        tools:layout="@layout/fragment_entry_and_entry_fee_draft_total" />
 
 </LinearLayout>

+ 2 - 164
app/src/main/res/layout/fragment_document.xml

@@ -462,174 +462,12 @@
 
                     </LinearLayout>
 
-                    <LinearLayout
-                        android:id="@+id/founds_examine_form"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:visibility="visible">
-
-                        <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/founds_examine_form"
-                            android:textColor="@color/text_color"
-                            android:textSize="@dimen/text_size_medium"
-                            app:drawableStartCompat="@mipmap/icon_document_word" />
-
-                        <View
-                            android:layout_width="match_parent"
-                            android:layout_height="1dp"
-                            android:layout_marginStart="35dp"
-                            android:background="@color/line_color" />
-
-                    </LinearLayout>
-
-                    <LinearLayout
-                        android:id="@+id/founds_calculate_form"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:visibility="visible">
-
-                        <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/founds_calculate_form"
-                            android:textColor="@color/text_color"
-                            android:textSize="@dimen/text_size_medium"
-                            app:drawableStartCompat="@mipmap/icon_document_word" />
-
-                        <View
-                            android:layout_width="match_parent"
-                            android:layout_height="1dp"
-                            android:layout_marginStart="35dp"
-                            android:background="@color/line_color" />
-
-                    </LinearLayout>
-
-                    <LinearLayout
-                        android:id="@+id/province_examine_form"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:visibility="visible">
-
-                        <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/province_examine_form"
-                            android:textColor="@color/text_color"
-                            android:textSize="@dimen/text_size_medium"
-                            app:drawableStartCompat="@mipmap/icon_document_excel" />
-
-                        <View
-                            android:layout_width="match_parent"
-                            android:layout_height="1dp"
-                            android:layout_marginStart="35dp"
-                            android:background="@color/line_color" />
-
-                    </LinearLayout>
-
-                    <LinearLayout
-                        android:id="@+id/city_examine_form"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:visibility="visible">
-
-                        <TextView
-                            android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:drawablePadding="@dimen/common_padding"
-                            android:ellipsize="marquee"
-                            android:gravity="center_vertical"
-                            android:maxLines="1"
-                            android:paddingTop="@dimen/common_padding"
-                            android:paddingBottom="@dimen/common_padding"
-                            android:text="@string/city_examine_form"
-                            android:textColor="@color/text_color"
-                            android:textSize="@dimen/text_size_medium"
-                            app:drawableStartCompat="@mipmap/icon_document_word" />
-
-                        <View
-                            android:layout_width="match_parent"
-                            android:layout_height="1dp"
-                            android:layout_marginStart="35dp"
-                            android:background="@color/line_color" />
-
-                    </LinearLayout>
-
-                    <LinearLayout
-                        android:id="@+id/leave_examine_form"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:visibility="visible">
-
-                        <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/leave_examine_form"
-                            android:textColor="@color/text_color"
-                            android:textSize="@dimen/text_size_medium"
-                            app:drawableStartCompat="@mipmap/icon_document_word" />
-
-                        <View
-                            android:layout_width="match_parent"
-                            android:layout_height="1dp"
-                            android:layout_marginStart="35dp"
-                            android:background="@color/line_color" />
-
-                    </LinearLayout>
-
-                    <LinearLayout
-                        android:id="@+id/reimbursement_form"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:visibility="visible">
-
-                        <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/reimbursement_form"
-                            android:textColor="@color/text_color"
-                            android:textSize="@dimen/text_size_medium"
-                            app:drawableStartCompat="@mipmap/icon_document_word" />
-
-                        <View
-                            android:layout_width="match_parent"
-                            android:layout_height="1dp"
-                            android:layout_marginStart="35dp"
-                            android:background="@color/line_color" />
-
-                    </LinearLayout>
-
                 </LinearLayout>
 
             </LinearLayout>
 
         </LinearLayout>
+
     </ScrollView>
+
 </LinearLayout>

+ 2 - 2
app/src/main/res/layout/fragment_entry_and_exit_fee_total.xml

@@ -621,7 +621,7 @@
             android:textColor="@color/white" />
 
         <TextView
-            android:id="@+id/download_group_members_list"
+            android:id="@+id/document_download"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_margin="@dimen/common_padding"
@@ -629,7 +629,7 @@
             android:background="@drawable/shape_corner_solid_blue"
             android:gravity="center"
             android:padding="@dimen/common_padding"
-            android:text="@string/download_group_members_list"
+            android:text="@string/document_download"
             android:textColor="@color/white" />
 
     </LinearLayout>

+ 4 - 0
app/src/main/res/layout/fragment_international_travel_fee_draft.xml

@@ -78,6 +78,7 @@
                     android:hint="@string/please_input"
                     android:importantForAutofill="no"
                     android:inputType="numberDecimal"
+                    android:selectAllOnFocus="true"
                     android:textColor="@color/text_color"
                     android:textColorHint="@color/hint_text_color"
                     android:textSize="@dimen/text_size_medium" />
@@ -131,6 +132,7 @@
                     android:hint="@string/please_input"
                     android:importantForAutofill="no"
                     android:inputType="numberDecimal"
+                    android:selectAllOnFocus="true"
                     android:textColor="@color/text_color"
                     android:textColorHint="@color/hint_text_color"
                     android:textSize="@dimen/text_size_medium" />
@@ -184,6 +186,7 @@
                     android:hint="@string/please_input"
                     android:importantForAutofill="no"
                     android:inputType="numberDecimal"
+                    android:selectAllOnFocus="true"
                     android:textColor="@color/text_color"
                     android:textColorHint="@color/hint_text_color"
                     android:textSize="@dimen/text_size_medium" />
@@ -229,6 +232,7 @@
                     android:hint="@string/please_input"
                     android:importantForAutofill="no"
                     android:inputType="numberDecimal"
+                    android:selectAllOnFocus="true"
                     android:textColor="@color/text_color"
                     android:textColorHint="@color/hint_text_color"
                     android:textSize="@dimen/text_size_medium" />

+ 5 - 3
app/src/main/res/layout/popup_add_new_draft.xml

@@ -3,7 +3,7 @@
     android:orientation="vertical"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
-    android:background="@color/white">
+    android:background="@drawable/shape_corner_white">
 
     <TextView
         android:layout_width="match_parent"
@@ -18,6 +18,7 @@
         android:layout_height="@dimen/line"
         android:layout_marginStart="@dimen/common_padding_large"
         android:layout_marginEnd="@dimen/common_padding_large"
+        android:layout_marginBottom="@dimen/common_padding_large"
         android:background="@color/line_color" />
 
     <LinearLayout
@@ -31,7 +32,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:text="@string/draft_name"
-            android:textSize="@dimen/text_size_medium" />
+            android:textSize="@dimen/text_size_large" />
 
         <EditText
             android:id="@+id/draft_name"
@@ -47,13 +48,14 @@
             android:singleLine="true"
             android:textColor="@color/text_color"
             android:textColorHint="@color/hint_text_color"
-            android:textSize="@dimen/text_size_medium" />
+            android:textSize="@dimen/text_size_large" />
     </LinearLayout>
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
+        android:layout_marginTop="@dimen/common_padding_large"
         android:layout_marginBottom="@dimen/common_padding_large">
 
         <TextView

+ 6 - 1
app/src/main/res/values/strings.xml

@@ -1339,7 +1339,7 @@
     <string name="other_fee">七. 其他</string>
     <string name="total_per_fee_format">合计: %.2f 元/人</string>
     <string name="export_to_collection_bill">导出到收款账单</string>
-    <string name="download_group_members_list">下载团组成员名单</string>
+    <string name="document_download">文档下载</string>
     <string name="airplane_price_detail">机票价格详细</string>
     <string name="economy_class_price">经济舱: %.2f 元 / 人</string>
     <string name="business_class_price">公务舱: %.2f 元 / 人</string>
@@ -1347,6 +1347,7 @@
 
     <string name="export_to_collection_bil_confirm">确认将费用导出到收款账单?</string>
     <string name="group_members_list_generated">团组客户名单已生成,点击确认前往下载s</string>
+    <string name="entry_and_exit_file_download_hint">文档已生成, 点击确认前往下载\n\n当前文档: %s</string>
 
     <string name="visa_payment">签证费</string>
     <string name="vaccine_payment">疫苗费</string>
@@ -1428,6 +1429,10 @@
 
     <string name="permission_list_get_error">权限列表获取失败</string>
 
+    <string name="synchronize_draft_to_group_hint">是否将草稿: %s \n\n同步到\n\n团组: %s 三公费用列表中? </string>
+
+    <string name="draft_document_generated">文档已生成, 点击确认跳转至浏览器下载\n\n草稿名称: %s\n\n文档类型: %s</string>
+
     <!-- 客户分布图 -->
     <string name="customer_distribution_map">客户分布图</string>