python学习

This commit is contained in:
2019-08-06 14:17:42 +08:00
parent 6569d29d7e
commit 54761c6262
52 changed files with 2943 additions and 647 deletions

3
jobs/bash_jobs Normal file
View File

@@ -0,0 +1,3 @@
#!/bin/sh
export ops_config=production
. /data/www/python3_vir/bin/activate

57
jobs/launcher.py Normal file
View File

@@ -0,0 +1,57 @@
# -*- coding: utf-8 -*-
from application import app,manager
from flask_script import Command,Option
import argparse,sys,traceback
'''
python manage.py runjob -m Test ( jobs/tasks/Test.py )
python manage.py runjob -m test/Index ( jobs/tasks/test/Index.py )
* name or flags - 名称或选项字符串列表, e.g. foo or -f, --foo.
* action - 参数如果定义了选项,表示这是一个操作参数,至于调用时做哪种操作由用户输入或者default决定。
* nargs - 应该使用的命令行参数数。.
* const - 某些动作或参数个数的常数值。.
* default - 如果命令行没有对输入这个参数相应的值,则此参数用default给出的值.
* type -将用户输入的值转化为哪种类型.
* choices - 参数可输入值的范围或选择.
* required - 命令行输入的值是否可以被忽略(布尔量).
* help - 参数的简要描述.
* metavar - useage中显示的参数的名称.
* dest - 要添加到解析参数返回的对象中的属性的名称.
'''
class runJob( Command ):
capture_all_args = True
def run(self,*args,**kwargs):
args = sys.argv[2:]
parser = argparse.ArgumentParser( add_help = True )
parser.add_argument("-m","--name",dest = "name",metavar = "name", help="指定job名",required=True)
parser.add_argument("-a","--act",dest = "act",metavar = "act", help="Job动作",required=False)
parser.add_argument("-p","--param",dest = "param",nargs = "*", metavar = "param",help="业务参数",default = '',required=False)
params = parser.parse_args( args )
params_dict = params.__dict__
ret_params = {}
for item in params_dict.keys():
ret_params[ item ] = params_dict[ item ]
if "name" not in ret_params or not ret_params['name']:
return self.tips()
module_name = ret_params['name'].replace( "/","." )
try:
import_string = "from jobs.tasks.%s import JobTask as job_target" % ( module_name )
exec( import_string , globals() )
target = job_target()
target.run( ret_params )
except Exception as e:
traceback.print_exc()
def tips(self):
tip_msg = '''
请正确调度Job
python manage runjob -m Test ( jobs/tasks/Test.py )
python manage runjob -m test/Index ( jobs/tasks/test/Index.py )
'''
app.logger.info( tip_msg )
return False

9
jobs/readme.md Normal file
View File

@@ -0,0 +1,9 @@
Job 列表
======
* 队列Job
* * * * * { . ~/.bash_jobs && cd /data/www/Order && python manager.py runjob -m queue/index ;} >> /data/www/logs/queue_list.`date +\%Y_\%m_\%d`.log 2>&1
* * * * * { . ~/.bash_jobs && cd /data/www/Order && python manager.py runjob -m pay/index ;} >> /data/www/logs/pay_index.`date +\%Y_\%m_\%d`.log 2>&1
1 2 * * { . ~/.bash_jobs && cd /data/www/Order && python manager.py runjob -m stat/daily -a member ;} >> /data/www/logs/pay_index.`date +\%Y_\%m_\%d`.log 2>&1
2 2 * * * { . ~/.bash_jobs && cd /data/www/Order && python manager.py runjob -m stat/daily -a food ;} >> /data/www/logs/pay_index.`date +\%Y_\%m_\%d`.log 2>&1
3 2 * * * { . ~/.bash_jobs && cd /data/www/Order && python manager.py runjob -m stat/daily -a site ;} >> /data/www/logs/pay_index.`date +\%Y_\%m_\%d`.log 2>&1

