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

182 lines
5.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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