课程按次按时逻辑调整

This commit is contained in:
limqhz
2023-12-06 19:44:08 +08:00
parent 137a5f87ce
commit b4f9663bb2
11 changed files with 294 additions and 70 deletions

View File

@@ -1,6 +1,10 @@
package com.sv.mapper;
import com.sv.entity.BarcodeOrderTime;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
public interface BarcodeOrderTimeMapper {
int deleteByPrimaryKey(Integer id);
@@ -14,4 +18,9 @@ public interface BarcodeOrderTimeMapper {
int updateByPrimaryKeySelective(BarcodeOrderTime record);
int updateByPrimaryKey(BarcodeOrderTime record);
int findEffOrder(@Param("currentDate") Date currentDate,@Param("memberId") Integer memberId, @Param("venueId") Integer venueId);
List<BarcodeOrderTime> endOrderList(@Param("currentDate") Date currentDate);
}

View File

@@ -8,7 +8,7 @@ import com.sv.dto.api.MemberCardVenuesDTO;
import com.sv.dto.api.VenueDTO;
import com.sv.entity.*;
import com.sv.exception.api.ExceptionCodeTemplate;
import com.sv.mapper.BarcodeMapper;
import com.sv.mapper.BarcodeOrderTimeMapper;
import com.sv.mapper.VenueMapper;
import com.sv.service.api.util.DateUtilCard;
import com.sv.service.api.util.GeoHashUtils;
@@ -59,7 +59,7 @@ public class VenueService extends BaseServiceImpl {
@Resource
private VenuePriceService venuePriceService;
@Resource
BarcodeMapper barcodeMapper;
BarcodeOrderTimeMapper barcodeOrderTimeMapper;
/**
* 更新场馆
@@ -214,6 +214,7 @@ public class VenueService extends BaseServiceImpl {
* api 接口
* 我要进场
*/
@Transactional(rollbackFor = Exception.class)
public BarCodeResult join(Integer memberId, Integer venueId) {
BarCodeResult barCodeResult = new BarCodeResult();
Integer flag = 0;
@@ -223,46 +224,59 @@ public class VenueService extends BaseServiceImpl {
}
//参数校验
ValidationUtils.assertNotNull(venueId);
synchronized (("scancode-in" + memberId).intern()) {
// 1.判断用户有没有该馆的会员卡(有效期内,如果有免费卡和别的卡,优先使用别的卡),有不判断余额
List<MemberCard> memberCards = memberCardService.findByMemberId(venueId, memberId);
// 2. 查询该场馆需要的费用,并比较用户余额是否足够
// 查询当前时间内,场馆对应的价格
String time = DateUtilCard.nowTime().toString();
Venue venue = venueMapper.findById(venueId);
VenuePrice venuePrice = venuePriceService.findPrice(venueId, time);
BigDecimal price = venuePrice.getPrice();
if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){
// 按次入场先收钱,且多久之后不收钱,出场不收钱
Integer timePayHour = venue.getTimePayHour();
// 进过场,判断订单是否超时
Barcode res = barcodeMapper.findBarcode(venueId, memberId);
if (res != null) {
// 已经生成了二维码,而且二维码有效
res.getCreatedTime();
// DateUtilCard.getTimeFromDate(memberLastLog.getCreatedTime());
// 1.判断用户有没有该馆的会员卡(有效期内,如果有免费卡和别的卡,优先使用别的卡),有不判断余额
List<MemberCard> memberCards = memberCardService.findByMemberId(venueId, memberId);
// 2. 查询该场馆需要的费用,并比较用户余额是否足够
// 查询当前时间内,场馆对应的价格
String time = DateUtilCard.nowTime().toString();
Venue venue = venueMapper.findById(venueId);
VenuePrice venuePrice = venuePriceService.findPrice(venueId, time);
BigDecimal price = venuePrice.getPrice();
if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){
// 按时入场余额需要包含两个小时的场地费
price = price.multiply(new BigDecimal(2));
}
if (venuePrice == null) {
throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR);
}
if (memberCards.size() == 0) {
Member member = memberService.findById(memberId);
if (member.getMoney().compareTo(price) == -1) {
flag = 2;
}
}
if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){
// 按次入场先收钱,且多久不收钱,出场不收钱
// 该用户上次订单的是否逾期
Integer timePayHour = venue.getTimePayHour();
if (timePayHour == null) {
timePayHour = 4;
}
int effOrder = barcodeOrderTimeMapper.findEffOrder(new Date(), memberId, venueId);
if (effOrder <= 0) {
// 单次订单已超时 需要重新付费
synchronized (("scancode-in" + memberId).intern()) {
createBarcodeTimeOrder(memberId,venueId,timePayHour);
if (memberService.isMoneyEnough(memberId, price)) {
logger.info("用户" + memberId + "使用余额核销订单");
createMemberMoneyLog(MoneyLogEnum.JOIN.value, price, memberId, 1, PayTypeEnum.BALANCE.value, null,
venue.getId(), venue.getType());
} else {
//余额不足
logger.error("用户" + memberId + "余额不足核销失败");
barCodeResult.setFlg(2);
barCodeResult.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值");
}
}else {
// 按时入场余额需要包含两个小时的场地费
price = price.multiply(new BigDecimal(2));
}
if (venuePrice == null) {
throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR);
}
if (memberCards.size() == 0) {
Member member = memberService.findById(memberId);
if (member.getMoney().compareTo(price) == -1) {
flag = 2;
}
}
barCodeResult.setFlg(flag);
// 3.判断用户有没有人脸识别的图像,根据用户ID查找一个用户只能有一条
// MemberFaceInfo memberFaceInfo = memberFaceInfoService.findByMemberId(memberId);
// if (memberFaceInfo == null) {
// flag = 1;
// return flag;
// }
}
barCodeResult.setFlg(flag);
// 3.判断用户有没有人脸识别的图像,根据用户ID查找一个用户只能有一条
// MemberFaceInfo memberFaceInfo = memberFaceInfoService.findByMemberId(memberId);
// if (memberFaceInfo == null) {
// flag = 1;
// return flag;
// }
return barCodeResult;
}
@@ -272,6 +286,7 @@ public class VenueService extends BaseServiceImpl {
* @param venueId
* @return
*/
@Transactional(rollbackFor = Exception.class)
public BarCodeResult out(Integer memberId, Integer venueId) {
BarCodeResult result = new BarCodeResult();
result.setFlg(0);
@@ -340,28 +355,27 @@ public class VenueService extends BaseServiceImpl {
String enterTime = DateUtilCard.getTimeFromDate(memberLastLog.getCreatedTime());
String outTime = DateUtilCard.nowTime().toString();
BigDecimal price = BigDecimal.ZERO;
if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){
if(PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){
// 按次出场不扣钱
// 取入场的价格
VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime);
// VenuePrice venuePriceOut = venuePriceService.findPrice(venueId, outTime);
price = venuePriceEnter.getPrice();
}else {
// 按时出场选择按照分钟四舍五入到角扣款
VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime);
price = venuePriceEnter.getPrice();
int hours = DateUtilCard.diffHours(enterTime, outTime);
price = price.multiply(new BigDecimal(hours));
}
if (memberService.isMoneyEnough(member.getId(), price)) {
logger.info("用户" + member.getNickname() + "使用余额核销订单");
createMemberMoneyLog(MoneyLogEnum.JOIN.value, price, member.getId(), member.getPlatformId(), PayTypeEnum.BALANCE.value, null,
venue.getId(), venue.getType());
} else {
//余额不足
logger.error("用户" + member.getNickname() + "余额不足核销失败");
result.setFlg(1);
result.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值");
int minutes = DateUtilCard.diffMinute(enterTime, outTime);
price = price.divide(new BigDecimal(60),4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(minutes)).setScale(1,BigDecimal.ROUND_HALF_UP);
if (price.compareTo(BigDecimal.ZERO) < 0) {
price = BigDecimal.ZERO;
}
if (memberService.isMoneyEnough(member.getId(), price)) {
logger.info("用户" + member.getNickname() + "使用余额核销订单");
createMemberMoneyLog(MoneyLogEnum.JOIN.value, price, member.getId(), member.getPlatformId(), PayTypeEnum.BALANCE.value, null,
venue.getId(), venue.getType());
} else {
//余额不足
logger.error("用户" + member.getNickname() + "余额不足核销失败");
result.setFlg(2);
result.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值");
}
}
}
}
@@ -422,6 +436,25 @@ public class VenueService extends BaseServiceImpl {
memberMoneyLogService.create(memberId,platformId == null ? 1 : platformId,type,price.negate(),payType,cardType,venueId,venueType,null);
}
/**
* 按次入场订单入库
* @param memberId
* @param venueId
* @param timePayHour
*/
private void createBarcodeTimeOrder(Integer memberId, Integer venueId, Integer timePayHour) {
Date startDate = new Date();
Date endDate = DateUtilCard.addHours(startDate, timePayHour);
BarcodeOrderTime barcodeOrderTime = new BarcodeOrderTime();
barcodeOrderTime.setMemberId(memberId);
barcodeOrderTime.setVenueId(venueId);
barcodeOrderTime.setOrderStart(startDate);
barcodeOrderTime.setOrderEnd(endDate);
barcodeOrderTime.setStatus(BarCodeStatusEnum.INIT.getValue());
barcodeOrderTimeMapper.insert(barcodeOrderTime);
}
@Transactional(rollbackFor = Exception.class)
public void addNumber(Integer venueId, Integer number, Integer memberId) {
if (number > 0 && venueMapper.countByMember(memberId, venueId) <= 0) {

View File

@@ -169,21 +169,28 @@ public class DateUtilCard {
return calendar.getTime(); //这个时间就是日期往后推一天的结果
}
public static int diffHours(String startTime,String endTime){
public static Date addHours(Date date,int hours){
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.add(calendar.HOUR,hours); //把日期往后增加一小时,整数 往后推,负数往前移动
return calendar.getTime(); //这个时间就是日期往后推一天的结果
}
public static int diffMinute(String startTime,String endTime){
if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)){
return 1;
}
try {
String[] split1 = startTime.split(":");
String[] split2 = startTime.split(":");
String[] split2 = endTime.split(":");
int t1 = 0;
int t2 = 0;
t1 = (Integer.parseInt(split1[0]) * 3600)
+ (Integer.parseInt(split1[1]) * 60) + Integer.parseInt(split1[2]);
t2 = (Integer.parseInt(split2[0]) * 3600)
+ (Integer.parseInt(split2[1]) * 60) + Integer.parseInt(split2[2]);
int diff = t2 - t1 - 600;
return (diff / 3600) + 1;
int diff = t2 - t1;
return (diff / 60) + 1;
}catch (Exception e){
return 1;
}

View File

@@ -10,10 +10,11 @@
<arg column="modified_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
<arg column="order_start" jdbcType="TIMESTAMP" javaType="java.util.Date" />
<arg column="order_end" jdbcType="TIMESTAMP" javaType="java.util.Date" />
<arg column="status" jdbcType="INTEGER" javaType="java.lang.Integer" />
</constructor>
</resultMap>
<sql id="Base_Column_List" >
id, member_id, venue_id, created_time, modified_time, order_start, order_end
id, member_id, venue_id, created_time, modified_time, order_start, order_end, status
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
@@ -28,10 +29,10 @@
<insert id="insert" parameterType="com.sv.entity.BarcodeOrderTime" >
insert into sv_barcode_order_time (id, member_id, venue_id,
created_time, modified_time, order_start,
order_end)
order_end, status)
values (#{id,jdbcType=INTEGER}, #{memberId,jdbcType=INTEGER}, #{venueId,jdbcType=INTEGER},
#{createdTime,jdbcType=TIMESTAMP}, #{modifiedTime,jdbcType=TIMESTAMP}, #{orderStart,jdbcType=TIMESTAMP},
#{orderEnd,jdbcType=TIMESTAMP})
#{orderEnd,jdbcType=TIMESTAMP}, #{status,jdbcType=INTEGER})
</insert>
<insert id="insertSelective" parameterType="com.sv.entity.BarcodeOrderTime" >
insert into sv_barcode_order_time
@@ -57,6 +58,9 @@
<if test="orderEnd != null" >
order_end,
</if>
<if test="status != null" >
status,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
@@ -80,6 +84,9 @@
<if test="orderEnd != null" >
#{orderEnd,jdbcType=TIMESTAMP},
</if>
<if test="status != null" >
#{status,jdbcType=INTEGER},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.sv.entity.BarcodeOrderTime" >
@@ -103,6 +110,9 @@
<if test="orderEnd != null" >
order_end = #{orderEnd,jdbcType=TIMESTAMP},
</if>
<if test="status != null" >
status = #{status,jdbcType=INTEGER},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
@@ -113,7 +123,22 @@
created_time = #{createdTime,jdbcType=TIMESTAMP},
modified_time = #{modifiedTime,jdbcType=TIMESTAMP},
order_start = #{orderStart,jdbcType=TIMESTAMP},
order_end = #{orderEnd,jdbcType=TIMESTAMP}
order_end = #{orderEnd,jdbcType=TIMESTAMP},
status = #{status,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
</update>
<select id="findEffOrder" resultType="int">
select count(1)
from sv_barcode_order_time
where status = 0 and order_end &gt;= #{currentDate} and member_id = #{memberId,jdbcType=INTEGER} and venue_id = #{venueId,jdbcType=INTEGER}
</select>
<select id="endOrderList" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />
from sv_barcode_order_time
where status = 0 and order_end &lt;= #{currentDate}
</select>
</mapper>