Toggle navigation
Toggle navigation
This project
Loading...
Sign in
jiujian
/
client-customer-order-api
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
zhuyifan
2025-02-27 14:28:14 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
05a3a9f6ac672a04f80cc8d78d9dda837ec845cf
05a3a9f6
1 parent
56bd1394
菜品售卖量接口
Hide whitespace changes
Inline
Side-by-side
Showing
41 changed files
with
1027 additions
and
198 deletions
src/main/java/com/infoloop/tianting/annotation/RepeatSubmit.java
src/main/java/com/infoloop/tianting/aspect/RepeatSubmitAspect.java
src/main/java/com/infoloop/tianting/config/BusinessConfig.java
src/main/java/com/infoloop/tianting/config/RedisConfig.java
src/main/java/com/infoloop/tianting/config/RestTemplateConfig.java
src/main/java/com/infoloop/tianting/constant/CommonConstants.java
src/main/java/com/infoloop/tianting/context/LoginContextHolder.java
src/main/java/com/infoloop/tianting/controller/LoginController.java
src/main/java/com/infoloop/tianting/controller/OrderController.java
src/main/java/com/infoloop/tianting/controller/PayController.java
src/main/java/com/infoloop/tianting/controller/SkuController.java
src/main/java/com/infoloop/tianting/enums/LoginSourceEnum.java
src/main/java/com/infoloop/tianting/enums/SkuSellQuantityStatus.java
src/main/java/com/infoloop/tianting/exception/ErrorCodeEnum.java
src/main/java/com/infoloop/tianting/intercepter/LoginInterceptor.java
src/main/java/com/infoloop/tianting/logic/delay/DelayTaskQueueExecutor.java
src/main/java/com/infoloop/tianting/logic/delay/DelayedQueue.java
src/main/java/com/infoloop/tianting/logic/delay/OrderAutoCancelDelayTask.java
src/main/java/com/infoloop/tianting/logic/delay/param/AutoCancelParam.java
src/main/java/com/infoloop/tianting/model/bo/AddSkusSellQuantityBO.java
src/main/java/com/infoloop/tianting/model/bo/SkuSellQuantityBO.java
src/main/java/com/infoloop/tianting/model/common/Param.java → src/main/java/com/infoloop/tianting/model/common/IdsParam.java
src/main/java/com/infoloop/tianting/model/dto/OrderDbDTO.java
src/main/java/com/infoloop/tianting/model/dto/PayDTO.java
src/main/java/com/infoloop/tianting/model/dto/SkuSellQuantityDTO.java
src/main/java/com/infoloop/tianting/model/vo/SkuSellQuantityStatisticsVO.java
src/main/java/com/infoloop/tianting/model/vo/SkuSellQuantityVO.java
src/main/java/com/infoloop/tianting/service/LoginService.java
src/main/java/com/infoloop/tianting/service/MenuService.java
src/main/java/com/infoloop/tianting/service/OrderService.java
src/main/java/com/infoloop/tianting/service/SkuService.java
src/main/java/com/infoloop/tianting/service/client/OrderServiceRpcClient.java
src/main/java/com/infoloop/tianting/service/client/PayServiceClient.java
src/main/java/com/infoloop/tianting/service/client/SkuServiceRpcClient.java
src/main/java/com/infoloop/tianting/service/impl/LoginServiceImpl.java
src/main/java/com/infoloop/tianting/service/impl/MenuServiceImpl.java
src/main/java/com/infoloop/tianting/service/impl/OrderServiceImpl.java
src/main/java/com/infoloop/tianting/service/impl/SkuServiceImpl.java
src/main/java/com/infoloop/tianting/utils/PageUtil.java
src/main/proto/ClientCustomerOrderService.proto
src/main/resources/application.properties
src/main/java/com/infoloop/tianting/annotation/RepeatSubmit.java
View file @
05a3a9f
...
...
@@ -44,6 +44,11 @@ public @interface RepeatSubmit {
String
message
()
default
"不允许重复提交,请稍后再试"
;
/**
* 是否根据登录用户ID加锁
*/
boolean
isLockByLoginUser
()
default
true
;
/**
* 方法执行完自动释放锁
*/
boolean
methodAutoUnlock
()
default
true
;
...
...
src/main/java/com/infoloop/tianting/aspect/RepeatSubmitAspect.java
View file @
05a3a9f
...
...
@@ -110,7 +110,11 @@ public class RepeatSubmitAspect {
}
}
}
final
var
operatorId
=
LoginContextHolder
.
hasLogin
()
?
LoginContextHolder
.
getId
()
:
null
;
return
requestLock
.
prefix
()
+
(
operatorId
!=
null
?
CommonConstants
.
COLON
+
operatorId
:
""
)
+
(
sb
.
length
()
>
0
?
CommonConstants
.
UNDERLINE
+
sb
:
""
);
if
(
requestLock
.
isLockByLoginUser
())
{
final
var
operatorId
=
LoginContextHolder
.
hasLogin
()
?
LoginContextHolder
.
getId
()
:
null
;
return
requestLock
.
prefix
()
+
(
operatorId
!=
null
?
CommonConstants
.
COLON
+
operatorId
:
""
)
+
(
sb
.
length
()
>
0
?
CommonConstants
.
UNDERLINE
+
sb
:
""
);
}
else
{
return
requestLock
.
prefix
()
+
(
sb
.
length
()
>
0
?
CommonConstants
.
UNDERLINE
+
sb
:
""
);
}
}
}
...
...
src/main/java/com/infoloop/tianting/config/BusinessConfig.java
View file @
05a3a9f
...
...
@@ -15,4 +15,5 @@ public class BusinessConfig {
private
String
hisCustomerQueryUrl
;
private
String
clientCustomerQueryUrl
;
private
String
payUrl
;
private
String
payClientId
;
}
...
...
src/main/java/com/infoloop/tianting/config/RedisConfig.java
View file @
05a3a9f
...
...
@@ -9,7 +9,7 @@ import io.lettuce.core.resource.ClientResources;
import
io.lettuce.core.tracing.BraveTracing
;
import
org.redisson.Redisson
;
import
org.redisson.api.RedissonClient
;
import
org.redisson.c
lient.codec.String
Codec
;
import
org.redisson.c
odec.JsonJackson
Codec
;
import
org.redisson.config.Config
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
...
...
@@ -68,7 +68,7 @@ public class RedisConfig {
@Value
(
REDIS_PORT
)
final
String
port
,
@Value
(
REDIS_DATABASE
)
final
int
dbToken
)
{
final
var
config
=
new
Config
();
config
.
setCodec
(
StringCodec
.
INSTANCE
);
config
.
setCodec
(
new
JsonJacksonCodec
()
);
config
.
useSingleServer
()
.
setAddress
(
"redis://"
+
url
+
":"
+
port
)
...
...
src/main/java/com/infoloop/tianting/config/RestTemplateConfig.java
View file @
05a3a9f
...
...
@@ -15,8 +15,15 @@ import org.springframework.http.converter.StringHttpMessageConverter;
import
org.springframework.web.client.DefaultResponseErrorHandler
;
import
org.springframework.web.client.RestTemplate
;
import
javax.net.ssl.SSLContext
;
import
javax.net.ssl.TrustManager
;
import
javax.net.ssl.X509TrustManager
;
import
java.io.IOException
;
import
java.nio.charset.StandardCharsets
;
import
java.security.KeyManagementException
;
import
java.security.NoSuchAlgorithmException
;
import
java.security.SecureRandom
;
import
java.security.cert.X509Certificate
;
import
java.util.ArrayList
;
import
java.util.concurrent.TimeUnit
;
...
...
@@ -40,8 +47,26 @@ public class RestTemplateConfig {
private
Integer
keepAliveDuration
;
@Bean
public
OkHttpClient
okHttpClient
()
{
public
OkHttpClient
okHttpClient
()
throws
NoSuchAlgorithmException
,
KeyManagementException
{
TrustManager
[]
trustAllCertificates
=
new
TrustManager
[]{
new
X509TrustManager
()
{
@Override
public
void
checkClientTrusted
(
X509Certificate
[]
chain
,
String
authType
)
{}
@Override
public
void
checkServerTrusted
(
X509Certificate
[]
chain
,
String
authType
)
{}
@Override
public
X509Certificate
[]
getAcceptedIssuers
()
{
return
new
X509Certificate
[
0
];
}
}
};
SSLContext
sslContext
=
SSLContext
.
getInstance
(
"TLS"
);
sslContext
.
init
(
null
,
trustAllCertificates
,
new
SecureRandom
());
return
new
OkHttpClient
.
Builder
()
.
sslSocketFactory
(
sslContext
.
getSocketFactory
(),
(
X509TrustManager
)
trustAllCertificates
[
0
])
.
hostnameVerifier
((
hostname
,
session
)
->
true
)
.
connectTimeout
(
connectTimeout
,
TimeUnit
.
SECONDS
)
.
readTimeout
(
readTimeout
,
TimeUnit
.
SECONDS
)
.
writeTimeout
(
writeTimeout
,
TimeUnit
.
SECONDS
)
...
...
src/main/java/com/infoloop/tianting/constant/CommonConstants.java
View file @
05a3a9f
...
...
@@ -56,4 +56,6 @@ public interface CommonConstants {
String
LOGIN_SOURCE
=
"loginSource"
;
String
OPEN_ID
=
"openId"
;
}
...
...
src/main/java/com/infoloop/tianting/context/LoginContextHolder.java
View file @
05a3a9f
...
...
@@ -37,6 +37,10 @@ public class LoginContextHolder {
return
CONTEXT_HOLDER
.
get
().
getEnterpriseId
();
}
public
static
String
getOpenId
()
{
return
CONTEXT_HOLDER
.
get
().
getOpenId
();
}
public
static
void
clear
()
{
CONTEXT_HOLDER
.
remove
();
}
...
...
@@ -54,7 +58,8 @@ public class LoginContextHolder {
private
String
name
;
private
String
openid
;
@Builder
.
Default
private
String
openId
=
""
;
}
...
...
src/main/java/com/infoloop/tianting/controller/LoginController.java
View file @
05a3a9f
...
...
@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.validation.Valid
;
import
java.security.NoSuchAlgorithmException
;
@Api
(
tags
=
"登陆"
)
@ApiSupport
(
order
=
-
1
)
...
...
@@ -32,7 +33,7 @@ public class LoginController {
@ApiOperation
(
value
=
"登陆"
)
@PostMapping
(
"/login"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
SaTokenInfo
login
(
@Valid
@RequestBody
PermissionDTO
.
LoginDto
loginDto
)
{
public
SaTokenInfo
login
(
@Valid
@RequestBody
PermissionDTO
.
LoginDto
loginDto
)
throws
NoSuchAlgorithmException
{
return
loginService
.
login
(
loginDto
);
}
}
...
...
src/main/java/com/infoloop/tianting/controller/OrderController.java
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
controller
;
import
com.github.xiaoymin.knife4j.annotations.ApiSupport
;
import
com.infoloop.tianting.annotation.RepeatSubmit
;
import
com.infoloop.tianting.model.dto.OrderDbDTO
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto
;
...
...
@@ -64,9 +65,10 @@ public class OrderController {
return
orderService
.
getOrderDetailsByOrderId
(
orderId
);
}
@ApiOperation
(
value
=
"创建订单"
)
@ApiOperation
(
value
=
"
小程序
创建订单"
)
@PostMapping
(
"/orders"
)
@ResponseStatus
(
HttpStatus
.
OK
)
@RepeatSubmit
(
prefix
=
"createOrder"
,
isLockByLoginUser
=
false
)
public
CreateOrderResponse
createOrder
(
@Valid
@RequestBody
CreateOrderDto
createOrderDto
)
{
return
orderService
.
createOrder
(
createOrderDto
);
}
...
...
@@ -74,12 +76,11 @@ public class OrderController {
@ApiOperation
(
value
=
"院区端创建订单"
)
@PostMapping
(
"/operator/orders"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
CreateOrderResponse
createOrderByOperator
(
@Valid
@RequestBody
OrderDbDTO
.
OperatorCreateOrderDto
createOrderDto
)
{
@RepeatSubmit
(
prefix
=
"createOrder"
,
isLockByLoginUser
=
false
)
public
CreateOrderResponse
createOrderByOperator
(
@Valid
@RequestBody
OrderDbDTO
.
OperatorCreateOrderDto
createOrderDto
)
{
return
orderService
.
orderCreation
(
createOrderDto
);
}
// @SaIgnore
@ApiOperation
(
value
=
"修改订单"
)
@PatchMapping
(
"/orders/modification"
)
@ResponseStatus
(
HttpStatus
.
OK
)
...
...
@@ -87,20 +88,17 @@ public class OrderController {
return
orderService
.
updateOrder
(
updateOrderDto
);
}
// @SaIgnore
@ApiOperation
(
value
=
"批量修改订单详情"
)
@PatchMapping
(
"/order_details/modification"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
BatchUpdateOrderDetailResponse
batchUpdateOrderDetails
(
@Valid
@RequestBody
OrderDbDTO
.
OrderDetailBatchUpdateDto
updateDto
)
{
public
BatchUpdateOrderDetailResponse
batchUpdateOrderDetails
(
@Valid
@RequestBody
OrderDbDTO
.
OrderDetailBatchUpdateDto
updateDto
)
{
return
orderService
.
batchUpdateOrderDetails
(
updateDto
);
}
@ApiOperation
(
value
=
"获取已预定该餐单的次数"
)
@PostMapping
(
"/order/check"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
Integer
checkOrder
(
@Valid
@RequestBody
OrderDbDTO
.
getMenuOrderCountDto
checkIfOrderedDto
)
{
public
Integer
checkOrder
(
@Valid
@RequestBody
OrderDbDTO
.
getMenuOrderCountDto
checkIfOrderedDto
)
{
return
orderService
.
getMenuOrderCount
(
checkIfOrderedDto
);
}
...
...
src/main/java/com/infoloop/tianting/controller/PayController.java
View file @
05a3a9f
...
...
@@ -31,7 +31,6 @@ public class PayController {
private
final
PayServiceClient
payServiceClient
;
@SaIgnore
@ApiOperation
(
value
=
"支付信息"
)
@PostMapping
(
"/pay/inform"
)
@ResponseStatus
(
HttpStatus
.
OK
)
...
...
@@ -39,7 +38,6 @@ public class PayController {
return
payServiceClient
.
payInform
(
payInformRequestDto
);
}
@SaIgnore
@ApiOperation
(
value
=
"支付中"
)
@PostMapping
(
"/order/{orderId}/pay/waiting"
)
@ResponseStatus
(
HttpStatus
.
OK
)
...
...
src/main/java/com/infoloop/tianting/controller/SkuController.java
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
controller
;
import
com.github.xiaoymin.knife4j.annotations.ApiSupport
;
import
com.infoloop.tianting.model.common.PageResult
;
import
com.infoloop.tianting.model.dto.SkuDbDTO.SkuDto
;
import
com.infoloop.tianting.model.dto.SkuDbDTO.SkuIdsDto
;
import
com.infoloop.tianting.model.dto.SkuSellQuantityDTO
;
import
com.infoloop.tianting.model.vo.SkuSellQuantityStatisticsVO
;
import
com.infoloop.tianting.model.vo.SkuSellQuantityVO
;
import
com.infoloop.tianting.service.SkuService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
...
...
@@ -11,7 +15,10 @@ import lombok.extern.slf4j.Slf4j;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PutMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.ResponseStatus
;
import
org.springframework.web.bind.annotation.RestController
;
...
...
@@ -32,7 +39,36 @@ public class SkuController {
@ApiOperation
(
value
=
"根据sku ids获取"
)
@PostMapping
(
"/skus"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
List
<
SkuDto
>
get
OrderByCustomerId
(
@Valid
@RequestBody
SkuIdsDto
skuIdsDto
)
{
public
List
<
SkuDto
>
get
SkusByIds
(
@Valid
@RequestBody
SkuIdsDto
skuIdsDto
)
{
return
skuService
.
getSkusByIds
(
skuIdsDto
.
getIds
());
}
@ApiOperation
(
value
=
"获取菜品售卖量统计"
)
@GetMapping
(
"/stall/{stallId}/skusellquantities/statistics"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
SkuSellQuantityStatisticsVO
querySkuSellQuantityStatistics
(
@PathVariable
(
"stallId"
)
int
stallId
)
{
return
skuService
.
querySkuSellQuantityStatistics
(
stallId
);
}
@ApiOperation
(
value
=
"分页查询菜品售卖量"
)
@PostMapping
(
"/skusellquantities/query"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
PageResult
<
SkuSellQuantityVO
>
querySkuSellQuantity
(
@Valid
@RequestBody
SkuSellQuantityDTO
.
QuerySkuSellQuantityDTO
querySkuSellQuantityDTO
)
{
return
skuService
.
querySkuSellQuantity
(
querySkuSellQuantityDTO
);
}
@ApiOperation
(
value
=
"批量设置菜品售卖量"
)
@PutMapping
(
"/stall/{stallId}/skusellquantities/batchset"
)
@ResponseStatus
(
HttpStatus
.
CREATED
)
public
boolean
batchSetSkuSellQuantity
(
@PathVariable
(
"stallId"
)
int
stallId
,
@Valid
@RequestBody
SkuSellQuantityDTO
.
BatchSetSkuSellQuantityDTO
batchSetSkuSellQuantityDTO
)
{
return
skuService
.
batchSetSkuSellQuantity
(
stallId
,
batchSetSkuSellQuantityDTO
);
}
@ApiOperation
(
value
=
"根据菜品ids批量查询菜品售卖量"
)
@PostMapping
(
"/skusellquantities/querybyskuids"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
List
<
SkuSellQuantityVO
>
querySkuSellQuantityBySkuIds
(
@Valid
@RequestBody
SkuSellQuantityDTO
.
QuerySkuSellQuantityBySkuIdsDTO
querySkuSellQuantityBySkuIdsDTO
)
{
return
skuService
.
querySkuSellQuantityBySkuIds
(
querySkuSellQuantityBySkuIdsDTO
);
}
}
...
...
src/main/java/com/infoloop/tianting/enums/LoginSourceEnum.java
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
enums
;
import
com.infoloop.tianting.exception.BaseEnum
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
@Getter
@AllArgsConstructor
public
enum
LoginSourceEnum
{
CUSTOMER
(
1
,
"
小程序
住院客户"
),
MINI_PROGRAM
(
2
,
"
小程序非住院
客户"
),
CUSTOMER
(
1
,
"住院客户"
),
MINI_PROGRAM
(
2
,
"
阳光厅
客户"
),
OPERATOR
(
3
,
"院区端"
),
KDS
(
4
,
"KDS"
),
;
...
...
src/main/java/com/infoloop/tianting/enums/SkuSellQuantityStatus.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
enums
;
public
enum
SkuSellQuantityStatus
{
ALL
,
SOLD_OUT
,
ON_SALE
}
src/main/java/com/infoloop/tianting/exception/ErrorCodeEnum.java
View file @
05a3a9f
...
...
@@ -29,6 +29,12 @@ public enum ErrorCodeEnum implements BaseEnum {
ORDER_COUNT_LIMIT
(
406000005
,
"已超过该餐单预定次数"
),
QUERY_CLIENT_CUSTOMER_ERROR
(
406000006
,
"获取当日在住客户失败"
),
SKUS_SOLD_OUT_TODAY
(
406000007
,
"下单菜品\n{0}\n今日已售罄"
),
SKUS_STOCK_NO_ENOUGH_TODAY
(
406000007
,
"下单菜品\n{0}\n库存不足"
),
ORDER_CANCEL
(
406000008
,
"订单已自动取消"
)
;
private
final
int
code
;
...
...
src/main/java/com/infoloop/tianting/intercepter/LoginInterceptor.java
View file @
05a3a9f
...
...
@@ -12,15 +12,12 @@ import com.infoloop.tianting.enums.LoginSourceEnum;
import
com.infoloop.tianting.exception.ClientEndExceptions
;
import
com.infoloop.tianting.exception.ErrorCodeEnum
;
import
com.infoloop.tianting.model.common.ResponseResult
;
import
com.infoloop.tianting.service.ClientCustomerService
;
import
com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient
;
import
com.infoloop.tianting.service.client.OperatorServiceRpcClient
;
import
com.infoloop.tianting.service.client.WOperatorServiceRpcClient
;
import
com.infoloop.tianting.utils.ResponseUtil
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.tomcat.jni.Error
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.method.HandlerMethod
;
...
...
@@ -70,7 +67,9 @@ public class LoginInterceptor extends HandlerInterceptorAdapter {
StpUtil
.
checkLogin
();
final
var
enterpriseId
=
Convert
.
toInt
(
StpUtil
.
getExtra
(
CommonConstants
.
ENTERPRISE_ID
));
final
var
loginSource
=
Convert
.
toInt
(
StpUtil
.
getExtra
(
CommonConstants
.
LOGIN_SOURCE
));
log
.
info
(
"Login success, enterpriseId: {}, loginSource: {}"
,
enterpriseId
,
loginSource
);
if
(
loginSource
.
equals
(
LoginSourceEnum
.
CUSTOMER
.
getValue
()))
{
final
var
openId
=
Convert
.
toStr
(
StpUtil
.
getExtra
(
CommonConstants
.
OPEN_ID
));
final
var
loginId
=
StpUtil
.
getLoginIdAsInt
();
final
var
customer
=
clientCustomerServiceRpcClient
.
getClientCustomerById
(
enterpriseId
,
loginId
);
if
(
customer
==
null
)
{
...
...
@@ -78,7 +77,8 @@ public class LoginInterceptor extends HandlerInterceptorAdapter {
ResponseUtil
.
write
(
response
,
ResponseResult
.
failed
(
ErrorCodeEnum
.
VALIDATE_FAILED
));
return
false
;
}
builder
.
id
(
loginId
).
enterpriseId
(
enterpriseId
).
name
(
customer
.
getResponse
().
getName
());
log
.
info
(
"Customer login success, customerId: {}, enterpriseId: {}, openId:{}"
,
loginId
,
enterpriseId
,
openId
);
builder
.
id
(
loginId
).
enterpriseId
(
enterpriseId
).
name
(
customer
.
getResponse
().
getName
()).
openId
(
openId
);
return
true
;
}
else
if
(
loginSource
.
equals
(
LoginSourceEnum
.
OPERATOR
.
getValue
())){
final
var
loginId
=
StpUtil
.
getLoginIdAsInt
();
...
...
@@ -101,7 +101,7 @@ public class LoginInterceptor extends HandlerInterceptorAdapter {
return
true
;
}
else
{
final
var
loginId
=
StpUtil
.
getLoginIdAsString
();
builder
.
open
i
d
(
loginId
).
enterpriseId
(
enterpriseId
);
builder
.
open
I
d
(
loginId
).
enterpriseId
(
enterpriseId
);
return
true
;
}
}
...
...
src/main/java/com/infoloop/tianting/logic/delay/DelayTaskQueueExecutor.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
logic
.
delay
;
import
lombok.extern.slf4j.Slf4j
;
import
org.redisson.api.RBlockingQueue
;
import
org.redisson.api.RedissonClient
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
@Slf4j
public
class
DelayTaskQueueExecutor
<
T
>
{
private
final
RedissonClient
redissonClient
;
private
final
RBlockingQueue
<
T
>
blockingDeque
;
private
final
Processor
<
T
>
processor
;
private
final
ExecutorService
executorService
;
private
volatile
boolean
running
=
true
;
public
interface
Processor
<
T
>
{
void
process
(
T
task
)
throws
InterruptedException
;
}
public
DelayTaskQueueExecutor
(
String
threadName
,
RedissonClient
redissonClient
,
RBlockingQueue
<
T
>
blockingDeque
,
Processor
<
T
>
processor
)
{
this
.
redissonClient
=
redissonClient
;
this
.
blockingDeque
=
blockingDeque
;
this
.
processor
=
processor
;
this
.
executorService
=
Executors
.
newSingleThreadExecutor
(
r
->
{
Thread
t
=
new
Thread
(
r
);
t
.
setName
(
threadName
);
return
t
;
});
this
.
executorService
.
submit
(
this
::
looper
);
}
public
void
looper
()
{
while
(
running
)
{
try
{
if
(
redissonClient
.
isShutdown
())
{
shutdown
();
return
;
}
T
task
=
blockingDeque
.
take
();
processor
.
process
(
task
);
}
catch
(
InterruptedException
e
)
{
Thread
.
currentThread
().
interrupt
();
break
;
}
catch
(
Exception
e
)
{
log
.
error
(
"Task processing error in thread: {}"
,
Thread
.
currentThread
().
getName
(),
e
);
}
}
}
public
void
shutdown
()
{
running
=
false
;
executorService
.
shutdown
();
try
{
if
(!
executorService
.
awaitTermination
(
60
,
TimeUnit
.
SECONDS
))
{
log
.
warn
(
"Executor did not terminate in the specified time."
);
executorService
.
shutdownNow
();
}
}
catch
(
InterruptedException
e
)
{
log
.
error
(
"Shutdown interrupted"
,
e
);
executorService
.
shutdownNow
();
Thread
.
currentThread
().
interrupt
();
}
}
}
src/main/java/com/infoloop/tianting/logic/delay/DelayedQueue.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
logic
.
delay
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.redisson.api.RBlockingQueue
;
import
org.redisson.api.RDelayedQueue
;
import
org.redisson.api.RedissonClient
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.TimeUnit
;
import
java.util.function.Consumer
;
@Slf4j
@Service
@RequiredArgsConstructor
public
class
DelayedQueue
<
T
>
{
private
final
RedissonClient
redissonClient
;
private
final
Map
<
String
,
RDelayedQueue
<
T
>>
delayedQueues
=
new
ConcurrentHashMap
<>();
/**
* 初始化队列,传入队列名称和处理逻辑
*/
public
void
initQueue
(
String
queueName
,
Consumer
<
T
>
processMessage
)
{
RBlockingQueue
<
T
>
blockingQueue
=
redissonClient
.
getBlockingQueue
(
queueName
);
RDelayedQueue
<
T
>
delayedQueue
=
redissonClient
.
getDelayedQueue
(
blockingQueue
);
delayedQueues
.
put
(
queueName
,
delayedQueue
);
DelayTaskQueueExecutor
.
Processor
<
T
>
processor
=
task
->
{
try
{
processMessage
.
accept
(
task
);
}
catch
(
Exception
e
)
{
log
.
error
(
"Error processing task: {}"
,
task
,
e
);
}
};
new
DelayTaskQueueExecutor
<>(
queueName
+
" DELAY TASK"
,
redissonClient
,
blockingQueue
,
processor
);
log
.
info
(
"Initialized delay queue for {}"
,
queueName
);
}
public
void
addToQueue
(
String
queueName
,
T
message
,
long
delay
,
TimeUnit
timeUnit
)
{
RDelayedQueue
<
T
>
queue
=
getDelayedQueue
(
queueName
);
queue
.
offer
(
message
,
delay
,
timeUnit
);
log
.
info
(
"Added to queue: {}, msg: {}, delay: {} {}"
,
queueName
,
message
,
delay
,
timeUnit
);
}
public
void
addToQueue
(
String
queueName
,
List
<
T
>
messages
,
long
delay
,
TimeUnit
timeUnit
)
{
RDelayedQueue
<
T
>
queue
=
getDelayedQueue
(
queueName
);
messages
.
forEach
(
message
->
{
queue
.
offer
(
message
,
delay
,
timeUnit
);
log
.
info
(
"Added to queue: {}, msg: {}, delay: {} {}"
,
queueName
,
message
,
delay
,
timeUnit
);
});
}
private
RDelayedQueue
<
T
>
getDelayedQueue
(
String
queueName
)
{
RDelayedQueue
<
T
>
queue
=
delayedQueues
.
get
(
queueName
);
if
(
queue
==
null
)
{
throw
new
IllegalArgumentException
(
"Queue not initialized: "
+
queueName
);
}
return
queue
;
}
}
src/main/java/com/infoloop/tianting/logic/delay/OrderAutoCancelDelayTask.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
logic
.
delay
;
import
com.infoloop.tianting.clientcustomerorderservice.CloseTimeType
;
import
com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum
;
import
com.infoloop.tianting.logic.delay.param.AutoCancelParam
;
import
com.infoloop.tianting.model.bo.AddSkusSellQuantityBO
;
import
com.infoloop.tianting.service.client.OrderServiceRpcClient
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.PostConstruct
;
import
java.util.stream.Collectors
;
@Slf4j
@Component
@RequiredArgsConstructor
public
class
OrderAutoCancelDelayTask
{
private
final
DelayedQueue
<
AutoCancelParam
>
delayedQueue
;
private
final
OrderServiceRpcClient
orderServiceRpcClient
;
public
static
final
String
AUTO_CANCEL_ORDER_DELAY_QUEUE
=
"AUTO_CANCEL_ORDER_QUEUE"
;
@PostConstruct
public
void
init
()
{
delayedQueue
.
initQueue
(
AUTO_CANCEL_ORDER_DELAY_QUEUE
,
this
::
execute
);
}
private
void
execute
(
AutoCancelParam
param
)
{
try
{
final
var
orderById
=
orderServiceRpcClient
.
getOrderById
(
param
.
getOrderId
());
if
(
orderById
==
null
)
{
log
.
error
(
"Order not found, orderId: {}"
,
param
.
getOrderId
());
return
;
}
if
(
orderById
.
getPayStatus
()
==
PayStatusEnum
.
PAY_CANCELED
)
{
log
.
info
(
"Order {} already canceled, skipping."
,
param
.
getOrderId
());
return
;
}
if
(
orderById
.
getPayStatus
()
!=
PayStatusEnum
.
TO_PAY
)
{
log
.
info
(
"Order {} not to pay, skipping."
,
param
.
getOrderId
());
return
;
}
final
var
isUpdated
=
orderServiceRpcClient
.
updateClientCustomerOrderCancel
(
orderById
.
getEnterpriseId
(),
orderById
.
getId
());
if
(
isUpdated
&&
orderById
.
getCloseTimeType
()
==
CloseTimeType
.
IMMEDIATELY
)
{
// 立即点餐需回滚库存
final
var
orderDetails
=
orderServiceRpcClient
.
getOrderDetailsByOrderId
(
orderById
.
getId
());
final
var
isSuccess
=
orderServiceRpcClient
.
addSkusSellQuantities
(
orderById
.
getEnterpriseId
(),
orderById
.
getStallId
(),
orderDetails
.
stream
().
map
(
e
->
AddSkusSellQuantityBO
.
builder
()
.
skuId
(
e
.
getSkuId
())
.
quantity
(-
e
.
getCount
())
.
build
()).
collect
(
Collectors
.
toList
()));
log
.
info
(
"Order {} returnSkusSellQuantities result: {}"
,
param
.
getOrderId
(),
isSuccess
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"OrderAutoCancelDelayTask execute error"
,
e
);
}
}
}
src/main/java/com/infoloop/tianting/logic/delay/param/AutoCancelParam.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
logic
.
delay
.
param
;
import
lombok.Data
;
@Data
public
class
AutoCancelParam
{
private
int
orderId
;
}
src/main/java/com/infoloop/tianting/model/bo/AddSkusSellQuantityBO.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
model
.
bo
;
import
lombok.Builder
;
import
lombok.Data
;
@Data
@Builder
public
class
AddSkusSellQuantityBO
{
private
int
skuId
;
private
int
quantity
;
}
src/main/java/com/infoloop/tianting/model/bo/SkuSellQuantityBO.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
model
.
bo
;
import
lombok.Builder
;
import
lombok.Data
;
@Data
@Builder
public
class
SkuSellQuantityBO
{
private
Integer
id
;
private
int
skuId
;
private
int
maxSellQuantity
;
}
src/main/java/com/infoloop/tianting/model/common/Param.java
→
src/main/java/com/infoloop/tianting/model/common/
Ids
Param.java
View file @
05a3a9f
...
...
@@ -3,19 +3,16 @@ package com.infoloop.tianting.model.common;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.Singular
;
import
javax.validation.constraints.NotEmpty
;
import
java.util.List
;
@Data
@ApiModel
(
description
=
"公共参数"
)
public
class
Param
{
public
class
Ids
Param
{
@ApiModelProperty
(
value
=
"ids"
)
@
Singular
(
"id
"
)
@
NotEmpty
(
message
=
"ids不能为空
"
)
private
List
<
Integer
>
ids
;
@ApiModelProperty
(
value
=
"keyword"
)
private
String
keyword
;
}
...
...
src/main/java/com/infoloop/tianting/model/dto/OrderDbDTO.java
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
model
.
dto
;
import
com.infoloop.tianting.annotation.RequestKeyParam
;
import
com.infoloop.tianting.clientcustomerorderservice.CloseTimeType
;
import
com.infoloop.tianting.clientcustomerorderservice.OrderSourceEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum
;
import
com.infoloop.tianting.menuservice.CloseTimeTypeEnum
;
import
com.infoloop.tianting.model.common.PageInfo
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
io.swagger.models.auth.In
;
import
java.time.LocalDateTime
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Optional
;
import
javax.validation.Valid
;
import
jdk.jfr.StackTrace
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Builder.Default
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
lombok.ToString
;
import
javax.validation.Valid
;
import
java.time.LocalDateTime
;
import
java.util.ArrayList
;
import
java.util.List
;
@Data
@ApiModel
(
description
=
"订单DTO"
)
public
class
OrderDbDTO
{
...
...
@@ -204,6 +202,8 @@ public class OrderDbDTO {
@Builder
@ApiModel
(
description
=
"创建订单视图"
)
public
static
class
OperatorCreateOrderDto
{
@RequestKeyParam
@ApiModelProperty
(
value
=
"档口 ID"
)
private
Integer
stallId
;
...
...
@@ -216,6 +216,9 @@ public class OrderDbDTO {
@ApiModelProperty
(
value
=
"用餐日期"
)
private
LocalDateTime
mealTime
;
@ApiModelProperty
(
value
=
"桌号"
)
private
String
tableCode
;
@ApiModelProperty
(
value
=
"备注"
)
private
String
remark
;
...
...
@@ -235,6 +238,7 @@ public class OrderDbDTO {
@ApiModelProperty
(
value
=
"院区 ID"
)
private
Integer
clientId
;
@RequestKeyParam
@ApiModelProperty
(
value
=
"档口 ID"
)
private
Integer
stallId
;
...
...
@@ -244,12 +248,6 @@ public class OrderDbDTO {
@ApiModelProperty
(
value
=
"客户 ID"
)
private
Integer
customerId
;
@ApiModelProperty
(
value
=
"需要创建阳光厅点餐客户open ID"
)
private
Boolean
shouldCreateOpenId
;
@ApiModelProperty
(
value
=
"阳光厅点餐客户 ID"
)
private
String
openId
;
@ApiModelProperty
(
value
=
"状态订单;待备餐=1,备餐中=2,部分出餐=3,已出餐=4,已取消=5"
)
private
Integer
status
;
...
...
@@ -496,6 +494,12 @@ public class OrderDbDTO {
@ApiModelProperty
(
value
=
"菜品展示名称"
)
private
String
showName
;
@ApiModelProperty
(
value
=
"订单状态"
)
private
OrderStatusEnum
status
;
@ApiModelProperty
(
value
=
"订单支付状态"
)
private
PayStatusEnum
payStatus
;
@ApiModelProperty
(
value
=
"菜品详情,菜品主料、口味、能量、脂肪、蛋白质、碳水化合物、忌口、医嘱等"
)
private
MealDetailDto
mealDetailJson
;
...
...
@@ -535,6 +539,7 @@ public class OrderDbDTO {
@ToString
@ApiModel
(
description
=
"订单详情信息,即菜品细节"
)
public
static
class
OperatorCreateOrderDetailDto
{
@ApiModelProperty
(
value
=
"餐单详情 id,即菜品"
)
private
Integer
menuDetailId
;
...
...
src/main/java/com/infoloop/tianting/model/dto/PayDTO.java
View file @
05a3a9f
...
...
@@ -20,7 +20,6 @@ public class PayDTO {
public
static
class
PayInformRequestDto
{
private
String
clientId
;
private
String
orderId
;
private
String
openId
;
private
String
hospitalCode
;
private
String
price
;
private
String
phone
;
...
...
src/main/java/com/infoloop/tianting/model/dto/SkuSellQuantityDTO.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
model
.
dto
;
import
com.infoloop.tianting.enums.SkuSellQuantityStatus
;
import
com.infoloop.tianting.model.common.PageInfo
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
import
java.util.List
;
@Data
@ApiModel
(
description
=
"SkuSellQuantityDTO"
)
public
class
SkuSellQuantityDTO
{
@Data
@ApiModel
(
description
=
"批量设置菜品售卖量"
)
public
static
class
BatchSetSkuSellQuantityDTO
{
@ApiModelProperty
(
"菜品 Ids"
)
@NotEmpty
private
List
<
Integer
>
skuIds
;
@ApiModelProperty
(
"最大售卖数量"
)
@NotNull
private
Integer
maxSellQuantity
;
}
@EqualsAndHashCode
(
callSuper
=
true
)
@Data
@ApiModel
(
description
=
"分页查询菜品售卖量"
)
public
static
class
QuerySkuSellQuantityDTO
extends
PageInfo
{
@ApiModelProperty
(
"档口Id"
)
@NotNull
private
Integer
stallId
;
@ApiModelProperty
(
"菜品售卖状态"
)
@NotNull
private
SkuSellQuantityStatus
status
;
@ApiModelProperty
(
"关键字"
)
private
String
keyword
;
}
@Data
@ApiModel
(
description
=
"根据菜品 Ids 查询菜品售卖量"
)
public
static
class
QuerySkuSellQuantityBySkuIdsDTO
{
@ApiModelProperty
(
"档口Id"
)
@NotNull
private
Integer
stallId
;
@ApiModelProperty
(
"菜品售卖状态"
)
@NotEmpty
private
List
<
Integer
>
skuIds
;
}
}
src/main/java/com/infoloop/tianting/model/vo/SkuSellQuantityStatisticsVO.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
model
.
vo
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Builder
;
import
lombok.Data
;
@Data
@ApiModel
@Builder
public
class
SkuSellQuantityStatisticsVO
{
@ApiModelProperty
(
"全部"
)
private
int
total
;
@ApiModelProperty
(
"售罄"
)
private
Long
soldOut
;
@ApiModelProperty
(
"在售"
)
private
Long
onSale
;
}
src/main/java/com/infoloop/tianting/model/vo/SkuSellQuantityVO.java
0 → 100644
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
model
.
vo
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Builder
;
import
lombok.Data
;
@Data
@ApiModel
@Builder
public
class
SkuSellQuantityVO
{
@ApiModelProperty
(
"菜品Id"
)
private
Integer
skuId
;
@ApiModelProperty
(
"菜品名称"
)
private
String
skuName
;
@ApiModelProperty
(
"菜品编号"
)
private
String
skuCode
;
@ApiModelProperty
(
"最大售卖数量"
)
private
int
maxSellQuantity
;
@ApiModelProperty
(
"今日售卖数量"
)
private
int
todaySellQuantity
;
@ApiModelProperty
(
"是否售罄"
)
private
Boolean
soldOut
;
}
src/main/java/com/infoloop/tianting/service/LoginService.java
View file @
05a3a9f
...
...
@@ -3,6 +3,8 @@ package com.infoloop.tianting.service;
import
cn.dev33.satoken.stp.SaTokenInfo
;
import
com.infoloop.tianting.model.dto.PermissionDTO.LoginDto
;
import
java.security.NoSuchAlgorithmException
;
public
interface
LoginService
{
SaTokenInfo
login
(
LoginDto
loginDto
);
SaTokenInfo
login
(
LoginDto
loginDto
)
throws
NoSuchAlgorithmException
;
}
...
...
src/main/java/com/infoloop/tianting/service/MenuService.java
View file @
05a3a9f
...
...
@@ -6,6 +6,7 @@ import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsResponseDto;
import
com.infoloop.tianting.model.dto.MenuDbDTO.MenuDetailDto
;
import
com.infoloop.tianting.model.dto.MenuDbDTO.MenuDto
;
import
com.infoloop.tianting.model.dto.MenuDbDTO.MenuRefDto
;
import
java.util.List
;
public
interface
MenuService
{
...
...
@@ -21,4 +22,6 @@ public interface MenuService {
List
<
MenuRefDto
>
getClientCustomerMenuRefsByCustomerId
(
Integer
enterpriseId
,
Integer
customerId
);
BatchCreateMenuRefsResponseDto
batchCreateMenuRefs
(
BatchCreateMenuRefsDto
batchCreateMenuRefsDto
);
List
<
Integer
>
queryMenuSkuIdsByStallId
(
int
enterpriseId
,
int
stallId
);
}
...
...
src/main/java/com/infoloop/tianting/service/OrderService.java
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
service
;
import
com.infoloop.tianting.model.common.OrderPageResult
;
import
com.infoloop.tianting.model.common.PageResult
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.OperatorCreateOrderDto
;
...
...
@@ -15,6 +13,8 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import
com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto
;
import
java.util.List
;
public
interface
OrderService
{
...
...
src/main/java/com/infoloop/tianting/service/SkuService.java
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
service
;
import
com.infoloop.tianting.model.common.PageResult
;
import
com.infoloop.tianting.model.dto.SkuDbDTO.SkuDto
;
import
com.infoloop.tianting.model.dto.SkuSellQuantityDTO
;
import
com.infoloop.tianting.model.vo.SkuSellQuantityStatisticsVO
;
import
com.infoloop.tianting.model.vo.SkuSellQuantityVO
;
import
javax.validation.Valid
;
import
java.util.List
;
public
interface
SkuService
{
List
<
SkuDto
>
getSkusByIds
(
List
<
Integer
>
ids
);
SkuSellQuantityStatisticsVO
querySkuSellQuantityStatistics
(
int
stallId
);
PageResult
<
SkuSellQuantityVO
>
querySkuSellQuantity
(
SkuSellQuantityDTO
.
QuerySkuSellQuantityDTO
querySkuSellQuantityDTO
);
boolean
batchSetSkuSellQuantity
(
int
stallId
,
SkuSellQuantityDTO
.
BatchSetSkuSellQuantityDTO
batchSetSkuSellQuantityDTO
);
List
<
SkuSellQuantityVO
>
querySkuSellQuantityBySkuIds
(
SkuSellQuantityDTO
.
@Valid
QuerySkuSellQuantityBySkuIdsDTO
querySkuSellQuantityBySkuIdsDTO
);
}
...
...
src/main/java/com/infoloop/tianting/service/client/OrderServiceRpcClient.java
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
service
.
client
;
import
com.infoloop.tianting.SingleResponse
;
import
com.infoloop.tianting.SingleSkuResponse
;
import
com.infoloop.tianting.SingleSpecialResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.AddSkusSellQuantitiesRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.BatchCreateOrderOperationRecordsRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.BatchCreateOrderOperationRecordsResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.BatchSaveSkuSellQuantitiesRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderCreation
;
...
...
@@ -13,7 +16,6 @@ import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModif
import
com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderServiceRpcGrpc
;
import
com.infoloop.tianting.clientcustomerorderservice.CloseTimeType
;
import
com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderRpcResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.CustomerNotice
;
import
com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderByIdRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderDetailsByIdsRpcRequest
;
...
...
@@ -28,13 +30,27 @@ import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
import
com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByConditionRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.QuerySkuSellQuantitiesByStallAndSkuIdsRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.QuerySkuSellQuantitiesByStallRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleSkuSellQuantityRpcResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.SkuSellQuantity
;
import
com.infoloop.tianting.clientcustomerorderservice.SkuSellQuantityModification
;
import
com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcResponse
;
import
com.infoloop.tianting.context.LoginContextHolder
;
import
com.infoloop.tianting.enums.OrderTypeEnum
;
import
com.infoloop.tianting.exception.ClientEndExceptions
;
import
com.infoloop.tianting.exception.ErrorCodeEnum
;
import
com.infoloop.tianting.logic.delay.DelayedQueue
;
import
com.infoloop.tianting.logic.delay.OrderAutoCancelDelayTask
;
import
com.infoloop.tianting.logic.delay.param.AutoCancelParam
;
import
com.infoloop.tianting.menuservice.CloseTimeTypeEnum
;
import
com.infoloop.tianting.menuservice.ModeOfPaymentEnum
;
import
com.infoloop.tianting.model.bo.AddSkusSellQuantityBO
;
import
com.infoloop.tianting.model.bo.SkuSellQuantityBO
;
import
com.infoloop.tianting.model.dto.OperationDTO.BatchOperationDto
;
import
com.infoloop.tianting.model.dto.OperationDTO.SingleOperationDto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDetailDto
;
...
...
@@ -51,6 +67,7 @@ import com.infoloop.tianting.utils.DateUtil;
import
com.infoloop.tianting.utils.JsonUtil
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.redisson.api.RAtomicLong
;
import
org.redisson.api.RedissonClient
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
...
...
@@ -59,7 +76,10 @@ import javax.annotation.Nullable;
import
java.time.LocalDate
;
import
java.time.ZoneOffset
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.concurrent.TimeUnit
;
import
java.util.function.Function
;
import
java.util.stream.Collectors
;
@Slf4j
...
...
@@ -72,6 +92,7 @@ public class OrderServiceRpcClient {
private
final
SkuServiceRpcClient
skuServiceRpcClient
;
private
final
OperatorServiceRpcClient
operatorServiceRpcClient
;
private
final
RedissonClient
redissonClient
;
private
final
DelayedQueue
<
AutoCancelParam
>
delayedQueue
;
@Nullable
public
SingleClientCustomerOrderRpcResponse
getOrderById
(
Integer
orderId
)
{
...
...
@@ -149,6 +170,23 @@ public class OrderServiceRpcClient {
return
orderServiceRpcBlockingStub
.
updateClientCustomerOrder
(
request
);
}
public
boolean
updateClientCustomerOrderCancel
(
int
enterpriseId
,
int
id
)
{
final
var
modification
=
ClientCustomerOrderModification
.
newBuilder
()
.
setId
(
id
)
.
setShouldUpdateStatus
(
true
)
.
setStatus
(
OrderStatusEnum
.
ORDER_CANCELED
)
.
setShouldUpdatePayStatus
(
true
)
.
setPayStatus
(
PayStatusEnum
.
PAY_CANCELED
)
.
build
();
final
var
request
=
UpdateClientCustomerOrderRpcRequest
.
newBuilder
()
.
setEnterpriseId
(
enterpriseId
)
.
setUpdatedBy
(
0
)
.
setUpdateSource
(
OrderSourceEnum
.
STALL
)
.
setModification
(
modification
)
.
build
();
return
orderServiceRpcBlockingStub
.
updateClientCustomerOrder
(
request
).
getIsUpdated
();
}
public
UpdateClientCustomerOrderRpcResponse
updateClientCustomerOrderPaymentResult
(
SingleClientCustomerOrderRpcResponse
order
,
ClientCustomerOrderModification
modification
)
{
final
var
request
=
UpdateClientCustomerOrderRpcRequest
.
newBuilder
()
.
setEnterpriseId
(
order
.
getEnterpriseId
())
...
...
@@ -160,16 +198,15 @@ public class OrderServiceRpcClient {
}
public
BatchUpdateClientCustomerOrderDetailsRpcResponse
batchUpdateClientCustomerOrderDetails
(
OrderDetailBatchUpdateDto
orderDetailBatchUpdateDto
)
{
public
BatchUpdateClientCustomerOrderDetailsRpcResponse
batchUpdateClientCustomerOrderDetails
(
OrderDetailBatchUpdateDto
orderDetailBatchUpdateDto
)
{
final
var
operatorLoginInfo
=
LoginContextHolder
.
getLoginInfo
();
final
var
operator
=
operatorServiceRpcClient
.
getCOperatorById
(
operatorLoginInfo
.
getId
());
List
<
Integer
>
idsOfNeedUpdateMenuDetails
=
new
ArrayList
<
>();
List
<
Integer
>
idsOfAddCount
=
new
ArrayList
<
>();
List
<
OrderDetailDto
>
or
gio
nalOrderDetails
=
new
ArrayList
<>();
final
var
idsOfNeedUpdateMenuDetails
=
new
ArrayList
<
Integer
>();
final
var
idsOfAddCount
=
new
ArrayList
<
Integer
>();
List
<
OrderDetailDto
>
or
igi
nalOrderDetails
=
new
ArrayList
<>();
List
<
OrderDetailDto
>
newOrderDetails
;
final
var
modifications
=
orderDetailBatchUpdateDto
.
getDetails
().
stream
().
map
(
d
->
{
MealDetail
mealDetail
=
MealDetail
.
newBuilder
().
build
();
var
mealDetail
=
MealDetail
.
newBuilder
().
build
();
Integer
menuDetailId
=
0
;
int
mealId
=
0
;
int
categoryId
=
0
;
...
...
@@ -178,8 +215,7 @@ public class OrderServiceRpcClient {
if
(
d
.
getShouldUpdateMenuDetailId
())
{
idsOfNeedUpdateMenuDetails
.
add
(
d
.
getId
());
menuDetailId
=
d
.
getMenuDetailId
();
final
var
menuDetail
=
menuServiceRpcClient
.
getMenuDetailById
(
operatorLoginInfo
.
getEnterpriseId
(),
menuDetailId
).
getResponse
();
final
var
menuDetail
=
menuServiceRpcClient
.
getMenuDetailById
(
operatorLoginInfo
.
getEnterpriseId
(),
menuDetailId
).
getResponse
();
mealId
=
menuDetail
.
getMealId
();
categoryId
=
menuDetail
.
getCategoryId
();
skuId
=
menuDetail
.
getSkuId
();
...
...
@@ -190,8 +226,7 @@ public class OrderServiceRpcClient {
final
var
skuAvoids
=
rpcSkus
.
get
(
0
).
getAvoidsList
().
stream
().
map
(
SingleResponse:
:
getName
).
collect
(
Collectors
.
toList
());
final
var
tastes
=
rpcSkus
.
get
(
0
).
getTastesList
().
stream
().
map
(
SingleResponse:
:
getName
).
collect
(
Collectors
.
toList
());
final
var
efficacies
=
rpcSkus
.
get
(
0
).
getEfficaciesList
().
stream
().
map
(
SingleResponse:
:
getName
).
collect
(
Collectors
.
toList
());
final
var
allergies
=
rpcSkus
.
get
(
0
).
getAllergiesList
().
stream
().
map
(
SingleSpecialResponse:
:
getName
).
collect
(
Collectors
.
toList
());
final
var
allergies
=
rpcSkus
.
get
(
0
).
getAllergiesList
().
stream
().
map
(
SingleSpecialResponse:
:
getName
).
collect
(
Collectors
.
toList
());
final
var
skuDoctors
=
rpcSkus
.
get
(
0
).
getDoctorsList
().
stream
().
map
(
SingleSpecialResponse:
:
getName
).
collect
(
Collectors
.
toList
());
mealDetail
=
MealDetail
.
newBuilder
()
.
setBasicMaterials
(
rpcSkus
.
get
(
0
).
getBasicMaterials
())
...
...
@@ -249,45 +284,43 @@ public class OrderServiceRpcClient {
totalIds
.
addAll
(
idsOfAddCount
);
if
(!
idsOfNeedUpdateMenuDetails
.
isEmpty
()
||
!
idsOfAddCount
.
isEmpty
())
{
final
var
orgionalResponseList
=
getClientCustomerOrderDetailsByIds
(
totalIds
);
orgionalOrderDetails
=
orgionalResponseList
.
stream
().
map
(
d
->
OrderDetailDto
.
builder
()
.
id
(
d
.
getId
())
.
count
(
d
.
getCount
())
.
categoryId
(
d
.
getCategoryId
())
.
mealId
(
d
.
getMealId
())
.
menuDetailId
(
d
.
getMenuDetailId
())
.
orderId
(
d
.
getOrderId
())
.
price
(
d
.
getPrice
())
.
showName
(
d
.
getShowName
())
.
mealDetailJson
(
MealDetailDto
.
builder
()
.
allergies
(
d
.
getMealDetailJson
().
getAllergiesList
())
.
basicMaterials
(
d
.
getMealDetailJson
().
getBasicMaterials
())
.
dockers
(
d
.
getMealDetailJson
().
getDockersList
())
.
efficacies
(
d
.
getMealDetailJson
().
getEfficaciesList
())
.
fat
(
d
.
getMealDetailJson
().
getFat
())
.
tastes
(
d
.
getMealDetailJson
().
getTastesList
())
.
protein
(
d
.
getMealDetailJson
().
getProtein
())
.
carbohydrate
(
d
.
getMealDetailJson
().
getCarbohydrate
())
.
energy
(
d
.
getMealDetailJson
().
getEnergy
())
.
avoids
(
d
.
getMealDetailJson
().
getAvoidsList
())
.
skus
(
d
.
getMealDetailJson
().
getSkusList
())
.
build
())
.
adjustSkuRemark
(
d
.
getAdjustSkuRemark
())
.
enterpriseId
(
d
.
getEnterpriseId
())
.
skuId
(
d
.
getSkuId
())
.
serveStatus
(
d
.
getServeStatus
())
.
creationSource
(
d
.
getCreationSource
().
getNumber
())
.
createdBy
(
d
.
getCreatedBy
())
.
createdAt
(
DateUtil
.
formatDate
(
d
.
getCreatedAt
()))
.
updateSource
(
d
.
getUpdateSource
().
getNumber
())
.
updatedAt
(
DateUtil
.
formatDate
(
d
.
getUpdatedAt
()))
.
updatedBy
(
d
.
getUpdatedBy
())
.
build
()).
collect
(
Collectors
.
toList
());
originalOrderDetails
=
orgionalResponseList
.
stream
().
map
(
d
->
OrderDetailDto
.
builder
()
.
id
(
d
.
getId
())
.
count
(
d
.
getCount
())
.
categoryId
(
d
.
getCategoryId
())
.
mealId
(
d
.
getMealId
())
.
menuDetailId
(
d
.
getMenuDetailId
())
.
orderId
(
d
.
getOrderId
())
.
price
(
d
.
getPrice
())
.
showName
(
d
.
getShowName
())
.
mealDetailJson
(
MealDetailDto
.
builder
()
.
allergies
(
d
.
getMealDetailJson
().
getAllergiesList
())
.
basicMaterials
(
d
.
getMealDetailJson
().
getBasicMaterials
())
.
dockers
(
d
.
getMealDetailJson
().
getDockersList
())
.
efficacies
(
d
.
getMealDetailJson
().
getEfficaciesList
())
.
fat
(
d
.
getMealDetailJson
().
getFat
())
.
tastes
(
d
.
getMealDetailJson
().
getTastesList
())
.
protein
(
d
.
getMealDetailJson
().
getProtein
())
.
carbohydrate
(
d
.
getMealDetailJson
().
getCarbohydrate
())
.
energy
(
d
.
getMealDetailJson
().
getEnergy
())
.
avoids
(
d
.
getMealDetailJson
().
getAvoidsList
())
.
skus
(
d
.
getMealDetailJson
().
getSkusList
())
.
build
())
.
adjustSkuRemark
(
d
.
getAdjustSkuRemark
())
.
enterpriseId
(
d
.
getEnterpriseId
())
.
skuId
(
d
.
getSkuId
())
.
serveStatus
(
d
.
getServeStatus
())
.
creationSource
(
d
.
getCreationSource
().
getNumber
())
.
createdBy
(
d
.
getCreatedBy
())
.
createdAt
(
DateUtil
.
formatDate
(
d
.
getCreatedAt
()))
.
updateSource
(
d
.
getUpdateSource
().
getNumber
())
.
updatedAt
(
DateUtil
.
formatDate
(
d
.
getUpdatedAt
()))
.
updatedBy
(
d
.
getUpdatedBy
())
.
build
()).
collect
(
Collectors
.
toList
());
}
final
var
res
=
orderServiceRpcBlockingStub
.
batchUpdateClientCustomerOrderDetails
(
request
);
if
(
res
.
getIsUpdated
())
{
if
(!
idsOfNeedUpdateMenuDetails
.
isEmpty
()
||
!
idsOfAddCount
.
isEmpty
())
{
final
var
newResponseList
=
getClientCustomerOrderDetailsByIds
(
totalIds
);
newOrderDetails
=
newResponseList
.
stream
().
map
(
d
->
OrderDetailDto
.
builder
()
...
...
@@ -323,19 +356,18 @@ public class OrderServiceRpcClient {
.
updatedAt
(
DateUtil
.
formatDate
(
d
.
getUpdatedAt
()))
.
updatedBy
(
d
.
getUpdatedBy
())
.
build
()).
collect
(
Collectors
.
toList
());
// 替换菜品的操作记录
List
<
SingleOperationDto
>
operations
=
new
ArrayList
<>();
for
(
OrderDetailDto
or
gionalDetail
:
orgio
nalOrderDetails
)
{
for
(
OrderDetailDto
or
iginalDetail
:
origi
nalOrderDetails
)
{
OrderOperationType
orderOperationType
=
OrderOperationType
.
UNKNOWN_OPERATION_TYPE
;
if
(
idsOfNeedUpdateMenuDetails
.
contains
(
or
gio
nalDetail
.
getId
()))
{
if
(
idsOfNeedUpdateMenuDetails
.
contains
(
or
igi
nalDetail
.
getId
()))
{
orderOperationType
=
OrderOperationType
.
REPLACE_DISHES
;
}
else
if
(
idsOfAddCount
.
contains
(
or
gio
nalDetail
.
getId
()))
{
}
else
if
(
idsOfAddCount
.
contains
(
or
igi
nalDetail
.
getId
()))
{
orderOperationType
=
OrderOperationType
.
ADD_DISHES
;
}
String
or
gionalDetailStr
=
""
;
String
or
iginalDetailStr
;
String
newDetailStr
=
""
;
final
var
newDetail
=
newOrderDetails
.
stream
().
filter
(
n
->
n
.
getId
().
equals
(
or
gio
nalDetail
.
getId
())).
findFirst
();
final
var
newDetail
=
newOrderDetails
.
stream
().
filter
(
n
->
n
.
getId
().
equals
(
or
igi
nalDetail
.
getId
())).
findFirst
();
if
(
newDetail
.
isPresent
())
{
final
var
newOrderDetailOperation
=
OrderDetailOperationDto
.
builder
()
.
id
(
newDetail
.
get
().
getId
())
...
...
@@ -347,23 +379,23 @@ public class OrderServiceRpcClient {
.
build
();
newDetailStr
=
JsonUtil
.
writeAsJson
(
List
.
of
(
newOrderDetailOperation
));
}
final
var
or
gio
nalOrderDetailOperation
=
OrderDetailOperationDto
.
builder
()
.
id
(
or
gio
nalDetail
.
getId
())
.
skuId
(
or
gio
nalDetail
.
getSkuId
())
.
skuName
(
or
gio
nalDetail
.
getShowName
())
.
count
(
or
gio
nalDetail
.
getCount
())
.
adjustSkuRemark
(
or
gio
nalDetail
.
getAdjustSkuRemark
())
.
serveStatus
(
or
gio
nalDetail
.
getServeStatus
().
name
())
final
var
or
igi
nalOrderDetailOperation
=
OrderDetailOperationDto
.
builder
()
.
id
(
or
igi
nalDetail
.
getId
())
.
skuId
(
or
igi
nalDetail
.
getSkuId
())
.
skuName
(
or
igi
nalDetail
.
getShowName
())
.
count
(
or
igi
nalDetail
.
getCount
())
.
adjustSkuRemark
(
or
igi
nalDetail
.
getAdjustSkuRemark
())
.
serveStatus
(
or
igi
nalDetail
.
getServeStatus
().
name
())
.
build
();
or
gionalDetailStr
=
JsonUtil
.
writeAsJson
(
List
.
of
(
orgio
nalOrderDetailOperation
));
or
iginalDetailStr
=
JsonUtil
.
writeAsJson
(
List
.
of
(
origi
nalOrderDetailOperation
));
final
var
operation
=
SingleOperationDto
.
builder
()
.
orderId
(
or
gio
nalDetail
.
getOrderId
())
.
orderId
(
or
igi
nalDetail
.
getOrderId
())
.
shouldCreateAdjustOrderDetailJson
(
true
)
.
shouldCreateOriginalOrderDetailJson
(
true
)
.
shouldCreateAdjustOrderJson
(
false
)
.
shouldCreateOriginalOrderJson
(
false
)
.
adjustOrderDetailJson
(
newDetailStr
)
.
originalOrderDetailJson
(
or
gio
nalDetailStr
)
.
originalOrderDetailJson
(
or
igi
nalDetailStr
)
.
type
(
orderOperationType
)
.
build
();
operations
.
add
(
operation
);
...
...
@@ -381,9 +413,7 @@ public class OrderServiceRpcClient {
return
res
;
}
public
BatchCreateOrderOperationRecordsResponse
batchCreateOrderOperationRecords
(
BatchOperationDto
batchOperationDto
)
{
public
BatchCreateOrderOperationRecordsResponse
batchCreateOrderOperationRecords
(
BatchOperationDto
batchOperationDto
)
{
final
var
request
=
BatchCreateOrderOperationRecordsRequest
.
newBuilder
()
.
addAllCreations
(
batchOperationDto
.
getCreations
().
stream
().
map
(
c
->
OrderOperationRecordCreation
.
newBuilder
()
...
...
@@ -407,8 +437,7 @@ public class OrderServiceRpcClient {
}
public
QueryClientCustomerOrdersByPaginationRpcResponse
queryClientCustomerOrdersByPagination
(
QueryOrderByPaginationDto
queryOrderDto
)
{
public
QueryClientCustomerOrdersByPaginationRpcResponse
queryClientCustomerOrdersByPagination
(
QueryOrderByPaginationDto
queryOrderDto
)
{
final
var
request
=
QueryClientCustomerOrdersByPaginationRpcRequest
.
newBuilder
()
.
setKeyword
(
queryOrderDto
.
getKeyword
()
==
null
?
""
:
queryOrderDto
.
getKeyword
())
.
setPageNo
(
queryOrderDto
.
getPn
())
...
...
@@ -450,7 +479,7 @@ public class OrderServiceRpcClient {
String
currentDate
=
DateUtil
.
formatDate
(
today
,
DateUtil
.
YYYY_MM_DD
);
String
redisKey
=
REDIS_KEY_PREFIX
+
currentDate
;
// 获取分布式原子Long对象,用于原子自增操作
org
.
redisson
.
api
.
RAtomicLong
atomicLong
=
redissonClient
.
getAtomicLong
(
redisKey
);
RAtomicLong
atomicLong
=
redissonClient
.
getAtomicLong
(
redisKey
);
// 原子自增并获取当前值
long
counter
=
atomicLong
.
incrementAndGet
();
return
String
.
format
(
"%04d"
,
(
int
)
counter
);
...
...
@@ -497,11 +526,9 @@ public class OrderServiceRpcClient {
.
addAllDoctors
(
createOrderDto
.
getCustomerNoticeJson
().
getDoctors
())
.
build
();
//判断用餐时间是否是当天
final
var
mealDate
=
createOrderDto
.
getMealTime
().
toLocalDate
();
final
var
todayDate
=
LocalDate
.
now
();
final
var
menuById
=
menuServiceRpcClient
.
getMenuById
(
createOrderDto
.
getEnterpriseId
(),
createOrderDto
.
getMenuId
());
OrderStatusEnum
orderStatus
=
OrderStatusEnum
.
TO_PREPARE
;
if
(
me
alDate
.
equals
(
todayDate
)
)
{
if
(
me
nuById
.
getResponse
().
getOrderRuleJson
().
getModeOfPayment
()
==
ModeOfPaymentEnum
.
ONLINE
&&
menuById
.
getResponse
().
getOrderRuleJson
().
getCloseTimeType
()
==
CloseTimeTypeEnum
.
IMMEDIATELY
)
{
orderStatus
=
OrderStatusEnum
.
PREPARING
;
}
...
...
@@ -512,19 +539,20 @@ public class OrderServiceRpcClient {
.
setStatus
(
orderStatus
)
.
setAddress
(
createOrderDto
.
getAddress
())
.
setClientId
(
createOrderDto
.
getClientId
())
.
setShouldCreateOpenId
(
createOrderDto
.
getShouldCreateOpenId
())
.
setOpenId
(
createOrderDto
.
getOpenId
())
.
setShouldCreateOpenId
(
!
LoginContextHolder
.
getOpenId
().
isEmpty
())
.
setOpenId
(
LoginContextHolder
.
getOpenId
())
.
setShouldCreateRoomNo
(!
createOrderDto
.
getRoomNo
().
isEmpty
())
.
setRoomNo
(
createOrderDto
.
getRoomNo
())
.
setShouldCreateTableCode
(
createOrderDto
.
getOrderType
().
equals
(
OrderTypeEnum
.
DINE_IN
.
getValue
()))
.
setShouldCreateTableCode
(
createOrderDto
.
getOrderType
().
equals
(
OrderTypeEnum
.
DINE_IN
.
getValue
())
||
!
createOrderDto
.
getTableCode
().
isEmpty
()
)
.
setTableCode
(
createOrderDto
.
getTableCode
())
.
setShouldCreateOnlinePay
(
true
)
.
setOnlinePay
(
createOrderDto
.
getOnlinePay
())
.
setShouldCreatePayStatus
(
createOrderDto
.
getOnlinePay
())
.
setPayStatus
(
PayStatusEnum
.
TO_PAY
)
.
setMenuId
(
createOrderDto
.
getMenuId
())
.
setTotalNum
(
createOrderDto
.
getTotalNum
())
.
setPayPrice
(
createOrderDto
.
getPayPrice
())
.
setMealTime
(
mealDate
.
atStartOfDay
().
toInstant
(
ZoneOffset
.
UTC
).
toEpochMilli
())
.
setMealTime
(
LocalDate
.
now
()
.
atStartOfDay
().
toInstant
(
ZoneOffset
.
UTC
).
toEpochMilli
())
.
setShouldCreateTableCode
(
createOrderDto
.
getCloseTimeType
().
equals
(
CloseTimeType
.
IMMEDIATELY
))
.
setShouldCreatePickupCode
(
createOrderDto
.
getCloseTimeType
().
equals
(
CloseTimeType
.
IMMEDIATELY
))
.
setPickupCode
(
generatePickupCode
())
...
...
@@ -536,14 +564,99 @@ public class OrderServiceRpcClient {
.
setShouldCreateOrderDetails
(
true
)
.
addAllOrderDetails
(
orderDetails
)
.
build
();
CreateClientCustomerOrderRpcResponse
orderResponse
=
orderServiceRpcBlockingStub
if
(
menuById
.
getResponse
().
getOrderRuleJson
().
getCloseTimeType
()
==
CloseTimeTypeEnum
.
IMMEDIATELY
)
{
final
var
skuIds
=
createOrderDto
.
getOrderDetailDtos
().
stream
().
map
(
CreateOrderDetailDto:
:
getSkuId
).
collect
(
Collectors
.
toList
());
final
var
skuSellQuantities
=
this
.
querySkuSellQuantitiesByStallAndSkuIds
(
createOrderDto
.
getEnterpriseId
(),
createOrderDto
.
getStallId
(),
skuIds
);
final
var
skuSellQuantityMap
=
skuSellQuantities
.
stream
().
collect
(
Collectors
.
toMap
(
SingleSkuSellQuantityRpcResponse:
:
getSkuId
,
Function
.
identity
()));
final
var
skuMap
=
skuServiceRpcClient
.
getSkusByIds
(
skuIds
).
stream
().
collect
(
Collectors
.
toMap
(
SingleSkuResponse:
:
getId
,
Function
.
identity
()));
final
var
soldOutSkus
=
new
ArrayList
<
String
>();
final
var
skuStockMap
=
new
HashMap
<
String
,
Integer
>();
for
(
var
orderDetail
:
createOrderDto
.
getOrderDetailDtos
())
{
final
var
skuSellQuantityRpcResponse
=
skuSellQuantityMap
.
get
(
orderDetail
.
getSkuId
());
if
(
skuSellQuantityRpcResponse
==
null
)
{
log
.
error
(
"skuSellQuantityRpcResponse is null; stallId:{}, skuId:{}"
,
createOrderDto
.
getStallId
(),
orderDetail
.
getSkuId
());
soldOutSkus
.
add
(
skuMap
.
get
(
orderDetail
.
getSkuId
()).
getName
());
continue
;
}
if
((
skuSellQuantityRpcResponse
.
getTodaySellQuantity
()
+
orderDetail
.
getCount
())
>
skuSellQuantityRpcResponse
.
getMaxSellQuantity
())
{
log
.
error
(
"skuSellQuantityRpcResponse stock no enough; stallId:{}, skuId:{}, count:{}"
,
createOrderDto
.
getStallId
(),
orderDetail
.
getSkuId
(),
orderDetail
.
getCount
());
skuStockMap
.
put
(
skuMap
.
get
(
orderDetail
.
getSkuId
()).
getName
(),
skuSellQuantityRpcResponse
.
getMaxSellQuantity
()
-
skuSellQuantityRpcResponse
.
getTodaySellQuantity
());
}
}
if
(!
soldOutSkus
.
isEmpty
())
{
throw
ClientEndExceptions
.
BusinessException
.
build
(
ErrorCodeEnum
.
SKUS_SOLD_OUT_TODAY
,
String
.
join
(
","
,
soldOutSkus
));
}
if
(!
skuStockMap
.
isEmpty
())
{
final
var
noEnoughSkus
=
String
.
join
(
", "
,
skuStockMap
.
keySet
());
throw
ClientEndExceptions
.
BusinessException
.
build
(
ErrorCodeEnum
.
SKUS_STOCK_NO_ENOUGH_TODAY
,
noEnoughSkus
);
}
}
final
var
orderResponse
=
orderServiceRpcBlockingStub
.
createClientCustomerOrder
(
CreateClientCustomerOrderRpcRequest
.
newBuilder
()
.
setCreation
(
creation
)
.
setCreationSource
(
OrderSourceEnum
.
forNumber
(
createOrderDto
.
getCreationSource
()))
.
setEnterpriseId
(
createOrderDto
.
getEnterpriseId
())
.
setCreatedBy
(
createOrderDto
.
getCreatedBy
())
.
build
());
if
(
orderResponse
.
getIsCreated
())
{
//立即点餐需要扣除库存
if
(
menuById
.
getResponse
().
getOrderRuleJson
().
getCloseTimeType
()
==
CloseTimeTypeEnum
.
IMMEDIATELY
)
{
final
var
isSuccess
=
this
.
addSkusSellQuantities
(
createOrderDto
.
getEnterpriseId
(),
createOrderDto
.
getStallId
(),
orderDetails
.
stream
().
map
(
e
->
AddSkusSellQuantityBO
.
builder
()
.
skuId
(
e
.
getSkuId
())
.
quantity
(
e
.
getCount
())
.
build
()).
collect
(
Collectors
.
toList
()));
log
.
info
(
"Order {} addSkusSellQuantities result: {}"
,
orderResponse
.
getId
(),
isSuccess
);
}
//在线支付需要延迟取消订单
if
(
menuById
.
getResponse
().
getOrderRuleJson
().
getModeOfPayment
()
==
ModeOfPaymentEnum
.
ONLINE
)
{
final
var
autoCancelParam
=
new
AutoCancelParam
();
autoCancelParam
.
setOrderId
(
orderResponse
.
getId
());
delayedQueue
.
addToQueue
(
OrderAutoCancelDelayTask
.
AUTO_CANCEL_ORDER_DELAY_QUEUE
,
autoCancelParam
,
10
,
TimeUnit
.
MINUTES
);
}
}
return
CreateOrderResponse
.
builder
().
id
(
orderResponse
.
getId
()).
isCreated
(
true
).
build
();
}
public
List
<
SingleSkuSellQuantityRpcResponse
>
querySkuSellQuantitiesByStall
(
int
enterpriseId
,
int
stallId
)
{
return
orderServiceRpcBlockingStub
.
querySkuSellQuantitiesByStall
(
QuerySkuSellQuantitiesByStallRpcRequest
.
newBuilder
()
.
setEnterpriseId
(
enterpriseId
)
.
setStallId
(
stallId
)
.
build
()).
getResponsesList
();
}
public
List
<
SingleSkuSellQuantityRpcResponse
>
querySkuSellQuantitiesByStallAndSkuIds
(
int
enterpriseId
,
int
stallId
,
List
<
Integer
>
skuIds
)
{
return
orderServiceRpcBlockingStub
.
querySkuSellQuantitiesByStallAndSkuIds
(
QuerySkuSellQuantitiesByStallAndSkuIdsRpcRequest
.
newBuilder
()
.
setEnterpriseId
(
enterpriseId
)
.
setStallId
(
stallId
)
.
addAllSkuIds
(
skuIds
)
.
build
()).
getResponsesList
();
}
public
boolean
batchSaveSkuSellQuantities
(
int
enterpriseId
,
int
stallId
,
List
<
SkuSellQuantityBO
>
skuSellQuantityBOs
)
{
return
orderServiceRpcBlockingStub
.
batchSaveSkuSellQuantities
(
BatchSaveSkuSellQuantitiesRpcRequest
.
newBuilder
()
.
setEnterpriseId
(
enterpriseId
)
.
setUpdatedBy
(
stallId
)
.
addAllSkuSellQuantityModifications
(
skuSellQuantityBOs
.
stream
().
map
(
e
->
SkuSellQuantityModification
.
newBuilder
()
.
setId
(
e
.
getId
()
==
null
?
0
:
e
.
getId
())
.
setStallId
(
stallId
)
.
setSkuId
(
e
.
getSkuId
())
.
setMaxSellQuantity
(
e
.
getMaxSellQuantity
())
.
build
()).
collect
(
Collectors
.
toList
()))
.
build
()).
getIsSaved
();
}
public
boolean
addSkusSellQuantities
(
int
enterpriseId
,
int
stallId
,
List
<
AddSkusSellQuantityBO
>
skuSellQuantityBOs
)
{
return
orderServiceRpcBlockingStub
.
addSkusSellQuantities
(
AddSkusSellQuantitiesRpcRequest
.
newBuilder
()
.
setEnterpriseId
(
enterpriseId
)
.
setStallId
(
stallId
)
.
addAllSkuSellQuantities
(
skuSellQuantityBOs
.
stream
().
map
(
e
->
SkuSellQuantity
.
newBuilder
()
.
setSkuId
(
e
.
getSkuId
())
.
setQuantity
(
e
.
getQuantity
())
.
build
()).
collect
(
Collectors
.
toList
()))
.
build
()).
getIsAdded
();
}
}
...
...
src/main/java/com/infoloop/tianting/service/client/PayServiceClient.java
View file @
05a3a9f
...
...
@@ -8,8 +8,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import
com.fasterxml.jackson.databind.PropertyNamingStrategy
;
import
com.fasterxml.jackson.dataformat.xml.XmlMapper
;
import
com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModification
;
import
com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum
;
import
com.infoloop.tianting.config.BusinessConfig
;
import
com.infoloop.tianting.context.LoginContextHolder
;
import
com.infoloop.tianting.exception.ClientEndExceptions
;
import
com.infoloop.tianting.exception.ErrorCodeEnum
;
import
com.infoloop.tianting.model.dto.PayDTO.PayInformRequestDto
;
import
com.infoloop.tianting.model.dto.PayDTO.PayResponseDto
;
import
com.infoloop.tianting.model.dto.PayDTO.ThirdPartyPayInformRequestDto
;
...
...
@@ -20,7 +24,6 @@ import com.infoloop.tianting.utils.EncryptionUtil;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.http.HttpEntity
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.http.HttpMethod
;
...
...
@@ -30,6 +33,7 @@ import org.springframework.stereotype.Service;
import
org.springframework.web.client.RestTemplate
;
import
java.math.BigDecimal
;
import
java.text.MessageFormat
;
import
java.text.ParseException
;
import
java.time.LocalDateTime
;
...
...
@@ -44,12 +48,16 @@ public class PayServiceClient {
private
final
BusinessConfig
businessConfig
;
private
final
OrderServiceRpcClient
orderServiceRpcClient
;
private
final
XmlMapper
xmlMapper
=
new
XmlMapper
();
@Value
(
"${payment.client-id:Order0001}"
)
private
String
clientId
;
public
PayResponseDto
payInform
(
PayInformRequestDto
payRequestDto
)
{
String
url
=
businessConfig
.
getPayUrl
();
final
var
orderById
=
orderServiceRpcClient
.
getOrderById
(
Integer
.
valueOf
(
payRequestDto
.
getOrderId
()));
if
(
orderById
==
null
||
orderById
.
getPayStatus
()
==
PayStatusEnum
.
PAY_CANCELED
||
orderById
.
getStatus
()
==
OrderStatusEnum
.
ORDER_CANCELED
)
{
log
.
info
(
"Order {} not found or canceled, skipping."
,
payRequestDto
.
getOrderId
());
throw
ClientEndExceptions
.
BusinessException
.
build
(
ErrorCodeEnum
.
ORDER_CANCEL
);
}
String
url
=
MessageFormat
.
format
(
businessConfig
.
getPayUrl
(),
businessConfig
.
getPayClientId
());
String
requestDate
=
DateUtil
.
formatDate
(
LocalDateTime
.
now
(),
DateUtil
.
YMDHMS
);
ThirdPartyPayInformRequestDto
jsonData
=
buildRequestData
(
payRequestDto
,
requestDate
);
String
jsonDataString
;
...
...
@@ -71,17 +79,17 @@ public class PayServiceClient {
private
ThirdPartyPayInformRequestDto
buildRequestData
(
PayInformRequestDto
payRequestDto
,
String
requestDate
)
{
ThirdPartyPayInformRequestDto
jsonData
=
new
ThirdPartyPayInformRequestDto
();
jsonData
.
setClientId
(
clientId
);
jsonData
.
setClientId
(
businessConfig
.
getPayClientId
()
);
jsonData
.
setTradeId
(
payRequestDto
.
getOrderId
());
jsonData
.
setRequestDate
(
requestDate
);
jsonData
.
setRequestSource
(
"OFWXApplet"
);
jsonData
.
setPayerOpenId
(
payRequestDto
.
getOpenId
());
jsonData
.
setPayerOpenId
(
LoginContextHolder
.
getOpenId
());
jsonData
.
setHospitalCode
(
payRequestDto
.
getHospitalCode
());
jsonData
.
setPID
(
payRequestDto
.
getPhone
());
jsonData
.
setRemark
(
""
);
jsonData
.
setTransAmount
(
payRequestDto
.
getPrice
());
jsonData
.
setTradeDesc
(
""
);
jsonData
.
setSign
(
EncryptionUtil
.
sha1Encryption
(
clientId
+
payRequestDto
.
getOrderId
()
+
requestDate
+
clientId
));
jsonData
.
setSign
(
EncryptionUtil
.
sha1Encryption
(
businessConfig
.
getPayClientId
()
+
payRequestDto
.
getOrderId
()
+
requestDate
+
businessConfig
.
getPayClientId
()
));
return
jsonData
;
}
...
...
src/main/java/com/infoloop/tianting/service/client/SkuServiceRpcClient.java
View file @
05a3a9f
...
...
@@ -2,6 +2,7 @@ package com.infoloop.tianting.service.client;
import
com.infoloop.tianting.GeDishSkuByIdsRpcResponse
;
import
com.infoloop.tianting.GetSkusByIdsRpcRequest
;
import
com.infoloop.tianting.SingleSkuResponse
;
import
com.infoloop.tianting.SkuServiceProtoRpcGrpc
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -21,4 +22,12 @@ public class SkuServiceRpcClient {
.
build
();
return
skuServiceProtoRpcBlockingStub
.
getDishSkusByIds
(
request
);
}
public
List
<
SingleSkuResponse
>
getSkusByIds
(
List
<
Integer
>
ids
)
{
final
var
request
=
GetSkusByIdsRpcRequest
.
newBuilder
()
.
addAllIds
(
ids
)
.
setIncludeDeleted
(
false
)
.
build
();
return
skuServiceProtoRpcBlockingStub
.
getSkusByIds
(
request
).
getResponseList
();
}
}
...
...
src/main/java/com/infoloop/tianting/service/impl/LoginServiceImpl.java
View file @
05a3a9f
...
...
@@ -18,6 +18,9 @@ import lombok.extern.slf4j.Slf4j;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.security.MessageDigest
;
import
java.security.NoSuchAlgorithmException
;
@Slf4j
@Service
@RequiredArgsConstructor
(
onConstructor
=
@__
(
@Autowired
))
...
...
@@ -29,78 +32,82 @@ public class LoginServiceImpl implements LoginService {
private
final
WOperatorServiceRpcClient
wOperatorServiceRpcClient
;
@Override
public
SaTokenInfo
login
(
LoginDto
loginDto
)
{
public
SaTokenInfo
login
(
LoginDto
loginDto
)
throws
NoSuchAlgorithmException
{
if
(
loginDto
.
isShouldLoginWithOpenCode
())
{
final
var
wxUserOpenIdDto
=
wxMiniProgramHttpClient
.
getUserOpenIdByCode
(
loginDto
.
getOpenCode
());
StpUtil
.
login
(
wxUserOpenIdDto
.
getOpenid
(),
SaLoginModel
.
create
()
.
setExtra
(
CommonConstants
.
ENTERPRISE_ID
,
loginDto
.
getEnterpriseId
())
.
setExtra
(
CommonConstants
.
LOGIN_SOURCE
,
loginDto
.
getLoginSourceEnum
().
getValue
())
.
build
());
StpUtil
.
login
(
wxUserOpenIdDto
.
getOpenid
(),
SaLoginModel
.
create
()
.
setExtra
(
CommonConstants
.
ENTERPRISE_ID
,
loginDto
.
getEnterpriseId
())
.
setExtra
(
CommonConstants
.
LOGIN_SOURCE
,
loginDto
.
getLoginSourceEnum
().
getValue
())
.
build
());
return
StpUtil
.
getTokenInfo
();
}
else
if
(
loginDto
.
isShouldLoginWithHisCustomerId
())
{
var
customer
=
clientCustomerServiceRpcClient
.
getClientCustomerByHISCustomerId
(
loginDto
.
getHisCustomerId
())
.
getResponse
();
var
customer
=
clientCustomerServiceRpcClient
.
getClientCustomerByHISCustomerId
(
loginDto
.
getHisCustomerId
()).
getResponse
();
if
(
customer
.
getId
()
==
0
)
{
// 根据hisCustomerId拿不到用户的话再去根据合同号去his查一次,即认为是月子中心客户
customer
=
clientCustomerServiceRpcClient
.
getClientCustomerByContactNo
(
loginDto
.
getHisCustomerId
())
.
getResponse
();
customer
=
clientCustomerServiceRpcClient
.
getClientCustomerByContactNo
(
loginDto
.
getHisCustomerId
()).
getResponse
();
if
(
customer
.
getId
()
==
0
)
{
throw
ClientEndExceptions
.
IncorrectRequestValue
.
build
(
ErrorCodeEnum
.
VALIDATE_FAILED
.
name
());
}
else
{
var
record
=
clientCustomerServiceRpcClient
.
getClientCustomerHospitalRecordsByCustomerId
(
customer
.
getEnterpriseId
(),
customer
.
getId
());
if
(!
record
.
hasResponse
()
||
record
.
getResponse
().
getHospitalStatus
()
!=
ClientCustomerHospitalRecordHospitalStatusEnum
.
CURRENT
)
{
throw
ClientEndExceptions
.
IncorrectRequestValue
.
build
(
ErrorCodeEnum
.
VALIDATE_FAILED
.
name
());
var
record
=
clientCustomerServiceRpcClient
.
getClientCustomerHospitalRecordsByCustomerId
(
customer
.
getEnterpriseId
(),
customer
.
getId
());
if
(!
record
.
hasResponse
()
||
record
.
getResponse
().
getHospitalStatus
()
!=
ClientCustomerHospitalRecordHospitalStatusEnum
.
CURRENT
)
{
throw
ClientEndExceptions
.
IncorrectRequestValue
.
build
(
ErrorCodeEnum
.
VALIDATE_FAILED
.
name
());
}
}
}
else
{
var
record
=
clientCustomerServiceRpcClient
.
getClientCustomerHospitalRecordsByCustomerId
(
customer
.
getEnterpriseId
(),
customer
.
getId
());
if
(!
record
.
hasResponse
()
||
record
.
getResponse
().
getHospitalStatus
()
!=
ClientCustomerHospitalRecordHospitalStatusEnum
.
CURRENT
)
{
throw
ClientEndExceptions
.
IncorrectRequestValue
.
build
(
ErrorCodeEnum
.
VALIDATE_FAILED
.
name
());
}
}
StpUtil
.
login
(
customer
.
getId
(),
SaLoginModel
.
create
(
)
.
setExtra
(
CommonConstants
.
ENTERPRISE_ID
,
customer
.
getEnterpriseId
())
.
setExtra
(
CommonConstants
.
LOGIN_SOURCE
,
loginDto
.
getLoginSourceEnum
().
getValue
())
.
build
());
final
var
wxUserOpenIdDto
=
wxMiniProgramHttpClient
.
getUserOpenIdByCode
(
loginDto
.
getOpenCode
());
StpUtil
.
login
(
customer
.
getId
(),
SaLoginModel
.
create
()
.
setExtra
(
CommonConstants
.
ENTERPRISE_ID
,
customer
.
getEnterpriseId
()
)
.
setExtra
(
CommonConstants
.
LOGIN_SOURCE
,
loginDto
.
getLoginSourceEnum
().
getValue
())
.
setExtra
(
CommonConstants
.
OPEN_ID
,
wxUserOpenIdDto
.
getOpenid
())
.
build
());
return
StpUtil
.
getTokenInfo
();
}
else
if
(
loginDto
.
isShouldLoginWithOperatorPhone
())
{
final
var
operator
=
operatorServiceRpcClient
.
getCOperatorByMobileOrEmail
(
loginDto
.
getOperatorPhone
());
final
var
operator
=
operatorServiceRpcClient
.
getCOperatorByMobileOrEmail
(
loginDto
.
getOperatorPhone
());
if
(
operator
.
getId
()
==
0
)
{
throw
ClientEndExceptions
.
AuthenticationFailure
.
build
(
ErrorCodeEnum
.
UNAUTHORIZED
.
name
());
}
StpUtil
.
login
(
operator
.
getId
(),
SaLoginModel
.
create
()
if
(!
operator
.
getPassword
().
equals
(
sha1Hash
(
loginDto
.
getPassword
())))
{
throw
ClientEndExceptions
.
AuthenticationFailure
.
build
(
ErrorCodeEnum
.
VALIDATE_FAILED
.
name
());
}
StpUtil
.
login
(
operator
.
getId
(),
SaLoginModel
.
create
()
.
setExtra
(
CommonConstants
.
ENTERPRISE_ID
,
operator
.
getEnterpriseId
())
.
setExtra
(
CommonConstants
.
LOGIN_SOURCE
,
loginDto
.
getLoginSourceEnum
().
getValue
())
.
build
());
return
StpUtil
.
getTokenInfo
();
}
else
{
final
var
operator
=
wOperatorServiceRpcClient
.
getWOperatorByEmail
(
loginDto
.
getEmail
()).
getResponse
();
final
var
operator
=
wOperatorServiceRpcClient
.
getWOperatorByEmail
(
loginDto
.
getEmail
()).
getResponse
();
if
(
operator
.
getId
()
==
0
)
{
throw
ClientEndExceptions
.
AuthenticationFailure
.
build
(
ErrorCodeEnum
.
UNAUTHORIZED
.
name
());
}
// if (!operator.getPassword().equals(loginDto.getPassword())) {
// throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.VALIDATE_FAILED.name());
// }
StpUtil
.
login
(
operator
.
getId
(),
SaLoginModel
.
create
()
if
(!
operator
.
getPassword
().
equals
(
sha1Hash
(
loginDto
.
getPassword
())))
{
throw
ClientEndExceptions
.
AuthenticationFailure
.
build
(
ErrorCodeEnum
.
VALIDATE_FAILED
.
name
());
}
StpUtil
.
login
(
operator
.
getId
(),
SaLoginModel
.
create
()
.
setExtra
(
CommonConstants
.
ENTERPRISE_ID
,
operator
.
getEnterpriseId
())
.
setExtra
(
CommonConstants
.
LOGIN_SOURCE
,
loginDto
.
getLoginSourceEnum
().
getValue
())
.
build
());
return
StpUtil
.
getTokenInfo
();
}
}
public
static
String
sha1Hash
(
String
input
)
throws
NoSuchAlgorithmException
{
MessageDigest
md
=
MessageDigest
.
getInstance
(
"SHA-1"
);
md
.
update
(
input
.
getBytes
());
byte
[]
digest
=
md
.
digest
();
return
bytesToHex
(
digest
);
}
private
static
String
bytesToHex
(
byte
[]
bytes
)
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
byte
b
:
bytes
)
{
sb
.
append
(
String
.
format
(
"%02x"
,
b
));
}
return
sb
.
toString
();
}
}
...
...
src/main/java/com/infoloop/tianting/service/impl/MenuServiceImpl.java
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
service
.
impl
;
import
com.infoloop.tianting.context.LoginContextHolder
;
import
com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse
;
import
com.infoloop.tianting.menuservice.SingleMenuRpcResponse
;
import
com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsDto
;
import
com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsResponseDto
;
import
com.infoloop.tianting.model.dto.MenuDbDTO.DishRuleJson
;
...
...
@@ -197,4 +200,10 @@ public class MenuServiceImpl implements MenuService {
.
build
();
}
@Override
public
List
<
Integer
>
queryMenuSkuIdsByStallId
(
int
enterpriseId
,
int
stallId
)
{
final
var
menuIds
=
menuServiceRpcClient
.
queryPublishedMenusByStallId
(
LoginContextHolder
.
getEnterpriseId
(),
stallId
).
getResponsesList
().
stream
().
map
(
SingleMenuRpcResponse:
:
getId
).
collect
(
Collectors
.
toList
());
return
menuServiceRpcClient
.
queryMenuDetailsByMenuIds
(
LoginContextHolder
.
getEnterpriseId
(),
menuIds
).
getResponsesList
().
stream
().
map
(
SingleMenuDetailRpcResponse:
:
getSkuId
).
distinct
().
collect
(
Collectors
.
toList
());
}
}
...
...
src/main/java/com/infoloop/tianting/service/impl/OrderServiceImpl.java
View file @
05a3a9f
...
...
@@ -56,7 +56,6 @@ import lombok.extern.slf4j.Slf4j;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.time.LocalDate
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.stream.Collectors
;
...
...
@@ -93,8 +92,7 @@ public class OrderServiceImpl implements OrderService {
final
var
record
=
clientCustomerServiceRpcClient
.
getClientCustomerHospitalRecordsByCustomerId
(
customer
.
getEnterpriseId
(),
customer
.
getId
()).
getResponse
();
CreateOrderDto
createOrderDto
=
new
CreateOrderDto
();
createOrderDto
.
setShouldCreateCustomerId
(
true
);
createOrderDto
.
setShouldCreateOpenId
(
false
);
createOrderDto
.
setOpenId
(
""
);
createOrderDto
.
setTableCode
(
operatorCreateOrderDto
.
getTableCode
());
createOrderDto
.
setCustomerId
(
operatorCreateOrderDto
.
getCustomerId
());
createOrderDto
.
setStallId
(
operatorCreateOrderDto
.
getStallId
());
createOrderDto
.
setMenuId
(
operatorCreateOrderDto
.
getMenuId
());
...
...
@@ -111,16 +109,11 @@ public class OrderServiceImpl implements OrderService {
if
(
placeOrderCount
!=
0
&&
menuOrderCount
>=
placeOrderCount
)
{
throw
ClientEndExceptions
.
OperationForbidden
.
build
(
ErrorCodeEnum
.
ORDER_COUNT_LIMIT
.
name
());
}
createOrderDto
.
setCloseTimeType
(
CloseTimeType
.
forNumber
(
menu
.
getOrderRuleJson
().
getCloseTimeType
().
getNumber
()));
createOrderDto
.
setCloseTimeType
(
CloseTimeType
.
forNumber
(
menu
.
getOrderRuleJson
().
getCloseTimeType
().
getNumber
()));
createOrderDto
.
setRoomNo
(
record
.
getRoomNo
());
createOrderDto
.
setCreationSource
(
OrderSourceEnum
.
STALL
.
getNumber
());
createOrderDto
.
setEnterpriseId
(
operatorLoginInfo
.
getEnterpriseId
());
// createOrderDto.setStallId();
var
onlinePay
=
false
;
if
(
menu
.
getOrderRuleJson
().
getModeOfPayment
()
==
ModeOfPaymentEnum
.
ONLINE
)
{
onlinePay
=
true
;
}
var
onlinePay
=
menu
.
getOrderRuleJson
().
getModeOfPayment
()
==
ModeOfPaymentEnum
.
ONLINE
;
createOrderDto
.
setOnlinePay
(
onlinePay
);
OrderTypeEnum
orderType
;
if
(
menu
.
getOrderRuleJson
().
getCloseTimeType
()
==
CloseTimeTypeEnum
.
RESERVATION
)
{
...
...
@@ -130,7 +123,6 @@ public class OrderServiceImpl implements OrderService {
}
createOrderDto
.
setOrderType
(
orderType
.
getNumber
());
createOrderDto
.
setShouldCreateCustomerId
(
true
);
createOrderDto
.
setShouldCreateOpenId
(
false
);
final
var
labelRefs
=
clientCustomerServiceRpcClient
.
getCustomerLabelsByCustomerId
(
customer
.
getEnterpriseId
(),
customer
.
getId
()).
getResponsesList
();
final
var
labelIds
=
labelRefs
.
stream
().
map
(
SingleClientCustomerLabelRefRpcResponse:
:
getLabelId
).
collect
(
Collectors
.
toList
());
...
...
@@ -160,14 +152,11 @@ public class OrderServiceImpl implements OrderService {
.
doctors
(
Stream
.
of
(
doctors
,
dietDoctors
).
flatMap
(
List:
:
stream
).
collect
(
Collectors
.
toList
()))
.
build
();
createOrderDto
.
setCustomerNoticeJson
(
customerNotice
);
createOrderDto
.
setTableCode
(
""
);
createOrderDto
.
setUpdatedBy
(
operatorLoginInfo
.
getId
());
createOrderDto
.
setUpdateSource
(
OrderSourceEnum
.
STALL
.
getNumber
());
List
<
CreateOrderDetailDto
>
orderDetailDtoList
=
new
ArrayList
<>();
final
var
menuDetails
=
menuServiceRpcClient
.
queryMenuDetailsByMenuId
(
menu
.
getEnterpriseId
(),
operatorCreateOrderDto
.
getMenuId
()).
getResponsesList
();
final
var
skuIds
=
menuDetails
.
stream
()
final
var
skuIds
=
menuDetails
.
stream
()
.
map
(
SingleMenuDetailRpcResponse:
:
getSkuId
)
.
collect
(
Collectors
.
toList
());
final
var
rpcSkus
=
skuServiceRpcClient
.
getDishSkusByIds
(
skuIds
).
getResponseList
();
...
...
@@ -231,8 +220,7 @@ public class OrderServiceImpl implements OrderService {
}
@Override
public
BatchUpdateOrderDetailResponse
batchUpdateOrderDetails
(
OrderDetailBatchUpdateDto
batchUpdateDto
)
{
public
BatchUpdateOrderDetailResponse
batchUpdateOrderDetails
(
OrderDetailBatchUpdateDto
batchUpdateDto
)
{
final
var
response
=
orderServiceRpcClient
.
batchUpdateClientCustomerOrderDetails
(
batchUpdateDto
);
return
BatchUpdateOrderDetailResponse
.
builder
()
.
isUpdated
(
response
.
getIsUpdated
())
...
...
@@ -243,7 +231,7 @@ public class OrderServiceImpl implements OrderService {
public
Integer
getMenuOrderCount
(
getMenuOrderCountDto
checkIfOrdered
)
{
final
var
operatorLoginInfo
=
LoginContextHolder
.
getLoginInfo
();
final
var
mealTimeStart
=
checkIfOrdered
.
getMealTime
().
toLocalDate
().
atStartOfDay
();
LocalDate
tomorrow
=
checkIfOrdered
.
getMealTime
().
toLocalDate
().
plusDays
(
1
);
final
var
tomorrow
=
checkIfOrdered
.
getMealTime
().
toLocalDate
().
plusDays
(
1
);
final
var
mealTimeEnd
=
tomorrow
.
atStartOfDay
();
final
var
queryOrderDto
=
QueryOrderByConditionDto
.
builder
()
.
enterpriseId
(
operatorLoginInfo
.
getEnterpriseId
())
...
...
@@ -265,6 +253,10 @@ public class OrderServiceImpl implements OrderService {
@Override
public
List
<
OrderDetailDto
>
getOrderDetailsByOrderId
(
Integer
orderId
)
{
final
var
orderById
=
orderServiceRpcClient
.
getOrderById
(
orderId
);
if
(
orderById
==
null
)
{
return
List
.
of
();
}
final
var
responseList
=
orderServiceRpcClient
.
getOrderDetailsByOrderId
(
orderId
);
return
responseList
.
stream
().
map
(
d
->
OrderDetailDto
.
builder
()
...
...
@@ -276,6 +268,8 @@ public class OrderServiceImpl implements OrderService {
.
orderId
(
d
.
getOrderId
())
.
price
(
d
.
getPrice
())
.
showName
(
d
.
getShowName
())
.
status
(
orderById
.
getStatus
())
.
payStatus
(
orderById
.
getPayStatus
())
.
mealDetailJson
(
MealDetailDto
.
builder
()
.
allergies
(
d
.
getMealDetailJson
().
getAllergiesList
())
.
basicMaterials
(
d
.
getMealDetailJson
().
getBasicMaterials
())
...
...
src/main/java/com/infoloop/tianting/service/impl/SkuServiceImpl.java
View file @
05a3a9f
package
com
.
infoloop
.
tianting
.
service
.
impl
;
import
com.infoloop.tianting.SingleSkuResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleSkuSellQuantityRpcResponse
;
import
com.infoloop.tianting.context.LoginContextHolder
;
import
com.infoloop.tianting.enums.SkuSellQuantityStatus
;
import
com.infoloop.tianting.model.bo.SkuSellQuantityBO
;
import
com.infoloop.tianting.model.common.PageResult
;
import
com.infoloop.tianting.model.dto.SkuDbDTO.SkuDetailSingleResponseDto
;
import
com.infoloop.tianting.model.dto.SkuDbDTO.SkuDto
;
import
com.infoloop.tianting.model.dto.SkuDbDTO.SkuSpecialDetailSingleResponseDto
;
import
com.infoloop.tianting.model.dto.SkuSellQuantityDTO
;
import
com.infoloop.tianting.model.vo.SkuSellQuantityStatisticsVO
;
import
com.infoloop.tianting.model.vo.SkuSellQuantityVO
;
import
com.infoloop.tianting.service.MenuService
;
import
com.infoloop.tianting.service.SkuService
;
import
com.infoloop.tianting.service.client.OrderServiceRpcClient
;
import
com.infoloop.tianting.service.client.SkuServiceRpcClient
;
import
com.infoloop.tianting.utils.DateUtil
;
import
com.infoloop.tianting.utils.PageUtil
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.Comparator
;
import
java.util.List
;
import
java.util.function.Function
;
import
java.util.stream.Collectors
;
@Slf4j
@Service
@RequiredArgsConstructor
(
onConstructor
=
@__
(
@Autowired
))
public
class
SkuServiceImpl
implements
SkuService
{
private
final
MenuService
menuService
;
private
final
SkuServiceRpcClient
skuServiceRpcClient
;
private
final
OrderServiceRpcClient
orderServiceRpcClient
;
@Override
public
List
<
SkuDto
>
getSkusByIds
(
List
<
Integer
>
ids
)
{
final
var
response
=
skuServiceRpcClient
.
getDishSkusByIds
(
ids
);
...
...
@@ -56,4 +75,133 @@ public class SkuServiceImpl implements SkuService {
.
build
()
).
collect
(
Collectors
.
toList
());
}
@Override
public
SkuSellQuantityStatisticsVO
querySkuSellQuantityStatistics
(
int
stallId
)
{
final
var
skuIds
=
menuService
.
queryMenuSkuIdsByStallId
(
LoginContextHolder
.
getEnterpriseId
(),
stallId
);
final
var
responses
=
orderServiceRpcClient
.
querySkuSellQuantitiesByStall
(
LoginContextHolder
.
getEnterpriseId
(),
stallId
);
final
var
skuSellQuantitiesMap
=
responses
.
stream
().
collect
(
Collectors
.
toMap
(
SingleSkuSellQuantityRpcResponse:
:
getSkuId
,
Function
.
identity
()));
final
var
soldOut
=
skuIds
.
stream
()
.
filter
(
e
->
skuSellQuantitiesMap
.
get
(
e
)
==
null
||
skuSellQuantitiesMap
.
get
(
e
).
getMaxSellQuantity
()
==
skuSellQuantitiesMap
.
get
(
e
).
getTodaySellQuantity
())
.
count
();
final
int
total
=
skuIds
.
size
();
return
SkuSellQuantityStatisticsVO
.
builder
()
.
total
(
total
)
.
soldOut
(
soldOut
)
.
onSale
(
total
-
soldOut
)
.
build
();
}
@Override
public
PageResult
<
SkuSellQuantityVO
>
querySkuSellQuantity
(
SkuSellQuantityDTO
.
QuerySkuSellQuantityDTO
querySkuSellQuantityDTO
)
{
final
var
stallId
=
querySkuSellQuantityDTO
.
getStallId
();
final
var
enterpriseId
=
LoginContextHolder
.
getEnterpriseId
();
final
var
skuIds
=
menuService
.
queryMenuSkuIdsByStallId
(
enterpriseId
,
stallId
);
var
responses
=
orderServiceRpcClient
.
querySkuSellQuantitiesByStall
(
enterpriseId
,
stallId
);
final
var
skuSellQuantityMap
=
responses
.
stream
().
collect
(
Collectors
.
toMap
(
SingleSkuSellQuantityRpcResponse:
:
getSkuId
,
Function
.
identity
()));
responses
=
skuIds
.
stream
()
.
map
(
skuId
->
{
var
response
=
skuSellQuantityMap
.
get
(
skuId
);
if
(
response
==
null
)
{
response
=
SingleSkuSellQuantityRpcResponse
.
newBuilder
()
.
setSkuId
(
skuId
)
.
setMaxSellQuantity
(
0
)
.
setTodaySellQuantity
(
0
)
.
build
();
}
return
response
;
})
.
collect
(
Collectors
.
toList
());
if
(
querySkuSellQuantityDTO
.
getStatus
()
!=
SkuSellQuantityStatus
.
ALL
)
{
responses
=
responses
.
stream
()
.
filter
(
e
->
{
switch
(
querySkuSellQuantityDTO
.
getStatus
())
{
case
SOLD_OUT:
return
e
.
getMaxSellQuantity
()
==
e
.
getTodaySellQuantity
();
case
ON_SALE:
return
e
.
getMaxSellQuantity
()
!=
e
.
getTodaySellQuantity
();
default
:
return
true
;
}
})
.
collect
(
Collectors
.
toList
());
}
final
var
skuList
=
skuServiceRpcClient
.
getSkusByIds
(
responses
.
stream
().
map
(
SingleSkuSellQuantityRpcResponse:
:
getSkuId
).
collect
(
Collectors
.
toList
()));
final
var
skuMap
=
skuList
.
stream
().
collect
(
Collectors
.
toMap
(
SingleSkuResponse:
:
getId
,
Function
.
identity
()));
final
var
keyword
=
querySkuSellQuantityDTO
.
getKeyword
();
if
(
keyword
!=
null
&&
!
keyword
.
isEmpty
())
{
responses
=
responses
.
stream
()
.
filter
(
e
->
{
var
sku
=
skuMap
.
get
(
e
.
getSkuId
());
return
sku
!=
null
&&
(
sku
.
getCode
().
contains
(
keyword
)
||
sku
.
getName
().
contains
(
keyword
));
})
.
collect
(
Collectors
.
toList
());
}
final
var
skuSellQuantityVOS
=
responses
.
stream
()
.
map
(
e
->
{
var
sku
=
skuMap
.
get
(
e
.
getSkuId
());
return
SkuSellQuantityVO
.
builder
()
.
skuId
(
e
.
getSkuId
())
.
skuName
(
sku
!=
null
?
sku
.
getName
()
:
""
)
.
skuCode
(
sku
!=
null
?
sku
.
getCode
()
:
""
)
.
maxSellQuantity
(
e
.
getMaxSellQuantity
())
.
todaySellQuantity
(
e
.
getTodaySellQuantity
())
.
soldOut
(
e
.
getMaxSellQuantity
()
==
e
.
getTodaySellQuantity
())
.
build
();
})
.
sorted
(
Comparator
.
comparing
(
SkuSellQuantityVO:
:
getSkuCode
))
.
collect
(
Collectors
.
toList
());
return
PageUtil
.
subListPage
(
skuSellQuantityVOS
,
querySkuSellQuantityDTO
.
getPageNo
(),
querySkuSellQuantityDTO
.
getPageSize
());
}
@Override
public
boolean
batchSetSkuSellQuantity
(
int
stallId
,
SkuSellQuantityDTO
.
BatchSetSkuSellQuantityDTO
batchSetSkuSellQuantityDTO
)
{
final
var
responses
=
orderServiceRpcClient
.
querySkuSellQuantitiesByStallAndSkuIds
(
LoginContextHolder
.
getEnterpriseId
(),
stallId
,
batchSetSkuSellQuantityDTO
.
getSkuIds
());
final
var
skuMap
=
responses
.
stream
().
collect
(
Collectors
.
toMap
(
SingleSkuSellQuantityRpcResponse:
:
getSkuId
,
Function
.
identity
()));
final
var
skuSellQuantityBOs
=
batchSetSkuSellQuantityDTO
.
getSkuIds
().
stream
().
map
(
skuId
->
SkuSellQuantityBO
.
builder
()
.
id
(
skuMap
.
get
(
skuId
)
==
null
?
null
:
skuMap
.
get
(
skuId
).
getId
())
.
skuId
(
skuId
)
.
maxSellQuantity
(
batchSetSkuSellQuantityDTO
.
getMaxSellQuantity
())
.
build
()
).
collect
(
Collectors
.
toList
());
return
orderServiceRpcClient
.
batchSaveSkuSellQuantities
(
LoginContextHolder
.
getEnterpriseId
(),
stallId
,
skuSellQuantityBOs
);
}
@Override
public
List
<
SkuSellQuantityVO
>
querySkuSellQuantityBySkuIds
(
SkuSellQuantityDTO
.
QuerySkuSellQuantityBySkuIdsDTO
querySkuSellQuantityBySkuIdsDTO
)
{
final
var
stallId
=
querySkuSellQuantityBySkuIdsDTO
.
getStallId
();
final
var
enterpriseId
=
LoginContextHolder
.
getEnterpriseId
();
final
var
skuIds
=
menuService
.
queryMenuSkuIdsByStallId
(
enterpriseId
,
stallId
);
var
responses
=
orderServiceRpcClient
.
querySkuSellQuantitiesByStall
(
enterpriseId
,
stallId
);
final
var
skuSellQuantityMap
=
responses
.
stream
().
collect
(
Collectors
.
toMap
(
SingleSkuSellQuantityRpcResponse:
:
getSkuId
,
Function
.
identity
()));
responses
=
skuIds
.
stream
()
.
map
(
skuId
->
{
var
response
=
skuSellQuantityMap
.
get
(
skuId
);
if
(
response
==
null
)
{
response
=
SingleSkuSellQuantityRpcResponse
.
newBuilder
()
.
setSkuId
(
skuId
)
.
setMaxSellQuantity
(
0
)
.
setTodaySellQuantity
(
0
)
.
build
();
}
return
response
;
})
.
collect
(
Collectors
.
toList
());
final
var
skuList
=
skuServiceRpcClient
.
getSkusByIds
(
responses
.
stream
().
map
(
SingleSkuSellQuantityRpcResponse:
:
getSkuId
).
collect
(
Collectors
.
toList
()));
final
var
skuMap
=
skuList
.
stream
().
collect
(
Collectors
.
toMap
(
SingleSkuResponse:
:
getId
,
Function
.
identity
()));
return
responses
.
stream
()
.
map
(
e
->
{
var
sku
=
skuMap
.
get
(
e
.
getSkuId
());
return
SkuSellQuantityVO
.
builder
()
.
skuId
(
e
.
getSkuId
())
.
skuName
(
sku
!=
null
?
sku
.
getName
()
:
""
)
.
skuCode
(
sku
!=
null
?
sku
.
getCode
()
:
""
)
.
maxSellQuantity
(
e
.
getMaxSellQuantity
())
.
todaySellQuantity
(
e
.
getTodaySellQuantity
())
.
soldOut
(
e
.
getMaxSellQuantity
()
==
e
.
getTodaySellQuantity
())
.
build
();
})
.
sorted
(
Comparator
.
comparing
(
SkuSellQuantityVO:
:
getSkuCode
))
.
collect
(
Collectors
.
toList
());
}
}
...
...
src/main/java/com/infoloop/tianting/utils/PageUtil.java
View file @
05a3a9f
...
...
@@ -2,13 +2,23 @@ package com.infoloop.tianting.utils;
import
com.infoloop.tianting.model.common.OrderPageResult
;
import
com.infoloop.tianting.model.common.PageResult
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.OrderCountByStatusDto
;
import
java.util.LinkedList
;
import
java.util.List
;
public
class
PageUtil
{
public
static
<
T
>
PageResult
<
T
>
buildEmpty
(
T
t
)
{
PageResult
<
T
>
pageRet
=
new
PageResult
<>();
pageRet
.
setTotalCount
(
0
);
pageRet
.
setDataList
(
List
.
of
(
t
));
pageRet
.
setPageNo
(
0
);
pageRet
.
setPageSize
(
0
);
pageRet
.
setTotalPage
(
0
);
return
pageRet
;
}
/**
* 自定义分页
*/
...
...
src/main/proto/ClientCustomerOrderService.proto
View file @
05a3a9f
...
...
@@ -33,6 +33,14 @@ service ClientCustomerOrderServiceRpc {
// 操作记录
rpc
GetOrderOperationRecordsByOrderId
(
GetOrderOperationRecordsByOrderIdRequest
)
returns
(
GetOrderOperationRecordsByOrderIdResponse
)
{}
rpc
BatchCreateOrderOperationRecords
(
BatchCreateOrderOperationRecordsRequest
)
returns
(
BatchCreateOrderOperationRecordsResponse
)
{}
// sku菜品库存
rpc
QuerySkuSellQuantitiesByStall
(
QuerySkuSellQuantitiesByStallRpcRequest
)
returns
(
QuerySkuSellQuantitiesByStallRpcResponse
)
{}
rpc
QuerySkuSellQuantitiesByStallAndSkuIds
(
QuerySkuSellQuantitiesByStallAndSkuIdsRpcRequest
)
returns
(
QuerySkuSellQuantitiesByStallAndSkuIdsRpcResponse
)
{}
rpc
BatchSaveSkuSellQuantities
(
BatchSaveSkuSellQuantitiesRpcRequest
)
returns
(
BatchSaveSkuSellQuantitiesRpcResponse
)
{}
rpc
AddSkusSellQuantities
(
AddSkusSellQuantitiesRpcRequest
)
returns
(
AddSkusSellQuantitiesRpcResponse
)
{}
}
enum
OrderStatusEnum
{
...
...
@@ -608,3 +616,71 @@ message BatchCreateOrderOperationRecordsResponse {
bool
isCreated
=
1
;
repeated
int32
ids
=
2
;
}
message
SingleSkuSellQuantityRpcResponse
{
int32
id
=
1
;
int32
enterpriseId
=
2
;
int32
stallId
=
3
;
int32
skuId
=
4
;
int32
maxSellQuantity
=
5
;
int32
todaySellQuantity
=
6
;
int32
createdBy
=
7
;
int64
createdAt
=
8
;
int32
creationSource
=
9
;
int32
updatedBy
=
10
;
int64
updatedAt
=
11
;
int32
updateSource
=
12
;
bool
isDeleted
=
13
;
}
message
QuerySkuSellQuantitiesByStallRpcRequest
{
int32
enterpriseId
=
1
;
int32
stallId
=
2
;
}
message
QuerySkuSellQuantitiesByStallRpcResponse
{
repeated
SingleSkuSellQuantityRpcResponse
responses
=
1
;
}
message
QuerySkuSellQuantitiesByStallAndSkuIdsRpcRequest
{
int32
enterpriseId
=
1
;
int32
stallId
=
2
;
repeated
int32
skuIds
=
3
;
}
message
QuerySkuSellQuantitiesByStallAndSkuIdsRpcResponse
{
repeated
SingleSkuSellQuantityRpcResponse
responses
=
1
;
}
message
BatchSaveSkuSellQuantitiesRpcRequest
{
repeated
SkuSellQuantityModification
skuSellQuantityModifications
=
1
;
int32
enterpriseId
=
2
;
int32
updatedBy
=
3
;
int32
updateSource
=
4
;
}
message
SkuSellQuantityModification
{
int32
id
=
1
;
int32
stallId
=
2
;
int32
skuId
=
3
;
int32
maxSellQuantity
=
4
;
}
message
BatchSaveSkuSellQuantitiesRpcResponse
{
bool
isSaved
=
1
;
}
message
AddSkusSellQuantitiesRpcRequest
{
int32
enterpriseId
=
1
;
int32
stallId
=
2
;
repeated
SkuSellQuantity
skuSellQuantities
=
3
;
}
message
SkuSellQuantity
{
int32
skuId
=
1
;
int32
quantity
=
2
;
}
message
AddSkusSellQuantitiesRpcResponse
{
bool
isAdded
=
1
;
}
...
...
src/main/resources/application.properties
View file @
05a3a9f
...
...
@@ -75,7 +75,8 @@ miniprogram.appSecret=5b309517bf918abf760b2195e91b99f3
business-
config.hisCustomerQueryUrl
=
https://nutri.amcare.com.cn/v3/hiscustomers/current/query
business-
config.clientCustomerQueryUrl
=
https://nutri.amcare.com.cn/v3/clientcustomers/current/query
business-
config.payUrl
=
http://10.2.5.162:21051/API/Microapp/CreateOrder?appid=Order0001
business-
config.payUrl
=
http://10.2.5.162:21051/API/Microapp/CreateOrder?appid={0}
business-
config.payClientId
=
Order
##Actuator\u914D\u7F6E
management.server.port
=
8088
...
...
Please
register
or
login
to post a comment