Files
order/web/controllers/finance/Finance.py
2019-08-06 14:17:42 +08:00

175 lines
6.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
from flask import Blueprint,request,redirect,jsonify
from common.libs.Helper import ops_render
from common.models.member.Member import Member
from common.models.food.Food import Food
from common.models.pay.PayOrder import PayOrder
from common.models.pay.PayOrderItem import PayOrderItem
from application import app,db
from common.libs.UrlManager import UrlManager
from common.libs.Helper import iPagination,selectFilterObj,getDictListFilterField,getDictFilterField,getCurrentDate
from sqlalchemy import func
import json
route_finance = Blueprint( 'finance_page',__name__ )
@route_finance.route( "/index" )
def index():
resp_data = {}
req = request.values
page = int(req['p']) if ('p' in req and req['p']) else 1
query = PayOrder.query
if 'status' in req and int( req['status'] ) > -1 :
query = query.filter( PayOrder.status == int( req['status'] ) )
page_params = {
'total': query.count(),
'page_size': app.config['PAGE_SIZE'],
'page': page,
'display': app.config['PAGE_DISPLAY'],
'url': request.full_path.replace("&p={}".format(page), "")
}
pages = iPagination(page_params)
offset = (page - 1) * app.config['PAGE_SIZE']
pay_list = query.order_by(PayOrder.id.desc()).offset(offset).limit(app.config['PAGE_SIZE']).all()
data_list = []
if pay_list:
pay_order_ids = selectFilterObj( pay_list,"id" )
pay_order_items_map = getDictListFilterField( PayOrderItem,PayOrderItem.pay_order_id,"pay_order_id", pay_order_ids )
food_mapping = {}
if pay_order_items_map:
food_ids = []
for item in pay_order_items_map:
tmp_food_ids = selectFilterObj( pay_order_items_map[ item ],"food_id" )
tmp_food_ids = {}.fromkeys(tmp_food_ids).keys()
food_ids = food_ids + list( tmp_food_ids )
#food_ids里面会有重复的要去重
food_mapping = getDictFilterField( Food,Food.id,"id", food_ids )
for item in pay_list:
tmp_data = {
"id":item.id,
"status_desc":item.status_desc,
"order_number":item.order_number,
"price":item.total_price,
"pay_time":item.pay_time,
"created_time":item.created_time.strftime("%Y%m%d%H%M%S")
}
tmp_foods = []
tmp_order_items = pay_order_items_map[ item.id ]
for tmp_order_item in tmp_order_items:
tmp_food_info = food_mapping[ tmp_order_item.food_id ]
tmp_foods.append( {
'name':tmp_food_info.name,
'quantity':tmp_order_item.quantity
} )
tmp_data['foods'] = tmp_foods
data_list.append( tmp_data )
resp_data['list'] = data_list
resp_data['pages'] = pages
resp_data['search_con'] = req
resp_data['pay_status_mapping'] = app.config['PAY_STATUS_MAPPING']
resp_data['current'] = 'index'
return ops_render( "finance/index.html",resp_data )
@route_finance.route( "/pay-info" )
def info():
resp_data = {}
req = request.values
id = int(req['id']) if 'id' in req else 0
reback_url = UrlManager.buildUrl("/finance/index")
if id < 1:
return redirect( reback_url )
pay_order_info = PayOrder.query.filter_by( id = id ).first()
if not pay_order_info:
return redirect(reback_url)
member_info = Member.query.filter_by( id = pay_order_info.member_id ).first()
if not member_info:
return redirect(reback_url)
order_item_list = PayOrderItem.query.filter_by( pay_order_id = pay_order_info.id ).all()
data_order_item_list = []
if order_item_list:
food_map = getDictFilterField(Food, Food.id, "id", selectFilterObj(order_item_list, "food_id"))
for item in order_item_list:
tmp_food_info = food_map[ item.food_id ]
tmp_data = {
"quantity":item.quantity,
"price":item.price,
"name":tmp_food_info.name
}
data_order_item_list.append( tmp_data )
address_info = {}
if pay_order_info.express_info:
address_info = json.loads(pay_order_info.express_info)
resp_data['pay_order_info'] = pay_order_info
resp_data['pay_order_items'] = data_order_item_list
resp_data['member_info'] = member_info
resp_data['address_info'] = address_info
resp_data['current'] = 'index'
return ops_render( "finance/pay_info.html",resp_data )
@route_finance.route( "/account" )
def set():
resp_data = {}
req = request.values
page = int(req['p']) if ('p' in req and req['p']) else 1
query = PayOrder.query.filter_by( status = 1 )
page_params = {
'total': query.count(),
'page_size': app.config['PAGE_SIZE'],
'page': page,
'display': app.config['PAGE_DISPLAY'],
'url': request.full_path.replace("&p={}".format(page), "")
}
pages = iPagination(page_params)
offset = (page - 1) * app.config['PAGE_SIZE']
list = query.order_by(PayOrder.id.desc()).offset(offset).limit(app.config['PAGE_SIZE']).all()
stat_info = db.session.query( PayOrder,func.sum( PayOrder.total_price ).label("total") )\
.filter( PayOrder.status == 1 ).first()
app.logger.info ( stat_info )
resp_data['list'] = list
resp_data['pages'] = pages
resp_data['total_money'] = stat_info[ 1 ] if stat_info[ 1 ] else 0.00
resp_data['current'] = 'account'
return ops_render( "finance/account.html",resp_data )
@route_finance.route("/ops", methods=[ "POST"])
def orderOps():
resp = {'code': 200, 'msg': '操作成功~', 'data': {}}
req = request.values
id = req['id'] if 'id' in req else 0
act = req['act'] if 'act' in req else ''
pay_order_info = PayOrder.query.filter_by( id = id ).first()
if not pay_order_info:
resp['code'] = -1
resp['msg'] = "系统繁忙。请稍后再试~~"
return jsonify(resp)
if act == "express":
pay_order_info.express_status = -6
pay_order_info.updated_time = getCurrentDate()
db.session.add( pay_order_info )
db.session.commit()
return jsonify(resp)