find(); $title = $team_user->nickname . '的预约单'; // 构建基础查询条件 $baseQuery = [ ['del', '=', 0], ['team_user_id', '=', $user_id] ]; // 处理时间筛选逻辑 $timeQuery = []; if (!empty($post['is_time']) && $post['is_time'] == 1) { $todayStart = strtotime(date('Y-m-d')); $tomorrowStart = $todayStart + 86400; $timeQuery = [ ['start_time', '>=', $todayStart], ['start_time', '<', $tomorrowStart] ]; } // 优化count查询:合并所有条件 $countQuery = OrderTeamaster::where($baseQuery) ->where($timeQuery) ->whereIn('order_status', $os); // 如果有搜索条件,添加到查询 if (!empty($s)) { $countQuery->where($s[0], $s[1], $s[2]); } $count = $countQuery->count(); // 优化数据查询:使用相同的查询条件 $listsQuery = OrderTeamaster::where($baseQuery) ->where($timeQuery) ->whereIn('order_status', $os); // 如果有搜索条件,添加到查询 if (!empty($s)) { $listsQuery->where($s[0], $s[1], $s[2]); } $lists = $listsQuery->field('id,server_type,day_time,address,order_status,longitude,latitude,start_time,end_time,store_id,team_income_price,pay_time') ->page($post['page'], $post['size']) ->order($od) ->select(); $timekeeping = 0; // 支付时间 + 10分钟 = 固定的过期时间点 // 当前时间到过期时间点的剩余秒数 if ($lists) { foreach ($lists as &$item) { $expire_time = $item['pay_time'] + 600; // 优化:使用switch或更简洁的if结构 if ($item['order_status'] == 28) { $timekeeping = $expire_time - time(); } elseif ($item['order_status'] == 29) { $timekeeping = $item['start_time'] - time(); } elseif ($item['order_status'] == 30 || $item['order_status'] == 31) { $timekeeping = $item['end_time'] - time(); } // 优化:减少重复查询 if ($item['server_type'] == 1 && !empty($item['store_id'])) { $store = TeaStore::where('id', $item['store_id'])->find(); $item['title'] = $store->name ?? ''; } elseif ($item['server_type'] == 2) { $item['title'] = $title; } $item['timekeeping'] = $timekeeping; $item['day_time'] = date('m-d', $item['day_time']); $item['start_time'] = date('H:i', $item['start_time']); // 修正:应该是 H:i 而不是 H:s $item['end_time'] = date('H:i', $item['end_time']); // 修正:应该是 H:i 而不是 H:s } } $data = [ 'list' => $lists, 'page' => $post['page'], 'size' => $post['size'], 'count' => $count, 'more' => is_more($count, $post['page'], $post['size']) ]; return $data; } public static function orderDetails($post,$user_id){ Db::startTrans(); try { $team_user = TeamasterUser::where('id',$user_id)->find(); $item = OrderTeamaster::where('del',0) ->where('id',$post['id']) ->find(); if($item['server_type'] == 1){ $store = TeaStore::where('id',$item['store_id'])->find(); $item['title'] = $store->name; } $timekeeping = 0; if($item['order_status'] == 28){ $timekeeping = time()-$item['pay_time']; }elseif ($item['order_status'] == 29||$item['order_status'] == 30){ $timekeeping = $item['start_time']-time(); }elseif ($item['order_status'] == 31){ $timekeeping = $item['end_time']-time(); } $order_leaf = OrderTeamasterLeaf::where('order_id',$item['id'])->select(); $leaf_name = []; foreach ($order_leaf as &$v){ $leaf_name[] = $v['leaf_name'].'('.$v['num'].')泡'; } $user = User::where('id',$item['user_id'])->find(); $item['user_mobile'] = $user['mobile']; $item['timekeeping'] =$timekeeping; $item['leaf_name'] = implode(',',$leaf_name); $item['title'] = $team_user->nickname.'的预约单'; $item['day_time'] = date('m-d', $item['day_time']); $item['start_time'] = date('H:i', $item['start_time']); $item['end_time'] = date('H:i', $item['end_time']); $item['pay_time'] = date('Y-m-d H:i', $item['pay_time']); $item['dtime'] = date('Y-m-d H:i', $item['dtime']); $item['refund_time'] = date('Y-m-d H:i', $item['refund_time']); $item['take_order_time'] = date('Y-m-d H:i', $item['take_order_time']); $item['img_time'] = date('Y-m-d H:i', $item['img_time']); $item['img'] = FileService::getImgUrl($item['img']); $item['pay_way_title'] = ''; if($item['pay_way'] == 1){ $item['pay_way_title'] = "平台余额支付"; } if($item['pay_way'] == 2){ $item['pay_way_title'] = "微信支付"; } Db::commit(); return $item->toarray(); } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } public static function orderTake($post,$user_id){ Db::startTrans(); try { $order = OrderTeamaster::where([ 'id'=>$post['id'], 'order_status'=>28, 'del'=>0 ])->find(); if(!$order){ throw new \Exception('订单错误,请刷新页面'); } $order->order_status = 29; $order->take_order_time =time(); $order->save(); Db::commit(); return []; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } public static function orderCancel($post,$user_id){ Db::startTrans(); try { $order = OrderTeamaster::where([ 'id'=>$post['id'], 'order_status'=>28, 'del'=>0 ])->find(); if(!$order){ throw new \Exception('订单错误'); } $WxRefundService = new WxRefundService(); $result =$WxRefundService->Refund($order,10,40); Db::commit(); return []; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } public static function orderDepart($post,$user_id){ Db::startTrans(); try { $order = OrderTeamaster::where([ 'id'=>$post['id'], 'order_status'=>29, 'del'=>0 ])->find(); if(!$order){ throw new \Exception('订单错误,请刷新页面'); } $order->order_status = 30; $order->travel_time =time(); $order->save(); Db::commit(); return [ ]; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } public static function orderArrive($post,$user_id){ Db::startTrans(); try { $order = OrderTeamaster::where([ 'id'=>$post['id'], 'order_status'=>30, 'del'=>0 ])->find(); if(!$order){ throw new \Exception('订单错误,请刷新页面'); } $lat1 = $post['longitude']; $lng1 = $post['latitude']; $lat2 = $order['longitude']; $lng2 = $order['latitude']; $distance = self::getAccurateDistance($lat1, $lng1, $lat2, $lng2, 'km'); if($distance>2){ throw new \Exception('未到达打卡距离'); } $order->order_status = 31; $order->arrival_time =time(); $order->save(); Db::commit(); return []; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } public static function orderImage($post,$user_id){ Db::startTrans(); try { $order = OrderTeamaster::where([ 'id'=>$post['id'], 'order_status'=>31, 'del'=>0 ])->find(); if(!$order){ throw new \Exception('订单错误,请刷新页面'); } if($order['is_img'] == 1){ throw new \Exception('已打卡'); } $end_time = time()+(3600*($order->hours+$order->renew_hour)); $order->img_time =time(); $order->img = $post['img']; $order->start_time = time(); $order->end_time = $end_time; $order->is_img = 1; $order->save(); Db::commit(); return []; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } public static function orderFinish($post,$user_id){ Db::startTrans(); try { $order = OrderTeamaster::where([ 'id'=>$post['id'], 'order_status'=>31, 'del'=>0 ])->find(); if(!$order){ throw new \Exception('订单错误'); } if($order['end_time']>time()){ throw new \Exception('订单还未结束'); } if($order['is_img'] == 0){ throw new \Exception('还未打卡,请先打卡'); } $team_user = TeamasterUser::where('id',$user_id)->find(); $team_income_price = $order->team_income_price+(($order->renew_price+$order->renew_tea_price)*0.65); $order->order_status = 32; $order->save(); $reserve = [ 'team_user_id'=>$user_id, 'user_id'=>$order->user_id, 'change_object'=>$order->pay_way, 'change_type'=>1, 'action'=>1, 'before_amount'=>$team_user->user_money, 'after_amount'=>$team_user->user_money+$order->team_income_price, 'amount'=>$order->team_income_price, 'source_sn'=>$order->order_sn, 'remark'=>'茶艺师预定订单', 'status'=>1, 'create_time'=>time() ]; TeamasterAccountLog::create($reserve); $team_user->user_money = $team_user->user_money + round($team_income_price,2); $team_user->save(); Db::commit(); return []; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } public static function orderDel($post,$user_id){ Db::startTrans(); try { $order = OrderTeamaster::where([ 'id'=>$post['id'], 'del'=>0 ])->find(); if(!$order){ throw new \Exception('订单错误,请刷新页面'); } $order->uptime =time(); $order->del = 1; $order->save(); Db::commit(); return [ ]; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } public static function amountDetails($post,$user_id){ try { $order = OrderTeamaster::where([ 'id'=>$post['id'], 'del'=>0 ])->find(); $all_amount = $order->order_amount+$order->renew_price+$order->renew_tea_price; $team_income_price = $order->team_income_price+(($order->renew_price+$order->renew_tea_price)*0.65); $data = [ 'server_price'=>$order->server_price, 'mileage_price'=>$order->mileage_price, 'server_all_price'=>$order->server_all_price+$order->renew_price, 'mileage_server_price'=>$order->mileage_server_price, 'hours'=>$order->hours+$order->renew_hour, 'tea_price'=>$order->tea_price+$order->renew_tea_price, 'teacup_price'=>$order->teacup_price, 'renew_price'=>$order->renew_price, 'renew_tea_price'=>$order->renew_tea_price, 'handling_fee'=>round($all_amount-$team_income_price,2), 'team_income_price'=>round($team_income_price,2), 'distance'=>$order->distance, 'all_amount'=>$all_amount, 'coupon_price'=>$order->coupon_price, 'tea_all_price'=>$order->renew_tea_price+$order->tea_price+$order->teacup_price ]; return $data; } catch (\Exception $e) { self::setError($e->getMessage()); return false; } } /** * 使用WGS84椭球模型计算距离(Vincenty公式) * 精度:毫米级 */ public static function getAccurateDistance($lat1, $lng1, $lat2, $lng2, $unit = 'm') { // WGS84椭球参数 $a = 6378137.0; // 长半轴(米) $b = 6356752.314245; // 短半轴(米) $f = 1 / 298.257223563; // 扁率 // 转换为弧度 $U1 = atan((1 - $f) * tan(deg2rad($lat1))); $U2 = atan((1 - $f) * tan(deg2rad($lat2))); $L = deg2rad($lng2 - $lng1); $sinU1 = sin($U1); $cosU1 = cos($U1); $sinU2 = sin($U2); $cosU2 = cos($U2); $lambda = $L; $lambdaP = 2 * M_PI; $iterLimit = 100; $sinLambda = 0; $cosLambda = 0; $sinSigma = 0; $cosSigma = 0; $sigma = 0; $sinAlpha = 0; $cosSqAlpha = 0; $cos2SigmaM = 0; while (abs($lambda - $lambdaP) > 1e-12 && --$iterLimit > 0) { $sinLambda = sin($lambda); $cosLambda = cos($lambda); $sinSigma = sqrt( ($cosU2 * $sinLambda) * ($cosU2 * $sinLambda) + ($cosU1 * $sinU2 - $sinU1 * $cosU2 * $cosLambda) * ($cosU1 * $sinU2 - $sinU1 * $cosU2 * $cosLambda) ); if ($sinSigma == 0) { return 0; // 重合点 } $cosSigma = $sinU1 * $sinU2 + $cosU1 * $cosU2 * $cosLambda; $sigma = atan2($sinSigma, $cosSigma); $sinAlpha = $cosU1 * $cosU2 * $sinLambda / $sinSigma; $cosSqAlpha = 1 - $sinAlpha * $sinAlpha; $cos2SigmaM = $cosSigma - 2 * $sinU1 * $sinU2 / $cosSqAlpha; if (is_nan($cos2SigmaM)) { $cos2SigmaM = 0; } $C = $f / 16 * $cosSqAlpha * (4 + $f * (4 - 3 * $cosSqAlpha)); $lambdaP = $lambda; $lambda = $L + (1 - $C) * $f * $sinAlpha * ($sigma + $C * $sinSigma * ($cos2SigmaM + $C * $cosSigma * (-1 + 2 * $cos2SigmaM * $cos2SigmaM))); } if ($iterLimit == 0) { return NAN; // 公式未收敛 } $uSq = $cosSqAlpha * ($a * $a - $b * $b) / ($b * $b); $A = 1 + $uSq / 16384 * (4096 + $uSq * (-768 + $uSq * (320 - 175 * $uSq))); $B = $uSq / 1024 * (256 + $uSq * (-128 + $uSq * (74 - 47 * $uSq))); $deltaSigma = $B * $sinSigma * ($cos2SigmaM + $B / 4 * ($cosSigma * (-1 + 2 * $cos2SigmaM * $cos2SigmaM) - $B / 6 * $cos2SigmaM * (-3 + 4 * $sinSigma * $sinSigma) * (-3 + 4 * $cos2SigmaM * $cos2SigmaM))); $distance = $b * $A * ($sigma - $deltaSigma); // 单位转换 switch (strtolower($unit)) { case 'km': return $distance / 1000; case 'mile': return $distance / 1609.344; default: return $distance; } } }