python Flask与微信小程序 统计管理

common/models/stat/StatDailyMember.py


DROP TABLE IF EXISTS `stat_daily_member`;CREATE TABLE `stat_daily_member` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`date` date NOT NULL COMMENT '日期',`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员id',`total_shared_count` int(11) NOT NULL DEFAULT '0' COMMENT '当日分享总次数',`total_pay_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当日付款总金额',`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',PRIMARY KEY (`id`),KEY `idx_date_member_id` (`date`,`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员日统计';
flask-sqlacodegen 'mysql://root:root@127.0.0.1/food_db' --tables stat_daily_member --outfile "common/models/stat/StatDailyMember.py"  --flask

common/models/stat/StatDailySite.py

DROP TABLE IF EXISTS `stat_daily_site`;CREATE TABLE `stat_daily_site` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`date` date NOT NULL COMMENT '日期',`total_pay_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当日应收总金额',`total_member_count` int(11) NOT NULL COMMENT '会员总数',`total_new_member_count` int(11) NOT NULL COMMENT '当日新增会员数',`total_order_count` int(11) NOT NULL COMMENT '当日订单数',`total_shared_count` int(11) NOT NULL,`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',PRIMARY KEY (`id`),KEY `idx_date` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='全站日统计';
flask-sqlacodegen 'mysql://root:root@127.0.0.1/food_db' --tables stat_daily_site --outfile "common/models/stat/StatDailySite.py"  --flask

common/models/stat/StatDailyFood.py

DROP TABLE IF EXISTS `stat_daily_food`;CREATE TABLE `stat_daily_food` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`date` date NOT NULL,`food_id` int(11) NOT NULL DEFAULT '0' COMMENT '菜品id',`total_count` int(11) NOT NULL DEFAULT '0' COMMENT '售卖总数量',`total_pay_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总售卖金额',`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',PRIMARY KEY (`id`),KEY `date_food_id` (`date`,`food_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='书籍售卖日统计';
flask-sqlacodegen 'mysql://root:root@127.0.0.1/food_db' --tables stat_daily_food --outfile "common/models/stat/StatDailyFood.py"  --flask

jobs/tasks/stat/daily.py

# -*- 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):passdef 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:returndate_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" )returnfor 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_memberelse:tmp_model_stat_member = StatDailyMember()tmp_model_stat_member.date = datetmp_model_stat_member.member_id = member_info.idtmp_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_counttmp_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")returnfor 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_foodelse:tmp_model_stat_food = StatDailyFood()tmp_model_stat_food.date = datetmp_model_stat_food.food_id = tmp_food_idtmp_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_siteelse:tmp_model_stat_site = StatDailySite()tmp_model_stat_site.date = datetmp_model_stat_site.created_time = getCurrentDate()tmp_model_stat_site.total_pay_money = stat_pay[ 0 ] if stat_pay[ 0 ] else 0.00tmp_model_stat_site.total_new_member_count = stat_new_member_counttmp_model_stat_site.total_member_count = stat_member_counttmp_model_stat_site.total_order_count = stat_order_counttmp_model_stat_site.total_shared_count = stat_share_counttmp_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_counttmp_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 datetimefrom common.libs.Helper import getFormatDatenow = 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 Foodlist = Food.query.all()if list:for item in list:model =  FoodSaleChangeLog()model.food_id =  item.idmodel.quantity =  random.randint( 1,10 )model.price = model.quantity * item.pricemodel.member_id = 1model.created_time = date + " " + getFormatDate( format = "%H:%M:%S")db.session.add( model )db.session.commit()

statMember(self, params)

这段代码是一个函数statMember的实现,它接受一个参数params,其中包含了actdatedate_fromdate_to等信息。函数的主要功能是统计会员信息。

首先,函数会根据传入的参数打印出actdate_fromdate_to的值。然后,它会查询数据库中的所有会员信息,并进行遍历。

在遍历过程中,函数会根据日期和会员ID查询对应的每日会员统计信息StatDailyMember。如果找到了对应的记录,则将其赋值给tmp_model_stat_member;否则,创建一个新的StatDailyMember对象,并设置其日期、会员ID和创建时间。

接下来,函数会使用数据库查询语句计算该会员的总支付金额,并将结果保存在total_pay_money字段中。

最后,函数会返回统计结果。

statSite(self,params)

这段代码是一个函数statSite的定义,它接受一个参数params。函数内部首先从params中获取actdatedate_fromdate_to的值,并将它们打印出来。

接下来,函数使用SQLAlchemy进行数据库查询,统计了以下几个指标:

  1. stat_pay:计算了满足条件的支付订单的总金额。
  2. stat_member_count:统计了会员的总数量。
  3. stat_new_member_count:统计了在指定日期范围内新注册的会员数量。
  4. stat_order_count:统计了在指定日期范围内已支付的订单数量。
  5. stat_share_count:统计了在指定日期范围内的分享历史数量。

请注意,这段代码中使用了一些数据库模型(如PayOrderMemberWxShareHistory),以及一些SQLAlchemy的查询方法(如filter()count()first())来实现数据统计功能。

.count()

count()是一个用于统计字符串、列表、元组等可迭代对象中某个元素出现的次数的方法。它可以用于字符串、列表、元组等数据类型。

在字符串中,.count()方法可以统计指定字符或子字符串在字符串中出现的次数。例如:

python

string = "Hello, World!"
count = string.count("o")
print(count)  # 输出结果为2

在列表和元组中,.count()方法可以统计指定元素在列表或元组中出现的次数。例如:

python

my_list = [1, 2, 3, 4, 2, 2]
count = my_list.count(2)
print(count)  # 输出结果为3

.count()方法返回的是指定元素在可迭代对象中出现的次数。

test(self)

(imooc) [root@localhost order]# python manager.py runjob -m stat/daily -a test

加载30天的数据到数据库

这段代码是一个名为test的函数,它包含了一些操作。让我逐步解释一下:

  1. 首先,代码导入了datetime模块和getFormatDate函数。
  2. 然后,创建了一个当前时间的变量now,使用datetime.datetime.now()获取当前时间。
  3. 接下来,使用一个反向的循环,从1到29,创建一个变量date_before,表示当前时间减去i天的日期。
  4. 使用getFormatDate函数将date_before格式化为"%Y-%m-%d"的日期格式,并赋值给变量date
  5. 创建一个临时参数字典tmp_params,包含了一些键值对。
  6. 调用了self.testFood(date)函数,传入了date作为参数。
  7. 调用了self.statFood(tmp_params)函数,传入了tmp_params作为参数。
  8. 调用了self.statMember(tmp_params)函数,传入了tmp_params作为参数。
  9. 调用了self.statSite(tmp_params)函数,传入了tmp_params作为参数。

这段代码的作用是进行一系列的测试、统计操作,根据不同的日期进行相应的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/682854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

例39:使用List控件

建立一个EXE工程&#xff0c;在窗体上放一个文本框&#xff0c;一个列表框和三个按钮输入如下的代码&#xff1a; Sub Form1_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)List1.AddItem(Text1.Text)End SubSub Form1_Command2_BN_Clicked(hWndForm As hWnd, h…

【python之美】减少人工成本之批量拿取文件名保存_4

获取文件名保存 准备工作: 上代码: import ospath "C:\\Users\\Administrator\\Desktop\\text\\" file_names os.listdir(path) print(file_names)i 1 for file_name in file_names:name file_name.split(_)[0]print(name)new_name name "_修改后第&qu…

【zabbix】(四)-钉钉告警企业微信配置

前提条件&#xff1a; 已经安装了Python3环境&#xff08;脚本需要requests模块&#xff09;。Centos7.x自带Python2&#xff08;不含requests模块&#xff09; 钉钉告警配置 一 安装Python3 参考该优秀文档部署 查看Python的模块&#xff1a;pip list / pip3 list 报错 …

一周学会Django5 Python Web开发-项目配置settings.py文件-基本配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计17条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Linux第54步_根文件系统第1步_编译busybox并安装_然后添加“根文件系统”的库

学习编译busybox&#xff0c;并安装&#xff0c;然后添加“根文件系统”的库。有人说busybox构建根文件系统&#xff0c;只适合学习&#xff0c;不适合做项目。 1、了解ubuntu的根文件系统 根文件系统的目录名为“/”&#xff0c;就是一个斜杠。 1)、输入“cd /回车”&…

Python爬虫之自动化测试Selenium#7

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx 前言 在前一章中&#xff0c;我们了解了 Ajax 的分析和抓取方式&#xff0c;这其实也是 JavaScript 动态渲染的页面的一种情形&#xff0c;通过直接分析 Ajax&#xff0c;我们仍然可以借助 requests 或 urllib 来实现数据爬取…

【数据分享】2020~2050年青藏高原未来LAI变化情景数据集

各位同学们好&#xff0c;今天和大伙儿分享的是2020~2050年青藏高原未来LAI变化情景数据集。如果大家有下载处理数据等方面的问题&#xff0c;可以添加我的微信交流~ 贾坤, 赵琳琳, 夏沐. (2023). 青藏高原未来LAI变化情景数据集&#xff08;2020-2050&#xff09;. 国家青藏高…

app移动应用开发

1.案例7.安安的通讯助手 目标 组件设计 素材准备 所有组件的说明及属性设置&#xff08;1&#xff09; 所有组件的说明及属性设置&#xff08;2&#xff09; 所有组件的说明及属性设置&#xff08;3&#xff09;布局小技巧 行为逻辑设计 自动回复短信 短信收发器 组件 记录已收…

LeetCode72. Edit Distance——动态规划

文章目录 一、题目二、题解 一、题目 Given two strings word1 and word2, return the minimum number of operations required to convert word1 to word2. You have the following three operations permitted on a word: Insert a character Delete a character Replace …

编辑器的新选择(基本不用配置)

Cline 不用看网上那些教程Cline几乎不用配置。 点击设置直接选择Chinese, C直接在选择就行了。 Cline是一个很好的编辑器&#xff0c;有很多懒人必备的功能。 Lightly 这是一个根本不用配置的C编辑器。 旁边有目录&#xff0c;而且配色也很好&#xff0c;语言标准可以自己…

【前端设计】炫酷导航栏

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

c语言操作符(上

目录 ​编辑 原码、反码、补码 1、正数 2、负数 3、二进制计算1-1 移位操作符 1、<<左移操作符 2、>>右移操作符 位操作符&、|、^、~ 1、&按位与 2、|按位或 3、^按位异或 特点 4、~按位取反 原码、反码、补码 1、正数 原码 反码 补码相同…

Rust入门4——基本编程概念

文章目录 1. 变量与可变性2. 数据类型&#xff1a;标量类型3. 数据类型&#xff1a;复合类型4. 函数和注释 1. 变量与可变性 声明变量使用let关键字 默认情况下&#xff0c;变量是不可变的 声明变量时&#xff0c;在let后加上mut关键字&#xff0c;就可以使变量可变 常量在绑…

单片机学习笔记---DS18B20温度读取

目录 OneWire.c 模拟初始化的时序 模拟发送一位的时序 模拟接收一位的时序 模拟发送一个字节的时序 模拟接收一个字节的时序 OneWire.h DS18B20.c DS18B20数据帧 模拟温度变换的数据帧 模拟温度读取的数据帧 DS18B20.h main.c 上一篇讲了DS18B20温度传感器的工作原…

blender在几何节点中的这些变换中的旋转,其实可以是两种旋转顺序

看似xyz的旋转角度&#xff0c;但如果按照欧拉角来谈它的旋转&#xff0c;就大有学问了。 我们知道&#xff0c;在blender中有局部旋转和全局旋转。但其实这两者在某种情况下可以等价。 那就是&#xff0c;如果参照全局坐标系&#xff0c;按xyz的顺序进行欧拉旋转&#xff0c;…

Mac终端远程访问Linux

以ubuntu为例 一、查看ubuntu的ip地址 1、下载net-tools localhostubuntu-server:~$ sudo apt install net-tools 2、查看ip地址 localhostubuntu-server:~$ ifconfig ubuntu需要下载net-tools才能使用ifconfig localhostubuntu-server:~$ sudo apt install net-tools 二…

判断能否形成等差数列

1502. 判断能否形成等差数列 给你一个数字数组 arr 。 如果一个数列中&#xff0c;任意相邻两项的差总等于同一个常数&#xff0c;那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列&#xff0c;请返回 true &#xff1b;否则&#xff0c;返回 false 。 示例…

Hive调优——count distinct替换

离线数仓开发过程中经常会对数据去重后聚合统计&#xff0c;而对于大数据量来说&#xff0c;count(distinct ) 操作消耗资源且查询性能很慢&#xff0c;以下是调优的方式。 解决方案一&#xff1a;group by 替代 原sql 如下&#xff1a; #7日、14日的app点击的用户数&#x…

[AIGC] Kafka 的 Rebalance 机制:保证分区的可靠性和高可用性

在分布式系统中&#xff0c;Kafka 是一种流处理平台&#xff0c;具有高吞吐量、低延迟和可扩展性等特点。在 Kafka 中&#xff0c;消费者组是一组消费者的集合&#xff0c;它们共同消费一个 topic 的所有分区。在消费者组中&#xff0c;每个分区只能由一个消费者消费&#xff0…

MySQL 基础知识(一)之数据库和 SQL 概述

目录 1 数据库相关概念 2 数据库的结构 ​3 SQL 概要 4 SQL 的基本书写规则 1 数据库相关概念 数据库是将大量的数据保存起来&#xff0c;通过计算机加工而成的可以进行高效访问的数据集合数据库管理系统&#xff08;DBMS&#xff09;是用来管理数据库的计算机系统&#xf…