1. 前言
公司的项目又加了一个新需求,打印发票增加详细收费方式以及每种收费收费金额。一开始没把它当回事,想着服务端返回的支付信息里包含着各种支付记录,在打印模块里将接收到的支付信息 List 遍历一下,然后打印出来就好了。
后来做的时候发现,是我想得简单了。
因为服务端返回的支付信息是按照每笔交易记录返回的,即如果支付总额为20元,如果使用者支付了两次10元完成的支付,那么服务端存储的这笔交易的支付信息就为两次10元的支付记录。具体返回的 json 串示例如下:
"***INFOS\": [
{
\"***NAME\": \"现金收费\",
\"***ACCOUNT\": \"7.0\",
\"***NUM\": \"1000000576\"
},
{
\"***NAME\": \"现金收费\",
\"***ACCOUNT\": \"3.0\",
\"***NUM\": \"1000000576\"
},
{
\"***NAME\": \"现金收费\",
\"***ACCOUNT\": \"5.0\",
\"***NUM\": \"1000000576\"
},
{
\"***NAME\": \"微信收费\",
\"***ACCOUNT\": \"15.0\",
\"***NUM\": \"1000000576\"
},
{
\"***NAME\": \"微信收费\",
\"***ACCOUNT\": \"8.0\",
\"***NUM\": \"1000000576\"
}
]
可以看到,此次交易总额为38元,然后使用者分了5次完成的支付。如果我什么也不处理就开始遍历打印的话,打出的发票信息上显示的详细支付信息就是3条现金支付记录,和2条微信支付记录,只是钱数不同而已。这样是肯定不行的,所以这里要处理一下数据。
2. 思路
思路其实很简单,就是把 List 中的相同支付方式去重,然后将每笔支付金额相加,得出的总额算作是这种支付方式的支付钱数。即前文中那笔示例交易,处理后应该为:
"***INFOS\": [
{
\"***NAME\": \"现金收费\",
\"***ACCOUNT\": \"15.0\",
\"***NUM\": \"1000000576\"
},
{
\"***NAME\": \"微信收费\",
\"***ACCOUNT\": \"23.0\",
\"***NUM\": \"1000000576\"
}
]
好了,思路清晰了,就去完成它吧。
3. 实现
实现的部分在新建的示例工程中完成。
创建一个实体类对象:
public class Person {
private<