Selaa lähdekoodia

2024-07-24 新增 / 修改

1. 新增界面 票据管理
2. 新增 票据管理-下载 / 删除单个票据
3. 新增 票据管理-下载当前团组当前模块票据
4. 新增 票据管理-下载当前团组的所有票据

修改

1. 部分页面逻辑修改
zhaiy 11 kuukautta sitten
vanhempi
commit
0eac0287d6
48 muutettua tiedostoa jossa 1069 lisäystä ja 108 poistoa
  1. 3 0
      app/src/main/AndroidManifest.xml
  2. 3 0
      app/src/main/java/com/pan_american/android/OASystem.kt
  3. 20 28
      app/src/main/java/com/pan_american/android/base/BaseActivity.kt
  4. 49 0
      app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/adapter/BillFileItemAdapter.kt
  5. 7 0
      app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/entity/BillFileListItem.kt
  6. 5 0
      app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileDownloadAllRequest.kt
  7. 8 0
      app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileDownloadAllResponse.kt
  8. 6 0
      app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileDownloadThisModelRequest.kt
  9. 8 0
      app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileDownloadThisModelResponse.kt
  10. 7 0
      app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileGroupNameRequest.kt
  11. 8 0
      app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileListRequest.kt
  12. 6 0
      app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileListResponse.kt
  13. 38 0
      app/src/main/java/com/pan_american/android/data/network/APIService.kt
  14. 3 7
      app/src/main/java/com/pan_american/android/ui/customer_resource/company_customer/MarketCustomerActivity.kt
  15. 2 2
      app/src/main/java/com/pan_american/android/ui/customer_resource/market_sales_revenue/SalesCustomerVisitListActivity.kt
  16. 1 1
      app/src/main/java/com/pan_american/android/ui/customer_resource/market_sales_revenue/SalesRevenueListFragment.kt
  17. 1 1
      app/src/main/java/com/pan_american/android/ui/customer_resource/related_invitee/RelatedInviteeListFragment.kt
  18. 1 1
      app/src/main/java/com/pan_american/android/ui/customer_resource/related_invitee/RelatedInviteeSearchFragment.kt
  19. 2 4
      app/src/main/java/com/pan_american/android/ui/document/DocumentGroupListActivity.kt
  20. 1 1
      app/src/main/java/com/pan_american/android/ui/efficiency_tools/daily_payment/AddDailyPaymentActivity.kt
  21. 3 4
      app/src/main/java/com/pan_american/android/ui/efficiency_tools/daily_payment/DailyPaymentListActivity.kt
  22. 1 1
      app/src/main/java/com/pan_american/android/ui/group_airplane_ticket/airplane_payment_insert/AddAirplaneTicketActivity.kt
  23. 2 4
      app/src/main/java/com/pan_american/android/ui/group_airplane_ticket/airplane_payment_insert/AirplaneTicketListFragment.kt
  24. 576 0
      app/src/main/java/com/pan_american/android/ui/group_common/bill_management/BillManagementActivity.kt
  25. 1 3
      app/src/main/java/com/pan_american/android/ui/group_common/insurance_payment_insert/AddInsurancePaymentActivity.kt
  26. 2 4
      app/src/main/java/com/pan_american/android/ui/group_common/insurance_payment_insert/InsuranceListFragment.kt
  27. 1 1
      app/src/main/java/com/pan_american/android/ui/group_hotel/hotel_predetermine/HotelPredetermineBaseFragment.kt
  28. 1 3
      app/src/main/java/com/pan_american/android/ui/group_hotel/hotel_predetermine/HotelPredetermineListFragment.kt
  29. 1 1
      app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_data/AddInviteDataActivity.kt
  30. 2 2
      app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_data/InviteDataListFragment.kt
  31. 2 4
      app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_official_payment_insert/GroupInvitePaymentListFragment.kt
  32. 1 3
      app/src/main/java/com/pan_american/android/ui/group_management/group_info/GroupCustomerListFragment.kt
  33. 2 4
      app/src/main/java/com/pan_american/android/ui/group_management/group_info/GroupInfoListFragment.kt
  34. 2 4
      app/src/main/java/com/pan_american/android/ui/group_op/ground_convey_payment_insert/GroundConveyPaymentListFragment.kt
  35. 2 4
      app/src/main/java/com/pan_american/android/ui/group_simple_info/GroupSimpleInfoFragment.kt
  36. 1 3
      app/src/main/java/com/pan_american/android/ui/group_visa/visa_payment_insert/AddVisaPaymentActivity.kt
  37. 2 4
      app/src/main/java/com/pan_american/android/ui/group_visa/visa_payment_insert/VisaPaymentListFragment.kt
  38. 3 4
      app/src/main/java/com/pan_american/android/ui/resource_management/airplane_three_code/AirplaneThreeCodeListFragment.kt
  39. 2 2
      app/src/main/java/com/pan_american/android/ui/resource_management/car_resource/CarResourceListFragment.kt
  40. 3 4
      app/src/main/java/com/pan_american/android/ui/resource_management/guide_resource/GuideResourceListFragment.kt
  41. 3 4
      app/src/main/java/com/pan_american/android/ui/resource_management/hotel_resource/HotelResourceListFragment.kt
  42. 17 0
      app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt
  43. 5 0
      app/src/main/res/drawable/shape_corner_delete.xml
  44. 147 0
      app/src/main/res/layout/activity_bill_management.xml
  45. 27 0
      app/src/main/res/layout/fragment_workspace.xml
  46. 57 0
      app/src/main/res/layout/item_bill_file_list.xml
  47. BIN
      app/src/main/res/mipmap-xxhdpi/icon_bill_management.png
  48. 24 0
      app/src/main/res/values/strings.xml

+ 3 - 0
app/src/main/AndroidManifest.xml

@@ -26,6 +26,9 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         tools:targetApi="31">
+        <activity
+            android:name=".ui.group_common.bill_management.BillManagementActivity"
+            android:exported="false" />
         <activity
             android:name=".ui.customer_resource.related_invitee.RelatedInviteeActivity"
             android:exported="false"

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

@@ -253,6 +253,9 @@ class OASystem : Application() {
         //查看关联邀请方
         const val RELATED_INVITEE = 184
 
+        //票据管理
+        const val BILL_MANAGEMENT = 185
+
         //CTableId
         //酒店预定
         const val C_TABLE_HOTEL_PREDETERMINE = 76

+ 20 - 28
app/src/main/java/com/pan_american/android/base/BaseActivity.kt

@@ -135,36 +135,28 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
             inputMethodManager.hideSoftInputFromWindow(this.window.decorView.windowToken, 0)
         }
 
