多线程开发
2019-06-17 本文已影响0人
一杯海风_3163
# -*- coding: utf-8 -*-
import sys
import datetime
import xlsxwriter, os
import requests
from PIL import Image
from odoo.exceptions import UserError
from odoo import _
import threadpool,threading
import QimenCloud.top.api
import StringIO
from openpyxl import Workbook # 写入xlsx文件
import xlwt
import logging
from tools.com_cache import cache
_logger = logging.getLogger(__name__)
reload(sys)
sys.setdefaultencoding('utf8')
import json
import pika
import platform
from odoo import models, fields, api
import base64,urllib2
import logging
_logger = logging.getLogger(__name__)
# 多线程函数导出销售额模板,并写入到excel文件,保存到数据库
def import_out_sell_amout(self, sell_order_list, booksheet, pool_lock):
with api.Environment.manage():
new_cr = self.pool.cursor()
self = self.with_env(self.env(cr=new_cr))
# todo:导出销售额模板函数
if not sell_order_list:
return None
sell_order_list = '('+str(sell_order_list).strip()[1:-1]+')'
result = []
# 拆分行
self.env.cr.execute('''
SELECT site.name AS site_name,
so.name AS order_name,
so.tracking_number AS tracking_number,
so.send_time AS send_time,
so.backtrack_time AS backtrack_time,
so.amount AS amount,
store.name AS store_name,
so.site_order_id AS site_order_id,
so.transaction_id AS transaction_id,
country.cn_name AS country_name,
address.city,
address.state,
goods.name AS goods_name,
shipping.name AS shipping_name,
warehouse.name AS warehouse_name,
CASE WHEN shipping_rule.is_supplier_out is true THEN wh1.name ELSE warehouse.name END as warehouse_supplier_name,
so.created_at AS created_at,
split.quantity AS quantity,
so.flow_state AS flow_state
FROM sell_order so
LEFT JOIN sell_order_line_split split ON split.sell_order_id=so.id
LEFT JOIN store ON store.id=so.store_id
LEFT JOIN store_site site ON site.id=so.store_site_id
LEFT JOIN partner_address address ON address.id=so.address_id
LEFT JOIN country ON country.id=address.country_id
LEFT JOIN goods ON goods.id=split.goods_id
LEFT JOIN shipping ON shipping.id=so.shipping_id
LEFT JOIN shipping_rule ON shipping_rule.id=so.shipping_rule_id
LEFT JOIN warehouse wh1 ON shipping_rule.warehouse_supplier=wh1.id
LEFT JOIN warehouse ON warehouse.id=so.warehouse_id
WHERE so.id in %s
''' % sell_order_list)
sell_order = self.env.cr.dictfetchall()
# 原始订单行
self.env.cr.execute('''SELECT site.name AS site_name,
so.name AS order_name,
so.tracking_number AS tracking_number,
so.send_time AS send_time,
so.backtrack_time AS backtrack_time,
so.amount AS amount,
store.name AS store_name,
so.site_order_id AS site_order_id,
so.transaction_id AS transaction_id,
country.cn_name AS country_name,
address.city ,
address.state ,
item.outside_sku AS goods_name,
shipping.name AS shipping_name,
CASE WHEN shipping_rule.is_supplier_out is true THEN wh1.name ELSE warehouse.name END as warehouse_supplier_name,
warehouse.name AS warehouse_name,
so.created_at AS created_at,
item.quantity AS quantity,
so.flow_state AS flow_state
FROM sell_order so
LEFT JOIN sell_order_item item ON item.sell_order_id=so.id
LEFT JOIN store ON store.id=so.store_id
LEFT JOIN store_site site ON site.id=so.store_site_id
LEFT JOIN partner_address address ON address.id=so.address_id
LEFT JOIN country ON country.id=address.country_id
LEFT JOIN shipping ON shipping.id=so.shipping_id
LEFT JOIN shipping_rule ON shipping_rule.id=so.shipping_rule_id
LEFT JOIN warehouse wh1 ON shipping_rule.warehouse_supplier=wh1.id
LEFT JOIN warehouse ON warehouse.id=so.warehouse_id
WHERE so.id in %s AND item.is_compared is FALSE
''' % sell_order_list)
sell_order2 = self.env.cr.dictfetchall()
names_list=[]
for record in sell_order+sell_order2:
flow_state=FLOW_STATES[record['flow_state']]
if record['order_name'] not in names_list:
result.append([record['site_name'], # 销售渠道
record['store_name'], # 销售账号
record['site_order_id'], #平台原有订单ID
record['transaction_id'], # 交易ID
record['country_name'], # 国家中文
record['state'],
record['city'],
record['goods_name'], # 物品SKU
record['quantity'], # 数量
record['amount'], # 订单金额
record['shipping_name'], # 快递方式
record['tracking_number'], # 快递单号
record['send_time'], # 发货时间
record['backtrack_time'], # 回传运单时间
flow_state, # 订单状态
record['order_name'],# 单据编号
record['warehouse_name'],# 分子仓库
record['warehouse_supplier_name'],#调出仓库
record['created_at'],#下单时间
])
names_list.append(record['order_name'])
else:
result.append([None, # 销售渠道
record['store_name'], # 销售账号
record['site_order_id'], # 平台原有订单ID
record['transaction_id'], # 交易ID
record['country_name'], # 国家中文
record['state'], # 国家中文
record['city'], # 国家中文
record['goods_name'], # 物品SKU
record['quantity'], # 数量
None, # 订单金额
record['shipping_name'], # 快递方式
record['tracking_number'], # 快递单号
None, # 发货时间
None, # 回传运单时间
flow_state, # 订单状态
None, # 单据编号
record['warehouse_name'], # 分子仓库
record['warehouse_supplier_name'], # 调出仓库
record['created_at'], # 下单时间
])
pool_lock.acquire() # 开启排它锁
for record in result:
booksheet.append(record)
new_cr.commit()
new_cr.close()
pool_lock.release() # 释放排它锁
return booksheet
# 导出销售额模板
def import_sell_number(self, active_ids, context):
'''
xls 最大行数为65536
xlsx最大行数为1048576
:param active_ids:
:param context:
:return:
'''
start = datetime.datetime.now()
datas = [u'销售渠道', u'销售账号',u'平台原有订单ID',u'交易ID', u'国家中文',u'州',u'城市', u'物品SKU', u'数量', u'订单金额', u'快递方式', u'快递单号'
, u'发货时间', u'回传运单时间', u'订单状态', u'单据编号',u'分子仓库',u'调出仓库',u'下单时间']
workbook = Workbook()
booksheet = workbook.active # 获取当前活跃的sheet,默认是sheet1
filename=(u'导出销售额模板.xlsx')
# 存第一行单元格cell(1,1)
index = 1
for data in datas:
booksheet.cell(1,index).value=data
index += 1
sell_order_list=[]
# 判断导出数量
_domain = [('flow_state', 'in', ['start', 'paypal_valited','sell_order_done','packing','packed', 'sended','out_stock','return','received','canceled','completed','copy_invalid'])]
if len(context['active_ids']) == 80:
active_domain = self._context.get('active_domain', [])
if active_domain:
_domain.extend(active_domain)
else:
_domain.append(('id', 'in', context['active_ids']))
else:
_domain.append(('id', 'in', context['active_ids']))
sell_order_list = self.env['sell.order'].search(_domain, order='date')
func_vars = [] # 线程函数体
pool_lock = threading.Lock()
if len(sell_order_list) > 18000:
raise UserError(u'导出条数不能超过18000条!')
order_total = int(len(sell_order_list) / 1200) + 1 if (len(sell_order_list) % 1200) > 0 else int(len(sell_order_list) / 1200)
order_index = 0
while order_index < order_total:
tmp_order_list=sell_order_list[order_index*1200:(order_index+1)*1200]
if len(tmp_order_list) > 0:
tthread = threading.Timer(2, self.import_out_sell_amout,([order.id for order in tmp_order_list],booksheet,pool_lock))
tthread.start()
func_vars.append(tthread)
order_index += 1
for th in func_vars:
threading.Thread.join(th)
start2 = datetime.datetime.now()
workbook.save(filename)
fp = StringIO.StringIO()
workbook.save(fp)
export_id = self.env['download.excel'].create({
'excel_file': base64.encodestring(fp.getvalue()),
'file_name': filename
})
fp.close()
context['action'] = {
'view_mode': 'form',
'res_id': export_id.id,
'res_model': 'download.excel',
'view_type': 'form',
'type': 'ir.actions.act_window',
'context': self._context,
'target': 'new',
}