--- title: Frappe 與 ERPNext --- ## 前言 因為公司專案需要,所以開始接觸這一套 ERP,由於剛接觸時遇到了許多問題,因此想說就寫個筆記來紀錄一下遇到的問題與解法 #### Frappe 基於 Python 所開發的一個全端框架,可外掛許多客製化的模組,並透過模組中的 hooks.py 去覆寫 Frappe 原有的功能,ERPNext 便是介有這樣的方式建立而成的 #### ERPNext 除了進銷存外,還包含了各種其他教育、醫療等其他行業模組(雖然我沒用過OAO)的ERP 模組 ## 需求環境 * 類 Unix 系統 Frappe 只能架在類 Unix 系統上,如 Linux/Mac Os 等,如果要在 Windows 上使用,需要透過 Docker 或 WSL 去建立,不過效能上就比較不好 ## 安裝 目前開發都是利用 Docker 去進行開發,除了方便外,各個專案之間也是完全獨立不會受到影響.Frappe 已經有人建立好基於 Docker 的版本,透過這個就可以很快的建立出 Frappe 的開發環境 參考:[Frappe Docker](https://github.com/frappe/frappe_docker) ## 指令說明 由於 Frappe 有自己的一套 CLI,叫做 **bench**,因此一些操作都需要透過這個 CLI 去進行,以下是目前在開發上常用到的的指令: | 指令 | 說明 | | ----------------- | ------------------------------------------------- | | bench new-site | 建立一個新站點 | | bench update | 更新當前站點與相關的模組 | | bench migrate | 更新資料庫結構、同步資料、更新翻譯、執行 Patch 等 | | bench clear-cache | 清除 Redis Cache | | bench clear-website-cache | 清除前台的 Cache| 更多指令參考:[Bench Command](https://frappeframework.com/docs/v13/user/en/bench/resources/bench-commands-cheatsheet) ## Frappe 檔案目錄 架設好 Frappe 的開發環境後,可以看到以下的資料夾結構:  #### apps 除了基本的 Frappe 外,後續額外安裝的模組也都會放在這個資料夾下 #### sites 所有站點的相關資源都會存在這個資料夾下,包含編譯後的 JS/CSS、站點設定、已安裝的模組資訊等。在該資料夾下會有一個 **common_site_config.json**,這是通用的站點設定,包含 DB 的主機名稱與Redis\Socket 的設定等,而各個站點資料夾下,都會有一個**site_config.json**,該設定檔主要為設定這個站點要連到哪一個資料庫以及相關的連線資訊,若有一些特殊設定,也可以放在這個檔案之中,之後在模組裡可以透過``` frappe.conf.get() ```或是 ``` frappe.conf.XXX ``` 取得設定值。 ## 模組檔案說明 hooks.py 每個模組都會包含一個 hooks.py,除了模組的基本設定外,也能再此設定要覆寫哪個 Function,或是要引用哪些檔案 Example ```python= # App 基本設定 app_name = 'my_app' app_title = 'App Title' app_publisher = 'App Publisher' app_description = 'App Description' app_icon = 'octicon octicon-file-directory' app_color = 'grey' app_email = 'myapp@gmail.com' app_license = 'MIT' # 後臺頁面要引用哪些 JS / Css app_include_js = [ '/assets/js/myapp.min.js' ] app_include_css = [ '/assets/css/myapp.min.css' ] # 前台頁面要引用哪些 JS / Css web_include_css = [ '/assets/css/spii-web.min.css', ] web_include_js = [ '/assets/js/spii-web.min.js' ] # 設定特定模組的 ListView 要引用哪些 JS # 例如下面這個就是當開啟 Sales Order 模組的 ListView 時,便會引用 sales_order_list.js # 其他還有 doctype_js、doctype_tree_js、doctype_calendar_js 可以設定 doctype_list_js = { "Sales Order": "public/js/erpnext/sales_order_list.js", } # 設定事件掛鉤 # 例如下面的設定表示,當觸發了 Item 模組的 after_insert(新增一個 Item 之後) # 會觸發 my_app.erpnext_extend.item 中名為 after_insert 的 method # 更多 doc_event: https://frappeframework.com/docs/v13/user/en/basics/doctypes/controllers#controller-hooks doc_events = { 'Item': { 'after_insert': 'my_app.erpnext_extend.item.after_insert' }, } # 設定排程 # 支援 cron 的表示 # 也可使用內建的 hourly、daily...等去做排程的設定 # 可參考: https://frappeframework.com/docs/v13/user/en/python-api/hooks#scheduler-events scheduler_events = { 'cron': { '0/3 12-18 * * *': [ 'my_app.erpnext_extend.item.update_item', ], }, } # 設定 whitelist method 的覆寫 # (被覆寫與覆寫的方法,皆要套用 @frappe.whitelist() 裝飾子) override_whitelisted_methods = { 'frappe.desk.link_preview.get_preview_data': 'my_app.desk.link_preview.get_preview_data', } # 覆寫前台畫面的 templates extend_website_page_controller_context = { 'erpnext.templates.pages.order': 'my_app.templates.pages.order', # 覆寫訂單頁 } # 覆寫 doctype 的資訊頁面 override_doctype_dashboards = { 'Purchase Order': 'myapp.desk.purchase_order.get_dashboard_data', } ``` ## Frappe 的資料庫結構 在 Frappe 中,會看到許多名為的 doctype 資料夾,在這個資料之中通常都還會包含許多資料夾,如下圖 :  上圖為 ERPNext 採購訂單的 doctype,**purchase_order.json**,這個檔案就是採購訂單的資料表設定,當在建立資料庫時,Frappe 就會根據這份檔案中的設定去建立一個名為 **tabPurchase Order** 的資料表,這份檔案可以想像成 Laravel 或 Django 的 Migration,概念上是一樣的。 但由於 Frappe 跟一般的框架不太一樣,在欄位類別上有很多特別的屬性,例如 Button (欄位類別設定為 Button,在畫面上就會直接跑出一顆按鈕)、Section Breack(畫面上會呈現一個白色的區塊,類似 HTML 中 <fieldset> 的那種效果),而欄位的順序也會影響到在畫面上呈現的順序,因此在建 doctype 時除了考量資料的型態外,也需要管一下排版,不然畫面會很亂。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up