江西應(yīng)用技術(shù)職業(yè)學(xué)院 彭 霖
江西應(yīng)用科技學(xué)院 彭忠全
江西應(yīng)用技術(shù)職業(yè)學(xué)院 譚倩妮
Odoo是一個(gè)輕量級(jí)的開(kāi)源ERP系統(tǒng),相比同類產(chǎn)品而言,有著軟件體積小、系統(tǒng)要求低、支持多平臺(tái)、便于部署、多種軟件架構(gòu)、可擴(kuò)展模塊、快速二次開(kāi)發(fā)等特點(diǎn)[7]。目前,Odoo暫無(wú)對(duì)接各大電子商務(wù)平臺(tái)的開(kāi)源模塊,原生Odoo的訂單只能從自帶的網(wǎng)店平臺(tái)獲取或手工錄入,要實(shí)現(xiàn)與各大電子商務(wù)平臺(tái)的對(duì)接,必須自定義對(duì)接模塊,實(shí)現(xiàn)包含獲取訂單、訂單發(fā)貨、商品更新、退換貨處理、回復(fù)評(píng)價(jià)等功能,使其符合國(guó)內(nèi)電子商務(wù)銷售模式。本文以蘇寧開(kāi)放平臺(tái)為例,實(shí)現(xiàn)與Odoo系統(tǒng)的對(duì)接。
Odoo是一個(gè)高度模塊化、低耦合的跨平臺(tái)開(kāi)源ERP系統(tǒng),頂層功能由“網(wǎng)站應(yīng)用管理、銷售管理、財(cái)務(wù)管理、運(yùn)營(yíng)管理、生產(chǎn)管理、人力資源管理”構(gòu)成,提供一站式解決方案,其中涵蓋了幾乎所有常見(jiàn)的業(yè)務(wù)需求,不再需要不同軟件之間的接口,模塊化的設(shè)計(jì)使得各個(gè)應(yīng)用彼此之間完美集成。同時(shí),開(kāi)源模式讓開(kāi)發(fā)人員可以自由的定制自己的應(yīng)用,為在所有應(yīng)用中擴(kuò)展提供了頂級(jí)可用性[8]。
為了滿足Odoo對(duì)接電子商務(wù)開(kāi)放平臺(tái),實(shí)現(xiàn)訂單在Odoo系統(tǒng)內(nèi)的操作與平臺(tái)同步,Odoo對(duì)接模塊應(yīng)當(dāng)包含以下基本功能(如圖1所示):
圖1
訂單獲?。褐饕唵味〞r(shí)批量獲取、單筆訂單查詢等功能。如果獲取的是新訂單信息,將從電子商務(wù)開(kāi)放平臺(tái)獲取的已付款新訂單信息保存在Odoo系統(tǒng)內(nèi),如果獲取的是已有訂單信息,及時(shí)將訂單狀態(tài)轉(zhuǎn)為退款等異常訂單進(jìn)行及時(shí)處理,避免訂單的錯(cuò)發(fā)。
訂單發(fā)貨:主要包含訂單發(fā)貨信息推送功能。通過(guò)Odoo系統(tǒng)調(diào)用物流公司開(kāi)放平臺(tái)對(duì)接模塊,向?qū)游锪鞴鹃_(kāi)放平臺(tái)下單,獲取物流單等信息,將所獲得的信息推送給電子商務(wù)開(kāi)放平臺(tái)。
商品更新:主要包含商品上、下架、商品信息維護(hù)、商品庫(kù)存維護(hù)等功能。對(duì)商品的名稱、類別、價(jià)格、簡(jiǎn)介等信息進(jìn)行統(tǒng)一管理,實(shí)現(xiàn)商品的自由上、下架,將ERP系統(tǒng)中的商品庫(kù)存信息及時(shí)同步到電子商務(wù)開(kāi)放平臺(tái)。
退換貨處理:主要包含退換貨訂單定時(shí)批量獲取、單筆退換貨訂單獲取、同意或拒絕退換貨等功能。與獲取訂單類似,但是由于退換貨訂單的特殊性,需要及時(shí)的將退款訂單截下,避免退款訂單發(fā)貨。同時(shí),工作人員可以快速的進(jìn)行退換貨審批,減少在電子商務(wù)網(wǎng)站后臺(tái)的操作。
回復(fù)評(píng)價(jià):主要包含獲取買(mǎi)家評(píng)價(jià)、回復(fù)買(mǎi)家評(píng)價(jià)等功能。客服等工作人員可以快速的、批量的進(jìn)行評(píng)價(jià)回復(fù),避免回復(fù)不及時(shí)的現(xiàn)象。
Odoo系統(tǒng)在數(shù)據(jù)持久層上使用了ORM(對(duì)象到關(guān)系的映射)技術(shù),使得我們操作實(shí)體對(duì)象的時(shí)候,就不需要再去和復(fù)雜的SQL語(yǔ)句打交道,只需簡(jiǎn)單的操作實(shí)體對(duì)象的屬性和方法。Odoo系統(tǒng)內(nèi)置了完善的ORM API供開(kāi)發(fā)者調(diào)用,常用方法如下。
create方法:在數(shù)據(jù)表中插入一條記錄search方法:查詢符合條件的記錄。
read方法:返回記錄的指定字段值列表。
browse方法:瀏覽對(duì)象及其關(guān)聯(lián)對(duì)象。從數(shù)據(jù)庫(kù)中讀取指定的記錄,并生成對(duì)象返回。
write方法:保存一個(gè)或幾個(gè)記錄的一個(gè)或幾個(gè)字段。unlink方法:刪除一個(gè)或幾個(gè)記錄。
調(diào)用蘇寧開(kāi)放平臺(tái)(下稱SOP)的API接口時(shí),即是與SOP服務(wù)器的數(shù)據(jù)進(jìn)行一次交互的過(guò)程。
3.2.1 API調(diào)用流程
根據(jù)SOP的協(xié)議,API的HTTP調(diào)用主要有以下幾個(gè)步驟:拼接參數(shù)、生成簽名、拼接HTTP請(qǐng)求,發(fā)起HTTP請(qǐng)求、解析獲取的XML/JSON結(jié)果。
SOP目前提供2個(gè)運(yùn)行環(huán)境供開(kāi)發(fā)者調(diào)用:
(1)測(cè)試環(huán)境。數(shù)據(jù)涵蓋所有API服務(wù),所有開(kāi)放的API已經(jīng)部署到該環(huán)境,供開(kāi)發(fā)者進(jìn)行API的功能測(cè)試。
(2)正式環(huán)境。正式環(huán)境是蘇寧開(kāi)放服務(wù)平臺(tái)提供給供應(yīng)商及軟件服務(wù)商的線上試運(yùn)行環(huán)境。根據(jù)應(yīng)用標(biāo)簽不同,每個(gè)應(yīng)用將受到接口調(diào)用次數(shù)及流量的限制,并且根據(jù)應(yīng)用標(biāo)簽不同,能調(diào)用的接口也不同。
3.2.2 API調(diào)用參數(shù)說(shuō)明
appKey是開(kāi)發(fā)者創(chuàng)建應(yīng)用時(shí),SOP頒發(fā)的唯一標(biāo)識(shí),SOP通過(guò)App Key來(lái)鑒別應(yīng)用的身份。appSecret是SOP給應(yīng)用分配的密鑰,這個(gè)密鑰用來(lái)保證應(yīng)用來(lái)源的可靠性,防止被偽造。appRequestTime是請(qǐng)求該接口的時(shí)間,SOP使用北京時(shí)間。
3.2.3 簽名算法
調(diào)用API接口時(shí),為了防止調(diào)用過(guò)程中被黑客獲取并篡改,各大電商開(kāi)放平臺(tái)均要求在調(diào)用任何一個(gè)API時(shí),都必須攜帶簽名,開(kāi)放平臺(tái)會(huì)請(qǐng)求的參數(shù),對(duì)簽名進(jìn)行相應(yīng)的驗(yàn)證,簽名不合法的請(qǐng)求會(huì)被拒絕。本文以SOP為例,SOP目前支持的簽名算法為MD5,簽名大致過(guò)程如下(SOPV1.2版本):
(1)業(yè)務(wù)數(shù)據(jù)進(jìn)行base64編碼
(2)按照順序依次拼接appSecret的值,appMethod的值,appRequestTime的值,appkey的值,versionNo的值和第一步編碼后的值 。
(3)將第二步的數(shù)據(jù)進(jìn)行md5加密,得到簽名信息
3.2.4 拼接HTTP請(qǐng)求,發(fā)起HTTP請(qǐng)求
將所有參數(shù)名和參數(shù)值采用utf-8進(jìn)行URL編碼,然后通過(guò)GET或POST發(fā)起請(qǐng)求。調(diào)用接口(API)時(shí),必須傳入的系統(tǒng)級(jí)參數(shù)以及應(yīng)用級(jí)參數(shù),參見(jiàn)SOP API文檔 中每個(gè)API接口詳細(xì)頁(yè)面的公共參數(shù)。
3.2.5 解析返回的XML/JSON數(shù)據(jù)
XML:python中用xml.dom.minidom來(lái)解析xml返回?cái)?shù)據(jù),DOM 的解析器在解析XML 文檔時(shí),一次性讀取整個(gè)文檔,把文檔中所有元素保存在內(nèi)存中的一個(gè)樹(shù)結(jié)構(gòu)里,之后可以利用DOM 提供的不同的函數(shù)來(lái)讀取文檔的內(nèi)容和結(jié)構(gòu)。
JSON:python的json模塊提供了一種很簡(jiǎn)單的方式來(lái)編碼和解碼JSON數(shù)據(jù)。 其中兩個(gè)主要的函數(shù)是 json.dumps() 和 json.loads() ,json.dump()用來(lái)編碼JSON數(shù)據(jù), json.loads()用來(lái)解碼JSON數(shù)據(jù)。
3.2.6 數(shù)據(jù)定時(shí)獲取
Odoo為所有定時(shí)任務(wù)而專門(mén)準(zhǔn)備了一個(gè)模型,即ir_cron類,通過(guò)實(shí)例化ir_cron對(duì)象,改變對(duì)象的的以下屬性,來(lái)達(dá)到定時(shí)執(zhí)行某項(xiàng)任務(wù)的目的:
active屬性,決定是否激活該定時(shí)任務(wù),類型為布爾型,默認(rèn)為T(mén)rue。
interval_number屬性,定義間隔時(shí)間,類型為整型。
interval_type屬性,定義執(zhí)行定時(shí)任務(wù)的周期類型,只能選擇分鐘、小時(shí)、天、周、月,可惜沒(méi)有秒。
function屬性,定義定時(shí)任務(wù)需要執(zhí)行的方法。
為了本文以蘇寧開(kāi)放平臺(tái)為例,設(shè)計(jì)和實(shí)現(xiàn)了Odoo系統(tǒng)中的電子商務(wù)開(kāi)放平臺(tái)對(duì)接模塊。該模塊滿足Odoo對(duì)接電子商務(wù)開(kāi)放平臺(tái)的需求,實(shí)現(xiàn)了訂單在Odoo系統(tǒng)內(nèi)的操作與平臺(tái)同步,大大簡(jiǎn)化了電子商務(wù)企業(yè)后臺(tái)人員的操作,解決了電子商務(wù)平臺(tái)與企業(yè)ERP系統(tǒng)的信息孤島現(xiàn)象。