浏览代码

2024-10-29 新增/修改

新增:
1. 财务模块 - 应收报表 功能

修改:
1. 部分UI逻辑修改
zhaiy 5 月之前
父节点
当前提交
a8eee91efe
共有 28 个文件被更改,包括 1553 次插入54 次删除
  1. 8 0
      .idea/deploymentTargetSelector.xml
  2. 1 1
      app/build.gradle
  3. 7 3
      app/src/main/AndroidManifest.xml
  4. 3 0
      app/src/main/java/com/pan_american/android/OASystem.kt
  5. 3 1
      app/src/main/java/com/pan_american/android/data/model/customer_resource/company_customer/network/BusinessCardInfoRequest.kt
  6. 64 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/accounts_receivable_report/adapter/AccountsReceivableReportAdapter.kt
  7. 31 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/accounts_receivable_report/entity/AccountReceivableReportListItem.kt
  8. 13 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/accounts_receivable_report/network/AccountReceivableReportListRequest.kt
  9. 14 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/accounts_receivable_report/network/AccountReceivableReportListResponse.kt
  10. 7 0
      app/src/main/java/com/pan_american/android/data/model/financial_module/accounts_receivable_report/network/GenerateAccountReceivableReportResponse.kt
  11. 14 15
      app/src/main/java/com/pan_american/android/data/model/group_visa/insurance_payment_insert/entity/InsurancePaymentListItem.kt
  12. 18 3
      app/src/main/java/com/pan_american/android/data/model/group_visa/visa_payment_insert/entity/VisaPaymentListItem.kt
  13. 15 0
      app/src/main/java/com/pan_american/android/data/network/APIService.kt
  14. 11 9
      app/src/main/java/com/pan_american/android/ui/customer_resource/company_customer/AddNewCustomerActivity.kt
  15. 3 1
      app/src/main/java/com/pan_american/android/ui/document/DocumentGroupListActivity.kt
  16. 352 0
      app/src/main/java/com/pan_american/android/ui/financial_module/accounts_receivable_report/AccountsReceivableReportActivity.kt
  17. 10 4
      app/src/main/java/com/pan_american/android/ui/group_visa/insurance_payment_insert/InsuranceListFragment.kt
  18. 28 4
      app/src/main/java/com/pan_american/android/ui/group_visa/visa_payment_insert/VisaPaymentListFragment.kt
  19. 15 3
      app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt
  20. 180 0
      app/src/main/res/layout/activity_accounts_receivable_report.xml
  21. 27 0
      app/src/main/res/layout/fragment_workspace.xml
  22. 252 0
      app/src/main/res/layout/item_accounts_receivable_report.xml
  23. 234 0
      app/src/main/res/layout/item_accounts_receivable_report_detail.xml
  24. 51 4
      app/src/main/res/layout/item_insurance_list.xml
  25. 98 2
      app/src/main/res/layout/item_visa_payment.xml
  26. 69 0
      app/src/main/res/layout/popup_accounts_receivable_report_detail.xml
  27. 二进制
      app/src/main/res/mipmap-xxhdpi/icon_account_receivable_report.png
  28. 25 4
      app/src/main/res/values/strings.xml

+ 8 - 0
.idea/deploymentTargetSelector.xml

@@ -4,6 +4,14 @@
     <selectionStates>
       <SelectionState runConfigName="app">
         <option name="selectionMode" value="DROPDOWN" />
+        <DropdownSelection timestamp="2024-10-17T04:36:02.189566800Z">
+          <Target type="DEFAULT_BOOT">
+            <handle>
+              <DeviceId pluginId="PhysicalDevice" identifier="serial=f9ef1bdf" />
+            </handle>
+          </Target>
+        </DropdownSelection>
+        <DialogSelection />
       </SelectionState>
     </selectionStates>
   </component>

+ 1 - 1
app/build.gradle

