radiatecode/dastats

仪表板或报告的统计信息

v1.2.1 2022-04-19 10:36 UTC

This package is auto-updated.

Last update: 2024-09-19 15:45:51 UTC


README

Stats

此包是记录和查看仪表板或报告统计信息的轻量级解决方案。有时我们需要在仪表板或报告中添加KPI / 指标 / 统计数据,创建这些统计数据需要进行大量的计算、查询等。但是,此包可以帮助您以更优雅的方式生成统计数据,这些统计数据存储在单个数据库表中,因此检索将更快或更简单。

示例

许多仪表板或报告都有统计小部件,例如总客户数、总用户数、总待处理订单、总销售额等。对于这些统计小部件,我们应用了跨表、行的查询以及数学方程来获得单一的统一数值。对于小型数据库,这种方法是可以的,但对于大型数据库,计算可能会损害性能或增加复杂性。那么,如果在CRUD操作期间进行统计计算会怎样呢。

Stats

示例 1

总用户计数

每次添加新用户时增加用户,每次删除用户时减少用户。

use RadiateCode\DaStats\Facades\Stats;
.......

public function storeUser(Request $request){
    // stores statements
    ............

    Stats::title('User count')->key('total-user')->increase();
}

public function deleteUser($id){
    // delete statements
    ............

    Stats::key('total-user')->decrease();
}

示例 2

总待处理订单

每次添加新待处理订单时增加或计数总待处理订单,每次订单成功交付时减少总待处理订单。

use RadiateCode\DaStats\Facades\Stats;
.......

public function orderStore(Request $request){
    // pending order placement statements
    ............

    Stats::title('Pending order count')->key('total-pending-order')->increase();
}

public function orderDeliver(Request $request){
    // order delivery statements
    ............
    
    Stats::key('total-pending-order')->decrease();
} 

示例 3

产品库存

每次购买新产品时增加产品库存,

use RadiateCode\DaStats\Facades\Stats;
.......

public function purchaseStore(Request $request){
    // other statements
    ............

    foreach($purchaseProducts as $product){ // multiple products
        // purchase products save statements
        ..............
        
        // increase stock for a product
        Stats::title('Live stock')->key($product->id)->increase($product->quantity);
    }
}

更新产品库存:有时我们需要更新采购产品数量,例如在同一视图中添加或减去数量,在这种情况下,我们的产品库存也需要相应反映。

use RadiateCode\DaStats\Facades\Stats;
.......

public function purchaseUpdate(Request $request){
    // other statement
    ............

    foreach($purchaseProducts as $product){
        // purchase products update statements
        ..............
        ..............


        //live stock
        $variation = (int) $newQty - $oldQty;

        Stats::when($variation > 0,function ($stats) use ($product,$variation){
            $stats->title('Live stock')->key($product->id)->increase($variation);
        });

        Stats::when($variation < 0,function ($stats) use ($product,$variation){
            $stats->title('Live stock')->key($product->id)->decrease(abs($variation));
        });
    }
}

删除采购产品时减少产品库存。

use RadiateCode\DaStats\Facades\Stats;
.......

public function productDelete($id){
    // other statement
    ............

    // find product
    $purchaseProduct = PurchaseProduct::findOrFail($id);

    // decrese value for this product
    Stats::title('Live stock')->key($purchaseProduct->id)->decrease($purchaseProduct->quantity);

    $purchaseProduct->delete(); // purchase product delete
}

获取统计数据

上述示例已展示了我们如何通过在数据CRUD操作中放置increase()、decrease()来创建统计。

现在让我们获取或查看我们的统计数据。

$stats = Stats::key('total-pending-order')->find();

$stats = Stats::key('total-user')->find();

$stock = Stats::title('Live stock')->get();

$stats = Stats::inKeys('total-pending-order','total-user')->get();

// get stock by product ids
$stocks = Stats::inKeys(1,22,55,66)->get(); 

$stats = Stats::contains('pending')->get();

安装

您可以通过composer安装此包

composer require radiatecode/dastats

迁移统计表

php artisan dastats:table

php artisan migrate

您可以选择发布配置文件(可选)

php artisan vendor:publish --provider="RadiateCode\DaStats\StatsServiceProvider" --tag="dastats-config"

用法

统计数据增加

增加指定键和标题的统计数据。

Stats::title('Your Title')->key('your-key')->increase(); 

默认增加1,但您可以通过传递任何特定的数值。

在内部,increase()检查是否存在给定键和标题的统计数据,如果存在,则增加,如果不存在,则创建新记录。

统计数据减少

减少指定键的统计数据值。

Stats::key('your-key')->decrease();

Stats::title('Your Title')->key('your-key')->decrease();

默认减少1(默认值),但您可以减少任何特定的值。

在内部,decrease()检查统计数据的存在性,如果找到,则减少,否则返回null。在减少过程中,如果减少到零,则将从存储中删除统计数据记录。

统计数据替换

在某些情况下,我们需要替换现有的统计数据值,在这些情况下可以使用replace()。

Stats::key('your-key')->replace($value);

Stats::title('Your Title')->key('your-key')->replace($value);

通过键获取统计数据

Stats::inKeys('key-1','key-2')->get();

分页

Stats::inKeys('key-1','key-2')->paginate(10);

查找单个统计数据

Stats::title('Title 1')->key('key-1')->find();

Stats::key('key-1')->find();

检查统计数据是否存在

Stats::title('Title 1')->key('key-1')->exists(); // return true/false

// based on existence do stats operation

