| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- package com.linkwechat.service.impl;
- import cn.hutool.core.bean.BeanUtil;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.linkwechat.common.exception.wecom.WeComException;
- import com.linkwechat.domain.*;
- import com.linkwechat.domain.activity.query.WeActivityAddQuery;
- import com.linkwechat.domain.activity.query.WeActivityEditQuery;
- import com.linkwechat.domain.activity.query.WeActivityListQuery;
- import com.linkwechat.domain.activity.vo.FormRecordVo;
- import com.linkwechat.domain.activity.vo.WeActivityListVo;
- import com.linkwechat.domain.activity.vo.WeActivityVo;
- import com.linkwechat.domain.activity.vo.WinRecordVo;
- import com.linkwechat.domain.prize.query.WePrizeAddQuery;
- import com.linkwechat.mapper.WeActivityMapper;
- import com.linkwechat.mapper.WeApplicationFormRecordMapper;
- import com.linkwechat.service.*;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import javax.annotation.Resource;
- import java.math.BigDecimal;
- import java.util.List;
- import java.util.Objects;
- /**
- * @author quchen
- * @date 2025/8/27 15:36
- */
- @Service
- public class WeActivityServiceImpl extends ServiceImpl<WeActivityMapper, WeActivity> implements IWeActivityService {
- @Resource
- private IWePrizeService wePrizeService;
- @Resource
- private IWeActivityFieldService weActivityFieldService;
- @Resource
- private WeApplicationFormRecordMapper weApplicationFormRecordMapper;
- @Override
- @Transactional
- public WeActivity addActivity(WeActivityAddQuery query) {
- WeActivity weActivity = new WeActivity();
- BeanUtil.copyProperties(query, weActivity);
- weActivity.setActStatus(2);
- this.save(weActivity);
- // 生成活动链接
- weActivity.setActUrl("http://192.168.0.106:6180/open/activity/getActivity?actId=" + weActivity.getActId());
- // 更新活动链接
- this.updateById(weActivity);
- // 获取活动类型
- String actType = query.getActType();
- if (query.getActType().equals("4")) {
- for (WePrizeAddQuery prize : query.getActPrizeList()) {
- WeActivityField weActivityField = new WeActivityField();
- weActivityField.setActId(weActivity.getActId());
- weActivityField.setFieldName(prize.getPrizeName());
- weActivityField.setFieldValue(prize.getPrizeContent());
- weActivityFieldService.save(weActivityField);
- }
- } else {
- boolean needVerifyProbability = (actType.equals("1") || actType.equals("2"));
- int totalPercent = 0;
- for (WePrizeAddQuery prize : query.getActPrizeList()) {
- if (needVerifyProbability) {
- Integer winPercent = prize.getWinPercent();
- if (winPercent == null || winPercent < 0 || winPercent > 100) {
- throw new WeComException("中奖概率必须是0-100之间的整数");
- }
- totalPercent += winPercent;
- }
- WePrize wePrize = new WePrize();
- wePrize.setPrizeName(prize.getPrizeName());
- wePrize.setPrizeType(prize.getPrizeType() != null ? Integer.parseInt(prize.getPrizeType()) : 0);
- wePrize.setActId(weActivity.getActId());
- wePrize.setPrizeNum(prize.getPrizeNum());
- setPrizeSpecificFields(wePrize, prize);
- if (needVerifyProbability) {
- wePrize.setWinPercent(prize.getWinPercent());
- }
- wePrizeService.save(wePrize);
- }
- // 只有抽奖和转盘类型需要验证概率总和
- if (needVerifyProbability && totalPercent != 100) {
- throw new WeComException("抽奖类活动奖品中奖概率总和必须为100");
- }
- }
- return weActivity;
- }
- private void setPrizeSpecificFields(WePrize wePrize, WePrizeAddQuery prizeQuery) {
- String prizeType = prizeQuery.getPrizeType();
- if (prizeQuery.getPrizeContent() != null && !prizeQuery.getPrizeContent().equals("") ) {
- String prizeContent = prizeQuery.getPrizeContent();
- switch (prizeType) {
- case "1": // 优惠券
- wePrize.setEquityId(prizeContent);
- break;
- case "2": // 积分
- wePrize.setPointValue(Integer.valueOf(prizeContent));
- break;
- case "5": // 谢谢参与
- wePrize.setPrizeName("谢谢参与");
- wePrize.setPrizeType(5);
- break;
- default:
- throw new WeComException("不支持的奖品类型: " + prizeType);
- }
- }
- //
- if (prizeQuery.getPrizeType().equals("3")) {
- wePrize.setVipId("1935579715119136769"); // 青铜会员 id
- }
- // 红包
- if (prizeQuery.getPrizeType().equals("4")) {
- wePrize.setPrizeName("红包");
- // 红包金额
- wePrize.setRedRacketAmount(new BigDecimal(prizeQuery.getRedRacketAmount()));
- // 裂变规则
- wePrize.setRedRacketRules(prizeQuery.getRedRacketRule());
- // 红包数量
- wePrize.setPrizeNum(prizeQuery.getPrizeNum());
- // 红包预算
- BigDecimal budget = new BigDecimal(prizeQuery.getRedRacketAmount()).multiply(new BigDecimal(prizeQuery.getPrizeNum()));
- if (budget.compareTo(new BigDecimal(prizeQuery.getRedRacketBudget())) != 0) {
- throw new WeComException("红包预算与红包金额乘积必须等于红包预算");
- }
- wePrize.setRedRacketBudget(new BigDecimal(prizeQuery.getRedRacketBudget()));
- }
- }
- @Override
- @Transactional
- public WeActivity editActivity(WeActivityEditQuery query) {
- WeActivity weActivity = getById(query.getActId());
- if (Objects.isNull(weActivity)) {
- throw new WeComException("活动不存在");
- }
- BeanUtil.copyProperties(query, weActivity);
- updateById(weActivity);
- Long actId = weActivity.getActId();
- String actType = query.getActType();
- if (query.getActType().equals("4")) {
- List<WeActivityField> existingField = weActivityFieldService.list(new LambdaQueryWrapper<WeActivityField>().eq(WeActivityField::getActId, actId));
- for (WeActivityField field : existingField) {
- // 删除奖品主表数据
- weActivityFieldService.removeById(field.getId());
- }
- for (WePrizeAddQuery prize : query.getActPrizeList()) {
- WeActivityField weActivityField = new WeActivityField();
- weActivityField.setActId(weActivity.getActId());
- weActivityField.setFieldName(prize.getPrizeName());
- weActivityField.setFieldValue(prize.getPrizeContent());
- weActivityFieldService.save(weActivityField);
- }
- } else {
- List<WePrize> existingPrizes = wePrizeService.list(new LambdaQueryWrapper<WePrize>().eq(WePrize::getActId, actId));
- for (WePrize prize : existingPrizes) {
- // 删除奖品主表数据
- wePrizeService.removeById(prize.getId());
- }
- List<WePrizeAddQuery> newPrizeList = query.getActPrizeList();
- boolean needVerifyProbability = (actType.equals("1") || actType.equals("2"));
- int totalPercent = 0;
- for (WePrizeAddQuery prize : query.getActPrizeList()) {
- if (needVerifyProbability) {
- Integer winPercent = prize.getWinPercent();
- if (winPercent == null || winPercent < 0 || winPercent > 100) {
- throw new WeComException("中奖概率必须是0-100之间的整数");
- }
- totalPercent += winPercent;
- }
- WePrize wePrize = new WePrize();
- wePrize.setPrizeName(prize.getPrizeName());
- wePrize.setPrizeType(prize.getPrizeType() != null ? Integer.parseInt(prize.getPrizeType()) : 0);
- wePrize.setActId(weActivity.getActId());
- wePrize.setPrizeNum(prize.getPrizeNum());
- setPrizeSpecificFields(wePrize, prize);
- if (needVerifyProbability) {
- wePrize.setWinPercent(prize.getWinPercent());
- }
- wePrizeService.save(wePrize);
- }
- // 只有抽奖和转盘类型需要验证概率总和
- if (needVerifyProbability && totalPercent != 100) {
- throw new WeComException("抽奖类活动奖品中奖概率总和必须为100");
- }
- }
- return weActivity;
- }
- @Override
- public boolean editActivityStatus(Long actId, Integer status) {
- WeActivity weActivity = getById(actId);
- if (Objects.isNull(weActivity)) {
- throw new WeComException("活动不存在");
- }
- weActivity.setActStatus(status);
- updateById(weActivity);
- return true;
- }
- @Override
- public List<WeActivityListVo> listActivity(WeActivityListQuery query) {
- List<WeActivityListVo> list = this.baseMapper.queryActivityList(query);
- list.forEach(vo -> {
- if (vo.getActType()== 4) {
- List<FormRecordVo> formRecordList = selectFormRecordByActId(vo.getActId().toString());
- vo.setListNum(formRecordList.size());
- }
- if (vo.getActType() == 1 || vo.getActType() == 2) {
- // 中奖人数
- List<WinRecordVo> winNumList = selectWinRecordByActId(vo.getActId().toString(),"中奖人数");
- vo.setWinNum(winNumList.size());
- // 参与人数
- List<WinRecordVo> partNum = selectWinRecordByActId(vo.getActId().toString(), "");
- vo.setListNum(partNum.size());
- }
- });
- return list;
- }
- public List<FormRecordVo> selectFormRecordByActId(String actId) {
- return weApplicationFormRecordMapper.selectFormRecordByActId(actId);
- }
- public List<WinRecordVo> selectWinRecordByActId(String actId , String prizeType) {
- return weApplicationFormRecordMapper.selectWinRecordByActId(actId, prizeType);
- }
- @Override
- public WeActivityVo getActivity(String actId) {
- return this.baseMapper.getActivity(actId);
- }
- }
|