6
0
Fork 0
jiqu-library-server/app/Admin/Controllers/OfflineOrderItemStatisticCo...

184 lines
8.6 KiB
PHP

<?php
namespace App\Admin\Controllers;
use App\Enums\OfflineOrderStatus;
use App\Models\OfflineOrder;
use App\Models\OfflineOrderItem;
use App\Models\OfflineProductCategory;
use App\Models\Store\Store;
use App\Models\User;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Illuminate\Support\Facades\DB;
use Dcat\Admin\Layout\Content;
class OfflineOrderItemStatisticController extends AdminController
{
protected function grid()
{
$datetime = request('datetime');
// 开始时间
$start = $datetime['start'] ?? '';
// 结束时间
$end = $datetime['end'] ?? '';
$ordersTable = (new OfflineOrder())->getTable();
$orderItemsTable = (new OfflineOrderItem())->getTable();
$stores = Store::pluck('title', 'id');
$productCategories = OfflineProductCategory::pluck('name', 'id');
$builder = OfflineOrderItem::select([
"{$orderItemsTable}.product_category_id",
"{$ordersTable}.store_id",
DB::raw("SUM({$orderItemsTable}.points_deduction_amount) AS points_deduction_amount"),
DB::raw("SUM({$orderItemsTable}.payment_amount) AS payment_amount"),
DB::raw("SUM({$orderItemsTable}.products_total_amount) AS products_total_amount"),
DB::raw("SUM({$orderItemsTable}.discount_reduction_amount) AS discount_reduction_amount"),
DB::raw("SUM({$orderItemsTable}.coupon_discount_amount) AS coupon_discount_amount"),
])
->join("{$ordersTable}", "{$orderItemsTable}.order_id", '=', "{$ordersTable}.id")
->where("{$ordersTable}.status", OfflineOrderStatus::Paid)
->when($start || $end, function ($builder) use ($start, $end, $ordersTable) {
if ($start && $end) {
return $builder->whereBetween("{$ordersTable}.payment_time", [$start, $end]);
}
return $builder->when($start, fn ($builder) => $builder->where("{$ordersTable}.payment_time", '>=', $start))
->when($end, fn ($builder) => $builder->where("{$ordersTable}.payment_time", '<=', $end));
})
->groupBy(["{$orderItemsTable}.product_category_id", "{$ordersTable}.store_id"]);
$grid = Grid::make($builder);
$grid->filter(function (Grid\Filter $filter) use ($stores, $productCategories) {
$filter->panel();
$filter->equal('store_id')->select($stores)->width(4);
$filter->equal('product_category_id')->select($productCategories)->width(4);
$filter->between('datetime')->datetime()->ignore()->width(4);
});
$grid->column('product_category_id')->display(fn ($v) => $productCategories->get($v) ?: '其它');
$grid->column('store_id')->display(fn ($v) => $stores->get($v) ?: '其它');
$grid->column('products_total_amount')->display(fn ($v) => bcdiv($v, 100, 2));
$grid->column('discount_reduction_amount')->display(fn ($v) => bcdiv($v, 100, 2));
$grid->column('coupon_discount_amount')->display(fn ($v) => bcdiv($v, 100, 2));
$grid->column('points_deduction_amount')->display(fn ($v) => bcdiv($v, 100, 2));
$grid->column('payment_amount')->display(fn ($v) => bcdiv($v, 100, 2));
$grid->disablePagination();
$grid->disableFilterButton();
$grid->disableActions();
$grid->footer(function ($collection) use ($grid, $builder) {
$query = $builder;
// 拿到表格筛选 where 条件数组进行遍历
$grid->model()->getQueries()->unique()->each(function ($value) use (&$query) {
if (in_array($value['method'], ['paginate', 'get', 'orderBy', 'orderByDesc'], true)) {
return;
}
$query = call_user_func_array([$query, $value['method']], $value['arguments'] ?? []);
});
// 查出统计数据
$data = $builder->get();
// $onlineOrdersCount = $results['orders_count'] ?? 0;
$totalAmount = bcdiv($data->sum("products_total_amount"), 100, 2);
$discountAmount = bcdiv($data->sum("discount_reduction_amount"), 100, 2);
$couponAmount = bcdiv($data->sum("coupon_discount_amount"), 100, 2);
$pointsDeductionAmount = bcdiv($data->sum("points_deduction_amount"), 100, 2);
$paymentAmount = bcdiv($data->sum("payment_amount"), 100, 2);
return <<<HTML
<table class="table table-bordered">
<tbody>
<tr>
<td>单统计</td>
<td>订单总额: $totalAmount</td>
<td>折扣优惠: $discountAmount</td>
<td>优惠券抵扣: $couponAmount</td>
<td>积分抵扣: $pointsDeductionAmount</td>
<td>实付总额: $paymentAmount</td>
<tr>
</tbody>
</table>
HTML;
});
return $grid;
}
/**
* 员工业绩统计
*/
public function staff(Content $content)
{
$table = (new OfflineOrder())->getTable();
$stores = Store::query()->effective()->sort()->pluck('title', 'id');
$builder = OfflineOrder::query()->with(['staff', 'store'])->select([
"{$table}.staff_id",
"{$table}.store_id",
DB::raw("count(1) as count"),
DB::raw("sum({$table}.products_total_amount) as products_total_amount"),
DB::raw("sum({$table}.discount_reduction_amount) as discount_reduction_amount"),
DB::raw("sum({$table}.points_deduction_amount) as points_deduction_amount"),
DB::raw("sum({$table}.coupon_discount_amount) as coupon_discount_amount"),
DB::raw("sum({$table}.payment_amount) as payment_amount"),
])->where('status', OfflineOrderStatus::Paid)->groupBy(["staff_id", "store_id"]);
$grid = Grid::make($builder);
$grid->filter(function (Grid\Filter $filter) use ($stores) {
$filter->panel();
$filter->equal('store_id')->select($stores)->width(4);
$filter->between('created_at', "下单时间")->datetime()->width(4);
});
$grid->column("staff_id", "员工")->display(fn () => $this->staff?->phone);
$grid->column("store_id", "门店")->display(fn () => $this->store?->title);
$grid->column("count", "订单数");
$grid->column('products_total_amount', "订单总额")->display(fn ($v) => bcdiv($v, 100, 2));
$grid->column('discount_reduction_amount', "折扣优惠")->display(fn ($v) => bcdiv($v, 100, 2));
$grid->column('points_deduction_amount', "积分抵扣")->display(fn ($v) => bcdiv($v, 100, 2));
$grid->column('coupon_discount_amount', "优惠券抵扣")->display(fn ($v) => bcdiv($v, 100, 2));
$grid->column('payment_amount', "实付金额")->display(fn ($v) => bcdiv($v, 100, 2));
$grid->disablePagination();
$grid->disableFilterButton();
$grid->disableActions();
$grid->export()
->titles([
'staff_id' => '员工',
'store_id' => '门店',
'count' => '订单数',
'products_total_amount' => '订单总额',
'discount_reduction_amount' => '折扣优惠',
'points_deduction_amount' => '积分抵扣',
'coupon_discount_amount' => '优惠券抵扣',
'payment_amount' => '实付金额',
])->rows(function ($rows) {
foreach ($rows as $index => &$row) {
$row['staff_id'] = data_get($row, 'staff.phone');
$row['store_id'] = data_get($row, 'store.title');
$row['count'] = data_get($row, 'count');
$row['products_total_amount'] = bcdiv(data_get($row, 'products_total_amount', 0), 100, 2);
$row['discount_reduction_amount'] = bcdiv(data_get($row, 'discount_reduction_amount', 0), 100, 2);
$row['points_deduction_amount'] = bcdiv(data_get($row, 'points_deduction_amount', 0), 100, 2);
$row['coupon_discount_amount'] = bcdiv(data_get($row, 'coupon_discount_amount', 0), 100, 2);
$row['payment_amount'] = bcdiv(data_get($row, 'payment_amount', 0), 100, 2);
}
return $rows;
})->filename("员工业绩统计");
return $content
->translation($this->translation())
->title("员工业绩统计")
->description($this->description()['index'] ?? trans('admin.list'))
->body($grid);
}
}