diff --git a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js index 3b0799cc..5845dbae 100644 --- a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js +++ b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js @@ -31,7 +31,7 @@ export class MyCustomWidget extends Many2ManyCheckboxesField { } } -MyCustomWidget.template = "sf_plan.MyCustomWidget" +MyCustomWidget.template = "jikimo_frontend.MyCustomWidget" // MyCustomWidget.supportedTypes = ['many2many']; registry.category("fields").add("custom_many2many_checkboxes", MyCustomWidget); diff --git a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml index dedcfb11..bebae03b 100644 --- a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml +++ b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml @@ -1,7 +1,7 @@ - +
diff --git a/sf_maintenance/models/sf_equipment_maintenance_standards.py b/sf_maintenance/models/sf_equipment_maintenance_standards.py index 5bdc7956..47e7ddaf 100644 --- a/sf_maintenance/models/sf_equipment_maintenance_standards.py +++ b/sf_maintenance/models/sf_equipment_maintenance_standards.py @@ -19,6 +19,7 @@ class SfEquipmentSaintenanceStandards(models.Model): num = "%04d" % m return num code = fields.Char(string='编码', default=get_no) + remark = fields.Char('备注') maintenance_type = fields.Selection([('保养', '保养'), ("检修", "检修")], string='类型', default='保养') name = fields.Char(string='名称') created_user_id = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user) @@ -26,7 +27,7 @@ class SfEquipmentSaintenanceStandards(models.Model): maintenance_equipment_ids = fields.Many2many( 'maintenance.equipment', 'sf_maintenance_equipment_ids', - string='设备', + string='适用设备', domain="[('category_id', '=', maintenance_equipment_category_id)]" ) @@ -42,23 +43,29 @@ class SfEquipmentSaintenanceStandards(models.Model): if record.maintenance_type == '检修': record.write({'overhaul_ids': [(6, 0, record.maintenance_equipment_ids.ids)]}) - @api.onchange("maintenance_standards_ids") - def _reset_work_order_sequence(self): - for rec in self: - current_sequence = 1 - for work in rec.maintenance_standards_ids: - work.sequence = current_sequence - current_sequence += 1 + # @api.onchange("maintenance_standards_ids") + # def _reset_work_order_sequence(self): + # for rec in self: + # current_sequence = 1 + # for work in rec.maintenance_standards_ids: + # work.sequence = current_sequence + # current_sequence += 1 class SfSaintenanceStandards(models.Model): _name = 'maintenance.standards' _description = '维保项目' + _order = 'sequence' + sequence = fields.Integer('序号') name = fields.Char('维保项目') maintenance_standards = fields.Char('维保标准') + fault_type = fields.Selection( + [('电气类', '电气类'), ('机械类', '机械类'), ('程序类', '程序类'), ('系统类', '系统类')], string='类别') equipment_maintenance_standards_id = fields.Many2one('equipment.maintenance.standards', string='设备维保标准') maintenance_request_id = fields.Many2one('maintenance.request', string='设备维保计划') images = fields.One2many('maintenance.standard.image', 'standard_id', string='反馈图片') + Period = fields.Integer('周期/频次(天)') + remark = fields.Char('备注说明') class MaintenanceStandardImage(models.Model): diff --git a/sf_maintenance/models/sf_maintenance.py b/sf_maintenance/models/sf_maintenance.py index 98a508eb..d66de31e 100644 --- a/sf_maintenance/models/sf_maintenance.py +++ b/sf_maintenance/models/sf_maintenance.py @@ -44,6 +44,7 @@ class SfMaintenanceEquipment(models.Model): overhaul_period = fields.Integer(string='预防检修频次') overhaul_duration = fields.Float(string='检修时长') + overhaul_id = fields.Many2one('equipment.maintenance.standards', string='设备检修标准', domain="[('maintenance_type','=','检修')]") @@ -142,7 +143,7 @@ class SfMaintenanceEquipment(models.Model): active = fields.Boolean('有效', default=True) # 多个型号对应一个机床 machine_tool_id = fields.Many2one('sf.machine_tool', '机床') - sf_maintenance_logs_ids = fields.One2many('sf.maintenance.logs','maintenance_equipment_id', '设备故障日志') + sf_maintenance_logs_ids = fields.One2many('sf.maintenance.logs', 'maintenance_equipment_id', '设备故障日志') def name_get(self): @@ -474,3 +475,49 @@ class SfMaintenanceEquipment(models.Model): ('sf_maintenance_type', '=', '检修')]) if not next_requests: equipment._create_new_request1(equipment.overhaul_date) + + image_id = fields.Many2many('maintenance.equipment.image', 'equipment_id', string='设备图文') + +class MaintenanceStandardImage(models.Model): + _name = 'maintenance.equipment.image' + _description = '设备图文展示' + + + active = fields.Boolean('有效', default=True) + name = fields.Char('加工能力') + image = fields.Binary(string='设备图文') + equipment_id = fields.Many2many('maintenance.equipment', 'image_id', string='设备') + + @api.model + def name_search(self, name='', args=None, operator='ilike', limit=100): + # 调用父类的name_search方法,获取原始的结果列表 + res = super().name_search(name, args, operator, limit) + # 定义一个空字典用来存储id和name的映射关系 + name_dict = {} + # 遍历结果列表,将id和name存入字典中 + for item in res: + id = item[0] + name = item[1] + name_dict[id] = name + # 根据id列表搜索符合条件的记录 + records = self.browse(name_dict.keys()) + # 定义一个新的结果列表用来存储修改后的结果 + new_res = [] + # 遍历每条记录 + for record in records: + # 获取记录的id,name和image属性 + id = record.id + name = name_dict[id] + image = record.image + # 如果image不为空,将其转换为data URI scheme + if image: + data_uri = f"data:image/png;base64,{image.decode('utf-8')}" + else: + data_uri = "" + # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result + new_res.append([id, name, data_uri]) + # 返回新的结果列表 + return new_res + + + diff --git a/sf_maintenance/models/sf_maintenance_logs.py b/sf_maintenance/models/sf_maintenance_logs.py index 0204e676..9adf5be7 100644 --- a/sf_maintenance/models/sf_maintenance_logs.py +++ b/sf_maintenance/models/sf_maintenance_logs.py @@ -22,3 +22,5 @@ class SfMaintenanceLogs(models.Model): recovery_time = fields.Datetime(string='复原时间') fault_duration = fields.Float(string='故障时长') note = fields.Text(string='备注') + + diff --git a/sf_maintenance/security/ir.model.access.csv b/sf_maintenance/security/ir.model.access.csv index 039583ce..f5517576 100644 --- a/sf_maintenance/security/ir.model.access.csv +++ b/sf_maintenance/security/ir.model.access.csv @@ -4,6 +4,7 @@ access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,base.gr access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,base.group_user,1,1,1,1 access_maintenance_standards,maintenance_standards,model_maintenance_standards,base.group_user,1,1,1,1 access_maintenance_standard_image,maintenance_standard_image,model_maintenance_standard_image,base.group_user,1,1,1,1 +access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1 diff --git a/sf_maintenance/views/equipment_maintenance_standards_views.xml b/sf_maintenance/views/equipment_maintenance_standards_views.xml index 82fbf15b..1b30b68f 100644 --- a/sf_maintenance/views/equipment_maintenance_standards_views.xml +++ b/sf_maintenance/views/equipment_maintenance_standards_views.xml @@ -21,14 +21,26 @@ - - + + + + + + + + + + + + + + @@ -46,6 +58,7 @@ + diff --git a/sf_maintenance/views/maintenance_logs_views.xml b/sf_maintenance/views/maintenance_logs_views.xml index 33e22bf2..f226349f 100644 --- a/sf_maintenance/views/maintenance_logs_views.xml +++ b/sf_maintenance/views/maintenance_logs_views.xml @@ -34,25 +34,39 @@ sf.maintenance.logs
- - - - - - - - - - - - - - - - - - - +
+ +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + +
@@ -64,8 +78,8 @@ - - + + @@ -90,28 +104,28 @@ - - 设备故障日志 - ir.actions.act_window - sf.maintenance.logs - tree,form - - -

