整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          odoo模型層的記錄集與操作

          odoo模型層的記錄集與操作

          大多數(shù)框架一樣,odoo模型層也是 Odoo技術(shù)框架最核心的部分了。了解了它的編寫規(guī)則,可以說 Odoo的神秘面紗基本也會(huì)被掀開一半。

          上面這是一段證書管理的 model 代碼,下面來詳細(xì)解釋下 model 層各個(gè)字段

          01

          創(chuàng)建模型

          創(chuàng)建類繼承自 models.Model

          _name : 創(chuàng)建 odoo模型內(nèi)部標(biāo)志符(數(shù)據(jù)表名稱,名稱以_連接存入數(shù)據(jù)庫),必須是全局唯一的

          _description: 描述,方便用戶的模型記錄解釋

          _inherit : 繼承 (設(shè)置繼承自另外那個(gè)表,可以進(jìn)行字段方法的添加修改)

          02

          字段類型

          可以定義字段的類型

          1.Char :

          單行文本

          name=fields.Char(string=u'單據(jù)編號(hào)')

          2.Text :

          多行文本

          note=fields.Text(u'備注')

          3.Html:

          存儲(chǔ)為帶格式的文本字段

          html=fields.Html()

          4.Datetime:

          日期時(shí)間類型

          date_order=fields.Datetime(string=u'訂單日期')

          5.Date

          delivery_date=fields.Date(u'交貨日期')

          6.Selection:

          下拉選擇列表(前一個(gè)參數(shù)是存儲(chǔ)在數(shù)據(jù)庫的值,后一個(gè)參數(shù)是前端展示的描述)

          type=fields.Selection([ (u'default', u'默認(rèn)')], string=u'類型', default=u'default')

          7.Boolean:

          布爾類型

          active=fields.Boolean(default=True, string=u'是否歸檔')

          8.Integer:

          整型

          sequence=fields.Integer(string=u'排序', default=10)

          9.Binary:

          存儲(chǔ)為二進(jìn)制文件

          files=fields.Binary(u'文件',filters='*.xlsx', required=True)

          10.Float:

          浮點(diǎn)型

          amount=fields.Float(string=u'總計(jì)')

          11.Monetary:

          與浮點(diǎn)型類似,但帶有貨幣的特殊處理

          price_subtotal=fields.Monetary(compute='_compute_amount', string=u'小計(jì)', readonly=True)

          12.Many2one:

          多對(duì)一

          order_id=fields.Many2one('sale.order', string=u'銷售訂單', ondelete='cascade', index=True, copy=False)

          13.One2many:

          一對(duì)多

          One2many 是一個(gè)一對(duì)多的關(guān)聯(lián)字段,與 Many2one 對(duì)應(yīng)

          order_line=fields.One2many('sale.order.line', 'order_id', string=u'銷售明細(xì)',states=READONLY_STATES,copy=True)

          14.Many2many:

          多對(duì)多

          一本書可以有多個(gè)作者,一個(gè)作者可以有多本書class Book(models.Model):

          author_ids=fields.Many2many(‘res.partner’, string=‘Authors’)

          class Partner(models.Model):

          book_ids=fields.Many2many(‘library.book’, string=‘Authored Books’)

          03

          字段屬性

          # string 字段顯示名label,任意字符串

          # help='str' 用于懸掛幫助信息提示

          # readonly=True 本字段是否只讀,缺省值:False

          # required=True 本字段是否必須的,缺省值:False。

          # index=True 設(shè)置字段創(chuàng)建索引

          # select=True 相關(guān)聯(lián)字段下拉列表

          # default 設(shè)置字段的默認(rèn)值

          name=fields.Char(default="Unknown")

          user_id=fields.Many2one('res.users', default=lambda self:self.env.user)

          # states 定義特定state才生效的屬性,格式為:{'name_of_the_state': list_of_attributes},

          其中l(wèi)ist_of_attributes是形如[('name_of_attribute', value), ...]的tuples列表。

          例子(參見account.transfer): 'partner_id': fields.many2one('res.partner', 'Partner',

          states={'posted':[('readonly',True)]}),

          # groups 設(shè)置權(quán)限組訪問可見,值為列表形式,元素是組的xml ids(也就是外部標(biāo)識(shí)符)

          # copy=False 設(shè)置字段不能被復(fù)制,普通字段是True, 在 one2many是默認(rèn)是False

          # oldname='field' 當(dāng)一個(gè)字段在新版本重命名了,指定老的字段,老的字段的數(shù)據(jù)會(huì)自動(dòng)拷貝到新的字段中

          # compute 給定一個(gè)方法名計(jì)算出該字段

          # inverse 給定一個(gè)方法名反轉(zhuǎn)該字段 (為了在計(jì)算字段設(shè)置值)

          document=fields.Char(compute='_get_document', inverse='_set_document')

          def _get_document(self):

          for record in self:

          with open(record.get_document_path) as f:

          record.document=f.read()

          def _set_document(self):

          for record in self:

          if not record.document: continue

          with open(record.get_document_path()) as f:

          f.write(record.document)

          # search 給定一個(gè)方法名搜索該字段 (用在計(jì)算字段)

          upper_name=field.Char(compute='_compute_upper', search='_search_upper')

          def _search_upper(self, operator, value):

          if operator=='like':

          operator='ilike'

          return [('name', operator, value)]

          # store 設(shè)定該字段是否存在數(shù)據(jù)表中,在用了compute時(shí)為False ,其它默認(rèn)是True

          # compute_sudo 設(shè)定是否要超級(jí)用戶來計(jì)算該字段,默認(rèn)是False

          # related 序列的字段名,用于關(guān)聯(lián)字段,默認(rèn)不存數(shù)據(jù)表中,可以store=True來存,

          nickname=fields.Char(related='user_id.partner_id.name', store=True)

          這里看出前面定義了user_id字段,這里是接著關(guān)聯(lián)到 user_id這個(gè)字段把所要的信息提取出來

          # company_dependent 定義該字段是不是公司依賴

          # change_default 別的字段的缺省值是否可依賴于本字段,缺省值為:False。

          例子(參見res.partner.address) 'zip': fields.char('Zip', change_default=True, size=24),

          這個(gè)例子中,可以根據(jù)zip的值設(shè)定其它字段的缺省值,例如,可以通過程序代碼,

          如果zip為200000則city設(shè)為“上海”,如果zip為100000則city為“北京”。

          # domain: 域條件,缺省值:[]。在many2many和many2one類型中,字段值是關(guān)聯(lián)表的id,

          域條件用于過濾關(guān)聯(lián)表的record。例子: 'default_credit_account_id': fields.many2one('account.account',

          'Default Credit Account', domain="[('type','!=','view')]"),

          本例表示,本字段關(guān)聯(lián)到對(duì)象('account.account')中的,type不是'view'的record。

          # context 上下文

          # invisible: 本字段是否可見,即是否在界面上顯示本字段,缺省值True。

          # selection: 只用于reference字段類型,參見前文reference的說明。

          # size 只用于Char 設(shè)置可最大接收字符數(shù)

          # translate=true 用于Text Char Html 本字段值(不是字段的顯示名)是否可翻譯,缺省值:False。

          # ondelete 用于關(guān)聯(lián)字段,定義刪除方式

          # manual

          # deprecated=True 當(dāng)用這個(gè)字段,日志會(huì)記錄警告,主要是版本升級(jí)一些過渡字段

          # password="True" 密碼星號(hào)顯示

          # nolabel="1" 隱藏標(biāo)簽

          # attr屬性 可以定義多條件這段只讀顯示

          # digits 格式化浮點(diǎn)數(shù)

          <field digits="(14,3)" name="volume" attrs="{readonly:[('type','=','service')]}"

          # default_focus 新開窗口光標(biāo)位置

          # Widget 多種部件顯示格式 widget="one2many_list"

          one2one_list, one2many_list, many2one_list, many2many,Url,Email,Image,float_time,reference

          04

          ORM裝飾器

          @api.multi

          默認(rèn)裝飾器,如果我們需要自定義方法來對(duì)記錄集執(zhí)行一些操作。用這個(gè),方法的邏輯通常包括對(duì) self 的遍歷

          @api.one

          用于操作單條記錄(單例),棄用了。用@api.multi,在代碼頂部添加一行 self.ensure_one(),來確保操作單條記錄

          @api.model

          類靜態(tài)方法,self作為模型的引用,無需包含實(shí)際記錄。注意,不能從用戶界面中的按鈕使用這種類型的方法。

          @api.onchange(‘字段值')

          當(dāng)用戶編輯指定字段值時(shí),立即執(zhí)行一段業(yè)務(wù)邏輯。可用于執(zhí)行驗(yàn)證,向用戶顯示消息或修改表單中的其他字段

          @api.depends(field1,...)

          用于計(jì)算字段函數(shù),用于確保(重新)計(jì)算改變被觸發(fā)

          @api.constrains(field1,...)

          用于驗(yàn)證函數(shù),用于確保哪些約束生效被觸發(fā)

          以上~

          隨著企業(yè)信息化不斷地深入和應(yīng)用,無論大中小型企業(yè),通過信息化甚至數(shù)智化,不斷提高企業(yè)內(nèi)部的運(yùn)營(yíng)效率,人財(cái)物達(dá)到最優(yōu)配置,從而不斷增加企業(yè)核心競(jìng)爭(zhēng)力,有些行業(yè)領(lǐng)先的企業(yè),要求管理層必須懂IT,一崗雙責(zé),否則就無法勝任現(xiàn)有管理崗位,全員信息化或數(shù)字化。特別對(duì)于制造企業(yè)來說,業(yè)務(wù)隨著外部市場(chǎng)的變化也隨時(shí)需要更新升級(jí)系統(tǒng),以符合最新的企業(yè)管理模式,從系統(tǒng)開發(fā)角度來說,如何隨需而變并進(jìn)行快速響應(yīng)用戶的需求這個(gè)是一個(gè)現(xiàn)實(shí)又重要的課題通過Odoo可以很好地支持業(yè)務(wù)隨時(shí)變化的需求,由于Odoo配置功能很強(qiáng)大,完成可以作為企業(yè)內(nèi)部的低代碼開發(fā)平臺(tái),筆者后續(xù)會(huì)針對(duì)Odoo寫一系列的文章進(jìn)行一些經(jīng)驗(yàn)和實(shí)踐的分享。

          什么是Odoo?Odoo由OpenERP發(fā)展而來,Odoo現(xiàn)在有一套完整的業(yè)務(wù)應(yīng)用,滿足所有的業(yè)務(wù)需求,從網(wǎng)站/電子商務(wù)到制造,庫存和會(huì)計(jì),所有的領(lǐng)域無縫集成。這是第一次一個(gè)軟件系統(tǒng),被設(shè)計(jì)成能達(dá)到這么全面的功能覆蓋。Odoo的底層結(jié)構(gòu)很強(qiáng)大,所有模塊都可以根據(jù)需要進(jìn)行安裝和御載,所以客戶能像搭積木一樣建構(gòu)自己期望的系統(tǒng)。即使完全不安裝與ERP相關(guān)的模塊,僅利用 Odoo 自身的底層框架,也能構(gòu)建出適合各種用途的系統(tǒng),純粹 B/S 架構(gòu)。而這一切都是免費(fèi)的,并且不受限于源代碼,也不受限于用戶數(shù)

          Odoo總部位于歐洲比利時(shí),擁有1700名員工,11個(gè)全球辦事處和超過700萬的全球用戶。過去10年,每年的增長(zhǎng)率超過50%。

          Odoo的進(jìn)化史,如下:

          2005, TinyERP 1.0(2月), 2.0(5月),3.0(9月),基于 GPL協(xié)議GPL,是GNU General Public License的縮寫,是GNU通用公共授權(quán)非正式的中文翻譯,AGPL是GPL的一個(gè)補(bǔ)充, 在GPL的基礎(chǔ)上加了一些限制。

          2006, TinyERP 4.0(9月),仍然是GPL協(xié)議

          ----------------------第一次改名-------------------------------------------------

          2009 OpenERP 5.0(4月),第一次重大改進(jìn),歷時(shí)三年時(shí)間。

          2011 OpenERP 6.0(1月), 基本web 的客戶端,協(xié)議從GPL變?yōu)锳GPL。

          2012 OpenERP 6.2(2月), GTK客戶端停止開發(fā),引入Ajax。

          2012 OpenERP 7.0(12 ), 增強(qiáng)了可用性。

          ------------------------第二次改名---------------------------------------------------

          2014 Odoo 8.0(10月) 重寫了倉庫和WMS,引入了電商、POS、BI。

          2015 Odoo 9.0(10月) 開啟社區(qū)版和企業(yè)版雙版本戰(zhàn)略,社區(qū)版免費(fèi),企業(yè)版按用戶收費(fèi) 費(fèi),LGPL協(xié)議。

          2016 Odoo 10.0(10月) 重寫了 MRP模塊,引入 MPS\PLM 概念,企業(yè)版按用戶和模塊收費(fèi)。

          2017 Odoo 11.0(10月) 重寫了 Report,重寫了Studio,支持Python 3,提升了速度和性能。

          2018 Odoo 12.0(10月) 引入 物聯(lián)網(wǎng)盒子,機(jī)器學(xué)習(xí),報(bào)表設(shè)計(jì)器。

          2019 Odoo 13.0(10月) 更強(qiáng)大的會(huì)計(jì)模塊,更令人驚嘆的網(wǎng)站設(shè)計(jì),更實(shí)用的在線學(xué)習(xí),更靈活地制造模塊管理。

          2020 Odoo 14.0(10月) 從功能上來說,也確實(shí)在ERP核心功能之外的網(wǎng)站、電商、HR等方面有不少功能增添,同時(shí)引入了全新前端框架OWL。

          2021 Odoo 15.0(10月) OWL表單2.0發(fā)布,電子表格實(shí)時(shí)提供ERP數(shù)據(jù)。公式助手、編輯欄、查找和替換等(企業(yè)版功能)。

          Odoo 15是一系列開源商業(yè)應(yīng)用程序套裝,此套裝可滿足中小型企業(yè)的一切應(yīng)用需求,例如,企業(yè)基本的進(jìn)銷存、采購、銷售、MRP生產(chǎn)制造、品保質(zhì)量保障、企業(yè)招聘、員工合同、休假、午餐管理、內(nèi)部論壇、車隊(duì)管理、內(nèi)部聊天IM溝通、客訴追溯管理、CRM客戶關(guān)系管理、VOIP、E-Shop電子商務(wù)、網(wǎng)店、企業(yè)官方網(wǎng)站,財(cái)務(wù)會(huì)計(jì)、銀行對(duì)賬、資產(chǎn)管理、HR工資管理、預(yù)算管理、WMS倉庫庫存管理、POS街邊小攤、社區(qū)商店、項(xiàng)目管理、條碼、PLM等等。

          從Odoo 11開始,定位不僅僅是開源ERP,已覆蓋到企業(yè)的CRM、PLM、WMS、HR等全領(lǐng)域,一個(gè)應(yīng)用滿足所有中小企業(yè)需求,ODOO的應(yīng)用界面,如下圖:


          Odoo是基于開源技術(shù)進(jìn)行構(gòu)建的,數(shù)據(jù)庫采用開源老牌的數(shù)據(jù)庫Postgresql,開發(fā)語言基于目前主流的Python等一系列開源技術(shù)和產(chǎn)品,并構(gòu)建成熟穩(wěn)定的架構(gòu),提供了強(qiáng)大的配置,定制和在線開發(fā)工具,確保通用化產(chǎn)品和靈活定制之間的平衡。

          PostgreSQL 的歷史簡(jiǎn)介:

          PostgreSQL是一個(gè)功能強(qiáng)大的開源對(duì)象關(guān)系數(shù)據(jù)庫系統(tǒng),它使用并擴(kuò)展了SQL語言,并結(jié)合了許多安全存儲(chǔ)和擴(kuò)展最復(fù)雜數(shù)據(jù)工作負(fù)載的功能。PostgreSQL的起源可以追溯到1986年,作為加州大學(xué)伯克利分校POSTGRES項(xiàng)目的一部分,并在核心平臺(tái)上進(jìn)行了30多年的積極開發(fā)。

          PostgreSQL憑借其經(jīng)過驗(yàn)證的架構(gòu),可靠性,數(shù)據(jù)完整性,強(qiáng)大的功能集,可擴(kuò)展性以及軟件背后的開源社區(qū)的奉獻(xiàn)精神贏得了良好的聲譽(yù),以始終如一地提供高性能和創(chuàng)新的解決方案。PostgreSQL在所有主要操作系統(tǒng)上運(yùn)行,自2001年以來一直是符合ACID標(biāo)準(zhǔn)的,并且具有強(qiáng)大的附加功能,例如流行的PostGIS地理空間數(shù)據(jù)庫擴(kuò)展器。毫無疑問,PostgreSQL已經(jīng)成為許多人和組織的首選開源關(guān)系數(shù)據(jù)庫。

          開始使用PostgreSQL從未如此簡(jiǎn)單 - 選擇您想要構(gòu)建的項(xiàng)目,并讓PostgreSQL安全可靠地存儲(chǔ)您的數(shù)據(jù)。

          Python:

          1、 Python是一種計(jì)算機(jī)程序設(shè)計(jì)語言。是一種動(dòng)態(tài)的、面向?qū)ο蟮哪_本語言,最初被設(shè)計(jì)用于編寫自動(dòng)化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越多被用于獨(dú)立的、大型項(xiàng)目的開發(fā)。

          2、Python就為我們提供了非常完善的基礎(chǔ)代碼庫,覆蓋了網(wǎng)絡(luò)、文件、GUI、數(shù)據(jù)庫、文本等大量?jī)?nèi)容,被形象地稱作“內(nèi)置電池(batteries included)”。用 Python開發(fā),許多功能不必從零編寫,直接使用現(xiàn)成的即可。

          3、除了內(nèi)置的庫外,Python還有大量的第三方庫,也就是別人開發(fā)的,供你直接使用的東西。當(dāng)然,如果你開發(fā)的代碼通過很好的封裝,也可以作為第三方庫給別人使用。

          4、許多大型網(wǎng)站就是用Python開發(fā)的,例如YouTube、Instagram,還有國(guó)內(nèi)的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美國(guó)航空航天局)都大量地使用Python。

          同時(shí)Odoo不僅具有10多年的發(fā)展歷史,Odoo官方每年都會(huì)發(fā)布更新一個(gè)大的全新版本,每次都會(huì)有很多新特性或新功能,而且具有強(qiáng)大的生態(tài)圈目前Odoo官網(wǎng)的應(yīng)用商店已超過3萬+擴(kuò)展模塊插件,其中一半插件是完全免費(fèi)的,同時(shí)Odoo社區(qū)OCA也提供了很多免費(fèi)好用的插件,對(duì)于我來說通過Odoo自帶的項(xiàng)目模塊,并通過下載一些項(xiàng)目相關(guān)的免費(fèi)插件,像搭積木一樣構(gòu)建了一個(gè)功能完整的項(xiàng)目管理系統(tǒng),同時(shí)項(xiàng)目管理相關(guān)的一些報(bào)表是通過開發(fā)實(shí)現(xiàn)的,其他基本都是通過配置實(shí)現(xiàn)。



          Odoo價(jià)格優(yōu)勢(shì)

          在帶寬和服務(wù)器硬件允許的情況下,社區(qū)版沒有使用用戶數(shù)的限制,客戶端不用額外安裝軟件只要用新版的chrome瀏覽器或者firefox瀏覽器即可。

          對(duì)于生產(chǎn)和大多數(shù)企業(yè)來說,二次開發(fā)本來就不可避免,由于有大量預(yù)開發(fā)模塊,Odoo在二次開發(fā)的速度和價(jià)格上有非常大的優(yōu)勢(shì)。

          即使金蝶,用友,Sap,甲骨文的ERP是免費(fèi)的,一旦你需要二次開發(fā),動(dòng)輒幾十萬幾百萬甚至上千萬的價(jià)格還是讓很多企業(yè)承受不起。

          相對(duì)很多軟件使用微軟的sql,微軟的Server系統(tǒng)和操作系統(tǒng),微軟的office,這些軟件如果買正版,也是一筆不小的開銷。

          很多企業(yè)雖然買了正版的用友,金蝶,但微軟的服務(wù)器系統(tǒng),微軟的數(shù)據(jù)庫都是盜版,這為以后埋下不少隱患。

          而Odoo用的服務(wù)器系統(tǒng)是Ubuntu Server他目前是自由免費(fèi)的,PostgreSQL也是免費(fèi)的。

          如果自己找團(tuán)隊(duì)去開發(fā)Odoo這樣一套系統(tǒng),估計(jì)至少20個(gè)人開發(fā)5年,也就是差不多至少300萬的開銷。

          投資成本分析





          傳統(tǒng)ERP項(xiàng)目

          Odoo企業(yè)版

          Odoo社區(qū)版

          咨詢培訓(xùn)

          數(shù)萬

          軟件許可

          10-100萬

          每月12-72美元

          免費(fèi)

          軟件升級(jí)

          3-30萬

          無 或 低

          年服務(wù)費(fèi)

          合同15-30%

          無 或 低

          實(shí)現(xiàn)

          合同65% - 75%

          合同65% - 75%

          Odoo產(chǎn)品優(yōu)勢(shì)

          Odoo的前端用了較多的Javascript代碼,這樣保證了用戶體驗(yàn)較好:輸入關(guān)鍵字即出現(xiàn)的產(chǎn)品及聯(lián)系人選項(xiàng),大大提高了操作速度,(有不少軟件都需要多操作一步搜索)。

          非常強(qiáng)大的過濾及高級(jí)搜索功能 可以根據(jù)電話號(hào)碼地址等字段搜索,可以根據(jù)客戶或者產(chǎn)品來索引出此客戶或者產(chǎn)品的銷售情況,服務(wù)情況 。

          方便查看各類單據(jù)了解產(chǎn)品的成本,售價(jià)的變化。比如可以顯示現(xiàn)有庫存量,查看產(chǎn)品的所有采購情況。

          快速上線:不像其他軟件,必須弄很多初始數(shù)據(jù),有些初始數(shù)據(jù)比如產(chǎn)品名,會(huì)計(jì)期初帳OpenERP可以在后期慢慢弄,

          更直觀的數(shù)據(jù):具有柱狀,餅狀,雷達(dá),曲線等 直觀的數(shù)據(jù)透視圖表顯示,有些模塊還具有甘特圖。



          Odoo技術(shù)優(yōu)勢(shì)

          B/S(瀏覽器-服務(wù)器)架構(gòu)(方便了更新和二次開發(fā)),跨操作系統(tǒng)方面很有優(yōu)勢(shì),平板,手機(jī)默認(rèn)都可以用。采用Module為開發(fā)單元,采用MVC的架構(gòu),支持繼承。B/S架構(gòu),支持各種操作系統(tǒng)和瀏覽器。

          先進(jìn)的數(shù)據(jù)庫PostgreSQL,先進(jìn)的語言Python,大量的預(yù)開發(fā)代碼可以實(shí)現(xiàn)快速進(jìn)行二次開發(fā)。

          可以部署在云端(企業(yè)可以自己建云,建立一個(gè)更大的數(shù)據(jù)庫)云計(jì)算特性很容易能把上下游整個(gè)供應(yīng)鏈的資源都整合到Odoo中來。(通過更改Odoo設(shè)置還可以開放客戶接口和供應(yīng)商接口)

          內(nèi)置了社交系統(tǒng):消息系統(tǒng)。并在各個(gè)模塊都擁有非常靈活的搜索和高級(jí)搜索界面。



          Odoo開源優(yōu)勢(shì)

          幾十人的團(tuán)隊(duì)開發(fā)十多年(目前官方團(tuán)隊(duì)有1700多人,至少還大約有6000名志愿者參與,用戶數(shù)量超過700萬)。

          模塊齊全,涵蓋了個(gè)人助理,企業(yè)內(nèi)部交流,客戶關(guān)系管理CRM,進(jìn)銷存管理,生產(chǎn)管理,人力資源管理等等(以8.0來說目前已有4000多個(gè)功能模塊已經(jīng)適合絕大多數(shù)企業(yè)),并且Odoo不斷的有新功能和新模塊來適應(yīng)更多的企業(yè)去運(yùn)用。

          它還是個(gè)很好的二次開發(fā)的平臺(tái),如果你不需要其自帶的模塊,你完全可以按照官方模塊的寫法,寫自己的模塊。

          流程設(shè)計(jì)合理,除了初始化的數(shù)據(jù)(產(chǎn)品,客戶,供應(yīng)商)及少數(shù)單據(jù)(報(bào)價(jià)單,銷售訂單),大部分單據(jù)(出入庫單,會(huì)計(jì)憑證)都是系統(tǒng)自動(dòng)生成,只需要對(duì)應(yīng)的人員進(jìn)行核查及確認(rèn)即可,大大降低了工作強(qiáng)度和出錯(cuò)幾率。

          單據(jù)的流程可以根據(jù)企業(yè)的實(shí)際情況定制和修改,可以在系統(tǒng)里面改變工作流程滿足企業(yè)需求。

          具有多語言,多幣種,對(duì)于貿(mào)易類企業(yè)OE現(xiàn)有的模塊基本可以滿足企業(yè)90%或更多的應(yīng)用需求。

          雖然是開源軟件,Odoo8.0依然是個(gè)長(zhǎng)期支持的版本,基本每天都有更新,修復(fù)各種漏洞,截止2013年已經(jīng)有200萬用戶下載了Odoo。成功案例估計(jì)成千上萬其中不乏美國(guó)AT&T ,法國(guó)電信,達(dá)能集團(tuán)這樣的巨型公司。



          請(qǐng)大家點(diǎn)擊左上角關(guān)注+評(píng)論,也歡迎私信跟我交流!

          順便幫忙轉(zhuǎn)發(fā)一下

          r.actions.client 介紹

          ir.actions.client 是odoo actions事件的一種,觸發(fā)一個(gè)在客戶端實(shí)現(xiàn)(即js文件中定義的函數(shù),通過core.action_registry.add(tag,函數(shù)名) 注冊(cè)到odoo中)動(dòng)作


          • tag -- action在客戶端的標(biāo)識(shí)符,一般是一個(gè)專用的字符串,在js文件中注冊(cè)該動(dòng)作時(shí)指定。
          • params (可選) -- 用來傳給客戶端動(dòng)作的,字典格式
          • target (可選) -- current:當(dāng)前內(nèi)容區(qū)打開action;fullscreen:以全屏模式打開;new:以新窗口打開。
          • context-- 作為額外數(shù)據(jù),傳遞給客戶端函數(shù)。


          實(shí)現(xiàn)方式主要有以下幾步:

          1. 通過繼承擴(kuò)展的方式建立一個(gè)m_custome_list.js,里面主要是關(guān)聯(lián)qweb視圖,對(duì)qweb頁面?zhèn)鬟f數(shù)據(jù),渲染視圖


          在 項(xiàng)目目錄/static/src/js 建立 m_custome_list.js 文件

          • m_custome_list.js
          odoo.define('custom_page.demo', function (require) {
              "use strict";
          
           var AbstractAction=require('web.AbstractAction');
           var core=require('web.core');
          
           var CustomPageDemo=AbstractAction.extend({
           // 對(duì)某個(gè)類關(guān)聯(lián)click事件
           events: {'click .demo-submit': '_onSubmitClick',
              'click .db_add_data': '_onAddData'},
          
           // 初始化,可以在action 里傳入?yún)?shù)
           init: function (parent, action, option) {
           // 保存?zhèn)鬟f的參數(shù)
              this.params=action.params;
              this._super.apply(this, arguments);
           },
          
          // 渲染視圖
           renderElement: function () {
            this._super.apply(this, arguments);
            // 渲染qwb 視圖,并傳值
            this.$('.o_content').html(
              core.qweb.render('DemoPage', 
                   {'params':this.params}));
             },
          
           _onSubmitClick: function (e) {
             e.stopPropagation();
             alert('Submit clicked!');
           },
          
          // 添加一條數(shù)據(jù)
          _onAddData: (e)=> {
            e.stopPropagation();
            window.alert('添加成功');
           },
          });
          
          // add方法對(duì)動(dòng)作進(jìn)行注冊(cè),第一個(gè)參數(shù)表示注冊(cè)的動(dòng)作名,
           第二個(gè)參數(shù)是要注冊(cè)的動(dòng)作對(duì)象;
           core.action_registry
             .add('custom_page.demo',CustomPageDemo);
          
           return CustomPageDemo;
          
          });

          2. 編寫一個(gè)qweb視圖,用來承載需要顯示的數(shù)據(jù)樣式

          在 項(xiàng)目目錄/static/src/xml 建立 m_custome_list.xml 文件

          <?xml version="1.0" encoding="UTF-8"?>
          <templates id="template" xml:space="preserve">
          
            <t t-name="DemoPage">
              <div style="margin:0 auto; 
          text-align:center;"class="o_content">
                <table class="table table-striped">
                   <tr>
                     <th>標(biāo)題</th>
                     <th>內(nèi)容</th>
                     <th>創(chuàng)建日期</th>
                    </tr>
                    <t t-foreach="params.contentList" t-as="item">
                      <tr>
                        <td><t t-esc="item.title"/></td>
                        <td><t t-esc="item.content"/></td>
                        <td><t t-esc="item.date"/></td>
                       </tr>
                      </t>
                </table>
          
             <button type="button" 
          class="db_add_data btn btn-primary">增加數(shù)據(jù)</button>
            </div>
          </t>
          
          </templates>

          3. 在需要顯示client的model,調(diào)用顯示client方法

          model 調(diào)用client方法, 在model關(guān)聯(lián)的xml視圖頁面,增加一個(gè)按鈕,綁定show_list方法,也可以在任何方法中返回client和返回actions.window 一樣

          def show_list(self):
           content_list=[
            {'title': '內(nèi)容一', 'content': '我是內(nèi)容一一,
             在想看看1', 'date': '2021-08-08'},
            {'title': '內(nèi)容二', 'content': '我是內(nèi)容二二,
             在想看看2', 'date': '2021-08-09'},
            {'title': '內(nèi)容三', 'content': '我是內(nèi)容三三,
             在想看看3', 'date': '2021-08-10'},
            {'title': '內(nèi)容四', 'content': '我是內(nèi)容四四,
             在想看看4', 'date': '2021-08-11'},
             ]
            info={
              'title': '測(cè)試列表循環(huán)',
              'contentList': content_list
             }
            return {
             'type': 'ir.actions.client',
             'name': '列表信息',
             'tag': 'custom_page.demo',
             # custom_page.demo就是前面js中定義的事件名
             'params': info,
             'target': 'new',
           }

          4. 加載自己寫的m_custome_list.js文件

          在 項(xiàng)目目錄/views/ 建立 js_and_css.xml 文件, 用來加載自己寫的js,別忘了在mainfast.py 中加載這個(gè)js_and_css.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <odoo>
              <template id="assets_end" 
          inherit_id="web.assets_backend">
              <xpath expr="." position="inside">
                 <script src="/customtree/static/
          src/js/m_custome_list.js" 
          type="text/javascript"/>
               </xpath>
              </template>
          </odoo>

          5. 在mainfast.py 中加載自己寫的qweb文件 m_custome_list.xml


          主站蜘蛛池模板: 无码人妻一区二区三区在线| 中文字幕一区二区三区在线观看| 无码精品人妻一区二区三区免费看| 99无码人妻一区二区三区免费| 亚洲日韩国产一区二区三区在线 | 国产精品香蕉在线一区| 极品少妇一区二区三区四区| 国产精品亚洲一区二区三区在线| 国语对白一区二区三区| 国产对白精品刺激一区二区| 日韩精品一区二区三区四区| 视频在线观看一区| 国产午夜精品片一区二区三区| 少妇精品无码一区二区三区 | 国语对白一区二区三区| 中文字幕精品一区二区| 人成精品视频三区二区一区 | 国产亚洲一区二区精品| 少妇一晚三次一区二区三区| 国产福利一区二区在线视频| 国产无线乱码一区二三区| 麻豆AV天堂一区二区香蕉| 无码人妻精品一区二区三区久久| 搡老熟女老女人一区二区| 中文字幕精品无码一区二区 | 亚洲av色香蕉一区二区三区| 精品国产一区二区三区AV| 人妻精品无码一区二区三区| 在线免费视频一区二区| 国产三级一区二区三区| 国产精品免费一区二区三区| 亚洲AV福利天堂一区二区三 | 亚洲第一区精品观看| 中文字幕一区在线观看| 无码精品一区二区三区免费视频| 亚洲AV无码一区二区乱子伦| 日本午夜精品一区二区三区电影| 亚洲熟女www一区二区三区| 免费一区二区三区在线视频| 久99精品视频在线观看婷亚洲片国产一区一级在线 | www亚洲精品少妇裸乳一区二区|