This commit is contained in:
77
2024-05-11 01:48:06 +08:00
parent 7d6f338e8b
commit 978df0ea95
14 changed files with 252 additions and 30 deletions

View File

@@ -5,6 +5,8 @@ public class RedisHttpConstant {
public static final String SYSTEM_CONFIG = REDIS_P + "system-config"; public static final String SYSTEM_CONFIG = REDIS_P + "system-config";
public static final String RESET_PASSWORD_CHECK_REDIS = REDIS_P + "resetPasswordCheck:%s"; public static final String RESET_PASSWORD_CHECK_REDIS = REDIS_P + "resetPasswordCheck:%s";
public static final String CODE_REDIS = REDIS_P + "codeIncs:%s:%s";
} }

View File

@@ -13,6 +13,9 @@ import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup; import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.xq.domain.ActivityShop; import com.ruoyi.xq.domain.ActivityShop;
import com.ruoyi.xq.dto.admin.activity.ActivityShopAdminUpdateReq;
import com.ruoyi.xq.dto.admin.activity.ActivityShopAdminVo;
import com.ruoyi.xq.enums.activity.ActivityShopStatusEnum;
import com.ruoyi.xq.service.ActivityShopService; import com.ruoyi.xq.service.ActivityShopService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -20,7 +23,7 @@ import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Arrays; import java.util.List;
/** /**
* 相亲会 * 相亲会
@@ -41,9 +44,14 @@ public class ActivityShopController extends BaseController {
*/ */
@SaCheckPermission("xq:activityShop:list") @SaCheckPermission("xq:activityShop:list")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo<ActivityShop> list(ActivityShop bo, PageQuery pageQuery) { public TableDataInfo<ActivityShopAdminVo> list(ActivityShop bo, PageQuery pageQuery) {
Page<ActivityShop> page = activityShopService.page(pageQuery.build(), Wrappers.lambdaQuery(bo)); Page<ActivityShop> page = activityShopService.page(pageQuery.build(), Wrappers.lambdaQuery(bo));
return TableDataInfo.build(page); TableDataInfo<ActivityShopAdminVo> build = TableDataInfo.build(page, ActivityShopAdminVo::new);
List<ActivityShopAdminVo> rows = build.getRows();
for (ActivityShopAdminVo row : rows) {
row.setOpenStatus(ActivityShopStatusEnum.getEnumByTime(row.getStartTime(), row.getEndTime()).getCode());
}
return build;
} }
@@ -67,7 +75,7 @@ public class ActivityShopController extends BaseController {
@Log(title = "相亲会", businessType = BusinessType.UPDATE) @Log(title = "相亲会", businessType = BusinessType.UPDATE)
@RepeatSubmit() @RepeatSubmit()
@PutMapping() @PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ActivityShop bo) { public R<Void> edit(@Validated(EditGroup.class) @RequestBody ActivityShopAdminUpdateReq bo) {
activityShopService.updateData(bo); activityShopService.updateData(bo);
return R.ok(); return R.ok();
} }

View File

