Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gogirl-miniapp-backend
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
huluobin
gogirl-miniapp-backend
Commits
130c84c4
Commit
130c84c4
authored
Apr 08, 2020
by
huluobin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
美甲师接口加锁、
微信重复支付根据金额做下单唯一处理。
parent
c09931b1
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
76 additions
and
85 deletions
+76
-85
PayServiceImpl.java
...m/gogirl/application/order/serve/impl/PayServiceImpl.java
+3
-3
Constans.java
...ain/java/com/gogirl/infrastructure/constant/Constans.java
+2
-80
OrderIdLock.java
...java/com/gogirl/infrastructure/util/lock/OrderIdLock.java
+56
-0
PayController.java
src/main/java/com/gogirl/interfaces/xcx/PayController.java
+15
-2
No files found.
src/main/java/com/gogirl/application/order/serve/impl/PayServiceImpl.java
View file @
130c84c4
...
...
@@ -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
);
...
...
src/main/java/com/gogirl/infrastructure/constant/Constans.java
View file @
130c84c4
...
...
@@ -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"
;
}
src/main/java/com/gogirl/infrastructure/util/lock/OrderIdLock.java
0 → 100644
View file @
130c84c4
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
);
}
}
src/main/java/com/gogirl/interfaces/xcx/PayController.java
View file @
130c84c4
...
...
@@ -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
();
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment