diff --git a/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java b/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java index 03182fc..ed48fcd 100644 --- a/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java +++ b/service/src/main/java/com/sv/mapper/BarcodeOrderTimeMapper.java @@ -21,6 +21,8 @@ public interface BarcodeOrderTimeMapper { int findEffOrder(@Param("currentDate") Date currentDate,@Param("memberId") Integer memberId, @Param("venueId") Integer venueId); + BarcodeOrderTime findLastOrder(@Param("memberId") Integer memberId, @Param("venueId") Integer venueId); + List endOrderList(@Param("currentDate") Date currentDate); } \ No newline at end of file diff --git a/service/src/main/java/com/sv/service/api/VenueService.java b/service/src/main/java/com/sv/service/api/VenueService.java index 491d0bb..8dfa43a 100644 --- a/service/src/main/java/com/sv/service/api/VenueService.java +++ b/service/src/main/java/com/sv/service/api/VenueService.java @@ -246,20 +246,23 @@ public class VenueService extends BaseServiceImpl { Member member = memberService.findById(memberId); if (member.getMoney().compareTo(price) == -1) { barCodeResult.setFlg(2); - if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){ - // 按时入场余额需要包含两个小时的场地费 - barCodeResult.setMsg("请保证账户至少有两个小时余额:" + price + "元,余额不足,请先充值"); - }else { - barCodeResult.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值"); - } +// if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){ +// // 按时入场余额需要包含两个小时的场地费 +// barCodeResult.setMsg("请保证账户至少有两个小时余额:" + price + "元,余额不足,请先充值"); +// }else { +// barCodeResult.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值"); +// } + barCodeResult.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值"); + return barCodeResult; } - } - if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){ - // 按次入场先收钱,且多久不收钱,出场不收钱 - // 该用户上次订单的是否逾期 - Integer timePayHour = venue.getTimePayHour(); - if (timePayHour == null) { - timePayHour = 4; + Integer timePayHour = 1; + if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){ + // 按次入场先收钱,且多久不收钱,出场不收钱 + // 该用户上次订单的是否逾期 + timePayHour = venue.getTimePayHour(); + if (timePayHour == null) { + timePayHour = 4; + } } int effOrder = barcodeOrderTimeMapper.findEffOrder(new Date(), memberId, venueId); if (effOrder <= 0) { @@ -358,33 +361,35 @@ public class VenueService extends BaseServiceImpl { */ //判断余额是否够 // 1、找到入场时间 - MemberEnterVenueLog memberLastLog = memberEnterVenueLogService.findMemberLastLog(memberId, venueId); - String enterTime = DateUtilCard.getTimeFromDate(memberLastLog.getCreatedTime()); - String outTime = DateUtilCard.nowTime().toString(); - BigDecimal price = BigDecimal.ZERO; if(PayStyleEnum.HOUR.getValue() == venue.getPayStyle()){ // 按次出场不扣钱 - // 取入场的价格 - VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime); - if (venuePriceEnter == null) { - throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); - } - // 按时出场选择按照分钟四舍五入到角扣款 - price = venuePriceEnter.getPrice(); - int minutes = DateUtilCard.diffMinute(enterTime, outTime); - price = price.divide(new BigDecimal(60),4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(minutes)).setScale(1,BigDecimal.ROUND_HALF_UP); - if (price.compareTo(BigDecimal.ZERO) < 0) { - price = BigDecimal.ZERO; - } - if (memberService.isMoneyEnough(member.getId(), price)) { - logger.info("用户" + member.getNickname() + "使用余额核销订单"); - createMemberMoneyLog(MoneyLogEnum.JOIN.value, price, member.getId(), member.getPlatformId(), PayTypeEnum.BALANCE.value, null, - venue.getId(), venue.getType()); - } else { - //余额不足 - logger.error("用户" + member.getNickname() + "余额不足核销失败"); - result.setFlg(2); - result.setMsg("此次订单金额为:" + price + "元,余额不足,请先充值"); + BigDecimal price = BigDecimal.ZERO; + BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); + String enterTime = DateUtilCard.getTimeFromDate(lastOrder.getOrderStart()); + Date dateNow = new Date(); + if (dateNow.after(lastOrder.getOrderEnd())) { + // 当前时间已经超过订单结束日期,则该订单需要重新补收费 + // 取入场的价格 + VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime); + if (venuePriceEnter == null) { + throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); + } + // 按时出场选择按照分钟四舍五入到角扣款 + price = venuePriceEnter.getPrice(); + int minutes = DateUtilCard.diffMinute(lastOrder.getOrderStart(), dateNow); + int hours = (minutes - 1) / 60; + // 需要补收的价格 + price = price.multiply(new BigDecimal(hours)); + if (memberService.isMoneyEnough(member.getId(), price)) { + logger.info("用户" + member.getId() + "使用余额核销订单"); + createMemberMoneyLog(MoneyLogEnum.JOIN.value, price, member.getId(), member.getPlatformId(), PayTypeEnum.BALANCE.value, null, + venue.getId(), venue.getType()); + } else { + //余额不足 + logger.error("用户" + member.getId() + "需补交金额,余额不足核销失败"); + result.setFlg(2); + result.setMsg("您此次入场超过一小时,需补交" + price + "元,余额不足,请先充值"); + } } } } @@ -456,6 +461,10 @@ public class VenueService extends BaseServiceImpl { private void createBarcodeTimeOrder(Integer memberId, Integer venueId, Integer timePayHour) { Date startDate = new Date(); Date endDate = DateUtilCard.addHours(startDate, timePayHour); + // 如果是一个小时,则默认给15分钟宽限期 + if (timePayHour == 1) { + endDate = DateUtilCard.addMinute(endDate,15); + } BarcodeOrderTime barcodeOrderTime = new BarcodeOrderTime(); barcodeOrderTime.setMemberId(memberId); barcodeOrderTime.setVenueId(venueId); diff --git a/service/src/main/java/com/sv/service/api/util/DateUtilCard.java b/service/src/main/java/com/sv/service/api/util/DateUtilCard.java index 8335d9d..a7e5c15 100644 --- a/service/src/main/java/com/sv/service/api/util/DateUtilCard.java +++ b/service/src/main/java/com/sv/service/api/util/DateUtilCard.java @@ -158,42 +158,33 @@ public class DateUtilCard { public static Date addOneDay(Date date){ Calendar calendar = new GregorianCalendar(); calendar.setTime(date); - calendar.add(calendar.DATE,1); //把日期往后增加一天,整数 往后推,负数往前移动 + calendar.add(Calendar.DATE,1); //把日期往后增加一天,整数 往后推,负数往前移动 return calendar.getTime(); //这个时间就是日期往后推一天的结果 } public static Date addDays(Date date,int days){ Calendar calendar = new GregorianCalendar(); calendar.setTime(date); - calendar.add(calendar.DATE,days); //把日期往后增加一天,整数 往后推,负数往前移动 + calendar.add(Calendar.DATE,days); //把日期往后增加一天,整数 往后推,负数往前移动 return calendar.getTime(); //这个时间就是日期往后推一天的结果 } public static Date addHours(Date date,int hours){ Calendar calendar = new GregorianCalendar(); calendar.setTime(date); - calendar.add(calendar.HOUR,hours); //把日期往后增加一小时,整数 往后推,负数往前移动 - return calendar.getTime(); //这个时间就是日期往后推一天的结果 + calendar.add(Calendar.HOUR,hours); //整数 往后推,负数往前移动 + return calendar.getTime(); } - public static int diffMinute(String startTime,String endTime){ - if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)){ - return 1; - } - try { - String[] split1 = startTime.split(":"); - String[] split2 = endTime.split(":"); - int t1 = 0; - int t2 = 0; - t1 = (Integer.parseInt(split1[0]) * 3600) - + (Integer.parseInt(split1[1]) * 60) + Integer.parseInt(split1[2]); - t2 = (Integer.parseInt(split2[0]) * 3600) - + (Integer.parseInt(split2[1]) * 60) + Integer.parseInt(split2[2]); - int diff = t2 - t1; - return (diff / 60) + 1; - }catch (Exception e){ - return 1; - } + public static Date addMinute(Date date,int minutes){ + Calendar calendar = new GregorianCalendar(); + calendar.setTime(date); + calendar.add(Calendar.MINUTE,minutes); + return calendar.getTime(); + } + + public static int diffMinute(Date startTime,Date endTime){ + return (int) ((endTime.getTime() - startTime.getTime()) / (60 * 1000)); } } diff --git a/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml b/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml index e54ec4a..0d98f87 100644 --- a/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml +++ b/service/src/main/resources/mybatis/mapper/sv/BarcodeOrderTimeMapper.xml @@ -134,6 +134,14 @@ where status = 0 and order_end >= #{currentDate} and member_id = #{memberId,jdbcType=INTEGER} and venue_id = #{venueId,jdbcType=INTEGER} + +