原有的灾害去除系统存在以下问题:
fram_grass_rate(草宰概率)fram_weedicide_rate(除草概率)在 NumericAttributesCast 中添加了完整的灾害去除属性:
/**
* 除虫概率(百分比格式,100=100%)
*/
public int $fram_pesticide_rate = 0;
/**
* 解决干旱概率(百分比格式,100=100%)
*/
public int $fram_drought_rate = 0;
/**
* 除草概率(百分比格式,100=100%)
*/
public int $fram_weedicide_rate = 0;
位置:app/Module/Farm/Validations/DisasterRemovalValidation.php
核心功能:
位置:app/Module/Farm/Validators/LandOwnershipValidator.php
核心功能:
位置:app/Module/Farm/Validators/DisasterRemovalItemValidator.php
核心功能:
位置:app/Module/Farm/Logics/DisasterRemovalLogic.php
核心功能:
Helper::check_tr())关键特性:
/**
* 使用物品去除灾害(带概率判断)
*/
public static function removeDisasterWithItem(
int $userId,
int $landId,
int $itemId,
int $disasterType,
string $sourceType
): array
所有灾害去除Handler(PesticideHandler、WeedicideHandler、WateringHandler)都采用相同的处理模式:
// 先进行验证,避免不必要的事务开销
$validation = new \App\Module\Farm\Validations\DisasterRemovalValidation([
'user_id' => $userId,
'land_id' => $landId,
'item_id' => $userItemId,
'disaster_type' => DISASTER_TYPE::PEST->value
]);
// 验证数据
$validation->validated();
// 验证通过后,开启事务
DB::beginTransaction();
// 执行业务逻辑(不再需要验证)
$result = CropService::removeDisasterWithItem(
$userId,
$landId,
$userItemId,
DISASTER_TYPE::PEST->value, // 使用枚举替代魔法数字
'land_pesticide'
);
// 提交事务
DB::commit();
} catch (\UCore\Exception\ValidateException $e) {
// 验证失败,此时可能还没有开启事务
$this->response->setCode(400);
$this->response->setMsg($e->getMessage());
} catch (LogicException $e) {
// 业务逻辑异常,需要回滚事务
if (DB::transactionLevel() > 0) {
DB::rollBack();
}
} catch (\Exception $e) {
// 系统异常,需要回滚事务
if (DB::transactionLevel() > 0) {
DB::rollBack();
}
}
CropService::clearDisaster($userId, $landId, 2)DISASTER_TYPE::PEST->valueprivate function rollSuccess(int $successRate): bool
{
if ($successRate <= 0) {
return false; // 0%成功率必定失败
}
if ($successRate >= 100) {
return true; // 100%成功率必定成功
}
$randomNumber = mt_rand(1, 100);
return $randomNumber <= $successRate;
}
private const DISASTER_ITEM_ATTRIBUTES = [
DISASTER_TYPE::DROUGHT->value => 'fram_drought_rate', // 干旱 -> 浇水概率
DISASTER_TYPE::PEST->value => 'fram_pesticide_rate', // 虫害 -> 除虫概率
DISASTER_TYPE::WEED->value => 'fram_weedicide_rate', // 杂草 -> 除草概率
];
private const DISASTER_ACTION_NAMES = [
DISASTER_TYPE::DROUGHT->value => '浇水',
DISASTER_TYPE::PEST->value => '除虫',
DISASTER_TYPE::WEED->value => '除草',
];
Helper::check_tr() 确保事务已开启// 在逻辑层开始时检查事务状态
Helper::check_tr();
CropService::clearDisaster() 方法{
"numeric_attributes": {
"fram_pesticide_rate": 80, // 80%除虫成功率
"fram_drought_rate": 90, // 90%解决干旱成功率
"fram_weedicide_rate": 75 // 75%除草成功率
}
}
// 使用除虫剂
$result = CropService::removeDisasterWithItem(
$userId,
$landId,
$pesticideItemId,
DISASTER_TYPE::PEST->value,
'land_pesticide'
);
if ($result['success']) {
echo $result['message']; // "除虫成功"
echo "成功率: " . $result['success_rate'] . "%";
}
只需在以下位置添加配置:
DISASTER_TYPE 枚举DISASTER_ITEM_ATTRIBUTES 映射DISASTER_ACTION_NAMES 映射NumericAttributesCast 属性定义只需在物品的 numeric_attributes 中添加对应的概率属性即可。