门禁开门计费逻辑调整

This commit is contained in:
2023-12-06 10:00:43 +08:00
parent 07a648c3f5
commit 137a5f87ce
35 changed files with 509 additions and 392 deletions

View File

@@ -1,11 +1,12 @@
package com.sv.mapper;
import com.sv.annotation.NoPlatform;
import com.sv.entity.BarcodeEnterLog;
import com.sv.entity.BarcodeOffline;
public interface BarcodeEnterLogMapper {
int deleteByPrimaryKey(Integer id);
@NoPlatform
int insert(BarcodeEnterLog record);
int insertSelective(BarcodeEnterLog record);
@@ -16,6 +17,7 @@ public interface BarcodeEnterLogMapper {
int updateByPrimaryKey(BarcodeEnterLog record);
@NoPlatform
BarcodeEnterLog findLastByBarcode(String barcode);
}

View File

@@ -0,0 +1,17 @@
package com.sv.mapper;
import com.sv.entity.BarcodeOrderTime;
public interface BarcodeOrderTimeMapper {
int deleteByPrimaryKey(Integer id);
int insert(BarcodeOrderTime record);
int insertSelective(BarcodeOrderTime record);
BarcodeOrderTime selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(BarcodeOrderTime record);
int updateByPrimaryKey(BarcodeOrderTime record);
}

View File

@@ -30,7 +30,7 @@ public class MemberEnterVenueLogService extends BaseServiceImpl {
private MemberEnterVenueLogMapper memberEnterVenueLogMapper;
/**
* 获取用户最后的场记录
* 获取用户最后的出入场记录
*
* @param memberId
* @return

View File

@@ -8,6 +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.VenueMapper;
import com.sv.service.api.util.DateUtilCard;
import com.sv.service.api.util.GeoHashUtils;
@@ -57,6 +58,8 @@ public class VenueService extends BaseServiceImpl {
private MemberMoneyLogService memberMoneyLogService;
@Resource
private VenuePriceService venuePriceService;
@Resource
BarcodeMapper barcodeMapper;
/**
* 更新场馆
@@ -220,28 +223,46 @@ public class VenueService extends BaseServiceImpl {
}
//参数校验
ValidationUtils.assertNotNull(venueId);
// 1.判断用户有没有该馆的会员卡(有效期内,如果有免费卡和别的卡,优先使用别的卡),有不判断余额
List<MemberCard> memberCards = memberCardService.findByMemberId(venueId, memberId);
// 2. 查询该场馆需要的费用,并比较用户余额是否足够
// 查询当前时间内,场馆对应的价格
String time = DateUtilCard.nowTime().toString();
VenuePrice venuePrice = venuePriceService.findPrice(venueId, time);
if (venuePrice == null) {
throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR);
}
if (memberCards.size() == 0) {
Member member = memberService.findById(memberId);
if (member.getMoney().compareTo(venuePrice.getPrice()) == -1) {
flag = 2;
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());
}
}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;
}
@@ -261,7 +282,7 @@ public class VenueService extends BaseServiceImpl {
//参数校验
ValidationUtils.assertNotNull(venueId);
Venue venue = venueMapper.findById(venueId);
synchronized (("scancode" + memberId).intern()) {
synchronized (("scancode-out" + memberId).intern()) {
// 查询当前时间内,场馆对应的价格(健身房没有价格)
Member member = memberService.findByMember(memberId);
memberService.verify(member);
@@ -310,18 +331,37 @@ public class VenueService extends BaseServiceImpl {
result.setMsg("未查询到会员卡,请先购买会员卡");
}
}else {
/**
* 篮球出场核心逻辑
*/
//判断余额是否够
String time = DateUtilCard.nowTime().toString();
VenuePrice venuePrice = venuePriceService.findPrice(venueId, time);
if (memberService.isMoneyEnough(member.getId(), venuePrice.getPrice())) {
// 1、找到入场时间
MemberEnterVenueLog memberLastLog = memberEnterVenueLogService.findMemberLastLog(memberId, venueId);
String enterTime = DateUtilCard.getTimeFromDate(memberLastLog.getCreatedTime());
String outTime = DateUtilCard.nowTime().toString();
BigDecimal price = BigDecimal.ZERO;
if(PayStyleEnum.TIME.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, venuePrice.getPrice(), member.getId(), member.getPlatformId(), PayTypeEnum.BALANCE.value, null,
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("余额不足,请先充值");
result.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值");
}
}
}

View File

@@ -1,6 +1,7 @@
package com.sv.service.api.util;
import com.enums.VipTypeEnum;
import org.springframework.util.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -12,6 +13,7 @@ import java.util.GregorianCalendar;
public class DateUtilCard {
private final static SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd");
private final static SimpleDateFormat sdfTime = new SimpleDateFormat( "HH:mm:ss");
public static Date getYear(Date date){
Calendar calendar = Calendar.getInstance();
@@ -145,6 +147,10 @@ public class DateUtilCard {
}
}
public static String getTimeFromDate(Date date){
return sdfTime.format(date);
}
public static String getStrFromDate(Date date){
return sdf.format(date);
}
@@ -163,4 +169,24 @@ public class DateUtilCard {
return calendar.getTime(); //这个时间就是日期往后推一天的结果
}
public static int diffHours(String startTime,String endTime){
if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)){
return 1;
}
try {
String[] split1 = startTime.split(":");
String[] split2 = startTime.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;
}catch (Exception e){
return 1;
}
}
}

View File

@@ -221,6 +221,7 @@ public class DeviceService extends BaseServiceImpl {
return deviceMapper.findByDevice(venueId);
}
@Transactional
public void makeDeviceBarcode(String deviceName, Integer venueId, String barcode) {
BarcodeOffline barcodeOffline = new BarcodeOffline();
Date startTime = new Date();

View File

@@ -24,7 +24,8 @@ public class VenueBarcodeUtil {
public static String generateBarcode(String barcodeValue,String fileName) {
try {
String geneFilePath = "/Users/limqhz/home/test/" + fileName;
String geneFilePath = "/home/test/" + fileName;
// String geneFilePath = "/Users/limqhz/home/test/" + fileName;
makeBarcode(geneFilePath,barcodeValue);
return geneFilePath;
}catch (WriterException e) {