From 572df690f72ed4a077d934823f261dec39b3cc7d Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期二, 08 九月 2026 17:11:34 +0800
Subject: [PATCH] feat&bug:文档内容修改
---
cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 103 insertions(+), 0 deletions(-)
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java
index ce57566..a5280aa 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java
@@ -15,9 +15,11 @@
import com.alipay.api.response.AlipayTradeOrderSettleResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRoyaltyRelationBindResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsh.competition.entity.*;
+import com.dsh.competition.enums.CompetitionStatusEnum;
import com.dsh.competition.feignclient.account.AppUserClient;
import com.dsh.competition.feignclient.account.StudentClient;
import com.dsh.competition.feignclient.account.model.AppUser;
@@ -36,9 +38,11 @@
import com.dsh.competition.service.UserCompetitionService;
import com.dsh.competition.util.*;
import com.dsh.competition.util.wx.WxV3PayConfig;
+import cn.mb.cloud.common.core.exception.BusinessException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
@@ -85,6 +89,104 @@
@Autowired
private CompetitionService cttService;
+
+ /**
+ * 修改活动,并确保修改不会破坏既有报名记录。
+ *
+ * @param competition 管理端提交的活动信息
+ * @throws BusinessException 活动不存在、时间范围非法或人数容量不足时抛出
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateCompetition(Competition competition) throws BusinessException {
+ validateUpdateRequest(competition);
+
+ // STEP 1: 读取原活动,避免前端传入部分字段时覆盖既有数据。
+ Competition originalCompetition = getById(competition.getId());
+ if (originalCompetition == null) {
+ throw new BusinessException("活动不存在或已删除");
+ }
+
+ // STEP 2: 校验人数容量,保证已报名记录始终处于有效的活动容量内。
+ validateApplicantsNumber(competition);
+
+ // STEP 3: 仅更新活动配置;支付订单金额为快照,价格调整不会修改既有订单。
+ competition.setStatus(resolveCompetitionStatus(originalCompetition, competition));
+ updateById(competition);
+ }
+
+ /**
+ * 校验编辑请求中必填字段和基础数值范围。
+ *
+ * @param competition 待校验的活动信息
+ */
+ private void validateUpdateRequest(Competition competition) throws BusinessException {
+ if (competition == null || competition.getId() == null) {
+ throw new BusinessException("活动编号不能为空");
+ }
+ if (competition.getStartTime() == null || competition.getEndTime() == null
+ || competition.getRegisterEndTime() == null) {
+ throw new BusinessException("活动时间和截止报名时间不能为空");
+ }
+ if (competition.getApplicantsNumber() == null || competition.getApplicantsNumber() < 0) {
+ throw new BusinessException("报名人数必须为非负整数");
+ }
+ if (competition.getBaseNumber() != null && competition.getBaseNumber() < 0) {
+ throw new BusinessException("基础报名人数必须为非负整数");
+ }
+ if (competition.getStartAge() != null && competition.getEndAge() != null
+ && competition.getStartAge() > competition.getEndAge()) {
+ throw new BusinessException("报名最小年龄不能大于最大年龄");
+ }
+ validatePrices(competition);
+ }
+
+ /**
+ * 校验各支付价格不可为负数。
+ *
+ * @param competition 待校验的活动信息
+ */
+ private void validatePrices(Competition competition) throws BusinessException {
+ if ((competition.getCashPrice() != null && competition.getCashPrice() < 0)
+ || (competition.getPlayPaiCoin() != null && competition.getPlayPaiCoin() < 0)
+ || (competition.getClassPrice() != null && competition.getClassPrice() < 0)) {
+ throw new BusinessException("支付价格不能小于零");
+ }
+ }
+
+ /**
+ * 校验调整后的容量不会小于当前已报名人数。
+ *
+ * @param competition 待校验的活动信息
+ */
+ private void validateApplicantsNumber(Competition competition) throws BusinessException {
+ int registeredCount = userCompetitionService.count(new LambdaQueryWrapper<UserCompetition>()
+ .eq(UserCompetition::getCompetitionId, competition.getId()));
+ if (competition.getApplicantsNumber() < registeredCount) {
+ throw new BusinessException("报名人数不能小于已报名人数" + registeredCount);
+ }
+ }
+
+ /**
+ * 根据当前时间刷新活动状态,并保持已取消活动的取消状态。
+ *
+ * @param originalCompetition 数据库中的原活动
+ * @param competition 待保存的活动信息
+ * @return 计算后的活动状态编码
+ */
+ private Integer resolveCompetitionStatus(Competition originalCompetition, Competition competition) {
+ if (CompetitionStatusEnum.CANCELED.getCode().equals(originalCompetition.getStatus())) {
+ return CompetitionStatusEnum.CANCELED.getCode();
+ }
+ Date currentTime = new Date();
+ if (currentTime.before(competition.getStartTime())) {
+ return CompetitionStatusEnum.NOT_STARTED.getCode();
+ }
+ if (currentTime.before(competition.getEndTime())) {
+ return CompetitionStatusEnum.IN_PROGRESS.getCode();
+ }
+ return CompetitionStatusEnum.ENDED.getCode();
+ }
private String aliAppid = "2021004105665036";//支付宝appid
@@ -278,6 +380,7 @@
String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
paymentCompetition.setCode(code);
paymentCompetition.setCompetitionId(paymentCompetitionVo.getId());
+ paymentCompetition.setCompetitionStoreIds(competition.getStoreId());
paymentCompetition.setAppUserId(uid);
paymentCompetition.setPayType(paymentCompetitionVo.getPayType());
paymentCompetition.setAmount(money.doubleValue());
--
Gitblit v1.7.1