hy-farm/muchang/home/controllers/DealController.php
2026-05-29 19:54:56 +08:00

879 lines
33 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: zn
* Date: 2017/6/14
* Time: 14:19
*/
namespace app\controllers;
use common\models\Deal;
use common\models\Item;
use common\models\DealData;
use common\models\User;
use common\models\UserLog;
use common\modules\systemlog\SystemLogUtil;
use common\services\ClientMessageServices;
use common\services\GameConfigServices;
use common\services\DealService;
use common\services\ItemServices;
use common\services\MessageServices;
use common\services\ResultStatusServices;
use common\services\UserService;
use common\services\UserLogService;
use common\utils\EnumUtil;
use Yii;
use yii\rest\Controller;
/**
* 交易
* Class DealController
* @package app\controllers
*/
class DealController extends Controller
{
/**
* 发起交易
* @return mixed
*/
public function actionDeal()
{
$userID = Yii::$app->request->get('user_id');
$beUserID = Yii::$app->request->get('be_user_id');//受赠用户ID
$type = Yii::$app->request->get('type');//类型
$gold = Yii::$app->request->get('gold');//赠送金币
$item_list = Yii::$app->request->get('item_list');//赠送物品列表
$payPassword = Yii::$app->request->get('pay_password');//支付密码
if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录
if (!isset($beUserID) || !in_array($type, EnumUtil::DEAL_TYPE_LIST) || empty($payPassword))
return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARSE_PARAM_ERROR);
$userDbData = User::findById($userID);
if($userDbData['isjihuo']==0){
return ClientMessageServices::sendMessage('请先激活账号');
}
//给自己交易
if ($userID == $beUserID)
return ClientMessageServices::sendMessage(ResultStatusServices::RS_DEAL_SELF_ERROR);
if ($type == EnumUtil::DEAL_TYPE_PERSENT_MONEY && (empty($gold) || $gold <= 0))
return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARSE_PARAM_ERROR);
if ($type == EnumUtil::DEAL_TYPE_PERSENT_ITEM && count($item_list) == 0)
return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARSE_PARAM_ERROR);
//检查是否在线
// if (!UserService::isOnline($beUserID))
// return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_OFFLINE);
//检查受赠用户是否存在
if (empty(User::findById($beUserID)))
return ClientMessageServices::sendMessage(ResultStatusServices::RS_DEAL_BE_USER_NOT_EXIST);
//检查支付密码
$userDbData = User::findById($userID);
if (!$userDbData->validatePayPassword($payPassword))
return ClientMessageServices::sendMessage(ResultStatusServices::RS_PYA_PASSWORD_ERROR);
// if ($userDbData->level < 2)
// return ClientMessageServices::sendMessage(ResultStatusServices::RS_LEVEL_LIMIT);
$dbTrans = Yii::$app->db->beginTransaction();
try {
$data = new DealData();
if ($type == EnumUtil::DEAL_TYPE_PERSENT_MONEY) {
//赠送金钱
$log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_GOLD, -$gold, 0, SystemLogUtil::FROM_TYPE_DEAL_PAY, []);
$rs = UserService::checkAndModifyMoney($userID, false, -$gold, 0, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs);
$data->gold = $gold;
$log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_GOLD, $gold, 0, SystemLogUtil::FROM_TYPE_DEAL_GET, []);
$rs = UserService::checkAndModifyMoney($beUserID, true, $gold, 0, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs);
} elseif ($type == EnumUtil::DEAL_TYPE_PERSENT_ITEM) {
// //赠送物品
// $list = [];
// foreach ($item_list as $item) {
//
// $itemID = $item['item_id'];
//// $num = intval($item['num']) * 100;//数量以100为单位
// $num = intval($item['num']);//数量以100为单位
// if (empty($num) || $num < 0) ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR);
//
// $data->addItem($itemID, $num);
//
// $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, -$num, SystemLogUtil::FROM_TYPE_DEAL_PAY, []);
// $rs = ItemServices::checkAndModifyNum($userID, $itemID, false, -$num, $log);
// if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs);
// }
}
//记录交易
$deal = new Deal();
$deal->from_user_id = $userID;
$deal->be_user_id = $beUserID;
$deal->type = $type;
$deal->data = json_encode($data);
if (!$deal->save()) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR);
//向客户端发送消息
MessageServices::addDealMessage($beUserID, $deal->id, EnumUtil::MESSAGE_CONFIRM_BE_USER_DEAL);
$success = true;
} finally {
if (isset($success))
$dbTrans->commit();
else {
$dbTrans->rollBack();
Yii::$app->redis->clearDirtyKey();//清除脏缓存数据
}
}
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS,User::findById($userID)->genClientData(false));
}
public function actionProductlist(){
//获取数据
$Code = $_GET['token'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'用户不存在');
return $json;
}
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
$tradelist = GameConfigServices::getParamByPath('trade_list');
foreach($tradelist as $k => $v){
$findone=Deal::find()->where(['itemid'=>$v['itemid'],'daytime'=>$beginToday])->orderBy(["id" => SORT_DESC])->one();
if(!empty($findone)){
$tradelist[$k]['HighestPrice']=$findone['HighestPrice'];
$tradelist[$k]['LowestPrice']=$findone['LowestPrice'];
}else{
$tradelist[$k]['HighestPrice']=0;
$tradelist[$k]['LowestPrice']=0;
}
$dealinfo=Deal::find()->where(['itemid'=>$v['itemid']])->orderBy(["id" => SORT_DESC])->one();
if(!empty($dealinfo)){
$find=Deal::find()->where(['itemid'=>$tradeinfo['itemid']])->orderBy(["id" => SORT_ASC]);
$find->andWhere(['>', 'created_at',$beginToday]);
$dealinfo2= $find->one();
if(!empty($dealinfo2)){
$tradelist[$k]['nowOpen']=$dealinfo2['price'];
}else{
$tradelist[$k]['nowOpen']=$dealinfo['price'];
}
}else{
$tradelist[$k]['nowOpen']=$v['startprice'];
}
$dealinfo1=Deal::find()->where(['itemid'=>$v['itemid']])->orderBy(["id" => SORT_DESC])->one();
if(!empty($dealinfo1)){
$tradelist[$k]['buyprice']=$dealinfo1['price'];
}else{
$tradelist[$k]['buyprice']=$v['startprice'];
}
$count=Deal::find()->where(['complete'=>'1','del'=>'0','itemid'=>$v['itemid']])->orderBy(["id" => SORT_DESC])->count();
if(!empty($count)){
$tradelist[$k]['successNum']=$count;
}else{
$tradelist[$k]['successNum']=0;
}
}
$json = array('code' =>0, 'data' =>$tradelist);
return $json;
}
public function actionGetmakertinfo(){
//获取数据
$Code = $_POST['token'];
$id = $_POST['sid'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'用户不存在');
return $json;
}
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'用户不存在');
return $json;
}
$tradeinfo = GameConfigServices::getParamByPath('trade_list.'.$id);
$itemID=$tradeinfo['itemid'];
$iteminfo=Item::find()->where(['user_id'=>$userData['id'],'item_id'=>$tradeinfo['itemid']])->orderBy(["id" => SORT_DESC])->one();
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
$find=Deal::find()->where(['itemid'=>$tradeinfo['itemid']])->orderBy(["id" => SORT_ASC]);
$find->andWhere(['>', 'created_at',$beginToday]);
$dealinfo = $find->one();
$dealinfo1=Deal::find()->where(['itemid'=>$tradeinfo['itemid']])->orderBy(["id" => SORT_DESC])->one();
if(!empty($dealinfo)){
$tradeinfo['nowOpen']=$dealinfo['price'];
}else{
$tradeinfo['nowOpen']=$dealinfo1['price'];
if($tradeinfo['nowOpen']==0){
$tradeinfo['nowOpen']=$tradeinfo['startprice'];
}
}
if(!empty($dealinfo1)){
$tradeinfo['buyprice']=$dealinfo1['price'];
}else{
$tradeinfo['buyprice']=$tradeinfo['startprice'];
}
$max=Deal::find()->where(['itemid'=>$tradeinfo['itemid']])->orderBy(["price" => SORT_DESC])->one();
$min=Deal::find()->where(['itemid'=>$tradeinfo['itemid']])->orderBy(["price" => SORT_ASC])->one();
$tradeinfo['successNum']=Deal::find()->where(['complete'=>'1','del'=>'0','itemid'=>$tradeinfo['itemid']])->count();
$tradeinfo['gold']=$userData['gold'];
$tradeinfo['HighestPrice']=$max['price'];
$tradeinfo['LowestPrice']=$min['price'];
$tradeinfo['num']=$iteminfo['num'];
$tradeinfo['fee']=$tradeinfo['poundage'];
$tradeinfo['riseStop']=$tradeinfo['nowOpen']+$tradeinfo['rise'];
$tradeinfo['fallStop']=$tradeinfo['nowOpen']-$tradeinfo['fall'];
$data['marketinfo']=$tradeinfo;
$json = array('code' =>0, 'data' =>$data);
return $json;
}
public function actionNewentrust(){
//获取数据
$Code = $_GET['token'];
$id = $_GET['sid'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'用户不存在');
return $json;
}
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'用户不存在');
return $json;
}
$tradeinfo = GameConfigServices::getParamByPath('trade_list.'.$id);
$itemID=$tradeinfo['itemid'];
$find=Deal::find()->where(['itemid'=>$tradeinfo['itemid'],'state'=>'buy','complete'=>0])->orderBy(["id" => SORT_DESC])->limit(5);
$buylist = $find->all();
$find1=Deal::find()->where(['itemid'=>$tradeinfo['itemid'],'state'=>'sell','complete'=>0])->orderBy(["id" => SORT_DESC])->limit(5);
$selllist = $find1->all();
$data['buy']=$buylist;
$data['sell'] = $selllist;
if (empty($data)){$data = '';}
$json = array('code' =>0, 'data' =>$data);
return $json;
}
public function actionGetentrust(){
//获取数据
$Code = $_GET['token'];
$id = $_GET['sid'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'用户不存在');
return $json;
}
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'用户不存在');
return $json;
}
$tradeinfo = GameConfigServices::getParamByPath('trade_list.'.$id);
$itemID=$tradeinfo['itemid'];
$deallist=Deal::find()->where(['from_user_id'=>$userData['id'],'complete'=>0])->orderBy(["id" => SORT_DESC])->all();
$data['newlist']=$deallist;
$deallist1=Deal::find()->where(['from_user_id'=>$userData['id'],'complete'=>1])->orderBy(["id" => SORT_DESC])->all();
$data['oldlist']=$deallist1;
$json = array('code' =>0, 'data' =>$data);
return $json;
}
public function actionProduct(){
//获取数据
$Code = $_GET['token'];
$id = $_GET['pid'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'用户不存在');
return $json;
}
$tradeinfo = GameConfigServices::getParamByPath('trade_list.'.$id);
$itemID=$tradeinfo['itemid'];
$find=Deal::find()->where(['itemid'=>$tradeinfo['itemid']])->orderBy(["id" => SORT_DESC])->limit(10);
$find->andWhere(['>', 'daytime',0]);
$deallist = $find->all();
foreach($deallist as $k => $v){
$data['KLineList'][] =array(
'Date' => $v['daytime'],
'OpeningPrice' => $v['OpeningPrice'],
'ClosingPrice' => $v['ClosingPrice'],
'HighestPrice' => $v['HighestPrice'],
'LowestPrice' => $v['LowestPrice'],
'Volume' => $v['daycount'],
);
}
$json = array('code' =>0, 'data' =>$data);
return $json;
}
public function actionTimeshare(){
//获取数据
$Code = $_POST['token'];
$id = $_POST['sid'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'用户不存在');
return $json;
}
$tradeinfo = GameConfigServices::getParamByPath('trade_list.'.$id);
$itemID=$tradeinfo['itemid'];
$find=Deal::find()->where(['itemid'=>$tradeinfo['itemid']])->orderBy(["id" => SORT_DESC])->limit(10);
//$find->andWhere(['>', 'daytime',0]);
$deallist = $find->all();
foreach($deallist as $k => $v){
$data[]=array(
'Volume'=>1,
'Price'=>$v['price'],
'Time' => $v['created_at']
);
}
$json = array('code' =>0, 'data' =>$data);
return $json;
}
public function actionChexiao(){
//获取数据
$Code = $_GET['token'];
$id = $_GET['id'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'msg' =>'用户不存在');
return $json;
}
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'用户不存在');
return $json;
}
$userID=$userData['id'];
$dealinfo=Deal::find()->where(['id'=>$id])->one();
if($dealinfo['del']==1){
$json = array('code' =>'1004', 'msg' =>'该交易已经撤销');
return $json;
}
if($dealinfo['from_user_id']==$userData['id']||$dealinfo['be_user_id']==$userData['id']){
if($dealinfo['state']=='buy'){
//获取剩余数量
$shengyu=$dealinfo['num']-$dealinfo['dealnum'];
//获取剩余金币
$jinbi=$shengyu*$dealinfo['price'];
//开启事务
$dbTrans = Yii::$app->db->beginTransaction();
try {
$log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_GOLD, 0, $jinbi, SystemLogUtil::FROM_TYPE_DEAL_CANCEL, []);
$rs = UserService::checkAndModifyMoney($userID, true,0, $jinbi, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS){
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//记录日志
UserLogService::addUserLog($userID, 28, 0, $jinbi);
$success = true;
} finally {
if (isset($success))
$dbTrans->commit();
else {
$dbTrans->rollBack();
Yii::$app->redis->clearDirtyKey();//清除脏缓存数据
}
}
}else{
//修改仓库物品
$itemID=$dealinfo['itemid'];
$num=$dealinfo['num']-$dealinfo['dealnum'];
$log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, $num, SystemLogUtil::FROM_TYPE_DEAL_CANCEL, []);
$rs = ItemServices::checkAndModifyNum($userID, $itemID, true, $num, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs);
}
}else{
$json = array('code' =>'1004', 'msg' =>'操作错误');
return $json;
}
$dealinfo->del=1;
$dealinfo->complete=1;
if (!$dealinfo->save()) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
$json = array('code' =>0, 'msg' =>'操作成功');
return $json;
}
public function actionOrder(){
//获取数据
$Code = $_POST['token'];
$id = $_POST['sid'];
$price= $_POST['price'];
$num= $_POST['num'];
$money= $_POST['money'];
$state= $_POST['state'];
$tradeinfo = GameConfigServices::getParamByPath('trade_list.'.$id);
$itemID=$tradeinfo['itemid'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'msg' =>'用户不存在');
return $json;
}
//查找用户
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'用户不存在');
return $json;
}
$userID=$userData['id'];
$dbTrans = Yii::$app->db->beginTransaction();
try {
if($state=='buy'){
//扣除金钱
$log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_GOLD, -$money, 0, SystemLogUtil::FROM_TYPE_DEAL_PAY, []);
$rs = UserService::checkAndModifyMoney($userID, false, -$money, 0, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS){
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
}else{
//获取配置
$itemConfig = GameConfigServices::getParamByPath('item_list.' . $itemID);
if (!$itemConfig) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//修改仓库物品
$log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, -$num, SystemLogUtil::FROM_TYPE_SELL, []);
$rs = ItemServices::checkAndModifyNum($userID, $itemID, false, -$num, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
}
//向客户端发送消息
// MessageServices::addDealMessage($beUserID, $deal->id, EnumUtil::MESSAGE_CONFIRM_BE_USER_DEAL);
$success = true;
} finally {
if (isset($success))
$dbTrans->commit();
else {
$dbTrans->rollBack();
Yii::$app->redis->clearDirtyKey();//清除脏缓存数据
}
}
//记录交易
$deal = new Deal();
$deal->from_user_id = $userID;
$deal->be_user_id = 0;
$deal->itemid = $itemID;
$deal->price = $price;
$deal->num = $num;
$deal->money = $money;
$deal->state = $state;
$deal->created_at=time();
$deal->from_user_confirm=0;
$deal->be_user_confirm=0;
$deal->complete=0;
$deal->del=0;
$deal->updated_at=0;
$deal->type=0;
$deal->fee=$money*$tradeinfo['poundage'];
$deal->data = $tradeinfo['itemname'];
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
$dealData = Deal::findOne(['daytime' => $beginToday,'itemid'=>$itemID]);
if(empty($dealData)){
$deal->daytime = $beginToday;
$deal->OpeningPrice = $price;
$deal->ClosingPrice = $price;
$deal->HighestPrice = $price;
$deal->LowestPrice = $price;
}else{
if($dealData->price>$price){
$dealData->LowestPrice=$price;
}else{
$dealData->HighestPrice=$price;
}
$dealData->ClosingPrice = $price;
if (!$dealData->save()) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
}
if (!$deal->save()) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//自动交易
//记录交易
if($deal->state=='buy'){
//判断当前交易是购买 查询所有未交易完成卖出订单
$find = Deal::find()
->andWhere(['del' => 0])
->andWhere(['itemid' => $deal->itemid])
->andWhere(['state' => 'sell'])
->andWhere(['complete' => 0])
->orderBy(['created_at' => SORT_ASC]);
$dbList = $find->offset($offset)->limit($count)->all();
foreach ($dbList as $item) {
if($deal->price>=$item['price']&&$deal->complete==0){
//进行交易
$itemarr = Deal::findOne(['id' => $item['id']]);
$itemarr['complete']=0;
//成交价格
$chengjiaojia=$item['price'];
$deal->dealprice=$chengjiaojia;
$itemarr['dealprice']=$chengjiaojia;
//买家应退回差价
$tuihui=$deal->price-$chengjiaojia;
if($deal->num-$deal->dealnum>$item['num']-$item['dealnum']){//买家未成交大于卖家未成交
//买家已成交数量
$deal->dealnum=$deal->dealnum+($item['num']-$item['dealnum']);
//成交数量
$chengjiaonum=$item['num']-$item['dealnum'];
//卖家成交数量
$itemarr['dealnum']=$item['num'];
//设置买家成交状态
$itemarr['complete']=1;
}elseif($deal->num-$deal->dealnum==$item['num']-$item['dealnum']){//买家未成交等于卖家未成交
//买家已成交数量
$deal->dealnum=$deal->num;
//成交数量
$chengjiaonum=$item['num']-$item['dealnum'];
//卖家成交数量
$itemarr['dealnum']=$itemarr['num'];
//设置买家成交状态
$itemarr['complete']=1;
$deal->complete=1;
}else{
//买家已成交数量
$deal->dealnum=$deal->num;
//成交数量
$chengjiaonum=$deal['num']-$deal['dealnum'];
//卖家成交数量
$itemarr['dealnum']=$item['dealnum']+$chengjiaonum;
//设置买家成交状态
$itemarr['complete']=0;
$deal->complete=1;
}
//这里计算
//买家得到相应数量物品
$log = SystemLogUtil::get($deal->from_user_id, SystemLogUtil::TYPE_ITEM, $deal->itemid, $chengjiaonum, SystemLogUtil::FROM_TYPE_SELL, []);
$rs = ItemServices::checkAndModifyNum($deal->from_user_id, $deal->itemid, true, $chengjiaonum, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//记录日志
UserLogService::addUserLog($deal->from_user_id, 29, $deal->itemid, $chengjiaonum);//买家交易成功获得物品
//修改当前买家订单交易状态
if (!$deal->save()) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//买家退回金币
if($tuihui>0){
$tuijinbi=$chengjiaonum*$tuihui;
$log = SystemLogUtil::get($deal->from_user_id, SystemLogUtil::TYPE_GOLD, $tuijinbi, 0, SystemLogUtil::FROM_TYPE_DEAL_PAY, []);
$rs = UserService::checkAndModifyMoney($deal->from_user_id, true, $tuijinbi, 0, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS){
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//记录日志
UserLogService::addUserLog($deal->from_user_id, 31, $deal->itemid, $tuijinbi);//卖家交易成功获得金币
}
//卖家得到相应金币
//如果需要扣除手续费 这里加上
$dedao=$chengjiaonum*$chengjiaojia;
$log = SystemLogUtil::get($item['from_user_id'], SystemLogUtil::TYPE_GOLD, $dedao, 0, SystemLogUtil::FROM_TYPE_DEAL_PAY, []);
$rs = UserService::checkAndModifyMoney($item['from_user_id'], true, $dedao, 0, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS){
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//记录日志
UserLogService::addUserLog($item['from_user_id'], 30, $deal->itemid, $dedao);//卖家交易成功获得金币
if (!$itemarr->save()) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
}
}
}
//记录交易
if($deal->state=='sell'){
//判断当前交易是卖出 查询所有未交易完成卖出订单
$find = Deal::find()
->andWhere(['del' => 0])
->andWhere(['itemid' => $deal->itemid])
->andWhere(['state' => 'buy'])
->andWhere(['complete' => 0])
->orderBy(['created_at' => SORT_ASC]);
$dbList = $find->offset($offset)->limit($count)->all();
foreach ($dbList as $item) {
if($deal->price<=$item['price']&&$deal->complete==0){
//进行交易
$itemarr = Deal::findOne(['id' => $item['id']]);
$itemarr['complete']=0;
//成交价格
$chengjiaojia=$deal['price'];
$deal->dealprice=$chengjiaojia;
$itemarr['dealprice']=$chengjiaojia;
//买家应退回差价
$tuihui=$item->price-$chengjiaojia;
if($item->num-$item->dealnum>$deal['num']-$deal['dealnum']){//买家未成交大于卖家未成交
//买家已成交数量
$item->dealnum=$item->dealnum+($deal['num']-$deal['dealnum']);
//成交数量
$chengjiaonum=$deal['num']-$deal['dealnum'];
//卖家成交数量
$deal['dealnum']=$deal['num'];
//设置买家成交状态
$deal['complete']=1;
}elseif($deal->num-$deal->dealnum==$item['num']-$item['dealnum']){//买家未成交等于卖家未成交
//买家已成交数量
$deal->dealnum=$deal->num;
//成交数量
$chengjiaonum=$item['num']-$item['dealnum'];
//卖家成交数量
$itemarr['dealnum']=$itemarr['num'];
//设置买家成交状态
$itemarr['complete']=1;
$deal->complete=1;
}else{
//买家已成交数量
$itemarr->dealnum=$item->num;
//成交数量
$chengjiaonum=$item['num']-$item['dealnum'];
//卖家成交数量
$deal['dealnum']=$deal['dealnum']+$chengjiaonum;
//设置买家成交状态
$deal['complete']=0;
$itemarr->complete=1;
}
//这里计算
//买家得到相应数量物品
$log = SystemLogUtil::get($item->from_user_id, SystemLogUtil::TYPE_ITEM, $item->itemid, $chengjiaonum, SystemLogUtil::FROM_TYPE_SELL, []);
$rs = ItemServices::checkAndModifyNum($item->from_user_id, $item->itemid, true, $chengjiaonum, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//记录日志
UserLogService::addUserLog($item->from_user_id, 29, $deal->itemid, $chengjiaonum);//买家交易成功获得物品
//修改当前买家订单交易状态
if (!$itemarr->save()) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//买家退回金币
if($tuihui>0){
$tuijinbi=$chengjiaonum*$tuihui;
$log = SystemLogUtil::get($item->from_user_id, SystemLogUtil::TYPE_GOLD, $tuijinbi, 0, SystemLogUtil::FROM_TYPE_DEAL_PAY, []);
$rs = UserService::checkAndModifyMoney($item->from_user_id, true, $tuijinbi, 0, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS){
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//记录日志
UserLogService::addUserLog($item->from_user_id, 31, $item->itemid, $tuijinbi);//卖家交易成功获得金币
}
//卖家得到相应金币
//如果需要扣除手续费 这里加上
$dedao=$chengjiaonum*$chengjiaojia;
$log = SystemLogUtil::get($deal['from_user_id'], SystemLogUtil::TYPE_GOLD, $dedao, 0, SystemLogUtil::FROM_TYPE_DEAL_PAY, []);
$rs = UserService::checkAndModifyMoney($deal['from_user_id'], true, $dedao, 0, $log);
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS){
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
//记录日志
UserLogService::addUserLog($deal['from_user_id'], 30, $deal->itemid, $dedao);//卖家交易成功获得金币
if (!$deal->save()) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
}
}
}
$json = array('code' =>0, 'msg' =>'操作成功');
return $json;
}
// /**
// * 同意交易
// */
// public function actionDealConfirm()
// {
// $userID = Yii::$app->request->get('user_id');
// $dealID = Yii::$app->request->get('deal_id'); //交易ID
// $payPassword = Yii::$app->request->get('pay_password');//支付密码
//
// if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录
//
// if (!isset($dealID) || empty($payPassword))
// return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARSE_PARAM_ERROR);
//
// //检查支付密码
// $userDbData = User::findById($userID);
// if (!$userDbData->validatePayPassword($payPassword))
// return ClientMessageServices::sendMessage(ResultStatusServices::RS_PYA_PASSWORD_ERROR);
//
// //修改数据
// $dbTrans = Yii::$app->db->beginTransaction();
// try {
//
// //修改交易数据
// $dealDbData = null;
// $rs = DealService::deal($dealID, $userID, $dealDbData);
// if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs);
//
// if ($dealDbData->complete == EnumUtil::COMPETE) {
// MessageServices::addDealMessage($dealDbData->be_user_id, $dealDbData->id, EnumUtil::MESSAGE_DEAL_COMPLETE);
//
// } else {
// //向客户端发送消息
// if ($dealDbData->be_user_id == $userID)
// MessageServices::addDealMessage($dealDbData->from_user_id, $dealDbData->id, EnumUtil::MESSAGE_CONFIRM_FROM_USER_DEAL);
// }
//
// $success = true;
// } finally {
// if (isset($success))
// $dbTrans->commit();
// else {
// $dbTrans->rollBack();
// Yii::$app->redis->clearDirtyKey();//清除脏缓存数据
// }
// }
//
// return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS);
// }
/**
* 获取交易列表
*/
public function actionGetList()
{
$userID = Yii::$app->request->get('user_id');
$offset = Yii::$app->request->get('offset');
$count = Yii::$app->request->get('count');
if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录
if (!isset($offset)) $offset = 0;
if (!isset($count)) $count = 0;
$find = Deal::find()
->orWhere(['from_user_id' => $userID])
->orWhere(['be_user_id' => $userID])
->andWhere(['del' => EnumUtil::DELETE_NOT])
->andWhere(['complete' => EnumUtil::NOT_COMPETE])
->orderBy(['created_at' => SORT_DESC]);
$totalCount = $find->count();
$dbList = $find->offset($offset)->limit($count)->all();
$list = [];
foreach ($dbList as $item) {
array_push($list, $item->genClientData());
}
$returnData['offset'] = $offset;
$returnData['total_count'] = $totalCount;
$returnData['count'] = $count;
$returnData['list'] = $list;
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData);
}
}