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 3996c15..ecf3e4c 100644 --- a/api/src/main/java/com/sv/api/controller/VenueController.java +++ b/api/src/main/java/com/sv/api/controller/VenueController.java @@ -185,7 +185,7 @@ public class VenueController extends BaseApiController { * @return */ @RequestMapping(value = "/venue/generate/barcode", method = RequestMethod.POST) - public ResponseDTO generateBarcode(@RequestParam("orderSn") String orderSn,@RequestParam("venueId") Integer venueId,Integer enterFlag) { + public ResponseDTO generateBarcode(@RequestParam("orderSn") String orderSn,@RequestParam("venueId") Integer venueId,@RequestParam("enterFlag")Integer enterFlag) { Device byDevice = deviceService.findByDevice(venueId); if (byDevice == null) { throw new ServiceException("门禁通讯异常"); @@ -209,7 +209,7 @@ public class VenueController extends BaseApiController { */ @RequestMapping(value = "/venue/basketball/pay", method = RequestMethod.POST) @AccessToken - public ResponseDTO basketPay(@RequestParam("venueId") Integer venueId,@RequestParam("payMoney") Double payMoney){ + public ResponseDTO basketPay(@RequestParam("venueId") Integer venueId,@RequestParam("enterFlag")Integer enterFlag,@RequestParam("payMoney") Double payMoney){ Device byDevice = deviceService.findByDevice(venueId); if (byDevice == null) { throw new ServiceException("门禁通讯异常"); @@ -221,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(payMoney))); + addAttribute("pay",orderService.createEnterVenueOrder(venueId, memberId, enterFlag, PayTypeEnum.WEI_XIN, new BigDecimal(payMoney))); } } diff --git a/other/sql/202312.sql b/other/sql/202312.sql index 9d99ec7..56cc9a0 100644 --- a/other/sql/202312.sql +++ b/other/sql/202312.sql @@ -27,6 +27,6 @@ CREATE TABLE `sv_member_enter_status` ( ALTER TABLE sv_barcode 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 `paying` int(11) NULL COMMENT '入场 paying = 0 出场未结算 paying = 1 出场补交费用已补交 paying = 2' 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 9bf7b62..598082b 100644 --- a/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java +++ b/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java @@ -23,6 +23,8 @@ public interface BarcodeOrderTimeMapper { BarcodeOrderTime findLastOrder(@Param("memberId") Integer memberId, @Param("venueId") Integer venueId); + BarcodeOrderTime findLastOrderBySn(@Param("memberId") Integer memberId, @Param("venueId") Integer venueId,@Param("orderSn") String orderSn); + List endOrderList(@Param("currentDate") Date currentDate); List needPayOrderList(); diff --git a/service/src/main/java/com/sv/mapper/OrderMapper.java b/service/src/main/java/com/sv/mapper/OrderMapper.java index 6ce421e..111bde1 100644 --- a/service/src/main/java/com/sv/mapper/OrderMapper.java +++ b/service/src/main/java/com/sv/mapper/OrderMapper.java @@ -90,8 +90,10 @@ public interface OrderMapper { */ void updatePrepayId(@Param("orderSn") String orderSn,@Param("prepayId") String prepayId); + Order findLastOrder(@Param("memberId") Integer memberId); + /** * api 根据订单编号查询总价钱 */ Order findByOrderSn(String orderSn); -} \ No newline at end of file +} 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 e4b92af..4076ebb 100644 --- a/service/src/main/java/com/sv/service/api/OrderService.java +++ b/service/src/main/java/com/sv/service/api/OrderService.java @@ -1,9 +1,6 @@ package com.sv.service.api; -import com.enums.BarCodeStatusEnum; -import com.enums.OrderPayEnum; -import com.enums.OrderTypeEnum; -import com.enums.PayTypeEnum; +import com.enums.*; import com.github.pagehelper.PageHelper; import com.sv.dto.api.wechat.BaseResult; import com.sv.dto.api.wechat.OrderPaySignResponse; @@ -63,6 +60,8 @@ public class OrderService extends BaseServiceImpl { private MemberService memberService; @Resource private VenuePriceMapper venuePriceMapper; + @Resource + private BarcodeOrderTimeMapper barcodeOrderTimeMapper; /** * 创建订单 @@ -250,7 +249,7 @@ 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, Integer enterFlag,PayTypeEnum payTypeEnum, BigDecimal price){ Venue venue = venueMapper.findById(venueId); if (venue == null) { throw new ServiceException("未找到该场馆"); @@ -288,11 +287,23 @@ public class OrderService extends BaseServiceImpl { order.setPlatformId(venue.getPlatformId()); order.setMemberId(memberId); order.setParentOrderId(venueId); /** 篮球入场这里输入场馆ID */ + order.setCreatedId(enterFlag); /** 篮球入场这里输入出场结算还是入场结算 */ 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); // } + if (EnterEnum.OUT.value == enterFlag) { + // 出场的话,将出场的订单设定 未结算 支付金额为 -1 , 这样批处理不会被结算,需要支付回调处理 + BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); + if (lastOrder != null) { + lastOrder.setPaying(1); + lastOrder.setPayMoney(-1); + lastOrder.setOrderSn(order.getOrderSn()); + lastOrder.setModifiedTime(new Date()); + barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + } + } 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 index 28b338d..88a9752 100644 --- a/service/src/main/java/com/sv/service/api/VenueEnterService.java +++ b/service/src/main/java/com/sv/service/api/VenueEnterService.java @@ -9,6 +9,7 @@ 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.OrderMapper; import com.sv.mapper.VenueMapper; import com.sv.service.api.util.DateUtilCard; import com.sv.service.api.util.GeoHashUtils; @@ -16,6 +17,7 @@ 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 com.ydd.oms.entity.enums.PayStatusEnum; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,22 +45,17 @@ public class VenueEnterService extends BaseServiceImpl { @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; + @Resource + OrderMapper orderMapper; + /** * api 接口 @@ -86,12 +83,10 @@ public class VenueEnterService extends BaseServiceImpl { // 按时入场余额需要包含两个小时的场地费 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) { + checkOrderPaying(memberId); basketEnterResult.setFlg(2); basketEnterResult.setMsg("订单金额"+ price + "元,请确认!"); basketEnterResult.setMoney(price); @@ -110,11 +105,11 @@ public class VenueEnterService extends BaseServiceImpl { } } else { // 还沿用原来订单 - BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); - if (lastOrder != null) { - lastOrder.setPaying(0); - lastOrder.setModifiedTime(new Date()); - barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + BarcodeOrderTime lastEnterOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); + if (lastEnterOrder != null) { + lastEnterOrder.setPaying(0); + lastEnterOrder.setModifiedTime(new Date()); + barcodeOrderTimeMapper.updateByPrimaryKey(lastEnterOrder); } } // 3.判断用户有没有人脸识别的图像,根据用户ID查找,一个用户只能有一条 @@ -156,7 +151,7 @@ public class VenueEnterService extends BaseServiceImpl { BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); String enterTime = DateUtilCard.getTimeFromDate(lastOrder.getOrderStart()); Date dateNow = new Date(); - if (dateNow.after(lastOrder.getOrderEnd())) { + if (dateNow.after(lastOrder.getOrderEnd()) && 2 != lastOrder.getPaying()) { // 当前时间已经超过订单结束日期,则该订单需要重新补收费 // 取入场的价格 VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime); @@ -170,6 +165,7 @@ public class VenueEnterService extends BaseServiceImpl { // 需要补收的价格 price = price.multiply(new BigDecimal(hours - 1)); if (price.compareTo(BigDecimal.ZERO) > 0 ) { + checkOrderPaying(memberId); result.setFlg(2); result.setMoney(price); result.setMsg("您此次入场超过2小时,需补交" + price + "元"); @@ -187,6 +183,19 @@ public class VenueEnterService extends BaseServiceImpl { return result; } + /** + * 用户五分钟内有过微信支付,不能在结果未出来之前就让用户付款 + * @param memberId + */ + private void checkOrderPaying(Integer memberId) { + Order mOrder = orderMapper.findLastOrder(memberId); + // 有未支付的订单,且订单未超过五分钟未支付 + int diffMinute = DateUtilCard.diffMinute(mOrder.getModifiedTime(), new Date()); + if (mOrder != null && PayStatusEnum.NOT_PAY.value == mOrder.getPayStatus() && diffMinute < 5) { + throw new ServiceException("您有处理中的订单,或刚刚取消支付,请稍后再试"); + } + } + // 记录入场记录 /** * @@ -242,19 +251,30 @@ public class VenueEnterService extends BaseServiceImpl { * @param order */ public void paySuccess(Order order) { + // order.getCreatedId() 如果等于1 则是出场的付费 + Integer enterFlag = order.getCreatedId(); 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; + if (EnterEnum.OUT.value != enterFlag) { + Integer timePayHour = 2; + if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){ + // 按次入场先收钱,且多久不收钱,出场不收钱 + // 该用户上次订单的是否逾期 + timePayHour = venue.getTimePayHour(); + if (timePayHour == null) { + timePayHour = 4; + } + } + createBarcodeTimeOrder(memberId,venueId,timePayHour,order.getOrderSn()); + } else { + BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrderBySn(memberId, venueId,order.getOrderSn()); + if (lastOrder != null) { + lastOrder.setPaying(2); + lastOrder.setModifiedTime(new Date()); + barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); } } - createBarcodeTimeOrder(memberId,venueId,timePayHour,order.getOrderSn()); } } 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 22b181f..b7ccf98 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 @@ -146,6 +146,10 @@ public class WechatPayService extends BaseServiceImpl { if (params.get("result_code").equals("SUCCESS")) { String orderSn = params.get("out_trade_no"); Order order = orderService.findOrderSn(orderSn,null); + if (order == null) { + logger.error("找不到订单号!!!!!!!!!" + orderSn); + return; + } if (order.getPayStatus().intValue() > 0) { //已支付 不需要在判断 return; diff --git a/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml b/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml index e2fbec4..56b8c55 100644 --- a/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml +++ b/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml @@ -157,7 +157,7 @@ status = #{status,jdbcType=INTEGER}, paying = #{paying,jdbcType=INTEGER}, pay_money = #{payMoney,jdbcType=INTEGER} - order_sn = #{orderSn,jdbcType=INTEGER} + order_sn = #{orderSn,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} @@ -175,6 +175,15 @@ order by order_end desc LIMIT 1 + + - + @@ -285,7 +285,7 @@ - + UPDATE @@ -308,7 +308,7 @@ #{item} - + UPDATE @@ -368,7 +368,7 @@ WHERE id = #{id} - + - \ No newline at end of file + + +