-        object : CountDownTimer(100, 100) {
-            override fun onTick(p0: Long) {
-
+        popupWindow.apply {
+            //设置背景黑暗度
+            val layoutParams: WindowManager.LayoutParams = window.attributes
+            layoutParams.alpha = 0.4f
+            window.attributes = layoutParams
+
+            //手势提示条适配
+            isClippingEnabled = false
+            //设置动画效果
+            animationStyle = R.style.AnimationBottomPopup
+            //设置聚焦,点击外部可以取消
+            isOutsideTouchable = true
+            isFocusable = true
+
+            setOnDismissListener {
+                val layoutParamsDismiss = window.attributes
+                layoutParamsDismiss.alpha = 1f
+                window.attributes = layoutParamsDismiss
             }
+        }
 
-            override fun onFinish() {
-                popupWindow.apply {
-                    //设置背景黑暗度
-                    val layoutParams: WindowManager.LayoutParams = window.attributes
-                    layoutParams.alpha = 0.4f
-                    window.attributes = layoutParams
-
-                    //手势提示条适配
-                    isClippingEnabled = false
-                    //设置动画效果
-                    animationStyle = R.style.AnimationBottomPopup
-                    //设置聚焦,点击外部可以取消
-                    isOutsideTouchable = true
-                    isFocusable = true
-
-                    setOnDismissListener {
-                        val layoutParamsDismiss = window.attributes
-                        layoutParamsDismiss.alpha = 1f
-                        window.attributes = layoutParamsDismiss
-                    }
-                }
-
-                block()
-            }
-        }.start()
+        block()
     }
 
     /**

+ 49 - 0
app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/adapter/BillFileItemAdapter.kt

@@ -0,0 +1,49 @@
+package com.pan_american.android.data.model.group_common_modle.bill_management.adapter
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.pan_american.android.R
+import com.pan_american.android.data.model.group_common_modle.bill_management.entity.BillFileListItem
+
+class BillFileItemAdapter(private val billFileList: ArrayList<BillFileListItem>): RecyclerView.Adapter<BillFileItemAdapter.ViewHolder>() {
+
+    lateinit var onRecyclerViewItemClick: OnRecyclerViewItemClick<BillFileListItem>
+
+    inner class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
+        val documentName: TextView = view.findViewById(R.id.document_name)
+        val downloadButton: TextView = view.findViewById(R.id.download)
+        val deleteButton: TextView = view.findViewById(R.id.delete)
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_bill_file_list, parent, false)
+
+        return ViewHolder(view)
+    }
+
+    override fun getItemCount() = billFileList.size
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        val item  = billFileList[position]
+
+        holder.documentName.text = item.fileName
+
+        holder.downloadButton.setOnClickListener {
+            onRecyclerViewItemClick.downLoad(position)
+        }
+
+        holder.deleteButton.setOnClickListener {
+            onRecyclerViewItemClick.delete(position)
+        }
+    }
+
+    interface OnRecyclerViewItemClick<T> {
+
+        fun downLoad(position: Int)
+
+        fun delete(position: Int)
+    }
+}

+ 7 - 0
app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/entity/BillFileListItem.kt

@@ -0,0 +1,7 @@
+package com.pan_american.android.data.model.group_common_modle.bill_management.entity
+
+class BillFileListItem {
+    val fileName = ""
+    val id = 0
+    val url = ""
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileDownloadAllRequest.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.group_common_modle.bill_management.network
+
+class BillFileDownloadAllRequest(val diid: Int) {
+    val isModule = 0
+}

+ 8 - 0
app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileDownloadAllResponse.kt

@@ -0,0 +1,8 @@
+package com.pan_american.android.data.model.group_common_modle.bill_management.network
+
+import com.pan_american.android.base.BaseResponse
+
+class BillFileDownloadAllResponse(val data: Data): BaseResponse() {
+
+    inner class Data (val url: String)
+}

+ 6 - 0
app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileDownloadThisModelRequest.kt

@@ -0,0 +1,6 @@
+package com.pan_american.android.data.model.group_common_modle.bill_management.network
+
+class BillFileDownloadThisModelRequest {
+    var ctable = 0
+    var diid = 0
+}

+ 8 - 0
app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileDownloadThisModelResponse.kt

@@ -0,0 +1,8 @@
+package com.pan_american.android.data.model.group_common_modle.bill_management.network
+
+import com.pan_american.android.base.BaseResponse
+
+class BillFileDownloadThisModelResponse(val data: Data): BaseResponse() {
+
+    inner class Data (val url: String)
+}

+ 7 - 0
app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileGroupNameRequest.kt

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

+ 8 - 0
app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileListRequest.kt

@@ -0,0 +1,8 @@
+package com.pan_american.android.data.model.group_common_modle.bill_management.network
+
+class BillFileListRequest {
+    var ctable = 0
+    var diid = 0
+    val cid = 0
+    var userId = 0
+}

+ 6 - 0
app/src/main/java/com/pan_american/android/data/model/group_common_modle/bill_management/network/BillFileListResponse.kt

@@ -0,0 +1,6 @@
+package com.pan_american.android.data.model.group_common_modle.bill_management.network
+
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.group_common_modle.bill_management.entity.BillFileListItem
+
+class BillFileListResponse(val data: ArrayList<BillFileListItem>): BaseResponse()

+ 38 - 0
app/src/main/java/com/pan_american/android/data/network/APIService.kt

@@ -74,6 +74,13 @@ import com.pan_american.android.data.model.group_airplane_ticket.airplane_paymen
 import com.pan_american.android.data.model.group_airplane_ticket.airplane_payment_insert.network.AirplaneTicketSelectorResourceRequest
 import com.pan_american.android.data.model.group_airplane_ticket.airplane_payment_insert.network.AirplaneTicketSelectorResourceResponse
 import com.pan_american.android.data.model.group_airplane_ticket.airplane_payment_insert.network.UpdateAirplaneTicketRequest
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileDownloadAllRequest
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileDownloadAllResponse
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileDownloadThisModelRequest
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileDownloadThisModelResponse
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileGroupNameRequest
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileListRequest
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileListResponse
 import com.pan_american.android.data.model.group_common_modle.insurance_payment_insert.network.InsurancePaymentDetailRequest
 import com.pan_american.android.data.model.group_common_modle.insurance_payment_insert.network.InsurancePaymentDetailResponse
 import com.pan_american.android.data.model.group_common_modle.insurance_payment_insert.network.InsurancePaymentListRequest
@@ -904,4 +911,35 @@ interface APIService {
      */
     @POST("api/Groups/PostGroupLinkInvitingPageList")
     fun getRelatedInviteeGroupList(@Body relatedInviteeListRequest: RelatedInviteeListRequest): Call<RelatedInviteeListResponse>
+
+    /**
+     * 票据管理,基础数据源,团组名称
+     */
+    @POST("api/Groups/QueryGroupListOffset")
+    fun getGroupNameWithSearch(@Body billFileGroupNameRequest: BillFileGroupNameRequest): Call<SelectorResponse>
+
+    /**
+     * 票据管理,获取当前团组 当前板块的票据
+     */
+    @POST("api/Groups/QueryGroupModelFile")
+    fun getBillFileList(@Body billFileListRequest: BillFileListRequest): Call<BillFileListResponse>
+
+    /**
+     * 票据管理,删除票据
+     */
+    @POST("api/Groups/DeleteGroupFile")
+    fun deleteBillFile(@Body deleteRequest: DeleteRequest): Call<BaseResponse>
+
+    /**
+     * 票据管理,下载该团所有模块票据
+     */
+    @POST("api/Groups/ExportGroupZip")
+    fun downloadGroupAllBillFile(@Body billFileDownloadAllRequest: BillFileDownloadAllRequest): Call<BillFileDownloadAllResponse>
+
+    /**
+     * 票据管理,下载该团当前模块所有票据
+     */
+    @POST("api/Groups/ExportGroupByModule")
+    fun downloadGroupThisModelBillFile(@Body billFileDownloadThisModelRequest: BillFileDownloadThisModelRequest): Call<BillFileDownloadThisModelResponse>
+
 }

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

@@ -153,9 +153,7 @@ class MarketCustomerActivity : BaseActivity<ActivityMarketCustomerBinding>() {
                 }
 
                 pageIndex = 1
