写在前面
前三篇已经写到了收银的大致的功能都已经基本实现,但是缺少的是将数据提交到数据库中。
本章目标
先从最简单的取消订单开始,也就是将订单页面清空。
清空的内容包含流水单号,购物车内的商品,商品总价金额置零等。首先完成前端的取消事件。
<div class="form-group">
<input type="button" class="btn btn-success" value="完成" id="submit" style="width:120px;height: 50px;font-size: 28px">
<input type="button" class="btn btn-default" value="取消" id="cancel"
style="width:120px;height: 50px;margin-left: 90px;background-color: gray;color:white;font-size: 28px">
</div>
$('#cancel').on('click',function () {
location.href = "{% url 'cashier_cancel' %}"
});
views.py里创建取消功能的函数,cashier_cancel
def cashier_cancel(request):
"""
取消当前订单
:param request:
:return:
"""
current_customer.buy_list.clear() # 清空当前的列表
current_customer.serialnum = "" # 清空当前的单号
current_customer.total_number = 0 # 存储商品总量
current_customer.total_money = 0.0 # 存储总金额
current_customer.receive_money = 0.0 # 存储收款金额
current_customer.return_money = 0.0 # 存储找零金额
# 跳转
return redirect(reverse('cashier') + "?username=" + login_obj.current_username)
在urls.py下写入路径。
path('cashier/get_return/', shop_views.get_return_money, name="get_return"),
path('cashier/cancel/', shop_views.cashier_cancel, name="cashier_cancel"),
效果如下
点击取消
实现点击完成提交到数据库
1.完成js事件,并且关联函数
$('#submit').on('click',function () {
location.href = "{% url 'cashier_submit' %}"
});
在views.py下添加完成该功能的函数,然后在urls.py下添加路径
def cashier_submit(request):
"""
提交到数据库
:param request:
:return:
"""
pass
path('cashier/submit/', shop_views.cashier_submit, name="cashier_submit"),
先把这个功能的实现结构写出来,按照这个结构添加代码
假设我们的功能已经实现,在cashier_submit函数里直接把写好的函数引用,减少views.py的代码行数,订单完成后对顾客的购买信息清空,所以,把cashier_submit函数写成如下:
def cashier_submit(request):
"""
提交到数据库
:param request:
:return:
"""
# 提交到数据库
current_customer.submit(login_obj.loginId)
# 重新初始化顾客
current_customer.buy_list.clear() # 清空当前的列表
current_customer.serialnum = "" # 清空当前的单号
current_customer.total_number = 0 # 存储商品总量
current_customer.total_money = 0.0 # 存储总金额
current_customer.receive_money = 0.0 # 存储收款金额
current_customer.return_money = 0.0 # 存储找零金额
# 跳转
return redirect(reverse('cashier') + "?username=" + login_obj.current_username)
这样关键的代码就在current_customer.submit(login_obj.loginId)这个语句里了,下面要完成的是submit函数的内容
首先按照之前的sql执行的语句,把执行的sql语句置空,复制之前的代码
def submit(self, loginId):
"""
提交到数据库
:return:
"""
# 实例化数据库连接
mysql_db = pymysql.connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
# 定义一个指针
cursor = mysql_db.cursor()
# 准备SQL语句 --- 插入SalesList,插入到SalesListDetail ,更新Product ,通过List
sql_list = []
# 插入到SalesList --- 一条
sql=""
try:
# 遍历sql_list
for sql in sql_list:
# 执行SQL获取结果
cursor.execute(sql)
# 使用提交更改
mysql_db.commit()
# username = request.GET.get("username")
sql_pay = "UPDATE Login SET ispay='ture' WHERE LoginId='%s'" % loginId
print(sql)
cursor.execute(sql_pay)
mysql_db.commit()
except Exception as e:
# rollback -- 回滚
mysql_db.rollback()
# 报错
return HttpResponse("提交出现异常,具体原因:" + str(e))
finally:
mysql_db.close()
这样,我们下一步就是考虑sql语句怎么写
首先写的是销售概况写入SalesList表,SalesList表包含了SerialNumber,TotalNumber,TotalPrice,ReceiveMoney,ReturnMoney,LoginId,BuyTime(流水单号,商品总数,商品总价,收钱,应找回钱,登陆人,订单时间)内容。
sql = "Insert Into SalesList (SerialNumber,TotalNumber,TotalPrice,ReceiveMoney,ReturnMoney,LoginId,BuyTime) " \
"Values('%s',%d,%.2f,%.2f,%.2f,'%s','%s')" % (self.serialnum, self.total_number, self.total_money, self.receive_money, self.return_money, loginId, datetime.now())
sql_list.append(sql)
可以先不执行sql语句,先把语句的输出情况打印出来,然后在sql工具里面看看生成的sql语句是否出错,这样更容易发现错误。
然后是商品明细表,SerialNumber, ProductId, ProductName, Unit, UnitPrice, Number, Money (流水单号,商品id,商品的名称,单价,单位,数量,金额)
有多少种商品,就添加多少个,所以可以用for循环。
for product in self.buy_list:
# 插入到SalesListDetail
sql01 = "Insert Into SalesListDetail(SerialNumber, ProductId, ProductName, Unit, UnitPrice, Number, Money) " \
"Values('%s','%s','%s','%s',%.2f,%d,%.2f)" % (self.serialnum, product['ProductId'], product['ProductName'],
product['Unit'], product['UnitPrice'], product['Number'], product['Money'])
修改库存量,用现有的库存数减去商品的售出量
sql02 = "Update Product Set Inventory=Inventory-%d where ProductId='%s'" % (product['Number'], product['ProductId'])
sql_list.append(sql02)
测试结果:
销售商品表
销售明细表
库存表