全球第一免费开源ERP Odoo 最新版工作流审批定义详解

Դ未知

ߣOdoo

10

2020-02-23 12:46:52

ODOO在10版本之后就删除了workflow。在11、12代码里,可以发现了其他实现工作流的方式。

拿PLM的工程变更单为例。

全球第一免费开源ERP Odoo 最新版工作流审批定义详解

 

在每个阶段,我们都可以配置多个审批用户,而批准类型为三种:批准,但审批是可选的;必须批准;仅备注。

很好奇。看看代码。

阶段的对象为“mrp.eco.stage”:

class MrpEcoStage(models.Model):
 _name = 'mrp.eco.stage'
 _description = 'ECO Stage'
 _order = "sequence, id"
 _fold_name = 'folded'
 ...
 approval_template_ids = fields.One2many('mrp.eco.approval.template', 'stage_id', 'Approvals')
 ...

审核的对象“mrp.eco.approval.template”

class MrpEcoApprovalTemplate(models.Model):
 _name = "mrp.eco.approval.template"
 _order = "sequence"
 _description = 'ECO Approval Template'
 name = fields.Char('Role', required=True)
 ...
 # 三种审核类型:
 approval_type = fields.Selection([
 ('optional', 'Approves, but the approval is optional'),
 ('mandatory', 'Is required to approve'),
 ('comment', 'Comments only')], 'Approval Type',
 default='mandatory', required=True)
 user_ids = fields.Many2many('res.users', string='Users', required=True)
 stage_id = fields.Many2one('mrp.eco.stage', 'Stage', required=True)
 ...

ECO里会有:

class MrpEco(models.Model):
 _name = 'mrp.eco'
 _description = 'Engineering Change Order (ECO)'
 _inherit = ['mail.thread', 'mail.activity.mixin']
 ...
 stage_id = fields.Many2one(
 'mrp.eco.stage', 'Stage', ondelete='restrict', copy=False, domain="[('type_id', '=', type_id)]",
 group_expand='_read_group_stage_ids', track_visibility='onchange',
 default=lambda self: self.env['mrp.eco.stage'].search([('type_id', '=', self._context.get('default_type_id'))], limit=1))
 ...
 approval_ids = fields.One2many('mrp.eco.approval', 'eco_id', 'Approvals', help='Approvals by stage')
 ...

mrp.eco.approval套了一层template:

class MrpEcoApproval(models.Model):
 _name = "mrp.eco.approval"
 _description = 'ECO Approval'
 eco_id = fields.Many2one(
 'mrp.eco', 'ECO',
 ondelete='cascade', required=True)
 approval_template_id = fields.Many2one(
 'mrp.eco.approval.template', 'Template',
 ondelete='cascade', required=True)
 name = fields.Char('Role', related='approval_template_id.name', store=True, readonly=False)
 user_id = fields.Many2one(
 'res.users', 'Approved by')
 required_user_ids = fields.Many2many(
 'res.users', string='Requested Users', related='approval_template_id.user_ids', readonly=False)
 template_stage_id = fields.Many2one(
 'mrp.eco.stage', 'Approval Stage',
 related='approval_template_id.stage_id', store=True, readonly=False)
 eco_stage_id = fields.Many2one(
 'mrp.eco.stage', 'ECO Stage',
 related='eco_id.stage_id', store=True, readonly=False)
 status = fields.Selection([
 ('none', 'Not Yet'),
 ('comment', 'Commented'),
 ('approved', 'Approved'),
 ('rejected', 'Rejected')], string='Status',
 default='none', required=True)
 is_approved = fields.Boolean(
 compute='_compute_is_approved', store=True)
 is_rejected = fields.Boolean(
 compute='_compute_is_rejected', store=True)

关键在ECO这里:

...
@api.multi
 @api.depends('approval_ids')
 def _compute_user_can_approve(self):
 approvals = self.env['mrp.eco.approval'].search([
 ('eco_id', 'in', self.ids),
 ('status', 'not in', ['approved']),
 ('template_stage_id', 'in', self.mapped('stage_id').ids),
 ('approval_template_id.approval_type', 'in', ('mandatory', 'optional')),
 ('required_user_ids', 'in', self.env.uid)])
 to_approve_eco_ids = approvals.mapped('eco_id').ids
 for eco in self:
 eco.user_can_approve = eco.id in to_approve_eco_ids.
...
@api.multi
 @api.depends('approval_ids')
 def _compute_user_can_reject(self):
 approvals = self.env['mrp.eco.approval'].search([
 ('eco_id', 'in', self.ids),
 ('status', 'not in', ['rejected']),
 ('template_stage_id', 'in', self.mapped('stage_id').ids),
 ('approval_template_id.approval_type', 'in', ('mandatory', 'optional')),
 ('required_user_ids', 'in', self.env.uid)])
 to_reject_eco_ids = approvals.mapped('eco_id').ids
 for eco in self:
 self.user_can_reject = eco.id in to_reject_eco_ids

and something with the views.

...

佭ϴý Ѷ Media8ý

在线客服

外链咨询

扫码加我微信

微信:xmbfjc

返回顶部