MetaUserPropService.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package com.izouma.nineth.service;
  2. import com.izouma.nineth.domain.MetaProp;
  3. import com.izouma.nineth.domain.MetaUserProp;
  4. import com.izouma.nineth.dto.MetaRestResult;
  5. import com.izouma.nineth.dto.PageQuery;
  6. import com.izouma.nineth.enums.MetaPropOperationType;
  7. import com.izouma.nineth.enums.MetaPropUsedType;
  8. import com.izouma.nineth.repo.MetaPropRepo;
  9. import com.izouma.nineth.repo.MetaUserPropRepo;
  10. import com.izouma.nineth.utils.JpaUtils;
  11. import lombok.AllArgsConstructor;
  12. import org.springframework.data.domain.Page;
  13. import org.springframework.stereotype.Service;
  14. import javax.transaction.Transactional;
  15. import java.util.Objects;
  16. @Service
  17. @AllArgsConstructor
  18. public class MetaUserPropService {
  19. private MetaUserPropRepo metaUserPropRepo;
  20. private MetaPropRepo metaPropRepo;
  21. private MetaUserPropRecordService metaUserPropRecordService;
  22. private MetaUserGoldService metaUserGoldService;
  23. public Page<MetaUserProp> all(PageQuery pageQuery) {
  24. return metaUserPropRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaUserProp.class), JpaUtils.toPageRequest(pageQuery));
  25. }
  26. @Transactional
  27. public MetaRestResult<MetaUserProp> operate(Long userId, Long metaPropId, MetaPropOperationType operationType, int num) {
  28. if (Objects.isNull(metaPropId)) {
  29. return MetaRestResult.returnError("Illegal parameter : metaPropId can not be null");
  30. }
  31. MetaProp metaProp = metaPropRepo.findById(metaPropId).orElse(null);
  32. if (Objects.isNull(metaProp)) {
  33. return MetaRestResult.returnError("道具不存在!");
  34. }
  35. MetaUserProp dbMetaUserProp = metaUserPropRepo.findByUserIdAndMetaPropIdAndDel(userId, metaPropId, false);
  36. if (MetaPropOperationType.RECEIVE.equals(operationType)) {
  37. if (num < 1) {
  38. return MetaRestResult.returnError("道具数量最少为1");
  39. }
  40. return receive(userId, dbMetaUserProp, metaProp, num);
  41. }
  42. if (MetaPropOperationType.CANCEL_USE.equals(operationType)) {
  43. return cancelUse(dbMetaUserProp, metaProp);
  44. }
  45. return use(dbMetaUserProp, metaProp);
  46. }
  47. /**
  48. * 永久道具 取消使用
  49. *
  50. * @param metaUserProp 永久道具持有信息
  51. * @param metaProp 道具信息
  52. * @return
  53. */
  54. @Transactional
  55. public MetaRestResult<MetaUserProp> cancelUse(MetaUserProp metaUserProp, MetaProp metaProp) {
  56. if (Objects.isNull(metaUserProp)) {
  57. return MetaRestResult.returnError("玩家未拥有该道具!");
  58. }
  59. if (!MetaPropUsedType.PERMANENT.equals(metaProp.getUsedType())) {
  60. return MetaRestResult.returnError("仅限永久道具才能取消使用!");
  61. }
  62. metaUserProp.setUsed(false);
  63. metaUserPropRecordService.save(metaUserProp.getUserId(), metaProp, MetaPropOperationType.CANCEL_USE, 1);
  64. return MetaRestResult.returnSuccess("取消使用成功", metaUserPropRepo.save(metaUserProp));
  65. }
  66. /**
  67. * 获得道具
  68. *
  69. * @param userId 用户id
  70. * @param metaUserProp 道具持有信息
  71. * @param metaProp 道具信息
  72. * @param num 数量
  73. * @return
  74. */
  75. @Transactional
  76. public MetaRestResult<MetaUserProp> receive(Long userId, MetaUserProp metaUserProp, MetaProp metaProp, int num) {
  77. boolean init = false;
  78. if (Objects.isNull(metaUserProp)) {
  79. metaUserProp = MetaUserProp.create(userId, metaProp, num);
  80. init = true;
  81. } else {
  82. metaUserProp.setNum(metaUserProp.getNum() + num);
  83. }
  84. if (MetaPropUsedType.PERMANENT.equals(metaProp.getUsedType()) && 1 < metaUserProp.getNum()) {
  85. int metaPropPrice = metaProp.getGoldNum();
  86. int metaPropNum = metaUserProp.getNum() - 1;
  87. if (0 >= metaPropPrice) {
  88. metaPropPrice = 100;
  89. }
  90. int goldNum = metaPropPrice * metaPropNum;
  91. metaUserGoldService.changeNum(userId, goldNum, String.format("永久道具:[%S],数量:[%S],单价:[%S],转化成金币[%S]", metaProp.getId(), metaPropNum, metaPropPrice, goldNum));
  92. // 未拥有该道具,领取一个,多余转化为金币
  93. if (init) {
  94. metaUserProp.setNum(1);
  95. MetaUserProp save = metaUserPropRepo.save(metaUserProp);
  96. metaUserPropRecordService.save(metaUserProp.getUserId(), metaProp, MetaPropOperationType.RECEIVE, 1);
  97. return MetaRestResult.returnSuccess(String.format("永久道具仅限持有一个,多余道具将转化为[%S]个金币!", goldNum), save);
  98. }
  99. // 已拥有该道具,全部转为道具后返回
  100. return MetaRestResult.returnSuccess(String.format("玩家已拥有该道具,所领取的道具将转化为[%S]个金币!", goldNum));
  101. }
  102. MetaUserProp save = metaUserPropRepo.save(metaUserProp);
  103. metaUserPropRecordService.save(metaUserProp.getUserId(), metaProp, MetaPropOperationType.RECEIVE, num);
  104. return MetaRestResult.returnSuccess("道具领取成功!", save);
  105. }
  106. /**
  107. * 使用道具
  108. *
  109. * @param metaUserProp 道具持有信息
  110. * @param metaProp 道具信息
  111. * @return
  112. */
  113. @Transactional
  114. public MetaRestResult<MetaUserProp> use(MetaUserProp metaUserProp, MetaProp metaProp) {
  115. if (Objects.isNull(metaUserProp)) {
  116. return MetaRestResult.returnError("玩家未拥有该道具!");
  117. }
  118. // 永久道具 不对背包做操作,增加一条操作记录
  119. if (MetaPropUsedType.PERMANENT.equals(metaProp.getUsedType())) {
  120. metaUserProp.setUsed(true);
  121. metaUserPropRecordService.save(metaUserProp.getUserId(), metaProp, MetaPropOperationType.USE, 1);
  122. return MetaRestResult.returnSuccess(metaUserPropRepo.save(metaUserProp));
  123. }
  124. // 数量为1的非永久道具,成功使用后直接删除背包中该道具数据,增加一条操作记录
  125. if (1 == metaUserProp.getNum()) {
  126. metaUserProp.setNum(0);
  127. metaUserPropRecordService.save(metaUserProp.getUserId(), metaProp, MetaPropOperationType.USE, 1);
  128. metaUserPropRepo.deleteByUserIdAndMetaPropId(metaUserProp.getUserId(), metaProp.getId());
  129. return MetaRestResult.returnSuccess(metaUserProp);
  130. }
  131. // 数量大于1的非永久道具,背包中该道具数量减1,增加一条操作记录
  132. metaUserProp.setNum(metaUserProp.getNum() - 1);
  133. metaUserPropRecordService.save(metaUserProp.getUserId(), metaProp, MetaPropOperationType.USE, 1);
  134. return MetaRestResult.returnSuccess(metaUserPropRepo.save(metaUserProp));
  135. }
  136. public void aspect() {
  137. metaUserPropRepo.deleteNumZero();
  138. }
  139. }