Files
shop-platform/docs/common/stat.md

399 lines
23 KiB
Markdown
Raw 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.
# 统计信息
## 表结构设计
- lucky_stat_shop 店铺统计信息,按天统计
- lucky_stat_shop_hour 店铺统计信息,按小时统计
``` sql
数据源: local_shop_xcx30.5g
架构: shop_mallnew
表: lucky_stat_shop
-- auto-generated definition
create table lucky_stat_shop
(
id int(11) unsigned auto_increment
primary key,
site_id int default 0 not null comment '站点id',
year int default 0 not null comment '年',
month int default 0 not null comment '月',
day int default 0 not null comment '日',
day_time int default 0 not null comment '当日时间',
order_total decimal(10, 2) default 0.00 not null comment '订单金额',
shipping_total decimal(10, 2) default 0.00 not null comment '运费金额',
refund_total decimal(10, 2) default 0.00 not null comment '退款金额',
order_pay_count int default 0 not null comment '订单总数',
goods_pay_count int default 0 not null comment '订单商品总数',
shop_money decimal(10, 2) default 0.00 not null comment '店铺金额',
platform_money decimal(10, 2) default 0.00 not null comment '平台金额',
create_time int default 0 not null comment '创建时间',
modify_time int default 0 not null comment '修改时间',
collect_shop int default 0 not null comment '店铺收藏量',
collect_goods int default 0 not null comment '商品收藏量',
visit_count int default 0 not null comment '浏览量',
order_count int default 0 not null comment '订单量(总)',
goods_count int default 0 not null comment '订单商品量(总)',
add_goods_count int default 0 not null comment '添加商品数',
member_count int default 0 not null comment '会员统计',
order_member_count int default 0 not null comment '下单会员数',
order_refund_count int default 0 not null comment '退款订单数',
order_refund_grand_count decimal(10, 2) default 0.00 not null comment '退款金额',
order_refund_grand_total_money decimal(10, 2) default 0.00 not null comment '累计退款金额',
coupon_member_count int default 0 not null comment '领券会员数量',
member_level_count int default 0 not null comment '超级会员卡销售量',
member_level_total_money decimal(10, 2) default 0.00 not null comment '超级会员卡销售额',
member_level_grand_count int default 0 not null comment '累计超级会员卡销售量',
member_level_grand_total_money decimal(10, 2) default 0.00 not null comment '累计超级会员卡销售额',
member_recharge_count int default 0 not null comment '会员储值总订单量',
member_recharge_grand_count decimal(10, 2) default 0.00 not null comment '累计会员储值总量',
member_recharge_total_money decimal(10, 2) default 0.00 not null comment '会员充值总额',
member_recharge_grand_total_money decimal(10, 2) default 0.00 not null comment '累计会员充值总额',
member_recharge_member_count int default 0 not null comment '储值会员数',
member_giftcard_count int default 0 not null comment '礼品卡订单总量',
member_giftcard_grand_count int default 0 not null comment '累计礼品卡订单总量',
member_giftcard_total_money decimal(10, 2) default 0.00 not null comment '礼品卡订单总额',
h5_visit_count int default 0 not null comment 'h5访问量',
wechat_visit_count int default 0 not null comment 'wechat访问量',
weapp_visit_count int default 0 not null comment 'weapp访问量',
pc_visit_count int default 0 not null comment 'pc访问量',
expected_earnings_total_money decimal(10, 2) default 0.00 not null comment '预计收入',
expenditure_total_money decimal(10, 2) default 0.00 not null comment '总支出',
earnings_total_money decimal(10, 2) default 0.00 not null comment '总收入',
member_withdraw_count int default 0 not null comment '会员提现总量',
member_withdraw_total_money decimal(10, 2) default 0.00 not null comment '会员提现总额',
coupon_count int default 0 not null comment '领券数',
add_coupon_count int default 0 not null comment '新增优惠券',
order_pay_money decimal(10, 2) default 0.00 not null comment '订单实际支付',
add_fenxiao_member_count int default 0 not null comment '新增分销商',
fenxiao_order_total_money decimal(10, 2) default 0.00 not null comment '分销订单总额',
fenxiao_order_count int default 0 not null comment '分销订单总数',
goods_on_type_count int default 0 not null comment '在架商品数',
goods_visited_type_count int default 0 not null comment '被访问商品数(仅详情页浏览数)',
goods_order_type_count int default 0 not null comment '动销商品数',
goods_exposure_count int default 0 not null comment '商品曝光数',
goods_visit_count int default 0 not null comment '商品浏览量',
goods_visit_member_count int default 0 not null comment '商品访客数',
goods_cart_count int default 0 not null comment '加购件数',
goods_order_count decimal(12, 3) default 0.000 not null comment '下单件数',
order_create_money decimal(10, 2) default 0.00 not null comment '订单下单总额',
order_create_count int default 0 not null comment '订单下单量',
balance_deduction decimal(10, 2) unsigned default 0.00 not null comment '余额抵扣总额',
cashier_billing_count int default 0 not null comment '开单数量',
cashier_billing_money decimal(10, 2) default 0.00 not null comment '开单金额',
cashier_buycard_count int default 0 not null comment '办卡数量',
cashier_buycard_money decimal(10, 2) default 0.00 not null comment '办卡金额',
cashier_recharge_count int default 0 not null comment '收银台充值数量',
cashier_recharge_money decimal(10, 2) default 0.00 not null comment '收银台充值金额',
cashier_refund_count int default 0 not null comment '收银台退款数量',
cashier_refund_money decimal(10, 2) default 0.00 not null comment '收银台退款金额',
cashier_order_member_count int default 0 not null comment '收银台下单会员数',
cashier_balance_money decimal(10, 2) default 0.00 not null comment '收银台余额消费金额',
cashier_online_pay_money decimal(10, 2) default 0.00 not null comment '收银台线上金额',
cashier_online_refund_money decimal(10, 2) default 0.00 not null comment '收银台线上退款金额',
cashier_balance_deduction decimal(10, 2) default 0.00 not null comment '门店余额总计'
)
charset = utf8
row_format = DYNAMIC;
create index IDX_ns_stat_shop_day
on lucky_stat_shop (day);
create index IDX_ns_stat_shop_day_time
on lucky_stat_shop (day_time);
create index IDX_ns_stat_shop_month
on lucky_stat_shop (month);
create index IDX_ns_stat_shop_site_id
on lucky_stat_shop (site_id);
create index IDX_ns_stat_shop_year
on lucky_stat_shop (year);
数据源: local_shop_xcx30.5g
架构: shop_mallnew
表: lucky_stat_shop_hour
-- auto-generated definition
create table lucky_stat_shop_hour
(
id int(11) unsigned auto_increment
primary key,
site_id int default 0 not null comment '站点id',
year int default 0 not null comment '年',
month int default 0 not null comment '月',
day int default 0 not null comment '日',
hour int default 0 not null comment '时',
day_time int default 0 not null comment '当日时间',
order_total decimal(10, 2) default 0.00 not null comment '订单金额',
shipping_total decimal(10, 2) default 0.00 not null comment '运费金额',
refund_total decimal(10, 2) default 0.00 not null comment '退款金额',
order_pay_count int default 0 not null comment '订单总数',
goods_pay_count int default 0 not null comment '订单商品总数',
shop_money decimal(10, 2) default 0.00 not null comment '店铺金额',
platform_money decimal(10, 2) default 0.00 not null comment '平台金额',
create_time int default 0 not null comment '创建时间',
modify_time int default 0 not null comment '修改时间',
collect_shop int default 0 not null comment '店铺收藏量',
collect_goods int default 0 not null comment '商品收藏量',
visit_count int default 0 not null comment '浏览量',
order_count int default 0 not null comment '订单量(总)',
goods_count int default 0 not null comment '订单商品量(总)',
add_goods_count int default 0 not null comment '添加商品数',
member_count int default 0 not null comment '会员统计',
order_member_count int default 0 not null comment '下单会员数',
order_refund_count int default 0 not null comment '退款订单数',
order_refund_grand_count decimal(10, 2) default 0.00 not null comment '退款金额',
order_refund_grand_total_money decimal(10, 2) default 0.00 not null comment '累计退款金额',
coupon_member_count int default 0 not null comment '领券会员数量',
member_level_count int default 0 not null comment '超级会员卡销售量',
member_level_total_money decimal(10, 2) default 0.00 not null comment '超级会员卡销售额',
member_level_grand_count int default 0 not null comment '累计超级会员卡销售量',
member_level_grand_total_money decimal(10, 2) default 0.00 not null comment '累计超级会员卡销售额',
member_recharge_count int default 0 not null comment '会员储值总订单量',
member_recharge_grand_count decimal(10, 2) default 0.00 not null comment '累计会员储值总量',
member_recharge_total_money decimal(10, 2) default 0.00 not null comment '会员充值总额',
member_recharge_grand_total_money decimal(10, 2) default 0.00 not null comment '累计会员充值总额',
member_recharge_member_count int default 0 not null comment '储值会员数',
member_giftcard_count int default 0 not null comment '礼品卡订单总量',
member_giftcard_grand_count int default 0 not null comment '累计礼品卡订单总量',
member_giftcard_total_money decimal(10, 2) default 0.00 not null comment '礼品卡订单总额',
h5_visit_count int default 0 not null comment 'h5访问量',
wechat_visit_count int default 0 not null comment 'wechat访问量',
weapp_visit_count int default 0 not null comment 'weapp访问量',
pc_visit_count int default 0 not null comment 'pc访问量',
expected_earnings_total_money decimal(10, 2) default 0.00 not null comment '预计收入',
expenditure_total_money decimal(10, 2) default 0.00 not null comment '总支出',
earnings_total_money decimal(10, 2) default 0.00 not null comment '总收入',
member_withdraw_count int default 0 not null comment '会员提现总量',
member_withdraw_total_money decimal(10, 2) default 0.00 not null comment '会员提现总额',
coupon_count int default 0 not null comment '领券数',
add_coupon_count int default 0 not null comment '新增优惠券',
order_pay_money decimal(10, 2) default 0.00 not null comment '订单实际支付',
add_fenxiao_member_count int default 0 not null comment '新增分销商',
fenxiao_order_total_money decimal(10, 2) default 0.00 not null comment '分销订单总额',
fenxiao_order_count int default 0 not null comment '分销订单总数',
goods_on_type_count int default 0 not null comment '在架商品数',
goods_visited_type_count int default 0 not null comment '被访问商品数(仅详情页浏览数)',
goods_order_type_count int default 0 not null comment '动销商品数',
goods_exposure_count int default 0 not null comment '商品曝光数',
goods_visit_count int default 0 not null comment '商品浏览量',
goods_visit_member_count int default 0 not null comment '商品访客数',
goods_cart_count int default 0 not null comment '加购件数',
goods_order_count decimal(12, 3) default 0.000 not null comment '下单件数',
order_create_money decimal(10, 2) default 0.00 not null comment '订单下单总额',
order_create_count int default 0 not null comment '订单下单量',
balance_deduction decimal(10, 2) default 0.00 not null comment '余额抵扣总额',
cashier_billing_count int default 0 not null comment '开单数量',
cashier_billing_money decimal(10, 2) default 0.00 not null comment '开单金额',
cashier_buycard_count int default 0 not null comment '办卡数量',
cashier_buycard_money decimal(10, 2) default 0.00 not null comment '办卡金额',
cashier_recharge_count int default 0 not null comment '收银台充值数量',
cashier_recharge_money decimal(10, 2) default 0.00 not null comment '收银台充值金额',
cashier_refund_count int default 0 not null comment '收银台退款数量',
cashier_refund_money decimal(10, 2) default 0.00 not null comment '收银台退款金额',
cashier_order_member_count int default 0 not null comment '收银台下单会员数',
cashier_balance_money decimal(10, 2) default 0.00 not null comment '收银台余额消费金额',
cashier_online_pay_money decimal(10, 2) default 0.00 not null comment '收银台线上金额',
cashier_online_refund_money decimal(10, 2) default 0.00 not null comment '收银台线上退款金额',
cashier_balance_deduction decimal(10, 2) default 0.00 not null comment '门店余额总计'
)
charset = utf8
row_format = DYNAMIC;
create index IDX_ns_stat_shop_hour_day
on lucky_stat_shop_hour (day);
create index IDX_ns_stat_shop_hour_day_time
on lucky_stat_shop_hour (day_time);
create index IDX_ns_stat_shop_hour_hour
on lucky_stat_shop_hour (hour);
create index IDX_ns_stat_shop_hour_month
on lucky_stat_shop_hour (month);
create index IDX_ns_stat_shop_hour_site_id
on lucky_stat_shop_hour (site_id);
create index IDX_ns_stat_shop_hour_year
on lucky_stat_shop_hour (year);
```
## 数据关联
### 1. 数据的写入 addShopStat
与添加店铺统计数据有关的函数addShopStat 在三个文件中,都存在
- File1: `src\app\model\stat\StatShop.php`
- File2: `src\app\model\system\Stat.php`
实现细节该File1文件中的 `addShopStat` 函数,从自己函数 `getStatData` 获得整理后的数据,然后将数据传输给 File2 `src/app/model/stat/StatShop.php` 的 `addShopStat` 函数
```php
// src/app/model/stat/StatShop.php
public function addShopStat($data)
{
$carbon = Carbon::now();
$dir = __UPLOAD__.'/stat/stat_shop/';
if (!is_dir($dir) && !mkdir($dir, 0777, true) && !is_dir($dir)) {
return $this->error(sprintf('Directory "%s" was not created', $dir));
}
$filename = $dir.$carbon->year.'_'.$carbon->month.'_'.$carbon->day.'_'.$carbon->second.'_'.unique_random().'.json';
$stat_extend = new Stat($filename, 'stat_shop',$data['site_id']);
$stat_extend->handleData($data);//写入文件
//增加当天时统计
$this->addShopHourStat($data, $carbon);
return $this->success();
}
```
分析addShopStat是将统计记录写入到文件中为快速存储数据及留痕提供数据支持。
### 2. 数据的提取 cronShopStat 计划任务统计数据处理
文件src/app/model/stat/StatShop.php
`cronShopStat`,是将统计记录从文件中提取出来,然后写入到数据库中,为快速存储数据及留痕提供数据支持。
``` php
// src\app\model\stat\StatShop.php
/**
* 从stat_shop目录下读取所有文件将数据处理后写入数据表中
* 处理完每个文件后,删除文件
*/
public function cronShopStat()
{
$path = __UPLOAD__.'/stat/stat_shop';
if(!is_dir($path)) return;
$result = $this->scanFile($path);
if(empty($result)) return;
try {
$json_array = [];
foreach ($result as $key => $val){
$stat_extend = new Stat($path.'/'.$val, 'stat_shop');
$json_array[] = $stat_extend->load();
unlink($path.'/'.$val); // 处理完文件后,删除文件
}
$data_array = [];
foreach ($json_array as $json_k => $json_v){
$k = $json_v['year'].'_'.$json_v['month'].'_'.$json_v['day'];
if (isset($data_array[$k])){
foreach ($data_array[$k] as $data_k => $data_v){
if($data_k != 'site_id' && $data_k != 'year' && $data_k != 'month' && $data_k != 'day' && $data_k != 'day_time'){
if ($json_v[$data_k] > 0) {
$data_array[$k][$data_k] += $json_v[$data_k];
} else if ($json_v[$data_k] < 0) {
$data_array[$k][$data_k] -= abs($json_v[$data_k]);
}
}
}
}else{
$data_array[$k] = $json_v;
}
}
Log::write(time().'stat_shop_'.json_encode($data_array));
$system_stat = new \app\model\system\Stat();
foreach ($data_array as $json_k => $json_v){
$system_stat->addStatShopModel($json_v);
}
} catch (\Exception $e) {
}
}
```
1. 从函数的开头可以看出,该函数用于计划任务。
2. 这个函数将被 `src\app\event\stat\CronStatShop.php` 中的 handle() 方法调用.
3. 事件的绑定在 `src\app\event.php` 文件中定义。
```php
//店铺统计更新(按时)
'CronStatShopHour' => [
'app\event\stat\CronStatShopHour'
],
```
说明需要通过ThinkPHP的Event的手动触发或者自动触发来处理
方式1手动触发最常用
```php
// 通过 event()助手函数或 Event门面触发
// 在控制器、模型或任何地方触发事件
event('UserLogin', $user);
// 等价于
use think\facade\Event;
Event::trigger('UserLogin', $user);
```
方式2自动触发通过事件类
定义事件类并直接触发:
```php
// 定义事件类
namespace app\event;
class UserLogin
{
public function __construct(public $user) {}
}
// 触发事件
$event = new \app\event\UserLogin($user);
event($event);
```
### 3. 数据的展示调用
## 数据获取
数据对应的文件:`src\app\model\system\Stat.php`
1. 获取天统计表统计字段getStatField
2. 获取时统计表统计字段getStatHourField
3. 获取商品销量排行榜getGoodsSaleNumRankingList
## 应用场景
### 优惠券的统计
调用者:`src\addon\coupon\model\CouponStat.php`
被调用者:`src\app\model\system\Stat.php`
### 分销订单的统计
调用者:`src\addon\fenxiao\model\FenxiaoStat.php`
被调用者:`src\app\model\system\Stat.php`
### 虚拟商品的统计
调用者:`src\addon\virtualcard\model\VirtualGoods.php`
被调用者:`src\app\model\system\Stat.php`
### 商品收藏的统计
调用者:`src\app\model\goods\GoodsCollect.php`
被调用者:`src\app\model\system\Stat.php`
### 购物车的统计
调用者:`src\app\model\stat\GoodsCartStat.php`
被调用者:`src\app\model\system\Stat.php`