redisonfig; $obj = $this; go(function () use ($redisconfig, $obj) { $redis = new Swoole\Coroutine\Redis(); $redis->connect($redisconfig['host'], $redisconfig['port']); $data = $redis->rpop(self::TASKQNUM); if (empty($data)) { return; } $data = json_decode($data, true); list($order_ids, $bettype, $settype, $game_code, $match_id, $change_status) = [$data['ids'], $data['bettype'], $data['settype'], $data['game_code'], $data['match_id'], $data['change_status']]; if (!($Pdata = $obj->DataPre($order_ids, $bettype, $settype, $game_code, $match_id, $change_status))) { echo "DataPre errOr \n"; return; } $sql0 = $obj->UndoSettlement(array_merge($Pdata, ['bettype' => $bettype])); $pars = []; if ($bettype == 1) { $sql = $obj->singOrder($pars); } else { $sql = $obj->ChuanOrder($pars);; } $obj->PushSqlToArray($sql0); $obj->PushSqlToArray($sql); }); unset($obj); } private function SettelementToRedis($serv, $task) { $order_id = $task['order_id']; $bet_type = $task['bet_type']; $table = ($bet_type == 1) ? "money_buy_simplex" : 'money_buy_str'; try { if ($task['bet_type'] == 1) { $this->singOrder($serv, $task); } else { $this->ChuanOrder($serv, $task); } } catch (\Exception $e) { $e = str_replace(";", ";", $e->getMessage()); $sql = "update $table set remark='$e' where order_id='$order_id' "; $this->PushSqlToArray($sql); unset($sql, $e); } unset($order_id, $bet_type, $table); } /** * 单式注单结算 * @param mixed $order_id 注单ID */ private function singOrder($task) { return; $matchDatas = $task['matchDatas']; $simplexData = $task['simplexData']; $account_identity = $simplexData->account_identity; $bet_type = $task['bet_type']; $order_id = $task['order_id']; $match_id = $task['match_id']; $game_code = $task['game_code']; $account = $task['account']; $money_prize = $task['money_prize']; foreach ($matchDatas as $val) { if (!in_array($val->result, [-1, 1, 2, 3, 4])) { throw new \Exception('match比赛结果异常或还没有输赢结果->' . $val->id); } } if (empty($this->SettlementBaseObj)) { $settlementBase = new \App\Lib\Settlement\SettlementBase(); } else { $settlementBase = $this->SettlementBaseObj; } $returnMoney = 0; $oddsResult = []; foreach ($matchDatas as $k => $v) { if ($v->result == -1) { continue; } $oddsResult[0]['winOrLose'] = $v->result; $oddsResult[0]['odds'] = $v->odds; $getReturnMoney = $settlementBase->stringOdds($oddsResult); $returnMoney += $getReturnMoney['returnMoney'] * $v->bet_money; } $returnMoney = sprintf("%.2f", substr(sprintf("%.3f", $returnMoney), 0, -1)); // 判断盈亏 1 赢 2 输 3 平 $game_status = $returnMoney > $simplexData->money ? 1 : ($returnMoney == $simplexData->money ? 3 : 2); // 修改投注表状态及盈亏 $this->PushSqlToArray(["update money_buy_simplex set settle_status=2, game_status=$game_status,gain_money=$returnMoney where order_id='$order_id' "]); $this->WriteOrAddSettlement($game_code, $match_id, $bet_type, $order_id, $account_identity, $returnMoney); $this->insertData( $order_id, $returnMoney, $account_identity, 1, $game_code, $simplexData->info_identity, $simplexData->money, $match_id, $account, $money_prize ); unset($matchDatas, $simplexData, $account_identity, $bet_type, $order_id, $match_id, $game_code, $account, $money_prize, $returnMoney); } private function WriteOrAddSettlement($game_code, $match_id, $bet_type, $order_id, $account_ident, $money) { if (intval($money * 100) == 0) { return; } if ($this->set_type == 2 && isset($this->settlement_middle_detail_array[$bet_type][$order_id])) { $this->PushSqlToArray("update settlement_middle_detail set money=$money where game_code='$game_code' and bet_type=$bet_type and order_id='$order_id' "); } else { $this->PushSqlToArray("insert into settlement_middle_detail(game_code,match_id,account_identity,bet_type,order_id,money) values('$game_code','$match_id','$account_ident',$bet_type,'$order_id',$money)"); } return true; } private function ChuanOrder($task) { $matchDatas = $task['matchDatas']; $simplexData = $task['simplexData']; $account_identity = $simplexData->account_identity; $bet_type = $task['bet_type']; $order_id = $task['order_id']; $match_id = $task['match_id']; $game_code = $task['game_code']; $account = $task['account']; $money_prize = $task['money_prize']; foreach ($matchDatas as $val) { if (!in_array($val->result, [-1, 1, 2, 3, 4])) { throw new \Exception('match比赛结果异常或还没有输赢结果->' . $val->id); } } $batch_id = $simplexData->batch_id; $matchModels = $matchDatas; if (count($matchModels) <= 0) { throw new \Exception('match 数据异常-' . $batch_id); } if (empty($this->SettlementBaseObj)) { $settlementBase = new \App\Lib\Settlement\SettlementBase(); } else { $settlementBase = $this->SettlementBaseObj; } $newTime = date('Y-m-d H:i:s'); if ($simplexData->status == 1) { $in_array = []; foreach ($matchModels as $val) { if (!in_array($val->result, [-1, 1, 2, 3, 4])) { throw new \Exception('match 比赛结果异常或还没有输赢结果->' . $val->id); } if ($val->result == -1) { $this->PushSqlToArray("update money_buy_str set wait_match_num=0, prize_note=0, game_status=3, settle_status=2, gain_money=0,settlementTime='" . date('Y-m-d H:i:s') . "' where batch_id='$batch_id' "); return true; } $in_array[] = ['odds' => $val->odds, 'winOrLose' => $val->result]; } $chuanNum = intval(substr($simplexData->str_type, 0, 1)); $lasPeilv = $settlementBase->stringComputing([$in_array, $chuanNum]); $money = floatPointDigit($this->BuyDatasMainModel->money * $lasPeilv); unset($chuanNum, $lasPeilv); } else { $money = $simplexData->money; } $this->PushSqlToArray(" update money_buy_str set settle_status=2 , game_status=1 , settlementTime='$newTime' , gain_money=$money where order_id = '$order_id'"); $this->WriteOrAddSettlement($this->game_code, $this->match_id, $this->orderType, $order_id, $this->BuyDatasMainModel->account_identity, $money); $this->insertData($order_id, $money, $this->BuyDatasMainModel->account_identity, 2, $val->game_code, $this->BuyDatasMainModel->info_identity, $this->BuyDatasMainModel->money, $this->match_id, $account, $money_prize); unset($matchDatas, $simplexData, $account_identity, $bet_type, $order_id, $match_id, $game_code, $account, $money_prize, $money); return true; } /** * 结算数据填入 * @param mixed $order_id 注单ID * @param mixed $returnMoney 返现金额 * @param mixed $account_identity 用户ID * @param mixed $type 1单式 2串式 * @param mixed $game_name 游戏名(zq,lq) * @param mixed $buy_identity 游戏投注id * @param mixed $money 投注金额 * @param mixed $match_id 赛场ID */ private function insertData($order_id, $returnMoney, $account_identity, $type, $game_name, $buy_identity, $money, $match_id = 0, $account = '', $money_prizeID = 0) { // 添加流水记录 $info_identity = UUID(); $money_time = date('Y-m-d H:i:s', time()); $trade_desc = $type == 1 ? '单式投注订单回款' : '串式投注订单回款'; $reason = $type == 1 ? '单式投注订单回款' : '串式投注订单回款'; $sql = "insert into money_details(info_identity,trade_id,account_name,account_identity,money,money_time,money_type,money_cash,trade_type,trade_desc,reason,sysetem_user,status) values("; $sql .= "'$info_identity','$order_id','$account','$account_identity',$returnMoney,'$money_time',1,0,4,'$trade_desc','$reason','系统',1)"; $this->PushSqlToArray($sql); // 修改用余额 $this->PushSqlToArray("update account_detailed set available_cash=available_cash+$money,cash=cash+$money where account_identity='$account_identity' "); // 新增用户中奖信息 $content = $type == 1 ? '您的单式投注订单' . $order_id . '于' . $money_time . '成功回款' . $returnMoney . '该次投注流程结束,如有疑问请联系客服' : '您的串式投注订单' . $order_id . '于' . $money_time . '成功回款' . $returnMoney . '该次投注流程结束,如有疑问请联系客服'; $sql = "insert into account_news(identity,account_identity,title,content,details,write_time,read_status,type) values "; $sql .= "('$info_identity','$account_identity','投注订单回款通知','$content','$content','$money_time',-1,1)"; $this->PushSqlToArray($sql); // 新增中奖记录表 $table = 'money_prize'; if ($money_prizeID) { $this->PushSqlToArray("update $table set money=$money,prize_money=$returnMoney, get_money= $returnMoney - $money where id=$money_prizeID"); } else { $sql = "insert into $table (info_identity,order_id,account_identity,account_name,game_name,buy_identity,money,money_time,status,prize_money,get_money) values "; $sql .= "('$info_identity','$order_id','$account_identity','$account','$game_name','$buy_identity',$money,'$money_time',1,$returnMoney,$returnMoney - $money)"; $this->PushSqlToArray($sql); } unset($info_identity, $money_time, $trade_desc, $reason, $content, $sql); return true; } private function resetPDatas() { $bettype = $this->PDatas['bettype']; $settype = $this->PDatas['settype']; $game_code = $this->PDatas['game_code']; $match_id = $this->PDatas['match_id']; $this->PDatas = []; $this->PDatas['bettype'] = $bettype; $this->PDatas['settype'] = $settype; $this->PDatas['game_code'] = $game_code; $this->PDatas['match_id'] = $match_id; return; } //数据预批量获取 private function DataPre($order_ids, $bettype, $settype, $game_code, $match_id, $change_status) { if ($bettype == 1) { $moneytable = 'money_buy_simplex'; $ret = DB::table($moneytable)->where(['game_code' => $game_code, 'match_id' => $match_id])->whereIn('order_id', $order_ids)->get(); } else { $moneytable = 'money_buy_str'; $ret = DB::table($moneytable)->whereIn('order_id', $order_ids)->get(); } if (empty($ret) || count($ret) <= 0) { return false; } foreach ($ret as $val) { $PDatas['Money_buy_Orders_Array'][$val->order_id] = $val; $orderarr[] = $val->order_id; $PDatas['Money_buy_Orders_batch_Array'][$val->batch_id][] = $val; $tmpbatchid[] = $val->batch_id; $userindentys[] = $val->account_identity; } $tmpbatchid = array_unique($tmpbatchid); $userindentys = array_unique($userindentys); if ($bettype == 1) { $ret = DB::table('money_buy_match')->where(['game_code' => $game_code, 'match_id' => $match_id])->whereIn('batch_id', $tmpbatchid)->get(); } else { $ret = DB::table('money_buy_match')->where(['game_code' => $game_code])->whereIn('batch_id', $tmpbatchid)->get(); } foreach ($ret as $val) { $PDatas['Money_buy_Match_array'][$val->batch_id][] = $val; } $ret = DB::table('account_detailed')->whereIn('account_identity', $userindentys)->get(); foreach ($ret as $val) { $PDatas['account_indentity_map_array'][$val->account_identity] = $val; } $ret = DB::table('account')->whereIn('identity', $userindentys)->get(); foreach ($ret as $val) { $PDatas['account_map_array'][$val->identity] = $val; } if ($settype == 2) { $ret = DB::table('settlement_middle_detail')->where(['game_code' => $game_code, 'match_id' => $match_id])->whereIn('order_id', $order_ids)->get(); if ($ret) { foreach ($ret as $val) { $PDatas['settlement_middle_detail_array'][$val->bet_type][$val->order_id] = $val; } } $order_str_1 = array_map(function ($item) { return "'$item'"; }, $orderarr); $order_str = implode(",", $order_str_1); if ($change_status) { if ($bettype == 1) { $sql_tmp = "update $moneytable set settle_status=1, gain_money=0, game_status=0 where game_code='$game_code' and match_id=$match_id and status=1 and order_id in ($order_str) "; } else { $sql_tmp = "update $moneytable set settle_status=1, gain_money=0 where order_id in ($order_str) "; } $this->PushSqlToArray($sql_tmp); unset($sql_tmp); } } $ret = DB::table('money_prize')->whereIn('order_id', $order_ids)->get(); if ($ret) { foreach ($ret as $val) { $PDatas['money_prize_map'][$val->order_id] = $val; } } unset($ret, $tmpbatchid, $userindentys, $moneytable); return $PDatas; } private function requestpara($request, $response, $paras) { $idoarr = explode(",", $paras['order_ids']); $order_ids = array_map(function ($i) { return strval($i); }, $idoarr); $bettype = isset($paras['bettype']) ? $paras['bettype'] : 0; $settype = isset($paras['settype']) ? $paras['settype'] : 0; $game_code = isset($paras['game_code']) ? $paras['game_code'] : ''; $match_id = isset($paras['match_id']) ? $paras['match_id'] : 0; $change_status = isset($paras['change_status']) ? $paras['change_status'] : 0; if (intval($match_id) <= 0) { throw new \Exception('赛事ID不能为空!'); return; } if (empty($game_code)) { throw new \Exception('赛事类型不能为空!'); } if (!in_array($bettype, [1, 2])) { throw new \Exception('订单类型参数错误!'); } if (!in_array($settype, [1, 2])) { throw new \Exception('结算参数错误'); } $this->PDatas['bettype'] = $bettype; $this->PDatas['settype'] = $settype; $this->PDatas['game_code'] = $game_code; $this->PDatas['match_id'] = $match_id; $ret = [$order_ids, $bettype, $settype, $game_code, $match_id, $change_status]; unset($bettype, $idoarr, $settype, $game_code, $match_id, $change_status); return $ret; } private function getSBaseObj() { if (empty($this->SettlementBase)) { $this->SettlementBase = new SettlementBase(); } return $this->SettlementBase; } //改状态 private function cgStatus($game_code, $match_id, $change_status) { $table1 = "st_" . $game_code . "_result"; $table2 = "st_" . $game_code . "_competition"; if ($change_status) { $this->PushSqlToArray("update $table1 set status=3 where match_id=$match_id "); $this->PushSqlToArray("update $table2 set status=3 where match_id=$match_id "); } unset($table1, $table2); } //得么一个临时变量 private function GP($name) { return $this->PDatas[$name]; } private function Match_check($idsArray, $betType) { array_walk($idsArray, function (&$item, $key) { $item = "'" . $item . "'"; }); $idString = implode(",", $idsArray); $table = "money_buy_simplex"; $sql = "select game_code,match_id from $table where status=1 and order_id in ($idString) group by game_code,match_id "; $ret = DB::select($sql); return $ret; } //重结算时,要先扣掉先前发的钱 private function UndoSettlement($PDatas) { return; if (empty($PDatas['settlement_middle_detail_array'])) { return true; } $bet_type = $PDatas('bettype'); $nowArray = $PDatas['settlement_middle_detail_array'][$bet_type]; foreach ($nowArray as $order => $val) { $money = abs(floatval($val->money)); $acc = $val->account_identity; $sql1 = "update account_detailed set cash=cash-$money where identity='$acc' "; $sql2 = "update money_prize set prize_money=0,get_money=0 where order_id='$val->order_id' and account_identity='$acc'"; $sqlArray[] = $sql1; $sqlArray[] = $sql2; $ids[] = $order; } $ids = array_map(function ($i) { return "'.$i.'"; }, $ids); $ids_array = implode(",", $ids); $sql = "update settlement_middle_detail set money=0 where order_id in($ids_array) and bet_type=$bet_type "; $sqlArray[] = $sql; unset($nowArray, $bet_type, $ids, $ids_array, $sql); return $sqlArray; } private function getOrders($bet_type, $game_code, $match_id) { if ($bet_type == 1) { $table = 'money_buy_simplex'; $ret = DB::table($table)->select('order_id')->where(['game_code' => $game_code, 'match_id' => $match_id])->get(); } else { $table = 'money_buy_str'; $ret = DB::table($table)->select('order_id')->whereRaw(" batch_id in ( select batch_id from money_buy_match where match_id=$match_id and game_code='$game_code' and bet_type=2 )")->get(); } $return = []; if ($ret) { foreach ($ret as $val) { $return[] = $val->order_id; } } return implode(',', $return); } }