Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
browser-backend
Project
Project
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
Administrator
browser-backend
Commits
51b4192f
Commit
51b4192f
authored
Jul 02, 2020
by
Administrator
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'revert-
ff764b99
' into 'master'
Revert "Merge branch 'staging' into 'master'" See merge request
!149
parents
ff764b99
0d060c9d
Show whitespace changes
Inline
Side-by-side
Showing
42 changed files
with
1363 additions
and
1459 deletions
+1363
-1459
pom.xml
pom.xml
+6
-6
BrowserBackendApplication.java
...a/com/edgec/browserbackend/BrowserBackendApplication.java
+1
-1
AccountController.java
.../browserbackend/account/controller/AccountController.java
+50
-47
Account.java
...java/com/edgec/browserbackend/account/domain/Account.java
+0
-6
IpChargeRequestDto.java
...gec/browserbackend/account/domain/IpChargeRequestDto.java
+78
-8
IpChargeResultDto.java
...dgec/browserbackend/account/domain/IpChargeResultDto.java
+23
-11
Otp.java
...ain/java/com/edgec/browserbackend/account/domain/Otp.java
+23
-14
Promotion.java
...va/com/edgec/browserbackend/account/domain/Promotion.java
+79
-38
User.java
...in/java/com/edgec/browserbackend/account/domain/User.java
+100
-6
UserBalance.java
.../com/edgec/browserbackend/account/domain/UserBalance.java
+24
-10
UserPayment.java
.../com/edgec/browserbackend/account/domain/UserPayment.java
+66
-5
UserPrePaidBilling.java
...gec/browserbackend/account/domain/UserPrePaidBilling.java
+154
-19
BillQueryResultDto.java
.../edgec/browserbackend/account/dto/BillQueryResultDto.java
+4
-0
AccountRepositoryCustomImpl.java
...ckend/account/repository/AccountRepositoryCustomImpl.java
+2
-0
UserPaymentRepositoryCustomImpl.java
...d/account/repository/UserPaymentRepositoryCustomImpl.java
+4
-1
AccountServiceImpl.java
...owserbackend/account/service/impl/AccountServiceImpl.java
+112
-144
AdministratorServiceImpl.java
...ackend/account/service/impl/AdministratorServiceImpl.java
+4
-0
EmailServiceImpl.java
...browserbackend/account/service/impl/EmailServiceImpl.java
+2
-4
PaymentServiceImpl.java
...owserbackend/account/service/impl/PaymentServiceImpl.java
+291
-262
UserLackMoneyServiceImpl.java
...ackend/account/service/impl/UserLackMoneyServiceImpl.java
+3
-7
UserServiceImpl.java
...gec/browserbackend/auth/service/Impl/UserServiceImpl.java
+6
-4
BrowserErrorCode.java
...ec/browserbackend/browser/ErrorCode/BrowserErrorCode.java
+0
-1
GroupController.java
...ec/browserbackend/browser/controller/GroupController.java
+21
-20
ShopController.java
...gec/browserbackend/browser/controller/ShopController.java
+0
-28
IpResource.java
...a/com/edgec/browserbackend/browser/domain/IpResource.java
+6
-93
IpType.java
.../java/com/edgec/browserbackend/browser/domain/IpType.java
+1
-1
IpBuyResultDto.java
.../com/edgec/browserbackend/browser/dto/IpBuyResultDto.java
+32
-32
IpOperationResultDto.java
...dgec/browserbackend/browser/dto/IpOperationResultDto.java
+19
-5
IpResourceRequestDto.java
...dgec/browserbackend/browser/dto/IpResourceRequestDto.java
+4
-36
RenewIpResultDto.java
...om/edgec/browserbackend/browser/dto/RenewIpResultDto.java
+26
-26
IpResourceRepositoryCustomImpl.java
...nd/browser/repository/IpResourceRepositoryCustomImpl.java
+4
-1
ShopRepository.java
...gec/browserbackend/browser/repository/ShopRepository.java
+0
-5
GroupServiceImpl.java
...browserbackend/browser/service/Impl/GroupServiceImpl.java
+19
-20
IpResourceServiceImpl.java
...erbackend/browser/service/Impl/IpResourceServiceImpl.java
+91
-160
ShopServiceImpl.java
.../browserbackend/browser/service/Impl/ShopServiceImpl.java
+67
-162
ShopService.java
...com/edgec/browserbackend/browser/service/ShopService.java
+2
-5
BrowserTask.java
...va/com/edgec/browserbackend/browser/task/BrowserTask.java
+7
-9
PaymentTask.java
...va/com/edgec/browserbackend/browser/task/PaymentTask.java
+10
-19
PromotionTask.java
.../com/edgec/browserbackend/browser/task/PromotionTask.java
+20
-42
Trans.java
...ain/java/com/edgec/browserbackend/common/utils/Trans.java
+2
-2
FGLWxConfig.java
...main/java/com/edgec/browserbackend/wxpay/FGLWxConfig.java
+0
-4
BrowserBackendApplicationTests.java
.../edgec/browserbackend/BrowserBackendApplicationTests.java
+0
-195
No files found.
pom.xml
View file @
51b4192f
...
...
@@ -103,12 +103,12 @@
<artifactId>
alipay-sdk-java
</artifactId>
<version>
3.7.110.ALL
</version>
</dependency>
<!-- <dependency>--
>
<!-- <groupId>de.flapdoodle.embed</groupId>--
>
<!-- <artifactId>de.flapdoodle.embed.mongo</artifactId>--
>
<!-- <version>1.50.3</version>--
>
<!-- <scope>test</scope>--
>
<!-- </dependency>--
>
<dependency
>
<groupId>
de.flapdoodle.embed
</groupId
>
<artifactId>
de.flapdoodle.embed.mongo
</artifactId
>
<version>
1.50.3
</version
>
<scope>
test
</scope
>
</dependency
>
<dependency>
<groupId>
com.jayway.jsonpath
</groupId>
<artifactId>
json-path
</artifactId>
...
...
src/main/java/com/edgec/browserbackend/BrowserBackendApplication.java
View file @
51b4192f
...
...
@@ -55,7 +55,7 @@ public class BrowserBackendApplication {
@Bean
public
TaskScheduler
taskScheduler
()
{
final
ThreadPoolTaskScheduler
scheduler
=
new
ThreadPoolTaskScheduler
();
scheduler
.
setPoolSize
(
10
);
scheduler
.
setPoolSize
(
5
);
return
scheduler
;
}
...
...
src/main/java/com/edgec/browserbackend/account/controller/AccountController.java
View file @
51b4192f
...
...
@@ -30,9 +30,7 @@ import java.security.Principal;
import
java.time.ZoneOffset
;
import
java.time.ZonedDateTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.Date
;
import
java.util.Enumeration
;
import
java.util.List
;
import
java.util.*
;
@RestController
@RequestMapping
(
"/user"
)
...
...
@@ -82,7 +80,11 @@ public class AccountController {
resultDto
.
setStatus
(
0
);
resultDto
.
setData
(
userDtos
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
...
...
@@ -100,7 +102,11 @@ public class AccountController {
resultDto
.
setStatus
(
0
);
resultDto
.
setData
(
account1
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
...
...
@@ -113,29 +119,32 @@ public class AccountController {
resultDto
.
setStatus
(
0
);
}
catch
(
ClientRequestException
e
)
{
logger
.
error
(
"fail to send sms"
,
e
);
dealClientRequestException
(
resultDto
,
e
);
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
/**
* 用户注册
*/
@RequestMapping
(
path
=
"/signUp"
,
method
=
RequestMethod
.
POST
)
public
ResultDto
createNewAccount
(
@Valid
@RequestBody
User
user
)
{
ResultDto
resultDto
=
new
ResultDto
();
try
{
Account
account
=
new
Account
();
if
(!
StringUtils
.
isEmpty
(
user
.
getEmail
()))
{
if
(!
StringUtils
.
isEmpty
(
user
.
getEmail
()))
account
=
accountService
.
create
(
user
);
}
else
{
else
account
=
accountService
.
createWithSms
(
user
);
}
resultDto
.
setStatus
(
0
);
resultDto
.
setData
(
account
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
...
...
@@ -153,10 +162,7 @@ public class AccountController {
emailService
.
sendHtmlMail
(
"sales@cloudam.io"
,
"客户联系:"
+
contactUs
.
getName
(),
sb
.
toString
());
}
/**
* 费用明细
*/
// 消费总览
@RequestMapping
(
path
=
"/userbilling"
,
method
=
RequestMethod
.
POST
)
public
ResultDto
getUserBills0
(
Principal
principal
,
@RequestBody
UserPrePaidBillingRequestDto
userPrePaidBillingRequestDto
)
{
ResultDto
resultDto
=
new
ResultDto
();
...
...
@@ -164,7 +170,11 @@ public class AccountController {
resultDto
.
setData
(
accountService
.
getUserPrePaidBills
(
principal
.
getName
(),
userPrePaidBillingRequestDto
));
resultDto
.
setStatus
(
0
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
...
...
@@ -204,7 +214,11 @@ public class AccountController {
accountService
.
resetPassword
(
principal
.
getName
(),
user
);
resultDto
.
setStatus
(
0
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
...
...
@@ -221,30 +235,25 @@ public class AccountController {
accountService
.
resetPasswordWithOtp
(
user
);
resultDto
.
setStatus
(
0
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
/**
* 使用微信进行账户充值
*/
@RequestMapping
(
path
=
"/0xwxpayputorder/{amount}"
,
method
=
RequestMethod
.
GET
)
public
UserPaymentDto
wechatPayCallback
(
Principal
principal
,
@PathVariable
int
amount
)
{
return
paymentService
.
wxPutPayOrder
(
principal
.
getName
(),
amount
);
}
/**
* 使用微信进行账户充值成功后,微信会调用该接口
*/
@RequestMapping
(
path
=
"/0xwxpaycallback/{tradno}"
,
method
=
RequestMethod
.
GET
)
public
String
wechatPayCallback
(
@PathVariable
String
tradno
)
{
return
paymentService
.
wechatPayCallback
(
tradno
);
}
/**
* 使用微信进行账户充值成功后,微信会调用该接口
*/
@RequestMapping
(
path
=
"/0xwxcheckorderstatus/{tradno}/{chargeType}"
,
method
=
RequestMethod
.
GET
)
public
UserPaymentDto
wechatCheckOrderStatus
(
Principal
principal
,
@PathVariable
String
tradno
,
@PathVariable
int
chargeType
)
{
return
paymentService
.
wxCheckOrderStatus
(
tradno
,
chargeType
);
...
...
@@ -255,28 +264,19 @@ public class AccountController {
return
paymentService
.
wxCheckOrderStatus
(
tradno
,
chargeType
);
}
/**
* 使用 支付宝 充值 成功后回调
*/
@RequestMapping
(
path
=
"/0xalipaycallback/{tradno}"
,
method
=
RequestMethod
.
GET
)
public
void
alipayPayCallback
(
@PathVariable
String
tradno
)
{
paymentService
.
alipaCallback
(
tradno
);
}
/**
* 使用 支付宝 充值 成功后回调
*/
@RequestMapping
(
path
=
"/0xalicheckorderstatus/{tradno}/{chargeType}"
,
method
=
RequestMethod
.
GET
)
public
UserPaymentDto
alipayCheckOrderStatus
(
Principal
principal
,
@PathVariable
(
required
=
false
)
String
tradno
,
@PathVariable
int
chargeType
)
{
return
paymentService
.
aliCheckOrderStatus
(
tradno
,
chargeType
);
}
/**
* 使用 支付宝 充值
*/
@RequestMapping
(
path
=
"/0xalipay/{amount}"
,
method
=
RequestMethod
.
GET
)
public
void
alipayPutOrder
(
HttpServletRequest
request
,
HttpServletResponse
response
,
@PathVariable
int
amount
)
throws
Exception
{
String
by
=
request
.
getParameter
(
"by"
);
String
form
=
paymentService
.
alipayPutPayOrder
(
request
.
getUserPrincipal
().
getName
(),
amount
,
by
);
response
.
setContentType
(
"text/html;charset=utf-8"
);
...
...
@@ -428,7 +428,11 @@ public class AccountController {
accountService
.
authorizeCompany
(
principal
.
getName
(),
companyAuthorizeDto
);
resultDto
.
setStatus
(
0
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
...
...
@@ -473,13 +477,12 @@ public class AccountController {
else
resultDto
.
setStatus
(-
1
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
private
void
dealClientRequestException
(
ResultDto
resultDto
,
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
}
}
src/main/java/com/edgec/browserbackend/account/domain/Account.java
View file @
51b4192f
...
...
@@ -67,14 +67,8 @@ public class Account {
*/
private
int
permission
=
-
1
;
/**
* 注册成功后,当前用户的邀请码相关信息,用于邀请别人获取佣金
*/
private
Promotion
promotion
;
/**
* 注册时,其他用户给当前用户的邀请码
*/
private
String
promotionCode
;
private
String
comment
;
...
...
src/main/java/com/edgec/browserbackend/account/domain/IpChargeRequestDto.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
.
account
.
domain
;
import
lombok.Data
;
@Data
public
class
IpChargeRequestDto
{
private
int
period
;
private
int
amount
;
private
String
region
;
private
String
unit
=
"month"
;
private
String
unit
=
"month"
;
private
String
target
;
//0 -- 充值, 1 -- newip, 2 --renew, 3 -- 退还
...
...
@@ -21,10 +18,83 @@ public class IpChargeRequestDto {
private
String
services
;
/**
* 续费ip
*/
private
String
chargeIp
;
public
String
getServices
()
{
return
services
;
}
public
void
setServices
(
String
services
)
{
this
.
services
=
services
;
}
public
String
getTradeNo
()
{
return
tradeNo
;
}
public
void
setTradeNo
(
String
tradeNo
)
{
this
.
tradeNo
=
tradeNo
;
}
public
float
getDaysPerMonth
()
{
return
daysPerMonth
;
}
public
void
setDaysPerMonth
(
float
daysPerMonth
)
{
this
.
daysPerMonth
=
daysPerMonth
;
}
public
String
getTarget
()
{
return
target
;
}
public
void
setTarget
(
String
target
)
{
this
.
target
=
target
;
}
public
int
getChargeType
()
{
return
chargeType
;
}
public
void
setChargeType
(
int
chargeType
)
{
this
.
chargeType
=
chargeType
;
}
public
String
getUnit
()
{
return
unit
;
}
public
void
setUnit
(
String
unit
)
{
this
.
unit
=
unit
;
}
public
String
getRegion
()
{
return
region
;
}
public
void
setRegion
(
String
region
)
{
this
.
region
=
region
;
}
public
int
getPeriod
()
{
return
period
;
}
public
void
setPeriod
(
int
period
)
{
this
.
period
=
period
;
}
public
int
getAmount
()
{
return
amount
;
}
public
void
setAmount
(
int
amount
)
{
this
.
amount
=
amount
;
}
public
int
getPayMethod
()
{
return
payMethod
;
}
public
void
setPayMethod
(
int
payMethod
)
{
this
.
payMethod
=
payMethod
;
}
}
src/main/java/com/edgec/browserbackend/account/domain/IpChargeResultDto.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
.
account
.
domain
;
import
lombok.Data
;
@Data
public
class
IpChargeResultDto
{
/**
* 充值状态
*/
private
boolean
success
;
private
int
balance
;
/**
* 到账金额
*/
private
int
approvedAmount
;
public
boolean
isSuccess
()
{
return
success
;
}
public
void
setSuccess
(
boolean
success
)
{
this
.
success
=
success
;
}
public
int
getBalance
()
{
return
balance
;
}
public
void
setBalance
(
int
balance
)
{
this
.
balance
=
balance
;
}
public
int
getApprovedAmount
()
{
return
approvedAmount
;
}
public
void
setApprovedAmount
(
int
approvedAmount
)
{
this
.
approvedAmount
=
approvedAmount
;
}
}
src/main/java/com/edgec/browserbackend/account/domain/Otp.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
.
account
.
domain
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.Data
;
import
org.springframework.data.annotation.Id
;
import
org.springframework.data.mongodb.core.mapping.Document
;
@Data
@Document
(
collection
=
"phoneotp"
)
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
public
class
Otp
{
/**
* 手机号
*/
@Id
private
String
phone
;
/**
* 发送给用户的短信验证码
*/
private
String
otp
;
/**
* 短信验证码的发送时间
*/
private
long
createdAt
;
public
String
getPhone
()
{
return
phone
;
}
public
void
setPhone
(
String
phone
)
{
this
.
phone
=
phone
;
}
public
String
getOtp
()
{
return
otp
;
}
public
void
setOtp
(
String
otp
)
{
this
.
otp
=
otp
;
}
public
long
getCreatedAt
()
{
return
createdAt
;
}
public
void
setCreatedAt
(
long
createdAt
)
{
this
.
createdAt
=
createdAt
;
}
}
src/main/java/com/edgec/browserbackend/account/domain/Promotion.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
.
account
.
domain
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.Getter
;
import
lombok.Setter
;
/**
* @Desc
* @Author jason
* @CreateTime 2020/3/12 3:14 下午
**/
@Getter
@Setter
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
public
class
Promotion
{
/**
* 邀请码(用户邀请好友使用本产品)
*/
private
String
code
;
/**
* 邀请人数
*/
//邀请人数
private
int
invitedUsers
;
/**
* 好友本月以前总消费
*/
//好友本月以前总消费
private
int
totalCommission
;
/**
* 好友当月消费
*/
//好友当月消费
private
int
commission
;
/**
* 好友上月总消费
*/
//好友上月总消费
private
int
commissionLastMonth
;
/**
* 是否是本公司的销售
*/
//是否是本公司的销售
private
boolean
isSale
;
/**
* 当月礼金
*/
//当月礼金
private
double
gift
;
/**
* 所有未提现金额
*/
//所有未提现金额
private
double
allGift
;
/**
* 已提现金额
*/
//已提现金额
private
double
withdrawn
;
public
int
getCommission
()
{
return
commission
;
}
public
void
setCommission
(
int
commission
)
{
this
.
commission
=
commission
;
}
public
int
getInvitedUsers
()
{
return
invitedUsers
;
}
public
void
setInvitedUsers
(
int
invitedUsers
)
{
this
.
invitedUsers
=
invitedUsers
;
}
public
String
getCode
()
{
return
code
;
}
public
void
setCode
(
String
code
)
{
this
.
code
=
code
;
}
public
boolean
isSale
()
{
return
isSale
;
}
public
void
setSale
(
boolean
sale
)
{
isSale
=
sale
;
}
public
double
getGift
()
{
return
gift
;
}
public
void
setGift
(
double
gift
)
{
this
.
gift
=
gift
;
}
public
int
getCommissionLastMonth
()
{
return
commissionLastMonth
;
}
public
void
setCommissionLastMonth
(
int
commissionLastMonth
)
{
this
.
commissionLastMonth
=
commissionLastMonth
;
}
public
double
getAllGift
()
{
return
allGift
;
}
public
void
setAllGift
(
double
allGift
)
{
this
.
allGift
=
allGift
;
}
public
double
getWithdrawn
()
{
return
withdrawn
;
}
public
void
setWithdrawn
(
double
withdrawn
)
{
this
.
withdrawn
=
withdrawn
;
}
public
int
getTotalCommission
()
{
return
totalCommission
;
}
public
void
setTotalCommission
(
int
totalCommission
)
{
this
.
totalCommission
=
totalCommission
;
}
}
src/main/java/com/edgec/browserbackend/account/domain/User.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
.
account
.
domain
;
import
lombok.Data
;
import
org.hibernate.validator.constraints.Length
;
import
javax.validation.constraints.Email
;
...
...
@@ -8,16 +7,15 @@ import java.util.ArrayList;
import
java.util.List
;
import
java.util.UUID
;
@Data
public
class
User
{
@Length
(
min
=
3
,
max
=
20
,
message
=
"Name length should be between 3 - 20"
)
@Length
(
min
=
3
,
max
=
20
,
message
=
"Name length should be between 3 - 20"
)
private
String
username
;
@Length
(
min
=
6
,
max
=
40
,
message
=
"Password length should be between 6 - 40"
)
@Length
(
min
=
6
,
max
=
40
,
message
=
"Password length should be between 6 - 40"
)
private
String
password
;
@Email
(
message
=
"Invalid email address"
)
@Email
(
message
=
"Invalid email address"
)
private
String
email
;
private
String
phone
;
...
...
@@ -30,12 +28,108 @@ public class User {
private
String
lockReason
;
public
String
getAuthCode
()
{
return
authCode
;
}
public
void
setAuthCode
(
String
authCode
)
{
this
.
authCode
=
authCode
;
}
public
String
getPhone
()
{
return
phone
;
}
public
void
setPhone
(
String
phone
)
{
this
.
phone
=
phone
;
}
private
boolean
allowedToCreateSubUser
=
true
;
private
int
permission
;
private
List
<
String
>
whiteList
=
new
ArrayList
<>();
private
String
verificationCode
=
UUID
.
randomUUID
().
toString
();
private
String
verificationCode
=
UUID
.
randomUUID
().
toString
();
public
boolean
isEnabled
()
{
return
enabled
;
}
public
void
setEnabled
(
boolean
enabled
)
{
this
.
enabled
=
enabled
;
}
public
String
getVerificationCode
()
{
return
verificationCode
;
}
public
void
setVerificationCode
(
String
verificationCode
)
{
this
.
verificationCode
=
verificationCode
;
}
public
String
getEmail
()
{
return
email
;
}
public
void
setEmail
(
String
email
)
{
this
.
email
=
email
;
}
public
String
getUsername
()
{
return
username
;
}
public
void
setUsername
(
String
username
)
{
this
.
username
=
username
;
}
public
String
getPassword
()
{
return
password
;
}
public
void
setPassword
(
String
password
)
{
this
.
password
=
password
;
}
public
boolean
isAllowedToCreateSubUser
()
{
return
allowedToCreateSubUser
;
}
public
void
setAllowedToCreateSubUser
(
boolean
allowedToCreateSubUser
)
{
allowedToCreateSubUser
=
allowedToCreateSubUser
;
}
public
int
getPermission
()
{
return
permission
;
}
public
void
setPermission
(
int
permission
)
{
this
.
permission
=
permission
;
}
public
String
getLockReason
()
{
return
lockReason
;
}
public
void
setLockReason
(
String
lockReason
)
{
this
.
lockReason
=
lockReason
;
}
public
List
<
String
>
getWhiteList
()
{
return
whiteList
;
}
public
void
setWhiteList
(
List
<
String
>
whiteList
)
{
this
.
whiteList
=
whiteList
;
}
public
String
getPromotionCode
()
{
return
promotionCode
;
}
public
void
setPromotionCode
(
String
promotionCode
)
{
this
.
promotionCode
=
promotionCode
;
}
}
src/main/java/com/edgec/browserbackend/account/domain/UserBalance.java
View file @
51b4192f
...
...
@@ -2,27 +2,41 @@ package com.edgec.browserbackend.account.domain;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.Getter
;
import
lombok.Setter
;
import
org.springframework.data.annotation.Id
;
import
org.springframework.data.mongodb.core.mapping.Document
;
@Getter
@Setter
@Document
(
collection
=
"userbalance"
)
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
public
class
UserBalance
{
/**
* 用户手机号
*/
@Id
private
String
username
;
/**
* 账户余额
*/
private
float
balanced
;
private
float
used
;
public
String
getUsername
()
{
return
username
;
}
public
void
setUsername
(
String
username
)
{
this
.
username
=
username
;
}
public
float
getBalanced
()
{
return
balanced
;
}
public
void
setBalanced
(
float
balanced
)
{
this
.
balanced
=
balanced
;
}
public
float
getUsed
()
{
return
used
;
}
public
void
setUsed
(
float
used
)
{
this
.
used
=
used
;
}
}
src/main/java/com/edgec/browserbackend/account/domain/UserPayment.java
View file @
51b4192f
...
...
@@ -2,16 +2,12 @@ package com.edgec.browserbackend.account.domain;
import
com.edgec.browserbackend.account.service.SmsUtils
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.Getter
;
import
lombok.Setter
;
import
org.springframework.data.annotation.Id
;
import
org.springframework.data.mongodb.core.mapping.Document
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
@Getter
@Setter
@Document
(
collection
=
"userpayment"
)
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
public
class
UserPayment
{
...
...
@@ -19,7 +15,7 @@ public class UserPayment {
@Id
private
String
id
;
private
String
tradeNo
=
new
SimpleDateFormat
(
"yyyyMMddHHmmss"
).
format
(
new
Date
())
+
SmsUtils
.
createRandom
(
true
,
4
);
private
String
tradeNo
=
new
SimpleDateFormat
(
"yyyyMMddHHmmss"
).
format
(
new
Date
())
+
SmsUtils
.
createRandom
(
true
,
4
);
private
String
username
;
...
...
@@ -32,4 +28,69 @@ public class UserPayment {
private
PaymentMethod
paymentMethod
;
private
String
transId
;
public
String
getId
()
{
return
id
;
}
public
void
setId
(
String
id
)
{
this
.
id
=
id
;
}
public
String
getTradeNo
()
{
return
tradeNo
;
}
public
void
setTradeNo
(
String
tradeNo
)
{
this
.
tradeNo
=
tradeNo
;
}
public
String
getUsername
()
{
return
username
;
}
public
void
setUsername
(
String
username
)
{
this
.
username
=
username
;
}
public
int
getAmount
()
{
return
amount
;
}
public
void
setAmount
(
int
amount
)
{
this
.
amount
=
amount
;
}
public
boolean
isSucceed
()
{
return
succeed
;
}
public
void
setSucceed
(
boolean
succeed
)
{
this
.
succeed
=
succeed
;
}
public
Date
getPaymentDate
()
{
return
paymentDate
;
}
public
void
setPaymentDate
(
Date
paymentDate
)
{
this
.
paymentDate
=
paymentDate
;
}
public
PaymentMethod
getPaymentMethod
()
{
return
paymentMethod
;
}
public
void
setPaymentMethod
(
PaymentMethod
paymentMethod
)
{
this
.
paymentMethod
=
paymentMethod
;
}
public
String
getTransId
()
{
return
transId
;
}
public
void
setTransId
(
String
transId
)
{
this
.
transId
=
transId
;
}
}
src/main/java/com/edgec/browserbackend/account/domain/UserPrePaidBilling.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
.
account
.
domain
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
lombok.Getter
;
import
lombok.Setter
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.data.annotation.Id
;
import
org.springframework.data.mongodb.core.index.CompoundIndex
;
import
org.springframework.data.mongodb.core.mapping.Document
;
...
...
@@ -10,8 +9,6 @@ import org.springframework.data.mongodb.core.mapping.Document;
import
java.util.ArrayList
;
import
java.util.List
;
@Getter
@Setter
@Document
(
collection
=
"userprepaidbilling"
)
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
@CompoundIndex
(
name
=
"idx_username_timestamp"
,
def
=
"{'username': 1, 'timestamp': 1}"
)
...
...
@@ -40,21 +37,13 @@ public class UserPrePaidBilling {
private
BillStatus
status
;
/**
* 0 -- 余额, 1 -- 支付宝, 2 -- 微信, 3 -- 银行转账
*/
//0 -- 余额, 1 -- 支付宝, 2 -- 微信, 3 -- 银行转账
private
int
payMethod
;
private
boolean
isPrepaid
;
/**
* 本次消费金额
*/
private
float
total
;
/**
* 0 -- 充值, 1 -- newip, 2 -- renew, 3 -- return, 4 -- 礼金提现
*/
//0 -- 充值, 1 -- newip, 2 -- renew, 3 -- return, 4 -- 礼金提现
private
int
chargeType
;
private
String
unit
=
"month"
;
...
...
@@ -63,15 +52,161 @@ public class UserPrePaidBilling {
private
float
balanced
;
/**
* 购买或者续费的ip 号
*/
private
String
chargeIp
;
private
List
<
DeductionRecord
>
deductionRecords
=
new
ArrayList
<>();
public
float
getRate
()
{
return
rate
;
}
public
float
getTotal
()
{
return
total
;
}
public
void
setRate
(
float
rate
)
{
this
.
rate
=
rate
;
}
public
void
setTotal
(
float
total
)
{
this
.
total
=
total
;
}
public
int
getChargeType
()
{
return
chargeType
;
}
public
void
setChargeType
(
int
chargeType
)
{
this
.
chargeType
=
chargeType
;
}
public
String
getUnit
()
{
return
unit
;
}
public
void
setUnit
(
String
unit
)
{
this
.
unit
=
unit
;
}
public
String
getId
()
{
return
id
;
}
public
void
setId
(
String
id
)
{
this
.
id
=
id
;
}
public
String
getUsername
()
{
return
username
;
}
public
void
setUsername
(
String
username
)
{
this
.
username
=
username
;
}
public
int
getYear
()
{
return
year
;
}
public
void
setYear
(
int
year
)
{
this
.
year
=
year
;
}
public
int
getMonth
()
{
return
month
;
}
public
void
setMonth
(
int
month
)
{
this
.
month
=
month
;
}
public
long
getTimestamp
()
{
return
timestamp
;
}
public
void
setTimestamp
(
long
timestamp
)
{
this
.
timestamp
=
timestamp
;
}
public
Services
getServices
()
{
return
services
;
}
public
void
setServices
(
Services
services
)
{
this
.
services
=
services
;
}
public
BillStatus
getStatus
()
{
return
status
;
}
public
void
setStatus
(
BillStatus
status
)
{
this
.
status
=
status
;
}
public
boolean
isPrepaid
()
{
return
isPrepaid
;
}
public
void
setPrepaid
(
boolean
prepaid
)
{
this
.
isPrepaid
=
prepaid
;
}
public
List
<
DeductionRecord
>
getDeductionRecords
()
{
return
deductionRecords
;
}
public
void
setDeductionRecords
(
List
<
DeductionRecord
>
deductionRecords
)
{
this
.
deductionRecords
=
deductionRecords
;
}
public
void
addDeductionRecord
(
DeductionRecord
record
)
{
this
.
deductionRecords
.
add
(
record
);
}
public
int
getAmount
()
{
return
amount
;
}
public
void
setAmount
(
int
amount
)
{
this
.
amount
=
amount
;
}
public
int
getPeriod
()
{
return
period
;
}
public
void
setPeriod
(
int
period
)
{
this
.
period
=
period
;
}
public
int
getPayMethod
()
{
return
payMethod
;
}
public
void
setPayMethod
(
int
payMethod
)
{
this
.
payMethod
=
payMethod
;
}
public
String
getTradeNo
()
{
return
tradeNo
;
}
public
void
setTradeNo
(
String
tradeNo
)
{
this
.
tradeNo
=
tradeNo
;
}
public
String
getAdministrator
()
{
return
administrator
;
}
public
void
setAdministrator
(
String
administrator
)
{
this
.
administrator
=
administrator
;
}
public
float
getBalanced
()
{
return
balanced
;
}
public
void
setBalanced
(
float
balanced
)
{
this
.
balanced
=
balanced
;
}
}
src/main/java/com/edgec/browserbackend/account/dto/BillQueryResultDto.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
.
account
.
dto
;
import
com.edgec.browserbackend.account.domain.Promotion
;
import
com.edgec.browserbackend.account.domain.UserPrePaidBilling
;
import
org.springframework.data.domain.Page
;
import
java.util.List
;
public
class
BillQueryResultDto
{
double
parentExpense
;
...
...
src/main/java/com/edgec/browserbackend/account/repository/AccountRepositoryCustomImpl.java
View file @
51b4192f
...
...
@@ -59,6 +59,8 @@ public class AccountRepositoryCustomImpl implements AccountRepositoryCustom {
basicQuery
.
addCriteria
(
where
(
"promotion.code"
).
is
(
code
).
and
(
"parent"
).
exists
(
false
));
Account
account
=
mongoTemplate
.
findOne
(
basicQuery
,
Account
.
class
);
if
(
account
==
null
)
return
null
;
return
account
;
}
}
src/main/java/com/edgec/browserbackend/account/repository/UserPaymentRepositoryCustomImpl.java
View file @
51b4192f
...
...
@@ -24,7 +24,10 @@ public class UserPaymentRepositoryCustomImpl implements UserPaymentRepositoryCus
update
.
set
(
"succeed"
,
result
);
UpdateResult
operation
=
mongoTemplate
.
updateFirst
(
basicQuery
,
update
,
UserPayment
.
class
);
return
operation
.
getModifiedCount
()
>=
1
;
if
(
operation
.
getModifiedCount
()
<
1
)
return
false
;
else
return
true
;
}
}
src/main/java/com/edgec/browserbackend/account/service/impl/AccountServiceImpl.java
View file @
51b4192f
...
...
@@ -21,7 +21,6 @@ import com.edgec.browserbackend.browser.service.ShopService;
import
com.edgec.browserbackend.common.commons.error.ClientRequestException
;
import
com.edgec.browserbackend.common.utils.Aes
;
import
com.edgec.browserbackend.common.utils.FileUtil
;
import
org.jetbrains.annotations.NotNull
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -187,15 +186,13 @@ public class AccountServiceImpl implements AccountService {
@Override
public
IpChargeResultDto
chargeByMoney
(
String
name
,
double
money
,
IpChargeRequestDto
requestDto
)
{
IpChargeResultDto
charge
=
new
IpChargeResultDto
();
CompletableFuture
.
runAsync
(
()
->
{
CompletableFuture
.
runAsync
(()
->
{
charge
.
setApprovedAmount
(
0
);
charge
.
setSuccess
(
true
);
Account
account
=
accountRepository
.
findByName
(
name
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
!=
null
)
{
UserBalance
userBalance
=
userBalanceRepository
.
findById
(
name
).
orElse
(
null
);
// 如果 userBalance 不存在,则创建
if
(
userBalance
==
null
)
{
userBalance
=
new
UserBalance
();
userBalance
.
setBalanced
(
0
);
...
...
@@ -204,22 +201,41 @@ public class AccountServiceImpl implements AccountService {
userBalanceRepository
.
save
(
userBalance
);
}
// 更新 userbalance
userBalanceRepository
.
incrementBalance
(
userBalance
,
-(
float
)
money
,
(
float
)
money
);
// 获取更新后的 userbalance
userBalance
=
userBalanceRepository
.
findById
(
name
).
orElse
(
null
);
charge
.
setBalance
(
Math
.
round
(
userBalance
.
getBalanced
()));
charge
.
setSuccess
(
true
);
// 封装 userprepaidbilling 信息 并保存
UserPrePaidBilling
bill
=
getUserPrePaidBilling
(
name
,
(
float
)
money
,
requestDto
,
account
,
userBalance
);
UserPrePaidBilling
bill
=
new
UserPrePaidBilling
();
if
(
account
.
getParent
()
!=
null
)
bill
.
setAdministrator
(
account
.
getParent
());
else
bill
.
setAdministrator
(
account
.
getName
());
bill
.
setTradeNo
(
new
SimpleDateFormat
(
"yyyyMMddHHmmss"
).
format
(
new
Date
())
+
SmsUtils
.
createRandom
(
true
,
4
));
bill
.
setChargeType
(
requestDto
.
getChargeType
());
bill
.
setAmount
(
requestDto
.
getAmount
());
bill
.
setUnit
(
requestDto
.
getUnit
());
bill
.
setPeriod
(
requestDto
.
getPeriod
());
bill
.
setPayMethod
(
requestDto
.
getPayMethod
());
bill
.
setUsername
(
name
);
bill
.
setTotal
((
float
)
money
);
bill
.
setStatus
(
BillStatus
.
PAID
);
bill
.
setPrepaid
(
true
);
bill
.
setTimestamp
(
Instant
.
now
().
toEpochMilli
());
final
YearMonth
lastmonth
=
YearMonth
.
now
();
int
monthValue
=
lastmonth
.
getMonthValue
();
int
year
=
lastmonth
.
getYear
();
bill
.
setYear
(
year
);
bill
.
setMonth
(
monthValue
);
bill
.
setBalanced
(
userBalance
.
getBalanced
());
prePaidBillingRepository
.
save
(
bill
);
}
},
AccountServicePool
.
taskPool
).
join
();
},
AccountServicePool
.
taskPool
).
join
();
return
charge
;
}
...
...
@@ -237,37 +253,27 @@ public class AccountServiceImpl implements AccountService {
return
"success"
;
}
/**
* 封装 预充值扣费 信息
*/
@Override
public
IpChargeResultDto
preChargeByMoney
(
String
name
,
double
money
)
{
IpChargeResultDto
precharge
=
new
IpChargeResultDto
();
CompletableFuture
.
runAsync
(
()
->
{
CompletableFuture
.
runAsync
(()
->
{
precharge
.
setApprovedAmount
(
0
);
precharge
.
setSuccess
(
false
);
Account
account
=
accountRepository
.
findByName
(
name
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
!=
null
)
{
UserBalance
userBalance
=
userBalanceRepository
.
findById
(
name
).
orElse
(
null
);
float
balance
=
0
;
if
(
userBalance
!=
null
)
{
if
(
userBalance
!=
null
)
balance
=
userBalance
.
getBalanced
();
}
// 如果账户余额 比 扣费的 多,则设置为成功,并重新设置账户余额
if
(
balance
>=
money
)
{
precharge
.
setBalance
((
int
)
Math
.
round
(
balance
-
money
));
precharge
.
setSuccess
(
true
);
}
else
{
// todo 钱不够了,不是应该提示该充值么
precharge
.
setBalance
(
Math
.
round
(
balance
));
}
}
},
AccountServicePool
.
taskPool
).
join
();
},
AccountServicePool
.
taskPool
).
join
();
return
precharge
;
}
...
...
@@ -420,17 +426,25 @@ public class AccountServiceImpl implements AccountService {
@Override
public
Account
createWithSms
(
User
user
)
{
// 1. 校验注册用户是否已存在
Account
existing1
=
accountRepository
.
findByName
(
user
.
getUsername
()).
orElse
(
null
);
Account
existing2
=
accountRepository
.
findByPhoneNumber
(
user
.
getUsername
());
Account
existing3
=
accountRepository
.
findByPhoneNumber
(
user
.
getPhone
());
Account
existing4
=
accountRepository
.
findByName
(
user
.
getPhone
()).
orElse
(
null
);
if
(
existing1
!=
null
||
existing2
!=
null
||
existing3
!=
null
||
existing4
!=
null
)
{
Account
existing
=
accountRepository
.
findByName
(
user
.
getUsername
()).
orElse
(
null
);
if
(
existing
!=
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMEEXIST
,
"account already exists: "
+
user
.
getUsername
());
}
// 2. 校验用户输入的短信验证码是否正确
existing
=
accountRepository
.
findByPhoneNumber
(
user
.
getUsername
());
if
(
existing
!=
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMEEXIST
,
"account already exists: "
+
user
.
getUsername
());
existing
=
accountRepository
.
findByPhoneNumber
(
user
.
getPhone
());
if
(
existing
!=
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
PHONEEXIST
,
"phone number already exists: "
+
user
.
getPhone
());
existing
=
accountRepository
.
findByName
(
user
.
getPhone
()).
orElse
(
null
);
if
(
existing
!=
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
PHONEEXIST
,
"phone number already exists: "
+
user
.
getPhone
());
Otp
otp
=
otpRepository
.
findByPhoneAndCreatedAtGreaterThanEqual
(
user
.
getUsername
(),
Instant
.
now
().
minusSeconds
(
600
).
toEpochMilli
());
if
(
otp
==
null
)
{
throw
new
ClientRequestException
(
AccountErrorCode
.
OTPWRONG
,
AccountErrorCode
.
OTPWRONG
.
getReason
());
}
...
...
@@ -440,69 +454,85 @@ public class AccountServiceImpl implements AccountService {
// otpRepository.delete(otp);
}
// 3. 若用户注册时输入了邀请码,则更新邀请人的 account 信息
Account
account
=
new
Account
();
account
.
setName
(
user
.
getUsername
());
account
.
setLastSeen
(
new
Date
());
account
.
setEmail
(
user
.
getEmail
());
account
.
setPhoneNumber
(
user
.
getUsername
());
account
.
setPermission
(
15
);
if
(
user
.
getPromotionCode
()
!=
null
)
{
account
.
setPromotionCode
(
user
.
getPromotionCode
());
}
Account
inviter
=
accountRepository
.
findByPromotion
(
user
.
getPromotionCode
());
if
(
inviter
!=
null
)
{
inviter
.
getPromotion
().
setInvitedUsers
(
inviter
.
getPromotion
().
getInvitedUsers
()
+
1
);
accountRepository
.
save
(
inviter
);
}
// 4. 创建 User
Account
pExisting
=
null
;
String
random
=
null
;
do
{
random
=
String
.
valueOf
((
int
)
((
Math
.
random
()
*
9
+
1
)
*
100000
));
pExisting
=
accountRepository
.
findByPromotion
(
random
);
}
while
(
pExisting
!=
null
);
Promotion
promotion
=
new
Promotion
();
promotion
.
setCode
(
random
);
promotion
.
setInvitedUsers
(
0
);
promotion
.
setCommission
(
0
);
account
.
setPromotion
(
promotion
);
account
.
setAllowedToCreateSubUser
(
true
);
List
<
String
>
whiteList
=
new
ArrayList
<>();
if
(
user
.
getWhiteList
()
!=
null
&&
user
.
getWhiteList
().
size
()
>
0
)
whiteList
.
addAll
(
user
.
getWhiteList
());
account
.
setWhiteList
(
whiteList
);
user
.
setEnabled
(
true
);
userService
.
create
(
new
com
.
edgec
.
browserbackend
.
auth
.
domain
.
User
(
user
));
// 5. 封装用户账户 并 创建
Account
account
=
buildAccount
(
user
);
userService
.
create
(
new
com
.
edgec
.
browserbackend
.
auth
.
domain
.
User
(
user
));
accountRepository
.
save
(
account
);
JSONObject
param
=
new
JSONObject
();
param
.
put
(
"newuser"
,
account
.
getName
());
if
(
inviter
!=
null
)
{
if
(
inviter
!=
null
)
param
.
put
(
"referral"
,
inviter
.
getName
()
+
"("
+
user
.
getPromotionCode
()
+
")"
);
}
else
{
else
param
.
put
(
"referral"
,
"123456"
);
}
com
.
edgec
.
browserbackend
.
common
.
commons
.
utils
.
SmsUtils
.
sendNewAccountSms
(
"15919921106"
,
com
.
edgec
.
browserbackend
.
common
.
commons
.
utils
.
SmsUtils
.
SmsTemplateCode
.
NEWACCOUNT
,
param
);
com
.
edgec
.
browserbackend
.
common
.
commons
.
utils
.
SmsUtils
.
sendNewAccountSms
(
"13570690305"
,
com
.
edgec
.
browserbackend
.
common
.
commons
.
utils
.
SmsUtils
.
SmsTemplateCode
.
NEWACCOUNT
,
param
);
com
.
edgec
.
browserbackend
.
common
.
commons
.
utils
.
SmsUtils
.
sendNewAccountSms
(
"13802945832"
,
com
.
edgec
.
browserbackend
.
common
.
commons
.
utils
.
SmsUtils
.
SmsTemplateCode
.
NEWACCOUNT
,
param
);
// 6. 使用手机注册就送 12 元体验金
paymentService
.
bankTransferInsertion
(
account
.
getName
(),
12
);
log
.
info
(
"new account has been created: "
+
account
.
getName
());
// 7. 发送注册成功的邮件
notifyCustomerRegister
(
account
);
return
account
;
}
public
Account
create
(
User
user
,
String
parentName
)
{
// 1. 校验用户是否已注册
Account
existing
=
accountRepository
.
findByName
(
user
.
getUsername
()).
orElse
(
null
);
if
(
existing
!=
null
)
{
if
(
existing
!=
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMEEXIST
,
"account already exists: "
+
user
.
getUsername
());
}
existing
=
accountRepository
.
findByPhoneNumber
(
user
.
getUsername
());
if
(
existing
!=
null
)
{
if
(
existing
!=
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMEEXIST
,
"account already exists: "
+
user
.
getUsername
());
}
existing
=
accountRepository
.
findByEmail
(
user
.
getEmail
());
if
(
existing
!=
null
)
{
if
(
existing
!=
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
EMAILEXIST
,
"email already exists: "
+
user
.
getEmail
());
}
// 2. 发送校验邮件
emailService
.
sendEmailVerification
(
user
.
getUsername
(),
user
.
getEmail
(),
user
.
getVerificationCode
());
// 3. 创建 User
user
.
setEnabled
(
false
);
userService
.
create
(
new
com
.
edgec
.
browserbackend
.
auth
.
domain
.
User
(
user
));
// 4. 创建用户账户
Account
account
=
new
Account
();
account
.
setName
(
user
.
getUsername
());
account
.
setLastSeen
(
new
Date
());
account
.
setEmail
(
user
.
getEmail
());
if
(
StringUtils
.
isEmpty
(
parentName
))
{
account
.
setAllowedToCreateSubUser
(
true
);
account
.
setPermission
(
Integer
.
valueOf
(
"1111"
,
2
));
...
...
@@ -510,23 +540,42 @@ public class AccountServiceImpl implements AccountService {
account
.
setAllowedToCreateSubUser
(
user
.
isAllowedToCreateSubUser
());
account
.
setPermission
(
user
.
getPermission
());
}
account
.
setParent
(
parentName
);
emailService
.
sendEmailVerification
(
user
.
getUsername
(),
user
.
getEmail
(),
user
.
getVerificationCode
());
userService
.
create
(
new
com
.
edgec
.
browserbackend
.
auth
.
domain
.
User
(
user
));
accountRepository
.
save
(
account
);
log
.
info
(
"new account has been created: "
+
account
.
getName
());
// SmsUtils.notifyNewUserRegistered();
// 5. 发送注册成功的邮件
notifyCustomerRegister
(
account
);
return
account
;
}
private
void
notifyCustomerRegister
(
Account
contactUs
)
{
StringBuilder
sb
=
new
StringBuilder
();
sb
.
append
(
"Name: "
+
contactUs
.
getName
()
+
"<br/>"
);
sb
.
append
(
"Email: "
+
contactUs
.
getEmail
()
+
"<br/>"
);
sb
.
append
(
"Phone: "
+
contactUs
.
getPhoneNumber
()
+
"<br/>"
);
sb
.
append
(
"Company: "
+
contactUs
.
getCompanyName
()
+
"<br/>"
);
sb
.
append
(
"Title: "
+
contactUs
.
getJobTitle
()
+
"<br/>"
);
try
{
emailService
.
sendHtmlMail
(
"sales@cloudam.io"
,
"新客户注册:"
+
contactUs
.
getName
(),
sb
.
toString
());
}
catch
(
Exception
e
)
{
log
.
error
(
"sending email fails on customer regisration"
,
e
);
}
}
@Override
public
List
<
UserDto
>
getAllDesendentUsers
(
String
name
,
int
level
)
{
if
(
level
==
-
1
)
{
//find its parent.
String
parent
=
accountRepository
.
findByName
(
name
).
get
(
).
getParent
();
String
parent
=
accountRepository
.
findByName
(
name
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
)
).
getParent
();
if
(
StringUtils
.
isEmpty
(
parent
))
return
Arrays
.
asList
();
...
...
@@ -655,6 +704,8 @@ public class AccountServiceImpl implements AccountService {
@Override
public
void
createSubUsers
(
String
name
,
SubUsersRequestDto
subUsersRequestDto
)
{
Account
existing
=
accountRepository
.
findByName
(
name
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
existing
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
,
"account does not exist: "
+
name
);
if
(!
existing
.
isAllowedToCreateSubUser
()
&&
!
StringUtils
.
isEmpty
(
existing
.
getParent
()))
throw
new
ClientRequestException
(
AccountErrorCode
.
NOTALLOWEDTOCREATESUBUSER
,
"Not allowed to create sub user"
);
...
...
@@ -1149,87 +1200,4 @@ public class AccountServiceImpl implements AccountService {
return
false
;
}
}
private
void
notifyCustomerRegister
(
Account
contactUs
)
{
StringBuilder
sb
=
new
StringBuilder
();
sb
.
append
(
"Name: "
+
contactUs
.
getName
()
+
"<br/>"
);
sb
.
append
(
"Email: "
+
contactUs
.
getEmail
()
+
"<br/>"
);
sb
.
append
(
"Phone: "
+
contactUs
.
getPhoneNumber
()
+
"<br/>"
);
sb
.
append
(
"Company: "
+
contactUs
.
getCompanyName
()
+
"<br/>"
);
sb
.
append
(
"Title: "
+
contactUs
.
getJobTitle
()
+
"<br/>"
);
try
{
emailService
.
sendHtmlMail
(
"sales@cloudam.io"
,
"新客户注册:"
+
contactUs
.
getName
(),
sb
.
toString
());
}
catch
(
Exception
e
)
{
log
.
error
(
"sending email fails on customer regisration"
,
e
);
}
}
@NotNull
private
UserPrePaidBilling
getUserPrePaidBilling
(
String
name
,
float
money
,
IpChargeRequestDto
requestDto
,
Account
account
,
UserBalance
userBalance
)
{
UserPrePaidBilling
bill
=
new
UserPrePaidBilling
();
if
(
account
.
getParent
()
!=
null
)
{
bill
.
setAdministrator
(
account
.
getParent
());
}
else
{
bill
.
setAdministrator
(
account
.
getName
());
}
bill
.
setTradeNo
(
new
SimpleDateFormat
(
"yyyyMMddHHmmss"
).
format
(
new
Date
())
+
SmsUtils
.
createRandom
(
true
,
4
));
bill
.
setChargeType
(
requestDto
.
getChargeType
());
if
(
requestDto
.
getChargeIp
()
!=
null
)
{
bill
.
setChargeIp
(
requestDto
.
getChargeIp
());
}
bill
.
setAmount
(
requestDto
.
getAmount
());
bill
.
setUnit
(
requestDto
.
getUnit
());
bill
.
setPeriod
(
requestDto
.
getPeriod
());
bill
.
setPayMethod
(
requestDto
.
getPayMethod
());
bill
.
setUsername
(
name
);
bill
.
setTotal
(
money
);
bill
.
setStatus
(
BillStatus
.
PAID
);
bill
.
setPrepaid
(
true
);
bill
.
setTimestamp
(
Instant
.
now
().
toEpochMilli
());
final
YearMonth
lastmonth
=
YearMonth
.
now
();
int
monthValue
=
lastmonth
.
getMonthValue
();
int
year
=
lastmonth
.
getYear
();
bill
.
setYear
(
year
);
bill
.
setMonth
(
monthValue
);
bill
.
setBalanced
(
userBalance
.
getBalanced
());
return
bill
;
}
@NotNull
private
Account
buildAccount
(
User
user
)
{
Account
account
=
new
Account
();
account
.
setName
(
user
.
getUsername
());
account
.
setLastSeen
(
new
Date
());
account
.
setEmail
(
user
.
getEmail
());
account
.
setPhoneNumber
(
user
.
getUsername
());
account
.
setPermission
(
15
);
if
(
user
.
getPromotionCode
()
!=
null
)
{
account
.
setPromotionCode
(
user
.
getPromotionCode
());
}
Account
pExisting
=
null
;
String
random
=
null
;
do
{
random
=
String
.
valueOf
((
int
)
((
Math
.
random
()
*
9
+
1
)
*
100000
));
pExisting
=
accountRepository
.
findByPromotion
(
random
);
}
while
(
pExisting
!=
null
);
Promotion
promotion
=
new
Promotion
();
promotion
.
setCode
(
random
);
promotion
.
setInvitedUsers
(
0
);
promotion
.
setCommission
(
0
);
account
.
setPromotion
(
promotion
);
account
.
setAllowedToCreateSubUser
(
true
);
List
<
String
>
whiteList
=
new
ArrayList
<>();
if
(
user
.
getWhiteList
()
!=
null
&&
user
.
getWhiteList
().
size
()
>
0
)
{
whiteList
.
addAll
(
user
.
getWhiteList
());
}
account
.
setWhiteList
(
whiteList
);
return
account
;
}
}
src/main/java/com/edgec/browserbackend/account/service/impl/AdministratorServiceImpl.java
View file @
51b4192f
...
...
@@ -366,6 +366,8 @@ public class AdministratorServiceImpl implements AdministratorService {
@Override
public
void
addPromotionCode
(
String
username
,
String
promotionCode
)
{
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
account
.
setPromotionCode
(
promotionCode
);
accountRepository
.
save
(
account
);
}
...
...
@@ -495,6 +497,8 @@ public class AdministratorServiceImpl implements AdministratorService {
@Override
public
void
addUserWhiteList
(
String
username
,
String
website
)
{
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
account
.
getWhiteList
().
add
(
website
);
accountRepository
.
save
(
account
);
}
...
...
src/main/java/com/edgec/browserbackend/account/service/impl/EmailServiceImpl.java
View file @
51b4192f
...
...
@@ -37,20 +37,18 @@ public class EmailServiceImpl implements EmailService {
context
.
setVariable
(
"code"
,
code
);
context
.
setVariable
(
"time"
,
ZonedDateTime
.
ofInstant
(
Instant
.
now
(),
ZoneId
.
systemDefault
()).
format
(
DateTimeFormatter
.
ofPattern
(
"uuuu-MM-dd HH:mm:ss"
)));
String
emailContent
=
templateEngine
.
process
(
"reset"
,
context
);
sendHtmlMail
(
email
,
"Cloudam云端软件 | 密码重置"
,
emailContent
);
sendHtmlMail
(
email
,
"Cloudam云端软件 | 密码重置"
,
emailContent
);
}
@Override
public
void
sendEmailVerification
(
String
username
,
String
email
,
String
code
)
{
Context
context
=
new
Context
();
context
.
setVariable
(
"id"
,
username
);
context
.
setVariable
(
"code"
,
code
);
context
.
setVariable
(
"time"
,
ZonedDateTime
.
ofInstant
(
Instant
.
now
(),
ZoneId
.
systemDefault
()).
format
(
DateTimeFormatter
.
ofPattern
(
"uuuu-MM-dd HH:mm:ss"
)));
String
emailContent
=
templateEngine
.
process
(
"verification"
,
context
);
sendHtmlMail
(
email
,
"Cloudam云端软件 | 注册邮箱验证"
,
emailContent
);
sendHtmlMail
(
email
,
"Cloudam云端软件 | 注册邮箱验证"
,
emailContent
);
}
@Override
public
void
sendHtmlMail
(
String
to
,
String
subject
,
String
content
)
{
MimeMessage
message
=
mailSender
.
createMimeMessage
();
try
{
...
...
src/main/java/com/edgec/browserbackend/account/service/impl/PaymentServiceImpl.java
View file @
51b4192f
...
...
@@ -26,7 +26,6 @@ import com.edgec.browserbackend.common.commons.error.ClientRequestException;
import
com.edgec.browserbackend.wxpay.*
;
import
com.google.gson.Gson
;
import
org.apache.commons.lang3.StringUtils
;
import
org.jetbrains.annotations.NotNull
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -67,8 +66,9 @@ public class PaymentServiceImpl implements PaymentService {
@Override
public
String
wechatPayCallback
(
String
tradno
)
{
// 当微信回调该接口时,说明微信那边已经充值成功,这个时候需要更新系统中 userpayment 充值状态
UserPayment
byTradeNo
=
userPaymentRepository
.
findByTradeNo
(
tradno
);
if
(
byTradeNo
!=
null
&&
!
byTradeNo
.
isSucceed
())
{
wxCheckOrderStatus
(
byTradeNo
.
getTradeNo
(),
0
);
}
...
...
@@ -82,6 +82,7 @@ public class PaymentServiceImpl implements PaymentService {
@Override
public
void
alipaCallback
(
String
tradno
)
{
UserPayment
byTradeNo
=
userPaymentRepository
.
findByTradeNo
(
tradno
);
if
(
byTradeNo
!=
null
&&
!
byTradeNo
.
isSucceed
())
{
aliCheckOrderStatus
(
byTradeNo
.
getTradeNo
(),
0
);
}
...
...
@@ -89,53 +90,130 @@ public class PaymentServiceImpl implements PaymentService {
@Override
public
UserPaymentDto
wxCheckOrderStatus
(
String
tradeno
,
int
chargeType
)
{
// 校验数据
UserPaymentDto
result
=
new
UserPaymentDto
();
result
.
setPaid
(
false
);
if
(
StringUtils
.
isBlank
(
tradeno
))
{
if
(
StringUtils
.
isBlank
(
tradeno
))
return
result
;
}
try
{
UserPayment
byTradeNo
=
userPaymentRepository
.
findByTradeNo
(
tradeno
);
if
(
byTradeNo
==
null
)
{
if
(
byTradeNo
==
null
)
return
result
;
if
(
PaymentMethod
.
ALIPAY
.
equals
(
byTradeNo
.
getPaymentMethod
()))
return
aliCheckOrderStatus
(
tradeno
,
chargeType
);
UserBalance
balance
=
userBalanceRepository
.
findById
(
byTradeNo
.
getUsername
()).
orElse
(
null
);
if
(
balance
!=
null
)
result
.
setBalance
(
Math
.
round
(
balance
.
getBalanced
()));
if
(
byTradeNo
==
null
)
return
result
;
}
if
(
byTradeNo
.
isSucceed
())
{
result
.
setPaid
(
true
);
return
result
;
}
Account
byName
=
accountService
.
findByName
(
byTradeNo
.
getUsername
());
// 如果订单是用支付宝支付的,则调用支付宝相关的代码
if
(
PaymentMethod
.
ALIPAY
.
equals
(
byTradeNo
.
getPaymentMethod
()))
{
return
aliCheckOrderStatus
(
tradeno
,
chargeType
);
}
try
{
UserBalance
balance
=
getUserBalance
(
result
,
byTradeNo
);
Account
byName
=
accountService
.
findByName
(
byTradeNo
.
getUsername
());
if
(
byName
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
,
"account does not exist: "
+
byTradeNo
.
getUsername
());
// 1. 构建微信支付订单查询数据,并获取微信支付订单信息
// 获取微信支付订单存在失败的情况,所以针对失败情况去使用定时任务来重新调用本方法
boolean
isVpsClient
=
true
;
WXPayConfig
ourWxPayConfig
=
isVpsClient
?
new
FGLWxConfig
()
:
new
CloudamWxConfig
();
WXPay
wxPay
=
new
WXPay
(
ourWxPayConfig
);
Map
<
String
,
String
>
data
=
encapsulateWxOrderDataMap
(
tradeno
,
ourWxPayConfig
);
Map
<
String
,
String
>
data
=
new
HashMap
<>();
data
.
put
(
"appid"
,
ourWxPayConfig
.
getAppID
());
data
.
put
(
"mch_id"
,
ourWxPayConfig
.
getMchID
());
//商户号
data
.
put
(
"out_trade_no"
,
tradeno
);
//交易号
data
.
put
(
"nonce_str"
,
SmsUtils
.
createRandom
(
false
,
24
));
// 随机字符串小于32位
String
s
=
WXPayUtil
.
generateSignature
(
data
,
ourWxPayConfig
.
getKey
());
//签名
data
.
put
(
"sign"
,
s
);
Map
<
String
,
String
>
respData
=
wxPay
.
orderQuery
(
data
);
if
(
respData
.
get
(
"return_code"
).
equals
(
"SUCCESS"
)
&&
respData
.
get
(
"return_msg"
).
equals
(
"OK"
)
&&
"SUCCESS"
.
equals
(
respData
.
get
(
"result_code"
)))
{
/*
* SUCCESS—支付成功
* REFUND—转入退款
* NOTPAY—未支付
* CLOSED—已关闭
* REVOKED—已撤销(付款码支付)
* USERPAYING--用户支付中(付款码支付)
* PAYERROR--支付失败(其他原因,如银行返回失败)
/**
*
SUCCESS—支付成功
REFUND—转入退款
NOTPAY—未支付
CLOSED—已关闭
REVOKED—已撤销(付款码支付)
USERPAYING--用户支付中(付款码支付)
PAYERROR--支付失败(其他原因,如银行返回失败) *
*/
result
.
setStatus
(
respData
.
get
(
"trade_state"
));
// 2. 如果订单支付成功(具体业务逻辑)
if
(
"SUCCESS"
.
equals
(
respData
.
get
(
"trade_state"
)))
{
dealPaySuccess
(
chargeType
,
result
,
byTradeNo
,
byName
,
balance
);
byTradeNo
.
setSucceed
(
true
);
boolean
b
=
userPaymentRepository
.
updatePaymentResult
(
byTradeNo
,
true
);
if
(
b
)
{
if
(
balance
==
null
)
{
balance
=
new
UserBalance
();
balance
.
setUsername
(
byTradeNo
.
getUsername
());
}
PayBack
payBack
=
payBackRepository
.
findByPay
(
byTradeNo
.
getAmount
());
if
(
payBack
==
null
)
payBack
=
new
PayBack
();
if
(
chargeType
==
0
)
{
UserPrePaidBilling
bill
=
new
UserPrePaidBilling
();
Account
account
=
accountRepository
.
findByName
(
byTradeNo
.
getUsername
()).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
!=
null
&&
account
.
getParent
()
!=
null
)
bill
.
setAdministrator
(
account
.
getParent
());
else
bill
.
setAdministrator
(
account
.
getName
());
bill
.
setTradeNo
(
new
SimpleDateFormat
(
"yyyyMMddHHmmss"
).
format
(
new
Date
())
+
SmsUtils
.
createRandom
(
true
,
4
));
bill
.
setChargeType
(
0
);
bill
.
setAmount
(
0
);
bill
.
setUnit
(
null
);
bill
.
setPeriod
(
0
);
bill
.
setPayMethod
(
2
);
bill
.
setUsername
(
byTradeNo
.
getUsername
());
bill
.
setTotal
((
float
)
byTradeNo
.
getAmount
());
bill
.
setStatus
(
BillStatus
.
PAID
);
bill
.
setPrepaid
(
true
);
bill
.
setTimestamp
(
Instant
.
now
().
toEpochMilli
());
bill
.
setBalanced
(
balance
.
getBalanced
()
+
byTradeNo
.
getAmount
()
+
payBack
.
getBack
());
final
YearMonth
lastmonth
=
YearMonth
.
now
();
int
monthValue
=
lastmonth
.
getMonthValue
();
int
year
=
lastmonth
.
getYear
();
bill
.
setYear
(
year
);
bill
.
setMonth
(
monthValue
);
userPrePaidBillingRepository
.
save
(
bill
);
}
balance
.
setBalanced
(
balance
.
getBalanced
()
+
byTradeNo
.
getAmount
()
+
payBack
.
getBack
());
userBalanceRepository
.
save
(
balance
);
if
(
byName
.
getPromotionCode
()
!=
null
)
{
Account
account
=
accountRepository
.
findByPromotion
(
byName
.
getPromotionCode
());
if
(
account
!=
null
)
{
account
.
getPromotion
().
setCommission
(
account
.
getPromotion
().
getCommission
()
+
byTradeNo
.
getAmount
());
accountRepository
.
save
(
account
);
}
}
}
result
.
setBalance
(
Math
.
round
(
balance
.
getBalanced
()));
result
.
setPaid
(
true
);
return
result
;
}
}
...
...
@@ -165,33 +243,42 @@ public class PaymentServiceImpl implements PaymentService {
public
UserPaymentDto
aliCheckOrderStatus
(
String
tradno
,
int
chargeType
)
{
UserPaymentDto
result
=
new
UserPaymentDto
();
result
.
setPaid
(
false
);
if
(
StringUtils
.
isBlank
(
tradno
))
{
if
(
StringUtils
.
isBlank
(
tradno
))
return
result
;
}
try
{
UserPayment
byTradeNo
=
userPaymentRepository
.
findByTradeNo
(
tradno
);
if
(
byTradeNo
==
null
)
{
UserBalance
balance
=
userBalanceRepository
.
findById
(
byTradeNo
.
getUsername
()).
orElse
(
null
);
if
(
balance
!=
null
)
result
.
setBalance
(
Math
.
round
(
balance
.
getBalanced
()));
if
(
byTradeNo
==
null
)
return
result
;
}
if
(
byTradeNo
.
isSucceed
())
{
result
.
setPaid
(
true
);
return
result
;
}
Account
byName
=
accountService
.
findByName
(
byTradeNo
.
getUsername
());
try
{
UserBalance
balance
=
getUserBalance
(
result
,
byTradeNo
);
if
(
byName
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
,
"account does not exist: "
+
byTradeNo
.
getUsername
());
boolean
isVpsClient
=
true
;
AlipayConfig
alipayConfig
=
new
VpsAlipayConfig
();
AlipayClient
alipayClient
=
new
DefaultAlipayClient
(
alipayConfig
.
getURL
(),
alipayConfig
.
getAPPID
(),
alipayConfig
.
getAPP_PRIVATE_KEY
(),
"json"
,
alipayConfig
.
getCHARSET
(),
alipayConfig
.
getALIPAY_PUBLIC_KEY
(),
alipayConfig
.
getSIGN_TYPE
());
AlipayTradeQueryRequest
alipayRequest
=
buildAlipayTradeQueryRequest
(
byTradeNo
);
AlipayClient
alipayClient
=
new
DefaultAlipayClient
(
alipayConfig
.
getURL
(),
alipayConfig
.
getAPPID
(),
alipayConfig
.
getAPP_PRIVATE_KEY
(),
"json"
,
alipayConfig
.
getCHARSET
(),
alipayConfig
.
getALIPAY_PUBLIC_KEY
(),
alipayConfig
.
getSIGN_TYPE
());
AlipayTradeQueryRe
sponse
response
=
alipayClient
.
execute
(
alipayRequest
);
AlipayTradeQueryRe
quest
alipayRequest
=
new
AlipayTradeQueryRequest
(
);
String
out_trade_no
=
byTradeNo
.
getTradeNo
();
alipayRequest
.
setBizContent
(
""
+
"{"
+
"\"out_trade_no\":\""
+
out_trade_no
+
"\""
+
"}"
);
AlipayTradeQueryResponse
response
=
alipayClient
.
execute
(
alipayRequest
);
log
.
info
(
"ali order status :"
+
JSONObject
.
toJSONString
(
response
));
if
(
response
.
getTradeStatus
()
==
null
)
{
result
.
setPaid
(
false
);
...
...
@@ -201,8 +288,63 @@ public class PaymentServiceImpl implements PaymentService {
result
.
setStatus
(
convertAlipayStatus
(
response
.
getTradeStatus
()));
if
(
"TRADE_SUCCESS"
.
equals
(
response
.
getTradeStatus
())
||
"TRADE_FINISHED"
.
equals
(
response
.
getTradeStatus
()))
{
// 2. 如果订单支付成功(具体业务逻辑)
dealPaySuccess
(
chargeType
,
result
,
byTradeNo
,
byName
,
balance
);
byTradeNo
.
setSucceed
(
true
);
boolean
b
=
userPaymentRepository
.
updatePaymentResult
(
byTradeNo
,
true
);
if
(
b
)
{
if
(
balance
==
null
)
{
balance
=
new
UserBalance
();
balance
.
setUsername
(
byTradeNo
.
getUsername
());
}
PayBack
payBack
=
payBackRepository
.
findByPay
(
byTradeNo
.
getAmount
());
if
(
payBack
==
null
)
payBack
=
new
PayBack
();
if
(
chargeType
==
0
)
{
UserPrePaidBilling
bill
=
new
UserPrePaidBilling
();
Account
account
=
accountRepository
.
findByName
(
byTradeNo
.
getUsername
()).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
!=
null
&&
account
.
getParent
()
!=
null
)
bill
.
setAdministrator
(
account
.
getParent
());
else
bill
.
setAdministrator
(
account
.
getName
());
bill
.
setTradeNo
(
new
SimpleDateFormat
(
"yyyyMMddHHmmss"
).
format
(
new
Date
())
+
SmsUtils
.
createRandom
(
true
,
4
));
bill
.
setChargeType
(
0
);
bill
.
setAmount
(
0
);
bill
.
setUnit
(
null
);
bill
.
setPeriod
(
0
);
bill
.
setPayMethod
(
1
);
bill
.
setUsername
(
byTradeNo
.
getUsername
());
bill
.
setTotal
((
float
)
byTradeNo
.
getAmount
());
bill
.
setStatus
(
BillStatus
.
PAID
);
bill
.
setPrepaid
(
true
);
bill
.
setTimestamp
(
Instant
.
now
().
toEpochMilli
());
bill
.
setBalanced
(
balance
.
getBalanced
()
+
byTradeNo
.
getAmount
()
+
payBack
.
getBack
());
final
YearMonth
lastmonth
=
YearMonth
.
now
();
int
monthValue
=
lastmonth
.
getMonthValue
();
int
year
=
lastmonth
.
getYear
();
bill
.
setYear
(
year
);
bill
.
setMonth
(
monthValue
);
userPrePaidBillingRepository
.
save
(
bill
);
}
balance
.
setBalanced
(
balance
.
getBalanced
()
+
byTradeNo
.
getAmount
()
+
payBack
.
getBack
());
userBalanceRepository
.
save
(
balance
);
if
(
byName
.
getPromotionCode
()
!=
null
)
{
Account
account
=
accountRepository
.
findByPromotion
(
byName
.
getPromotionCode
());
if
(
account
!=
null
)
{
account
.
getPromotion
().
setCommission
(
account
.
getPromotion
().
getCommission
()
+
byTradeNo
.
getAmount
());
accountRepository
.
save
(
account
);
}
}
}
result
.
setBalance
(
Math
.
round
(
balance
.
getBalanced
()));
result
.
setPaid
(
true
);
return
result
;
}
...
...
@@ -214,45 +356,48 @@ public class PaymentServiceImpl implements PaymentService {
return
result
;
}
@NotNull
private
UserBalance
getUserBalance
(
UserPaymentDto
result
,
UserPayment
byTradeNo
)
{
UserBalance
balance
=
userBalanceRepository
.
findById
(
byTradeNo
.
getUsername
()).
orElse
(
null
);
if
(
balance
!=
null
)
{
result
.
setBalance
(
Math
.
round
(
balance
.
getBalanced
()));
}
if
(
balance
==
null
)
{
balance
=
new
UserBalance
();
balance
.
setUsername
(
byTradeNo
.
getUsername
());
}
return
balance
;
}
@Override
public
String
alipayPutPayOrder
(
String
username
,
int
amount
,
String
by
)
{
Account
byName
=
accountService
.
findByName
(
username
);
if
(
byName
.
getPermission
()
<
4
)
{
if
(
byName
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
,
"account does not exist: "
+
username
);
if
(
byName
.
getPermission
()
<
4
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
,
"account does not have permission: "
+
username
);
}
boolean
isVpsClient
=
true
;
UserPayment
internalOrder
=
new
UserPayment
();
internalOrder
.
setAmount
(
amount
);
internalOrder
.
setPaymentMethod
(
PaymentMethod
.
ALIPAY
);
internalOrder
.
setSucceed
(
false
);
internalOrder
.
setUsername
(
username
);
try
{
// 创建并封装 UserPayment 信息
UserPayment
internalOrder
=
getUserPayment
(
username
,
amount
,
PaymentMethod
.
ALIPAY
);
// 获取支付宝支付的配置信息
boolean
isVpsClient
=
true
;
AlipayConfig
alipayConfig
=
isVpsClient
?
new
VpsAlipayConfig
()
:
new
CloudamAlipayConfig
();
// 获取支付宝的 client
AlipayClient
alipayClient
=
new
DefaultAlipayClient
(
alipayConfig
.
getURL
(),
alipayConfig
.
getAPPID
(),
alipayConfig
.
getAPP_PRIVATE_KEY
(),
"json"
,
alipayConfig
.
getCHARSET
(),
alipayConfig
.
getALIPAY_PUBLIC_KEY
(),
alipayConfig
.
getSIGN_TYPE
());
// 构建请求信息 并设置请求成功的回调 url
AlipayTradePagePayRequest
alipayRequest
=
buildAlipayTradePagePayRequest
(
amount
,
by
,
internalOrder
,
isVpsClient
,
alipayConfig
);
// 调用 支付宝支付接口
AlipayTradePagePayResponse
response
=
alipayClient
.
pageExecute
(
alipayRequest
);
AlipayClient
alipayClient
=
new
DefaultAlipayClient
(
alipayConfig
.
getURL
(),
alipayConfig
.
getAPPID
(),
alipayConfig
.
getAPP_PRIVATE_KEY
(),
"json"
,
alipayConfig
.
getCHARSET
(),
alipayConfig
.
getALIPAY_PUBLIC_KEY
(),
alipayConfig
.
getSIGN_TYPE
());
// 将支付信息保存到 userPayment
AlipayTradePagePayRequest
alipayRequest
=
new
AlipayTradePagePayRequest
();
alipayRequest
.
setReturnUrl
(
alipayConfig
.
getReturnUrl
(
isVpsClient
,
by
)
+
internalOrder
.
getTradeNo
());
alipayRequest
.
setNotifyUrl
(
alipayConfig
.
getNOTIFY_URL
()
+
internalOrder
.
getTradeNo
());
String
out_trade_no
=
internalOrder
.
getTradeNo
();
String
product_code
=
"FAST_INSTANT_TRADE_PAY"
;
String
total_amount
=
""
+
amount
+
".00"
;
String
subject
=
"订单"
+
out_trade_no
;
String
body
=
""
;
alipayRequest
.
setBizContent
(
""
+
"{"
+
"\"out_trade_no\":\""
+
out_trade_no
+
"\","
+
"\"product_code\":\""
+
product_code
+
"\","
+
"\"total_amount\":\""
+
total_amount
+
"\","
+
"\"subject\":\""
+
subject
+
"\","
+
"\"body\":\""
+
body
+
"\""
+
"}"
);
AlipayTradePagePayResponse
response
=
alipayClient
.
pageExecute
(
alipayRequest
);
internalOrder
.
setTransId
(
response
.
getTradeNo
());
userPaymentRepository
.
save
(
internalOrder
);
...
...
@@ -267,31 +412,44 @@ public class PaymentServiceImpl implements PaymentService {
@Override
public
UserPaymentDto
wxPutPayOrder
(
String
username
,
int
amount
)
{
Account
byName
=
accountService
.
findByName
(
username
);
if
(
byName
.
getPermission
()
<
4
)
{
if
(
byName
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
,
"account does not exist: "
+
username
);
if
(
byName
.
getPermission
()
<
4
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
,
"account does not have permission: "
+
username
);
}
boolean
isVpsClient
=
true
;
UserPayment
internalOrder
=
new
UserPayment
();
internalOrder
.
setAmount
(
amount
);
internalOrder
.
setPaymentMethod
(
PaymentMethod
.
WECHAT
);
internalOrder
.
setSucceed
(
false
);
internalOrder
.
setUsername
(
username
);
try
{
// 创建并封装 UserPayment 信息
UserPayment
internalOrder
=
getUserPayment
(
username
,
amount
,
PaymentMethod
.
WECHAT
);
// 回调的url
String
notifyUrl
=
AccountController
.
WECHAT_PAY_CALLBACK_URL
+
internalOrder
.
getTradeNo
();
// 获取微信支付的配置信息
boolean
isVpsClient
=
true
;
WXPayConfig
ourWxPayConfig
=
isVpsClient
?
new
FGLWxConfig
()
:
new
CloudamWxConfig
();
WXPay
wxPay
=
new
WXPay
(
ourWxPayConfig
);
// 封装请求 微信支付 的数据
Map
<
String
,
String
>
data
=
encapsulateDataMap
(
amount
,
internalOrder
,
notifyUrl
,
ourWxPayConfig
);
Map
<
String
,
String
>
data
=
new
HashMap
<>();
data
.
put
(
"appid"
,
ourWxPayConfig
.
getAppID
());
data
.
put
(
"mch_id"
,
ourWxPayConfig
.
getMchID
());
//商户号
data
.
put
(
"body"
,
ourWxPayConfig
.
getBody
());
data
.
put
(
"trade_type"
,
"NATIVE"
);
//NATIVE 扫码支付
data
.
put
(
"notify_url"
,
notifyUrl
);
//回调地址
data
.
put
(
"spbill_create_ip"
,
"127.0.0.1"
);
//终端ip
data
.
put
(
"total_fee"
,
""
+
amount
*
100
);
//订单总金额
data
.
put
(
"fee_type"
,
"CNY"
);
//默认人民币
data
.
put
(
"out_trade_no"
,
internalOrder
.
getTradeNo
());
//交易号
data
.
put
(
"nonce_str"
,
internalOrder
.
getTradeNo
());
// 随机字符串小于32位
String
s
=
WXPayUtil
.
generateSignature
(
data
,
ourWxPayConfig
.
getKey
());
//签名
data
.
put
(
"sign"
,
s
);
// 调用微信支付接口,支付成功后会回调 notifyUrl, 并返回支付结果
WXPay
wxPay
=
new
WXPay
(
ourWxPayConfig
);
Map
<
String
,
String
>
respData
=
wxPay
.
unifiedOrder
(
data
);
if
(
respData
.
get
(
"return_code"
).
equals
(
"SUCCESS"
)
&&
respData
.
get
(
"result_code"
).
equals
(
"SUCCESS"
))
{
// 若微信支付成功,则将支付信息保存到 userPayment
userPaymentRepository
.
save
(
internalOrder
);
UserPaymentDto
result
=
new
UserPaymentDto
();
result
.
setTradeNo
(
internalOrder
.
getTradeNo
());
...
...
@@ -320,7 +478,7 @@ public class PaymentServiceImpl implements PaymentService {
UserBalance
userBalance
=
userBalanceRepository
.
findById
(
username
).
orElse
(
null
);
UserPrePaidBilling
bill
=
new
UserPrePaidBilling
();
Account
account
=
accountRepository
.
findByName
(
username
).
get
(
);
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
)
);
if
(
account
!=
null
&&
account
.
getParent
()
!=
null
)
bill
.
setAdministrator
(
account
.
getParent
());
else
...
...
@@ -527,49 +685,66 @@ public class PaymentServiceImpl implements PaymentService {
}
}
@Deprecated
@Override
public
UserPaymentDto
wxCheckOrderStatus
(
String
tradeno
)
{
UserPaymentDto
result
=
new
UserPaymentDto
();
result
.
setPaid
(
false
);
try
{
UserPayment
byTradeNo
=
userPaymentRepository
.
findByTradeNo
(
tradeno
);
if
(
byTradeNo
==
null
)
return
result
;
if
(
byTradeNo
.
isSucceed
())
{
result
.
setPaid
(
true
);
return
result
;
}
Account
byName
=
accountService
.
findByName
(
byTradeNo
.
getUsername
());
if
(
PaymentMethod
.
ALIPAY
.
equals
(
byTradeNo
.
getPaymentMethod
()))
{
if
(
PaymentMethod
.
ALIPAY
.
equals
(
byTradeNo
.
getPaymentMethod
()))
return
aliCheckOrderStatus
(
tradeno
);
}
try
{
UserBalance
balance
=
userBalanceRepository
.
findById
(
byTradeNo
.
getUsername
()).
orElse
(
null
);
if
(
balance
!=
null
)
{
if
(
balance
!=
null
)
result
.
setBalance
(
Math
.
round
(
balance
.
getBalanced
()));
if
(
byTradeNo
==
null
)
return
result
;
if
(
byTradeNo
.
isSucceed
())
{
result
.
setPaid
(
true
);
return
result
;
}
Account
byName
=
accountService
.
findByName
(
byTradeNo
.
getUsername
());
if
(
byName
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
,
"account does not exist: "
+
byTradeNo
.
getUsername
());
boolean
isVpsClient
=
true
;
WXPayConfig
ourWxPayConfig
=
isVpsClient
?
new
FGLWxConfig
()
:
new
CloudamWxConfig
();
WXPay
wxPay
=
new
WXPay
(
ourWxPayConfig
);
Map
<
String
,
String
>
data
=
encapsulateWxOrderDataMap
(
tradeno
,
ourWxPayConfig
);
Map
<
String
,
String
>
data
=
new
HashMap
<>();
data
.
put
(
"appid"
,
ourWxPayConfig
.
getAppID
());
data
.
put
(
"mch_id"
,
ourWxPayConfig
.
getMchID
());
//商户号
data
.
put
(
"out_trade_no"
,
tradeno
);
//交易号
data
.
put
(
"nonce_str"
,
SmsUtils
.
createRandom
(
false
,
24
));
// 随机字符串小于32位
String
s
=
WXPayUtil
.
generateSignature
(
data
,
ourWxPayConfig
.
getKey
());
//签名
data
.
put
(
"sign"
,
s
);
Map
<
String
,
String
>
respData
=
wxPay
.
orderQuery
(
data
);
if
(
respData
.
get
(
"return_code"
).
equals
(
"SUCCESS"
)
&&
respData
.
get
(
"return_msg"
).
equals
(
"OK"
)
&&
"SUCCESS"
.
equals
(
respData
.
get
(
"result_code"
)))
{
/*
* SUCCESS—支付成功
* REFUND—转入退款
* NOTPAY—未支付
* CLOSED—已关闭
* REVOKED—已撤销(付款码支付)
* USERPAYING--用户支付中(付款码支付)
* PAYERROR--支付失败(其他原因,如银行返回失败)
/**
*
SUCCESS—支付成功
REFUND—转入退款
NOTPAY—未支付
CLOSED—已关闭
REVOKED—已撤销(付款码支付)
USERPAYING--用户支付中(付款码支付)
PAYERROR--支付失败(其他原因,如银行返回失败) *
*/
result
.
setStatus
(
respData
.
get
(
"trade_state"
));
if
(
"SUCCESS"
.
equals
(
respData
.
get
(
"trade_state"
)))
{
...
...
@@ -584,10 +759,8 @@ public class PaymentServiceImpl implements PaymentService {
}
// 充值返现
PayBack
payBack
=
payBackRepository
.
findByPay
(
byTradeNo
.
getAmount
());
if
(
payBack
==
null
)
{
if
(
payBack
==
null
)
payBack
=
new
PayBack
();
}
balance
.
setBalanced
(
balance
.
getBalanced
()
+
byTradeNo
.
getAmount
()
+
payBack
.
getBack
());
balance
=
userBalanceRepository
.
save
(
balance
);
}
...
...
@@ -605,7 +778,6 @@ public class PaymentServiceImpl implements PaymentService {
return
result
;
}
@Deprecated
@Override
public
UserPaymentDto
aliCheckOrderStatus
(
String
tradno
)
{
UserPaymentDto
result
=
new
UserPaymentDto
();
...
...
@@ -635,7 +807,14 @@ public class PaymentServiceImpl implements PaymentService {
AlipayClient
alipayClient
=
new
DefaultAlipayClient
(
alipayConfig
.
getURL
(),
alipayConfig
.
getAPPID
(),
alipayConfig
.
getAPP_PRIVATE_KEY
(),
"json"
,
alipayConfig
.
getCHARSET
(),
alipayConfig
.
getALIPAY_PUBLIC_KEY
(),
alipayConfig
.
getSIGN_TYPE
());
AlipayTradeQueryRequest
alipayRequest
=
buildAlipayTradeQueryRequest
(
byTradeNo
);
AlipayTradeQueryRequest
alipayRequest
=
new
AlipayTradeQueryRequest
();
String
out_trade_no
=
byTradeNo
.
getTradeNo
();
alipayRequest
.
setBizContent
(
""
+
"{"
+
"\"out_trade_no\":\""
+
out_trade_no
+
"\""
+
"}"
);
AlipayTradeQueryResponse
response
=
alipayClient
.
execute
(
alipayRequest
);
log
.
info
(
"ali order status :"
+
JSONObject
.
toJSONString
(
response
));
result
.
setStatus
(
convertAlipayStatus
(
response
.
getTradeStatus
()));
...
...
@@ -671,154 +850,4 @@ public class PaymentServiceImpl implements PaymentService {
return
result
;
}
@NotNull
private
UserPayment
getUserPayment
(
String
username
,
int
amount
,
PaymentMethod
paymentMethod
)
{
UserPayment
internalOrder
=
new
UserPayment
();
internalOrder
.
setUsername
(
username
);
internalOrder
.
setAmount
(
amount
);
internalOrder
.
setPaymentMethod
(
paymentMethod
);
// 此时充值尚未成功,需要等 微信或者支付宝 回调才能确认是否成功
internalOrder
.
setSucceed
(
false
);
return
internalOrder
;
}
@NotNull
private
Map
<
String
,
String
>
encapsulateDataMap
(
int
amount
,
UserPayment
internalOrder
,
String
notifyUrl
,
WXPayConfig
ourWxPayConfig
)
throws
Exception
{
Map
<
String
,
String
>
data
=
new
HashMap
<>();
data
.
put
(
"appid"
,
ourWxPayConfig
.
getAppID
());
data
.
put
(
"mch_id"
,
ourWxPayConfig
.
getMchID
());
//商户号
data
.
put
(
"body"
,
ourWxPayConfig
.
getBody
());
data
.
put
(
"trade_type"
,
"NATIVE"
);
//NATIVE 扫码支付
data
.
put
(
"notify_url"
,
notifyUrl
);
//回调地址
data
.
put
(
"spbill_create_ip"
,
"127.0.0.1"
);
//终端ip
data
.
put
(
"total_fee"
,
""
+
amount
*
100
);
//订单总金额
data
.
put
(
"fee_type"
,
"CNY"
);
//默认人民币
data
.
put
(
"out_trade_no"
,
internalOrder
.
getTradeNo
());
//交易号
data
.
put
(
"nonce_str"
,
internalOrder
.
getTradeNo
());
// 随机字符串小于32位
String
s
=
WXPayUtil
.
generateSignature
(
data
,
ourWxPayConfig
.
getKey
());
//签名
data
.
put
(
"sign"
,
s
);
return
data
;
}
@NotNull
private
Map
<
String
,
String
>
encapsulateWxOrderDataMap
(
String
tradeno
,
WXPayConfig
ourWxPayConfig
)
throws
Exception
{
Map
<
String
,
String
>
data
=
new
HashMap
<>();
data
.
put
(
"appid"
,
ourWxPayConfig
.
getAppID
());
data
.
put
(
"mch_id"
,
ourWxPayConfig
.
getMchID
());
//商户号
data
.
put
(
"out_trade_no"
,
tradeno
);
//交易号
data
.
put
(
"nonce_str"
,
SmsUtils
.
createRandom
(
false
,
24
));
// 随机字符串小于32位
String
s
=
WXPayUtil
.
generateSignature
(
data
,
ourWxPayConfig
.
getKey
());
//签名
data
.
put
(
"sign"
,
s
);
return
data
;
}
@NotNull
private
UserPrePaidBilling
getUserPrePaidBilling
(
UserPayment
byTradeNo
,
Account
byName
,
UserBalance
balance
,
PayBack
payBack
)
{
UserPrePaidBilling
bill
=
new
UserPrePaidBilling
();
if
(
byName
!=
null
&&
byName
.
getParent
()
!=
null
)
{
bill
.
setAdministrator
(
byName
.
getParent
());
}
else
{
bill
.
setAdministrator
(
byName
.
getName
());
}
bill
.
setTradeNo
(
new
SimpleDateFormat
(
"yyyyMMddHHmmss"
).
format
(
new
Date
())
+
SmsUtils
.
createRandom
(
true
,
4
));
bill
.
setChargeType
(
0
);
bill
.
setAmount
(
0
);
bill
.
setUnit
(
null
);
bill
.
setPeriod
(
0
);
if
(
byTradeNo
.
getPaymentMethod
().
equals
(
PaymentMethod
.
ALIPAY
))
{
bill
.
setPayMethod
(
1
);
}
if
(
byTradeNo
.
getPaymentMethod
().
equals
(
PaymentMethod
.
WECHAT
))
{
bill
.
setPayMethod
(
2
);
}
bill
.
setUsername
(
byTradeNo
.
getUsername
());
bill
.
setTotal
((
float
)
byTradeNo
.
getAmount
());
bill
.
setStatus
(
BillStatus
.
PAID
);
bill
.
setPrepaid
(
true
);
bill
.
setTimestamp
(
Instant
.
now
().
toEpochMilli
());
// 设置到账金额为 账户余额 + 充值金额 + 充值优惠赠送
bill
.
setBalanced
(
balance
.
getBalanced
()
+
byTradeNo
.
getAmount
()
+
payBack
.
getBack
());
final
YearMonth
lastmonth
=
YearMonth
.
now
();
int
monthValue
=
lastmonth
.
getMonthValue
();
int
year
=
lastmonth
.
getYear
();
bill
.
setYear
(
year
);
bill
.
setMonth
(
monthValue
);
return
bill
;
}
@NotNull
private
AlipayTradePagePayRequest
buildAlipayTradePagePayRequest
(
int
amount
,
String
by
,
UserPayment
internalOrder
,
boolean
isVpsClient
,
AlipayConfig
alipayConfig
)
{
AlipayTradePagePayRequest
alipayRequest
=
new
AlipayTradePagePayRequest
();
alipayRequest
.
setReturnUrl
(
alipayConfig
.
getReturnUrl
(
isVpsClient
,
by
)
+
internalOrder
.
getTradeNo
());
// 调用支付宝支付接口,支付成功后会回调 notifyUrl
alipayRequest
.
setNotifyUrl
(
alipayConfig
.
getNOTIFY_URL
()
+
internalOrder
.
getTradeNo
());
String
out_trade_no
=
internalOrder
.
getTradeNo
();
String
product_code
=
"FAST_INSTANT_TRADE_PAY"
;
String
total_amount
=
""
+
amount
+
".00"
;
String
subject
=
"订单"
+
out_trade_no
;
String
body
=
""
;
alipayRequest
.
setBizContent
(
""
+
"{"
+
"\"out_trade_no\":\""
+
out_trade_no
+
"\","
+
"\"product_code\":\""
+
product_code
+
"\","
+
"\"total_amount\":\""
+
total_amount
+
"\","
+
"\"subject\":\""
+
subject
+
"\","
+
"\"body\":\""
+
body
+
"\""
+
"}"
);
return
alipayRequest
;
}
@NotNull
private
AlipayTradeQueryRequest
buildAlipayTradeQueryRequest
(
UserPayment
byTradeNo
)
{
AlipayTradeQueryRequest
alipayRequest
=
new
AlipayTradeQueryRequest
();
String
out_trade_no
=
byTradeNo
.
getTradeNo
();
alipayRequest
.
setBizContent
(
""
+
"{"
+
"\"out_trade_no\":\""
+
out_trade_no
+
"\""
+
"}"
);
return
alipayRequest
;
}
private
void
dealPaySuccess
(
int
chargeType
,
UserPaymentDto
result
,
UserPayment
byTradeNo
,
Account
byName
,
UserBalance
balance
)
{
byTradeNo
.
setSucceed
(
true
);
// 2.1 更新 userPayment 的支付状态为成功
boolean
b
=
userPaymentRepository
.
updatePaymentResult
(
byTradeNo
,
true
);
if
(
b
)
{
// 2.2 获取充值优惠赠送
PayBack
payBack
=
payBackRepository
.
findByPay
(
byTradeNo
.
getAmount
());
if
(
payBack
==
null
)
{
payBack
=
new
PayBack
();
}
// chargeType 为 0 代表 充值
if
(
chargeType
==
0
)
{
// 2.3 构建用户充值信息并保存
UserPrePaidBilling
bill
=
getUserPrePaidBilling
(
byTradeNo
,
byName
,
balance
,
payBack
);
userPrePaidBillingRepository
.
save
(
bill
);
}
// 2.4 更新账户余额 userBalance
balance
.
setBalanced
(
balance
.
getBalanced
()
+
byTradeNo
.
getAmount
()
+
payBack
.
getBack
());
userBalanceRepository
.
save
(
balance
);
// 2.5 如果当前用户通过邀请码注册的,则更新邀请人的佣金
if
(
byName
.
getPromotionCode
()
!=
null
)
{
Account
account
=
accountRepository
.
findByPromotion
(
byName
.
getPromotionCode
());
if
(
account
!=
null
)
{
account
.
getPromotion
().
setCommission
(
account
.
getPromotion
().
getCommission
()
+
byTradeNo
.
getAmount
());
accountRepository
.
save
(
account
);
}
}
}
result
.
setBalance
(
Math
.
round
(
balance
.
getBalanced
()));
result
.
setPaid
(
true
);
}
}
src/main/java/com/edgec/browserbackend/account/service/impl/UserLackMoneyServiceImpl.java
View file @
51b4192f
...
...
@@ -30,13 +30,9 @@ public class UserLackMoneyServiceImpl implements UserLackMoneyService {
//用户名,欠费金额,账单Id,账单总数
String
username
=
billings
.
get
(
0
).
getUsername
();
float
totalUnpaid
=
billings
.
stream
().
filter
(
x
->
x
.
getStatus
()
==
BillStatus
.
UNPAID
)
.
map
(
x
->
x
.
getTotal
()
-
(
x
.
getDeductionRecords
()
!=
null
?
(
x
.
getDeductionRecords
().
stream
().
collect
(
Collectors
.
summingDouble
(
DeductionRecord:
:
getDeductionAmount
)).
longValue
())
:
(
0
)
)
)
.
collect
(
Collectors
.
summingDouble
(
Float:
:
floatValue
))
.
floatValue
();
.
map
(
x
->
x
.
getTotal
()
-
(
x
.
getDeductionRecords
()
!=
null
?
(
x
.
getDeductionRecords
().
stream
().
collect
(
Collectors
.
summingDouble
(
DeductionRecord:
:
getDeductionAmount
)).
longValue
())
:
(
0
))).
collect
(
Collectors
.
summingDouble
(
Float:
:
floatValue
)).
floatValue
();
List
<
String
>
ids
=
billings
.
stream
().
filter
(
x
->
x
.
getStatus
()
==
BillStatus
.
UNPAID
).
map
(
UserPrePaidBilling:
:
getId
).
collect
(
Collectors
.
toList
());
int
billsAmount
=
(
int
)
billings
.
stream
().
filter
(
x
->
x
.
getStatus
()
==
BillStatus
.
UNPAID
).
count
();
...
...
src/main/java/com/edgec/browserbackend/auth/service/Impl/UserServiceImpl.java
View file @
51b4192f
...
...
@@ -15,6 +15,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
;
import
org.springframework.stereotype.Service
;
import
java.util.Optional
;
@Service
public
class
UserServiceImpl
implements
UserService
{
...
...
@@ -94,11 +96,11 @@ public class UserServiceImpl implements UserService {
@Override
public
void
create
(
User
user
)
{
repository
.
findById
(
user
.
getUsername
()).
ifPresent
(
it
->
{
Optional
<
User
>
existing
=
repository
.
findById
(
user
.
getUsername
());
existing
.
ifPresent
(
it
->
{
throw
new
ClientRequestException
(
AuthErrorCode
.
NAMEEXIST
,
"user already exists: "
+
it
.
getUsername
());
}
);
});
String
hash
=
encoder
.
encode
(
user
.
getPassword
());
user
.
setPassword
(
hash
);
...
...
src/main/java/com/edgec/browserbackend/browser/ErrorCode/BrowserErrorCode.java
View file @
51b4192f
...
...
@@ -14,7 +14,6 @@ public enum BrowserErrorCode implements ErrorCode {
IPNOTEXIST
(
BROWSER_BASE
+
201
,
"The ip do not exist"
),
IPNOTBINDTOSHOP
(
BROWSER_BASE
+
202
,
"The ip does not bind this shop."
),
USER_NOT_BIND_SHOP
(
BROWSER_BASE
+
203
,
"The shop does not bind this user."
),
GROUPNOTEXIST
(
BROWSER_BASE
+
301
,
"The group does not exist"
),
...
...
src/main/java/com/edgec/browserbackend/browser/controller/GroupController.java
View file @
51b4192f
...
...
@@ -22,9 +22,6 @@ public class GroupController {
@Autowired
private
GroupService
groupService
;
/**
* 添加分组
*/
@RequestMapping
(
"/add"
)
public
ResultDto
addGroup
(
Principal
principal
,
@RequestBody
GroupDto
groupDto
)
{
ResultDto
resultDto
=
new
ResultDto
();
...
...
@@ -33,8 +30,12 @@ public class GroupController {
groupDto1
.
setId
(
groupService
.
addGroup
(
principal
.
getName
(),
groupDto
.
getName
()));
resultDto
.
setData
(
groupDto1
);
resultDto
.
setStatus
(
0
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
}
catch
(
ClientRequestException
e
)
{
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
...
...
@@ -45,8 +46,12 @@ public class GroupController {
try
{
groupService
.
updateGroup
(
principal
.
getName
(),
group
);
resultDto
.
setStatus
(
0
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
}
catch
(
ClientRequestException
e
)
{
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
...
...
@@ -57,15 +62,16 @@ public class GroupController {
try
{
groupService
.
deleteGroup
(
principal
.
getName
(),
groupDto
.
getId
());
resultDto
.
setStatus
(
0
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
}
catch
(
ClientRequestException
e
)
{
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
/**
* 分组列表
*/
@RequestMapping
(
"/list"
)
public
ResultDto
getGroupList
(
Principal
principal
)
{
ResultDto
resultDto
=
new
ResultDto
();
...
...
@@ -73,19 +79,14 @@ public class GroupController {
List
<
GroupDto
>
groupDtos
=
groupService
.
getGroupList
(
principal
.
getName
());
resultDto
.
setData
(
groupDtos
);
resultDto
.
setStatus
(
0
);
}
catch
(
ClientRequestException
e
)
{
dealClientRequestException
(
resultDto
,
e
);
}
return
resultDto
;
}
private
void
dealClientRequestException
(
ResultDto
resultDto
,
ClientRequestException
e
)
{
}
catch
(
ClientRequestException
e
)
{
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
statusInfo
.
put
(
"code"
,
e
.
getErrorCode
());
statusInfo
.
put
(
"message"
,
e
.
getMessage
());
resultDto
.
setStatusInfo
(
statusInfo
);
}
return
resultDto
;
}
}
src/main/java/com/edgec/browserbackend/browser/controller/ShopController.java
View file @
51b4192f
...
...
@@ -138,9 +138,6 @@ public class ShopController {
return
resultDto
;
}
/**
* 店铺分配
*/
@RequestMapping
(
value
=
"/assign"
,
method
=
RequestMethod
.
POST
)
public
ResultDto
assignShop
(
Principal
principal
,
@RequestBody
ShopRequestDto
shopRequestDto
)
{
ResultDto
resultDto
=
new
ResultDto
();
...
...
@@ -153,9 +150,6 @@ public class ShopController {
return
resultDto
;
}
/**
* 获取带有 ip 资源信息的 shop
*/
@RequestMapping
(
value
=
"/list"
,
method
=
RequestMethod
.
POST
)
public
ResultDto
getShopList
(
Principal
principal
,
@RequestBody
ShopRequestDto
shopRequestDto
)
{
logger
.
info
(
"shop list params {}"
,
JSONObject
.
toJSONString
(
shopRequestDto
));
...
...
@@ -171,9 +165,6 @@ public class ShopController {
return
resultDto
;
}
/**
* 获取当前登录用户已经绑定了当前商铺的 所有子用户名
*/
@RequestMapping
(
value
=
"/subusers"
,
method
=
RequestMethod
.
POST
)
public
ResultDto
getShopSubUsers
(
Principal
principal
,
@RequestBody
ShopRequestDto
shopRequestDto
)
{
ResultDto
resultDto
=
new
ResultDto
();
...
...
@@ -200,9 +191,6 @@ public class ShopController {
return
resultDto
;
}
/**
* 查询店铺信息
*/
@RequestMapping
(
value
=
"/query"
,
method
=
RequestMethod
.
POST
)
public
ResultDto
queryShop
(
Principal
principal
,
@RequestBody
ShopRequestDto
shopRequestDto
)
{
ResultDto
resultDto
=
new
ResultDto
();
...
...
@@ -216,22 +204,6 @@ public class ShopController {
return
resultDto
;
}
/**
* 恢复部分缺失数据,仅仅调用一次就好了
*/
@GetMapping
(
value
=
"/deal_dirtydata"
)
public
ResultDto
dealDirtydata
()
{
Integer
num
=
shopService
.
dealDirtyData
();
ResultDto
resultDto
=
new
ResultDto
();
resultDto
.
setStatus
(
0
);
resultDto
.
setData
(
"修复脏数据"
+
num
+
"条"
);
return
resultDto
;
}
private
void
dealClientRequestException
(
ResultDto
resultDto
,
ClientRequestException
e
)
{
resultDto
.
setStatus
(-
1
);
Map
<
String
,
Object
>
statusInfo
=
new
HashMap
<>();
...
...
src/main/java/com/edgec/browserbackend/browser/domain/IpResource.java
View file @
51b4192f
...
...
@@ -21,129 +21,42 @@ public class IpResource implements Serializable {
@Id
private
String
id
;
/**
* ip 地址
*/
private
String
addr
;
/**
* ip 类型,默认是 ip代理 模式
*/
private
IpType
ipType
=
IpType
.
VENDOR
;
/**
* ip 的具体代理使用
*/
private
Vendor
vendor
;
private
String
vendorCn
;
/**
* ip 地域
*/
private
String
region
;
private
String
regionCn
;
/**
* ip 的状态
* 0:正常, 1:已过期, 2:即将过期, 3:正在分配, 4:未使用, 5:已失效, 6:未分配, 7:未缴费, 8:分配成功
*/
//0:正常, 1:已过期, 2:即将过期, 3:正在分配, 4:未使用, 5:已失效, 6:未分配, 7:未缴费, 8:分配成功
private
int
status
;
/**
* ip 端口号
*/
private
List
<
String
>
port
;
/**
* ip的购买时间点
*/
private
long
purchasedTime
;
/**
* ip的过期的时间点
*/
private
long
validTime
;
private
String
details
;
/**
* ip的绑定历史
*/
private
List
<
BindHistory
>
bindHistory
=
new
ArrayList
<>();
/**
* ip的状态
* 当 ip 资源过期的时候,系统不会直接删除 ip 资源,而是将 isDeleted 设置为 true
* 过期7天后再删除这个ip资源
*/
private
boolean
isDeleted
;
/**
* 如果 使用的 ip 资源 是在我们系统申请的,则默认为 fangguanlianbrowser
*/
private
String
username
;
/**
* ip 资源的购买者(拥有者)
*/
private
String
owner
;
private
String
userParent
;
/**
* ip访问协议
*/
private
List
<
String
>
protocol
;
private
String
password
;
private
double
price
;
/**
* 是否使用专线
*/
private
boolean
specialLine
;
private
boolean
specialLine
;
//是否使用专线
private
boolean
usingSpecialLine
;
//是否正在使用专线
//专线数据
private
String
proxyUsername
;
//专线的代理用户名
private
String
proxyPassword
;
//专线的代理密码
/**
* 是否正在使用专线
*/
private
boolean
usingSpecialLine
;
/**
* 专线的代理用户名
*/
private
String
proxyUsername
;
/**
* 专线的代理密码
*/
private
String
proxyPassword
;
/**
* ip 资源绑定的 商铺号
*/
private
String
shopId
;
private
List
<
String
>
shopIds
=
new
ArrayList
<>();
/**
* 绑定状态
*/
private
boolean
bind
;
private
boolean
isLocked
;
private
long
lockTimestamp
;
private
long
healthLockTimestamp
;
/**
* 购买方式(按月、按周)
*/
private
String
unit
;
/**
* 购买数量
* 例如 购买了 2 个月 的 ip资源,则
* period:2
* unit:month
*/
private
int
period
;
@Override
...
...
src/main/java/com/edgec/browserbackend/browser/domain/IpType.java
View file @
51b4192f
...
...
@@ -14,5 +14,5 @@ public enum IpType {
/**
* 自有ip,即该ip不是从我们系统购买的
*/
OWN
OWN
;
}
src/main/java/com/edgec/browserbackend/browser/dto/IpBuyResultDto.java
View file @
51b4192f
...
...
@@ -4,44 +4,14 @@ import java.util.ArrayList;
import
java.util.List
;
public
class
IpBuyResultDto
{
private
String
errorCode
=
""
;
private
String
errorCode
=
""
;
private
String
requestid
=
""
;
private
String
requestid
=
""
;
private
int
balance
=
0
;
private
List
<
IPData
>
iplist
=
new
ArrayList
<>();
public
static
class
IPData
{
private
String
ip
;
private
String
validTill
;
public
IPData
(
String
ip
,
String
validTill
)
{
this
.
ip
=
ip
;
this
.
validTill
=
validTill
;
}
public
IPData
()
{
}
public
String
getIp
()
{
return
ip
;
}
public
void
setIp
(
String
ip
)
{
this
.
ip
=
ip
;
}
public
String
getValidTill
()
{
return
validTill
;
}
public
void
setValidTill
(
String
validTill
)
{
this
.
validTill
=
validTill
;
}
}
public
String
getErrorCode
()
{
return
errorCode
;
}
...
...
@@ -73,4 +43,34 @@ public class IpBuyResultDto {
public
void
setIplist
(
List
<
IPData
>
iplist
)
{
this
.
iplist
=
iplist
;
}
public
static
class
IPData
{
private
String
ip
;
private
String
validTill
;
public
IPData
(
String
ip
,
String
validTill
)
{
this
.
ip
=
ip
;
this
.
validTill
=
validTill
;
}
public
IPData
()
{
}
public
String
getIp
()
{
return
ip
;
}
public
void
setIp
(
String
ip
)
{
this
.
ip
=
ip
;
}
public
String
getValidTill
()
{
return
validTill
;
}
public
void
setValidTill
(
String
validTill
)
{
this
.
validTill
=
validTill
;
}
}
}
src/main/java/com/edgec/browserbackend/browser/dto/IpOperationResultDto.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
.
browser
.
dto
;
import
lombok.Data
;
import
java.util.ArrayList
;
import
java.util.List
;
@Data
public
class
IpOperationResultDto
{
List
<
String
>
successList
;
List
<
String
>
failList
;
List
<
String
>
successList
=
new
ArrayList
<>();
List
<
String
>
failList
=
new
ArrayList
<>();
public
List
<
String
>
getSuccessList
()
{
return
successList
;
}
public
void
setSuccessList
(
List
<
String
>
successList
)
{
this
.
successList
=
successList
;
}
public
List
<
String
>
getFailList
()
{
return
failList
;
}
public
void
setFailList
(
List
<
String
>
failList
)
{
this
.
failList
=
failList
;
}
}
src/main/java/com/edgec/browserbackend/browser/dto/IpResourceRequestDto.java
View file @
51b4192f
...
...
@@ -10,58 +10,27 @@ import java.util.List;
@JsonIgnoreProperties
(
ignoreUnknown
=
true
)
public
class
IpResourceRequestDto
{
private
String
name
;
/**
* ip 所在地域(英文)
*/
private
String
region
;
/**
* ip 所在地域(中文)
*/
private
String
regionCn
;
/**
* ip 厂商
*/
private
String
vendor
=
"aliyun"
;
private
String
vendor
=
"aliyun"
;
private
String
logintype
=
"password"
;
private
String
shopId
;
/**
* 0:余额, 1:支付宝, 2:微信
*/
//0 -- 余额, 1 -- 支付宝, 2 -- 微信
private
int
payMethod
=
0
;
@Max
(
12
)
@Min
(
1
)
private
int
period
=
1
;
/**
* 例如 period :2,unit = month
* 代表:购买 ip 2 个 月
*/
private
String
unit
=
"month"
;
/**
* 购买的ip数量(用户可以一次购买多个ip)
*/
private
String
unit
=
"month"
;
private
int
amount
=
1
;
private
boolean
autorenew
=
false
;
private
int
ipkeptperiod
=
7
;
private
String
startscript
=
""
;
/**
* ip 是否需要使用专线
*/
private
boolean
specialLine
;
/**
* 自有IP需要传proxy的账号
*/
//自有IP需要传proxy的账号
private
String
username
;
private
String
password
;
private
String
instanceSpecKey
;
...
...
@@ -75,7 +44,6 @@ public class IpResourceRequestDto {
private
List
<
String
>
ipId
=
new
ArrayList
<>();
public
String
getName
()
{
return
name
;
}
...
...
src/main/java/com/edgec/browserbackend/browser/dto/RenewIpResultDto.java
View file @
51b4192f
...
...
@@ -4,12 +4,36 @@ import java.util.ArrayList;
import
java.util.List
;
public
class
RenewIpResultDto
{
private
String
errorCode
=
""
;
private
String
errorCode
=
""
;
private
int
balance
=
0
;
private
List
<
IpBuyResultDto
.
IPData
>
iplist
=
new
ArrayList
<>();
public
String
getErrorCode
()
{
return
errorCode
;
}
public
void
setErrorCode
(
String
errorCode
)
{
this
.
errorCode
=
errorCode
;
}
public
int
getBalance
()
{
return
balance
;
}
public
void
setBalance
(
int
balance
)
{
this
.
balance
=
balance
;
}
public
List
<
IpBuyResultDto
.
IPData
>
getIplist
()
{
return
iplist
;
}
public
void
setIplist
(
List
<
IpBuyResultDto
.
IPData
>
iplist
)
{
this
.
iplist
=
iplist
;
}
public
static
class
IPData
{
private
String
ip
;
private
String
validTill
;
...
...
@@ -20,6 +44,7 @@ public class RenewIpResultDto {
}
public
IPData
()
{
}
public
String
getIp
()
{
...
...
@@ -39,28 +64,4 @@ public class RenewIpResultDto {
}
}
public
String
getErrorCode
()
{
return
errorCode
;
}
public
void
setErrorCode
(
String
errorCode
)
{
this
.
errorCode
=
errorCode
;
}
public
int
getBalance
()
{
return
balance
;
}
public
void
setBalance
(
int
balance
)
{
this
.
balance
=
balance
;
}
public
List
<
IpBuyResultDto
.
IPData
>
getIplist
()
{
return
iplist
;
}
public
void
setIplist
(
List
<
IpBuyResultDto
.
IPData
>
iplist
)
{
this
.
iplist
=
iplist
;
}
}
\ No newline at end of file
src/main/java/com/edgec/browserbackend/browser/repository/IpResourceRepositoryCustomImpl.java
View file @
51b4192f
...
...
@@ -35,7 +35,10 @@ public class IpResourceRepositoryCustomImpl implements IpResourceRepositoryCusto
update
.
set
(
"isLocked"
,
true
).
set
(
"lockTimestamp"
,
Instant
.
now
().
toEpochMilli
());
UpdateResult
result
=
mongoTemplate
.
updateFirst
(
basicQuery
,
update
,
IpResource
.
class
);
return
result
.
getModifiedCount
()
>=
1
;
if
(
result
.
getModifiedCount
()
<
1
)
return
false
;
else
return
true
;
}
@Override
...
...
src/main/java/com/edgec/browserbackend/browser/repository/ShopRepository.java
View file @
51b4192f
...
...
@@ -9,12 +9,7 @@ import java.util.List;
public
interface
ShopRepository
extends
MongoRepository
<
Shop
,
String
>
{
Page
<
Shop
>
findByShopIdInAndShopAccountLikeOrderByCreateTimeDesc
(
List
<
String
>
shopIds
,
String
shopAccount
,
Pageable
pageable
);
Page
<
Shop
>
findByShopIdInAndShopNameLikeOrderByCreateTimeDesc
(
List
<
String
>
shopIds
,
String
shopName
,
Pageable
pageable
);
Page
<
Shop
>
findByShopIdInOrderByCreateTimeDesc
(
List
<
String
>
shopIds
,
Pageable
pageable
);
List
<
Shop
>
findByShopIdIn
(
List
<
String
>
shopIds
);
List
<
Shop
>
findByOwnerIn
(
List
<
String
>
owners
);
}
src/main/java/com/edgec/browserbackend/browser/service/Impl/GroupServiceImpl.java
View file @
51b4192f
...
...
@@ -35,26 +35,20 @@ public class GroupServiceImpl implements GroupService {
@Override
public
String
addGroup
(
String
username
,
String
groupName
)
{
// 1. 校验传参
if
(
StringUtils
.
isBlank
(
username
)
||
StringUtils
.
isBlank
(
groupName
))
{
if
(
StringUtils
.
isBlank
(
username
)
||
StringUtils
.
isBlank
(
groupName
))
throw
new
ClientRequestException
(
BrowserErrorCode
.
INFORMATIONNOTCOMPELETE
);
}
// 2. 获取account信息并校验account
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
.
getGroupCount
()
>=
100
)
{
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
if
(
account
.
getGroupCount
()
>=
100
)
throw
new
ClientRequestException
(
AccountErrorCode
.
GROUPMAX
);
}
Group
group
=
new
Group
();
group
.
setOwner
(
username
);
group
.
setName
(
groupName
);
String
id
;
try
{
// 3. 保存 group信息
Group
group1
=
groupRepository
.
save
(
group
);
// 4. 更新 account 的 分组数
//可以优化
account
.
setGroupCount
(
account
.
getGroupCount
()
+
1
);
accountRepository
.
save
(
account
);
id
=
group1
.
getId
();
...
...
@@ -86,6 +80,8 @@ public class GroupServiceImpl implements GroupService {
if
(
StringUtils
.
isBlank
(
username
)
||
StringUtils
.
isBlank
(
groupId
))
throw
new
ClientRequestException
(
BrowserErrorCode
.
INFORMATIONNOTCOMPELETE
);
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
try
{
userShopRepository
.
updateGroupId
(
groupId
,
null
);
groupRepository
.
deleteById
(
groupId
);
...
...
@@ -100,17 +96,20 @@ public class GroupServiceImpl implements GroupService {
@Override
public
List
<
GroupDto
>
getGroupList
(
String
username
)
{
if
(
StringUtils
.
isBlank
(
username
))
{
if
(
StringUtils
.
isBlank
(
username
))
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
}
List
<
GroupDto
>
groupDtos
=
new
ArrayList
<>();
List
<
Group
>
groups
=
groupRepository
.
findByOwner
(
username
);
groups
.
forEach
(
x
->
groupDtos
.
add
(
new
GroupDto
(
x
.
getId
(),
x
.
getName
(),
x
.
getDetails
()))
);
if
(
groups
==
null
)
return
new
ArrayList
<>();
List
<
GroupDto
>
groupDtos
=
new
ArrayList
<>();
try
{
groups
.
stream
().
forEach
(
x
->
{
groupDtos
.
add
(
new
GroupDto
(
x
.
getId
(),
x
.
getName
(),
x
.
getDetails
()));
});
}
catch
(
Exception
e
)
{
logger
.
error
(
"fail to delete group"
,
e
.
getMessage
());
throw
new
ClientRequestException
(
BrowserErrorCode
.
UNKNOWN
);
}
return
groupDtos
;
}
}
src/main/java/com/edgec/browserbackend/browser/service/Impl/IpResourceServiceImpl.java
View file @
51b4192f
...
...
@@ -20,7 +20,6 @@ import com.edgec.browserbackend.common.utils.FileUtil;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.annotations.Nullable
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -159,36 +158,36 @@ public class IpResourceServiceImpl implements IpResourceService {
@Override
public
List
<
String
>
buyIp
(
String
username
,
IpResourceRequestDto
ipResourceRequestDto
)
throws
Exception
{
// 1. 数据校验
if
(
ipResourceRequestDto
.
getRegion
()
==
null
||
ipResourceRequestDto
.
getRegionCn
()
==
null
)
{
throw
new
ClientRequestException
(
BrowserErrorCode
.
INFORMATIONNOTCOMPELETE
);
}
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
.
getPermission
()
<
4
)
{
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
if
(
account
.
getPermission
()
<
4
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
// 2. 计算 ip 单价信息
double
newprice
=
0
;
if
(!
"own"
.
equals
(
ipResourceRequestDto
.
getVendor
()))
{
Map
<
String
,
List
<
String
>>
priceList
=
ipOptionsRepository
.
findAll
().
get
(
0
).
getIpPlatForm
();
if
(
ipResourceRequestDto
.
getRegion
()
==
null
)
throw
new
ClientRequestException
(
BrowserErrorCode
.
INFORMATIONNOTCOMPELETE
);
if
(
ipResourceRequestDto
.
getRegionCn
()
==
null
)
throw
new
ClientRequestException
(
BrowserErrorCode
.
INFORMATIONNOTCOMPELETE
);
double
newprice
=
0
;
if
(!
ipResourceRequestDto
.
getVendor
().
equals
(
"own"
))
{
List
<
String
>
vendorPrices
=
priceList
.
get
(
ipResourceRequestDto
.
getRegionCn
());
String
price
=
vendorPrices
.
stream
()
.
filter
(
x
->
Vendor
.
valueOf
(
ipResourceRequestDto
.
getVendor
()).
getValue
().
equals
(
x
.
substring
(
0
,
x
.
indexOf
(
"-"
))))
.
map
(
x
->
x
.
substring
(
x
.
lastIndexOf
(
"-"
)
+
1
))
.
collect
(
Collectors
.
joining
());
newprice
=
"week"
.
equals
(
ipResourceRequestDto
.
getUnit
())
?
(
Integer
.
valueOf
(
price
)
/
3
)
:
Integer
.
valueOf
(
price
);
.
map
(
x
->
x
.
substring
(
x
.
lastIndexOf
(
"-"
)
+
1
)).
collect
(
Collectors
.
joining
());
newprice
=
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
)
?
(
Integer
.
valueOf
(
price
)
/
3
)
:
Integer
.
valueOf
(
price
);
}
// 3. 计算总共需要花费多少钱 并 校验账户余额 够不够扣费
IpChargeResultDto
ipChargeResultDto
=
accountService
.
preChargeByMoney
(
username
,
newprice
*
ipResourceRequestDto
.
getAmount
()
*
ipResourceRequestDto
.
getPeriod
());
if
(!
ipChargeResultDto
.
isSuccess
())
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOTENOUGHBALANCE
);
}
// 生成随机密码
String
password
=
StringUtils
.
isNotBlank
(
ipResourceRequestDto
.
getPassword
())
?
ipResourceRequestDto
.
getPassword
()
:
genRandom
(
3
,
12
);
String
password
;
if
(
StringUtils
.
isNotBlank
(
ipResourceRequestDto
.
getPassword
()))
password
=
ipResourceRequestDto
.
getPassword
();
else
password
=
genRandom
(
3
,
12
);
List
<
IpResourceDto
>
ipResourceDtos
=
new
ArrayList
<>();
List
<
String
>
ipIds
=
new
ArrayList
<>();
...
...
@@ -197,37 +196,28 @@ public class IpResourceServiceImpl implements IpResourceService {
IpResource
ipResource
=
new
IpResource
();
ipResource
.
setPeriod
(
ipResourceRequestDto
.
getPeriod
());
//充6送1
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"month"
))
{
if
(
ipResourceRequestDto
.
getPeriod
()
==
6
)
{
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"month"
)
&&
ipResourceRequestDto
.
getPeriod
()
==
6
)
ipResource
.
setPeriod
(
7
);
}
if
(
ipResourceRequestDto
.
getPeriod
()
==
12
)
{
else
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"month"
)
&&
ipResourceRequestDto
.
getPeriod
()
==
12
)
ipResource
.
setPeriod
(
14
);
}
}
// 根据 ip 的 vendor 来封装部分的 ipResource 信息
if
(
ipResourceRequestDto
.
getVendor
().
equals
(
"local"
))
{
ipResource
.
setAddr
(
"本地Ip未使用"
);
ipResource
.
setIpType
(
IpType
.
LOCAL
);
ipResource
.
setVendor
(
Vendor
.
valueOf
(
ipResourceRequestDto
.
getVendor
()));
ipResource
.
setVendorCn
(
"本地"
);
ipResource
.
setStatus
(
4
);
long
validTime
=
0
;
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
))
{
validTime
=
Instant
.
now
().
atZone
(
ZoneOffset
.
UTC
).
plusWeeks
(
ipResource
.
getPeriod
()).
toInstant
().
toEpochMilli
();
}
else
{
validTime
=
Instant
.
now
().
atZone
(
ZoneOffset
.
UTC
).
plusMonths
(
ipResource
.
getPeriod
()).
toInstant
().
toEpochMilli
();
}
ipResource
.
setValidTime
(
validTime
);
ipResource
.
setUsername
(
USERNAME
);
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
))
ipResource
.
setValidTime
(
Instant
.
now
().
atZone
(
ZoneOffset
.
UTC
).
plusWeeks
(
ipResource
.
getPeriod
()).
toInstant
().
toEpochMilli
());
else
ipResource
.
setValidTime
(
Instant
.
now
().
atZone
(
ZoneOffset
.
UTC
).
plusMonths
(
ipResource
.
getPeriod
()).
toInstant
().
toEpochMilli
());
ipResource
.
setPort
(
port
);
}
else
if
(
ipResourceRequestDto
.
getVendor
().
equals
(
"own"
))
{
if
(
ipResourceRequestDto
.
getAddr
()
==
null
||
ipResourceRequestDto
.
getAddr
().
isEmpty
()
||
StringUtils
.
isBlank
(
ipResourceRequestDto
.
getAddr
().
get
(
i
)))
{
if
(
ipResourceRequestDto
.
getAddr
()
==
null
||
ipResourceRequestDto
.
getAddr
().
size
()
==
0
)
throw
new
ClientRequestException
(
BrowserErrorCode
.
INFORMATIONNOTCOMPELETE
);
if
(
StringUtils
.
isBlank
(
ipResourceRequestDto
.
getAddr
().
get
(
i
)))
throw
new
ClientRequestException
(
BrowserErrorCode
.
INFORMATIONNOTCOMPELETE
);
}
ipResource
.
setSpecialLine
(
ipResourceRequestDto
.
isSpecialLine
());
ipResource
.
setAddr
(
ipResourceRequestDto
.
getAddr
().
get
(
i
));
ipResource
.
setIpType
(
IpType
.
OWN
);
...
...
@@ -251,38 +241,26 @@ public class IpResourceServiceImpl implements IpResourceService {
case
"aws"
:
ipResource
.
setVendorCn
(
"亚马逊云"
);
break
;
default
:
break
;
}
ipResource
.
setStatus
(
6
);
long
validTime
=
0
;
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
))
{
validTime
=
Instant
.
now
().
atZone
(
ZoneOffset
.
UTC
).
plusWeeks
(
ipResource
.
getPeriod
()).
toInstant
().
toEpochMilli
();
}
else
{
validTime
=
Instant
.
now
().
atZone
(
ZoneOffset
.
UTC
).
plusMonths
(
ipResource
.
getPeriod
()).
toInstant
().
toEpochMilli
();
}
ipResource
.
setValidTime
(
validTime
);
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
))
ipResource
.
setValidTime
(
Instant
.
now
().
atZone
(
ZoneOffset
.
UTC
).
plusWeeks
(
ipResource
.
getPeriod
()).
toInstant
().
toEpochMilli
());
else
ipResource
.
setValidTime
(
Instant
.
now
().
atZone
(
ZoneOffset
.
UTC
).
plusMonths
(
ipResource
.
getPeriod
()).
toInstant
().
toEpochMilli
());
ipResource
.
setUsername
(
USERNAME
);
ipResource
.
setPort
(
port
);
}
ipResource
.
setPurchasedTime
(
Instant
.
now
().
toEpochMilli
());
if
(
account
.
getParent
()
!=
null
)
{
if
(
account
.
getParent
()
!=
null
)
ipResource
.
setUserParent
(
account
.
getParent
());
}
ipResource
.
setRegion
(
ipResourceRequestDto
.
getRegion
());
// 只要 申请的 ip 地域不是在 大陆,则一定会执行下面 if 中的代码块
boolean
condition1
=
StringUtils
.
isNotBlank
(
ipResource
.
getRegion
())
&&
region
.
contains
(
ipResource
.
getRegion
());
boolean
condition2
=
ipResourceRequestDto
.
getVendor
().
equals
(
"own"
)
&&
ipResource
.
isSpecialLine
();
if
(
condition1
||
condition2
)
{
if
((
StringUtils
.
isNotBlank
(
ipResource
.
getRegion
())
&&
region
.
contains
(
ipResource
.
getRegion
()))
||
(
ipResourceRequestDto
.
getVendor
().
equals
(
"own"
)
&&
ipResource
.
isSpecialLine
()))
{
ipResource
.
setProxyUsername
(
ipResource
.
getAddr
());
ipResource
.
setProxyPassword
(
genRandom
(
3
,
12
));
ipResource
.
setSpecialLine
(
true
);
ipResource
.
setHealthLockTimestamp
(
Instant
.
now
().
minusSeconds
(
60
*
20
).
toEpochMilli
());
}
ipResource
.
setPurchasedTime
(
Instant
.
now
().
toEpochMilli
());
ipResource
.
setRegionCn
(
ipResourceRequestDto
.
getRegionCn
());
ipResource
.
setProtocol
(
protocol
);
ipResource
.
setPassword
(
password
);
...
...
@@ -291,22 +269,16 @@ public class IpResourceServiceImpl implements IpResourceService {
ipResource
.
setLockTimestamp
(
Instant
.
now
().
toEpochMilli
());
ipResource
.
setUnit
(
ipResourceRequestDto
.
getUnit
());
ipResource
.
setPrice
(
newprice
);
IpResource
ipResource1
=
ipResourceRepository
.
save
(
ipResource
);
ipResourceDtos
.
add
(
new
IpResourceDto
(
ipResource1
,
null
,
false
));
ipIds
.
add
(
ipResource1
.
getId
());
}
if
(!
ipResourceRequestDto
.
getVendor
().
equals
(
"own"
))
{
// 封装购买 ip 的费用 信息
IpChargeRequestDto
ipChargeRequestDto
=
buildIpChargeRequestDto
(
ipResourceRequestDto
,
1
,
ipResourceRequestDto
.
getPayMethod
());
// 用来记录购买与消费的操作 userbalance 与 费用明细 userprepaidbilling
accountService
.
chargeByMoney
(
username
,
newprice
*
ipChargeRequestDto
.
getAmount
()
*
ipChargeRequestDto
.
getPeriod
(),
ipChargeRequestDto
);
}
// 如果ip需要绑定店铺,则将店铺与ip绑定 todo 感觉这个地方代码用不到,
if
(
ipResourceRequestDto
.
getShopId
()
!=
null
)
{
ShopRequestDto
shopRequestDto
=
new
ShopRequestDto
();
shopRequestDto
.
setIpId
(
ipResourceDtos
.
get
(
0
).
getId
());
...
...
@@ -319,94 +291,104 @@ public class IpResourceServiceImpl implements IpResourceService {
@Override
public
IpOperationResultDto
renewIp
(
String
username
,
IpResourceRequestDto
ipResourceRequestDto
)
{
// 1. 校验当前用户是否存在
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
String
URL
=
(
profiles
.
equals
(
"dev"
)
||
profiles
.
equals
(
"staging"
))
?
TESTURL
:
CLOUDAMURL
;
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
// 2. 获取 ip 资源 地域 - 云厂商 - 价格 信息
Map
<
String
,
List
<
String
>>
ipPlatForm
=
ipOptionsRepository
.
findAll
().
get
(
0
).
getIpPlatForm
();
List
<
String
>
failedList
=
ipResourceRequestDto
.
getAddr
();
// 3. 计算如果是按月续费ip一个月一共需要花费多少钱,如果是按周学费,则在原来的基础上除以3。
AtomicReference
<
Double
>
totalprice
=
getDoubleAtomicReference
(
ipResourceRequestDto
,
ipPlatForm
);
String
unit
=
ipResourceRequestDto
.
getUnit
();
double
newprice
=
unit
.
equals
(
"week"
)
?
(
int
)
(
totalprice
.
get
()
/
3
)
:
totalprice
.
get
().
intValue
();
Map
<
String
,
List
<
String
>>
priceList
=
ipOptionsRepository
.
findAll
().
get
(
0
).
getIpPlatForm
();
AtomicReference
<
Double
>
totalprice
=
new
AtomicReference
<>((
double
)
0
);
ipResourceRequestDto
.
getAddr
().
stream
().
map
(
x
->
ipResourceRepository
.
findByAddrAndIsDeleted
(
x
,
false
))
.
forEach
(
ipResource
->
{
List
<
String
>
prices
;
if
(!
ipResourceRequestDto
.
getVendor
().
equals
(
"own"
))
prices
=
priceList
.
get
(
ipResource
.
getRegionCn
());
else
{
if
(
ipResource
.
isSpecialLine
())
prices
=
priceList
.
get
(
"自有专线"
);
else
prices
=
priceList
.
get
(
"自有"
);
}
for
(
String
vendorprice
:
prices
)
{
if
(
ipResource
.
getVendor
().
getValue
().
equals
(
vendorprice
.
substring
(
0
,
vendorprice
.
indexOf
(
"-"
))))
totalprice
.
updateAndGet
(
v
->
new
Double
(
v
+
Double
.
valueOf
(
vendorprice
.
substring
(
vendorprice
.
lastIndexOf
(
"-"
)
+
1
))));
}
});
// 4. 计算总共需要花费多少钱 并 校验账户余额 够不够扣费, todo 这个地方 * ipResourceRequestDto.getAmount() 应该是多余的,因为在续费的时候,这个值始终为1
double
newprice
=
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
)
?
(
int
)
(
totalprice
.
get
()
/
3
)
:
totalprice
.
get
().
intValue
();
IpChargeResultDto
ipChargeResultDto
=
accountService
.
preChargeByMoney
(
username
,
newprice
*
ipResourceRequestDto
.
getPeriod
()
*
ipResourceRequestDto
.
getAmount
());
if
(!
ipChargeResultDto
.
isSuccess
())
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOTENOUGHBALANCE
);
}
int
period
=
ipResourceRequestDto
.
getPeriod
();
IpOperationResultDto
ipOperationResultDto
=
new
IpOperationResultDto
();
// 5. 按月充值充6送1
period
=
setAndGetPeriod
(
unit
,
period
);
int
period
=
0
;
period
=
ipResourceRequestDto
.
getPeriod
();
//充6送1
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"month"
)
&&
ipResourceRequestDto
.
getPeriod
()
==
6
)
period
=
7
;
else
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"month"
)
&&
ipResourceRequestDto
.
getPeriod
()
==
12
)
period
=
14
;
// 6. 实际业务逻辑
IpOperationResultDto
ipOperationResultDto
=
new
IpOperationResultDto
();
List
<
String
>
failedList
=
ipResourceRequestDto
.
getAddr
();
if
(
ipResourceRequestDto
.
getAddr
()
!=
null
&&
ipResourceRequestDto
.
getAddr
().
size
()
>
0
)
{
// 6.1 远程调用 云E 续费 传入的所有的 ip,校验是否续费成功
RenewIpResultDto
renewIpResultDto
=
getRenewIpResultDto
(
ipResourceRequestDto
,
period
);
RestTemplate
restTemplate
=
new
RestTemplate
();
HashMap
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"iplist"
,
ipResourceRequestDto
.
getAddr
());
map
.
put
(
"period"
,
period
);
map
.
put
(
"unit"
,
ipResourceRequestDto
.
getUnit
());
HttpHeaders
headers
=
buildPostHeader
();
HttpEntity
<
Map
<
String
,
Object
>>
entity
=
new
HttpEntity
<>(
map
,
headers
);
ResponseEntity
<
String
>
result
=
restTemplate
.
exchange
(
URL
+
"/intelligroup/renewip?accountId=browser"
,
HttpMethod
.
PUT
,
entity
,
String
.
class
);
RenewIpResultDto
renewIpResultDto
=
JSON
.
parseObject
(
result
.
getBody
(),
RenewIpResultDto
.
class
);
if
(
StringUtils
.
isNotBlank
(
renewIpResultDto
.
getErrorCode
()))
{
logger
.
error
(
renewIpResultDto
.
getErrorCode
());
throw
new
ClientRequestException
(
BrowserErrorCode
.
UNKNOWN
);
}
// 6.2 远程续费成功后的业务
renewIpResultDto
.
getIplist
().
forEach
(
x
->
{
renewIpResultDto
.
getIplist
().
forEach
(
x
->
{
IpResource
ipResource
=
ipResourceRepository
.
findByAddrAndIsDeleted
(
x
.
getIp
(),
false
);
List
<
String
>
vendorPrices
=
ipPlatForm
.
get
(
ipResource
.
getRegionCn
());
// 计算 ip 价格
List
<
String
>
vendorPrices
=
priceList
.
get
(
ipResource
.
getRegionCn
());
String
price
=
vendorPrices
.
stream
()
.
filter
(
vendorprice
->
ipResource
.
getVendor
().
getValue
().
equals
(
vendorprice
.
substring
(
0
,
vendorprice
.
indexOf
(
"-"
))))
.
map
(
vendorprice
->
vendorprice
.
substring
(
vendorprice
.
lastIndexOf
(
"-"
)
+
1
))
.
collect
(
Collectors
.
joining
());
double
newprice1
=
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
)
?
(
Integer
.
valueOf
(
price
)
/
3
)
:
Integer
.
valueOf
(
price
);
.
map
(
vendorprice
->
vendorprice
.
substring
(
vendorprice
.
lastIndexOf
(
"-"
)
+
1
)).
collect
(
Collectors
.
joining
());
// 封装 ip 的续费 信息
double
newprice1
=
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
)
?
(
Integer
.
valueOf
(
price
)
/
3
)
:
Integer
.
valueOf
(
price
);
IpChargeRequestDto
ipChargeRequestDto
=
buildIpChargeRequestDto
(
ipResourceRequestDto
,
2
,
ipResourceRequestDto
.
getPayMethod
());
ipChargeRequestDto
.
setChargeIp
(
x
.
getIp
());
// 用来记录购买与消费的操作 userbalance 与 费用明细 userprepaidbilling
accountService
.
chargeByMoney
(
username
,
newprice1
*
ipResourceRequestDto
.
getPeriod
()
*
ipResourceRequestDto
.
getAmount
(),
ipChargeRequestDto
);
// 更新ip资源的到期时间
ipResource
.
setValidTime
(
Instant
.
parse
(
x
.
getValidTill
()).
toEpochMilli
());
ipResourceRepository
.
save
(
ipResource
);
// 封装 ipOperationResultDto
ipOperationResultDto
.
getSuccessList
().
add
(
x
.
getIp
());
failedList
.
remove
(
x
.
getIp
());
}
);
});
// 封装 ipOperationResultDto
ipOperationResultDto
.
setFailList
(
failedList
);
}
if
(
ipResourceRequestDto
.
getIpId
()
!=
null
&&
ipResourceRequestDto
.
getIpId
().
size
()
>
0
)
{
int
finalPeriod
=
period
;
ipResourceRequestDto
.
getIpId
().
forEach
(
x
->
{
ipResourceRequestDto
.
getIpId
().
forEach
(
x
->
{
IpResource
ipResource
=
ipResourceRepository
.
findByIdAndIsDeleted
(
x
,
false
);
List
<
String
>
vendorPrices
;
if
(!
ipResourceRequestDto
.
getVendor
().
equals
(
"own"
))
vendorPrices
=
ipPlatForm
.
get
(
ipResource
.
getRegionCn
());
vendorPrices
=
priceList
.
get
(
ipResource
.
getRegionCn
());
else
{
if
(
ipResource
.
isSpecialLine
())
vendorPrices
=
ipPlatForm
.
get
(
"自有专线"
);
vendorPrices
=
priceList
.
get
(
"自有专线"
);
else
vendorPrices
=
ipPlatForm
.
get
(
"自有"
);
vendorPrices
=
priceList
.
get
(
"自有"
);
}
String
price
=
vendorPrices
.
stream
()
.
filter
(
vendorprice
->
ipResource
.
getVendor
().
getValue
().
equals
(
vendorprice
.
substring
(
0
,
vendorprice
.
indexOf
(
"-"
))))
.
map
(
vendorprice
->
vendorprice
.
substring
(
vendorprice
.
lastIndexOf
(
"-"
)
+
1
))
.
collect
(
Collectors
.
joining
());
.
map
(
vendorprice
->
vendorprice
.
substring
(
vendorprice
.
lastIndexOf
(
"-"
)
+
1
)).
collect
(
Collectors
.
joining
());
double
newprice1
=
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
)
?
(
Integer
.
valueOf
(
price
)
/
3
)
:
Integer
.
valueOf
(
price
);
IpChargeRequestDto
ipChargeRequestDto
=
buildIpChargeRequestDto
(
ipResourceRequestDto
,
2
,
ipResourceRequestDto
.
getPayMethod
());
ipChargeRequestDto
.
setChargeIp
(
x
);
accountService
.
chargeByMoney
(
username
,
newprice1
*
ipResourceRequestDto
.
getPeriod
()
*
ipResourceRequestDto
.
getAmount
(),
ipChargeRequestDto
);
if
(
ipResourceRequestDto
.
getUnit
().
equals
(
"week"
))
{
...
...
@@ -420,8 +402,7 @@ public class IpResourceServiceImpl implements IpResourceService {
ipOperationResultDto
.
getSuccessList
().
add
(
x
);
failedList
.
remove
(
x
);
}
);
});
}
return
ipOperationResultDto
;
...
...
@@ -705,6 +686,8 @@ public class IpResourceServiceImpl implements IpResourceService {
@Override
public
boolean
queryIpExist
(
String
username
,
IpResourceUpdateDto
ipResourceUpdateDto
)
{
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
IpResource
ipResource
=
ipResourceRepository
.
findByAddrAndIsDeleted
(
ipResourceUpdateDto
.
getAddr
(),
false
);
if
(
ipResource
!=
null
)
{
return
true
;
...
...
@@ -715,6 +698,8 @@ public class IpResourceServiceImpl implements IpResourceService {
@Override
public
IpResourceDto
queryIp
(
String
username
,
IpResourceRequestDto
ipResourceRequestDto
)
{
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
IpResource
ipResource
=
null
;
if
(
ipResourceRequestDto
.
getAddr
()
!=
null
&&
ipResourceRequestDto
.
getAddr
().
size
()
>
0
)
ipResource
=
ipResourceRepository
.
findByAddrAndIsDeleted
(
ipResourceRequestDto
.
getAddr
().
get
(
0
),
false
);
...
...
@@ -790,14 +775,13 @@ public class IpResourceServiceImpl implements IpResourceService {
}
}
private
IpChargeRequestDto
buildIpChargeRequestDto
(
IpResourceRequestDto
request
,
int
chargeType
,
int
payMethod
)
{
IpChargeRequestDto
ipChargeRequestDto
=
new
IpChargeRequestDto
();
ipChargeRequestDto
.
setAmount
(
request
.
getAmount
());
ipChargeRequestDto
.
setChargeType
(
chargeType
);
ipChargeRequestDto
.
setRegion
(
request
.
getRegion
());
ipChargeRequestDto
.
setPeriod
(
request
.
getPeriod
());
ipChargeRequestDto
.
setUnit
(
request
.
getUnit
());
ipChargeRequestDto
.
setChargeType
(
chargeType
);
ipChargeRequestDto
.
setPayMethod
(
payMethod
);
return
ipChargeRequestDto
;
}
...
...
@@ -913,57 +897,4 @@ public class IpResourceServiceImpl implements IpResourceService {
}
return
ipResources1
;
}
private
int
setAndGetPeriod
(
String
unit
,
int
period
)
{
if
(
unit
.
equals
(
"month"
))
{
if
(
period
==
6
)
{
period
=
7
;
}
if
(
period
==
12
)
{
period
=
14
;
}
}
return
period
;
}
@NotNull
private
AtomicReference
<
Double
>
getDoubleAtomicReference
(
IpResourceRequestDto
ipResourceRequestDto
,
Map
<
String
,
List
<
String
>>
ipPlatForm
)
{
AtomicReference
<
Double
>
totalprice
=
new
AtomicReference
<>((
double
)
0
);
ipResourceRequestDto
.
getAddr
().
stream
()
.
map
(
x
->
ipResourceRepository
.
findByAddrAndIsDeleted
(
x
,
false
))
.
forEach
(
ipResource
->
{
List
<
String
>
regionAndPriceInfos
;
if
(!
ipResourceRequestDto
.
getVendor
().
equals
(
"own"
))
{
regionAndPriceInfos
=
ipPlatForm
.
get
(
ipResource
.
getRegionCn
());
}
else
{
regionAndPriceInfos
=
ipResource
.
isSpecialLine
()
?
ipPlatForm
.
get
(
"自有专线"
)
:
ipPlatForm
.
get
(
"自有"
);
}
for
(
String
vendorprice
:
regionAndPriceInfos
)
{
if
(
ipResource
.
getVendor
().
getValue
().
equals
(
vendorprice
.
substring
(
0
,
vendorprice
.
indexOf
(
"-"
))))
totalprice
.
updateAndGet
(
v
->
new
Double
(
v
+
Double
.
valueOf
(
vendorprice
.
substring
(
vendorprice
.
lastIndexOf
(
"-"
)
+
1
)))
);
}
}
);
return
totalprice
;
}
@Nullable
private
RenewIpResultDto
getRenewIpResultDto
(
IpResourceRequestDto
ipResourceRequestDto
,
int
period
)
{
RestTemplate
restTemplate
=
new
RestTemplate
();
HashMap
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"iplist"
,
ipResourceRequestDto
.
getAddr
());
map
.
put
(
"period"
,
period
);
map
.
put
(
"unit"
,
ipResourceRequestDto
.
getUnit
());
HttpHeaders
headers
=
buildPostHeader
();
HttpEntity
<
Map
<
String
,
Object
>>
entity
=
new
HttpEntity
<>(
map
,
headers
);
String
URL
=
(
profiles
.
equals
(
"dev"
)
||
profiles
.
equals
(
"staging"
))
?
TESTURL
:
CLOUDAMURL
;
ResponseEntity
<
String
>
result
=
restTemplate
.
exchange
(
URL
+
"/intelligroup/renewip?accountId=browser"
,
HttpMethod
.
PUT
,
entity
,
String
.
class
);
return
JSON
.
parseObject
(
result
.
getBody
(),
RenewIpResultDto
.
class
);
}
}
src/main/java/com/edgec/browserbackend/browser/service/Impl/ShopServiceImpl.java
View file @
51b4192f
...
...
@@ -26,7 +26,9 @@ import org.springframework.web.multipart.MultipartFile;
import
java.io.IOException
;
import
java.time.Instant
;
import
java.util.*
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.stream.Collectors
;
@Service
...
...
@@ -169,7 +171,7 @@ public class ShopServiceImpl implements ShopService {
ids
.
add
(
id
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"fail to add shops"
,
e
);
logger
.
error
(
"fail to add shops"
,
e
.
getMessage
()
);
throw
new
ClientRequestException
(
BrowserErrorCode
.
INFORMATIONNOTCOMPELETE
);
}
}
...
...
@@ -201,7 +203,7 @@ public class ShopServiceImpl implements ShopService {
// 4. 更新店铺信息
shopRepository
.
save
(
shop_old
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"fail to update"
,
e
);
logger
.
error
(
"fail to update"
,
e
.
getMessage
()
);
throw
new
ClientRequestException
(
BrowserErrorCode
.
INFORMATIONNOTCOMPELETE
);
}
return
shop_old
.
getShopId
();
...
...
@@ -234,19 +236,20 @@ public class ShopServiceImpl implements ShopService {
ipAndShopService
.
unBindShop
(
username
,
shopRequestDto
);
}
// 4. 获取当前店铺关联的所有的 usershop信息 并删除数据库中 usershop信息
List
<
UserShop
>
userShops
=
userShopRepository
.
findByShopId
(
shopId
);
// 4. 删除当前店铺关联的所有的 usershop信息
boolean
result
=
userShopRepository
.
deleteByShopId
(
shopId
);
if
(
result
)
{
// 5. 删除当前店铺,并更新 account信息 todo
shopRepository
.
deleteById
(
shopId
);
// 6. 更新 和店铺关联的所有的 account 的信息
List
<
UserShop
>
userShops
=
userShopRepository
.
findByShopId
(
shopId
);
List
<
Account
>
accountList
=
accountRepository
.
findByNameIn
(
userShops
.
stream
().
map
(
UserShop:
:
getUsername
).
collect
(
Collectors
.
toList
()));
for
(
Account
a
:
accountList
)
{
a
.
setShopCount
(
account
.
getShopCount
()
-
1
);
accountRepository
.
save
(
a
);
}
}
else
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
...
...
@@ -254,29 +257,19 @@ public class ShopServiceImpl implements ShopService {
@Override
public
void
transferShop
(
String
username
,
String
shopId
,
String
groupId
)
{
// 1. 校验当前用户是否存在账户信息
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
// 2. 校验 shop 是否存在
Shop
shop
=
shopRepository
.
findById
(
shopId
).
orElseThrow
(()
->
new
ClientRequestException
(
BrowserErrorCode
.
SHOPNOTEXIST
));
// 3. 校验 分组信息是否存在 以及 group 是否是当前 用户创建
Group
group
=
groupRepository
.
findById
(
groupId
).
orElseThrow
(()
->
new
ClientRequestException
(
BrowserErrorCode
.
GROUPNOTEXIST
));
if
(!
group
.
getId
().
equals
(
"-1"
)
&&
group
.
getOwner
()
!=
null
&&
!
group
.
getOwner
().
equals
(
username
))
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
// 4. 获取 usershop 信息 并校验
UserShop
userShop
=
userShopRepository
.
findByUsernameAndShopId
(
username
,
shopId
);
if
(
userShop
==
null
)
{
throw
new
ClientRequestException
(
BrowserErrorCode
.
USER_NOT_BIND_SHOP
);
Group
group
=
groupRepository
.
findById
(
groupId
).
orElseThrow
(()
->
new
ClientRequestException
(
BrowserErrorCode
.
GROUPNOTEXIST
));
if
(
userShop
==
null
||
(!
group
.
getId
().
equals
(
"-1"
)
&&
group
.
getOwner
()
!=
null
&&
!
group
.
getOwner
().
equals
(
username
)))
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
Shop
shop
=
shopRepository
.
findById
(
shopId
).
orElseThrow
(()
->
new
ClientRequestException
(
BrowserErrorCode
.
SHOPNOTEXIST
));
try
{
// 5.更该 店铺 分组 并保存
userShop
.
setGroupId
(
groupId
);
userShopRepository
.
save
(
userShop
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"fail to unbind"
,
e
);
logger
.
error
(
"fail to unbind"
,
e
.
getMessage
()
);
throw
new
ClientRequestException
(
BrowserErrorCode
.
UNKNOWN
);
}
...
...
@@ -284,115 +277,98 @@ public class ShopServiceImpl implements ShopService {
@Override
public
void
assignShops
(
String
username
,
List
<
String
>
shopIds
,
List
<
String
>
users
)
{
// 1. 查询当前登录用户信息,并校验是否具备分配权限
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
.
getPermission
()
<
8
)
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
// 2. 校验当前用户是否绑定了对应的 shops,并获取 usershops信息
List
<
UserShop
>
userShops
=
userShopRepository
.
findByUsernameAndShopIdIn
(
username
,
shopIds
);
if
(
userShops
==
null
||
userShops
.
size
()
<
1
)
{
throw
new
ClientRequestException
(
BrowserErrorCode
.
USER_NOT_BIND_SHOP
);
if
(
account
.
getPermission
()
<
8
||
userShops
==
null
||
userShops
.
size
()
<
1
)
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
// 3. 查询 目标 账户是否存在,并获取账户信息。注意:目标账户只能是当前用户的子账户
Pageable
pageable
=
PageRequest
.
of
(
0
,
100
);
List
<
Shop
>
shops
=
shopRepository
.
findByShopIdInOrderByCreateTimeDesc
(
shopIds
,
pageable
).
getContent
();
if
(
shops
==
null
||
shops
.
size
()
<
1
)
throw
new
ClientRequestException
(
BrowserErrorCode
.
SHOPNOTEXIST
);
List
<
Account
>
accounts
=
accountRepository
.
findByNameIn
(
users
);
if
(
accounts
==
null
||
accounts
.
size
()
!=
users
.
size
())
{
if
(
accounts
==
null
||
accounts
.
size
()
!=
users
.
size
())
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
}
for
(
Account
ac
:
accounts
)
{
if
(
ac
.
getParent
()
==
null
||
!
ac
.
getParent
().
equals
(
username
))
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
}
// 4. 获取 shop 信息 并校验
Pageable
pageable
=
PageRequest
.
of
(
0
,
100
);
List
<
Shop
>
shops
=
shopRepository
.
findByShopIdInOrderByCreateTimeDesc
(
shopIds
,
pageable
).
getContent
();
if
(
shops
==
null
||
shops
.
size
()
<
1
)
{
throw
new
ClientRequestException
(
BrowserErrorCode
.
SHOPNOTEXIST
);
}
try
{
if
(
shops
.
size
()
==
1
)
{
// 5. 删除除当前用户外的所有 usershop 信息
try
{
userShopRepository
.
deleteByShopIdExceptOwner
(
shops
.
get
(
0
).
getShopId
(),
shops
.
get
(
0
).
getOwner
());
for
(
Account
account1
:
accounts
)
{
// todo 这个地方有点多余
UserShop
userShop1
=
userShopRepository
.
findByUsernameAndShopId
(
account1
.
getName
(),
shops
.
get
(
0
).
getShopId
());
if
(
userShop1
!=
null
)
{
if
(
userShop1
!=
null
)
continue
;
}
// 6. 封装 目标账户的 usershop信息并保存
userShop1
=
new
UserShop
(
account1
.
getName
(),
shops
.
get
(
0
).
getShopId
(),
"-1"
);
userShopRepository
.
save
(
userShop1
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"fail to assign"
,
e
.
getMessage
());
throw
new
ClientRequestException
(
BrowserErrorCode
.
UNKNOWN
);
}
}
else
{
shops
.
forEach
(
shop
->
{
shops
.
forEach
(
shop
->
{
try
{
for
(
Account
account1
:
accounts
)
{
UserShop
userShop1
=
userShopRepository
.
findByUsernameAndShopId
(
account1
.
getName
(),
shop
.
getShopId
());
if
(
userShop1
!=
null
)
{
return
;
}
if
(
userShop1
!=
null
)
continue
;
userShop1
=
new
UserShop
(
account1
.
getName
(),
shop
.
getShopId
(),
"-1"
);
userShopRepository
.
save
(
userShop1
);
}
}
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"fail to assign"
,
e
);
logger
.
error
(
"fail to assign"
,
e
.
getMessage
()
);
throw
new
ClientRequestException
(
BrowserErrorCode
.
UNKNOWN
);
}
});
}
}
@Override
public
ShopResultDto
queryShop
(
String
username
,
String
shopId
)
{
// 1. 校验 账户、商铺、IP资源、usershop 信息
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
Shop
shop
=
shopRepository
.
findById
(
shopId
).
orElseThrow
(()
->
new
ClientRequestException
(
BrowserErrorCode
.
SHOPNOTEXIST
));
IpResource
ipResource
=
ipResourceRepository
.
findFirstByShopIdsIsAndIsDeleted
(
shopId
,
false
);
if
(
ipResource
==
null
)
{
throw
new
ClientRequestException
(
BrowserErrorCode
.
IPNOTEXIST
);
}
UserShop
userShop
=
userShopRepository
.
findByUsernameAndShopId
(
username
,
shopId
);
if
(
userShop
==
null
)
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
// 2. 封装 ip 资源信息
IpResourceDto
ipResourceDto
=
null
;
Shop
shop
=
shopRepository
.
findById
(
shopId
).
orElse
(
null
);
if
(
shop
==
null
)
{
throw
new
ClientRequestException
(
BrowserErrorCode
.
SHOPNOTEXIST
);
}
IpResource
ipResource
=
ipResourceRepository
.
findFirstByShopIdsIsAndIsDeleted
(
shopId
,
false
);
if
(
ipResource
==
null
)
throw
new
ClientRequestException
(
BrowserErrorCode
.
IPNOTEXIST
);
String
group
=
userShopRepository
.
findByUsernameAndShopId
(
username
,
shop
.
getShopId
()).
getGroupId
();
ShopResultDto
shopResultDto
=
null
;
if
(
ipResource
.
isSpecialLine
())
{
SpecialLine
specialLine
=
specialLineRepository
.
findAll
().
get
(
0
);
ipResourceDto
=
new
IpResourceDto
(
ipResource
,
null
,
false
,
specialLine
);
}
else
{
ipResourceDto
=
new
IpResourceDto
(
ipResource
,
null
,
false
);
}
// 3. 封装 ShopResultDto 信息并返回
return
ShopResultDto
.
of
(
shop
,
userShop
.
getGroupId
(),
ipResourceDto
);
shopResultDto
=
ShopResultDto
.
of
(
shop
,
group
,
new
IpResourceDto
(
ipResource
,
null
,
false
,
specialLine
));
}
else
shopResultDto
=
ShopResultDto
.
of
(
shop
,
group
,
new
IpResourceDto
(
ipResource
,
null
,
false
));
return
shopResultDto
;
}
@Override
public
ShopPageResultDto
getShopList
(
String
username
,
String
groupId
,
int
pageNum
,
int
amount
,
ShopFilterDto
shopFilterDto
)
{
//
1. 校验
当前登录用户的账户是否存在
// 当前登录用户的账户是否存在
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
//
2. 如有有分组校验
当前查询的分组信息是否正确
// 当前查询的分组信息是否正确
Group
group
=
null
;
if
(
groupId
!=
null
)
{
group
=
groupRepository
.
findById
(
groupId
).
orElseThrow
(()
->
new
ClientRequestException
(
BrowserErrorCode
.
GROUPNOTEXIST
));
if
(
group
.
getOwner
()
!=
null
&&
!
group
.
getOwner
().
equals
(
username
))
{
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
}
//
3.
根据 groupId 与 username 来查询 shopIds (如果当前用户是父账户,则查询结果包含子账户的shopId)
// 根据 groupId 与 username 来查询 shopIds (如果当前用户是父账户,则查询结果包含子账户的shopId)
List
<
String
>
allIds
=
null
;
if
(
"-1"
.
equals
(
groupId
))
{
allIds
=
userShopRepository
.
findByUsername
(
username
).
stream
()
...
...
@@ -403,7 +379,6 @@ public class ShopServiceImpl implements ShopService {
.
map
(
UserShop:
:
getShopId
).
collect
(
Collectors
.
toList
());
}
// 4. 根据传入的过滤条件得到 shopIds
List
<
String
>
shopIds
=
new
ArrayList
<>();
if
(
shopFilterDto
.
getBindIp
()
==
0
)
{
shopIds
=
allIds
;
...
...
@@ -418,8 +393,8 @@ public class ShopServiceImpl implements ShopService {
}
else
{
// 店铺绑定的 ip 资源被删除的 店铺
for
(
String
id
:
allIds
)
{
IpResource
ipResource
=
ipResourceRepository
.
findFirstByShopIdsIsAndIsDeleted
(
id
,
tru
e
);
if
(
ipResource
!
=
null
)
{
IpResource
ipResource
=
ipResourceRepository
.
findFirstByShopIdsIsAndIsDeleted
(
id
,
fals
e
);
if
(
ipResource
=
=
null
)
{
shopIds
.
add
(
id
);
}
}
...
...
@@ -427,15 +402,13 @@ public class ShopServiceImpl implements ShopService {
amount
=
Math
.
min
(
amount
,
100
);
Pageable
pageable
=
PageRequest
.
of
(
pageNum
,
amount
);
//
5. 根据过滤后的商铺ids 与 其他过滤条件 得到商铺信息并分页
//
根据商铺ids 与 过滤条件 得到商铺
Page
<
Shop
>
shops
=
getShopsByFilter
(
shopFilterDto
,
shopIds
,
pageable
);
// 6. 封装 shopResultDtos 信息并返回
ShopPageResultDto
<
ShopResultDto
>
shopPageResultDto
=
new
ShopPageResultDto
<>();
if
(
shops
!=
null
&&
shops
.
getNumberOfElements
()
>=
1
)
{
List
<
ShopResultDto
>
shopResultDtos
=
new
ArrayList
<>();
shops
.
getContent
().
forEach
(
// 设置ip资源状态 并 封装 shopResultDto信息
x
->
{
IpResource
ipResource
=
ipResourceRepository
.
findFirstByShopIdsIsAndIsDeleted
(
x
.
getShopId
(),
false
);
// 如果 ip资源非空 且 addr 也非空
...
...
@@ -473,7 +446,7 @@ public class ShopServiceImpl implements ShopService {
ipResource
.
setStatus
(
1
);
ipResourceRepository
.
save
(
ipResource
);
// 4. 其他
,将ip资源状态设置为 未使用
// 4. 其他
}
else
{
if
((
ipResource
.
getStatus
()
==
0
||
ipResource
.
getStatus
()
==
1
||
ipResource
.
getStatus
()
==
2
)
&&
ipResource
.
getVendor
()
!=
Vendor
.
local
)
{
ipResource
.
setStatus
(
0
);
...
...
@@ -503,7 +476,6 @@ public class ShopServiceImpl implements ShopService {
public
ShopSummary
getShopSummary
(
String
username
)
{
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
ShopSummary
shopSummary
=
new
ShopSummary
();
List
<
String
>
allShopIds
=
userShopRepository
.
findByUsername
(
username
).
stream
()
.
map
(
UserShop:
:
getShopId
).
collect
(
Collectors
.
toList
());
...
...
@@ -533,25 +505,21 @@ public class ShopServiceImpl implements ShopService {
@Override
public
List
<
String
>
getShopUsers
(
String
username
,
String
shopId
)
{
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
.
getParent
()
!=
null
)
{
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
if
(
account
.
getParent
()
!=
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
// 获取当前登录用户绑定了当前商铺的 所有子用户名
List
<
String
>
shopUsers
=
userShopRepository
.
findByShopId
(
shopId
).
stream
()
.
map
(
UserShop:
:
getUsername
)
.
filter
(
x
->
!
x
.
equals
(
username
))
.
collect
(
Collectors
.
toList
());
List
<
String
>
shopUsers
=
userShopRepository
.
findByShopId
(
shopId
).
stream
().
map
(
x
->
x
.
getUsername
()).
filter
(
x
->
!
x
.
equals
(
username
)).
collect
(
Collectors
.
toList
());
return
shopUsers
;
}
@Override
public
List
<
String
>
getBatchShopUsers
(
String
username
,
List
<
String
>
shopIds
)
{
Account
account
=
accountRepository
.
findByName
(
username
).
orElseThrow
(()
->
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
));
if
(
account
.
getParent
()
!=
null
)
{
if
(
account
==
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NAMENOTEXIST
);
if
(
account
.
getParent
()
!=
null
)
throw
new
ClientRequestException
(
AccountErrorCode
.
NOPERMISSION
);
}
List
<
String
>
shopUsers
=
new
ArrayList
<>();
if
(
shopIds
!=
null
&&
shopIds
.
size
()
>
0
)
{
String
maxShopId
=
null
;
...
...
@@ -563,83 +531,20 @@ public class ShopServiceImpl implements ShopService {
maxShopId
=
shopId
;
}
}
if
(
maxShopId
==
null
)
{
return
shopUsers
;
}
List
<
String
>
users
=
userShopRepository
.
findByShopId
(
maxShopId
).
stream
().
map
(
UserShop:
:
getUsername
).
filter
(
x
->
!
x
.
equals
(
username
)).
collect
(
Collectors
.
toList
());
if
(
maxShopId
==
null
)
return
new
ArrayList
<>();
List
<
String
>
users
=
userShopRepository
.
findByShopId
(
maxShopId
).
stream
().
map
(
x
->
x
.
getUsername
()).
filter
(
x
->
!
x
.
equals
(
username
)).
collect
(
Collectors
.
toList
());
for
(
String
user
:
users
)
{
int
shopCount
=
userShopRepository
.
countByUsernameAndShopIdIn
(
user
,
shopIds
);
if
(
shopCount
<
shopIds
.
size
())
{
if
(
shopCount
<
shopIds
.
size
())
continue
;
}
else
{
else
shopUsers
.
add
(
user
);
}
}
}
return
shopUsers
;
}
@Override
public
Integer
dealDirtyData
()
{
List
<
Account
>
all
=
accountRepository
.
findAll
();
List
<
Account
>
parents
=
all
.
stream
().
filter
(
x
->
StringUtils
.
isEmpty
(
x
.
getParent
())).
collect
(
Collectors
.
toList
());
// 移除 父账户,剩下的都是子账户了
all
.
removeAll
(
parents
);
// 父账户, 子账户列表
Map
<
Account
,
List
<
Account
>>
map
=
new
HashMap
<>();
for
(
Account
account
:
parents
)
{
List
<
Account
>
list
=
new
ArrayList
<>();
for
(
Account
child
:
all
)
{
if
(
child
.
getParent
().
equals
(
account
.
getName
()))
{
list
.
add
(
child
);
}
}
if
(
list
.
size
()
!=
0
)
{
map
.
put
(
account
,
list
);
}
}
int
result
=
0
;
for
(
Map
.
Entry
<
Account
,
List
<
Account
>>
entry
:
map
.
entrySet
())
{
List
<
Account
>
children
=
entry
.
getValue
();
// 查找子类所拥有的店铺
List
<
Shop
>
childrenShop
=
shopRepository
.
findByOwnerIn
(
children
.
stream
().
map
(
Account:
:
getName
).
collect
(
Collectors
.
toList
()));
if
(
childrenShop
.
size
()
==
0
)
{
continue
;
}
List
<
String
>
ids
=
childrenShop
.
stream
().
map
(
Shop:
:
getShopId
).
collect
(
Collectors
.
toList
());
// 查出来 父账户已有的 usershop信息
List
<
UserShop
>
parentUserShops
=
userShopRepository
.
findByUsernameAndShopIdIn
(
entry
.
getKey
().
getName
(),
ids
);
List
<
String
>
parentShopIds
=
parentUserShops
.
stream
().
map
(
UserShop:
:
getShopId
).
collect
(
Collectors
.
toList
());
// 剩下的就是 父账户的 usershop 缺失的信息
ids
.
removeAll
(
parentShopIds
);
// 构建父账户缺失的 usershop 信息并保存
List
<
UserShop
>
userShops
=
new
ArrayList
<>();
for
(
String
id
:
ids
)
{
UserShop
userShop
=
new
UserShop
();
userShop
.
setShopId
(
id
);
userShop
.
setUsername
(
entry
.
getKey
().
getName
());
userShop
.
setGroupId
(
"-1"
);
userShops
.
add
(
userShop
);
}
if
(
userShops
.
size
()
!=
0
)
{
// 将父账户缺失的 usershop 信息补充完整
List
<
UserShop
>
userShops1
=
userShopRepository
.
saveAll
(
userShops
);
result
+=
userShops1
.
size
();
}
}
return
result
;
}
private
String
getShopId
(
String
username
,
ShopResultDto
shopResultDto
)
{
Shop
shop
=
new
Shop
();
...
...
src/main/java/com/edgec/browserbackend/browser/service/ShopService.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
.
browser
.
service
;
import
com.edgec.browserbackend.browser.domain.Shop
;
import
com.edgec.browserbackend.browser.domain.ShopSummary
;
import
com.edgec.browserbackend.browser.dto.ShopFilterDto
;
import
com.edgec.browserbackend.browser.dto.ShopPageResultDto
;
import
com.edgec.browserbackend.browser.dto.ShopResultDto
;
import
com.edgec.browserbackend.browser.dto.*
;
import
org.springframework.web.multipart.MultipartFile
;
import
java.io.IOException
;
...
...
@@ -32,6 +31,4 @@ public interface ShopService {
List
<
String
>
getShopUsers
(
String
username
,
String
shopId
);
List
<
String
>
getBatchShopUsers
(
String
username
,
List
<
String
>
shopIds
);
Integer
dealDirtyData
();
}
src/main/java/com/edgec/browserbackend/browser/task/BrowserTask.java
View file @
51b4192f
...
...
@@ -101,15 +101,12 @@ public class BrowserTask {
}
/**
* 购买ip的定时任务,每分钟一次
*/
@Scheduled
(
cron
=
"0 0/1 * * * ?"
)
public
void
buyIpTasks
()
{
String
URL
=
(
profiles
.
equals
(
"dev"
)
||
profiles
.
equals
(
"staging"
))
?
TESTURL
:
CLOUDAMURL
;
long
time
=
Instant
.
now
().
minusSeconds
(
300
).
toEpochMilli
();
List
<
IpResource
>
ipResources
=
ipResourceRepository
.
sampleTasks
(
6
,
time
);
log
.
info
(
"buyIpTasks sample {} tasks"
,
ipResources
.
size
());
log
.
error
(
"buyIpTasks sample {} tasks"
,
ipResources
.
size
());
List
<
CompletableFuture
>
futureList
=
new
ArrayList
<>();
for
(
IpResource
ipResource
:
ipResources
)
{
long
start
=
System
.
currentTimeMillis
();
...
...
@@ -142,8 +139,8 @@ public class BrowserTask {
}
if
(
ipBuyResultDto
!=
null
&&
ipBuyResultDto
.
getIplist
()
!=
null
&&
ipBuyResultDto
.
getIplist
().
size
()
>=
1
)
{
AtomicInteger
index
=
new
AtomicInteger
();
ipBuyResultDto
.
getIplist
().
forEach
(
x
->
{
ipBuyResultDto
.
getIplist
().
forEach
(
x
->
{
if
(
ipResource
!=
null
)
{
ipResource
.
setAddr
(
x
.
getIp
());
ipResource
.
setStatus
(
3
);
ipResource
.
setValidTime
(
Instant
.
parse
(
x
.
getValidTill
()).
toEpochMilli
());
...
...
@@ -153,10 +150,11 @@ public class BrowserTask {
ipResource
.
setSpecialLine
(
true
);
}
ipResourceRepository
.
save
(
ipResource
);
index
.
getAndIncrement
(
);
}
else
{
log
.
error
(
"no ipResource"
);
}
);
index
.
getAndIncrement
();
});
result
=
true
;
}
}
catch
(
Exception
e
)
{
...
...
src/main/java/com/edgec/browserbackend/browser/task/PaymentTask.java
View file @
51b4192f
...
...
@@ -32,34 +32,25 @@ public class PaymentTask {
long
now
=
System
.
currentTimeMillis
();
Date
date_5min
=
new
Date
(
now
-
5
*
60
*
1000
);
Date
date_10min
=
new
Date
(
now
-
10
*
60
*
1000
);
// 查找 5-10 分钟内 支付状态为 false 的订单
List
<
UserPayment
>
unfinishedPayments
=
userPaymentRepository
.
findAllByPaymentDateBetweenAndSucceed
(
ZonedDateTime
.
ofInstant
(
date_10min
.
toInstant
(),
ZoneId
.
systemDefault
()),
ZonedDateTime
.
ofInstant
(
date_5min
.
toInstant
(),
ZoneId
.
systemDefault
()),
false
);
ZonedDateTime
.
ofInstant
(
date_10min
.
toInstant
(),
ZoneId
.
systemDefault
())
,
ZonedDateTime
.
ofInstant
(
date_5min
.
toInstant
(),
ZoneId
.
systemDefault
()),
false
);
if
(
unfinishedPayments
!=
null
&&
!
unfinishedPayments
.
isEmpty
()
)
{
unfinishedPayments
.
forEach
(
payment
->
{
if
(
unfinishedPayments
!=
null
&&
unfinishedPayments
.
size
()
>
0
)
{
unfinishedPayments
.
stream
().
forEach
(
payment
->
{
PaymentMethod
paymentMethod
=
payment
.
getPaymentMethod
();
try
{
/*
* 自动调用 微信或者支付宝的支付接口来确认 支付状态
* chargeType 取值范围为 0-4
* 此处设置为 100 仅仅只是为了避免 wxCheckOrderStatus() 方法中 chargeType == 0 相关代码块
*/
if
(
PaymentMethod
.
WECHAT
.
equals
(
paymentMethod
))
{
paymentService
.
wxCheckOrderStatus
(
payment
.
getTradeNo
(),
100
);
}
if
(
PaymentMethod
.
ALIPAY
.
equals
(
paymentMethod
))
{
paymentService
.
aliCheckOrderStatus
(
payment
.
getTradeNo
(),
100
);
paymentService
.
wxCheckOrderStatus
(
payment
.
getTradeNo
());
}
else
if
(
PaymentMethod
.
ALIPAY
.
equals
(
paymentMethod
))
{
paymentService
.
aliCheckOrderStatus
(
payment
.
getTradeNo
());
}
}
catch
(
Exception
e
)
{
log
.
error
(
"checkPayments"
,
e
);
}
}
);
});
}
}
}
src/main/java/com/edgec/browserbackend/browser/task/PromotionTask.java
View file @
51b4192f
...
...
@@ -12,7 +12,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
java.time.Instant
;
import
java.time.YearMonth
;
import
java.time.ZoneOffset
;
import
java.util.Arrays
;
import
java.util.List
;
...
...
@@ -27,48 +29,35 @@ public class PromotionTask {
@Autowired
private
UserPrePaidBillingRepository
userPrePaidBillingRepository
;
//临时修改为7月2号的11点执行执行一次
@SchedulerLock
(
name
=
"countGift"
,
lockAtLeastForString
=
"PT1H"
,
lockAtMostForString
=
"PT2H"
)
//@Scheduled(cron = "0 0 1 1 * ?")
@Scheduled
(
cron
=
"0 0 3 2 * ?"
)
@Scheduled
(
cron
=
"0 0 1 1 * ?"
)
public
void
countGift
()
{
log
.
info
(
"Start scheduled task:Scheduled.countGift..."
);
List
<
Account
>
accounts
=
accountRepository
.
findByParentIsNull
();
for
(
Account
account
:
accounts
)
{
// 1. 获取当前账户的邀请码信息
String
code
=
account
.
getPromotion
().
getCode
();
// 2. 获取被当前账户邀请的所有账户
List
<
Account
>
promotes
=
accountRepository
.
findByPromotionCodeAndParentIsNull
(
code
);
double
totalCommission
=
0
;
double
secondCommission
=
0
;
// 3. 计算所有被当前账户邀请的账户上个月的消费信息,以及如果当前账户是销售账户则还需要计算销售账户的下下级账户的上个月消费信息
for
(
Account
promote
:
promotes
)
{
// 3.1 获取被邀请的用户上个月的消费信息,todo 感觉这个地方最好加上支付状态
List
<
UserPrePaidBilling
>
userPrePaidBillings
=
userPrePaidBillingRepository
.
findByAdministratorAndYearAndMonthAndPayMethodIn
(
promote
.
getName
(),
YearMonth
.
now
().
minusMonths
(
1
).
getYear
(),
YearMonth
.
now
().
minusMonths
(
1
).
getMonthValue
(),
Arrays
.
asList
(
1
,
2
,
3
)
);
// 3.2. 计算被邀请的用户上个月的总消费金额
List
<
UserPrePaidBilling
>
userPrePaidBillings
=
userPrePaidBillingRepository
.
findByAdministratorAndYearAndMonthAndPayMethodIn
(
promote
.
getName
(),
YearMonth
.
now
().
minusMonths
(
1
).
getYear
(),
YearMonth
.
now
().
minusMonths
(
1
).
getMonthValue
(),
Arrays
.
asList
(
1
,
2
,
3
));
totalCommission
+=
userPrePaidBillings
.
stream
().
mapToDouble
(
UserPrePaidBilling:
:
getTotal
).
sum
();
// 3.3. 如果当前账户是本公司销售,则计算下下级用户(例如:销售人员A 邀请了 用户B,用户B 邀请了 其他用户,其他用户就是A的下下级用户)上个月总消费金额
if
(
account
.
getPromotion
().
isSale
()
&&
promote
.
getParent
()
==
null
)
{
// 获取下下级账户
List
<
Account
>
secondPromotes
=
accountRepository
.
findByPromotionCodeAndParentIsNull
(
promote
.
getPromotion
().
getCode
());
if
(
secondPromotes
!=
null
&&
!
secondPromotes
.
isEmpty
()
)
{
if
(
secondPromotes
!=
null
&&
secondPromotes
.
size
()
>
0
)
{
for
(
Account
secondPromote
:
secondPromotes
)
{
List
<
UserPrePaidBilling
>
userPrePaidBillings1
=
userPrePaidBillingRepository
.
findByAdministratorAndYearAndMonthAndPayMethodIn
(
secondPromote
.
getName
(),
YearMonth
.
now
().
minusMonths
(
1
).
getYear
(),
YearMonth
.
now
().
minusMonths
(
1
).
getMonthValue
(),
Arrays
.
asList
(
1
,
2
,
3
)
);
List
<
UserPrePaidBilling
>
userPrePaidBillings1
=
userPrePaidBillingRepository
.
findByAdministratorAndYearAndMonthAndPayMethodIn
(
secondPromote
.
getName
(),
YearMonth
.
now
().
minusMonths
(
1
).
getYear
(),
YearMonth
.
now
().
minusMonths
(
1
).
getMonthValue
(),
Arrays
.
asList
(
1
,
2
,
3
)
);
secondCommission
+=
userPrePaidBillings1
.
stream
().
mapToDouble
(
UserPrePaidBilling:
:
getTotal
).
sum
();
}
}
}
}
// 4. 封装当前账户的返佣相关信息(总消费、上月消费、上月礼金、总共未提现礼金)并保存
Promotion
promotion
=
account
.
getPromotion
();
promotion
.
setTotalCommission
((
int
)
(
promotion
.
getTotalCommission
()
+
totalCommission
));
promotion
.
setCommissionLastMonth
((
int
)
totalCommission
);
promotion
.
setTotalCommission
((
int
)(
promotion
.
getTotalCommission
()
+
totalCommission
));
promotion
.
setCommissionLastMonth
((
int
)
totalCommission
);
promotion
.
setGift
(
totalCommission
*
0.08
);
if
(
account
.
getPromotion
().
isSale
())
{
promotion
.
setGift
(
totalCommission
*
0.1
+
secondCommission
*
0.02
);
...
...
@@ -76,52 +65,41 @@ public class PromotionTask {
promotion
.
setAllGift
(
promotion
.
getAllGift
()
+
promotion
.
getGift
());
accountRepository
.
save
(
account
);
}
log
.
info
(
"End scheduled task:Scheduled.countGift..."
);
}
//临时修改为7月2号的12点执行执行一次
@SchedulerLock
(
name
=
"countCommission"
,
lockAtLeastForString
=
"PT1H"
,
lockAtMostForString
=
"PT2H"
)
//@Scheduled(cron = "0 0 1 * * ?")
@Scheduled
(
cron
=
"0 0 4 2 * ?"
)
@Scheduled
(
cron
=
"0 0 1 * * ?"
)
public
void
countCommission
()
{
log
.
info
(
"Start scheduled task:Scheduled.countCommission..."
);
List
<
Account
>
accounts
=
accountRepository
.
findByParentIsNull
();
for
(
Account
account
:
accounts
)
{
// 1. 获取被当前账户邀请的所有账户
String
code
=
account
.
getPromotion
().
getCode
();
List
<
Account
>
promotes
=
accountRepository
.
findByPromotionCodeAndParentIsNull
(
code
);
double
totalCommission
=
0
;
double
secondCommission
=
0
;
// 2. 计算所有被当前账户邀请的账户当月当前的消费信息,以及如果当前账户是销售账户则还需要计算销售账户的下下级账户的当月当前消费信息
for
(
Account
promote
:
promotes
)
{
List
<
UserPrePaidBilling
>
userPrePaidBillings
=
userPrePaidBillingRepository
.
findByAdministratorAndYearAndMonthAndPayMethodIn
(
promote
.
getName
(),
YearMonth
.
now
().
getYear
(),
YearMonth
.
now
().
getMonthValue
(),
Arrays
.
asList
(
1
,
2
,
3
)
);
List
<
UserPrePaidBilling
>
userPrePaidBillings
=
userPrePaidBillingRepository
.
findByAdministratorAndYearAndMonthAndPayMethodIn
(
promote
.
getName
(),
YearMonth
.
now
().
getYear
(),
YearMonth
.
now
().
getMonthValue
(),
Arrays
.
asList
(
1
,
2
,
3
)
);
totalCommission
+=
userPrePaidBillings
.
stream
().
mapToDouble
(
UserPrePaidBilling:
:
getTotal
).
sum
();
if
(
account
.
getPromotion
().
isSale
()
&&
promote
.
getParent
()
==
null
)
{
List
<
Account
>
secondPromotes
=
accountRepository
.
findByPromotionCodeAndParentIsNull
(
promote
.
getPromotion
().
getCode
());
if
(
secondPromotes
!=
null
&&
secondPromotes
.
size
()
>
0
)
{
for
(
Account
secondPromote
:
secondPromotes
)
{
List
<
UserPrePaidBilling
>
userPrePaidBillings1
=
userPrePaidBillingRepository
.
findByAdministratorAndYearAndMonthAndPayMethodIn
(
secondPromote
.
getName
(),
YearMonth
.
now
().
getYear
(),
YearMonth
.
now
().
getMonthValue
(),
Arrays
.
asList
(
1
,
2
,
3
)
);
List
<
UserPrePaidBilling
>
userPrePaidBillings1
=
userPrePaidBillingRepository
.
findByAdministratorAndYearAndMonthAndPayMethodIn
(
secondPromote
.
getName
(),
YearMonth
.
now
().
getYear
(),
YearMonth
.
now
().
getMonthValue
(),
Arrays
.
asList
(
1
,
2
,
3
)
);
secondCommission
+=
userPrePaidBillings1
.
stream
().
mapToDouble
(
UserPrePaidBilling:
:
getTotal
).
sum
();
}
}
}
}
// 3. 封装当前账户的返佣相关信息(当月当前的消费、当月当前的返佣)并保存
Promotion
promotion
=
account
.
getPromotion
();
promotion
.
setCommission
((
int
)
totalCommission
);
promotion
.
setCommission
((
int
)
totalCommission
);
promotion
.
setGift
(
totalCommission
*
0.08
);
if
(
account
.
getPromotion
().
isSale
())
{
promotion
.
setGift
(
totalCommission
*
0.1
+
secondCommission
*
0.02
);
}
accountRepository
.
save
(
account
);
}
log
.
info
(
"End scheduled task:Scheduled.countCommission..."
);
}
}
src/main/java/com/edgec/browserbackend/common/utils/Trans.java
View file @
51b4192f
...
...
@@ -56,8 +56,8 @@ public class Trans {
* @param args
*/
public
static
void
main
(
String
[]
args
)
{
String
url
=
"http
s://china-merchant.wish.com/login
"
;
Trans
trans
=
new
Trans
(
"
8.210.96.188"
,
"WC5w4M5jkdz1
aA1"
);
String
url
=
"http
://free.ipwhois.io/json/
"
;
Trans
trans
=
new
Trans
(
"
112.74.47.217"
,
20001
,
"fangguanlianbrowser"
,
"5D753F36QKqI
aA1"
);
String
rs
=
trans
.
get
(
url
);
System
.
out
.
println
(
rs
);
}
...
...
src/main/java/com/edgec/browserbackend/wxpay/FGLWxConfig.java
View file @
51b4192f
...
...
@@ -18,12 +18,10 @@ public class FGLWxConfig extends WXPayConfig {
return
"acdkgjef237ckgSriEICRe2408sdjEDC"
;
}
@Override
public
int
getHttpConnectTimeoutMs
()
{
return
8000
;
}
@Override
public
int
getHttpReadTimeoutMs
()
{
return
10000
;
}
...
...
@@ -37,12 +35,10 @@ public class FGLWxConfig extends WXPayConfig {
public
IWXPayDomain
getWXPayDomain
()
{
IWXPayDomain
iwxPayDomain
=
new
IWXPayDomain
()
{
@Override
public
void
report
(
String
domain
,
long
elapsedTimeMillis
,
Exception
ex
)
{
}
@Override
public
DomainInfo
getDomain
(
WXPayConfig
config
)
{
return
new
IWXPayDomain
.
DomainInfo
(
WXPayConstants
.
DOMAIN_API
,
true
);
}
...
...
src/test/java/com/edgec/browserbackend/BrowserBackendApplicationTests.java
View file @
51b4192f
package
com
.
edgec
.
browserbackend
;
import
com.edgec.browserbackend.account.domain.Account
;
import
com.edgec.browserbackend.account.repository.AccountRepository
;
import
com.edgec.browserbackend.account.repository.UserPaymentRepository
;
import
com.edgec.browserbackend.account.repository.UserPrePaidBillingRepository
;
import
com.edgec.browserbackend.browser.repository.IpOptionsRepository
;
import
com.edgec.browserbackend.browser.repository.IpResourceRepository
;
import
com.edgec.browserbackend.browser.repository.ShopRepository
;
import
com.edgec.browserbackend.browser.repository.UserShopRepository
;
import
com.edgec.browserbackend.browser.service.IpResourceService
;
import
com.edgec.browserbackend.browser.service.ShopService
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.data.mongodb.core.MongoTemplate
;
@SpringBootTest
class
BrowserBackendApplicationTests
{
@Autowired
ShopService
shopService
;
@Autowired
MongoTemplate
mongoTemplate
;
@Autowired
private
UserShopRepository
userShopRepository
;
@Autowired
IpResourceRepository
ipResourceRepository
;
@Autowired
ShopRepository
shopRepository
;
@Autowired
AccountRepository
accountRepository
;
@Autowired
IpOptionsRepository
ipOptionsRepository
;
@Autowired
IpResourceService
ipResourceService
;
@Autowired
UserPaymentRepository
userPaymentRepository
;
@Autowired
UserPrePaidBillingRepository
userPrePaidBillingRepository
;
@Test
void
contextLoads
()
{
}
@Test
public
void
testShopList
()
throws
Exception
{
/*List<Account> all = accountRepository.findAll();
List<Account> parents = all.stream().filter(x -> StringUtils.isEmpty(x.getParent())).collect(Collectors.toList());
// 移除 父账户,剩下的都是子账户了
all.removeAll(parents);
// 父账户, 子账户列表
Map<Account, List<Account>> map = new HashMap<>();
for (Account account : parents) {
List<Account> list = new ArrayList<>();
for (Account child : all) {
if (child.getParent().equals(account.getName())) {
list.add(child);
}
}
if (list.size() != 0) {
map.put(account, list);
}
}
Iterator<Map.Entry<Account, List<Account>>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Account, List<Account>> entry = entries.next();
List<Account> children = entry.getValue();
// 查找子类所拥有的店铺
List<Shop> childrenShop = shopRepository.findByOwnerIn(children.stream().map(Account::getName).collect(Collectors.toList()));
if (childrenShop.size() == 0) {
continue;
}
List<String> ids = childrenShop.stream().map(x -> x.getShopId()).collect(Collectors.toList());
// 查出来 父账户已有的 usershop信息
List<UserShop> parentUserShops = userShopRepository.findByUsernameAndShopIdIn(entry.getKey().getName(), ids);
List<String> parentShopIds = parentUserShops.stream().map(x -> x.getShopId()).collect(Collectors.toList());
// 剩下的就是 父账户的 usershop 缺失的信息
ids.removeAll(parentShopIds);
List<UserShop> userShops = new ArrayList<>();
for (String id : ids) {
UserShop userShop = new UserShop();
userShop.setShopId(id);
userShop.setUsername(entry.getKey().getName());
userShop.setGroupId("-1");
userShops.add(userShop);
}
if (userShops.size() != 0) {
// 将父账户缺失的 usershop 信息补充完整
List<UserShop> userShops1 = userShopRepository.saveAll(userShops);
}
}
//shopService.getShopUsers("18622987110", "5e82dbd407f16f1c782b9f1e");
/*IpResource ipResource = ipResourceRepository.findFirstByShopIdsIsAndIsDeleted("5e82e3d407f16f1c782b9f26", false);
IpResourceDto ipResourceDto = new IpResourceDto(ipResource, null, false);
IpResourceDto ipResourceDto1 = new IpResourceDto(ipResource, null, false, null);
System.out.println(ipResourceDto.equals(ipResourceDto1));
Map<String, List<String>> priceList = ipOptionsRepository.findAll().get(0).getIpPlatForm();
System.out.println(priceList);
String json = "{\"addr\":[\"8.210.63.174\"],\"ipId\":[],\"period\":1,\"unit\":\"month\",\"payMethod\":0}";
IpResourceRequestDto ipResourceRequestDto = JSON.parseObject(json, IpResourceRequestDto.class);
String username = "15919921106";
try {
ipResourceService.renewIp(username, ipResourceRequestDto);
} catch (Exception e) {
e.printStackTrace();
}
UserPayment byTradeNo = userPaymentRepository.findByTradeNo("202003141459128356");
if (byTradeNo.getPaymentMethod().equals(PaymentMethod.ALIPAY)) {
System.out.println("hhhh");
}
if (byTradeNo.getPaymentMethod().equals(PaymentMethod.WECHAT)) {
System.out.println("wwww");
}
// 输入json 字符串的快捷方式 alt + enter、alt+enter
String json = "{\"region\":\"us\",\"regionCn\":\"美国随机\",\"vendor\":\"aliyun\",\"period\":1,\"unit\":\"week\",\"amount\":2,\"price\":24,\"payMethod\":0}";
IpResourceRequestDto ipResourceRequestDto = JSON.parseObject(json, IpResourceRequestDto.class);
String username = "15919921106";
List<String> ipResourceDto = ipResourceService.buyIp(username, ipResourceRequestDto);
System.out.println(ipResourceDto);
Optional<Shop> shop = shopRepository.findById("5efbfec70718e43054d65168");
String shopCookie = shop.get().getShopCookie();
List<Account> accounts = accountRepository.findByParentIsNull();
for (Account account : accounts) {
if (account.getName().equals("17665464606")) {
// 1. 获取当前账户的邀请码信息
String code = account.getPromotion().getCode();
// 2. 获取被当前账户邀请的所有账户
List<Account> promotes = accountRepository.findByPromotionCodeAndParentIsNull(code);
double totalCommission = 0;
double secondCommission = 0;
// 3. 计算所有被当前账户邀请的账户上个月的消费信息,以及如果当前账户是销售账户则还需要计算销售账户的下下级账户的上个月消费信息
for (Account promote : promotes) {
// 3.1 获取被邀请的用户上个月的消费信息,todo 感觉这个地方最好加上支付状态
List<UserPrePaidBilling> userPrePaidBillings = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(
promote.getName(), YearMonth.now().minusMonths(1).getYear(), YearMonth.now().minusMonths(1).getMonthValue(), Arrays.asList(1, 2, 3)
);
// 3.2. 计算被邀请的用户上个月的总消费金额
totalCommission += userPrePaidBillings.stream().mapToDouble(UserPrePaidBilling::getTotal).sum();
// 3.3. 如果当前账户是本公司销售,则计算下下级用户(例如:销售人员A 邀请了 用户B,用户B 邀请了 其他用户,其他用户就是A的下下级用户)上个月总消费金额
if (account.getPromotion().isSale() && promote.getParent() == null) {
// 获取下下级账户
List<Account> secondPromotes = accountRepository.findByPromotionCodeAndParentIsNull(promote.getPromotion().getCode());
if (secondPromotes != null && !secondPromotes.isEmpty()) {
for (Account secondPromote : secondPromotes) {
List<UserPrePaidBilling> userPrePaidBillings1 = userPrePaidBillingRepository.findByAdministratorAndYearAndMonthAndPayMethodIn(
secondPromote.getName(), YearMonth.now().minusMonths(1).getYear(), YearMonth.now().minusMonths(1).getMonthValue(), Arrays.asList(1, 2, 3)
);
secondCommission += userPrePaidBillings1.stream().mapToDouble(UserPrePaidBilling::getTotal).sum();
}
}
}
}
// 4. 封装当前账户的返佣相关信息(总消费、上月消费、当月礼金、总共未体现礼金)并保存
Promotion promotion = account.getPromotion();
promotion.setTotalCommission((int) (promotion.getTotalCommission() + totalCommission));
promotion.setCommissionLastMonth((int) totalCommission);
promotion.setGift(totalCommission * 0.08);
if (account.getPromotion().isSale()) {
promotion.setGift(totalCommission * 0.1 + secondCommission * 0.02);
}
promotion.setAllGift(promotion.getAllGift() + promotion.getGift());
System.out.println(111);
}
}*/
Account
account
=
new
Account
();
account
.
setName
(
"110110110"
);
account
.
setPhoneNumber
(
"110110110"
);
accountRepository
.
save
(
account
);
Account
byName
=
accountRepository
.
findByName
(
"110110110"
).
get
();
byName
.
setParent
(
"110"
);
accountRepository
.
save
(
byName
);
}
}
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