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='XT') # 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): """ 判断是否为出库单 """ for record in self: if record.name: is_check_out = record.name.split('/') record.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']) tem_ret = response.json().get('result') if not tem_ret: raise ValidationError('京东物流返回异常,请联系管理员') self.carrier_tracking_ref = response.json()['result'].get('wbNo') if not self.carrier_tracking_ref: raise ValidationError('物流下单未成功,请联系管理员') self.is_bill = True self.logistics_status = '1' notification = { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'title': _('成功'), 'type': 'success', 'message': '物流下单成功', 'sticky': False, 'next': {'type': 'ir.actions.client', 'tag': 'reload'} } } return notification 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'