背景
odoo數(shù)據(jù)拉取易猫,創(chuàng)建耻煤,更新
參考
官方external api文檔
https://www.odoo.com/documentation/14.0/zh_CN/developer/misc/api/odoo.html
術(shù)語
ORM?odoo數(shù)據(jù)以對象模型呈現(xiàn),支持one2many擦囊,many2one违霞,many2many等對象關(guān)聯(lián)關(guān)系
Model?可以看作數(shù)據(jù)表,數(shù)據(jù)類型
XML-RPC?odoo使用xml-rpc通信
設(shè)計模型
Client?封裝連接協(xié)議瞬场,即xml rpm協(xié)議
Connector?封裝獲取數(shù)據(jù)邏輯
QueryRequest?查找請求买鸽,封裝查找條件參數(shù)
表達式模型
odoo的查詢表達式是逆波蘭表達式,連接器支持兩種構(gòu)建表達式方式
表達式分析器(未實現(xiàn))
接收通用表達式
(traceId=='b') and((database=='d') or ((days>=12) or (eventType=='g')))
分析器轉(zhuǎn)換成逆波蘭式
流式api構(gòu)建器
流式builder構(gòu)建逆波蘭式
兩種方式比較:
分析器贯被,通用的表達式符合開發(fā)人員的思維眼五,但分析器遞歸分析消耗一定性能妆艘,可增加緩存支持,但要考慮參數(shù)化表達式
流式api性能高看幼,需要開發(fā)人員先轉(zhuǎn)為逆波蘭式
接口設(shè)計
setupTestDataBase 獲取demo庫的屬性批旺,包括host,user诵姜,password汽煮,database(數(shù)據(jù)庫名稱),用于demo庫拉取棚唆,demo庫是動態(tài)暇赤,先通過此方法,odoo分配哪個demo庫
authenticate 認證宵凌,認證的參數(shù)鞋囊,host,user瞎惫,password溜腐,database,連接器構(gòu)造方法傳入
listFieldsOfModel 獲取模型的字段瓜喇,包括名稱挺益,類型,說明
count 返回傳入請求條件查到的記錄總數(shù)
search 查找
createRecored/updateRecord/deleteRecord 增刪改記錄
開發(fā)指南
以下代碼來源于單元測試
構(gòu)建連接器
odooConnector = new Connector(host, dbParams, false);
host = "http://xxx.odoo.com" xxx申請時填寫
??????? user = "???@?????.com" 郵箱地址
??????? database ="xxx" 同host的域名
???? password 支持密碼乘寒,app key兩種方式矩肩,推薦使用app key,不需要發(fā)布密碼肃续,防止別人登錄,一個賬號可以發(fā)布多個key叉袍,用名稱識別始锚,區(qū)分誰調(diào)用接口
???? 其中,后3個參數(shù)封裝到DatabaseParams類喳逛,即dbParams
若使用demo庫瞧捌,需要先用setupTestDataBase接口方法獲取動態(tài)demo庫的DatabaseParams
認證
userID = odooConnector.authenticate();
userId用于后面查找api
構(gòu)建查找表達式
QueryExpBuilder eb = newQueryExpBuilder();
eb.or().and().left("amount_total",Operator.GT, 1000)
??????????????? .right("amount_total",Operator.LT, 2000)
??????????????? .right("amount_total",Operator.LT, 1000)
逆波蘭表達式
構(gòu)建查找請求
QueryRequestBuilderbuilder=newQueryRequestBuilder();
?????????????????? builder
?????????????????? ?????? .sort("date_order",?SortOrder.DESC)? //排序
??????????????? .offset(0)
??????????????? .limit(5) // offset/limit分頁, 也可使用page
?????????????????? ?????? .requestFileds(…)?//請求返回的字段
?????????????????? ?????? .queryExp(eb)//查詢表達式,參考4
?????????????????? ?????? ;
QueryRequest qr = builder.build();
最后調(diào)用build方法生成查詢請求QueryRequest
執(zhí)行查找
Object[]orders=odooConnector.search(orderModel,?qr);
返回map數(shù)組润文,應(yīng)用需轉(zhuǎn)換成具體業(yè)務(wù)對象
單元測試
代碼包提供完整單元測試姐呐,覆蓋各種場景,包括not /and/or嵌套和優(yōu)先級
代碼包提供兩個測試類典蝌,OdooConnectorDemoTest和OdooConnectorTest
分別用于odoo提供的demo數(shù)據(jù)庫和自建數(shù)據(jù)庫
demo庫
odoo提供曙砂,不需要自己創(chuàng)建應(yīng)用和導入數(shù)據(jù),直接可以使用骏掀,但demo是動態(tài)鸠澈,每次測試可能連不同的庫柱告,數(shù)據(jù)不能延續(xù),速度慢
自建應(yīng)用/自建庫
odoo可免費注冊笑陈,使用14天际度,之后可續(xù)期,odoo提供demo數(shù)據(jù)庫涵妥,導入后應(yīng)用有數(shù)據(jù)可供測試
測試示例使用odoo應(yīng)用的銷售模塊乖菱,訂單子功能,選取以下字段
???? /**
???? ?*字段
???????? name String號碼
???????? date_orderdatetime單據(jù)日期
???????? commitment_datedatetime送貨日期
???????? expected_datedatetime預計日期
???????? partner_id many2one? 客戶
???????? amount_tax float
???????? amount_untaxed float
???????? amount_total float合計
???????? invoice_status發(fā)票狀態(tài)
???????? order_line={name=order_line,type=one2many}訂單明細
???????? notehtml說明
???? ?*/
測試1:查找表達式測試
測試不同運算符蓬网,邏輯符場景窒所,包括=,<>拳缠,like墩新,not like等運算符,not and or及其嵌套窟坐,優(yōu)先級
打開注釋測試不同測試場景海渊,1~7,其中6哲鸳,7測試not and or嵌套和優(yōu)先級
測試2:分頁拉取測試
演示count方法獲取總數(shù)臣疑,for循環(huán)分頁拉取所有數(shù)據(jù)