智能工厂API接口创建销售订单

This commit is contained in:
jinling.yang
2022-10-11 21:54:44 +08:00
parent f632dca7d9
commit d24ade9e55
9 changed files with 120 additions and 39 deletions

View File

@@ -1,4 +1,6 @@
from . import sale_order
from . import product_template
from . import http
from . import models

43
sf_bpm_api/models/http.py Normal file
View File

@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
import json
import logging
import base64
import datetime
import time
import hashlib
from odoo import fields, models, api
from odoo.http import request, AuthenticationError
import redis
__author__ = 'jinling.yang'
_logger = logging.getLogger(__name__)
class Http(models.AbstractModel):
_inherit = 'ir.http'
@classmethod
def _auth_method_sf_token(cls):
# 从headers.environ中获取对方传过来的token,timestamp,加密的校验字符串
datas = request.httprequest.headers.environ
if 'HTTP_TOKEN' in datas:
_logger.info('token:%s' % datas['HTTP_TOKEN'])
# 查询密钥
factory_secret = request.env['res.partner'].sudo().search(
[('sf_token', '=', datas['HTTP_TOKEN'])], limit=1)
if not factory_secret:
raise AuthenticationError('无效的token')
timestamp_str = int(time.time())
# 设置API接口请求时间,不能超过5秒
deltime = datetime.timedelta(seconds=60)
if abs(int(datas['HTTP_TIMESTAMP'])-timestamp_str) > deltime.seconds:
raise AuthenticationError('请求已过期')
# 获得sha1_str加密字符串
post_time = int(datas['HTTP_TIMESTAMP'])
check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key)
check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest()
if check_sf_str != datas['HTTP_CHECKSTR']:
raise AuthenticationError('数据校验不通过')
else:
raise AuthenticationError('请求参数中无token')

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
import logging
import uuid
import string
import random
from odoo import fields, models, api
__author__ = 'jinling.yang'
_logger = logging.getLogger(__name__)
class ResPartner(models.Model):
_inherit = 'res.partner'
# 获取token,token自动生成且唯一
def get_token(self):
return uuid.uuid1()
# 获取密钥(大小字母+数字随机)
def get_secret(self):
ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 16))
return ran_str
sf_token = fields.Char(u'Token', default=get_token)
sf_secret_key = fields.Char(u'密钥', default=get_secret)

View File

@@ -9,11 +9,11 @@ class ResProductTemplate(models.Model):
detailed_type = fields.Selection(default='product')
list_price = fields.Float(digits=(16, 3))
invoice_policy = fields.Selection(default='delivery')
long = fields.Float('长[mm]', digits=(16, 3))
width = fields.Float('宽[mm]', digits=(16, 3))
height = fields.Float('高[mm]', digits=(16, 3))
volume = fields.Float('体积[mm³]', digits=(16, 3))
precision = fields.Float('精度要求', digits=(16, 3))
model_long = fields.Float('长[mm]', digits=(16, 3))
model_width = fields.Float('宽[mm]', digits=(16, 3))
model_height = fields.Float('高[mm]', digits=(16, 3))
model_volume = fields.Float('体积[mm³]', digits=(16, 3))
model_precision = fields.Float('精度要求', digits=(16, 3))
materials_id = fields.Many2one('mrs.production.materials', string='材料')
# materials_type_id = fields.Many2one('mrs.materials.model', string='型号')
# surface_technics_id = fields.Many2one('mrs.production.process', string='表面工艺')
@@ -21,15 +21,16 @@ class ResProductTemplate(models.Model):
unit_price = fields.Float('单价')
amount = fields.Integer('数量')
# 业务平台分配工厂时调用该方法创建产品,(调用该方法时用prototype)
# 业务平台分配工厂时调用该方法创建产品
def product_create(self, products):
self.env['product.template'].create({
'name': products['order_number'],
'length': products['length'],
'width': products['width'],
'height': products['height'],
'volume': products['volume'],
'model_long': products['length'],
'model_width': products['width'],
'model_height': products['height'],
'model_volume': products['volume'],
'materials_id': products['materials_id'],
'unit_price': products['unit_price'],
'amount': products['amount']
'amount': products['amount'],
'barcode':products['barcode'],
})

View File

@@ -1,5 +1,6 @@
from odoo import models, fields
from odoo.exceptions import ValidationError
import datetime
class ReSaleOrder(models.Model):
@@ -7,8 +8,13 @@ class ReSaleOrder(models.Model):
deadline_of_delivery = fields.Date('交货截止日期')
# 业务平台分配工厂时调用该方法先创建销售订单(调用该方法时用prototype)
def sale_order_create(self, order):
self.env['sale.order'].create({
'deadline_of_delivery': order['deadline_of_delivery']
# 业务平台分配工厂时调用该方法先创建销售订单
def sale_order_create(self, deadline_of_delivery):
now = datetime.datetime.now()
self.env['sale.order'].sudo().create({
'company_id': 1,
'date_order': now,
'name': '12',
'partner_id': 1,
'deadline_of_delivery': deadline_of_delivery
})