26
jobs/tasks/pay/index.py Normal file
View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from common.models.pay.PayOrder import PayOrder
from common.libs.Helper import getFormatDate
from common.libs.pay.PayService import PayService
import datetime
from application import app,db
'''
python manager.py runjob -m pay/index
'''
class JobTask():
def __init__(self):
pass
def run(self,params):
now = datetime.datetime.now()
date_before_30min = now + datetime.timedelta( minutes = -30 )
list = PayOrder.query.filter_by( status = -8 ).\
filter( PayOrder.created_time <= getFormatDate( date = date_before_30min ) ).all()
if not list:
app.logger.info("no data~~")
return
pay_target = PayService()
for item in list:
pay_target.closeOrder( pay_order_id = item.id )
app.logger.info("it's over~~")

110
jobs/tasks/queue/index.py Normal file
View File

@@ -0,0 +1,110 @@
# -*- coding: utf-8 -*-
from application import app,db
from common.models.queue.QueueList import QueueList
import json,requests,datetime
from common.libs.Helper import getCurrentDate
from common.libs.pay.WeChatService import WeChatService
from common.models.pay.PayOrder import PayOrder
from common.models.pay.PayOrderItem import PayOrderItem
from common.models.member.OauthMemberBind import OauthMemberBind
from common.models.food.Food import Food
from common.models.food.FoodSaleChangeLog import FoodSaleChangeLog
from sqlalchemy import func
'''
python manager.py runjob -m queue/index
'''
class JobTask():
def __init__(self):
pass
def run(self,params):
list = QueueList.query.filter_by(status = -1 )\
.order_by( QueueList.id.asc() ).limit(1).all()
for item in list:
if item.queue_name == "pay":
self.handlePay( item )
item.status = 1
item.updated_time = getCurrentDate()
db.session.add( item )
db.session.commit()
def handlePay(self,item ):
data = json.loads( item.data )
if 'member_id' not in data or 'pay_order_id' not in data:
return False
oauth_bind_info = OauthMemberBind.query.filter_by(member_id=data['member_id']).first()
if not oauth_bind_info:
return False
pay_order_info = PayOrder.query.filter_by( id = data['pay_order_id']).first()
if not pay_order_info:
return False
#更新销售总量
pay_order_items = PayOrderItem.query.filter_by( pay_order_id = pay_order_info.id ).all()
notice_content = []
if pay_order_items:
date_from = datetime.datetime.now().strftime( "%Y-%m-01 00:00:00" )
date_to = datetime.datetime.now().strftime( "%Y-%m-31 23:59:59" )
for item in pay_order_items:
tmp_food_info = Food.query.filter_by( id = item.food_id ).first()
if not tmp_food_info:
continue
notice_content.append( "%s %s份"%( tmp_food_info.name,item.quantity) )
#当月数量
tmp_stat_info = db.session.query(FoodSaleChangeLog, func.sum(FoodSaleChangeLog.quantity).label("total")) \
.filter( FoodSaleChangeLog.food_id == item.food_id )\
.filter( FoodSaleChangeLog.created_time >= date_from,FoodSaleChangeLog.created_time <= date_to ).first()
tmp_month_count = tmp_stat_info[ 1 ] if tmp_stat_info[ 1 ] else 0
tmp_food_info.total_count += 1
tmp_food_info.month_count = tmp_month_count
db.session.add( tmp_food_info )
db.session.commit()
keyword1_val = pay_order_info.note if pay_order_info.note else '无'
keyword2_val = "、".join( notice_content )
keyword3_val = str( pay_order_info.total_price )
keyword4_val = str( pay_order_info.order_number )
keyword5_val = ""
if pay_order_info.express_info:
express_info = json.loads( pay_order_info.express_info )
keyword5_val = str( express_info['address'] )
#发送模板消息
target_wechat = WeChatService( )
access_token = target_wechat.getAccessToken()
headers = {'Content-Type': 'application/json'}
url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=%s"%access_token
params = {
"touser": oauth_bind_info.openid,
"template_id":"8aqlWFAjZZ_NnR0_vOvHGcwHglvIlAYRaUyOmFD5kvs",
"page": "pages/my/order_list",
"form_id": pay_order_info.prepay_id,
"data": {
"keyword1": {
"value": keyword1_val
},
"keyword2": {
"value": keyword2_val
},
"keyword3": {
"value": keyword3_val
},
"keyword4": {
"value": keyword4_val
},
"keyword5": {
"value": keyword5_val
}
}
}
r = requests.post(url=url, data= json.dumps( params ).encode('utf-8'), headers=headers)
r.encoding = "utf-8"
app.logger.info(r.text)
return True

