前面講過前端顯示內容、接口返回值的校驗 Web頁面相關的字段【一】、數據庫查表記錄的值和前端頁面、接口返回值的校驗 前端顯示的值、接口返回值和數據庫表裏的記錄【二】;這次來說下 數據庫不同表的部分字段校驗;實際這部分就是取記錄,篩選需要的字段值,也沒啥好說的,主要是分享下我遇到的情景。
情景
我們的系統會從另一個業務系統拿到訂單表t_amount_record,後臺根據需求將其處理後,組成了我們的t_recharge_order;
因爲訂單交易會有退款的可能,所以業務系統將狀態的字段定爲status,其值91對應退款,101代表簽收;另一個字段create_time對應簽收時間【狀態爲101】\退款時間【狀態爲91】;
我們的表結構如下:【設置了order_receive_time、order_refund_time】
最初我知道前端頁面的數據來自業務系統的表t_amount_record,就直接做了接口返回值 和 數據庫這表t_amount_record的校驗;後來,後臺處理好,又做了接口返回值 和 數據庫t_recharge_order的校驗;後來想到,其實應該做 2張表 記錄的校驗,也就有了這篇分享。
代碼
1.業務系統表t_amount_record和接口返回值的校驗
# 需要傳入app_id、create_time
sql2 = 'SELECT * FROM `t_amount_record` WHERE app_id = %d AND `status` = 101 AND create_time < %d AND create_time > %d ;' % (
app_id, sjc[1], sjc[0])
cur.execute(sql2)
data2 = list(cur.fetchall()) # 簽收訂單的list
sql3 = 'SELECT * FROM `t_amount_record` WHERE app_id = %d AND `status` = 91 AND create_time < %d AND create_time > %d ;' % (
app_id, sjc[1], sjc[0])
cur.execute(sql3)
data3 = list(cur.fetchall()) # 退款訂單的list
for i in data3:
for d in data2:
if i[3] == d[3]:
# 去除相同order的簽收單,增加退款單【退款單 增加一個簽收時間】
data2.remove(d)
data2.append(i + (d[-1],))
break
list_e = []
for i in data2:
t_d = dict()
# 依據接口返回值來決定key
t_d['vendorId'] = vendor_id
if i[4] == 101:
t_d['status'] = 101 # 'Received'
t_d['orderReceiveTime'] = TestM().time_change1(i[-1])
t_d['orderRefundTime'] = ''
else:
t_d['status'] = 91 # 'Refunded'
t_d['orderReceiveTime'] = TestM().time_change1(i[-1])
t_d['orderRefundTime'] = TestM().time_change1(i[-2])
list_e.append(t_d)
list_e就是自己處理後的數據明細list,和接口返回的list做個對比,即可。
2.業務系統表t_amount_record和自己表t_recharge_order的校驗
# 業務表 t_amount_record查詢此id的所有記錄
sql3 = "SELECT * FROM `t_amount_record` WHERE app_id = %d AND status IN (91, 101);" % data2[0][0]
cur.execute(sql3)
data3 = cur.fetchall() # data3元素內字段值肯定沒重複,可set
list_end = [list(e) for e in data3]
list_end1 = [e[3] for e in list_end] # 所有order_id放到list_end1
list_end2 = [i for i in list_end1 if list_end1.count(i) == 1] # list_end2是簽收單
list_Back = list()
list_Received = list()
list_Refunded = list()
for e in data3:
t2 = dict()
t2['order_id'] = e[3]
if e[3] in data3:
t2['order_receive_time'] = e[-1]
t2['order_refund_time'] = None
# 正常的情況 e[4]只能是101
assert e[4] == 101
t2['status'] = e[4]
list_Back.append(t2) # 簽收訂單
elif e[4] == 91 and e[3] not in list_end2:
t2['status'] = e[4]
t2['order_refund_time'] = e[-1]
t2['order_receive_time'] = None
list_Refunded.append(t2) # 退款訂單的退款
elif e[4] == 101 and e[3] not in list_end2:
t2['order_receive_time'] = e[-1]
list_Received.append(t2) # 退款訂單的簽收
else:
raise AssertionError # 其他不確定的情況
for i in list_Received:
for a in list_Refunded:
if i['order_id'] == a['order_id']:
i.update(a) # 簽收時間的字段 order_receive_time更新
list_Back.extend(list_Received) # 退款訂單
這是對業務系統表t_amount_record的處理;list_Back與 表t_recharge_order的list做個對比,即可。
2份代碼的思路不同:上面是兩次Select,分別查簽收、退款的訂單記錄,下面是1次Select所有簽收+退款的訂單記錄;
交流技術 歡迎+QQ 153132336 zy
個人博客 https://blog.csdn.net/zyooooxie