429 lines
18 KiB
PHP
429 lines
18 KiB
PHP
<?php
|
||
|
||
/**
|
||
* @author Any
|
||
* @description KISS
|
||
* @date 2020-12-2
|
||
* @version 1.0.0
|
||
*
|
||
* _____LOG_____
|
||
*
|
||
*/
|
||
|
||
namespace app\modules\api\models;
|
||
|
||
use app\models\Order;
|
||
use app\models\OrderDetail;
|
||
use app\models\UserCoupon;
|
||
use app\modules\api\components\Mqtt;
|
||
use function AlibabaCloud\Client\value;
|
||
use app\components\FlashStorage;
|
||
use app\components\SiteHelper;
|
||
use app\models\BallCart;
|
||
use app\models\BallMark;
|
||
use app\models\Coach;
|
||
use app\models\DeviceUniqueBindUser;
|
||
use app\models\Store;
|
||
use app\models\User;
|
||
use app\components\auth\AToken;
|
||
use app\components\EncryptHelper;
|
||
use app\modules\api\components\ApiHelper;
|
||
use app\modules\api\components\GetDistance;
|
||
use yii\data\Pagination;
|
||
|
||
|
||
class BallCartForm extends ApiModel
|
||
{
|
||
|
||
|
||
public $user_id;
|
||
public $cx_mch_id;
|
||
public $store_id;
|
||
|
||
public $limit;
|
||
public $page;
|
||
public $pageCount; // 总页数
|
||
|
||
public $redis_name = 'api:cxaibc:ball_cart_v2:';
|
||
|
||
const BALL_CART_INFO = 'api:cxaibc:mqtt:data:';
|
||
|
||
public $user_type;
|
||
public $init_order; // 第一次进入
|
||
|
||
public function rules()
|
||
{
|
||
return [
|
||
[['store_id','init_order'], 'string'],
|
||
[['limit', 'page','user_id','init_order'], 'integer'],
|
||
[['page'], 'default', 'value' => 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);
|
||
}
|
||
|
||
} |