209 lines
9.5 KiB
Python
209 lines
9.5 KiB
Python
import base64
|
||
import logging
|
||
from datetime import datetime
|
||
import requests
|
||
import cpca
|
||
# from odoo.exceptions import UserError
|
||
# from odoo.exceptions import ValidationError
|
||
from odoo import api, fields, models
|
||
from odoo.exceptions import ValidationError
|
||
|
||
_logger = logging.getLogger(__name__)
|
||
|
||
|
||
class JdEclp(models.Model):
|
||
_inherit = 'stock.picking'
|
||
|
||
senderNickName = fields.Char(string='寄件工厂简称', required=True, default='MW')
|
||
|
||
# receiverName = fields.Char(string='收件人姓名')
|
||
# receiverMobile = fields.Char(string='收件人电话')
|
||
# receiverProvinceName = fields.Char(string='收件人省')
|
||
# receiverCityName = fields.Char(string='收件人市')
|
||
# receiverCountyName = fields.Char(string='收件人县')
|
||
# receiverTownName = fields.Char(string='收件人详细地址')
|
||
|
||
receiverName = fields.Char(string='收件人姓名', compute='_truck_info')
|
||
receiverMobile = fields.Char(string='收件人电话', compute='_truck_info')
|
||
receiverProvinceName = fields.Char(string='收件人省', compute='_truck_info')
|
||
receiverCityName = fields.Char(string='收件人市', compute='_truck_info')
|
||
receiverCountyName = fields.Char(string='收件人县', compute='_truck_info')
|
||
receiverTownName = fields.Char(string='收件人详细地址', compute='_truck_info')
|
||
receiverCompany = fields.Char(string='收货人公司', required=True, default=1)
|
||
remark = fields.Char(string='物流面单备注', default='无')
|
||
grossWeight = fields.Char(string='总重量', required=True, default=0)
|
||
grossVolume = fields.Char(string='总体积', default=0)
|
||
expressItemName = fields.Char(string='货物名称', required=True, default='非标工件')
|
||
pickupBeginTime = fields.Char(string='期望取件时间')
|
||
deliveryType = fields.Selection([('6', '特快零担'), ('25', '特快重货')], string='运输类型', default='25')
|
||
# bill = fields.Char(string='物流面单')
|
||
|
||
# bill = fields.Many2one('ir.attachment', string='物流面单', compute='query_bill_pdf')
|
||
# bill_show = fields.Binary(string='物流面单展示', readonly=True, related='self.bill.datas')
|
||
bill_show = fields.Binary(string='物流面单展示', readonly=True)
|
||
check_out = fields.Char(string='查询是否为出库单', compute='_check_is_out')
|
||
# 是否下了快递单
|
||
is_bill = fields.Boolean(string='是否下了快递单', default=False)
|
||
# 物流状态
|
||
logistics_status = fields.Selection([('0', '未下单'), ('1', '已下单'), ('2', '已获取物流面单'), ('3', '已打印物流单')],
|
||
string='物流状态', default='0', readonly=True)
|
||
|
||
logistics_way = fields.Selection([('自提', '自提'), ('到付', '到付'), ('在线支付', '在线支付')], string='物流方式', readonly=True)
|
||
|
||
def button_validate(self):
|
||
"""
|
||
重写出库方法,获取物流面单
|
||
"""
|
||
res = super(JdEclp, self).button_validate()
|
||
if self.check_out == 'OUT':
|
||
if self.logistics_way != '自提' and self.logistics_way:
|
||
if self.logistics_status != '2':
|
||
raise ValidationError('非自提订单,必须先下物流单,并获取物流面单后才可出库!')
|
||
return res
|
||
|
||
|
||
@api.depends('name')
|
||
def _check_is_out(self):
|
||
"""
|
||
判断是否为出库单
|
||
"""
|
||
if self.name:
|
||
is_check_out = self.name.split('/')
|
||
self.check_out = is_check_out[1]
|
||
|
||
@api.depends('carrier_tracking_ref')
|
||
def query_bill_pdf(self):
|
||
"""
|
||
查询物流面单,并赋值给bill
|
||
"""
|
||
self.bill = self.env['ir.attachment'].sudo().search([('name', '=', self.carrier_tracking_ref)])
|
||
|
||
@api.depends('origin')
|
||
def _truck_info(self):
|
||
"""
|
||
根据销售订单号,获取收货人信息
|
||
"""
|
||
# if 'S' in self.origin:
|
||
# if self.receiverName and self.receiverMobile and self.receiverProvinceName and self.receiverCityName and
|
||
# self.receiverCountyName and self.receiverTownName:
|
||
sale_order_id = self.env['sale.order'].search([('name', '=', self.origin)])
|
||
self.logistics_way = sale_order_id.logistics_way
|
||
# stock_picking_type_id = self.enc['stock.picking.type'].search([('picking_type_id', '=', '')])
|
||
# if sale_order_id.address_of_delivery != False:
|
||
# if not sale_order_id:
|
||
# raise ValidationError("找不到对应的销售订单")
|
||
try:
|
||
if 'OUT' in self.name and sale_order_id.address_of_delivery:
|
||
raw_address = sale_order_id.address_of_delivery.split('这是一个标志位,用来不分隔字符串')
|
||
if sale_order_id.person_of_delivery:
|
||
self.receiverName = sale_order_id.person_of_delivery
|
||
if sale_order_id.telephone_of_delivery:
|
||
self.receiverMobile = sale_order_id.telephone_of_delivery
|
||
if raw_address:
|
||
self.receiverProvinceName = cpca.transform(raw_address).values.tolist()[0][0]
|
||
self.receiverCityName = cpca.transform(raw_address).values.tolist()[0][1]
|
||
self.receiverCountyName = cpca.transform(raw_address).values.tolist()[0][2]
|
||
self.receiverTownName = cpca.transform(raw_address).values.tolist()[0][3]
|
||
else:
|
||
self.receiverName = False
|
||
self.receiverMobile = False
|
||
self.receiverProvinceName = False
|
||
self.receiverCityName = False
|
||
self.receiverCountyName = False
|
||
self.receiverTownName = False
|
||
except Exception as e:
|
||
raise ValidationError(f"传值有误: {e}")
|
||
|
||
def create_order(self):
|
||
"""
|
||
创建订单
|
||
"""
|
||
if not self.receiverName or not self.receiverMobile or not self.receiverProvinceName \
|
||
or not self.receiverCityName or not self.receiverCountyName or not self.receiverTownName:
|
||
raise ValidationError("当前销售订单缺失收货人信息,补充后才可发起物流!")
|
||
# sale_order_id = self.env['sale.order'].search([('name', '=', self.origin)])
|
||
|
||
# if self.carrier_id == '京东物流':
|
||
config = self.env['res.config.settings'].get_values()
|
||
createTime = str(datetime.now())
|
||
json1 = {
|
||
'params': {
|
||
'orderNo': self.origin,
|
||
'senderNickName': self.senderNickName,
|
||
'receiverName': self.receiverName,
|
||
'receiverMobile': self.receiverMobile,
|
||
'receiverProvinceName': self.receiverProvinceName,
|
||
'receiverCityName': self.receiverCityName,
|
||
'receiverCountyName': self.receiverCountyName,
|
||
'receiverTownName': self.receiverTownName,
|
||
'remark': self.remark,
|
||
'grossWeight': self.grossWeight,
|
||
'grossVolume': self.grossVolume,
|
||
'createTime': createTime,
|
||
# 'createUser': self.user_id,
|
||
'expressItemName': self.expressItemName,
|
||
'pickupBeginTime': self.pickupBeginTime,
|
||
'deliveryType': self.deliveryType,
|
||
'receiverCompany': self.receiverCompany,
|
||
},
|
||
}
|
||
_logger.info('准备调接口1')
|
||
url1 = config['bfm_url'] + '/api/create/jd/order'
|
||
requests.post(url1, json=json1, data=None)
|
||
_logger.info('调用成功1')
|
||
_logger.info('准备调接口2')
|
||
json2 = {
|
||
'params': {
|
||
'orderNo': self.origin,
|
||
},
|
||
}
|
||
url2 = config['bfm_url'] + '/api/get/jd/no'
|
||
response = requests.post(url2, json=json2, data=None)
|
||
# _logger.info('调用成功2', response.json()['result']['wbNo'])
|
||
self.carrier_tracking_ref = response.json()['result']['wbNo']
|
||
self.is_bill = True
|
||
self.logistics_status = '1'
|
||
|
||
# # 京东物流下单后,销售订单状态改为待收货
|
||
# self.env['sale.order'].search([('name', '=', self.origin)]).write({'scheduled_status': 'to receive'})
|
||
|
||
# else:
|
||
# raise UserError("选择京东物流才能下单呦")
|
||
|
||
def get_bill(self):
|
||
"""
|
||
获取物流面单
|
||
"""
|
||
if not self.carrier_tracking_ref:
|
||
raise ValidationError("未下物流单,请先点击京东物流下单按钮!")
|
||
config = self.env['res.config.settings'].get_values()
|
||
json1 = {
|
||
'params': {
|
||
'no': self.origin,
|
||
},
|
||
}
|
||
url1 = config['bfm_url'] + '/api/create/jd/bill'
|
||
response = requests.post(url1, json=json1, data=None)
|
||
# _logger.info('调用成功2', response.json())
|
||
|
||
# _logger.info('调用成功2', response.text)
|
||
bill_url_str = response.json()['result']['jingdong_eclp_co_generateBdWayBillFile_responce']['result']['content']
|
||
bill_url = 'http:' + bill_url_str
|
||
data = base64.b64encode(requests.get(bill_url).content)
|
||
# self.bill = ''
|
||
self.bill_show = data
|
||
_logger.info('调用成功2')
|
||
attachment = self.env['ir.attachment'].sudo().create({
|
||
'datas': data,
|
||
'type': 'binary',
|
||
'description': '快递面单',
|
||
'name': self.carrier_tracking_ref,
|
||
# 'res_id': invoice.id,
|
||
# 'res_model': 'stock.picking',
|
||
'public': True,
|
||
'mimetype': 'application/pdf',
|
||
# 'model_name': 'stock.picking',
|
||
})
|
||
_logger.info(attachment)
|
||
self.logistics_status = '2'
|