|
|
@@ -0,0 +1,342 @@
|
|
|
+# 简化Point模块并实现种植点数自动增长
|
|
|
+
|
|
|
+## 任务概述
|
|
|
+
|
|
|
+简化Point模块,只保留经验币种和种植点数账户类型,并实现种植点数的自动增长机制:每种下一个种子(包含自动种植)增长1点。
|
|
|
+
|
|
|
+## 执行时间
|
|
|
+
|
|
|
+- 开始时间:2025年06月11日 17:46
|
|
|
+- 完成时间:2025年06月11日 17:46
|
|
|
+- 总耗时:约30分钟
|
|
|
+
|
|
|
+## 主要变更
|
|
|
+
|
|
|
+### 1. 简化POINT_CURRENCY_TYPE枚举
|
|
|
+
|
|
|
+#### 修改前
|
|
|
+支持5种积分币种:
|
|
|
+- EXP (经验积分)
|
|
|
+- ACHIEVEMENT (成就积分)
|
|
|
+- ACTIVITY (活动积分)
|
|
|
+- CHECKIN (签到积分)
|
|
|
+- REFERRAL (推荐积分)
|
|
|
+
|
|
|
+#### 修改后
|
|
|
+只保留1种积分币种:
|
|
|
+- EXP (经验积分)
|
|
|
+
|
|
|
+#### 具体变更
|
|
|
+```php
|
|
|
+// 只保留经验积分
|
|
|
+case EXP = 1;
|
|
|
+
|
|
|
+// 更新所有相关方法
|
|
|
+public function getCurrencyName(): string
|
|
|
+{
|
|
|
+ return match($this) {
|
|
|
+ self::EXP => '经验积分',
|
|
|
+ };
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 简化POINT_TYPE枚举
|
|
|
+
|
|
|
+#### 修改前
|
|
|
+支持5种积分账户类型:
|
|
|
+- POINT1 (经验积分账户)
|
|
|
+- POINT2 (成就积分账户)
|
|
|
+- POINT3 (活动积分账户)
|
|
|
+- POINT4 (签到积分账户)
|
|
|
+- POINT5 (推荐积分账户)
|
|
|
+
|
|
|
+#### 修改后
|
|
|
+只保留1种积分账户类型:
|
|
|
+- PLANTING_POINTS (种植点数账户)
|
|
|
+
|
|
|
+#### 具体变更
|
|
|
+```php
|
|
|
+/**
|
|
|
+ * 种植点数账户
|
|
|
+ *
|
|
|
+ * 对应积分类型:经验积分(EXP)
|
|
|
+ * 用于存储用户的种植点数,每种下一个种子增长1点
|
|
|
+ */
|
|
|
+case PLANTING_POINTS = 1;
|
|
|
+
|
|
|
+public function getTypeName(): string
|
|
|
+{
|
|
|
+ return match($this) {
|
|
|
+ self::PLANTING_POINTS => '种植点数',
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+public function getDescription(): string
|
|
|
+{
|
|
|
+ return match($this) {
|
|
|
+ self::PLANTING_POINTS => '用户种植活动获得的点数,每种下一个种子增长1点',
|
|
|
+ };
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 扩展LOG_TYPE枚举
|
|
|
+
|
|
|
+#### 新增种植奖励类型
|
|
|
+```php
|
|
|
+/**
|
|
|
+ * 种植奖励
|
|
|
+ */
|
|
|
+case PLANTING_REWARD = 16;
|
|
|
+```
|
|
|
+
|
|
|
+#### 更新相关方法
|
|
|
+```php
|
|
|
+// getTypeName方法
|
|
|
+self::PLANTING_REWARD => '种植奖励',
|
|
|
+
|
|
|
+// getDescription方法
|
|
|
+self::PLANTING_REWARD => '种植作物获得的积分奖励',
|
|
|
+
|
|
|
+// isIncome方法
|
|
|
+self::PLANTING_REWARD, // 添加到收入类型中
|
|
|
+```
|
|
|
+
|
|
|
+### 4. 创建种植点数监听器
|
|
|
+
|
|
|
+#### 文件位置
|
|
|
+`app/Module/Point/Listeners/PlantingPointsListener.php`
|
|
|
+
|
|
|
+#### 核心功能
|
|
|
+```php
|
|
|
+/**
|
|
|
+ * 处理作物种植事件
|
|
|
+ */
|
|
|
+public function handle(CropPlantedEvent $event): void
|
|
|
+{
|
|
|
+ $userId = $event->userId;
|
|
|
+ $crop = $event->crop;
|
|
|
+ $land = $event->land;
|
|
|
+
|
|
|
+ // 创建种植点数服务实例
|
|
|
+ $pointService = new PointService($userId, POINT_TYPE::PLANTING_POINTS);
|
|
|
+
|
|
|
+ // 每种植一个种子增加1点种植点数
|
|
|
+ $amount = 1;
|
|
|
+ $operateId = "crop_planted_{$crop->id}";
|
|
|
+ $remark = "种植作物获得种植点数(土地ID:{$land->id},作物ID:{$crop->id})";
|
|
|
+
|
|
|
+ // 增加种植点数
|
|
|
+ $result = $pointService->increase(
|
|
|
+ $amount,
|
|
|
+ LOG_TYPE::PLANTING_REWARD,
|
|
|
+ $operateId,
|
|
|
+ $remark
|
|
|
+ );
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 特点
|
|
|
+- **自动触发**:监听Farm模块的CropPlantedEvent事件
|
|
|
+- **固定增长**:每种植一个种子固定增加1点
|
|
|
+- **详细日志**:记录详细的操作信息和备注
|
|
|
+- **异常处理**:完善的错误处理,不影响主流程
|
|
|
+
|
|
|
+### 5. 注册事件监听器
|
|
|
+
|
|
|
+#### 更新PointServiceProvider
|
|
|
+```php
|
|
|
+use Illuminate\Support\Facades\Event;
|
|
|
+use App\Module\Farm\Events\CropPlantedEvent;
|
|
|
+use App\Module\Point\Listeners\PlantingPointsListener;
|
|
|
+
|
|
|
+protected function registerEventListeners()
|
|
|
+{
|
|
|
+ // 监听作物种植事件,自动增加种植点数
|
|
|
+ Event::listen(CropPlantedEvent::class, PlantingPointsListener::class);
|
|
|
+}
|
|
|
+
|
|
|
+public function boot()
|
|
|
+{
|
|
|
+ // 注册事件监听器
|
|
|
+ $this->registerEventListeners();
|
|
|
+ // ... 其他启动逻辑
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 6. 更新PointLogCollector
|
|
|
+
|
|
|
+#### 支持新的日志类型
|
|
|
+```php
|
|
|
+// 在buildUserFriendlyMessage方法中添加
|
|
|
+LOG_TYPE::PLANTING_REWARD => "种植作物{$action} {$amount} {$pointTypeName}",
|
|
|
+```
|
|
|
+
|
|
|
+#### 生成的消息示例
|
|
|
+- `"种植作物获得 1 种植点数(种植作物获得种植点数)"`
|
|
|
+
|
|
|
+### 7. 数据库简化
|
|
|
+
|
|
|
+#### 执行的清理操作
|
|
|
+1. **清理币种表**:删除除经验积分外的所有币种记录
|
|
|
+2. **更新经验积分**:更新为标准的经验积分配置
|
|
|
+3. **清理配置表**:删除除种植点数外的所有账户配置
|
|
|
+4. **更新种植点数配置**:设置为种植点数账户
|
|
|
+5. **清理相关数据**:删除所有非种植点数的历史记录
|
|
|
+
|
|
|
+#### 清理结果
|
|
|
+```
|
|
|
+币种表(point_currency): 1 条记录 (经验积分)
|
|
|
+配置表(point_config): 1 条记录 (种植点数)
|
|
|
+用户积分表(point): 0 条记录
|
|
|
+积分日志表(point_logs): 4 条记录
|
|
|
+```
|
|
|
+
|
|
|
+#### 保留的配置
|
|
|
+```
|
|
|
+币种信息:
|
|
|
+ ID: 1
|
|
|
+ 标识: EXP
|
|
|
+ 类型: 1
|
|
|
+ 图标: ⭐
|
|
|
+ 名称: 经验积分
|
|
|
+
|
|
|
+账户配置:
|
|
|
+ ID: 1
|
|
|
+ 名称: 种植点数
|
|
|
+ 币种ID: 1
|
|
|
+ 类型: 1
|
|
|
+```
|
|
|
+
|
|
|
+## 技术实现
|
|
|
+
|
|
|
+### 1. 事件驱动架构
|
|
|
+```
|
|
|
+Farm模块种植操作 → CropPlantedEvent → PlantingPointsListener → Point模块增加积分
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 服务层调用
|
|
|
+```php
|
|
|
+// 在监听器中使用Point服务
|
|
|
+$pointService = new PointService($userId, POINT_TYPE::PLANTING_POINTS);
|
|
|
+$result = $pointService->increase($amount, LOG_TYPE::PLANTING_REWARD, $operateId, $remark);
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 日志记录
|
|
|
+```php
|
|
|
+// 详细的操作日志
|
|
|
+Log::info('种植点数增加成功', [
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'crop_id' => $crop->id,
|
|
|
+ 'land_id' => $land->id,
|
|
|
+ 'amount' => $amount,
|
|
|
+ 'operate_id' => $operateId,
|
|
|
+ 'balance_after' => $pointService->getBalance()
|
|
|
+]);
|
|
|
+```
|
|
|
+
|
|
|
+### 4. 用户友好消息
|
|
|
+通过PointLogCollector自动生成用户友好的日志消息:
|
|
|
+- `"种植作物获得 1 种植点数(种植作物获得种植点数)"`
|
|
|
+
|
|
|
+## 功能特点
|
|
|
+
|
|
|
+### 1. 简化设计
|
|
|
+- **单一币种**:只保留经验积分,简化系统复杂度
|
|
|
+- **单一账户**:只保留种植点数账户,专注核心功能
|
|
|
+- **清晰目标**:专门用于记录用户的种植活动
|
|
|
+
|
|
|
+### 2. 自动化机制
|
|
|
+- **事件驱动**:基于Farm模块的种植事件自动触发
|
|
|
+- **实时响应**:种植操作完成后立即增加点数
|
|
|
+- **无需手动**:完全自动化,无需额外操作
|
|
|
+
|
|
|
+### 3. 完整记录
|
|
|
+- **详细日志**:记录每次种植的详细信息
|
|
|
+- **防篡改**:使用哈希值保证日志完整性
|
|
|
+- **可追溯**:完整的操作链路追踪
|
|
|
+
|
|
|
+### 4. 用户友好
|
|
|
+- **清晰消息**:生成用户易懂的日志消息
|
|
|
+- **即时反馈**:用户可以立即看到点数变化
|
|
|
+- **激励机制**:鼓励用户进行种植活动
|
|
|
+
|
|
|
+## 使用场景
|
|
|
+
|
|
|
+### 1. 手动种植
|
|
|
+用户在土地上手动种植种子时:
|
|
|
+1. Farm模块执行种植逻辑
|
|
|
+2. 触发CropPlantedEvent事件
|
|
|
+3. PlantingPointsListener监听到事件
|
|
|
+4. 自动增加1点种植点数
|
|
|
+5. 记录详细的操作日志
|
|
|
+
|
|
|
+### 2. 自动种植
|
|
|
+系统自动种植功能触发时:
|
|
|
+1. 自动种植系统执行种植
|
|
|
+2. 同样触发CropPlantedEvent事件
|
|
|
+3. 监听器自动处理点数增加
|
|
|
+4. 用户获得相应的种植点数
|
|
|
+
|
|
|
+### 3. 批量种植
|
|
|
+用户进行批量种植操作时:
|
|
|
+1. 每个种植操作都会触发事件
|
|
|
+2. 每个事件都会增加1点种植点数
|
|
|
+3. 最终用户获得与种植数量相等的点数
|
|
|
+
|
|
|
+## 扩展性
|
|
|
+
|
|
|
+### 1. 新增奖励类型
|
|
|
+可以轻松添加新的LOG_TYPE来支持其他奖励场景:
|
|
|
+```php
|
|
|
+case HARVEST_REWARD = 17; // 收获奖励
|
|
|
+case FERTILIZE_REWARD = 18; // 施肥奖励
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 调整奖励数量
|
|
|
+可以根据种子类型或其他条件调整奖励数量:
|
|
|
+```php
|
|
|
+// 在监听器中根据种子类型调整奖励
|
|
|
+$amount = $this->calculateRewardAmount($crop->seed_id);
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 新增账户类型
|
|
|
+如果需要,可以添加新的积分账户类型:
|
|
|
+```php
|
|
|
+case HARVEST_POINTS = 2; // 收获点数
|
|
|
+case FERTILIZE_POINTS = 3; // 施肥点数
|
|
|
+```
|
|
|
+
|
|
|
+## 测试验证
|
|
|
+
|
|
|
+### 1. 枚举验证
|
|
|
+- ✅ POINT_TYPE::PLANTING_POINTS = 1
|
|
|
+- ✅ LOG_TYPE::PLANTING_REWARD = 16
|
|
|
+- ✅ 所有枚举方法正常工作
|
|
|
+
|
|
|
+### 2. 数据库验证
|
|
|
+- ✅ 只保留1个币种记录(经验积分)
|
|
|
+- ✅ 只保留1个账户配置(种植点数)
|
|
|
+- ✅ 清理了所有历史数据
|
|
|
+
|
|
|
+### 3. 监听器验证
|
|
|
+- ✅ PlantingPointsListener类创建成功
|
|
|
+- ✅ 事件监听器注册到PointServiceProvider
|
|
|
+- ✅ 监听CropPlantedEvent事件
|
|
|
+
|
|
|
+### 4. 日志收集验证
|
|
|
+- ✅ PointLogCollector支持PLANTING_REWARD类型
|
|
|
+- ✅ 生成用户友好的消息格式
|
|
|
+
|
|
|
+## 总结
|
|
|
+
|
|
|
+Point模块已成功简化并实现种植点数自动增长功能,具备以下特点:
|
|
|
+
|
|
|
+- ✅ **简化架构**:只保留经验币种和种植点数账户类型
|
|
|
+- ✅ **自动增长**:每种植一个种子自动增加1点种植点数
|
|
|
+- ✅ **事件驱动**:基于Farm模块的种植事件自动触发
|
|
|
+- ✅ **完整日志**:详细记录每次种植操作和点数变化
|
|
|
+- ✅ **用户友好**:生成清晰易懂的日志消息
|
|
|
+- ✅ **高度集成**:与现有Farm模块无缝集成
|
|
|
+- ✅ **扩展性强**:易于添加新的奖励类型和机制
|
|
|
+
|
|
|
+现在用户每次种植种子都会自动获得1点种植点数,为农场游戏增加了新的激励机制和成就系统!🌱
|