diff --git a/sf_base/models/tool_base_new.py b/sf_base/models/tool_base_new.py
index 11af399c..c619ea9f 100644
--- a/sf_base/models/tool_base_new.py
+++ b/sf_base/models/tool_base_new.py
@@ -76,21 +76,20 @@ class CuttingToolModel(models.Model):
integral_run_out_accuracy_max = fields.Char('整体式刀具端跳精度max')
integral_run_out_accuracy_min = fields.Char('整体式刀具端跳精度min')
- fit_blade_shape_id = fields.Many2many('maintenance.equipment.image', 'fit_blade_shape_library_rel',
+ fit_blade_shape_id = fields.Many2one('maintenance.equipment.image',
'适配刀片形状', domain=[('type', '=', '刀片形状')])
suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image',
'suitable_machining_method_library_rel',
'适合加工方式', domain=[('type', '=', '加工能力')])
- blade_tip_characteristics_id = fields.Many2many('maintenance.equipment.image',
- 'blade_tip_character_library_rel',
+ blade_tip_characteristics_id = fields.Many2one('maintenance.equipment.image',
'刀尖特征', domain=[('type', '=', '刀尖特征')])
- handle_type_ids = fields.Many2many('maintenance.equipment.image', 'handle_type_library_rel',
+ handle_type_id = fields.Many2one('maintenance.equipment.image',
'柄部类型', domain=[('type', '=', '柄部类型')])
cutting_direction_ids = fields.Many2many('maintenance.equipment.image', 'cutting_direction_library_rel',
'走刀方向', domain=[('type', '=', '走刀方向')])
suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', 'suitable_coolant_library_rel',
'适合冷却液', domain=[('type', '=', '冷却液')])
- compaction_way_ids = fields.Many2many('maintenance.equipment.image', 'compaction_way_library_rel',
+ compaction_way_id = fields.Many2one('maintenance.equipment.image',
'压紧方式', domain=[('type', '=', '压紧方式')])
integral_tool_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
'standard_library_id', string='整体式刀具基本参数')
@@ -218,3 +217,16 @@ class MaintenanceStandardImage(models.Model):
new_res.append([id, name, data_uri])
# 返回新的结果列表
return new_res
+
+ @api.model
+ def search_read(self, domain=None, fields=None, offset=0, limit=None, order=None):
+ # 调用原生的search_read方法获取记录
+ records = super(MaintenanceStandardImage, self).search_read(domain, fields, offset, limit, order)
+ # 遍历每条记录,添加image数据
+ for record in records:
+ image_field = self.browse(record['id']).image
+ if image_field:
+ record['image'] = f"data:image/png;base64,{image_field.decode('utf-8')}"
+ else:
+ record['image'] = ""
+ return records
diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml
index c1e03123..e7015700 100644
--- a/sf_base/views/tool_views.xml
+++ b/sf_base/views/tool_views.xml
@@ -170,7 +170,7 @@
-
+
@@ -180,15 +180,15 @@
+ widget="many2one_radio"/>
-
+
-
+
diff --git a/sf_dlm_management/views/product_template_management_view.xml b/sf_dlm_management/views/product_template_management_view.xml
index 01d40a17..485499d4 100644
--- a/sf_dlm_management/views/product_template_management_view.xml
+++ b/sf_dlm_management/views/product_template_management_view.xml
@@ -390,7 +390,7 @@
-
+
@@ -400,16 +400,16 @@
+ widget="many2one_radio"/>
-
+
-
+
diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py
index 5a079abe..124e0058 100644
--- a/sf_manufacturing/models/product_template.py
+++ b/sf_manufacturing/models/product_template.py
@@ -87,21 +87,19 @@ class ResProductMo(models.Model):
cutting_tool_run_out_accuracy_max = fields.Float('端跳精度max', digits=(6, 1))
cutting_tool_run_out_accuracy_min = fields.Float('端跳精度min', digits=(6, 1))
cutting_tool_blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20)
- fit_blade_shape_id = fields.Many2many('maintenance.equipment.image', 'rel_fit_blade_shape_product_template',
+ fit_blade_shape_id = fields.Many2one('maintenance.equipment.image',
'适配刀片形状', domain=[('type', '=', '刀片形状')])
suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image',
'rel_machining_product_template', '适合加工方式',
domain=[('type', '=', '加工能力')])
- blade_tip_characteristics_id = fields.Many2many('maintenance.equipment.image',
- 'rel_blade_tip_product_template', '刀尖特征',
+ blade_tip_characteristics_id = fields.Many2one('maintenance.equipment.image', '刀尖特征',
domain=[('type', '=', '刀尖特征')])
- handle_type_ids = fields.Many2many('maintenance.equipment.image', 'rel_handle_product_template', '柄部类型',
- domain=[('type', '=', '柄部类型')])
+ handle_type_id = fields.Many2one('maintenance.equipment.image', '柄部类型',domain=[('type', '=', '柄部类型')])
cutting_direction_ids = fields.Many2many('maintenance.equipment.image', 'rel_cutting_product_template',
'走刀方向', domain=[('type', '=', '走刀方向')])
suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', 'rel_coolant_product_template',
'适合冷却液', domain=[('type', '=', '冷却液')])
- compaction_way_ids = fields.Many2many('maintenance.equipment.image', 'rel_compaction_product_template',
+ compaction_way_id = fields.Many2one('maintenance.equipment.image',
'压紧方式', domain=[('type', '=', '压紧方式')])
@api.onchange('cutting_tool_material_id')
@@ -141,10 +139,10 @@ class ResProductMo(models.Model):
item.fit_blade_shape_id = False
item.suitable_machining_method_ids = False
item.blade_tip_characteristics_id = False
- item.handle_type_ids = False
+ item.handle_type_id = False
item.cutting_direction_ids = False
item.suitable_coolant_ids = False
- item.compaction_way_ids = False
+ item.compaction_way_id = False
item.cutting_speed_ids = False
item.feed_per_tooth_ids = False
@@ -288,13 +286,9 @@ class ResProductMo(models.Model):
self.suitable_machining_method_ids = [(6, 0, [])] if not \
self.cutting_tool_model_id.suitable_machining_method_ids \
else [(6, 0, self.cutting_tool_model_id.suitable_machining_method_ids.ids)]
- self.blade_tip_characteristics_id = [(6, 0, [])] if not \
- self.cutting_tool_model_id.blade_tip_characteristics_id \
- else [(6, 0, self.cutting_tool_model_id.blade_tip_characteristics_id.ids)]
+ self.blade_tip_characteristics_id = self.cutting_tool_model_id.blade_tip_characteristics_id.id
- self.handle_type_ids = [(6, 0,
- [])] if not self.cutting_tool_model_id.handle_type_ids else [
- (6, 0, self.cutting_tool_model_id.handle_type_ids.ids)]
+ self.handle_type_id = self.cutting_tool_model_id.handle_type_id.id
self.cutting_direction_ids = [(6, 0,
[])] if not self.cutting_tool_model_id.cutting_direction_ids else [
@@ -303,9 +297,8 @@ class ResProductMo(models.Model):
self.suitable_coolant_ids = [(6, 0,
[])] if not self.cutting_tool_model_id.suitable_coolant_ids else [
(6, 0, self.cutting_tool_model_id.suitable_coolant_ids.ids)]
- self.compaction_way_ids = [(6, 0,
- [])] if not self.cutting_tool_model_id.compaction_way_ids else [
- (6, 0, self.cutting_tool_model_id.compaction_way_ids.ids)]
+ self.compaction_way_id = self.cutting_tool_model_id.compaction_way_id.id
+ self.fit_blade_shape_id = self.cutting_tool_model_id.fit_blade_shape_id.id
else:
self.cutting_tool_type_id = False
self.brand_id = False
@@ -338,28 +331,28 @@ class ResProductMo(models.Model):
self.fit_blade_shape_id = False
self.suitable_machining_method_ids = False
self.blade_tip_characteristics_id = False
- self.handle_type_ids = False
+ self.handle_type_id = False
self.cutting_direction_ids = False
self.suitable_coolant_ids = False
- self.compaction_way_ids = False
+ self.compaction_way_id = False
self.cutting_speed_ids = False
self.feed_per_tooth_ids = False
@api.constrains('fit_blade_shape_id', 'suitable_machining_method_ids', 'blade_tip_characteristics_id',
- 'handle_type_ids', 'cutting_direction_ids', 'suitable_coolant_ids', 'compaction_way_ids')
+ 'handle_type_id', 'cutting_direction_ids', 'suitable_coolant_ids', 'compaction_way_id')
def _check_cutting_tool_ability(self):
if self.cutting_tool_type in ['整体式刀具', '刀片', '刀杆', '刀盘']:
if self.cutting_tool_type in ['刀片', '刀杆', '刀盘']:
if not self.fit_blade_shape_id:
raise ValidationError("请选择适配刀片形状")
if self.cutting_tool_type in ['刀杆', '刀盘']:
- if not self.compaction_way_ids:
+ if not self.compaction_way_id:
raise ValidationError("请选择压紧方式")
if self.cutting_tool_type == '刀片':
if not self.suitable_coolant_ids:
raise ValidationError("请选择适合冷却液")
elif self.cutting_tool_type == '整体式刀具':
- if not self.handle_type_ids:
+ if not self.handle_type_id:
raise ValidationError("请选择柄部类型")
if not self.suitable_coolant_ids:
raise ValidationError("请选择适合冷却液")
diff --git a/sf_mrs_connect/controllers/controllers.py b/sf_mrs_connect/controllers/controllers.py
index 1d21f4f1..a6a1b25f 100644
--- a/sf_mrs_connect/controllers/controllers.py
+++ b/sf_mrs_connect/controllers/controllers.py
@@ -1,9 +1,7 @@
# -*- coding: utf-8 -*-
+import logging
import json
import base64
-import logging
-import os
-from datetime import date, timedelta
from odoo import http
from odoo.http import request
diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py
index 7439c87b..1542cf99 100644
--- a/sf_mrs_connect/models/sync_common.py
+++ b/sf_mrs_connect/models/sync_common.py
@@ -1800,6 +1800,7 @@ class Cutting_tool_standard_library(models.Model):
for feed_per_tooth_4_item in item['feed_per_tooth_4']:
feed_per_tooth_4_list.append(
self.env['sf.feed.per.tooth']._json_feed_per_tooth(feed_per_tooth_4_item))
+
if not cutting_tool_standard_library:
self.create({
"code": item['code'].replace("JKM", result['factory_short_name']),
@@ -1820,21 +1821,22 @@ class Cutting_tool_standard_library(models.Model):
"cutter_pad_ids": [(6, 0, [])] if not item.get('cutter_pad_codes') else self.env[
'sf.cutting_tool.standard.library']._get_ids(item['cutter_pad_codes'],
result['factory_short_name']),
- "fit_blade_shape_id": [(6, 0, [])] if not item.get('fit_blade_shape') else self.env[
- 'maintenance.equipment.image']._get_ids(item['fit_blade_shape']),
+ "fit_blade_shape_id": False if not item['fit_blade_shape'] else self.env[
+ 'maintenance.equipment.image'].search(
+ [('name', '=', item['fit_blade_shape'])]).id,
"suitable_machining_method_ids": [(6, 0, [])] if not item.get(
'suitable_machining_methods') else self.env['maintenance.equipment.image']._get_ids(
item['suitable_machining_methods']),
- "blade_tip_characteristics_id": [(6, 0, [])] if not item.get('blade_tip_characteristics') else
- self.env['maintenance.equipment.image']._get_ids(item['blade_tip_characteristics']),
- "handle_type_ids": [(6, 0, [])] if not item.get('handle_type') else self.env[
- 'maintenance.equipment.image']._get_ids(item['handle_type']),
+ "blade_tip_characteristics_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['blade_tip_characteristics'])]).id,
+ "handle_type_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['handle_type'])]).id,
"cutting_direction_ids": [(6, 0, [])] if not item.get('cutting_direction') else self.env[
'maintenance.equipment.image']._get_ids(item['cutting_direction']),
"suitable_coolant_ids": [(6, 0, [])] if not item.get('suitable_coolant') else self.env[
'maintenance.equipment.image']._get_ids(item['suitable_coolant']),
- "compaction_way_ids": [(6, 0, [])] if not item.get('compaction_way') else self.env[
- 'maintenance.equipment.image']._get_ids(item['compaction_way']),
+ "compaction_way_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['compaction_way'])]).id,
"integral_tool_basic_parameters_ids": integral_tool_basic_param_list,
"blade_basic_parameters_ids": blade_basic_param_list,
"cutter_bar_basic_parameters_ids": cutter_arbor_basic_param_list,
@@ -1868,21 +1870,22 @@ class Cutting_tool_standard_library(models.Model):
"cutter_pad_ids": [(6, 0, [])] if not item.get('cutter_pad_codes') else self.env[
'sf.cutting_tool.standard.library']._get_ids(item['cutter_pad_codes'],
result['factory_short_name']),
- "fit_blade_shape_id": [(6, 0, [])] if not item.get('fit_blade_shape') else self.env[
- 'maintenance.equipment.image']._get_ids(item['fit_blade_shape']),
+ "fit_blade_shape_id": False if not item['fit_blade_shape'] else self.env[
+ 'maintenance.equipment.image'].search(
+ [('name', '=', item['fit_blade_shape'])]).id,
"suitable_machining_method_ids": [(6, 0, [])] if not item.get(
'suitable_machining_methods') else self.env['maintenance.equipment.image']._get_ids(
item['suitable_machining_methods']),
- "blade_tip_characteristics_id": [(6, 0, [])] if not item.get('blade_tip_characteristics') else
- self.env['maintenance.equipment.image']._get_ids(item['blade_tip_characteristics']),
- "handle_type_ids": [(6, 0, [])] if not item.get('handle_type') else self.env[
- 'maintenance.equipment.image']._get_ids(item['handle_type']),
+ "blade_tip_characteristics_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['blade_tip_characteristics'])]).id,
+ "handle_type_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['handle_type'])]).id,
"cutting_direction_ids": [(6, 0, [])] if not item.get('cutting_direction') else self.env[
'maintenance.equipment.image']._get_ids(item['cutting_direction']),
"suitable_coolant_ids": [(6, 0, [])] if not item.get('suitable_coolant') else self.env[
'maintenance.equipment.image']._get_ids(item['suitable_coolant']),
- "compaction_way_ids": [(6, 0, [])] if not item.get('compaction_way') else self.env[
- 'maintenance.equipment.image']._get_ids(item['compaction_way']),
+ "compaction_way_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['compaction_way'])]).id,
"integral_tool_basic_parameters_ids": integral_tool_basic_param_list,
"blade_basic_parameters_ids": blade_basic_param_list,
"cutter_bar_basic_parameters_ids": cutter_arbor_basic_param_list,
@@ -1985,21 +1988,22 @@ class Cutting_tool_standard_library(models.Model):
"cutter_pad_ids": [(6, 0, [])] if not item.get('cutter_pad_codes') else self.env[
'sf.cutting_tool.standard.library']._get_ids(item['cutter_pad_codes'],
result['factory_short_name']),
- "fit_blade_shape_id": [(6, 0, [])] if not item.get('fit_blade_shape') else self.env[
- 'maintenance.equipment.image']._get_ids(item['fit_blade_shape']),
+ "fit_blade_shape_id": False if not item['fit_blade_shape'] else self.env[
+ 'maintenance.equipment.image'].search(
+ [('name', '=', item['fit_blade_shape'])]).id,
"suitable_machining_method_ids": [(6, 0, [])] if not item.get(
'suitable_machining_method') else self.env['maintenance.equipment.image']._get_ids(
item['suitable_machining_method']),
- "blade_tip_characteristics_id": [(6, 0, [])] if not item.get('blade_tip_characteristics') else
- self.env['maintenance.equipment.image']._get_ids(item['blade_tip_characteristics']),
- "handle_type_ids": [(6, 0, [])] if not item.get('handle_type') else self.env[
- 'maintenance.equipment.image']._get_ids(item['handle_type']),
+ "blade_tip_characteristics_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['blade_tip_characteristics'])]).id,
+ "handle_type_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['handle_type'])]).id,
"cutting_direction_ids": [(6, 0, [])] if not item.get('cutting_direction') else self.env[
'maintenance.equipment.image']._get_ids(item['cutting_direction']),
"suitable_coolant_ids": [(6, 0, [])] if not item.get('suitable_coolant') else self.env[
'maintenance.equipment.image']._get_ids(item['suitable_coolant']),
- "compaction_way_ids": [(6, 0, [])] if not item.get('compaction_way') else self.env[
- 'maintenance.equipment.image']._get_ids(item['compaction_way']),
+ "compaction_way_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['compaction_way'])]).id,
"integral_tool_basic_parameters_ids": integral_tool_basic_param_list,
"blade_basic_parameters_ids": blade_basic_param_list,
"cutter_bar_basic_parameters_ids": cutter_arbor_basic_param_list,
@@ -2033,21 +2037,22 @@ class Cutting_tool_standard_library(models.Model):
"cutter_pad_ids": [(6, 0, [])] if not item.get('cutter_pad_codes') else self.env[
'sf.cutting_tool.standard.library']._get_ids(item['cutter_pad_codes'],
result['factory_short_name']),
- "fit_blade_shape_id": [(6, 0, [])] if not item.get('fit_blade_shape') else self.env[
- 'maintenance.equipment.image']._get_ids(item['fit_blade_shape']),
+ "fit_blade_shape_id": False if not item['fit_blade_shape'] else self.env[
+ 'maintenance.equipment.image'].search(
+ [('name', '=', item['fit_blade_shape'])]).id,
"suitable_machining_method_ids": [(6, 0, [])] if not item.get(
'suitable_machining_methods') else self.env['maintenance.equipment.image']._get_ids(
item['suitable_machining_methods']),
- "blade_tip_characteristics_id": [(6, 0, [])] if not item.get('blade_tip_characteristics') else
- self.env['maintenance.equipment.image']._get_ids(item['blade_tip_characteristics']),
- "handle_type_ids": [(6, 0, [])] if not item.get('handle_type') else self.env[
- 'maintenance.equipment.image']._get_ids(item['handle_type']),
+ "blade_tip_characteristics_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['blade_tip_characteristics'])]).id,
+ "handle_type_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['handle_type'])]).id,
"cutting_direction_ids": [(6, 0, [])] if not item.get('cutting_direction') else self.env[
'maintenance.equipment.image']._get_ids(item['cutting_direction']),
"suitable_coolant_ids": [(6, 0, [])] if not item.get('suitable_coolant') else self.env[
'maintenance.equipment.image']._get_ids(item['suitable_coolant']),
- "compaction_way_ids": [(6, 0, [])] if not item.get('compaction_way') else self.env[
- 'maintenance.equipment.image']._get_ids(item['compaction_way']),
+ "compaction_way_id": self.env['maintenance.equipment.image'].search(
+ [('name', '=', item['compaction_way'])]).id,
"integral_tool_basic_parameters_ids": integral_tool_basic_param_list,
"blade_basic_parameters_ids": blade_basic_param_list,
"cutter_bar_basic_parameters_ids": cutter_arbor_basic_param_list,
diff --git a/sf_sale/security/group_security.xml b/sf_sale/security/group_security.xml
index 33890d49..00e4561a 100644
--- a/sf_sale/security/group_security.xml
+++ b/sf_sale/security/group_security.xml
@@ -2,7 +2,7 @@
销售经理只可以查看本人所在的团队
-
+
[('crm_team_member_ids.user_id','=',user.id)]
@@ -12,7 +12,7 @@
销售总监
-
+
[(1,'=',1)]
diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py
index c14aa16f..f2aaaff0 100644
--- a/sf_tool_management/models/base.py
+++ b/sf_tool_management/models/base.py
@@ -81,12 +81,11 @@ class FunctionalCuttingToolEntity(models.Model):
suitable_machining_method_ids = fields.Many2many(
'maintenance.equipment.image', 'rel_machining_product_template_tool_entity', '适合加工方式',
domain=[('type', '=', '加工能力')], related='cutting_tool_integral_model_id.suitable_machining_method_ids')
- blade_tip_characteristics_id = fields.Many2many(
- 'maintenance.equipment.image', 'rel_blade_tip_product_template_tool_entity', '刀尖特征',
+ blade_tip_characteristics_id = fields.Many2one('maintenance.equipment.image', '刀尖特征',
domain=[('type', '=', '刀尖特征')], related='cutting_tool_integral_model_id.blade_tip_characteristics_id')
- handle_type_ids = fields.Many2many(
- 'maintenance.equipment.image', 'rel_handle_product_template_tool_entity', '柄部类型',
- domain=[('type', '=', '柄部类型')], related='cutting_tool_integral_model_id.handle_type_ids')
+ handle_type_id = fields.Many2one(
+ 'maintenance.equipment.image', '柄部类型',
+ domain=[('type', '=', '柄部类型')], related='cutting_tool_integral_model_id.handle_type_id')
cutting_direction_ids = fields.Many2many(
'maintenance.equipment.image', 'rel_cutting_product_template_tool_entity', '走刀方向',
domain=[('type', '=', '走刀方向')], related='cutting_tool_integral_model_id.cutting_direction_ids')
diff --git a/sf_tool_management/models/tool_material_search.py b/sf_tool_management/models/tool_material_search.py
index 2453aafb..e78766f4 100644
--- a/sf_tool_management/models/tool_material_search.py
+++ b/sf_tool_management/models/tool_material_search.py
@@ -99,12 +99,9 @@ class SfToolMaterialSearch(models.Model):
suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image',
'rel_machining_product_template_material_search', '适合加工方式',
domain=[('type', '=', '加工能力')])
- blade_tip_characteristics_id = fields.Many2many('maintenance.equipment.image',
- 'rel_blade_tip_product_template_material_search', '刀尖特征',
+ blade_tip_characteristics_id = fields.Many2one('maintenance.equipment.image', '刀尖特征',
domain=[('type', '=', '刀尖特征')])
- handle_type_ids = fields.Many2many('maintenance.equipment.image',
- 'rel_handle_product_template_material_search', '柄部类型',
- domain=[('type', '=', '柄部类型')])
+ handle_type_id = fields.Many2many('maintenance.equipment.image', '柄部类型',domain=[('type', '=', '柄部类型')])
cutting_direction_ids = fields.Many2many('maintenance.equipment.image',
'rel_cutting_product_template_material_search', '走刀方向',
domain=[('type', '=', '走刀方向')])
diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml
index 8ebb20d4..d1be9bf2 100644
--- a/sf_tool_management/views/tool_base_views.xml
+++ b/sf_tool_management/views/tool_base_views.xml
@@ -116,12 +116,12 @@
-
+
diff --git a/sf_tool_management/views/tool_material_search.xml b/sf_tool_management/views/tool_material_search.xml
index 768786e6..3bb5d3ea 100644
--- a/sf_tool_management/views/tool_material_search.xml
+++ b/sf_tool_management/views/tool_material_search.xml
@@ -231,10 +231,10 @@
-
+
-
+