diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/MatchmakingEventController.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/MatchmakingEventController.java new file mode 100644 index 0000000..aed917e --- /dev/null +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/MatchmakingEventController.java @@ -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> page(PageQuery pageQuery){ + IPage 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 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 join(@RequestBody IdReq idReq){ + Long userId = LoginHelper.getUserId(); + activityShopService.join(userId,idReq.getId()); + return R.ok(); + } + +} diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/ReportAppController.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/ReportAppController.java index be3951f..13df6ab 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/ReportAppController.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/ReportAppController.java @@ -1,6 +1,5 @@ package com.ruoyi.xq.controller.app; -import cn.dev33.satoken.annotation.SaIgnore; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.BusinessType; diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/domain/ActivityOrder.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/domain/ActivityOrder.java index c399f20..f406d06 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/domain/ActivityOrder.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/domain/ActivityOrder.java @@ -1,17 +1,12 @@ 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.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.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.ruoyi.common.core.domain.BaseEntity; +import java.time.LocalDateTime; /** * 相亲会订单对象 xq_activity_order @@ -77,7 +72,7 @@ public class ActivityOrder implements Serializable { /** * 支付时间 */ - private Date payTime; + private LocalDateTime payTime; /** * appId */ diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/domain/ActivityShop.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/domain/ActivityShop.java index 0c4227c..a7b9cab 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/domain/ActivityShop.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/domain/ActivityShop.java @@ -7,7 +7,6 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.Date; /** * 相亲会对象 xq_activity_shop @@ -26,6 +25,8 @@ public class ActivityShop implements Serializable { */ @TableId(value = "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; /** * 城市名称 */ diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/activity/ActivityShopAppInfo.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/activity/ActivityShopAppInfo.java new file mode 100644 index 0000000..1e8f64d --- /dev/null +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/activity/ActivityShopAppInfo.java @@ -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; +} diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/activity/ActivityShopAppList.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/activity/ActivityShopAppList.java new file mode 100644 index 0000000..904c31a --- /dev/null +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/activity/ActivityShopAppList.java @@ -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; +} diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/activity/JoinResp.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/activity/JoinResp.java new file mode 100644 index 0000000..66bc861 --- /dev/null +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/activity/JoinResp.java @@ -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; + +} diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/enums/activity/ActivityShopStatusEnum.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/enums/activity/ActivityShopStatusEnum.java new file mode 100644 index 0000000..a6d864c --- /dev/null +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/enums/activity/ActivityShopStatusEnum.java @@ -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; + } +} + diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/mapper/ActivityShopMapper.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/mapper/ActivityShopMapper.java index c14b26a..484c8da 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/mapper/ActivityShopMapper.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/mapper/ActivityShopMapper.java @@ -1,7 +1,11 @@ package com.ruoyi.xq.mapper; 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.dto.app.activity.ActivityShopAppList; +import org.apache.ibatis.annotations.Param; /** * 相亲会Mapper接口 @@ -11,4 +15,5 @@ import com.ruoyi.xq.domain.ActivityShop; */ public interface ActivityShopMapper extends BaseMapper { + IPage pageApp(@Param("build") Page build); } diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/ActivityShopService.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/ActivityShopService.java index 2e9a3d6..97db0db 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/ActivityShopService.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/ActivityShopService.java @@ -1,7 +1,12 @@ package com.ruoyi.xq.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; 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接口 @@ -11,4 +16,12 @@ import com.ruoyi.xq.domain.ActivityShop; */ public interface ActivityShopService extends IService { + IPage pageApp(PageQuery pageQuery); + + ActivityShop getByCode(String activityCode); + + ActivityShopAppInfo info(Long activityId, String activityCode); + + JoinResp join(Long userId, Long activityId); + } diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/ActivityShopServiceImpl.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/ActivityShopServiceImpl.java index 8cd5950..dca89b9 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/ActivityShopServiceImpl.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/ActivityShopServiceImpl.java @@ -1,11 +1,31 @@ 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.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.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.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 java.math.BigDecimal; +import java.util.List; + /** * 相亲会Service业务层处理 * @@ -15,4 +35,141 @@ import org.springframework.stereotype.Service; @Service public class ActivityShopServiceImpl extends ServiceImpl implements ActivityShopService { + @Autowired + private UserService userService; + @Autowired + private UserAuthService userAuthService; + + @Override + public IPage pageApp(PageQuery pageQuery) { + IPage page = baseMapper.pageApp(pageQuery.build()); + List 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; + } } diff --git a/ruoyi-xq/src/main/resources/mapper/xq/ActivityShopMapper.xml b/ruoyi-xq/src/main/resources/mapper/xq/ActivityShopMapper.xml index a60df95..71a6b30 100644 --- a/ruoyi-xq/src/main/resources/mapper/xq/ActivityShopMapper.xml +++ b/ruoyi-xq/src/main/resources/mapper/xq/ActivityShopMapper.xml @@ -5,4 +5,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +