Commit 685a6fa0 by Aeolus

同一笔订单退款需要间隔60s

parent 6735f2ba
......@@ -34,6 +34,9 @@ WX_ACCESS_TOKEN = "W_A_T_"
# 微信公众号access_token过期时间
WX_ACCESS_TOKEN_EXPIRE = "W_A_T_E_"
# 订单退款锁
RENT_REFUND_LOCK = "R_R_L_"
LOGIN_TYPE = {
'code_login': 1,
'token_login': 2,
......
......@@ -10,17 +10,20 @@ author:Aeolus
"""
import datetime
import logging
import time
from flask import Blueprint, g, request, jsonify
from sqlalchemy.exc import SQLAlchemyError
from config.commen_config import RENT_SALE_LOCK
from config.wechat_config import platform_appid_config_list, pay_config_list
from models.base_model import db
from models.models import Rent, RentDetail, WxUser, Machine, RentRefund, DrawRecord
from service.rent_service import RentService
from service.wechat_service import WeChatPayService
from utils.error_code import OPERATE_LEVEL_ERROR, ACTION_CODE_ERROR, REFUND_NOT_PRODUCTION_INFO, Param_Invalid_Error, \
REFUND_MONEY_IS_ZERO, REFUND_MONEY_ERROR
REFUND_MONEY_IS_ZERO, REFUND_MONEY_ERROR, REFUND_LOCK_ERROR
from utils.my_redis_cache import redis_client
from utils.my_response import BaseResponse
logger = logging.getLogger(__name__)
......@@ -206,17 +209,20 @@ def rent_money_refund_new():
cause = json_data['cause']
comment = json_data['comment'] if 'comment' in json_data else ''
rent_info = db.session.query(RentDetail, Rent, WxUser, Machine
).join(Rent,
Rent.rent_no == RentDetail.rent_no
).join(WxUser, WxUser.id == Rent.user_id
).filter(RentDetail.id == rent_detail_id,
Rent.rent_no == rent_no).first()
lock_res = redis_client.set(RENT_SALE_LOCK + str(rent_no) + "_" + str(rent_detail_id),
datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ex=60,
nx=True)
if lock_res:
pass
else:
return jsonify(REFUND_LOCK_ERROR)
if not rent_info:
return jsonify(REFUND_NOT_PRODUCTION_INFO)
rent = Rent.query.filter_by(rent_no=rent_no).with_for_update().first()
if not rent:
return jsonify(REFUND_NOT_PRODUCTION_INFO)
rent_detail = RentDetail.query.filter_by(rent_no=rent_no, id=rent_detail_id).with_for_update().first()
if not rent_detail:
return jsonify(REFUND_NOT_PRODUCTION_INFO)
wx_user = WxUser.query.filter_by(id=rent.user_id).first()
refund_count = int(json_data["refund_count"])
......@@ -240,7 +246,7 @@ def rent_money_refund_new():
# 退款操作
data = {
"out_refund_no": RentService.create_refund_no(),
"out_trade_no": rent_info.Rent.rent_no,
"out_trade_no": rent_no,
"total_fee": rent.total,
"refund_fee": refund_money
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment