From 77852900a398546cc820802036eb09e650122ed5 Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Tue, 7 Nov 2023 10:17:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8E=92=E7=A8=8B=E5=90=8E?= =?UTF-8?q?=E5=90=84=E5=B7=A5=E5=8D=95=E6=97=B6=E9=97=B4=E9=A2=84=E4=BC=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_workorder.py | 19 ++++- sf_plan/models/custom_plan.py | 69 ++++++++++++++---- .../static/src/xlsx/sf_production_plan.xlsx | Bin 10244 -> 10400 bytes .../views/operations_rename_menu.xml | 44 +++++------ 4 files changed, 95 insertions(+), 37 deletions(-) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index b4fa41c8..1f304950 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -187,6 +187,23 @@ class ResMrpWorkOrder(models.Model): # 拼接工单对象属性值 def json_workorder_str(self, k, production, route): + # 计算预计时长duration_expected + if route.routing_type == '切割': + duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '切割')]).time_cycle + elif route.routing_type == '获取CNC加工程序': + duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '获取CNC加工程序')]).time_cycle + elif route.routing_type == '工件装夹': + duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '工件装夹')]).time_cycle + elif route.routing_type == '前置三元定位检测': + duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '前置三元定位检测')]).time_cycle + elif route.routing_type == 'CNC加工': + duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', 'CNC加工')]).time_cycle + elif route.routing_type == '后置三元质量检测': + duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '后置三元质量检测')]).time_cycle + elif route.routing_type == '解除装夹': + duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', '解除装夹')]).time_cycle + else: + duration_expected = 60 workorders_values_str = [0, '', { 'product_uom_id': production.product_uom_id.id, 'qty_producing': 0, @@ -201,7 +218,7 @@ class ResMrpWorkOrder(models.Model): production.product_id), 'date_planned_start': False, 'date_planned_finished': False, - 'duration_expected': 60, + 'duration_expected': duration_expected, 'duration': 0, }] diff --git a/sf_plan/models/custom_plan.py b/sf_plan/models/custom_plan.py index e80a7783..9c94fa22 100644 --- a/sf_plan/models/custom_plan.py +++ b/sf_plan/models/custom_plan.py @@ -11,6 +11,7 @@ class sf_production_plan(models.Model): _name = 'sf.production.plan' # _inherit = 'mrp.production' _description = 'sf_production_plan' + _order = 'create_date desc' state = fields.Selection([ ('draft', '待排程'), @@ -41,18 +42,12 @@ class sf_production_plan(models.Model): actual_end_time = fields.Datetime(string='实际结束时间') shift = fields.Char(string='班次') - # 序号、坯料编号、坯料名称、材质、数量、长度、宽度、厚度、直径、计划开始时间、计划结束时间、状态(已产出与待产出)、操作、创建人、创建时间、客户名称、订单号、行号、长度、宽度、厚度、直径、交货数量、交货日期 # sequence = fields.Integer(string='序号', required=True, copy=False, readonly=True, index=True, # default=lambda self: self.env['ir.sequence'].sudo().next_by_code('sf.pl.plan')) sequence = fields.Integer(string='序号', copy=False, readonly=True, index=True) current_operation_name = fields.Char(string='当前工序名称', size=64, default='生产计划') - - - - - # state = fields.Selection([ # ('未排程', '未排程'), ('已排程', '已排程')], string='State', copy=False, index=True, readonly=True, # store=True, tracking=True) @@ -179,16 +174,62 @@ class sf_production_plan(models.Model): else: aa = self.env['mrp.production'].sudo().search([('name', '=', self.name)]) workorder_time = 0 - print(aa.workorder_ids) - print(type(aa.workorder_ids)) - if aa.workorder_ids: - for item in aa.workorder_ids: - current_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', item.id)]) - workorder_time += current_workorder.duration_expected - print(workorder_time) + workorder_id_list = self.production_id.workorder_ids.ids + print(workorder_id_list) + print(type(self.production_id.workorder_ids)) + if self.production_id.workorder_ids: + for item in self.production_id.workorder_ids: + if item.name == 'CNC加工': + item.date_planned_start = self.date_planned_start + item.date_planned_finished = item.date_planned_start + timedelta( + minutes=self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', 'CNC加工')]).time_cycle) + item.duration_expected = self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', 'CNC加工')]).time_cycle + # print(item.id) + sequence = workorder_id_list.index(item.id) - 1 + # print('sequence', sequence) + # print('total', len(workorder_id_list)) + # 计算CNC加工之前工单的开始结束时间 + for i in range(sequence): + current_workorder_id = (item.id - (i + 1)) + current_workorder_obj = self.env['mrp.workorder'].sudo().search( + [('id', '=', current_workorder_id)]) + old_workorder_obj = self.env['mrp.workorder'].sudo().search( + [('id', '=', (current_workorder_id + 1))]) + work_order = self.env['mrp.workorder'].sudo().search( + [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)]) + work_order.date_planned_finished = old_workorder_obj.date_planned_start + work_order.date_planned_start = old_workorder_obj.date_planned_start - timedelta( + minutes=self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', current_workorder_obj.name)]).time_cycle) + # work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', current_workorder_obj.name)]).time_cycle + # 计算CNC加工之后工单的开始结束时间 + for j in range(len(workorder_id_list) - sequence - 2): + current_workorder_id = (item.id + (j + 1)) + current_workorder_obj = self.env['mrp.workorder'].sudo().search( + [('id', '=', current_workorder_id)]) + old_workorder_obj = self.env['mrp.workorder'].sudo().search( + [('id', '=', (current_workorder_id - 1))]) + work_order = self.env['mrp.workorder'].sudo().search( + [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)]) + try: + work_order.date_planned_start = old_workorder_obj.date_planned_finished + print('work_order.data_start', work_order.date_planned_start) + work_order.date_planned_finished = old_workorder_obj.date_planned_finished + timedelta( + minutes=self.env['mrp.routing.workcenter'].sudo().search( + [('name', '=', current_workorder_obj.name)]).time_cycle) + except ValueError as e: + print('时间设置失败,请检查是否为工序分配工作中心,%s' % e) + + current_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', item.id)]) + workorder_time += current_workorder.duration_expected + print('workorder_time', workorder_time) self.date_planned_finished = self.date_planned_start + timedelta(minutes=workorder_time) self.state = 'done' - aa.schedule_state = '已排' + self.production_id.schedule_state = '已排' + # self.production_id.date_planned_start = self.date_planned_start + # self.production_id.date_planned_finished = self.date_planned_finished else: raise ValidationError("未找到工单") # self.date_planned_finished = self.date_planned_start + timedelta(days=3) diff --git a/sf_plan/static/src/xlsx/sf_production_plan.xlsx b/sf_plan/static/src/xlsx/sf_production_plan.xlsx index a82cab58a678156619c9d084e7dfeff554f08a9b..901d4beb78751d8cb4c2cb0a6929b0ce668ec066 100644 GIT binary patch delta 5043 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 diff --git a/sf_plan_management/views/operations_rename_menu.xml b/sf_plan_management/views/operations_rename_menu.xml index 659df6dd..1af2ba72 100644 --- a/sf_plan_management/views/operations_rename_menu.xml +++ b/sf_plan_management/views/operations_rename_menu.xml @@ -50,39 +50,39 @@ - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - 应收应付 - - + + + + - - - + + +