Commit 130c84c4 by huluobin

美甲师接口加锁、

微信重复支付根据金额做下单唯一处理。
parent c09931b1
......@@ -13,7 +13,6 @@ import com.gogirl.domain.order.serve.OrderManage;
import com.gogirl.domain.user.customer.CustomerBalance;
import com.gogirl.infrastructure.common.exception.RRException;
import com.gogirl.infrastructure.common.util.JsonUtilByFsJson;
import com.gogirl.infrastructure.common.util.RandomUtil;
import com.gogirl.infrastructure.config.property.GogirlProperties;
import com.gogirl.infrastructure.feign.wx.WxPayControllerFeign;
import com.gogirl.infrastructure.mapper.market.discount.DiscountConfigMapper;
......@@ -124,7 +123,7 @@ public class PayServiceImpl implements PayService {
.currentCustomerId(qry.getCustomerId())
.openid(qry.getOpenid())
//避免同单不同金额的情况
.orderNo(RandomUtil.randomInt(100000, 999999) + orderManage.getOrderNo())
.orderNo(String.format("%06d", orderManage.getTotalPaymentAmount().multiply(new BigDecimal(100)).intValue()).substring(0, 6) + orderManage.getOrderNo())
.totalPaymentAmount(orderManage.getTotalPaymentAmount())
.build();
......@@ -162,7 +161,7 @@ public class PayServiceImpl implements PayService {
WxPayOrderQuery wxPayOrderQuery = WxPayOrderQuery.builder()
//避免同单不同金额的情况
.orderNo(RandomUtil.randomInt(100000, 999999) + orderManageDTO.getOrderNo())
.orderNo(String.format("%06d", leftTotalPaymentAmount.multiply(new BigDecimal(100)).intValue()).substring(0, 6) + orderManageDTO.getOrderNo())
.currentCustomerId(qry.getCustomerId())
.openid(qry.getOpenid())
.totalPaymentAmount(leftTotalPaymentAmount)
......@@ -185,6 +184,7 @@ public class PayServiceImpl implements PayService {
return wxPayControllerFeign.createJsapiOrder(wxPayUnifiedOrderRequest);
}
@Override
public void balancePosPay(Integer currentCustomerId, Integer orderId) {
OrderManage orderManage = orderManageService.getById(orderId);
......
......@@ -5,85 +5,7 @@ package com.gogirl.infrastructure.constant;
*/
public class Constans {
// 定义登录后台用户在session中的键
public final static String SESSION_SYSUSER = "SESSION_SYSUSER";
// 定义登录客户端用户在session中的键
public final static String SESSION_CLIENTUSER = "SESSION_CLIENTUSER";
//预约状态
public final static Integer SCHEDULE_STATUS_SERVICE = 1; //正在服务
public final static Integer SCHEDULE_STATUS_ABIDING = 2; //守约
public final static Integer SCHEDULE_STATUS_LOSSOFCONTRACT = 3; //失约
public final static Integer SCHEDULE_STATUS_CANCEL = 4; //已取消
public final static Integer SCHEDULE_STATUS_DELETE = 5; //已删除
public final static Integer SCHEDULE_STATUS_SERVING = 6; //已接单,正在服务
public final static Integer SCHEDULE_STATUS_WAITSERVE = 7; //自动开单,等待接单
public final static Integer SCHEDULE_IS_READ = 1; //已读
public final static Integer SCHEDULE_NO_READ = 2; //未读
public final static Integer SCHEDULE_REMIND_NEW = 1; //用户端新增预约
public final static Integer SCHEDULE_REMIND_TIME = 2; //预约时效提醒
public final static Integer SCHEDULE_TYPE_USER = 1; //用户端
public final static Integer SCHEDULE_TYPE_PC = 2; //店铺端
public final static Integer SCHEDULE_RECORD_UPDATE = 0; //修改 预约记录
public final static Integer SCHEDULE_RECORD_ADD = 1; //增加 预约记录
public final static Integer SCHEDULE_RECORD_DELETE = 2; //删除 预约记录
public final static Integer SCHEDULE_RECORD_OLD = 3; //原始数据 预约记录
//订单
public final static Integer ORDER_TYPE_SCHEDULE = 1; //线上 预约订单(店铺端预约)
public final static Integer ORDER_TYPE_STORE = 2; //线下 新建订单(店铺端订单)
public final static Integer ORDER_TYPE_OTHER = 3; //大众点评
public final static Integer ORDER_TYPE_RECHARGE = 4; //充值
public final static Integer ORDER_TYPE_USER = 5; //线上订单(用户端预约)
public final static Integer ORDER_TYPE_XCX = 6; //小程序预约订单
//订单状态
public final static Integer ORDER_STATUS_SERVE = 1; //正在服务
public final static Integer ORDER_STATUS_PAMENT = 2; //待付款
public final static Integer ORDER_STATUS_EVALUATE = 3; //未评价
public final static Integer ORDER_STATUS_FINISH = 4; //已完成
public final static Integer ORDER_STATUS_SERVING = 5; //接单后服务中
public final static Integer ORDER_STATUS_WAIT = 6; //预约后自动开单
public final static Integer ORDER_STATUS_CANCEL = 7; //用户已取消
public final static Integer ORDER_STATUS_WAIT_SURE = 8; //待美甲师端确认支付
public final static Integer ORDER_STATUS_COUPON_WAIT_SURE = 9; //待确认外部优惠券可用
//支付方式
public final static Integer ORDER_PAYMENT_WEI = 1; //微信
public final static Integer ORDER_PAYMENT_MEMBER = 2; //会员
public final static Integer ORDER_PAYMENT_OTHER = 3; //其他
//订单评价状态
public final static Integer ORDER_COMMENT_EVALUATED = 1; //未评价
public final static Integer ORDER_COMMENT_FINISH = 2; //已评价
//订单开始-结束状态
public final static Integer ORDER_EXECUTION_START = 1; //开始
public final static Integer ORDER_EXECUTION_END = 2; //结束
public final static Integer ORDER_EXECUTION_TIMESLOT = 3; //时间段
public final static Integer ORDER_EXECUTION_COMMEND = 4; //时间段
//会员来源
public final static Integer MEMBER_SCHEDULE = 1; //预约
public final static Integer MEMBER_ORDER = 2; //订单
public final static Integer MEMBER_WEI = 3; //微信
//优惠券和订单关联表状态
public final static Integer COUPON_ORDER_STATUS_CREATE = 1; //待确认
public final static Integer COUPON_ORDER_STATUS_CANUSE = 2; //已确认可用
public final static Integer COUPON_ORDER_STATUS_NOTUSE = 3; //已确认不可用
public final static Integer COUPON_ORDER_STATUS_CUSDEL = 4; //用户删除
public final static Integer COUPON_ORDER_STATUS_TECDEL = 5; //美甲师删除
//优惠券状态
public final static Integer COUPON_STATUS_YES = 1; //正常
public final static Integer COUPON_STATUS_USED = 2; //已使用
public final static Integer COUPON_STATUS_TIMEOUT = 3; //已过期
public static final String WX_PAY_ORDER_PREFIX = "000000";
public static final String WX_BALANCE_PAY_ORDER_PREFIX = "000000";
}
package com.gogirl.infrastructure.util.lock;
import java.util.HashMap;
import java.util.concurrent.locks.ReentrantLock;
/**
*  * 分段锁,系统提供一定数量的原始锁,根据传入用户id值获取对应的锁并加锁  * 注意:要锁的用户id值如果发生改变,有可能导致锁无法成功释放!!!
*/
public class OrderIdLock {
private final static HashMap<Integer, ReentrantLock> lockMap = new HashMap<>();
private Integer segments = 1;// 默认分段数量
private OrderIdLock() {
init(null, false);
}
private OrderIdLock(Integer counts, boolean fair) {
init(counts, fair);
}
/*静态内部类实现单例*/
public static final OrderIdLock getInsatance() {
return SingletonHolder.instance;
}
private void init(Integer counts, boolean fair) {
if (counts != null) {
segments = counts;
}
for (int i = 0; i < segments; i++) {
lockMap.put(i, new ReentrantLock(fair));
}
}
public void lock(int key) {
ReentrantLock lock = lockMap.get(key % segments);
lock.lock();
}
public void unlock(int key) {
ReentrantLock lock = lockMap.get(key % segments);
lock.unlock();
}
@Override
public String toString() {
return "SegmentLock [segments=" + segments + ", lockMap=" + lockMap
+ "]";
}
/*静态内部类实现单例*/
private static class SingletonHolder {
private static final OrderIdLock instance = new OrderIdLock(null, true);
}
}
......@@ -22,6 +22,7 @@ import com.gogirl.infrastructure.mapper.user.customer.CustomerBalanceMapper;
import com.gogirl.infrastructure.mapper.user.customer.CustomerBalanceRecordMapper;
import com.gogirl.infrastructure.mapper.user.customer.CustomerMessageMapper;
import com.gogirl.infrastructure.util.SessionUtils;
import com.gogirl.infrastructure.util.lock.OrderIdLock;
import com.gogirl.shared.member.order.command.BalanceWxPayQuery;
import com.gogirl.shared.member.order.query.UnifiedOrderQuery;
import io.swagger.annotations.Api;
......@@ -156,7 +157,13 @@ public class PayController {
public JsonResult<Integer> friendPayOrder(@RequestHeader String token,
@PathVariable Integer orderId,
@ApiParam("朋友手机号") @RequestParam String phone) {
orderManageService.friendPayOrder(orderId, phone);
OrderIdLock lock = OrderIdLock.getInsatance();
try {
lock.lock(orderId);
orderManageService.friendPayOrder(orderId, phone);
} finally {
lock.unlock(orderId);
}
return JsonResult.success();
}
......@@ -179,7 +186,13 @@ public class PayController {
GogirlToken gt = gogirlTokenService.getByToken(token);
Integer technicianId = SessionUtils.getTechnicianId();
orderManageService.confirmOrder(orderId, payType, technicianId);
OrderIdLock lock = OrderIdLock.getInsatance();
try {
lock.lock(orderId);
orderManageService.confirmOrder(orderId, payType, technicianId);
} finally {
lock.unlock(orderId);
}
return JsonResult.success();
}
......
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