- 设备故障日志 -

-
-
+ + 设备故障日志 + ir.actions.act_window + sf.maintenance.logs + tree,form + + +

+ 设备故障日志 +

+
+
- - - - - - - + + + + + + + - + diff --git a/sf_maintenance/views/maintenance_request_views.xml b/sf_maintenance/views/maintenance_request_views.xml index 9c5ae694..83bd6e44 100644 --- a/sf_maintenance/views/maintenance_request_views.xml +++ b/sf_maintenance/views/maintenance_request_views.xml @@ -24,9 +24,11 @@ + + @@ -78,8 +80,16 @@
- - + + + + + + + + + + diff --git a/sf_maintenance/views/maintenance_views.xml b/sf_maintenance/views/maintenance_views.xml index b3d0a207..5c699af0 100644 --- a/sf_maintenance/views/maintenance_views.xml +++ b/sf_maintenance/views/maintenance_views.xml @@ -34,6 +34,7 @@ +
@@ -172,6 +177,16 @@ + + + + + + + + + @@ -210,11 +225,11 @@ - + -
- + + + + + + + + - + @@ -115,8 +127,11 @@ color="production_line_id" decoration-success="state == 'done'" progress_bar="name" - form_view_id="sf_production_plan_form"> - + form_view_id="sf_production_plan_form" + default_scale="year" + scales="day,week,month,year" + precision="{'day': 'hour:quarter', 'week': 'day:half', 'month': 'day', 'year': 'month:quarter'}"> + diff --git a/sf_sale/__manifest__.py b/sf_sale/__manifest__.py index b3cb99a1..283fd230 100644 --- a/sf_sale/__manifest__.py +++ b/sf_sale/__manifest__.py @@ -10,7 +10,7 @@ """, 'category': 'sf', 'website': 'https://www.sf.jikimo.com', - 'depends': ['sale_management', 'web_widget_model_viewer',], + 'depends': ['sale_management', 'web_widget_model_viewer', 'sale_stock'], 'data': [ 'security/group_security.xml', 'security/ir.model.access.csv', diff --git a/sf_sale/views/sale_order_view.xml b/sf_sale/views/sale_order_view.xml index f2b59f51..3255a58d 100644 --- a/sf_sale/views/sale_order_view.xml +++ b/sf_sale/views/sale_order_view.xml @@ -4,7 +4,7 @@ sale.order.tree sale.order - + diff --git a/sf_tool_management/models/tool_material_search.py b/sf_tool_management/models/tool_material_search.py index ab9c24f7..5917a097 100644 --- a/sf_tool_management/models/tool_material_search.py +++ b/sf_tool_management/models/tool_material_search.py @@ -105,79 +105,79 @@ class SfToolMaterialSearch(models.Model): cutting_speed_ids = fields.Many2many('sf.cutting.speed', string='切削速度Vc') feed_per_tooth_ids = fields.Many2many('sf.feed.per.tooth', 'rel_feed_per_tooth_ids', '每齿走刀量fz') - @api.constrains('suitable_machining_method_ids') - def _check_suitable_machining_method_ids(self): - for record in self: - if len(record.suitable_machining_method_ids) == 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("适合加工方式不能为空!") - - @api.constrains('blade_tip_characteristics_ids') - def _check_blade_tip_characteristics_ids(self): - for record in self: - if len(record.blade_tip_characteristics_ids) == 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刀尖特征不能为空!") - if len(record.blade_tip_characteristics_ids) > 1 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刀尖特征只能单选!") - - @api.constrains('handle_type_ids') - def _check_handle_type_ids(self): - for record in self: - if len(record.handle_type_ids) == 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("柄部类型不能为空!") - if len(record.handle_type_ids) > 1 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("柄部类型只能单选!") - - @api.constrains('cutting_direction_ids') - def _check_cutting_direction_ids(self): - for record in self: - if len(record.cutting_direction_ids) == 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("走刀方向不能为空!") - - @api.constrains('suitable_coolant_ids') - def _check_suitable_coolant_ids(self): - for record in self: - if not record.suitable_coolant_ids and self.cutting_tool_type == '整体式刀具': - raise ValidationError("适合冷却液不能为空!") - - @api.constrains('integral_total_length') - def _check_integral_total_length(self): - if self.integral_total_length <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("总长度不能为0") - - @api.constrains('integral_shank_length') - def _check_integral_shank_length(self): - if self.integral_shank_length <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("柄部长度不能为0") - - @api.constrains('integral_blade_length') - def _check_integral_blade_length(self): - if self.integral_blade_length <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刃部长度不能为0") - - @api.constrains('integral_blade_number') - def _check_integral_blade_number(self): - if self.integral_blade_number <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刃数不能为0") - - @api.constrains('integral_shank_diameter') - def _check_integral_shank_diameter(self): - if self.integral_shank_diameter <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("柄部直径不能为0") - - @api.constrains('integral_blade_diameter') - def _check_integral_blade_diameter(self): - if self.integral_blade_diameter <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刃部直径不能为0") - - @api.constrains('integral_run_out_accuracy_min') - def _check_integral_blade_diameter(self): - if self.integral_run_out_accuracy_min <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("端跳精度最小(min)不能为0") - - @api.constrains('integral_run_out_accuracy_max') - def _check_integral_run_out_accuracy_max(self): - if self.integral_run_out_accuracy_max <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("端跳精度最大(max)不能为0") + # @api.constrains('suitable_machining_method_ids') + # def _check_suitable_machining_method_ids(self): + # for record in self: + # if len(record.suitable_machining_method_ids) == 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("适合加工方式不能为空!") + # + # @api.constrains('blade_tip_characteristics_ids') + # def _check_blade_tip_characteristics_ids(self): + # for record in self: + # if len(record.blade_tip_characteristics_ids) == 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刀尖特征不能为空!") + # if len(record.blade_tip_characteristics_ids) > 1 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刀尖特征只能单选!") + # + # @api.constrains('handle_type_ids') + # def _check_handle_type_ids(self): + # for record in self: + # if len(record.handle_type_ids) == 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("柄部类型不能为空!") + # if len(record.handle_type_ids) > 1 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("柄部类型只能单选!") + # + # @api.constrains('cutting_direction_ids') + # def _check_cutting_direction_ids(self): + # for record in self: + # if len(record.cutting_direction_ids) == 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("走刀方向不能为空!") + # + # @api.constrains('suitable_coolant_ids') + # def _check_suitable_coolant_ids(self): + # for record in self: + # if not record.suitable_coolant_ids and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("适合冷却液不能为空!") + # + # @api.constrains('integral_total_length') + # def _check_integral_total_length(self): + # if self.integral_total_length <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("总长度不能为0") + # + # @api.constrains('integral_shank_length') + # def _check_integral_shank_length(self): + # if self.integral_shank_length <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("柄部长度不能为0") + # + # @api.constrains('integral_blade_length') + # def _check_integral_blade_length(self): + # if self.integral_blade_length <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刃部长度不能为0") + # + # @api.constrains('integral_blade_number') + # def _check_integral_blade_number(self): + # if self.integral_blade_number <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刃数不能为0") + # + # @api.constrains('integral_shank_diameter') + # def _check_integral_shank_diameter(self): + # if self.integral_shank_diameter <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("柄部直径不能为0") + # + # @api.constrains('integral_blade_diameter') + # def _check_integral_blade_diameter(self): + # if self.integral_blade_diameter <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刃部直径不能为0") + # + # @api.constrains('integral_run_out_accuracy_min') + # def _check_integral_blade_diameter(self): + # if self.integral_run_out_accuracy_min <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("端跳精度最小(min)不能为0") + # + # @api.constrains('integral_run_out_accuracy_max') + # def _check_integral_run_out_accuracy_max(self): + # if self.integral_run_out_accuracy_max <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("端跳精度最大(max)不能为0") # integral_front_angle = fields.Float('整体式刀具前角(°)') # integral_rear_angle = fields.Float('整体式刀具后角(°)') diff --git a/sf_tool_management/views/tool_material_search.xml b/sf_tool_management/views/tool_material_search.xml index 594073ff..d461efce 100644 --- a/sf_tool_management/views/tool_material_search.xml +++ b/sf_tool_management/views/tool_material_search.xml @@ -194,50 +194,56 @@ - + + - - - + - - - - - - - - - + + + + + + + - + - - + + + + + + + - - - - - - - - + + + + + + +