[day24] 产生订单

以後不切这麽多表格了,搞死自己

发动产生订单只需要使用者UID一个参数,大略流程如下

  1. 藉由UID取得使用者现在使用的购物车编号
  2. 取得购物车内商品的编号与数量
    1. 如果返回空则退出
  3. 再次检查库存是否足够
    1. 库存足够消耗则减少库存数量
    2. 库存不足则更新购物车的商品数量,并退出
  4. 产生购物清单与总金额
  5. 锁定购物车
  6. 依据付款方式产生交易请求
  7. 请求永丰收款API <--目前大概做到这
  8. 纪录并回应相关API参数

产生订单程序实作

tester.py

def init_orders(dbpm:DBPm, id=os.environ['Me'], yes=False):
    if(not yes):yes = askyes()
    if(not yes):return False

    # 取得购物车编号
    scid = dbpm.INS_QUY_SC(id)
    print(f"scid:{scid}")

    # 设定变数
    o_flag = True
    prodlist = []
    tot_price = 0

    # 取得购物明细
    shopping_list = dbpm.QUY_Shopping_Cart_by_scid(scid)
    if(not shopping_list):
        return False
    for prod in shopping_list:
        print(f"商品:{prod[0]}, 数量:{prod[1]}")
        # 库存检查
        current_quantity = dbpm.QUY_Prod_Quantity_by_pid(prod[0])
        if(current_quantity - prod[1] < 0):
            # 库存不足
            dbpm.UPD_Cart_items(scid, prod[0], current_quantity)
            o_flag = False
        else:
            # 库存足够
            new_quantity = current_quantity - prod[1]
            dbpm.UPD_Prod_Quantity(prod[0], new_quantity)
            product_name, product_price = dbpm.QUY_Prod_Name_and_Price_by_pid(prod[0])
            prodlist.append(f"{product_name} * {prod[1]}")
            tot_price = tot_price + product_price * prod[1]
    if(not o_flag):
        return False

    # 购物明细
    print(f"{prodlist}, Amount = {tot_price}")

    # 锁定购物车 
    dbpm.UPD_Shopping_Cart_lock_bY_scid(True, scid)

    # 建立信用卡付款交易编号
    paid = dbpm.INS_payment_req('C-1')
    neworder = APIModel.ReqOrderCreate(ShopNo=os.environ['ShopNo'], OrderNo=paid, Amount=tot_price*100, \
        PrdtName='IT铁人赛虚拟商店', ReturnURL=os.environ['ReturnURL'], BackendURL=os.environ['BackendURL'], PayType="C")
    msg, OK = GenApi.OrderCreate(neworder, GenApi.loadcfg())
    print(msg, OK)
    return o_flag

dbPm.py

def QUY_Shopping_Cart_by_scid(self, scid):
    cur = self.conn.cursor()
    query = sql.SQL("SELECT productid, quantity FROM {} where scid = %s").format(sql.Identifier('cart_items'))
    cur.execute(query, (scid,))
    shopping_list = cur.fetchall()
    if(shopping_list):
        return list(map(list, shopping_list))
    return None

def UPD_Shopping_Cart_lock_bY_scid(self, lock, scid):
    cur = self.conn.cursor()
    query = sql.SQL("UPDATE {} SET lock=%s WHERE scid = %s").format(sql.Identifier('shopping_cart'))
    cur.execute(query, (lock, scid))
    self.conn.commit()
    cur.close()

def UPD_Cart_items(self, scid, pid, quantity):
    cur = self.conn.cursor()
    query = sql.SQL("UPDATE {} SET quantity=%s WHERE scid = %s and productid = %s").format(sql.Identifier('cart_items'))
    cur.execute(query, (quantity, scid, pid))
    self.conn.commit()
    cur.close()

def INS_payment_req(self, pty_type):
    cur = self.conn.cursor()
    query = sql.SQL("INSERT INTO {}(type) VALUES (%s) RETURNING paid").format(sql.Identifier('payment_log'))
    cur.execute(query, (pty_type,))
    paid = cur.fetchone()
    self.conn.commit()
    cur.close()
    if(paid):
        return paid[0]
    return None

output

['【味丹】激浪汽水-冰晶柠檬风味 * 6', '可口可乐Zero易开罐330ml(24入) * 9', '百事可乐 250ml(24入) * 27'], Amount = 12429
{"OrderNo":"7","ShopNo":"NA0249_001","TSNo":"NA024900000550","Amount":1242900,"Status":"S","Description":"S0000 – 处理成功","Param1":"","Param2":"","Param3":"","PayType":"C","CardParam":{"CardPayURL":"https://sandbox.sinopac.com/QPay.WebPaySite/Bridge/PayCard?TD=NA024900000550&TK=760e060e-156d-4130-a760-16ff480dcdd5"}} True
成功

<<:  Day21 - [丰收款] 以Django Web框架实作永丰API线上支付模拟情境(2) - 购物车与付款方式确认页

>>:  第 21 集:Bootstrap 客制化 utilities(上)

30天打造品牌特色电商网站 Day.19 文字的排版

字距、行距、与其他物件的距离,调整适当能让使用者有舒服的体验,而良好的排版能引导使用者优先接收整个画...

Day 03 : ML in Production 的挑战

在 Day2 提到什麽是用於生产的机械学习 ML in Production ,今天来谈用於生产的机...

Day 27:572. Subtree of Another Tree

今日题目 题目连结:572. Subtree of Another Tree 题目主题:Tree, ...

[Day18] 注册API – 测试阶段之csrf_protect

嗨~~大家好,今天我要来补充说明@csrf_protect要输入的资料,在Day9的时候,我们有说过...

视觉设计(1)

来轻松聊聊 本单元可以视为CSS基础介绍的进阶内容,相对於基础篇会提供更多实用的且更接近实际网页开发...