cxgj/modules/api/models/BallCartForm.php
2023-11-27 09:45:13 +08:00

429 lines
19 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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);
}
}