229 lines
8.1 KiB
PHP
229 lines
8.1 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: zn
|
|
* Date: 2017/6/14
|
|
* Time: 15:14
|
|
*/
|
|
|
|
namespace common\services;
|
|
|
|
|
|
use common\models\Deal;
|
|
use common\models\DealData;
|
|
use common\modules\systemlog\SystemLogUtil;
|
|
use common\utils\EnumUtil;
|
|
use common\utils\RedisKeyUtil;
|
|
use RedisLock\RedisLock;
|
|
use Yii;
|
|
|
|
class DealService
|
|
{
|
|
/**交易
|
|
* @param $dealID
|
|
* @param $userID
|
|
* @return int
|
|
*/
|
|
public static function deal($dealID, $userID, &$dealDbData)
|
|
{
|
|
//加锁
|
|
$lock = new RedisLock(Yii::$app->redis, RedisKeyUtil::lockDeal($dealID), RedisLock::FLAG_CATCH_EXCEPTIONS);
|
|
if (!$lock->acquire(10)) return ResultStatusServices::RS_SAME_TIME_OPERATION;
|
|
|
|
try {
|
|
$dealDbData = Deal::findByID($dealID);
|
|
if (empty($dealDbData))
|
|
return ResultStatusServices::RS_NOT_FIND_IN_DB;
|
|
|
|
//检查用户
|
|
if ($dealDbData->from_user_id != $userID && $dealDbData->be_user_id != $userID)
|
|
return ResultStatusServices::RS_PARSE_PARAM_ERROR;
|
|
|
|
//交易完成
|
|
if ($dealDbData->complete == EnumUtil::COMPETE)
|
|
return ResultStatusServices::RS_PARSE_PARAM_ERROR;
|
|
|
|
//检查确认顺序
|
|
if ($dealDbData->from_user_id == $userID && $dealDbData->be_user_confirm == EnumUtil::NOT_CONFIRM)
|
|
return ResultStatusServices::RS_DEAL_WAIT_USER_CONFIRM;
|
|
|
|
if ($dealDbData->be_user_id == $userID) {
|
|
$dealDbData->be_user_confirm = EnumUtil::CONFIRM;
|
|
}
|
|
|
|
if ($dealDbData->from_user_id == $userID) {
|
|
$dealDbData->from_user_confirm = EnumUtil::CONFIRM;
|
|
}
|
|
|
|
if ($dealDbData->from_user_confirm == EnumUtil::CONFIRM && $dealDbData->be_user_confirm == EnumUtil::CONFIRM) {
|
|
//都确认了,交易完成
|
|
$dealDbData->complete = EnumUtil::COMPETE;
|
|
}
|
|
|
|
if (!$dealDbData->save())
|
|
return ResultStatusServices::RS_SAVE_DB_ERROR;
|
|
|
|
|
|
//交易完成,执行物品赠送操作
|
|
if ($dealDbData->complete == EnumUtil::COMPETE) {
|
|
|
|
$rs = self::__dealCompleteAddItem($dealDbData);
|
|
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return $rs;
|
|
}
|
|
|
|
} finally {
|
|
//解锁
|
|
$lock->release();
|
|
}
|
|
|
|
return ResultStatusServices::RS_OPERATION_SUCCESS;
|
|
}
|
|
|
|
/**后台完成交易
|
|
* @param $dealID
|
|
* @return int
|
|
*/
|
|
public static function dealBackendCompete($dealID)
|
|
{
|
|
//加锁
|
|
$lock = new RedisLock(Yii::$app->redis, RedisKeyUtil::lockDeal($dealID), RedisLock::FLAG_CATCH_EXCEPTIONS);
|
|
if (!$lock->acquire(10)) return ResultStatusServices::RS_SAME_TIME_OPERATION;
|
|
|
|
try {
|
|
$dealDbData = Deal::findByID($dealID);
|
|
if (empty($dealDbData))
|
|
return ResultStatusServices::RS_NOT_FIND_IN_DB;
|
|
|
|
$dealDbData->from_user_confirm = EnumUtil::CONFIRM;
|
|
$dealDbData->be_user_confirm = EnumUtil::CONFIRM;
|
|
$dealDbData->complete = EnumUtil::COMPETE;
|
|
|
|
if (!$dealDbData->save()) return ResultStatusServices::RS_SAVE_DB_ERROR;
|
|
|
|
//赠送物品
|
|
$rs = self::__dealCompleteAddItem($dealDbData);
|
|
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return $rs;
|
|
|
|
} finally {
|
|
//解锁
|
|
$lock->release();
|
|
}
|
|
|
|
return ResultStatusServices::RS_OPERATION_SUCCESS;
|
|
}
|
|
|
|
/**后台取消交易
|
|
* @param $dealID
|
|
* @return int
|
|
*/
|
|
public static function dealBackendCancel($dealID)
|
|
{
|
|
//加锁
|
|
$lock = new RedisLock(Yii::$app->redis, RedisKeyUtil::lockDeal($dealID), RedisLock::FLAG_CATCH_EXCEPTIONS);
|
|
if (!$lock->acquire(10)) return ResultStatusServices::RS_SAME_TIME_OPERATION;
|
|
|
|
try {
|
|
$dealDbData = Deal::findByID($dealID);
|
|
if (empty($dealDbData))
|
|
return ResultStatusServices::RS_NOT_FIND_IN_DB;
|
|
|
|
//删除
|
|
$dealDbData->del = EnumUtil::DELETE;
|
|
if (!$dealDbData->save()) return ResultStatusServices::RS_SAVE_DB_ERROR;
|
|
|
|
//还原物品
|
|
$rs = self::__dealCanelReturnItem($dealDbData);
|
|
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return $rs;
|
|
|
|
} finally {
|
|
//解锁
|
|
$lock->release();
|
|
}
|
|
|
|
return ResultStatusServices::RS_OPERATION_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
* 交易完成赠送物品
|
|
* @param Deal $dealDbData
|
|
* @return bool|int
|
|
*/
|
|
private static function __dealCompleteAddItem(Deal $dealDbData)
|
|
{
|
|
$data = DealData::loadJson($dealDbData->data);
|
|
|
|
//提成比例
|
|
$drawPercentage = floatval(intval(GameConfigServices::getCommonNumByID(GameConfigServices::COMMON_DRAW_PERCENTAGE)) / 100);
|
|
|
|
$drawPercentageData = new DealData();
|
|
|
|
//执行具体交易操作
|
|
if ($dealDbData->type == EnumUtil::DEAL_TYPE_PERSENT_MONEY) {
|
|
//赠送金币
|
|
//提成
|
|
$drawPercentageData->gold = intval(intval($data->gold) * $drawPercentage);
|
|
$gold = $data->gold - $drawPercentageData->gold;
|
|
|
|
if ($gold > 0) {
|
|
$log = SystemLogUtil::get($dealDbData->be_user_id, SystemLogUtil::TYPE_GOLD, $gold, 0, SystemLogUtil::FROM_TYPE_DEAL_GET, [
|
|
'deal_id' => $dealDbData->id]);
|
|
$rs = UserService::checkAndModifyMoney($dealDbData->be_user_id, true, $gold, 0, $log);
|
|
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return $rs;
|
|
}
|
|
|
|
} elseif ($dealDbData->type == EnumUtil::DEAL_TYPE_PERSENT_ITEM) {
|
|
|
|
//赠送物品
|
|
foreach ($data->item_list as $item) {
|
|
//提成
|
|
$drawPercentageItem = $drawPercentageData->addItem($item->item_id, intval($item->num * $drawPercentage));
|
|
|
|
$num = $item->num - $drawPercentageItem->num;
|
|
if ($num > 0) {
|
|
$log = SystemLogUtil::get($dealDbData->be_user_id, SystemLogUtil::TYPE_ITEM, $item->item_id, $num, SystemLogUtil::FROM_TYPE_DEAL_GET, ['deal_id' => $dealDbData->id]);
|
|
$rs = ItemServices::checkAndModifyNum($dealDbData->be_user_id, $item->item_id, true, $num, $log);
|
|
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return $rs;
|
|
}
|
|
}
|
|
}
|
|
|
|
//添加系统日志
|
|
UserLogService::addUserSystemLogDeal($dealDbData);
|
|
|
|
UserLogService::addUserSystemLog($dealDbData->from_user_id, EnumUtil::USER_SYSTEM_LOG_DRAW_PERCENTAGE,
|
|
sprintf('交易提成,%s', $drawPercentageData->toReadString()));
|
|
|
|
return ResultStatusServices::RS_OPERATION_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
* 取消交易还原赠送物品
|
|
* @param Deal $dealDbData
|
|
* @return bool|int
|
|
*/
|
|
private static function __dealCanelReturnItem(Deal $dealDbData)
|
|
{
|
|
$data = DealData::loadJson($dealDbData->data);
|
|
|
|
//执行具体交易操作
|
|
if ($dealDbData->type == EnumUtil::DEAL_TYPE_PERSENT_MONEY) {
|
|
//赠送金币
|
|
$log = SystemLogUtil::get($dealDbData->from_user_id, SystemLogUtil::TYPE_GOLD, $data->gold, 0, SystemLogUtil::FROM_TYPE_DEAL_CANCEL, [
|
|
'deal_id' => $dealDbData->id]);
|
|
$rs = UserService::checkAndModifyMoney($dealDbData->from_user_id, true, $data->gold, 0, $log);
|
|
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return $rs;
|
|
|
|
} elseif ($dealDbData->type == EnumUtil::DEAL_TYPE_PERSENT_ITEM) {
|
|
|
|
//赠送物品
|
|
foreach ($data->item_list as $item) {
|
|
$log = SystemLogUtil::get($dealDbData->from_user_id, SystemLogUtil::TYPE_ITEM, $item->item_id, $item->num, SystemLogUtil::FROM_TYPE_DEAL_CANCEL, [
|
|
'deal_id' => $dealDbData->id]);
|
|
$rs = ItemServices::checkAndModifyNum($dealDbData->from_user_id, $item->item_id, true, $item->num, $log);
|
|
if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return $rs;
|
|
}
|
|
}
|
|
|
|
return ResultStatusServices::RS_OPERATION_SUCCESS;
|
|
}
|
|
} |