初始化代码

This commit is contained in:
2025-08-11 10:22:05 +08:00
commit ebd8d85201
4206 changed files with 753018 additions and 0 deletions

View File

@@ -0,0 +1,590 @@
<?php
namespace app\api\model;
use think\Db;
use think\Model;
class Envelope extends Model
{
//抢红包生成金额
public function red_envelope_create_money($min = 1, $max = 50, $num = 10, $total){
$max = ($total/$num)*2;
$max = (int)$max;
$sum = 0;
$totals = $total;
$nums = $num;
$data = [];
if ($min * $num > $total) {
return [];
}
if($max*$num < $total){
return [];
}
while ($num >= 1) {
$num--;
$kmix = max($min, $total - $num * $max);
$kmax = min($max, $total - $num * $min);
$kAvg = $total / ($num + 1);
//获取最大值和最小值的距离之间的最小值
$kDis = min($kAvg - $kmix, $kmax - $kAvg);
//获取0到1之间的随机数与距离最小值相乘得出浮动区间这使得浮动区间不会超出范围
$r = ((float)(rand(1, 10000) / 10000) - 0.5) * $kDis * 2;
$k = sprintf("%.2f", $kAvg + $r);
$k = round($k, 0);
$total -= $k;
$data[] = $k;
$sum += $k;
}
if($totals != (int)$sum){
$return = $this->red_envelope_create_money($min, $max, $nums, $totals);
return $return;
}else{
return $data;
}
}
//红包展示
public function get_red_envelope_list($uid, $type){
$config = get_uncache_system_config();
$user_info = db::name('user')->find($uid);
if(!$user_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
//红包类型
$envelope_type_info = db::name('envelope_type')->find($type);
if(!$envelope_type_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
//是否有进行中的
$map = [];
$map[] = ['tid', '=', $type];
$map[] = ['is_finish', '=', 2];
$map[] = ['is_delete', '=', 1];
$map[] = ['is_stop', '=', 2];
$red_envelope_info = db::name('red_envelope')->where($map)->find();
$data = [];
$data['type'] = $type;
$data['type_name'] = $envelope_type_info['type_name'];
$data['price'] = $envelope_type_info['price'];
if($red_envelope_info){
$data['unopen_num'] = $red_envelope_info['num'] - $red_envelope_info['open_num'];
$data['is_finish'] = $red_envelope_info['is_finish'];
$data['num'] = $red_envelope_info['num'];
}else{
$data['unopen_num'] = 0;
$data['is_finish'] = 1;
if($type == 1){
$data['num'] = $config['silver_envelope_num'];
}else if($type == 2){
$data['num'] = $config['gold_envelope_num'];
}else if($type == 3){
$data['num'] = $config['drill_envelope_num'];
}
}
$data['integral'] = $user_info['integral'];
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
//抢红包
public function snatch_red_envelope($uid, $rid, $type){
$user_info = db::name('user')->find($uid);
if(!$user_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
if($user_info['is_tester'] == 2){
return ['code' => 201, 'msg' => '虚拟号无法参与', 'data' => null];
}
//房间是否存在
$map = [];
$map[] = ['rid', '=', $rid];
$room_info = db::name('room')->where($map)->find();
if(!$room_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
//红包类型
$envelope_type_info = db::name('envelope_type')->find($type);
if(!$envelope_type_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
//金币是否充足
if($user_info['integral'] < $envelope_type_info['price']){
return ['code' => 201, 'msg' => '金币不足', 'data' => null];
}
$where = [];
$where[] = ['a.uid', '=', $uid];
$where[] = ['b.is_stop', '=', 2];
$red_envelope_log = db::name('user_red_envelope_log')->alias('a')->join('yy_red_envelope b', 'a.eid = b.id')->field('sum(b.money) as money')->where($where)->find();
$surplus_money = $user_info['integral'] - $red_envelope_log['money'];
if($envelope_type_info['price'] > $surplus_money){
return ['code' => 201, 'msg' => '金币不足', 'data' => null];
}
//是否有进行中的
$map = [];
$map[] = ['tid', '=', $type];
$map[] = ['is_finish', '=', 2];
$map[] = ['is_delete', '=', 1];
$map[] = ['is_stop', '=', 2];
$red_envelope_info = db::name('red_envelope')->where($map)->find();
if(!$red_envelope_info){
return ['code' => 201, 'msg' => '暂未开放', 'data' => null];
}
//开始十秒内无法抢红包
$time = time() - $red_envelope_info['add_time'];
if($time < 10){
return ['code' => 201, 'msg' => '请在开始十秒后再抢', 'data' => null];
}
//是否抢过该红包
$map = [];
$map[] = ['uid', '=', $uid];
$map[] = ['eid', '=', $red_envelope_info['id']];
$user_snatch_red_envelope = db::name('user_red_envelope_log')->where($map)->find();
if($user_snatch_red_envelope){
return ['code' => 201, 'msg' => '你已抢过该红包', 'data' => null];
}
//该红包数量是否剩余
$map = [];
$map[] = ['eid', '=', $red_envelope_info['id']];
$user_snatch_red_envelope_sum = db::name('user_red_envelope_log')->where($map)->count();
if($user_snatch_red_envelope_sum == $red_envelope_info['num']){
return ['code' => 201, 'msg' => '红包已被抢完', 'data' => null];
}
$config = get_uncache_system_config();
$redis = connectionRedis();
$user_red_envelope_id_list = [];
$is_open = 1;
if($type == 1){
$keyname = "silver:envelope:key:name:".$red_envelope_info['id'];
$envelope_num = $config['silver_envelope_num'];
if($config['open_silver_envelope'] != 1){
$is_open = 2;
}
}else if($type == 2){
$keyname = "gold:envelope:key:name:".$red_envelope_info['id'];
$envelope_num = $config['gold_envelope_num'];
if($config['open_gold_envelope'] != 1){
$is_open = 2;
}
}else if($type == 3){
$keyname = "drill:envelope:key:name:".$red_envelope_info['id'];
$envelope_num = $config['drill_envelope_num'];
if($config['open_drill_envelope'] != 1){
$is_open = 2;
}
}
Db::startTrans();
try {
//抢红包记录
$list_len = $redis->llen($keyname);
if($list_len = 0){
return ['code' => 201, 'msg' => '该轮红包已被抢完,请稍后', 'data' => null];
}
$snatch_price_data = $redis->blpop($keyname, 2);
if(empty($snatch_price_data)){
return ['code' => 201, 'msg' => '红包已被抢完', 'data' => null];
}
$snatch_price = $snatch_price_data[1];
$data = [];
$data['price'] = $snatch_price;
$user_red_envelope_id_list[] = $data;
//记录
$insert_data_log = [];
$insert_data_log['uid'] = $uid;
$insert_data_log['rid'] = $rid;
$insert_data_log['tid'] = $type;
$insert_data_log['eid'] = $red_envelope_info['id'];
$insert_data_log['money'] = $red_envelope_info['money'];
$insert_data_log['price'] = $red_envelope_info['price'];
$insert_data_log['snatch_price'] = $snatch_price;
$insert_data_log['envelope_price'] = $config['envelope_rate'] * $red_envelope_info['money'];
$insert_data_log['room_price'] = $room_info['envelope_rate'] * $snatch_price;
$insert_data_log['add_time'] = time();
$sid = db::name('user_red_envelope_log')->insertGetId($insert_data_log);
if(!$sid){
Db::rollback();
$this->redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//修改红包已开次数
$map = [];
$map[] = ['id', '=', $red_envelope_info['id']];
$map[] = ['open_num', '<', $red_envelope_info['num']];
$reslut = db::name('red_envelope')->where($map)->inc('open_num', 1)->update();
if(!$reslut){
Db::rollback();
$this->redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//抢红包收入
$resluts = model('admin/User')->change_user_money_by_user_info($user_info, $snatch_price, 2, 19, "抢红包收入", $uid, $sid, $rid);
if(!$resluts){
Db::rollback();
$this->redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//厅主收益
if($insert_data_log['room_price'] > 0){
$room_user_info = db::name('user')->find($room_info['room_owner_uid']);
$reslut = model('admin/User')->change_user_money_by_user_info($room_user_info, $insert_data_log['room_price'], 1, 20, "抢红包厅主流水", $uid, $sid, $rid);
if(!$reslut){
Db::rollback();
$this->redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
//是否最后一个红包
$where = [];
$where[] = ['eid', '=', $red_envelope_info['id']];
$red_envelope_list = db::name('user_red_envelope_log')->where($where)->order('snatch_price desc,id asc')->select();
if(count($red_envelope_list) == $red_envelope_info['num']){
//修改红包状态
$update_data = [];
$update_data['is_finish'] = 1;
$update_data['is_stop'] = 1;
$update_data['stop_time'] = time();
$reslut = db::name('red_envelope')->where('id', $red_envelope_info['id'])->update($update_data);
if(!$reslut){
Db::rollback();
$this->redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//找到手气最佳新生成一轮红包
foreach ($red_envelope_list as $k => $v){
if($k == 0){
//修改手气最佳
$update_data = [];
$update_data['is_lucky'] = 1;
$reslut = db::name('user_red_envelope_log')->where('id', $v['id'])->update($update_data);
if(!$reslut){
Db::rollback();
$this->redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//后台是否已关闭发红包功能
if($is_open == 1){
//发红包
$insert_data = [];
$insert_data['tid'] = $type;
$insert_data['uid'] = $v['uid'];
$insert_data['type'] = 2;
$insert_data['money'] = $envelope_type_info['price'];
$insert_data['price'] = $insert_data['money'] * (1 - $config['envelope_rate']);
$insert_data['num'] = $envelope_num;
$insert_data['add_time'] = time();
$sid = db::name('red_envelope')->insertGetId($insert_data);
if(!$sid){
Db::rollback();
$this->redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
$insert_user_info = db::name('user')->find($v['uid']);
//扣除发红包金币数
$resluts = model('admin/User')->change_user_money_by_user_info($insert_user_info, -$envelope_type_info['price'], 2, 18, "发红包支出", $v['uid'], $sid, $rid);
if(!$resluts){
Db::rollback();
$this->redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//生成红包队列
$redis->del($keyname);
if($type == 1){
$key_name = "silver:envelope:key:name:". $sid;
}else if($type == 2){
$key_name = "gold:envelope:key:name:" . $sid;
}else if($type == 3){
$key_name = "drill:envelope:key:name:" . $sid;
}
$envelope_price_array = model('Envelope')->red_envelope_create_money(1, 500, $envelope_num, $insert_data['price']);
$envelope_insert_data = $envelope_price_array;
array_unshift($envelope_insert_data, $key_name);
call_user_func_array([$redis, 'rPush'], $envelope_insert_data);
}
}
}
}
Db::commit();
//抢红包socket
$snatch_red_envelope = [];
$snatch_red_envelope['uid'] = $uid;
$snatch_red_envelope['rid'] = $rid;
$snatch_red_envelope['head_pic'] = localpath_to_netpath($user_info['head_pic']);
$snatch_red_envelope['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
$snatch_red_envelope['type'] = $type;
$snatch_red_envelope['type_name'] = $envelope_type_info['type_name'];
$snatch_red_envelope['num'] = $red_envelope_info['num'] - $red_envelope_info['open_num'] - 1;
$snatch_red_envelope['room_name'] = mb_convert_encoding(base64_decode($room_info['base64_room_name']), 'UTF-8', 'UTF-8');
$snatch_red_envelope['is_show_price'] = 2;
if(count($red_envelope_list) == $red_envelope_info['num']){
$red_envelope_over = [];
$where = [];
$where[] = ['a.eid', '=', $red_envelope_info['id']];
$user_red_envelope_log_list = db::name('user_red_envelope_log')->alias('a')->join('yy_user b', 'a.uid = b.uid')->join('yy_room c', 'a.rid = c.rid')->field('a.id,a.uid,a.rid,a.eid,a.snatch_price,b.head_pic,b.base64_nick_name,c.base64_room_name,a.is_lucky')->where($where)->order('a.id asc')->select();
foreach ($user_red_envelope_log_list as $k => $v){
$user_log_array = [];
$user_log_array['uid'] = $v['uid'];
$user_log_array['rid'] = $v['rid'];
$user_log_array['head_pic'] = localpath_to_netpath($v['head_pic']);
$user_log_array['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8');
$user_log_array['room_name'] = mb_convert_encoding(base64_decode($v['base64_room_name']), 'UTF-8', 'UTF-8');
$user_log_array['snatch_price'] = $v['snatch_price'];
$user_log_array['is_show_price'] = 1;
$user_log_array['is_lucky'] = $v['is_lucky'];
$red_envelope_over[] = $user_log_array;
}
//结束socket
$push_all_snatch_envelope_data = [];
$push_all_snatch_envelope_data['snatch_red_envelope'] = $snatch_red_envelope;
$push_all_snatch_envelope_data['red_envelope_over'] = $red_envelope_over;
$push_all_snatch_envelope_data['type'] = $type;
$push_all_snatch_envelope_data['type_name'] = $envelope_type_info['type_name'];
if($is_open == 1){
$push_all_snatch_envelope_data['is_open'] = 1;
$push_all_snatch_envelope_data['num'] = $envelope_num;
$push_all_snatch_envelope_data['second'] = 10;
}else{
$push_all_snatch_envelope_data['is_open'] = 2;
$push_all_snatch_envelope_data['num'] = 0;
$push_all_snatch_envelope_data['second'] = 0;
}
$push_data = [];
$push_data['code'] = 412;
$push_data['msg'] = '抢红包结束数据播报';
$push_data['data'] = $push_all_snatch_envelope_data;
model('api/WebSocketPush')->send_to_all($push_data);
}else{
$push_data = [];
$push_data['code'] = 411;
$push_data['msg'] = '抢红包数据播报';
$push_data['data'] = $snatch_red_envelope;
model('api/WebSocketPush')->send_to_all($push_data);
}
$snatch_red_envelope['integral'] = db::name('user')->where('uid', $uid)->value('integral');
return ['code' => 200, 'msg' => '成功', 'data' => $snatch_red_envelope];
} catch (\Exception $e) {
// 回滚事务
dump($e);
Db::rollback();
$this->redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list);
return ['code' => 201, 'msg' => '失败', 'data' => null];
}
}
//返还用户抽中红包金额到队列
private function redis_envelope_data_rollback($redis, $keyname, $user_red_envelope_id_list)
{
$insert_data = [];
foreach ($user_red_envelope_id_list as $k => $v) {
$insert_data[] = $v['price'];
}
if (!empty($insert_data)) {
array_unshift($insert_data, $keyname);
//右侧取 右侧插入
call_user_func_array([$redis, 'lPush'], $insert_data);
}
return ['code' => 200, 'msg' => '返还成功', 'data' => null];
}
//红包记录信息
public function red_envelope_info($uid, $type){
$user_info = db::name('user')->find($uid);
if(!$user_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
$data = [];
//最新红包记录
$map = [];
$map[] = ['is_delete', '=', 1];
$map[] = ['is_finish', '=', 2];
$map[] = ['is_stop', '=', 2];
$map[] = ['tid', '=', $type];
$red_envelope_info = db::name('red_envelope')->where($map)->order('id desc')->limit(1)->find();
if($red_envelope_info){
$user_red_envelope_log_list = db::name('user_red_envelope_log')->alias('a')->join('yy_user b', 'a.uid = b.uid')->join('yy_room c', 'a.rid = c.rid')->where('a.eid', $red_envelope_info['id'])->field('a.id, a.uid, a.rid, a.eid, b.head_pic,b.base64_nick_name,c.base64_room_name')->order('a.id asc')->select();
foreach ($user_red_envelope_log_list as $k => &$v){
$v['head_pic'] = localpath_to_netpath($v['head_pic']);
$v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8');
$v['room_name'] = mb_convert_encoding(base64_decode($v['base64_room_name']), 'UTF-8', 'UTF-8');
$v['is_show_price'] = 2;
}
$data['red_envelope_list'] = $user_red_envelope_log_list;
}else{
$data['red_envelope_list'] = [];
}
//前一次红包记录
$map = [];
$map[] = ['is_delete', '=', 1];
$map[] = ['is_stop', '=', 1];
$map[] = ['tid', '=', $type];
$last_red_envelope_info = db::name('red_envelope')->where($map)->order('id desc')->limit(1)->find();
// dump($last_red_envelope_info);
if($last_red_envelope_info){
$user_red_envelope_log_lists = db::name('user_red_envelope_log')->alias('a')->join('yy_user b', 'a.uid = b.uid')->join('yy_room c', 'a.rid = c.rid')->where('a.eid', $last_red_envelope_info['id'])->field('a.id, a.uid, a.rid, a.eid,a.snatch_price,a.is_lucky, b.head_pic,b.base64_nick_name,c.base64_room_name')->order('a.id asc')->select();
foreach ($user_red_envelope_log_lists as $a => &$b){
$b['head_pic'] = localpath_to_netpath($b['head_pic']);
$b['nick_name'] = mb_convert_encoding(base64_decode($b['base64_nick_name']), 'UTF-8', 'UTF-8');
$b['room_name'] = mb_convert_encoding(base64_decode($b['base64_room_name']), 'UTF-8', 'UTF-8');
$b['is_show_price'] = 2;
}
// dump($user_red_envelope_log_lists);
$user_red_envelope_list = db::name('user_red_envelope_log')->alias('a')->join('yy_user b', 'a.uid = b.uid')->join('yy_room c', 'a.rid = c.rid')->where('a.eid', $last_red_envelope_info['id'])->field('a.id, a.uid, a.rid, a.eid,a.snatch_price,a.is_lucky, b.head_pic,b.base64_nick_name,c.base64_room_name')->order('a.id asc')->select();
foreach ($user_red_envelope_list as $x => &$y){
$y['head_pic'] = localpath_to_netpath($y['head_pic']);
$y['nick_name'] = mb_convert_encoding(base64_decode($y['base64_nick_name']), 'UTF-8', 'UTF-8');
$y['room_name'] = mb_convert_encoding(base64_decode($y['base64_room_name']), 'UTF-8', 'UTF-8');
$y['is_show_price'] = 1;
}
$data['last_red_envelope_list'] = array_merge($user_red_envelope_log_lists, $user_red_envelope_list);
}else{
$data['last_red_envelope_list'] = [];
}
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
//红包规则
public function envelope_note(){
$envelope_note = get_system_config('envelope_note');
return ['code' => 200, 'msg' => '获取成功', 'data' => $envelope_note];
}
//用户抢红包记录
public function user_red_envelope_log_list($uid, $type, $page, $page_limit){
$page = intval($page);
$page_limit = $page_limit < 30 ? $page_limit : 30;
$map = [];
$map[] = ['a.uid', '=', $uid];
$map[] = ['a.tid', '=', $type];
$list = db::name('user_red_envelope_log')->alias('a')->join('yy_user b', 'a.uid = b.uid')->join('yy_room c', 'a.rid = c.rid')->field('a.id,a.uid,a.rid,a.tid,a.snatch_price,b.head_pic,b.base64_nick_name,c.base64_room_name')->where($map)->order('id desc')->page($page, $page_limit)->select();
foreach ($list as $k => &$v){
$v['head_pic'] = localpath_to_netpath($v['head_pic']);
$v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8');
$v['room_name'] = mb_convert_encoding(base64_decode($v['base64_room_name']), 'UTF-8', 'UTF-8');
}
return ['code' => 200, 'msg' => '获取成功', 'data' => $list];
}
//限时结束
public function red_envelope_time_limit(){
$config = get_uncache_system_config();
Db::startTrans();
try {
if($config['envelope_sustain_duration'] != 0){
//是否有已开宝藏
$map = [];
$map[] = ['is_stop', '=', 2];
$map[] = ['is_delete', '=', 1];
$red_envelope_list = db::name('red_envelope')->where($map)->select();
if($red_envelope_list){
foreach ($red_envelope_list as $k => $v){
//是否超时
$time = time() - $v['add_time'];
if($time > $config['envelope_sustain_duration']){
$red_envelope_log_list = db::name('user_red_envelope_log')->alias('a')->join('yy_user b', 'a.uid = b.uid')->join('yy_room c', 'a.rid = c.rid')->field('a.id,a.uid,a.rid,a.eid,a.snatch_price,b.head_pic,b.base64_nick_name,c.base64_room_name,a.is_lucky')->where('eid', $v['id'])->order('id asc')->select();
if(count($red_envelope_log_list) != $v['num']){
//修改宝藏状态
$update_data = [];
$update_data['is_stop'] = 1;
$update_data['stop_time'] = time();
$reslut = db::name('red_envelope')->where('id', $v['id'])->update($update_data);
if($reslut){
//发布socekt
$snatch_red_envelope = [];
$snatch_red_envelope['uid'] = 0;
$red_envelope_over = [];
if(!empty($red_envelope_log_list)){
foreach ($red_envelope_log_list as $a => $b){
$user_log_array = [];
$user_log_array['uid'] = $b['uid'];
$user_log_array['rid'] = $b['rid'];
$user_log_array['head_pic'] = localpath_to_netpath($b['head_pic']);
$user_log_array['nick_name'] = mb_convert_encoding(base64_decode($b['base64_nick_name']), 'UTF-8', 'UTF-8');
$user_log_array['room_name'] = mb_convert_encoding(base64_decode($b['base64_room_name']), 'UTF-8', 'UTF-8');
$user_log_array['snatch_price'] = $b['snatch_price'];
$user_log_array['is_show_price'] = 1;
$user_log_array['is_lucky'] = $b['is_lucky'];
$red_envelope_over[] = $user_log_array;
}
}
$push_all_snatch_envelope_data = [];
$push_all_snatch_envelope_data['snatch_red_envelope'] = $snatch_red_envelope;
$push_all_snatch_envelope_data['red_envelope_over'] = $red_envelope_over;
$push_all_snatch_envelope_data['type'] = $v['tid'];
$push_all_snatch_envelope_data['type_name'] = db::name('envelope_type')->where('id', $v['tid'])->value('type_name');
$push_all_snatch_envelope_data['is_open'] = 2;
$push_all_snatch_envelope_data['num'] = 0;
$push_all_snatch_envelope_data['second'] = 0;
$push_data = [];
$push_data['code'] = 412;
$push_data['msg'] = '抢红包结束数据播报';
$push_data['data'] = $push_all_snatch_envelope_data;
model('api/WebSocketPush')->send_to_all($push_data);
}
}
}
}
}
}
Db::commit();
return ['code' => 200, 'msg' => '成功', 'data' => null];
} catch (\Exception $e) {
// 回滚事务
dump($e);
Db::rollback();
return ['code' => 201, 'msg' => '失败', 'data' => null];
}
}
}