182 lines
5.7 KiB
PHP
182 lines
5.7 KiB
PHP
<?php
|
||
/**
|
||
* Created by PhpStorm.
|
||
* User: zn
|
||
* Date: 2017/5/23
|
||
* Time: 11:42
|
||
*/
|
||
|
||
namespace common\services;
|
||
|
||
use common\models\Item;
|
||
use common\modules\achievement\AchievementUtil;
|
||
use common\modules\systemlog\SystemLog;
|
||
use common\utils\RedisKeyUtil;
|
||
use RedisLock\RedisLock;
|
||
use Yii;
|
||
|
||
|
||
/**
|
||
* 物品
|
||
* Class ItemServices
|
||
* @package common\services
|
||
*/
|
||
class ItemServices
|
||
{
|
||
const ITEM_TYPE2_SEEDS = 1;//种子
|
||
const ITEM_TYPE2_FRUIT = 2;//果实
|
||
const ITEM_TYPE2_FERTILIZE = 3;//肥料
|
||
const ITEM_TYPE2_DOG_FOOD = 4;//狗粮
|
||
const ITEM_TYPE2_BG = 990;//背景
|
||
const ITEM_TYPE2_GEM = 1000;//钻石
|
||
const ITEM_TYPE2_GOLD = 1001;//金币
|
||
const ITEM_TYPE2_DEMEDY = 5;//补签卡
|
||
const ITEM_TYPE2_ENJOY_PET = 6;//观赏宠物
|
||
const ITEM_TYPE2_MYSTERY_SEED = 7;//神秘种子
|
||
const ITEM_TYPE2_SUONA = 8;//超级喇叭
|
||
const ITEM_TYPE2_DISINSECTION = 9;//超级杀虫剂
|
||
const ITEM_TYPE2_WEEDING = 10;//超级除草剂
|
||
// const ITEM_TYPE2_GIFT = 13;//礼包
|
||
const ITEM_TYPE2_STONE = 14;//石材
|
||
const ITEM_TYPE2_STEEL = 15;//钢材
|
||
const ITEM_TYPE2_GEMSTONE = 200;//宝石
|
||
const ITEM_TYPE2_CRYSTAL = 300;//水晶
|
||
const ITEM_TYPE2_EGG = 500;//egg
|
||
const ITEM_TYPE2_CHIP = 600;//碎片
|
||
const ITEM_TYPE2_PET_BLUEPRINT = 700;//图纸
|
||
const ITEM_TYPE2_PET = 800;//宠物
|
||
const ITEM_TYPE2_CARD = 900;//周卡、月卡
|
||
|
||
//不能购买列表
|
||
const ITEM_CANNOT_BUY_LIST = [
|
||
self::ITEM_TYPE2_GOLD,
|
||
self::ITEM_TYPE2_GEM,
|
||
];
|
||
|
||
//只能买一个
|
||
const ITEM_ONLY_BUY_ONE_LIST = [
|
||
self::ITEM_TYPE2_BG,
|
||
];
|
||
|
||
//不能出售列表
|
||
const ITEM_CAN_NOT_SELL_LIST = [
|
||
self::ITEM_TYPE2_BG,
|
||
self::ITEM_TYPE2_GOLD,
|
||
self::ITEM_TYPE2_GEM,
|
||
self::ITEM_TYPE2_MYSTERY_SEED,
|
||
self::ITEM_TYPE2_SUONA,
|
||
self::ITEM_TYPE2_DISINSECTION,
|
||
self::ITEM_TYPE2_WEEDING,
|
||
self::ITEM_TYPE2_ENJOY_PET,
|
||
// self::ITEM_TYPE2_SEEDS,
|
||
// self::ITEM_TYPE2_GIFT,
|
||
];
|
||
|
||
const ITEM_TYPE_STR = [
|
||
self::ITEM_TYPE2_SEEDS => '种子',
|
||
self::ITEM_TYPE2_FRUIT => '果实',
|
||
self::ITEM_TYPE2_FERTILIZE => '肥料',
|
||
self::ITEM_TYPE2_DOG_FOOD => '狗粮',
|
||
self::ITEM_TYPE2_ENJOY_PET => '狗',
|
||
self::ITEM_TYPE2_BG => '背景',
|
||
self::ITEM_TYPE2_GOLD => '金币',
|
||
self::ITEM_TYPE2_GEM => '钻石',
|
||
self::ITEM_TYPE2_MYSTERY_SEED => '神秘种子',
|
||
self::ITEM_TYPE2_SUONA => '超级喇叭',
|
||
self::ITEM_TYPE2_DISINSECTION => '超级杀虫剂',
|
||
self::ITEM_TYPE2_WEEDING => '超级除草剂',
|
||
// self::ITEM_TYPE2_GIFT => '新手礼包',
|
||
];
|
||
|
||
/**
|
||
* 修改仓库物品
|
||
* @param $userID
|
||
* @param $itemID
|
||
* @param $isAdd
|
||
* @param $num
|
||
* @return bool|int
|
||
*/
|
||
public static function checkAndModifyNum($userID, $itemID, $isAdd, $num, SystemLog $log)
|
||
{
|
||
//正负验证
|
||
if ($isAdd && $num < 0) return ResultStatusServices::RS_PARAM_ERROR;
|
||
if (!$isAdd && $num > 0) return ResultStatusServices::RS_PARAM_ERROR;
|
||
|
||
//加锁
|
||
$lock = new RedisLock(Yii::$app->redis, RedisKeyUtil::lockItem($userID, $itemID), RedisLock::FLAG_CATCH_EXCEPTIONS);
|
||
if (!$lock->acquire(10)) return ResultStatusServices::RS_SAME_TIME_OPERATION;
|
||
|
||
try {
|
||
//获取信息
|
||
$itemDbData = Item::findByUserIDAndItemID($userID, $itemID);
|
||
|
||
$config = GameConfigServices::getParamByPath('item_list.' . $itemID);
|
||
|
||
if (empty($config))
|
||
return ResultStatusServices::RS_NOT_FIND_IN_CONFIG;
|
||
|
||
//添加操作,并且数据不存在则新建数据
|
||
if (!$itemDbData && $isAdd) {
|
||
$itemDbData = new Item();
|
||
$itemDbData->user_id = $userID;
|
||
$itemDbData->item_id = $itemID;
|
||
$itemDbData->name = $config['name'];
|
||
$itemDbData->type = $config['type2'];
|
||
}
|
||
|
||
//减少操作,并且物品不存在
|
||
if (!$isAdd && !$itemDbData) return ResultStatusServices::RS_ITEM_NOT_ENOUGH;
|
||
|
||
if (!$itemDbData) return ResultStatusServices::RS_ITEM_NOT_ENOUGH;
|
||
|
||
//修改数量
|
||
$itemDbData->num += $num;
|
||
|
||
//数量不够减
|
||
if ($itemDbData->num < 0) return ResultStatusServices::RS_ITEM_NOT_ENOUGH;
|
||
|
||
//判断能否买多个
|
||
$onlyBuyOne = in_array($itemDbData->type, ItemServices::ITEM_ONLY_BUY_ONE_LIST);
|
||
if ($onlyBuyOne && $itemDbData->num > 1) return ResultStatusServices::RS_ITEM_CAN_NOT_BY_MORE;
|
||
|
||
//减少操作,如果数量为0,则删除数据
|
||
if (!$isAdd && !$itemDbData->getIsNewRecord() && $itemDbData->num <= 0) {
|
||
//删除操作
|
||
if (!$itemDbData->delete()) return ResultStatusServices::RS_SAVE_DB_ERROR;
|
||
} elseif (!$itemDbData->save()) {
|
||
//保存操作
|
||
return ResultStatusServices::RS_SAVE_DB_ERROR;
|
||
}
|
||
|
||
if (!$log->save()) return ResultStatusServices::RS_SAVE_DB_ERROR;
|
||
|
||
} finally {
|
||
//解锁
|
||
$lock->release();
|
||
}
|
||
|
||
return ResultStatusServices::RS_OPERATION_SUCCESS;
|
||
}
|
||
|
||
/**
|
||
* 排序, type,item_id
|
||
* @param $itemDbDataList
|
||
* @return Item[]
|
||
*/
|
||
public static function sortItem($itemDbDataList)
|
||
{
|
||
usort($itemDbDataList, function ($a, $b) {
|
||
if ($a->type == $b->type) {
|
||
if ($a->item_id == $b->item_id) return 0;
|
||
return $a->item_id < $b->item_id ? -1 : +1;
|
||
}
|
||
|
||
return $a->type < $b->type ? -1 : +1;
|
||
});
|
||
|
||
return $itemDbDataList;
|
||
}
|
||
|
||
|
||
}
|