|
@@ -1,14 +1,13 @@
|
|
|
#!/usr/bin/env python3
|
|
|
# -*- coding: utf-8 -*-
|
|
|
-
|
|
|
+import datetime
|
|
|
import hashlib
|
|
|
import time
|
|
|
import uuid
|
|
|
-from io import BytesIO
|
|
|
|
|
|
import xlrd
|
|
|
import xlwt
|
|
|
-import openpyxl
|
|
|
+import calendar
|
|
|
from django.utils.encoding import escape_uri_path
|
|
|
from django.http import HttpResponse, StreamingHttpResponse
|
|
|
from django.views.generic.base import View
|
|
@@ -17,7 +16,7 @@ from Model.models import VodBucketModel, CDKcontextModel, Store_Meal, Order_Mode
|
|
|
from Object.ResponseObject import ResponseObject
|
|
|
from Object.TokenObject import TokenObject
|
|
|
from Service.CommonService import CommonService
|
|
|
-from django.db.models import F
|
|
|
+from django.db.models import F, Sum, Count, Q
|
|
|
|
|
|
|
|
|
class serveManagement(View):
|
|
@@ -666,17 +665,56 @@ class serveManagement(View):
|
|
|
def vodOrderReconcile(self, request, request_dict, response):
|
|
|
|
|
|
file = request.FILES.get('file', None)
|
|
|
- if not file:
|
|
|
- return response.json(444)
|
|
|
+ if not all([file]):
|
|
|
+ return response.json(444, {'error param': 'file'})
|
|
|
|
|
|
try:
|
|
|
rd_book = xlrd.open_workbook(filename=None, file_contents=file.read())
|
|
|
rd_sheet = rd_book.sheet_by_index(0)
|
|
|
- # wt_book = copy(rd_book)
|
|
|
- # wt_sheet = wt_book.get_sheet(0)
|
|
|
+ date = rd_sheet.cell_value(1, 0)
|
|
|
+ month = int(date.split('/')[0])
|
|
|
+ year = int(date.split('/')[2])
|
|
|
+ last_day = calendar.monthrange(year, month)[1]
|
|
|
+ start_time = datetime.datetime(year, month, 1)
|
|
|
+ end_time = datetime.datetime(year, month, last_day) + datetime.timedelta(hours=24)
|
|
|
+ start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
+ end_time = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
wt_book = xlwt.Workbook(encoding='utf-8')
|
|
|
wt_sheet = wt_book.add_sheet('对账结果', cell_overwrite_ok=True)
|
|
|
- row_start = 7
|
|
|
+ row_start = 0
|
|
|
+ # 第一部分表格填写
|
|
|
+ first_header = ['支付类型', '销售总金额', '销售总数量', '退款总额', '退款总数量', '应收金额', '平台手续费', '账务实收', '金额相差']
|
|
|
+ for index, content in enumerate(first_header):
|
|
|
+ wt_sheet.write(row_start, index, content)
|
|
|
+ row_start += 1
|
|
|
+ all_order_qs = Order_Model.objects.filter(addTime__gte=start_time, addTime__lt=end_time,
|
|
|
+ status__in=[1, 5, 6])
|
|
|
+ trade_no_list = []
|
|
|
+ for i in all_order_qs:
|
|
|
+ if i.trade_no not in rd_sheet.col_values(9, 1):
|
|
|
+ trade_no_list.append(i.trade_no)
|
|
|
+
|
|
|
+ # 已付款订单
|
|
|
+ paid = all_order_qs.filter(payType=1, status=1).aggregate(total=Sum('price'),
|
|
|
+ count=Count('UID'))
|
|
|
+ paid_total = paid['total'] if paid['total'] else 0
|
|
|
+ paid_count = paid['count'] if paid['count'] else 0
|
|
|
+ # 全额退款订单
|
|
|
+ refund = all_order_qs.filter(payType=1, status__in=[5, 6]).aggregate(total=Sum('refunded_amount'),
|
|
|
+ count=Count('UID'))
|
|
|
+ refund_total = refund['total'] if refund['total'] else 0
|
|
|
+ refund_count = refund['count'] if refund['count'] else 0
|
|
|
+ wt_sheet.write(row_start, 0, 'PayPal')
|
|
|
+ wt_sheet.write(row_start, 1, paid_total + refund_total)
|
|
|
+ wt_sheet.write(row_start, 2, paid_count + refund_count)
|
|
|
+ wt_sheet.write(row_start, 3, refund_total)
|
|
|
+ wt_sheet.write(row_start, 4, refund_count)
|
|
|
+ wt_sheet.write(row_start, 5, paid_total)
|
|
|
+ wt_sheet.write(row_start, 8, label=xlwt.Formula('f{row}-h{row}'.format(row=row_start + 1)))
|
|
|
+ row_start += 1
|
|
|
+ # 第二部分表格填写
|
|
|
+ row_start += 2
|
|
|
+ paypal_money = 0
|
|
|
for row in range(rd_sheet.nrows):
|
|
|
if row == 0:
|
|
|
wt_sheet.write(row_start, 0, '是否匹配账单')
|
|
@@ -686,14 +724,52 @@ class serveManagement(View):
|
|
|
wt_sheet.write(row_start, temp_col, value)
|
|
|
row_start += 1
|
|
|
continue
|
|
|
+ if rd_sheet.cell_value(row, 0) == '合计':
|
|
|
+ break
|
|
|
+ paypal_money += rd_sheet.cell_value(row, 5)
|
|
|
transaction_id = rd_sheet.cell_value(row, 9)
|
|
|
- order_qs = Order_Model.objects.filter(trade_no=transaction_id)
|
|
|
+ order_qs = all_order_qs.filter(trade_no=transaction_id)
|
|
|
if not order_qs.exists():
|
|
|
col_value_list = rd_sheet.row_values(row)
|
|
|
col_value_list.insert(0, '否')
|
|
|
for index, value in enumerate(col_value_list):
|
|
|
wt_sheet.write(row_start, index, value)
|
|
|
row_start += 1
|
|
|
+
|
|
|
+ # 第三部分表格填写
|
|
|
+ row_start += 1
|
|
|
+ third_header = ['是否匹配账单', '交易ID', '订单ID', '设备UID', '用户名', '账号昵称', '通道', '商品描述', '支付方式', '价格', '支付状态',
|
|
|
+ '已退金额', '添加时间', '更新时间']
|
|
|
+ diff_order_qs = all_order_qs.filter(trade_no__in=trade_no_list).values('trade_no', 'orderID', 'UID',
|
|
|
+ 'userID__username',
|
|
|
+ 'userID__NickName', 'channel',
|
|
|
+ 'desc', 'payType',
|
|
|
+ 'price', 'status',
|
|
|
+ 'refunded_amount', 'addTime',
|
|
|
+ 'updTime')
|
|
|
+ for index, content in enumerate(third_header):
|
|
|
+ wt_sheet.write(row_start, index, content)
|
|
|
+ row_start += 1
|
|
|
+ for item in diff_order_qs:
|
|
|
+ values_list = item.values()
|
|
|
+ for col, content in enumerate(values_list):
|
|
|
+ if col == 0:
|
|
|
+ wt_sheet.write(row_start, col, '否')
|
|
|
+ if col == 7:
|
|
|
+ content = 'PayPal'
|
|
|
+ if col == 9:
|
|
|
+ if content == 1:
|
|
|
+ content = '支付成功'
|
|
|
+ elif content == 5:
|
|
|
+ content = '全额退款'
|
|
|
+ elif content == 6:
|
|
|
+ content = '部分退款'
|
|
|
+ if col in [11, 12]:
|
|
|
+ content = CommonService.timestamp_to_str(int(content))
|
|
|
+ wt_sheet.write(row_start, col + 1, content)
|
|
|
+ row_start += 1
|
|
|
+ wt_sheet.write(1, 7, paypal_money)
|
|
|
+
|
|
|
res = HttpResponse(content_type='application/vnd.ms-excel')
|
|
|
res['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path(file.name))
|
|
|
wt_book.save(res)
|