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 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 existingField = weActivityFieldService.list(new LambdaQueryWrapper().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 existingPrizes = wePrizeService.list(new LambdaQueryWrapper().eq(WePrize::getActId, actId)); for (WePrize prize : existingPrizes) { // 删除奖品主表数据 wePrizeService.removeById(prize.getId()); } List 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 listActivity(WeActivityListQuery query) { List list = this.baseMapper.queryActivityList(query); list.forEach(vo -> { if (vo.getActType()== 4) { List formRecordList = selectFormRecordByActId(vo.getActId().toString()); vo.setListNum(formRecordList.size()); } if (vo.getActType() == 1 || vo.getActType() == 2) { // 中奖人数 List winNumList = selectWinRecordByActId(vo.getActId().toString(),"中奖人数"); vo.setWinNum(winNumList.size()); // 参与人数 List partNum = selectWinRecordByActId(vo.getActId().toString(), ""); vo.setListNum(partNum.size()); } }); return list; } public List selectFormRecordByActId(String actId) { return weApplicationFormRecordMapper.selectFormRecordByActId(actId); } public List selectWinRecordByActId(String actId , String prizeType) { return weApplicationFormRecordMapper.selectWinRecordByActId(actId, prizeType); } @Override public WeActivityVo getActivity(String actId) { return this.baseMapper.getActivity(actId); } }