hy-farm/muchang/common/services/DealService.php
2026-05-29 19:54:56 +08:00

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