-                binding.marketCustomerList.adapter!!.notifyItemRangeRemoved(
-                    0, marketCustomerListItemList.size
-                )
+                binding.marketCustomerList.adapter!!.notifyItemRangeRemoved(0, marketCustomerListItemList.size)
                 marketCustomerListItemList.clear()
                 listInit = false
                 initMarketCustomerList(1)
@@ -409,8 +407,8 @@ class MarketCustomerActivity : BaseActivity<ActivityMarketCustomerBinding>() {
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 marketCustomerRequest.pageIndex = pageIndex
-                marketCustomerListItemList.clear()
                 binding.marketCustomerList.adapter!!.notifyItemRangeRemoved(0, marketCustomerListItemList.size)
+                marketCustomerListItemList.clear()
                 listInit = false
                 initMarketCustomerList(2)
             }
@@ -544,9 +542,7 @@ class MarketCustomerActivity : BaseActivity<ActivityMarketCustomerBinding>() {
         }
 
         pageIndex = 1
-        binding.marketCustomerList.adapter!!.notifyItemRangeRemoved(
-            0, marketCustomerListItemList.size
-        )
+        binding.marketCustomerList.adapter!!.notifyItemRangeRemoved(0, marketCustomerListItemList.size)
         marketCustomerListItemList.clear()
         listInit = false
         initMarketCustomerList(1)

+ 2 - 2
app/src/main/java/com/pan_american/android/ui/customer_resource/market_sales_revenue/SalesCustomerVisitListActivity.kt

@@ -232,8 +232,8 @@ class SalesCustomerVisitListActivity : BaseActivity<ActivitySalesCustomerVisitLi
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 marketSalesVisitHistoryRequest.pageIndex = pageIndex
-                historyList.clear()
                 binding.visitHistoryList.adapter!!.notifyItemRangeRemoved(0, historyList.size)
+                historyList.clear()
                 listInit = false
                 getVisitHistoryData(2)
             }
@@ -270,7 +270,7 @@ class SalesCustomerVisitListActivity : BaseActivity<ActivitySalesCustomerVisitLi
 
                         historyList.removeAt(position)
                         binding.visitHistoryList.adapter!!.notifyItemRemoved(position)
-                        binding.visitHistoryList.adapter!!.notifyItemRangeChanged(position, historyList.size)
+                        binding.visitHistoryList.adapter!!.notifyItemRangeChanged(position, historyList.size - position)
 
                         showMessage(resources.getString(R.string.delete_success))
 

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/customer_resource/market_sales_revenue/SalesRevenueListFragment.kt

@@ -245,8 +245,8 @@ class SalesRevenueListFragment : BaseFragment<FragmentSalesRevenueListBinding>()
                 pageIndex = 1
                 listInit = false
                 marketSalesStatisticsRequest.pageIndex = pageIndex
-                groupList.clear()
                 binding.groupCustomerList.adapter!!.notifyItemRangeRemoved(0, groupList.size)
+                groupList.clear()
                 getGroupCustomerList(2)
             }
 

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

@@ -192,8 +192,8 @@ class RelatedInviteeListFragment : BaseFragment<FragmentRelatedInviteeListBindin
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 relatedInviteeListRequest.pageIndex = pageIndex
-                relatedInviteeGroupList.clear()
                 binding.relatedInviteeList.adapter!!.notifyItemRangeRemoved(0, relatedInviteeGroupList.size)
+                relatedInviteeGroupList.clear()
                 listInit = false
                 initRelatedInviteeGroupList(2)
             }

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

@@ -556,7 +556,7 @@ class RelatedInviteeSearchFragment : BaseFragment<FragmentRelatedInviteeSearchBi
             }
 
             override fun onFailure(p0: Call<SelectorResponse>, p1: Throwable) {
-                showErrorInfo(R.string.base_resource_data_get_failed)
+                showErrorInfo(R.string.group_name_list_get_failed)
             }
         })
     }

+ 2 - 4
app/src/main/java/com/pan_american/android/ui/document/DocumentGroupListActivity.kt

@@ -96,9 +96,7 @@ class DocumentGroupListActivity : BaseActivity<ActivityDocumentGroupListBinding>
                     }
 
                     pageIndex = 1
-                    binding.groupList.adapter!!.notifyItemRangeRemoved(
-                        0, groupNameList.size
-                    )
+                    binding.groupList.adapter!!.notifyItemRangeRemoved(0, groupNameList.size)
                     groupNameList.clear()
                     listInit = false
                     getGroupList(1)
@@ -776,8 +774,8 @@ class DocumentGroupListActivity : BaseActivity<ActivityDocumentGroupListBinding>
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 groupNameListRequest.pageIndex = pageIndex
-                groupNameList.clear()
                 binding.groupList.adapter!!.notifyItemRangeRemoved(0, groupNameList.size)
+                groupNameList.clear()
                 listInit = false
                 getGroupList(2)
             }

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/efficiency_tools/daily_payment/AddDailyPaymentActivity.kt

@@ -655,7 +655,7 @@ class AddDailyPaymentActivity : BaseActivity<ActivityAddDailyPaymentBinding>() {
 
         dailyPaymentList.removeAt(position)
         binding.paymentItemList.adapter!!.notifyItemRemoved(position)
-        binding.paymentItemList.adapter!!.notifyItemRangeChanged(position, dailyPaymentList.size)
+        binding.paymentItemList.adapter!!.notifyItemRangeChanged(position, dailyPaymentList.size - position)
 
         itemCount -= 1
 

+ 3 - 4
app/src/main/java/com/pan_american/android/ui/efficiency_tools/daily_payment/DailyPaymentListActivity.kt

@@ -622,8 +622,8 @@ class DailyPaymentListActivity : BaseActivity<ActivityDaliyPaymentListBinding>()
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 dailyPaymentListRequest.pageIndex = pageIndex
-                dailyPaymentCardListItems.clear()
                 binding.dailyPaymentList.adapter!!.notifyItemRangeRemoved(0, dailyPaymentCardListItems.size)
+                dailyPaymentCardListItems.clear()
                 listInit = false
                 initDailyPaymentList(2)
             }
