api-完善二维码入场逻辑,目前只支持健身馆
This commit is contained in:
@@ -2,7 +2,6 @@ package com.sv.service.api;
|
||||
|
||||
import com.enums.*;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.sv.dto.EnterResult;
|
||||
import com.sv.dto.api.MemberCardDTO;
|
||||
import com.sv.dto.api.MemberCardVenuesDTO;
|
||||
import com.sv.dto.api.VenueDTO;
|
||||
@@ -12,15 +11,11 @@ import com.sv.mapper.VenueMapper;
|
||||
import com.sv.service.api.util.DateUtilCard;
|
||||
import com.sv.service.api.util.GeoHashUtils;
|
||||
import com.sv.service.common.FaceService;
|
||||
import com.sv.service.common.OSSClientUtil;
|
||||
import com.sv.service.common.PlatformService;
|
||||
import com.sv.service.oms.DeviceService;
|
||||
import com.ydd.framework.core.common.Pagination;
|
||||
import com.ydd.framework.core.common.utils.ValidationUtils;
|
||||
import com.ydd.framework.core.exception.ServiceException;
|
||||
import com.ydd.framework.core.service.CacheService;
|
||||
import com.ydd.framework.core.service.impl.BaseServiceImpl;
|
||||
import com.ydd.framework.core.service.impl.WxXCXService;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -28,9 +23,9 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.InputStream;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Service - 场馆
|
||||
@@ -356,7 +351,7 @@ public class VenueService extends BaseServiceImpl {
|
||||
// //进场之前 查看是否有会员卡
|
||||
// List<MemberCard> cards = memberCardService.findByMemberId(device.getVenueId(), member.getId());
|
||||
// if (cards.size() > 0) {
|
||||
// //有会员卡 查看是否是免费卡
|
||||
// //有会员卡 查看是否是免费卡 【// 发现这里的逻辑不是优先使用免费卡】
|
||||
// MemberCard useCard = null;
|
||||
// for (MemberCard card : cards) {
|
||||
// if (!VipTypeEnum.FREECARD.value.equals(card.getCardType())) {
|
||||
@@ -406,100 +401,81 @@ public class VenueService extends BaseServiceImpl {
|
||||
// }
|
||||
|
||||
/**
|
||||
* 人脸失败用户入场(篮球场)
|
||||
* 是否可以成功入场
|
||||
*
|
||||
* @return 0成功 -1失败
|
||||
*/
|
||||
@Transactional
|
||||
public synchronized EnterResult qrCodeEnterVenue(Integer memberId, String deviceName,Integer venueId,Venue venue) {
|
||||
EnterResult result = new EnterResult();
|
||||
public synchronized boolean qrCodeEnterVenue(Integer memberId, String deviceName,Integer venueId,Venue venue) {
|
||||
synchronized (("enter" + memberId).intern()) {
|
||||
Date now = new Date();
|
||||
Device device = deviceService.findByDevice(deviceName,venueId, DeviceType.ENTER);
|
||||
// 查询当前时间内,场馆对应的价格
|
||||
String time = DateUtilCard.nowTime().toString();
|
||||
VenuePrice venuePrice = venuePriceService.findPrice(device.getVenueId(), time);
|
||||
if (venuePrice == null) {
|
||||
logger.info("场馆暂未开放");
|
||||
result.setStatus(-2);
|
||||
return result;
|
||||
}
|
||||
// 查询当前时间内,场馆对应的价格(健身房没有价格)
|
||||
if (venue.getStatus().intValue() == 1) {
|
||||
logger.info(venue.getName() + "被禁用,入场失败");
|
||||
result.setStatus(-2);
|
||||
return result;
|
||||
return false;
|
||||
}
|
||||
Member member = memberService.findByMember(memberId);
|
||||
memberService.verify(member);
|
||||
if (venue == null || member == null) {
|
||||
result.setStatus(-1);
|
||||
return result;
|
||||
}
|
||||
//判断8小时之内 是否连续进场
|
||||
MemberEnterVenueLog enterVenueLog = memberEnterVenueLogService.findMemberLastLog(member.getId(), device.getVenueId());
|
||||
// 记录用户进场记录
|
||||
MemberEnterVenueLog log = new MemberEnterVenueLog();
|
||||
log.setMemberId(member.getId());
|
||||
log.setVeneuType(device.getVenueType());
|
||||
log.setVenueId(device.getVenueId());
|
||||
log.setPlatformId(member.getPlatformId());
|
||||
if (enterVenueLog != null) {
|
||||
if ((now.getTime() - enterVenueLog.getCreatedTime().getTime()) <= (8 * 60 * 60 * 1000)) {
|
||||
//小于8小时直接进场
|
||||
log.setOrderSn("");
|
||||
logger.info("用户:" + member.getNickname() + "小于8小时直接进场");
|
||||
memberEnterVenueLogService.save(log);
|
||||
result.setStatus(0);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
log.setType(DeviceType.ENTER.getCode());
|
||||
//进场之前 查看是否有会员卡
|
||||
List<MemberCard> cards = memberCardService.findByMemberId(device.getVenueId(), member.getId());
|
||||
if (cards.size() > 0) {
|
||||
//有会员卡 查看是否是免费卡
|
||||
MemberCard useCard = null;
|
||||
for (MemberCard card : cards) {
|
||||
if (!VipTypeEnum.FREECARD.value.equals(card.getCardType())) {
|
||||
useCard = card;
|
||||
break;
|
||||
} else {
|
||||
//查看该免费卡是否可用 (一天用一次)
|
||||
if (memberEnterVenueLogService.isFreeCardUseful(card.getId())) {
|
||||
useCard = card;
|
||||
break;
|
||||
//有会员卡 查看是否有免费卡
|
||||
List<MemberCard> freeCard = cards.stream().filter(free -> VipTypeEnum.FREECARD.value.equals(free.getCardType())).collect(Collectors.toList());
|
||||
//有会员卡 查看是否有单次卡
|
||||
List<MemberCard> onceCard = cards.stream().filter(free ->
|
||||
VipTypeEnum.ONCECARD.value.equals(free.getCardType()) || VipTypeEnum.PUB_ONCECARD.value.equals(free.getCardType())).collect(Collectors.toList());
|
||||
boolean canUseFree = false;
|
||||
if (freeCard !=null && freeCard.size() > 0){
|
||||
for (MemberCard f : freeCard){
|
||||
if (memberEnterVenueLogService.isFreeCardUseful(f.getId())){
|
||||
canUseFree = true;
|
||||
// 如果有一张可以用的免费卡就用免费卡
|
||||
useCard = f;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!canUseFree) {
|
||||
if (onceCard != null && onceCard.size() > 0)
|
||||
// 不能用免费卡,优先单次卡,取第一张可用的单次卡
|
||||
useCard = onceCard.get(0);
|
||||
} else {
|
||||
// 单次卡和免费卡都不能用,随意用一张季卡或者年卡
|
||||
useCard = cards.get(0);
|
||||
}
|
||||
if (useCard != null) {
|
||||
//使用会员卡入场
|
||||
logger.info("用户" + member.getNickname() + "使用" + useCard.getCardType() + "入场");
|
||||
log.setMemberCardId(useCard.getId());
|
||||
log.setPayType(EnterVenuePayTypeEnum.MEMBER_CARD.value);
|
||||
String orderSn = orderService.createEnterVenueOrder(venue, member.getId(), PayTypeEnum.MEMBER_CARD, venuePrice.getPrice());
|
||||
String orderSn = orderService.createEnterVenueOrder(venue, member.getId(), PayTypeEnum.MEMBER_CARD, BigDecimal.ZERO);
|
||||
// 会员卡入场,增加记录
|
||||
createMemberMoneyLog(MoneyLogEnum.JOIN.value, venue.getPrice(), member.getId(), member.getPlatformId(), PayTypeEnum.MEMBER_CARD.value, useCard.getCardType(),
|
||||
venue.getId(), venue.getType());
|
||||
log.setOrderSn(orderSn);
|
||||
memberEnterVenueLogService.save(log);
|
||||
result.setStatus(1);
|
||||
return result;
|
||||
// 如果是单次卡,清除单次卡
|
||||
if (VipTypeEnum.ONCECARD.value.equals(useCard.getCardType())
|
||||
|| VipTypeEnum.PUB_ONCECARD.value.equals(useCard.getCardType())){
|
||||
memberCardService.delete(useCard.getId());
|
||||
}
|
||||
return true;
|
||||
}else {
|
||||
//查无可用会员卡
|
||||
logger.info("用户" + member.getNickname() + "您好!请先购买会员卡再进场");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
//没有会员卡 扣余额
|
||||
//判断余额是否够
|
||||
if (memberService.isMoneyEnough(member.getId(), venuePrice.getPrice())) {
|
||||
logger.info("用户" + member.getNickname() + "使用余额进场");
|
||||
result.setMoney(venuePrice.getPrice());
|
||||
String orderSn = orderService.createEnterVenueOrder(venue, member.getId(), PayTypeEnum.BALANCE, venuePrice.getPrice());
|
||||
log.setOrderSn(orderSn);
|
||||
log.setPayType(EnterVenuePayTypeEnum.WEI_XIN.value);
|
||||
memberEnterVenueLogService.save(log);
|
||||
result.setStatus(2);
|
||||
return result;
|
||||
} else {
|
||||
//余额不足
|
||||
logger.info("用户" + member.getNickname() + "余额不足进场失败");
|
||||
result.setStatus(-2);
|
||||
return result;
|
||||
}else {
|
||||
//没有可用会员卡 健身房也不支持扣余额
|
||||
logger.info("用户" + member.getNickname() + "您好!请先购买会员卡再进场");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user