我們要來繼續我們的旅程了~
首先,在你的現有控制器中新增一個處理 POST 請求的路由,該路由將接收維修訂單的相關資料,並創建一個新的維修訂單。
# POST 請求:創建一筆新的維修訂單
@http.route('/repair/orders', type='http', auth='public', methods=['POST'], csrf=False)
def create_repair_order(self):
try:
# 解析 JSON
data = json.loads(request.httprequest.data)
# 如果沒有產品 ID,則創建一個新產品
product = request.env['product.product'].sudo().search([('id', '=', data.get('product_id'))], limit=1)
if not product:
product = request.env['product.product'].sudo().create({
'name': data.get('product_name', 'Unnamed Product')
})
# 創建新的維修訂單
new_order = request.env['repair.order'].sudo().create({
'name': data.get('name', 'New Repair Order'),
'product_id': product.id,
'partner_id': data.get('partner_id'),
'state': data.get('state', 'draft')
})
return http.Response(
json.dumps({
'status': 'success',
'message': 'Repair order created successfully',
'order_id': new_order.id
}),
content_type='application/json'
)
except Exception as e:
return http.Response(
json.dumps({'status': 'error', 'message': str(e)}),
content_type='application/json'
)
POST 請求應包含訂單的詳細信息,如訂單名稱、產品 ID、客戶 ID、狀態等。這些資料將傳遞到控制器,並通過 Odoo ORM 在 repair.order
模型中創建新的記錄。
打開 Postman 並創建新請求:
設置 POST 請求:
POST
。http://localhost:8069/repair/orders
(假設 Odoo 正在本地端口 8069 上運行)。Content-Type
為 application/json
。設置 Body:
raw
並設置格式為 JSON
。{
"name": "Repair Order Test",
"product_id": 1,
"partner_id": 1,
"state": "confirmed"
}
發送請求:
查看響應:
{
"status": "success",
"message": "Repair order created successfully",
"order_id": 1
}
其中,order_id
是新創建的訂單的 ID。
當 POST 請求成功後,你可以登錄 Odoo 後台,進入 Repair
模組,查看新創建的維修訂單是否已經成功創建。
通過以上步驟,你已經實現了通過 POST 請求來創建新的維修訂單,並且可以通過 Postman 測試這個 API 功能。
在 Odoo 中,repair.order
模型中的 partner_id
(客戶 ID)是必需的,因為每個維修訂單都需要與某個客戶相關聯。這意味著,當你創建一個新的維修訂單時,系統會希望你指定一個已經存在的客戶。
如果你不希望每次都要先為客戶創建帳號,這裡有幾種方案可以考慮:
Odoo 通常會在某些情況下使用一個默認的「匿名客戶」或「公共客戶」來處理不需要明確客戶的情況。你可以先在 Odoo 的「聯繫人」中創建一個公共客戶,然後在創建訂單時,默認使用這個客戶。
partner_id
(客戶 ID)時,默認使用這個公共客戶的 ID。例如,假設「公共客戶」的 ID 是 1,則可以這樣處理:from odoo import http
from odoo.http import request
import json
class RepairOrderController(http.Controller):
# POST 請求:新增一筆維修訂單
@http.route('/repair/orders/create', type='json', auth='public', methods=['POST'], csrf=False)
def create_repair_order(self):
try:
# 從請求中提取資料
data = request.jsonrequest
# 如果沒有提供客戶 ID,則使用公共客戶的 ID(假設為 1)
partner_id = data.get('partner_id', 1)
# 創建新的維修訂單
new_order = request.env['repair.order'].sudo().create({
'name': data.get('name'),
'product_id': data.get('product_id'),
'partner_id': partner_id, # 使用指定的客戶 ID,或默認為公共客戶
'state': data.get('state', 'draft'), # 默認狀態為 'draft'
'repair_fee': data.get('repair_fee', 0.0), # 默認維修費用為 0.0
})
# 返回成功訊息和新創建訂單的 ID
return {
'status': 'success',
'message': 'Repair order created successfully',
'order_id': new_order.id,
}
except Exception as e:
return {
'status': 'error',
'message': str(e),
}
在這段程式中,如果 partner_id
沒有在 POST 請求中提供,它將自動使用 ID 為 1 的「公共客戶」。
如果你確定在某些情況下維修訂單不需要客戶,你可以修改 repair.order
模型的字段屬性,將 partner_id
設置為非必填字段。這樣,你就可以創建不帶客戶的維修訂單。
如果你是開發者,可以自定義 repair.order
模型,讓 partner_id
變成可選的。如下所示:
from odoo import models, fields
class RepairOrder(models.Model):
_inherit = 'repair.order'
partner_id = fields.Many2one('res.partner', string='Customer', required=False) # 移除必填限制
這段程式通過繼承 repair.order
模型並將 partner_id
字段的 required
屬性設置為 False
,使得客戶成為可選字段。
注意:這樣做可能會影響到 Odoo 的其他功能,因為 Odoo 預設認為每個訂單應該關聯到一個客戶。所以這種方法應該謹慎使用。
如果你的需求是當沒有客戶時自動創建一個新的客戶(例如匿名客戶),你可以修改控制器,在處理 POST 請求時檢查是否提供了 partner_id
,如果沒有,則自動創建一個臨時或匿名客戶。
from odoo import http
from odoo.http import request
import json
class RepairOrderController(http.Controller):
# POST 請求:新增一筆維修訂單
@http.route('/repair/orders/create', type='json', auth='public', methods=['POST'], csrf=False)
def create_repair_order(self):
try:
# 從請求中提取資料
data = request.jsonrequest
# 如果沒有提供客戶 ID,則自動創建匿名客戶
if not data.get('partner_id'):
new_partner = request.env['res.partner'].sudo().create({
'name': 'Anonymous Customer',
})
partner_id = new_partner.id
else:
partner_id = data.get('partner_id')
# 創建新的維修訂單
new_order = request.env['repair.order'].sudo().create({
'name': data.get('name'),
'product_id': data.get('product_id'),
'partner_id': partner_id, # 使用新創建或指定的客戶 ID
'state': data.get('state', 'draft'),
'repair_fee': data.get('repair_fee', 0.0),
})
# 返回成功訊息和新創建訂單的 ID
return {
'status': 'success',
'message': 'Repair order created successfully',
'order_id': new_order.id,
}
except Exception as e:
return {
'status': 'error',
'message': str(e),
}
這段程式會在 partner_id
缺失的情況下自動創建一個匿名客戶,然後繼續創建維修訂單。
partner_id
設置為非必填字段,但需要注意這可能影響到 Odoo 的其他業務邏輯。選擇合適的方案取決於你的具體業務需求。如果不希望每次手動創建客戶,使用公共客戶或自動創建客戶會是比較合適的選擇。