Jelajahi Sumber

对账导出第一和第三部分数据

peng 2 tahun lalu
induk
melakukan
5381d82872
1 mengubah file dengan 86 tambahan dan 10 penghapusan
  1. 86 10
      AdminController/ServeManagementController.py

+ 86 - 10
AdminController/ServeManagementController.py

@@ -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)