|
|
@@ -51,6 +51,9 @@ public class UnlockGateService {
|
|
|
@Resource
|
|
|
private EnergyService energyService;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private PlatformPointsService platformPointsService;
|
|
|
+
|
|
|
// ========== 核心判定 ==========
|
|
|
|
|
|
/**
|
|
|
@@ -168,6 +171,15 @@ public class UnlockGateService {
|
|
|
* 刷新家庭全部关卡进度(幂等,写 family_gate_progress)
|
|
|
*/
|
|
|
public void refreshFamilyGates(Long familyId) {
|
|
|
+ refreshFamilyGates(familyId, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 刷新家庭全部关卡进度(幂等,写 family_gate_progress)
|
|
|
+ *
|
|
|
+ * @param triggerUserId 触发本次刷新的用户(用于发放通关奖励;可为 null)
|
|
|
+ */
|
|
|
+ public void refreshFamilyGates(Long familyId, Long triggerUserId) {
|
|
|
if (familyId == null) return;
|
|
|
List<UnlockGate> gates = unlockGateMapper.selectList(
|
|
|
new LambdaQueryWrapper<UnlockGate>().eq(UnlockGate::getEnabled, 1));
|
|
|
@@ -193,7 +205,7 @@ public class UnlockGateService {
|
|
|
familyGateProgressMapper.updateById(progress);
|
|
|
}
|
|
|
// 发放奖励
|
|
|
- grantGateRewards(familyId, gate);
|
|
|
+ grantGateRewards(familyId, triggerUserId, gate);
|
|
|
}
|
|
|
} else {
|
|
|
if (progress == null) {
|
|
|
@@ -244,7 +256,7 @@ public class UnlockGateService {
|
|
|
progress.setUnlockedAt(new Date());
|
|
|
familyGateProgressMapper.updateById(progress);
|
|
|
}
|
|
|
- grantGateRewards(familyId, gate);
|
|
|
+ grantGateRewards(familyId, userId, gate);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -253,19 +265,48 @@ public class UnlockGateService {
|
|
|
// ========== 奖励发放 ==========
|
|
|
|
|
|
/**
|
|
|
- * 发放关卡通关奖励(积分+能量),幂等
|
|
|
+ * 发放关卡通关奖励(CF值 + 能量),幂等:
|
|
|
+ * 仅在进度 LOCKED → UNLOCKED 转换时由调用方触发,不会重复发放。
|
|
|
+ *
|
|
|
+ * @param triggerUserId 触发解锁的用户(家长=userId,孩子=对应 FamilyMember.id 由其映射)
|
|
|
*/
|
|
|
- private void grantGateRewards(Long familyId, UnlockGate gate) {
|
|
|
+ private void grantGateRewards(Long familyId, Long triggerUserId, UnlockGate gate) {
|
|
|
if (gate.getRewardPoints() == null && gate.getRewardEnergy() == null) return;
|
|
|
- // 积分发放:通过积分服务
|
|
|
+ if (triggerUserId == null) {
|
|
|
+ log.info("关卡[{}]通关无触发用户,跳过奖励发放: familyId={}", gate.getName(), familyId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // CF值发放(平台积分,走 PlatformPointsService)
|
|
|
if (gate.getRewardPoints() != null && gate.getRewardPoints() > 0) {
|
|
|
try {
|
|
|
- // 积分发放逻辑(调用现有积分服务)
|
|
|
- // 目前先通过 energyService 的能量发放,积分部分后续接入
|
|
|
- log.info("关卡[{}]通关奖励: 积分+{}, 能量+{}, familyId={}",
|
|
|
- gate.getName(), gate.getRewardPoints(), gate.getRewardEnergy(), familyId);
|
|
|
+ platformPointsService.earn(triggerUserId, gate.getRewardPoints(),
|
|
|
+ "unlock_gate", gate.getId(), "通关奖励: " + gate.getName());
|
|
|
+ log.info("关卡[{}]通关奖励CF值+{}: userId={}", gate.getName(), gate.getRewardPoints(), triggerUserId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("关卡CF值奖励发放失败: userId={}, gateId={}, error={}",
|
|
|
+ triggerUserId, gate.getId(), e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 能量发放:家长直接用 userId,孩子映射到 FamilyMember.id(EnergyService 的 memberId 语义)
|
|
|
+ if (gate.getRewardEnergy() != null && gate.getRewardEnergy() > 0) {
|
|
|
+ Long energyMemberId = triggerUserId;
|
|
|
+ try {
|
|
|
+ if (familyId != null) {
|
|
|
+ FamilyMember fm = familyMemberMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<FamilyMember>()
|
|
|
+ .eq(FamilyMember::getFamilyId, familyId)
|
|
|
+ .eq(FamilyMember::getUserId, triggerUserId)
|
|
|
+ .last("LIMIT 1"));
|
|
|
+ if (fm != null) {
|
|
|
+ energyMemberId = fm.getId();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ energyService.awardEnergy(energyMemberId, "unlock_gate", gate.getId(),
|
|
|
+ gate.getRewardEnergy(), "通关奖励: " + gate.getName(), null);
|
|
|
+ log.info("关卡[{}]通关奖励能量+{}: memberId={}", gate.getName(), gate.getRewardEnergy(), energyMemberId);
|
|
|
} catch (Exception e) {
|
|
|
- log.warn("关卡奖励发放失败: {}", e.getMessage());
|
|
|
+ log.warn("关卡能量奖励发放失败: memberId={}, gateId={}, error={}",
|
|
|
+ energyMemberId, gate.getId(), e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
}
|