可以在工作流每个节点上审批和申请,在表单上列出审批情况及审批意见
每个节点上的人员设置。
1.fhtestweishui001.py
# -*- encoding: utf-8 -*-
from itertools import groupby
from datetime import datetime, timedelta
from odoo import api, fields, models, _
from odoo.exceptions import UserError
from odoo.tools import float_is_zero, float_compare, DEFAULT_SERVER_DATETIME_FORMAT
from odoo.tools.misc import formatLang
import odoo.addons.decimal_precision as dp
class fhtest_weishui001(models.Model):
_name = 'fhtest.weishui001'
_description = u'测试001'
_inherit = ['mail.thread', 'ir.needaction_mixin']
_rec_name='fname'
#_order = 'date_order desc, id desc'
def get_employee(self):
obj = self.env['hr.employee']
idsobj = obj.search([('user_id','=',self.env.user.id)])
print('-------------------------------------')
print(self.env.user.id)
#print(ids)
res = idsobj.read()
print(res)
return res and res[0]['id'] or 0
@api.depends('qty_delivered','qty_delivered0')
def _amount_all(self):
amount_untaxed = amount_tax = 0.0
print('-------------------触发器----------------------')
for order in self:
order.update({'amount_untaxed':order.qty_delivered0-order.qty_delivered,})
return True
fname= fields.Many2one('hr.employee',u'商品',readonly=False,required=False,translate=False)
origin = fields.Char(string='Source Document', help="Reference of the document that generated this sales order request.")
FAddperson =fields.Many2one('hr.employee',u'添加人',readonly=False,required=False,translate=False,default=lambda self: self.get_employee())
FConsultant=fields.Many2one('hr.employee',u'班主任',readonly=False,required=False,translate=False)
FAdddate= fields.Datetime(u'添加日期',readonly=False,required=False,translate=False, default=fields.Datetime.now)
state=fields.Selection([('draft',u'草稿'),('wait_prove',u'提交申请'),('proved',u'主管审批')], u'状态', required=False, default='draft')
FDisable=fields.Selection([('0',u'启用'),('1',u'停用')],u'是否停用',readonly=False,required=False,translate=False)
order_line = fields.One2many('fhtest.weishui001tbline', 'pay_id', string='Order Lines', copy=True)
FConsultant1=fields.Many2one('hr.employee',u'员工',readonly=False,required=False,translate=False)
FConsultant2=fields.Many2one('hr.employee',u'经理',readonly=False,required=False,translate=False)
#工作例子
@api.multi
def action_funproved00(self):
#context = context or {}
t=fields.datetime.now()
#huid=self.get_employee(cr,uid,context)
#self.write({'state':'wait_prove','FAdddate':t})
'''print('--------------------------')
print(self.id)
#selfmodels=super(fhtest_weishui001,self).browse(self.id)
model002= self.env['fhtest.weishui002']
print('--------------------------')
print(self)
print(self.fname)
print(self.fname.id)
vals={'fname': self.fname.id,'FAdddate':t}
model002.create(vals)'''
model002= self.env['fhtest.weishui002']
selfmodels=model002.search([('fname', '=', self.fname.id)])
for selfmodel in selfmodels:
print('------------2222--------------')
#selfmodel.update({'state':self.state,'FAdddate':t})
selfmodel.unlink()
'''default={}
selfmodel.copy(default)'''
return True
@api.model
def action_funproved0(self):
#context = context or {}
t=fields.datetime.now()
#huid=self.get_employee(cr,uid,context)
self.write({'state':'wait_prove','FAdddate':t})
return True
@api.model
def action_funproved(self):
#context = context or {}
t=fields.datetime.now()
#huid=self.get_employee(cr,uid,context)
self.write({'state':'proved','FAdddate':t})
return True
@api.model
def create(self, vals):
result = super(fhtest_weishui001, self).create(vals)
print('-------------新增-------------------------')
print(vals)
print(result)
return result
@api.multi
def write(self, values):
result = super(fhtest_weishui001, self).write(values)
print('-------------修改-------------------------')
print(values)
print(result)
print(self)
return result
@api.multi
def unlink(self):
print('-------------删除-------------------------')
print(self)
return super(fhtest_weishui001, self).unlink()
@api.multi
def copy(self, default=None):
print('-------------复制-------------------------')
return super(fhtest_weishui001, self).copy(default)
@api.multi
def search(self, args, offset=0, limit=None, order=None, context=None, count=False):
domain =None
domain = [('state', '=', '0')]
return super(fhtest_weishui001, self).search(args, offset=offset, limit=limit, order=order, count=count)
fhtest_weishui001() #对象定义结束
class fhtest_weishui001tbline(models.Model):
_name = 'fhtest.weishui001tbline'
_description = u'测试子表'
#_rec_name='FClass'
def get_employee(self, cr, uid, context={}):
obj = self.pool.get('hr.employee')
ids = obj.search(cr, uid, [('user_id','=',uid)])
res = obj.read(cr, uid, ids, ['id','name'], context)
return res and res[0]['id'] or 0
pay_id=fields.Many2one('fhtest.weishui001',u'fhtest_weishui001tb',required=True, ondelete='cascade', index=True, copy=False)
fmobile1= fields.Char(u'标题',readonly=False,required=False,translate=False)
fremarks=fields.Text(u'备注',readonly=False,required=False,translate=False)
FAddperson =fields.Many2one('hr.employee',u'审批人',readonly=False,required=False,translate=False)
FAdddate= fields.Datetime(u'添加日期',readonly=False,required=False,translate=False)
FConsultant=fields.Many2one('hr.employee',u'班主任',readonly=False,required=False,translate=False)
#FAdddate= fields.Datetime(u'添加日期',readonly=False,required=False,translate=False)
Fstatus=fields.Selection([('0',u'同意'),('1',u'驳回')],u'结果',readonly=False,required=False,translate=False)
FDisable=fields.Selection([('0',u'启用'),('1',u'停用')],u'是否停用',readonly=False,required=False,translate=False)
@api.model
def create(self, vals):
result = super(fhtest_weishui001tbline, self).create(vals)
return result
@api.multi
def write(self, values):
result = super(fhtest_weishui001tbline, self).write(values)
return result
@api.multi
def unlink(self):
return super(fhtest_weishui001tbline, self).unlink()
@api.multi
def copy(self, default=None):
return super(fhtest_weishui001tbline, self).copy(default)
@api.multi
def search(self, args, offset=0, limit=None, order=None, context=None, count=False):
domain =None
domain = [('state', '=', '0')]
return super(fhtest_weishui001tbline, self).search(args, offset=offset, limit=limit, order=order, count=count)
fhtest_weishui001tbline() #对象定义结束
2.fhtest_weishui001_view.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="weishui001_tree_view" model="ir.ui.view">
<field name="name">测试001</field>
<field name="model">fhtest.weishui001</field>
<field name="priority">2</field>
<field name="arch" type="xml">
<tree string="测试001" deng="true">
<field name="fname"/>
<field name="FAddperson" />
</tree>
</field>
</record>
<!-- form view -->
<record model="ir.ui.view" id="weishui001_form_view">
<field name="name">测试001</field>
<field name="model">fhtest.weishui001</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="测试001">
<header>
<button string="提交申请" name="%(tbclue_invoice)d" states="draft" context="{'pay_id':id,'work':'action_toprovekk'}" type="action" class="oe_highlight" />
<button string="经理审批" name="%(tbclue_invoice)d" states="wait_prove" context="{'pay_id':id,'work':'action_prove'}" type="action" class="oe_highlight" />
<field name="state" widget="statusbar" statusbar_visible="draft,wait_prove,proved"/>
</header>
<sheet>
<group col="4">
<field name="fname" options="{'no_create_edit': True,'no_open': True}" />
<field name="FAddperson" groups="" />
<field name="FAdddate"/>
</group>
<notebook>
<page string="经办信息">
<group col="4">
<field name="FConsultant1"/>
<field name="FConsultant2"/>
</group>
</page>
<page string="审批信息">
<field name="order_line" nolabel="1" string="测试子表">
<tree string="测试子表" editable="bottom">
<!--列表字段-->
<field name="Fstatus"/>
<field name="fmobile1"/>
<field name="fremarks"/>
<field name="FAddperson"/>
<field name="FAdddate"/>
</tree>
<form string="测试001">
<sheet>
<group col="4">
<field name="Fstatus"/>
<field name="fmobile1"/>
<field name="FAddperson"/>
<field name="FAdddate"/>
</group>
<group col="2">
<field name="fremarks"/>
</group>
</sheet>
</form>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="view_weishui001_filter" model="ir.ui.view">
<field name="name">测试001</field>
<field name="model">fhtest.weishui001</field>
<field name="arch" type="xml">
<search string="测试001">
<field name="fname"/>
<filter string="草稿" domain="[('state','=','draft')]" />
<filter string="非草稿" domain="[('state','!=','draft')]" />
<group expand="0" string="">
<filter string="按name分组" domain="[]" context="{'group_by':'fname'}"/>
</group>
</search>
</field>
</record>
<record id="view_weishui001_calendar" model="ir.ui.view">
<field name="name">fhtest.weishui001calendar</field>
<field name="model">fhtest.weishui001</field>
<field name="arch" type="xml">
<calendar string="Sales Orders" color="state" date_start="FAdddate">
<field name="fname"/>
<field name="FAddperson"/>
</calendar>
</field>
</record>
<record model="ir.ui.view" id="view_weishui001_kanban">
<field name="name">fhtest.weishui001.kanban</field>
<field name="model">fhtest.weishui001</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
<div class="row">
<div class="col-xs-6">
<strong><span><field name="fname"/></span></strong>
</div>
<div class="col-xs-6 pull-right text-right">
<strong><field name="FAddperson"/></strong>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-muted">
<span></span>
</div>
<div class="col-xs-6">
<span class="pull-right text-right">
</span>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- actions -->
<record model="ir.actions.act_window" id="action_weishui001_form">
<field name="name">测试001</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">fhtest.weishui001</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,kanban</field>
<field name="search_view_id" ref="view_weishui001_filter"/>
<field name="view_id" ref="weishui001_tree_view"/>
<field name="domain">[] </field>
</record>
<menuitem name="测试001" id="weishui001_menu_mainform_1"/>
<menuitem name="测试001" id="weishui001_menu_mainform_2" parent="weishui001_menu_mainform_1"/>
<menuitem name="测试001" parent="weishui001_menu_mainform_2" id="weishui001_menu_mainform_3" action="action_weishui001_form"/>
</odoo>
3.工作流文件TB_workflow.xml
<?xml version="1.0" ?>
<openerp>
<data>
<record id="wkf_tblesson" model="workflow">
<field name="name">转课申请</field>
<field name="osv">fhtest.weishui001</field>
</record>
<record id="act_draft" model="workflow.activity">
<field name="wkf_id" ref="wkf_tblesson"/>
<field name="flow_start">True</field>
<field name="name">draft</field>
<field name="kind">function</field>
<field name="action">write({'state':'draft'})</field>
</record>
<record id="act_wait_prove" model="workflow.activity">
<field name="wkf_id" ref="wkf_tblesson"/>
<field name="name">wait_prove</field>
<field name="kind">function</field>
<field name="action">action_funproved0()</field>
</record>
<record id="act_proved" model="workflow.activity">
<field name="wkf_id" ref="wkf_tblesson"/>
<field name="name">proved</field>
<field name="kind">function</field>
<field name="flow_stop">True</field>
<field name="action">action_funproved()</field>
</record>
<record id="trans_draft_wait" model="workflow.transition">
<field name="act_from" ref="act_draft"/>
<field name="act_to" ref="act_wait_prove"/>
<field name="signal">action_toprovekk</field>
</record>
<record id="trans_wait_proved" model="workflow.transition">
<field name="act_from" ref="act_wait_prove"/>
<field name="act_to" ref="act_proved"/>
<field name="signal">action_prove</field>
</record>
</data>
</openerp>
4.审批程序:审批并通知到审批人,出现消息提示
# -*- coding: utf-8 -*-
import time
from odoo import SUPERUSER_ID, workflow
from odoo import api, fields, models, _
import odoo.addons.decimal_precision as dp
from odoo.exceptions import UserError
import calendar
class fhtest_tbclue(models.TransientModel):
_name = 'fhtest.tbclue'
_description = u'线索'
fsex=fields.Selection([('0',u'是'),('1',u'否')],u'性别',readonly=False,required=False,translate=False)
fsource=fields.Many2one('hr.employee',u'线索来源',readonly=False,required=False,translate=False)
fmobile1= fields.Char(u'标题',readonly=False,required=False,translate=False)
fmobile2= fields.Char(u'手机2',readonly=False,required=False,translate=False)
fweixin= fields.Char(u'微信号',readonly=False,required=False,translate=False)
fqq= fields.Char(u'QQ',readonly=False,required=False,translate=False)
femail= fields.Char(u'邮箱',readonly=False,required=False,translate=False)
fregion=fields.Many2one('hr.employee',u'地区',readonly=False,required=False,translate=False)
faddress= fields.Char(u'地址',readonly=False,required=False,translate=False)
fstate=fields.Selection([('0',u'是'),('1',u'否')],u'状态',readonly=False,required=False,translate=False)
ffollowuptime=fields.Datetime(u'下次跟进时间',readonly=False,required=False,translate=False)
fremarks=fields.Text(u'备注',readonly=False,required=False,translate=False)
fsubordinate=fields.Many2one('hr.employee',u'所属部门',readonly=False,required=False,translate=False)
def ziyuanxd_fdcrm_create(self):
model_data = self.env['ir.model.data']
model_self=super(fhtest_tbclue, self).read()[0]
domaincontext=[]
value = {
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'fhtest.weishui001',
'res_id': 1,
'views': [(False, 'tree'),(False, 'form')],
'type': 'ir.actions.act_window',
#'domain':domaincontext ,
}
return value
def ziyuanxd_fdcrm_create002(self):
model_data = self.env['ir.model.data']
model_self=super(fhtest_tbclue, self).read(['fmobile1','fremarks'])[0]
vals={}
vals['pay_id']=self._context.get('pay_id')
vals['fmobile1']=model_self['fmobile1']
vals['fremarks']=model_self['fremarks']
vals['FAddperson']=self.env.user.id
vals['FAdddate']=fields.Datetime.now()
vals['Fstatus']='0'
result =self.env['fhtest.weishui001tbline'].create(vals)
print("--------------------self._context.get('work')-----------------------")
print(self._context.get('work'))
print(self._context.get('pay_id'))
#发送消息
tinfo=self.env['fhtest.weishui001'].browse(self._context.get('pay_id'))[0]
print(tinfo.FConsultant2.user_id.name)
print(tinfo.FConsultant2.user_id.partner_id.id)
fid=tinfo.message_post(body=_("物品申购表工作流"))
fmessage=self.env['mail.message'].browse(fid.id)[0]
partner_channels = self.env['res.partner'].search([('name', '=',tinfo.FConsultant2.user_id.name)])[0]
print('------------partner_channels:----------------')
print(partner_channels.id)
fmessage.write({'subject':'物品申购表工作流','needaction_partner_ids':[[6, False,[partner_channels.id]]],'partner_ids': [[6, False,[tinfo.FConsultant2.user_id.partner_id.id]]],'notified_partner_ids': [[6, False, [tinfo.FConsultant2.user_id.partner_id.id]]]})
print(fid.id)
self.env['fhtest.weishui001'].browse(self._context.get('pay_id')).signal_workflow(self._context.get('work'))
return True
def ziyuanxd_fdcrm_create003(self):
model_data = self.env['ir.model.data']
model_self=super(fhtest_tbclue, self).read(['fmobile1','fremarks'])[0]
vals={}
vals['pay_id']=self._context.get('pay_id')
vals['fmobile1']=model_self['fmobile1']
vals['fremarks']=model_self['fremarks']
vals['FAddperson']=self.env.user.id
vals['FAdddate']=fields.Datetime.now()
vals['Fstatus']='1'
result =self.env['fhtest.weishui001tbline'].create(vals)
print("--------------------self._context.get('work')-----------------------")
print(self._context.get('work'))
print(self._context.get('pay_id'))
self.env['fhtest.weishui001'].browse(self._context.get('pay_id')).signal_workflow(self._context.get('work'))
return True
def ziyuanxd_fdcrm_create004(self):
return True
fhtest_tbclue()
5.fhcrm_tbclue_view.xml审批界面:
<?xml version="1.0"?>
<odoo>
<!-- Phonecall to Phonecall view -->
<record model="ir.ui.view" id="tbclue_view">
<field name="name">线索</field>
<field name="model">fhtest.tbclue</field>
<field name="arch" type="xml">
<form string="CRM向导" >
<group col="2" colspan="2">
<field name="fmobile1"/>
</group>
<group col="2" colspan="2">
<field name="fremarks"/>
</group>
<footer>
<button name="ziyuanxd_fdcrm_create002" string="同意" type="object" class="oe_highlight"/>
or
<button name="ziyuanxd_fdcrm_create003" string="驳回" type="object" class="oe_highlight"/>
or
<button string="取消" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record id="tbclue_invoice" model="ir.actions.act_window">
<field name="name">线索</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">fhtest.tbclue</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="tbclue_view"/>
<field name="target">new</field>
</record>
<!-- Phonecall to Phonecall view -->
<record model="ir.ui.view" id="tbclue_view2">
<field name="name">线索</field>
<field name="model">fhtest.tbclue</field>
<field name="arch" type="xml">
<form string="CRM向导" >
<group col="2" colspan="2">
<field name="fmobile1"/>
</group>
<footer>
<button name="ziyuanxd_fdcrm_create004" string="确定" type="object" class="oe_highlight"/>
or
<button string="取消" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record id="tbclue_invoice2" model="ir.actions.act_window">
<field name="name">线索</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">fhtest.tbclue</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="tbclue_view2"/>
<field name="target">new</field>
</record>
<act_window id="action_crm_tbclue2"
multi="True"
key2="client_action_multi" name="线索"
res_model="fhtest.tbclue" src_model="fhtest.weishui001"
view_mode="form" target="new" view_type="form"
context="{'mass_convert' : True}" groups=""
view_id="tbclue_view"/>
<!--res_model="要弹出的向导窗体的实体类" view_id="要弹出的向导窗体" src_model="需要在那个表更多里显示这个向导"-->
</odoo>
本文章内容是秋风流云调试编写