diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 536cc13a..644e08e5 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -34,6 +34,28 @@ 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) + @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: + # 确保 procurement_group_id 和相关字段存在 + if production.procurement_group_id: + # 获取相关的 sale_id + sale_order_id = production.procurement_group_id.mrp_production_ids.mapped( + 'move_dest_ids.group_id.sale_id') + + # 确保 sale_order_id 是有效的 ID 列表 + if sale_order_id: + # 获取 sale.order 记录 + sale_id = self.env['sale.order'].sudo().browse(sale_order_id.ids) # 使用 mapped 返回的 ID 列表 + + # 处理 sale_id + if sale_id: + # 假设我们只需要第一个 sale_id + production.deadline_of_delivery = sale_id[0].deadline_of_delivery if sale_id else False + else: + production.deadline_of_delivery = False + else: + production.deadline_of_delivery = False def _compute_default_delivery_status(self): try: if self.state == 'cancel': @@ -123,29 +145,6 @@ class MrpProduction(models.Model): 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: - # 确保 procurement_group_id 和相关字段存在 - if production.procurement_group_id: - # 获取相关的 sale_id - sale_order_id = production.procurement_group_id.mrp_production_ids.mapped( - 'move_dest_ids.group_id.sale_id') - - # 确保 sale_order_id 是有效的 ID 列表 - if sale_order_id: - # 获取 sale.order 记录 - sale_id = self.env['sale.order'].sudo().browse(sale_order_id.ids) # 使用 mapped 返回的 ID 列表 - - # 处理 sale_id - if sale_id: - # 假设我们只需要第一个 sale_id - production.deadline_of_delivery = sale_id[0].deadline_of_delivery if sale_id else False - else: - production.deadline_of_delivery = False - else: - production.deadline_of_delivery = False - @api.depends('workorder_ids.tool_state_remark') def _compute_tool_state_remark(self): for item in self: @@ -949,54 +948,30 @@ class MrpProduction(models.Model): self._reset_work_order_sequence() return True + def production_process(self, pro_plan): + type_map = {'装夹预调': False, 'CNC加工': False, '解除装夹': False} + # 最后一次加工结束时间 + last_time = pro_plan.date_planned_start + # 预置时间 + works = self.workorder_ids + for index,work in enumerate(works): + count = type_map.get(work.routing_type) + date_planned_end = None + date_planned_start = None + if self.production_type=='自动化产线加工': + date_planned_start,date_planned_end,last_time = work.auto_production_process(last_time,count,type_map) + elif self.production_type=='': + date_planned_start,date_planned_end,last_time = work.manual_offline_process(last_time,index) + work.update_work_start_end(date_planned_start,date_planned_end) + # def def process_range_time(self): for production in self: works = production.workorder_ids pro_plan = self.env['sf.production.plan'].search([('production_id', '=', production.id)], limit=1) if not pro_plan: continue - type_map = {'装夹预调': False, 'CNC加工': False, '解除装夹': False} - # 最后一次加工结束时间 - last_time = pro_plan.date_planned_start - # 预置时间 - for work in works: - count = type_map.get(work.routing_type) - date_planned_end = None - date_planned_start = None - duration_expected = datetime.timedelta(minutes=work.duration_expected) - reserve_time = datetime.timedelta(minutes=work.reserved_duration) - if not count: - # 第一轮加工 - if work.routing_type == '装夹预调': - date_planned_end = last_time - reserve_time - date_planned_start = date_planned_end - duration_expected - elif work.routing_type == 'CNC加工': - date_planned_start = last_time - date_planned_end = last_time + duration_expected - last_time = date_planned_end - else: - date_planned_start = last_time + reserve_time - date_planned_end = date_planned_start + duration_expected - last_time = date_planned_end - type_map.update({work.routing_type: True}) - else: - date_planned_start = last_time + reserve_time - date_planned_end = date_planned_start + duration_expected - last_time = date_planned_end - work.leave_id.write({ - 'date_from': date_planned_start, - 'date_to': date_planned_end, - }) - # work.write({'date_planned_start': date_planned_start, 'date_planned_finished': date_planned_end}) - # 设置一个较大的结束时间,防止在设置开始时间时,结束时间小于开始时间 - work.date_planned_finished = datetime.datetime.today() + datetime.timedelta(days=100) - work.date_planned_start = date_planned_start - work.date_planned_finished = date_planned_end - routing_workcenter = self.env['mrp.routing.workcenter'].sudo().search( - [('name', '=', work.routing_type)]) - - work.write({'date_planned_start': date_planned_start, 'date_planned_finished': date_planned_end, - 'duration_expected': routing_workcenter.time_cycle}) + if production.production_type: + production.production_process(pro_plan) # 修改标记已完成方法 def button_mark_done1(self): diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 3443094f..c8267b41 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -2028,3 +2028,55 @@ class CMMprogram(models.Model): 'program_create_date': datetime.strptime(item['program_create_date'], '%Y-%m-%d %H:%M:%S'), })) return cmm_program + + def update_work_start_end(self,date_planned_start,date_planned_end): + self.leave_id.write({ + 'date_from': date_planned_start, + 'date_to': date_planned_end, + }) + self.date_planned_finished = datetime.datetime.today() + datetime.timedelta(days=100) + self.date_planned_start = date_planned_start + self.date_planned_finished = date_planned_end + routing_workcenter = self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', self.routing_type)]) + + self.write({'date_planned_start': date_planned_start, 'date_planned_finished': date_planned_end, + 'duration_expected': routing_workcenter.time_cycle}) + + def auto_production_process(self, last_time, is_first, type_map): + date_planned_end = None + date_planned_start = None + duration_expected = datetime.timedelta(minutes=self.duration_expected) + reserve_time = datetime.timedelta(minutes=self.reserved_duration) + if is_first: + # 第一轮加工 + if self.routing_type == '装夹预调': + date_planned_end = last_time - reserve_time + date_planned_start = date_planned_end - duration_expected + elif self.routing_type == 'CNC加工': + date_planned_start = last_time + date_planned_end = last_time + duration_expected + last_time = date_planned_end + else: + date_planned_start = last_time + reserve_time + date_planned_end = date_planned_start + duration_expected + last_time = date_planned_end + type_map.update({self.routing_type: True}) + else: + date_planned_start = last_time + reserve_time + date_planned_end = date_planned_start + duration_expected + last_time = date_planned_end + return date_planned_start, date_planned_end, last_time + def manual_offline_process(self,last_time,is_first): + date_planned_end = None + date_planned_start = None + duration_expected = datetime.timedelta(minutes=self.duration_expected) + reserve_time = datetime.timedelta(minutes=self.reserved_duration) + if is_first: + date_planned_start = last_time + date_planned_end = last_time + duration_expected + + else: + date_planned_start = last_time + reserve_time + date_planned_end = date_planned_start + duration_expected + return date_planned_start, date_planned_end,last_time \ No newline at end of file