需求一:对每天的课设置预约次数的限制

需求二:对每周的预约次数进行次数限制
需求三:所有课程48小时内不能取消预约设置可配置
This commit is contained in:
limqhz
2021-05-22 22:19:57 +08:00
parent 3d922c6776
commit 0e9a4b676c
13 changed files with 251 additions and 31 deletions

View File

@@ -122,6 +122,16 @@ public class VenueDTO implements Serializable {
*/
private Integer deleted;
/**
* 每天预约限制
*/
private Integer limitDay;
/**
* 每周预约限制
*/
private Integer limitWeek;
/**
* 场馆图片列表
*/
@@ -527,4 +537,20 @@ public class VenueDTO implements Serializable {
public void setCodeUrl(String codeUrl) {
this.codeUrl = codeUrl;
}
public Integer getLimitDay() {
return limitDay;
}
public void setLimitDay(Integer limitDay) {
this.limitDay = limitDay;
}
public Integer getLimitWeek() {
return limitWeek;
}
public void setLimitWeek(Integer limitWeek) {
this.limitWeek = limitWeek;
}
}

View File

@@ -22,7 +22,6 @@ import java.util.List;
*/
public class VenueLessonDTO implements Serializable {
/**
*
*/
@@ -180,6 +179,11 @@ public class VenueLessonDTO implements Serializable {
*/
private String venueName;
/**
* 可取消预约时间(小时)
*/
private Integer orderLimit;
/**
* 日期集合
*/
@@ -615,4 +619,12 @@ public class VenueLessonDTO implements Serializable {
public void setType(Integer type) {
this.type = type;
}
public Integer getOrderLimit() {
return orderLimit;
}
public void setOrderLimit(Integer orderLimit) {
this.orderLimit = orderLimit;
}
}

View File

@@ -151,6 +151,16 @@ public class Venue implements Serializable {
*/
private Integer deleted;
/**
* 每天预约限制
*/
private Integer limitDay;
/**
* 每周预约限制
*/
private Integer limitWeek;
/**
* 设置
@@ -574,4 +584,20 @@ public class Venue implements Serializable {
public void setNumber(Integer number) {
this.number = number;
}
public Integer getLimitDay() {
return limitDay;
}
public void setLimitDay(Integer limitDay) {
this.limitDay = limitDay;
}
public Integer getLimitWeek() {
return limitWeek;
}
public void setLimitWeek(Integer limitWeek) {
this.limitWeek = limitWeek;
}
}

View File

@@ -136,7 +136,10 @@ public class VenueLesson implements Serializable {
*/
private Integer deleted;
/**
* 可取消预约时间(小时)
*/
private Integer orderLimit;
/**
* 设置
@@ -520,4 +523,12 @@ public class VenueLesson implements Serializable {
public void setType(Integer type) {
this.type = type;
}
public Integer getOrderLimit() {
return orderLimit;
}
public void setOrderLimit(Integer orderLimit) {
this.orderLimit = orderLimit;
}
}

View File

@@ -81,6 +81,16 @@
</el-time-picker>
</el-form-item>
<!-- 每天预约限制 -->
<el-form-item label="公益每天可预约" prop="name">
<el-input-number v-model="form.limitDay" min="0" :precision="0" placeholder="请输入每天预约限制次数"></el-input-number>
</el-form-item>
<!-- 每周预约限制 -->
<el-form-item label="公益每周可预约" prop="name">
<el-input-number v-model="form.limitWeek" min="0" :precision="0" placeholder="请输入每周预约限制次数"></el-input-number>
</el-form-item>
<el-form-item label="门店GPS位置" prop="address" :required="true">
<div style="color:red">*请点击地图选择一个位置用于小程序前端导航</div>
<div id="container" class="map" tabindex="0" style="width:900px;margin-top:10px"></div>
@@ -213,6 +223,8 @@ export default {
starTime : '',
endTime:'',
priceDate: undefined,
limitDay: 1,
limitWeek: 1,
},
imgs: [],
timeData: undefined,
@@ -336,6 +348,8 @@ export default {
this.form.businessStartTime = response.venue.businessStartTime;
this.form.businessEndTime = response.venue.businessEndTime;
this.form.cardContent = response.venue.cardContent;
this.form.limitDay = response.venue.limitDay;
this.form.limitWeek = response.venue.limitWeek;
this.timeData = [
response.venue.businessStartTime,
response.venue.businessEndTime

View File

@@ -60,6 +60,11 @@
<el-input :disabled="true" v-model.number="form.saleNum" style="width:180px"></el-input>
</el-form-item>
<!-- 可取消预约时间小时 -->
<el-form-item label="取消限制(时)" prop="orderLimit">
<el-input-number v-model="form.orderLimit" min="0" :precision="0" placeholder="请输入小时数"></el-input-number>
</el-form-item>
<!-- 教练ID -->
<el-form-item label="教练" prop="coachId">
<el-select v-model="form.coachId" filterable placeholder="请选择教练">
@@ -147,7 +152,8 @@ export default {
platformId: '',
lessonImage: [],
tags: [],
note: ''
note: '',
orderLimit: 48
},
multip: 3,
imgs: [],
@@ -253,6 +259,7 @@ export default {
this.form.tags = response.venueLesson.tags
this.form.note = response.venueLesson.note
this.form.type = response.venueLesson.type
this.form.orderLimit = response.venueLesson.orderLimit
response.venueLesson.lessonImage.forEach(element => {
this.imgs.push({ name: element, url: element })
})

View File

@@ -1,5 +1,6 @@
package com.sv.mapper;
import com.sv.annotation.NoPlatform;
import com.sv.annotation.PlatformKey;
import com.sv.dto.api.MemberLessonTicketDTO;
import com.sv.dto.api.MemberLessonTicketDetailDTO;

View File

@@ -1,5 +1,6 @@
package com.sv.mapper;
import com.sv.annotation.NoPlatform;
import com.sv.annotation.PlatformKey;
import com.sv.entity.MemberLessonTicket;
import com.sv.entity.VenueLessonTicket;
@@ -108,4 +109,20 @@ public interface VenueLessonTicketMapper {
*/
@PlatformKey
Integer findNum(Integer venueId);
/**
* 检验是否满足公益课当天预约限制
* @param memberId
* @param venueId
*/
@NoPlatform
Integer countFreeDayLimit(@Param("memberId") Integer memberId,@Param("venueId") Integer venueId);
/**
* 检验是否满足公益课当周预约限制
* @param memberId
* @param venueId
*/
@NoPlatform
Integer countFreeWeekLimit(@Param("memberId") Integer memberId,@Param("venueId") Integer venueId);
}

View File

@@ -55,6 +55,8 @@ public class MemberLessonTicketService extends BaseServiceImpl {
@Resource
private VenueLessonService venueLessonService;
@Resource
private VenueService venueService;
@Resource
private VenueLessonTicketService venueLessonTicketService;
@Resource
private MemberCardOrderService memberCardOrderService;
@@ -196,6 +198,13 @@ public class MemberLessonTicketService extends BaseServiceImpl {
// 课程是公益课 判断用户是否可以购买公益课
memberService.verifyMemberBanType(member);
// 课程是公益课
Venue venue = venueService.findById(venueLesson.getVenueId());
Integer limitDay = venue.getLimitDay() == null ? 1 : venue.getLimitDay();
Integer limitWeek = venue.getLimitWeek() == null ? 2 : venue.getLimitWeek();
// 1、对每天的课设置预约次数的限制
// 2、对每周的预约次数进行次数限制
venueLessonService.checkFreeLimit(member.getId(),venueLesson.getVenueId(),limitDay,limitWeek);
}
venueLessonService.decide(venueLesson, lessonTicketOrderDTO.getNum());
@@ -494,8 +503,11 @@ public class MemberLessonTicketService extends BaseServiceImpl {
double min = between / 3600;
DecimalFormat df = new DecimalFormat("#.#");
Double hour = Double.parseDouble(df.format(min));
Double subHour = 48D;
if (hour <= subHour) {
Integer orderLimit = venueLesson.getOrderLimit();
if (orderLimit == null){
orderLimit = 48;
}
if (hour <= orderLimit) {
throw new ServiceException(ExceptionCodeTemplate.LESSON_CANCEL);
}

View File

@@ -4,10 +4,9 @@ import com.github.pagehelper.PageHelper;
import com.sv.dto.api.VenueLessonDTO;
import com.sv.dto.app.VenueLessonStatus;
import com.sv.entity.Member;
import com.sv.entity.MemberLessonTicket;
import com.sv.entity.VenueLesson;
import com.sv.entity.VenueLessonTicket;
import com.sv.mapper.VenueLessonMapper;
import com.sv.mapper.VenueLessonTicketMapper;
import com.sv.service.api.util.DateUtilCard;
import com.sv.service.api.util.WeekDayUtil;
import com.ydd.framework.core.common.Pagination;
@@ -45,7 +44,7 @@ public class VenueLessonService extends BaseServiceImpl {
@Resource
private MemberService memberService;
@Resource
private VenueLessonTicketService venueLessonTicketService;
private VenueLessonTicketMapper venueLessonTicketMapper;
/**
* 创建场馆课程
@@ -333,5 +332,22 @@ public class VenueLessonService extends BaseServiceImpl {
return venueLessonMapper.getLessonStatus(venueId);
}
/**
* 检验是否满足公益课预约限制
* @param memberId
* @param venueId
* @param limitDay
* @param limitWeek
*/
public void checkFreeLimit(Integer memberId, Integer venueId, Integer limitDay, Integer limitWeek) {
Integer dayCount = venueLessonTicketMapper.countFreeDayLimit(memberId, venueId);
if (dayCount + 1 > limitDay){
throw new ServiceException("该场馆当天最多可预约" + limitDay + "个公益课");
}
Integer weekCount = venueLessonTicketMapper.countFreeWeekLimit(memberId, venueId);
if (weekCount + 1 > limitWeek){
throw new ServiceException("该场馆一周最多可预约" + limitWeek + "个公益课");
}
}
}

View File

@@ -24,6 +24,7 @@
<result column="deleted" property="deleted"/>
<result column="note" property="note"/>
<result column="type" property="type"></result>
<result column="order_limit" property="orderLimit"></result>
</resultMap>
<resultMap id="VenueLessonOrderDtoMap" type="com.sv.dto.api.VenueLessonDTO" extends="VenueLessonMap">
<result column="address" property="address"/>
@@ -70,7 +71,8 @@
deleted,
note,
status,
type
type,
order_limit
</sql>
<!-- 字段值 -->
@@ -96,6 +98,7 @@
#{deleted, jdbcType=TINYINT},
#{note, jdbcType=VARCHAR},
#{status, jdbcType=INTEGER}
#{orderLimit, jdbcType=INTEGER}
</sql>
<!-- 查询全部记录 -->
@@ -177,6 +180,9 @@
<if test="deleted != null">
deleted,
</if>
<if test="orderLimit != null">
order_limit,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@@ -242,6 +248,9 @@
<if test="deleted != null">
#{deleted},
</if>
<if test="orderLimit != null">
#{orderLimit},
</if>
</trim>
</insert>
@@ -333,6 +342,9 @@
<if test="note != null">
note = #{note},
</if>
<if test="orderLimit != null">
order_limit = #{orderLimit},
</if>
</set>
WHERE id = #{id}
</update>
@@ -487,6 +499,7 @@
ve.latitude,
ve.longitude,
le.type,
le.order_limit,
ve.`name` AS venueName
FROM
sv_venue_lesson AS le
@@ -508,7 +521,8 @@
vl.price,
vl.num,
vl.sale_num,
vl.note
vl.note,
vl.order_limit
FROM
sv_venue_lesson AS vl
LEFT JOIN sv_venue AS ue ON vl.venue_id = ue.id

View File

@@ -344,4 +344,40 @@
lesson_id = #{venueId}
AND deleted = 0
</select>
<select id="countFreeWeekLimit" resultType="java.lang.Integer">
SELECT
COUNT(0)
FROM
sv_member_lesson_ticket t,sv_venue_lesson a
WHERE
t.lesson_id = a.id
AND t.venue_id = #{venueId}
AND a.type = 1
AND t.deleted = 0
AND t.status in (0,1,3)
AND t.member_id = #{memberId}
AND (CASE WHEN DAYNAME(CURDATE())='Sunday'
THEN DATE_SUB(CURDATE(),INTERVAL 6 DAY)
ELSE DATE_SUB(CURDATE(),INTERVAL DAYOFWEEK(CURDATE())-2 DAY) END) <![CDATA[ <= ]]> DATE(t.created_time)
AND (CASE WHEN DAYNAME(CURDATE())='Sunday'
THEN CURDATE()
ELSE DATE_ADD(CURDATE(),INTERVAL 8-DAYOFWEEK(CURDATE()) DAY) END) <![CDATA[ >= ]]> DATE(t.created_time);
</select>
<select id="countFreeDayLimit" resultType="java.lang.Integer">
SELECT
COUNT(0)
FROM
sv_member_lesson_ticket t,sv_venue_lesson a
WHERE
t.lesson_id = a.id
AND t.venue_id = #{venueId}
AND a.type = 1
AND t.deleted = 0
AND t.status in (0,1,3)
AND t.member_id = #{memberId}
AND CURDATE() <![CDATA[ <= ]]> DATE(t.created_time)
AND CURDATE() <![CDATA[ >= ]]> DATE(t.created_time);
</select>
</mapper>

View File

@@ -28,6 +28,8 @@
<result column="modified_time" property="modifiedTime"/>
<result column="code_url" property="codeUrl"></result>
<result column="deleted" property="deleted"/>
<result column="limit_day" property="limitDay"/>
<result column="limit_week" property="limitWeek"/>
</resultMap>
<resultMap id="VenueDtoMap" type="com.sv.dto.api.VenueDTO">
@@ -50,6 +52,8 @@
<result column="created_time" property="createdTime"/>
<result column="modified_time" property="modifiedTime"/>
<result column="deleted" property="deleted"/>
<result column="limit_day" property="limitDay"/>
<result column="limit_week" property="limitWeek"/>
<result column="code_url" property="codeUrl"></result>
<association property="cards" select="com.sv.mapper.VenueCardMapper.findByVenueId"
column="{venueId = id,venueType=type}"></association>
@@ -105,7 +109,9 @@
created_time,
modified_time,
code_url,
deleted
deleted,
limit_day,
limit_week
</sql>
<!-- 字段值 -->
@@ -129,6 +135,8 @@
#{createdTime, jdbcType=TIMESTAMP},
#{modifiedTime, jdbcType=TIMESTAMP},
#{deleted, jdbcType=TINYINT}
#{limit_day, jdbcType=TINYINT}
#{limit_week, jdbcType=TINYINT}
</sql>
<!-- 查询全部记录 -->
@@ -251,6 +259,12 @@
<if test="deleted != null">
deleted,
</if>
<if test="limitDay != null">
limit_day,
</if>
<if test="limitWeek != null">
limit_week,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@@ -325,6 +339,12 @@
<if test="deleted != null">
#{deleted},
</if>
<if test="limitDay != null">
#{limitDay},
</if>
<if test="limitWeek != null">
#{limitWeek},
</if>
</trim>
</insert>
@@ -430,6 +450,12 @@
<if test="codeUrl != null">
code_url = #{codeUrl},
</if>
<if test="limitDay != null">
limit_day = #{limitDay},
</if>
<if test="limitWeek != null">
limit_week = #{limitWeek},
</if>
</set>
WHERE id = #{id}
</update>
@@ -465,7 +491,9 @@
description,
longitude,
latitude,
card_content
card_content,
limit_day,
limit_week
FROM
sv_venue
WHERE