提交 05d10437 authored 作者: 伍姿英's avatar 伍姿英

Merge branch 'release/V2.6.0'

...@@ -24,8 +24,8 @@ ...@@ -24,8 +24,8 @@
'wizard/add_exception_info_wizard_views.xml', 'wizard/add_exception_info_wizard_views.xml',
'wizard/email_template.xml', 'wizard/email_template.xml',
'data/data.xml', 'data/data.xml',
'data/timer.xml',
'data/sequence.xml', 'data/sequence.xml',
'views/menu_view.xml',
'views/cc_clearance_file_view.xml', 'views/cc_clearance_file_view.xml',
'views/cc_node_view.xml', 'views/cc_node_view.xml',
'views/cc_last_mile_provider_views.xml', 'views/cc_last_mile_provider_views.xml',
...@@ -37,6 +37,12 @@ ...@@ -37,6 +37,12 @@
'views/cc_node_exception_reason_view.xml', 'views/cc_node_exception_reason_view.xml',
'views/cc_bl_view.xml', 'views/cc_bl_view.xml',
'views/res_config_setting.xml', 'views/res_config_setting.xml',
'views/cc_history_big_package_view.xml',
'views/cc_history_package_good_view.xml',
'views/cc_history_ship_package_view.xml',
'views/cc_history_package_sync_log_view.xml',
'views/history_tt_api_log.xml',
'views/menu_view.xml',
# 'views/cc_customers_declaration_order_view.xml', # 'views/cc_customers_declaration_order_view.xml',
'templates/login.xml', 'templates/login.xml',
], ],
......
...@@ -31,7 +31,7 @@ class ExportBlAndPackageXlsx(http.Controller): ...@@ -31,7 +31,7 @@ class ExportBlAndPackageXlsx(http.Controller):
if good_ids: if good_ids:
for good_item in good_ids: for good_item in good_ids:
good_index += 1 good_index += 1
sheet1.write(good_index, 0, package_item.logistic_order_no or '') # 物流订单号 CUSTOMS PROVIDER ORDER ID sheet1.write(good_index, 0, package_item.logistic_order_no or '') # 物流订单号 ITEM ID
sheet1.write(good_index, 1, package_item.big_package_id.big_package_no or '') # 小包商品对应的大包号 BIG BAG NO sheet1.write(good_index, 1, package_item.big_package_id.big_package_no or '') # 小包商品对应的大包号 BIG BAG NO
sheet1.write(good_index, 2, package_item.tracking_no or '') # 小包追踪号 TRACKING NO sheet1.write(good_index, 2, package_item.tracking_no or '') # 小包追踪号 TRACKING NO
sheet1.write(good_index, 3, package_item.customer_ref or '') # CUSTOMER REF sheet1.write(good_index, 3, package_item.customer_ref or '') # CUSTOMER REF
...@@ -68,6 +68,10 @@ class ExportBlAndPackageXlsx(http.Controller): ...@@ -68,6 +68,10 @@ class ExportBlAndPackageXlsx(http.Controller):
sheet1.write(good_index, 34, '') # LENGTH sheet1.write(good_index, 34, '') # LENGTH
sheet1.write(good_index, 35, '') # WIDTH sheet1.write(good_index, 35, '') # WIDTH
sheet1.write(good_index, 36, '') # HEIGHT sheet1.write(good_index, 36, '') # HEIGHT
sheet1.write(good_index, 37, package_item.receiver_detailed_address or '') # Detailed Address
sheet1.write(good_index, 38, package_item.next_provider_name or '') # Last Mile Service Provider 关联的小包的下一个服务商名称
sheet1.write(good_index, 39, sum(package_item.good_ids.mapped('item_total_price'))) # GOODS VALUE 小包上的所有商品的货物总价之和
sheet1.write(good_index, 40, good_item.import_hs_code or '') # HSCODE IMPORT 取商品上的进口hscode
if good_index == int(parcel_export_num): if good_index == int(parcel_export_num):
num += 1 num += 1
sheet1 = self.get_package_title(worksheet, font_style, num) sheet1 = self.get_package_title(worksheet, font_style, num)
...@@ -80,10 +84,10 @@ class ExportBlAndPackageXlsx(http.Controller): ...@@ -80,10 +84,10 @@ class ExportBlAndPackageXlsx(http.Controller):
""" """
sheet1 = worksheet.add_sheet('Sheet(%s)' % num, cell_overwrite_ok=True) sheet1 = worksheet.add_sheet('Sheet(%s)' % num, cell_overwrite_ok=True)
index = 0 index = 0
for i in range(37): for i in range(41):
sheet1.col(i).width = 500 * 11 sheet1.col(i).width = 500 * 11
sheet1.col(8).width = 600 * 11 sheet1.col(8).width = 600 * 11
sheet1.write(index, 0, u'CUSTOMS PROVIDER ORDER ID', font_style) # CUSTOMS PROVIDER ORDER ID sheet1.write(index, 0, u'ITEM ID', font_style) # ITEM ID
sheet1.write(index, 1, u'BIG BAG NO', font_style) # BIG BAG NO sheet1.write(index, 1, u'BIG BAG NO', font_style) # BIG BAG NO
sheet1.write(index, 2, u'TRACKING NO', font_style) # TRACKING NO sheet1.write(index, 2, u'TRACKING NO', font_style) # TRACKING NO
sheet1.write(index, 3, u'CUSTOMER REF', font_style) # CUSTOMER REF sheet1.write(index, 3, u'CUSTOMER REF', font_style) # CUSTOMER REF
...@@ -120,6 +124,10 @@ class ExportBlAndPackageXlsx(http.Controller): ...@@ -120,6 +124,10 @@ class ExportBlAndPackageXlsx(http.Controller):
sheet1.write(index, 34, u'LENGTH', font_style) # LENGTH sheet1.write(index, 34, u'LENGTH', font_style) # LENGTH
sheet1.write(index, 35, u'WIDTH', font_style) # WIDTH sheet1.write(index, 35, u'WIDTH', font_style) # WIDTH
sheet1.write(index, 36, u'HEIGHT', font_style) # HEIGHT sheet1.write(index, 36, u'HEIGHT', font_style) # HEIGHT
sheet1.write(index, 37, u'Detailed Address', font_style) # Detailed Address
sheet1.write(index, 38, u'Last Mile Service Provider', font_style) # Last Mile Service Provider
sheet1.write(index, 39, u'GOODS VALUE', font_style) # GOODS VALUE
sheet1.write(index, 40, u'HSCODE IMPORT', font_style) # HSCODE IMPORT
return sheet1 return sheet1
# 运单导出包裹清关数据 每个运单导出一个文件 生成压缩包 # 运单导出包裹清关数据 每个运单导出一个文件 生成压缩包
......
<odoo>
<data>
<record id="cron_update_history_data" model="ir.cron">
<field name="name">同步历史数据</field>
<field name="model_id" ref="ccs_base.model_cc_bl"/>
<field name="state">code</field>
<field name="code">model.cron_update_history_data()</field>
<field name='interval_number'>1</field>
<field name='interval_type'>days</field>
<field name="numbercall">-1</field>
<field name="active" eval="False"/>
</record>
</data>
</odoo>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -11,3 +11,8 @@ from . import mail_thread ...@@ -11,3 +11,8 @@ from . import mail_thread
from . import order_state_change_rule from . import order_state_change_rule
from . import res_config_setting from . import res_config_setting
from . import cc_history_big_package
from . import cc_history_package_good
from . import cc_history_ship_package
from . import cc_history_package_sync_log
from . import history_tt_api_log
# 导入odoo # 导入odoo
# 导入日志 # 导入日志
import logging import logging
from datetime import timedelta from datetime import timedelta, datetime
import json
import pytz import pytz
from odoo import models, fields, api, _ from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError from odoo.exceptions import UserError, ValidationError
...@@ -343,7 +343,8 @@ class CcShipPackage(models.Model): ...@@ -343,7 +343,8 @@ class CcShipPackage(models.Model):
receiver_email = fields.Char(string='Receiver EMAIL', index=True) receiver_email = fields.Char(string='Receiver EMAIL', index=True)
# 电话号码 # 电话号码
receiver_phone = fields.Char(string='Receiver PHONE', index=True) receiver_phone = fields.Char(string='Receiver PHONE', index=True)
#消费者地址
receiver_detailed_address = fields.Char(string='Detailed Address',index=True)
# 毛重 # 毛重
gross_weight = fields.Float(string='GROSS WEIGHT') gross_weight = fields.Float(string='GROSS WEIGHT')
# 重量单位 # 重量单位
...@@ -634,6 +635,21 @@ class CcBL(models.Model): ...@@ -634,6 +635,21 @@ class CcBL(models.Model):
item.big_package_ids.filtered( item.big_package_ids.filtered(
lambda package: package.tally_state == 'handover_completed' and not package.is_cancel)) lambda package: package.tally_state == 'handover_completed' and not package.is_cancel))
def cron_update_history_data(self):
history_days = self.env['ir.config_parameter'].sudo().get_param('history_days') or 180
history_limit = self.env['ir.config_parameter'].sudo().get_param('history_limit') or 50
origin_delete = self.env['ir.config_parameter'].sudo().get_param('origin_delete') or 1
history_limit_log = self.env['ir.config_parameter'].sudo().get_param('history_limit_log') or 5000
redis_conn = self.env['common.common'].sudo().get_redis()
vals = {
'history_days': history_days,
'history_limit': history_limit,
'origin_delete': origin_delete,
'history_limit_log': history_limit_log
}
redis_conn.lpush('history_data_list', json.dumps(vals))
is_history = fields.Boolean('历史单据', default=False)
# 提单号 # 提单号
bl_no = fields.Char(string='B/L No', index=True) bl_no = fields.Char(string='B/L No', index=True)
# 关务提单号 # 关务提单号
...@@ -758,195 +774,6 @@ class CcBL(models.Model): ...@@ -758,195 +774,6 @@ class CcBL(models.Model):
'context': {'active_id': self.ids, }, 'context': {'active_id': self.ids, },
} }
# # 添加报关单字段
# cdo_ids = fields.One2many('cc.customers.declaration.order', 'bl_id', string='Customers Declaration Order')
#
# # 添加报关单数量字段, 用于显示报关单数量, 根据cdo_ids计算
# cdo_total = fields.Integer(string='Customers Declaration Order Total', compute='_compute_cdo_total', store=True)
# 计算报关单数量
# @api.depends('cdo_ids')
# def _compute_cdo_total(self):
# for bl in self:
# bl.cdo_total = len(bl.cdo_ids)
# 增加提单显示相关报关单的方法
# def action_show_cdo(self):
# # 返回一个action,显示报关单
# return {
# 'name': 'Customers Declaration Order',
# 'type': 'ir.actions.act_window',
# 'res_model': 'cc.customers.declaration.order',
# 'view_mode': 'tree,form',
# 'domain': [('bl_id', '=', self.id)],
# }
# def process_excel(self):
#
# # 检查是否已经上传了BOM文件
# if not self.bl_file:
# raise UserError('请先上传BOM文件')
#
# # 清空BOM导入明细
# self.bl_line_ids.unlink()
#
# # BOM文件打开,并获得第一个sheet
# wb = xlrd.open_workbook(file_contents=base64.b64decode(self.bl_file))
# sheet = wb.sheet_by_index(0)
#
# # 读取第一行,并将第一行的内容作为第二个每列的值的key, 以便于后面的读取
# first_row = sheet.row_values(0)
# first_row_dict = {}
# for i in range(len(first_row)):
# first_row_dict[first_row[i].replace(' ', '')] = i
#
# # 从第二行开始读取数据
# number = 1
# bom_line_id = False
# level_list = None
# for i in range(1, sheet.nrows):
# row = sheet.row_values(i)
# # 读取每行的数据, 数据包括TRACKING NO. CUSTOMER REF Internal Account Number Sender NAME SHIPPER ADD 1 SHIPPER ADD 2 SHIPPER ADD 3 Sender CITY Ship State Sender POSTCODE Sender COUNTRY Receiver NAME Receiver ADD 1 Receiver ADD 2 Receiver ADD 3 Receiver CITY Receiver COUNTY Receiver POSTCODE RECEPIENT EMAIL PHONE NUMBER GROSS WEIGHT (KG) NET WEIGHT (KG) Currency SKU NUMBER ITEM DESCRIPTION ITEM HS CODE ITEM QUANTITY UNIT VALUE TOTAL VALUE VAT ONLINE SELLING PLACE PRODUCT LINK LENGTH WIDTH HEIGHT
# # 将读取的数据生成一个字典, keyBOM明细的字段, value为读取的数据
# try:
#
# if row[first_row_dict['TRACKINGNO.']] and row[first_row_dict['CUSTOMERREF']]:
# bom_import_dict = {}
# bom_import_dict['bl_id'] = self.id
#
# # 从Excel生成cc.ship.package的数据, excel的名字采用字段的string
# bom_import_dict['tracking_no'] = row[first_row_dict['TRACKINGNO.']] or ''
# bom_import_dict['customer_ref'] = row[first_row_dict['CUSTOMERREF']] or ''
# bom_import_dict['internal_account_number'] = row[first_row_dict['InternalAccountNumber']] or ''
# bom_import_dict['sender_name'] = row[first_row_dict['SenderNAME']] or ''
# bom_import_dict['shipper_add_1'] = row[first_row_dict['SHIPPERADD1']] or ''
# bom_import_dict['shipper_add_2'] = row[first_row_dict['SHIPPERADD2']] or ''
# bom_import_dict['shipper_add_3'] = row[first_row_dict['SHIPPERADD3']] or ''
# bom_import_dict['sender_city'] = row[first_row_dict['SenderCITY']] or ''
# bom_import_dict['ship_state'] = row[first_row_dict['ShipState']] or ''
# bom_import_dict['sender_postcode'] = row[first_row_dict['SenderPOSTCODE']] or ''
# bom_import_dict['sender_country'] = row[first_row_dict['SenderCOUNTRY']] or ''
# bom_import_dict['receiver_name'] = row[first_row_dict['ReceiverNAME']] or ''
# bom_import_dict['receiver_add_1'] = row[first_row_dict['ReceiverADD1']] or ''
# bom_import_dict['receiver_add_2'] = row[first_row_dict['ReceiverADD2']] or ''
# bom_import_dict['receiver_add_3'] = row[first_row_dict['ReceiverADD3']] or ''
# bom_import_dict['receiver_city'] = row[first_row_dict['ReceiverCITY']] or ''
# bom_import_dict['receiver_county'] = row[first_row_dict['ReceiverCOUNTY']] or ''
# bom_import_dict['receiver_postcode'] = row[first_row_dict['ReceiverPOSTCODE']] or ''
# bom_import_dict['recepient_email'] = row[first_row_dict['RECEPIENTEMAIL']] or ''
# bom_import_dict['phone_number'] = row[first_row_dict['PHONENUMBER']] or ''
# bom_import_dict['gross_weight'] = row[first_row_dict['GROSSWEIGHT(KG)']] or 0.0
# bom_import_dict['net_weight'] = row[first_row_dict['NETWEIGHT(KG)']] or 0.0
# bom_import_dict['currency'] = row[first_row_dict['Currency']] or ''
# bom_import_dict['sku_number'] = row[first_row_dict['SKUNUMBER']] or ''
# bom_import_dict['item_description'] = row[first_row_dict['ITEMDESCRIPTION']] or ''
# bom_import_dict['item_hs_code'] = row[first_row_dict['ITEMHSCODE']] or ''
# bom_import_dict['item_quantity'] = row[first_row_dict['ITEMQUANTITY']] or 0.0
# bom_import_dict['unit_value'] = row[first_row_dict['UNITVALUE']] or 0.0
# bom_import_dict['total_value'] = row[first_row_dict['TOTALVALUE']] or 0.0
# bom_import_dict['vat'] = row[first_row_dict['VAT']] or ''
# bom_import_dict['online_selling_place'] = row[first_row_dict['ONLINESELLINGPLACE']] or ''
# bom_import_dict['product_link'] = row[first_row_dict['PRODUCTLINK']] or ''
# bom_import_dict['length'] = row[first_row_dict['LENGTH']] or 0.0
# bom_import_dict['width'] = row[first_row_dict['WIDTH']] or 0.0
# bom_import_dict['height'] = row[first_row_dict['HEIGHT']] or 0.0
#
# # 创建cc.ship.package导入明细
# _logger.debug('cc.ship.package: %s' % bom_import_dict)
# bom_line_id = self.env['cc.ship.package'].create(bom_import_dict)
# number += 1
#
# except Exception as e:
# _logger.error(_('Failed to import package details in line %s: %s') % (i, e))
# wb.release_resources()
# raise UserError(_('Failed to import package details in line %s: %s') % (i, e))
#
# # 关闭文件
# wb.release_resources()
# 添加一个方法,根据bl_file字段,生成cc.ship.package数据
# def action_import_lines(self):
# self.process_excel()
# return self.action_show_lines()
#
# # 添加方法,根据bl_line_ids生成报关单, 相同email的生成一个报关单, 明细为不同的提单明细中的产品相关信息
# def action_generate_customs_declaration_order(self):
# # 删除原来的报关单
# self.cdo_ids.unlink()
#
# # 获取提单的所有明细
# bl_lines = self.bl_line_ids
# # 根据email分组, 生成报关单的字典List
# email_dict_list = {}
# for bl_line in bl_lines:
# cc_key = bl_line.receiver_name + bl_line.receiver_postcode + bl_line.receiver_add_1
# if cc_key in email_dict_list:
# email_dict_list[cc_key].append(bl_line)
# else:
# email_dict_list[cc_key] = [bl_line]
#
# # 生成报关单
# for cc_key in email_dict_list:
# # 在bl_lines中过滤出有相同email的明细
# email_lines = bl_lines.filtered(
# lambda line: line.receiver_name + line.receiver_postcode + line.receiver_add_1 == cc_key)
# # 生成报关单的数据
# cdo_dict = {
# 'bl_id': self.id,
# 'recepient_email': email_lines[0].recepient_email,
# 'phone_number': email_lines[0].phone_number,
# 'receiver_name': email_lines[0].receiver_name,
# 'receiver_add_1': email_lines[0].receiver_add_1,
# 'receiver_add_2': email_lines[0].receiver_add_2,
# 'receiver_add_3': email_lines[0].receiver_add_3,
# 'receiver_city': email_lines[0].receiver_city,
# 'receiver_county': email_lines[0].receiver_county_translate or email_lines[0].receiver_county,
# 'receiver_postcode': email_lines[0].receiver_postcode,
# 'sender_name': email_lines[0].sender_name,
# 'shipper_add_1': email_lines[0].shipper_add_1,
# 'shipper_add_2': email_lines[0].shipper_add_2,
# 'shipper_add_3': email_lines[0].shipper_add_3,
# 'sender_city': email_lines[0].sender_city,
# 'sender_country': email_lines[0].sender_country,
# 'sender_postcode': email_lines[0].sender_postcode,
# 'ship_state': email_lines[0].ship_state,
# 'internal_account_number': email_lines[0].internal_account_number,
# 'tracking_no': email_lines[0].tracking_no,
# 'customer_ref': email_lines[0].customer_ref,
# }
# # 根据email_lines生成报关单明细
# cdo_lines = []
# for email_line in email_lines:
# cdo_line_dict = {
# 'gross_weight': email_line.gross_weight,
# 'net_weight': email_line.net_weight,
# 'currency': email_line.currency,
# 'sku_number': email_line.sku_number,
# 'item_description': email_line.item_description_translate or email_line.item_description,
# 'item_hs_code': email_line.item_hs_code,
# 'item_quantity': email_line.item_quantity,
# 'unit_value': email_line.unit_value,
# 'total_value': email_line.total_value,
# 'vat': email_line.vat,
# 'online_selling_place': email_line.online_selling_place,
# 'product_link': email_line.product_link,
# 'length': email_line.length,
# 'width': email_line.width,
# 'height': email_line.height,
# }
# cdo_lines.append((0, 0, cdo_line_dict))
# cdo_dict['cdo_line_ids'] = cdo_lines
# # 创建报关单
# self.env['cc.customers.declaration.order'].create(cdo_dict)
# # 返回一个action,显示报关单
# return {
# 'name': 'Customers Declaration Order',
# 'type': 'ir.actions.act_window',
# 'res_model': 'cc.customers.declaration.order',
# 'view_mode': 'tree,form',
# 'domain': [('bl_id', '=', self.id)],
# }
# 添加计算方法,根据bl_line_ids计算bl_total_line,bl_total_qty,bl_total_amount # 添加计算方法,根据bl_line_ids计算bl_total_line,bl_total_qty,bl_total_amount
@api.depends('ship_package_ids', 'big_package_ids', 'good_ids', 'ship_package_ids.is_cancel', @api.depends('ship_package_ids', 'big_package_ids', 'good_ids', 'ship_package_ids.is_cancel',
'big_package_ids.is_cancel', 'good_ids.is_cancel', 'ship_package_ids.total_value') 'big_package_ids.is_cancel', 'good_ids.is_cancel', 'ship_package_ids.total_value')
......
# 导入odoo
# 导入日志
import logging
from datetime import timedelta
import pytz
from odoo import models, fields, api, _
from odoo.exceptions import UserError
# 获取日志
_logger = logging.getLogger(__name__)
# 创建一个大包业务对象,用来管理包裹的信息.包裹信息包括所属提单、大包号、下一阶段服务商名称、包裹明细
class CcHistoryBigPackage(models.Model):
# 模型名称
_name = 'cc.history.big.package' # 历史大包
_inherit = ['mail.thread', 'mail.activity.mixin']
# 模型描述
_description = 'Big Package'
_rec_name = 'big_package_no'
# 定义模型字段
origin_id = fields.Integer(string='原大包id')
# 所属提单
bl_id = fields.Many2one('cc.bl', string='Bill of Loading', index=True)
# 大包号
big_package_no = fields.Char(string='Big Package No.', index=True)
# 下一阶段服务商名称
next_provider_name = fields.Char(string='Next Provider Name')
# 小包 包裹明细
ship_package_ids = fields.One2many('cc.history.ship.package', 'big_package_id', string='Ship Packages')
# 商品明细
goods_ids = fields.One2many('cc.history.package.good', 'big_package_id', string='Goods')
# 增加包裹数量字段, 用于显示包裹数量, 根据big_package_line_ids计算
# ship_package_qty = fields.Integer(string='Package Qty', compute='_compute_big_package_qty', store=True)
ship_package_qty = fields.Integer(string='Package Qty')
# 商品纪录数
# goods_qty = fields.Integer(string='Package Qty', compute='_compute_big_package_qty', store=True)
goods_qty = fields.Integer(string='Package Qty')
# New fields: pallet_number (char type), pallet_usage_date
# 托盘号(char型),托盘使用日期
pallet_number = fields.Char(string='Pallet Number')
pallet_usage_date = fields.Date(string='Pallet Usage Date')
# 增加is_cancel字段, 用于标识大包是否取消, 来自提单的is_cancel字段
# is_cancel = fields.Boolean(string='Is Cancel', related='bl_id.is_cancel', store=True)
is_cancel = fields.Boolean(string='Is Cancel')
tally_state = fields.Selection([
('unprocessed_goods', 'Unprocessed goods'),
('checked_goods', 'Checked goods'),
('handover_completed', 'Handover Completed')
], default='unprocessed_goods', string='Tally Status', index=True) # 理货状态 未理货/已理货/尾程交接
tally_user_id = fields.Many2one('res.users', 'Tally User', index=True) # 理货人
tally_time = fields.Datetime('Tally Time') # 理货时间
delivery_user_id = fields.Many2one('res.users', string='Delivery User', index=True) # 尾程交货人
delivery_time = fields.Datetime(string='Delivery Time') # 尾程交货时间
exception_info_ids = fields.Many2many('cc.exception.info', 'history_bigpackage_exception_info_rel',
string='Exception Information')
def action_show_ship_package(self):
# 返回一个action,显示包裹
return {
'name': _('Ship Package'),
'type': 'ir.actions.act_window',
'res_model': 'cc.history.ship.package',
'view_mode': 'tree,form',
'domain': [('big_package_id', '=', self.id), ('is_cancel', '=', False)],
}
# 创建显示商品的action
def action_show_package_good(self):
# 返回一个action,显示商品
return {
'name': _('Goods'),
'type': 'ir.actions.act_window',
'res_model': 'cc.history.package.good',
'view_mode': 'tree,form',
'domain': [('big_package_id', '=', self.id), ('is_cancel', '=', False)],
}
# 导入odoo
# 导入日志
import logging
from datetime import timedelta
import pytz
from odoo import models, fields, api, _
from odoo.exceptions import UserError
# 获取日志
_logger = logging.getLogger(__name__)
class CcPackageGood(models.Model):
# 模型名称
_name = 'cc.history.package.good' # 历史小包商品
# 模型描述
_description = 'Package Good'
_rec_name = 'item_id'
# 定义模型字段
origin_id = fields.Integer(string='原小包商品id')
# 所属小包裹
bl_line_id = fields.Many2one('cc.history.ship.package', string='Ship Package', index=True)
# 所属大包
big_package_id = fields.Many2one('cc.history.big.package')
# 增加一个提单对象的字段, 用于显示提单号,根据bl_line_id的bl_id字段
bl_id = fields.Many2one('cc.bl')
# 按item_id,唯一
# _sql_constraints = [
# ('item_id_uniq', 'unique(item_id)', 'The Item ID must be unique.')
# ]
item_id = fields.Char(string='Item ID', index=True)
# SKU标识ID
sku_id = fields.Char(string='SKU ID', index=True)
# 商品中文名称
item_name_cn = fields.Char(string='Name CN', index=True)
# 商品英文名称
item_name_en = fields.Char(string='Name EN', index=True)
# 出口HSCode
export_hs_code = fields.Char(string='Export HSCode')
# 进口HSCode
import_hs_code = fields.Char(string='Import HSCode')
# 重量
weight = fields.Float(string='Weight')
# 数量
quantity = fields.Integer(string='Quantity')
# 数量单位
quantity_unit = fields.Char(string='Quantity Unit')
# 申报单价
declare_price = fields.Float(string='Declare Price')
# 运费
freight = fields.Float(string='Freight')
# COD金额
cod_amount = fields.Float(string='COD Amount')
# VAT税率
vat_rate = fields.Float(string='VAT Rate')
# 商品VAT
item_vat = fields.Float(string='Good VAT')
# 原产国
origin_country = fields.Char(string='Origin Country')
# 类型
item_type = fields.Selection(
[('gift', 'Gift'), ('normal', 'Normal'), ('sample', 'Sample'), ('return', 'Return')],
string='Good Type')
# 商品总价
item_total_price = fields.Float(string='Total Price')
# 商品链接
item_link = fields.Char(string='Link')
# 商品交税情况
item_tax_status = fields.Selection(
[('TTSTaxed', 'TTSTaxed'), ('Sentinel', 'Sentinel'), ('LSPTaxed', 'LSPTaxed'),
('SellerObligation', 'SellerObligation')],
string='Tax Status')
# 实缴代税总额
actual_tax = fields.Float(string='Actual Tax')
# 实缴关税税率
actual_tax_rate = fields.Float(string='Actual Tax Rate')
# 实缴关税币种
actual_tax_currency = fields.Char(string='Actual Tax Currency')
# 实缴增值税
actual_vat = fields.Float(string='Actual VAT')
# 实缴增值税税率
actual_vat_rate = fields.Float(string='Actual VAT Rate')
# 实缴GST
actual_gst = fields.Float(string='Actual GST')
# 实缴GST税率
actual_gst_rate = fields.Float(string='Actual GST Rate')
# 币种
currency_id = fields.Many2one('res.currency', string='Currency')
# 增加is_cancel字段, 用于标识是否取消, 来自小包的is_cancel字段
is_cancel = fields.Boolean(string='Is Cancel')
# 导入odoo
# 导入日志
import logging
from datetime import timedelta
import pytz
from odoo import models, fields, api, _
from odoo.exceptions import UserError
# 获取日志
_logger = logging.getLogger(__name__)
class CcHistoryPackageSyncLog(models.Model):
_name = 'cc.history.package.sync.log'
_description = 'CC Ship Package Sync Log'
package_id = fields.Many2one('cc.history.ship.package', 'Ship Package', required=True)
# 同步时间
sync_time = fields.Datetime('Sync Time', default=fields.Datetime.now)
# 增加接口客户
api_customer = fields.Char('Api Customer')
# 操作状态
process_code = fields.Char('TK Process Code')
# 操作时间
operate_time = fields.Datetime('Operate Time', default=fields.Datetime.now)
# 操作备注
operate_remark = fields.Text('Operate Remark')
# 同步操作人
operate_user = fields.Many2one('res.users', 'Operate User', default=lambda self: self.env.user)
# 导入odoo
# 导入日志
import logging
from datetime import timedelta
import pytz
from odoo import models, fields, api, _
from odoo.exceptions import UserError
# 获取日志
_logger = logging.getLogger(__name__)
class CcHistoryShipPackage(models.Model):
# 模型名称
_name = 'cc.history.ship.package' # 历史小包
# 模型描述
_description = 'Ship Package'
_rec_name = 'tracking_no'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'bl_id, big_package_id,tracking_no'
customer_id = fields.Many2one('res.partner', string='From Customer', index=True)
origin_id = fields.Integer(string='原小包id')
# 定义模型字段
# 提单号
bl_id = fields.Many2one('cc.bl', string='Bill of Loading', index=True)
# 大包号
big_package_id = fields.Many2one('cc.history.big.package', string='Big Package', index=True)
# 物流订单号
logistic_order_no = fields.Char(string='Logistic Order No', index=True)
# 按logistic_order_no,唯一
# _sql_constraints = [
# ('logistic_order_no_uniq', 'unique(logistic_order_no)', 'The Logistic Order No must be unique.')
# ]
# 运单号(面单号)
tracking_no = fields.Char(string='Tracking No', index=True) # 对应面单号
# 客户参考(申报订单号)
customer_ref = fields.Char(string='Customer Ref') # 对应申报订单号
# 内部账号
internal_account_number = fields.Char(string='Internal Account Number')
# 用户发货备注
user_track_note = fields.Char(string='User Tracking Note')
# 公司代码
company_code = fields.Char(string='Company Code')
# 交易单号
trade_no = fields.Char(string='Trade No')
# 大包号
big_package_no = fields.Char(string='Big Package No', index=True)
# 海运/铁路的集装箱号
container_no = fields.Char(string='Container No')
# 包裹售卖国家编码
buyer_region = fields.Char(string='Package Sell Country Code')
# 下一段服务商名称
next_provider_name = fields.Char(string='Next Provider Name')
# 发件人姓名
sender_name = fields.Char(string='Sender NAME')
# 发件人VAT税号/IOSS NO
sender_vat_no = fields.Char(string='Sender VAT')
# 发件人电话
sender_phone = fields.Char(string='Sender PHONE')
# 发件人地址1
sender_add_1 = fields.Char(string='Sender ADD 1')
# 发件人地址2
sender_add_2 = fields.Char(string='Sender ADD 2')
# 发件人地址3
sender_add_3 = fields.Char(string='Sender ADD 3')
# 发件人城市
sender_city = fields.Char(string='Sender CITY')
# 发件人州
sender_state = fields.Char(string='Sender State')
# 发件人邮编
sender_postcode = fields.Char(string='Sender POSTCODE')
# 发件人国家
sender_country = fields.Char(string='Sender COUNTRY')
# 收件人姓名
receiver_name = fields.Char(string='Receiver NAME', index=True)
# 收件人类型:公司/个人
receiver_type = fields.Selection([('company', 'Company'), ('individual', 'Individual')], string='Receiver TYPE')
# 收件人VAT税号/IOSS NO
receiver_vat_no = fields.Char(string='Receiver VAT')
# 收件人地址1
receiver_add_1 = fields.Char(string='Receiver ADD 1')
# 收件人地址2
receiver_add_2 = fields.Char(string='Receiver ADD 2')
# 收件人地址3
receiver_add_3 = fields.Char(string='Receiver ADD 3')
# 收件人城市
receiver_city = fields.Char(string='Receiver CITY')
# 收件人县
receiver_county = fields.Char(string='Receiver COUNTY')
receiver_county_translate = fields.Char(string='Receiver COUNTY(EN)')
# 收件人邮编
receiver_postcode = fields.Char(string='Receiver POSTCODE')
# 收件人邮件
receiver_email = fields.Char(string='Receiver EMAIL', index=True)
# 电话号码
receiver_phone = fields.Char(string='Receiver PHONE', index=True)
# 毛重
gross_weight = fields.Float(string='GROSS WEIGHT')
# 重量单位
weight_unit = fields.Char(string='Weight Unit')
# 货币
currency = fields.Char(string='Currency')
# 币种对象
currency_id = fields.Many2one('res.currency', string='Currency', index=True)
# 申报价格
total_value = fields.Float(string='Total Value')
# 运费
shipping_fee = fields.Float(string='Shipping_fee')
# 税的状态
tax_mark = fields.Selection(
[('TTSTaxed', 'TTSTaxed'), ('Sentinel', 'Sentinel'), ('LSPTaxed', 'LSPTaxed'),
('SellerObligation', 'SellerObligation')],
string='Tax Mark', index=True)
# 实际缴关税
actual_tax = fields.Float(string='Actual Tax')
# 实际缴VAT
actual_vat = fields.Float(string='Actual VAT')
# 实缴GST
actual_gst = fields.Float(string='Actual GST')
# 实际缴关税币种
actual_tax_currency = fields.Char(string='Actual Tax Currency')
# 币种
actual_currency_id = fields.Many2one('res.currency', string='Currency', index=True)
# 实际缴关税时间
actual_tax_date = fields.Char(string='Actual Tax Date')
# 实际缴关税时区
actual_tax_tz = fields.Char(string='Actual Tax Timezone')
# 商品明细
good_ids = fields.One2many('cc.history.package.good', 'bl_line_id', string='Goods')
# 是否取消
is_cancel = fields.Boolean(string='Is Cancel', default=False)
# 取消原因
cancel_reason = fields.Char(string='Cancel Reason')
# 发票附件
invoice_attachment_ids = fields.Many2many('ir.attachment', relation='history_package_invoice_attachment_rel',
string='Invoice Attachments')
# 进度状态, 包括已提货、 小包查验、海关放行、小包出库、小包入库、清关失败,包裹交接
state = fields.Many2one('cc.node', string='Progress state', domain="[('node_type', '=', 'package')]", index=True,
tracking=True,
default=lambda self: self.env['cc.node'].search(
[('node_type', '=', 'package'), ('is_default', '=', True)], limit=1))
node_exception_reason_id = fields.Many2one('cc.node.exception.reason', 'Exception Reason')
process_time = fields.Datetime('Process Time', index=True)
exception_info_ids = fields.Many2many('cc.exception.info', 'history_package_exception_info_rel',
string='Exception Information')
# 操作时间RFC3339格式
operation_time = fields.Char(string='Operation Time')
# 添加状态说明字段
state_explain = fields.Text('State Explain', help='State Explain')
is_sync = fields.Boolean('Is Sync', default=False, index=True)
tk_code = fields.Char(string='TK Code', help='TK Code')
# 增加同步日志纪录字段
sync_log_ids = fields.One2many('cc.history.package.sync.log', 'package_id', 'Sync Logs')
# 消费者地址
receiver_detailed_address = fields.Char(string='Detailed Address', index=True)
# -*- coding: utf-8 -*-
# Part of SmartGo. See LICENSE file for full copyright and licensing details.
from datetime import datetime
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError, Warning
import logging
_logger = logging.getLogger(__name__)
class HistoryTTErrorLog(models.Model):
_name = "history.tt.api.log"
_description = "tt推送日志"
_order = 'id desc'
big_bag_no = fields.Char('业务信息', index=True)
push_time = fields.Datetime('产生时间', index=True)
error_msg = fields.Char('失败原因')
success_bl = fields.Boolean('是否成功', default=False, index=True)
data_text = fields.Text('传输数据')
request_id = fields.Char('请求id', index=True)
source = fields.Selection([('推入', '推入'), ('推出', '推出')], string='类型', default='推入')
...@@ -69,3 +69,9 @@ access_cc_clearance_file_ccs_base.group_clearance_of_customs_manager,cc_clearanc ...@@ -69,3 +69,9 @@ access_cc_clearance_file_ccs_base.group_clearance_of_customs_manager,cc_clearanc
access_cc_clearance_file_ccs_base.group_clearance_of_customs_user,cc_clearance_file ccs_base.group_clearance_of_customs_user,ccs_base.model_cc_clearance_file,ccs_base.group_clearance_of_customs_user,1,0,0,0 access_cc_clearance_file_ccs_base.group_clearance_of_customs_user,cc_clearance_file ccs_base.group_clearance_of_customs_user,ccs_base.model_cc_clearance_file,ccs_base.group_clearance_of_customs_user,1,0,0,0
order_state_change_rule_group_user,order_state_change_rule_group_user,ccs_base.model_order_state_change_rule,base.group_user,1,1,1,1 order_state_change_rule_group_user,order_state_change_rule_group_user,ccs_base.model_order_state_change_rule,base.group_user,1,1,1,1
access_cc_history_big_package_base.group_user,cc_history_big_package base.group_user,ccs_base.model_cc_history_big_package,base.group_user,1,1,1,1
access_cc_history_package_good_base.group_user,cc_history_package_good base.group_user,ccs_base.model_cc_history_package_good,base.group_user,1,1,1,1
access_cc_history_ship_package_base.group_user,cc_history_ship_package base.group_user,ccs_base.model_cc_history_ship_package,base.group_user,1,1,1,1
access_cc_history_package_sync_log_base.group_user,cc_history_package_sync_log base.group_user,ccs_base.model_cc_history_package_sync_log,base.group_user,1,1,1,1
access_history_tt_api_log_base.group_user,history_tt_api_log base.group_user,ccs_base.model_history_tt_api_log,base.group_user,1,1,1,1
\ No newline at end of file
...@@ -106,7 +106,13 @@ ...@@ -106,7 +106,13 @@
</div> </div>
<widget name="web_ribbon" bg_color="bg-warning" title="Cancelled" <widget name="web_ribbon" bg_color="bg-warning" title="Cancelled"
attrs="{'invisible': [('is_cancel', '=', False)]}"/> attrs="{'invisible': [('is_cancel', '=', False)]}"/>
<br/>
<br/>
<br/>
<br/>
<widget name="web_ribbon" bg_color="bg-danger" title="历史提单"
attrs="{'invisible': [('is_history', '=', False)]}"/>
<field name="is_history" invisible="1"/>
<label for="bl_no"/> <label for="bl_no"/>
<h1> <h1>
<field name="bl_no" readonly="True"/> <field name="bl_no" readonly="True"/>
......
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record model="ir.ui.view" id="tree_cc_history_big_package_view">
<field name="name">tree.cc.history.big.package</field>
<field name="model">cc.history.big.package</field>
<field name="arch" type="xml">
<tree string="Big Package" decoration-warning="is_cancel==True">
<field optional="show" name="big_package_no" string="Big Package No."/>
<field optional="show" name="bl_id"/>
<field name="ship_package_qty" string="Packages Qty"/>
<field name="goods_qty" string="Goods Qty"/>
<field name="is_cancel" string="Cancelled"/>
<field name="pallet_number"/>
<field name="pallet_usage_date"/>
<field name="tally_state" optional="show"/>
<field name="tally_user_id" optional="show"/>
<field name="tally_time" optional="show"/>
<field name="delivery_user_id" optional="show"/>
<field name="delivery_time" optional="show"/>
<field optional="show" name="create_date"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="form_cc_history_big_package_view">
<field name="name">form.cc.history.big.package</field>
<field name="model">cc.history.big.package</field>
<field name="arch" type="xml">
<form string="Big Package">
<header>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_show_ship_package" type="object"
class="oe_stat_button" icon="fa-star">
<div class="o_stat_info">
<field name="ship_package_qty" class="o_stat_value"/>
<span class="o_stat_text">Ship Packages</span>
</div>
</button>
<button name="action_show_package_good" type="object"
class="oe_stat_button" icon="fa-star">
<div class="o_stat_info">
<field name="goods_qty" class="o_stat_value"/>
<span class="o_stat_text">Goods</span>
</div>
</button>
</div>
<widget name="web_ribbon" bg_color="bg-warning" title="Cancelled"
attrs="{'invisible': [('is_cancel', '=', False)]}"/>
<label for="big_package_no"/>
<h1>
<field name="big_package_no" readonly="True"/>
</h1>
<group>
<group>
<field name="big_package_no" string="Big Package No."/>
<field name="bl_id" string="Bill of Loading"/>
<field name="next_provider_name" string="Next Provider Name"/>
<field name="pallet_number" readonly="1"/>
<field name="pallet_usage_date" readonly="1"/>
<field name="exception_info_ids" readonly="1" widget="many2many_tags"/>
<field name="is_cancel" string="Cancelled"/>
<field name="tally_state" readonly="1"/>
<field name="tally_user_id" readonly="1" options="{'no_create':True}"/>
<field name="tally_time" readonly="1"/>
<field name="delivery_user_id" readonly="1" options="{'no_create':True}"/>
<field name="delivery_time" readonly="1"/>
</group>
<group>
<field name="ship_package_qty" string="Package Qty"/>
<field name="goods_qty" string="Goods Qty"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids" options="{'post_refresh': 'recipients'}"/>
</div>
</form>
</field>
</record>
<record model="ir.ui.view" id="search_cc_history_big_package_view">
<field name="name">search.cc.history.big.package</field>
<field name="model">cc.history.big.package</field>
<field name="arch" type="xml">
<search string="Big Package">
<field name="big_package_no" string="Search"
filter_domain="['|', ('big_package_no', 'ilike', self), ('bl_id', 'ilike', self)]"/>
<separator/>
<filter string="Today's big package"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))
, ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="today_ship"/>
<filter string="Yesterday's big package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=1), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"
name="yesterday_ship"/>
<filter string="Last 7 days big package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=7), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_7d"/>
<filter string="Last 10 days big package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=10), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_10d"/>
<filter string="This week big package" name="this_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<filter string="Last week big package" name="last_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-2,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<!-- <filter string="This month ship package"-->
<!-- domain="[('create_date', '>=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-01 00:00:00'))]"-->
<!-- name="this_month_ship"/>-->
<!-- <filter string=" Last month ship package"-->
<!-- domain="[('create_date','&lt;', (context_today().replace(day=1)).strftime('%Y-%m-%d 00:00:00')),('create_date','&gt;=',(context_today() -relativedelta(months=1)).replace(day=1).strftime('%Y-%m-%d 00:00:00'))]"-->
<!-- name="last_month_ship"/>-->
<filter string="Last 30 days big Package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=30), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_30d"/>
<separator/>
<field name="big_package_no" string="Big Package No."/>
<field name="bl_id" string="Bill of Loading"/>
<field name="next_provider_name" string="Next Provider Name"/>
<separator/>
<filter string="Unprocessed goods" name="filter_unprocessed_goods"
domain="[('tally_state', '=', 'unprocessed_goods')]"/>
<filter string="Checked goods" name="filter_checked_goods"
domain="[('tally_state', '=', 'checked_goods')]"/>
<filter string="Handover Completed" name="filter_handover_completed"
domain="[('tally_state', '=', 'handover_completed')]"/>
<separator/>
<group expand="0" string="Group By">
<filter domain="[]" name="groupby_bl_id" string="Bill of Loading" context="{'group_by': 'bl_id'}"/>
</group>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_cc_history_big_package">
<field name="name">History Big Package</field>
<field name="res_model">cc.history.big.package</field>
<field name="view_mode">tree,form,pivot,graph</field>
<field name="domain">[]</field>
<field name="context">{'search_default_last_30d':0}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
[History Big Package] Not yet! Click the Create button in the top left corner and the sofa is yours!
</p>
<p>
</p>
</field>
</record>
<!-- <record id="big_package_add_exception_info_server_action" model="ir.actions.server">-->
<!-- <field name="name">Batch Add Package Exception Information</field>-->
<!-- <field name="model_id" ref="model_cc_big_package"/>-->
<!-- <field name="binding_model_id" ref="model_cc_big_package"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="binding_view_types">list</field>-->
<!-- <field name="groups_id" eval="[(4, ref('ccs_base.group_clearance_of_customs_manager'))]"/>-->
<!-- <field name="code">-->
<!-- if records:-->
<!-- action = records.action_package_exception_info()-->
<!-- </field>-->
<!-- </record>-->
<!-- <record id="action_cc_big_package_server" model="ir.actions.server">-->
<!-- <field name="name">全部航班</field>-->
<!-- <field name="model_id" ref="model_cc_big_package"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">-->
<!-- action = model.action_cc_big_package()-->
<!-- </field>-->
<!-- </record>-->
<!-- <menuitem id="menu_cc_big_package" name="Big Package" action="action_cc_big_package_server" sequence="13"/>-->
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
# ---------- History Package Good ------------
<record model="ir.ui.view" id="tree_cc_history_package_good_view">
<field name="name">tree.cc.history.package.good</field>
<field name="model">cc.history.package.good</field>
<field name="arch" type="xml">
<tree string="Package Good" decoration-warning="is_cancel==True">
<!-- # decoration-muted="opening_debit == 0 and opening_credit == 0" 根据条件显示每行的颜色 muted-->
<field optional="hide" name="item_id"/>
<field optional="show" name="sku_id" string="SKU ID"/>
<field optional="show" name="item_name_en"/>
<field optional="show" name="item_name_cn"/>
<field optional="hide" name="item_type"/>
<field optional="hide" name="origin_country"/>
<field optional="hide" name="freight"/>
<field optional="hide" name="weight"/>
<field optional="hide" name="quantity_unit"/>
<field optional="hide" name="quantity"/>
<field optional="show" name="item_total_price"/>
<field optional="hide" name="item_link"/>
<field optional="hide" name="bl_id"/>
<field optional="hide" name="bl_line_id" string="Ship Package"/>
<field optional="hide" name="export_hs_code"/>
<field optional="hide" name="import_hs_code"/>
<field optional="hide" name="currency_id" string="Currency"/>
<field optional="hide" name="cod_amount" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field optional="show" name="declare_price" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field optional="show" name="item_vat" string="Item VAT" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field optional="show" name="vat_rate"/>
<field optional="hide" name="actual_tax_currency"/>
<field optional="show" name="actual_gst"/>
<field optional="hide" name="actual_gst_rate"/>
<field optional="show" name="actual_tax"/>
<field optional="hide" name="actual_tax_rate"/>
<field optional="show" name="actual_vat"/>
<field optional="hide" name="actual_vat_rate"/>
<field optional="show" name="item_tax_status"/>
<field optional="hide" name="is_cancel" string="Cancelled"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="form_cc_history_package_good_view">
<field name="name">form.cc.history.package.good</field>
<field name="model">cc.history.package.good</field>
<field name="arch" type="xml">
<form string="Package Good">
<header>
<field name="item_tax_status" widget="statusbar"/>
</header>
<sheet>
<widget name="web_ribbon" bg_color="bg-warning" title="Cancelled" attrs="{'invisible': [('is_cancel', '=', False)]}"/>
<label for="item_id"/>
<h1>
<field name="item_id"/>
</h1>
<group>
<field name="bl_id"/>
<field name="bl_line_id" string="Ship Package"/>
<field name="is_cancel" string="Is Cancel"/>
</group>
<group>
<group string="Base Info">
<field name="sku_id" string="SKU ID"/>
<field name="item_name_en"/>
<field name="item_name_cn"/>
<field name="item_type"/>
<field name="origin_country"/>
<field name="freight"/>
<field name="weight"/>
<field name="quantity_unit"/>
<field name="quantity"/>
<field name="item_total_price"/>
<field name="item_link"/>
</group>
<group string="CC Info">
<field name="export_hs_code"/>
<field name="import_hs_code"/>
<field name="currency_id" string="Currency"/>
<field name="cod_amount"/>
<field name="declare_price"/>
<field name="item_vat" string="Item VAT"/>
<field name="vat_rate"/>
<field name="actual_gst"/>
<field name="actual_gst_rate"/>
<field name="actual_tax"/>
<field name="actual_tax_currency"/>
<field name="actual_tax_rate"/>
<field name="actual_vat"/>
<field name="actual_vat_rate"/>
</group>
</group>
<notebook>
</notebook>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="search_cc_history_package_good_view">
<field name="name">search.cc.history.package.good</field>
<field name="model">cc.history.package.good</field>
<field name="arch" type="xml">
<search string="Package Good">
<field name="item_name_en" string="Search"
filter_domain="['|', ('item_id', 'ilike', self), '|', ('sku_id', 'ilike', self), '|', ('item_name_en', 'ilike', self), ('item_name_cn', 'ilike', self)]"/>
<separator/>
<field name="item_id"/>
<field name="sku_id" string="SKU ID"/>
<field name="item_name_en"/>
<field name="item_name_cn"/>
<field name="item_type"/>
<field name="origin_country"/>
<field name="freight"/>
<field name="weight"/>
<field name="quantity_unit"/>
<field name="quantity"/>
<field name="item_total_price"/>
<field name="item_link"/>
<field name="bl_id"/>
<field name="bl_line_id" string="Ship Package"/>
<field name="export_hs_code"/>
<field name="import_hs_code"/>
<field name="currency_id" string="Currency"/>
<field name="cod_amount"/>
<field name="declare_price"/>
<field name="item_vat" string="Item VAT"/>
<field name="vat_rate"/>
<field name="actual_gst"/>
<field name="actual_gst_rate"/>
<field name="actual_tax"/>
<field name="actual_tax_currency"/>
<field name="actual_tax_rate"/>
<field name="actual_vat"/>
<field name="actual_vat_rate"/>
<field name="item_tax_status"/>
<separator/>
<separator/>
<group expand="0" string="Group By">
<filter domain="[]" name="groupby_item_type" string="Good Type"
context="{'group_by': 'item_type'}"/>
<filter domain="[]" name="groupby_bl_id" string="Bill of Loading" context="{'group_by': 'bl_id'}"/>
<filter domain="[]" name="groupby_bl_line_id" string="Ship Package"
context="{'group_by': 'bl_line_id'}"/>
<filter domain="[]" name="groupby_currency_id" string="Currency"
context="{'group_by': 'currency_id'}"/>
<filter domain="[]" name="groupby_item_tax_status" string="Tax Status"
context="{'group_by': 'item_tax_status'}"/>
</group>
<searchpanel>
<field icon="fa-users" select="multi" name="item_type"/>
<field icon="fa-users" select="multi" name="item_tax_status"/>
</searchpanel>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_cc_history_package_good">
<field name="name">History Package Good</field>
<field name="res_model">cc.history.package.good</field>
<field name="view_mode">tree,form,pivot,graph</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
[History Package Good] Not yet! Click the Create button in the top left corner and the sofa is yours!
</p>
<p>
</p>
</field>
</record>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
# ---------- CC History Package Sync Log ------------
<record model="ir.ui.view" id="tree_cc_history_package_sync_log_view">
<field name="name">tree.cc.history.package.sync.log</field>
<field name="model">cc.history.package.sync.log</field>
<field name="arch" type="xml">
<tree string="CC History Package Sync Log">
<field optional="show" name="package_id"/>
<field optional="show" name="api_customer"/>
<field optional="show" name="process_code"/>
<field optional="show" name="operate_time"/>
<field optional="show" name="operate_user"/>
<field optional="show" name="sync_time"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="form_cc_history_package_sync_log_view">
<field name="name">form.cc.history.package.sync.log</field>
<field name="model">cc.history.package.sync.log</field>
<field name="arch" type="xml">
<form string="CC History Package Sync Log">
<sheet>
<group>
<group>
<field name="package_id"/>
<field name="api_customer"/>
<field name="process_code"/>
<field name="operate_time"/>
<field name="operate_user"/>
<field name="sync_time"/>
</group>
<group>
</group>
</group>
<notebook>
<page string="Operate Remark">
<field name="operate_remark"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="search_cc_history_package_sync_log_view">
<field name="name">search.cc.history.package.sync.log</field>
<field name="model">cc.history.package.sync.log</field>
<field name="arch" type="xml">
<search string="CC Ship Package Sync Log">
<field name="package_id"/>
<field name="api_customer"/>
<field name="process_code"/>
<field name="operate_time"/>
<field name="operate_user"/>
<field name="sync_time"/>
<separator/>
<filter name="filter_operate_time" string="Operate Time" date="operate_time"/>
<filter name="filter_sync_time" string="Sync Time" date="sync_time"/>
<separator/>
<group expand="0" string="Group By">
<filter domain="[]" name="groupby_package_id" string="Ship Package"
context="{'group_by': 'package_id'}"/>
<filter domain="[]" name="groupby_operate_user" string="Operate User"
context="{'group_by': 'operate_user'}"/>
</group>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_cc_history_package_sync_log">
<field name="name">CC History Package Sync Log</field>
<field name="res_model">cc.history.package.sync.log</field>
<field name="view_mode">tree</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
[CC History Package Sync Log] Not yet! Click the Create button in the top left corner and the sofa is yours!
</p>
<p>
</p>
</field>
</record>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record model="ir.ui.view" id="tree_cc_history_ship_package_view">
<field name="name">tree.cc.history.ship.package</field>
<field name="model">cc.history.ship.package</field>
<field name="arch" type="xml">
<tree string="Ship Package" decoration-warning="is_cancel==True">
<field optional="show" name="state" string="Progress" widget="badge" decoration-info="1 == 1"/>
<field name="is_sync" string="是否同步"/>
<field optional="show" name="process_time"/>
<field optional="show" name="tracking_no" string="Tracking No."/>
<field optional="show" name="trade_no"/>
<field optional="show" name="customer_id"/>
<field optional="hide" name="user_track_note"/>
<field optional="hide" name="container_no"/>
<field optional="hide" name="customer_ref"/>
<field optional="hide" name="company_code"/>
<field optional="hide" name="internal_account_number"/>
<field optional="hide" name="create_date"/>
<field optional="show" name="logistic_order_no"/>
<field optional="hide" name="buyer_region"/>
<field optional="show" name="big_package_no" string="Big Package No"/>
<field optional="hide" name="big_package_id" string="Big Package"/>
<field optional="show" name="bl_id" string="Bill of Loading"/>
<field optional="show" name="gross_weight"/>
<field optional="show" name="weight_unit"/>
<field optional="hide" name="currency_id" invisible="1"/>
<field optional="hide" name="currency"/>
<field optional="show" name="total_value" string="TOTAL VALUE" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<field optional="show" name="sender_country"/>
<field optional="hide" name="sender_city"/>
<field optional="hide" name="sender_state"/>
<field optional="show" name="sender_name"/>
<field optional="hide" name="sender_phone"/>
<field optional="hide" name="sender_postcode"/>
<field optional="hide" name="sender_vat_no"/>
<field optional="hide" name="sender_add_1"/>
<field optional="hide" name="sender_add_2"/>
<field optional="hide" name="sender_add_3"/>
<field optional="show" name="receiver_type"/>
<field optional="hide" name="receiver_vat_no"/>
<field optional="show" name="receiver_name"/>
<field optional="hide" name="receiver_phone"/>
<field optional="hide" name="receiver_email"/>
<field optional="hide" name="receiver_county"/>
<field optional="show" name="receiver_county_translate"/>
<field optional="hide" name="receiver_city"/>
<field optional="hide" name="receiver_postcode"/>
<field optional="hide" name="receiver_add_1"/>
<field optional="hide" name="receiver_add_2"/>
<field optional="hide" name="receiver_add_3"/>
<field optional="hide" name="actual_currency_id" invisible="1"/>
<field optional="show" name="actual_tax_currency" string="Actual Tax Currency"/>
<field optional="show" name="actual_gst" string="Actual GST" widget="monetary"
options="{'currency_field': 'actual_currency_id'}"/>
<field optional="show" name="actual_tax" string="Actual Tax" widget="monetary"
options="{'currency_field': 'actual_currency_id'}"/>
<field optional="hide" name="actual_tax_date" string="Actual Tax Date"/>
<field optional="show" name="actual_vat" string="Actual VAT" widget="monetary"
options="{'currency_field': 'actual_currency_id'}"/>
<field optional="show" name="actual_tax_tz" string="Actual Tax Timezone"/>
<field optional="show" name="is_cancel"/>
<field optional="hide" name="cancel_reason" string="Cancel Reason"/>
<field optional="hide" name="next_provider_name" string="Next Provider"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="form_cc_history_ship_package_view">
<field name="name">form.cc.history.ship.package</field>
<field name="model">cc.history.ship.package</field>
<field name="arch" type="xml">
<form string="Ship Package">
<header>
<field name="state" string="Progress Status" widget="statusbar"/>
</header>
<sheet>
<widget name="web_ribbon" bg_color="bg-warning" title="Cancelled"
attrs="{'invisible': [('is_cancel', '=', False)]}"/>
<label for="tracking_no"/>
<h1>
<field name="tracking_no" readonly="True"/>
</h1>
<group>
<field name="customer_id"/>
<field name="big_package_no" string="Big Package No" invisible="1"/>
<field name="big_package_id" string="Big Package"/>
<field name="bl_id" string="Bill of Loading"/>
<field name="next_provider_name" string="Next Provider Name"/>
<field name="exception_info_ids" readonly="1" widget="many2many_tags"/>
<field name="process_time" readonly="1"/>
</group>
<group>
<group string="base_info">
<field name="tracking_no" string="Tracking No."/>
<field name="trade_no"/>
<field name="user_track_note"/>
<field name="container_no"/>
<field name="customer_ref"/>
<field name="company_code" string="Company Code"/>
<field name="internal_account_number"/>
<field name="logistic_order_no"/>
<field name="buyer_region" string="Buyer Region"/>
<field name="node_exception_reason_id" readonly="1"
attrs="{'invisible':[('node_exception_reason_id','=',False)]}"/>
</group>
<group string="CC info">
<field name="gross_weight"/>
<field name="weight_unit"/>
<field name="currency_id" invisible="1"/>
<field name="currency"/>
<field name="total_value" string="TOTAL VALUE" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
<separator/>
<field name="actual_tax_currency" string="Actual Tax Currency"/>
<field name="actual_currency_id" invisible="1"/>
<field name="actual_gst" string="Actual GST" widget="monetary"
options="{'currency_field': 'actual_currency_id'}"/>
<field name="actual_tax" string="Actual Tax" widget="monetary"
options="{'currency_field': 'actual_currency_id'}"/>
<field name="actual_tax_date" string="Actual Tax Date"/>
<field name="actual_vat" string="Actual VAT" widget="monetary"
options="{'currency_field': 'actual_currency_id'}"/>
<field name="actual_tax_tz" string="Actual Tax Timezone"/>
</group>
</group>
<group>
</group>
<notebook>
<page string="Goods">
<field name="good_ids" string="Goods"/>
</page>
<page string="Invoice Attachments">
<field name="invoice_attachment_ids" string="Invoice Attachments"
widget="many2many_binary"/>
</page>
<page string="Sender Info">
<group>
<field name="sender_name" string="NAME"/>
<field name="sender_phone" string="PHONE"/>
<field name="sender_vat_no" string="VAT"/>
<field name="sender_postcode" string="POSTCODE"/>
<field name="sender_country" string="COUNTRY"/>
<field name="sender_state" string="State"/>
<field name="sender_city" string="CITY"/>
<field name="sender_add_1" string="ADD 1"/>
<field name="sender_add_2" string="ADD 2"/>
<field name="sender_add_3" string="ADD 3"/>
</group>
</page>
<page string="Receiver Info">
<group>
<field name="receiver_name" string="NAME"/>
<field name="receiver_phone" string="PHONE"/>
<field name="receiver_email" string="EMAIL"/>
<field name="receiver_type" string="TYPE"/>
<field name="receiver_vat_no" string="VAT"/>
<field name="receiver_county" string="COUNTY"/>
<field name="receiver_county_translate" string="COUNTY(EN)"/>
<field name="receiver_city" string="CITY"/>
<field name="receiver_postcode" string="POSTCODE"/>
<field name="receiver_add_1" string="ADD 1"/>
<field name="receiver_add_2" string="ADD 2"/>
<field name="receiver_add_3" string="ADD 3"/>
<field name="receiver_detailed_address"/>
</group>
</page>
<page string="Other">
<group>
<field name="is_cancel"/>
<field name="cancel_reason" string="Cancel Reason"/>
</group>
</page>
<page string="Sync Log">
<field name="sync_log_ids" widget="one2many_list"/>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids" options="{'post_refresh': 'recipients'}"/>
</div>
</form>
</field>
</record>
<record model="ir.ui.view" id="search_cc_history_ship_package_view">
<field name="name">search.cc.history.ship.package</field>
<field name="model">cc.history.ship.package</field>
<field name="arch" type="xml">
<search string="Ship Package">
<field name="tracking_no" string="Search"
filter_domain="['|', ('tracking_no', 'ilike', self), ('trade_no', 'ilike', self)]"/>
<separator/>
<filter string="Today's ship package"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))
, ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="today_ship"/>
<filter string="Yesterday's ship package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=1), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"
name="yesterday_ship"/>
<filter string="Last 7 days ship package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=7), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_7d"/>
<filter string="This week ship package" name="this_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<filter string="Last week ship package" name="last_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-2,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<!-- <filter string="This month ship package"-->
<!-- domain="[('create_date', '>=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-01 00:00:00'))]"-->
<!-- name="this_month_ship"/>-->
<!-- <filter string=" Last month ship package"-->
<!-- domain="[('create_date','&lt;', (context_today().replace(day=1)).strftime('%Y-%m-%d 00:00:00')),('create_date','&gt;=',(context_today() -relativedelta(months=1)).replace(day=1).strftime('%Y-%m-%d 00:00:00'))]"-->
<!-- name="last_month_ship"/>-->
<filter string="Last 30 days Ship Package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=30), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_30d"/>
<separator/>
<field name="tracking_no" string="Tracking No."/>
<field name="trade_no"/>
<field name="user_track_note"/>
<field name="container_no"/>
<field name="customer_ref"/>
<field name="company_code" string="Company Code"/>
<field name="internal_account_number"/>
<field name="logistic_order_no"/>
<field name="buyer_region"/>
<field name="big_package_no" string="Big Package No"/>
<field name="big_package_id" string="Big Package"/>
<field name="bl_id" string="Bill of Loading"/>
<field name="gross_weight"/>
<field name="weight_unit"/>
<field name="actual_currency_id"/>
<field name="currency_id"/>
<field name="currency"/>
<field name="total_value" string="TOTAL VALUE"/>
<field name="sender_city"/>
<field name="sender_country"/>
<field name="sender_name"/>
<field name="sender_phone" string="Sender PHONE"/>
<field name="sender_postcode"/>
<field name="sender_state"/>
<field name="sender_vat_no"/>
<field name="sender_add_1"/>
<field name="sender_add_2"/>
<field name="sender_add_3"/>
<field name="receiver_type"/>
<field name="receiver_vat_no"/>
<field name="receiver_name"/>
<field name="receiver_phone"/>
<field name="receiver_email"/>
<field name="receiver_city"/>
<field name="receiver_county"/>
<field name="receiver_county_translate"/>
<field name="receiver_postcode"/>
<field name="receiver_add_1"/>
<field name="receiver_add_2"/>
<field name="receiver_add_3"/>
<field name="receiver_detailed_address"/>
<field name="actual_tax_currency" string="Actual Tax Currency"/>
<field name="actual_gst" string="Actual GST"/>
<field name="actual_tax" string="Actual Tax"/>
<field name="actual_tax_date" string="Actual Tax Date"/>
<field name="actual_vat" string="Actual VAT"/>
<field name="actual_tax_tz" string="Actual Tax Timezone"/>
<field name="state" string="Progress Status"/>
<field name="is_cancel"/>
<field name="cancel_reason" string="Cancel Reason"/>
<field name="next_provider_name" string="Next Provider Name"/>
<separator/>
<filter name="filter_no_bl" string="No Bill of Loading" domain="[('bl_id','=',False)]"/>
<separator/>
<!-- # 增加包裹货值大于135英镑的筛选条件-->
<filter name="filter_value_gt_135" string="Value > 135" domain="[('total_value','>',135)]"/>
<separator/>
<filter name="filter_is_cancel" string="Is Cancelled" domain="[('is_cancel','=',True)]"/>
<filter name="filter_not_cancel" string="Not Show Cancelled" domain="[('is_cancel','=',False)]"/>
<separator/>
<group expand="0" string="Group By">
<filter domain="[]" name="groupby_customer_id" string="From Customer"
context="{'group_by': 'customer_id'}"/>
<filter domain="[]" name="groupby_big_package_id" string="Big Package"
context="{'group_by': 'big_package_id'}"/>
<filter domain="[]" name="groupby_bl_id" string="Bill of Loading" context="{'group_by': 'bl_id'}"/>
<filter domain="[]" name="groupby_actual_currency_id" string="Currency"
context="{'group_by': 'actual_currency_id'}"/>
<filter domain="[]" name="groupby_currency_id" string="Currency"
context="{'group_by': 'currency_id'}"/>
<filter domain="[]" name="groupby_receiver_type" string="Receiver TYPE"
context="{'group_by': 'receiver_type'}"/>
<filter domain="[]" name="groupby_state" string="Progress state"
context="{'group_by': 'state'}"/>
</group>
<searchpanel>
<field icon="fa-users" select="multi" name="receiver_type"/>
<field icon="fa-users" select="multi" name="state"/>
</searchpanel>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_cc_history_ship_package">
<field name="name">History Ship Package</field>
<field name="res_model">cc.history.ship.package</field>
<field name="view_mode">tree,form,search,pivot,graph</field>
<field name="domain">[]</field>
<field name="context">{'search_default_last_30d':0}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
[History Ship Package] Not yet! Click the Create button in the top left corner and the sofa is yours!
</p>
<p>
</p>
</field>
</record>
<!-- <record id="ship_package_add_exception_info_server_action" model="ir.actions.server">-->
<!-- <field name="name">Batch Add Package Exception Information</field>-->
<!-- <field name="model_id" ref="model_cc_ship_package"/>-->
<!-- <field name="binding_model_id" ref="model_cc_ship_package"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="binding_view_types">list</field>-->
<!-- <field name="groups_id" eval="[(4, ref('ccs_base.group_clearance_of_customs_manager'))]"/>-->
<!-- <field name="code">-->
<!-- if records:-->
<!-- action = records.action_package_exception_info()-->
<!-- </field>-->
<!-- </record>-->
</odoo>
\ No newline at end of file
...@@ -114,7 +114,7 @@ ...@@ -114,7 +114,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Package Good"> <search string="Package Good">
<field name="item_name_en" string="Search" <field name="item_name_en" string="Search"
filter_domain="['|', ('item_id', 'ilike', self)'|', ('sku_id', 'ilike', self)'|', ('item_name_en', 'ilike', self), ('item_name_cn', 'ilike', self)]"/> filter_domain="['|', ('item_id', 'ilike', self), '|', ('sku_id', 'ilike', self), '|', ('item_name_en', 'ilike', self), ('item_name_cn', 'ilike', self)]"/>
<separator/> <separator/>
<field name="item_id" string="Item ID"/> <field name="item_id" string="Item ID"/>
<field name="sku_id" string="SKU ID"/> <field name="sku_id" string="SKU ID"/>
......
...@@ -180,6 +180,7 @@ ...@@ -180,6 +180,7 @@
<field name="receiver_add_1" string="ADD 1"/> <field name="receiver_add_1" string="ADD 1"/>
<field name="receiver_add_2" string="ADD 2"/> <field name="receiver_add_2" string="ADD 2"/>
<field name="receiver_add_3" string="ADD 3"/> <field name="receiver_add_3" string="ADD 3"/>
<field name="receiver_detailed_address" string="Detailed Address"/>
</group> </group>
</page> </page>
<page string="Other"> <page string="Other">
......
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
# ---------- TIKTOK推送日志 ------------
<record model="ir.ui.view" id="tree_history_tt_api_log_view">
<field name="name">tree.history.tt.api.log</field>
<field name="model">history.tt.api.log</field>
<field name="arch" type="xml">
<tree string="TIKTOK推送日志">
<field name="source"/>
<field name="big_bag_no"/>
<field name="push_time"/>
<field name="error_msg"/>
<field name="success_bl"/>
<field name="request_id"/>
<field name="create_date" optional="hide"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="form_history_tt_api_log_view">
<field name="name">form.history.tt.api.log</field>
<field name="model">history.tt.api.log</field>
<field name="arch" type="xml">
<form string="TIKTOK推送日志">
<sheet>
<group>
<field name="source"/>
<field name="big_bag_no"/>
<field name="push_time"/>
<field name="error_msg"/>
<field name="success_bl"/>
<field name="request_id"/>
<field name="data_text"/>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="search_history_tt_api_log_view">
<field name="name">search.history.tt.api.log</field>
<field name="model">history.tt.api.log</field>
<field name="arch" type="xml">
<search string="TIKTOK推送日志">
<filter string="今日日志"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="create_date"/>
<filter string="昨日日志"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=1), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_24h"/>
<filter string="近7日日志"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=7), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_7d"/>
<filter string="本周日志" name="this_week_log"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<filter string="上周日志" name="last_week_log"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-2,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<!-- <filter string="本月日志" name="this_month_log"-->
<!-- domain="[('create_date','&gt;=', time.strftime('%Y-%m-1 00:00:00')),('create_date','&lt;',(context_today() + relativedelta(months=1)).strftime('%Y-%m-1 00:00:00'))]"/>-->
<!-- <filter string="上月日志" name="last_month_log"-->
<!-- domain="[('create_date','&lt;', time.strftime('%Y-%m-1 00:00:00')),('create_date','&gt;=',(context_today() - relativedelta(months=1)).strftime('%Y-%m-1 00:00:00'))]"/>-->
<filter string="近30日日志" name="last_30d"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=30), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<separator/>
<field name="big_bag_no"/>
<field name="data_text"/>
<separator/>
<filter name="filter_success_bl" string="成功" domain="[('success_bl','=',True)]"/>
<filter name="filter_not_success_bl" string="失败" domain="[('success_bl','=',False)]"/>
<separator/>
<group expand="0" string="分组">
<filter domain="[]" name="groupby_success_bl" string="是否成功"
context="{'group_by': 'success_bl'}"/>
<filter domain="[]" name="groupby_big_bag_no" string="业务信息"
context="{'group_by': 'big_bag_no'}"/>
<filter domain="[]" name="groupby_source" string="类型"
context="{'group_by': 'source'}"/>
</group>
<searchpanel>
<field icon="fa-users" select="multi" name="source"/>
</searchpanel>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_history_tt_api_log">
<field name="name">TIKTOK推送日志</field>
<field name="res_model">history.tt.api.log</field>
<field name="view_mode">tree,form,search</field>
<field name="domain">[]</field>
<field name="context">{'search_default_last_30d':0}</field>
</record>
</data>
</odoo>
\ No newline at end of file
...@@ -51,5 +51,17 @@ ...@@ -51,5 +51,17 @@
<menuitem sequence="20" name="Clearance Company" id="menu_cc_clearance_company" <menuitem sequence="20" name="Clearance Company" id="menu_cc_clearance_company"
action="action_cc_is_clearance_company" action="action_cc_is_clearance_company"
parent="menu_ccs_base_main"/> parent="menu_ccs_base_main"/>
<menuitem sequence="25" name="History Data" id="menu_cc_history_data"
/>
<menuitem parent="menu_cc_history_data" sequence="1" name="History Big Package" id="menu_cc_history_big_package" action="action_cc_history_big_package"/>
<menuitem parent="menu_cc_history_data" sequence="5" name="History Package Goods" id="menu_cc_history_package_good" action="action_cc_history_package_good"/>
<menuitem parent="menu_cc_history_data" sequence="3" name="History Ship Package" id="menu_cc_history_ship_package" action="action_cc_history_ship_package"/>
<menuitem parent="menu_cc_history_data" id="menu_history_flight_tt_api_log" name="TIKTOK推送日志" sequence="7" action="action_history_tt_api_log"/>
</data> </data>
</odoo> </odoo>
\ No newline at end of file
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
'security/security.xml', 'security/security.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
# data # data
# 'data/data.xml', 'data/data.xml',
# wizard # wizard
'wizard/batch_input_ship_package_statu_wizard.xml', 'wizard/batch_input_ship_package_statu_wizard.xml',
'wizard/update_bl_status_wizard.xml', 'wizard/update_bl_status_wizard.xml',
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import ast
import base64
import hashlib
from datetime import datetime
import functools import functools
import json import json
import re import logging
import time
from datetime import datetime
from datetime import timedelta
from odoo import http, fields from odoo import http, fields
from odoo.http import request from odoo.http import request
from odoo.tools.translate import _
import logging
import time
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
...@@ -30,15 +26,18 @@ def check_customer(func): ...@@ -30,15 +26,18 @@ def check_customer(func):
request_time = datetime.utcnow() request_time = datetime.utcnow()
current_timestamp = int(time.time()) current_timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S") res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(current_timestamp) res['requestID'] = request_time.strftime(
"%Y%m%d%H%M%S") + str(current_timestamp)
# 获取传输的值 # 获取传输的值
sign = kw['sign'] if kw.get('sign') else "" sign = kw['sign'] if kw.get('sign') else ""
param_json_str = kw['param_json'] if kw.get('param_json') else "{}" param_json_str = kw['param_json'] if kw.get('param_json') else "{}"
timestamp = kw['timestamp'] if kw.get('timestamp') else "" timestamp = kw['timestamp'] if kw.get('timestamp') else ""
version = kw['version'] if kw.get('version') else "" version = kw['version'] if kw.get('version') else ""
app_key = kw['app_key'] if kw.get('app_key') else "" app_key = kw['app_key'] if kw.get('app_key') else ""
app_secret = request.env["ir.config_parameter"].sudo().get_param('tt_app_secret') or '' app_secret = request.env["ir.config_parameter"].sudo(
customer_id = request.env["ir.config_parameter"].sudo().get_param('tt_customer_id') or False ).get_param('tt_app_secret') or ''
customer_id = request.env["ir.config_parameter"].sudo(
).get_param('tt_customer_id') or False
kw['customer_id'] = customer_id kw['customer_id'] = customer_id
_logger.info('request_data:%s' % kw) _logger.info('request_data:%s' % kw)
if kw.get('param_json'): if kw.get('param_json'):
...@@ -100,7 +99,8 @@ class TTApi(http.Controller): ...@@ -100,7 +99,8 @@ class TTApi(http.Controller):
request_time = datetime.utcnow() request_time = datetime.utcnow()
timestamp = int(time.time()) timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S") res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(timestamp) res['requestID'] = request_time.strftime(
"%Y%m%d%H%M%S") + str(timestamp)
logistic_order_no = '' logistic_order_no = ''
data_text = '' data_text = ''
try: try:
...@@ -113,43 +113,66 @@ class TTApi(http.Controller): ...@@ -113,43 +113,66 @@ class TTApi(http.Controller):
try: try:
# 根据物流订单号判断是否已存在,已存在的话就更新 # 根据物流订单号判断是否已存在,已存在的话就更新
logistic_order_no = package.get('provider_order_id') logistic_order_no = package.get('provider_order_id')
push_interval_15_days = request.env["ir.config_parameter"].sudo().get_param(
'tk_push_interval_15_days') or 15
# 当前时间-15天
date = fields.Datetime.now() - timedelta(days=int(push_interval_15_days))
ship_pachage_obj = request.env['cc.ship.package'].sudo().search( ship_pachage_obj = request.env['cc.ship.package'].sudo().search(
[('logistic_order_no', '=', logistic_order_no)]) [('logistic_order_no', '=', logistic_order_no), ('create_date', '>=', date)])
if (ship_pachage_obj and (not ship_pachage_obj.bl_id or if (ship_pachage_obj and (not ship_pachage_obj.bl_id or
ship_pachage_obj.bl_id.is_cancel)) or not ship_pachage_obj: ship_pachage_obj.bl_id.is_cancel)) or not ship_pachage_obj:
ship_package = dict(is_cancel=False, cancel_reason=False, ship_package = dict(is_cancel=False, cancel_reason=False,
logistic_order_no=package.get('provider_order_id'), logistic_order_no=package.get(
tracking_no=package.get('tracking_no'), 'provider_order_id'),
customer_ref=package.get('declaretion_bill_id'), tracking_no=package.get(
'tracking_no'),
customer_ref=package.get(
'declaretion_bill_id'),
internal_account_number="", internal_account_number="",
user_track_note=package.get('remark'), user_track_note=package.get(
company_code=package.get('entity_code'), 'remark'),
trade_no=package.get('order_no'), company_code=package.get(
'entity_code'),
trade_no=package.get(
'order_no'),
# 需要将时间搓转换为时间 # 需要将时间搓转换为时间
operation_time=fields.Datetime.from_string(datetime.fromtimestamp( operation_time=fields.Datetime.from_string(datetime.fromtimestamp(
int(package.get('operate_time')) / 1000).strftime( int(package.get('operate_time')) / 1000).strftime(
'%Y-%m-%d %H:%M:%S')), '%Y-%m-%d %H:%M:%S')),
big_package_no=package.get('big_bag_no'), big_package_no=package.get(
container_no=package.get('container_no'), 'big_bag_no'),
buyer_region=package.get('buyer_region'), container_no=package.get(
next_provider_name=package.get('next_provider_name'), 'container_no'),
sender_name=package.get('sender_info').get('name'), buyer_region=package.get(
sender_vat_no=package.get('sender_info').get('shipping_tax_id'), 'buyer_region'),
sender_phone=package.get('sender_info').get('phone'), next_provider_name=package.get(
'next_provider_name'),
sender_name=package.get(
'sender_info').get('name'),
sender_vat_no=package.get(
'sender_info').get('shipping_tax_id'),
sender_phone=package.get(
'sender_info').get('phone'),
sender_country=package.get('sender_info').get('address').get( sender_country=package.get('sender_info').get('address').get(
'address_l0'), 'address_l0'),
sender_state=package.get('sender_info').get('address').get( sender_state=package.get('sender_info').get('address').get(
'address_l1'), 'address_l1'),
sender_city=package.get('sender_info').get('address').get('address_l2'), sender_city=package.get('sender_info').get(
'address').get('address_l2'),
sender_add_1=package.get('sender_info').get('address').get( sender_add_1=package.get('sender_info').get('address').get(
'address_l3'), 'address_l3'),
sender_add_2=package.get('sender_info').get('address').get( sender_add_2=package.get('sender_info').get('address').get(
'address_l4'), 'address_l4'),
sender_add_3=package.get('sender_info').get('address').get('details'), sender_add_3=package.get('sender_info').get(
sender_postcode=package.get('sender_info').get('postcode'), 'address').get('details'),
receiver_name=package.get('receiver_info').get('name'), sender_postcode=package.get(
receiver_phone=package.get('receiver_info').get('phone'), 'sender_info').get('postcode'),
receiver_postcode=package.get('receiver_info').get('postcode'), receiver_name=package.get(
'receiver_info').get('name'),
receiver_phone=package.get(
'receiver_info').get('phone'),
receiver_postcode=package.get(
'receiver_info').get('postcode'),
receiver_add_1=package.get('receiver_info').get('address').get( receiver_add_1=package.get('receiver_info').get('address').get(
'address_l0'), 'address_l0'),
receiver_add_2=package.get('receiver_info').get('address').get( receiver_add_2=package.get('receiver_info').get('address').get(
...@@ -160,11 +183,18 @@ class TTApi(http.Controller): ...@@ -160,11 +183,18 @@ class TTApi(http.Controller):
'address_l3'), 'address_l3'),
receiver_county=package.get('receiver_info').get('address').get( receiver_county=package.get('receiver_info').get('address').get(
'address_l4'), 'address_l4'),
receiver_vat_no=package.get('receiver_info').get('tax_id'), receiver_detailed_address=package.get(
currency=package.get('currency'), 'receiver_info').get('address').get('details'),
gross_weight=package.get('package').get('real_weight'), receiver_vat_no=package.get(
weight_unit=package.get('package').get('weight_unit'), 'receiver_info').get('tax_id'),
total_value=package.get('value').get('goods_value'), currency=package.get(
'currency'),
gross_weight=package.get(
'package').get('real_weight'),
weight_unit=package.get(
'package').get('weight_unit'),
total_value=package.get(
'value').get('goods_value'),
customer_id=request.env["ir.config_parameter"].sudo().get_param( customer_id=request.env["ir.config_parameter"].sudo().get_param(
'tt_customer_id') or False) # 增加客户信息 'tt_customer_id') or False) # 增加客户信息
# 生成package good # 生成package good
...@@ -176,43 +206,63 @@ class TTApi(http.Controller): ...@@ -176,43 +206,63 @@ class TTApi(http.Controller):
if item_id not in good_id_arr: if item_id not in good_id_arr:
good_id_arr.append(item_id) good_id_arr.append(item_id)
package_good_obj = request.env['cc.package.good'].sudo().search( package_good_obj = request.env['cc.package.good'].sudo().search(
[('item_id', '=', item_id)]) [('item_id', '=', item_id), ('create_date', '>=', date)])
package_good = dict(item_id=item_id, package_good = dict(item_id=item_id,
sku_id=item.get('sku_id'), sku_id=item.get(
item_name_cn=item.get('product_name_cn'), 'sku_id'),
item_name_en=item.get('product_name'), item_name_cn=item.get(
export_hs_code=item.get('export_hscode'), 'product_name_cn'),
import_hs_code=item.get('import_hscode'), item_name_en=item.get(
weight=item.get('weight'), 'product_name'),
quantity=item.get('qty'), export_hs_code=item.get(
quantity_unit=item.get('unit'), 'export_hscode'),
declare_price=item.get('unit_price'), import_hs_code=item.get(
freight=item.get('shipping_fee'), 'import_hscode'),
cod_amount=item.get('cod_fee'), weight=item.get(
vat_rate=item.get('vat_rate'), 'weight'),
item_vat=item.get('vat_fee'), quantity=item.get(
origin_country=item.get('origin_country'), 'qty'),
item_type=item.get('item_type'), quantity_unit=item.get(
item_total_price=item.get('unit_price'), 'unit'),
item_link=item.get('item_url'), declare_price=item.get(
'unit_price'),
freight=item.get(
'shipping_fee'),
cod_amount=item.get(
'cod_fee'),
vat_rate=item.get(
'vat_rate'),
item_vat=item.get(
'vat_fee'),
origin_country=item.get(
'origin_country'),
item_type=item.get(
'item_type'),
item_total_price=item.get(
'unit_price'),
item_link=item.get(
'item_url'),
item_tax_status=item.get('tax_mark')) item_tax_status=item.get('tax_mark'))
# _logger.info('package_good:%s' % package_good) # _logger.info('package_good:%s' % package_good)
if package_good: if package_good:
package_vals.append((0, 0, package_good)) package_vals.append(
(0, 0, package_good))
# _logger.info('package_vals:%s' % package_vals) # _logger.info('package_vals:%s' % package_vals)
if package_vals and len(package_vals) > 0: if package_vals and len(package_vals) > 0:
ship_package['good_ids'] = package_vals ship_package['good_ids'] = package_vals
if not ship_pachage_obj: if not ship_pachage_obj:
# 用ship_package生成cc.ship.package # 用ship_package生成cc.ship.package
request.env['cc.ship.package'].sudo().create(ship_package) request.env['cc.ship.package'].sudo().create(
ship_package)
else: else:
good_ids = ship_pachage_obj.good_ids good_ids = ship_pachage_obj.good_ids
where_sql = "" if len(good_ids) <= 0 else ( where_sql = "" if len(good_ids) <= 0 else (
"where id=%s" % good_ids[0].id if len( "where id=%s" % good_ids[0].id if len(
good_ids) == 1 else "where id in {0}".format(tuple( good_ids) == 1 else "where id in {0}".format(tuple(
good_ids.ids))) good_ids.ids)))
if where_sql and len(good_ids) > 0: if where_sql and len(good_ids) > 0:
good_del_sql = "delete from cc_package_good {0}".format(where_sql) good_del_sql = "delete from cc_package_good {0}".format(
where_sql)
request._cr.execute(good_del_sql) request._cr.execute(good_del_sql)
request._cr.commit() request._cr.commit()
# for good in ship_pachage_obj.good_ids: # for good in ship_pachage_obj.good_ids:
...@@ -224,9 +274,12 @@ class TTApi(http.Controller): ...@@ -224,9 +274,12 @@ class TTApi(http.Controller):
request._cr.commit() request._cr.commit()
except Exception as e_package: except Exception as e_package:
res['data']['all_result'] = False res['data']['all_result'] = False
res['data']['failed_provider_order_ids'].append(package.get('provider_order_id')) res['data']['failed_provider_order_ids'].append(
res['data']['err_msg'].update({package.get('provider_order_id'): str(e_package)}) package.get('provider_order_id'))
_logger.error('package_declare error:%s' % str(e_package)) res['data']['err_msg'].update(
{package.get('provider_order_id'): str(e_package)})
_logger.error('package_declare error:%s' %
str(e_package))
request._cr.rollback() request._cr.rollback()
except Exception as e: except Exception as e:
...@@ -252,7 +305,8 @@ class TTApi(http.Controller): ...@@ -252,7 +305,8 @@ class TTApi(http.Controller):
request_time = datetime.utcnow() request_time = datetime.utcnow()
timestamp = int(time.time()) timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S") res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(timestamp) res['requestID'] = request_time.strftime(
"%Y%m%d%H%M%S") + str(timestamp)
data_text = '' data_text = ''
master_waybill_no = '' master_waybill_no = ''
try: try:
...@@ -268,21 +322,32 @@ class TTApi(http.Controller): ...@@ -268,21 +322,32 @@ class TTApi(http.Controller):
customs_bl_no=kws.get('customs_waybill_id'), customs_bl_no=kws.get('customs_waybill_id'),
trade_type=kws.get('trade_type'), trade_type=kws.get('trade_type'),
big_package_qty=kws.get('big_bag_quantity'), big_package_qty=kws.get('big_bag_quantity'),
big_package_sell_country=kws.get('buyer_region'), big_package_sell_country=kws.get(
'buyer_region'),
declare_type=kws.get('declare_type'), declare_type=kws.get('declare_type'),
transport_tool_code=mawb_info.get('transport_code'), transport_tool_code=mawb_info.get(
transport_tool_name=mawb_info.get('transport_name'), 'transport_code'),
start_port_code=mawb_info.get('depart_port_code'), transport_tool_name=mawb_info.get(
'transport_name'),
start_port_code=mawb_info.get(
'depart_port_code'),
end_port_code=mawb_info.get('arrive_port_code'), end_port_code=mawb_info.get('arrive_port_code'),
billing_weight=mawb_info.get('chargable_weight'), billing_weight=mawb_info.get(
'chargable_weight'),
actual_weight=mawb_info.get('real_weight'), actual_weight=mawb_info.get('real_weight'),
etd=mawb_info.get('etd'), etd=mawb_info.get('etd'),
eta=mawb_info.get('eta'), eta=mawb_info.get('eta'),
customer_id=request.env["ir.config_parameter"].sudo().get_param( customer_id=request.env["ir.config_parameter"].sudo().get_param(
'tt_customer_id') or False) 'tt_customer_id') or False)
# 检查提单是否已经存在,且未被取消,如果存在则不再生成 # 检查提单是否已经存在,且未被取消,如果存在则不再生成
# 获取15天的系统参数
push_interval_15_days = request.env["ir.config_parameter"].sudo().get_param(
'tk_push_interval_15_days') or 15
# 当前时间-15天
date = fields.Datetime.now() - timedelta(days=int(push_interval_15_days))
bl = request.env['cc.bl'].sudo().search( bl = request.env['cc.bl'].sudo().search(
[('bl_no', '=', kws.get('master_waybill_no')), ('is_cancel', '=', False)], limit=1) [('bl_no', '=', kws.get('master_waybill_no')), ('is_cancel', '=', False),
('create_date', '>=', date)], limit=1)
declare_type = kws.get('declare_type') declare_type = kws.get('declare_type')
if declare_type: if declare_type:
declare_type = declare_type.lower() declare_type = declare_type.lower()
...@@ -300,7 +365,8 @@ class TTApi(http.Controller): ...@@ -300,7 +365,8 @@ class TTApi(http.Controller):
file_name_arr = ['主单', '货站提货POD', file_name_arr = ['主单', '货站提货POD',
'Manifest格式和数据(cvs/excel格式,系统目前不支持,线下提供或保留现有方式)', 'Manifest格式和数据(cvs/excel格式,系统目前不支持,线下提供或保留现有方式)',
'海关CDS申报单(import和授权方式检查拉齐等)', '尾程交接POD(待大包数量和箱号)'] '海关CDS申报单(import和授权方式检查拉齐等)', '尾程交接POD(待大包数量和箱号)']
request.env['cc.clearance.file'].sudo().create_clearance_file_func(file_name_arr, bl.id) request.env['cc.clearance.file'].sudo(
).create_clearance_file_func(file_name_arr, bl.id)
else: else:
if declare_type == 'update' and bl.state == 'draft': if declare_type == 'update' and bl.state == 'draft':
bl.write(bl_vals) bl.write(bl_vals)
...@@ -314,9 +380,10 @@ class TTApi(http.Controller): ...@@ -314,9 +380,10 @@ class TTApi(http.Controller):
where_sql = "" if len(big_package_ids) <= 0 else ( where_sql = "" if len(big_package_ids) <= 0 else (
"where id=%s" % big_package_ids[0].id if len( "where id=%s" % big_package_ids[0].id if len(
big_package_ids) == 1 else "where id in {0}".format(tuple( big_package_ids) == 1 else "where id in {0}".format(tuple(
big_package_ids.ids))) big_package_ids.ids)))
if where_sql and len(big_package_ids) > 0: if where_sql and len(big_package_ids) > 0:
del_sql = "delete from cc_big_package {0}".format(where_sql) del_sql = "delete from cc_big_package {0}".format(
where_sql)
request._cr.execute(del_sql) request._cr.execute(del_sql)
request._cr.commit() request._cr.commit()
# for package in bl.big_package_ids: # for package in bl.big_package_ids:
...@@ -330,20 +397,24 @@ class TTApi(http.Controller): ...@@ -330,20 +397,24 @@ class TTApi(http.Controller):
big_bag_no = big_bag.get('big_bag_no') big_bag_no = big_bag.get('big_bag_no')
# 检查big_bag_no是否已经存在 # 检查big_bag_no是否已经存在
big_package_vals = dict(bl_id=bl.id, big_package_vals = dict(bl_id=bl.id,
big_package_no=big_bag.get('big_bag_no'), big_package_no=big_bag.get(
'big_bag_no'),
next_provider_name=big_bag.get('next_provider_name')) next_provider_name=big_bag.get('next_provider_name'))
big_package = request.env['cc.big.package'].sudo().search( big_package = request.env['cc.big.package'].sudo().search(
[('big_package_no', '=', big_bag_no)], limit=1) [('big_package_no', '=', big_bag_no), ('create_date', '>=', date)], limit=1)
if not big_package: if not big_package:
big_package = request.env['cc.big.package'].sudo().create(big_package_vals) big_package = request.env['cc.big.package'].sudo().create(
big_package_vals)
else: else:
big_package.write(big_package_vals) big_package.write(big_package_vals)
# 生成cc.ship.package # 生成cc.ship.package
package_list = big_bag.get('package_list') # 大包下的小包 package_list = big_bag.get(
'package_list') # 大包下的小包
if package_list and len(package_list) > 0: if package_list and len(package_list) > 0:
package_ids = [package.get('provider_order_id') for package in package_list] package_ids = [package.get(
'provider_order_id') for package in package_list]
ship_packages = request.env['cc.ship.package'].sudo().search( ship_packages = request.env['cc.ship.package'].sudo().search(
[('logistic_order_no', 'in', package_ids)]) [('logistic_order_no', 'in', package_ids), ('create_date', '>=', date)])
if ship_packages and len(ship_packages) > 0: if ship_packages and len(ship_packages) > 0:
ship_packages.write( ship_packages.write(
{'is_cancel': False, 'cancel_reason': False, 'big_package_id': big_package.id, {'is_cancel': False, 'cancel_reason': False, 'big_package_id': big_package.id,
...@@ -356,7 +427,8 @@ class TTApi(http.Controller): ...@@ -356,7 +427,8 @@ class TTApi(http.Controller):
diff_ids = package_ids - ship_package_ids diff_ids = package_ids - ship_package_ids
_logger.info('diff_ids:%s' % diff_ids) _logger.info('diff_ids:%s' % diff_ids)
else: else:
res['msg'] = 'Big bag [%s] not include any package. ' % big_bag.get('big_bag_no') res['msg'] = 'Big bag [%s] not include any package. ' % big_bag.get(
'big_bag_no')
else: else:
res['msg'] = 'Big bag list is empty.' res['msg'] = 'Big bag list is empty.'
except Exception as e: except Exception as e:
...@@ -384,7 +456,8 @@ class TTApi(http.Controller): ...@@ -384,7 +456,8 @@ class TTApi(http.Controller):
request_time = datetime.utcnow() request_time = datetime.utcnow()
timestamp = int(time.time()) timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S") res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(timestamp) res['requestID'] = request_time.strftime(
"%Y%m%d%H%M%S") + str(timestamp)
master_waybill_no = '' master_waybill_no = ''
data_text = '' data_text = ''
try: try:
...@@ -400,7 +473,12 @@ class TTApi(http.Controller): ...@@ -400,7 +473,12 @@ class TTApi(http.Controller):
# "arrive_port_code": "LHR", # "arrive_port_code": "LHR",
# 根据kws中获取的master_waybill_no,在系统中查找提单,并将提单的信息更新 # 根据kws中获取的master_waybill_no,在系统中查找提单,并将提单的信息更新
master_waybill_no = kws.get('master_waybill_no') master_waybill_no = kws.get('master_waybill_no')
bl = request.env['cc.bl'].sudo().search([('bl_no', '=', master_waybill_no)], limit=1) push_interval_15_days = request.env["ir.config_parameter"].sudo().get_param(
'tk_push_interval_15_days') or 15
# 当前时间-15天
date = fields.Datetime.now() - timedelta(days=int(push_interval_15_days))
bl = request.env['cc.bl'].sudo().search(
[('bl_no', '=', master_waybill_no), ('create_date', '>=', date)], limit=1)
if bl: if bl:
# 根据kws中获取的"img_detail"中的"img_file_code”和img_file_type,生成odoo的附件,并关联到cc.bl的bl_attachment_ids字段 # 根据kws中获取的"img_detail"中的"img_file_code”和img_file_type,生成odoo的附件,并关联到cc.bl的bl_attachment_ids字段
...@@ -411,20 +489,23 @@ class TTApi(http.Controller): ...@@ -411,20 +489,23 @@ class TTApi(http.Controller):
img_file_code = kws.get('img_detail').get('img_file_code') img_file_code = kws.get('img_detail').get('img_file_code')
img_file_type = kws.get('img_detail').get('img_file_type') img_file_type = kws.get('img_detail').get('img_file_type')
file_name = '%s.%s' % (kws.get('master_waybill_no'), img_file_type) file_name = '%s.%s' % (
kws.get('master_waybill_no'), img_file_type)
img_file_vals = dict(name=file_name, img_file_vals = dict(name=file_name,
res_model='cc.bl', res_model='cc.bl',
res_id=bl.id, res_id=bl.id,
type='binary', type='binary',
datas=img_file_code, datas=img_file_code,
mimetype='image/%s' % img_file_type) mimetype='image/%s' % img_file_type)
img_file = request.env['ir.attachment'].sudo().create(img_file_vals) img_file = request.env['ir.attachment'].sudo().create(
img_file_vals)
if img_file: if img_file:
vals['bl_attachment_ids'] = [(6, 0, img_file.ids)] vals['bl_attachment_ids'] = [(6, 0, img_file.ids)]
bl.write(vals) bl.write(vals)
else: else:
res['code'] = 1009 res['code'] = 1009
res['msg'] = 'master_waybill_no [%s] not found.' % kws.get('master_waybill_no') res['msg'] = 'master_waybill_no [%s] not found.' % kws.get(
'master_waybill_no')
except Exception as e: except Exception as e:
res['code'] = 5000 res['code'] = 5000
...@@ -451,7 +532,8 @@ class TTApi(http.Controller): ...@@ -451,7 +532,8 @@ class TTApi(http.Controller):
request_time = datetime.utcnow() request_time = datetime.utcnow()
timestamp = int(time.time()) timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S") res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(timestamp) res['requestID'] = request_time.strftime(
"%Y%m%d%H%M%S") + str(timestamp)
logistic_order_no = '' logistic_order_no = ''
data_text = '' data_text = ''
try: try:
...@@ -465,19 +547,25 @@ class TTApi(http.Controller): ...@@ -465,19 +547,25 @@ class TTApi(http.Controller):
# "remark": "" # "remark": ""
# 根据kws中的provider_order_id和declaretion_bill_id,查找cc.ship.package,并将其置为取消状态, 将remark作为取消原因 # 根据kws中的provider_order_id和declaretion_bill_id,查找cc.ship.package,并将其置为取消状态, 将remark作为取消原因
logistic_order_no = kws.get('provider_order_id') logistic_order_no = kws.get('provider_order_id')
push_interval_15_days = request.env["ir.config_parameter"].sudo().get_param(
'tk_push_interval_15_days') or 15
# 当前时间-15天
date = fields.Datetime.now() - timedelta(days=int(push_interval_15_days))
ship_package = request.env['cc.ship.package'].sudo().search( ship_package = request.env['cc.ship.package'].sudo().search(
[('logistic_order_no', '=', logistic_order_no)], limit=1) [('logistic_order_no', '=', logistic_order_no), ('create_date', '>=', date)], limit=1)
if ship_package: if ship_package:
# 后续需要补充提单是否允许取消小包的逻辑的调用. # 后续需要补充提单是否允许取消小包的逻辑的调用.
allow_cancel, not_msg = ship_package.check_cancel() allow_cancel, not_msg = ship_package.check_cancel()
if allow_cancel: if allow_cancel:
ship_package.action_cancel(cancel_reason=kws.get('remark')) ship_package.action_cancel(
cancel_reason=kws.get('remark'))
else: else:
res['code'] = 1003103 res['code'] = 1003103
res['msg'] = not_msg res['msg'] = not_msg
else: else:
res['code'] = 101011 res['code'] = 101011
res['msg'] = 'provider_order_id [%s] not found.' % kws.get('provider_order_id') res['msg'] = 'provider_order_id [%s] not found.' % kws.get(
'provider_order_id')
except Exception as e: except Exception as e:
res['code'] = 5000 res['code'] = 5000
...@@ -504,7 +592,8 @@ class TTApi(http.Controller): ...@@ -504,7 +592,8 @@ class TTApi(http.Controller):
request_time = datetime.utcnow() request_time = datetime.utcnow()
timestamp = int(time.time()) timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S") res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(timestamp) res['requestID'] = request_time.strftime(
"%Y%m%d%H%M%S") + str(timestamp)
master_waybill_no = '' master_waybill_no = ''
data_text = '' data_text = ''
try: try:
...@@ -518,7 +607,12 @@ class TTApi(http.Controller): ...@@ -518,7 +607,12 @@ class TTApi(http.Controller):
# "remark": "" # "remark": ""
# 根据kws中的master_waybill_no和customs_waybill_id,查找cc.bl,并将其置为取消状态, 将remark作为取消原因 # 根据kws中的master_waybill_no和customs_waybill_id,查找cc.bl,并将其置为取消状态, 将remark作为取消原因
master_waybill_no = kws.get('master_waybill_no') master_waybill_no = kws.get('master_waybill_no')
bl = request.env['cc.bl'].sudo().search([('bl_no', '=', master_waybill_no)], limit=1) push_interval_15_days = request.env["ir.config_parameter"].sudo().get_param(
'tk_push_interval_15_days') or 15
# 当前时间-15天
date = fields.Datetime.now() - timedelta(days=int(push_interval_15_days))
bl = request.env['cc.bl'].sudo().search(
[('bl_no', '=', master_waybill_no), ('create_date', '>=', date)], limit=1)
if bl: if bl:
# 后续需要补充提单是否允许取消的逻辑的调用. # 后续需要补充提单是否允许取消的逻辑的调用.
can_cancel, not_msg = bl.check_cancel() can_cancel, not_msg = bl.check_cancel()
...@@ -530,8 +624,8 @@ class TTApi(http.Controller): ...@@ -530,8 +624,8 @@ class TTApi(http.Controller):
res['msg'] = not_msg res['msg'] = not_msg
else: else:
res['code'] = 101011 res['code'] = 101011
res['msg'] = 'master_waybill_no [%s] not found.' % kws.get('master_waybill_no') res['msg'] = 'master_waybill_no [%s] not found.' % kws.get(
'master_waybill_no')
except Exception as e: except Exception as e:
res['code'] = 5000 res['code'] = 5000
......
...@@ -2,6 +2,11 @@ ...@@ -2,6 +2,11 @@
<odoo> <odoo>
<data> <data>
<!-- 增加最近15天的系统参数 -->
<record id="tk_push_interval_15_days" model="ir.config_parameter">
<field name="key">tk_push_interval_15_days</field>
<field name="value">15</field>
</record>
</data> </data>
</odoo> </odoo>
\ No newline at end of file
...@@ -13,6 +13,14 @@ redis_options = dict( ...@@ -13,6 +13,14 @@ redis_options = dict(
db=0 db=0
) )
postgresql_options = dict(
host="127.0.0.1",
port=5431,
database="hh_ccs_test",
user="odoo14",
password="qq166349",
)
# 测试 # 测试
# db_ip = "121.199.167.133" # db_ip = "121.199.167.133"
# db_port = "8369" # db_port = "8369"
......
# coding=utf-8
import json
import logging
import psycopg2
import redis
from sqlalchemy import create_engine
import config
from datetime import timedelta, datetime
import pandas as pd
# from line_profiler import LineProfiler
# 创建一个 LineProfiler 实例
# profiler = LineProfiler()
# 设置文件字符为utf-8
logging.basicConfig(handlers=[logging.FileHandler('logs/history_data_logger.log', 'a', 'utf-8')],
format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
class Order_dispose(object):
def __init__(self):
print('new connection')
postgresql_options = config.postgresql_options
username = postgresql_options['user']
password = postgresql_options['password']
host = postgresql_options['host']
port = postgresql_options['port']
database = postgresql_options['database']
db_url = 'postgresql+psycopg2://{username}:{password}@{host}:{port}/{database}'.format(
username=username, password=password, host=host, port=port,
database=database)
self.conn_engine = create_engine(db_url)
self.pg_conn = psycopg2.connect(database=database, user=username,
password=password, host=host, port=port)
def get_init_data(self, days):
pg_conn = psycopg2.connect(**config.postgresql_options)
cursor = pg_conn.cursor()
db_handle = self.conn_engine
current_date = datetime.utcnow()
# 计算180天之前的日期
past_date = current_date - timedelta(days=days)
return pg_conn, cursor, db_handle, past_date
def history_big_package(self, db_handle, big_package_data):
"""
创建历史大包数据
:param db_handle:
:param big_package_data: 原大包数据
:return: 历史大包id
"""
# 创建历史大包数据
big_package_vals = {
'origin_id': big_package_data.id,
'bl_id': big_package_data.bl_id,
'big_package_no': big_package_data.big_package_no,
'next_provider_name': big_package_data.next_provider_name,
'ship_package_qty': big_package_data.ship_package_qty,
'goods_qty': big_package_data.goods_qty,
'pallet_number': big_package_data.pallet_number,
'pallet_usage_date': big_package_data.pallet_usage_date,
'is_cancel': big_package_data.is_cancel,
'tally_state': big_package_data.tally_state,
'tally_user_id': big_package_data.tally_user_id,
'tally_time': big_package_data.tally_time,
'delivery_user_id': big_package_data.delivery_user_id,
'delivery_time': big_package_data.delivery_time,
# 'exception_info_ids': big_package_data.id,
# exception_info_ids
# goods_ids
# ship_package_ids
}
val_df = pd.DataFrame(big_package_vals, index=[0])
val_df.to_sql('cc_history_big_package', con=db_handle, if_exists='append', index=False)
sql = "select id from cc_history_big_package where origin_id=%s;" % big_package_data.id
new_order = pd.read_sql(sql, con=db_handle)
# logging.info("new_order:%s" % len(new_order))
history_big_package_id = new_order.to_dict()['id'][0]
insert_sql = 'insert into history_bigpackage_exception_info_rel (cc_history_big_package_id, cc_exception_info_id) ' \
'select %s, cc_exception_info_id from bigpackage_exception_info_rel where ' \
'cc_big_package_id=%s;' % (history_big_package_id, big_package_data.id)
pd.read_sql(insert_sql, con=db_handle, chunksize=100)
return history_big_package_id
def history_ship_package(self, db_handle, big_id, ship_package_data):
"""
创建历史小包数据
:param db_handle:
:param ship_package_data: 原小包数据
:param big_id: 历史大包id
:return: 历史小包id
"""
# 创建历史小包数据
history_ship_package_vals = {
'customer_id': ship_package_data.customer_id,
'origin_id': ship_package_data.id,
'bl_id': ship_package_data.bl_id,
'big_package_id': big_id,
'logistic_order_no': ship_package_data.logistic_order_no,
'tracking_no': ship_package_data.tracking_no,
'customer_ref': ship_package_data.customer_ref,
'internal_account_number': ship_package_data.internal_account_number,
'user_track_note': ship_package_data.user_track_note,
'company_code': ship_package_data.company_code,
'trade_no': ship_package_data.trade_no,
'big_package_no': ship_package_data.big_package_no,
'container_no': ship_package_data.container_no,
'buyer_region': ship_package_data.buyer_region,
'next_provider_name': ship_package_data.next_provider_name,
'sender_name': ship_package_data.sender_name,
'sender_vat_no': ship_package_data.sender_vat_no,
'sender_phone': ship_package_data.sender_phone,
'sender_add_1': ship_package_data.sender_add_1,
'sender_add_2': ship_package_data.sender_add_2,
'sender_add_3': ship_package_data.sender_add_3,
'sender_city': ship_package_data.sender_city,
'sender_state': ship_package_data.sender_state,
'sender_postcode': ship_package_data.sender_postcode,
'sender_country': ship_package_data.sender_country,
'receiver_name': ship_package_data.receiver_name,
'receiver_type': ship_package_data.receiver_type,
'receiver_vat_no': ship_package_data.receiver_vat_no,
'receiver_add_1': ship_package_data.receiver_add_1,
'receiver_add_2': ship_package_data.receiver_add_2,
'receiver_add_3': ship_package_data.receiver_add_3,
'receiver_city': ship_package_data.receiver_city,
'receiver_county': ship_package_data.receiver_county,
'receiver_county_translate': ship_package_data.receiver_county_translate,
'receiver_postcode': ship_package_data.receiver_postcode,
'receiver_email': ship_package_data.receiver_email,
'receiver_phone': ship_package_data.receiver_phone,
'gross_weight': ship_package_data.gross_weight,
'weight_unit': ship_package_data.weight_unit,
'currency': ship_package_data.currency,
'currency_id': ship_package_data.currency_id,
'total_value': ship_package_data.total_value,
'shipping_fee': ship_package_data.shipping_fee,
'tax_mark': ship_package_data.tax_mark,
'actual_tax': ship_package_data.actual_tax,
'actual_vat': ship_package_data.actual_vat,
'actual_gst': ship_package_data.actual_gst,
'actual_tax_currency': ship_package_data.actual_tax_currency,
'actual_currency_id': ship_package_data.actual_currency_id,
'actual_tax_date': ship_package_data.actual_tax_date,
'actual_tax_tz': ship_package_data.actual_tax_tz,
'is_cancel': ship_package_data.is_cancel,
'state': ship_package_data.state,
'node_exception_reason_id': ship_package_data.node_exception_reason_id,
'process_time': ship_package_data.process_time,
'cancel_reason': ship_package_data.cancel_reason,
# 'exception_info_ids': ship_package_obj.exception_info_ids,ship_package_data.id
# 'invoice_attachment_ids': ship_package_obj.invoice_attachment_ids,ship_package_data.id
# exception_info_ids
# invoice_attachment_ids
# good_ids
# sync_log_ids
'operation_time': ship_package_data.operation_time,
'state_explain': ship_package_data.state_explain,
'is_sync': ship_package_data.is_sync,
'tk_code': ship_package_data.tk_code,
}
val_df = pd.DataFrame(history_ship_package_vals, index=[0])
val_df.to_sql('cc_history_ship_package', con=db_handle, if_exists='append', index=False)
sql = "select id from cc_history_ship_package where origin_id=%s;" % ship_package_data.id
new_order = pd.read_sql(sql, con=db_handle)
# logging.info("new_order:%s" % len(new_order))
history_ship_package_id = new_order.to_dict()['id'][0]
insert_sql = 'insert into history_package_exception_info_rel (cc_history_ship_package_id, cc_exception_info_id) ' \
'select %s, cc_exception_info_id from shippackage_exception_info_rel where ' \
'cc_ship_package_id=%s;' % (history_ship_package_id, ship_package_data.id)
pd.read_sql(insert_sql, con=db_handle, chunksize=100)
insert_sql = 'insert into history_package_invoice_attachment_rel (cc_history_ship_package_id, ir_attachment_id) ' \
'select %s, ir_attachment_id from ship_package_invoice_attachment_rel where ' \
'cc_ship_package_id=%s;' % (history_ship_package_id, ship_package_data.id)
pd.read_sql(insert_sql, con=db_handle, chunksize=100)
return history_ship_package_id
def history_sync_log(self, db_handle, history_ship_package_id, ship_package_id):
"""
创建历史小包日志
:param db_handle:
:param history_ship_package_id: 历史小包id
:param ship_package_id: 原来小包id
:return:
"""
sync_sql = "SELECT id, sync_time, api_customer, process_code, operate_time, operate_remark, operate_user FROM cc_ship_package_sync_log WHERE package_id = %s;"
sync_log_result_arr = pd.read_sql(sync_sql, con=db_handle, params=(ship_package_id,))
sync_log_vals_list = []
for sync_log_result in sync_log_result_arr.itertuples():
sync_log_data = sync_log_result
# 创建历史小包日志数据
sync_log_vals = {
'package_id': history_ship_package_id,
'sync_time': sync_log_data.sync_time,
'api_customer': sync_log_data.api_customer,
'process_code': sync_log_data.process_code,
'operate_time': sync_log_data.operate_time,
'operate_remark': sync_log_data.operate_remark,
'operate_user': sync_log_data.operate_user,
}
sync_log_vals_list.append(sync_log_vals)
if sync_log_vals_list:
val_df = pd.DataFrame(sync_log_vals_list)
val_df.to_sql('cc_history_package_sync_log', con=db_handle, if_exists='append', index=False)
origin_log_ids = sync_log_result_arr['id'].tolist()
return origin_log_ids
def history_package_goods(self, db_handle, ship_package_id, history_ship_package_id, big_id, select_bl_id):
"""
创建历史小包商品
:param db_handle:
:param ship_package_id: 原小包id
:param history_ship_package_id: 历史小包id
:param big_id: 历史大包id
:param select_bl_id: 原提单id
:return:
"""
# 商品
package_good_sql = """select id, bl_line_id, big_package_id, bl_id, item_id, sku_id,
item_name_cn, item_name_en, export_hs_code, import_hs_code, weight,
quantity, quantity_unit, declare_price, freight, cod_amount, vat_rate,
item_vat, origin_country, item_type, item_total_price, item_link,
item_tax_status, actual_tax, actual_tax_rate, actual_tax_currency,
actual_vat, actual_vat_rate, actual_gst, actual_gst_rate, currency_id,
is_cancel from cc_package_good where bl_line_id=%s;""" % ship_package_id
package_good_result_arr = pd.read_sql(package_good_sql, con=db_handle)
# origin_goods_ids = []
package_good_vals_list = []
for package_good_data in package_good_result_arr.itertuples():
# 创建历史小包商品数据
package_good_vals = {
'origin_id': package_good_data.id,
'bl_line_id': history_ship_package_id,
'big_package_id': big_id,
'bl_id': select_bl_id,
'item_id': package_good_data.item_id,
'sku_id': package_good_data.sku_id,
'item_name_cn': package_good_data.item_name_cn,
'item_name_en': package_good_data.item_name_en,
'export_hs_code': package_good_data.export_hs_code,
'import_hs_code': package_good_data.import_hs_code,
'weight': package_good_data.weight,
'quantity': package_good_data.quantity,
'quantity_unit': package_good_data.quantity_unit,
'declare_price': package_good_data.declare_price,
'freight': package_good_data.freight,
'cod_amount': package_good_data.cod_amount,
'vat_rate': package_good_data.vat_rate,
'item_vat': package_good_data.item_vat,
'origin_country': package_good_data.origin_country,
'item_type': package_good_data.item_type,
'item_total_price': package_good_data.item_total_price,
'item_link': package_good_data.item_link,
'item_tax_status': package_good_data.item_tax_status,
'actual_tax': package_good_data.actual_tax,
'actual_tax_rate': package_good_data.actual_tax_rate,
'actual_tax_currency': package_good_data.actual_tax_currency,
'actual_vat': package_good_data.actual_vat,
'actual_vat_rate': package_good_data.actual_vat_rate,
'actual_gst': package_good_data.actual_gst,
'actual_gst_rate': package_good_data.actual_gst_rate,
'currency_id': package_good_data.currency_id,
'is_cancel': package_good_data.is_cancel,
}
package_good_vals_list.append(package_good_vals)
if package_good_vals_list:
val_df = pd.DataFrame(package_good_vals_list, index=[0])
val_df.to_sql('cc_history_package_good', con=db_handle, if_exists='append', index=False)
origin_goods_ids = package_good_result_arr['id'].tolist()
return origin_goods_ids
def delete_origin_data(self):
pass
def history_ao_tt_log(self, db_handle, past_date, limit_log_num):
sql = 'select id,big_bag_no,push_time,error_msg,success_bl,data_text,request_id,source from ao_tt_api_log where create_date < %s order by create_date asc limit %s;'
log_result_arr = pd.read_sql(sql, con=db_handle, params=(past_date, int(limit_log_num)))
tk_log_vals_list = []
for tk_log_result in log_result_arr.itertuples():
tk_log_data = tk_log_result
# 创建历史tk日志数据
tk_log_vals = {
'big_bag_no': tk_log_data.big_bag_no,
'push_time': tk_log_data.push_time,
'error_msg': tk_log_data.error_msg,
'success_bl': tk_log_data.success_bl,
'data_text': tk_log_data.data_text,
'request_id': tk_log_data.request_id,
'source': tk_log_data.source,
}
tk_log_vals_list.append(tk_log_vals)
if tk_log_vals_list:
val_df = pd.DataFrame(tk_log_vals_list)
val_df.to_sql('history_tt_api_log', con=db_handle, if_exists='append', index=False)
origin_tk_log_ids = log_result_arr['id'].tolist()
return origin_tk_log_ids
# @profiler
"""
def order_data(self, data):
res_data = []
try:
data = json.loads(data)
days = int(data.get('history_days', 180)) # 默认180天之前的数据
origin_delete = int(data.get('origin_delete', 1)) # 默认删除原数据
limit_num = int(data.get('history_limit', 50)) # 默认一次同步50个提单
limit_log_num = int(data.get('history_limit_log', 5000)) # 默认一次同步5000条日志
pg_conn, cursor, db_handle, past_date = self.get_init_data(days)
logging.info(f'同步开始,时间:{past_date}')
# 获取历史提单
sql = 'select id,bl_no from cc_bl where (is_history=False or is_history is null) and create_date < %s order by create_date asc limit %s;'
result_arr = pd.read_sql(sql, con=db_handle, params=(past_date, int(limit_num)))
sql = 'select id,bl_no from cc_bl where id = 14;'
result_arr = pd.read_sql(sql, con=db_handle) # , params=(14,)
# 获取查询结果
# delete_order_ids = []
for res in result_arr.itertuples():
select_bl_id = res.id # 原提单id
select_bl_no = res.bl_no
delete_big_ids = []
delete_package_ids = []
delete_good_ids = []
delete_log_ids = []
# 查提单下的所有大包
big_sql = 'select id,bl_id,big_package_no,next_provider_name,ship_package_qty,goods_qty,' \
'pallet_number,pallet_usage_date,is_cancel,tally_state,tally_user_id,tally_time,' \
'delivery_user_id,delivery_time from cc_big_package where bl_id = %s;'
big_package_result_arr = pd.read_sql(big_sql, con=db_handle, params=(select_bl_id,))
for big_package_data in big_package_result_arr.itertuples():
origin_id = big_package_data.id
# 处理历史大包
history_big_id = self.history_big_package(db_handle, big_package_data) # 返回历史大包id
delete_big_ids.append(origin_id) # 添加删除大包
# 原大包中的小包
parcel_sql = "select * from cc_ship_package where big_package_id=%s;" % origin_id
ship_package_result_arr = pd.read_sql(parcel_sql, con=db_handle)
# 原小包数据
for ship_package_data in ship_package_result_arr.itertuples():
# 处理历史小包
history_ship_package_id = self.history_ship_package(db_handle, history_big_id, ship_package_data)
delete_package_ids.append(ship_package_data.id) # 添加删除小包
# 处理历史小包推送日志
origin_log_ids = self.history_sync_log(db_handle, history_ship_package_id, ship_package_data.id)
delete_log_ids += origin_log_ids
# 处理历史小包商品
origin_goods_ids = self.history_package_goods(db_handle, ship_package_data.id, history_ship_package_id, history_big_id,
select_bl_id)
delete_good_ids += origin_goods_ids
# 处理提单下的小包 存在不关联大包的情况
no_big_parcel_sql = "select * from cc_ship_package where bl_id=%s and big_package_id is null;" % select_bl_id
no_big_package_result_arr = pd.read_sql(no_big_parcel_sql, con=db_handle)
# 原小包数据
for no_big_package_data in no_big_package_result_arr.itertuples():
# 处理历史小包
history_no_big_package_id = self.history_ship_package(db_handle, None, no_big_package_data)
delete_package_ids.append(no_big_package_data.id) # 添加删除小包
# 处理历史小包推送日志
origin_log_ids = self.history_sync_log(db_handle, history_no_big_package_id, no_big_package_data.id)
delete_log_ids += origin_log_ids
# 处理历史小包商品
origin_goods_ids = self.history_package_goods(db_handle, no_big_package_data.id,
history_no_big_package_id, None,
select_bl_id)
delete_good_ids += origin_goods_ids
update_sql = 'update cc_bl set is_history=True where id=%s' % select_bl_id
pd.read_sql(update_sql, con=db_handle, chunksize=100)
if origin_delete:
# print('delete data')
if delete_big_ids: # 删除原大包
ids = '(%s)' % str(delete_big_ids)[1:-1]
delete_big_sql = 'delete from cc_big_package where id in %s' % ids
pd.read_sql(delete_big_sql, con=db_handle, chunksize=100)
if delete_package_ids: # 删除原小包
ids = '(%s)' % str(delete_package_ids)[1:-1]
delete_package_sql = 'delete from cc_ship_package where id in %s' % ids
pd.read_sql(delete_package_sql, con=db_handle, chunksize=100)
if delete_good_ids: # 删除原小包商品
ids = '(%s)' % str(delete_good_ids)[1:-1]
delete_goods_sql = 'delete from cc_package_good where id in %s' % ids
pd.read_sql(delete_goods_sql, con=db_handle, chunksize=100)
if delete_log_ids: # 删除原小包tiktok日志
ids = '(%s)' % str(delete_log_ids)[1:-1]
delete_log_sql = 'delete from cc_ship_package_sync_log where id in %s' % ids
pd.read_sql(delete_log_sql, con=db_handle, chunksize=100)
logging.info(f'同步提单:{select_bl_no},删除大包{len(delete_big_ids)}个,删除小包{len(delete_package_ids)}个,删除小包商品{len(delete_good_ids)}个,删除小包日志{len(delete_log_ids)}条')
# tk日志
origin_tk_log_ids = self.history_ao_tt_log(db_handle, past_date, limit_log_num)
if origin_delete and origin_tk_log_ids:
logging.info(f'同步日志完成,删除tk日志:{len(origin_tk_log_ids)}个')
logging.info('同步完成')
except Exception as ex:
logging.error('create_history_data error:%s' % str(ex))
# profiler.print_stats(output_unit=1)
return res_data
"""
def order_data(self, data):
res_data = []
try:
data = json.loads(data)
days = int(data.get('history_days', 180)) # 默认180天之前的数据
origin_delete = int(data.get('origin_delete', 1)) # 默认删除原数据
limit_num = int(data.get('history_limit', 50)) # 默认一次同步50个提单
limit_log_num = int(data.get('history_limit_log', 5000)) # 默认一次同步5000条日志
pg_conn, cursor, db_handle, past_date = self.get_init_data(days)
logging.info(f'同步开始,时间:{past_date}')
# 获取历史提单
sql = 'select id,bl_no from cc_bl where (is_history=False or is_history is null) and create_date < %s order by create_date asc limit %s;'
result_arr = pd.read_sql(sql, con=db_handle, params=(past_date, int(limit_num)))
# sql = 'select id,bl_no from cc_bl where id = 14;'
# result_arr = pd.read_sql(sql, con=db_handle) # , params=(14,)
# 获取查询结果
# delete_order_ids = []
for res in result_arr.itertuples():
select_bl_id = res.id # 原提单id
select_bl_no = res.bl_no
# 查提单下的所有大包
big_sql = 'select id,bl_id,big_package_no,next_provider_name,ship_package_qty,goods_qty,' \
'pallet_number,pallet_usage_date,is_cancel,tally_state,tally_user_id,tally_time,' \
'delivery_user_id,delivery_time from cc_big_package where bl_id = %s;'
big_package_result_arr = pd.read_sql(big_sql, con=db_handle, params=(select_bl_id,))
# 处理大包
origin_big_ids, result_dict = self.batch_history_big_package(db_handle, big_package_result_arr)
# 处理小包
no_big_parcel_sql = "select * from cc_ship_package where bl_id=%s;" % select_bl_id
no_big_package_result_arr = pd.read_sql(no_big_parcel_sql, con=db_handle)
origin_ship_ids, package_dict = self.batch_history_ship_package(db_handle, result_dict, no_big_package_result_arr)
# 处理小包日志
origin_log_ids = self.batch_history_sync_log(db_handle, package_dict, origin_ship_ids)
# 处理小包商品
origin_goods_ids = self.batch_history_package_goods(db_handle, package_dict, origin_ship_ids, result_dict)
update_sql = 'update cc_bl set is_history=True where id=%s' % select_bl_id
pd.read_sql(update_sql, con=db_handle, chunksize=100)
if origin_delete:
# print('delete data')
if origin_log_ids: # 删除原小包同步日志
ids = '(%s)' % str(origin_log_ids)[1:-1]
delete_log_sql = 'delete from cc_ship_package_sync_log where id in %s' % ids
pd.read_sql(delete_log_sql, con=db_handle, chunksize=100)
if origin_goods_ids: # 删除原小包商品
ids = '(%s)' % str(origin_goods_ids)[1:-1]
delete_goods_sql = 'delete from cc_package_good where id in %s' % ids
pd.read_sql(delete_goods_sql, con=db_handle, chunksize=100)
if origin_ship_ids: # 删除原小包
ids = '(%s)' % str(origin_ship_ids)[1:-1]
delete_package_sql = 'delete from cc_ship_package where id in %s' % ids
pd.read_sql(delete_package_sql, con=db_handle, chunksize=100)
if origin_big_ids: # 删除原大包
ids = '(%s)' % str(origin_big_ids)[1:-1]
delete_big_sql = 'delete from cc_big_package where id in %s' % ids
pd.read_sql(delete_big_sql, con=db_handle, chunksize=100)
logging.info(f'同步提单:{select_bl_no},删除大包{len(origin_big_ids)}个,删除小包{len(origin_ship_ids)}个,删除小包商品{len(origin_goods_ids)}个,删除小包同步日志{len(origin_log_ids)}条')
logging.info(f'提单{select_bl_no}同步完成')
# tk日志
origin_tk_log_ids = self.history_ao_tt_log(db_handle, past_date, limit_log_num)
if origin_delete and origin_tk_log_ids:
log_ids = '(%s)' % str(origin_tk_log_ids)[1:-1]
delete_api_log_sql = 'delete from ao_tt_api_log where id in %s' % log_ids
pd.read_sql(delete_api_log_sql, con=db_handle, chunksize=100)
logging.info(f'同步日志完成,删除tk日志:{len(origin_tk_log_ids)}个')
logging.info('同步完成')
except Exception as ex:
logging.error('create_history_data error:%s' % str(ex))
# profiler.print_stats(output_unit=1)
return res_data
def batch_history_big_package(self, db_handle, big_package_result_arr):
"""
创建历史大包数据
:param db_handle:
:param big_package_result_arr: 原大包数据
:return: 历史大包id
"""
# 创建历史大包数据
big_package_arr = []
origin_big_ids = []
for big_package_data in big_package_result_arr.itertuples():
origin_id = big_package_data.id
big_package_vals = {
'origin_id': big_package_data.id,
'bl_id': big_package_data.bl_id,
'big_package_no': big_package_data.big_package_no,
'next_provider_name': big_package_data.next_provider_name,
'ship_package_qty': big_package_data.ship_package_qty,
'goods_qty': big_package_data.goods_qty,
'pallet_number': big_package_data.pallet_number,
'pallet_usage_date': big_package_data.pallet_usage_date,
'is_cancel': big_package_data.is_cancel,
'tally_state': big_package_data.tally_state,
'tally_user_id': big_package_data.tally_user_id,
'tally_time': big_package_data.tally_time,
'delivery_user_id': big_package_data.delivery_user_id,
'delivery_time': big_package_data.delivery_time,
# 'exception_info_ids': big_package_data.id,
# exception_info_ids
# goods_ids
# ship_package_ids
}
big_package_arr.append(big_package_vals)
origin_big_ids.append(origin_id)
if big_package_arr:
val_df = pd.DataFrame(big_package_arr)
val_df.to_sql('cc_history_big_package', con=db_handle, if_exists='append', index=False)
#
result_dict = {}
if origin_big_ids:
big_ids_str = '(%s)' % str(origin_big_ids)[1:-1]
sql = 'select id,origin_id from cc_history_big_package where origin_id in %s' % big_ids_str
new_order_arr = pd.read_sql(sql, con=db_handle)
for new_order_data in new_order_arr.itertuples():
result_dict[new_order_data.origin_id] = new_order_data.id
# logging.info("new_order:%s" % len(new_order))
if result_dict:
# 大包的异常信息处理
sql = 'select cc_big_package_id,cc_exception_info_id from bigpackage_exception_info_rel where cc_big_package_id in %s' % big_ids_str
exception_order_arr = pd.read_sql(sql, con=db_handle)
exception_vals_arr = []
for exception_order_data in exception_order_arr.itertuples():
exception_vals = {
'cc_history_big_package_id': result_dict.get(exception_order_data.cc_big_package_id, None),
'cc_exception_info_id': exception_order_data.cc_exception_info_id
}
exception_vals_arr.append(exception_vals)
if exception_vals_arr:
val_df = pd.DataFrame(exception_vals_arr)
val_df.to_sql('history_bigpackage_exception_info_rel', con=db_handle, if_exists='append', index=False)
return origin_big_ids, result_dict
def batch_history_ship_package(self, db_handle, big_dict, no_big_package_result_arr):
"""
创建历史小包数据
:param db_handle:
:param no_big_package_result_arr: 原小包数据
:param big_dict: 历史大包数据
:return: 历史小包id
"""
history_ship_package_vals_arr = []
origin_ship_ids = []
for ship_package_data in no_big_package_result_arr.itertuples():
# 创建历史小包数据
history_ship_package_vals = {
'customer_id': ship_package_data.customer_id,
'origin_id': ship_package_data.id,
'bl_id': ship_package_data.bl_id,
'big_package_id': big_dict.get(ship_package_data.big_package_id),
'logistic_order_no': ship_package_data.logistic_order_no,
'tracking_no': ship_package_data.tracking_no,
'customer_ref': ship_package_data.customer_ref,
'internal_account_number': ship_package_data.internal_account_number,
'user_track_note': ship_package_data.user_track_note,
'company_code': ship_package_data.company_code,
'trade_no': ship_package_data.trade_no,
'big_package_no': ship_package_data.big_package_no,
'container_no': ship_package_data.container_no,
'buyer_region': ship_package_data.buyer_region,
'next_provider_name': ship_package_data.next_provider_name,
'sender_name': ship_package_data.sender_name,
'sender_vat_no': ship_package_data.sender_vat_no,
'sender_phone': ship_package_data.sender_phone,
'sender_add_1': ship_package_data.sender_add_1,
'sender_add_2': ship_package_data.sender_add_2,
'sender_add_3': ship_package_data.sender_add_3,
'sender_city': ship_package_data.sender_city,
'sender_state': ship_package_data.sender_state,
'sender_postcode': ship_package_data.sender_postcode,
'sender_country': ship_package_data.sender_country,
'receiver_name': ship_package_data.receiver_name,
'receiver_type': ship_package_data.receiver_type,
'receiver_vat_no': ship_package_data.receiver_vat_no,
'receiver_add_1': ship_package_data.receiver_add_1,
'receiver_add_2': ship_package_data.receiver_add_2,
'receiver_add_3': ship_package_data.receiver_add_3,
'receiver_city': ship_package_data.receiver_city,
'receiver_county': ship_package_data.receiver_county,
'receiver_county_translate': ship_package_data.receiver_county_translate,
'receiver_postcode': ship_package_data.receiver_postcode,
'receiver_email': ship_package_data.receiver_email,
'receiver_phone': ship_package_data.receiver_phone,
'gross_weight': ship_package_data.gross_weight,
'weight_unit': ship_package_data.weight_unit,
'currency': ship_package_data.currency,
'currency_id': ship_package_data.currency_id,
'total_value': ship_package_data.total_value,
'shipping_fee': ship_package_data.shipping_fee,
'tax_mark': ship_package_data.tax_mark,
'actual_tax': ship_package_data.actual_tax,
'actual_vat': ship_package_data.actual_vat,
'actual_gst': ship_package_data.actual_gst,
'actual_tax_currency': ship_package_data.actual_tax_currency,
'actual_currency_id': ship_package_data.actual_currency_id,
'actual_tax_date': ship_package_data.actual_tax_date,
'actual_tax_tz': ship_package_data.actual_tax_tz,
'is_cancel': ship_package_data.is_cancel,
'state': ship_package_data.state,
'node_exception_reason_id': ship_package_data.node_exception_reason_id,
'process_time': ship_package_data.process_time,
'cancel_reason': ship_package_data.cancel_reason,
'receiver_detailed_address': ship_package_data.receiver_detailed_address,
# 'exception_info_ids': ship_package_obj.exception_info_ids,ship_package_data.id
# 'invoice_attachment_ids': ship_package_obj.invoice_attachment_ids,ship_package_data.id
# exception_info_ids
# invoice_attachment_ids
# good_ids
# sync_log_ids
'operation_time': ship_package_data.operation_time,
'state_explain': ship_package_data.state_explain,
'is_sync': ship_package_data.is_sync,
'tk_code': ship_package_data.tk_code,
}
origin_ship_ids.append(ship_package_data.id)
history_ship_package_vals_arr.append(history_ship_package_vals)
if history_ship_package_vals_arr:
val_df = pd.DataFrame(history_ship_package_vals_arr)
val_df.to_sql('cc_history_ship_package', con=db_handle, if_exists='append', index=False)
result_dict = {}
if origin_ship_ids:
ship_ids_str = '(%s)' % str(origin_ship_ids)[1:-1]
sql = 'select id,origin_id from cc_history_ship_package where origin_id in %s' % ship_ids_str
new_order_arr = pd.read_sql(sql, con=db_handle)
for new_order_data in new_order_arr.itertuples():
result_dict[new_order_data.origin_id] = new_order_data.id
# 小包的异常信息处理
if result_dict:
sql = 'select cc_ship_package_id,cc_exception_info_id from shippackage_exception_info_rel where cc_ship_package_id in %s' % ship_ids_str
exception_order_arr = pd.read_sql(sql, con=db_handle)
exception_vals_arr = []
for exception_order_data in exception_order_arr.itertuples():
exception_vals = {
'cc_history_ship_package_id': result_dict.get(exception_order_data.cc_ship_package_id, None),
'cc_exception_info_id': exception_order_data.cc_exception_info_id
}
exception_vals_arr.append(exception_vals)
if exception_vals_arr:
val_df = pd.DataFrame(exception_vals_arr)
val_df.to_sql('history_package_exception_info_rel', con=db_handle, if_exists='append', index=False)
# 小包的附件信息处理
sql = 'select cc_ship_package_id,ir_attachment_id from ship_package_invoice_attachment_rel where cc_ship_package_id in %s' % ship_ids_str
attachment_order_arr = pd.read_sql(sql, con=db_handle)
attachment_vals_arr = []
for attachment_order_data in attachment_order_arr.itertuples():
attachment_vals = {
'cc_history_ship_package_id': result_dict.get(attachment_order_data.cc_ship_package_id, None),
'ir_attachment_id': attachment_order_data.ir_attachment_id
}
attachment_vals_arr.append(attachment_vals)
if attachment_vals_arr:
val_df = pd.DataFrame(attachment_vals_arr)
val_df.to_sql('history_package_invoice_attachment_rel', con=db_handle, if_exists='append', index=False)
return origin_ship_ids, result_dict
def batch_history_sync_log(self, db_handle, package_dict, origin_ship_ids):
"""
创建历史小包日志
:param db_handle:
:param origin_ship_ids: 小包id
:param package_dict: 原来小包数据
:return:
"""
origin_log_ids = []
if origin_ship_ids:
ids = '(%s)' % str(origin_ship_ids)[1:-1]
sync_sql = "SELECT id, package_id, sync_time, api_customer, process_code, operate_time, operate_remark, operate_user FROM cc_ship_package_sync_log WHERE package_id in %s;" % ids
sync_log_result_arr = pd.read_sql(sync_sql, con=db_handle)
sync_log_vals_list = []
for sync_log_result in sync_log_result_arr.itertuples():
sync_log_data = sync_log_result
# 创建历史小包日志数据
sync_log_vals = {
'package_id': package_dict.get(sync_log_data.package_id, None),
'sync_time': sync_log_data.sync_time,
'api_customer': sync_log_data.api_customer,
'process_code': sync_log_data.process_code,
'operate_time': sync_log_data.operate_time,
'operate_remark': sync_log_data.operate_remark,
'operate_user': sync_log_data.operate_user,
}
sync_log_vals_list.append(sync_log_vals)
if sync_log_vals_list:
val_df = pd.DataFrame(sync_log_vals_list)
val_df.to_sql('cc_history_package_sync_log', con=db_handle, if_exists='append', index=False)
origin_log_ids = sync_log_result_arr['id'].tolist()
return origin_log_ids
def batch_history_package_goods(self, db_handle, package_dict, origin_ship_ids, big_dict):
"""
创建历史小包商品
:param db_handle:
:param origin_ship_ids: 原小包id
:param package_dict: 历史小包id
:param big_dict: 历史大包id
:return:
"""
# 商品
origin_goods_ids = []
if origin_ship_ids:
ids = '(%s)' % str(origin_ship_ids)[1:-1]
package_good_sql = """select id, bl_line_id, big_package_id, bl_id, item_id, sku_id,
item_name_cn, item_name_en, export_hs_code, import_hs_code, weight,
quantity, quantity_unit, declare_price, freight, cod_amount, vat_rate,
item_vat, origin_country, item_type, item_total_price, item_link,
item_tax_status, actual_tax, actual_tax_rate, actual_tax_currency,
actual_vat, actual_vat_rate, actual_gst, actual_gst_rate, currency_id,
is_cancel from cc_package_good where bl_line_id in %s;""" % ids
package_good_result_arr = pd.read_sql(package_good_sql, con=db_handle)
# origin_goods_ids = []
package_good_vals_list = []
for package_good_data in package_good_result_arr.itertuples():
# 创建历史小包商品数据
package_good_vals = {
'origin_id': package_good_data.id,
'bl_line_id': package_dict.get(package_good_data.bl_line_id, None),
'big_package_id': big_dict.get(package_good_data.big_package_id, None),
'bl_id': package_good_data.bl_id,
'item_id': package_good_data.item_id,
'sku_id': package_good_data.sku_id,
'item_name_cn': package_good_data.item_name_cn,
'item_name_en': package_good_data.item_name_en,
'export_hs_code': package_good_data.export_hs_code,
'import_hs_code': package_good_data.import_hs_code,
'weight': package_good_data.weight,
'quantity': package_good_data.quantity,
'quantity_unit': package_good_data.quantity_unit,
'declare_price': package_good_data.declare_price,
'freight': package_good_data.freight,
'cod_amount': package_good_data.cod_amount,
'vat_rate': package_good_data.vat_rate,
'item_vat': package_good_data.item_vat,
'origin_country': package_good_data.origin_country,
'item_type': package_good_data.item_type,
'item_total_price': package_good_data.item_total_price,
'item_link': package_good_data.item_link,
'item_tax_status': package_good_data.item_tax_status,
'actual_tax': package_good_data.actual_tax,
'actual_tax_rate': package_good_data.actual_tax_rate,
'actual_tax_currency': package_good_data.actual_tax_currency,
'actual_vat': package_good_data.actual_vat,
'actual_vat_rate': package_good_data.actual_vat_rate,
'actual_gst': package_good_data.actual_gst,
'actual_gst_rate': package_good_data.actual_gst_rate,
'currency_id': package_good_data.currency_id,
'is_cancel': package_good_data.is_cancel,
}
package_good_vals_list.append(package_good_vals)
if package_good_vals_list:
val_df = pd.DataFrame(package_good_vals_list)
val_df.to_sql('cc_history_package_good', con=db_handle, if_exists='append', index=False)
origin_goods_ids = package_good_result_arr['id'].tolist()
return origin_goods_ids
try:
pool = redis.ConnectionPool(**config.redis_options)
r = redis.Redis(connection_pool=pool)
logging.info(u'redis连接成功')
Order_dispose = Order_dispose()
while 1:
try:
result = r.brpop('history_data_list', 0)
# print(result[1])
data1 = result[1]
response_data = Order_dispose.order_data(data1)
except Exception as e:
logging.error(e)
continue
except Exception as e:
logging.error("登录失败:%s" % e)
[program:history_data_consumer_1]
process_name=%(program_name)s_%(process_num)02d ; 进程名称
directory = /mnt/extra-addons ; 程序的启动目录
command = /usr/bin/python3 /mnt/extra-addons/history_data.py ; 启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
numprocs=1 ; 进程数
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/supervisor/history_data.log
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论