效果图:
前端js代码:
// 订单汇总 请求
$(document).ready(function () {
$('#orderSumBtn').click(function () {
if ( !$('#rechargeStartTime').val() || !$('#rechargeEndTime').val() ) {
alert('充值时间不能为空!');
} else {
createOrderSumTable();
}
})
});
// 订单汇总 查询结果返回 调用 bootstrap-table 插件
function createOrderSumTable() {
$('#order_sum').bootstrapTable('destroy');
postOrderSumData = function () {
var temp = {
"zoneID": $('#zoneID').val(),
"channelID": $('#channelID').val(),
"payType": $('#payType').val(),
"orderState": $('#orderState').val(),
"country": $('#country').val(),
"currency": $('#currency').val(),
"gameOrderId": $('#gameOrder').val(),
"channelOrder": $('#channelOrder').val(),
"UID": $('#UID').val(),
"rechargeStartMoney": $('#rechargeStartMoney').val(),
"rechargeEndMoney": $('#rechargeEndMoney').val(),
"rechargeStartTime": $('#rechargeStartTime').val(),
"rechargeEndTime": $('#rechargeEndTime').val(),
"inAccountStartTime": $('#inAccountStartTime').val(),
"inAccountEndTime": $('#inAccountEndTime').val()
};
return temp;
};
$('#order_sum').bootstrapTable({
url: '/orderSum',
method: 'post',
contentType:"application/x-www-form-urlencoded; charset=UTF-8",
queryParams: postOrderSumData,
cache: false,
pagination: true,
sidePageination: 'client', // 注意:我这里是 客户端分页!!
pageNumber: 1,
pageSize: 20,
pageList: [10, 25, 50],
height: 420,
silent: true, // 刷新服务器数据
rowStyle: function (row, index) { // 设置最后一行 行样式
if (index == $('#order_sum').bootstrapTable('getData').length-1) {
return {
css: {
"text-align": "center"
}
};
}
return {};
},
columns: [{
field: 'fromCurrency',
title: '充值货币',
valign: 'middle',
// align: 'left',
// halign: 'center'
}, {
field: 'rechargePlayersCount',
title: '充值人数(去重)',
valign: 'middle'
}, {
field: 'rechargeOrders',
title: '充值订单数量',
valign: 'middle'
}, {
field: 'fromCurrencyAmount',
title: '充值货币数量',
valign: 'middle'
}, {
field: 'rate',
title: '汇率',
valign: 'middle'
}, {
field: 'toUSDAmount',
title: '美元',
valign: 'middle'
}],
responseHandler: function (res) {
var orderSumData = res['rows'];
return orderSumData;
},
onLoadSuccess: function (data) {
var index = $('#order_sum').bootstrapTable('getData').length-1;
$('#order_sum').bootstrapTable('mergeCells', {index: index, field: 'rechargePlayersCount', colspan: 5}); // 合并单元格,只能 从 左 向 右 合并
}
})
}
后端python接受并处理请求:
def order_sum(request):
postOrderSumData = request.POST
requestResults = requestsOrderSum(postOrderSumData) ### 发送到 model层,处理具体请求
if requestResults == 0:
return HttpResponse('0')
elif requestResults == -1:
return HttpResponse('-1')
else:
returnData = {"rows": []}
totalUSD = 0 ### 美金 累加计算
for result in requestResults:
totalUSD += float(result['toUSDAmount'])
returnData['rows'].append({
"fromCurrency": result['fromCurrency'],
"rechargePlayersCount": result['rechargePlayersCount'],
"rechargeOrders": result['rechargeOrders'],
"fromCurrencyAmount": result['fromCurrencyAmount'],
"rate": result['rate'],
"toUSDAmount": result['toUSDAmount']
})
''' 将 最终 美元的数据结果,放到 去重人数 那一列,可以合并单元格(左 --> 右) %.2f float保留2位小数 '''
returnData['rows'].append({"fromCurrency": "美元总计", "rechargePlayersCount": '%.2f' % totalUSD})
return HttpResponse(json.dumps(returnData))
后端model层处理具体请求:
def requestsOrderSum(postOrderSumData):
queryResult = db_queryOrder(postOrderSumData) ### 先去 数据库中,查询符合条件的 数据
if queryResult == 0:
return 0
elif queryResult == -1:
return -1
else:
''' 当 有查询结果时,才执行下面的汇总,以及发起 汇率请求 '''
currencyData = [] #汇总结果,如:[{'USD': '555'}]
queriedCurrency = [] #记录 已经查询过的 货币
j = -1 #第2个循环的 计数器
for data in queryResult:
j += 1
fromCurrency = data['pricecurrencycode'] # 本地货币
fromCurrencyAmount = data['priceamount'] # 本地货币金额
rechargePlayers = data['uid'] # 充值玩家(UID识别)
rechargePlayersCount = 1 # 充值人数计数(去重)
rechargeOrders = 1 # 充值订单数
#print('j======= ', j)
if fromCurrency not in queriedCurrency: # 只有不在 queriedCurrency 里的,才可以 进行循环 汇总求和
rechargePlayersSet = set() # Set集合,需要 集合中的元素不能有重复的(每笔订单的充值客户UID)
''' 双循环 '''
for i in range(j+1, len(queryResult)): ## 注意这里,是 j+1 !!!!!
#print(i) # 0-310
if fromCurrency == queryResult[i]['pricecurrencycode']:
fromCurrencyAmount += queryResult[i]['priceamount'] # 充值金额 汇总
rechargeOrders += 1 # 充值订单数 汇总
rechargePlayersSet.add(queryResult[i]['uid']) # 向Set中 添加元素
''' 去重人数计算,遍历Set集合 '''
for player in rechargePlayersSet:
if rechargePlayers != player:
rechargePlayersCount += 1 # 充值人数计数(去重)汇总
queriedCurrency.append(fromCurrency)
currencyData.append({"fromCurrency": fromCurrency, "fromCurrencyAmount": fromCurrencyAmount, "rechargePlayersCount": rechargePlayersCount, "rechargeOrders": rechargeOrders})
# print(currencyData)
return requestUSD(currencyData) ## 发起 爬虫请求
后端requests爬虫:
import requests
import re
def requestUSD(currencyData):
requestResults = [] ## 收集 爬虫结果集
for requestData in currencyData:
getParams = {'from': requestData['fromCurrency'], 'to': 'USD', 'q': requestData['fromCurrencyAmount']}
r = requests.get('http://m.ip138.com/huilv/huilv.asp', params=getParams)
if r.status_code == 200:
r.encoding = 'utf-8' # 设定编码,否则会出现 乱码
content = r.text
#print(content)
data=content.split('<table border="1" cellpadding="3" cellspacing="0" width="260" align="left"><tr align=center>')[1]
#print(data)
result = re.match('<td>([^<]*)</td><td>[^<]*</td><td>[^<]*</td></tr>\s*<tr align=center><td>([^<]*)</td><td>([^<]*)</td><td>([^<]*)</td>', data)
#print('匹配结果:', result.group())
fromCurrency = result.group(1) #获取 第1个 捕获组
fromCurrencyAmount = result.group(2)
rate = result.group(3)
toUSDAmount = result.group(4)
#print(fromCurrency, fromCurrencyAmount, rate, toUSDAmount)
requestResults.append({"fromCurrency": fromCurrency, "fromCurrencyAmount": fromCurrencyAmount, "rate": rate, "toUSDAmount": toUSDAmount, "rechargePlayersCount": requestData['rechargePlayersCount'], "rechargeOrders": requestData['rechargeOrders']})
#print(requestResults)
return requestResults