@@ -650,9 +650,8 @@ class DailyPaymentListActivity : BaseActivity<ActivityDaliyPaymentListBinding>()
                         if (baseResponse.code == 200) {
                             dailyPaymentCardListItems.removeAt(position)
                             binding.dailyPaymentList.adapter!!.notifyItemRemoved(position)
-                            binding.dailyPaymentList.adapter!!.notifyItemRangeChanged(
-                                position, dailyPaymentCardListItems.size
-                            )
+                            binding.dailyPaymentList.adapter!!.notifyItemRangeChanged(position, dailyPaymentCardListItems.size - position)
+
                             showMessage(resources.getString(R.string.delete_success))
                         } else {
                             showMessage(baseResponse.msg)

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/group_airplane_ticket/airplane_payment_insert/AddAirplaneTicketActivity.kt

@@ -1202,7 +1202,7 @@ class AddAirplaneTicketActivity : BaseActivity<ActivityAddAirplaneTicketBinding>
             override fun onItemDelete(position: Int) {
                 customerList.removeAt(position)
                 binding.customerList.adapter!!.notifyItemRemoved(position)
-                binding.customerList.adapter!!.notifyItemRangeChanged(position, customerList.size)
+                binding.customerList.adapter!!.notifyItemRangeChanged(position, customerList.size - position)
 
                 binding.paymentSum.text = (binding.unitPrice.text.trim().toString()
                     .toDouble() * customerList.size).toString()

+ 2 - 4
app/src/main/java/com/pan_american/android/ui/group_airplane_ticket/airplane_payment_insert/AirplaneTicketListFragment.kt

@@ -374,8 +374,8 @@ class AirplaneTicketListFragment : BaseFragment<FragmentAirplaneTicketListBindin
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 airplaneTicketListRequest.pageIndex = pageIndex
-                airplaneTicketList.clear()
                 binding.airplaneTicketPaymentList.adapter!!.notifyItemRangeRemoved(0, airplaneTicketList.size)
+                airplaneTicketList.clear()
                 listInit = false
                 getAirplaneTicketPaymentList(2)
             }
@@ -403,9 +403,7 @@ class AirplaneTicketListFragment : BaseFragment<FragmentAirplaneTicketListBindin
 
                             airplaneTicketList.removeAt(position)
                             binding.airplaneTicketPaymentList.adapter!!.notifyItemRemoved(position)
-                            binding.airplaneTicketPaymentList.adapter!!.notifyItemRangeRemoved(
-                                position, airplaneTicketList.size - position
-                            )
+                            binding.airplaneTicketPaymentList.adapter!!.notifyItemRangeChanged(position, airplaneTicketList.size - position)
 
                             showMessage(resources.getString(R.string.delete_success))
                         } else {

+ 576 - 0
app/src/main/java/com/pan_american/android/ui/group_common/bill_management/BillManagementActivity.kt

@@ -0,0 +1,576 @@
+package com.pan_american.android.ui.group_common.bill_management
+
+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.View
+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.BaseActivity
+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.common.network.DeleteRequest
+import com.pan_american.android.data.model.common.network.QuerySetDataRequest
+import com.pan_american.android.data.model.common.network.SelectorResponse
+import com.pan_american.android.data.model.group_common_modle.bill_management.adapter.BillFileItemAdapter
+import com.pan_american.android.data.model.group_common_modle.bill_management.entity.BillFileListItem
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileDownloadAllRequest
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileDownloadAllResponse
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileDownloadThisModelRequest
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileDownloadThisModelResponse
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileGroupNameRequest
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileListRequest
+import com.pan_american.android.data.model.group_common_modle.bill_management.network.BillFileListResponse
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.ActivityBillManagementBinding
+import com.pan_american.android.databinding.LayoutTitleBinding
+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 BillManagementActivity : BaseActivity<ActivityBillManagementBinding>() {
+
+    private lateinit var titleBinding: LayoutTitleBinding
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    private val paymentPlateList = ArrayList<Selector>()
+
+    private var selectedPaymentPlateId = 0
+
+    private val groupNameList = ArrayList<Selector>()
+
+    private val groupNameDataRequest = BillFileGroupNameRequest()
+
+    private var selectedGroupNameId = 0
+
+    private val billFileList = ArrayList<BillFileListItem>()
+
+    override fun getViewBinding() = ActivityBillManagementBinding.inflate(layoutInflater)
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        screenAdaptation(binding)
+
+        initTitle()
+
+        //获取基础数据源
+        initGroupName()
+    }
+
+    override fun initTitle() {
+
+        titleBinding = LayoutTitleBinding.bind(binding.root).apply {
+
+            titleText.text = resources.getString(R.string.bill_management)
+
+            backButton.setOnClickListener {
+                back()
+            }
+        }
+
+    }
+
+    override fun initViews() {
+        binding.billManagementListContainer.setRefreshHeader(ClassicsHeader(OASystem.context))
+        binding.billManagementListContainer.setEnableRefresh(true)
+        binding.billManagementListContainer.setEnableLoadMore(false)
+
+        if (hasPermission()) {
+            binding.downloadAllModelBill.visibility = View.VISIBLE
+            binding.downloadThisModelBill.visibility = View.VISIBLE
+        }
+
+        getBillList()
+    }
+
+    override fun initEvents() {
+
+        binding.groupName.setOnClickListener {
+            groupNameDataRequest.apply {
+                pageIndex = 1
+                pageSize = 12
+                search = ""
+            }
+
+            groupNameList.clear()
+
+            getGroupNameResource(1)
+        }
+
+        binding.paymentPlate.setOnClickListener {
+            showSelector {
+                val adapter = ListAdapter.Builder<Selector>().apply {
+                    setLayoutId(R.layout.item_selector)
+                    setData(paymentPlateList)
+                    addBindView { itemView, data ->
+                        itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+
+                            text = data.name
+
+                            if (binding.paymentPlate.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) {
+                        paymentPlateList[position].apply {
+                            binding.paymentPlate.text = name
+
+                            selectedPaymentPlateId = id
+
+                            getBillList()
+
+                            popupWindow.dismiss()
+                        }
+                    }
+                }
+            }
+        }
+
+        binding.downloadAllModelBill.setOnClickListener {
+            CustomAlertDialog.Builder(OASystem.context).apply {
+                setTitle(resources.getString(R.string.confirm))
+                setMessage(String.format(resources.getString(R.string.bill_file_all_model_download_hint), binding.groupName.text))
+                setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
+                    dialog.dismiss()
+                }
+                setPositiveButtonAndListener(resources.getString(R.string.confirm)) { _, _ ->
+                    downloadAllFile()
+                }
+            }.show()
+        }
+
+        binding.downloadThisModelBill.setOnClickListener {
+            CustomAlertDialog.Builder(OASystem.context).apply {
+                setTitle(resources.getString(R.string.confirm))
+                setMessage(String.format(resources.getString(R.string.bill_file_this_model_download_hint), binding.groupName.text, binding.paymentPlate.text))
+                setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
+                    dialog.dismiss()
+                }
+                setPositiveButtonAndListener(resources.getString(R.string.confirm)) { _, _ ->
+                    downloadThisModelFile()
+                }
+            }.show()
+        }
+    }
+
+    private fun initGroupName() {
+        groupNameDataRequest.apply {
+            pageIndex = 1
+            pageSize = 3
+            search = ""
+        }
+
+        groupNameList.clear()
+
+        getGroupNameResource(0)
+    }
+
+    private fun getGroupNameResource(type: Int) {
+        apiService.getGroupNameWithSearch(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) {
+
+                            0 -> {
+                                binding.groupName.text = groupNameList[0].name
+
+                                selectedGroupNameId = groupNameList[0].id
+
+                                initGroupPlate()
+                            }
+
+                            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
+
+                                                    selectedGroupNameId = id
+
+                                                    getBillList()
+
+                                                    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.group_name_list_get_failed)
+            }
+        })
+    }
+
+    private fun getTotalPage(count: Int): Int {
+        var pageCount = count / 10
+
+        if (count % 10 > 0) {
+            pageCount += 1
+        }
+
+        return pageCount
+    }
+
+    private fun initGroupPlate() {
+        apiService.querySetData(QuerySetDataRequest(16)).enqueue(object : Callback<SelectorResponse> {
+            override fun onResponse(
+                call: Call<SelectorResponse>,
+                response: Response<SelectorResponse>
+            ) {
+                val selectorResponse = response.body()
+
+                if (selectorResponse != null) {
+                    if (selectorResponse.code == 200) {
+
+                        for (item in selectorResponse.data) {
+                            paymentPlateList.add(item)
+                        }
+
+                        binding.paymentPlate.text = paymentPlateList[0].name
+
+                        selectedPaymentPlateId = paymentPlateList[0].id
+
+                        initViews()
+
+                        initEvents()
+
+                    } else {
+                        showMessage(selectorResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(call: Call<SelectorResponse>, t: Throwable) {
+                showErrorInfo(R.string.payment_plate_get_error)
+            }
+        })
+    }
+
+    private fun getBillList() {
+
+        val billFileListRequest = BillFileListRequest().apply {
+            ctable = selectedPaymentPlateId
+            diid = selectedGroupNameId
+            userId = if (hasPermission()) {
+                -1
+            } else {
+                OASystem.userInfo.userId
+            }
+        }
+
+        if (billFileList.size > 0) {
+            binding.billManagementList.adapter!!.notifyItemRangeRemoved(0, billFileList.size)
+            billFileList.clear()
+        }
+
+        apiService.getBillFileList(billFileListRequest).enqueue(object : Callback<BillFileListResponse> {
+            override fun onResponse(
+                call: Call<BillFileListResponse>,
+                response: Response<BillFileListResponse>
+            ) {
+                val listResponse = response.body()
+
+                if (listResponse != null) {
+                    if (listResponse.code == 200) {
+
+                        if (binding.billManagementListContainer.isRefreshing) {
+                            binding.billManagementListContainer.finishRefresh()
+                        }
+
+                        for (item in listResponse.data) {
+                            billFileList.add(item)
+                        }
+
+                        initList()
+
+                    } else {
+                        showMessage(listResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(call: Call<BillFileListResponse>, t: Throwable) {
+                showErrorInfo(R.string.bill_file_list_get_error)
+            }
+        })
+    }
+
+    private fun initList() {
+
+        if (billFileList.size == 0) {
+            showMessage(resources.getString(R.string.no_data))
+            return
+        }
+
+        val layoutManager = LinearLayoutManager(OASystem.context)
+        binding.billManagementList.layoutManager = layoutManager
+
+        val adapter = BillFileItemAdapter(billFileList)
+
+        binding.billManagementList.adapter = adapter
+
+        adapter.onRecyclerViewItemClick = object : BillFileItemAdapter.OnRecyclerViewItemClick<BillFileListItem> {
+            override fun downLoad(position: Int) {
+                CustomAlertDialog.Builder(OASystem.context).apply {
+                    setTitle(resources.getString(R.string.confirm))
+                    setMessage(String.format(resources.getString(R.string.bill_file_download_hint), billFileList[position].fileName))
+                    setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
+                        dialog.dismiss()
+                    }
+                    setPositiveButtonAndListener(resources.getString(R.string.confirm)) { _, _ ->
+                        val uri = Uri.parse(billFileList[position].url)
+                        startActivity(Intent(Intent.ACTION_VIEW, uri))
+                    }
+                }.show()
+            }
+
+            override fun delete(position: Int) {
+                CustomAlertDialog.Builder(OASystem.context).apply {
+                    setTitle(resources.getString(R.string.alert))
+                    setMessage(String.format(resources.getString(R.string.bill_file_delete_hint), billFileList[position].fileName))
+                    setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
+                        dialog.dismiss()
+                    }
+                    setPositiveButtonAndListener(resources.getString(R.string.confirm)) { _, _ ->
+                        deleteBillFile(position)
+                    }
+                }.show()
+            }
+        }
+
+        binding.billManagementListContainer.setOnRefreshListener {
+            binding.billManagementList.adapter!!.notifyItemRangeRemoved(0, billFileList.size)
+            billFileList.clear()
+            getBillList()
+        }
+
+    }
+
+    private fun deleteBillFile(position: Int) {
+        apiService.deleteBillFile(DeleteRequest(billFileList[position].id)).enqueue(object : Callback<BaseResponse> {
+            override fun onResponse(call: Call<BaseResponse>, response: Response<BaseResponse>) {
+                val deleteResponse = response.body()
+
+                if (deleteResponse != null) {
+                    if (deleteResponse.code == 200) {
+
+                        billFileList.removeAt(position)
+                        binding.billManagementList.adapter!!.notifyItemRemoved(position)
+                        binding.billManagementList.adapter!!.notifyItemRangeChanged(position, billFileList.size - position)
+
+                        showMessage(resources.getString(R.string.delete_success))
+
+                    } else {
+                        showMessage(deleteResponse.msg)
+                    }
+
+                }
+            }
+
+            override fun onFailure(call: Call<BaseResponse>, t: Throwable) {
+                showErrorInfo(R.string.delete_error)
+            }
+        })
+    }
+
+    private fun downloadAllFile() {
+        apiService.downloadGroupAllBillFile(BillFileDownloadAllRequest(selectedGroupNameId)).enqueue(object : Callback<BillFileDownloadAllResponse> {
+            override fun onResponse(
+                call: Call<BillFileDownloadAllResponse>,
+                response: Response<BillFileDownloadAllResponse>
+            ) {
+                val dataResponse = response.body()
+
+                if (dataResponse != null) {
+                    if (dataResponse.code == 200) {
+
+                        val uri = Uri.parse(dataResponse.data.url)
+                        startActivity(Intent(Intent.ACTION_VIEW, uri))
+
+                    } else {
+                        showMessage(dataResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(call: Call<BillFileDownloadAllResponse>, t: Throwable) {
+                showErrorInfo(R.string.interface_request_error)
+            }
+        })
+    }
+
+    private fun downloadThisModelFile() {
+
+        val billFileDownloadThisModelRequest = BillFileDownloadThisModelRequest().apply {
+            ctable = selectedPaymentPlateId
+            diid = selectedGroupNameId
+        }
+
+        apiService.downloadGroupThisModelBillFile(billFileDownloadThisModelRequest).enqueue(object : Callback<BillFileDownloadThisModelResponse> {
+            override fun onResponse(
+                call: Call<BillFileDownloadThisModelResponse>,
+                response: Response<BillFileDownloadThisModelResponse>
+            ) {
+                val dataResponse = response.body()
+
+                if (dataResponse != null) {
+                    if (dataResponse.code == 200) {
+
+                        val uri = Uri.parse(dataResponse.data.url)
+                        startActivity(Intent(Intent.ACTION_VIEW, uri))
+
+                    } else {
+                        showMessage(dataResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(call: Call<BillFileDownloadThisModelResponse>, t: Throwable) {
+                showErrorInfo(R.string.interface_request_error)
+            }
+        })
+    }
+
+    private fun hasPermission(): Boolean {
+        return (OASystem.userInfo.userId == 21) or (OASystem.userInfo.userId == 22) or (OASystem.userInfo.userId == 187) or (OASystem.userInfo.userId == 258) or (OASystem.userInfo.userId == 233)
+    }
+}

+ 1 - 3
app/src/main/java/com/pan_american/android/ui/group_common/insurance_payment_insert/AddInsurancePaymentActivity.kt

@@ -717,9 +717,7 @@ class AddInsurancePaymentActivity : BaseActivity<ActivityAddInsurancePaymentBind
             override fun onItemDelete(position: Int) {
                 customerSelectList.removeAt(position)
                 binding.customerList.adapter!!.notifyItemRemoved(position)
-                binding.customerList.adapter!!.notifyItemRangeChanged(
-                    position, customerSelectList.size
-                )
+                binding.customerList.adapter!!.notifyItemRangeChanged(position, customerSelectList.size - position)
             }
         }
     }

+ 2 - 4
app/src/main/java/com/pan_american/android/ui/group_common/insurance_payment_insert/InsuranceListFragment.kt

@@ -318,8 +318,8 @@ class InsuranceListFragment : BaseFragment<FragmentInsuranceListBinding>() {
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 insurancePaymentListRequest.pageIndex = pageIndex
-                insurancePaymentList.clear()
                 binding.insurancePaymentList.adapter!!.notifyItemRangeRemoved(0, insurancePaymentList.size)
+                insurancePaymentList.clear()
                 listInit = false
                 getInsurancePaymentList(2)
             }
@@ -346,9 +346,7 @@ class InsuranceListFragment : BaseFragment<FragmentInsuranceListBinding>() {
                         if (baseResponse.code == 200) {
                             insurancePaymentList.removeAt(position)
                             binding.insurancePaymentList.adapter!!.notifyItemRemoved(position)
-                            binding.insurancePaymentList.adapter!!.notifyItemRangeRemoved(
-                                position, insurancePaymentList.size - position
-                            )
+                            binding.insurancePaymentList.adapter!!.notifyItemRangeChanged(position, insurancePaymentList.size - position)
 
                             showMessage(resources.getString(R.string.delete_success))
                         } else {

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/group_hotel/hotel_predetermine/HotelPredetermineBaseFragment.kt

@@ -453,7 +453,7 @@ class HotelPredetermineBaseFragment : BaseFragment<FragmentHotelPredetermineBase
             override fun onItemDelete(position: Int) {
                 customerSelectList.removeAt(position)
                 binding.customerList.adapter!!.notifyItemRemoved(position)
-                binding.customerList.adapter!!.notifyItemRangeChanged(position, customerSelectList.size)
+                binding.customerList.adapter!!.notifyItemRangeChanged(position, customerSelectList.size - position)
             }
         }
     }

+ 1 - 3
app/src/main/java/com/pan_american/android/ui/group_hotel/hotel_predetermine/HotelPredetermineListFragment.kt

@@ -281,9 +281,7 @@ class HotelPredetermineListFragment : BaseFragment<FragmentHotelPredetermineList
                         if (baseResponse.code == 200) {
                             hotelPredetermineList.removeAt(position)
                             binding.hotelPredetermineList.adapter!!.notifyItemRemoved(position)
-                            binding.hotelPredetermineList.adapter!!.notifyItemRangeRemoved(
-                                position, hotelPredetermineList.size - position
-                            )
+                            binding.hotelPredetermineList.adapter!!.notifyItemRangeChanged(position, hotelPredetermineList.size - position)
 
                             showMessage(resources.getString(R.string.delete_success))
                         } else {

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

@@ -530,7 +530,7 @@ class AddInviteDataActivity : BaseActivity<ActivityAddInviteDataBinding>() {
                     setPositiveButtonAndListener(resources.getString(R.string.confirm)) { _, _ ->
                         groupSelected.removeAt(position)
                         binding.groupList.adapter!!.notifyItemRemoved(position)
-                        binding.groupList.adapter!!.notifyItemRangeChanged(position, groupSelected.size)
+                        binding.groupList.adapter!!.notifyItemRangeChanged(position, groupSelected.size - position)
                     }
                 }.show()
             }

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

@@ -225,8 +225,8 @@ class InviteDataListFragment : BaseFragment<FragmentInviteDataListBinding>() {
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 inviteDataListRequest.pageIndex = pageIndex
-                inviteDataList.clear()
                 binding.inviteDataList.adapter!!.notifyItemRangeRemoved(0, inviteDataList.size)
+                inviteDataList.clear()
                 listInit = false
                 initInviteDataList(2)
             }
@@ -256,7 +256,7 @@ class InviteDataListFragment : BaseFragment<FragmentInviteDataListBinding>() {
 
                         binding.inviteDataList.adapter!!.notifyItemRemoved(position)
 
-                        binding.inviteDataList.adapter!!.notifyItemRangeChanged(position, inviteDataList.size)
+                        binding.inviteDataList.adapter!!.notifyItemRangeChanged(position, inviteDataList.size - position)
 
                     } else {
                         showMessage(deleteResponse.msg)

+ 2 - 4
app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_official_payment_insert/GroupInvitePaymentListFragment.kt

@@ -391,8 +391,8 @@ class GroupInvitePaymentListFragment : BaseFragment<FragmentGroupInvitePaymentLi
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 inviteOfficialListRequest.pageIndex = pageIndex
-                inviteOfficialList.clear()
                 binding.invitePaymentList.adapter!!.notifyItemRangeRemoved(0, inviteOfficialList.size)
+                inviteOfficialList.clear()
                 listInit = false
                 initInviteOfficialList(2)
             }
@@ -419,9 +419,7 @@ class GroupInvitePaymentListFragment : BaseFragment<FragmentGroupInvitePaymentLi
                         if (baseResponse.code == 200) {
                             inviteOfficialList.removeAt(position)
                             binding.invitePaymentList.adapter!!.notifyItemRemoved(position)
-                            binding.invitePaymentList.adapter!!.notifyItemRangeChanged(
-                                position, inviteOfficialList.size
-                            )
+                            binding.invitePaymentList.adapter!!.notifyItemRangeChanged(position, inviteOfficialList.size - position)
 
                             showMessage(resources.getString(R.string.delete_success))
                         } else {

+ 1 - 3
app/src/main/java/com/pan_american/android/ui/group_management/group_info/GroupCustomerListFragment.kt

@@ -232,9 +232,7 @@ class GroupCustomerListFragment : BaseFragment<FragmentGroupCustomerListBinding>
                             OASystem.groupInfoGroupCustomerList.removeAt(position)
 
                             adapter.notifyItemRemoved(position)
-                            adapter.notifyItemRangeChanged(
-                                position, OASystem.groupInfoGroupCustomerList.size
-                            )
+                            adapter.notifyItemRangeChanged(position, OASystem.groupInfoGroupCustomerList.size - position)
                         }
                         setCancelable(false)
                     }.show()

+ 2 - 4
app/src/main/java/com/pan_american/android/ui/group_management/group_info/GroupInfoListFragment.kt

@@ -229,8 +229,8 @@ class GroupInfoListFragment : BaseFragment<FragmentGroupInfoListBinding>() {
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 groupInfoListRequest.pageIndex = pageIndex
-                groupInfoList.clear()
                 binding.groupInfoList.adapter!!.notifyItemRangeRemoved(0, groupInfoList.size)
+                groupInfoList.clear()
                 listInit = false
                 initGroupInfoList(2)
             }
@@ -261,9 +261,7 @@ class GroupInfoListFragment : BaseFragment<FragmentGroupInfoListBinding>() {
                             groupInfoList.removeAt(position)
 
                             binding.groupInfoList.adapter!!.notifyItemRemoved(position)
-                            binding.groupInfoList.adapter!!.notifyItemRangeChanged(
-                                position, groupInfoList.size
-                            )
+                            binding.groupInfoList.adapter!!.notifyItemRangeChanged(position, groupInfoList.size - position)
 
                             showMessage(resources.getString(R.string.delete_success))
 

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

@@ -276,8 +276,8 @@ class GroundConveyPaymentListFragment : BaseFragment<FragmentGroupOpPaymentListB
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 groundConveyListRequest.pageIndex = pageIndex
-                groundConveyPaymentList.clear()
                 binding.groundConveyPaymentList.adapter!!.notifyItemRangeRemoved(0, groundConveyPaymentList.size)
+                groundConveyPaymentList.clear()
                 listInit = false
                 getGroundConveyPaymentList(2)
             }
@@ -304,9 +304,7 @@ class GroundConveyPaymentListFragment : BaseFragment<FragmentGroupOpPaymentListB
                         if (baseResponse.code == 200) {
                             groundConveyPaymentList.removeAt(position)
                             binding.groundConveyPaymentList.adapter!!.notifyItemRemoved(position)
-                            binding.groundConveyPaymentList.adapter!!.notifyItemRangeRemoved(
-                                position, groundConveyPaymentList.size - position
-                            )
+                            binding.groundConveyPaymentList.adapter!!.notifyItemRangeChanged(position, groundConveyPaymentList.size - position)
 
                             showMessage(resources.getString(R.string.delete_success))
                         } else {

+ 2 - 4
app/src/main/java/com/pan_american/android/ui/group_simple_info/GroupSimpleInfoFragment.kt

@@ -97,9 +97,7 @@ class GroupSimpleInfoFragment : BaseFragment<FragmentSimpleGroupBinding>() {
 
                 pageIndex = 1
 
-                binding.groupInfoList.adapter!!.notifyItemRangeRemoved(
-                    0, groupSimpleInfoList.size
-                )
+                binding.groupInfoList.adapter!!.notifyItemRangeRemoved(0, groupSimpleInfoList.size)
                 groupSimpleInfoList.clear()
                 listInit = false
                 initSimpleGroupDataList(1)
@@ -332,8 +330,8 @@ class GroupSimpleInfoFragment : BaseFragment<FragmentSimpleGroupBinding>() {
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 groupSimpleInfoRequest.pageIndex = pageIndex
-                groupSimpleInfoList.clear()
                 binding.groupInfoList.adapter!!.notifyItemRangeRemoved(0, groupSimpleInfoList.size)
+                groupSimpleInfoList.clear()
                 listInit = false
                 initSimpleGroupDataList(2)
             }

+ 1 - 3
app/src/main/java/com/pan_american/android/ui/group_visa/visa_payment_insert/AddVisaPaymentActivity.kt

@@ -794,9 +794,7 @@ class AddVisaPaymentActivity : BaseActivity<ActivityAddVisaPaymentBinding>() {
             override fun onItemDelete(position: Int) {
                 customerSelectList.removeAt(position)
                 binding.customerList.adapter!!.notifyItemRemoved(position)
-                binding.customerList.adapter!!.notifyItemRangeChanged(
-                    position, customerSelectList.size
-                )
+                binding.customerList.adapter!!.notifyItemRangeChanged(position, customerSelectList.size - position)
             }
         }
     }

+ 2 - 4
app/src/main/java/com/pan_american/android/ui/group_visa/visa_payment_insert/VisaPaymentListFragment.kt

@@ -325,8 +325,8 @@ class VisaPaymentListFragment : BaseFragment<FragmentVisaPaymentListBinding>() {
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 visaPaymentListRequest.pageIndex = pageIndex
-                visaPaymentList.clear()
                 binding.visaPaymentList.adapter!!.notifyItemRangeRemoved(0, visaPaymentList.size)
+                visaPaymentList.clear()
                 listInit = false
                 getVisaPaymentList(2)
             }
@@ -355,9 +355,7 @@ class VisaPaymentListFragment : BaseFragment<FragmentVisaPaymentListBinding>() {
 
                             visaPaymentList.removeAt(position)
                             binding.visaPaymentList.adapter!!.notifyItemRemoved(position)
-                            binding.visaPaymentList.adapter!!.notifyItemRangeRemoved(
-                                position, visaPaymentList.size - position
-                            )
+                            binding.visaPaymentList.adapter!!.notifyItemRangeChanged(position, visaPaymentList.size - position)
 
                             showMessage(resources.getString(R.string.delete_success))
 

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

@@ -204,8 +204,8 @@ class AirplaneThreeCodeListFragment : BaseFragment<FragmentAirplaneThreeCodeList
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 airplaneThreeCodeRequest.pageIndex = pageIndex
-                airplaneList.clear()
                 binding.airplaneResourceList.adapter!!.notifyItemRangeRemoved(0, airplaneList.size)
+                airplaneList.clear()
                 listInit = false
                 initAirplaneThreeCodeList(2)
             }
@@ -233,9 +233,8 @@ class AirplaneThreeCodeListFragment : BaseFragment<FragmentAirplaneThreeCodeList
                         if (baseResponse.code == 200) {
                             airplaneList.removeAt(position)
                             binding.airplaneResourceList.adapter!!.notifyItemRemoved(position)
-                            binding.airplaneResourceList.adapter!!.notifyItemRangeChanged(
-                                position, airplaneList.size
-                            )
+                            binding.airplaneResourceList.adapter!!.notifyItemRangeChanged(position, airplaneList.size - position)
+
                             showMessage(resources.getString(R.string.delete_success))
                         } else {
                             showMessage(baseResponse.msg)

+ 2 - 2
app/src/main/java/com/pan_american/android/ui/resource_management/car_resource/CarResourceListFragment.kt

@@ -207,8 +207,8 @@ class CarResourceListFragment : BaseFragment<FragmentCarResourceListBinding>() {
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 carResourceRequest.pageIndex = pageIndex
-                carList.clear()
                 binding.carResourceList.adapter!!.notifyItemRangeRemoved(0, carList.size)
+                carList.clear()
                 listInit = false
                 initCarResourceList(2)
             }
@@ -236,7 +236,7 @@ class CarResourceListFragment : BaseFragment<FragmentCarResourceListBinding>() {
                         if (baseResponse.code == 200) {
                             carList.removeAt(position)
                             binding.carResourceList.adapter!!.notifyItemRemoved(position)
-                            binding.carResourceList.adapter!!.notifyItemRangeChanged(position, carList.size)
+                            binding.carResourceList.adapter!!.notifyItemRangeChanged(position, carList.size - position)
                             showMessage(resources.getString(R.string.delete_success))
                         } else {
                             showMessage(baseResponse.msg)

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

@@ -210,8 +210,8 @@ class GuideResourceListFragment : BaseFragment<FragmentGuideResourceListBinding>
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 guideResourceRequest.pageIndex = pageIndex
-                guideList.clear()
                 binding.guideResourceList.adapter!!.notifyItemRangeRemoved(0, guideList.size)
+                guideList.clear()
                 listInit = false
                 initGuideResourceList(2)
             }
@@ -239,9 +239,8 @@ class GuideResourceListFragment : BaseFragment<FragmentGuideResourceListBinding>
                         if (baseResponse.code == 200) {
                             guideList.removeAt(position)
                             binding.guideResourceList.adapter!!.notifyItemRemoved(position)
-                            binding.guideResourceList.adapter!!.notifyItemRangeChanged(
-                                position, guideList.size
-                            )
+                            binding.guideResourceList.adapter!!.notifyItemRangeChanged(position, guideList.size - position)
+
                             showMessage(resources.getString(R.string.delete_success))
                         } else {
                             showMessage(baseResponse.msg)

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

@@ -214,8 +214,8 @@ class HotelResourceListFragment : BaseFragment<FragmentHotelResourceListBinding>
             override fun onRefresh(refreshLayout: RefreshLayout) {
                 pageIndex = 1
                 hotelResourceListRequest.pageIndex = pageIndex
-                hotelList.clear()
                 binding.hotelResourceList.adapter!!.notifyItemRangeRemoved(0, hotelList.size)
+                hotelList.clear()
                 listInit = false
                 initHotelResourceList(2)
             }
@@ -243,9 +243,8 @@ class HotelResourceListFragment : BaseFragment<FragmentHotelResourceListBinding>
                         if (baseResponse.code == 200) {
                             hotelList.removeAt(position)
                             binding.hotelResourceList.adapter!!.notifyItemRemoved(position)
-                            binding.hotelResourceList.adapter!!.notifyItemRangeChanged(
-                                position, hotelList.size
-                            )
+                            binding.hotelResourceList.adapter!!.notifyItemRangeChanged(position, hotelList.size - position)
+
                             showMessage(resources.getString(R.string.delete_success))
                         } else {
                             showMessage(baseResponse.msg)

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

@@ -18,6 +18,7 @@ import com.pan_american.android.ui.efficiency_tools.daily_payment.DailyPaymentLi
 import com.pan_american.android.ui.efficiency_tools.exchange_tool.ExchangeToolActivity
 import com.pan_american.android.ui.efficiency_tools.itinerary.ItineraryActivity
 import com.pan_american.android.ui.group_airplane_ticket.airplane_payment_insert.AirplaneTicketPaymentActivity
+import com.pan_american.android.ui.group_common.bill_management.BillManagementActivity
 import com.pan_american.android.ui.group_common.insurance_payment_insert.InsurancePaymentInsertActivity
 import com.pan_american.android.ui.group_hotel.hotel_predetermine.HotelPredetermineActivity
 import com.pan_american.android.ui.group_invite_official.invite_data.InviteDataActivity
@@ -228,6 +229,17 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                     }
                 }
 
+                //团组公共模块
+                OASystem.BILL_MANAGEMENT -> {
+                    if (OASystem.authorization(OASystem.BILL_MANAGEMENT, OASystem.VIEW)) {
+                        if (binding.groupCommonModel.visibility == View.GONE) {
+                            binding.groupCommonModel.visibility = View.VISIBLE
+                        }
+                        binding.billManagement.visibility = View.VISIBLE
+                        binding.billManagement.setOnClickListener(this)
+                    }
+                }
+
                 //团组机票
                 OASystem.THREE_CODE_RESOURCE -> {
                     if (OASystem.authorization(OASystem.THREE_CODE_RESOURCE, OASystem.VIEW)) {
@@ -338,6 +350,11 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                 startActivity(intent)
             }
 
+            binding.billManagement.id -> {
+                val intent = Intent(OASystem.context, BillManagementActivity::class.java)
+                startActivity(intent)
+            }
+
             binding.airplaneThreeCode.id -> {
                 val intent = Intent(OASystem.context, AirplaneThreeCodeActivity::class.java)
                 startActivity(intent)

+ 5 - 0
app/src/main/res/drawable/shape_corner_delete.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/common_padding_small" />
+    <solid android:color="@color/color_caution" />
+</shape>

+ 147 - 0
app/src/main/res/layout/activity_bill_management.xml

@@ -0,0 +1,147 @@
+<?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"
+    tools:context=".ui.group_common.bill_management.BillManagementActivity">
+
+    <include
+        layout="@layout/layout_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/common_padding"
+        android:layout_marginTop="@dimen/common_padding_huge"
+        android:layout_marginEnd="@dimen/common_padding"
+        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/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"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/payment_plate"
+                android:textSize="@dimen/text_size_medium" />
+
+            <TextView
+                android:id="@+id/payment_plate"
+                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"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+    </LinearLayout>
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/bill_management_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/bill_management_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
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/download_all_model_bill"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:background="@drawable/shape_corner_solid_blue"
+            android:gravity="center"
+            android:padding="@dimen/common_padding"
+            android:text="@string/download_all_model_bill"
+            android:textColor="@color/white"
+            android:visibility="gone" />
+
+        <TextView
+            android:id="@+id/download_this_model_bill"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/common_padding_huge"
+            android:layout_weight="1"
+            android:background="@drawable/shape_corner_solid_blue"
+            android:gravity="center"
+            android:padding="@dimen/common_padding"
+            android:text="@string/download_this_model_bill"
+            android:textColor="@color/white"
+            android:visibility="gone" />
+
+    </LinearLayout>
+
+</LinearLayout>

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

@@ -897,6 +897,33 @@
                         android:layout_marginTop="@dimen/common_padding"
                         android:background="@color/line_color" />
 
+                    <LinearLayout
+                        android:id="@+id/bill_management"
+                        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/bill_management"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_bill_management" />
+
+                        <View
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"
+                            android:layout_marginStart="35dp"
+                            android:background="@color/line_color" />
+
+                    </LinearLayout>
+
                 </LinearLayout>
 
             </LinearLayout>

+ 57 - 0
app/src/main/res/layout/item_bill_file_list.xml

@@ -0,0 +1,57 @@
+<?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="wrap_content"
+    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:id="@+id/document_name"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:gravity="center_vertical"
+            android:padding="@dimen/common_padding"
+            android:textSize="@dimen/text_size_large"
+            android:textStyle="bold" />
+
+        <TextView
+            android:id="@+id/download"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/common_padding"
+            android:layout_marginEnd="@dimen/common_padding"
+            android:background="@drawable/shape_corner_solid_blue"
+            android:padding="@dimen/common_padding"
+            android:text="@string/download"
+            android:textColor="@color/white"
+            android:textSize="@dimen/text_size_medium"
+            android:textStyle="bold" />
+
+        <TextView
+            android:id="@+id/delete"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/common_padding"
+            android:layout_marginEnd="@dimen/common_padding"
+            android:background="@drawable/shape_corner_delete"
+            android:padding="@dimen/common_padding"
+            android:text="@string/delete"
+            android:textColor="@color/white"
+            android:textSize="@dimen/text_size_medium"
+            android:textStyle="bold" />
+
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/line"
+        android:layout_marginTop="@dimen/common_padding"
+        android:background="@color/line_color" />
+
+</LinearLayout>

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


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

@@ -37,6 +37,9 @@
     <string name="sift">筛选</string>
     <string name="search">搜索</string>
 
+    <string name="download">下载</string>
+    <string name="delete">删除</string>
+
     <string name="none">无</string>
     <string name="no_info">暂无</string>
     <string name="no_data">暂无数据</string>
@@ -996,6 +999,27 @@
 
     <string name="group_pick_up_person">接团人</string>
 
+    <!-- 票据管理 -->
+    <string name="bill_management">票据管理</string>
+
+    <string name="payment_plate">费用板块</string>
+
+    <string name="download_this_model_bill">下载此模块票据</string>
+    
+    <string name="download_all_model_bill">下载所有票据</string>
+
+    <string name="payment_plate_get_error">费用板块获取失败</string>
+
+    <string name="bill_file_list_get_error">票据列表获取失败</string>
+
+    <string name="bill_file_download_hint">下载文件确认: %s \n\n点击确认跳转至浏览器下载</string>
+
+    <string name="bill_file_all_model_download_hint">是否下载该团组所有模块票据? \n\n当前团组: %s</string>
+
+    <string name="bill_file_this_model_download_hint">是否下载该团组当前模块所有票据? \n\n当前团组: %s \n\n当前模块: %s</string>
+    
+    <string name="bill_file_delete_hint">确认删除文档: %s ?</string>
+
     <!-- TODO: Remove or change this placeholder text -->
     <string name="hello_blank_fragment">Hello blank fragment</string>