微信后台-二维码扫描代码初始化-简化,待处理细节

This commit is contained in:
2023-09-02 11:31:39 +08:00
parent 9b614251ca
commit f0ef32ffc6
15 changed files with 238 additions and 351 deletions

View File

@@ -14,7 +14,6 @@ import com.sv.exception.api.ExceptionCodeTemplate;
import com.sv.mapper.MemberMapper;
import com.sv.service.common.ApiConstants;
import com.sv.service.common.CaptchaCacheServiceImpl;
import com.sv.service.common.FaceService;
import com.sv.service.common.OSSClientUtil;
import com.ydd.framework.core.common.Pagination;
import com.ydd.framework.core.common.utils.ValidationUtils;
@@ -59,8 +58,8 @@ public class MemberService extends BaseServiceImpl {
@Resource
private OSSClientUtil ossClientUtil;
@Resource
private FaceService faceService;
// @Resource
// private FaceService faceService;
@Resource
private CaptchaCacheServiceImpl captchaCacheService;
@Resource
@@ -503,17 +502,17 @@ public class MemberService extends BaseServiceImpl {
String imgUrl = ossClientUtil.uploadImg(new BufferedInputStream(inputStream), file.getOriginalFilename());
logger.info(memberId + "上传oss文件成功." + imgUrl);
Integer subjectId = null;
if (faceService.login()){
ByteArrayInputStream byteArrayInputStream = getByteArrayInputStream(file);
Integer faceId = faceService.uploadFace(byteArrayInputStream);
logger.info(memberId + "& faceId ===" + faceId);
subjectId = faceService.addSubject(faceId, member);
logger.info(memberId + "& subjectId ===" + subjectId);
}
if (memberFaceInfo != null) {
//删除原有的subject
faceService.deleteSubject(memberFaceInfo.getFaceId());
}
// if (faceService.login()){
// ByteArrayInputStream byteArrayInputStream = getByteArrayInputStream(file);
// Integer faceId = faceService.uploadFace(byteArrayInputStream);
// logger.info(memberId + "& faceId ===" + faceId);
// subjectId = faceService.addSubject(faceId, member);
// logger.info(memberId + "& subjectId ===" + subjectId);
// }
// if (memberFaceInfo != null) {
// //删除原有的subject
// faceService.deleteSubject(memberFaceInfo.getFaceId());
// }
setMemberFaceInfo(subjectId, imgUrl, memberId, platformId);
}
} catch (FaceServiceException e) {

View File

@@ -1,74 +0,0 @@
package com.sv.service.api;
import com.enums.VenueTypeEnum;
import com.sv.entity.Device;
import com.sv.entity.Venue;
import com.sv.mapper.DeviceMapper;
import com.sv.mapper.VenueMapper;
import com.ydd.framework.core.exception.ServiceException;
import org.apache.commons.lang.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
/**
* 小程序扫二维码处理
*/
@Service("qrCodeService")
@Transactional(readOnly = true)
public class QRCodeService {
private final Logger logger = LoggerFactory.getLogger(ProtocolService.class);
@Resource
private VenueMapper venueMapper;
@Resource
private DeviceMapper deviceMapper;
public Venue initEnter(Integer venueId,String deviceName,Integer memberId) throws ServiceException{
Integer integer = deviceMapper.checkDevice(deviceName, venueId);
if (integer != 1){
throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.DEVICE_ERROR);
}
Device device = deviceMapper.findByDevice(deviceName, venueId);
if (device == null){
throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.DEVICE_ERROR);
}else {
Date bindTime = device.getBindTime();
Integer bindMember = device.getBindMember();
if (bindTime != null && bindMember != null){
Date now = new Date();
Date endTime = DateUtils.addSeconds(bindTime, 60);
if (bindMember == memberId && now.after(endTime)){
// 设备绑定人员是自己 但是绑定时间已经超过了一分钟
throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.OPERATE_TIMEOUT_ERROR);
}else if (bindMember != memberId && now.before(endTime)){
// 设备绑定的人不是自己,并且呢人家的操作时间还没有结束呢(还没有解绑)
throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.BIND_ERROR);
}
}
}
Venue venue = venueMapper.findById(venueId);
if (venue==null){
throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.VENUE_ERROR);
}
if (!VenueTypeEnum.FITNESS.value.equals(venue.getType())){
throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.VENUE_TYPE_ERROR);
}
return venue;
}
@Transactional
public void bindMember(Integer venueId,String deviceName,Integer memberId){
deviceMapper.bindMember(memberId, venueId, deviceName);
}
@Transactional
public void unBindMember(Integer venueId,String deviceName){
deviceMapper.unBindMember(venueId, deviceName);
}
}