@@ -57,7 +57,7 @@ dependencies {
 
     implementation 'com.android.tools:r8:8.3.37'
 
-    implementation 'androidx.core:core-ktx:1.13.0'
+    implementation 'androidx.core:core-ktx:1.13.1'
     implementation 'androidx.appcompat:appcompat:1.7.0'
     implementation 'com.google.android.material:material:1.10.0'
 

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

@@ -36,17 +36,21 @@
         android:theme="@style/AppTheme"
         tools:targetApi="31">
         <activity
-            android:name=".ui.financial_module.expense_approval.ExpenseApprovalActivity"
+            android:name=".ui.financial_module.accounts_receivable_report.AccountsReceivableReportActivity"
             android:exported="false"
             android:launchMode="singleTop"/>
+        <activity
+            android:name=".ui.financial_module.expense_approval.ExpenseApprovalActivity"
+            android:exported="false"
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.personnel_module.materials_operate.MaterialApplicationHistoryActivity"
             android:exported="false"
-            android:launchMode="singleTop"/>
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.personnel_module.materials_operate.MaterialApplicationActivity"
             android:exported="false"
-            android:launchMode="singleTop"/>
+            android:launchMode="singleTop" />
         <activity
             android:name=".ui.personnel_module.materials_operate.MaterialOperateActivity"
             android:exported="false"

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

@@ -227,6 +227,9 @@ class OASystem : Application() {
         // 团组费用审批模块
         const val EXPENSE_APPROVAL = 47
 
+        //
+        const val ACCOUNT_RECEIVABLE_REPORT = 53
+
         // 市场客户资源
         const val MARKET_CUSTOMER = 89
 

+ 3 - 1
app/src/main/java/com/pan_american/android/data/model/customer_resource/company_customer/network/BusinessCardInfoRequest.kt

@@ -1,5 +1,7 @@
 package com.pan_american.android.data.model.customer_resource.company_customer.network
 
-class BusinessCardInfoRequest(val picBase64: String) {
+import com.pan_american.android.base.BaseRequest
+
+class BusinessCardInfoRequest(val picBase64: String): BaseRequest() {
     val language = 1
 }

+ 64 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/accounts_receivable_report/adapter/AccountsReceivableReportAdapter.kt

@@ -0,0 +1,64 @@
+package com.pan_american.android.data.model.financial_module.accounts_receivable_report.adapter
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.pan_american.android.OASystem
+import com.pan_american.android.R
+import com.pan_american.android.data.model.financial_module.accounts_receivable_report.entity.AccountReceivableReportListItem
+
+class AccountsReceivableReportAdapter(private val itemList: ArrayList<AccountReceivableReportListItem>): RecyclerView.Adapter<AccountsReceivableReportAdapter.ViewHolder>(){
+
+    lateinit var onDetailClick: OnRecyclerViewItemClick
+
+    inner class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
+        val groupName: TextView = view.findViewById(R.id.group_name)
+        val departmentName: TextView = view.findViewById(R.id.department_name)
+        val receivables: TextView = view.findViewById(R.id.receivables)
+        val paymentCollected: TextView = view.findViewById(R.id.payment_collected)
+        val paymentRefund: TextView = view.findViewById(R.id.payment_refund)
+        val paymentBalance: TextView = view.findViewById(R.id.payment_balance)
+        val paymentCollectionProgress: TextView = view.findViewById(R.id.payment_collection_progress)
+        val detail: TextView = view.findViewById(R.id.detail)
+
+        val parentView: LinearLayout = view.findViewById(R.id.item_view)
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val view = LayoutInflater.from(OASystem.context).inflate(R.layout.item_accounts_receivable_report, parent, false)
+        val viewHolder = ViewHolder(view)
+
+        viewHolder.detail.setOnClickListener {
+            onDetailClick.onDetailClick(viewHolder.absoluteAdapterPosition)
+        }
+
+        return viewHolder
+    }
+
+    override fun getItemCount() = itemList.size
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        itemList[position].also {
+
+            if (it.frPrice.toDouble() == 0.0) {
+                holder.parentView.visibility = View.GONE
+            } else {
+                holder.parentView.visibility = View.VISIBLE
+                holder.groupName.text = it.teamName
+                holder.departmentName.text = it.clientUnit
+                holder.receivables.text = it.frPrice + " RMB"
+                holder.paymentCollected.text = it.prPrice + " RMB"
+                holder.paymentRefund.text = it.refundAmount + " RMB"
+                holder.paymentBalance.text = it.balPrice + " RMB"
+                holder.paymentCollectionProgress.text = it.schedule.ifBlank { "-" }
+            }
+        }
+    }
+
+    interface OnRecyclerViewItemClick {
+        fun onDetailClick(position: Int)
+    }
+}

+ 31 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/accounts_receivable_report/entity/AccountReceivableReportListItem.kt

@@ -0,0 +1,31 @@
+package com.pan_american.android.data.model.financial_module.accounts_receivable_report.entity
+
+data class AccountReceivableReportListItem(
+    val balPrice: String = "",
+    val clientUnit: String = "",
+    val diid: Int = 0,
+    val extraPrice: String = "",
+    val feeItem: ArrayList<AccountReceivableReportFeeItem> = arrayListOf(),
+    val frPrice: String = "",
+    val no: Int = 0,
+    val prClient: String = "",
+    val prPrice: String = "",
+    val receivableTotal: String = "",
+    val receivedTotal: String = "",
+    val refundAmount: String = "",
+    val schedule: String = "",
+    val teamName: String = "",
+    val visitDate: String = ""
+)
+
+data class AccountReceivableReportFeeItem(
+    val balPayment: String = "",
+    val client: String = "",
+    val frCurrency: String = "",
+    val frMoney: String = "",
+    val frRate: String = "",
+    val prCurrency: String = "",
+    val prMoney: String = "",
+    val prReceivablesType: String = "",
+    val prTime: String = ""
+)

+ 13 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/accounts_receivable_report/network/AccountReceivableReportListRequest.kt

@@ -0,0 +1,13 @@
+package com.pan_american.android.data.model.financial_module.accounts_receivable_report.network
+
+import com.google.gson.annotations.SerializedName
+import com.pan_american.android.OASystem
+
+
+data class AccountReceivableReportListRequest(
+    @SerializedName("currUserId") val createUserId: Int = OASystem.userInfo.userId,
+    @SerializedName("beginDt") var startDate: String = "",
+    @SerializedName("endDt") var endDate: String = "",
+    @SerializedName("groupName") var groupName: String = "",
+    @SerializedName("requestType") var requestType: Int = 0
+)

+ 14 - 0
app/src/main/java/com/pan_american/android/data/model/financial_module/accounts_receivable_report/network/AccountReceivableReportListResponse.kt

@@ -0,0 +1,14 @@
+package com.pan_american.android.data.model.financial_module.accounts_receivable_report.network
+
+import com.google.gson.annotations.SerializedName
+import com.pan_american.android.base.BaseResponse
+import com.pan_american.android.data.model.financial_module.accounts_receivable_report.entity.AccountReceivableReportListItem
+
+data class AccountReceivableReportListResponse(val data: Data) : BaseResponse() {
+    inner class Data(
+        @SerializedName("dataList") val dataList: ArrayList<AccountReceivableReportListItem>,
+        @SerializedName("total_balance") val totalBalance: String,
+        @SerializedName("total_fr") val totalFr: String,
+        @SerializedName("total_pr") val totalPr: String
+    )
+}

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

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

+ 14 - 15
app/src/main/java/com/pan_american/android/data/model/group_visa/insurance_payment_insert/entity/InsurancePaymentListItem.kt

@@ -1,17 +1,16 @@
 package com.pan_american.android.data.model.group_visa.insurance_payment_insert.entity
 
-class InsurancePaymentListItem {
-
-    var id = 0
-    var clientName = ""
-    var insuranceCosts = 0.0
-    var currency = 0
-    var currencyStr = ""
-    var attachment = ""
-    var orbitalPrivateTransfer = 0
-    var orbitalPrivateTransferStr = ""
-    var isAuditGM = 0
-    var iid = 0
-    var remark = ""
-
-}
+class InsurancePaymentListItem(
+    var id: Int,
+    var clientName: String,
+    var insuranceCosts: Double,
+    var currency: Int,
+    var currencyStr: String,
+    var attachment: String,
+    var orbitalPrivateTransfer: Int,
+    var orbitalPrivateTransferStr: String,
+    var isAuditGM: Int,
+    var iid: Int,
+    var remark: String,
+    var payName: String
+)

+ 18 - 3
app/src/main/java/com/pan_american/android/data/model/group_visa/visa_payment_insert/entity/VisaPaymentListItem.kt

@@ -1,5 +1,20 @@
 package com.pan_american.android.data.model.group_visa.visa_payment_insert.entity
 
-class VisaPaymentListItem(val id: Int, val diId: Int, val visaDescription: String, val visaClient: String, val visaNumber: Int, val visaFreeNumber: Int,
-                          val visaPrice: Double, val visaCurrencyStr: String, val isAuditGM: Int, val isThird: Int,
-                          val createUserId: Int, val createTime: String, val remark: String)
+class VisaPaymentListItem(
+    val id: Int,
+    val diId: Int,
+    val visaDescription: String,
+    val visaClient: String,
+    val visaNumber: Int,
+    val visaFreeNumber: Int,
+    val visaPrice: Double,
+    val visaCurrencyStr: String,
+    val isAuditGM: Int,
+    val isAuditGMStr: String,
+    val isPay: Int,
+    val payName: String,
+    val isThird: Int,
+    val createUserId: Int,
+    val createTime: String,
+    val remark: String
+)

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

@@ -65,6 +65,9 @@ import com.pan_american.android.data.model.document.network.group_management.Gro
 import com.pan_american.android.data.model.document.network.group_management.GroupReverseTableGenerateRequest
 import com.pan_american.android.data.model.document.network.group_op.GroupTravelListGenerateRequest
 import com.pan_american.android.data.model.document.network.group_op.GroupTravelListGenerateResponse
+import com.pan_american.android.data.model.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.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
@@ -1119,4 +1122,16 @@ interface APIService {
      */
     @POST("/api/Groups/PostAuditGrpCreditCardPayment")
     fun updatePaymentListApproval(@Body updatePaymentListApprovalRequest: UpdatePaymentListExpenseApprovalRequest): Call<BaseResponse>
+
+    /**
+     * 应收报表,根据起止日期获取列表
+     */
+    @POST("/api/Financial/PostSyntheticalReceivableByDateRange")
+    fun getAccountReceivableReportList(@Body accountReceivableReportListRequest: AccountReceivableReportListRequest): Call<AccountReceivableReportListResponse>
+
+    /**
+     * 应收报表,生成报表
+     */
+    @POST("/api/Financial/PostSyntheticalReceivableByDateRange")
+    fun generateAccountReceivableReport(@Body accountReceivableReportListRequest: AccountReceivableReportListRequest): Call<GenerateAccountReceivableReportResponse>
 }

+ 11 - 9
app/src/main/java/com/pan_american/android/ui/customer_resource/company_customer/AddNewCustomerActivity.kt

@@ -23,6 +23,7 @@ import androidx.core.content.ContextCompat
 import androidx.core.content.FileProvider
 import androidx.core.content.res.ResourcesCompat
 import androidx.recyclerview.widget.StaggeredGridLayoutManager
+import com.google.gson.Gson
 import com.pan_american.android.OASystem
 import com.pan_american.android.R
 import com.pan_american.android.base.BaseActivity
@@ -45,6 +46,7 @@ import retrofit2.Callback
 import retrofit2.Response
 import java.io.ByteArrayOutputStream
 import java.io.File
+import java.io.FileWriter
 
 class AddNewCustomerActivity : BaseActivity<ActivityAddNewCustomerBinding>() {
 
@@ -857,15 +859,15 @@ class AddNewCustomerActivity : BaseActivity<ActivityAddNewCustomerBinding>() {
             bitmap.recycle()
         } while (!base64Adjusted)
 
-//        val file = File(filesDir, "data.txt")
-//        if (file.exists()) {
-//            file.delete()
-//        }
-//        file.createNewFile()
-//        val writer = FileWriter(file)
-//        writer.append(Gson().toJson(BusinessCardInfoRequest(transferBase64)))
-//        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(BusinessCardInfoRequest(transferBase64)))
+        writer.flush()
+        writer.close()
 
         apiService.getBusinessCardInfo(BusinessCardInfoRequest(transferBase64))
             .enqueue(object : Callback<BusinessCardInfoResponse> {

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

@@ -802,9 +802,11 @@ class DocumentGroupListActivity : BaseActivity<ActivityDocumentGroupListBinding>
             setNegativeButtonAndListener(resources.getString(R.string.cancel)) { dialog, _ ->
                 dialog.dismiss()
             }
-            setPositiveButtonAndListener(resources.getString(R.string.confirm)) { _, _ ->
+            setPositiveButtonAndListener(resources.getString(R.string.confirm)) { dialog, _ ->
                 val uri = Uri.parse(url)
                 startActivity(Intent(Intent.ACTION_VIEW, uri))
+
+                dialog.dismiss()
             }
             setCancelable(false)
         }.show()

+ 352 - 0
app/src/main/java/com/pan_american/android/ui/financial_module/accounts_receivable_report/AccountsReceivableReportActivity.kt

@@ -0,0 +1,352 @@
+package com.pan_american.android.ui.financial_module.accounts_receivable_report
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.view.Gravity
+import android.view.View
+import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
+import android.widget.PopupWindow
+import android.widget.TextView
+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.CustomAlertDialog
+import com.pan_american.android.base.ListAdapter
+import com.pan_american.android.data.model.financial_module.accounts_receivable_report.adapter.AccountsReceivableReportAdapter
+import com.pan_american.android.data.model.financial_module.accounts_receivable_report.entity.AccountReceivableReportFeeItem
+import com.pan_american.android.data.model.financial_module.accounts_receivable_report.entity.AccountReceivableReportListItem
+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.network.APIService
+import com.pan_american.android.data.network.ServiceCreator
+import com.pan_american.android.databinding.ActivityAccountsReceivableReportBinding
+import com.pan_american.android.databinding.LayoutTitleBinding
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class AccountsReceivableReportActivity : BaseActivity<ActivityAccountsReceivableReportBinding>() {
+
+    private lateinit var titleBinding: LayoutTitleBinding
+
+    private val apiService = ServiceCreator.create<APIService>()
+
+    private var accountReceivableReportListRequest = AccountReceivableReportListRequest()
+
+    private var isFilterShown = true
+
+    private val accountReceivableReportList = ArrayList<AccountReceivableReportListItem>()
+
+    override fun getViewBinding() = ActivityAccountsReceivableReportBinding.inflate(layoutInflater)
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        screenAdaptation(binding)
+
+        initTitle()
+
+        initViews()
+
+        initEvents()
+    }
+
+    override fun initTitle() {
+        titleBinding = LayoutTitleBinding.bind(binding.root).apply {
+            titleText.text = resources.getString(R.string.accounts_receivable_report)
+
+            rightTextField.text = resources.getString(R.string.generate)
+
+            rightTextField.setOnClickListener {
+                accountReceivableReportListRequest.requestType = 2
+
+                generateReport()
+            }
+
+            backButton.setOnClickListener {
+                back()
+            }
+        }
+    }
+
+    override fun initViews() {
+        binding.commit.setText(resources.getString(R.string.search))
+    }
+
+    override fun initEvents() {
+
+        binding.filterSwitch.setOnClickListener {
+            if (isFilterShown) {
+                binding.dateFilter.visibility = View.GONE
+                binding.filterSwitch.text = resources.getString(R.string.show)
+                isFilterShown = false
+            } else {
+                binding.dateFilter.visibility = View.VISIBLE
+                binding.filterSwitch.text = resources.getString(R.string.hide)
+                isFilterShown = true
+            }
+        }
+
+        binding.startDate.setOnClickListener {
+            showDatePicker(resources.getString(R.string.start_date), binding.startDate)
+        }
+
+        binding.endDate.setOnClickListener {
+            showDatePicker(resources.getString(R.string.end_date), binding.endDate)
+        }
+
+        binding.commit.setOnClickListener {
+            if (binding.startDate.text.isNullOrBlank()) {
+                showMessage(resources.getString(R.string.start_date_select_hint))
+                return@setOnClickListener
+            }
+
+            if (binding.endDate.text.isNullOrBlank()) {
+                showMessage(resources.getString(R.string.end_date_select_hint))
+                return@setOnClickListener
+            }
+
+            val inputMethodManager =
+                this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+            if (inputMethodManager.isActive) {
+                inputMethodManager.hideSoftInputFromWindow(
+                    this.window.decorView.windowToken, 0
+                )
+            }
+
+            accountReceivableReportListRequest.apply {
+                startDate = binding.startDate.text.toString()
+                endDate = binding.endDate.text.toString()
+                groupName = binding.groupName.text.toString()
+                requestType = 1
+            }
+
+            if (accountReceivableReportList.size > 0) {
+                accountReceivableReportList.clear()
+            }
+
+            getAccountsReceivableReportGroupList()
+        }
+    }
+
+    private fun getAccountsReceivableReportGroupList() {
+        apiService.getAccountReceivableReportList(accountReceivableReportListRequest)
+            .enqueue(object : Callback<AccountReceivableReportListResponse> {
+                override fun onResponse(
+                    call: Call<AccountReceivableReportListResponse>,
+                    response: Response<AccountReceivableReportListResponse>
+                ) {
+                    val listResponse = response.body()
+
+                    if (listResponse != null) {
+                        if (listResponse.code == 200) {
+                            if (listResponse.data.dataList.size > 0) {
+                                for (item in listResponse.data.dataList) {
+                                    accountReceivableReportList.add(item)
+                                }
+
+                                binding.receivablesReportTotal.visibility = View.VISIBLE
+
+                                binding.receivablesReportTotal.text = String.format(
+                                    resources.getString(R.string.accounts_receivable_report_total),
+                                    listResponse.data.totalFr,
+                                    listResponse.data.totalPr,
+                                    listResponse.data.totalBalance
+                                )
+
+                                titleBinding.rightTextField.visibility = View.VISIBLE
+
+                            } else {
+                                showMessage(resources.getString(R.string.no_data))
+
+                                binding.receivablesReportTotal.visibility = View.GONE
+
+                                titleBinding.rightTextField.visibility = View.GONE
+                            }
+
+                            initList()
+
+                        } else {
+                            showMessage(listResponse.msg)
+                        }
+                    }
+                }
+
+                override fun onFailure(
+                    call: Call<AccountReceivableReportListResponse>,
+                    t: Throwable
+                ) {
+                    showErrorInfo(R.string.accounts_receivable_report_list_get_error)
+                }
+            })
+    }
+
+    private fun initList() {
+
+        if (accountReceivableReportList.size == 0) {
+            return
+        }
+
+        val layoutManager = LinearLayoutManager(OASystem.context)
+        binding.groupReceivableList.layoutManager = layoutManager
+
+        val adapter = AccountsReceivableReportAdapter(accountReceivableReportList)
+
+        binding.groupReceivableList.adapter = adapter
+
+        adapter.onDetailClick = object : AccountsReceivableReportAdapter.OnRecyclerViewItemClick {
+            override fun onDetailClick(position: Int) {
+                val detailView = View.inflate(
+                    OASystem.context,
+                    R.layout.popup_accounts_receivable_report_detail,
+                    null
+                )
+                popupWindow = PopupWindow(
+                    detailView,
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    binding.root.height * 3 / 4
+                )
+
+                showPopupWindow {
+                    val paymentDetail =
+                        detailView.findViewById<RecyclerView>(R.id.account_receivable_report_detail)
+                    val noDataHint = detailView.findViewById<TextView>(R.id.no_data_hint)
+                    val receiveDepartment =
+                        detailView.findViewById<TextView>(R.id.payment_receive_department)
+
+                    accountReceivableReportList[position].apply {
+                        if (feeItem.size == 0) {
+                            paymentDetail.visibility = View.GONE
+                            noDataHint.visibility = View.VISIBLE
+                        } else {
+
+                            paymentDetail.visibility = View.VISIBLE
+                            noDataHint.visibility = View.GONE
+
+                            val detailLayoutManager = LinearLayoutManager(OASystem.context)
+                            paymentDetail.layoutManager = detailLayoutManager
+
+                            val detailAdapter =
+                                ListAdapter.Builder<AccountReceivableReportFeeItem>().apply {
+                                    setLayoutId(R.layout.item_accounts_receivable_report_detail)
+                                    setData(feeItem)
+                                    addBindView { itemView, data ->
+                                        itemView.findViewById<TextView>(R.id.name).text =
+                                            data.client
+                                        if (data.frCurrency.isBlank() or (data.frCurrency == "-")) {
+                                            itemView.findViewById<TextView>(R.id.receivables).text =
+                                                String.format(
+                                                    resources.getString(R.string.currency_name_code_format),
+                                                    "0.00",
+                                                    "CNY"
+                                                )
+                                        } else {
+                                            itemView.findViewById<TextView>(R.id.receivables).text =
+                                                String.format(
+                                                    resources.getString(R.string.currency_name_code_format),
+                                                    data.frMoney,
+                                                    data.frCurrency
+                                                )
+                                        }
+
+                                        itemView.findViewById<TextView>(R.id.exchange_rate).text =
+                                            data.frRate.ifBlank { "-" }
+                                        if (data.prCurrency.isBlank() or (data.prCurrency == "-")) {
+                                            itemView.findViewById<TextView>(R.id.payment_collected).text =
+                                                String.format(
+                                                    resources.getString(R.string.currency_name_code_format),
+                                                    "0.00",
+                                                    "CNY"
+                                                )
+                                        } else {
+                                            itemView.findViewById<TextView>(R.id.payment_collected).text =
+                                                String.format(
+                                                    resources.getString(R.string.currency_name_code_format),
+                                                    data.prMoney,
+                                                    data.prCurrency
+                                                )
+                                        }
+
+                                        itemView.findViewById<TextView>(R.id.payment_balance).text =
+                                            data.balPayment.ifBlank { "-" }
+                                        itemView.findViewById<TextView>(R.id.payment_way).text =
+                                            data.prReceivablesType.ifBlank { "-" }
+                                        itemView.findViewById<TextView>(R.id.payment_collected_time).text =
+                                            data.prTime.ifBlank { "-" }
+                                    }
+                                }.create()
+
+
+                            paymentDetail.adapter = detailAdapter
+
+                            detailAdapter.onRecyclerViewItemClick = object :
+                                ListAdapter.OnRecyclerViewItemClick<AccountReceivableReportFeeItem> {
+                                override fun onItemClick(position: Int) {
+
+                                }
+                            }
+                        }
+
+                        receiveDepartment.text =
+                            prClient.ifBlank { resources.getString(R.string.no_data) }
+                    }
+
+                    popupWindow.showAtLocation(binding.root, Gravity.BOTTOM, 0, 0)
+                }
+            }
+        }
+    }
+
+    private fun generateReport() {
+        apiService.generateAccountReceivableReport(accountReceivableReportListRequest)
+            .enqueue(object : Callback<GenerateAccountReceivableReportResponse> {
+                override fun onResponse(
+                    call: Call<GenerateAccountReceivableReportResponse>,
+                    response: Response<GenerateAccountReceivableReportResponse>
+                ) {
+                    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.account_receivable_report_generated),
+                                        accountReceivableReportListRequest.startDate,
+                                        accountReceivableReportListRequest.endDate
+                                    )
+                                )
+                                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(
+                    call: Call<GenerateAccountReceivableReportResponse>,
+                    t: Throwable
+                ) {
+                    showErrorInfo(R.string.interface_request_error)
+                }
+            })
+    }
+}

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

@@ -6,6 +6,7 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.ImageView
 import android.widget.TextView
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.pan_american.android.OASystem
@@ -248,31 +249,36 @@ class InsuranceListFragment : BaseFragment<FragmentInsuranceListBinding>() {
 
                 when (data.isAuditGM) {
                     0 -> {
-                        itemView.findViewById<TextView>(R.id.is_verify).apply {
+                        itemView.findViewById<TextView>(R.id.is_verify_status).apply {
                             text = resources.getString(R.string.verify_wait)
                             setTextColor(Color.rgb(23, 171, 227))
                         }
+                        itemView.findViewById<ImageView>(R.id.is_verify_icon).setImageResource(R.mipmap.icon_wait)
                     }
 
                     1 -> {
-                        itemView.findViewById<TextView>(R.id.is_verify).apply {
+                        itemView.findViewById<TextView>(R.id.is_verify_status).apply {
                             text = resources.getString(R.string.verify_passed)
                             setTextColor(Color.rgb(84, 213, 77))
                         }
+                        itemView.findViewById<ImageView>(R.id.is_verify_icon).setImageResource(R.mipmap.icon_passed)
                     }
 
                     2 -> {
-                        itemView.findViewById<TextView>(R.id.is_verify).apply {
+                        itemView.findViewById<TextView>(R.id.is_verify_status).apply {
                             text = resources.getString(R.string.verify_rejected)
                             setTextColor(Color.rgb(210, 45, 34))
                         }
+                        itemView.findViewById<ImageView>(R.id.is_verify_icon).setImageResource(R.mipmap.icon_reject)
                     }
 
                     3 -> {
-                        itemView.findViewById<TextView>(R.id.is_verify).text =
+                        itemView.findViewById<TextView>(R.id.is_verify_status).text =
                             resources.getString(R.string.auto_verify)
                     }
                 }
+
+                itemView.findViewById<TextView>(R.id.payment_way).text = data.payName
             }
         }.create()
 

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

@@ -6,6 +6,7 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.ImageView
 import android.widget.TextView
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.pan_american.android.OASystem
@@ -253,31 +254,54 @@ class VisaPaymentListFragment : BaseFragment<FragmentVisaPaymentListBinding>() {
 
                 when (data.isAuditGM) {
                     0 -> {
-                        itemView.findViewById<TextView>(R.id.is_verify).apply {
+                        itemView.findViewById<TextView>(R.id.is_verify_status).apply {
                             text = resources.getString(R.string.verify_wait)
                             setTextColor(Color.rgb(23, 171, 227))
                         }
+                        itemView.findViewById<ImageView>(R.id.is_verify_icon).setImageResource(R.mipmap.icon_wait)
                     }
 
                     1 -> {
-                        itemView.findViewById<TextView>(R.id.is_verify).apply {
+                        itemView.findViewById<TextView>(R.id.is_verify_status).apply {
                             text = resources.getString(R.string.verify_passed)
                             setTextColor(Color.rgb(84, 213, 77))
                         }
+                        itemView.findViewById<ImageView>(R.id.is_verify_icon).setImageResource(R.mipmap.icon_passed)
                     }
 
                     2 -> {
-                        itemView.findViewById<TextView>(R.id.is_verify).apply {
+                        itemView.findViewById<TextView>(R.id.is_verify_status).apply {
                             text = resources.getString(R.string.verify_rejected)
                             setTextColor(Color.rgb(210, 45, 34))
                         }
+                        itemView.findViewById<ImageView>(R.id.is_verify_icon).setImageResource(R.mipmap.icon_reject)
                     }
 
                     3 -> {
-                        itemView.findViewById<TextView>(R.id.is_verify).text =
+                        itemView.findViewById<TextView>(R.id.is_verify_status).text =
                             resources.getString(R.string.auto_verify)
                     }
                 }
+
+                when (data.isPay) {
+                    0 -> {
+                        itemView.findViewById<TextView>(R.id.is_pay_status).apply {
+                            text = resources.getString(R.string.not_pay)
+                            setTextColor(Color.rgb(23, 171, 227))
+                        }
+                        itemView.findViewById<ImageView>(R.id.is_pay_icon).setImageResource(R.mipmap.icon_wait)
+                    }
+
+                    1 -> {
+                        itemView.findViewById<TextView>(R.id.is_pay_status).apply {
+                            text = resources.getString(R.string.paid)
+                            setTextColor(Color.rgb(84, 213, 77))
+                        }
+                        itemView.findViewById<ImageView>(R.id.is_pay_icon).setImageResource(R.mipmap.icon_passed)
+                    }
+                }
+
+                itemView.findViewById<TextView>(R.id.payment_way).text = data.payName
             }
         }.create()
 

+ 15 - 3
app/src/main/java/com/pan_american/android/ui/workspace/WorkspaceFragment.kt

@@ -20,6 +20,7 @@ import com.pan_american.android.ui.customer_resource.related_invitee.RelatedInvi
 import com.pan_american.android.ui.efficiency_tools.address_book.AddressBookActivity
 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.daily_payment.DailyPaymentListActivity
 import com.pan_american.android.ui.financial_module.expense_approval.ExpenseApprovalActivity
 import com.pan_american.android.ui.group_airplane_ticket.airplane_payment_insert.AirplaneTicketPaymentActivity
@@ -104,6 +105,16 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                     }
                 }
 
+                OASystem.ACCOUNT_RECEIVABLE_REPORT -> {
+                    if (OASystem.authorization(OASystem.DAILY_PAYMENT, OASystem.VIEW)) {
+                        if (binding.financialModule.visibility == View.GONE) {
+                            binding.financialModule.visibility = View.VISIBLE
+                        }
+                        binding.accountReceivableReport.visibility = View.VISIBLE
+                        binding.accountReceivableReport.setOnClickListener(this)
+                    }
+                }
+
                 //人事模块
                 OASystem.MATERIAL_APPLICATION -> {
                     if (OASystem.authorization(OASystem.MATERIAL_APPLICATION, OASystem.VIEW)) {
@@ -336,9 +347,10 @@ class WorkspaceFragment : BaseFragment<FragmentWorkspaceBinding>(), OnClickListe
                 startActivity(intent)
             }
 
-//            binding.groupPayment.id -> {
-//
-//            }
+            binding.accountReceivableReport.id -> {
+                val intent = Intent(OASystem.context, AccountsReceivableReportActivity::class.java)
+                startActivity(intent)
+            }
 
             binding.materialOperate.id -> {
                 val intent = Intent(OASystem.context, MaterialOperateActivity::class.java)

+ 180 - 0
app/src/main/res/layout/activity_accounts_receivable_report.xml

@@ -0,0 +1,180 @@
+<?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:id="@+id/main"
+    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_large"
+            android:layout_marginEnd="@dimen/common_padding">
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@string/during_time"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/filter_switch"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="end"
+                android:text="@string/hide"
+                android:textColor="@color/title_background_color"
+                android:textSize="@dimen/text_size_medium" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginStart="@dimen/common_padding"
+            android:layout_marginTop="@dimen/common_padding_large"
+            android:layout_marginEnd="@dimen/common_padding"
+            android:background="@color/line_color" />
+
+        <LinearLayout
+            android:id="@+id/date_filter"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/common_padding"
+            android:orientation="vertical">
+
+            <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:text="@string/start_date"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:id="@+id/start_date"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:gravity="end"
+                    android:textColor="@color/text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                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:text="@string/end_date"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <TextView
+                    android:id="@+id/end_date"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginStart="@dimen/common_padding"
+                    android:gravity="end"
+                    android:textColor="@color/text_color"
+                    android:textSize="@dimen/text_size_medium" />
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                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:text="@string/group_name"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <EditText
+                    android:id="@+id/group_name"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    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: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="1dp"
+                android:layout_marginTop="@dimen/common_padding"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:background="@color/line_color" />
+
+            <com.pan_american.android.util.CommitButton
+                android:id="@+id/commit"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/button_height"
+                android:layout_margin="@dimen/common_padding" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/group_receivable_list"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_margin="@dimen/common_padding"
+        android:layout_weight="1"
+        android:overScrollMode="never" />
+
+    <TextView
+        android:id="@+id/receivables_report_total"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding"
+        android:textColor="@color/text_color"
+        android:textSize="@dimen/text_size_small" />
+
+</LinearLayout>

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

@@ -320,6 +320,33 @@
 
                     </LinearLayout>
 
+                    <LinearLayout
+                        android:id="@+id/account_receivable_report"
+                        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/accounts_receivable_report"
+                            android:textColor="@color/text_color"
+                            android:textSize="@dimen/text_size_medium"
+                            app:drawableStartCompat="@mipmap/icon_account_receivable_report" />
+
+                        <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"

+ 252 - 0
app/src/main/res/layout/item_accounts_receivable_report.xml

@@ -0,0 +1,252 @@
+<?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:id="@+id/item_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding"
+        android:orientation="vertical"
+        tools:ignore="UselessParent">
+
+        <TextView
+            android:id="@+id/group_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:textColor="@color/text_color_blue"
+            android:textSize="@dimen/text_size_medium"
+            android:textStyle="bold" />
+
+        <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:baselineAligned="false"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/department_name"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/department_name"
+                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:baselineAligned="false"
+            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="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" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="start"
+            android:layout_marginTop="@dimen/common_padding"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:text="@string/payment_collected_total"
+            android:textColor="@color/title_background_color"
+            android:textSize="@dimen/text_size_large"
+            android:textStyle="bold" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:layout_marginBottom="@dimen/common_padding"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center"
+                android:text="@string/payment_collected"
+                android:textSize="@dimen/text_size_large"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/payment_collected"
+                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>
+
+        <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_refund"
+                android:textSize="@dimen/text_size_large"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/payment_refund"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                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">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/payment_balance"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/payment_balance"
+                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="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center"
+                android:text="@string/payment_collection_progress"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/payment_collection_progress"
+                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>
+
+        <TextView
+            android:id="@+id/detail"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/button_height"
+            android:layout_margin="@dimen/common_padding"
+            android:background="@drawable/shape_corner_solid_blue"
+            android:gravity="center"
+            android:text="@string/payment_detail"
+            android:textColor="@color/white"
+            android:textSize="@dimen/text_size_medium"
+            android:textStyle="bold" />
+
+    </LinearLayout>
+
+</LinearLayout>

+ 234 - 0
app/src/main/res/layout/item_accounts_receivable_report_detail.xml

@@ -0,0 +1,234 @@
+<?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">
+
+        <TextView
+            android:id="@+id/name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/common_padding"
+            android:textColor="@color/text_color_blue"
+            android:textSize="@dimen/text_size_medium"
+            android:textStyle="bold" />
+
+        <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:baselineAligned="false"
+            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="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:baselineAligned="false"
+            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/exchange_rate"
+                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:baselineAligned="false"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/payment_collected"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/payment_collected"
+                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:baselineAligned="false"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/payment_balance"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/payment_balance"
+                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:baselineAligned="false"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/payment_way"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/payment_way"
+                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="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center"
+                android:text="@string/payment_collected_time"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/payment_collected_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>
+
+    </LinearLayout>
+
+</LinearLayout>

+ 51 - 4
app/src/main/res/layout/item_insurance_list.xml

@@ -157,20 +157,67 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/common_padding"
-            android:layout_marginBottom="@dimen/common_padding_huge"
-            android:baselineAligned="false"
             android:orientation="horizontal">
 
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_gravity="center"
+                android:layout_gravity="start"
                 android:text="@string/is_verify"
                 android:textSize="@dimen/text_size_medium"
                 android:textStyle="bold" />
 
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="end|center_vertical"
+                tools:ignore="UseCompoundDrawables">
+
+                <TextView
+                    android:id="@+id/is_verify_status"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/verify_passed"
+                    android:textColor="@color/passed"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <ImageView
+                    android:id="@+id/is_verify_icon"
+                    android:layout_width="@dimen/common_padding_huge"
+                    android:layout_height="@dimen/common_padding_huge"
+                    android:layout_marginStart="@dimen/common_padding_small"
+                    android:gravity="center"
+                    android:src="@mipmap/icon_passed"
+                    tools:ignore="ContentDescription" />
+
+            </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:layout_marginBottom="@dimen/common_padding_huge"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center"
+                android:text="@string/payment_way"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
             <TextView
-                android:id="@+id/is_verify"
+                android:id="@+id/payment_way"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginStart="@dimen/common_padding"

+ 98 - 2
app/src/main/res/layout/item_visa_payment.xml

@@ -179,6 +179,102 @@
 
         </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="start"
+                android:text="@string/is_verify"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="end|center_vertical"
+                tools:ignore="UseCompoundDrawables">
+
+                <TextView
+                    android:id="@+id/is_verify_status"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/verify_passed"
+                    android:textColor="@color/passed"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <ImageView
+                    android:id="@+id/is_verify_icon"
+                    android:layout_width="@dimen/common_padding_huge"
+                    android:layout_height="@dimen/common_padding_huge"
+                    android:layout_marginStart="@dimen/common_padding_small"
+                    android:gravity="center"
+                    android:src="@mipmap/icon_passed"
+                    tools:ignore="ContentDescription" />
+
+            </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="start"
+                android:text="@string/is_pay"
+                android:textSize="@dimen/text_size_medium"
+                android:textStyle="bold" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="end|center_vertical"
+                tools:ignore="UseCompoundDrawables">
+
+                <TextView
+                    android:id="@+id/is_pay_status"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/verify_passed"
+                    android:textColor="@color/passed"
+                    android:textSize="@dimen/text_size_medium" />
+
+                <ImageView
+                    android:id="@+id/is_pay_icon"
+                    android:layout_width="@dimen/common_padding_huge"
+                    android:layout_height="@dimen/common_padding_huge"
+                    android:layout_marginStart="@dimen/common_padding_small"
+                    android:gravity="center"
+                    android:src="@mipmap/icon_passed"
+                    tools:ignore="ContentDescription" />
+
+            </LinearLayout>
+
+        </LinearLayout>
+
         <View
             android:layout_width="match_parent"
             android:layout_height="@dimen/line"
@@ -197,12 +293,12 @@
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:layout_gravity="center"
-                android:text="@string/is_verify"
+                android:text="@string/payment_way"
                 android:textSize="@dimen/text_size_medium"
                 android:textStyle="bold" />
 
             <TextView
-                android:id="@+id/is_verify"
+                android:id="@+id/payment_way"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginStart="@dimen/common_padding"

+ 69 - 0
app/src/main/res/layout/popup_accounts_receivable_report_detail.xml

@@ -0,0 +1,69 @@
+<?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:orientation="vertical"
+    android:background="@drawable/shape_corner_background_color">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/common_padding"
+        android:gravity="center"
+        android:text="@string/cost_detail"
+        android:textSize="@dimen/text_size_large"
+        android:textStyle="bold" />
+
+    <androidx.core.widget.NestedScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_margin="@dimen/common_padding"
+            android:orientation="vertical">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/account_receivable_report_detail"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_marginTop="@dimen/common_padding"
+                android:layout_marginBottom="@dimen/common_padding"
+                android:layout_weight="1"
+                android:scrollbars="none" />
+
+            <TextView
+                android:id="@+id/no_data_hint"
+                android:layout_width="match_parent"
+                android:layout_height="100dp"
+                android:layout_margin="@dimen/common_padding"
+                android:gravity="center"
+                android:text="@string/no_data"
+                android:textSize="@dimen/text_size_medium"
+                android:visibility="gone"/>
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/common_padding"
+                android:gravity="center"
+                android:text="@string/payment_receive_department"
+                android:textSize="@dimen/text_size_large"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/payment_receive_department"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_padding"
+                android:background="@drawable/shape_large_edit_text_background"
+                android:padding="@dimen/common_padding_small"
+                android:textColor="@color/text_color"
+                android:textSize="@dimen/text_size_medium"/>
+
+        </LinearLayout>
+
+    </androidx.core.widget.NestedScrollView>
+
+</LinearLayout>

二进制
app/src/main/res/mipmap-xxhdpi/icon_account_receivable_report.png


+ 25 - 4
app/src/main/res/values/strings.xml

@@ -59,6 +59,8 @@
 
     <string name="identify">识别</string>
 
+    <string name="generate">生成</string>
+
     <string name="update_time">更新时间: %s</string>
 
     <string name="during_format">%s - %s</string>
@@ -129,6 +131,9 @@
 
     <string name="logout_confirm_hint">确定要退出登录? </string>
 
+    <string name="paid">已付款</string>
+    <string name="not_pay">未付款</string>
+    
     <!-- AlertDialog通用文本 -->
     <string name="alert">警告</string>
     <string name="delete_alert_text">确认要删除:%s ?</string>
@@ -263,8 +268,6 @@
     <string name="verify_rejected">未通过</string>
     <string name="rmb_price">%.2f RMB</string>
     <string name="is_pay">是否付款</string>
-    <string name="paid">已付款</string>
-    <string name="not_pay">未付款</string>
 
     <string name="select_payment_type">请先选择费用类型</string>
 
@@ -1198,7 +1201,7 @@
     <string name="group_operator">接团操作人</string>
 
     <string name="segment_payment_statistics">板块费用统计</string>
-    
+
     <string name="expense_approval_group_list_get_error">费用审核团组列表获取失败</string>
     <string name="expense_approval_payment_type_get_error">费用类型获取失败</string>
     <string name="expense_approval_list_get_error">费用列表获取失败</string>
@@ -1211,7 +1214,7 @@
     <string name="balance">剩余尾款</string>
     <string name="over_budget">超支金额</string>
     <string name="revoke">撤销通过</string>
-    
+
     <string name="batch_revoke">批量撤销</string>
     <string name="batch_reject">批量拒绝</string>
     <string name="batch_pass">批量通过</string>
@@ -1221,6 +1224,24 @@
     <string name="approval_revoke_hint">确认撤销该费用的审核通过状态?\n\n费用名称: %s</string>
     <string name="approval_payment_list_update_hint">确认批量审核下列款项?\n\n团组名称: %s \n\n费用模块: %s\n\n费用列表:\n%s</string>
 
+    <!-- 应收报表 -->
+    <string name="accounts_receivable_report">应收报表</string>
+
+    <string name="accounts_receivable_report_list_get_error">应收报表数据获取失败</string>
+
+    <string name="accounts_receivable_report_total">应收合计:%s 已收合计:%s 余款合计:%s</string>
+
+    <string name="receivables">应收款</string>
+    <string name="payment_collected_total">已收款总计</string>
+    <string name="payment_collected">已收款</string>
+    <string name="payment_refund">收款退还</string>
+    <string name="payment_balance">余款</string>
+    <string name="payment_collection_progress">收款进度</string>
+    <string name="payment_receive_department">收款单位</string>
+    <string name="payment_collected_time">收款时间</string>
+
+    <string name="account_receivable_report_generated">应收报表文档已生成,点击确认前往下载 \n\n生成时段: %s - %s</string>
+
     <!-- TODO: Remove or change this placeholder text -->
     <string name="hello_blank_fragment">Hello blank fragment</string>