'种子', 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; } }