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