@@ -10,9 +10,7 @@ import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.xq.domain.ActivityOrder; import com.ruoyi.xq.domain.ActivityOrder;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppInfo; import com.ruoyi.xq.dto.app.activity.*;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppList;
import com.ruoyi.xq.dto.app.activity.CreateOrderReq;
import com.ruoyi.xq.dto.app.common.IdReq; import com.ruoyi.xq.dto.app.common.IdReq;
import com.ruoyi.xq.dto.app.pay.OrderCreateVo; import com.ruoyi.xq.dto.app.pay.OrderCreateVo;
import com.ruoyi.xq.service.ActivityOrderService; import com.ruoyi.xq.service.ActivityOrderService;
@@ -26,7 +24,7 @@ import org.springframework.web.bind.annotation.*;
@Validated @Validated
@RestController @RestController
@Tag(name = "相亲会相关接口") @Tag(name = "相亲会相关接口")
@RequestMapping("/xq/activity/matchmaking") @RequestMapping("/api/activity/matchmaking")
public class ActivityMatchmakingController { public class ActivityMatchmakingController {
@Autowired @Autowired
@@ -54,13 +52,22 @@ public class ActivityMatchmakingController {
return R.ok(info); return R.ok(info);
} }
@PostMapping("/join") @PostMapping("/checkJoin")
@Operation(summary = "参加相亲会") @Operation(summary = "参加相亲会-检测")
@Log(title = "参加相亲会", businessType = BusinessType.OTHER) @Log(title = "参加相亲会-检测", businessType = BusinessType.OTHER)
public R<ActivityShopAppInfo> join(@RequestBody IdReq idReq){ public R<JoinResp> join(@RequestBody IdReq idReq){
Long userId = LoginHelper.getUserId(); Long userId = LoginHelper.getUserId();
activityShopService.join(userId,idReq.getId()); JoinResp join = activityShopService.checkJoin(userId, idReq.getId());
return R.ok(); return R.ok(join);
}
@PostMapping("/freeJoin")
@Operation(summary = "参加相亲会(免费)")
@Log(title = "参加相亲会(免费)", businessType = BusinessType.OTHER)
public R<JoinResp> freeJoin(@RequestBody FreeJoinReq req){
req.setUserId(LoginHelper.getUserId());
JoinResp join = activityShopService.join(req);
return R.ok(join);
} }
@PostMapping("/create/order") @PostMapping("/create/order")

View File

@@ -54,6 +54,7 @@ public class ActivityOrder implements Serializable {
* 活动标题 * 活动标题
*/ */
private String activityTitle; private String activityTitle;
private String activityCode;
private String activityMobile; private String activityMobile;
/** /**
* 订单说明 * 订单说明

View File

@@ -0,0 +1,73 @@
package com.ruoyi.xq.dto.admin.activity;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class ActivityShopAdminUpdateReq {
private Long id;
/**
* 活动标题
*/
private String activityTitle;
/**
* 活动展示图片
*/
private String activityBanner;
/**
* 开始时间
*/
private LocalDateTime startTime;
/**
* 结束时间
*/
private LocalDateTime endTime;
/**
* 城市名称
*/
private String cityName;
/**
* 城市编码
*/
private Integer cityCode;
/**
* 详细地址
*/
private String address;
/**
* 活动详细说明
*/
private String activityText;
/**
* 女生人数上限
*/
private Integer womenMaxNum;
/**
* 男生人数上限
*/
private Integer manMaxNum;
/**
* 女生参与价格
*/
private BigDecimal joinWomenPrice;
/**
* 男生参与价格
*/
private BigDecimal joinManPrice;
/**
* 必须强制会员参与
*/
private Integer mustVip;
/**
* 必须强制实名用户参与
*/
private Integer mustAuth;
/**
* 费用说明
*/
private String priceText;
}

View File

@@ -0,0 +1,11 @@
package com.ruoyi.xq.dto.admin.activity;
import com.ruoyi.xq.domain.ActivityShop;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ActivityShopAdminVo extends ActivityShop {
@Schema(description = "状态 0-未开始 1-已开始 2-已结束")
private Integer openStatus;
}

View File

@@ -0,0 +1,18 @@
package com.ruoyi.xq.dto.app.activity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class FreeJoinReq {
@Schema(description = "相亲会ID")
private Long activityId;
@Schema(description = "手机号")
private String mobile;
@Schema(hidden = true)
private Long userId;
}

View File

@@ -8,7 +8,7 @@ import java.math.BigDecimal;
@Data @Data
public class JoinResp { public class JoinResp {
@Schema(description = "是否成功加入") @Schema(description = "是否允许加入")
private boolean joinSuccess; private boolean joinSuccess;
@Schema(description = "失败原因 1-未实名认证 2-未开启VIP 3-需要支付 99-其他") @Schema(description = "失败原因 1-未实名认证 2-未开启VIP 3-需要支付 99-其他")
private Integer failCode; private Integer failCode;

View File

@@ -0,0 +1,33 @@
package com.ruoyi.xq.kit;
import com.ruoyi.xq.constant.RedisHttpConstant;
import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.TimeUnit;
@Component
public class CodeKit {
@Autowired
private RedissonClient redissonClient;
public String nextCode(String prefix){
String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String key = String.format(RedisHttpConstant.CODE_REDIS, prefix, date);
RAtomicLong atomicLong = redissonClient.getAtomicLong(key);
long num = atomicLong.incrementAndGet();
atomicLong.expire(Duration.ofDays(2));
String code = String.format("%s%s%04d", prefix, date, num);
return code;
}
public String nextCodeActivity(){
return nextCode("AC");
}
}

View File

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.ActivityShop; import com.ruoyi.xq.domain.ActivityShop;
import com.ruoyi.xq.dto.admin.activity.ActivityShopAdminUpdateReq;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppInfo; import com.ruoyi.xq.dto.app.activity.ActivityShopAppInfo;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppList; import com.ruoyi.xq.dto.app.activity.ActivityShopAppList;
import com.ruoyi.xq.dto.app.activity.FreeJoinReq;
import com.ruoyi.xq.dto.app.activity.JoinResp; import com.ruoyi.xq.dto.app.activity.JoinResp;
/** /**
@@ -24,13 +26,17 @@ public interface ActivityShopService extends IService<ActivityShop> {
ActivityShopAppInfo info(Long activityId, String activityCode); ActivityShopAppInfo info(Long activityId, String activityCode);
JoinResp join(Long userId, Long activityId); JoinResp join(FreeJoinReq req);
JoinResp checkJoin(Long userId, Long id);
void saveData(ActivityShop bo); void saveData(ActivityShop bo);
void updateData(ActivityShop bo); void updateData(ActivityShopAdminUpdateReq bo);
void updateDataUser(ActivityShop bo); void updateDataUser(ActivityShop bo);
void removeDataByIds(Long[] ids); void removeDataByIds(Long[] ids);
} }

View File

@@ -1,6 +1,7 @@
package com.ruoyi.xq.service; package com.ruoyi.xq.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.xq.domain.ActivityShop;
import com.ruoyi.xq.domain.ActivityUser; import com.ruoyi.xq.domain.ActivityUser;
/** /**
@@ -13,5 +14,9 @@ public interface ActivityUserService extends IService<ActivityUser> {
void joinActivity(String orderNo); void joinActivity(String orderNo);
void joinActivity(Long activityId,String mobile,Long userId);
Long countByActivityIdAndGender(Long id, Integer gender); Long countByActivityIdAndGender(Long id, Integer gender);
boolean checkJoin(Long userId, Long activityId);
} }

View File

@@ -78,6 +78,7 @@ public class ActivityOrderServiceImpl extends ServiceImpl<ActivityOrderMapper,Ac
order.setTraceId(traceId); order.setTraceId(traceId);
order.setActivityId(activityShop.getId()); order.setActivityId(activityShop.getId());
order.setActivityTitle(activityShop.getActivityTitle()); order.setActivityTitle(activityShop.getActivityTitle());
order.setActivityCode(activityShop.getActivityCode());
order.setActivityMobile(req.getMobile()); order.setActivityMobile(req.getMobile());
order.setOrderName("报名相亲会"); order.setOrderName("报名相亲会");
order.setOrderNo(orderNo); order.setOrderNo(orderNo);

View File

@@ -5,14 +5,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.BeanConvertUtil;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.xq.domain.*; import com.ruoyi.xq.domain.*;
import com.ruoyi.xq.dto.admin.activity.ActivityShopAdminUpdateReq;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppInfo; import com.ruoyi.xq.dto.app.activity.ActivityShopAppInfo;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppList; import com.ruoyi.xq.dto.app.activity.ActivityShopAppList;
import com.ruoyi.xq.dto.app.activity.FreeJoinReq;
import com.ruoyi.xq.dto.app.activity.JoinResp; import com.ruoyi.xq.dto.app.activity.JoinResp;
import com.ruoyi.xq.enums.activity.ActivityShopStatusEnum; import com.ruoyi.xq.enums.activity.ActivityShopStatusEnum;
import com.ruoyi.xq.enums.common.AuditEnum; import com.ruoyi.xq.enums.common.AuditEnum;
import com.ruoyi.xq.enums.userinfo.UserGenderEnum; import com.ruoyi.xq.enums.userinfo.UserGenderEnum;
import com.ruoyi.xq.kit.CodeKit;
import com.ruoyi.xq.mapper.ActivityShopMapper; import com.ruoyi.xq.mapper.ActivityShopMapper;
import com.ruoyi.xq.service.*; import com.ruoyi.xq.service.*;
import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.BooleanUtils;
@@ -20,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
/** /**
@@ -112,11 +117,21 @@ public class ActivityShopServiceImpl extends ServiceImpl<ActivityShopMapper,Acti
return appInfo; return appInfo;
} }
@Override
public JoinResp join(FreeJoinReq req) {
JoinResp joinResp = this.checkJoin(req.getUserId(), req.getActivityId());
if(!joinResp.isJoinSuccess()){
return joinResp;
}
activityUserService.joinActivity(req.getActivityId(),req.getMobile(),req.getUserId());
return null;
}
/** /**
* @return 1-未实名认证 2-未开启VIP 3-需要支付 * @return 1-未实名认证 2-未开启VIP 3-需要支付
*/ */
@Override @Override
public JoinResp join(Long userId, Long activityId) { public JoinResp checkJoin(Long userId, Long activityId) {
ActivityShop activityShop = this.getById(activityId); ActivityShop activityShop = this.getById(activityId);
if(activityShop == null){ if(activityShop == null){
throw new ServiceException("活动不存在"); throw new ServiceException("活动不存在");
@@ -126,6 +141,29 @@ public class ActivityShopServiceImpl extends ServiceImpl<ActivityShopMapper,Acti
throw new ServiceException("用户异常"); throw new ServiceException("用户异常");
} }
// 检测是否已经加入 // 检测是否已经加入
boolean join = activityUserService.checkJoin(userId,activityId);
if(join){
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(99);
resp.setFailText("您已经参加该活动");
return resp;
}
LocalDateTime now = LocalDateTime.now();
if(now.isBefore(activityShop.getStartTime())){
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(99);
resp.setFailText("活动还未开始");
return resp;
}
if(now.isAfter(activityShop.getEndTime())){
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(99);
resp.setFailText("活动已经结束");
return resp;
}
// 人数检测 // 人数检测
if(UserGenderEnum.MAN.getCode().equals(user.getGender())){ if(UserGenderEnum.MAN.getCode().equals(user.getGender())){
if(activityShop.getManMaxNum() <= activityShop.getJoinManNum() + activityShop.getHandManNum()){ if(activityShop.getManMaxNum() <= activityShop.getJoinManNum() + activityShop.getHandManNum()){
@@ -191,17 +229,19 @@ public class ActivityShopServiceImpl extends ServiceImpl<ActivityShopMapper,Acti
throw new ServiceException("用户异常"); throw new ServiceException("用户异常");
} }
JoinResp resp = new JoinResp(); JoinResp resp = new JoinResp();
resp.setJoinSuccess(false); resp.setJoinSuccess(true);
resp.setFailCode(99);
resp.setFailText("加入失败");
return resp; return resp;
} }
@Autowired @Autowired
private AreaCodeService areaCodeService; private AreaCodeService areaCodeService;
@Autowired
private CodeKit codeKit;
@Override @Override
public void saveData(ActivityShop bo) { public void saveData(ActivityShop bo) {
String code = codeKit.nextCodeActivity();
bo.setActivityCode(code);
if(bo.getStartTime().isAfter(bo.getEndTime())){ if(bo.getStartTime().isAfter(bo.getEndTime())){
throw new ServiceException("开始时间不能大于结束时间"); throw new ServiceException("开始时间不能大于结束时间");
} }
@@ -211,19 +251,14 @@ public class ActivityShopServiceImpl extends ServiceImpl<ActivityShopMapper,Acti
} }
@Override @Override
public void updateData(ActivityShop bo) { public void updateData(ActivityShopAdminUpdateReq bo) {
if(bo.getStartTime().isAfter(bo.getEndTime())){ if(bo.getStartTime().isAfter(bo.getEndTime())){
throw new ServiceException("开始时间不能大于结束时间"); throw new ServiceException("开始时间不能大于结束时间");
} }
ActivityShop update = BeanConvertUtil.convertTo(bo, ActivityShop::new);
AreaCode areaCode = areaCodeService.getById(bo.getCityCode()); AreaCode areaCode = areaCodeService.getById(bo.getCityCode());
bo.setCityName(areaCode.getName()); update.setCityName(areaCode.getName());
bo.setCreateTime(null); this.updateById(update);
bo.setUpdateTime(null);
bo.setHandManNum(null);
bo.setHandWomenNum(null);
bo.setJoinManNum(null);
bo.setJoinWomenNum(null);
this.updateById(bo);
} }
@Override @Override

View File

@@ -3,7 +3,9 @@ package com.ruoyi.xq.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.xq.domain.ActivityOrder; import com.ruoyi.xq.domain.ActivityOrder;
import com.ruoyi.xq.domain.ActivityShop;
import com.ruoyi.xq.domain.ActivityUser; import com.ruoyi.xq.domain.ActivityUser;
import com.ruoyi.xq.dto.common.user.MinUser;
import com.ruoyi.xq.mapper.ActivityUserMapper; import com.ruoyi.xq.mapper.ActivityUserMapper;
import com.ruoyi.xq.service.ActivityOrderService; import com.ruoyi.xq.service.ActivityOrderService;
import com.ruoyi.xq.service.ActivityShopService; import com.ruoyi.xq.service.ActivityShopService;
@@ -44,8 +46,28 @@ public class ActivityUserServiceImpl extends ServiceImpl<ActivityUserMapper, Act
activityShopService.resetActivityShopUser(activityOrder.getActivityId(), activityOrder.getGender()); activityShopService.resetActivityShopUser(activityOrder.getActivityId(), activityOrder.getGender());
} }
@Override
public void joinActivity(Long activityId,String mobile,Long userId) {
ActivityShop activityShop = activityShopService.getById(activityId);
MinUser minUser = userService.getMinUserById(userId);
ActivityUser activityUser = new ActivityUser();
activityUser.setActivityId(activityShop.getId());
activityUser.setUserId(minUser.getId());
activityUser.setUsercode(minUser.getUsercode());
activityUser.setGender(minUser.getGender());
activityUser.setMobile(mobile);
activityUser.setPay(0);
this.save(activityUser);
activityShopService.resetActivityShopUser(activityId, minUser.getGender());
}
@Override @Override
public Long countByActivityIdAndGender(Long activityId, Integer gender) { public Long countByActivityIdAndGender(Long activityId, Integer gender) {
return this.count(Wrappers.lambdaQuery(ActivityUser.class).eq(ActivityUser::getActivityId, activityId).eq(ActivityUser::getGender, gender)); return this.count(Wrappers.lambdaQuery(ActivityUser.class).eq(ActivityUser::getActivityId, activityId).eq(ActivityUser::getGender, gender));
} }
@Override
public boolean checkJoin(Long userId, Long activityId) {
return this.exists(Wrappers.lambdaQuery(ActivityUser.class).eq(ActivityUser::getActivityId, activityId).eq(ActivityUser::getUserId, userId));
}
} }