|
@@ -0,0 +1,237 @@
|
|
|
|
|
+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.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;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @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 this.baseMapper.selectFormRecordByActId(actId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public List<WinRecordVo> selectWinRecordByActId(String actId , String prizeType) {
|
|
|
|
|
+ return this.baseMapper.selectWinRecordByActId(actId, prizeType);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public WeActivityVo getActivity(String actId) {
|
|
|
|
|
+ return this.baseMapper.getActivity(actId);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|