From 14a9944c724c9bdf63f6d617e0d6c9b4990e2686 Mon Sep 17 00:00:00 2001 From: limqhz <540344226@qq.com> Date: Sun, 29 Mar 2026 10:19:12 +0800 Subject: [PATCH] =?UTF-8?q?fix=20-=20=E7=AE=80=E5=8D=95=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=AF=AE=E7=90=83=E5=85=A5=E5=9C=BA=E8=AE=A2=E5=8D=95=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AdminNettyController.java | 27 ++++ api/src/test/java/com/sv/wx/WxRefundTest.java | 30 ++-- .../java/com/sv/barcode/ListenKeyFrame.java | 6 +- .../sv/intergration/impl/OldDoorService.java | 76 +++++---- .../ydd/oms/task/BarcodeTimeOrderTask.java | 55 ++++--- other/sql/202404.sql | 1 + .../api/MemberLessonTicketService.java | 2 +- .../com/sv/service/api/MemberService.java | 1 + .../com/sv/service/api/VenueEnterService.java | 151 +++++++++--------- .../mybatis/mapper/sv/VenuePriceMapper.xml | 15 +- 10 files changed, 198 insertions(+), 166 deletions(-) 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 2b3460b..0d17d36 100644 --- a/api/src/main/java/com/sv/netty/controller/AdminNettyController.java +++ b/api/src/main/java/com/sv/netty/controller/AdminNettyController.java @@ -1,9 +1,13 @@ 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; @@ -48,6 +52,29 @@ 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); + logger.info("核销二维码开门了..."); + String offline = MakeCode.decodeOfflineCode(code); + if (offline.startsWith("venue-")) { + // 这是线下开门的逻辑 + messageService.offlineOpenDoor(code); + } else { + VenueBarCode venueBarCode = MakeCode.decodeCode(code); + 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); diff --git a/api/src/test/java/com/sv/wx/WxRefundTest.java b/api/src/test/java/com/sv/wx/WxRefundTest.java index 2dacc95..b4e2096 100644 --- a/api/src/test/java/com/sv/wx/WxRefundTest.java +++ b/api/src/test/java/com/sv/wx/WxRefundTest.java @@ -2,6 +2,8 @@ package com.sv.wx; import com.WeiXinApplication; import com.dw.ccm.wechat.base.pay.MD5Utils; +import com.sv.service.api.OrderService; +import com.sv.service.api.config.WechatPayService; import com.sv.service.api.util.EncryptionUtil; import com.sv.service.api.util.XmlUtils; import com.ydd.framework.core.common.utils.JsonUtils; @@ -10,36 +12,22 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import javax.annotation.Resource; +import java.io.IOException; import java.util.Map; @RunWith(SpringRunner.class) @SpringBootTest(classes={WeiXinApplication.class}) public class WxRefundTest { -// @Resource -// PayConfigService payConfigService; + @Resource + private WechatPayService wechatPayService; @Test - public void refundTest(){ - String mapStr = "{\"nonce_str\":\"ee73143e484c693845aefc9679435c50\",\"req_info\":\"vElcoXDbKNN9Uu5uA2vsAXxuHTDo5ZSjoSTTf9xHSqxnG9AZTUXtj9a5emospwQBnk01VFHw1DtOIQvVVXEEuy0khE7wSz7A5ZYgAmPHUcaCSH1uZdgLuCxQ6k21GrGWpCXx+7npP5/cliGl2eiv7iZbjhaxQDYhfLQo8wO9JfWie7E8eGyX/0UnNyrlejfVSj02YJCbkQVKrDuBWI48rgLCdGFcg1zc0qsEi+s3GoTJTBxAVytHbq9w8XAkgLAlN2DhtrSIhseJINeEebgtk7XvxzZhno2tUZ2djAcj+HmudBXh9XplCLg9lrIK85yeTS8sPO8079fhXlKlzx475vDeQj+nYrSSXvRF51qBucv9/l8/e6ayKU39Ot0eJ3WYjDB7c+u4qHnGN0mYHfdIosNDN6XIHato7nQHZl264QtC1QVI6icCijZ6s51v0TTwpEZsTABVDgip9g/e+T0SOXTlTMvixF8v7IrXbxRZni9wyYlITiildhfrjyLfK/6dpYeptjp7slwf9WoHjm0ceQG3YpaDwhjhMAdVnD8/4blNrE9xMuAUXgf3rh0XIH9Q52nK+3FQicpjR1qg6vcoRiLNl7wll/3iKmpbVRikKEdeNHjnZxvKGlc42LeCwksGv7Jve/lluSn3rwbDA8jT5Qcaetz2xCvtT18cUo2l/uhjQ8+cBVYqkdkbyuTSlIMVQs4KvG6kPvk4yJsG0vazegUNyFiE6AcUd/3kzRw1TORppHL2EG/j5ZEAsLTNkDPNWJrtlfNW8R5nPQuTR1SGjt+/WbY/gDVjGSEeUefZ/FO6cTyq0kdmZLKnNiDCjpApq47k3p9mBG74EZoz147U/CyNJCUmLYxlNt+A+t/SL4yKZSiqu9CbCEEhu/Zff6lNgeGjcHfESok8c83eQMYThVia7ZXzVvEeZz0Lk0dUho7DlU5ir4kQ07HKY9QNawhoY935TLnXEePHxC4zIplyJA/qbxjeEkYOfDt5F/eLLwXXvGi66Du0SAha+AqALkpbOjA8AgDg8E/+armlZPA5ORNgfjrW07gl1uCPCwfPWT1TuogB6wiDKPvJu/wqtMSD\",\"appid\":\"wx73eb8a9ed10a029d\",\"mch_id\":\"1505718751\",\"return_code\":\"SUCCESS\"}"; + public void refundTest() throws IOException { + String mapStr = "{\"transaction_id\":\"4200003100202603299982043817\",\"nonce_str\":\"Ry43aTRErVhu3d2fN7fTmzhv57Ayoz\",\"bank_type\":\"OTHERS\",\"openid\":\"oQ5kM5KDmBn5e08gNV0HzOcJdGKI\",\"sign\":\"380E9C640F7BCD5A78D621F28D117C0B\",\"fee_type\":\"CNY\",\"mch_id\":\"1505718751\",\"cash_fee\":\"800\",\"out_trade_no\":\"260329073632925370\",\"appid\":\"wx73eb8a9ed10a029d\",\"total_fee\":\"800\",\"trade_type\":\"JSAPI\",\"result_code\":\"SUCCESS\",\"time_end\":\"20260329073640\",\"is_subscribe\":\"N\",\"return_code\":\"SUCCESS\"}"; Map params = JsonUtils.decode(mapStr, Map.class); - - // 读取输入流 - if (params.get("return_code").equals("SUCCESS")) { - String reqInfo = params.get("req_info");//加密信息 -// PayConfig payConfig = payConfigService.findKey("face"); //得到秘钥 - String key = MD5Utils.md5("jYrMMG4RPNxI2xCnH7zgh8LTwBrtjal9").toString(); - key = key.toLowerCase(); - String refundInfo = EncryptionUtil.Aes256Decode(reqInfo,key); - Map map = XmlUtils.getResult(refundInfo); - - // 更新‘用户退款记录表’ - String refundStatus = map.get("refund_status").toString(); //退款状态 - String outTradeNo = map.get("out_trade_no").toString(); //商户订单号 - String successTime = map.get("success_time").toString(); //退款成功时间 -// memberRefundService.updateInfo(refundStatus,outTradeNo,successTime,platformId); - - } + wechatPayService.notify(params); } 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 384b21f..53e1497 100644 --- a/netty-client/src/main/java/com/sv/barcode/ListenKeyFrame.java +++ b/netty-client/src/main/java/com/sv/barcode/ListenKeyFrame.java @@ -38,9 +38,9 @@ public class ListenKeyFrame { frame.add(label); frame.add(buttonIn); frame.add(buttonOut); - frame.add(jTextField); // 注释 - frame.add(buttonSubmit); // 注释 - frame.add(buttonPlay); +// frame.add(jTextField); // 注释 +// frame.add(buttonSubmit); // 注释 +// frame.add(buttonPlay); // 播放音乐的可注释 frame.setFocusableWindowState(true); frame.setAlwaysOnTop(true); // frame.setExtendedState(JFrame.MAXIMIZED_BOTH); //最大化 diff --git a/netty-client/src/main/java/com/sv/intergration/impl/OldDoorService.java b/netty-client/src/main/java/com/sv/intergration/impl/OldDoorService.java index c64f7b9..7d5d650 100644 --- a/netty-client/src/main/java/com/sv/intergration/impl/OldDoorService.java +++ b/netty-client/src/main/java/com/sv/intergration/impl/OldDoorService.java @@ -10,39 +10,28 @@ import Net.PC15.FC8800.FC8800Identity; import com.sv.intergration.DoorService; import com.sv.netty.config.NettyConstant; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; + public class OldDoorService implements DoorService { @Override public void enterOpenDoor() { - try { - ConnectorAllocator connector = ConnectorAllocator.GetAllocator(); - TCPClientDetial tcpClientDetial = new TCPClientDetial("192.168.1.150", Integer.valueOf("8000")); - connector.GetCommandCount(tcpClientDetial); - connector.OpenForciblyConnect(tcpClientDetial); - CommandDetial detial = new CommandDetial(); - detial.Connector = tcpClientDetial; - String clientSn = System.getProperty(NettyConstant.VENUE_CLIENT_SN); - System.out.println(clientSn); -// detial.Identity = new FC8800Identity("MC-5824T23014127", "12345678", E_ControllerType.FC8900); - detial.Identity = new FC8800Identity(clientSn, "12345678", E_ControllerType.FC8900); - OpenDoor_Parameter openDoorParameter = new OpenDoor_Parameter(detial); - openDoorParameter.Door.SetDoor(1, 1); - OpenDoor openDoor = new OpenDoor(openDoorParameter); - boolean command = connector.AddCommand(openDoor); - if (!command) { - logger.error("enter door open command exec fail"); - } - if (openDoor.getIsTimeout()) { - logger.info("----in open door timeout ----"); - } - } catch (Exception e) { - logger.error("----in open door error ----", e); - } + opendoor(1); } @Override public void outOpenDoor() { + opendoor(2); + } + + private void opendoor(int doorSn) { try { + // 1. 先检查网络连通性(Java 层) + if (!isNetworkReachable("192.168.1.150", 8000, 2000)) { + throw new RuntimeException("net socket error: 192.168.1.150:8000"); + } ConnectorAllocator connector = ConnectorAllocator.GetAllocator(); TCPClientDetial tcpClientDetial = new TCPClientDetial("192.168.1.150", Integer.valueOf("8000")); connector.GetCommandCount(tcpClientDetial); @@ -53,24 +42,43 @@ public class OldDoorService implements DoorService { // detial.Identity = new FC8800Identity("MC-5824T23014127", "12345678", E_ControllerType.FC8900); detial.Identity = new FC8800Identity(clientSn, "12345678", E_ControllerType.FC8900); OpenDoor_Parameter openDoorParameter = new OpenDoor_Parameter(detial); - openDoorParameter.Door.SetDoor(2, 1); + openDoorParameter.Door.SetDoor(doorSn, 1); + + for (int i = 0; i < 3; i++) { + logger.info("{} times to try...", i + 1); + boolean connected = connector.IsForciblyConnect(tcpClientDetial); + + if (connected) { + logger.info("[{}] connected"); + break; + } + + logger.warn("[{}] times to try, trying", i + 1); + Thread.sleep(1000); // 等待 1 秒后重试 + } + OpenDoor openDoor = new OpenDoor(openDoorParameter); boolean command = connector.AddCommand(openDoor); if (!command) { - logger.error("out door open command exec fail"); + logger.error("sn-{} door open command exec fail",doorSn); } if (openDoor.getIsTimeout()) { - logger.info("----out open door timeout ----"); + logger.info("----sn-{} open door timeout ----",doorSn); } } catch (Exception e) { - logger.error("----out open door error ----", e); + logger.error("----sn-{} open door error ----",doorSn, e); + } + } + + // 网络连通性检查(Java 层) + private boolean isNetworkReachable(String host, int port, int timeoutMs) { + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(host, port), timeoutMs); + return true; + } catch (IOException e) { + logger.error("net link error: {}:{} - {}", host, port, e.getMessage()); + return false; } } - // 测试 -// public static void main(String[] args) { -// OldDoorService oldDoorService = new OldDoorService(); -// oldDoorService.enterOpenDoor(); -// oldDoorService.outOpenDoor(); -// } } diff --git a/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java b/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java index 58dc1ed..f15d427 100644 --- a/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java +++ b/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java @@ -44,10 +44,9 @@ public class BarcodeTimeOrderTask { @Scheduled(cron = "0 0/5 * * * ?") public void execute(){ logger.error("执行BarcodeTimeOrderTask.execute"); - // 查询用户已经过期的按次入场订单 - List barcodeOrderTimes = barcodeOrderTimeMapper.endOrderList(new Date()); + Date date = new Date(); + List barcodeOrderTimes = barcodeOrderTimeMapper.endOrderList(date); if (barcodeOrderTimes != null && barcodeOrderTimes.size() > 0){ - Date date = new Date(); for (BarcodeOrderTime barcodeOrderTime : barcodeOrderTimes) { logger.info("用户:" + barcodeOrderTime.getMemberId() + ",在场馆" + barcodeOrderTime.getVenueId() + "已到期"); barcodeOrderTime.setStatus(BarCodeStatusEnum.USED.getValue()); @@ -60,37 +59,43 @@ public class BarcodeTimeOrderTask { @Scheduled(cron = "0 0/2 * * * ?") public void refundOrder(){ logger.error("执行BarcodeTimeOrderTask.refundOrder"); - // 需要支付的订单 List barcodeOrderTimes = barcodeOrderTimeMapper.needPayOrderList(); if (barcodeOrderTimes != null && barcodeOrderTimes.size() > 0){ Date date = new Date(); for (BarcodeOrderTime barcodeOrderTime : barcodeOrderTimes) { - int minutes = DateUtilCard.diffMinute(barcodeOrderTime.getModifiedTime(), date); - if (minutes < 10) { - continue; + boolean isHourlyRefund = barcodeOrderTime.getPayMoney() != null && barcodeOrderTime.getPayMoney() > 0; + + if (!isHourlyRefund) { + // 按次计费:10分钟宽限期 + int minutes = DateUtilCard.diffMinute(barcodeOrderTime.getModifiedTime(), date); + if (minutes < 10) { + continue; + } } + + // 关闭订单 barcodeOrderTime.setPaying(0); barcodeOrderTime.setModifiedTime(date); barcodeOrderTime.setStatus(BarCodeStatusEnum.USED.getValue()); barcodeOrderTimeMapper.updateByPrimaryKey(barcodeOrderTime); - if (barcodeOrderTime.getPayMoney() <= 0) { - continue; - } - Order order = orderMapper.findOrderSn(barcodeOrderTime.getOrderSn(), barcodeOrderTime.getMemberId()); - if (order != null) { - // 找到订单 - logger.info("用户" + barcodeOrderTime.getMemberId() + "的订单" + barcodeOrderTime.getOrderSn() + "需要退款" + barcodeOrderTime.getPayMoney()); - MemberRefund memberRefund = new MemberRefund(); - memberRefund.setMemberId(barcodeOrderTime.getMemberId()); - memberRefund.setLessonId(barcodeOrderTime.getId()); - memberRefund.setMoney(order.getPrice()); - memberRefund.setOrderSn(barcodeOrderTime.getOrderSn()); - memberRefund.setTransactionId(order.getTradeSn()); - memberRefund.setOrderId(order.getId()); - memberRefund.setOutRefundNo(createSn());//商户退款单号 - memberRefund.setPlatformId(1); - memberRefundMapper.insert(memberRefund); - wechatPayService.refundInputMoney(memberRefund,new BigDecimal(barcodeOrderTime.getPayMoney())); + + // 按时计费退款 + if (isHourlyRefund) { + Order order = orderMapper.findOrderSn(barcodeOrderTime.getOrderSn(), barcodeOrderTime.getMemberId()); + if (order != null) { + logger.info("用户" + barcodeOrderTime.getMemberId() + "的订单" + barcodeOrderTime.getOrderSn() + "需要退款" + barcodeOrderTime.getPayMoney()); + MemberRefund memberRefund = new MemberRefund(); + memberRefund.setMemberId(barcodeOrderTime.getMemberId()); + memberRefund.setLessonId(barcodeOrderTime.getId()); + memberRefund.setMoney(order.getPrice()); + memberRefund.setOrderSn(barcodeOrderTime.getOrderSn()); + memberRefund.setTransactionId(order.getTradeSn()); + memberRefund.setOrderId(order.getId()); + memberRefund.setOutRefundNo(createSn()); + memberRefund.setPlatformId(1); + memberRefundMapper.insert(memberRefund); + wechatPayService.refundInputMoney(memberRefund,new BigDecimal(barcodeOrderTime.getPayMoney())); + } } } } diff --git a/other/sql/202404.sql b/other/sql/202404.sql index 325b51c..81a6b91 100644 --- a/other/sql/202404.sql +++ b/other/sql/202404.sql @@ -33,6 +33,7 @@ CREATE TABLE `sv_disclaimers` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='免责声明'; + -- 新增免责声明菜单 INSERT INTO `smart_venue`.`sys_menu`(`status`, `name`, `en_name`, `url`, `icon`, `parent_id`, `sort`, `remark`, `created_id`, `modified_id`, `created_time`, `modified_time`, `deleted`) VALUES (0, '免责声明', '免责声明', 'disclaimers/edit', '', 36, 7, '', 0, 0, NOW(), NOW(), 0); diff --git a/service/src/main/java/com/sv/service/api/MemberLessonTicketService.java b/service/src/main/java/com/sv/service/api/MemberLessonTicketService.java index e0a49ad..e3f6f0c 100644 --- a/service/src/main/java/com/sv/service/api/MemberLessonTicketService.java +++ b/service/src/main/java/com/sv/service/api/MemberLessonTicketService.java @@ -696,7 +696,7 @@ public class MemberLessonTicketService extends BaseServiceImpl { for (MemberLessonTicketDetailDTO t : tickets) { if (new Integer(1).equals(t.getVenueLesson().getType())) { //是公益课 加上本次未签到 三个月内超过两次 拉入黑名单 - memberService.updateMemberBanStatus(ticket.getMemberId(), 1); +// memberService.updateMemberBanStatus(ticket.getMemberId(), 1); } } } diff --git a/service/src/main/java/com/sv/service/api/MemberService.java b/service/src/main/java/com/sv/service/api/MemberService.java index abfaa37..3362d97 100644 --- a/service/src/main/java/com/sv/service/api/MemberService.java +++ b/service/src/main/java/com/sv/service/api/MemberService.java @@ -615,6 +615,7 @@ public class MemberService extends BaseServiceImpl { * @param stauts */ @Transactional(rollbackFor = Exception.class) + @Deprecated public void updateMemberBanStatus(Integer memberId,Integer stauts){ Member member = new Member(); member.setId(memberId); diff --git a/service/src/main/java/com/sv/service/api/VenueEnterService.java b/service/src/main/java/com/sv/service/api/VenueEnterService.java index 15bc8f7..56716ff 100644 --- a/service/src/main/java/com/sv/service/api/VenueEnterService.java +++ b/service/src/main/java/com/sv/service/api/VenueEnterService.java @@ -78,45 +78,42 @@ public class VenueEnterService extends BaseServiceImpl { // 按时入场余额需要包含两个小时的场地费 price = price.multiply(new BigDecimal(2)); } - int effOrder = barcodeOrderTimeMapper.findEffOrder(new Date(), memberId, venueId); - if (effOrder <= 0) { + BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); + boolean hasEffOrder = lastOrder != null + && lastOrder.getStatus() == BarCodeStatusEnum.INIT.getValue() + && lastOrder.getOrderEnd().after(new Date()); + + if (!hasEffOrder) { logger.info(memberId + "&用户创建订单,开始进场,需要支付金额"); if (price.compareTo(BigDecimal.ZERO) > 0) { checkOrderPaying(memberId); basketEnterResult.setFlg(2); - basketEnterResult.setMsg("订单金额"+ price + "元,请确认!"); if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){ - basketEnterResult.setMsg("预付押金"+ price + "元,出门后结算,收费规则见场馆主页详情"); + basketEnterResult.setMsg("预付押金"+ price + "元,出门后按分钟结算,收费规则见场馆主页详情"); + } else { + basketEnterResult.setMsg("订单金额"+ price + "元,请确认!"); } basketEnterResult.setMoney(price); - }else { - logger.info(memberId + "&用户创建订单,开始进场"); - // 不需要交钱,则不需要微信支付,直接展示二维码 - Integer timePayHour = 2; // 此处修改押金小时数 - if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){ - // 按次入场先收钱,且多久不收钱,出场不收钱 - // 如果是按次的订单,免费订单只能撑两个小时 - timePayHour = 2; - } + } else { logger.info(memberId + "&用户创建订单,开始进场,免费入场"); + Integer timePayHour = 2; + if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){ + timePayHour = venue.getTimePayHour() != null ? venue.getTimePayHour() : 4; + } createBarcodeTimeOrder(memberId,venueId,timePayHour,"000"); } } else { - // 还沿用原来订单 - logger.info(memberId + "&用户重新入场,沿用原来订单"); - BarcodeOrderTime lastEnterOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); - if (lastEnterOrder != null) { - lastEnterOrder.setPaying(0); - lastEnterOrder.setModifiedTime(new Date()); - barcodeOrderTimeMapper.updateByPrimaryKey(lastEnterOrder); + // 已有有效订单 + if (lastOrder.getPaying() == 1 && PayStyleEnum.TIME.getValue() == venue.getPayStyle()) { + // 按次计费:10分钟内重新入场,沿用原订单 + lastOrder.setPaying(0); + lastOrder.setModifiedTime(new Date()); + barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + logger.info(memberId + "&用户10分钟内重新入场,沿用原订单"); + } else { + logger.info(memberId + "&用户已在场内,无需重复入场"); } } - // 3.判断用户有没有人脸识别的图像,根据用户ID查找,一个用户只能有一条 -// MemberFaceInfo memberFaceInfo = memberFaceInfoService.findByMemberId(memberId); -// if (memberFaceInfo == null) { -// flag = 1; -// return flag; -// } return basketEnterResult; } @@ -129,65 +126,69 @@ public class VenueEnterService extends BaseServiceImpl { public BasketEnterResult out(Integer memberId, Integer venueId) { BasketEnterResult result = new BasketEnterResult(); result.setFlg(0); - // 判断用户是否登录 if (memberId == null) { throw new ServiceException(com.ydd.framework.core.exception.ExceptionCodeTemplate.NEED_LOGIN); } - //参数校验 ValidationUtils.assertNotNull(venueId); Venue venue = venueMapper.findById(venueId); - // 查询当前时间内,场馆对应的价格(健身房没有价格) Member member = memberService.findByMember(memberId); memberService.verify(member); - /** - * 篮球出场核心逻辑 - */ - //判断余额是否够 - // 1、找到入场时间 - if(PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){ - // 按次出场不扣钱 - BigDecimal price = BigDecimal.ZERO; - BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); + + BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); + if (lastOrder == null || lastOrder.getPaying() == 2) { + return result; + } + + if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()) { String enterTime = DateUtilCard.getTimeFromDate(lastOrder.getOrderStart()); Date dateNow = new Date(); - logger.info(memberId + "&用户出场"); - if (2 != lastOrder.getPaying()) { - // 取入场的价格 - VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime); - if (venuePriceEnter == null) { - logger.info(memberId + "&用户出场,场馆暂未开放"); - throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); - } - // 按时出场选择按照分钟四舍五入到角扣款 - BigDecimal basePrice = venuePriceEnter.getPrice(); - price = venuePriceEnter.getPrice(); - int minutes = DateUtilCard.diffMinute(lastOrder.getOrderStart(), dateNow); - int hours = minutes / 60; - // 需要补收的价格 - price = price.multiply(new BigDecimal(hours - 1)); // 此处修改押金小时数 - int mod = new BigDecimal(minutes).divideAndRemainder(new BigDecimal(60))[1].intValue(); - if (hours >= 1 && mod <= 30 && basePrice.compareTo(BigDecimal.ZERO) > 0) { - // 超过一个小时 且不满半小时,只收一半的钱 - price = price.subtract(basePrice.divide(new BigDecimal(2)).setScale(1,BigDecimal.ROUND_HALF_UP)); - } - logger.info("用户出场$" + memberId + "$经过时间为" + minutes + "分钟,价格为:"+ price); - if (price.compareTo(BigDecimal.ZERO) > 0 ) { - checkOrderPaying(memberId); - result.setFlg(2); - result.setMoney(price); - result.setMsg("您此次入场超过2小时,需补交" + price + "元"); - } else { - // 不需要补交钱且需要退钱 - lastOrder.setPayMoney(price.abs().intValue()); - if (lastOrder.getPayMoney() > 0) { - lastOrder.setPaying(1); - lastOrder.setModifiedTime(new Date()); - } - barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); - result.setFlg(888); - result.setMsg("如要继续订单,请在10分钟内进入,否则将结束订单"); - } + logger.info(memberId + "&用户出场(按时)"); + + VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime); + if (venuePriceEnter == null) { + logger.info(memberId + "&用户出场,场馆暂未开放"); + throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); } + + BigDecimal basePrice = venuePriceEnter.getPrice(); + int minutes = DateUtilCard.diffMinute(lastOrder.getOrderStart(), dateNow); + + BigDecimal actualCost = basePrice.multiply(new BigDecimal(minutes)) + .divide(new BigDecimal(60), 2, BigDecimal.ROUND_HALF_UP); + BigDecimal deposit = basePrice.multiply(new BigDecimal(2)); + BigDecimal difference = actualCost.subtract(deposit); + + logger.info("用户出场$" + memberId + "$经过" + minutes + "分钟,实际费用:" + actualCost + ",押金:" + deposit + ",差额:" + difference); + + if (difference.compareTo(BigDecimal.ZERO) > 0) { + checkOrderPaying(memberId); + result.setFlg(2); + result.setMoney(difference); + result.setMsg("您此次入场" + minutes + "分钟,实际费用" + actualCost + "元,需补交" + difference + "元"); + } else if (difference.compareTo(BigDecimal.ZERO) < 0) { + BigDecimal refundAmount = difference.abs(); + lastOrder.setPayMoney(refundAmount.multiply(new BigDecimal(100)).intValue()); + lastOrder.setPaying(1); + lastOrder.setModifiedTime(new Date()); + barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + result.setFlg(0); + result.setMsg("出场成功,退款" + refundAmount + "元将在24小时内到账"); + } else { + lastOrder.setPaying(2); + lastOrder.setStatus(BarCodeStatusEnum.USED.getValue()); + lastOrder.setModifiedTime(new Date()); + barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + result.setFlg(0); + result.setMsg("出场成功"); + } + } else if (PayStyleEnum.TIME.getValue() == venue.getPayStyle()) { + // 按次计费:出场设置 paying=1,10分钟内可重新入场 + logger.info(memberId + "&用户出场(按次)"); + lastOrder.setPaying(1); + lastOrder.setModifiedTime(new Date()); + barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + result.setFlg(0); + result.setMsg("出场成功,10分钟内重新入场无需付费"); } return result; } diff --git a/service/src/main/resources/mybatis/mapper/sv/VenuePriceMapper.xml b/service/src/main/resources/mybatis/mapper/sv/VenuePriceMapper.xml index 33fb418..b3171b8 100644 --- a/service/src/main/resources/mybatis/mapper/sv/VenuePriceMapper.xml +++ b/service/src/main/resources/mybatis/mapper/sv/VenuePriceMapper.xml @@ -17,12 +17,12 @@ - + sv_venue_price - + id, @@ -38,7 +38,7 @@ modified_time, deleted - + #{id, jdbcType=INTEGER}, @@ -159,7 +159,7 @@ - + delete from @@ -180,7 +180,7 @@ #{item} - + UPDATE @@ -222,7 +222,7 @@ WHERE id = #{id} - + - \ No newline at end of file +