|
|
|
|
@ -428,12 +428,8 @@ class StatisticsController extends CommonController
|
|
|
|
|
|
|
|
|
|
public function huli(Request $request)
|
|
|
|
|
{
|
|
|
|
|
$projects = $this->_checkProjects();
|
|
|
|
|
if (!$projects->count()) {
|
|
|
|
|
return $this->error($this->noProjects);
|
|
|
|
|
}
|
|
|
|
|
$firstProject = $projects->first();
|
|
|
|
|
$defaultProjectsId = $firstProject ? $firstProject->id : '';
|
|
|
|
|
$projects = (new StatisticsController())->_checkProjects();
|
|
|
|
|
$defaultProjectsId = ($projects[0]->id) ?? '';
|
|
|
|
|
$project_id = $request->get('project_id', $defaultProjectsId);
|
|
|
|
|
$month = request()->month ?? date("Y-m");
|
|
|
|
|
|
|
|
|
|
@ -454,9 +450,9 @@ class StatisticsController extends CommonController
|
|
|
|
|
$buildingId = [];
|
|
|
|
|
if ($hushizhang) {
|
|
|
|
|
$user = auth()->user();
|
|
|
|
|
$areaId = AdminAreaLink::where(function ($query) use ($project_id) {
|
|
|
|
|
$areaId = AdminAreaLink::where(function ($qeury) use ($project_id) {
|
|
|
|
|
if ($project_id) {
|
|
|
|
|
$query->where('project_id', $project_id);
|
|
|
|
|
$qeury->where('project_id', $project_id);
|
|
|
|
|
}
|
|
|
|
|
})->where('admin_id', $user->id)->pluck('area_id');
|
|
|
|
|
} elseif ($yuanfang) {
|
|
|
|
|
@ -478,20 +474,16 @@ class StatisticsController extends CommonController
|
|
|
|
|
$data->appends($request->all())->render();
|
|
|
|
|
|
|
|
|
|
$product = Product::where('project_id', $project_id)->first();
|
|
|
|
|
if (!$product) {
|
|
|
|
|
return $this->error("该项目下没有找到产品");
|
|
|
|
|
}
|
|
|
|
|
$productItem = ProductItems::where('product_id', $product->id)->get();
|
|
|
|
|
$factor = FactorItems::where('factor_id', $product->statistic_factor_id)->get();
|
|
|
|
|
$sumOrderTotal = 0;
|
|
|
|
|
foreach ($data as $item) {
|
|
|
|
|
// 获取所有床位id
|
|
|
|
|
$bedIds = Bed::where('area_id', $item->id)->pluck('id');
|
|
|
|
|
// 总和 - 使用DATE_FORMAT精确匹配月份
|
|
|
|
|
// 总和
|
|
|
|
|
$item->order_total = OrderItems::whereIn('product_item_id', $productItem->pluck('id'))
|
|
|
|
|
->whereIn("bed_id", $bedIds)
|
|
|
|
|
->whereNotNull('paid_at')
|
|
|
|
|
->whereRaw("DATE_FORMAT(`paid_at`,'%Y-%m') = '{$month}'")
|
|
|
|
|
->where('paid_at', 'like', '%' . $month . '%')
|
|
|
|
|
->sum('total');
|
|
|
|
|
$sumOrderTotal += $item->order_total;
|
|
|
|
|
// 子项
|
|
|
|
|
@ -499,15 +491,12 @@ class StatisticsController extends CommonController
|
|
|
|
|
}
|
|
|
|
|
// 获取所有列
|
|
|
|
|
$lie = [];
|
|
|
|
|
if ($data->total() > 0) {
|
|
|
|
|
$firstDataItem = $data->items()[0] ?? null;
|
|
|
|
|
if ($firstDataItem && isset($firstDataItem->lies)) {
|
|
|
|
|
$lie = array_column($firstDataItem->lies, 'name');
|
|
|
|
|
}
|
|
|
|
|
if (isset($data[0]->lies)) {
|
|
|
|
|
$lie = array_column($data[0]->lies, 'name');
|
|
|
|
|
}
|
|
|
|
|
$months = $this->_getMonths();
|
|
|
|
|
|
|
|
|
|
return view($this->bladePath . ".huli", compact("sumOrderTotal", "data", "month", "lie", "projects", "project_id", "months"));
|
|
|
|
|
return view($this->bladePath . ".huli", compact("sumOrderTotal", "data", "month", "lie", "projects", "project_id"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -516,23 +505,38 @@ class StatisticsController extends CommonController
|
|
|
|
|
public function getLies($bedIds, $productItem, $factor, $month)
|
|
|
|
|
{
|
|
|
|
|
$list = [];
|
|
|
|
|
|
|
|
|
|
// 修复:如果床位ID为空,直接返回空数组,避免 whereIn 空数组导致的SQL错误
|
|
|
|
|
if (empty($bedIds)) {
|
|
|
|
|
return $list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach ($productItem as $item) {
|
|
|
|
|
foreach ($factor as $factor_item) {
|
|
|
|
|
$query = OrderItems::where('product_item_id', $item->id)
|
|
|
|
|
->whereIn("bed_id", $bedIds)
|
|
|
|
|
->whereRaw("factors like '%\"factor_item_id\": {$factor_item->id}%'")
|
|
|
|
|
->whereNotNull('paid_at')
|
|
|
|
|
->whereRaw("DATE_FORMAT(`paid_at`,'%Y-%m') = '{$month}'");
|
|
|
|
|
->where('paid_at', 'like', '%' . $month . '%');
|
|
|
|
|
|
|
|
|
|
// 修复:使用参数绑定防止SQL注入,并使用更精确的JSON匹配
|
|
|
|
|
// 确保 factor_item_id 是整数类型,防止SQL注入
|
|
|
|
|
$factorItemId = (int) $factor_item->id;
|
|
|
|
|
|
|
|
|
|
// 使用更精确的LIKE匹配模式,避免误匹配(如 1 匹配到 10、11 等)
|
|
|
|
|
// 匹配模式:%"factor_item_id":数字, 或 %"factor_item_id":数字}
|
|
|
|
|
// 使用 CONCAT 和参数绑定确保完全安全
|
|
|
|
|
$query->where(function ($q) use ($factorItemId) {
|
|
|
|
|
// 使用 CONCAT 函数构建模式,完全参数化,防止SQL注入
|
|
|
|
|
$q->whereRaw("factors LIKE CONCAT('%', '\"factor_item_id\":', ?, ',%')", [$factorItemId])
|
|
|
|
|
->orWhereRaw("factors LIKE CONCAT('%', '\"factor_item_id\":', ?, '}%')", [$factorItemId]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 如果MySQL版本 >= 5.7,也可以使用JSON函数(更精确)
|
|
|
|
|
// $query->whereRaw("JSON_SEARCH(factors, 'one', ?, NULL, '$[*].factor_item_id') IS NOT NULL", [$factorItemId]);
|
|
|
|
|
|
|
|
|
|
$total = $query->sum('total');
|
|
|
|
|
$count = $query->count();
|
|
|
|
|
|
|
|
|
|
// 如果有实际订单数据,使用平均单价;否则使用理论价格
|
|
|
|
|
if ($count > 0 && $total > 0) {
|
|
|
|
|
$totalPrice = round($total / $count, 2);
|
|
|
|
|
} else {
|
|
|
|
|
$totalPrice = $item->price + $factor_item->price;
|
|
|
|
|
}
|
|
|
|
|
// 修复:明确计算价格总和,避免运算符优先级问题
|
|
|
|
|
$totalPrice = (float) $item->price + (float) $factor_item->price;
|
|
|
|
|
|
|
|
|
|
$list[] = [
|
|
|
|
|
'name' => $totalPrice . '元/天',
|
|
|
|
|
@ -562,7 +566,7 @@ class StatisticsController extends CommonController
|
|
|
|
|
|
|
|
|
|
$month = request()->month ?? date("Y-m");
|
|
|
|
|
$months = $this->_getMonths();
|
|
|
|
|
// 当月天数1
|
|
|
|
|
// 当月天数
|
|
|
|
|
$days = date('t', strtotime($month));
|
|
|
|
|
$area = Area::withCount('beds')->where('project_id', $project_id)->get();
|
|
|
|
|
$beds = Bed::whereIn('area_id', $area->pluck('id'))->where('project_id', $project_id)->get();
|
|
|
|
|
|