From e1558014727a601decc3b69b458df841b0937d7e Mon Sep 17 00:00:00 2001 From: limqhz <540344226@qq.com> Date: Sun, 31 Dec 2023 02:16:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AF=AE=E7=90=83=E9=80=9A=E8=BF=87=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E4=B8=8B=E8=AE=A2=E5=8D=95=EF=BC=8C?= =?UTF-8?q?=E5=87=BA=E5=9C=BA10=E5=88=86=E9=92=9F=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=EF=BC=8C=E8=AF=A5=E9=80=80=E9=92=B1=E9=80=80?= =?UTF-8?q?=E9=92=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sv/api/controller/VenueController.java | 30 +- .../test/java/com/sv/wx/VenueJoinTest.java | 7 +- .../test/java/com/sv/wx/WxServiceTest.java | 2 +- .../java/com/sv/dto/BasketEnterResult.java | 2 +- .../java/com/sv/entity/BarcodeOrderTime.java | 44 ++- .../ydd/oms/task/BarcodeTimeOrderTask.java | 63 +++++ other/sql/202312.sql | 6 +- .../com/sv/mapper/BarcodeOrderTimeMapper.java | 4 +- .../java/com/sv/service/api/OrderService.java | 42 ++- .../com/sv/service/api/VenueEnterService.java | 260 ++++++++++++++++++ .../java/com/sv/service/api/VenueService.java | 227 --------------- .../service/api/config/WechatPayService.java | 7 + .../mapper/sv/BarcodeOrderTimeMapper.xml | 62 ++++- 13 files changed, 485 insertions(+), 271 deletions(-) create mode 100644 service/src/main/java/com/sv/service/api/VenueEnterService.java 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 b871566..3996c15 100644 --- a/api/src/main/java/com/sv/api/controller/VenueController.java +++ b/api/src/main/java/com/sv/api/controller/VenueController.java @@ -2,12 +2,12 @@ package com.sv.api.controller; import com.enums.EnterEnum; import com.enums.PayTypeEnum; -import com.sv.api.context.PlatformContext; import com.sv.dto.BasketEnterResult; import com.sv.entity.Device; import com.sv.entity.Order; import com.sv.entity.Venue; 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; @@ -40,6 +40,8 @@ public class VenueController extends BaseApiController { @Resource private VenueService venueService; @Resource + private VenueEnterService venueEnterService; + @Resource private BarcodeService barcodeService; @Resource private DoorLockUtil doorLockUtil; @@ -112,15 +114,15 @@ public class VenueController extends BaseApiController { OrderService orderService; /** * 判断是否支付成功 - * @param venueId 场馆Id + * @param orderSn 订单号 * @return */ @RequestMapping(value = "/member/isPayed", method = RequestMethod.POST) - public ResponseDTO isPayed(@RequestParam("venueId") Integer venueId,String orderSn) { + public ResponseDTO isPayed(@RequestParam("orderSn") String orderSn) { Integer memberId = getMemberIdByAccessToken(); Order order = orderService.findOrderSn(orderSn, memberId); boolean isPayed = false; - if (orderSn != null && order.getPayStatus() != null && PayStatusEnum.PAYED.getValue() == order.getPayStatus()) { + if (order != null && order.getPayStatus() != null && PayStatusEnum.PAYED.getValue() == order.getPayStatus()) { isPayed = true; } return ResponseDTO.ok().addAttribute("isPayed", isPayed); @@ -147,7 +149,7 @@ public class VenueController extends BaseApiController { throw new ServiceException("有人正在使用门禁,请稍后再试"); } Integer memberId = getMemberIdByAccessToken(); - join = venueService.join(memberId, venueId); + join = venueEnterService.join(memberId, venueId); return ResponseDTO.ok().addAttribute("join", join); } @@ -172,7 +174,7 @@ public class VenueController extends BaseApiController { throw new ServiceException("有人正在使用门禁,请稍后再试"); } Integer memberId = getMemberIdByAccessToken(); - out = venueService.out(memberId, venueId); + out = venueEnterService.out(memberId, venueId); return ResponseDTO.ok().addAttribute("out", out); } @@ -185,11 +187,8 @@ public class VenueController extends BaseApiController { @RequestMapping(value = "/venue/generate/barcode", method = RequestMethod.POST) public ResponseDTO generateBarcode(@RequestParam("orderSn") String orderSn,@RequestParam("venueId") Integer venueId,Integer enterFlag) { Device byDevice = deviceService.findByDevice(venueId); - BasketEnterResult join = new BasketEnterResult(); if (byDevice == null) { - join.setFlg(999); - join.setMsg("通讯异常,门禁设备离线中"); - return ResponseDTO.ok().addAttribute("join", join); + throw new ServiceException("门禁通讯异常"); } String doorSn = byDevice.getName(); boolean lockStat = doorLockUtil.checkDoorLock(doorSn); @@ -206,17 +205,14 @@ public class VenueController extends BaseApiController { } /** - * 余额充值 + * 篮球入场下订单 */ @RequestMapping(value = "/venue/basketball/pay", method = RequestMethod.POST) @AccessToken - public ResponseDTO recharge(@RequestParam("venueId") Integer venueId){ + public ResponseDTO basketPay(@RequestParam("venueId") Integer venueId,@RequestParam("payMoney") Double payMoney){ Device byDevice = deviceService.findByDevice(venueId); - BasketEnterResult join = new BasketEnterResult(); if (byDevice == null) { - join.setFlg(999); - join.setMsg("通讯异常,门禁设备离线中"); - return ResponseDTO.ok().addAttribute("join", join); + throw new ServiceException("门禁通讯异常"); } String doorSn = byDevice.getName(); boolean lockStat = doorLockUtil.checkDoorLock(doorSn); @@ -225,7 +221,7 @@ public class VenueController extends BaseApiController { } Integer memberId = getMemberIdByAccessToken(); return ResponseDTO.ok(). - addAttribute("pay",orderService.createEnterVenueOrder(venueId, memberId, PayTypeEnum.WEI_XIN,new BigDecimal(10))); + addAttribute("pay",orderService.createEnterVenueOrder(venueId, memberId, PayTypeEnum.WEI_XIN, new BigDecimal(payMoney))); } } diff --git a/api/src/test/java/com/sv/wx/VenueJoinTest.java b/api/src/test/java/com/sv/wx/VenueJoinTest.java index 56ff2aa..8b9ec44 100644 --- a/api/src/test/java/com/sv/wx/VenueJoinTest.java +++ b/api/src/test/java/com/sv/wx/VenueJoinTest.java @@ -5,6 +5,7 @@ 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; @@ -20,7 +21,7 @@ import javax.annotation.Resource; public class VenueJoinTest { @Resource - VenueService venueService; + VenueEnterService venueEnterService; @Resource MessageService messageService; @Resource @@ -30,7 +31,7 @@ public class VenueJoinTest { @Test public void testJoin(){ - BasketEnterResult join = venueService.join(535, 32); + 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); @@ -46,7 +47,7 @@ public class VenueJoinTest { @Test public void testOut(){ - BasketEnterResult out = venueService.out(535, 32); + 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); diff --git a/api/src/test/java/com/sv/wx/WxServiceTest.java b/api/src/test/java/com/sv/wx/WxServiceTest.java index da5e2fd..ddb3fb2 100644 --- a/api/src/test/java/com/sv/wx/WxServiceTest.java +++ b/api/src/test/java/com/sv/wx/WxServiceTest.java @@ -32,7 +32,7 @@ public class WxServiceTest { public void refund(){ // wechatPayService.createUnifiedOrder("testlmq20231224",new BigDecimal(0.02),"127.0.0.1","JSAPI", 535); // 根据orderSn查出对应订单信息 - String orderSn = "231228000925924610"; + String orderSn = "231231014749545739"; Integer memberId = 535; Order order = orderService.findOrderSn(orderSn,memberId); if (order == null){ diff --git a/entity/src/main/java/com/sv/dto/BasketEnterResult.java b/entity/src/main/java/com/sv/dto/BasketEnterResult.java index 848f792..1b3b444 100644 --- a/entity/src/main/java/com/sv/dto/BasketEnterResult.java +++ b/entity/src/main/java/com/sv/dto/BasketEnterResult.java @@ -5,7 +5,7 @@ import java.math.BigDecimal; public class BasketEnterResult implements Serializable { /** - * 返回的字符串,根据结果显示 + * 返回的字符串,根据结果显示 999-门禁异常 2-需要支付 0-成功 888-友情提示(十分钟内请及时进场) */ private Integer flg; diff --git a/entity/src/main/java/com/sv/entity/BarcodeOrderTime.java b/entity/src/main/java/com/sv/entity/BarcodeOrderTime.java index bd6f25c..23b233b 100644 --- a/entity/src/main/java/com/sv/entity/BarcodeOrderTime.java +++ b/entity/src/main/java/com/sv/entity/BarcodeOrderTime.java @@ -19,7 +19,20 @@ public class BarcodeOrderTime { private Integer status; - public BarcodeOrderTime(Integer id, Integer memberId, Integer venueId, Date createdTime, Date modifiedTime, Date orderStart, Date orderEnd, Integer status) { + /** + * 入场 paying = 0 不需要退款 + * 出场未结算 paying = 1 需要退款 + */ + private Integer paying; + /** + * 0- 按次 + * 1- 按时 + */ + private Integer payMoney; + + private String orderSn; + + public BarcodeOrderTime(Integer id, Integer memberId, Integer venueId, Date createdTime, Date modifiedTime, Date orderStart, Date orderEnd, Integer status ,Integer paying, Integer payMoney, String orderSn) { this.id = id; this.memberId = memberId; this.venueId = venueId; @@ -28,6 +41,9 @@ public class BarcodeOrderTime { this.orderStart = orderStart; this.orderEnd = orderEnd; this.status = status; + this.paying = paying; + this.payMoney = payMoney; + this.orderSn = orderSn; } public BarcodeOrderTime() { @@ -97,4 +113,28 @@ public class BarcodeOrderTime { public void setStatus(Integer status) { this.status = status; } -} \ No newline at end of file + + public Integer getPaying() { + return paying; + } + + public void setPaying(Integer paying) { + this.paying = paying; + } + + public Integer getPayMoney() { + return payMoney; + } + + public void setPayMoney(Integer payMoney) { + this.payMoney = payMoney; + } + + public String getOrderSn() { + return orderSn; + } + + public void setOrderSn(String orderSn) { + this.orderSn = orderSn; + } +} 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 e99862b..8341539 100644 --- a/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java +++ b/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java @@ -4,8 +4,17 @@ import com.enums.BarCodeStatusEnum; import com.enums.StayEnum; import com.sv.entity.BarcodeOrderTime; import com.sv.entity.MemberEnterStatus; +import com.sv.entity.MemberRefund; +import com.sv.entity.Order; import com.sv.mapper.BarcodeOrderTimeMapper; import com.sv.mapper.MemberEnterStatusMapper; +import com.sv.mapper.MemberRefundMapper; +import com.sv.mapper.OrderMapper; +import com.sv.service.api.config.WechatPayService; +import com.sv.service.api.util.DateUtilCard; +import com.sv.service.oms.OrderService; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; @@ -13,6 +22,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -29,6 +39,12 @@ public class BarcodeTimeOrderTask { @Resource BarcodeOrderTimeMapper barcodeOrderTimeMapper; + @Resource + OrderMapper orderMapper; + @Resource + MemberRefundMapper memberRefundMapper; + @Resource + WechatPayService wechatPayService; @Scheduled(cron = "0 0/5 * * * ?") public void execute(){ @@ -46,4 +62,51 @@ 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; + } + barcodeOrderTime.setPaying(0); + barcodeOrderTime.setModifiedTime(date); + 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(1); + 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())); + } + } + } + } + + /** + * 生成订单号 + * + * @return + */ + private String createSn() { + return DateFormatUtils.format(new Date(), "yyMMddHHmmss") + RandomStringUtils.randomNumeric(6); + } + } diff --git a/other/sql/202312.sql b/other/sql/202312.sql index df572b7..9d99ec7 100644 --- a/other/sql/202312.sql +++ b/other/sql/202312.sql @@ -25,4 +25,8 @@ CREATE TABLE `sv_member_enter_status` ( -- 20231228 待执行 ALTER TABLE sv_barcode -ADD COLUMN order_sn varchar(200) NOT NULL AFTER barcode; \ No newline at end of file +ADD COLUMN order_sn varchar(200) AFTER barcode; +ALTER TABLE `smart_venue`.`sv_barcode_order_time` +ADD COLUMN `paying` int(11) NULL COMMENT '入场 paying = 0 出场未结算 paying = 1' AFTER `status`, +ADD COLUMN `pay_money` int(11) NULL COMMENT '退款金额' AFTER `paying`, +ADD COLUMN `order_sn` varchar(200) NULL COMMENT '退款订单号' AFTER `pay_money`; diff --git a/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java b/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java index ed48fcd..9bf7b62 100644 --- a/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java +++ b/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java @@ -25,4 +25,6 @@ public interface BarcodeOrderTimeMapper { List endOrderList(@Param("currentDate") Date currentDate); -} \ No newline at end of file + List needPayOrderList(); + +} diff --git a/service/src/main/java/com/sv/service/api/OrderService.java b/service/src/main/java/com/sv/service/api/OrderService.java index d179b66..e4b92af 100644 --- a/service/src/main/java/com/sv/service/api/OrderService.java +++ b/service/src/main/java/com/sv/service/api/OrderService.java @@ -1,6 +1,6 @@ package com.sv.service.api; -import com.enums.MoneyLogEnum; +import com.enums.BarCodeStatusEnum; import com.enums.OrderPayEnum; import com.enums.OrderTypeEnum; import com.enums.PayTypeEnum; @@ -9,10 +9,14 @@ import com.sv.dto.api.wechat.BaseResult; import com.sv.dto.api.wechat.OrderPaySignResponse; import com.sv.entity.*; import com.sv.exception.api.ExceptionCodeTemplate; +import com.sv.mapper.BarcodeOrderTimeMapper; import com.sv.mapper.OrderMapper; import com.sv.mapper.VenueMapper; +import com.sv.mapper.VenuePriceMapper; import com.sv.service.api.config.WechatPayService; +import com.sv.service.api.util.DateUtilCard; import com.ydd.framework.core.common.Pagination; +import com.ydd.framework.core.common.utils.RequestUtils; import com.ydd.framework.core.exception.ServiceException; import com.ydd.framework.core.service.impl.BaseServiceImpl; import com.ydd.oms.entity.enums.PayStatusEnum; @@ -28,6 +32,7 @@ import javax.annotation.Resource; import java.io.IOException; import java.math.BigDecimal; import java.util.Date; +import java.util.List; import java.util.Map; /** @@ -56,9 +61,8 @@ public class OrderService extends BaseServiceImpl { private MemberAuthService memberAuthService; @Resource private MemberService memberService; - @Resource - private MemberMoneyLogService memberMoneyLogService; + private VenuePriceMapper venuePriceMapper; /** * 创建订单 @@ -246,28 +250,52 @@ public class OrderService extends BaseServiceImpl { * @param memberId * @return */ - public OrderPaySignResponse.WechatPayParam createEnterVenueOrder(Integer venueId, Integer memberId,PayTypeEnum payTypeEnum,BigDecimal price){ + public OrderPaySignResponse.WechatPayParam createEnterVenueOrder(Integer venueId, Integer memberId, PayTypeEnum payTypeEnum, BigDecimal price){ Venue venue = venueMapper.findById(venueId); if (venue == null) { throw new ServiceException("未找到该场馆"); } + Member member = memberService.findById(memberId); + memberService.verify(member); + + // 判断用户是否使用微信登录 + MemberAuth memberAuth = memberAuthService.findByMemberId(memberId); + if (memberAuth == null){ + throw new ServiceException(ExceptionCodeTemplate.BUY_ERROR); + } + + List priceList = venuePriceMapper.findPrice(venueId); + if(priceList == null || priceList.size() <= 0) { + throw new ServiceException("价格非法!"); + } + boolean checkPrice = false; + for (VenuePrice venuePrice : priceList) { + if (price.divideAndRemainder(price)[1].compareTo(BigDecimal.ZERO) == 0) { + // 取余数为0 + checkPrice = true; + } + } + if (!checkPrice) { + throw new ServiceException("价格非法!"); + } //创建订单 Order order = new Order(); order.setOrderSn(createSn()); order.setPayType(payTypeEnum.value); order.setPrice(price); - order.setPayTime(new Date()); - order.setPayStatus(PayStatusEnum.PAYED.value); + order.setPayStatus(PayStatusEnum.NOT_PAY.value); order.setType(OrderTypeEnum.BASKETBALL_ORDER.value); order.setPlatformId(venue.getPlatformId()); order.setMemberId(memberId); + order.setParentOrderId(venueId); /** 篮球入场这里输入场馆ID */ orderMapper.insert(order); //扣除用户余额 目前篮球订单不支持余额支付 // if(payTypeEnum.value.equals(PayTypeEnum.BALANCE.value)) { // memberMoneyLogService.create(memberId, venue.getPlatformId(), MoneyLogEnum.JOIN.value, price.negate(), PayTypeEnum.BALANCE.value, null, venue.getId(), venue.getType(), null); // } - OrderPaySignResponse.WechatPayParam wechatPayParam = memberCardOrderService.createUnifiedOrder(order.getOrderSn(), memberId,"ip","入场结算订单"); + OrderPaySignResponse.WechatPayParam wechatPayParam = memberCardOrderService.createUnifiedOrder(order.getOrderSn(), memberId, RequestUtils.getIp(),"入场结算订单"); return wechatPayParam; } + } diff --git a/service/src/main/java/com/sv/service/api/VenueEnterService.java b/service/src/main/java/com/sv/service/api/VenueEnterService.java new file mode 100644 index 0000000..28b338d --- /dev/null +++ b/service/src/main/java/com/sv/service/api/VenueEnterService.java @@ -0,0 +1,260 @@ +package com.sv.service.api; + +import com.enums.*; +import com.github.pagehelper.PageHelper; +import com.sv.dto.BasketEnterResult; +import com.sv.dto.api.MemberCardDTO; +import com.sv.dto.api.MemberCardVenuesDTO; +import com.sv.dto.api.VenueDTO; +import com.sv.entity.*; +import com.sv.exception.api.ExceptionCodeTemplate; +import com.sv.mapper.BarcodeOrderTimeMapper; +import com.sv.mapper.VenueMapper; +import com.sv.service.api.util.DateUtilCard; +import com.sv.service.api.util.GeoHashUtils; +import com.ydd.framework.core.common.Pagination; +import com.ydd.framework.core.common.utils.ValidationUtils; +import com.ydd.framework.core.exception.ServiceException; +import com.ydd.framework.core.service.impl.BaseServiceImpl; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * Service - 场馆 + * + * @author zuojie.Liang + * @since 2018-08-02 + */ +@Transactional +@Component +public class VenueEnterService extends BaseServiceImpl { + + private final Logger logger = LoggerFactory.getLogger(VenueEnterService.class); + + @Resource + private VenueMapper venueMapper; + + @Resource + private MemberCardService memberCardService; + + @Resource + private MemberService memberService; + + @Resource + private MemberEnterVenueLogService memberEnterVenueLogService; + + @Resource + private MemberMoneyLogService memberMoneyLogService; + @Resource + private VenuePriceService venuePriceService; + @Resource + BarcodeOrderTimeMapper barcodeOrderTimeMapper; + + /** + * api 接口 + * 我要进场 + */ + public BasketEnterResult join(Integer memberId, Integer venueId) { + BasketEnterResult basketEnterResult = new BasketEnterResult(); + basketEnterResult.setFlg(0); + // 判断用户是否登录 + if (memberId == null) { + throw new ServiceException(com.ydd.framework.core.exception.ExceptionCodeTemplate.NEED_LOGIN); + } + //参数校验 + ValidationUtils.assertNotNull(venueId); + // 2. 查询该场馆需要的费用,并比较用户余额是否足够 + // 查询当前时间内,场馆对应的价格 + String time = DateUtilCard.nowTime().toString(); + Venue venue = venueMapper.findById(venueId); + VenuePrice venuePrice = venuePriceService.findPrice(venueId, time); + if (venuePrice == null) { + throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); + } + BigDecimal price = venuePrice.getPrice(); + if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){ + // 按时入场余额需要包含两个小时的场地费 + price = price.multiply(new BigDecimal(2)); + } + if (venuePrice == null) { + throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); + } + int effOrder = barcodeOrderTimeMapper.findEffOrder(new Date(), memberId, venueId); + if (effOrder <= 0) { + if (price.compareTo(BigDecimal.ZERO) > 0) { + basketEnterResult.setFlg(2); + basketEnterResult.setMsg("订单金额"+ price + "元,请确认!"); + basketEnterResult.setMoney(price); + }else { + // 不需要交钱,则不需要微信支付,直接展示二维码 + Integer timePayHour = 2; + if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){ + // 按次入场先收钱,且多久不收钱,出场不收钱 + // 该用户上次订单的是否逾期 + timePayHour = venue.getTimePayHour(); + if (timePayHour == null) { + timePayHour = 4; + } + } + createBarcodeTimeOrder(memberId,venueId,timePayHour,"000"); + } + } else { + // 还沿用原来订单 + BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); + if (lastOrder != null) { + lastOrder.setPaying(0); + lastOrder.setModifiedTime(new Date()); + barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + } + } + // 3.判断用户有没有人脸识别的图像,根据用户ID查找,一个用户只能有一条 +// MemberFaceInfo memberFaceInfo = memberFaceInfoService.findByMemberId(memberId); +// if (memberFaceInfo == null) { +// flag = 1; +// return flag; +// } + return basketEnterResult; + } + + /** + * 我要出场 + * @param memberId + * @param venueId + * @return + */ + 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); + String enterTime = DateUtilCard.getTimeFromDate(lastOrder.getOrderStart()); + Date dateNow = new Date(); + if (dateNow.after(lastOrder.getOrderEnd())) { + // 当前时间已经超过订单结束日期,则该订单需要重新补收费 + // 取入场的价格 + VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime); + if (venuePriceEnter == null) { + throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); + } + // 按时出场选择按照分钟四舍五入到角扣款 + price = venuePriceEnter.getPrice(); + int minutes = DateUtilCard.diffMinute(lastOrder.getOrderStart(), dateNow); + int hours = (minutes - 1) / 60; + // 需要补收的价格 + price = price.multiply(new BigDecimal(hours - 1)); + if (price.compareTo(BigDecimal.ZERO) > 0 ) { + result.setFlg(2); + result.setMoney(price); + result.setMsg("您此次入场超过2小时,需补交" + price + "元"); + } else { + // 不需要补交钱且需要退钱 + lastOrder.setPaying(1); + lastOrder.setPayMoney(price.intValue()); + lastOrder.setModifiedTime(new Date()); + barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + result.setFlg(888); + result.setMsg("如要继续订单,请在10分钟内进入,否则将结束订单"); + } + } + } + return result; + } + + // 记录入场记录 + /** + * + * @param type + * @param price + * @param memberId + * @param platformId + * @param payType + * @param cardType + * @param venueId + * @param venueType + */ + public void createMemberMoneyLog(Integer type, BigDecimal price, Integer memberId, Integer platformId, Integer payType, String cardType, + Integer venueId, Integer venueType) { + memberMoneyLogService.create(memberId,platformId == null ? 1 : platformId,type,price.negate(),payType,cardType,venueId,venueType,null); + } + + public void addNumber(Integer venueId, Integer number, Integer memberId) { + if (number > 0 && venueMapper.countByMember(memberId, venueId) <= 0) { + venueMapper.addNumber(number, venueId); + venueMapper.addMember(memberId, venueId); + } else if (number < 0 && venueMapper.countByMember(memberId, venueId) > 0) { + venueMapper.addNumber(number, venueId); + venueMapper.deleteMember(memberId, venueId); + } + } + + /** + * 按次入场订单入库 + * @param memberId + * @param venueId + * @param timePayHour + */ + private void createBarcodeTimeOrder(Integer memberId, Integer venueId, Integer timePayHour,String orderSn) { + Date startDate = new Date(); + Date endDate = DateUtilCard.addHours(startDate, timePayHour); + // 如果是一个小时,则默认给15分钟宽限期 + if (timePayHour == 1) { + endDate = DateUtilCard.addMinute(endDate,15); + } + BarcodeOrderTime barcodeOrderTime = new BarcodeOrderTime(); + barcodeOrderTime.setMemberId(memberId); + barcodeOrderTime.setVenueId(venueId); + barcodeOrderTime.setOrderStart(startDate); + barcodeOrderTime.setOrderEnd(endDate); + barcodeOrderTime.setStatus(BarCodeStatusEnum.INIT.getValue()); + barcodeOrderTime.setOrderSn(orderSn); + barcodeOrderTimeMapper.insert(barcodeOrderTime); + } + + /** + * 支付成功 + * @param order + */ + public void paySuccess(Order order) { + Integer memberId = order.getMemberId(); + Integer venueId = order.getParentOrderId(); + Venue venue = venueMapper.findById(venueId); + createMemberMoneyLog(MoneyLogEnum.JOIN.value, order.getPrice(), memberId, order.getPlatformId(), PayTypeEnum.WEI_XIN.value, null,venue.getId(), venue.getType()); + Integer timePayHour = 2; + if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){ + // 按次入场先收钱,且多久不收钱,出场不收钱 + // 该用户上次订单的是否逾期 + timePayHour = venue.getTimePayHour(); + if (timePayHour == null) { + timePayHour = 4; + } + } + createBarcodeTimeOrder(memberId,venueId,timePayHour,order.getOrderSn()); + } +} 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 3ae453a..77c599c 100644 --- a/service/src/main/java/com/sv/service/api/VenueService.java +++ b/service/src/main/java/com/sv/service/api/VenueService.java @@ -210,193 +210,6 @@ public class VenueService extends BaseServiceImpl { return venueDTOS; } - /** - * api 接口 - * 我要进场 - */ - @Transactional(rollbackFor = Exception.class) - public BasketEnterResult join(Integer memberId, Integer venueId) { - BasketEnterResult basketEnterResult = new BasketEnterResult(); - basketEnterResult.setFlg(0); - // 判断用户是否登录 - if (memberId == null) { - throw new ServiceException(com.ydd.framework.core.exception.ExceptionCodeTemplate.NEED_LOGIN); - } - //参数校验 - ValidationUtils.assertNotNull(venueId); - // 1.判断用户有没有该馆的会员卡(有效期内,如果有免费卡和别的卡,优先使用别的卡),有不判断余额 - List memberCards = memberCardService.findByMemberId(venueId, memberId); - // 2. 查询该场馆需要的费用,并比较用户余额是否足够 - // 查询当前时间内,场馆对应的价格 - String time = DateUtilCard.nowTime().toString(); - Venue venue = venueMapper.findById(venueId); - VenuePrice venuePrice = venuePriceService.findPrice(venueId, time); - if (venuePrice == null) { - throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); - } - BigDecimal price = venuePrice.getPrice(); - if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){ - // 按时入场余额需要包含两个小时的场地费 - price = price.multiply(new BigDecimal(2)); - } - if (venuePrice == null) { - throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); - } - if (memberCards.size() == 0) { - Member member = memberService.findById(memberId); - if (member.getMoney().compareTo(price) == -1) { - basketEnterResult.setFlg(2); -// if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){ -// // 按时入场余额需要包含两个小时的场地费 -// barCodeResult.setMsg("请保证账户至少有两个小时余额:" + price + "元,余额不足,请先充值"); -// }else { -// barCodeResult.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值"); -// } - basketEnterResult.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值"); - return basketEnterResult; - } - Integer timePayHour = 1; - if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){ - // 按次入场先收钱,且多久不收钱,出场不收钱 - // 该用户上次订单的是否逾期 - timePayHour = venue.getTimePayHour(); - if (timePayHour == null) { - timePayHour = 4; - } - } - int effOrder = barcodeOrderTimeMapper.findEffOrder(new Date(), memberId, venueId); - if (effOrder <= 0) { - // 单次订单已超时 需要重新付费 - synchronized (("scancode-in" + memberId).intern()) { - if (memberService.isMoneyEnough(memberId, price)) { - logger.info("用户" + memberId + "使用余额核销订单"); - createBarcodeTimeOrder(memberId,venueId,timePayHour); - createMemberMoneyLog(MoneyLogEnum.JOIN.value, price, memberId, 1, PayTypeEnum.BALANCE.value, null, - venue.getId(), venue.getType()); - } else { - //余额不足 - logger.error("用户" + memberId + "余额不足核销失败"); - basketEnterResult.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值"); - } - } - } - } - // 3.判断用户有没有人脸识别的图像,根据用户ID查找,一个用户只能有一条 -// MemberFaceInfo memberFaceInfo = memberFaceInfoService.findByMemberId(memberId); -// if (memberFaceInfo == null) { -// flag = 1; -// return flag; -// } - return basketEnterResult; - } - - /** - * 我要出场 - * @param memberId - * @param venueId - * @return - */ - @Transactional(rollbackFor = Exception.class) - 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); - synchronized (("scancode-out" + memberId).intern()) { - // 查询当前时间内,场馆对应的价格(健身房没有价格) - Member member = memberService.findByMember(memberId); - memberService.verify(member); - //进场之前 查看是否有会员卡 - List cards = memberCardService.findByMemberId(venue.getId(), member.getId()); - if (cards.size() > 0) { - MemberCard useCard = null; - //有会员卡 查看是否有免费卡 - List freeCard = cards.stream().filter(free -> VipTypeEnum.FREECARD.value.equals(free.getCardType())).collect(Collectors.toList()); - //有会员卡 查看是否有单次卡 - List 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() + "核销"); - // 会员卡入场,增加记录 - createMemberMoneyLog(MoneyLogEnum.JOIN.value, venue.getPrice(), member.getId(), member.getPlatformId(), PayTypeEnum.MEMBER_CARD.value, useCard.getCardType(), - venue.getId(), venue.getType()); - // 如果是单次卡,清除单次卡 - if (VipTypeEnum.ONCECARD.value.equals(useCard.getCardType()) - || VipTypeEnum.PUB_ONCECARD.value.equals(useCard.getCardType())){ - memberCardService.delete(useCard.getId()); - } - }else { - //查无可用会员卡 - logger.info("用户" + member.getNickname() + "您好!请先购买会员卡再出场核销"); - result.setFlg(1); - result.setMsg("未查询到会员卡,请先购买会员卡"); - } - }else { - /** - * 篮球出场核心逻辑 - */ - //判断余额是否够 - // 1、找到入场时间 - if(PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){ - // 按次出场不扣钱 - BigDecimal price = BigDecimal.ZERO; - BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); - String enterTime = DateUtilCard.getTimeFromDate(lastOrder.getOrderStart()); - Date dateNow = new Date(); - if (dateNow.after(lastOrder.getOrderEnd())) { - // 当前时间已经超过订单结束日期,则该订单需要重新补收费 - // 取入场的价格 - VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime); - if (venuePriceEnter == null) { - throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); - } - // 按时出场选择按照分钟四舍五入到角扣款 - price = venuePriceEnter.getPrice(); - int minutes = DateUtilCard.diffMinute(lastOrder.getOrderStart(), dateNow); - int hours = (minutes - 1) / 60; - // 需要补收的价格 - price = price.multiply(new BigDecimal(hours)); - if (memberService.isMoneyEnough(member.getId(), price)) { - logger.info("用户" + member.getId() + "使用余额核销订单"); - createMemberMoneyLog(MoneyLogEnum.JOIN.value, price, member.getId(), member.getPlatformId(), PayTypeEnum.BALANCE.value, null, - venue.getId(), venue.getType()); - } else { - //余额不足 - logger.error("用户" + member.getId() + "需补交金额,余额不足核销失败"); - result.setFlg(2); - result.setMsg("您此次入场超过一小时,需补交" + price + "元,余额不足,请先充值"); - } - } - } - } - } - return result; - } - /** * api * 查询我的会员卡 @@ -444,45 +257,5 @@ public class VenueService extends BaseServiceImpl { return StringUtils.isNotBlank(longitude) && StringUtils.isNotBlank(latitude); } - // 记录入场记录 - @Transactional - public void createMemberMoneyLog(Integer type, BigDecimal price, Integer memberId, Integer platformId, Integer payType, String cardType, - Integer venueId, Integer venueType) { - memberMoneyLogService.create(memberId,platformId == null ? 1 : platformId,type,price.negate(),payType,cardType,venueId,venueType,null); - } - - - /** - * 按次入场订单入库 - * @param memberId - * @param venueId - * @param timePayHour - */ - private void createBarcodeTimeOrder(Integer memberId, Integer venueId, Integer timePayHour) { - Date startDate = new Date(); - Date endDate = DateUtilCard.addHours(startDate, timePayHour); - // 如果是一个小时,则默认给15分钟宽限期 - if (timePayHour == 1) { - endDate = DateUtilCard.addMinute(endDate,15); - } - BarcodeOrderTime barcodeOrderTime = new BarcodeOrderTime(); - barcodeOrderTime.setMemberId(memberId); - barcodeOrderTime.setVenueId(venueId); - barcodeOrderTime.setOrderStart(startDate); - barcodeOrderTime.setOrderEnd(endDate); - barcodeOrderTime.setStatus(BarCodeStatusEnum.INIT.getValue()); - barcodeOrderTimeMapper.insert(barcodeOrderTime); - } - - @Transactional(rollbackFor = Exception.class) - public void addNumber(Integer venueId, Integer number, Integer memberId) { - if (number > 0 && venueMapper.countByMember(memberId, venueId) <= 0) { - venueMapper.addNumber(number, venueId); - venueMapper.addMember(memberId, venueId); - } else if (number < 0 && venueMapper.countByMember(memberId, venueId) > 0) { - venueMapper.addNumber(number, venueId); - venueMapper.deleteMember(memberId, venueId); - } - } } diff --git a/service/src/main/java/com/sv/service/api/config/WechatPayService.java b/service/src/main/java/com/sv/service/api/config/WechatPayService.java index f00c44a..22b181f 100644 --- a/service/src/main/java/com/sv/service/api/config/WechatPayService.java +++ b/service/src/main/java/com/sv/service/api/config/WechatPayService.java @@ -50,6 +50,8 @@ public class WechatPayService extends BaseServiceImpl { private MemberLessonTicketService memberLessonTicketService; @Resource private MemberRefundService memberRefundService; + @Resource + private VenueEnterService venueEnterService; /** * 创建微信支付的统一订单 @@ -175,6 +177,11 @@ public class WechatPayService extends BaseServiceImpl { memberLessonTicketService.paySuccess(order); } + //篮球入场订单 + if (order.getType().intValue() == OrderTypeEnum.BASKETBALL_ORDER.value){ + venueEnterService.paySuccess(order); + } + } } } diff --git a/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml b/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml index 0d98f87..e2fbec4 100644 --- a/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml +++ b/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml @@ -11,13 +11,16 @@ + + + - id, member_id, venue_id, created_time, modified_time, order_start, order_end, status + id, member_id, venue_id, created_time, modified_time, order_start, order_end, status, paying, pay_money, order_sn @@ -149,4 +182,11 @@ where status = 0 and order_end <= #{currentDate} - \ No newline at end of file + + +