# -*- 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("同步刀具物料每齿走刀量完成") self.env['sf.machining.accuracy'].sync_machining_accuracy_all() _logger.info("同步加工精度完成") self.env['sf.embryo.redundancy'].sync_embryo_redundancy_all() _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