Browse Source

2024-11-19 新增 / 修改

新增:
1. 财务模块 - 收款账单

修改:
1.财务模块 - 收款账单 业务逻辑,与web端区分

2. 部分UI逻辑修改

3. 修改了部分偶现bug
zhaiy 4 months ago
parent
commit
21ad073ce7
44 changed files with 2653 additions and 100 deletions
  1. 14 3
      app/src/main/AndroidManifest.xml
  2. 19 0
      app/src/main/java/com/pan_american/android/OASystem.kt
  3. 99 15
      app/src/main/java/com/pan_american/android/base/BaseActivity.kt
  4. 2 0
      app/src/main/java/com/pan_american/android/data/model/common/entity/SimpleGroupInfo.kt
  5. 18 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/entity/CollectionBillItem.kt
  6. 5 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillCurrencyListRequest.kt
  7. 8 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillCurrencyListResponse.kt
  8. 3 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillFileDownloadRequest.kt
  9. 7 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillFileDownloadResponse.kt
  10. 5 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillGroupDetailPaymentListRequest.kt
  11. 12 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillGroupDetailPaymentListResponse.kt
  12. 10 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillGroupListRequest.kt
  13. 8 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillGroupListResponse.kt
  14. 6 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/ImportThreePublicExpenseResponse.kt
  15. 19 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/UpdateCollectionBillRequest.kt
  16. 59 1
      app/src/main/java/com/pan_american/android/data/network/APIService.kt
  17. 2 38
      app/src/main/java/com/pan_american/android/ui/customer_resource/market_sales_revenue/AddCustomerVisitHistoryActivity.kt
  18. 466 0
      app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/AddCollectionBillPaymentActivity.kt
  19. 21 0
      app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/CollectionBillActivity.kt
  20. 188 0
      app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/CollectionBillGroupListFragment.kt
  21. 430 0
      app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/CollectionBillPaymentListActivity.kt
  22. 1 1
      app/src/main/java/com/pan_american/android/ui/financial_module/daily_payment/DailyPaymentListActivity.kt
  23. 1 1
      app/src/main/java/com/pan_american/android/ui/group_airplane_ticket/airplane_payment_insert/AddAirplaneTicketActivity.kt
  24. 1 1
      app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_official_payment_insert/AddInvitePaymentActivity.kt
  25. 9 9
      app/src/main/java/com/pan_american/android/ui/group_management/group_info/AddGroupInfoActivity.kt
  26. 3 0
      app/src/main/java/com/pan_american/android/ui/group_management/group_info/GroupCustomerDetailFragment.kt
  27. 12 6
      app/src/main/java/com/pan_american/android/ui/group_management/group_info/GroupCustomerListFragment.kt
  28. 1 1
      app/src/main/java/com/pan_american/android/ui/group_op/ground_convey_payment_insert/AddGroundConveyInfoActivity.kt
  29. 1 1
      app/src/main/java/com/pan_american/android/ui/group_op/ground_convey_payment_insert/GroundConveyPaymentDetailActivity.kt
  30. 1 1
      app/src/main/java/com/pan_american/android/ui/group_visa/insurance_payment_insert/AddInsurancePaymentActivity.kt
  31. 1 1
      app/src/main/java/com/pan_american/android/ui/group_visa/visa_payment_insert/AddVisaPaymentActivity.kt
  32. 16 0
      app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt
  33. 2 7
      app/src/main/java/com/pan_american/android/util/MoneyInputFilter.kt
  34. 359 0
      app/src/main/res/layout/activity_add_collection_bill_payment.xml
  35. 1 1
      app/src/main/res/layout/activity_collection_bill.xml
  36. 301 0
      app/src/main/res/layout/activity_collection_bill_payment_list.xml
  37. 66 0
      app/src/main/res/layout/fragment_collection_bill_group_list.xml
  38. 27 0
      app/src/main/res/layout/fragment_workspace.xml
  39. 363 0
      app/src/main/res/layout/item_collcetion_bill_payment.xml
  40. 53 0
      app/src/main/res/layout/popup_time_and_date_selector.xml
  41. 4 13
      app/src/main/res/layout/popup_time_selector.xml
  42. BIN
      app/src/main/res/mipmap-xxhdpi/icon_collection_bill.png
  43. BIN
      app/src/main/res/mipmap-xxhdpi/icon_payment_refund.png
  44. 29 0
      app/src/main/res/values/strings.xml

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

@@ -35,15 +35,26 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         tools:targetApi="31">
+        <activity
+            android:name=".ui.financial_module.collection_bill.AddCollectionBillPaymentActivity"
+            android:exported="false"
+            android:launchMode="singleTop"/>
+        <activity
+            android:name=".ui.financial_module.collection_bill.CollectionBillPaymentListActivity"
+            android:exported="false"
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.financial_module.payment_refund.AddPaymentRefundActivity"
-            android:exported="false" />
+            android:exported="false"
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.financial_module.payment_refund.PaymentRefundActivity"
-            android:exported="false" />
+            android:exported="false"
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.financial_module.collection_bill.CollectionBillActivity"
-            android:exported="false" />
+            android:exported="false"
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.financial_module.accounts_receivable_report.AccountsReceivableReportActivity"
             android:exported="false"

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

@@ -6,6 +6,7 @@ import android.content.Context
 import com.pan_american.android.data.model.common.entity.Selector
 import com.pan_american.android.data.model.common.entity.SiftListItem
 import com.pan_american.android.data.model.customer_resource.market_sales_revenue.entity.YearQuarterlyData
+import com.pan_american.android.data.model.financial_module.collection_bill.entity.CollectionBillItem
 import com.pan_american.android.data.model.group_hotel.hotel_predetermine.entity.UpdateHotelPredetermine
 import com.pan_american.android.data.model.group_management.group_info.entity.GroupCustomerInfo
 import com.pan_american.android.data.model.group_management.group_info.network.GroupOperationRequest
@@ -167,6 +168,21 @@ class OASystem : Application() {
             name = "已完成"
         })
 
+        //收款账单,增加方式
+        val addMode = listOf(Selector().apply {
+            id = 0
+            name = "账单模块"
+        }, Selector().apply {
+            id = 1
+            name = "成本预算模块"
+        }, Selector().apply {
+            id = 2
+            name = "实际报价"
+        }, Selector().apply {
+            id = 3
+            name = "超支费用"
+        })
+
         //查看权限
         const val VIEW = 1
 
