由於三個發票類型情境,可以再拆分成兩組,
(1) 傳統發票、紙本電子發票
(2) 載具
通常發票應該可以一次存入多張,所以這邊將傳統發票、紙本電子發票歸類一組;載具每個人僅會有一組,所以不需要設計多個傳入的方法。此外,載具驗證碼需要加密,這裡需要特別實作。
async def perform_save_data(save_data):
data_models = []
if save_data.tag in ["invoice_paper", "invoice_trad"]:
invoice_data = save_data.invoice
user_data = save_data.user
for invoice in invoice_data:
invoice["gov"] = {
"status": "審查中",
"gov_status": "等待查詢中",
"error_msg": "",
}
data_model = Data(
tag=save_data.tag,
created_timestamp=datetime.now(tz),
updated_timestamp=datetime.now(tz),
data={**user_data, **invoice}
)
data_models.append(data_model)
elif save_data.tag == "carrier":
carrier_data = save_data.carrier
if 'card_encrypt' in carrier_data:
encrypted_card = encrypt_with_salt(carrier_data['card_encrypt'])
carrier_data['card_encrypt'] = encrypted_card
carrier_data["gov"] = {
"status": "審查中",
"gov_status": "等待查詢中",
"error_msg": "",
}
data_model = Data(
tag=save_data.tag,
created_timestamp=datetime.now(tz),
updated_timestamp=datetime.now(tz),
data={**carrier_data},
)
data_models.append(data_model)
result = await Data.insert_many(data_models)
inserted_ids = result.inserted_ids
for idx, data_model in enumerate(data_models):
setattr(data_model, 'id', str(inserted_ids[idx]))
return data_models
最後可以嘗試打 API 看看是否成功
到目前為止,已介紹如何將發票上傳到 MongoDB
接下來更重要的是,要如何去定期更新發票資料呢?
後續將介紹 Airflow 架設以及如何寫 Dag!