fix - 篮球入场出场逻辑优化、丢弃二维码的逻辑、优化入场出场锁逻辑。

This commit is contained in:
2026-06-13 23:36:42 +08:00
parent 8cfe0ef7d8
commit cdb2543436
6 changed files with 174 additions and 163 deletions

View File

@@ -117,7 +117,6 @@ public class VenueController extends BaseApiController {
* @param orderSn 订单号 * @param orderSn 订单号
* @return * @return
*/ */
@Deprecated
@RequestMapping(value = "/member/isPayed", method = RequestMethod.POST) @RequestMapping(value = "/member/isPayed", method = RequestMethod.POST)
public ResponseDTO isPayed(@RequestParam("orderSn") String orderSn) { public ResponseDTO isPayed(@RequestParam("orderSn") String orderSn) {
Integer memberId = getMemberIdByAccessToken(); Integer memberId = getMemberIdByAccessToken();
@@ -153,7 +152,7 @@ public class VenueController extends BaseApiController {
logger.warn("[入场] memberId={}, venueId={}, 门锁被占用 doorSn={}", memberId, venueId, doorSn); logger.warn("[入场] memberId={}, venueId={}, 门锁被占用 doorSn={}", memberId, venueId, doorSn);
throw new ServiceException("有人正在使用门禁,请稍后再试"); throw new ServiceException("有人正在使用门禁,请稍后再试");
} }
join = venueEnterService.join(memberId, venueId); join = venueEnterService.join(memberId, venueId,doorSn);
logger.info("[入场] 结果 memberId={}, venueId={}, flg={}, msg={}, orderSn={}", logger.info("[入场] 结果 memberId={}, venueId={}, flg={}, msg={}, orderSn={}",
memberId, venueId, join.getFlg(), join.getMsg(), join.getOrderSn()); memberId, venueId, join.getFlg(), join.getMsg(), join.getOrderSn());
return ResponseDTO.ok().addAttribute("join", join); return ResponseDTO.ok().addAttribute("join", join);
@@ -183,7 +182,7 @@ public class VenueController extends BaseApiController {
logger.warn("[出场] memberId={}, venueId={}, 门锁被占用 doorSn={}", memberId, venueId, doorSn); logger.warn("[出场] memberId={}, venueId={}, 门锁被占用 doorSn={}", memberId, venueId, doorSn);
throw new ServiceException("有人正在使用门禁,请稍后再试"); throw new ServiceException("有人正在使用门禁,请稍后再试");
} }
out = venueEnterService.out(memberId, venueId); out = venueEnterService.out(memberId, venueId,doorSn);
logger.info("[出场] 结果 memberId={}, venueId={}, flg={}, msg={}, orderSn={}", logger.info("[出场] 结果 memberId={}, venueId={}, flg={}, msg={}, orderSn={}",
memberId, venueId, out.getFlg(), out.getMsg(), out.getOrderSn()); memberId, venueId, out.getFlg(), out.getMsg(), out.getOrderSn());
return ResponseDTO.ok().addAttribute("out", out); return ResponseDTO.ok().addAttribute("out", out);
@@ -198,7 +197,7 @@ public class VenueController extends BaseApiController {
@RequestMapping(value = "/venue/generate/barcode", method = RequestMethod.POST) @RequestMapping(value = "/venue/generate/barcode", method = RequestMethod.POST)
public ResponseDTO generateBarcode(@RequestParam("orderSn") String orderSn,@RequestParam("venueId") Integer venueId,@RequestParam("enterFlag")Integer enterFlag) { public ResponseDTO generateBarcode(@RequestParam("orderSn") String orderSn,@RequestParam("venueId") Integer venueId,@RequestParam("enterFlag")Integer enterFlag) {
Integer memberId = getMemberIdByAccessToken(); Integer memberId = getMemberIdByAccessToken();
logger.info("[生成二维码] memberId={}, venueId={}, orderSn={}, enterFlag={}", memberId, venueId, orderSn, enterFlag); logger.info("[真正进场] memberId={}, venueId={}, orderSn={}, enterFlag={}", memberId, venueId, orderSn, enterFlag);
Device byDevice = deviceService.findByDevice(venueId); Device byDevice = deviceService.findByDevice(venueId);
if (byDevice == null) { if (byDevice == null) {
throw new ServiceException("门禁通讯异常"); throw new ServiceException("门禁通讯异常");

View File

@@ -1,9 +1,12 @@
package com.sv.wx; package com.sv.wx;
import com.WeiXinApplication; import com.WeiXinApplication;
import com.sv.entity.Order;
import com.sv.netty.netty.service.MessageService; import com.sv.netty.netty.service.MessageService;
import com.sv.service.api.OrderService;
import com.sv.service.api.VenueEnterService; import com.sv.service.api.VenueEnterService;
import com.sv.service.common.DoorLockUtil; import com.sv.service.common.DoorLockUtil;
import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
@@ -17,10 +20,18 @@ public class VenueJoinTest {
@Resource @Resource
VenueEnterService venueEnterService; VenueEnterService venueEnterService;
@Resource @Resource
MessageService messageService; OrderService orderService;
@Resource
DoorLockUtil doorLockUtil;
/**
* 给订单支付成功!
*/
@Test
public void test() {
String orderSn = "260613225858443661";
Order order = orderService.findOrderSn(orderSn,null);
orderService.paySuccess(order.getId(),"testggg");
venueEnterService.paySuccess(order);
}
} }

View File

@@ -34,53 +34,53 @@ public class ListenKeyFrame {
// frame.add(jTextField); // 注释 // frame.add(jTextField); // 注释
// frame.add(buttonSubmit); // 注释 // frame.add(buttonSubmit); // 注释
// frame.add(buttonPlay); // 播放音乐的可注释 // frame.add(buttonPlay); // 播放音乐的可注释
frame.setFocusableWindowState(true); // frame.setFocusableWindowState(true);
frame.setAlwaysOnTop(true); // frame.setAlwaysOnTop(true);
// frame.setExtendedState(JFrame.MAXIMIZED_BOTH); //最大化 // frame.setExtendedState(JFrame.MAXIMIZED_BOTH); //最大化
frame.setFocusTraversalKeysEnabled(false); // frame.setFocusTraversalKeysEnabled(false);
frame.addWindowListener(new WindowAdapter() { // frame.addWindowListener(new WindowAdapter() {
@Override // @Override
public void windowClosing(WindowEvent e) { // public void windowClosing(WindowEvent e) {
frame.setExtendedState(JFrame.NORMAL); // frame.setExtendedState(JFrame.NORMAL);
frame.setFocusable(true); // frame.setFocusable(true);
frame.setVisible(true); // frame.setVisible(true);
} // }
//
@Override // @Override
public void windowIconified(WindowEvent e) { // public void windowIconified(WindowEvent e) {
frame.setExtendedState(JFrame.NORMAL); // frame.setExtendedState(JFrame.NORMAL);
frame.setFocusable(true); // frame.setFocusable(true);
frame.setVisible(true); // frame.setVisible(true);
} // }
//
@Override // @Override
public void windowStateChanged(WindowEvent e) { // public void windowStateChanged(WindowEvent e) {
frame.setExtendedState(JFrame.NORMAL); // frame.setExtendedState(JFrame.NORMAL);
frame.setFocusable(true); // frame.setFocusable(true);
frame.setVisible(true); // frame.setVisible(true);
} // }
//
@Override // @Override
public void windowDeiconified(WindowEvent e) { // public void windowDeiconified(WindowEvent e) {
frame.setExtendedState(JFrame.NORMAL); // frame.setExtendedState(JFrame.NORMAL);
frame.setFocusable(true); // frame.setFocusable(true);
frame.setVisible(true); // frame.setVisible(true);
} // }
//
@Override // @Override
public void windowGainedFocus(WindowEvent e) { // public void windowGainedFocus(WindowEvent e) {
frame.setExtendedState(JFrame.NORMAL); // frame.setExtendedState(JFrame.NORMAL);
frame.setFocusable(true); // frame.setFocusable(true);
frame.setVisible(true); // frame.setVisible(true);
} // }
//
@Override // @Override
public void windowLostFocus(WindowEvent e) { // public void windowLostFocus(WindowEvent e) {
frame.setExtendedState(JFrame.NORMAL); // frame.setExtendedState(JFrame.NORMAL);
frame.setFocusable(true); // frame.setFocusable(true);
frame.setVisible(true); // frame.setVisible(true);
} // }
}); // });
frame.setFocusable(true); frame.setFocusable(true);
frame.setVisible(true); frame.setVisible(true);
} }

View File

@@ -24,11 +24,8 @@ import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -73,9 +70,6 @@ public class OrderService extends BaseServiceImpl {
@Resource @Resource
private MemberKeyLock memberKeyLock; private MemberKeyLock memberKeyLock;
@Resource
private PlatformTransactionManager transactionManager;
@Transactional @Transactional
public void save(Order order) { public void save(Order order) {
if (order.getId() != null && order.getId() > 0) { if (order.getId() != null && order.getId() > 0) {
@@ -218,23 +212,25 @@ public class OrderService extends BaseServiceImpl {
logger.warn("[篮球][下单] 价格非法 memberId={}, venueId={}, priceList为空", memberId, venueId); logger.warn("[篮球][下单] 价格非法 memberId={}, venueId={}, priceList为空", memberId, venueId);
throw new ServiceException("价格非法!"); throw new ServiceException("价格非法!");
} }
boolean checkPrice = false;
for (VenuePrice venuePrice : priceList) {
if (price.divideAndRemainder(price)[1].compareTo(BigDecimal.ZERO) == 0) {
checkPrice = true;
}
}
if (!checkPrice) {
logger.warn("[篮球][下单] 价格非法 memberId={}, venueId={}, price={}", memberId, venueId, price);
throw new ServiceException("价格非法!");
}
logger.info("[篮球][下单] 开始创建订单 memberId={}, venueId={}, enterFlag={}, price={}", memberId, venueId, enterFlag, price); logger.info("[篮球][下单] 开始创建订单 memberId={}, venueId={}, enterFlag={}, price={}", memberId, venueId, enterFlag, price);
synchronized (memberKeyLock.getLock(memberId)) { synchronized (memberKeyLock.getLock(memberId)) {
String orderSn;
Order pendingOrder = orderMapper.findPendingBasketballOrder(memberId, venueId); Order pendingOrder = orderMapper.findPendingBasketballOrder(memberId, venueId);
if (pendingOrder != null) { if (pendingOrder != null) {
logger.info("[篮球][下单] 存在待处理订单 memberId={}, orderSn={}", memberId, pendingOrder.getOrderSn()); orderSn = pendingOrder.getOrderSn();
if (EnterEnum.OUT.value == enterFlag) {
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId);
if(lastOrder == null || StringUtils.isEmpty(lastOrder.getOrderAddSn())){
logger.error("memberId={}, venueId={}, 出场的时候的订单有问题!!!",memberId,venueId);
} else {
if (!orderSn.equals(lastOrder.getOrderAddSn())){
logger.error("memberId={}, venueId={},这是重复下单怎么会生成新的orderNo呢orderSn={}, 应该的orderNo={}",
memberId, venueId, orderSn, lastOrder.getOrderAddSn());
}
}
}
logger.info("[篮球][下单] 存在待处理订单 memberId={}, mobile={}, orderSn={}", memberId,member.getMobile(), pendingOrder.getOrderSn());
OrderResponse wxResponse = wechatPayService.queryWechatOrder(pendingOrder.getOrderSn()); OrderResponse wxResponse = wechatPayService.queryWechatOrder(pendingOrder.getOrderSn());
if (wxResponse != null && wxResponse.isSuccess() && "SUCCESS".equals(wxResponse.getTradeState())) { if (wxResponse != null && wxResponse.isSuccess() && "SUCCESS".equals(wxResponse.getTradeState())) {
pendingOrder.setPayStatus(PayStatusEnum.PAYED.value); pendingOrder.setPayStatus(PayStatusEnum.PAYED.value);
@@ -242,81 +238,65 @@ public class OrderService extends BaseServiceImpl {
pendingOrder.setPayTime(new Date()); pendingOrder.setPayTime(new Date());
orderMapper.update(pendingOrder); orderMapper.update(pendingOrder);
venueEnterService.paySuccess(pendingOrder); venueEnterService.paySuccess(pendingOrder);
logger.info("[篮球][下单] 微信已支付成功 orderSn={}, tradeSn={}", pendingOrder.getOrderSn(), wxResponse.getTransactionId()); logger.info("[篮球][下单] memberId={}, mobile={},微信已支付成功 orderSn={}, tradeSn={}", memberId,member.getMobile(), pendingOrder.getOrderSn(), wxResponse.getTransactionId());
BasketballPayResult paidResult = new BasketballPayResult(); BasketballPayResult paidResult = new BasketballPayResult();
paidResult.setPaidFlag(true); paidResult.setPaidFlag(true);
paidResult.setOrderSn(pendingOrder.getOrderSn()); paidResult.setOrderSn(pendingOrder.getOrderSn());
return paidResult; return paidResult;
} }
OrderPaySignResponse.WechatPayParam wechatPayParam; OrderPaySignResponse.WechatPayParam wechatPayParam;
if (pendingOrder.getPrepayId() != null) { if (pendingOrder.getPrepayId() != null) {
wechatPayParam = wechatPayService.resignPayParam(pendingOrder.getOrderSn(), pendingOrder.getPrepayId()); wechatPayParam = wechatPayService.resignPayParam(pendingOrder.getOrderSn(), pendingOrder.getPrepayId());
logger.info("[篮球][下单] 复用prepayId orderSn={}", pendingOrder.getOrderSn()); logger.info("[篮球][下单] memberId={}, mobile={},复用prepayId orderSn={}",memberId,member.getMobile(), pendingOrder.getOrderSn());
} else { } else {
wechatPayParam = memberCardOrderService.createUnifiedOrder(pendingOrder.getOrderSn(), memberId, RequestUtils.getIp(), "入场结算订单"); wechatPayParam = memberCardOrderService.createUnifiedOrder(pendingOrder.getOrderSn(), memberId, RequestUtils.getIp(), "篮球结算订单");
logger.info("[篮球][下单] 重新统一下单 orderSn={}", pendingOrder.getOrderSn()); logger.info("[篮球][下单] memberId={}, mobile={},重新统一下单 orderSn={}", memberId,member.getMobile(), pendingOrder.getOrderSn());
} }
wechatPayParam.setOrderSn(pendingOrder.getOrderSn()); wechatPayParam.setOrderSn(pendingOrder.getOrderSn());
BasketballPayResult result = new BasketballPayResult(); BasketballPayResult result = new BasketballPayResult();
result.setPaidFlag(false); result.setPaidFlag(false);
result.setOrderSn(pendingOrder.getOrderSn()); result.setOrderSn(pendingOrder.getOrderSn());
result.setWechatPayParam(wechatPayParam); result.setWechatPayParam(wechatPayParam);
return result; return result;
} }else {
Order order = new Order();
order.setOrderSn(createSn());
order.setPayType(payTypeEnum.value);
order.setPrice(price);
order.setPayStatus(PayStatusEnum.NOT_PAY.value);
order.setType(OrderTypeEnum.BASKETBALL_ORDER.value);
order.setPlatformId(venue.getPlatformId());
order.setMemberId(memberId);
order.setParentOrderId(venueId);
order.setCreatedId(enterFlag);
orderMapper.insert(order);
orderSn = order.getOrderSn();
logger.info("[篮球][下单] 插入新订单 orderSn={}, memberId={},mobile={}, venueId={}, enterFlag={}",
order.getOrderSn(), memberId, member.getMobile(), venueId, enterFlag);
OrderPaySignResponse.WechatPayParam wechatPayParam = memberCardOrderService.createUnifiedOrder(order.getOrderSn(), memberId, RequestUtils.getIp(),"篮球结算订单");
wechatPayParam.setOrderSn(orderSn);
DefaultTransactionDefinition def = new DefaultTransactionDefinition(); if (EnterEnum.OUT.value == enterFlag) {
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId);
TransactionStatus txStatus = transactionManager.getTransaction(def); if (lastOrder != null) {
Order order; lastOrder.setPaying(1);
try { lastOrder.setPayMoney(new BigDecimal(-1));
order = orderMapper.findPendingBasketballOrder(memberId, venueId); lastOrder.setOrderAddSn(orderSn);
if (order == null) { lastOrder.setModifiedTime(new Date());
order = new Order(); barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder);
order.setOrderSn(createSn()); logger.info("[篮球][下单] memberId={}, mobile={},出场补费订单关联 lastOrderSn={}, addOrderSn={}",
order.setPayType(payTypeEnum.value); memberId, member.getMobile(),lastOrder.getOrderSn(), orderSn);
order.setPrice(price); } else {
order.setPayStatus(PayStatusEnum.NOT_PAY.value); logger.warn("[篮球][下单] 出场补费但未找到原始订单 memberId={}", memberId);
order.setType(OrderTypeEnum.BASKETBALL_ORDER.value); }
order.setPlatformId(venue.getPlatformId());
order.setMemberId(memberId);
order.setParentOrderId(venueId);
order.setCreatedId(enterFlag);
orderMapper.insert(order);
logger.info("[篮球][下单] 插入新订单 orderSn={}, memberId={}, venueId={}, enterFlag={}",
order.getOrderSn(), memberId, venueId, enterFlag);
} }
transactionManager.commit(txStatus);
} catch (RuntimeException e) {
transactionManager.rollback(txStatus);
logger.error("[篮球][下单] 事务异常 memberId={}, venueId={}", memberId, venueId, e);
throw e;
}
if (EnterEnum.OUT.value == enterFlag) { BasketballPayResult result = new BasketballPayResult();
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); result.setPaidFlag(false);
if (lastOrder != null) { result.setOrderSn(orderSn);
lastOrder.setPaying(1); result.setWechatPayParam(wechatPayParam);
lastOrder.setPayMoney(new BigDecimal(-1)); return result;
lastOrder.setOrderAddSn(order.getOrderSn());
lastOrder.setModifiedTime(new Date());
barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder);
logger.info("[篮球][下单] 出场补费订单关联 lastOrderSn={}, addOrderSn={}",
lastOrder.getOrderSn(), order.getOrderSn());
} else {
logger.warn("[篮球][下单] 出场补费但未找到原始订单 memberId={}", memberId);
}
} }
OrderPaySignResponse.WechatPayParam wechatPayParam = memberCardOrderService.createUnifiedOrder(order.getOrderSn(), memberId, RequestUtils.getIp(),"入场结算订单");
wechatPayParam.setOrderSn(order.getOrderSn());
BasketballPayResult result = new BasketballPayResult();
result.setPaidFlag(false);
result.setOrderSn(order.getOrderSn());
result.setWechatPayParam(wechatPayParam);
return result;
} }
} }

View File

@@ -10,20 +10,20 @@ import com.sv.exception.api.ExceptionCodeTemplate;
import com.sv.mapper.BarcodeOrderTimeMapper; import com.sv.mapper.BarcodeOrderTimeMapper;
import com.sv.mapper.OrderMapper; import com.sv.mapper.OrderMapper;
import com.sv.mapper.VenueMapper; import com.sv.mapper.VenueMapper;
import com.sv.service.api.OrderService;
import com.sv.service.api.config.WechatPayService; import com.sv.service.api.config.WechatPayService;
import com.sv.service.api.util.DateUtilCard; import com.sv.service.api.util.DateUtilCard;
import com.sv.service.common.DoorLockUtil;
import com.ydd.framework.core.common.Pagination; import com.ydd.framework.core.common.Pagination;
import com.ydd.framework.core.common.utils.ValidationUtils; import com.ydd.framework.core.common.utils.ValidationUtils;
import com.ydd.framework.core.exception.ServiceException; import com.ydd.framework.core.exception.ServiceException;
import com.ydd.framework.core.service.impl.BaseServiceImpl; import com.ydd.framework.core.service.impl.BaseServiceImpl;
import com.ydd.oms.entity.enums.PayStatusEnum; import com.ydd.oms.entity.enums.PayStatusEnum;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -59,12 +59,14 @@ public class VenueEnterService extends BaseServiceImpl {
@Lazy @Lazy
@Resource @Resource
private WechatPayService wechatPayService; private WechatPayService wechatPayService;
@Resource
DoorLockUtil doorLockUtil;
/** /**
* api 接口 * api 接口
* 我要进场 * 我要进场
*/ */
public BasketEnterResult join(Integer memberId, Integer venueId) { public BasketEnterResult join(Integer memberId, Integer venueId, String doorSn) {
BasketEnterResult basketEnterResult = new BasketEnterResult(); BasketEnterResult basketEnterResult = new BasketEnterResult();
basketEnterResult.setFlg(0); basketEnterResult.setFlg(0);
if (memberId == null) { if (memberId == null) {
@@ -95,10 +97,11 @@ public class VenueEnterService extends BaseServiceImpl {
boolean hasEffOrder = lastOrder != null boolean hasEffOrder = lastOrder != null
&& lastOrder.getStatus() == BarCodeStatusEnum.INIT.getValue() && lastOrder.getStatus() == BarCodeStatusEnum.INIT.getValue()
&& lastOrder.getOrderEnd().after(new Date()); && lastOrder.getOrderEnd().after(new Date());
doorLockUtil.lockOpeDoor(doorSn);
if (!hasEffOrder) { if (!hasEffOrder) {
basketballLog.info("[篮球][入场] memberId={}, 无有效订单,创建新订单", memberId); basketballLog.info("[篮球][入场] memberId={}, 无有效订单,创建新订单", memberId);
if (price.compareTo(BigDecimal.ZERO) > 0) { if (price.compareTo(BigDecimal.ZERO) > 0) {
checkOrderPaying(memberId);
Order pendingOrder = orderMapper.findPendingBasketballOrder(memberId, venueId); Order pendingOrder = orderMapper.findPendingBasketballOrder(memberId, venueId);
if (pendingOrder != null) { if (pendingOrder != null) {
basketballLog.info("[篮球][入场] memberId={}, 存在待支付订单 orderSn={}", memberId, pendingOrder.getOrderSn()); basketballLog.info("[篮球][入场] memberId={}, 存在待支付订单 orderSn={}", memberId, pendingOrder.getOrderSn());
@@ -127,7 +130,6 @@ public class VenueEnterService extends BaseServiceImpl {
basketballLog.info("[篮球][入场] memberId={}, 待支付订单未完成支付 orderSn={}", memberId, pendingOrder.getOrderSn()); basketballLog.info("[篮球][入场] memberId={}, 待支付订单未完成支付 orderSn={}", memberId, pendingOrder.getOrderSn());
return basketEnterResult; return basketEnterResult;
} }
checkOrderPaying(memberId);
basketEnterResult.setFlg(2); basketEnterResult.setFlg(2);
if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()) { if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()) {
basketEnterResult.setMsg("预付押金" + price + "元,出门后按分钟结算,收费规则见场馆主页详情"); basketEnterResult.setMsg("预付押金" + price + "元,出门后按分钟结算,收费规则见场馆主页详情");
@@ -167,12 +169,13 @@ public class VenueEnterService extends BaseServiceImpl {
/** /**
* 我要出场 * 我要出场
* *
* @param memberId * @param memberId
* @param venueId * @param venueId
* @param doorSn
* @return * @return
*/ */
public BasketEnterResult out(Integer memberId, Integer venueId) { public BasketEnterResult out(Integer memberId, Integer venueId, String doorSn) {
BasketEnterResult result = new BasketEnterResult(); BasketEnterResult result = new BasketEnterResult();
result.setFlg(0); result.setFlg(0);
if (memberId == null) { if (memberId == null) {
@@ -184,25 +187,25 @@ public class VenueEnterService extends BaseServiceImpl {
memberService.verify(member); memberService.verify(member);
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId);
if (lastOrder == null || lastOrder.getPaying() == 2) { if (lastOrder == null) {
basketballLog.warn("[篮球][出场] memberId={}, venueId={}, 无可结算订单 lastOrder={}", basketballLog.error("[篮球][出场] memberId={}, mobile={} ,venueId={}, 无可结算订单 lastOrder={}",
memberId, venueId, lastOrder == null ? "null" : memberId, member.getMobile(), venueId, lastOrder == null ? "null" :
String.format("orderSn=%s,paying=%s,status=%s", lastOrder.getOrderSn(), lastOrder.getPaying(), lastOrder.getStatus())); String.format("orderSn=%s,paying=%s,status=%s", lastOrder.getOrderSn(), lastOrder.getPaying(), lastOrder.getStatus()));
return result; throw new ServiceException("门禁异常,无可结算订单,请联系管理员出门!");
} }
basketballLog.info("[篮球][出场] memberId={}, venueId={}, payStyle={}, orderSn={}, orderStart={}, lastEnter={}, paying={}", basketballLog.info("[篮球][出场] memberId={}, venueId={}, payStyle={}, orderSn={}, orderStart={}, lastEnter={}, paying={}",
memberId, venueId, venue.getPayStyle(), lastOrder.getOrderSn(), memberId, venueId, venue.getPayStyle(), lastOrder.getOrderSn(),
lastOrder.getOrderStart(), lastOrder.getLastEnter(), lastOrder.getPaying()); lastOrder.getOrderStart(), lastOrder.getLastEnter(), lastOrder.getPaying());
doorLockUtil.lockOpeDoor(doorSn);
if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()) { if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()) {
String enterTime = DateUtilCard.getTimeFromDate(lastOrder.getOrderStart()); String enterTime = DateUtilCard.getTimeFromDate(lastOrder.getOrderStart());
Date dateNow = new Date(); Date dateNow = new Date();
basketballLog.info("[篮球][出场] memberId={}, 按时计费结算 venueId={}", memberId, venueId); basketballLog.info("[篮球][出场] memberId={} ,mobile={} , 按时计费结算 venueId={}", memberId, member.getMobile(),venueId);
VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime); VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime);
if (venuePriceEnter == null) { if (venuePriceEnter == null) {
basketballLog.warn("[篮球][出场] memberId={}, 场馆暂未开放 venueId={}", memberId, venueId); basketballLog.warn("[篮球][出场] memberId={}, 未找到价格 venueId={}", memberId, venueId);
throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR);
} }
@@ -214,31 +217,42 @@ public class VenueEnterService extends BaseServiceImpl {
BigDecimal deposit = basePrice.multiply(new BigDecimal(2)); BigDecimal deposit = basePrice.multiply(new BigDecimal(2));
BigDecimal difference = actualCost.subtract(deposit); BigDecimal difference = actualCost.subtract(deposit);
basketballLog.info("[篮球][出场] memberId={}, 费用结算: basePrice={}, 停留{}分钟, 实际费用={}, 押金={}, 差额={}", basketballLog.info("[篮球][出场] memberId={}, mobile={}, 费用结算: basePrice={}, 停留{}分钟, 实际费用={}, 押金={}, 差额={}",
memberId, basePrice, minutes, actualCost, deposit, difference); memberId, member.getMobile(), basePrice, minutes, actualCost, deposit, difference);
if (difference.compareTo(BigDecimal.ZERO) > 0) { if (difference.compareTo(BigDecimal.ZERO) > 0) {
Order pendingOrder = orderMapper.findPendingBasketballOrder(memberId, venueId); String orderAddSn = lastOrder.getOrderAddSn();
if (pendingOrder != null) { if (!StringUtils.isEmpty(orderAddSn)){
OrderResponse wxResponse = wechatPayService.queryWechatOrder(pendingOrder.getOrderSn()); // 这时是已经有过新增的订单了
if (wxResponse != null && wxResponse.isSuccess() && "SUCCESS".equals(wxResponse.getTradeState())) { Order pendingOrder = orderService.findOrderSn(orderAddSn, memberId);
pendingOrder.setPayStatus(PayStatusEnum.PAYED.value); if (pendingOrder != null) {
pendingOrder.setTradeSn(wxResponse.getTransactionId()); if (PayStatusEnum.PAYED.value.equals(pendingOrder.getPayStatus())) {
pendingOrder.setPayTime(new Date()); result.setFlg(0);
orderMapper.update(pendingOrder); result.setMsg("补交费用已支付成功,出场成功");
paySuccess(pendingOrder); basketballLog.info("[篮球][出场] memberId={}, 补交费用已支付 orderSn={}, 补交金额={}",
result.setFlg(0); memberId, pendingOrder.getOrderSn(), difference);
result.setMsg("补交费用已支付成功,出场成功"); return result;
basketballLog.info("[篮球][出场] memberId={}, 补交费用已支付 orderSn={}, tradeSn={}, 补交金额={}", }
memberId, pendingOrder.getOrderSn(), wxResponse.getTransactionId(), difference); OrderResponse wxResponse = wechatPayService.queryWechatOrder(orderAddSn);
if (wxResponse != null && wxResponse.isSuccess() && "SUCCESS".equals(wxResponse.getTradeState())) {
pendingOrder.setPayStatus(PayStatusEnum.PAYED.value);
pendingOrder.setTradeSn(wxResponse.getTransactionId());
pendingOrder.setPayTime(new Date());
orderMapper.update(pendingOrder);
paySuccess(pendingOrder);
result.setFlg(0);
result.setMsg("补交费用已支付成功,出场成功");
basketballLog.info("[篮球][出场] memberId={}, 补交费用已支付 orderSn={}, tradeSn={}, 补交金额={}",
memberId, pendingOrder.getOrderSn(), wxResponse.getTransactionId(), difference);
return result;
}
checkOrderPaying(memberId);
result.setFlg(2);
result.setMoney(difference);
result.setOrderSn(pendingOrder.getOrderSn());
result.setMsg("您有未完成的补交订单,请继续支付。实际费用" + actualCost + "元,需补交" + difference + "");
basketballLog.info("[篮球][出场] memberId={}, 需补交费用 orderSn={}, 需补交={}", memberId, pendingOrder.getOrderSn(), difference);
return result; return result;
} }
result.setFlg(2);
result.setMoney(difference);
result.setOrderSn(pendingOrder.getOrderSn());
result.setMsg("您有未完成的补交订单,请继续支付。实际费用" + actualCost + "元,需补交" + difference + "");
basketballLog.info("[篮球][出场] memberId={}, 需补交费用 orderSn={}, 需补交={}", memberId, pendingOrder.getOrderSn(), difference);
return result;
} }
checkOrderPaying(memberId); checkOrderPaying(memberId);
result.setFlg(2); result.setFlg(2);

View File

@@ -11,6 +11,8 @@ public class DoorLockUtil {
private final static String DOOR_LOCK = "DOOR_LOCK_"; private final static String DOOR_LOCK = "DOOR_LOCK_";
private final static Integer LOCK_TIMEOUT = 20; private final static Integer LOCK_TIMEOUT = 20;
private final static Integer LOCK_OPE_TIMEOUT = 10;
@Resource @Resource
RedisCache redisCache; RedisCache redisCache;
@@ -35,4 +37,9 @@ public class DoorLockUtil {
redisCache.setCacheObject(doorKey,true,LOCK_TIMEOUT, TimeUnit.SECONDS); redisCache.setCacheObject(doorKey,true,LOCK_TIMEOUT, TimeUnit.SECONDS);
} }
public void lockOpeDoor(String doorSn){
String doorKey = DOOR_LOCK + doorSn;
redisCache.setCacheObject(doorKey,true,LOCK_OPE_TIMEOUT, TimeUnit.SECONDS);
}
} }