diff --git a/api/src/main/java/com/sv/netty/controller/QREnterController.java b/api/src/main/java/com/sv/netty/controller/QREnterController.java index c31122c..8715423 100644 --- a/api/src/main/java/com/sv/netty/controller/QREnterController.java +++ b/api/src/main/java/com/sv/netty/controller/QREnterController.java @@ -39,10 +39,10 @@ public class QREnterController extends BaseApiController { if (venue!=null){ if (DeviceType.OUT == enterOrOut){ // 出场 - messageService.outVenue(deviceName,venueId,enterOrOut,memberId,venue); + messageService.outVenue(deviceName,venueId,memberId,venue); }else{ // 进场 - messageService.enterVenue(deviceName,venueId,enterOrOut,memberId,venue); + messageService.enterVenue(deviceName,venueId,memberId,venue); } } return ResponseDTO.ok(); diff --git a/api/src/main/java/com/sv/netty/netty/service/MessageService.java b/api/src/main/java/com/sv/netty/netty/service/MessageService.java index 4825134..db82d08 100644 --- a/api/src/main/java/com/sv/netty/netty/service/MessageService.java +++ b/api/src/main/java/com/sv/netty/netty/service/MessageService.java @@ -43,19 +43,17 @@ public interface MessageService { * 出场 * @param deviceName * @param venueId - * @param enterOrOut * @param memberId * @param venue */ - void outVenue(String deviceName, Integer venueId, DeviceType enterOrOut, Integer memberId, Venue venue); + void outVenue(String deviceName, Integer venueId, Integer memberId, Venue venue); /** * 进场 * @param deviceName * @param venueId - * @param enterOrOut * @param memberId * @param venue */ - void enterVenue(String deviceName, Integer venueId, DeviceType enterOrOut, Integer memberId, Venue venue); + void enterVenue(String deviceName, Integer venueId, Integer memberId, Venue venue); } diff --git a/api/src/main/java/com/sv/netty/netty/service/impl/TcpMessageHandlerAdapter.java b/api/src/main/java/com/sv/netty/netty/service/impl/AppMessageHandlerAdapter.java similarity index 68% rename from api/src/main/java/com/sv/netty/netty/service/impl/TcpMessageHandlerAdapter.java rename to api/src/main/java/com/sv/netty/netty/service/impl/AppMessageHandlerAdapter.java index 78e48e0..45f196b 100644 --- a/api/src/main/java/com/sv/netty/netty/service/impl/TcpMessageHandlerAdapter.java +++ b/api/src/main/java/com/sv/netty/netty/service/impl/AppMessageHandlerAdapter.java @@ -1,6 +1,5 @@ package com.sv.netty.netty.service.impl; -import com.enums.DeviceType; import com.sv.dto.EnterResult; import com.sv.entity.Member; import com.sv.entity.MemberEnterVenueLog; @@ -24,6 +23,7 @@ import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.util.*; +import java.util.concurrent.ScheduledExecutorService; /** @@ -33,9 +33,9 @@ import java.util.*; * @Date 08/05/2017 10:43 PM */ @Service("messageService") -public class TcpMessageHandlerAdapter implements MessageService { +public class AppMessageHandlerAdapter implements MessageService { - private Logger logger = LoggerFactory.getLogger(TcpMessageHandlerAdapter.class); + private Logger logger = LoggerFactory.getLogger(AppMessageHandlerAdapter.class); @Resource private MemberService memberService; @@ -49,8 +49,8 @@ public class TcpMessageHandlerAdapter implements MessageService { @Resource private ConfigService configService; -// @Resource(name = "scheduledExecutorService") -// private ScheduledExecutorService scheduledExecutorService; + @Resource(name = "scheduledExecutorService") + private ScheduledExecutorService scheduledExecutorService; @Resource private MemberEnterVenueLogService memberEnterVenueLogService; @@ -122,7 +122,7 @@ public class TcpMessageHandlerAdapter implements MessageService { @Override - public void outVenue(String deviceName, Integer venueId, DeviceType enterOrOut, Integer memberId, Venue venue) { + public void outVenue(String deviceName, Integer venueId, Integer memberId, Venue venue) { Member member = memberService.findByMember(memberId); if (member != null) { //出场 不用判断直接出 @@ -155,68 +155,31 @@ public class TcpMessageHandlerAdapter implements MessageService { } } + /** + * 进场逻辑 + * @param deviceName + * @param venueId + * @param memberId + * @param venue + */ @Override - public void enterVenue(String deviceName, Integer venueId, DeviceType enterOrOut, Integer memberId, Venue venue) { + public void enterVenue(String deviceName, Integer venueId, Integer memberId, Venue venue) { try { - int code = 1; Member member = memberService.findByMember(memberId); - if (member != null) { - //最后进场记录 - MemberEnterVenueLog enterVenueLog = memberEnterVenueLogService.findMemberLastLogNoType(member.getId(), venue.getId()); - if (enterVenueLog != null) { - //有记录 查看 最后一次是否是出场 - if (enterVenueLog.getType() == 1) { - //是出场 不用限制 - } else { - //是进场 - Date date = new Date(); - //本日连续进场次数 - int continuityEnterCount = memberEnterVenueLogService.countEnterByDate(member.getId(), venue.getId(), date); - logger.info("连续进场次数:" + continuityEnterCount); - //距离上次入场差多少秒 - int differenceSeconds = (int) (date.getTime() - enterVenueLog.getCreatedTime().getTime()) / (1000); - if (continuityEnterCount <= 0) { - //没有连续进场 间隔5分钟 - Config config = configService.findById(1); - if (differenceSeconds <= (Integer.parseInt(config.getValue()) * 60)) { - //小于5分钟 不允许入场 - code = -1; - } - } else if (continuityEnterCount == 1) { - //有过一次连续进场 间隔20分钟 - Config config = configService.findById(2); - if (differenceSeconds <= (Integer.parseInt(config.getValue()) * 60)) { - //小于20分钟 不允许入场 - code = -1; - } - } else { - //超过两次连续入场 入场失败 - code = -1; - } - } - } -// MemberDto memberMessageDto = new MemberDto(); -// memberMessageDto.setName(member.getNickname()); -// memberMessageDto.setAvatar(member.getAvatar()); -// memberMessageDto.setMobile(member.getMobile()); -// -// memberMessageDto.setPlaceName(""); -// member = memberService.findByFaceId(response.getPerson().getId()); -// memberMessageDto.setAmount(member.getMoney()); - if (code > 0) { - EnterResult result = venueService.enterVenue(memberId, venue.getId()); - if (result.getStatus() >= 0) { + if (checkInterval(member,venueId)) { + EnterResult result = venueService.qrCodeEnterVenue(memberId,deviceName,venueId,venue); + if (result.getStatus() >= 0) { // memberMessageDto.setCode(1); - if (result.getStatus() == 1) { + if (result.getStatus() == 1) { // memberMessageDto.setCardName("会员卡"); - } - if (result.getStatus() == 2) { + } + if (result.getStatus() == 2) { // memberMessageDto.setPlacePrice(result.getMoney()); // memberMessageDto.setFirst(true); // logger.info(member.getId() + "入场成功:" + member.getMoney().toString()); // member = memberService.findByFaceId(response.getPerson().getId()); // memberMessageDto.setAmount(member.getMoney()); - //5秒后开门 + //5秒后开门 // scheduledExecutorService.schedule(new Runnable() { // @Override // public void run() { @@ -226,39 +189,81 @@ public class TcpMessageHandlerAdapter implements MessageService { //// sendOpenMessage(messageDto, 1); // } // }, 5, TimeUnit.SECONDS); - } else { - //开门 + } else { + //开门 // MessageDto messageDto = new MessageDto(); // messageDto.setCmdId(Cmd.OPEN_DOOR.id); // messageDto.setDoor(1); // sendOpenMessage(messageDto, 1); - logger.info(member.getId() + "入场成功:" + member.getMoney().toString()); + logger.info(member.getId() + "入场成功:" + member.getMoney().toString()); - } + } // memberMessageDto.setMessage("门禁已开,请入门"); - venueService.addNumber(venue.getId(), 1, member.getId()); + venueService.addNumber(venue.getId(), 1, member.getId()); // venue = venueService.findById(venue.getId()); // sendNumberChange(venue.getNumber()); - } else { - logger.info(member.getId() + "入场失败:" + member.getMoney().toString()); + } else { + logger.info(member.getId() + "入场失败:" + member.getMoney().toString()); // memberMessageDto.setCode(-1); // memberMessageDto.setMessage(member.getName() + "您好,您的余额不足,请扫描门禁上张贴的小程序二维码充值"); - } - } else { - logger.info(member.getId() + "入场失败:连续入场"); -// memberMessageDto.setCode(0); - Config config = configService.findById(1); -// memberMessageDto.setMessage("无出门记录连续入场,请" + config.getValue() + "分钟之后再试"); } - // TODO 校验完,就可以进场了 -// sendMessage(memberMessageDto, device.getId()); - + } else { + logger.info(member.getId() + "入场失败:连续入场"); +// memberMessageDto.setCode(0); + Config config = configService.findById(1); +// memberMessageDto.setMessage("无出门记录连续入场,请" + config.getValue() + "分钟之后再试"); } + // TODO 校验完,就可以进场了 +// sendMessage(memberMessageDto, device.getId()); } catch (Exception e) { - e.printStackTrace(); + logger.error("进场失败",e); } } + private boolean checkInterval(Member member,Integer venueId){ + if (member == null) { + return false; + }else{ + //最后进场记录 + MemberEnterVenueLog enterVenueLog = memberEnterVenueLogService.findMemberLastLogNoType(member.getId(), venueId); + if (enterVenueLog == null) { + return true; + }else { + //有记录 查看 最后一次是否是出场 + if (enterVenueLog.getType() == 1) { + return true; + } else { + //是进场 + Date date = new Date(); + //本日连续进场次数 + int continuityEnterCount = memberEnterVenueLogService.countEnterByDate(member.getId(), venueId, date); + logger.info("连续进场次数:" + continuityEnterCount); + //距离上次入场差多少秒 + int differenceSeconds = (int) (date.getTime() - enterVenueLog.getCreatedTime().getTime()) / (1000); + if (continuityEnterCount <= 0) { + //没有连续进场 间隔5分钟 + Config config = configService.findById(1); + if (differenceSeconds <= (Integer.parseInt(config.getValue()) * 60)) { + // + return false; + } + } else if (continuityEnterCount == 1) { + //有过一次连续进场 间隔20分钟 + Config config = configService.findById(2); + if (differenceSeconds <= (Integer.parseInt(config.getValue()) * 60)) { + //小于20分钟 不允许入场 + return false; + } + } else { + //当日超过两次连续入场 入场失败 + return false; + } + } + } + } + return true; + } + /** * 给客户端发送信息 * @param channel diff --git a/entity/src/main/java/com/sv/entity/Device.java b/entity/src/main/java/com/sv/entity/Device.java index cda6a9e..396492f 100644 --- a/entity/src/main/java/com/sv/entity/Device.java +++ b/entity/src/main/java/com/sv/entity/Device.java @@ -1,5 +1,7 @@ package com.sv.entity; +import com.enums.DeviceType; + import java.io.Serializable; import java.util.Date; @@ -36,6 +38,7 @@ public class Device implements Serializable { private Integer venueType; + private DeviceType deviceType; /** * 创建者编号 */ @@ -241,4 +244,12 @@ public class Device implements Serializable { public void setVenueType(Integer venueType) { this.venueType = venueType; } + + public DeviceType getDeviceType() { + return deviceType; + } + + public void setDeviceType(DeviceType deviceType) { + this.deviceType = deviceType; + } } \ No newline at end of file diff --git a/service/src/main/java/com/sv/mapper/DeviceMapper.java b/service/src/main/java/com/sv/mapper/DeviceMapper.java index b1d7e5b..e3b383b 100644 --- a/service/src/main/java/com/sv/mapper/DeviceMapper.java +++ b/service/src/main/java/com/sv/mapper/DeviceMapper.java @@ -1,5 +1,6 @@ package com.sv.mapper; import com.common.DeviceDTO; +import com.enums.DeviceType; import com.sv.entity.Device; import org.apache.ibatis.annotations.Param; @@ -76,4 +77,12 @@ public interface DeviceMapper { Integer checkDevice(@Param("deviceName") String deviceName,@Param("venueId") Integer venueId); + /** + * 根据记录找设备 + * @param deviceName + * @param venueId + * @param deviceType + * @return + */ + Device findByDevice(String deviceName, Integer venueId, DeviceType deviceType); } \ No newline at end of file diff --git a/service/src/main/java/com/sv/service/api/VenueService.java b/service/src/main/java/com/sv/service/api/VenueService.java index 2bfb825..1f7ebb0 100644 --- a/service/src/main/java/com/sv/service/api/VenueService.java +++ b/service/src/main/java/com/sv/service/api/VenueService.java @@ -1,9 +1,6 @@ package com.sv.service.api; -import com.enums.EnterVenuePayTypeEnum; -import com.enums.MoneyLogEnum; -import com.enums.PayTypeEnum; -import com.enums.VipTypeEnum; +import com.enums.*; import com.github.pagehelper.PageHelper; import com.sv.dto.EnterResult; import com.sv.dto.api.MemberCardDTO; @@ -307,19 +304,118 @@ public class VenueService extends BaseServiceImpl { } /** - * 用户入场 + * 人脸失败用户入场(篮球场) * * @param faceId * @param deviceId * @return 0成功 -1失败 */ - @Transactional(rollbackFor = Exception.class) - public synchronized EnterResult enterVenue(Integer faceId, Integer deviceId) { +// @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 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; +// } +// } +// } + + /** + * 人脸失败用户入场(篮球场) + * + * @return 0成功 -1失败 + */ + @Transactional + public synchronized EnterResult qrCodeEnterVenue(Integer memberId, String deviceName,Integer venueId,Venue venue) { EnterResult result = new EnterResult(); - synchronized (("enter" + faceId.toString()).intern()) { + synchronized (("enter" + memberId).intern()) { Date now = new Date(); - Device device = deviceService.findById(deviceId); - Venue venue = venueMapper.findById(device.getVenueId()); + Device device = deviceService.findByDevice(deviceName,venueId, DeviceType.ENTER); // 查询当前时间内,场馆对应的价格 String time = DateUtilCard.nowTime().toString(); VenuePrice venuePrice = venuePriceService.findPrice(device.getVenueId(), time); @@ -333,7 +429,7 @@ public class VenueService extends BaseServiceImpl { result.setStatus(-2); return result; } - Member member = memberService.findByFaceId(faceId); + Member member = memberService.findByMember(memberId); memberService.verify(member); if (venue == null || member == null) { result.setStatus(-1); diff --git a/service/src/main/java/com/sv/service/oms/DeviceService.java b/service/src/main/java/com/sv/service/oms/DeviceService.java index 659dc62..32b9440 100644 --- a/service/src/main/java/com/sv/service/oms/DeviceService.java +++ b/service/src/main/java/com/sv/service/oms/DeviceService.java @@ -2,6 +2,7 @@ package com.sv.service.oms; import com.common.DeviceDTO; import com.enums.DeviceStatusEnum; +import com.enums.DeviceType; import com.github.pagehelper.PageHelper; import com.sv.entity.Device; import com.sv.exception.oms.OmsException; @@ -185,5 +186,14 @@ public class DeviceService extends BaseServiceImpl { } } + + + /** + * find by DeviceName + */ + public Device findByDevice(String deviceName, Integer venueId, DeviceType deviceType){ + return deviceMapper.findByDevice(deviceName,venueId,deviceType); + } + } diff --git a/service/src/main/resources/mybatis/mapper/sv/DeviceMapper.xml b/service/src/main/resources/mybatis/mapper/sv/DeviceMapper.xml index 575dcc9..afdbf76 100644 --- a/service/src/main/resources/mybatis/mapper/sv/DeviceMapper.xml +++ b/service/src/main/resources/mybatis/mapper/sv/DeviceMapper.xml @@ -8,6 +8,7 @@ + @@ -33,6 +34,7 @@ venue_id, status, venue_type, + device_type, created_id, modified_id, created_time, @@ -45,6 +47,9 @@ #{id, jdbcType=INTEGER}, #{name, jdbcType=VARCHAR}, #{stream, jdbcType=VARCHAR}, + #{venue_id, jdbcType=INTEGER}, + #{venue_type, jdbcType=INTEGER}, + #{device_type, jdbcType=VARCHAR}, #{createdId, jdbcType=INTEGER}, #{modifiedId, jdbcType=INTEGER}, #{createdTime, jdbcType=TIMESTAMP}, @@ -83,6 +88,9 @@ venue_type, + + device_type, + status, @@ -118,6 +126,9 @@ #{venueType}, + + #{deviceType}, + #{status}, @@ -179,6 +190,12 @@ venue_id = #{venueId}, + + venue_type = #{venueType}, + + + device_type = #{deviceType}, + created_id = #{createdId}, @@ -235,11 +252,26 @@ UPDATE sv_device set status = 2,modified_time = now() WHERE name = #{deviceName} and venue_id=#{venueId} + + and venue_type = #{venueType}, + + + \ No newline at end of file