充值礼包

This commit is contained in:
DESKTOP-5RP3AKU\Jisol 2024-01-20 02:00:49 +08:00
parent 79c5ef00f7
commit 8af1ac9484
17 changed files with 295 additions and 9 deletions

Binary file not shown.

View File

@ -16,7 +16,7 @@ export const RData = (data:any,isTips:boolean = false) => {
})
}
//如果有 rewards 字段 表示要弹出获得资源
if(data.data['rewards']){
if(data.data['rewards'] && data.data['rewards'].length){
//弹出获得资源
app.layer.Open(GUI.RewardClaimView,data.data['rewards'])
}

View File

@ -7,10 +7,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableRetry
@MapperScan(basePackages = "cn.jisol.game.mapper")
@SpringBootApplication
@EnableScheduling
public class JGameApplication {
public static void main(String[] args) {
SpringBeanUtils.context = SpringApplication.run(JGameApplication.class);

View File

@ -24,4 +24,7 @@ public interface GActionEnum {
int CR_REFEREE_PVP_MODE = 4001; //裁决PVP模式
int CR_REFEREE_PVP_END = 4002; //裁决PVP结束
/************** 任务推送 ****************/
int C_TASK_PUSH_DAY_RESET = 5001; //任务推送 - 每天重置
}

View File

@ -18,11 +18,11 @@ public class HTTPExceptionHandler {
return NewsContext.onMessage("Token 失效",null,LOGIN_TOKEN);
}
//材料不够
//资源不够
@ExceptionHandler(value = ResourceNotException.class)
@ResponseBody
public NewsContext<String> retryExceptionHandler(ResourceNotException e){
return NewsContext.onFail("材料不够.");
return NewsContext.onFail(e.getMessage());
}
//并发异常

View File

@ -0,0 +1,114 @@
package cn.jisol.game.controller.game;
import cfg.TB.TbGGift;
import cfg.TbGEnum.TGiftLimit;
import cn.jisol.game.controller.argsresolver.CurrentPlayer;
import cn.jisol.game.controller.exception.ResourceNotException;
import cn.jisol.game.data.ResourceId;
import cn.jisol.game.data.TD;
import cn.jisol.game.entity.table.GiftDayRecord;
import cn.jisol.game.entity.table.GiftRecord;
import cn.jisol.game.entity.table.Player;
import cn.jisol.game.entity.table.PlayerPet;
import cn.jisol.game.service.GiftDayRecordService;
import cn.jisol.game.service.GiftRecordService;
import cn.jisol.game.service.ResourceService;
import cn.jisol.game.vo.news.NewsReward;
import cn.jisol.game.vo.news.ov.ResourceUpdateOV;
import cn.jisol.ngame.util.NewsContext;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@Api(value = "JNGameDemo - API", tags = {"礼包 - API"})
@RestController
@RequestMapping("/game/gift")
@ResponseBody
public class GiftController {
@Autowired
ResourceService resourceService;
@Autowired
GiftRecordService giftRecordService;
@Autowired
GiftDayRecordService giftDayRecordService;
//购买指定礼包
@ApiImplicitParams({})
@ApiOperation(value = "购买指定礼包")
@PostMapping("/buy/{giftId}")
@Transactional
public NewsReward<Boolean> buy(@CurrentPlayer Player player, @PathVariable Integer giftId){
TbGGift gift = TD.DATA.getTbGGift().get(giftId);
if(Objects.isNull(gift)) return NewsReward.onFail("暂无该礼包");
//判断是否可以购买当前礼包
if(gift.limit == TGiftLimit.DayLimit){
//每天限制购买
if(gift.limitValue <= giftDayRecordService.count(Wrappers.lambdaQuery(GiftDayRecord.class).eq(GiftDayRecord::getPlayerId,player.getPlayerId()).eq(GiftDayRecord::getGiftCfgId,gift.id))){
return NewsReward.onFail("今天买太多啦 每天再买哦");
}
}
if(gift.limit == TGiftLimit.Limit){
//每天限制购买
if(gift.limitValue <= giftRecordService.count(Wrappers.lambdaQuery(GiftRecord.class).eq(GiftRecord::getPlayerId,player.getPlayerId()).eq(GiftRecord::getGiftCfgId,gift.id))){
return NewsReward.onFail("当前礼包买太多了 看看其他礼包哦");
}
}
resourceService.addResourceValue(player.getPlayerId(), ResourceId.GiftCoupons.id, (long) -gift.price);
//发放奖励
List<ResourceUpdateOV> ovs = resourceService.rewards(player.getPlayerId(), gift.rewards);
GiftRecord giftRecord = GiftRecord.builder()
.playerId(player.getPlayerId())
.giftCfgId(gift.id)
.giftCfgName(gift.name)
.giftCfgRewards(Arrays.asList(gift.rewards))
.giftCfgPrice(gift.price)
.giftBuyingTime(new Date().getTime())
.build();
//保存购买记录
giftRecordService.save(giftRecord);
giftDayRecordService.save(GiftDayRecord.builder()
.playerId(giftRecord.getPlayerId())
.giftId(giftRecord.getGiftId())
.giftCfgId(giftRecord.getGiftCfgId())
.build());
return NewsReward.onSuccess("购买成功",true,ovs, Arrays.asList(gift.rewards));
}
//查询当天购买记录
@ApiImplicitParams({})
@ApiOperation(value = "查询当天购买记录")
@GetMapping("/record/day")
public NewsContext<List<GiftDayRecord>> getGiftDayRecord(@CurrentPlayer Player player){
return NewsContext.onSuccess("查询成功",giftDayRecordService.list(
Wrappers.lambdaQuery(GiftDayRecord.class)
.eq(GiftDayRecord::getPlayerId,player.getPlayerId())
));
}
}

View File

@ -14,6 +14,8 @@ public enum ResourceId {
DungeonForgedStones(90005),
//:一品宠物魂
Q1S(90006),
//兑换券
GiftCoupons(90007),
;
public int id;

View File

@ -0,0 +1,25 @@
package cn.jisol.game.entity.table;
import cfg.TbGEntity.TReward;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Builder
@Data
@TableName("`gift_day_record`")
public class GiftDayRecord {
@TableId(type = IdType.AUTO)
private Long giftDayId; //礼包Id
private Long playerId; //玩家Id
private Long giftId; //礼包价格
private Integer giftCfgId; //礼包配置表Id
}

View File

@ -0,0 +1,31 @@
package cn.jisol.game.entity.table;
import cfg.TbGEntity.TReward;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Builder
@Data
@TableName("`gift_record`")
public class GiftRecord {
@TableId(type = IdType.AUTO)
private Long giftId; //礼包Id
private Long playerId; //玩家Id
private Integer giftCfgId; //礼包配置表Id
private String giftCfgName; //礼包名称
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<TReward> giftCfgRewards; //礼包奖励
private Integer giftCfgPrice; //礼包价格
private Long giftBuyingTime; //礼包购买时间戳
}

View File

@ -0,0 +1,45 @@
package cn.jisol.game.manager;
import cn.jisol.game.actions.GActionEnum;
import cn.jisol.game.entity.table.GiftDayRecord;
import cn.jisol.game.network.WebSocket;
import cn.jisol.game.network.client.GClient;
import cn.jisol.game.service.GiftDayRecordService;
import cn.jisol.game.service.GiftRecordService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class GScheduledManager {
@Autowired
GiftDayRecordService giftDayRecordService;
//获取所有在线玩家
public Map<String, GClient> getClients(){
return WebSocket.CLIENTS;
}
//每天重置 任务
@Scheduled(cron="0 0 0 * * ?")
public void dayReset(){
System.out.println("定时器执行[每天重置] ScheduledManager - dayReset");
//重置每日礼包记录
giftDayRecordService.remove(Wrappers.lambdaQuery(GiftDayRecord.class));
System.out.println("定时器执行[每天重置] ScheduledManager - dayReset : 重置每日礼包记录");
//通知所有玩家 - 每天重置结束
getClients().values().forEach(client1 -> {
client1.invoke(GActionEnum.C_TASK_PUSH_DAY_RESET);
});
}
}

View File

@ -0,0 +1,11 @@
package cn.jisol.game.mapper;
import cn.jisol.game.entity.table.GiftDayRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Component;
@Component
public interface GiftDayRecordMapper extends BaseMapper<GiftDayRecord> {
}

View File

@ -0,0 +1,11 @@
package cn.jisol.game.mapper;
import cn.jisol.game.entity.table.GiftRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Component;
@Component
public interface GiftRecordMapper extends BaseMapper<GiftRecord> {
}

View File

@ -0,0 +1,9 @@
package cn.jisol.game.service;
import cn.jisol.game.entity.table.GiftDayRecord;
import cn.jisol.game.entity.table.GiftRecord;
import com.baomidou.mybatisplus.extension.service.IService;
public interface GiftDayRecordService extends IService<GiftDayRecord> {
}

View File

@ -0,0 +1,9 @@
package cn.jisol.game.service;
import cn.jisol.game.entity.table.Dungeon;
import cn.jisol.game.entity.table.GiftRecord;
import com.baomidou.mybatisplus.extension.service.IService;
public interface GiftRecordService extends IService<GiftRecord> {
}

View File

@ -0,0 +1,11 @@
package cn.jisol.game.service.impl;
import cn.jisol.game.entity.table.GiftDayRecord;
import cn.jisol.game.mapper.GiftDayRecordMapper;
import cn.jisol.game.service.GiftDayRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class GiftDayRecordServiceImpl extends ServiceImpl<GiftDayRecordMapper, GiftDayRecord> implements GiftDayRecordService {
}

View File

@ -0,0 +1,11 @@
package cn.jisol.game.service.impl;
import cn.jisol.game.entity.table.GiftRecord;
import cn.jisol.game.mapper.GiftRecordMapper;
import cn.jisol.game.service.GiftRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class GiftRecordServiceImpl extends ServiceImpl<GiftRecordMapper, GiftRecord> implements GiftRecordService {
}

View File

@ -1,5 +1,6 @@
package cn.jisol.game.service.impl;
import cfg.TB.TbGResource;
import cfg.TbGEntity.TResource;
import cfg.TbGEntity.TReward;
import cn.jisol.game.controller.exception.GeneralException;
@ -39,6 +40,7 @@ public class ResourceServiceImpl extends ServiceImpl<ResourceMapper, Resource> i
@Override
public Resource addResourceValue(Long playerId, int type, Long value) {
TbGResource tbGResource = TD.DATA.getTbGResource().get(type);
LambdaUpdateWrapper<Resource> eq = Wrappers.lambdaUpdate(Resource.class)
.eq(Resource::getPlayerId, playerId) //玩家
@ -71,17 +73,17 @@ public class ResourceServiceImpl extends ServiceImpl<ResourceMapper, Resource> i
throw new RetryException("服务器忙碌啦");
}
}else{
throw new ResourceNotException("资源不够");
throw new ResourceNotException(tbGResource.name+"不够");
}
}else{
//更新失败 材料不够
throw new ResourceNotException("资源不够");
throw new ResourceNotException(tbGResource.name+"资源不够");
}
}
//如果资源不够则报错
if(res.getResourceValue() < 0) throw new ResourceNotException("资源不够");
if(res.getResourceValue() < 0) throw new ResourceNotException(tbGResource.name+"资源不够");
return res;