This commit is contained in:
张良(004796)
2024-05-10 19:17:52 +08:00
parent 4193dba737
commit 17de49b534
12 changed files with 410 additions and 14 deletions

View File

@@ -0,0 +1,63 @@
package com.ruoyi.xq.controller.app;
import cn.dev33.satoken.annotation.SaIgnore;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.PageModel;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppInfo;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppList;
import com.ruoyi.xq.dto.app.common.IdReq;
import com.ruoyi.xq.dto.app.im.ImMessageDTO;
import com.ruoyi.xq.dto.app.im.ImResp;
import com.ruoyi.xq.service.ActivityShopService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jdk.nashorn.internal.ir.annotations.Ignore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RestController
@Tag(name = "相亲会相关接口")
@RequestMapping("/xq/activity/matchmaking")
public class MatchmakingEventController {
@Autowired
private ActivityShopService activityShopService;
@GetMapping("/page")
@Operation(summary = "相亲会列表-分页")
@Log(title = "相亲会列表-分页", businessType = BusinessType.OTHER, isPrintResponseData = false, isSaveDb = false)
public R<PageModel<ActivityShopAppList>> page(PageQuery pageQuery){
IPage<ActivityShopAppList> page = activityShopService.pageApp(pageQuery);
return R.ok(PageModel.build(page));
}
@GetMapping("/info")
@Operation(summary = "相亲详情")
@Log(title = "相亲会详情", businessType = BusinessType.OTHER, isPrintResponseData = false, isSaveDb = false)
@SaIgnore
public R<ActivityShopAppInfo> info(Long activityId, String activityCode){
if(activityId == null && StringUtils.isEmpty(activityCode)){
return R.ok();
}
ActivityShopAppInfo info = activityShopService.info(activityId, activityCode);
return R.ok(info);
}
@PostMapping("/join")
@Operation(summary = "参加相亲会")
@Log(title = "参加相亲会", businessType = BusinessType.OTHER)
public R<ActivityShopAppInfo> join(@RequestBody IdReq idReq){
Long userId = LoginHelper.getUserId();
activityShopService.join(userId,idReq.getId());
return R.ok();
}
}

View File

@@ -1,6 +1,5 @@
package com.ruoyi.xq.controller.app; package com.ruoyi.xq.controller.app;
import cn.dev33.satoken.annotation.SaIgnore;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;

View File

@@ -1,17 +1,12 @@
package com.ruoyi.xq.domain; package com.ruoyi.xq.domain;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.math.BigDecimal;
import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseEntity;
/** /**
* 相亲会订单对象 xq_activity_order * 相亲会订单对象 xq_activity_order
@@ -77,7 +72,7 @@ public class ActivityOrder implements Serializable {
/** /**
* 支付时间 * 支付时间
*/ */
private Date payTime; private LocalDateTime payTime;
/** /**
* appId * appId
*/ */

View File

