fix - 篮球入场出场逻辑优化、丢弃二维码的逻辑、优化入场出场锁逻辑。
This commit is contained in:
@@ -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("门禁通讯异常");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user