效果圖:
前端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