View File

@@ -2,7 +2,7 @@ package com.sv.service.api;
import com.enums.*;
import com.github.pagehelper.PageHelper;
import com.sv.dto.EnterResult;
import com.sv.dto.*;
import com.sv.dto.api.MemberCardDTO;
import com.sv.dto.api.MemberCardVenuesDTO;
import com.sv.dto.api.VenueDTO;
@@ -11,7 +11,6 @@ import com.sv.exception.api.ExceptionCodeTemplate;
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.oms.DeviceService;
import com.ydd.framework.core.common.Pagination;
import com.ydd.framework.core.common.utils.ValidationUtils;
@@ -65,10 +64,6 @@ public class VenueService extends BaseServiceImpl {
@Resource
private VenuePriceService venuePriceService;
@Resource
private FaceService faceService;
/**
* 更新场馆
*
@@ -123,8 +118,13 @@ public class VenueService extends BaseServiceImpl {
* @param id 编号
* @return 场馆
*/
public VenueDTO findByVenueId(Integer id) {
return venueMapper.findByVenueId(id);
public VenueDTO findByVenueId(Integer id,Integer memberId) {
VenueDTO getVenue = venueMapper.findByVenueId(id);
if (VenueTypeEnum.BASKETBALL.getValue().equals(getVenue.getType())){
MemberEnterVenueLog memberLastLog = memberEnterVenueLogService.findMemberLastLog(memberId, id);
getVenue.setEnterFlag(memberLastLog.getType());
}
return getVenue;
}
/**
@@ -243,15 +243,114 @@ public class VenueService extends BaseServiceImpl {
}
// 3.判断用户有没有人脸识别的图像,根据用户ID查找一个用户只能有一条
MemberFaceInfo memberFaceInfo = memberFaceInfoService.findByMemberId(memberId);
if (memberFaceInfo == null) {
flag = 1;
return flag;
}
// MemberFaceInfo memberFaceInfo = memberFaceInfoService.findByMemberId(memberId);
// if (memberFaceInfo == null) {
// flag = 1;
// return flag;
// }
return flag;
}
/**
* 我要出场
* @param memberId
* @param venueId
* @return
*/
public BarCodeResult out(Integer memberId, Integer venueId) {
BarCodeResult result = new BarCodeResult();
result.setCode("0");
// 判断用户是否登录
if (memberId == null) {
throw new ServiceException(com.ydd.framework.core.exception.ExceptionCodeTemplate.NEED_LOGIN);
}
//参数校验
ValidationUtils.assertNotNull(venueId);
Venue venue = venueMapper.findById(venueId);
synchronized (("enter" + memberId).intern()) {
// 查询当前时间内,场馆对应的价格(健身房没有价格)
Member member = memberService.findByMember(memberId);
memberService.verify(member);
// 记录用户进场记录
MemberEnterVenueLog log = new MemberEnterVenueLog();
log.setMemberId(member.getId());
log.setVeneuType(venue.getType());
log.setVenueId(venue.getId());
log.setPlatformId(member.getPlatformId());
log.setType(0);
//进场之前 查看是否有会员卡
List<MemberCard> cards = memberCardService.findByMemberId(venue.getId(), member.getId());
if (cards.size() > 0) {
MemberCard useCard = null;
//有会员卡 查看是否有免费卡
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, 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);
// 如果是单次卡,清除单次卡
if (VipTypeEnum.ONCECARD.value.equals(useCard.getCardType())
|| VipTypeEnum.PUB_ONCECARD.value.equals(useCard.getCardType())){
memberCardService.delete(useCard.getId());
}
result.setBarcode("test123456");
}else {
//查无可用会员卡
logger.info("用户" + member.getNickname() + "您好!请先购买会员卡再进场");
result.setCode("1");
result.setMsg("未查询到会员卡,请先购买");
}
}else {
//判断余额是否够 TODO 应该从入场订单里面去取
String time = DateUtilCard.nowTime().toString();
VenuePrice venuePrice = venuePriceService.findPrice(venueId, time);
if (memberService.isMoneyEnough(member.getId(), venuePrice.getPrice())) {
logger.info("用户" + member.getNickname() + "使用余额进场");
String orderSn = orderService.createEnterVenueOrder(venue, member.getId(), PayTypeEnum.BALANCE, venuePrice.getPrice());
log.setOrderSn(orderSn);
log.setPayType(EnterVenuePayTypeEnum.WEI_XIN.value);
memberEnterVenueLogService.save(log);
result.setBarcode("test123456");
} else {
//余额不足
logger.error("用户" + member.getNickname() + "余额不足进场失败");
result.setCode("1");
result.setMsg("余额不足,请先充值");
}
}
}
return result;
}
/**
* api
* 查询我的会员卡
@@ -299,108 +398,6 @@ public class VenueService extends BaseServiceImpl {
return StringUtils.isNotBlank(longitude) && StringUtils.isNotBlank(latitude);
}
/**
* 人脸失败用户入场(篮球场)
*
* @param faceId
* @param deviceId
* @return 0成功 -1失败
*/
@Transactional(rollbackFor = Exception.class)
public synchronized EnterResult enterVenue(Integer faceId, Integer deviceId) {
EnterResult result = new EnterResult();
synchronized (("enter" + faceId.toString()).intern()) {
Date now = new Date();
Device device = deviceService.findById(deviceId);
Venue venue = venueMapper.findById(device.getVenueId());
// 查询当前时间内,场馆对应的价格
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;
}
Member member = memberService.findByFaceId(faceId);
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;
}
}
//进场之前 查看是否有会员卡
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;
}
}
}
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());
// 会员卡入场,增加记录
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 (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;
}
}
}
/**
* 二维码入场-判断是否成功入场
*
@@ -408,77 +405,7 @@ public class VenueService extends BaseServiceImpl {
*/
@Transactional
public synchronized boolean qrCodeEnterVenue(Integer memberId, String deviceName,Integer venueId,Venue venue) {
synchronized (("enter" + memberId).intern()) {
Device device = deviceService.findByDevice(deviceName,venueId);
// 查询当前时间内,场馆对应的价格(健身房没有价格)
if (venue.getStatus().intValue() == 1) {
logger.info(venue.getName() + "被禁用,入场失败");
return false;
}
Member member = memberService.findByMember(memberId);
memberService.verify(member);
// 记录用户进场记录
MemberEnterVenueLog log = new MemberEnterVenueLog();
log.setMemberId(member.getId());
log.setVeneuType(device.getVenueType());
log.setVenueId(device.getVenueId());
log.setPlatformId(member.getPlatformId());
log.setType(0);
//进场之前 查看是否有会员卡
List<MemberCard> cards = memberCardService.findByMemberId(device.getVenueId(), member.getId());
if (cards.size() > 0) {
MemberCard useCard = null;
//有会员卡 查看是否有免费卡
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, 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);
// 如果是单次卡,清除单次卡
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;
}
}else {
//没有可用会员卡 健身房也不支持扣余额
logger.info("用户" + member.getNickname() + "您好!请先购买会员卡再进场");
return false;
}
}
return false;
}

View File

@@ -37,6 +37,7 @@ import java.util.ArrayList;
import java.util.List;
@Service
@Deprecated
public class FaceService {
private final Logger logger = LoggerFactory.getLogger(FaceService.class);

View File

@@ -43,9 +43,9 @@ public class WeiXinSendUtils implements InitializingBean {
}
private void getToken() {
//TODO
AccessTokenResponse accessToken = WeChatHelper.getAccessToken("wx51d82eba3f5f4858", "d28320bcb885cc208b6fde2253d8663e");
token = accessToken.getAccessToken();
//TODO 放开
// AccessTokenResponse accessToken = WeChatHelper.getAccessToken("wx51d82eba3f5f4858", "d28320bcb885cc208b6fde2253d8663e");
// token = accessToken.getAccessToken();
}
@Scheduled(fixedDelay=60*60*1000)