2024-04 新增足球场馆邀请链接逻辑

This commit is contained in:
2024-04-26 15:13:58 +08:00
parent e7ec957b9e
commit 9f2c55eaf3
10 changed files with 645 additions and 99 deletions

6
.gitignore vendored
View File

@@ -20,3 +20,9 @@
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid* hs_err_pid*
.idea
*/target
*.iml

View File

@@ -4,6 +4,7 @@ import com.sv.api.context.PlatformContext;
import com.sv.dto.api.LessonTicketOrderDTO; import com.sv.dto.api.LessonTicketOrderDTO;
import com.sv.entity.MemberLessonTicket; import com.sv.entity.MemberLessonTicket;
import com.sv.service.api.MemberLessonTicketService; import com.sv.service.api.MemberLessonTicketService;
import com.sv.service.api.MemberTicketEnterService;
import com.ydd.framework.core.annotation.AccessToken; import com.ydd.framework.core.annotation.AccessToken;
import com.ydd.framework.core.common.Pagination; import com.ydd.framework.core.common.Pagination;
import com.ydd.framework.core.common.dto.ResponseDTO; import com.ydd.framework.core.common.dto.ResponseDTO;
@@ -29,6 +30,8 @@ public class MemberLessonTicketController extends BaseApiController {
@Resource @Resource
private MemberLessonTicketService memberLessonTicketService; private MemberLessonTicketService memberLessonTicketService;
@Resource
private MemberTicketEnterService memberTicketEnterService;
/** /**
* 分页查询用户预约的场馆课程票号 * 分页查询用户预约的场馆课程票号
@@ -112,6 +115,14 @@ public class MemberLessonTicketController extends BaseApiController {
return ResponseDTO.ok().addAttribute("memberLessonTicket",memberLessonTicketService.memberLessonTicketDetail(getMemberIdByAccessToken(),orderSn)); return ResponseDTO.ok().addAttribute("memberLessonTicket",memberLessonTicketService.memberLessonTicketDetail(getMemberIdByAccessToken(),orderSn));
} }
/**
* 订单详情开门链接
*/
@RequestMapping(value = "/member/lesson/tickets/invite", method = RequestMethod.POST)
public ResponseDTO memberTicketInvite(@RequestParam("ticketId") Integer ticketId){
return ResponseDTO.ok().addAttribute("memberLessonTicket",memberTicketEnterService.memberTicketEnterDetail(getMemberIdByAccessToken(),ticketId));
}
/** /**
* 取消预约课程 * 取消预约课程
* 只能取消距离上课时间48小时以外的 * 只能取消距离上课时间48小时以外的

View File

@@ -0,0 +1,72 @@
package com.sv.dto.api;
import com.sv.entity.MemberLessonTicket;
import java.util.List;
public class MemberTicketEnterDTO extends MemberLessonTicket {
private String venueName;
private String lessonName;
private String mobile;
private String errCode;
private String msg;
private boolean openFlag = false;
private List<MemberTicketInviteDTO> memberTicketInviteList;
public String getVenueName() {
return venueName;
}
public void setVenueName(String venueName) {
this.venueName = venueName;
}
public String getLessonName() {
return lessonName;
}
public void setLessonName(String lessonName) {
this.lessonName = lessonName;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public List<MemberTicketInviteDTO> getMemberTicketInviteList() {
return memberTicketInviteList;
}
public void setMemberTicketInviteList(List<MemberTicketInviteDTO> memberTicketInviteList) {
this.memberTicketInviteList = memberTicketInviteList;
}
public String getErrCode() {
return errCode;
}
public void setErrCode(String errCode) {
this.errCode = errCode;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public boolean isOpenFlag() {
return openFlag;
}
public void setOpenFlag(boolean openFlag) {
this.openFlag = openFlag;
}
}

View File

@@ -0,0 +1,16 @@
package com.sv.dto.api;
import com.sv.entity.MemberTicketInvite;
public class MemberTicketInviteDTO extends MemberTicketInvite {
private boolean isMine = false;
public boolean isMine() {
return isMine;
}
public void setMine(boolean mine) {
isMine = mine;
}
}

View File

@@ -18,28 +18,10 @@ public class MemberLessonTicket implements Serializable {
private Integer id; private Integer id;
private String counts; private String counts;
public String getCounts() {
return counts;
}
public void setCounts(String counts) {
this.counts = counts;
}
/** /**
*手机号码 *手机号码
*/ */
private String mobile; private String mobile;
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
/** /**
* 场馆类型 * 场馆类型
*/ */
@@ -54,116 +36,36 @@ public class MemberLessonTicket implements Serializable {
* 支付时间 * 支付时间
*/ */
private Date payTime; private Date payTime;
public Date getPayTime() {
return payTime;
}
public void setPayTime(Date payTime) {
this.payTime = payTime;
}
/** /**
* 上级订单号 * 上级订单号
*/ */
private Integer parentOrderId; private Integer parentOrderId;
public Integer getParentOrderId() {
return parentOrderId;
}
public void setParentOrderId(Integer parentOrderId) {
this.parentOrderId = parentOrderId;
}
/** /**
* 外部订单号 * 外部订单号
*/ */
private String tradeSn; private String tradeSn;
public String getTradeSn() {
return tradeSn;
}
public void setTradeSn(String tradeSn) {
this.tradeSn = tradeSn;
}
/** /**
* 会员卡类型 * 会员卡类型
*/ */
private String cardType; private String cardType;
public String getCardType() {
return cardType;
}
public void setCardType(String cardType) {
this.cardType = cardType;
}
private String prices; private String prices;
public String getPrices() {
return prices;
}
public void setPrices(String prices) {
this.prices = prices;
}
/** /**
* 课程价格 * 课程价格
*/ */
private String price; private String price;
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
/** /**
* 用户名称 * 用户名称
*/ */
private String nickname; private String nickname;
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
/** /**
* 课程名称 * 课程名称
*/ */
private String lessonname; private String lessonname;
public String getLessonname() {
return lessonname;
}
public void setLessonname(String lessonname) {
this.lessonname = lessonname;
}
/** /**
* 场馆名称 * 场馆名称
*/ */
private String name; private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/** /**
* 课程票号ID * 课程票号ID
*/ */
@@ -590,4 +492,91 @@ public class MemberLessonTicket implements Serializable {
return deleted; return deleted;
} }
public String getCounts() {
return counts;
}
public void setCounts(String counts) {
this.counts = counts;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public Date getPayTime() {
return payTime;
}
public void setPayTime(Date payTime) {
this.payTime = payTime;
}
public Integer getParentOrderId() {
return parentOrderId;
}
public void setParentOrderId(Integer parentOrderId) {
this.parentOrderId = parentOrderId;
}
public String getTradeSn() {
return tradeSn;
}
public void setTradeSn(String tradeSn) {
this.tradeSn = tradeSn;
}
public String getCardType() {
return cardType;
}
public void setCardType(String cardType) {
this.cardType = cardType;
}
public String getPrices() {
return prices;
}
public void setPrices(String prices) {
this.prices = prices;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getLessonname() {
return lessonname;
}
public void setLessonname(String lessonname) {
this.lessonname = lessonname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
} }

View File

@@ -0,0 +1,138 @@
package com.sv.entity;
import java.util.Date;
public class MemberTicketInvite {
private Integer id;
private Integer ownerId;
private Integer memberId;
/**
* 暂时未启用 默认为2
* 报名成功 1
* 被选中 2
*/
private Integer status;
private Integer platformId;
private Integer createdId;
private Integer modifiedId;
private Date createdTime;
private Date modifiedTime;
private Integer deleted;
private String mobile;
public MemberTicketInvite(Integer id, Integer ownerId, Integer memberId, Integer status, Integer platformId, Integer createdId, Integer modifiedId, Date createdTime, Date modifiedTime, Integer deleted, String mobile) {
this.id = id;
this.ownerId = ownerId;
this.memberId = memberId;
this.status = status;
this.platformId = platformId;
this.createdId = createdId;
this.modifiedId = modifiedId;
this.createdTime = createdTime;
this.modifiedTime = modifiedTime;
this.deleted = deleted;
this.mobile = mobile;
}
public MemberTicketInvite() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getOwnerId() {
return ownerId;
}
public void setOwnerId(Integer ownerId) {
this.ownerId = ownerId;
}
public Integer getMemberId() {
return memberId;
}
public void setMemberId(Integer memberId) {
this.memberId = memberId;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getPlatformId() {
return platformId;
}
public void setPlatformId(Integer platformId) {
this.platformId = platformId;
}
public Integer getCreatedId() {
return createdId;
}
public void setCreatedId(Integer createdId) {
this.createdId = createdId;
}
public Integer getModifiedId() {
return modifiedId;
}
public void setModifiedId(Integer modifiedId) {
this.modifiedId = modifiedId;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public Date getModifiedTime() {
return modifiedTime;
}
public void setModifiedTime(Date modifiedTime) {
this.modifiedTime = modifiedTime;
}
public Integer getDeleted() {
return deleted;
}
public void setDeleted(Integer deleted) {
this.deleted = deleted;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}

View File

@@ -0,0 +1,25 @@
package com.sv.mapper;
import com.sv.entity.MemberTicketInvite;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface MemberTicketInviteMapper {
int deleteByPrimaryKey(Integer id);
int insert(MemberTicketInvite record);
int insertSelective(MemberTicketInvite record);
MemberTicketInvite selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(MemberTicketInvite record);
int updateByPrimaryKey(MemberTicketInvite record);
List<MemberTicketInvite> findByTicketId(Integer ticketId);
int findByTicketIdAndMember(@Param("ticketId") Integer ticketId,@Param("memberId") Integer memberId);
}

View File

@@ -0,0 +1,116 @@
package com.sv.service.api;
import com.enums.*;
import com.github.pagehelper.PageHelper;
import com.sv.dto.api.*;
import com.sv.dto.api.wechat.OrderPaySignResponse;
import com.sv.entity.*;
import com.sv.exception.api.ExceptionCodeTemplate;
import com.sv.mapper.MemberLessonTicketMapper;
import com.sv.mapper.MemberTicketInviteMapper;
import com.sv.mapper.VenueLessonMapper;
import com.sv.service.api.util.DateUtilCard;
import com.sv.service.common.RedisLock;
import com.sv.service.message.AsyncTaskUtil;
import com.sv.service.message.NotifyAdminMsgThread;
import com.ydd.framework.core.common.Pagination;
import com.ydd.framework.core.common.utils.ValidationUtils;
import com.ydd.framework.core.entity.enums.DeletedEnum;
import com.ydd.framework.core.entity.enums.StatusEnum;
import com.ydd.framework.core.exception.ServiceException;
import com.ydd.framework.core.service.impl.BaseServiceImpl;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import static com.sv.entity.Constants.LESSON_TICKET_LOCK_KEY;
/**
* Service - 用户查询预订列表
*
* @author limqsh
* @since 2024-04-26
*/
@Service
@Transactional
public class MemberTicketEnterService extends BaseServiceImpl {
private final Logger logger = LoggerFactory.getLogger(MemberTicketEnterService.class);
@Resource
private MemberTicketInviteMapper memberTicketInviteMapper;
@Resource
private MemberLessonTicketMapper memberLessonTicketMapper;
@Resource
private VenueLessonMapper venueLessonMapper;
/**
* api 足球预约详情
*/
public MemberTicketEnterDTO memberTicketEnterDetail(Integer memberId, Integer ticketId) {
MemberTicketEnterDTO res = new MemberTicketEnterDTO();
res.setOpenFlag(true);
res.setErrCode("0");
MemberLessonTicket memberLessonTicket = memberLessonTicketMapper.findById(ticketId);
if (memberLessonTicket == null) {
res.setErrCode("2");
res.setMsg("未找到对应的预订信息");
}
// 判断场馆是否已经超时
VenueLesson venueLesson = venueLessonMapper.findById(memberLessonTicket.getLessonId());
LocalTime endTime = venueLesson.getEndTime();
LocalTime startTime = venueLesson.getStartTime();
if (endTime.isAfter(LocalTime.now().plus(15, ChronoUnit.MINUTES)) && startTime.isBefore(LocalTime.now())){
// 十五分钟之内都可以开门
res.setOpenFlag(true);
}
// 1 先判断是否已经报名,如果没有报名就默认报名
int count = memberTicketInviteMapper.findByTicketIdAndMember(ticketId, memberId);
if (count <= 0) {
// 没有报名现在报名
orderMyself(memberId,memberLessonTicket);
}
// 查询报名人员列表
BeanUtils.copyProperties(memberLessonTicket,res);
List<MemberTicketInvite> inviteList = memberTicketInviteMapper.findByTicketId(ticketId);
List<MemberTicketInviteDTO> memberTicketInviteList = new ArrayList<>();
for (MemberTicketInvite ticketInvite : inviteList) {
MemberTicketInviteDTO memberTicketInviteDTO = new MemberTicketInviteDTO();
memberTicketInviteDTO.setMine(false);
if (memberId == ticketInvite.getMemberId()){
memberTicketInviteDTO.setMine(true);
}
BeanUtils.copyProperties(ticketInvite,memberTicketInviteDTO);
memberTicketInviteList.add(memberTicketInviteDTO);
}
res.setMemberTicketInviteList(memberTicketInviteList);
return res;
}
private void orderMyself(Integer memberId, MemberLessonTicket memberLessonTicket){
MemberTicketInvite memberTicketInvite = new MemberTicketInvite();
memberTicketInvite.setMemberId(memberId);
memberTicketInvite.setDeleted(0);
memberTicketInvite.setPlatformId(memberLessonTicket.getPlatformId());
memberTicketInvite.setOwnerId(memberLessonTicket.getId());
memberTicketInvite.setStatus(2);
memberTicketInviteMapper.insert(memberTicketInvite);
}
}

View File

@@ -0,0 +1,173 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sv.mapper.MemberTicketInviteMapper" >
<resultMap id="BaseResultMap" type="com.sv.entity.MemberTicketInvite" >
<constructor >
<idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="owner_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="member_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="status" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="platform_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="created_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="modified_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="created_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
<arg column="modified_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
<arg column="deleted" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="mobile" jdbcType="String" javaType="java.lang.String" />
</constructor>
</resultMap>
<sql id="Base_Column_List" >
id, owner_id, member_id, status, platform_id, created_id, modified_id, created_time,
modified_time, deleted
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from sv_member_lesson_ticket_invite
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete from sv_member_lesson_ticket_invite
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.sv.entity.MemberTicketInvite" >
insert into sv_member_lesson_ticket_invite (id, owner_id, member_id,
status, platform_id, created_id,
modified_id, created_time, modified_time,
deleted)
values (#{id,jdbcType=INTEGER}, #{ownerId,jdbcType=INTEGER}, #{memberId,jdbcType=INTEGER},
#{status,jdbcType=INTEGER}, #{platformId,jdbcType=INTEGER}, #{createdId,jdbcType=INTEGER},
#{modifiedId,jdbcType=INTEGER}, #{createdTime,jdbcType=TIMESTAMP}, #{modifiedTime,jdbcType=TIMESTAMP},
#{deleted,jdbcType=INTEGER})
</insert>
<insert id="insertSelective" parameterType="com.sv.entity.MemberTicketInvite" >
insert into sv_member_lesson_ticket_invite
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="ownerId != null" >
owner_id,
</if>
<if test="memberId != null" >
member_id,
</if>
<if test="status != null" >
status,
</if>
<if test="platformId != null" >
platform_id,
</if>
<if test="createdId != null" >
created_id,
</if>
<if test="modifiedId != null" >
modified_id,
</if>
<if test="createdTime != null" >
created_time,
</if>
<if test="modifiedTime != null" >
modified_time,
</if>
<if test="deleted != null" >
deleted,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=INTEGER},
</if>
<if test="ownerId != null" >
#{ownerId,jdbcType=INTEGER},
</if>
<if test="memberId != null" >
#{memberId,jdbcType=INTEGER},
</if>
<if test="status != null" >
#{status,jdbcType=INTEGER},
</if>
<if test="platformId != null" >
#{platformId,jdbcType=INTEGER},
</if>
<if test="createdId != null" >
#{createdId,jdbcType=INTEGER},
</if>
<if test="modifiedId != null" >
#{modifiedId,jdbcType=INTEGER},
</if>
<if test="createdTime != null" >
#{createdTime,jdbcType=TIMESTAMP},
</if>
<if test="modifiedTime != null" >
#{modifiedTime,jdbcType=TIMESTAMP},
</if>
<if test="deleted != null" >
#{deleted,jdbcType=INTEGER},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.sv.entity.MemberTicketInvite" >
update sv_member_lesson_ticket_invite
<set >
<if test="ownerId != null" >
owner_id = #{ownerId,jdbcType=INTEGER},
</if>
<if test="memberId != null" >
member_id = #{memberId,jdbcType=INTEGER},
</if>
<if test="status != null" >
status = #{status,jdbcType=INTEGER},
</if>
<if test="platformId != null" >
platform_id = #{platformId,jdbcType=INTEGER},
</if>
<if test="createdId != null" >
created_id = #{createdId,jdbcType=INTEGER},
</if>
<if test="modifiedId != null" >
modified_id = #{modifiedId,jdbcType=INTEGER},
</if>
<if test="createdTime != null" >
created_time = #{createdTime,jdbcType=TIMESTAMP},
</if>
<if test="modifiedTime != null" >
modified_time = #{modifiedTime,jdbcType=TIMESTAMP},
</if>
<if test="deleted != null" >
deleted = #{deleted,jdbcType=INTEGER},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.sv.entity.MemberTicketInvite" >
update sv_member_lesson_ticket_invite
set owner_id = #{ownerId,jdbcType=INTEGER},
member_id = #{memberId,jdbcType=INTEGER},
status = #{status,jdbcType=INTEGER},
platform_id = #{platformId,jdbcType=INTEGER},
created_id = #{createdId,jdbcType=INTEGER},
modified_id = #{modifiedId,jdbcType=INTEGER},
created_time = #{createdTime,jdbcType=TIMESTAMP},
modified_time = #{modifiedTime,jdbcType=TIMESTAMP},
deleted = #{deleted,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
</update>
<select id="findByTicketId" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
a.id, a.owner_id, a.member_id, a.status, a.platform_id, a.created_id, a.modified_id, a.created_time,
a.modified_time, a.deleted,b.mobile
from sv_member_lesson_ticket_invite a,sv_member b
where a.member_id = b.id
owner_id = #{ticketId,jdbcType=INTEGER}
</select>
<select id="findByTicketIdAndMember" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select count(1)
from sv_member_lesson_ticket_invite
where member_id = #{memberId,jdbcType=INTEGER}
owner_id = #{ticketId,jdbcType=INTEGER}
</select>
</mapper>

View File

@@ -90,7 +90,7 @@
domainObjectName 给表对应的 model 起名字 domainObjectName 给表对应的 model 起名字
注意:大小写敏感问题。 注意:大小写敏感问题。
--> -->
<table tableName="sv_member_enter_status" domainObjectName="MemberEnterStatus" <table tableName="sv_member_lesson_ticket_invite" domainObjectName="MemberTicketInvite"
enableInsert="true" enableInsert="true"
enableDeleteByPrimaryKey="true" enableDeleteByPrimaryKey="true"
enableSelectByPrimaryKey="true" enableSelectByPrimaryKey="true"