@@ -260,6 +276,9 @@ class OASystem : Application() {
         //公务出访
         const val OFFICIAL_VISITS = 166
 
+        //收款账单
+        const val COLLECTION_BILL = 171
+
         //市场部营业额
         const val MARKET_SALES_REVENUE = 180
 

+ 99 - 15
app/src/main/java/com/pan_american/android/base/BaseActivity.kt

@@ -27,7 +27,7 @@ import com.pan_american.android.R
 import com.scwang.smart.refresh.layout.SmartRefreshLayout
 import java.util.Calendar
 
-abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
+abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
 
     private lateinit var _binding: T
     protected val binding get() = _binding
@@ -56,7 +56,8 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
 
         window.setSoftInputMode(
             WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or
-                    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
+                    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN
+        )
 
         setContentView(_binding.root)
 
@@ -98,7 +99,7 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
 
     open fun initEvents() {}
 
-    fun back(){
+    fun back() {
 
         window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
 
@@ -124,13 +125,14 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
     /**
      * 弹出popWindow
      */
-    fun showPopupWindow(block : () -> Unit) {
+    fun showPopupWindow(block: () -> Unit) {
 
         //避免出现弹出PopupWindow时界面透明的问题
         window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
 
         //点击隐藏软键盘
-        val inputMethodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+        val inputMethodManager =
+            this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
         if (inputMethodManager.isActive) {
             inputMethodManager.hideSoftInputFromWindow(this.window.decorView.windowToken, 0)
         }
@@ -164,7 +166,11 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
      */
     fun showSelector(block: () -> Unit) {
         selectorPopView = View.inflate(this, R.layout.popup_smart_refresh_selector, null)
-        popupWindow = PopupWindow(selectorPopView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+        popupWindow = PopupWindow(
+            selectorPopView,
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.WRAP_CONTENT
+        )
 
         showPopupWindow {
 
@@ -189,7 +195,11 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
     fun showDatePicker(text: String, textView: TextView, block: () -> Unit = {}) {
         val calendar = Calendar.getInstance()
         val popView = View.inflate(OASystem.context, R.layout.popup_date_selector, null)
-        popupWindow = PopupWindow(popView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+        popupWindow = PopupWindow(
+            popView,
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.WRAP_CONTENT
+        )
 
         showPopupWindow {
 
@@ -197,15 +207,21 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
             val datePicker = popView.findViewById<DatePicker>(R.id.date_selector)
             val commit = popView.findViewById<TextView>(R.id.commit)
 
-            var date = String.format(resources.getString(R.string.date_format), calendar.get(
-                Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH))
+            var date = String.format(
+                resources.getString(R.string.date_format), calendar.get(
+                    Calendar.YEAR
+                ), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH)
+            )
 
             title.text = text
 
-            datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(
-                Calendar.DAY_OF_MONTH)
+            datePicker.init(
+                calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(
+                    Calendar.DAY_OF_MONTH
+                )
             ) { _, year, month, day ->
-                date = String.format(resources.getString(R.string.date_format), year, month + 1, day)
+                date =
+                    String.format(resources.getString(R.string.date_format), year, month + 1, day)
             }
 
             commit.setOnClickListener {
@@ -223,7 +239,11 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
      */
     fun showTimePicker(text: String, textView: TextView, block: () -> Unit = {}) {
         val popView = View.inflate(OASystem.context, R.layout.popup_time_selector, null)
-        popupWindow = PopupWindow(popView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+        popupWindow = PopupWindow(
+            popView,
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.WRAP_CONTENT
+        )
 
         showPopupWindow {
 
@@ -242,7 +262,66 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
             }
 
             commit.setOnClickListener {
-                textView.text = String.format(resources.getString(R.string.time_format), timeHour, timeMinute)
+                textView.text =
+                    String.format(resources.getString(R.string.time_format), timeHour, timeMinute)
+                popupWindow.dismiss()
+                block()
+            }
+
+            popupWindow.showAtLocation(binding.root, Gravity.BOTTOM, 0, 0)
+        }
+    }
+
+    /**
+     * 弹出日期 / 时间 选择组件
+     */
+    fun showDateAndTimePicker(text: String, textView: TextView, block: () -> Unit = {}) {
+        val calendar = Calendar.getInstance()
+        val popView = View.inflate(OASystem.context, R.layout.popup_time_and_date_selector, null)
+        popupWindow = PopupWindow(
+            popView,
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.WRAP_CONTENT
+        )
+
+        showPopupWindow {
+
+            val title = popView.findViewById<TextView>(R.id.date_selector_name)
+            val datePicker = popView.findViewById<DatePicker>(R.id.date_selector)
+            val timePicker = popView.findViewById<TimePicker>(R.id.time_selector)
+            val commit = popView.findViewById<TextView>(R.id.commit)
+
+            var date = String.format(
+                resources.getString(R.string.date_format), calendar.get(
+                    Calendar.YEAR
+                ), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH)
+            )
+
+            var timeHour = timePicker.hour
+            var timeMinute = timePicker.minute
+
+            title.text = text
+
+            datePicker.init(
+                calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(
+                    Calendar.DAY_OF_MONTH
+                )
+            ) { _, year, month, day ->
+                date =
+                    String.format(resources.getString(R.string.date_format), year, month + 1, day)
+            }
+
+            timePicker.setOnTimeChangedListener { _, hour, minute ->
+                timeHour = hour
+                timeMinute = minute
+            }
+
+            commit.setOnClickListener {
+                textView.text = String.format(
+                    resources.getString(R.string.with_space_format),
+                    date,
+                    String.format(resources.getString(R.string.time_format), timeHour, timeMinute)
+                )
                 popupWindow.dismiss()
                 block()
             }
@@ -255,6 +334,11 @@ abstract class BaseActivity<T: ViewBinding>: AppCompatActivity() {
      * 错误信息提示
      */
     fun showErrorInfo(stringId: Int) {
-        showMessage(String.format(resources.getString(R.string.network_error), resources.getString(stringId)))
+        showMessage(
+            String.format(
+                resources.getString(R.string.network_error),
+                resources.getString(stringId)
+            )
+        )
     }
 }

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

@@ -10,4 +10,6 @@ class SimpleGroupInfo {
     var visitStartDate = ""
     var visitEndDate = ""
     var tourCode = ""
+
+    var teamName = ""
 }

+ 18 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/entity/CollectionBillItem.kt

@@ -0,0 +1,18 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.entity
+
+class CollectionBillItem {
+    var addingModeName = ""
+    var addingWay = -1
+    var count = 0
+    var createTime = ""
+    var currency = -1
+    var currencyStr = ""
+    var diid = 0
+    var id = 0
+    var itemSumPrice = 0.0
+    var price = 0.0
+    var priceName = ""
+    var rate = 0.0
+    var remark = ""
+    var unit = ""
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillCurrencyListRequest.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+import com.pan_american.android.OASystem
+
+data class CollectionBillCurrencyListRequest(val currUserId: Int = OASystem.userInfo.userId)

+ 8 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillCurrencyListResponse.kt

@@ -0,0 +1,8 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.common.entity.Selector
+
+data class CollectionBillCurrencyListResponse(val data: Data): BaseResponse() {
+    inner class Data (val currencyData: ArrayList<Selector>)
+}

+ 3 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillFileDownloadRequest.kt

@@ -0,0 +1,3 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+data class CollectionBillFileDownloadRequest(val diId: Int, val fileType: Int)

+ 7 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillFileDownloadResponse.kt

@@ -0,0 +1,7 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+import com.pan_american.android.base.BaseResponse
+
+data class CollectionBillFileDownloadResponse(val data: Data): BaseResponse() {
+    inner class Data (val url: String)
+}

+ 5 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillGroupDetailPaymentListRequest.kt

@@ -0,0 +1,5 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+import com.pan_american.android.base.BaseRequest
+
+data class CollectionBillGroupDetailPaymentListRequest(var diId: Int = 0): BaseRequest()

+ 12 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillGroupDetailPaymentListResponse.kt

@@ -0,0 +1,12 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.common.entity.SimpleGroupInfo
+import com.pan_american.android.data.model.financial_module.collection_bill.entity.CollectionBillItem
+
+data class CollectionBillGroupDetailPaymentListResponse(val data: Data) : BaseResponse() {
+    inner class Data(
+        val groupCollectionStatementData: ArrayList<CollectionBillItem>,
+        val groupInfo: SimpleGroupInfo
+    )
+}

+ 10 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillGroupListRequest.kt

@@ -0,0 +1,10 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+import com.pan_american.android.OASystem
+import com.pan_american.android.base.BaseRequest
+
+data class CollectionBillGroupListRequest(
+    val currUserId: Int = OASystem.userInfo.userId
+): BaseRequest() {
+    var searchValue = ""
+}

+ 8 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/CollectionBillGroupListResponse.kt

@@ -0,0 +1,8 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.common.entity.Selector
+
+data class CollectionBillGroupListResponse(val data: Data): BaseResponse() {
+    inner class Data (val groupNameData: ArrayList<Selector>, val groupTotalPage: Int)
+}

+ 6 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/ImportThreePublicExpenseResponse.kt

@@ -0,0 +1,6 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.entity.CollectionBillItem
+
+data class ImportThreePublicExpenseResponse(val data: ArrayList<CollectionBillItem>): BaseResponse()

+ 19 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/collection_bill/network/UpdateCollectionBillRequest.kt

@@ -0,0 +1,19 @@
+package com.pan_american.android.data.model.financial_module.collection_bill.network
+
+import com.pan_american.android.OASystem
+import com.pan_american.android.base.BaseRequest
+
+data class UpdateCollectionBillRequest(
+    var diId: Int =  0,
+    var userId: Int = OASystem.userInfo.userId,
+    var id: Int = 0,
+    var priceName: String = "",
+    var price: Double = 0.0,
+    var count: Int = 0,
+    var unit: String = "",
+    var itemSumPrice: Double = 0.0,
+    var rate: Double = 0.0,
+    var currency: Int = 0,
+    var addingWay: Int = 0,
+    var remark: String = ""
+): BaseRequest()

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

@@ -70,6 +70,16 @@ import com.pan_american.android.data.model.document.network.group_op.GroupTravel
 import com.pan_american.android.data.model.financial_module.accounts_receivable_report.network.AccountReceivableReportListRequest
 import com.pan_american.android.data.model.financial_module.accounts_receivable_report.network.AccountReceivableReportListResponse
 import com.pan_american.android.data.model.financial_module.accounts_receivable_report.network.GenerateAccountReceivableReportResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillCurrencyListRequest
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillCurrencyListResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillFileDownloadRequest
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillFileDownloadResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillGroupDetailPaymentListRequest
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillGroupDetailPaymentListResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillGroupListRequest
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillGroupListResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.network.ImportThreePublicExpenseResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.network.UpdateCollectionBillRequest
 import com.pan_american.android.data.model.financial_module.daily_payment.network.AddDailyPaymentRequest
 import com.pan_american.android.data.model.financial_module.daily_payment.network.DailyPaymentDetailRequest
 import com.pan_american.android.data.model.financial_module.daily_payment.network.DailyPaymentDetailResponse
@@ -442,7 +452,7 @@ interface APIService {
      * 日付申请,日付申请筛选列表
      */
     @POST("/api/Financial/PostPageSearchDailyPaymentPriceTypeData")
-    fun getPaymentSiftDataSource(@Header("authorization") authToken: String, @Body baseRequest: BaseRequest): Call<DailyPaymentSiftResponse>
+    fun getPaymentSiftDataSource(@Header("authorization") authToken: String = OASystem.token, @Body baseRequest: BaseRequest): Call<DailyPaymentSiftResponse>
 
     /**
      * 日付申请,添加日付申请列表选项
@@ -1179,4 +1189,52 @@ interface APIService {
      */
     @POST("/api/Financial/PostPaymentRefundAndOtherMoneyAddOrEdit")
     fun updatePaymentRefundDetail(@Body updatePaymentRefundRequest: UpdatePaymentRefundRequest): Call<BaseResponse>
+
+    /**
+     * 收款账单,获取团组列表
+     */
+    @POST("/api/Financial/ForeignReceivablesDataSourcesOffSet")
+    fun getCollectionBillGroupList(@Body collectionBillGroupListRequest: CollectionBillGroupListRequest): Call<CollectionBillGroupListResponse>
+
+    /**
+     * 收款账单,根据id获取团信息和首款账单列表
+     */
+    @POST("/api/Financial/PostGroupReceivablesInfoByDiId")
+    fun getGroupDetailAndPaymentList(@Body collectionBillGroupDetailPaymentListRequest: CollectionBillGroupDetailPaymentListRequest): Call<CollectionBillGroupDetailPaymentListResponse>
+
+    /**
+     * 收款账单,获取汇率数据源
+     */
+    @POST("/api/Financial/PostGroupReceivablesDataSource")
+    fun getCollectionBillCurrencyList(@Body collectionBillCurrencyListRequest: CollectionBillCurrencyListRequest): Call<CollectionBillCurrencyListResponse>
+
+    /**
+     * 收款账单,导入三公费用
+     */
+    @GET("/api/Groups/NationalTravelFeeImportReceivables/{id}")
+    fun importThreePublicExpense(@Query("id") groupId: Int, @Header("accept") headerValue: String = OASystem.token): Call<ImportThreePublicExpenseResponse>
+
+    /**
+     * 收款账单,获取导出收款账单FileList
+     */
+    @POST("/api/Financial/PostReceivablesFeilDownloadInit")
+    fun getCollectionBillExportFileList(): Call<SelectorResponse>
+
+    /**
+     * 收款账单,文档下载
+     */
+    @POST("/api/Financial/PostReceivablesFeilDownload")
+    fun collectionBillFileDownload(@Body collectionBillFileDownloadRequest: CollectionBillFileDownloadRequest): Call<CollectionBillFileDownloadResponse>
+
+    /**
+     * 收款账单, 删除数据(单条)
+     */
+    @POST("/api/Financial/PostReceivablesDel")
+    fun deleteCollectionBillItem(@Body deleteRequest: DeleteRequest): Call<BaseResponse>
+
+    /**
+     * 收款账单,添加 / 修改数据 (单条)
+     */
+    @POST("/api/Financial/PostReceivablesSingleSave")
+    fun updateCollectionBillPayment(@Body updateCollectionBillRequest: UpdateCollectionBillRequest): Call<BaseResponse>
 }

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

@@ -104,47 +104,11 @@ class AddCustomerVisitHistoryActivity : BaseActivity<ActivityAddCustomerVisitHis
 
     override fun initEvents() {
         binding.visitStartTime.setOnClickListener {
-
-            var date: String
-
-            var time: String
-
-            showDatePicker(resources.getString(R.string.start_time), binding.visitStartTime){
-                date = binding.visitStartTime.text.toString()
-
-                startDateSelect = true
-
-                showTimePicker(resources.getString(R.string.start_time), binding.visitStartTime) {
-
-                    time = binding.visitStartTime.text.toString()
-
-                    startTimeSelect = true
-
-                    binding.visitStartTime.text = String.format(resources.getString(R.string.with_space_format), date, time)
-                }
-            }
+            showDateAndTimePicker(resources.getString(R.string.start_time), binding.visitStartTime)
         }
 
         binding.visitEndTime.setOnClickListener {
-
-            var date: String
-
-            var time: String
-
-            showDatePicker(resources.getString(R.string.start_time), binding.visitEndTime){
-                date = binding.visitEndTime.text.toString()
-
-                endDateSelect = true
-
-                showTimePicker(resources.getString(R.string.start_time), binding.visitEndTime) {
-
-                    time = binding.visitEndTime.text.toString()
-
-                    endTimeSelect = true
-
-                    binding.visitEndTime.text = String.format(resources.getString(R.string.with_space_format), date, time)
-                }
-            }
+            showDateAndTimePicker(resources.getString(R.string.end_time), binding.visitEndTime)
         }
 
         binding.commit.setOnClickListener {

+ 466 - 0
app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/AddCollectionBillPaymentActivity.kt

@@ -0,0 +1,466 @@
+package com.pan_american.android.ui.financial_module.collection_bill
+
+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.ListAdapter
+import com.pan_american.android.data.model.common.entity.Selector
+import com.pan_american.android.data.model.financial_module.collection_bill.entity.CollectionBillItem
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillCurrencyListRequest
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillCurrencyListResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.network.UpdateCollectionBillRequest
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.ActivityAddCollectionBillPaymentBinding
+import com.pan_american.android.databinding.LayoutTitleBinding
+import com.pan_american.android.util.MoneyInputFilter
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class AddCollectionBillPaymentActivity : BaseActivity<ActivityAddCollectionBillPaymentBinding>() {
+
+    private var fromList = false
+
+    private lateinit var titleBinding: LayoutTitleBinding
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    private val currencyList = ArrayList<Selector>()
+
+    private val collectionBillItem = CollectionBillItem()
+
+    override fun getViewBinding() = ActivityAddCollectionBillPaymentBinding.inflate(layoutInflater)
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        intent.apply {
+            fromList = getBooleanExtra("fromList", false)
+        }
+
+        if (fromList) {
+            intent.apply {
+                collectionBillItem.let {
+                    it.diid = getIntExtra("groupId", 0)
+                    it.id = getIntExtra("paymentId", 0)
+                    it.priceName = getStringExtra("paymentName").toString()
+                    it.addingWay = getIntExtra("paymentMode", 0)
+                    it.price = getDoubleExtra("perPrice", 0.0)
+                    it.currency = getIntExtra("currencyId", 0)
+                    it.currencyStr = getStringExtra("currencyStr").toString()
+                    it.count = getIntExtra("count", 0)
+                    it.unit = getStringExtra("unit").toString()
+                    it.rate = getDoubleExtra("exchangeRate", 0.0)
+                    it.remark = getStringExtra("remark").toString()
+                    it.itemSumPrice = getDoubleExtra("sumPrice", 0.0)
+                }
+            }
+        }
+
+        initTitle()
+
+        initViews()
+
+        getBaseDataResource()
+    }
+
+    override fun initTitle() {
+        titleBinding = LayoutTitleBinding.bind(binding.root).apply {
+            titleText.text = if (fromList) {
+                resources.getString(R.string.update_collection_bill)
+            } else {
+                resources.getString(R.string.add_collection_bill)
+            }
+
+            backButton.setOnClickListener {
+                back()
+            }
+        }
+    }
+
+    override fun initViews() {
+
+        binding.perPrice.filters = arrayOf(MoneyInputFilter())
+        binding.exchangeRate.filters = arrayOf(MoneyInputFilter(pointLength = 4))
+
+        if (fromList) {
+
+            collectionBillItem.apply {
+                binding.paymentName.setText(priceName)
+
+                for (item in OASystem.addMode) {
+                    if (item.id == addingWay) {
+                        binding.addMode.text = item.name
+                    }
+                }
+
+                binding.perPrice.setText(price.toString())
+
+                binding.paymentCurrency.text = currencyStr
+
+                binding.count.setText(count.toString())
+
+                binding.unit.setText(unit)
+
+                binding.exchangeRate.setText(rate.toString())
+
+                binding.notes.setText(remark)
+
+                binding.totalPrice.text = itemSumPrice.toString()
+            }
+
+            binding.commit.setText(resources.getString(R.string.update))
+        } else {
+            binding.commit.setText(resources.getString(R.string.add))
+        }
+    }
+
+    override fun initEvents() {
+
+        binding.addMode.setOnClickListener {
+            showSelector {
+                val adapter = ListAdapter.Builder<Selector>().apply {
+                    setData(OASystem.addMode)
+                    setLayoutId(R.layout.item_selector)
+                    addBindView { itemView, data ->
+                        itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+                            if (collectionBillItem.addingWay == data.id) {
+                                setTextColor(ResourcesCompat.getColor(resources, R.color.text_color_blue, null))
+                            } else {
+                                setTextColor(ResourcesCompat.getColor(resources, R.color.text_color, null))
+                            }
+
+                            text = data.name
+                        }
+                    }
+                }.create()
+
+                selector.adapter = adapter
+
+                adapter.onRecyclerViewItemClick = object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                    override fun onItemClick(position: Int) {
+                        OASystem.addMode[position].apply {
+                            binding.addMode.text = name
+                            collectionBillItem.addingWay = id
+                        }
+
+                        popupWindow.dismiss()
+                    }
+                }
+            }
+        }
+
+        binding.perPrice.addTextChangedListener(object : TextWatcher {
+            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+            }
+
+            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+            }
+
+            override fun afterTextChanged(s: Editable?) {
+                if (s.toString().isBlank()) {
+                    showMessage(resources.getString(R.string.payment_price_hint))
+                    return
+                }
+
+                if (s.toString().endsWith('.')) {
+                    return
+                }
+
+                collectionBillItem.price = s.toString().toDouble()
+
+                calculateSumPrice()
+            }
+        })
+
+        binding.count.addTextChangedListener(object : TextWatcher {
+            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+            }
+
+            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+            }
+
+            override fun afterTextChanged(s: Editable?) {
+                if (s.toString().isBlank()) {
+                    showMessage(resources.getString(R.string.count_input_hint))
+                    return
+                }
+
+                if (s.toString().toInt() == 0) {
+                    binding.count.setText("1")
+                }
+
+                collectionBillItem.count = s.toString().toInt()
+
+                calculateSumPrice()
+            }
+        })
+
+        binding.exchangeRate.addTextChangedListener(object : TextWatcher {
+            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+            }
+
+            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+            }
+
+            override fun afterTextChanged(s: Editable?) {
+                if (s.toString().isBlank()) {
+                    showMessage(resources.getString(R.string.exchange_rate_input_hint))
+                    return
+                }
+
+                if (s.toString().endsWith('.')) {
+                    return
+                }
+
+                collectionBillItem.rate = s.toString().toDouble()
+
+                calculateSumPrice()
+            }
+        })
+
+        binding.paymentCurrency.setOnClickListener {
+            val selectorList = ArrayList<Selector>()
+
+            for (item in currencyList) {
+                selectorList.add(item)
+            }
+
+            val popView = View.inflate(OASystem.context, R.layout.popup_smart_refresh_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(false)
+                selectorContainer.setEnableLoadMore(false)
+
+                val layoutManager = LinearLayoutManager(OASystem.context)
+                selector.layoutManager = layoutManager
+
+                val adapter = ListAdapter.Builder<Selector>().apply {
+                    setData(selectorList)
+                    setLayoutId(R.layout.item_selector)
+                    addBindView { itemView, data ->
+                        itemView.findViewById<TextView>(R.id.selector_item_name).apply {
+                            text = String.format(resources.getString(R.string.currency_name_code_format), data.remark, data.name)
+
+                            if (collectionBillItem.currency == data.id) {
+                                setTextColor(ResourcesCompat.getColor(resources, R.color.text_color_blue, null))
+                            } else {
+                                setTextColor(ResourcesCompat.getColor(resources, R.color.text_color, null))
+                            }
+                        }
+                    }
+                }.create()
+
+                selector.adapter = adapter
+
+                adapter.onRecyclerViewItemClick =
+                    object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                        override fun onItemClick(position: Int) {
+                            selectorList[position].apply {
+                                binding.paymentCurrency.text = name
+
+                                currencyId = id
+
+                                popupWindow.dismiss()
+                            }
+                        }
+                    }
+
+                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, selectorList.size)
+
+                        selectorList.clear()
+
+                        if (editable.isNullOrBlank()) {
+
+                            for (item in currencyList) {
+                                selectorList.add(item)
+                            }
+
+                        } else {
+                            for (i in 0 until currencyList.size) {
+                                currencyList[i].apply {
+                                    if (name.contains(editable) || remark.contains(editable)) {
+                                        selectorList.add(this)
+                                    }
+                                }
+                            }
+                        }
+
+                        if (selectorList.size == 0) {
+                            showMessage(resources.getString(R.string.no_data))
+                        } else {
+                            for (i in 0 until selectorList.size) {
+                                adapter.notifyItemInserted(i)
+                            }
+                        }
+                    }
+                })
+
+                popupWindow.showAtLocation(binding.root, Gravity.BOTTOM, 0, 0)
+            }
+        }
+
+        binding.commit.setOnClickListener {
+            if (binding.paymentName.text.isNullOrBlank()) {
+                showMessage(resources.getString(R.string.payment_name_input_hint))
+                return@setOnClickListener
+            } else {
+                collectionBillItem.priceName = binding.paymentName.text.toString()
+            }
+
+            if (collectionBillItem.addingWay == -1) {
+                showMessage(resources.getString(R.string.add_way_select_hint))
+                return@setOnClickListener
+            }
+
+            if (collectionBillItem.price == 0.0) {
+                showMessage(resources.getString(R.string.payment_price_hint))
+                return@setOnClickListener
+            }
+
+            if (collectionBillItem.currency == -1) {
+                showMessage(resources.getString(R.string.payment_currency_hint))
+                return@setOnClickListener
+            }
+
+            if (collectionBillItem.count == 0) {
+                showMessage(resources.getString(R.string.count_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.unit.text.toString().isBlank()) {
+                showMessage(resources.getString(R.string.unit_input_hint))
+                return@setOnClickListener
+            } else {
+                collectionBillItem.unit = binding.unit.text.toString()
+            }
+
+            if (collectionBillItem.rate == 0.0) {
+                showMessage(resources.getString(R.string.exchange_rate_input_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.notes.getText().isNotBlank()) {
+                collectionBillItem.remark = binding.notes.getText()
+            }
+
+            updateCollectionBill()
+        }
+    }
+
+    private fun getBaseDataResource() {
+        apiService.getCollectionBillCurrencyList(CollectionBillCurrencyListRequest()).enqueue(object : Callback<CollectionBillCurrencyListResponse> {
+            override fun onResponse(
+                call: Call<CollectionBillCurrencyListResponse>,
+                response: Response<CollectionBillCurrencyListResponse>
+            ) {
+                val currencyResponse = response.body()
+
+                if (currencyResponse != null) {
+                    if (currencyResponse.code == 200) {
+                        for (item in currencyResponse.data.currencyData) {
+                            currencyList.add(item)
+                        }
+
+                        initEvents()
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<CollectionBillCurrencyListResponse>, p1: Throwable) {
+                showErrorInfo(R.string.currency_list_get_failed)
+            }
+        })
+    }
+
+    private fun updateCollectionBill() {
+        val updateCollectionBillRequest = UpdateCollectionBillRequest().also {
+            collectionBillItem.apply {
+                it.diId = diid
+                it.id = id
+                it.priceName = priceName
+                it.price = price
+                it.count = count
+                it.unit = unit
+                it.itemSumPrice = itemSumPrice
+                it.rate = rate
+                it.currency = currency
+                it.addingWay = addingWay
+                it.remark = remark
+            }
+        }
+        apiService.updateCollectionBillPayment(updateCollectionBillRequest).enqueue(object : Callback<BaseResponse> {
+            override fun onResponse(p0: Call<BaseResponse>, response: Response<BaseResponse>) {
+
+                val updateResponse = response.body()
+
+                if (updateResponse != null) {
+                    if (updateResponse.code == 200) {
+
+                        showMessage(resources.getString(R.string.update_success))
+
+                        OASystem.needRefresh = true
+
+                        finish()
+
+                    } else {
+                        showMessage(updateResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<BaseResponse>, p1: Throwable) {
+                showErrorInfo(R.string.update_error)
+            }
+        })
+    }
+
+    private fun calculateSumPrice() {
+        val sumPrice = collectionBillItem.price * collectionBillItem.rate * collectionBillItem.count
+
+        collectionBillItem.itemSumPrice = sumPrice
+
+        binding.totalPrice.text = collectionBillItem.itemSumPrice.toString()
+    }
+}

+ 21 - 0
app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/CollectionBillActivity.kt

@@ -1,16 +1,37 @@
 package com.pan_american.android.ui.financial_module.collection_bill
 
 import android.os.Bundle
+import com.pan_american.android.R
 import com.pan_american.android.base.BaseActivity
 import com.pan_american.android.databinding.ActivityCollectionBillBinding
+import com.pan_american.android.databinding.LayoutTitleBinding
 
 class CollectionBillActivity : BaseActivity<ActivityCollectionBillBinding>() {
 
+    private lateinit var titleBinding: LayoutTitleBinding
+
     override fun getViewBinding() = ActivityCollectionBillBinding.inflate(layoutInflater)
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
+        initTitle()
+
+        initViews()
+    }
+
+    override fun initTitle() {
+        titleBinding = LayoutTitleBinding.bind(binding.root).apply {
+            titleText.text = resources.getString(R.string.collection_bill)
+
+            backButton.setOnClickListener {
+                back()
+            }
+        }
+    }
 
+    override fun initViews() {
+        supportFragmentManager.beginTransaction().addToBackStack(null)
+            .add(binding.collectionBillFragmentContainer.id, CollectionBillGroupListFragment()).commit()
     }
 }

+ 188 - 0
app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/CollectionBillGroupListFragment.kt

@@ -0,0 +1,188 @@
+package com.pan_american.android.ui.financial_module.collection_bill
+
+import android.content.Intent
+import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+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.ListAdapter
+import com.pan_american.android.data.model.common.entity.Selector
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillGroupListRequest
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillGroupListResponse
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.FragmentCollectionBillGroupListBinding
+import com.scwang.smart.refresh.footer.ClassicsFooter
+import com.scwang.smart.refresh.header.ClassicsHeader
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class CollectionBillGroupListFragment : BaseFragment<FragmentCollectionBillGroupListBinding>() {
+
+    private val collectionBillGroupListRequest = CollectionBillGroupListRequest()
+
+    private val groupNameList = ArrayList<Selector>()
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    private var totalPage = 0
+
+    override fun getViewBinding(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        bundle: Bundle?
+    ) = FragmentCollectionBillGroupListBinding.inflate(layoutInflater, container, false)
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        collectionBillGroupListRequest.apply {
+            pageIndex = 1
+            pageSize = 20
+        }
+
+        initViews()
+
+        initEvents()
+    }
+
+    override fun initViews() {
+
+        binding.groupInfoContainer.setRefreshHeader(ClassicsHeader(OASystem.context))
+        binding.groupInfoContainer.setRefreshFooter(ClassicsFooter(OASystem.context))
+
+        getGroupList(1)
+    }
+
+    override fun initEvents() {
+
+        binding.searchText.addTextChangedListener(object : TextWatcher {
+            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+            }
+
+            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+            }
+
+            override fun afterTextChanged(s: Editable?) {
+                collectionBillGroupListRequest.pageIndex = 1
+                collectionBillGroupListRequest.searchValue = binding.searchText.text.toString()
+                binding.groupInfoList.adapter!!.notifyItemRangeRemoved(0, groupNameList.size)
+                groupNameList.clear()
+                getGroupList(2)
+            }
+        })
+    }
+
+    private fun getGroupList(type: Int) {
+
+        apiService.getCollectionBillGroupList(collectionBillGroupListRequest).enqueue(object : Callback<CollectionBillGroupListResponse> {
+            override fun onResponse(
+                call: Call<CollectionBillGroupListResponse>,
+                response: Response<CollectionBillGroupListResponse>
+            ) {
+                val listResponse = response.body()
+
+                if (listResponse != null) {
+                    if (listResponse.code == 200) {
+
+                        listResponse.data.apply {
+
+                            if (groupNameData.size == 0) {
+                                showMessage(resources.getString(R.string.no_data))
+                            } else {
+                                for (item in groupNameData) {
+                                    groupNameList.add(item)
+                                }
+                            }
+
+                            when (type) {
+                                1 -> {
+                                    totalPage = groupTotalPage
+                                    binding.groupInfoContainer.setEnableLoadMore(totalPage > collectionBillGroupListRequest.pageIndex)
+                                    initList()
+                                }
+
+                                2 -> {
+                                    binding.groupInfoContainer.finishRefresh()
+                                    totalPage = groupTotalPage
+                                    binding.groupInfoContainer.setEnableLoadMore(totalPage > collectionBillGroupListRequest.pageIndex)
+                                    initList()
+                                }
+
+                                3 -> {
+                                    binding.groupInfoContainer.finishLoadMore()
+                                    binding.groupInfoContainer.setEnableLoadMore(collectionBillGroupListRequest.pageIndex < totalPage)
+                                    binding.groupInfoList.adapter!!.notifyItemInserted(
+                                        groupNameList.size
+                                    )
+                                }
+                            }
+                        }
+                    } else {
+                        showMessage(listResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<CollectionBillGroupListResponse>, p1: Throwable) {
+                showErrorInfo(R.string.collection_bill_group_list_get_error)
+            }
+        })
+    }
+
+    private fun initList() {
+        val layoutManager = LinearLayoutManager(OASystem.context)
+        binding.groupInfoList.layoutManager = layoutManager
+
+        val adapter = ListAdapter.Builder<Selector>().apply {
+            setLayoutId(R.layout.item_group_name_list)
+            setData(groupNameList)
+            addBindView { itemView, data ->
+                itemView.findViewById<TextView>(R.id.selector_item_name).text = data.groupName
+            }
+        }.create()
+
+        binding.groupInfoList.adapter = adapter
+
+        adapter.onRecyclerViewItemClick = object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+            override fun onItemClick(position: Int) {
+                groupNameList[position].apply {
+
+                    val intent = Intent(OASystem.context, CollectionBillPaymentListActivity::class.java).apply {
+                        putExtra("groupId", id)
+                    }
+
+                    startActivity(intent)
+                }
+            }
+        }
+
+        binding.groupInfoContainer.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
+            override fun onRefresh(refreshLayout: RefreshLayout) {
+                collectionBillGroupListRequest.pageIndex = 1
+                binding.groupInfoList.adapter!!.notifyItemRangeRemoved(0, groupNameList.size)
+                groupNameList.clear()
+                getGroupList(2)
+            }
+
+            override fun onLoadMore(refreshLayout: RefreshLayout) {
+                if (collectionBillGroupListRequest.pageIndex < totalPage) {
+                    collectionBillGroupListRequest.pageIndex += 1
+                    getGroupList(3)
+                }
+            }
+        })
+    }
+}

+ 430 - 0
app/src/main/java/com/pan_american/android/ui/financial_module/collection_bill/CollectionBillPaymentListActivity.kt

@@ -0,0 +1,430 @@
+package com.pan_american.android.ui.financial_module.collection_bill
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import android.widget.TextView
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.google.gson.Gson
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.base.BaseActivity
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.base.CardAdapter
+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.entity.SimpleGroupInfo
+import com.pan_american.android.data.model.common.network.DeleteRequest
+import com.pan_american.android.data.model.common.network.SelectorResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.entity.CollectionBillItem
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillFileDownloadRequest
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillFileDownloadResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillGroupDetailPaymentListRequest
+import com.pan_american.android.data.model.financial_module.collection_bill.network.CollectionBillGroupDetailPaymentListResponse
+import com.pan_american.android.data.model.financial_module.collection_bill.network.ImportThreePublicExpenseResponse
+import com.pan_american.android.data.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.ActivityCollectionBillPaymentListBinding
+import com.pan_american.android.databinding.LayoutTitleBinding
+import com.pan_american.android.util.ScrollEditText
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class CollectionBillPaymentListActivity : BaseActivity<ActivityCollectionBillPaymentListBinding>() {
+    private val apiService = ServiceCreator.create<APIService>()
+
+    private var groupId = 0
+
+    private val collectionBillGroupDetailPaymentListRequest =
+        CollectionBillGroupDetailPaymentListRequest()
+
+    private val groupInfoSimple = SimpleGroupInfo()
+
+    private var groupSimpleInfoShown = false
+
+    private lateinit var titleBinding: LayoutTitleBinding
+
+    private val collectionBillPaymentList = ArrayList<CollectionBillItem>()
+
+    override fun getViewBinding() = ActivityCollectionBillPaymentListBinding.inflate(layoutInflater)
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        intent.apply {
+            groupId = getIntExtra("groupId", 0)
+
+            collectionBillGroupDetailPaymentListRequest.diId = groupId
+        }
+
+        initTitle()
+
+        getGroupDetailAndPaymentList()
+    }
+
+    override fun initTitle() {
+        titleBinding = LayoutTitleBinding.bind(binding.root).apply {
+            titleText.text = resources.getString(R.string.collection_bill)
+
+            rightTextField.apply {
+                visibility = View.VISIBLE
+                text = resources.getString(R.string.download)
+
+                setOnClickListener {
+                    exportList()
+                }
+            }
+
+            backButton.setOnClickListener {
+                back()
+            }
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+
+        if (OASystem.needRefresh) {
+            binding.groupPaymentList.adapter!!.notifyItemRangeRemoved(0, collectionBillPaymentList.size)
+
+            collectionBillPaymentList.clear()
+
+            getGroupDetailAndPaymentList()
+
+            OASystem.needRefresh = false
+        }
+    }
+
+    private fun getGroupDetailAndPaymentList() {
+        apiService.getGroupDetailAndPaymentList(collectionBillGroupDetailPaymentListRequest)
+            .enqueue(object : Callback<CollectionBillGroupDetailPaymentListResponse> {
+                override fun onResponse(
+                    call: Call<CollectionBillGroupDetailPaymentListResponse>,
+                    response: Response<CollectionBillGroupDetailPaymentListResponse>
+                ) {
+                    val detailResponse = response.body()
+
+                    if (detailResponse != null) {
+                        if (detailResponse.code == 200) {
+
+                            detailResponse.data.apply {
+                                groupInfoSimple.also {
+                                    groupInfo.apply {
+                                        it.id = id
+                                        it.name = name
+                                        it.clientName = clientName
+                                        it.visitPNumber = visitPNumber
+                                        it.visitCountry = visitCountry
+                                        it.visitDays = visitDays
+                                        it.visitStartDate = visitStartDate
+                                        it.visitEndDate = visitEndDate
+                                        it.tourCode = tourCode
+
+                                        it.teamName = teamName
+                                    }
+                                }
+
+                                if (groupCollectionStatementData.size > 0) {
+                                    for (item in groupCollectionStatementData) {
+                                        collectionBillPaymentList.add(item)
+                                    }
+                                } else {
+                                    showMessage(resources.getString(R.string.no_data))
+                                }
+                            }
+
+                            initViews()
+
+                            initEvents()
+
+                        } else {
+                            showMessage(detailResponse.msg)
+                        }
+                    }
+                }
+
+                override fun onFailure(
+                    p0: Call<CollectionBillGroupDetailPaymentListResponse>,
+                    p1: Throwable
+                ) {
+                    showErrorInfo(R.string.collection_bill_payment_list_get_error)
+                }
+            })
+    }
+
+    override fun initViews() {
+        groupInfoSimple.apply {
+            binding.groupName.text = teamName
+            binding.groupCustomer.text = clientName
+            binding.visitCountry.text = visitCountry
+            binding.visitDays.text = visitDays.toString()
+            binding.visitMembers.text = visitPNumber.toString()
+            binding.duringTime.text = String.format(
+                resources.getString(R.string.during_format),
+                visitStartDate.substring(0, 10),
+                visitEndDate.substring(0, 10)
+            )
+        }
+
+        if (OASystem.authorization(OASystem.COLLECTION_BILL, OASystem.ADD)) {
+            binding.addPaymentItem.visibility = View.VISIBLE
+        }
+
+        initList()
+    }
+
+    override fun initEvents() {
+        binding.baseInfoSwitch.setOnClickListener {
+            if (groupSimpleInfoShown) {
+                binding.groupBaseInfo.visibility = View.GONE
+                binding.baseInfoSwitch.text = resources.getString(R.string.show)
+
+                groupSimpleInfoShown = false
+            } else {
+                binding.groupBaseInfo.visibility = View.VISIBLE
+                binding.baseInfoSwitch.text = resources.getString(R.string.hide)
+
+                groupSimpleInfoShown = true
+            }
+        }
+
+        binding.importThreePublicExpense.setOnClickListener {
+            importThreePublicExpense()
+        }
+
+        binding.addPaymentItem.setOnClickListener {
+            val intent = Intent(OASystem.context, AddCollectionBillPaymentActivity::class.java)
+            startActivity(intent)
+        }
+    }
+
+    private fun initList() {
+
+        if (collectionBillPaymentList.size == 0) {
+            return
+        }
+
+        val  layoutManager = LinearLayoutManager(OASystem.context)
+        binding.groupPaymentList.layoutManager = layoutManager
+
+        val adapter = CardAdapter.Builder<CollectionBillItem>().apply {
+            setData(collectionBillPaymentList)
+            setLayoutId(R.layout.item_collcetion_bill_payment)
+            setCanDelete(true)
+            addBindView { itemView, data ->
+                itemView.findViewById<TextView>(R.id.price_name).text = data.priceName
+                itemView.findViewById<TextView>(R.id.add_mode).text = data.addingModeName
+                itemView.findViewById<TextView>(R.id.per_price).text = data.price.toString()
+                itemView.findViewById<TextView>(R.id.unit).text = data.unit
+                itemView.findViewById<TextView>(R.id.currency).text = data.currencyStr
+                itemView.findViewById<TextView>(R.id.rate).text = data.rate.toString()
+                itemView.findViewById<TextView>(R.id.count).text = data.count.toString()
+                itemView.findViewById<TextView>(R.id.receivables).text = data.itemSumPrice.toString()
+                itemView.findViewById<TextView>(R.id.create_time).text = data.createTime
+                itemView.findViewById<ScrollEditText>(R.id.notes).apply {
+                    isEnabled(false)
+                    setText(data.remark)
+                }
+            }
+        }.create()
+
+        binding.groupPaymentList.adapter = adapter
+
+        adapter.onRecyclerViewItemClick = object : CardAdapter.OnRecyclerViewItemClick<CollectionBillItem> {
+            override fun onItemClick(position: Int) {
+                collectionBillPaymentList[position].apply {
+                    val intent = Intent(OASystem.context, AddCollectionBillPaymentActivity::class.java).apply {
+                        putExtra("fromList", true)
+                        putExtra("groupId", groupId)
+                        putExtra("paymentId", id)
+                        putExtra("paymentName", priceName)
+                        putExtra("paymentMode", addingWay)
+                        putExtra("perPrice", price)
+                        putExtra("currencyId", currency)
+                        putExtra("currencyStr", currencyStr)
+                        putExtra("count", count)
+                        putExtra("unit", unit)
+                        putExtra("exchangeRate", rate)
+                        putExtra("remark", remark)
+                        putExtra("sumPrice", itemSumPrice)
+                    }
+                    startActivity(intent)
+                }
+            }
+
+            override fun onItemDelete(position: Int) {
+
+                collectionBillPaymentList[position].apply {
+                    CustomAlertDialog.Builder(OASystem.context).apply {
+                        setTitle(resources.getString(R.string.alert))
+                        setMessage(String.format(resources.getString(R.string.delete_alert_text), priceName))
+                        setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog , _ ->
+                            dialog.dismiss()
+                        }
+                        setPositiveButtonAndListener(resources.getString(R.string.confirm)) { dialog, _ ->
+
+                            deleteCollectionBillItem(id, position)
+
+                            dialog.dismiss()
+                        }
+                    }.show()
+                }
+            }
+        }
+    }
+
+    private fun exportList() {
+        apiService.getCollectionBillExportFileList().enqueue(object : Callback<SelectorResponse> {
+            override fun onResponse(p0: Call<SelectorResponse>, response: Response<SelectorResponse>) {
+                val listResponse = response.body()
+
+                if (listResponse != null) {
+                    if (listResponse.code == 200) {
+
+                        val selectorList = listResponse.data
+
+                        showSelector {
+                            val adapter = ListAdapter.Builder<Selector>().apply {
+                                setData(selectorList)
+                                setLayoutId(R.layout.item_selector)
+                                addBindView { itemView, data ->
+                                    itemView.findViewById<TextView>(R.id.selector_item_name).text = data.name
+                                }
+                            }.create()
+
+                            selector.adapter = adapter
+
+                            adapter.onRecyclerViewItemClick = object : ListAdapter.OnRecyclerViewItemClick<Selector> {
+                                override fun onItemClick(position: Int) {
+
+                                    selectorList[position].apply {
+                                        fileDownLoad(groupId, id, name)
+                                    }
+
+                                    popupWindow.dismiss()
+                                }
+                            }
+                        }
+
+                    } else {
+                        showMessage(listResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<SelectorResponse>, p1: Throwable) {
+                showErrorInfo(R.string.collection_bill_export_file_list_get_error)
+            }
+        })
+    }
+
+    private fun fileDownLoad(groupId: Int, type: Int, typeName: String) {
+
+        Log.e("request", Gson().toJson(CollectionBillFileDownloadRequest(groupId, type)))
+
+        apiService.collectionBillFileDownload(CollectionBillFileDownloadRequest(groupId, type)).enqueue(object : Callback<CollectionBillFileDownloadResponse> {
+            override fun onResponse(
+                call: Call<CollectionBillFileDownloadResponse>,
+                response: Response<CollectionBillFileDownloadResponse>
+            ) {
+                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.document_generated), groupInfoSimple.teamName, typeName))
+                            setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
+                                dialog.dismiss()
+                            }
+                            setPositiveButtonAndListener(resources.getString(R.string.confirm)) { dialog, _ ->
+                                val uri = Uri.parse(urlResponse.data.url)
+                                startActivity(Intent(Intent.ACTION_VIEW, uri))
+
+                                dialog.dismiss()
+                            }
+                        }.show()
+
+                    } else {
+                        showMessage(urlResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<CollectionBillFileDownloadResponse>, p1: Throwable) {
+                Log.e("error", p1.stackTraceToString())
+                showErrorInfo(R.string.interface_request_error)
+            }
+        })
+    }
+
+    private fun importThreePublicExpense() {
+        apiService.importThreePublicExpense(groupId).enqueue(object : Callback<ImportThreePublicExpenseResponse> {
+            override fun onResponse(
+                call: Call<ImportThreePublicExpenseResponse>,
+                response: Response<ImportThreePublicExpenseResponse>
+            ) {
+
+                val listResponse = response.body()
+
+                Log.e("response", Gson().toJson(listResponse))
+
+                if (listResponse != null) {
+                    if (listResponse.code == 200) {
+
+                        if (listResponse.data.size == 0) {
+                            showMessage(resources.getString(R.string.three_public_expense_no_data))
+                        } else {
+
+                            showMessage(resources.getString(R.string.three_public_expense_import_success))
+
+                            binding.groupPaymentList.adapter!!.notifyItemRangeRemoved(0, collectionBillPaymentList.size)
+
+                            collectionBillPaymentList.clear()
+
+                            getGroupDetailAndPaymentList()
+                        }
+                    } else {
+                        showMessage(listResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<ImportThreePublicExpenseResponse>, p1: Throwable) {
+                p1.printStackTrace()
+                showErrorInfo(R.string.three_public_expense_get_error)
+            }
+        })
+    }
+
+    private fun deleteCollectionBillItem(id: Int, position: Int) {
+        apiService.deleteCollectionBillItem(DeleteRequest(id = id)).enqueue(object : Callback<BaseResponse> {
+            override fun onResponse(p0: Call<BaseResponse>, response: Response<BaseResponse>) {
+                val deleteResponse = response.body()
+
+                if (deleteResponse != null) {
+                    if (deleteResponse.code == 200) {
+
+                        collectionBillPaymentList.removeAt(position)
+                        binding.groupPaymentList.adapter!!.notifyItemRemoved(position)
+                        binding.groupPaymentList.adapter!!.notifyItemRangeChanged(position, collectionBillPaymentList.size - position)
+
+                        showMessage(resources.getString(R.string.delete_success))
+
+                    } else {
+                        showMessage(deleteResponse.msg)
+                    }
+                }
+            }
+
+            override fun onFailure(p0: Call<BaseResponse>, p1: Throwable) {
+                showErrorInfo(R.string.delete_error)
+            }
+        })
+    }
+}

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/financial_module/daily_payment/DailyPaymentListActivity.kt

@@ -131,7 +131,7 @@ class DailyPaymentListActivity : BaseActivity<ActivityDaliyPaymentListBinding>()
 
     private fun initSiftItems() {
         if (!siftInit) {
-            apiService.getPaymentSiftDataSource(OASystem.token, BaseRequest())
+            apiService.getPaymentSiftDataSource(baseRequest = BaseRequest())
                 .enqueue(object : Callback<DailyPaymentSiftResponse> {
                     override fun onResponse(
                         call: Call<DailyPaymentSiftResponse>,

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

@@ -1486,6 +1486,6 @@ class AddAirplaneTicketActivity : BaseActivity<ActivityAddAirplaneTicketBinding>
     }
 
     private fun canBeEdit(): Boolean {
-        return OASystem.authorization(OASystem.AIRPLANE_PAYMENT_INSERT, OASystem.EDIT) and (isAuditGM == 0)
+        return OASystem.authorization(OASystem.AIRPLANE_PAYMENT_INSERT, OASystem.EDIT) and (isAuditGM != 1)
     }
 }

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/group_invite_official/invite_official_payment_insert/AddInvitePaymentActivity.kt

@@ -1319,6 +1319,6 @@ class AddInvitePaymentActivity : BaseActivity<ActivityAddInvitePaymentBinding>()
     }
 
     private fun canBeEdit(): Boolean {
-        return OASystem.authorization(OASystem.INVITE_OFFICIAL_PAYMENT, OASystem.EDIT) and (isAudit == 0)
+        return OASystem.authorization(OASystem.INVITE_OFFICIAL_PAYMENT, OASystem.EDIT) and (isAudit != 1)
     }
 }

+ 9 - 9
app/src/main/java/com/pan_american/android/ui/group_management/group_info/AddGroupInfoActivity.kt

@@ -373,15 +373,15 @@ class AddGroupInfoActivity : BaseActivity<ActivityAddGroupInfoBinding>() {
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun groupOperate(groupOperationRequest: GroupOperationRequest) {
 
-//        val file = File(filesDir, "data.txt")
-//        if (file.exists()) {
-//            file.delete()
-//        }
-//        file.createNewFile()
-//        val writer = FileWriter(file)
-//        writer.append(Gson().toJson(groupOperationRequest))
-//        writer.flush()
-//        writer.close()
+        val file = File(filesDir, "data.txt")
+        if (file.exists()) {
+            file.delete()
+        }
+        file.createNewFile()
+        val writer = FileWriter(file)
+        writer.append(Gson().toJson(groupOperationRequest))
+        writer.flush()
+        writer.close()
 
         apiService.groupOperation(groupOperationRequest).enqueue(object : Callback<BaseResponse> {
             override fun onResponse(call: Call<BaseResponse>, response: Response<BaseResponse>) {

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

@@ -16,6 +16,7 @@ import com.pan_american.android.data.model.group_management.group_info.network.N
 import com.pan_american.android.data.network.APIService
 import com.pan_american.android.data.network.ServiceCreator
 import com.pan_american.android.databinding.FragmentGroupCustomerDetailBinding
+import org.greenrobot.eventbus.EventBus
 import retrofit2.Call
 import retrofit2.Callback
 import retrofit2.Response
@@ -382,6 +383,8 @@ class GroupCustomerDetailFragment : BaseFragment<FragmentGroupCustomerDetailBind
             }
 
             parentFragmentManager.popBackStack()
+
+            EventBus.getDefault().post(OASystem.groupInfoGroupCustomerList)
         }
     }
 }

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

@@ -1,6 +1,7 @@
 package com.pan_american.android.ui.group_management.group_info
 
 import android.os.Bundle
+import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -71,11 +72,6 @@ class GroupCustomerListFragment : BaseFragment<FragmentGroupCustomerListBinding>
 
         binding.add.setOnClickListener {
 
-            if (OASystem.groupOperationRequest.visitPNumber == OASystem.groupInfoGroupCustomerList.size) {
-                showMessage(resources.getString(R.string.visit_member_max_hint))
-                return@setOnClickListener
-            }
-
             val groupCustomerDetailFragment = GroupCustomerDetailFragment()
             val bundle = Bundle()
 
@@ -118,7 +114,17 @@ class GroupCustomerListFragment : BaseFragment<FragmentGroupCustomerListBinding>
 
         binding.nextPage.setOnClickListener {
 
-            if (OASystem.groupInfoGroupCustomerList.size > OASystem.groupOperationRequest.visitPNumber) {
+            var realNum = 0
+
+            for (item in OASystem.groupInfoGroupCustomerList) {
+                if (item.isAccompany == 1) {
+                    realNum += 1
+                }
+            }
+
+            Log.e("count", "$realNum, ${OASystem.groupOperationRequest.visitPNumber}")
+
+            if (OASystem.groupOperationRequest.visitPNumber < realNum) {
                 showMessage(resources.getString(R.string.visit_member_over_hint))
                 return@setOnClickListener
             }

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

@@ -603,7 +603,7 @@ class AddGroundConveyInfoActivity : BaseActivity<ActivityAddGroupOpPaymentBindin
     }
 
     private fun canBeEdit(): Boolean {
-        return OASystem.authorization(OASystem.GROUND_CONVEY_PAYMENT_INSERT, OASystem.EDIT) and (isAuditGM == 0)
+        return OASystem.authorization(OASystem.GROUND_CONVEY_PAYMENT_INSERT, OASystem.EDIT) and (isAuditGM != 1)
     }
 
     private fun getPriceType() {

+ 1 - 1
app/src/main/java/com/pan_american/android/ui/group_op/ground_convey_payment_insert/GroundConveyPaymentDetailActivity.kt

@@ -886,7 +886,7 @@ class GroundConveyPaymentDetailActivity : BaseActivity<ActivityGroundConveyPayme
     }
 
     private fun canBeEdit(): Boolean {
-        return OASystem.authorization(OASystem.GROUND_CONVEY_PAYMENT_INSERT, OASystem.EDIT) and (isAuditGM == 0)
+        return OASystem.authorization(OASystem.GROUND_CONVEY_PAYMENT_INSERT, OASystem.EDIT) and (isAuditGM != 1)
     }
 
     class ListRefreshCallback(private val oldList: ArrayList<GroundConveyTableItem>, private val newList: ArrayList<GroundConveyTableItem>): DiffUtil.Callback() {

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

@@ -933,6 +933,6 @@ class AddInsurancePaymentActivity : BaseActivity<ActivityAddInsurancePaymentBind
     }
 
     private fun canBeEdit(): Boolean {
-        return OASystem.authorization(OASystem.INSURANCE_PAYMENT_INSERT, OASystem.EDIT) and (isAuditGM == 0)
+        return OASystem.authorization(OASystem.INSURANCE_PAYMENT_INSERT, OASystem.EDIT) and (isAuditGM != 1)
     }
 }

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

@@ -1275,6 +1275,6 @@ class AddVisaPaymentActivity : BaseActivity<ActivityAddVisaPaymentBinding>() {
         return OASystem.authorization(
             OASystem.VISA_PAYMENT_INSERT,
             OASystem.EDIT
-        ) and (isAuditGM == 0)
+        ) and (isAuditGM != 1)
     }
 }

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

@@ -21,6 +21,7 @@ import com.pan_american.android.ui.efficiency_tools.address_book.AddressBookActi
 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.financial_module.accounts_receivable_report.AccountsReceivableReportActivity
+import com.pan_american.android.ui.financial_module.collection_bill.CollectionBillActivity
 import com.pan_american.android.ui.financial_module.daily_payment.DailyPaymentListActivity
 import com.pan_american.android.ui.financial_module.expense_approval.ExpenseApprovalActivity
 import com.pan_american.android.ui.financial_module.payment_refund.PaymentRefundActivity
@@ -126,6 +127,16 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                     }
                 }
 
+                OASystem.COLLECTION_BILL -> {
+                    if (OASystem.authorization(OASystem.DAILY_PAYMENT, OASystem.VIEW)) {
+                        if (binding.financialModule.visibility == View.GONE) {
+                            binding.financialModule.visibility = View.VISIBLE
+                        }
+                        binding.collectionBill.visibility = View.VISIBLE
+                        binding.collectionBill.setOnClickListener(this)
+                    }
+                }
+
                 //人事模块
                 OASystem.MATERIAL_APPLICATION -> {
                     if (OASystem.authorization(OASystem.MATERIAL_APPLICATION, OASystem.VIEW)) {
@@ -368,6 +379,11 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                 startActivity(intent)
             }
 
+            binding.collectionBill.id -> {
+                val intent = Intent(OASystem.context, CollectionBillActivity::class.java)
+                startActivity(intent)
+            }
+
             binding.materialOperate.id -> {
                 val intent = Intent(OASystem.context, MaterialOperateActivity::class.java)
                 startActivity(intent)

+ 2 - 7
app/src/main/java/com/pan_american/android/util/MoneyInputFilter.kt

@@ -3,12 +3,7 @@ package com.pan_american.android.util
 import android.text.InputFilter
 import android.text.Spanned
 
-class MoneyInputFilter : InputFilter {
-
-    companion object {
-        //保留小数点位数
-        const val POINT_LENGTH = 2
-    }
+data class MoneyInputFilter(val pointLength: Int = 2) : InputFilter {
 
     override fun filter(
         //将要输入的字符串,如果是删除操作则为空
@@ -43,7 +38,7 @@ class MoneyInputFilter : InputFilter {
 
         //限制小数点后面只能有两位小数
         val index = target.indexOf(".")
-        if (index >= 0 && index + POINT_LENGTH + 2 <= target.length) {
+        if (index >= 0 && index + pointLength + 2 <= target.length) {
             return backup
         }
 

+ 359 - 0
app/src/main/res/layout/activity_add_collection_bill_payment.xml

@@ -0,0 +1,359 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white"
+    android:orientation="vertical">
+
+    <include
+        layout="@layout/layout_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_margin="@dimen/common_padding"
+        android:layout_weight="1"
+        android:scrollbars="none">
+
+        <LinearLayout
+            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:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/payment_name"
+                    android:textSize="@dimen/text_size_medium"
+                    android:textStyle="bold" />
+
+                <EditText
+                    android:id="@+id/payment_name"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="text"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/add_mode"
+                    android:textSize="@dimen/text_size_medium"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/add_mode"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_select"
+                    android:singleLine="true"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:baselineAligned="false"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="2"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:text="@string/per_price"
+                        android:textSize="@dimen/text_size_medium"
+                        android:textStyle="bold" />
+
+                    <EditText
+                        android:id="@+id/per_price"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="@dimen/common_padding"
+                        android:background="@color/white"
+                        android:gravity="end"
+                        android:hint="@string/please_input"
+                        android:importantForAutofill="no"
+                        android:inputType="numberDecimal"
+                        android:selectAllOnFocus="true"
+                        android:singleLine="true"
+                        android:textColor="@color/text_color"
+                        android:textColorHint="@color/hint_text_color"
+                        android:textSize="@dimen/text_size_medium" />
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding_huge"
+                    android:layout_weight="1"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:text="@string/currency"
+                        android:textSize="@dimen/text_size_medium"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/payment_currency"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="@dimen/common_padding"
+                        android:background="@color/white"
+                        android:gravity="end"
+                        android:hint="@string/please_select"
+                        android:singleLine="true"
+                        android:textColor="@color/text_color"
+                        android:textColorHint="@color/hint_text_color"
+                        android:textSize="@dimen/text_size_medium" />
+                </LinearLayout>
+
+            </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:layout_marginTop="@dimen/common_padding"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:baselineAligned="false"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="2"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:text="@string/count"
+                        android:textSize="@dimen/text_size_medium"
+                        android:textStyle="bold" />
+
+                    <EditText
+                        android:id="@+id/count"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="@dimen/common_padding"
+                        android:background="@color/white"
+                        android:gravity="end"
+                        android:hint="@string/please_input"
+                        android:importantForAutofill="no"
+                        android:inputType="number"
+                        android:selectAllOnFocus="true"
+                        android:singleLine="true"
+                        android:textColor="@color/text_color"
+                        android:textColorHint="@color/hint_text_color"
+                        android:textSize="@dimen/text_size_medium" />
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding_huge"
+                    android:layout_weight="1"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:text="@string/unit"
+                        android:textSize="@dimen/text_size_medium"
+                        android:textStyle="bold" />
+
+                    <EditText
+                        android:id="@+id/unit"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="@dimen/common_padding"
+                        android:background="@color/white"
+                        android:gravity="end"
+                        android:hint="@string/please_input"
+                        android:importantForAutofill="no"
+                        android:inputType="text"
+                        android:selectAllOnFocus="true"
+                        android:singleLine="true"
+                        android:textColor="@color/text_color"
+                        android:textColorHint="@color/hint_text_color"
+                        android:textSize="@dimen/text_size_medium" />
+                </LinearLayout>
+
+            </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: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/exchange_rate"
+                    android:textSize="@dimen/text_size_medium"
+                    android:textStyle="bold" />
+
+                <EditText
+                    android:id="@+id/exchange_rate"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:layout_weight="1"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:importantForAutofill="no"
+                    android:inputType="numberDecimal"
+                    android:selectAllOnFocus="true"
+                    android:singleLine="true"
+                    android:textColor="@color/text_color"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding_huge"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:orientation="vertical">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="@dimen/common_padding"
+                    android:text="@string/notes"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <com.pan_american.android.util.ScrollEditText
+                    android:id="@+id/notes"
+                    android:layout_width="match_parent"
+                    android:layout_height="100dp"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:hint="@string/please_input"
+                    android:singleLine="true"
+                    android:textColorHint="@color/hint_text_color"
+                    android:textSize="@dimen/text_size_medium" />
+            </LinearLayout>
+
+        </LinearLayout>
+
+    </ScrollView>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/button_height"
+        android:layout_marginTop="@dimen/common_padding_huge"
+        android:layout_marginBottom="@dimen/common_padding_huge"
+        android:orientation="horizontal">
+
+        <TextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:padding="@dimen/common_padding"
+            android:text="@string/payment_total"
+            android:textSize="@dimen/text_size_medium"
+            android:textStyle="bold" />
+
+        <TextView
+            android:id="@+id/total_price"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/common_padding"
+            android:layout_weight="2"
+            android:gravity="center_vertical"
+            android:textSize="@dimen/text_size_medium" />
+
+        <com.pan_american.android.util.CommitButton
+            android:id="@+id/commit"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/common_padding"
+            android:layout_weight="1" />
+
+    </LinearLayout>
+
+</LinearLayout>

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

@@ -16,6 +16,6 @@
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1"
-        tools:layout="@layout/fragment_simple_group" />
+        tools:layout="@layout/fragment_collection_bill_group_list" />
 
 </LinearLayout>

+ 301 - 0
app/src/main/res/layout/activity_collection_bill_payment_list.xml

@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/background_color"
+    android:orientation="vertical">
+
+    <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:background="@color/white"
+        android:orientation="vertical">
+
+        <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">
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@string/group_base_info"
+                android:textColor="@color/text_color_blue"
+                android:textSize="@dimen/text_size_large"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/base_info_switch"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="@string/show"
+                android:textColor="@color/title_background_color"
+                android:textSize="@dimen/text_size_medium" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginStart="@dimen/common_padding"
+            android:layout_marginTop="@dimen/common_padding"
+            android:layout_marginEnd="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:id="@+id/group_base_info"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/common_padding"
+            android:orientation="vertical"
+            android:visibility="gone">
+
+            <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/group_name"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:id="@+id/group_name"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:gravity="end"
+                    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/group_customer"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:id="@+id/group_customer"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:gravity="end" />
+            </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/visit_country"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:id="@+id/visit_country"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:textColorHint="@color/hint_text_color" />
+            </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/visit_days"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:id="@+id/visit_days"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:singleLine="true"
+                    android:textSize="@dimen/text_size_medium" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding"
+                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/visit_members"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:id="@+id/visit_members"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:singleLine="true"
+                    android:textSize="@dimen/text_size_medium" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/line"
+                android:layout_marginTop="@dimen/common_padding"
+                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/during_time"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:id="@+id/during_time"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_gravity="center"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:textColorHint="@color/hint_text_color" />
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="@dimen/common_padding"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_marginTop="@dimen/common_padding"
+                android:layout_marginEnd="@dimen/common_padding"
+                android:text="@string/group_payment_list"
+                android:textColor="@color/text_color_blue"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/add_payment_item"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/common_padding_huge"
+                android:layout_marginTop="@dimen/common_padding"
+                android:layout_marginEnd="@dimen/common_padding_huge"
+                android:gravity="end"
+                android:text="@string/add"
+                android:textColor="@color/text_color"
+                android:textSize="@dimen/text_size_medium"
+                android:visibility="visible" />
+        </LinearLayout>
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/group_payment_list"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_margin="@dimen/common_padding"
+            android:layout_weight="1"
+            android:overScrollMode="never" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/import_three_public_expense"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:background="@drawable/shape_corner_solid_blue"
+                android:gravity="center"
+                android:padding="@dimen/common_padding"
+                android:text="@string/import_three_public_expense"
+                android:textColor="@color/white"
+                android:textStyle="bold" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+</LinearLayout>

+ 66 - 0
app/src/main/res/layout/fragment_collection_bill_group_list.xml

@@ -0,0 +1,66 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/search_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/background_color"
+        android:orientation="vertical"
+        android:visibility="visible"
+        app:layout_constraintTop_toBottomOf="@id/add_itinerary_title">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_marginStart="@dimen/common_padding"
+            android:layout_marginTop="@dimen/common_padding"
+            android:layout_marginEnd="@dimen/common_padding"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@drawable/shape_corner_background_search"
+            android:orientation="vertical">
+
+            <com.pan_american.android.util.SearchView
+                android:id="@+id/search_text"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_marginEnd="@dimen/common_padding"
+                android:background="@color/white"
+                android:imeOptions="actionSearch"
+                android:singleLine="true"
+                android:textColor="@color/text_color"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/group_info_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/group_info_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>

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

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

+ 363 - 0
app/src/main/res/layout/item_collcetion_bill_payment.xml

@@ -0,0 +1,363 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="@dimen/common_padding"
+    android:layout_marginBottom="@dimen/common_padding"
+    android:background="@drawable/shape_corner_stroke_white"
+    android:orientation="vertical"
+    tools:viewBindingIgnore="true">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding"
+        android:orientation="vertical"
+        tools:ignore="UselessParent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/price_name"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:layout_marginEnd="@dimen/common_padding_heavy"
+                android:layout_weight="1"
+                android:textColor="@color/text_color_blue"
+                android:textSize="@dimen/text_size_large"
+                android:textStyle="bold" />
+
+            <ImageView
+                android:id="@+id/delete"
+                android:layout_width="@dimen/common_padding_heavy"
+                android:layout_height="@dimen/common_padding_heavy"
+                android:layout_marginEnd="@dimen/common_padding"
+                android:layout_gravity="center"
+                android:src="@mipmap/icon_delete"
+                tools:ignore="ContentDescription" />
+
+        </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: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/add_mode"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/add_mode"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_weight="1"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:baselineAligned="false"
+            android:orientation="horizontal">
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/per_price"
+                    android:textSize="@dimen/text_size_medium"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/per_price"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:singleLine="true"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="@dimen/line"
+                android:layout_height="match_parent"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_marginEnd="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/unit"
+                    android:textSize="@dimen/text_size_medium"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/unit"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:singleLine="true"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:baselineAligned="false"
+            android:orientation="horizontal">
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/currency"
+                    android:textSize="@dimen/text_size_medium"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/currency"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:singleLine="true"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="@dimen/line"
+                android:layout_height="match_parent"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_marginEnd="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="@string/exchange_rate"
+                    android:textSize="@dimen/text_size_medium"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/rate"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:background="@color/white"
+                    android:gravity="end"
+                    android:singleLine="true"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/count"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/count"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_weight="1"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/receivables"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/receivables"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/common_padding"
+                android:layout_weight="1"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/create_time"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/create_time"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/common_padding"
+                android:background="@color/white"
+                android:gravity="end"
+                android:singleLine="true"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/line"
+            android:layout_marginTop="@dimen/common_padding_huge"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:layout_marginBottom="@dimen/common_padding_huge"
+            android:orientation="vertical">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:text="@string/notes"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <com.pan_american.android.util.ScrollEditText
+                android:id="@+id/notes"
+                android:layout_width="match_parent"
+                android:layout_height="120dp" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+</LinearLayout>

+ 53 - 0
app/src/main/res/layout/popup_time_and_date_selector.xml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/shape_corner_white"
+    android:orientation="vertical"
+    tools:viewBindingIgnore="true">
+
+    <TextView
+        android:id="@+id/date_selector_name"
+        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:gravity="center"
+        android:textSize="@dimen/text_size_large"
+        android:textStyle="bold" />
+
+    <DatePicker
+        android:id="@+id/date_selector"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/common_padding"
+        android:layout_marginTop="@dimen/common_padding"
+        android:layout_marginEnd="@dimen/common_padding"
+        android:calendarViewShown="false"
+        android:datePickerMode="spinner" />
+
+    <TimePicker
+        android:id="@+id/time_selector"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding"
+        android:timePickerMode="spinner" />
+
+    <TextView
+        android:id="@+id/commit"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:layout_marginStart="@dimen/common_padding_huge"
+        android:layout_marginTop="@dimen/common_padding"
+        android:layout_marginEnd="@dimen/common_padding_huge"
+        android:layout_marginBottom="@dimen/common_padding_huge"
+        android:background="@drawable/shape_corner_solid_blue"
+        android:gravity="center"
+        android:text="@string/confirm"
+        android:textColor="@color/white"
+        android:textSize="@dimen/text_size_large"
+        android:textStyle="bold" />
+
+</LinearLayout>

+ 4 - 13
app/src/main/res/layout/popup_time_selector.xml

@@ -18,21 +18,12 @@
         android:textSize="@dimen/text_size_large"
         android:textStyle="bold" />
 
-    <LinearLayout
+    <TimePicker
+        android:id="@+id/time_selector"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="horizontal">
-
-        <TimePicker
-            android:id="@+id/time_selector"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/common_padding"
-            android:layout_marginEnd="@dimen/common_padding"
-            android:layout_weight="1"
-            android:timePickerMode="spinner" />
-
-    </LinearLayout>
+        android:layout_margin="@dimen/common_padding"
+        android:timePickerMode="spinner" />
 
     <TextView
         android:id="@+id/commit"

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


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


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

@@ -79,6 +79,7 @@
 
     <string name="during"></string>
 
+    <string name="time">时间</string>
     <string name="create_time">创建时间</string>
     <string name="refresh_time">更新时间</string>
 
@@ -1264,6 +1265,34 @@
     <string name="payment_refund_base_data_get_error">收款退还基础数据源获取失败</string>
     <string name="payment_refund_detail_get_error">收款退还详情获取失败</string>
 
+    <!-- 收款账单 -->
+    <string name="collection_bill">收款账单</string>
+    <string name="group_payment_list">团组费用列表</string>
+
+    <string name="add_mode">增加方式</string>
+
+    <string name="collection_bill_group_list_get_error">收款账单团组列表获取失败</string>
+    <string name="collection_bill_payment_list_get_error">收款账单费用列表获取失败</string>
+    <string name="collection_bill_export_file_list_get_error">收款账单导出文档列表获取失败</string>
+
+    <string name="import_three_public_expense">导入三公费用</string>
+
+    <string name="add_collection_bill">添加收款账单费用项</string>
+    <string name="update_collection_bill">更新收款账单费用项</string>
+
+    <string name="three_public_expense_get_error">三公费用获取失败</string>
+    <string name="three_public_expense_no_data">三公费用暂无可导入数据</string>
+    <string name="three_public_expense_import_success">三公费用导入成功</string>
+
+    <string name="count_input_hint">请输入正确的数量</string>
+    <string name="exchange_rate_input_hint">请输入正确的汇率</string>
+    <string name="add_way_select_hint">请选择增加方式</string>
+    <string name="unit_input_hint">请输入计量单位</string>
+
+    <string name="export_collection_bill_sichuan">收款账单 (四川)</string>
+    <string name="export_collection_bill_beijing">收款账单 (北京)</string>
+    <string name="remittance_bill">汇款账单</string>
+
     <!-- TODO: Remove or change this placeholder text -->
     <string name="hello_blank_fragment">Hello blank fragment</string>