python学习
This commit is contained in:
3
jobs/bash_jobs
Normal file
3
jobs/bash_jobs
Normal file
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
export ops_config=production
|
||||
. /data/www/python3_vir/bin/activate
|
||||
57
jobs/launcher.py
Normal file
57
jobs/launcher.py
Normal 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
9
jobs/readme.md
Normal 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
26
jobs/tasks/pay/index.py
Normal 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
110
jobs/tasks/queue/index.py
Normal 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
215
jobs/tasks/stat/daily.py
Normal 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()
|
||||
Reference in New Issue
Block a user