1], [['limit'], 'default', 'value' => 20], ]; } public function search() { if (!$this->validate()) { return $this->getModelError(); } $query = BallCart::find()->alias('ball') ->leftJoin(['store' => Store::tableName()], 'ball.store_id=store.id') ->leftJoin(['mark' => BallMark::tableName()], 'ball.mark_id=mark.id') ->select('ball.id,ball.cover_pic,ball.money,mark.name as mark_name,mark.id as mard_id,ball.ball_number,ball.status,store.name') ->where([ 'ball.is_delete' => 0, ])->andWhere(['!=', 'ball.status', 2]) ->andFilterWhere([ 'ball.store_id' => $this->store_id ]); $count = $query->count(); $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $this->limit, 'page' => $this->page - 1]); $list = $query->offset($pagination->offset)->limit($pagination->limit)->orderBy(['ball.id' => SORT_DESC])->asArray()->all(); $this->pageCount = $pagination->pageCount; //门店管理员 if ($this->user_type == 2) { $store_user_info = ApiHelper::findOneUserStoreId($this->user_id); if ($store_user_info['user_type'] == 3) { $user_store_id = 0; } else { $user_store_id = $store_user_info['store_id'] ? $store_user_info['store_id'] : 0; } } if ($list) { $temp_data = []; ///可以查看为0,否则为1 foreach ($list as $key => $value) { $list[$key]['cover_pic'] = SiteHelper::getFullUrl($value['cover_pic']); $list[$key]['ball_user_stauts'] = 0; // 正确 $list[$key]['ball_info_stauts'] = 0; // 是否能进入详情页面 $list[$key]['order_id'] = 0; # 订单号 $ball_less = $this->lease($value['ball_number']); if ($ball_less['code'] != 0) { // $list[$key]['ball_arr'] = json_decode('{"orig_data":"","TIMESTAMP":0,"IMEI":"","SIMID":"","CSQ":0,"OPERATION_ENABLE":0,"OPERATION_LEVEL":0,"MODE":0,"ELEC_PERCENT":0,"RANGE":0,"RANGE_CURRENT":0,"RUNTIME":0,"RUNTIME_CURRENT":0}', true); unset($list[$key]); continue; } else { $list[$key]['ball_arr'] = $ball_less['data']['ball_arr']; } //租赁中 if ($value['status'] == 1) { $find_order = Order::find()->alias('o') ->join('inner join', ['od' => OrderDetail::tableName()], 'o.id=od.order_id') ->andWhere([ 'od.goods_id' => $value['ball_number'], 'o.is_delete' => 0, 'od.is_delete' => 0, ])->andWhere([ 'in', 'o.status', [1, 2] ])->select('o.id,o.store_id,o.user_id')->asArray()->one(); // 能否进入控制台,是否为当前车辆的购买者,是否为当前车辆的管理者 if (!empty($find_order) && ($find_order['user_id'] == $this->user_id || $find_order['store_id'] == $user_store_id)) { //判断是否是自己租赁的球车 if ($find_order['user_id'] == $this->user_id) { $list[$key]['ball_user_stauts'] = 0; } else { $list[$key]['ball_user_stauts'] = 1; } // 是否能进入详情页面 $list[$key]['ball_info_stauts'] = 1; //判断车辆管理者显示归还功能 0 显示确认归还 1 不显示 $list[$key]['ball_user_store'] = $find_order['store_id'] == $user_store_id ? 0 : 1; if ($find_order['user_id'] == $this->user_id) { $temp_data['user_data'][] = $list[$key]; } else { $temp_data['un_data'][] = $list[$key]; } } else { $list[$key]['ball_user_store'] = $find_order['store_id'] == $user_store_id ? 0 : 1; $list[$key]['ball_user_stauts'] = 1; $list[$key]['ball_info_stauts'] = 0; $temp_data['un_data'][] = $list[$key]; } /* $redis_name = $this->redis_name . $value['ball_number']; //租赁当前球车的用户ID $ball_redis_user = \Yii::$app->redis->get($redis_name); if($ball_redis_user == $this->user_id){ }else{ $list[$key]['ball_user_stauts'] = 1; $list[$key]['ball_info_stauts'] = 0; }*/ } else { $temp_data['success_data'][] = $list[$key]; } } $list = []; $list = array_merge($list, $temp_data['user_data'] ?? []); $list = array_merge($list, $temp_data['success_data'] ?? []); $list = array_merge($list, $temp_data['un_data'] ?? []); } // $list = array_merge($list); $count = count($list); $end_flag = $this->page >= $pagination->pageCount ? true : false; return [ 'code' => 0, 'msg' => 'ok', 'data' => $list, 'count' => $count, 'page_size' => $this->limit, 'page_count' => $this->pageCount, 'page_no' => $this->page, 'end_flag' => $end_flag ]; } /** *球车详情 */ public function lease($ball_number) { if (empty($ball_number)) { return $this->apiReturnError('球车编号不能为空'); } $redis_name = self::BALL_CART_INFO . $ball_number . '_Detail'; $redis_name_lock = $redis_name . "_ttl_lock"; $qc_status_error = ""; $video_url = ''; // $content = base64_decode(SiteHelper::getCustomiseOptionByKey("_page_handle_video_", "hump")); // if(!empty($content)){ // $content = SiteHelper::getFullUrl($content); // $video_url = $content; // } if(!empty($this->init_order) && !empty($this->user_id)){ $redis_name = "cxaibc:api:actionHandleVideo_v1"; $get = \Yii::$app->redis->get($redis_name); //保留观看视频 $user = ApiHelper::findOneUser($this->user_id); if (empty($user->is_view) && !empty($get)) { $content = base64_decode(SiteHelper::getCustomiseOptionByKey("_page_handle_video_", "hump")); if(!empty($content)){ $content = SiteHelper::getFullUrl($content); $video_url = $content; } } // 初始化所有订单,把此用户未支付的订单全变更为取消,并返还优惠券 $select_data = Order::find()->andWhere([ 'user_id' => $this->user_id, 'is_pay' => 0, 'cancel_status' => 0, 'is_delete' => 0, ])->andWhere([ 'in','status',[4,5] ])->select('*')->all(); if(!empty($select_data)){ foreach ($select_data as $key=>$val){ $t = \Yii::$app->db->beginTransaction(); $val->status = 4; $val->cancel_status = 1; $val->is_delete = 0; if(!$val->save()){ $t->rollBack(); continue; } // 归还车辆信息 $order_detail = OrderDetail::findOne(['order_id' => $val->id]); if(!empty($order_detail)){ $ball_cart = BallCart::find()->where(['status' => 3,'is_delete' => 0,'ball_number' => $order_detail->goods_id])->one(); if(!empty($ball_cart)){ $ball_cart->status = 0; $ball_cart->save(); } } if(!empty($val->use_user_coupon_id)){ // 退回优惠券 UserCoupon::updateAll([ 'status' => 0, 'updated_at' => time(), ],[ 'id' => $val->use_user_coupon_id, 'is_delete' => 0, ]); } $t->commit(); } } // 判断当前用户所属门店 $store_data = ApiHelper::findOneUserStoreId($this->user_id); $ball_cart = BallCart::find()->andWhere(['ball_number' => $ball_number, 'is_delete' => 0])->orderBy(['id' => SORT_DESC])->one(); if (empty($store_data) || $store_data->store_id != $ball_cart->store_id) { //查看用户是否有进行中的订单 $orderIng = Order::find()->alias('o') // ->innerJoin(['rt' => OrderDetail::tableName()], 'o.id=rt.order_id') ->andWhere(['o.user_id' => $this->user_id,]) // ->andWhere(['o.store_id' => $ball_cart->store_id]) ->andWhere(['o.is_pay' => 1]) ->andWhere(['<>','o.cancel_status' , 1]) ->andWhere(['o.is_delete' => 0]) ->andWhere(['IN', 'o.status', [1, 2]]) ->one(); if (!empty($orderIng)) { $qc_status_error = "您有一笔订单正在进行中,请先结束订单"; } } } /*if(\Yii::$app->redis->setnx($redis_name_lock,1)){ // 去请求mqtt车辆详细信息 $obj = new Mqtt(); $obj->getInfo($ball_number,7); \Yii::$app->redis->expire($redis_name_lock,20); }*/ // //球车编号 // try { // var_dump(\Yii::$app->redis->set($redis_name, $json_arr)); // } catch (\Exception $e) { // $this->apiReturnError($e->getMessage()); // } // die(); // ELEC_PERCENT 剩余电量 RANGE_CURRENT 本次行驶里程 RUNTIME_CURRENT 本次运行时常 CSQ 信号 OPERATION_ENABLE 操作许可 if (\Yii::$app->redis->setnx($redis_name, 1)) { \Yii::$app->redis->del($redis_name); // return $this->apiReturnError('获取球车信息错误,请联系客服'); } $json_data = \Yii::$app->redis->get($redis_name); $json_data = json_decode($json_data, true); $json_data = json_decode($json_data['data'], true); if (!is_array($json_data) && empty($json_data)) { $json_data = json_decode('{"orig_data":"","TIMESTAMP":0,"IMEI":"","SIMID":"","CSQ":0,"OPERATION_ENABLE":0,"OPERATION_LEVEL":0,"MODE":0,"ELEC_PERCENT":0,"RANGE":0,"RANGE_CURRENT":0,"RUNTIME":0,"RUNTIME_CURRENT":0}', true); // return $this->apiReturnError('球车已断开连接,请联系服务员'); } $query = BallCart::find()->alias('ball') ->leftJoin(['store' => Store::tableName()], 'ball.store_id=store.id') ->leftJoin(['mark' => BallMark::tableName()], 'ball.mark_id=mark.id') ->select('ball.id,ball.store_id,ball.cover_pic,ball.money,ball.content,mark.name as mark_name,mark.id as mard_id,ball.ball_number,ball.status,store.name') ->andWhere([ 'ball.is_delete' => 0, 'ball.ball_number' => $ball_number ])->andWhere(['!=', 'ball.status', 2]) ->orderBy(['id' => SORT_DESC]) ->asArray() ->one(); // $data['ball_number'] = $ball_number; $data = $query; $data['content'] = SiteHelper::repairContent($data['content']); $data['cover_pic'] = SiteHelper::getFullUrl($data['cover_pic']); // $data['store_cover_pic'] = SiteHelper::getFullUrl($data['store_cover_pic']); // $data['video_url'] = $video_url; //操作视频路径 $data['video_url'] = $video_url; //操作视频路径 $user_store_id = 0; //门店管理员 if ($this->user_type == 2) { $store_user_info = ApiHelper::findOneUserStoreId($this->user_id); if ($store_user_info['user_type'] == 3) { $user_store_id = 0; } else { $user_store_id = $store_user_info['store_id'] ? $store_user_info['store_id'] : 0; } } $data['ball_user_store'] = 1; # 是否未当前门店管理员或服务员,0为展示车辆控制1为不展示 $data['ball_user_stauts'] = 0; # 判断用户是否为自己 $data['ball_info_stauts'] = 1; $data['title'] = ""; //租赁中 if ($data['status'] == 1) { $find_order = Order::find()->alias('o') ->join('inner join', ['od' => OrderDetail::tableName()], 'o.id=od.order_id') ->join('inner join', ['user' => User::tableName()], 'o.user_id=user.id') ->andWhere([ 'od.goods_id' => $data['ball_number'], 'o.is_delete' => 0, 'od.is_delete' => 0, ]) ->andWhere([ 'in', 'o.status', [1, 2] ]) ->select('o.id,o.store_id,o.user_id,o.created_at as begin_time,user.nickname,user.real_name,user.mobile_phone,o.status') ->orderBy(['id' => SORT_DESC]) ->asArray()->one(); // 能否进入控制台,是否为当前车辆的购买者,是否为当前车辆的管理者 $data['user_id'] = $this->user_id; if (!empty($find_order) && ($find_order['user_id'] == $this->user_id || $user_store_id == $find_order['store_id'])) { //判断是否是自己租赁的球车 if ($find_order['user_id'] == $this->user_id) { $data['ball_user_stauts'] = 0; } else { $data['ball_user_stauts'] = 1; } // 是否能进入详情页面 $data['ball_info_stauts'] = 1; //判断车辆管理者显示归还功能 0 显示确认归还 1 不显示 $data['ball_user_store'] = $find_order['store_id'] == $user_store_id ? 0 : 1; } else { $data['ball_user_store'] = $find_order['store_id'] == $user_store_id ? 0 : 1; $data['ball_user_stauts'] = 1; $data['ball_info_stauts'] = 0; } if ($find_order['status'] == 2) { $data['title'] = "还车申请中..."; } $data['begin_time'] = $find_order['begin_time']; //租赁开始时间 $data['begin_time_date'] = date('Y-m-d H:i:s', $find_order['begin_time']); //租赁开始时间 $data['user_name'] = $find_order['real_name'] ? $find_order['real_name'] : $find_order['nickname']; //用户姓名 有昵称取昵称没有获取真实姓名 $data['mobile_phone'] = $find_order['mobile_phone']; //用户姓名 有昵称取昵称没有获取真实姓名 } $json_data['CSQ_step'] = 0; if (!empty($json_data['CSQ'])) { if ($json_data['CSQ'] < 12) { $json_data['CSQ_step'] = 1; } elseif ($json_data['CSQ'] < 22) { $json_data['CSQ_step'] = 2; } else { $json_data['CSQ_step'] = 3; } } $OPERATION_LEVEL_arr = [ 0 => '助力模式', 1 => '摇杆模式', 2 => '跟随模式', ]; $json_data['OPERATION_LEVEL_str'] = $OPERATION_LEVEL_arr[$json_data['OPERATION_LEVEL']] ?? '--'; $data['ball_arr'] = $json_data; $data['qc_status_error'] = $qc_status_error; $data['init_order'] = $this->init_order; $data['user_id'] = $this->user_id; return ['code' => 0, 'data' => $data]; } public function getUserBallCart() { $orderData = Order::find()->alias('o') ->innerJoin(['rt' => OrderDetail::tableName()], 'o.id=rt.order_id') ->innerJoin(['ball' => BallCart::tableName()], 'rt.goods_id=ball.ball_number') ->select('rt.goods_id as id,rt.goods_id as ball_number') ->where(['o.user_id' => $this->user_id]) ->andWhere(['o.is_pay' => 1]) ->andWhere(['IN', 'o.status', [1, 2]]) ->andWhere(['o.is_delete' => 0, 'rt.is_delete' => 0, 'ball.is_delete' => 0, 'ball.status' => 1]) ->asArray()->one(); if ($orderData == null) { return $this->apiReturnError('', []); } return $this->apiReturnSuccess('', $orderData); } }