篮球通过微信支付下订单,出场10分钟结束订单,该退钱退钱

This commit is contained in:
2023-12-31 11:49:35 +08:00
parent e155801472
commit a450123509
9 changed files with 101 additions and 44 deletions

View File

@@ -185,7 +185,7 @@ public class VenueController extends BaseApiController {
* @return
*/
@RequestMapping(value = "/venue/generate/barcode", method = RequestMethod.POST)
public ResponseDTO generateBarcode(@RequestParam("orderSn") String orderSn,@RequestParam("venueId") Integer venueId,Integer enterFlag) {
public ResponseDTO generateBarcode(@RequestParam("orderSn") String orderSn,@RequestParam("venueId") Integer venueId,@RequestParam("enterFlag")Integer enterFlag) {
Device byDevice = deviceService.findByDevice(venueId);
if (byDevice == null) {
throw new ServiceException("门禁通讯异常");
@@ -209,7 +209,7 @@ public class VenueController extends BaseApiController {
*/
@RequestMapping(value = "/venue/basketball/pay", method = RequestMethod.POST)
@AccessToken
public ResponseDTO basketPay(@RequestParam("venueId") Integer venueId,@RequestParam("payMoney") Double payMoney){
public ResponseDTO basketPay(@RequestParam("venueId") Integer venueId,@RequestParam("enterFlag")Integer enterFlag,@RequestParam("payMoney") Double payMoney){
Device byDevice = deviceService.findByDevice(venueId);
if (byDevice == null) {
throw new ServiceException("门禁通讯异常");
@@ -221,7 +221,7 @@ public class VenueController extends BaseApiController {
}
Integer memberId = getMemberIdByAccessToken();
return ResponseDTO.ok().
addAttribute("pay",orderService.createEnterVenueOrder(venueId, memberId, PayTypeEnum.WEI_XIN, new BigDecimal(payMoney)));
addAttribute("pay",orderService.createEnterVenueOrder(venueId, memberId, enterFlag, PayTypeEnum.WEI_XIN, new BigDecimal(payMoney)));
}
}

View File

@@ -27,6 +27,6 @@ CREATE TABLE `sv_member_enter_status` (
ALTER TABLE sv_barcode
ADD COLUMN order_sn varchar(200) AFTER barcode;
ALTER TABLE `smart_venue`.`sv_barcode_order_time`
ADD COLUMN `paying` int(11) NULL COMMENT '入场 paying = 0 出场未结算 paying = 1' AFTER `status`,
ADD COLUMN `paying` int(11) NULL COMMENT '入场 paying = 0 出场未结算 paying = 1 出场补交费用已补交 paying = 2' AFTER `status`,
ADD COLUMN `pay_money` int(11) NULL COMMENT '退款金额' AFTER `paying`,
ADD COLUMN `order_sn` varchar(200) NULL COMMENT '退款订单号' AFTER `pay_money`;

View File

@@ -23,6 +23,8 @@ public interface BarcodeOrderTimeMapper {
BarcodeOrderTime findLastOrder(@Param("memberId") Integer memberId, @Param("venueId") Integer venueId);
BarcodeOrderTime findLastOrderBySn(@Param("memberId") Integer memberId, @Param("venueId") Integer venueId,@Param("orderSn") String orderSn);
List<BarcodeOrderTime> endOrderList(@Param("currentDate") Date currentDate);
List<BarcodeOrderTime> needPayOrderList();

View File

@@ -90,8 +90,10 @@ public interface OrderMapper {
*/
void updatePrepayId(@Param("orderSn") String orderSn,@Param("prepayId") String prepayId);
Order findLastOrder(@Param("memberId") Integer memberId);
/**
* api 根据订单编号查询总价钱
*/
Order findByOrderSn(String orderSn);
}
}

View File

@@ -1,9 +1,6 @@
package com.sv.service.api;
import com.enums.BarCodeStatusEnum;
import com.enums.OrderPayEnum;
import com.enums.OrderTypeEnum;
import com.enums.PayTypeEnum;
import com.enums.*;
import com.github.pagehelper.PageHelper;
import com.sv.dto.api.wechat.BaseResult;
import com.sv.dto.api.wechat.OrderPaySignResponse;
@@ -63,6 +60,8 @@ public class OrderService extends BaseServiceImpl {
private MemberService memberService;
@Resource
private VenuePriceMapper venuePriceMapper;
@Resource
private BarcodeOrderTimeMapper barcodeOrderTimeMapper;
/**
* 创建订单
@@ -250,7 +249,7 @@ public class OrderService extends BaseServiceImpl {
* @param memberId
* @return
*/
public OrderPaySignResponse.WechatPayParam createEnterVenueOrder(Integer venueId, Integer memberId, PayTypeEnum payTypeEnum, BigDecimal price){
public OrderPaySignResponse.WechatPayParam createEnterVenueOrder(Integer venueId, Integer memberId, Integer enterFlag,PayTypeEnum payTypeEnum, BigDecimal price){
Venue venue = venueMapper.findById(venueId);
if (venue == null) {
throw new ServiceException("未找到该场馆");
@@ -288,11 +287,23 @@ public class OrderService extends BaseServiceImpl {
order.setPlatformId(venue.getPlatformId());
order.setMemberId(memberId);
order.setParentOrderId(venueId); /** 篮球入场这里输入场馆ID */
order.setCreatedId(enterFlag); /** 篮球入场这里输入出场结算还是入场结算 */
orderMapper.insert(order);
//扣除用户余额 目前篮球订单不支持余额支付
// if(payTypeEnum.value.equals(PayTypeEnum.BALANCE.value)) {
// memberMoneyLogService.create(memberId, venue.getPlatformId(), MoneyLogEnum.JOIN.value, price.negate(), PayTypeEnum.BALANCE.value, null, venue.getId(), venue.getType(), null);
// }
if (EnterEnum.OUT.value == enterFlag) {
// 出场的话,将出场的订单设定 未结算 支付金额为 -1 这样批处理不会被结算,需要支付回调处理
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId);
if (lastOrder != null) {
lastOrder.setPaying(1);
lastOrder.setPayMoney(-1);
lastOrder.setOrderSn(order.getOrderSn());
lastOrder.setModifiedTime(new Date());
barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder);
}
}
OrderPaySignResponse.WechatPayParam wechatPayParam = memberCardOrderService.createUnifiedOrder(order.getOrderSn(), memberId, RequestUtils.getIp(),"入场结算订单");
return wechatPayParam;
}

View File

@@ -9,6 +9,7 @@ import com.sv.dto.api.VenueDTO;
import com.sv.entity.*;
import com.sv.exception.api.ExceptionCodeTemplate;
import com.sv.mapper.BarcodeOrderTimeMapper;
import com.sv.mapper.OrderMapper;
import com.sv.mapper.VenueMapper;
import com.sv.service.api.util.DateUtilCard;
import com.sv.service.api.util.GeoHashUtils;
@@ -16,6 +17,7 @@ import com.ydd.framework.core.common.Pagination;
import com.ydd.framework.core.common.utils.ValidationUtils;
import com.ydd.framework.core.exception.ServiceException;
import com.ydd.framework.core.service.impl.BaseServiceImpl;
import com.ydd.oms.entity.enums.PayStatusEnum;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,22 +45,17 @@ public class VenueEnterService extends BaseServiceImpl {
@Resource
private VenueMapper venueMapper;
@Resource
private MemberCardService memberCardService;
@Resource
private MemberService memberService;
@Resource
private MemberEnterVenueLogService memberEnterVenueLogService;
@Resource
private MemberMoneyLogService memberMoneyLogService;
@Resource
private VenuePriceService venuePriceService;
@Resource
BarcodeOrderTimeMapper barcodeOrderTimeMapper;
@Resource
OrderMapper orderMapper;
/**
* api 接口
@@ -86,12 +83,10 @@ public class VenueEnterService extends BaseServiceImpl {
// 按时入场余额需要包含两个小时的场地费
price = price.multiply(new BigDecimal(2));
}
if (venuePrice == null) {
throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR);
}
int effOrder = barcodeOrderTimeMapper.findEffOrder(new Date(), memberId, venueId);
if (effOrder <= 0) {
if (price.compareTo(BigDecimal.ZERO) > 0) {
checkOrderPaying(memberId);
basketEnterResult.setFlg(2);
basketEnterResult.setMsg("订单金额"+ price + "元,请确认!");
basketEnterResult.setMoney(price);
@@ -110,11 +105,11 @@ public class VenueEnterService extends BaseServiceImpl {
}
} else {
// 还沿用原来订单
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId);
if (lastOrder != null) {
lastOrder.setPaying(0);
lastOrder.setModifiedTime(new Date());
barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder);
BarcodeOrderTime lastEnterOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId);
if (lastEnterOrder != null) {
lastEnterOrder.setPaying(0);
lastEnterOrder.setModifiedTime(new Date());
barcodeOrderTimeMapper.updateByPrimaryKey(lastEnterOrder);
}
}
// 3.判断用户有没有人脸识别的图像,根据用户ID查找一个用户只能有一条
@@ -156,7 +151,7 @@ public class VenueEnterService extends BaseServiceImpl {
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId);
String enterTime = DateUtilCard.getTimeFromDate(lastOrder.getOrderStart());
Date dateNow = new Date();
if (dateNow.after(lastOrder.getOrderEnd())) {
if (dateNow.after(lastOrder.getOrderEnd()) && 2 != lastOrder.getPaying()) {
// 当前时间已经超过订单结束日期,则该订单需要重新补收费
// 取入场的价格
VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime);
@@ -170,6 +165,7 @@ public class VenueEnterService extends BaseServiceImpl {
// 需要补收的价格
price = price.multiply(new BigDecimal(hours - 1));
if (price.compareTo(BigDecimal.ZERO) > 0 ) {
checkOrderPaying(memberId);
result.setFlg(2);
result.setMoney(price);
result.setMsg("您此次入场超过2小时需补交" + price + "");
@@ -187,6 +183,19 @@ public class VenueEnterService extends BaseServiceImpl {
return result;
}
/**
* 用户五分钟内有过微信支付,不能在结果未出来之前就让用户付款
* @param memberId
*/
private void checkOrderPaying(Integer memberId) {
Order mOrder = orderMapper.findLastOrder(memberId);
// 有未支付的订单,且订单未超过五分钟未支付
int diffMinute = DateUtilCard.diffMinute(mOrder.getModifiedTime(), new Date());
if (mOrder != null && PayStatusEnum.NOT_PAY.value == mOrder.getPayStatus() && diffMinute < 5) {
throw new ServiceException("您有处理中的订单,或刚刚取消支付,请稍后再试");
}
}
// 记录入场记录
/**
*
@@ -242,19 +251,30 @@ public class VenueEnterService extends BaseServiceImpl {
* @param order
*/
public void paySuccess(Order order) {
// order.getCreatedId() 如果等于1 则是出场的付费
Integer enterFlag = order.getCreatedId();
Integer memberId = order.getMemberId();
Integer venueId = order.getParentOrderId();
Venue venue = venueMapper.findById(venueId);
createMemberMoneyLog(MoneyLogEnum.JOIN.value, order.getPrice(), memberId, order.getPlatformId(), PayTypeEnum.WEI_XIN.value, null,venue.getId(), venue.getType());
Integer timePayHour = 2;
if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){
// 按次入场先收钱,且多久不收钱,出场不收钱
// 该用户上次订单的是否逾期
timePayHour = venue.getTimePayHour();
if (timePayHour == null) {
timePayHour = 4;
if (EnterEnum.OUT.value != enterFlag) {
Integer timePayHour = 2;
if(PayStyleEnum.TIME.getValue() == venue.getPayStyle()){
// 按次入场先收钱,且多久不收钱,出场不收钱
// 该用户上次订单的是否逾期
timePayHour = venue.getTimePayHour();
if (timePayHour == null) {
timePayHour = 4;
}
}
createBarcodeTimeOrder(memberId,venueId,timePayHour,order.getOrderSn());
} else {
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrderBySn(memberId, venueId,order.getOrderSn());
if (lastOrder != null) {
lastOrder.setPaying(2);
lastOrder.setModifiedTime(new Date());
barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder);
}
}
createBarcodeTimeOrder(memberId,venueId,timePayHour,order.getOrderSn());
}
}

View File

@@ -146,6 +146,10 @@ public class WechatPayService extends BaseServiceImpl {
if (params.get("result_code").equals("SUCCESS")) {
String orderSn = params.get("out_trade_no");
Order order = orderService.findOrderSn(orderSn,null);
if (order == null) {
logger.error("找不到订单号!!!!!!!!!" + orderSn);
return;
}
if (order.getPayStatus().intValue() > 0) {
//已支付 不需要在判断
return;

View File

@@ -157,7 +157,7 @@
status = #{status,jdbcType=INTEGER},
paying = #{paying,jdbcType=INTEGER},
pay_money = #{payMoney,jdbcType=INTEGER}
order_sn = #{orderSn,jdbcType=INTEGER}
order_sn = #{orderSn,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
@@ -175,6 +175,15 @@
order by order_end desc LIMIT 1
</select>
<select id="findLastOrderBySn" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from sv_barcode_order_time
where member_id = #{memberId,jdbcType=INTEGER} and venue_id = #{venueId,jdbcType=INTEGER}
and order_sn = #{orderSn,jdbcType=VARCHAR}
order by order_end desc LIMIT 1
</select>
<select id="endOrderList" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />

View File

@@ -52,12 +52,12 @@
<result column="payTime" property="payTime" />
<result column="days" property="days" />
</resultMap>
<!--表名 -->
<sql id="tableName">
sv_order
</sql>
<!-- 字段 -->
<sql id="Field">
id,
@@ -79,7 +79,7 @@
deleted,
to_money
</sql>
<!-- 字段值 -->
<sql id="FieldValue">
#{id, jdbcType=INTEGER},
@@ -166,7 +166,7 @@
AND deleted = 0
GROUP BY DATE(created_time)
</select>
<!-- 新增-->
<insert id="insert" parameterType="com.sv.entity.Order" useGeneratedKeys="true" keyProperty="id">
@@ -285,7 +285,7 @@
</if>
</trim>
</insert>
<!-- 删除-->
<delete id="delete" parameterType="java.lang.Integer">
UPDATE
@@ -308,7 +308,7 @@
#{item}
</foreach>
</delete>
<!-- 更新记录 -->
<update id="update" parameterType="com.sv.entity.Order">
UPDATE
@@ -368,7 +368,7 @@
</set>
WHERE id = #{id}
</update>
<!-- 通过编号查询 -->
<select id="findById" parameterType="java.lang.Integer" resultMap="OrderDtoMap">
SELECT
@@ -435,4 +435,13 @@
WHERE
order_sn = #{orderSn}
</select>
</mapper>
<select id="findLastOrder" resultMap="OrderMap">
SELECT
<include refid="Field"></include>
FROM
<include refid="tableName"></include>
WHERE
deleted = 0 and member_id = #{memberId} order by modified_time desc limit 1
</select>
</mapper>