208 lines
10 KiB
Python
208 lines
10 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of SmartGo. See LICENSE file for full copyright and licensing details.
|
|
import logging
|
|
|
|
import requests
|
|
|
|
from odoo import api, fields, models
|
|
from odoo.exceptions import ValidationError, UserError
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ResConfigSettings(models.TransientModel):
|
|
_inherit = 'res.config.settings'
|
|
|
|
token = fields.Char(string='TOKEN', default='b811ac06-3f00-11ed-9aed-0242ac110003')
|
|
sf_secret_key = fields.Char(string='密钥', default='wBmxej38OkErKhD6')
|
|
sf_url = fields.Char(string='访问地址', default='https://sf.cs.jikimo.com')
|
|
center_control_url = fields.Char(string='中控访问地址',
|
|
default='http://172.16.21.50:8001')
|
|
center_control_Authorization = fields.Char(string='中控访问认证')
|
|
|
|
task_type_no = fields.Char('任务单类型编号')
|
|
model_parser_url = fields.Char('特征识别路径')
|
|
ftp_host = fields.Char(string='FTP的ip')
|
|
ftp_port = fields.Char(string='FTP端口')
|
|
ftp_user = fields.Char(string='FTP用户')
|
|
ftp_password = fields.Char(string='FTP密码')
|
|
enable_tool_presetter = fields.Boolean('是否启用刀具预调仪', default=True)
|
|
|
|
def sf_all_sync(self):
|
|
try:
|
|
self.env['sf.production.materials'].sync_all_production_materials()
|
|
_logger.info("同步资源库材料完成")
|
|
self.env['sf.materials.model'].sync_all_materials_model()
|
|
_logger.info("同步资源库材料型号完成")
|
|
self.env['sf.international.standards'].sync_all_mrs_international_standards()
|
|
_logger.info("同步资源库国际标准完成")
|
|
self.env['material.apply'].sync_all_material_apply()
|
|
_logger.info("同步资源库材料应用完成")
|
|
self.env['sf.production.process.category'].sync_all_production_process_category()
|
|
_logger.info("同步资源库表面工艺类别完成")
|
|
self.env['sf.production.process'].sync_all_production_process()
|
|
_logger.info("同步资源库表面工艺完成")
|
|
# self.env['sf.processing.technology'].sync_all_processing_technology()
|
|
# _logger.info("同步资源库加工工艺")
|
|
self.env['sf.machine.brand.tags'].sync_all_machine_brand_tags()
|
|
_logger.info("同步资源库品牌类别完成")
|
|
self.env['sf.machine.brand'].sync_all_machine_brand()
|
|
_logger.info("同步资源库品牌完成")
|
|
self.env['sf.machine.control_system'].sync_all_machine_control_system()
|
|
_logger.info("同步资源库控制系统完成")
|
|
self.env['sf.machine_tool.category'].sync_all_machine_tool_category()
|
|
_logger.info("同步资源库机床类型完成")
|
|
self.env['sf.production.process.parameter'].sync_all_production_process_parameter()
|
|
_logger.info("同步材料型号可选参数完成")
|
|
self.env['sf.cutting.tool.material'].sync_all_cutting_tool_material()
|
|
_logger.info("同步刀具物料完成")
|
|
self.env['sf.cutting.tool.type'].sync_all_tool_type()
|
|
_logger.info("同步刀具类型完成")
|
|
self.env['sf.functional.cutting.tool.model'].sync_all_functional_cutting_tool_model()
|
|
_logger.info("同步功能刀具类型完成")
|
|
self.env['sf.fixture.material'].sync_all_fixture_material()
|
|
_logger.info("同步夹具物料完成")
|
|
self.env['sf.multi_mounting.type'].sync_all_multi_mounting_type()
|
|
_logger.info("同步联装类型完成")
|
|
self.env['sf.fixture.model'].sync_all_fixture_model()
|
|
_logger.info("同步夹具型号完成")
|
|
self.env['sf.fixture.materials.basic.parameters'].sync_all_fixture_materials_basic_parameters()
|
|
_logger.info("同步夹具型号基本信息完成")
|
|
self.env['sf.functional.fixture.type'].sync_all_functional_fixture_type()
|
|
_logger.info("同步夹具型号类型完成")
|
|
self.env['sf.machine_tool.type'].sync_all_machine_tool_type()
|
|
_logger.info("同步功能夹具类型完成")
|
|
self.env['maintenance.equipment.image'].sync_all_maintenance_equipment_image()
|
|
_logger.info("同步能力特征库完成")
|
|
self.env['sf.cutting_tool.standard.library'].sync_all_cutting_tool_standard_library()
|
|
_logger.info("同步刀具标准库完成")
|
|
self.env['sf.tool.materials.basic.parameters'].sync_all_cutting_tool_basic_parameters()
|
|
_logger.info("同步刀具物料基本参数完成")
|
|
self.env['sf.cutting.width.depth'].sync_all_cutting_width_depth()
|
|
_logger.info("同步刀具物料切削宽度和深度完成")
|
|
self.env['sf.cutting.speed'].sync_all_cutting_speed()
|
|
_logger.info("同步刀具物料切削速度完成")
|
|
self.env['sf.feed.per.tooth'].sync_all_feed_per_tooth()
|
|
_logger.info("同步刀具物料每齿走刀量完成")
|
|
|
|
except Exception as e:
|
|
_logger.info("sf_all_sync error: %s" % e)
|
|
raise ValidationError("数据错误导致同步失败,请联系管理员")
|
|
|
|
@api.model
|
|
def get_values(self):
|
|
"""
|
|
重载获取参数的方法,参数都存在系统参数中
|
|
:return:
|
|
"""
|
|
values = super(ResConfigSettings, self).get_values()
|
|
config = self.env['ir.config_parameter'].sudo()
|
|
token = config.get_param('token', default='')
|
|
sf_secret_key = config.get_param('sf_secret_key', default='')
|
|
sf_url = config.get_param('sf_url', default='')
|
|
|
|
center_control_url = config.get_param('center_control_url', default='')
|
|
center_control_Authorization = config.get_param('center_control_Authorization', default='')
|
|
ftp_host = config.get_param('ftp_host', default='')
|
|
ftp_port = config.get_param('ftp_port', default='')
|
|
ftp_user = config.get_param('ftp_user', default='')
|
|
ftp_password = config.get_param('ftp_password', default='')
|
|
enable_tool_presetter = config.get_param('enable_tool_presetter', default='')
|
|
|
|
values.update(
|
|
token=token,
|
|
sf_secret_key=sf_secret_key,
|
|
sf_url=sf_url,
|
|
|
|
center_control_url=center_control_url,
|
|
center_control_Authorization=center_control_Authorization,
|
|
ftp_host=ftp_host,
|
|
ftp_port=ftp_port,
|
|
ftp_user=ftp_user,
|
|
ftp_password=ftp_password,
|
|
enable_tool_presetter=enable_tool_presetter
|
|
)
|
|
return values
|
|
|
|
def set_values(self):
|
|
super(ResConfigSettings, self).set_values()
|
|
ir_config = self.env['ir.config_parameter'].sudo()
|
|
ir_config.set_param("token", self.token or "")
|
|
ir_config.set_param("sf_secret_key", self.sf_secret_key or "")
|
|
ir_config.set_param("sf_url", self.sf_url or "")
|
|
|
|
ir_config.set_param("center_control_url", self.center_control_url or "")
|
|
ir_config.set_param("center_control_Authorization", self.center_control_Authorization or "")
|
|
ir_config.set_param("ftp_host", self.ftp_host or "")
|
|
ir_config.set_param("ftp_port", self.ftp_port or "")
|
|
ir_config.set_param("ftp_user", self.ftp_user or "")
|
|
ir_config.set_param("ftp_password", self.ftp_password or "")
|
|
ir_config.set_param("enable_tool_presetter", self.enable_tool_presetter or False)
|
|
|
|
def sync_sale_price(self):
|
|
self.get_page_all_records(self.sale_order_price_process)
|
|
|
|
def sale_order_price_process(self, datas):
|
|
if not datas:
|
|
return
|
|
try:
|
|
convert_sale_data = map(lambda data:
|
|
{'name': data.name, 'order_lines': {
|
|
str(i): str(value.price_unit) for i, value in enumerate(data.order_line)
|
|
}
|
|
},
|
|
datas)
|
|
config = self.env['res.config.settings'].get_values()
|
|
url = config['bfm_url_new'] + '/api/sync/order/price'
|
|
json_data = {
|
|
'params': {
|
|
'data': list(convert_sale_data),
|
|
},
|
|
}
|
|
response = requests.post(url, json=json_data, data=None)
|
|
response = response.json()
|
|
if not response.get('error'):
|
|
result = response.get('result')
|
|
for need_change_sale_data in result:
|
|
res_order_lines_map = need_change_sale_data.get('order_lines')
|
|
if not res_order_lines_map:
|
|
continue
|
|
need_change_sale_order = self.env['sale.order'].sudo().search([('name', '=', need_change_sale_data.get('name'))])
|
|
for index,need_change_sale_order_line in enumerate(need_change_sale_order.order_line):
|
|
if not res_order_lines_map.get(str(index)):
|
|
continue
|
|
order_line = self.env['sale.order.line'].browse(need_change_sale_order_line.id)
|
|
new_price = res_order_lines_map.get(str(index))
|
|
if order_line:
|
|
# 修改单价
|
|
order_line.write({'remark': round(new_price*order_line.product_uom_qty,2)})
|
|
order_price = self.env['order.price'].sudo().search([('sale_order_id', '=',need_change_sale_order.id )])
|
|
if not order_price:
|
|
self.env['order.price'].sudo().create({'sale_order_id':need_change_sale_order.id})
|
|
else:
|
|
logging.error('同步销售订单价格失败 {}'.format(response.text))
|
|
raise UserError('同步销售订单价格失败')
|
|
except Exception as e:
|
|
raise UserError(e)
|
|
|
|
def get_page_all_records(self, func, page_size=100):
|
|
# 获取模型对象
|
|
model = self.env['sale.order'].sudo()
|
|
|
|
# 初始化分页参数
|
|
page_number = 1
|
|
while True:
|
|
# 计算偏移量
|
|
offset = (page_number - 1) * page_size
|
|
|
|
# 获取当前页的数据
|
|
records = model.search([], limit=page_size, offset=offset)
|
|
|
|
# 如果没有更多记录,退出循环
|
|
if not records:
|
|
break
|
|
|
|
# 将当前页的数据添加到结果列表
|
|
func(records)
|
|
# 增加页码
|
|
page_number += 1 |