diff --git a/sf_machine_connect/views/WorkCenterBarcodes.xml b/sf_machine_connect/views/WorkCenterBarcodes.xml index 97fee70e..90058b59 100644 --- a/sf_machine_connect/views/WorkCenterBarcodes.xml +++ b/sf_machine_connect/views/WorkCenterBarcodes.xml @@ -10,6 +10,8 @@ + + diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 6aa4c6c3..6e6b71cd 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -34,6 +34,65 @@ class MrpProduction(models.Model): tool_state_remark = fields.Text(string='功能刀具状态备注(缺刀)', compute='_compute_tool_state_remark', store=True) tool_state_remark2 = fields.Text(string='功能刀具状态备注(无效刀)', readonly=True) + def _compute_default_delivery_status(self): + need_list = [ + 'pending_cam', + 'progress', + 'rework', + 'scrap', + 'to_close', + ] + try: + if self.state not in need_list: + return False + if not self.deadline_of_delivery: + return '已逾期' + hours = self.get_hours_diff() + if hours >= 48: + return '正常' + elif hours > 0 and hours < 48: + return '预警' + else: + return '已逾期' + except Exception as e: + logging.error("Error processing production ID {}: {}".format(self.id, e)) + raise e + + @api.depends('state', 'deadline_of_delivery') + def _compute_delivery_status(self): + need_list = [ + 'pending_cam', + 'progress', + 'rework', + 'scrap', + 'to_close', + ] + for production in self: + production.delivery_status = production._compute_default_delivery_status() + + delivery_status = fields.Selection([('正常', '正常'), ('预警', '预警'), ('已逾期', '已逾期')], string='交期状态', + store=True, + compute='_compute_delivery_status', + default=lambda self: self._compute_default_delivery_status()) + + def get_hours_diff(self): + # 获取当前日期和时间 + current_datetime = fields.Datetime.now() + + # 将 date_field 转换为 datetime 对象 + if self.deadline_of_delivery: + date_obj = fields.Date.from_string(self.deadline_of_delivery) + # 将 date 对象转换为 datetime 对象,设置时间为 00:00:00 + date_obj = datetime.datetime.combine(date_obj, datetime.time.min) + + # 计算两个日期之间的差值 + delta = date_obj - current_datetime + + # 返回差值的小时数 + return int(delta.total_seconds() / 3600) + else: + return 0.0 + @api.depends('procurement_group_id.mrp_production_ids.move_dest_ids.group_id.sale_id') def _compute_deadline_of_delivery(self): for production in self: @@ -690,6 +749,41 @@ class MrpProduction(models.Model): return True def _reset_work_order_sequence(self): + """ + 工单工序排序方法(新) + """ + for rec in self: + workorder_ids = rec.workorder_ids + technology_design_ids = rec.technology_design_ids + if workorder_ids.filtered(lambda item: item.state in ('返工', 'rework')): + # 获取返工后新生成的工单 + work_ids = workorder_ids.filtered(lambda item: item.sequence == 0) + # 对工单进行逐个插入 + for work_id in work_ids: + for order_id in rec.workorder_ids.filtered(lambda item: item.sequence > 0): + if work_id.name == order_id.name: + work_id.sequence = order_id.sequence + 1 + break + # 对该工单之后的工单工序进行加一 + work_order_ids = rec.workorder_ids.filtered(lambda item: item.sequence >= work_id.sequence) + for work in work_order_ids: + work.sequence = work.sequence + 1 + + else: + # 将工艺设计生成的工单序号赋值给工单的序号 + for work in workorder_ids: + td_ids = technology_design_ids.filtered( + lambda item: (item.route_id.name in work.name and item.process_parameters_id + and item.process_parameters_id == work.surface_technics_parameters_id) or + (item.route_id.name == work.name and item.panel + and item.panel == work.processing_panel)) + if td_ids: + work.sequence = td_ids[0].sequence + + def _reset_work_order_sequence_1(self): + """ + 工单工序排序方法(旧) + """ for rec in self: workorder_ids = rec.workorder_ids.filtered(lambda item: item.state in ('返工', 'rework')) # 产品模型类型 @@ -1205,7 +1299,7 @@ class MrpProduction(models.Model): 'move_dest_ids': production.move_dest_ids.ids, 'user_id': production.user_id.id} return production_values_str - + # 增加制造订单类型 production_type = fields.Selection( [('自动化产线加工', '自动化产线加工'), ('人工线下加工', '人工线下加工')], diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 9bfc82e1..8750de2c 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -147,6 +147,54 @@ class ResMrpWorkOrder(models.Model): tag_type = fields.Selection([("重新加工", "重新加工")], string="标签", tracking=True) + def _compute_default_construction_period_status(self): + need_list = [ + 'progress', + 'to be detected'] + try: + if self.state not in need_list: + return False + if not self.date_planned_finished: + return '已逾期' + hours = self.get_hours_diff() + if hours >= 12: + return '正常' + elif hours > 0 and hours < 12: + return '预警' + else: + return '已逾期' + except Exception as e: + logging.error("Error processing production ID {}: {}".format(self.id, e)) + raise e + + @api.depends('state', 'date_planned_finished') + def _compute_construction_period_status(self): + for worker in self: + worker.construction_period_status = worker._compute_default_construction_period_status() + + construction_period_status = fields.Selection([('正常', '正常'), ('预警', '预警'), ('已逾期', '已逾期')], string='工期状态', + store=True, + compute='_compute_construction_period_status', + default=lambda self: self._compute_default_construction_period_status()) + + def get_hours_diff(self): + # 获取当前日期和时间 + current_datetime = fields.Datetime.now() + + # 将 date_field 转换为 datetime 对象 + if self.date_planned_finished: + date_obj = fields.Datetime.from_string(self.date_planned_finished) + # 将 date 对象转换为 datetime 对象,设置时间为 00:00:00 + # date_obj = datetime.datetime.combine(date_obj, datetime.time.min) + + # 计算两个日期之间的差值 + delta = date_obj - current_datetime + + # 返回差值的小时数 + return int(delta.total_seconds() / 3600) + else: + return 0.0 + @api.depends('name', 'production_id.name') def _compute_surface_technics_picking_ids(self): for workorder in self: diff --git a/sf_manufacturing/models/sf_technology_design.py b/sf_manufacturing/models/sf_technology_design.py index 6aa49f5a..da9c88ee 100644 --- a/sf_manufacturing/models/sf_technology_design.py +++ b/sf_manufacturing/models/sf_technology_design.py @@ -20,7 +20,7 @@ class sf_technology_design(models.Model): workorders_values_str = [0, '', { 'route_id': route.id, 'panel': k, - 'process_parameters_id': False if route.routing_type.id != '表面工艺' else self.env[ + 'process_parameters_id': False if route.routing_type != '表面工艺' else self.env[ 'sf.production.process.parameter'].search( [('process_id', '=', route.surface_technics_id.id)]).id, 'sequence': i, diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index c6a40455..c218c2d5 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -36,7 +36,8 @@ decoration-success="reservation_state == 'assigned'"/> - + @@ -56,6 +57,16 @@ + + + + + 1 + + @@ -348,7 +359,7 @@ - + diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index 7aa669bf..c27f2175 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -32,8 +32,10 @@ - + @@ -257,11 +259,12 @@ -
@@ -482,11 +485,11 @@ - + - + @@ -543,11 +546,11 @@ - + - +