diff --git a/api/src/main/java/com/sv/api/controller/VenueController.java b/api/src/main/java/com/sv/api/controller/VenueController.java index de19315..8766f5c 100644 --- a/api/src/main/java/com/sv/api/controller/VenueController.java +++ b/api/src/main/java/com/sv/api/controller/VenueController.java @@ -7,10 +7,10 @@ import com.sv.dto.api.BasketballPayResult; import com.sv.entity.Device; import com.sv.entity.Order; import com.sv.entity.Venue; +import com.sv.netty.netty.service.MessageService; import com.sv.service.api.OrderService; import com.sv.service.api.VenueEnterService; import com.sv.service.api.VenueService; -import com.sv.service.common.BarcodeService; import com.sv.service.common.DoorLockUtil; import com.sv.service.oms.DeviceService; import com.ydd.framework.core.annotation.AccessToken; @@ -42,11 +42,11 @@ public class VenueController extends BaseApiController { @Resource private VenueEnterService venueEnterService; @Resource - private BarcodeService barcodeService; - @Resource private DoorLockUtil doorLockUtil; @Resource DeviceService deviceService; + @Resource + MessageService messageService; /** * 分页查询场馆列表 @@ -117,6 +117,7 @@ public class VenueController extends BaseApiController { * @param orderSn 订单号 * @return */ + @Deprecated @RequestMapping(value = "/member/isPayed", method = RequestMethod.POST) public ResponseDTO isPayed(@RequestParam("orderSn") String orderSn) { Integer memberId = getMemberIdByAccessToken(); @@ -203,17 +204,42 @@ public class VenueController extends BaseApiController { throw new ServiceException("门禁通讯异常"); } String doorSn = byDevice.getName(); - boolean lockStat = doorLockUtil.checkDoorLock(doorSn); - if (lockStat) { - throw new ServiceException("有人正在使用门禁,请稍后再试"); - } EnterEnum enterEnum = EnterEnum.OUT; if (enterFlag != null) { enterEnum = EnterEnum.getByValue(enterFlag); } - String barcode = barcodeService.newBarcode(doorSn,orderSn,enterEnum,venueId,memberId); - logger.info("[生成二维码] 成功 memberId={}, barcode={}", memberId, barcode); - return ResponseDTO.ok().addAttribute("barcode", barcode); + // 这里应该是直接开门 + if (EnterEnum.OUT.equals(enterEnum)) { + messageService.outVenue(memberId, venueId, doorSn); + }else { + messageService.enterVenue(memberId, venueId, doorSn); + } + return ResponseDTO.ok(); + } + + /** + * 检验客户端读取能力 + * @return + */ + @RequestMapping("/user/check/barcode") + public ResponseDTO uploadLog(@RequestParam("code") String code) { +// code = code.substring(1,code.length()-1); +// String offline = MakeCode.decodeOfflineCode(code); +// logger.info("[核销二维码] code={}, isOffline={}", code, offline.startsWith("venue-")); +// if (offline.startsWith("venue-")) { +// messageService.offlineOpenDoor(code); +// } else { +// VenueBarCode venueBarCode = MakeCode.decodeCode(code); +// logger.info("[核销二维码] 解析结果: memberId={}, venueId={}, direction={}, deviceName={}", +// venueBarCode.getMemberId(), venueBarCode.getVenueId(), +// venueBarCode.getDirection(), venueBarCode.getDeviceName()); +// if (EnterEnum.ENTER.getValue() == venueBarCode.getDirection()) { +// messageService.enterVenue(code); +// } else { +// messageService.outVenue(code); +// } +// } + return ResponseDTO.ok(); } /** @@ -261,14 +287,15 @@ public class VenueController extends BaseApiController { return ResponseDTO.ok().addAttribute("memberEnterDetail",venueEnterService.memberOrderEnterDetail(getMemberIdByAccessToken(),enterId)); } - /** - * 判断是否支付成功 - * @param barcode 订单号 - * @return - */ - @RequestMapping(value = "/member/barcode/isUsed", method = RequestMethod.POST) - public ResponseDTO isUsed(@RequestParam("barcode") String barcode) { - return ResponseDTO.ok().addAttribute("barcodeDTO", barcodeService.isUsed(barcode)); - } +// /** +// * 判断是否支付成功 +// * @param barcode 订单号 +// * @return +// */ +// @Deprecated +// @RequestMapping(value = "/member/barcode/isUsed", method = RequestMethod.POST) +// public ResponseDTO isUsed(@RequestParam("barcode") String barcode) { +// return ResponseDTO.ok().addAttribute("barcodeDTO", barcodeService.isUsed(barcode)); +// } } diff --git a/api/src/main/java/com/sv/netty/controller/AdminNettyController.java b/api/src/main/java/com/sv/netty/controller/AdminNettyController.java index 7695ab2..d643024 100644 --- a/api/src/main/java/com/sv/netty/controller/AdminNettyController.java +++ b/api/src/main/java/com/sv/netty/controller/AdminNettyController.java @@ -1,30 +1,18 @@ package com.sv.netty.controller; import com.enums.DeviceStatusEnum; -import com.enums.EnterEnum; import com.sv.entity.Device; -import com.sv.netty.config.NettyConstant; -import com.sv.netty.config.VenueBarCode; -import com.sv.netty.config.VenueMessage; import com.sv.netty.netty.service.MessageService; -import com.sv.netty.utils.JsonUtils; -import com.sv.netty.utils.MakeCode; -import com.sv.service.common.DoorLockUtil; import com.sv.service.oms.DeviceService; -import com.sv.service.utils.VenueBarcodeUtil; import com.ydd.framework.core.common.dto.ResponseDTO; import com.ydd.framework.core.controller.BaseApiController; import com.ydd.framework.core.exception.ServiceException; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.util.Units; -import org.apache.poi.xwpf.usermodel.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; @@ -40,8 +28,6 @@ public class AdminNettyController extends BaseApiController { DeviceService deviceService; @Resource private MessageService messageService; - @Resource - DoorLockUtil doorLockUtil; /** * 进场指令发布 */ @@ -58,31 +44,6 @@ public class AdminNettyController extends BaseApiController { return ResponseDTO.ok(); } - /** - * 检验客户端读取能力 - * @return - */ - @RequestMapping("/user/check/barcode") - public ResponseDTO uploadLog(@RequestParam("code") String code) { - code = code.substring(1,code.length()-1); - String offline = MakeCode.decodeOfflineCode(code); - logger.info("[核销二维码] code={}, isOffline={}", code, offline.startsWith("venue-")); - if (offline.startsWith("venue-")) { - messageService.offlineOpenDoor(code); - } else { - VenueBarCode venueBarCode = MakeCode.decodeCode(code); - logger.info("[核销二维码] 解析结果: memberId={}, venueId={}, direction={}, deviceName={}", - venueBarCode.getMemberId(), venueBarCode.getVenueId(), - venueBarCode.getDirection(), venueBarCode.getDeviceName()); - if (EnterEnum.ENTER.getValue() == venueBarCode.getDirection()) { - messageService.enterVenue(code); - } else { - messageService.outVenue(code); - } - } - return ResponseDTO.ok(); - } - @RequestMapping(value = "/admin/out/{id}", method = RequestMethod.POST) public ResponseDTO out(@PathVariable("id") Integer id) { Device device = deviceService.findById(id); @@ -96,42 +57,6 @@ public class AdminNettyController extends BaseApiController { return ResponseDTO.ok(); } - private Integer getVenueId(String deviceId){ - String venueId = "0"; - if (deviceId!=null && deviceId.contains(NettyConstant.SPIT_WORD)){ - venueId = deviceId.split(NettyConstant.SPIT_WORD)[1]; - } - try { - return Integer.parseInt(venueId); - }catch (Exception e){ - return 0; - } - } - - private String getDeviceName(String deviceId){ - if (deviceId!=null){ - return deviceId.split(NettyConstant.SPIT_WORD)[0]; - } - return null; - } - - /** - * 检验客户端读取能力 - * @return - */ - @RequestMapping("/checkAlive/{id}") - public ResponseDTO checkAlive(@PathVariable("id") Integer id) { - Device device = deviceService.findById(id); - if (device == null){ - throw new ServiceException("设备不存在"); - } - if (!DeviceStatusEnum.ONLINE.value.equals(device.getStatus())){ - throw new ServiceException("设备离线!请检查连接"); - } - messageService.testLoad(device.getName(),device.getVenueId()); - return ResponseDTO.ok(); - } - /** * 检验客户端读取能力 * @return @@ -183,82 +108,4 @@ public class AdminNettyController extends BaseApiController { } } - /** - * 下载线下入场凭证(二维码) - * @param id - * @param response - * @throws IOException - * @throws InvalidFormatException - */ - @RequestMapping(value = "/qrcode/print/{id}") - public void print(@PathVariable("id") Integer id, HttpServletResponse response) throws IOException, InvalidFormatException { - Device device = deviceService.findById(id); - if (device == null){ - response.setContentType("text/html"); - response.setCharacterEncoding("UTF-8"); - PrintWriter writer = response.getWriter(); - writer.write("设备不存在!!!"); - writer.flush(); - writer.close(); - return; - } - String doorSn = device.getName(); - if(doorLockUtil.checkBarcode(doorSn)){ - response.setContentType("text/html"); - response.setCharacterEncoding("UTF-8"); - PrintWriter writer = response.getWriter(); - writer.write("生成二维码过于频繁,请稍候再试!!!"); - writer.flush(); - writer.close(); - return; - } - - long l = System.currentTimeMillis(); - String barcodeSn = "venue-" + l; - String barcode = MakeCode.makeOfflineCode(barcodeSn); - deviceService.makeDeviceBarcode(device.getName(),device.getVenueId(),barcode); - logger.info("[线下二维码] 生成 doorSn={}, venueId={}, barcodeSn={}", doorSn, device.getVenueId(), barcodeSn); - - String documentPath = getDocument(barcode,barcodeSn); - response.setHeader("Content-disposition","attachment; filename=" + barcodeSn + ".docx"); - response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); - response.setCharacterEncoding("UTF-8"); - OutputStream out = response.getOutputStream(); - BufferedInputStream fin = new BufferedInputStream(new FileInputStream(documentPath)); - try { - byte[] content = new byte[1024]; - int length; - while ((length = fin.read(content, 0, content.length)) != -1) { - out.write(content, 0, length); - } - doorLockUtil.lockBarcode(doorSn); - } catch (Exception e) { - logger.error("[线下二维码] 下载失败 doorSn={}", doorSn, e); - throw e; - } finally { - fin.close(); - out.flush(); - out.close(); - } - } - - private static String getDocument(String barcode, String barcodeSn) throws IOException, InvalidFormatException { - String newFilePath = "/home/test/" + barcodeSn + ".docx"; - XWPFDocument document = new XWPFDocument(); - XWPFParagraph paragraph = document.createParagraph(); - paragraph.setAlignment(ParagraphAlignment.CENTER); - XWPFRun run = paragraph.createRun(); - - run.setText("订单号:" + barcodeSn); - run.addBreak(); - run.setText("二维码使用有效期为2小时,请及时离场!"); - run.addBreak(); - String imgFile = VenueBarcodeUtil.generateBarcode(barcode,barcodeSn + ".jpg"); - int imgFormat = XWPFDocument.PICTURE_TYPE_JPEG; - run.addPicture(new FileInputStream(imgFile), imgFormat, "image description", - Units.toEMU(200), Units.toEMU(200)); - document.write(new FileOutputStream(newFilePath)); - document.close(); - return newFilePath; - } } diff --git a/api/src/main/java/com/sv/netty/netty/ServerHandler.java b/api/src/main/java/com/sv/netty/netty/ServerHandler.java index 3facd46..32b76a6 100644 --- a/api/src/main/java/com/sv/netty/netty/ServerHandler.java +++ b/api/src/main/java/com/sv/netty/netty/ServerHandler.java @@ -1,12 +1,12 @@ package com.sv.netty.netty; -import com.enums.EnterEnum; import com.sv.netty.config.*; import com.sv.netty.netty.service.MessageService; -import com.sv.netty.utils.AesUtil; import com.sv.netty.utils.JsonUtils; -import com.sv.netty.utils.MakeCode; -import io.netty.channel.*; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; import org.slf4j.Logger; @@ -66,21 +66,21 @@ public class ServerHandler extends SimpleChannelInboundHandler { ctx.channel().attr(NettyConstant.CHANNEL_PARAM).get().setDeviceName(hb.getDeviceName()); messageService.online(clientIp,ctx.channel(), hb); break; - case SCAN_CODE: - logger.info("客户端【" + clientIp + "】开门了..."); - String offline = MakeCode.decodeOfflineCode(message.getMessage()); - if (offline.startsWith("venue-")) { - // 这是线下开门的逻辑 - messageService.offlineOpenDoor(message.getMessage()); - } else { - VenueBarCode venueBarCode = MakeCode.decodeCode(message.getMessage()); - if (EnterEnum.ENTER.getValue() == venueBarCode.getDirection()) { - messageService.enterVenue(message.getMessage()); - } else { - messageService.outVenue(message.getMessage()); - } - } - break; +// case SCAN_CODE: +// logger.info("客户端【" + clientIp + "】开门了..."); +// String offline = MakeCode.decodeOfflineCode(message.getMessage()); +// if (offline.startsWith("venue-")) { +// // 这是线下开门的逻辑 +// messageService.offlineOpenDoor(message.getMessage()); +// } else { +// VenueBarCode venueBarCode = MakeCode.decodeCode(message.getMessage()); +// if (EnterEnum.ENTER.getValue() == venueBarCode.getDirection()) { +// messageService.enterVenue(message.getMessage()); +// } else { +// messageService.outVenue(message.getMessage()); +// } +// } +// break; default: logger.info( "default"); } 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 28b9ab8..208e00d 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 @@ -36,16 +36,14 @@ public interface MessageService { */ Set countConnection(); /** - * 出场 - * @param barcode + * 篮球出场 */ - void outVenue(String barcode); + void outVenue(Integer memberId, Integer venueId, String doorSn); /** - * 进场 - * @param barcode + * 篮球进场 */ - void enterVenue(String barcode); + void enterVenue(Integer memberId, Integer venueId, String doorSn); /** * 足球场开门逻辑 @@ -58,9 +56,6 @@ public interface MessageService { public void adminOut(String deviceName, Integer venueId); - void testLoad(String deviceName, Integer venueId); - void uploadLog(String deviceName, Integer venueId); - void offlineOpenDoor(String message); } diff --git a/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java b/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java index 9836139..579b9a7 100644 --- a/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java +++ b/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java @@ -1,17 +1,16 @@ package com.sv.netty.netty.service.impl; -import com.enums.BarCodeStatusEnum; import com.enums.EnterEnum; import com.enums.EnterVenuePayTypeEnum; import com.sv.entity.*; import com.sv.mapper.*; -import com.sv.netty.config.*; +import com.sv.netty.config.HeartBeat; +import com.sv.netty.config.MessageType; +import com.sv.netty.config.NettyConstant; +import com.sv.netty.config.VenueMessage; import com.sv.netty.netty.service.MessageService; -import com.sv.netty.utils.JsonUtils; -import com.sv.netty.utils.MakeCode; import com.sv.netty.utils.ServerMessageUtils; import com.sv.service.api.MemberEnterVenueLogService; -import com.sv.service.api.MemberMoneyLogService; import com.sv.service.api.MemberService; import com.sv.service.api.VenueService; import com.sv.service.common.DoorLockUtil; @@ -27,7 +26,8 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalTime; import java.time.temporal.ChronoUnit; -import java.util.*; +import java.util.Date; +import java.util.Set; import java.util.concurrent.ConcurrentMap; /** * 消息实现类 @@ -54,17 +54,9 @@ public class ServerMessageHandlerAdapter implements MessageService { @Resource private MemberEnterVenueLogService memberEnterVenueLogService; - @Resource - private BarcodeMapper barcodeMapper; @Resource private DoorLockUtil doorLockUtil; - - @Resource - private BarcodeOfflineMapper barcodeOfflineMapper; - - @Resource - private BarcodeEnterLogMapper barcodeEnterLogMapper; @Resource private BarcodeOrderTimeMapper barcodeOrderTimeMapper; @@ -173,42 +165,28 @@ public class ServerMessageHandlerAdapter implements MessageService { } /** - * 核销扫码出场逻辑 - * @param barcode + * 核销篮球出场逻辑 */ @Override @Transactional - public void outVenue(String barcode) { - VenueBarCode venueBarCode = MakeCode.decodeCode(barcode); - String doorSn = venueBarCode.getDeviceName(); - logger.info("[扫码出场] 开始处理 memberId={}, venueId={}, deviceName={}", - venueBarCode.getMemberId(), venueBarCode.getVenueId(), doorSn); - boolean lockStat = doorLockUtil.checkDoorLock(doorSn); - if (lockStat) { - logger.error("[扫码出场] 门锁被占用 doorSn={}", doorSn); - throw new ServiceException("有人正在操作,请稍后再出场!!!"); - } - barcode = MakeCode.reWriteBarcode(barcode); - if (!checkBarcode(barcode)){ - logger.error("[扫码出场] 二维码已使用 barcode={}", barcode); - throw new ServiceException("二维码已经使用"); - } - Channel channel = getCurrentChannel(doorSn,venueBarCode.getVenueId()); + public void outVenue(Integer memberId, Integer venueId, String doorSn) { + logger.info("[篮球出场] 开始处理 memberId={}, venueId={} ",memberId,venueId); + Channel channel = getCurrentChannel(doorSn,venueId); if (channel == null) { - logger.error("[扫码出场] 门禁离线 doorSn={}, venueId={}", doorSn, venueBarCode.getVenueId()); + logger.error("[篮球出场] 门禁离线 doorSn={}, venueId={}", doorSn, venueId); throw new ServiceException("门禁异常离线中"); } - Member member = memberService.findByMember(venueBarCode.getMemberId()); + Member member = memberService.findByMember(memberId); if (member != null) { - BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId()); + BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueId); if (lastOrder == null) { - logger.error("[扫码出场] 未找到有效订单 memberId={}, venueId={}", member.getId(), venueBarCode.getVenueId()); + logger.error("[篮球出场] 未找到有效订单 memberId={}, venueId={}", member.getId(), venueId); throw new ServiceException("未找到入场订单"); } lastOrder.setLastOut(new Date()); if (lastOrder.getPayMoney() != null && lastOrder.getPayMoney().compareTo(java.math.BigDecimal.ZERO) > 0) { lastOrder.setModifiedTime(new Date()); - logger.info("[扫码出场] 有退款金额 orderSn={}, payMoney={}", lastOrder.getOrderSn(), lastOrder.getPayMoney()); + logger.info("[篮球出场] 有退款金额 orderSn={}, payMoney={}", lastOrder.getOrderSn(), lastOrder.getPayMoney()); } barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); MemberEnterVenueLog memberEnterVenueLog = new MemberEnterVenueLog(); @@ -217,49 +195,36 @@ public class ServerMessageHandlerAdapter implements MessageService { memberEnterVenueLog.setPayType(EnterVenuePayTypeEnum.WEI_XIN.getValue()); memberEnterVenueLog.setMemberId(member.getId()); memberEnterVenueLog.setPlatformId(member.getPlatformId() == null ? 1 : member.getPlatformId()); - memberEnterVenueLog.setVenueId(venueBarCode.getVenueId()); + memberEnterVenueLog.setVenueId(venueId); memberEnterVenueLogService.save(memberEnterVenueLog); doorLockUtil.lockDoor(doorSn); - logger.info("[扫码出场] 成功 memberId={}, nickname={}, orderSn={}, venueId={}", - member.getId(), member.getNickname(), lastOrder.getOrderSn(), venueBarCode.getVenueId()); - writeOffCode(barcode); + logger.info("[篮球出场] 成功 memberId={}, mobile={}, orderSn={}, venueId={}", + member.getId(), member.getMobile(), lastOrder.getOrderSn(), venueId); ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.OUT_DOOR,"OK")); } else { - logger.error("[扫码出场] 用户不存在 memberId={}", venueBarCode.getMemberId()); + logger.error("[篮球出场] 用户不存在 memberId={}", memberId); + throw new ServiceException("用户不存在,请登录"); } } /** - * 核销扫码进场逻辑 - * @param barcode + * 核销篮球进场逻辑 */ @Override @Transactional - public void enterVenue(String barcode) { - VenueBarCode venueBarCode = MakeCode.decodeCode(barcode); - String doorSn = venueBarCode.getDeviceName(); - logger.info("[扫码入场] 开始处理 memberId={}, venueId={}, deviceName={}", - venueBarCode.getMemberId(), venueBarCode.getVenueId(), doorSn); - boolean lockStat = doorLockUtil.checkDoorLock(doorSn); - if (lockStat) { - logger.error("[扫码入场] 门锁被占用 doorSn={}", doorSn); - throw new ServiceException("有人正在操作,请稍后再试"); - } - barcode = MakeCode.reWriteBarcode(barcode); - if (!checkBarcode(barcode)){ - logger.error("[扫码入场] 二维码已使用 barcode={}", barcode); - throw new ServiceException("二维码已经使用"); - } - Channel channel = getCurrentChannel(doorSn, venueBarCode.getVenueId()); + public void enterVenue(Integer memberId, Integer venueId, String doorSn) { + logger.info("[篮球入场] 开始处理 memberId={}, venueId={}, deviceName={}", + memberId, venueId, doorSn); + Channel channel = getCurrentChannel(doorSn, venueId); if (channel == null) { - logger.error("[扫码入场] 门禁离线 doorSn={}, venueId={}", doorSn, venueBarCode.getVenueId()); + logger.error("[篮球入场] 门禁离线 doorSn={}, venueId={}", doorSn, venueId); throw new ServiceException("门禁异常离线中"); } - Member member = memberService.findByMember(venueBarCode.getMemberId()); + Member member = memberService.findByMember(memberId); if (member != null) { - BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId()); + BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueId); if (lastOrder == null) { - logger.error("[扫码入场] 未找到有效订单 memberId={}, venueId={}", member.getId(), venueBarCode.getVenueId()); + logger.error("[篮球入场] 未找到有效订单 memberId={}, venueId={}", member.getId(), venueId); throw new ServiceException("未找到入场订单"); } lastOrder.setLastEnter(new Date()); @@ -270,53 +235,24 @@ public class ServerMessageHandlerAdapter implements MessageService { memberEnterVenueLog.setType(EnterEnum.ENTER.getValue()); memberEnterVenueLog.setMemberId(member.getId()); memberEnterVenueLog.setPlatformId(member.getPlatformId() == null ? 1 : member.getPlatformId()); - memberEnterVenueLog.setVenueId(venueBarCode.getVenueId()); + memberEnterVenueLog.setVenueId(venueId); memberEnterVenueLog.setPayType(EnterVenuePayTypeEnum.WEI_XIN.getValue()); memberEnterVenueLogService.save(memberEnterVenueLog); doorLockUtil.lockDoor(doorSn); - writeOffCode(barcode); - logger.info("[扫码入场] 成功 memberId={}, nickname={}, orderSn={}, venueId={}", - member.getId(), member.getNickname(), lastOrder.getOrderSn(), venueBarCode.getVenueId()); + logger.info("[篮球入场] 成功 memberId={}, mobile={}, orderSn={}, venueId={}", + member.getId(), member.getMobile(), lastOrder.getOrderSn(), venueId); ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.ENTER_DOOR,"OK")); } else { - logger.error("[扫码入场] 用户不存在 memberId={}", venueBarCode.getMemberId()); + logger.error("[篮球入场] 用户不存在 memberId={}", memberId); + throw new ServiceException("用户不存在,请登录"); } } - private boolean checkBarcode(String barcode) { - Barcode code = barcodeMapper.checkCodeStatus(barcode); - if (code == null) { - logger.error("[二维码校验] 二维码不存在 barcode={}", barcode); - throw new ServiceException("二维码不存在或者已经被使用"); - } - if (BarCodeStatusEnum.INIT.getValue()==code.getStatus()){ - return true; - } - logger.warn("[二维码校验] 二维码状态异常 barcode={}, status={}", barcode, code.getStatus()); - return false; - } - - private void writeOffCode(String barcode) { - barcodeMapper.writeOffCode(barcode); - } - @Override public Set countConnection() { return links.keySet(); } - - /** - * 测试客户端连接 - * @return - */ - @Override - public void testLoad(String deviceName, Integer venueId) { - Channel currentChannel = getCurrentChannel(deviceName, venueId); - ServerMessageUtils.INSTANCE.sendMsg(currentChannel,new VenueMessage(MessageType.HB,"测试链接")); - logger.info("[连接测试] deviceName={}, venueId={}", deviceName, venueId); - } - /** * 测试客户端连接 * @return @@ -328,56 +264,6 @@ public class ServerMessageHandlerAdapter implements MessageService { logger.info("[上传日志] 指令已发送 deviceName={}, venueId={}", deviceName, venueId); } - /** - * 线下订单 - */ - @Override - public void offlineOpenDoor(String message) { - String barcode = MakeCode.reWriteBarcode(message); - BarcodeOffline barcodeOffline = barcodeOfflineMapper.selectByBarcode(barcode); - String doorSn = barcodeOffline.getDeviceName(); - Date endTime = barcodeOffline.getEndTime(); - if (endTime.before(new Date())) { - logger.error("[线下开门] 二维码已失效 barcode={}, endTime={}", barcode, endTime); - throw new ServiceException("二维码已经失效,无法继续使用"); - } - boolean lockStat = doorLockUtil.checkDoorLock(doorSn); - if (lockStat) { - logger.error("[线下开门] 门锁被占用 doorSn={}", doorSn); - throw new ServiceException("有人正在操作,请稍后再试!!!"); - } - int i = barcodeEnterLogMapper.countTimesByBarcode(barcode); - if (i >= 6) { - logger.warn("[线下开门] 进场过于频繁 barcode={}, count={}", barcode, i); - throw new ServiceException("线下进场太过频繁,请重新下单!该二维码已经失效!"); - } - BarcodeEnterLog lastByBarcode = barcodeEnterLogMapper.findLastByBarcode(barcode); - Integer venueId = barcodeOffline.getVenueId(); - Channel channel = getCurrentChannel(doorSn, venueId); - if (lastByBarcode != null && EnterEnum.ENTER.getValue().equals(lastByBarcode.getType())) { - //出场 - BarcodeEnterLog barcodeEnterLog = new BarcodeEnterLog(); - barcodeEnterLog.setBarcode(barcode); - barcodeEnterLog.setType(EnterEnum.OUT.getValue()); - barcodeEnterLog.setVenueId(venueId); - barcodeEnterLog.setPlatformId(1); - barcodeEnterLogMapper.insert(barcodeEnterLog); - doorLockUtil.lockDoor(doorSn); - logger.info("[线下开门] 出场成功 doorSn={}, venueId={}", doorSn, venueId); - ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.OUT_DOOR,"OK")); - return; - } - BarcodeEnterLog barcodeEnterLog = new BarcodeEnterLog(); - barcodeEnterLog.setBarcode(barcode); - barcodeEnterLog.setType(EnterEnum.ENTER.getValue()); - barcodeEnterLog.setVenueId(venueId); - barcodeEnterLog.setPlatformId(1); - barcodeEnterLogMapper.insert(barcodeEnterLog); - doorLockUtil.lockDoor(doorSn); - logger.info("[线下开门] 入场成功 doorSn={}, venueId={}", doorSn, venueId); - ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.ENTER_DOOR,"OK")); - } - /** * 管理员入场 * @return diff --git a/api/src/test/java/com/sv/wx/MakeBarcodeTest.java b/api/src/test/java/com/sv/wx/MakeBarcodeTest.java deleted file mode 100644 index f1be488..0000000 --- a/api/src/test/java/com/sv/wx/MakeBarcodeTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.sv.wx; - -import com.WeiXinApplication; -import com.enums.EnterEnum; -import com.enums.VenueTypeEnum; -import com.sv.entity.Constants; -import com.sv.entity.Venue; -import com.sv.entity.VenueLesson; -import com.sv.mapper.WxConfigMapper; -import com.sv.service.api.VenueLessonService; -import com.sv.service.api.VenueService; -import com.sv.service.api.util.DateUtilCard; -import com.sv.service.common.BarcodeService; -import com.sv.service.message.SendMsg; -import com.sv.service.message.WeiXinSendUtils; -import com.ydd.oms.entity.sys.WxConfig; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.util.StringUtils; - -import javax.annotation.Resource; -import java.util.List; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes={WeiXinApplication.class}) -public class MakeBarcodeTest { - - @Resource - BarcodeService barcodeService; - - @Test - public void testTask(){ - barcodeService.newBarcode("123123","2312313123", EnterEnum.ENTER, 1, 1); - } - - -} diff --git a/api/src/test/java/com/sv/wx/VenueJoinTest.java b/api/src/test/java/com/sv/wx/VenueJoinTest.java index 8b9ec44..e29dbf3 100644 --- a/api/src/test/java/com/sv/wx/VenueJoinTest.java +++ b/api/src/test/java/com/sv/wx/VenueJoinTest.java @@ -1,15 +1,9 @@ package com.sv.wx; import com.WeiXinApplication; -import com.enums.EnterEnum; -import com.sv.dto.BasketEnterResult; import com.sv.netty.netty.service.MessageService; -import com.sv.netty.utils.JsonUtils; import com.sv.service.api.VenueEnterService; -import com.sv.service.api.VenueService; -import com.sv.service.common.BarcodeService; import com.sv.service.common.DoorLockUtil; -import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @@ -25,40 +19,8 @@ public class VenueJoinTest { @Resource MessageService messageService; @Resource - BarcodeService barcodeService; - @Resource DoorLockUtil doorLockUtil; - @Test - public void testJoin(){ - BasketEnterResult join = venueEnterService.join(535, 32); - System.out.println(JsonUtils.encode(join)); - if (join.getFlg() == 0) { - String barcode = barcodeService.newBarcode("doorSn", "",EnterEnum.ENTER, 32, 535); - System.err.println("入场的二维码为:" + barcode); - doorLockUtil.lockDoor("doorSn"); - } - } - @Test - public void enterVenue() { - messageService.enterVenue("oC+Smw+mDDsDSXP/RhHQXvm8I4mobxXZXN621ia2gKE="); - } - - @Test - public void testOut(){ - BasketEnterResult out = venueEnterService.out(535, 32); - System.out.println(JsonUtils.encode(out)); - if (out.getFlg() == 0) { - String barcode = barcodeService.newBarcode("doorSn","", EnterEnum.OUT, 32, 535); - System.err.println("出场的二维码为:" + barcode); - doorLockUtil.lockDoor("doorSn"); - } - } - - @Test - public void outVenue() { - messageService.outVenue("oC+Smw+mDDsDSXP/RhHQXvE3OTXb2IAZ8Zo8MwN8dnI="); - } } diff --git a/netty-client/src/main/java/com/sv/barcode/ListenKeyFrame.java b/netty-client/src/main/java/com/sv/barcode/ListenKeyFrame.java index 53e1497..faccf7c 100644 --- a/netty-client/src/main/java/com/sv/barcode/ListenKeyFrame.java +++ b/netty-client/src/main/java/com/sv/barcode/ListenKeyFrame.java @@ -3,7 +3,6 @@ package com.sv.barcode; import com.sv.barcode.button.EnterClick; import com.sv.barcode.button.OutClick; import com.sv.barcode.button.PlayerClick; -import com.sv.barcode.button.TestCodeClick; import javax.swing.*; import java.awt.*; @@ -26,15 +25,9 @@ public class ListenKeyFrame { buttonIn.addActionListener(new EnterClick()); JButton buttonOut = new JButton("出场开门"); buttonOut.addActionListener(new OutClick()); - JTextField jTextField = new JTextField(33); - //设置输入框大小 - JButton buttonSubmit = new JButton("验证二维码(测试专用)"); - buttonSubmit.addActionListener(new TestCodeClick(jTextField)); - JButton buttonPlay = new JButton("播放声音"); buttonPlay.addActionListener(new PlayerClick()); - frame.addKeyListener(new ScanBarCode()); frame.add(label); frame.add(buttonIn); frame.add(buttonOut); diff --git a/netty-client/src/main/java/com/sv/barcode/ScanBarCode.java b/netty-client/src/main/java/com/sv/barcode/ScanBarCode.java deleted file mode 100644 index 461b3b3..0000000 --- a/netty-client/src/main/java/com/sv/barcode/ScanBarCode.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.sv.barcode; - -import com.sv.netty.ClientHandler; -import com.sv.netty.ClientThread; -import com.sv.netty.config.NettyConstant; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.util.LinkedList; -import java.util.List; - -public class ScanBarCode extends KeyAdapter { - - private final Logger logger = LoggerFactory.getLogger(ClientHandler.class); - - private List barcode = new LinkedList<>(); - - @Override - public void keyTyped(KeyEvent e) { - if (barcode.size() > 200) { - barcode.clear(); - } - char keyChar = e.getKeyChar(); - logger.info("each time didi key【" + keyChar + "】"); - if (NettyConstant.BARCODE_END == keyChar) { - String barStr = ""; - if (barcode.size() > 0 && barcode != null) { - for (Character character : barcode) { - barStr = barStr + character; - } - } - logger.info(barStr); - ClientThread.getInstance().checkBarcode(barStr); - barcode.clear(); - } - barcode.add(keyChar); - if (NettyConstant.BARCODE_BEGIN == keyChar) { - barcode.clear(); - } - } - -} diff --git a/netty-client/src/main/java/com/sv/barcode/button/TestCodeClick.java b/netty-client/src/main/java/com/sv/barcode/button/TestCodeClick.java deleted file mode 100644 index c086c7b..0000000 --- a/netty-client/src/main/java/com/sv/barcode/button/TestCodeClick.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.sv.barcode.button; - -import com.sv.netty.ClientHandler; -import com.sv.netty.ClientThread; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class TestCodeClick implements ActionListener { - - private final Logger logger = LoggerFactory.getLogger(TestCodeClick.class); - - private JTextField barcode; - - public TestCodeClick(JTextField barcode) { - this.barcode = barcode; - } - - @Override - public void actionPerformed(ActionEvent e) { - String text = barcode.getText(); - text = text.substring(1,text.length() -1); - logger.error("sending barcode msg to api !!!=========" + text); - ClientThread.getInstance().checkBarcode(text); - } -} diff --git a/netty-client/src/main/java/com/sv/netty/ClientThread.java b/netty-client/src/main/java/com/sv/netty/ClientThread.java index 3bd2b28..471b268 100644 --- a/netty-client/src/main/java/com/sv/netty/ClientThread.java +++ b/netty-client/src/main/java/com/sv/netty/ClientThread.java @@ -71,23 +71,6 @@ public class ClientThread extends Thread{ doConnect(); } - public void checkBarcode(String barcode) { - try { - if (future != null) { - Channel channel = future.channel(); - if (channel != null) { - String sendCode = MessageHandler.checkBarcode(barcode); - if (StringUtil.isNullOrEmpty(sendCode)){ - return; - } - channel.writeAndFlush(sendCode); - } - } - }catch (Exception e) { - logger.error("link netty server fail ,send barcode fail",e); - } - } - public void clearFuture(){ future = null; } diff --git a/netty-client/src/main/java/com/sv/netty/MessageHandler.java b/netty-client/src/main/java/com/sv/netty/MessageHandler.java index 0288009..bed02c4 100644 --- a/netty-client/src/main/java/com/sv/netty/MessageHandler.java +++ b/netty-client/src/main/java/com/sv/netty/MessageHandler.java @@ -1,10 +1,11 @@ package com.sv.netty; -import com.sv.netty.config.*; -import com.sv.netty.utils.AesUtil; +import com.sv.netty.config.HeartBeat; +import com.sv.netty.config.MessageType; +import com.sv.netty.config.NettyConstant; +import com.sv.netty.config.VenueMessage; import com.sv.netty.utils.EncodeMsg; import com.sv.netty.utils.JsonUtils; -import com.sv.netty.utils.MakeCode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,29 +24,4 @@ public class MessageHandler { return EncodeMsg.INSTANCE.encode(venueMessage); } - /** - * 核销二维码 - * @return - */ - public static String checkBarcode(String barcode) { - String decrypt = AesUtil.decrypt(barcode); - if (decrypt == null) { - logger.error("barcode unable to decrypt" + barcode); - return null; - } - // 这个二维码是线下的二维码 - if (!decrypt.startsWith("venue-")){ - VenueBarCode venueBarCode = MakeCode.decodeCode(barcode); - if (venueBarCode == null) { - logger.error("user barcode can't not decodeCode" + barcode); - return null; - } - } - VenueMessage venueMessage = new VenueMessage(); - venueMessage.setMessageType(MessageType.SCAN_CODE); - venueMessage.setMessage(barcode); - logger.info("use barcode to api ===" + barcode); - return EncodeMsg.INSTANCE.encode(venueMessage); - } - } diff --git a/netty-model/src/main/java/com/sv/netty/config/NettyConstant.java b/netty-model/src/main/java/com/sv/netty/config/NettyConstant.java index 30d9e27..c89d3ba 100644 --- a/netty-model/src/main/java/com/sv/netty/config/NettyConstant.java +++ b/netty-model/src/main/java/com/sv/netty/config/NettyConstant.java @@ -19,7 +19,4 @@ public interface NettyConstant { */ String SPIT_WORD = "&&&"; - char BARCODE_BEGIN = '@'; - char BARCODE_END = '#'; - } diff --git a/netty-model/src/main/java/com/sv/netty/utils/MakeCode.java b/netty-model/src/main/java/com/sv/netty/utils/MakeCode.java deleted file mode 100644 index c3c0f24..0000000 --- a/netty-model/src/main/java/com/sv/netty/utils/MakeCode.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.sv.netty.utils; - -import com.sv.netty.config.NettyConstant; -import com.sv.netty.config.VenueBarCode; - -public class MakeCode { - - public static int addSno = 0; - /** - * 生成二维码 - * @return - */ - public static String makeCode (Integer venueId, Integer memberId, String deviceName, String direction) { - if (addSno == 9999){ - addSno = 0; - } - String information = memberId + NettyConstant.SPIT_WORD + venueId - + NettyConstant.SPIT_WORD + deviceName - + NettyConstant.SPIT_WORD + direction - + NettyConstant.SPIT_WORD + System.currentTimeMillis() - + NettyConstant.SPIT_WORD + addSno++; - return NettyConstant.BARCODE_BEGIN + AesUtil.encrypt(information) + NettyConstant.BARCODE_END; - } - - /** - * 生成二维码 - * @return - */ - public static String makeOfflineCode (String barcodeSn) { - return NettyConstant.BARCODE_BEGIN + AesUtil.encrypt(barcodeSn) + NettyConstant.BARCODE_END; - } - - /** - * 解析二维码 - */ - public static VenueBarCode decodeCode (String barcode) { - VenueBarCode venueBarCode = null; - String decrypt = AesUtil.decrypt(barcode); - String [] list = new String[0]; - if (decrypt!=null && decrypt.contains(NettyConstant.SPIT_WORD)){ - list = decrypt.split(NettyConstant.SPIT_WORD); - } - if (list != null && list.length == 6) { - venueBarCode = new VenueBarCode(); - venueBarCode.setMemberId(Integer.parseInt(list[0])); - venueBarCode.setVenueId(Integer.parseInt(list[1])); - venueBarCode.setDeviceName(list[2]); - venueBarCode.setDirection(Integer.parseInt(list[3])); - } else { - return null; - } - return venueBarCode; - } - - /** - * 解析二维码 - */ - public static String decodeOfflineCode (String barcodeSn) { - return AesUtil.decrypt(barcodeSn); - } - - /** - * 还原二维码 - */ - public static String reWriteBarcode(String barcode) { - return NettyConstant.BARCODE_BEGIN + barcode + NettyConstant.BARCODE_END; - } - -} diff --git a/service/src/main/java/com/sv/service/common/BarcodeService.java b/service/src/main/java/com/sv/service/common/BarcodeService.java deleted file mode 100644 index 5a07283..0000000 --- a/service/src/main/java/com/sv/service/common/BarcodeService.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.sv.service.common; - -import com.enums.BarCodeStatusEnum; -import com.enums.EnterEnum; -import com.sv.dto.api.BarcodeDTO; -import com.sv.entity.Barcode; -import com.sv.entity.BarcodeOrderTime; -import com.sv.mapper.BarcodeMapper; -import com.sv.mapper.BarcodeOrderTimeMapper; -import com.sv.netty.utils.MakeCode; -import com.ydd.framework.core.exception.ServiceException; -import com.ydd.framework.core.service.impl.BaseServiceImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; - -/** - * Service - 短信 - * - * @author lh - * @since 2018-08-01 - */ -@Service -@Transactional -public class BarcodeService extends BaseServiceImpl { - - private final Logger logger = LoggerFactory.getLogger(BarcodeService.class); - - @Resource - BarcodeMapper barcodeMapper; - @Resource - BarcodeOrderTimeMapper barcodeOrderTimeMapper; - - public String newBarcode (String deviceName, String orderSn, EnterEnum enterEnum, Integer venueId, Integer memberId){ - String barcode = ""; - Barcode res = barcodeMapper.findBarcode(venueId, memberId); - if (res == null) { - barcode = MakeCode.makeCode(venueId, memberId, deviceName, enterEnum.getValue() + ""); - Barcode b = new Barcode(); - logger.info("[生成二维码] memberId={}, venueId={}, orderSn={}, enterEnum={}, deviceName={}, barcode={}", - memberId, venueId, orderSn, enterEnum.getValue(), deviceName, barcode); - b.setBarcode(barcode); - b.setStatus(BarCodeStatusEnum.INIT.getValue()); - b.setMemberId(memberId); - b.setVenueId(venueId); - b.setOrderSn(orderSn); - b.setEnter(enterEnum.getValue()); - barcodeMapper.insert(b); - }else { - barcode = res.getBarcode(); - logger.info("[生成二维码] 复用已有二维码 memberId={}, venueId={}, barcode={}, enter={}", - memberId, venueId, barcode, res.getEnter()); - } - return barcode; - } - - public BarcodeDTO isUsed(String barcode){ - BarcodeDTO barcodeDTO = new BarcodeDTO(); - barcodeDTO.setUsed(false); - Barcode code = barcodeMapper.checkIsUsed(barcode); - if (code == null) { - logger.error("[二维码校验] 二维码不存在 barcode={}", barcode); - throw new ServiceException("二维码不存在!"); - } - if (BarCodeStatusEnum.USED.value == code.getStatus()){ - barcodeDTO.setUsed(true); - BarcodeOrderTime lastEnterOrder = barcodeOrderTimeMapper.findLastOrder(code.getMemberId(), code.getVenueId()); - barcodeDTO.setEnterId(lastEnterOrder.getId()); - logger.info("[二维码校验] 已使用 memberId={}, venueId={}, enterId={}", code.getMemberId(), code.getVenueId(), lastEnterOrder.getId()); - } else { - logger.info("[二维码校验] 未使用 memberId={}, venueId={}", code.getMemberId(), code.getVenueId()); - } - return barcodeDTO; - } -} diff --git a/service/src/main/java/com/sv/service/common/DoorLockUtil.java b/service/src/main/java/com/sv/service/common/DoorLockUtil.java index d7e1312..27b71d9 100644 --- a/service/src/main/java/com/sv/service/common/DoorLockUtil.java +++ b/service/src/main/java/com/sv/service/common/DoorLockUtil.java @@ -9,14 +9,13 @@ import java.util.concurrent.TimeUnit; public class DoorLockUtil { private final static String DOOR_LOCK = "DOOR_LOCK_"; - private final static String DOOR_BARCODE_LOCK = "DOOR_BARCODE_LOCK_"; - private final static Integer LOCK_TIMEOUT = 15; + private final static Integer LOCK_TIMEOUT = 20; @Resource RedisCache redisCache; /** - * 门禁有人扫码之后,需要锁定门禁30s + * 门禁有人扫码之后,需要锁定门禁20s * @return */ public boolean checkDoorLock(String doorSn){ @@ -28,7 +27,7 @@ public class DoorLockUtil { } /** - * 门禁有人扫码之后,需要锁定门禁30s + * 门禁有人扫码之后,需要锁定门禁20s * @param doorSn */ public void lockDoor(String doorSn){ @@ -36,25 +35,4 @@ public class DoorLockUtil { redisCache.setCacheObject(doorKey,true,LOCK_TIMEOUT, TimeUnit.SECONDS); } - /** - * 门禁有人扫码之后,需要锁定门禁30s - * @return - */ - public boolean checkBarcode(String doorSn){ - String doorKey = DOOR_BARCODE_LOCK + doorSn; - if (redisCache.getCacheObject(doorKey) == null){ - return false; - } - return true; - } - - /** - * 门禁有人扫码之后,需要锁定门禁30s - * @param doorSn - */ - public void lockBarcode(String doorSn){ - String doorKey = DOOR_BARCODE_LOCK + doorSn; - redisCache.setCacheObject(doorKey,true,LOCK_TIMEOUT, TimeUnit.SECONDS); - } - } 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 ff30e13..559033a 100644 --- a/service/src/main/java/com/sv/service/oms/DeviceService.java +++ b/service/src/main/java/com/sv/service/oms/DeviceService.java @@ -238,17 +238,5 @@ 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(); - barcodeOffline.setStartTime(startTime); - barcodeOffline.setEndTime(DateUtils.addHours(startTime,2)); - barcodeOffline.setVenueId(venueId); - barcodeOffline.setDeviceName(deviceName); - barcodeOffline.setBarcode(barcode); - barcodeOfflineMapper.insert(barcodeOffline); - } - }