215
jobs/tasks/stat/daily.py Normal file
View File

@@ -0,0 +1,215 @@
# -*- coding: utf-8 -*-
from application import app,db
from common.libs.Helper import getFormatDate,getCurrentDate
from common.models.member.Member import Member
from common.models.pay.PayOrder import PayOrder
from common.models.stat.StatDailyFood import StatDailyFood
from common.models.stat.StatDailySite import StatDailySite
from common.models.stat.StatDailyMember import StatDailyMember
from common.models.food.WxShareHistory import WxShareHistory
from common.models.food.FoodSaleChangeLog import FoodSaleChangeLog
from sqlalchemy import func
import random
'''
python manager.py runjob -m stat/daily -a member|food|site -p 2018-07-01
'''
class JobTask():
def __init__(self):
pass
def run(self, params):
act = params['act'] if 'act' in params else ''
date = params['param'][0] if params['param'] and len(params['param']) else getFormatDate(format="%Y-%m-%d")
if not act:
return
date_from = date + " 00:00:00"
date_to = date + " 23:59:59"
func_params = {
'act': act,
'date':date,
'date_from':date_from,
'date_to':date_to
}
if act == "member":
self.statMember( func_params )
elif act == "food":
self.statFood( func_params )
elif act == "site":
self.statSite( func_params)
elif act == "test":
self.test()
app.logger.info("it's over~~")
return
'''
会员统计
'''
def statMember(self,params):
act = params['act']
date = params['date']
date_from = params['date_from']
date_to = params['date_to']
app.logger.info( "act:{0},from:{1},to:{2}".format( act,date_from,date_to ) )
member_list = Member.query.all()
if not member_list:
app.logger.info( "no member list" )
return
for member_info in member_list:
tmp_stat_member = StatDailyMember.query.filter_by( date = date,member_id = member_info.id ).first()
if tmp_stat_member:
tmp_model_stat_member = tmp_stat_member
else:
tmp_model_stat_member = StatDailyMember()
tmp_model_stat_member.date = date
tmp_model_stat_member.member_id = member_info.id
tmp_model_stat_member.created_time = getCurrentDate()
tmp_stat_pay = db.session.query( func.sum(PayOrder.total_price).label("total_pay_money")) \
.filter( PayOrder.member_id == member_info.id ,PayOrder.status == 1 )\
.filter( PayOrder.created_time >= date_from,PayOrder.created_time <= date_to ).first()
tmp_stat_share_count = WxShareHistory.query.filter( PayOrder.member_id == member_info.id )\
.filter( PayOrder.created_time >= date_from,PayOrder.created_time <= date_to ).count()
tmp_model_stat_member.total_shared_count = tmp_stat_share_count
tmp_model_stat_member.total_pay_money = tmp_stat_pay[ 0 ] if tmp_stat_pay[ 0 ] else 0.00
'''
为了测试效果模拟数据
'''
tmp_model_stat_member.total_shared_count = random.randint(50,100)
tmp_model_stat_member.total_pay_money = random.randint(1000,1010)
tmp_model_stat_member.updated_time = getCurrentDate()
db.session.add( tmp_model_stat_member )
db.session.commit()
return
'''
Food统计
'''
def statFood(self,params):
act = params['act']
date = params['date']
date_from = params['date_from']
date_to = params['date_to']
app.logger.info( "act:{0},from:{1},to:{2}".format( act,date_from,date_to ) )
stat_food_list = db.session.query(FoodSaleChangeLog.food_id, func.sum(FoodSaleChangeLog.quantity).label("total_count"),
func.sum(FoodSaleChangeLog.price).label("total_pay_money")) \
.filter(FoodSaleChangeLog.created_time >= date_from, FoodSaleChangeLog.created_time <= date_to)\
.group_by( FoodSaleChangeLog.food_id ).all()
if not stat_food_list:
app.logger.info("no data")
return
for item in stat_food_list:
tmp_food_id = item[ 0 ]
tmp_stat_food = StatDailyFood.query.filter_by(date=date, food_id = tmp_food_id ).first()
if tmp_stat_food:
tmp_model_stat_food = tmp_stat_food
else:
tmp_model_stat_food = StatDailyFood()
tmp_model_stat_food.date = date
tmp_model_stat_food.food_id = tmp_food_id
tmp_model_stat_food.created_time = getCurrentDate()
tmp_model_stat_food.total_count = item[1]
tmp_model_stat_food.total_pay_money = item[2]
tmp_model_stat_food.updated_time = getCurrentDate()
'''
为了测试效果模拟数据
'''
tmp_model_stat_food.total_count = random.randint(50, 100)
tmp_model_stat_food.total_pay_money = random.randint(1000, 1010)
db.session.add( tmp_model_stat_food )
db.session.commit()
return
'''
site统计
'''
def statSite(self,params):
act = params['act']
date = params['date']
date_from = params['date_from']
date_to = params['date_to']
app.logger.info( "act:{0},from:{1},to:{2}".format( act,date_from,date_to ) )
stat_pay = db.session.query(func.sum(PayOrder.total_price).label("total_pay_money")) \
.filter(PayOrder.status == 1) \
.filter(PayOrder.created_time >= date_from, PayOrder.created_time <= date_to).first()
stat_member_count = Member.query.count()
stat_new_member_count = Member.query.filter(Member.created_time >= date_from,
Member.created_time <= date_to).count()
stat_order_count = PayOrder.query.filter_by( status = 1 )\
.filter(PayOrder.created_time >= date_from, PayOrder.created_time <= date_to)\
.count()
stat_share_count = WxShareHistory.query.filter(WxShareHistory.created_time >= date_from
, WxShareHistory.created_time <= date_to).count()
tmp_stat_site = StatDailySite.query.filter_by(date=date).first()
if tmp_stat_site:
tmp_model_stat_site = tmp_stat_site
else:
tmp_model_stat_site = StatDailySite()
tmp_model_stat_site.date = date
tmp_model_stat_site.created_time = getCurrentDate()
tmp_model_stat_site.total_pay_money = stat_pay[ 0 ] if stat_pay[ 0 ] else 0.00
tmp_model_stat_site.total_new_member_count = stat_new_member_count
tmp_model_stat_site.total_member_count = stat_member_count
tmp_model_stat_site.total_order_count = stat_order_count
tmp_model_stat_site.total_shared_count = stat_share_count
tmp_model_stat_site.updated_time = getCurrentDate()
'''
为了测试效果模拟数据
'''
tmp_model_stat_site.total_pay_money = random.randint(1000, 1010)
tmp_model_stat_site.total_new_member_count = random.randint(50, 100)
tmp_model_stat_site.total_member_count += tmp_model_stat_site.total_new_member_count
tmp_model_stat_site.total_order_count = random.randint(900, 1000)
tmp_model_stat_site.total_shared_count = random.randint(1000, 2000)
db.session.add(tmp_model_stat_site)
db.session.commit()
def test(self):
import datetime
from common.libs.Helper import getFormatDate
now = datetime.datetime.now()
for i in reversed( range( 1,30 ) ):
date_before = now + datetime.timedelta( days = -i )
date = getFormatDate( date = date_before,format = "%Y-%m-%d" )
tmp_params = {
'act': 'test',
'date': date,
'date_from': date + " 00:00:00",
'date_to': date + " 23:59:59"
}
self.testFood( date )
self.statFood( tmp_params )
self.statMember( tmp_params )
self.statSite( tmp_params )
def testFood(self,date):
from common.models.food.Food import Food
list = Food.query.all()
if list:
for item in list:
model = FoodSaleChangeLog()
model.food_id = item.id
model.quantity = random.randint( 1,10 )
model.price = model.quantity * item.price
model.member_id = 1
model.created_time = date + " " + getFormatDate( format = "%H:%M:%S")
db.session.add( model )
db.session.commit()