@@ -7,7 +7,6 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date;
/** /**
* 相亲会对象 xq_activity_shop * 相亲会对象 xq_activity_shop
@@ -26,6 +25,8 @@ public class ActivityShop implements Serializable {
*/ */
@TableId(value = "id") @TableId(value = "id")
private Long id; private Long id;
private String activityCode;
/** /**
* 活动标题 * 活动标题
*/ */
@@ -37,11 +38,11 @@ public class ActivityShop implements Serializable {
/** /**
* 开始时间 * 开始时间
*/ */
private Date startTime; private LocalDateTime startTime;
/** /**
* 结束时间 * 结束时间
*/ */
private Date endTime; private LocalDateTime endTime;
/** /**
* 城市名称 * 城市名称
*/ */

View File

@@ -0,0 +1,29 @@
package com.ruoyi.xq.dto.app.activity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class ActivityShopAppInfo extends ActivityShopAppList {
/**
* 必须强制会员参与
*/
private Integer mustVip;
/**
* 必须强制实名用户参与
*/
private Integer mustAuth;
/**
* 费用说明
*/
private String priceText;
/**
* 已经参与女生人数
*/
private Integer joinWomenNum;
/**
* 已经参与男生人数
*/
private Integer joinManNum;
}

View File

@@ -0,0 +1,71 @@
package com.ruoyi.xq.dto.app.activity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class ActivityShopAppList implements Serializable {
@Schema(description = "id")
private Long id;
@Schema(description = "状态 0-未开始 1-已开始 2-已结束")
private Integer openStatus;
@Schema(description = "活动编码")
private String activityCode;
/**
* 活动标题
*/
@Schema(description = "活动标题")
private String activityTitle;
/**
* 活动展示图片
*/
@Schema(description = "活动展示图片")
private String activityBanner;
/**
* 开始时间
*/
@Schema(description = "开始时间")
private LocalDateTime startTime;
/**
* 结束时间
*/
@Schema(description = "结束时间")
private LocalDateTime endTime;
/**
* 城市名称
*/
@Schema(description = "城市名称")
private String cityName;
/**
* 城市编码
*/
@Schema(description = "城市编码")
private Integer cityCode;
/**
* 女生人数上限
*/
@Schema(description = "女生人数上限")
private Integer womenMaxNum;
/**
* 男生人数上限
*/
@Schema(description = "男生人数上限")
private Integer manMaxNum;
/**
* 女生参与价格
*/
@Schema(description = "女生参与价格")
private BigDecimal joinWomenPrice;
/**
* 男生参与价格
*/
@Schema(description = "男生参与价格")
private BigDecimal joinManPrice;
}

View File

@@ -0,0 +1,20 @@
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 JoinResp {
@Schema(description = "是否成功加入")
private boolean joinSuccess;
@Schema(description = "失败原因 1-未实名认证 2-未开启VIP 3-需要支付 99-其他")
private Integer failCode;
@Schema(description = "失败原因说明")
private String failText;
@Schema(description = "需要支付的价格")
private BigDecimal price;
}

View File

@@ -0,0 +1,35 @@
package com.ruoyi.xq.enums.activity;
import lombok.Getter;
import java.time.LocalDateTime;
@Getter
public enum ActivityShopStatusEnum {
NO_START(0,"未开启"),
STARTING(1,"开始中"),
ENDING(2,"已结束"),
;
private final Integer code;
private final String text;
ActivityShopStatusEnum(Integer code, String text) {
this.code = code;
this.text = text;
}
public static ActivityShopStatusEnum getEnumByTime(LocalDateTime startTime, LocalDateTime endTime){
if(startTime == null || endTime == null){
return NO_START;
}
LocalDateTime now = LocalDateTime.now();
if(now.isBefore(startTime)){
return NO_START;
}
if(now.isAfter(endTime)){
return ENDING;
}
return STARTING;
}
}

View File

@@ -1,7 +1,11 @@
package com.ruoyi.xq.mapper; package com.ruoyi.xq.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.xq.domain.ActivityShop; import com.ruoyi.xq.domain.ActivityShop;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppList;
import org.apache.ibatis.annotations.Param;
/** /**
* 相亲会Mapper接口 * 相亲会Mapper接口
@@ -11,4 +15,5 @@ import com.ruoyi.xq.domain.ActivityShop;
*/ */
public interface ActivityShopMapper extends BaseMapper<ActivityShop> { public interface ActivityShopMapper extends BaseMapper<ActivityShop> {
IPage<ActivityShopAppList> pageApp(@Param("build") Page<Object> build);
} }

View File

@@ -1,7 +1,12 @@
package com.ruoyi.xq.service; package com.ruoyi.xq.service;
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.xq.domain.ActivityShop; import com.ruoyi.xq.domain.ActivityShop;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppInfo;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppList;
import com.ruoyi.xq.dto.app.activity.JoinResp;
/** /**
* 相亲会Service接口 * 相亲会Service接口
@@ -11,4 +16,12 @@ import com.ruoyi.xq.domain.ActivityShop;
*/ */
public interface ActivityShopService extends IService<ActivityShop> { public interface ActivityShopService extends IService<ActivityShop> {
IPage<ActivityShopAppList> pageApp(PageQuery pageQuery);
ActivityShop getByCode(String activityCode);
ActivityShopAppInfo info(Long activityId, String activityCode);
JoinResp join(Long userId, Long activityId);
} }

View File

@@ -1,11 +1,31 @@
package com.ruoyi.xq.service.impl; package com.ruoyi.xq.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.xq.domain.ActivityShop; import com.ruoyi.xq.domain.ActivityShop;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.UserAuth;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppInfo;
import com.ruoyi.xq.dto.app.activity.ActivityShopAppList;
import com.ruoyi.xq.dto.app.activity.JoinResp;
import com.ruoyi.xq.enums.activity.ActivityShopStatusEnum;
import com.ruoyi.xq.enums.common.AuditEnum;
import com.ruoyi.xq.enums.userinfo.UserGenderEnum;
import com.ruoyi.xq.mapper.ActivityShopMapper; import com.ruoyi.xq.mapper.ActivityShopMapper;
import com.ruoyi.xq.service.ActivityShopService; import com.ruoyi.xq.service.ActivityShopService;
import com.ruoyi.xq.service.UserAuthService;
import com.ruoyi.xq.service.UserService;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/** /**
* 相亲会Service业务层处理 * 相亲会Service业务层处理
* *
@@ -15,4 +35,141 @@ import org.springframework.stereotype.Service;
@Service @Service
public class ActivityShopServiceImpl extends ServiceImpl<ActivityShopMapper,ActivityShop> implements ActivityShopService { public class ActivityShopServiceImpl extends ServiceImpl<ActivityShopMapper,ActivityShop> implements ActivityShopService {
@Autowired
private UserService userService;
@Autowired
private UserAuthService userAuthService;
@Override
public IPage<ActivityShopAppList> pageApp(PageQuery pageQuery) {
IPage<ActivityShopAppList> page = baseMapper.pageApp(pageQuery.build());
List<ActivityShopAppList> records = page.getRecords();
for (ActivityShopAppList record : records) {
record.setOpenStatus(ActivityShopStatusEnum.getEnumByTime(record.getStartTime(), record.getEndTime()).getCode());
}
return page;
}
@Override
public ActivityShop getByCode(String activityCode){
return this.getOne(Wrappers.lambdaQuery(ActivityShop.class).eq(ActivityShop::getActivityCode, activityCode).last("limit 1"));
}
@Override
public ActivityShopAppInfo info(Long activityId, String activityCode) {
ActivityShop activityShop = null;
if(activityId != null){
activityShop = this.getById(activityId);
}else if(StringUtils.isNotEmpty(activityCode)){
activityShop = getByCode(activityCode);
}
if(activityShop == null){
return null;
}
ActivityShopAppInfo appInfo = new ActivityShopAppInfo();
appInfo.setMustVip(activityShop.getMustVip());
appInfo.setMustAuth(activityShop.getMustAuth());
appInfo.setPriceText(activityShop.getPriceText());
appInfo.setJoinWomenNum(activityShop.getJoinWomenNum()+activityShop.getHandWomenNum());
appInfo.setJoinManNum(activityShop.getJoinManNum()+ activityShop.getHandManNum());
appInfo.setId(activityShop.getId());
appInfo.setOpenStatus(ActivityShopStatusEnum.getEnumByTime(activityShop.getStartTime(), activityShop.getEndTime()).getCode());
appInfo.setActivityCode(activityShop.getActivityCode());
appInfo.setActivityTitle(activityShop.getActivityTitle());
appInfo.setActivityBanner(activityShop.getActivityBanner());
appInfo.setStartTime(activityShop.getStartTime());
appInfo.setEndTime(activityShop.getEndTime());
appInfo.setCityName(activityShop.getCityName());
appInfo.setCityCode(activityShop.getCityCode());
appInfo.setWomenMaxNum(activityShop.getWomenMaxNum());
appInfo.setManMaxNum(activityShop.getManMaxNum());
appInfo.setJoinWomenPrice(activityShop.getJoinWomenPrice());
appInfo.setJoinManPrice(activityShop.getJoinManPrice());
return appInfo;
}
/**
* @return 1-未实名认证 2-未开启VIP 3-需要支付
*/
@Override
public JoinResp join(Long userId, Long activityId) {
ActivityShop activityShop = this.getById(activityId);
if(activityShop == null){
throw new ServiceException("活动不存在");
}
User user = userService.getById(userId);
if(user == null){
throw new ServiceException("用户异常");
}
// 检测是否已经加入
// 人数检测
if(UserGenderEnum.MAN.getCode().equals(user.getGender())){
if(activityShop.getManMaxNum() <= activityShop.getJoinManNum() + activityShop.getHandManNum()){
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(99);
resp.setFailText("男用户报名人数已满");
return resp;
}
}else if(UserGenderEnum.WOMEN.getCode().equals(user.getGender())){
if(activityShop.getWomenMaxNum() <= activityShop.getJoinWomenNum() + activityShop.getHandWomenNum()){
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(99);
resp.setFailText("女用户报名人数已满");
return resp;
}
}else{
throw new ServiceException("用户异常");
}
// 实名检测
if(activityShop.getMustAuth() == 1){
UserAuth userAuth = userAuthService.getByUserId(userId);
if(userAuth == null){
throw new ServiceException("用户异常");
}
if(!AuditEnum.SUCCESS.getCode().equals(userAuth.getCardNumAuth())){
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(1);
resp.setFailText("未实名认证");
return resp;
}
}
// VIP检测
if(activityShop.getMustAuth() == 1){
if(BooleanUtils.isNotTrue(user.getOpenVip())){
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(2);
resp.setFailText("未开通VIP");
return resp;
}
}
// 需要支付
if(UserGenderEnum.MAN.getCode().equals(user.getGender())){
if(activityShop.getJoinManPrice().compareTo(BigDecimal.ZERO) > 0){ // 大于0
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(3);
resp.setFailText("需要支付");
return resp;
}
}else if(UserGenderEnum.WOMEN.getCode().equals(user.getGender())){
if(activityShop.getJoinWomenPrice().compareTo(BigDecimal.ZERO) > 0){ // 大于0
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(3);
resp.setFailText("需要支付");
return resp;
}
}else{
throw new ServiceException("用户异常");
}
JoinResp resp = new JoinResp();
resp.setJoinSuccess(false);
resp.setFailCode(99);
resp.setFailText("加入失败");
return resp;
}
} }

View File

@@ -5,4 +5,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="com.ruoyi.xq.mapper.ActivityShopMapper"> <mapper namespace="com.ruoyi.xq.mapper.ActivityShopMapper">
<select id="pageApp" resultType="com.ruoyi.xq.dto.app.activity.ActivityShopAppList">
select
t1.id, t1.activity_code, t1.activity_text, t1.activity_banner,
t1.start_time, t1.end_time, t1.city_code, t1.city_name,
t1.women_max_num, t1.man_max_num, t1.join_man_price, t1.join_women_price
from xq_activity_shop t1
order by ABS(TIMESTAMPDIFF(MINUTE,t1.start_time, now()))
</select>
</mapper> </mapper>