多线程开发

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',
        }

上一篇 下一篇

猜你喜欢

热点阅读