WeActivityServiceImpl.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package com.linkwechat.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.linkwechat.common.exception.wecom.WeComException;
  6. import com.linkwechat.domain.*;
  7. import com.linkwechat.domain.activity.query.WeActivityAddQuery;
  8. import com.linkwechat.domain.activity.query.WeActivityEditQuery;
  9. import com.linkwechat.domain.activity.query.WeActivityListQuery;
  10. import com.linkwechat.domain.activity.vo.FormRecordVo;
  11. import com.linkwechat.domain.activity.vo.WeActivityListVo;
  12. import com.linkwechat.domain.activity.vo.WeActivityVo;
  13. import com.linkwechat.domain.activity.vo.WinRecordVo;
  14. import com.linkwechat.domain.prize.query.WePrizeAddQuery;
  15. import com.linkwechat.mapper.WeActivityMapper;
  16. import com.linkwechat.mapper.WeApplicationFormRecordMapper;
  17. import com.linkwechat.service.*;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import javax.annotation.Resource;
  21. import java.math.BigDecimal;
  22. import java.util.List;
  23. import java.util.Objects;
  24. /**
  25. * @author quchen
  26. * @date 2025/8/27 15:36
  27. */
  28. @Service
  29. public class WeActivityServiceImpl extends ServiceImpl<WeActivityMapper, WeActivity> implements IWeActivityService {
  30. @Resource
  31. private IWePrizeService wePrizeService;
  32. @Resource
  33. private IWeActivityFieldService weActivityFieldService;
  34. @Resource
  35. private WeApplicationFormRecordMapper weApplicationFormRecordMapper;
  36. @Override
  37. @Transactional
  38. public WeActivity addActivity(WeActivityAddQuery query) {
  39. WeActivity weActivity = new WeActivity();
  40. BeanUtil.copyProperties(query, weActivity);
  41. weActivity.setActStatus(2);
  42. this.save(weActivity);
  43. // 生成活动链接
  44. weActivity.setActUrl("http://192.168.0.106:6180/open/activity/getActivity?actId=" + weActivity.getActId());
  45. // 更新活动链接
  46. this.updateById(weActivity);
  47. // 获取活动类型
  48. String actType = query.getActType();
  49. if (query.getActType().equals("4")) {
  50. for (WePrizeAddQuery prize : query.getActPrizeList()) {
  51. WeActivityField weActivityField = new WeActivityField();
  52. weActivityField.setActId(weActivity.getActId());
  53. weActivityField.setFieldName(prize.getPrizeName());
  54. weActivityField.setFieldValue(prize.getPrizeContent());
  55. weActivityFieldService.save(weActivityField);
  56. }
  57. } else {
  58. boolean needVerifyProbability = (actType.equals("1") || actType.equals("2"));
  59. int totalPercent = 0;
  60. for (WePrizeAddQuery prize : query.getActPrizeList()) {
  61. if (needVerifyProbability) {
  62. Integer winPercent = prize.getWinPercent();
  63. if (winPercent == null || winPercent < 0 || winPercent > 100) {
  64. throw new WeComException("中奖概率必须是0-100之间的整数");
  65. }
  66. totalPercent += winPercent;
  67. }
  68. WePrize wePrize = new WePrize();
  69. wePrize.setPrizeName(prize.getPrizeName());
  70. wePrize.setPrizeType(prize.getPrizeType() != null ? Integer.parseInt(prize.getPrizeType()) : 0);
  71. wePrize.setActId(weActivity.getActId());
  72. wePrize.setPrizeNum(prize.getPrizeNum());
  73. setPrizeSpecificFields(wePrize, prize);
  74. if (needVerifyProbability) {
  75. wePrize.setWinPercent(prize.getWinPercent());
  76. }
  77. wePrizeService.save(wePrize);
  78. }
  79. // 只有抽奖和转盘类型需要验证概率总和
  80. if (needVerifyProbability && totalPercent != 100) {
  81. throw new WeComException("抽奖类活动奖品中奖概率总和必须为100");
  82. }
  83. }
  84. return weActivity;
  85. }
  86. private void setPrizeSpecificFields(WePrize wePrize, WePrizeAddQuery prizeQuery) {
  87. String prizeType = prizeQuery.getPrizeType();
  88. if (prizeQuery.getPrizeContent() != null && !prizeQuery.getPrizeContent().equals("") ) {
  89. String prizeContent = prizeQuery.getPrizeContent();
  90. switch (prizeType) {
  91. case "1": // 优惠券
  92. wePrize.setEquityId(prizeContent);
  93. break;
  94. case "2": // 积分
  95. wePrize.setPointValue(Integer.valueOf(prizeContent));
  96. break;
  97. case "5": // 谢谢参与
  98. wePrize.setPrizeName("谢谢参与");
  99. wePrize.setPrizeType(5);
  100. break;
  101. default:
  102. throw new WeComException("不支持的奖品类型: " + prizeType);
  103. }
  104. }
  105. //
  106. if (prizeQuery.getPrizeType().equals("3")) {
  107. wePrize.setVipId("1935579715119136769"); // 青铜会员 id
  108. }
  109. // 红包
  110. if (prizeQuery.getPrizeType().equals("4")) {
  111. wePrize.setPrizeName("红包");
  112. // 红包金额
  113. wePrize.setRedRacketAmount(new BigDecimal(prizeQuery.getRedRacketAmount()));
  114. // 裂变规则
  115. wePrize.setRedRacketRules(prizeQuery.getRedRacketRule());
  116. // 红包数量
  117. wePrize.setPrizeNum(prizeQuery.getPrizeNum());
  118. // 红包预算
  119. BigDecimal budget = new BigDecimal(prizeQuery.getRedRacketAmount()).multiply(new BigDecimal(prizeQuery.getPrizeNum()));
  120. if (budget.compareTo(new BigDecimal(prizeQuery.getRedRacketBudget())) != 0) {
  121. throw new WeComException("红包预算与红包金额乘积必须等于红包预算");
  122. }
  123. wePrize.setRedRacketBudget(new BigDecimal(prizeQuery.getRedRacketBudget()));
  124. }
  125. }
  126. @Override
  127. @Transactional
  128. public WeActivity editActivity(WeActivityEditQuery query) {
  129. WeActivity weActivity = getById(query.getActId());
  130. if (Objects.isNull(weActivity)) {
  131. throw new WeComException("活动不存在");
  132. }
  133. BeanUtil.copyProperties(query, weActivity);
  134. updateById(weActivity);
  135. Long actId = weActivity.getActId();
  136. String actType = query.getActType();
  137. if (query.getActType().equals("4")) {
  138. List<WeActivityField> existingField = weActivityFieldService.list(new LambdaQueryWrapper<WeActivityField>().eq(WeActivityField::getActId, actId));
  139. for (WeActivityField field : existingField) {
  140. // 删除奖品主表数据
  141. weActivityFieldService.removeById(field.getId());
  142. }
  143. for (WePrizeAddQuery prize : query.getActPrizeList()) {
  144. WeActivityField weActivityField = new WeActivityField();
  145. weActivityField.setActId(weActivity.getActId());
  146. weActivityField.setFieldName(prize.getPrizeName());
  147. weActivityField.setFieldValue(prize.getPrizeContent());
  148. weActivityFieldService.save(weActivityField);
  149. }
  150. } else {
  151. List<WePrize> existingPrizes = wePrizeService.list(new LambdaQueryWrapper<WePrize>().eq(WePrize::getActId, actId));
  152. for (WePrize prize : existingPrizes) {
  153. // 删除奖品主表数据
  154. wePrizeService.removeById(prize.getId());
  155. }
  156. List<WePrizeAddQuery> newPrizeList = query.getActPrizeList();
  157. boolean needVerifyProbability = (actType.equals("1") || actType.equals("2"));
  158. int totalPercent = 0;
  159. for (WePrizeAddQuery prize : query.getActPrizeList()) {
  160. if (needVerifyProbability) {
  161. Integer winPercent = prize.getWinPercent();
  162. if (winPercent == null || winPercent < 0 || winPercent > 100) {
  163. throw new WeComException("中奖概率必须是0-100之间的整数");
  164. }
  165. totalPercent += winPercent;
  166. }
  167. WePrize wePrize = new WePrize();
  168. wePrize.setPrizeName(prize.getPrizeName());
  169. wePrize.setPrizeType(prize.getPrizeType() != null ? Integer.parseInt(prize.getPrizeType()) : 0);
  170. wePrize.setActId(weActivity.getActId());
  171. wePrize.setPrizeNum(prize.getPrizeNum());
  172. setPrizeSpecificFields(wePrize, prize);
  173. if (needVerifyProbability) {
  174. wePrize.setWinPercent(prize.getWinPercent());
  175. }
  176. wePrizeService.save(wePrize);
  177. }
  178. // 只有抽奖和转盘类型需要验证概率总和
  179. if (needVerifyProbability && totalPercent != 100) {
  180. throw new WeComException("抽奖类活动奖品中奖概率总和必须为100");
  181. }
  182. }
  183. return weActivity;
  184. }
  185. @Override
  186. public boolean editActivityStatus(Long actId, Integer status) {
  187. WeActivity weActivity = getById(actId);
  188. if (Objects.isNull(weActivity)) {
  189. throw new WeComException("活动不存在");
  190. }
  191. weActivity.setActStatus(status);
  192. updateById(weActivity);
  193. return true;
  194. }
  195. @Override
  196. public List<WeActivityListVo> listActivity(WeActivityListQuery query) {
  197. List<WeActivityListVo> list = this.baseMapper.queryActivityList(query);
  198. list.forEach(vo -> {
  199. if (vo.getActType()== 4) {
  200. List<FormRecordVo> formRecordList = selectFormRecordByActId(vo.getActId().toString());
  201. vo.setListNum(formRecordList.size());
  202. }
  203. if (vo.getActType() == 1 || vo.getActType() == 2) {
  204. // 中奖人数
  205. List<WinRecordVo> winNumList = selectWinRecordByActId(vo.getActId().toString(),"中奖人数");
  206. vo.setWinNum(winNumList.size());
  207. // 参与人数
  208. List<WinRecordVo> partNum = selectWinRecordByActId(vo.getActId().toString(), "");
  209. vo.setListNum(partNum.size());
  210. }
  211. });
  212. return list;
  213. }
  214. public List<FormRecordVo> selectFormRecordByActId(String actId) {
  215. return weApplicationFormRecordMapper.selectFormRecordByActId(actId);
  216. }
  217. public List<WinRecordVo> selectWinRecordByActId(String actId , String prizeType) {
  218. return weApplicationFormRecordMapper.selectWinRecordByActId(actId, prizeType);
  219. }
  220. @Override
  221. public WeActivityVo getActivity(String actId) {
  222. return this.baseMapper.getActivity(actId);
  223. }
  224. }