Stats::title('Title')->key('key-1')->exists(
    function ($stats){ // if exists
        $stats->replace(300);
    },function ($stats){ // if not exists
        $stats->increase(25);
    }
);

通过包含部分键获取统计数据

Stats::contain('partOfkey')->get();

example:
// key name is `total-registered-user`
// we can get stats by the key part `registered`
Stats::contain('registered')->get();

删除统计数据

$stats = Stats::key('key-1')->remove();

Stats::inKeys('key-1','key-2','key-3')->remove();

连接统计数据

将统计数据表与其他数据库表连接

joinWith()

joinWith用于将数据库表与统计数据表连接

Stats::joinWith('products', 'id') // joining products table
    ->title('inventory')
    ->get(['products.product_name', 'products.product_unit']);

join()

像常规Laravel db join一样连接任意数量的表

Stats::joinWith('products', 'id') // joining products table
    ->join('categories','categories.id','=','products.category_id') // join categories table with products
    ->join('units','units.id','=','products.unit_id') // join units table with products
    ->title('inventory')
    ->get(['products.product_name', 'products.product_unit','categories.category_name','units.unit_name']);

注意:get()方法接受一个数组作为参数,其中它执行数据库'select'语句

隔离统计数据

隔离功能对于SaaS应用很有用,某些统计数据可以存储为个人用户、组织或租户。

Stats::isolate('Tenant',101)->title('Total Order')->key('order-count')->increment();

Stats::isolate('Tenant',101)->key('order-count')->find();

Stats::isolate('User',202)->title('Complete Project')->key('project-completion')->increment();

Stats::isolate('User',202)->key('project-completion')->find();

条件操作

Stats::when($some_condition,function($stats){
    return $stats->title('Title 1')->key('key-1')->increase(8000);
});

Stats::title('Title 1')->key('key-1')
->when($some_condition,
    function($stats){ // when condition true
        return $stats->decrease(2500);
    },function(){ // when condition false
        return $stats->increase(500); 
    }
);

Stats::when($has_tenant,function($stats) use ($tenantId){
    return $stats->isolate('Tenant', $tenantId);
})->all();

多次增加、减少或替换

对于多次增加或减少,我们可以使用 doMany()

use RadiateCode\DaStats\Enum\StatsAction;
...........


// data format
$data =  [
    ['key' => 'key-1','value' = 40],
    ['key' => 'key-2','value' = 25],
    ['key' => 'key-3','value' = 35],
]

// action (ex: StatsAction::INCREASE, StatsAction::DECREASE, StatsAction::REPLACE)
$action = StatsAction::INCREASE

Stats::title('Live stock')->doMany($action,$data);

当需要隔离时

// data format
$data =  [
    ['key' => 'key-1','value' = 40],
    ['key' => 'key-2','value' = 25],
    ['key' => 'key-3','value' = 35],
]

Stats::isolate('Organisation',$organisaiton->id)->title('Live stock')->doMany(StatsAction::INCREASE,$data);

注意:数据格式应遵循示例。

因此,在示例3中,我们看到增加操作是在购买产品循环内使用的,但现在我们可以使用 doMany() 通过传递包含产品ID和数量的数组来执行多次增加。

Stats::title('Live stock')->doMany(
    StatsAction::INCREASE,
    [
        ['key' => 1,'value' = 500], // key => product id and value => quantity
        ['key' => 5,'value' = 152],
        ['key' => 35,'value' = 7569],
        ['key' => 7,'value' = 900],
        ['key' => 9,'value' = 25],
    ]
);

任务

有时我们需要将统计数据排队,以便在后台运行而不会延迟用户响应,因此在这种情况下,我们可以使用预定义的任务。

注意:请确保我们已经配置了 Laravel队列 并运行队列工作进程

单个统计数据任务

use RadiateCode\DaStats\Jobs\SingleStatsJob;
use RadiateCode\DaStats\Enum\StatsAction;
..........

// dispatch the job to increase a stats
dispatch(new SingleStatsJob(StatsAction::INCREASE,'Title','key',$value));

or

// dispatch the job to decrease a stats
dispatch(new SingleStatsJob(StatsAction::DECREASE,'Title','key',$value));

// dispatch the job to replace a stats
dispatch(new SingleStatsJob(StatsAction::REPLACE,'Title','key',$value));

多个统计数据任务

use RadiateCode\DaStats\Jobs\MultiStatsJob;
use RadiateCode\DaStats\Enum\StatsAction;
..........

$data = [ 
            ['key' => 1,'value' = 500],
            ['key' => 5,'value' = 152],
        ];

// dispatch the job to decrease multiple stats value
dispatch(new MultiStatsJob(StatsAction::DECREASE,'Title',$data));

// dispatch the job to increase multiple stats value
dispatch(new MultiStatsJob(StatsAction::INCREASE,'Title',$data));

当需要隔离时

use RadiateCode\DaStats\Jobs\MultiStatsJob;
use RadiateCode\DaStats\Enum\StatsAction;
..........

$data = [ 
            ['key' => 1,'value' = 500],
            ['key' => 5,'value' = 152],
        ];

$job = new MultiStatsJob(StatsAction::DECREASE,'Title',$data);

$job->withIsolation('Tenant',1001);

dispatch($job);

数据库表结构

Stats Table

可用方法

统计数据可以通过 Stats外观new Stats() 类调用

以下是一些可用方法

贡献

请参阅 CONTRIBUTING 以获取详细信息。

安全

如果您发现任何与安全相关的问题,请通过电子邮件 radiate126@gmail.com 而不是使用问题跟踪器。

致谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅 许可证文件