--------------
修订时间
14:54 2016-09-18 星期日
21:59 2016-06-12 星期日
10:06 2016-02-24 星期三
17:14 2016-01-29 星期五
--------------   
* 工作流
   查到相对应的工作流  设置->工作流->工作流
   对应的模型 workflow  对应的表格 是 wkf 开头的表
  
   一个工作流模型在Session模型上都加入了state字段 ;有三种字段, Draft Confirmed Done
   有效的转变有:
   Draft ->Confirmed
   Confirmed -> Draft
   Confirmed -> Done
   Done -> Draft
  
   工作流中的节点叫 “活动(activity)” 弧线连接叫“转变(transition)”
   转变可以增加属性如 条件、信号、触发器
  
   工作流功效:
     # 关于记录如何演变的描述
     # 根据多样的弹性的条件建立自动化行动机制
     # 管理公司流程和确认规则
     # 管理对象间的互动
     # 在他们的生命期内一个可视化的流程图
    
   #定义工作流对象:
   addons/hr_holidays/hr_holidayss_workflow.xml:
  
    <record model="workflow" />

    ---------------------------
    查询某个工作流的activity和transition
    select
    a.name,a.osv,a.on_create,
    d.id,d.condition,d.group_id,d.signal,
    b.id as from_act_id,b.name as from_action,b.split_mode,b.join_mode,b.kind,
    c.id as to_act_id,c.name as to_action,c.split_mode,c.join_mode,c.kind
    from wkf a
    join wkf_activity b on a.id = b.wkf_id
    join wkf_activity c on a.id = c.wkf_id
    join wkf_transition d on b.id = d.act_from and c.id = d.act_to
    where a.osv = 'sale.order'
    and b.name in('sent' ,'router', 'wait_invoice','wait_ship','ship')
    order by b.name
    –查询某个对象的工作流实例的workitem
    select a.inst_id,a.act_id,c.name as act_name,a.state, c.split_mode,c.join_mode,c.kind
    from wkf_workitem a
    join wkf_instance b on a.inst_id = b.id
    join wkf_activity c on a.act_id = c.id
    where b.res_type = 'sale.order'
    and b.res_id = 53
    –查询某个对象的工作流实例的log
    select a.* ,b.name as act_name
    from wkf_logs a
    join wkf_activity b on a.act_id = b.id
    where res_id = 53 and res_type = 'sale.order'
    ---------------------------
   
    来一个完整的工作流文件
    <?xml version=”1.0” ?>
    <openerp>
        <data noupdate=”0”>
        <record id=”wkf_qingjia” model=”workflow” >
            <field name=”name”>wkf.qingjia</field>
            <field name=”osv”>qingjia.qingjd</field>
            <field name=”on_create”>True</field>
        </record>
        <record id=”act_draft” model=”workflow.activity” >
            <field name=”wkf_id” ref=”wkf_qingjia” />
            <field name=”name”>draft</field>
            <field name=”flow_start” eval=”True”/>
            <field name=”kind”>function</field>
            <field name=”action”>draft()</field>
        </record>
        <record id=”act_confirm” model=”workflow.activity” >
            <field name=”wkf_id” ref=”wkf_qingjia” />
            <field name=”name”>confirm</field>
            <field name=”kind”>function</field>
            <field name=”action”>confirm()</field>
        </record>
        <record id=”act_accept” model=”workflow.activity” >
            <field name=”wkf_id” ref=”wkf_qingjia” />
            <field name=”name”>accept</field>
            <field name=”kind”>function</field>
            <field name=”flow_stop”>True</field>
            <field name=”action”>accept()</field>
        </record>
        <record id=”act_reject” model=”workflow.activity” >
            <field name=”wkf_id” ref=”wkf_qingjia” />
            <field name=”name”>reject</field>
            <field name=”kind”>function</field>
            <field name=”action”>reject()</field>
        </record>
       
        <record model=”workflow.transition” id=”qingjia_draft2confirm”>
            <field name=”act_from” ref=”act_draft” />
            <field name=”act_to” ref=”act_confirm” />
            <field name=”signal”>btn_confirm</field>
        </record>
        <record model=”workflow.transition” id=”qingjia_confirm2accept”>
            <field name=”act_from” ref=”act_confirm” />
            <field name=”act_to” ref=”act_accept” />
            <field name=”signal”>btn_accept</field>
            <field name=”condition”>is_manager</field>
        </record>
        <record model=”workflow.transition” id=”qingjia_confirm2reject”>
            <field name=”act_from” ref=”act_confirm” />
            <field name=”act_to” ref=”act_reject” />
            <field name=”signal”>btn_reject</field>
            <field name=”condition”>is_manager</field>
        </record>
        </data>
    </openerp>
   
    ----- 对应的模型支持
    from openerp import models, fields, api
    import logging

    class Qingjd(models.Model):
        _name = ’qingjia.qingjd’
        name = fields.Many2one(’hr.employee’, string=” 申请人”, readonly=True)
        manager = fields.Many2one(’hr.employee’, string=” 主管”,readonly=True)
        beginning = fields.Datetime(string=” 开始时间”, required=True,
        default = fields.Datetime.now())
        ending = fields.Datetime(string=” 结束时间”, required=True)
        reason = fields.Text(string=” 请假事由”,required=True)
        accept_reason = fields.Text(string=” 同意理由”,default=” 同意。 ”)
        #########compute 没有写入数据库 on the fly 可以被 workflow 的 condition 调用
        current_name = fields.Many2one(’hr.employee’, string=” 当前登录人”,compute=”_get_current_name”)
        is_manager = fields.Boolean(compute=’_get_is_manager’)
        ######
        state = fields.Selection([
            (’draft’, ” 草稿”),
            (’confirmed’, ’ 待审核’),
            (’accepted’, ’ 批准’),
            (’rejected’, ’ 拒绝’),
            ],string=’ 状态’,default=’draft’,readonly=True)
           
        @api.model# 使用新的 api
        def _get_default_name(self):
            uid = self.env.uid
            res = self.env[’resource.resource’].search([(’user_id’,’=’,uid)])
            name = res.name
            employee = self.env[’hr.employee’].search(
                    [(’name_related’,’=’,name)])
            # for i in self.env.user:# 说明其是 recordset
            # print(’hello’)
            return employee
           
        @api.model
        def _get_default_manager(self):# 单记录 recordset 可以直接用点记号读取属性值
            uid = self.env.uid
            res = self.env[’resource.resource’].search([(’user_id’,’=’,uid)])
            name = res.name
            employee = self.env[’hr.employee’].search(
                [(’name_related’,’=’,name)])
            logging.info(”myinfo {}”.format(employee.parent_id))
            return employee.parent_id # 似乎有这种数字引用方法值得我们注意
            _defaults = {
                ’name’ : _get_default_name ,
                ’manager’ : _get_default_manager ,
                }
               
        def _get_is_manager(self):### 这里 return 不起作用
            print(’----------test’)
            print(self.current_name, self.manager,self.env.uid)
            if self.current_name == self.manager:
                self.is_manager = True
            else:
                self.is_manager = False
               
        def _get_current_name(self):
            uid = self.env.uid
            res = self.env[’resource.resource’].search([(’user_id’,’=’,uid)])
            name = res.name
            employee = self.env[’hr.employee’].search(
            [(’name_related’,’=’,name)])
            self.current_name = employee
        ##############################
        def draft(self, cr, uid, ids, context=None):
            if context is None:
            context={}
            self.write(cr,uid,ids,{’state’:’draft’},context=context)
            return True
           
        def confirm(self, cr, uid, ids, context=None):
            if context is None:
                context={}
                self.write(cr,uid,ids,{’state’:’confirmed’},context=context)
            return True
           
        def accept(self, cr, uid, ids, context=None):
            if context is None:
                context={}
                self.write(cr,uid,ids,{’state’:’accepted’},context=context)
                print(’ 你的请假单被批准了’)
            return True
           
        def reject(self, cr, uid, ids, context=None):
            if context is None:
                context={}
                self.write(cr,uid,ids,{’state’:’rejected’},context=context)
                print(’ 抱歉,你的请假单没有被批准。 ’)
            return True   
           
    ----- 对应的视图支持
    <?xml version=”1.0”?>
    <openerp>
        <data>
        <!--
        打开请假单动作
        -->
        <act_window id=”action_qingjia_qingjd”
            name=” 请假单”
            res_model=”qingjia.qingjd”
            view_mode=”tree,form” />
        <!--
        表单视图
        -->
        <record id=”qingjia_qingjd_form” model=”ir.ui.view”>
            <field name=”name”>qing jia dan form</field>
            <field name=”model”>qingjia.qingjd</field>
            <field name=”arch” type=”xml”>
        <form>
        <!--button 的name值就是工作流迁移的信号名称-->
        <header>
            <button name=”btn_confirm” type=”workflow” states=”draft”
                string=” 发送” class=”oe_highlight” />
            <button name=”btn_accept” type=”workflow” states=”confirmed”
                string=” 批准” class=”oe_highlight”/>
            <button name=”btn_reject” type=”workflow” states=”confirmed”
                string=” 拒绝” class=”oe_highlight”/>
            <field name=”state” widget=”statusbar” statusbar_visible=”draft,confirmed,accepted,rejected” class=”oe_highlight” type=”workflow”/>
        </header>
       
        <sheet>
            <group name=”group_top” string=” 请假单”>
                <group name=”group_left”>
                <field name=”name”/>
                <field name=”beginning”/>
                </group>
                <group name=”group_right”>
                <field name=”manager”/>
                <field name=”ending”/>
                </group>
            </group>
           
            <group name=”group_below”>
            <field name=”reason”/>
            </group>
        </sheet>
        </form>
        </field>
        </record>
        <!--
        tree 视图
        -->
        <record id=”qingjia_qingjd_tree” model=”ir.ui.view”>
        <field name=”name”>qing jia dan tree</field>
        <field name=”model”>qingjia.qingjd</field>
        <field name=”arch” type=”xml”>
            <tree>
                <field name=”name”/>
                <field name=”beginning”/>
                <field name=”ending”/>
                <field name=”state”/>
            </tree>
        </field>
        </record>
        <!--
        加入菜单
        -->
        <menuitem id=”menu_qingjia” name=” 请假” sequence=”0”></menuitem>
        <menuitem id=”menu_qingjia_qingjiadan” name=” 请假单” parent=”menu_qingjia”></menuitem>
        <menuitem id=”menu_qingjia_qingjiadan_qingjiadan” parent=”menu_qingjia_qingjiadan” action=”action_qingjia_qingjd”></menuitem>
        </data>
    </openerp>

相关文章:

  • 2021-11-11
  • 2021-05-14
  • 2021-07-22
  • 2021-07-31
  • 2021-08-29
  • 2021-10-21
  • 2022-01-23
  • 2021-12-30
猜你喜欢
  • 2022-02-01
  • 2021-12-11
  • 2022-02-14
  • 2022-12-23
  • 2022-12-23
  • 2021-08-25
相关资源
相似解决方案