$data['width'], 'ad_place.height' => $data['height'], ]; $start = Carbon::parse($data['starttime']); $end = Carbon::parse($data['endtime']); $status = [ 0 => '1', 1 => '4', 2 => '6', ]; $ads = Ad::where('fromtime', '<=', $start)->where('totime', '>=', $end)->select('pid')->get()->all(); $orderads = OrderAd::where('fromtime', '<=', $start)->where('totime', '>=', $end)->whereIn('status', $status)->select('pid')->get()->all(); $pids = array_merge($ads, $orderads); $ad_pids = array_unique($pids); // $ad_pid = [1,2,3]; // 所有与用户有时间冲突的广告位 if (!empty($ad_pids)) { $pid = []; foreach ($ad_pids as $val) { array_push($pid, $val['pid']); } $placeids = AdPlace::whereNotIn('id', $pid)->where($where)->select('id')->get()->all(); //所有去掉与用户时间冲突的广告并且符合图片尺寸的广告位 // 符合用户条件的空广告位 $place_id = []; foreach ($placeids as $val) { array_push($place_id, $val['id']); } $rep = AdPlace::whereIn('ad_place.id', $place_id) ->leftJoin('website', 'ad_place.website_id', 'website.id') ->select('ad_place.*', 'website.website_name', 'website.id') ->selectSub('website.id', 'webid') ->selectSub('ad_place.id', 'pid') ->orderBy("website.id", "asc") ->limit($data['pageSize']) ->offset(($data['page'] - 1) * $data['pageSize']) ->get(); } else { $rep = AdPlace::where($where) ->leftJoin('website', 'ad_place.website_id', 'website.id') ->select('ad_place.*', 'website.website_name', 'website.id') ->selectSub('website.id', 'webid') ->selectSub('ad_place.id', 'pid') ->orderBy("website.id", "asc") ->limit($data['pageSize']) ->offset(($data['page'] - 1) * $data['pageSize']) ->get(); } $startTime = strtotime($data['starttime']); $endTime = strtotime($data['endtime']); $time = ($endTime - $startTime) / (24 * 60 * 60); $roundedValue = round($time, 2); $days = number_format($roundedValue, 2, '.', ''); $count = count($rep); $data = [ 'rows' => $rep->toArray(), 'count' => $count, 'days' => $days, ]; if (empty($data['rows'])) { return Result::error("暂时没有符合您条件的广告位"); } return Result::success($data); } /** * 添加订单 * @param * @return void */ public function addOrder(array $data): array { $ads = Ad::whereIn($data['id']) ->leftJoin('ad_place', 'ad.pid', 'ad_place.id') ->leftJoin("article_data", "article.id", "article_data.article_id") ->select("ad_place.*", "ad.*") ->orderBy("ad.id", "desc") ->limit($data['pageSize']) ->offset(($data['page'] - 1) * $data['pageSize'])->get(); $count = Ad::whereIn($data['id'])->count(); $data = [ 'rows' => $ads->toArray(), 'count' => $count, ]; if (empty($rep)) { return Result::error("没有信息数据"); } return Result::success($data); } /** * 获取订单列表 * @param * @return void */ public function getOrderListAdmin(array $data): array { // 获取分页参数,默认每页 10 条记录 $page = isset($data['page']) ? (int) $data['page'] : 1; $perPage = isset($data['pagesize']) ? (int) $data['pagesize'] : 10; // 构建查询条件 $where = [ 'order.status' => $data['status'], // 明确指定 order 表的 status 列 ]; // 添加订单号查询条件 if (!empty($data['order_num'])) { $where['order.order_num'] = $data['order_num']; // 明确指定 order 表的 order_num 列 } // 处理时间范围查询 $start = $data['sttime']; $end = $data['edtime']; // 查询数据并分页 $query = Order::where($where) ->when(!empty($start) && !empty($end), function ($q) use ($start, $end) { $q->whereBetween('order.fromtime', [$start, $end]); // 明确指定 order 表的 fromtime 列 }) ->when(!empty($start), function ($q) use ($start) { $q->where('order.fromtime', '>=', $start); // 明确指定 order 表的 fromtime 列 }) ->when(!empty($end), function ($q) use ($end) { $q->where('order.totime', '<=', $end); // 明确指定 order 表的 totime 列 }) ->leftJoin('user as admin_user', 'order.admin_user_id', '=', 'admin_user.id') ->leftJoin('user as user', 'order.user_id', '=', 'user.id') ->select( 'order.*', 'admin_user.user_name as admin_user_name', 'user.user_name as user_name' ) ->orderBy('order.id'); // 执行分页查询 $result = $query->paginate($perPage, ['*'], 'page', $page); // 返回分页结果 return Result::success([ 'count' => $result->total(), 'current_page' => $result->currentPage(), 'last_page' => $result->lastPage(), 'pagesize' => $result->perPage(), 'rows' => $result->items(), ]); } /** * 获取订单详情 * @param * @return void */ public function getOrderDetailAdmin(array $data): array { $order = Order::where('order.id', $data['id']) ->leftJoin('user as admin_user', 'order.admin_user_id', '=', 'admin_user.id') ->leftJoin('user as user', 'order.user_id', '=', 'user.id') ->select( 'order.*', 'admin_user.user_name as admin_user_name', 'user.user_name as user_name' )->first(); if (empty($order)) { return Result::error("没有信息数据"); } $pid = $order['id']; $ad = OrderAd::where('order_id', $pid)->get(); $order['ad'] = $ad; return Result::success($order); } /** * 修改订单价格 * @param * @return void */ public function editPriceOrderAdmin(array $data): array { $order = Order::where('id', $data['id'])->first(); if (empty($order)) { return Result::error("没有信息数据"); } $order->price = $data['price']; $order->save(); return Result::success($order); } /** *拒绝订单 * @param * @return void */ public function rejectOrderAdmin(array $data): array { $order = Order::where('id', $data['id'])->first(); if (empty($order)) { return Result::error("没有信息数据"); } Db::beginTransaction(); try { $order->status = 2; //订单状态:1:通过;2:驳回;3:撤回;4:修改;5:过期;6:待审核;7:结束 $order->ad_status = 2; $order->reason = $data['reason']; $order->bhtime = date('Y-m-d H:i:s'); $order->save(); OrderAd::where('order_id', $data['id']) ->update(['status' => 2]); Db::commit(); } catch (\Exception $e) { Db::rollBack(); return Result::error("操作失败"); } return Result::success($order); } /** * 结束订单 * @param * @return void */ public function endOrderAdmin(array $data): array { $order = Order::where('id', $data['id'])->first(); if (empty($order)) { return Result::error("没有信息数据"); } Db::beginTransaction(); try { $order->status = 7; $order->jstime = date('Y-m-d H:i:s'); $order->save(); // 获取 order_ad 表中的记录 $orderAds = OrderAd::where('order_id', $data['id']) ->update(['status' => 7]); // 在ad表中删除相同pid的数据 Ad::where('order_id', $data['id'])->delete(); Db::commit(); } catch (\Exception $e) { Db::rollBack(); return Result::error("操作失败" . $e->getMessage()); } return Result::success($order); } /** * 删除订单 * @param * @return void */ public function delOrderAdmin(array $data): array { // 获取订单信息 $order = Order::where('id', $data['id'])->first(); if (empty($order)) { return Result::error("没有信息数据"); } Db::beginTransaction(); try { // 获取 order_ad 表中的记录 OrderAd::where('order_id', $data['id'])->delete(); // 删除 ad 表中的记录 Ad::where('order_id', $order['id'])->delete(); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollBack(); // 返回错误信息 return Result::error($e->getMessage()); } // 返回成功信息 return Result::success("删除成功"); } /** * 审核订单 * @param * @return void */ public function applyOrderStatusAdmin(array $data): array { $order = Order::where('id', $data['id']) ->where('status', 6) ->first(); if (empty($order)) { return Result::error("没有信息数据"); } Db::beginTransaction(); try { $order->status = 1; //判断是否在周期范围内 $ad_status = 8; // 待生效 if ($order->starttime < date('Y-m-d H:i:s') && date('Y-m-d H:i:s') < $order->endtime) { // 条件满足时的逻辑 $ad_status = 1; } $order->ad_status = 1; $order->shtime = date('Y-m-d H:i:s'); $order->save(); // 批量更新 order_ad 表中的状态 OrderAd::where('order_id', $data['id']) ->where('status', 6) ->update(['status' => 1]); //判断的当前时间是否在订单的开始时间之后,并且小于等于订单的结束时间 if (time() >= strtotime($order->sttime) && time() < strtotime($order->edtime)) { $ad_status = 1; //审核生效 } else { $ad_status = 2; //审核 } $ads = []; $orderAds = OrderAd::where('order_id', $data['id'])->get(); foreach ($orderAds as $orderAd) { $ads[] = [ 'name' => $orderAd->name, 'pid' => $orderAd->pid, 'areaid' => $orderAd->areaid, 'amount' => $orderAd->amount, 'introduce' => $orderAd->introduce, 'hits' => $orderAd->hits, 'admin_user_id' => $orderAd->admin_user_id, 'fromtime' => $orderAd->fromtime, 'totime' => $orderAd->totime, 'text_name' => $orderAd->text_name, 'text_url' => $orderAd->text_url, 'text_title' => $orderAd->text_title, 'image_src' => $orderAd->image_src, 'image_url' => $orderAd->image_url, 'image_alt' => $orderAd->image_alt, 'video_src' => $orderAd->video_src, 'video_url' => $orderAd->video_url, 'video_auto' => $orderAd->video_auto, 'video_loop' => $orderAd->video_loop, 'status' => $ad_status, 'order_id' => $orderAd->order_id, ]; } Ad::insert($ads); Db::commit(); } catch (\Exception $e) { Db::rollBack(); return Result::error($e->getMessage()); } return Result::success($order); } /*  * 根据用户条件及网站搜索没有广告的广告位  * @param  * @return void */ public function getWebsiteAd(array $data): array { $where = [ 'ad_place.width' => $data['width'], 'ad_place.height' => $data['height'], ]; $start = Carbon::parse($data['starttime']); $end = Carbon::parse($data['endtime']); $status = [ 0 => '1', 1 => '4', 2 => '6', ]; //订单状态:1:通过;2:驳回;3:撤回;4:修改;5:过期;6:待审核;7:结束 $ads = Ad::where('fromtime', '<=', $start)->where('totime', '>=', $end)->select('pid')->get()->all(); $orderads = OrderAd::where('fromtime', '<=', $start)->where('totime', '>=', $end)->whereIn('status', $status)->select('pid')->get()->all(); $pids = array_merge($ads, $orderads); $ad_pids = array_unique($pids); //$ad_pids=所有与用户提交的时间有冲突的广告位pid if (!empty($ad_pids)) { $pid = []; foreach ($ad_pids as $val) { array_push($pid, $val['pid']); } $placeids = AdPlace::whereNotIn('id', $pid)->where($where)->select('id', 'website_id')->get()->all(); //去掉时间冲突并且符合图片尺寸的广告位 if (!isset($data['website_id'])) { $website_id = []; foreach ($placeids as $v) { array_push($website_id, $v['website_id']); } $rep = Website::whereIn('id', $website_id)->get(); //若不存在网站id参数直接返回符合条件的广告位相关联的网站名称 } else { $place_id = []; foreach ($placeids as $val) { array_push($place_id, $val['id']); } $rep = AdPlace::where($where) ->whereIn('ad_place.id', $place_id) ->where('ad_place.website_id', $data['website_id']) ->leftJoin('website', 'ad_place.website_id', 'website.id') ->select('ad_place.*', 'website.website_name', 'website.id') ->selectSub('website.id', 'webid') ->selectSub('ad_place.id', 'pid') ->orderBy("website.id", "asc") ->limit($data['pageSize']) ->offset(($data['page'] - 1) * $data['pageSize']) ->get(); //若存在网站id,关联查询是需要添加website_id条件查询 } } else { //若不存在有时间冲突的广告位则所有符合图片尺寸的广告位皆可以使用,只需要判断是否存在网站id参数即可 if (isset($data['website_id'])) { $rep = AdPlace::where($where) ->where('ad_place.website_id', $data['website_id']) ->leftJoin('website', 'ad_place.website_id', 'website.id') ->select('ad_place.*', 'website.website_name', 'website.id') ->selectSub('website.id', 'webid') ->selectSub('ad_place.id', 'pid') ->orderBy("website.id", "asc") ->limit($data['pageSize']) ->offset(($data['page'] - 1) * $data['pageSize']) ->get(); } else { $place_all = AdPlace::where($where)->select('website_id')->get()->all(); $place_allads = []; foreach ($place_all as $v) { array_push($place_allads, $v['website_id']); } $rep = Website::whereIn('id', $place_allads)->get(); } } if (empty($rep)) { return Result::error("暂时没有符合您条件的广告位"); } $startTime = strtotime($data['starttime']); $endTime = strtotime($data['endtime']); $time = ($endTime - $startTime) / (24 * 60 * 60); $roundedValue = round($time, 2); $days = number_format($roundedValue, 2, '.', ''); $count = count($rep); $result['days'] = $days; $result = [ 'rows' => $rep->toArray(), 'count' => $count, ]; return Result::success($result); } /**  * 添加广告订单  * @param  * @return void */ public function addAD(array $data): array { date_default_timezone_set('Asia/Shanghai'); $time = time(); $startTime = strtotime($data['starttime']); $endTime = strtotime($data['endtime']); $con_time = ($endTime - $startTime) / (24 * 60 * 60); $roundedValue = round($con_time, 2); $days = number_format($roundedValue, 2, '.', ''); $timestamp = date('YmdHis', $time); $catetime = date('Y-m-d H:i:s', $time); $randomNumber = mt_rand(1000, 9999); $ordernum = $randomNumber . $timestamp; // 时间戳与随机数拼接 // var_dump(($time)); Db::beginTransaction(); try { $order = [ 'order_num' => $ordernum, 'sttime' => $data['starttime'], 'edtime' => $data['endtime'], 'user_id' => $data['user_id'], 'cttime' => $catetime, 'height' => $data['height'], 'width' => $data['width'], 'days' => $days, 'created_at' => date('Y-m-d H:i:s', time()), 'updated_at' => date('Y-m-d H:i:s', time()), ]; $orderid = Order::insertGetId($order); $adplace = $data['pid']; if (is_array($data['pid'])) { $adplace = AdPlace::whereIn('id', $data['pid'])->select('website_id', 'id')->get(); foreach ($adplace as $key => $ads) { $order_ad[$key] = [ 'order_id' => $orderid, 'order_num' => $ordernum, 'name' => $data['name'], 'fromtime' => $data['starttime'], 'totime' => $data['endtime'], 'image_src' => $data['imgsrc'], 'image_url' => $data['imgurl'], 'pid' => $ads['id'], 'website_id' => $ads['website_id'], ]; // $log = [ // 'order_id' => $orderid, // 'user_id' => $data['user_id'], // 'pid' => $ads['id'], // 'website_id' => $ads['website_id'], // 'action' => '添加', // 'time' => $catetime // ]; } } else { $order_ad = [ 'order_id' => $orderid, 'order_num' => $ordernum, 'name' => $data['name'], 'website_id' => $adplace['website_id'], 'fromtime' => $data['starttime'], 'totime' => $data['endtime'], 'image_src' => $data['imgsrc'], 'image_url' => $data['imgurl'], 'pid' => $adplace, 'created_at' => date('Y-m-d H:i:s', time()), 'updated_at' => date('Y-m-d H:i:s', time()), ]; // $log = [ // 'order_id' => $orderid, // 'user_id' => $data['user_id'], // 'pid' => $adplace, // 'website_id' => $ads['website_id'], // 'action' => '添加', // 'time' => $catetime // ]; } $orderad_id = OrderAd::insert($order_ad); Db::commit(); } catch (\Exception $e) { Db::rollBack(); return Result::error($e->getMessage()); } // $log = AdLog::insert($log); $result = [ 'order_id' => $orderid, 'orderad_id' => $orderad_id, 'name' => $data['name'], '$ordernum' => $ordernum, ]; return Result::success($result); } /**  * 获取订单列表  * @param  * @return void */ public function getOrderList(array $data): array { $where = [ 'user_id' => $data['user_id'], 'user_del' => 2, ]; if (isset($data['status'])) { $where['status'] = $data['status']; } $orders = Order::where($where) ->orderBy("id", "asc") ->limit($data['pageSize']) ->offset(($data['page'] - 1) * $data['pageSize']) ->get(); if (empty($orders)) { return Result::error("您暂时还没有下单"); } else { $count = count($orders); $data = [ 'rows' => $orders->toArray(), 'count' => $count, ]; } return Result::success($data); } /**  * 获取订单详情  * @param  * @return void */ public function getOrderDetail(array $data): array { $order = Order::where('id', $data['order_id'])->first(); $orderads = OrderAd::where('order_ad.order_id', $data['order_id']) ->leftJoin('website', 'order_ad.website_id', 'website.id') ->select('order_ad.*', 'website.website_name', 'website.id') ->selectSub('website.id', 'webid') ->selectSub('order_ad.id', 'oid') ->orderBy("website.id", "asc") ->limit($data['pageSize']) ->offset(($data['page'] - 1) * $data['pageSize']) ->get(); if (empty($order)) { return Result::error("订单id错误"); } $result = [ 'order' => $order, 'orderads' => $orderads, ]; return Result::success($result); } /**  * 撤回订单  * @param  * @return void */ public function cancelOrder(array $data): array { date_default_timezone_set('Asia/Shanghai'); $time = time(); $timestamp = date('YmdHis', $time); Db::beginTransaction(); try { $order = Order::where('id', $data['order_id'])->where('status', 6)->where('sttime', '>=', $timestamp)->update(['status' => 3, 'ad_status' => '3']); $ads = OrderAd::where('order_id', $data['order_id'])->where('status', 6)->where('fromtime', '>=', $timestamp)->update(['status' => 3]); Db::commit(); } catch (\Exception $e) { Db::rollBack(); return Result::error($e->getMessage()); } $result = [ 'order' => $order, 'ads' => $ads, ]; return Result::success($result); } /**  * 删除订单  * @param  * @return void */ public function delOrderAD(array $data): array { $data['status'] = [ 0 => 2, 1 => 3, 2 => 5, 3 => 7 ]; //1:通过;2:驳回;3:撤回;4:修改;5:过期;6:待审核;7:结束; date_default_timezone_set('Asia/Shanghai'); $time = time(); $timestamp = date('YmdHis', $time); $where = [ ['user_id', '=', $data['user_id']], ['id', '=', $data['order_id']], ]; $time = [['edtime', '<=', $timestamp]]; $order = Order::where($where)->where($time)->update(['user_del' => 1]); if (empty($order)) { $order = Order::where($where)->whereIn('status', $data['status'])->update(['user_del' => 1]); } // if ($order == 0) { return Result::error("订单id错误"); } return Result::success($order); } }