From fbaa81fe7a80fa59124d2c3212fe58fb1a8ab448 Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Mon, 8 Jan 2024 19:02:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=B6=E9=80=A0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=9A=84=E7=8A=B6=E6=80=81=E5=AD=97=E6=AE=B5=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E4=B8=8E=E6=8E=92=E7=A8=8B=E5=8D=95=E7=9A=84=E4=BA=A4?= =?UTF-8?q?=E4=BA=92=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98=E5=8C=96=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_production.py | 64 ++++++++++++++++++- .../views/mrp_production_addional_change.xml | 3 + sf_plan/models/custom_plan.py | 25 +++++++- sf_plan/views/view.xml | 2 +- sf_plan/wizard/action_plan_some.py | 2 +- sf_plan_management/i18n/zh_CN.po | 4 +- 6 files changed, 93 insertions(+), 7 deletions(-) diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 4b15299d..9b05f10f 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -12,12 +12,74 @@ class MrpProduction(models.Model): maintenance_count = fields.Integer(compute='_compute_maintenance_count', string="Number of maintenance requests") request_ids = fields.One2many('maintenance.request', 'production_id') model_file = fields.Binary('模型文件', related='product_id.model_file') - schedule_state = fields.Selection([('未排', '未排'), ('已排', '已排')], + schedule_state = fields.Selection([('未排', '未排'), ('已排', '已排'), ('已完成', '已完成')], string='排程状态', default='未排') + # state = fields.Selection(selection_add=[ + # ('pending_scheduling', '待排程'), + # ('pending_processing', '待加工'), + # ('completed', '已完工') + # ]) + state = fields.Selection([ + ('draft', 'Draft'), + ('confirmed', 'Confirmed'), + ('progress', '待排程'), + ('pending_processing', '待加工'), + ('completed', '已完工'), + ('to_close', 'To Close'), + ('done', 'Done'), + ('cancel', 'Cancelled')], string='State', + compute='_compute_state', copy=False, index=True, readonly=True, + store=True, tracking=True, + help=" * Draft: The MO is not confirmed yet.\n" + " * Confirmed: The MO is confirmed, the stock rules and the reordering of the components are trigerred.\n" + " * In Progress: The production has started (on the MO or on the WO).\n" + " * To Close: The production is done, the MO has to be closed.\n" + " * Done: The MO is closed, the stock moves are posted. \n" + " * Cancelled: The MO has been cancelled, can't be confirmed anymore.") + check_status = fields.Boolean(string='启用状态', default=False, readonly=True) active = fields.Boolean(string='已归档', default=True) + @api.depends( + 'move_raw_ids.state', 'move_raw_ids.quantity_done', 'move_finished_ids.state', + 'workorder_ids.state', 'product_qty', 'qty_producing', 'schedule_state') + def _compute_state(self): + for production in self: + if not production.state or not production.product_uom_id: + production.state = 'draft' + elif production.state == 'cancel' or (production.move_finished_ids and all( + move.state == 'cancel' for move in production.move_finished_ids)): + production.state = 'cancel' + elif ( + production.state == 'done' + or (production.move_raw_ids and all( + move.state in ('cancel', 'done') for move in production.move_raw_ids)) + and all(move.state in ('cancel', 'done') for move in production.move_finished_ids) + ): + production.state = 'done' + elif production.workorder_ids and all( + wo_state in ('done', 'cancel') for wo_state in production.workorder_ids.mapped('state')): + production.state = 'to_close' + elif not production.workorder_ids and float_compare(production.qty_producing, production.product_qty, + precision_rounding=production.product_uom_id.rounding) >= 0: + production.state = 'to_close' + elif any(wo_state in ('progress', 'done') for wo_state in production.workorder_ids.mapped('state')): + production.state = 'progress' + elif production.product_uom_id and not float_is_zero(production.qty_producing, + precision_rounding=production.product_uom_id.rounding): + production.state = 'progress' + elif any(not float_is_zero(move.quantity_done, + precision_rounding=move.product_uom.rounding or move.product_id.uom_id.rounding) + for move in production.move_raw_ids): + production.state = 'progress' + + # 新添加的状态逻辑 + if production.state == 'progress' and production.schedule_state == '已排': + production.state = 'pending_processing' + elif production.state == 'progress' and production.schedule_state == '已完成': + production.state = 'completed' + def action_check(self): """ 审核启用 diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index 3727bb10..85628389 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -58,6 +58,9 @@ mrp.production + + draft,confirmed,progress,pending_processing,completed,done + diff --git a/sf_plan/models/custom_plan.py b/sf_plan/models/custom_plan.py index ef6d77a0..03117a3a 100644 --- a/sf_plan/models/custom_plan.py +++ b/sf_plan/models/custom_plan.py @@ -12,14 +12,30 @@ class sf_production_plan(models.Model): _name = 'sf.production.plan' _description = 'sf_production_plan' _inherit = ['mail.thread'] - _order = 'state desc, write_date desc' + # _order = 'state desc, write_date desc' state = fields.Selection([ ('draft', '待排程'), ('done', '已排程'), - ('processing', '已加工'), + ('processing', '加工中'), ('finished', '已完成') ], string='工单状态', tracking=True) + + state_order = fields.Integer(compute='_compute_state_order', store=True) + + @api.depends('state') + def _compute_state_order(self): + order_mapping = { + 'draft': 1, + 'done': 2, + 'processing': 3, + 'finished': 4 + } + for record in self: + record.state_order = order_mapping.get(record.state, 0) + + _order = 'state_order asc, write_date desc' + name = fields.Char(string='工单编号') active = fields.Boolean(string='已归档', default=True) # selected = fields.Boolean(default=False) @@ -51,6 +67,11 @@ class sf_production_plan(models.Model): sequence = fields.Integer(string='序号', copy=False, readonly=True, index=True) current_operation_name = fields.Char(string='当前工序名称', size=64, default='生产计划') + @api.onchange('state') + def _onchange_state(self): + if self.state == 'finished': + self.production_id.schedule_state = '已完成' + # @api.model # def _search(self, args, offset=0, limit=None, order=None, count=False, access_rights_uid=None): # """ diff --git a/sf_plan/views/view.xml b/sf_plan/views/view.xml index b4e23965..7f5a1969 100644 --- a/sf_plan/views/view.xml +++ b/sf_plan/views/view.xml @@ -11,7 +11,7 @@