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 << 单统计 订单总额: $totalAmount 折扣优惠: $discountAmount 优惠券抵扣: $couponAmount 积分抵扣: $pointsDeductionAmount 实付总额: $paymentAmount 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); } }