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