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
wangyingyang
2024-12-07 19:26:09 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
07f1c6680fdf9d2185dcbc4bc0ee5eae710d0026
07f1c668
1 parent
405dfbde
fix
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
256 additions
and
56 deletions
src/main/java/com/infoloop/tianting/controller/ClientCustomerController.java
src/main/java/com/infoloop/tianting/controller/OrderController.java
src/main/java/com/infoloop/tianting/exception/ErrorCodeEnum.java
src/main/java/com/infoloop/tianting/model/dto/OrderDbDTO.java
src/main/java/com/infoloop/tianting/model/dto/SettlementDTO.java
src/main/java/com/infoloop/tianting/service/ClientCustomerService.java
src/main/java/com/infoloop/tianting/service/OrderService.java
src/main/java/com/infoloop/tianting/service/client/OrderServiceRpcClient.java
src/main/java/com/infoloop/tianting/service/impl/ClientCustomerServiceImpl.java
src/main/java/com/infoloop/tianting/service/impl/KdsServiceImpl.java
src/main/java/com/infoloop/tianting/service/impl/OrderServiceImpl.java
src/main/java/com/infoloop/tianting/service/impl/SettlementServiceImpl.java
src/main/java/com/infoloop/tianting/streamController/SettlementController.java
src/main/java/com/infoloop/tianting/utils/DateUtil.java
src/main/java/com/infoloop/tianting/controller/ClientCustomerController.java
View file @
07f1c66
...
...
@@ -67,14 +67,14 @@ public class ClientCustomerController {
@GetMapping
(
"/clientCustomers/today/statistic"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
TodayOrderDto
getClientCustomerTodayOrderStatistic
(
@RequestParam
String
customerToken
)
{
return
clientCustomerService
.
getTodayOrderStatistic
(
customerToken
,
false
);
return
clientCustomerService
.
getTodayOrderStatistic
(
customerToken
);
}
@ApiOperation
(
value
=
"获取his今日在住"
)
@GetMapping
(
"/hisClientCustomers/today/statistic"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
TodayOrderDto
getHisClientCustomerTodayOrderStatistic
(
@RequestParam
String
customerToken
)
{
return
clientCustomerService
.
getTodayOrderStatistic
(
customerToken
,
true
);
return
clientCustomerService
.
getTodayOrderStatistic
ForHis
(
customerToken
);
}
}
...
...
src/main/java/com/infoloop/tianting/controller/OrderController.java
View file @
07f1c66
...
...
@@ -15,6 +15,7 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse;
import
com.infoloop.tianting.service.OrderService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.models.auth.In
;
import
java.util.List
;
import
javax.validation.Valid
;
import
lombok.RequiredArgsConstructor
;
...
...
@@ -98,12 +99,12 @@ public class OrderController {
return
orderService
.
batchUpdateOrderDetails
(
updateDto
);
}
@ApiOperation
(
value
=
"
检查是否预定过该餐单
"
)
@ApiOperation
(
value
=
"
获取已预定该餐单的次数
"
)
@PostMapping
(
"/order/check"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
Boolean
checkOrder
(
@Valid
@RequestBody
OrderDbDTO
.
CheckIfOrdered
Dto
checkIfOrderedDto
)
{
return
orderService
.
checkIfOrdered
(
checkIfOrderedDto
);
public
Integer
checkOrder
(
@Valid
@RequestBody
OrderDbDTO
.
getMenuOrderCount
Dto
checkIfOrderedDto
)
{
return
orderService
.
getMenuOrderCount
(
checkIfOrderedDto
);
}
}
...
...
src/main/java/com/infoloop/tianting/exception/ErrorCodeEnum.java
View file @
07f1c66
...
...
@@ -26,6 +26,7 @@ public enum ErrorCodeEnum implements BaseEnum {
GENERATE_EXCEL_ERROR
(
406000004
,
"生成excel失败"
),
ORDER_COUNT_LIMIT
(
406000005
,
"已超过该餐单预定次数"
),
;
private
final
int
code
;
...
...
src/main/java/com/infoloop/tianting/model/dto/OrderDbDTO.java
View file @
07f1c66
...
...
@@ -575,7 +575,7 @@ public class OrderDbDTO {
@Builder
@ToString
@ApiModel
(
description
=
"检查是否已预定过某一餐单"
)
public
static
class
CheckIfOrdered
Dto
{
public
static
class
getMenuOrderCount
Dto
{
private
Integer
customerId
;
private
Integer
menuId
;
private
LocalDateTime
mealTime
;
...
...
src/main/java/com/infoloop/tianting/model/dto/SettlementDTO.java
View file @
07f1c66
...
...
@@ -2,6 +2,8 @@ package com.infoloop.tianting.model.dto;
import
com.infoloop.tianting.enums.SettlementDimensionEnum
;
import
io.swagger.annotations.ApiModel
;
import
java.util.ArrayList
;
import
java.util.Map
;
import
lombok.Builder
;
import
lombok.Data
;
...
...
@@ -17,9 +19,14 @@ public class SettlementDTO {
@ApiModel
(
description
=
"SettlementRequestDto"
)
public
static
class
SettlementRequestDto
{
private
int
enterpriseId
;
@Builder
.
Default
private
int
enterpriseId
=
0
;
private
List
<
Integer
>
stallIds
;
@Builder
.
Default
private
List
<
Integer
>
stallIds
=
new
ArrayList
<>();
@Builder
.
Default
private
int
clientId
=
0
;
private
SettlementDimensionEnum
dimension
;
...
...
@@ -32,13 +39,23 @@ public class SettlementDTO {
@Builder
@ApiModel
(
description
=
"SettlementRequestDto"
)
public
static
class
SettlementMenuSkuDto
{
private
String
skuCode
;
private
String
showName
;
private
Integer
count
;
private
Integer
price
;
private
Integer
totalPrice
;
}
@Data
@Builder
@ApiModel
(
description
=
"SettlementRequestDto"
)
public
static
class
SettlementDataDto
{
private
String
client
;
private
String
startTime
;
private
String
endTime
;
private
Map
<
String
,
Map
<
String
,
List
<
SettlementMenuSkuDto
>>>
classifyOrders
;
}
}
...
...
src/main/java/com/infoloop/tianting/service/ClientCustomerService.java
View file @
07f1c66
...
...
@@ -28,6 +28,8 @@ public interface ClientCustomerService {
BatchDeleteCustomerLabelRefResponseDto
deleteClientCustomerLabelRefsByIds
(
BatchDeleteCustomerLabelRefRequestDto
deleteRequestDto
);
TodayOrderDto
getTodayOrderStatistic
(
String
token
,
boolean
isHis
);
TodayOrderDto
getTodayOrderStatistic
(
String
token
);
TodayOrderDto
getTodayOrderStatisticForHis
(
String
token
);
}
...
...
src/main/java/com/infoloop/tianting/service/OrderService.java
View file @
07f1c66
...
...
@@ -3,7 +3,7 @@ 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.
CheckIfOrdered
Dto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.
getMenuOrderCount
Dto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.OperatorCreateOrderDto
;
...
...
@@ -26,5 +26,5 @@ public interface OrderService {
CreateOrderResponse
orderCreation
(
OperatorCreateOrderDto
createOrderDto
);
UpdateOrderResponse
updateOrder
(
UpdateOrderDto
updateOrderDto
);
BatchUpdateOrderDetailResponse
batchUpdateOrderDetails
(
OrderDetailBatchUpdateDto
batchUpdateDto
);
Boolean
checkIfOrdered
(
CheckIfOrdered
Dto
checkIfOrdered
);
Integer
getMenuOrderCount
(
getMenuOrderCount
Dto
checkIfOrdered
);
}
...
...
src/main/java/com/infoloop/tianting/service/client/OrderServiceRpcClient.java
View file @
07f1c66
...
...
@@ -77,7 +77,7 @@ public class OrderServiceRpcClient {
.
setMealTimeEnd
(
queryOrderDto
.
getMealTimeEnd
().
toInstant
(
ZoneOffset
.
UTC
).
toEpochMilli
())
.
setShouldFilterCreatedAtStart
(
queryOrderDto
.
getShouldFilterCreatedAtTimeStart
())
.
setCreatedAtStart
(
queryOrderDto
.
getCreatedAtTimeStart
().
toInstant
(
ZoneOffset
.
UTC
).
toEpochMilli
())
.
setShouldFilterCreatedAt
Start
(
queryOrderDto
.
getShouldFilterCreatedAtTimeEnd
())
.
setShouldFilterCreatedAt
End
(
queryOrderDto
.
getShouldFilterCreatedAtTimeEnd
())
.
setCreatedAtEnd
(
queryOrderDto
.
getCreatedAtTimeEnd
().
toInstant
(
ZoneOffset
.
UTC
).
toEpochMilli
())
.
setShouldFilterClientIds
(
queryOrderDto
.
getShouldFilterClientIds
())
.
addAllClientIds
(
queryOrderDto
.
getClientIds
())
...
...
src/main/java/com/infoloop/tianting/service/impl/ClientCustomerServiceImpl.java
View file @
07f1c66
...
...
@@ -282,31 +282,16 @@ public class ClientCustomerServiceImpl implements ClientCustomerService {
// }
@Override
public
TodayOrderDto
getTodayOrderStatistic
(
String
token
,
boolean
isHis
)
{
public
TodayOrderDto
getTodayOrderStatistic
(
String
token
)
{
List
<
CurrentClientCustomerDto
>
currentCustomers
=
new
ArrayList
<>();
List
<
Integer
>
customerIds
=
new
ArrayList
<>();
// 没有找到clientCustomer的hisCustomerIds
List
<
CurrentClientCustomerDto
>
notOrderedHisCustomers
=
new
ArrayList
<>();
if
(
isHis
){
currentCustomers
=
clientCustomerServiceHttpClient
.
getCurrentClientCustomer
(
token
,
true
);
final
var
hisCustomerIds
=
currentCustomers
.
stream
().
map
(
CurrentClientCustomerDto:
:
getId
).
distinct
()
.
collect
(
Collectors
.
toList
());
final
var
currentClientCustomers
=
clientCustomerServiceRpcClient
.
getClientCustomersByHISCustomerIds
(
hisCustomerIds
).
getResponsesList
();
customerIds
=
currentClientCustomers
.
stream
().
map
(
SingleClientCustomerRpcResponse:
:
getId
).
distinct
().
collect
(
Collectors
.
toList
());
final
var
mappingHisCustomerIds
=
currentClientCustomers
.
stream
().
map
(
SingleClientCustomerRpcResponse:
:
getHISCustomerId
).
collect
(
Collectors
.
toList
());
// final var notOrderedHisCustomerIds = hisCustomerIds.stream().filter(i -> !mappingHisCustomerIds.contains(i)).collect(Collectors.toList());
notOrderedHisCustomers
=
currentCustomers
.
stream
().
filter
(
c
->
!
mappingHisCustomerIds
.
contains
(
c
.
getId
())).
collect
(
Collectors
.
toList
());
}
else
{
currentCustomers
=
clientCustomerServiceHttpClient
.
getCurrentClientCustomer
(
token
,
false
);
currentCustomers
=
clientCustomerServiceHttpClient
.
getCurrentClientCustomer
(
token
,
false
);
customerIds
=
currentCustomers
.
stream
().
map
(
CurrentClientCustomerDto:
:
getId
).
map
(
id
->
{
try
{
return
Integer
.
valueOf
(
id
);
}
catch
(
NumberFormatException
e
)
{
return
null
;
}
}).
filter
(
Objects:
:
nonNull
).
distinct
().
collect
(
Collectors
.
toList
());
}
if
(
customerIds
.
isEmpty
())
{
return
TodayOrderDto
.
builder
()
...
...
@@ -400,8 +385,129 @@ public class ClientCustomerServiceImpl implements ClientCustomerService {
.
build
();
resNotOrderCustomers
.
add
(
resNotOrderCustomer
);
}
if
(
isHis
)
{
for
(
CurrentClientCustomerDto
currentClientCustomer:
notOrderedHisCustomers
)
{
return
TodayOrderDto
.
builder
()
.
totalCurrentCustomerCount
(
currentCustomers
.
size
())
.
notOrderCustomers
(
resNotOrderCustomers
)
.
build
();
}
@Override
public
TodayOrderDto
getTodayOrderStatisticForHis
(
String
token
)
{
List
<
CurrentClientCustomerDto
>
currentCustomers
=
new
ArrayList
<>();
List
<
Integer
>
customerIds
=
new
ArrayList
<>();
// 没有找到clientCustomer的hisCustomerIds
List
<
CurrentClientCustomerDto
>
notOrderedHisCustomers
=
new
ArrayList
<>();
currentCustomers
=
clientCustomerServiceHttpClient
.
getCurrentClientCustomer
(
token
,
true
);
final
var
hisCustomerIds
=
currentCustomers
.
stream
().
map
(
CurrentClientCustomerDto:
:
getId
).
distinct
()
.
collect
(
Collectors
.
toList
());
final
var
currentClientCustomers
=
clientCustomerServiceRpcClient
.
getClientCustomersByHISCustomerIds
(
hisCustomerIds
).
getResponsesList
();
customerIds
=
currentClientCustomers
.
stream
().
map
(
SingleClientCustomerRpcResponse:
:
getId
).
distinct
().
collect
(
Collectors
.
toList
());
final
var
mappingHisCustomerIds
=
currentClientCustomers
.
stream
().
map
(
SingleClientCustomerRpcResponse:
:
getHISCustomerId
).
collect
(
Collectors
.
toList
());
// final var notOrderedHisCustomerIds = hisCustomerIds.stream().filter(i -> !mappingHisCustomerIds.contains(i)).collect(Collectors.toList());
notOrderedHisCustomers
=
currentCustomers
.
stream
().
filter
(
c
->
!
mappingHisCustomerIds
.
contains
(
c
.
getId
())).
collect
(
Collectors
.
toList
());
if
(
customerIds
.
isEmpty
())
{
return
TodayOrderDto
.
builder
()
.
totalCurrentCustomerCount
(
0
)
.
notOrderCustomers
(
new
ArrayList
<>())
.
build
();
}
final
var
operatorLoginInfo
=
LoginContextHolder
.
getLoginInfo
();
LocalDate
today
=
LocalDate
.
now
();
LocalDateTime
todayZero
=
today
.
atStartOfDay
();
LocalDate
tomorrow
=
today
.
plusDays
(
1
);
LocalDateTime
tomorrowZero
=
tomorrow
.
atStartOfDay
();
final
var
queryOrderDto
=
QueryOrderByConditionDto
.
builder
()
.
enterpriseId
(
operatorLoginInfo
.
getEnterpriseId
())
.
shouldFilterCustomerIds
(
true
)
.
customerIds
(
customerIds
)
.
shouldFilterMealTimeStart
(
true
)
.
mealTimeStart
(
todayZero
)
.
shouldFilterMealTimeEnd
(
true
)
.
mealTimeEnd
(
tomorrowZero
)
.
build
();
final
var
orderedResponseList
=
orderServiceRpcClient
.
getOrdersByCondition
(
queryOrderDto
);
List
<
Integer
>
uniqueOrderedCustomerIds
=
orderedResponseList
.
stream
().
map
(
SingleClientCustomerOrderRpcResponse:
:
getCustomerId
).
distinct
()
.
collect
(
Collectors
.
toList
());
List
<
Integer
>
notOrderedCustomerIds
=
customerIds
.
stream
().
filter
(
id
->
!
uniqueOrderedCustomerIds
.
contains
(
id
)).
collect
(
Collectors
.
toList
());
// 根据customerIds 获取到menuRef列表
final
var
menuRefs
=
menuServiceRpcClient
.
getClientCustomerMenuRefsByCustomerIds
(
operatorLoginInfo
.
getEnterpriseId
(),
notOrderedCustomerIds
).
getResponsesList
();
final
var
menuIds
=
menuRefs
.
stream
().
map
(
SingleClientCustomerMenuRefRpcResponse:
:
getMenuId
)
.
collect
(
Collectors
.
toList
());
final
var
menus
=
menuServiceRpcClient
.
getMenusByIds
(
operatorLoginInfo
.
getEnterpriseId
(),
menuIds
).
getResponsesList
();
List
<
NotOrderCustomerDto
>
resNotOrderCustomers
=
new
ArrayList
<>();
// 在customers里找到未下单的用户
final
var
notOrderCustomers
=
currentClientCustomers
.
stream
().
filter
(
c
->
notOrderedCustomerIds
.
contains
(
c
.
getId
())).
collect
(
Collectors
.
toList
());
for
(
SingleClientCustomerRpcResponse
notOrderCustomer:
notOrderCustomers
)
{
// 在ref里找到这个用户的menu ids
final
var
notOrderCustomerId
=
Integer
.
valueOf
(
notOrderCustomer
.
getId
());
final
var
curMenuIds
=
menuRefs
.
stream
().
filter
(
r
->
r
.
getCustomerId
()
==
notOrderCustomerId
)
.
map
(
SingleClientCustomerMenuRefRpcResponse:
:
getMenuId
).
collect
(
Collectors
.
toList
());
// 根据menu ids找到 menus
final
var
curMenus
=
menus
.
stream
().
filter
(
m
->
curMenuIds
.
contains
(
m
.
getId
()))
.
collect
(
Collectors
.
toList
());
final
var
curMenuDtos
=
curMenus
.
stream
().
map
(
menu
->
MenuDto
.
builder
()
.
id
(
menu
.
getId
())
.
code
(
menu
.
getCode
())
.
enterpriseId
(
menu
.
getEnterpriseId
())
.
name
(
menu
.
getName
())
.
status
(
menu
.
getStatusValue
())
.
customerScope
(
menu
.
getCustomerScope
())
.
nutritionPromotion
(
menu
.
getNutritionPromotion
())
.
nutritionalStatistics
(
menu
.
getNutritionalStatistics
())
.
dishRuleJson
(
DishRuleJson
.
builder
()
.
days
(
menu
.
getDishRuleJson
().
getDays
())
.
dishType
(
menu
.
getDishRuleJson
().
getDishType
())
.
mealIds
(
menu
.
getDishRuleJson
().
getMealIdsList
())
.
build
())
.
orderRuleJson
(
OrderRuleJson
.
builder
()
.
allowMicroPlaceOrder
(
menu
.
getOrderRuleJson
().
getAllowMicroPlaceOrder
())
.
closeTimeType
(
menu
.
getOrderRuleJson
().
getCloseTimeType
())
.
dishSelectRule
(
menu
.
getOrderRuleJson
().
getDishSelectRule
())
.
earlyDays
(
menu
.
getOrderRuleJson
().
getEarlyDays
())
.
modeOfPayment
(
menu
.
getOrderRuleJson
().
getModeOfPayment
())
.
placeOrderCount
(
menu
.
getOrderRuleJson
().
getPlaceOrderCount
())
.
startTime
(
menu
.
getOrderRuleJson
().
getStartTime
())
.
endTime
(
menu
.
getOrderRuleJson
().
getEndTime
())
.
deadline
(
menu
.
getOrderRuleJson
().
getDeadline
())
.
build
())
.
createdBy
(
menu
.
getCreatedBy
())
.
creationSource
(
menu
.
getCreationSource
())
.
createdAt
(
DateUtil
.
formatDate
(
menu
.
getCreatedAt
()))
.
updatedBy
(
menu
.
getUpdatedBy
())
.
updateSource
(
menu
.
getUpdateSource
())
.
updatedAt
(
DateUtil
.
formatDate
(
menu
.
getUpdatedAt
()))
.
publishAt
(
DateUtil
.
formatDate
(
menu
.
getPublishAt
()))
.
build
()).
collect
(
Collectors
.
toList
());
final
var
hisCustomer
=
currentCustomers
.
stream
().
filter
(
c
->
c
.
getId
().
equals
(
notOrderCustomer
.
getHISCustomerId
())).
findFirst
();
String
roomNo
=
""
;
if
(
hisCustomer
.
isPresent
())
{
roomNo
=
hisCustomer
.
get
().
getRoomNo
();
}
final
var
resNotOrderCustomer
=
NotOrderCustomerDto
.
builder
()
.
id
(
notOrderCustomerId
.
toString
())
.
name
(
notOrderCustomer
.
getName
())
.
roomNo
(
roomNo
)
.
menuList
(
curMenuDtos
)
.
build
();
resNotOrderCustomers
.
add
(
resNotOrderCustomer
);
}
for
(
CurrentClientCustomerDto
currentClientCustomer:
notOrderedHisCustomers
)
{
final
var
resNotOrderCustomer
=
NotOrderCustomerDto
.
builder
()
.
id
(
currentClientCustomer
.
getId
())
.
name
(
currentClientCustomer
.
getName
())
...
...
@@ -411,8 +517,6 @@ public class ClientCustomerServiceImpl implements ClientCustomerService {
resNotOrderCustomers
.
add
(
resNotOrderCustomer
);
}
}
return
TodayOrderDto
.
builder
()
.
totalCurrentCustomerCount
(
currentCustomers
.
size
())
.
notOrderCustomers
(
resNotOrderCustomers
)
...
...
src/main/java/com/infoloop/tianting/service/impl/KdsServiceImpl.java
View file @
07f1c66
package
com
.
infoloop
.
tianting
.
service
.
impl
;
import
com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse
;
import
com.infoloop.tianting.context.LoginContextHolder
;
...
...
@@ -268,9 +269,9 @@ public class KdsServiceImpl implements KdsService {
if
(
meal
.
isPresent
())
{
mealName
=
meal
.
get
().
getName
();
}
final
var
serveStatusToFilter
=
List
.
of
(
ServeStatusEnum
.
SERVE_FINISHED
,
ServeStatusEnum
.
SERVE_NOT_START
);
final
var
totalCount
=
orderDetailList
.
stream
()
.
filter
(
od
->
od
.
getMealId
()
==
mealId
)
.
filter
(
od
->
od
.
getMealId
()
==
mealId
&&
serveStatusToFilter
.
contains
(
od
.
getServeStatus
())
)
.
mapToInt
(
SingleClientCustomerOrderDetailRpcResponse:
:
getCount
)
.
sum
();
final
var
mealDetail
=
KdsMealDetailDto
.
builder
()
...
...
src/main/java/com/infoloop/tianting/service/impl/OrderServiceImpl.java
View file @
07f1c66
package
com
.
infoloop
.
tianting
.
service
.
impl
;
import
com.infoloop.rpc.meizhongyiheservice.MedicalAdviceTypeEnum
;
import
com.infoloop.tianting.SingleResponse
;
import
com.infoloop.tianting.SingleSpecialResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.CloseTimeType
;
...
...
@@ -12,13 +13,18 @@ import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcRespon
import
com.infoloop.tianting.context.LoginContextHolder
;
import
com.infoloop.tianting.deliveryruleservice.ClientLabelTypeEnum
;
import
com.infoloop.tianting.deliveryruleservice.SingleClientLabelRpcResponse
;
import
com.infoloop.tianting.exception.ClientEndExceptions
;
import
com.infoloop.tianting.exception.ErrorCodeEnum
;
import
com.infoloop.tianting.menuservice.CloseTimeTypeEnum
;
import
com.infoloop.tianting.menuservice.ModeOfPaymentEnum
;
import
com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse
;
import
com.infoloop.tianting.model.common.OrderPageResult
;
import
com.infoloop.tianting.model.common.PageResult
;
import
com.infoloop.tianting.model.dto.ClientLabelDTO.HisAllergy
;
import
com.infoloop.tianting.model.dto.ClientLabelDTO.HisMedicalAdviceDto
;
import
com.infoloop.tianting.model.dto.ClientLabelDTO.QueryLabelsDto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.
CheckIfOrdered
Dto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.
getMenuOrderCount
Dto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDetailDto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse
;
...
...
@@ -37,9 +43,11 @@ 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.service.ClientCustomerService
;
import
com.infoloop.tianting.service.MeiZhongYiHeService
;
import
com.infoloop.tianting.service.OrderService
;
import
com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient
;
import
com.infoloop.tianting.service.client.DeliveryRuleServiceRpcClient
;
import
com.infoloop.tianting.service.client.MeiZhongYiHeServiceClient
;
import
com.infoloop.tianting.service.client.MenuServiceRpcClient
;
import
com.infoloop.tianting.service.client.OperatorServiceRpcClient
;
import
com.infoloop.tianting.service.client.OrderServiceRpcClient
;
...
...
@@ -52,6 +60,7 @@ import java.util.ArrayList;
import
java.util.List
;
import
java.util.Optional
;
import
java.util.stream.Collectors
;
import
java.util.stream.Stream
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -67,6 +76,7 @@ public class OrderServiceImpl implements OrderService {
private
final
MenuServiceRpcClient
menuServiceRpcClient
;
private
final
SkuServiceRpcClient
skuServiceRpcClient
;
private
final
DeliveryRuleServiceRpcClient
deliveryRuleServiceRpcClient
;
private
final
MeiZhongYiHeService
meiZhongYiHeService
;
@Override
public
CreateOrderResponse
createOrder
(
CreateOrderDto
createOrderDto
)
{
...
...
@@ -75,6 +85,12 @@ public class OrderServiceImpl implements OrderService {
@Override
public
CreateOrderResponse
orderCreation
(
OperatorCreateOrderDto
operatorCreateOrderDto
)
{
final
var
getMenuOrderCountReq
=
getMenuOrderCountDto
.
builder
()
.
customerId
(
operatorCreateOrderDto
.
getCustomerId
())
.
mealTime
(
operatorCreateOrderDto
.
getMealTime
())
.
menuId
(
operatorCreateOrderDto
.
getMenuId
())
.
build
();
final
var
menuOrderCount
=
this
.
getMenuOrderCount
(
getMenuOrderCountReq
);
final
var
operatorLoginInfo
=
LoginContextHolder
.
getLoginInfo
();
final
var
operator
=
operatorServiceRpcClient
.
getCOperatorById
(
operatorLoginInfo
.
getId
());
final
var
customer
=
clientCustomerServiceRpcClient
.
getClientCustomerById
(
operator
.
getEnterpriseId
(),
operatorCreateOrderDto
.
getCustomerId
()).
getResponse
();
...
...
@@ -94,6 +110,10 @@ public class OrderServiceImpl implements OrderService {
createOrderDto
.
setPayPrice
(
0
);
final
var
menu
=
menuServiceRpcClient
.
getMenuById
(
operator
.
getEnterpriseId
(),
createOrderDto
.
getMenuId
()).
getResponse
();
final
var
placeOrderCount
=
menu
.
getOrderRuleJson
().
getPlaceOrderCount
();
if
(
placeOrderCount
!=
0
&&
menuOrderCount
>=
placeOrderCount
)
{
throw
ClientEndExceptions
.
OperationForbidden
.
build
(
ErrorCodeEnum
.
ORDER_COUNT_LIMIT
.
name
());
}
createOrderDto
.
setCloseTimeType
(
CloseTimeType
.
forNumber
(
menu
.
getOrderRuleJson
().
getCloseTimeType
().
getNumber
()));
createOrderDto
.
setRoomNo
(
record
.
getRoomNo
());
...
...
@@ -120,11 +140,22 @@ public class OrderServiceImpl implements OrderService {
final
var
labels
=
deliveryRuleServiceRpcClient
.
GetClientLabelsByIds
(
customer
.
getEnterpriseId
(),
labelIds
).
getResponsesList
();
final
var
avoids
=
labels
.
stream
().
filter
(
l
->
l
.
getType
()
==
ClientLabelTypeEnum
.
CLIENT_LABEL_TYPE_AVOID
).
map
(
SingleClientLabelRpcResponse:
:
getName
).
collect
(
Collectors
.
toList
());
final
var
hisAllergies
=
meiZhongYiHeService
.
getHisCustomerAllergiesByCustomerId
(
customer
.
getHISCustomerId
());
final
var
allergyCodes
=
hisAllergies
.
stream
().
map
(
HisAllergy:
:
getAllergyCode
).
collect
(
Collectors
.
toList
());
final
var
allLabels
=
deliveryRuleServiceRpcClient
.
getLabelsByTypes
(
QueryLabelsDto
.
builder
()
.
enterpriseId
(
operatorLoginInfo
.
getEnterpriseId
())
.
types
(
List
.
of
(
ClientLabelTypeEnum
.
CLIENT_LABEL_TYPE_AVOID
,
ClientLabelTypeEnum
.
CLIENT_LABEL_TYPE_DOCTOR
,
ClientLabelTypeEnum
.
CLIENT_LABEL_TYPE_ALLERGENS
))
.
build
());
final
var
mappingAllergies
=
allLabels
.
getResponsesList
().
stream
().
filter
(
l
->
allergyCodes
.
contains
(
l
.
getCode
())).
map
(
SingleClientLabelRpcResponse:
:
getName
).
collect
(
Collectors
.
toList
());
final
var
origionalHisDoctors
=
meiZhongYiHeService
.
getHisCustomerMedicalAdvicesByContractNo
(
record
.
getContractNo
());
final
var
dietDoctors
=
origionalHisDoctors
.
stream
().
filter
(
d
->
d
.
getMedicalAdviceType
().
equals
(
MedicalAdviceTypeEnum
.
DIET
)).
map
(
HisMedicalAdviceDto:
:
getConnotation
).
collect
(
Collectors
.
toList
());
final
var
doctors
=
labels
.
stream
().
filter
(
l
->
l
.
getType
()
==
ClientLabelTypeEnum
.
CLIENT_LABEL_TYPE_DOCTOR
).
map
(
SingleClientLabelRpcResponse:
:
getName
).
collect
(
Collectors
.
toList
());
final
var
customerNotice
=
CustomerNotice
.
builder
()
.
avoids
(
avoids
)
.
doctors
(
doctors
)
.
avoids
(
Stream
.
of
(
avoids
,
mappingAllergies
).
flatMap
(
List:
:
stream
).
collect
(
Collectors
.
toList
())
)
.
doctors
(
Stream
.
of
(
doctors
,
dietDoctors
).
flatMap
(
List:
:
stream
).
collect
(
Collectors
.
toList
())
)
.
build
();
createOrderDto
.
setCustomerNoticeJson
(
customerNotice
);
...
...
@@ -207,7 +238,7 @@ public class OrderServiceImpl implements OrderService {
}
@Override
public
Boolean
checkIfOrdered
(
CheckIfOrdered
Dto
checkIfOrdered
)
{
public
Integer
getMenuOrderCount
(
getMenuOrderCount
Dto
checkIfOrdered
)
{
final
var
operatorLoginInfo
=
LoginContextHolder
.
getLoginInfo
();
final
var
mealTimeStart
=
checkIfOrdered
.
getMealTime
().
toLocalDate
().
atStartOfDay
();
LocalDate
tomorrow
=
checkIfOrdered
.
getMealTime
().
toLocalDate
().
plusDays
(
1
);
...
...
@@ -224,11 +255,7 @@ public class OrderServiceImpl implements OrderService {
.
customerIds
(
List
.
of
(
checkIfOrdered
.
getCustomerId
()))
.
build
();
final
var
orderList
=
orderServiceRpcClient
.
getOrdersByCondition
(
queryOrderDto
);
if
(
orderList
.
isEmpty
())
{
return
false
;
}
else
{
return
true
;
}
return
orderList
.
size
();
}
@Override
...
...
src/main/java/com/infoloop/tianting/service/impl/SettlementServiceImpl.java
View file @
07f1c66
package
com
.
infoloop
.
tianting
.
service
.
impl
;
import
com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse
;
import
com.infoloop.tianting.context.LoginContextHolder
;
...
...
@@ -7,13 +8,18 @@ import com.infoloop.tianting.exception.ClientEndExceptions.BusinessException;
import
com.infoloop.tianting.exception.ErrorCodeEnum
;
import
com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse
;
import
com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto
;
import
com.infoloop.tianting.model.dto.SettlementDTO
;
import
com.infoloop.tianting.model.dto.SettlementDTO.SettlementDataDto
;
import
com.infoloop.tianting.model.dto.SettlementDTO.SettlementMenuSkuDto
;
import
com.infoloop.tianting.model.dto.SettlementDTO.SettlementRequestDto
;
import
com.infoloop.tianting.service.SettlementService
;
import
com.infoloop.tianting.service.client.InventoryServiceRpcClient
;
import
com.infoloop.tianting.service.client.MenuServiceRpcClient
;
import
com.infoloop.tianting.service.client.OperatorServiceRpcClient
;
import
com.infoloop.tianting.service.client.OrderServiceRpcClient
;
import
com.infoloop.tianting.service.client.SkuServiceRpcClient
;
import
com.infoloop.tianting.utils.DateUtil
;
import
java.util.Comparator
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.poi.ss.usermodel.Cell
;
...
...
@@ -40,23 +46,27 @@ public class SettlementServiceImpl implements SettlementService {
private
final
OrderServiceRpcClient
orderServiceRpcClient
;
private
final
MenuServiceRpcClient
menuServiceRpcClient
;
private
final
SkuServiceRpcClient
skuServiceRpcClient
;
private
final
InventoryServiceRpcClient
inventoryServiceRpcClient
;
@Override
public
ByteArrayOutputStream
generateOrderSettlementExcel
(
SettlementRequestDto
settlementRequest
)
{
final
var
startDate
=
settlementRequest
.
getTimeStart
().
toLocalDate
().
atStartOfDay
();
final
var
endDate
=
settlementRequest
.
getTimeEnd
().
toLocalDate
().
plusDays
(
1
).
atStartOfDay
();
final
var
operatorLoginInfo
=
LoginContextHolder
.
getLoginInfo
();
final
var
queryOrderDto
=
QueryOrderByConditionDto
.
builder
()
.
enterpriseId
(
LoginContextHolder
.
hasLogin
()
?
operatorLoginInfo
.
getEnterpriseId
()
:
settlementRequest
.
getEnterpriseId
())
.
shouldFilterCreatedAtTimeStart
(
true
)
.
createdAtTimeStart
(
s
ettlementRequest
.
getTimeStart
()
)
.
createdAtTimeStart
(
s
tartDate
)
.
shouldFilterCreatedAtTimeEnd
(
true
)
.
createdAtTimeEnd
(
settlementRequest
.
getTimeEnd
()
)
.
createdAtTimeEnd
(
endDate
)
.
shouldFilterStallIds
(!
settlementRequest
.
getStallIds
().
isEmpty
())
.
stallIds
(
settlementRequest
.
getStallIds
())
.
build
();
final
var
orderList
=
orderServiceRpcClient
.
getOrdersByCondition
(
queryOrderDto
);
List
<
Integer
>
orderIds
=
orderList
.
stream
().
map
(
SingleClientCustomerOrderRpcResponse:
:
getId
).
distinct
()
List
<
Integer
>
orderIds
=
orderList
.
stream
()
.
filter
(
o
->
!
o
.
getStatus
().
equals
(
OrderStatusEnum
.
ORDER_CANCELED
))
.
map
(
SingleClientCustomerOrderRpcResponse:
:
getId
).
distinct
()
.
collect
(
Collectors
.
toList
());
final
var
orderDetailList
=
orderServiceRpcClient
.
getOrderDetailsByOrderIds
(
orderIds
);
List
<
Integer
>
skuIds
=
orderDetailList
.
stream
()
...
...
@@ -78,7 +88,8 @@ public class SettlementServiceImpl implements SettlementService {
//找出所有需要的日期
final
var
dates
=
orderList
.
stream
()
.
map
(
o
->
DateUtil
.
formatDate
(
o
.
getCreatedAt
(),
DateUtil
.
YYYY_MM_DD
))
.
sorted
(
Comparator
.
comparingLong
(
SingleClientCustomerOrderRpcResponse:
:
getCreatedAt
))
.
map
(
o
->
DateUtil
.
formatDateOfUtc
(
o
.
getCreatedAt
(),
DateUtil
.
YYYY_MM_DD_UTC
))
.
distinct
()
.
collect
(
Collectors
.
toList
());
for
(
String
date:
dates
)
{
...
...
@@ -90,7 +101,7 @@ public class SettlementServiceImpl implements SettlementService {
// 找出当天所有的订单
final
var
curOrderList
=
orderList
.
stream
()
.
filter
(
o
->
DateUtil
.
formatDate
(
o
.
getCreatedAt
(),
DateUtil
.
YYYY_MM_DD
).
equals
(
date
))
.
filter
(
o
->
DateUtil
.
formatDate
OfUtc
(
o
.
getCreatedAt
(),
DateUtil
.
YYYY_MM_DD_UTC
).
equals
(
date
))
.
collect
(
Collectors
.
toList
());
final
var
curOrderIds
=
curOrderList
.
stream
()
.
map
(
SingleClientCustomerOrderRpcResponse:
:
getId
)
...
...
@@ -142,7 +153,17 @@ public class SettlementServiceImpl implements SettlementService {
String
skuCode
=
""
;
if
(
curSku
.
isPresent
())
{
skuCode
=
curSku
.
get
().
getCode
();
final
var
existSku
=
menuSkuList
.
stream
().
filter
(
s
->
s
.
getSkuCode
().
equals
(
curSku
.
get
().
getCode
())).
findFirst
();
if
(
existSku
.
isPresent
())
{
final
var
originalSku
=
existSku
.
get
();
final
var
count
=
existSku
.
get
().
getCount
();
final
var
newCount
=
count
+
countTotal
;
originalSku
.
setCount
(
newCount
);
originalSku
.
setTotalPrice
(
m
.
getPrice
()
*
newCount
);
continue
;
}
}
final
var
settlementMenuSku
=
SettlementMenuSkuDto
.
builder
()
.
skuCode
(
skuCode
)
.
count
(
countTotal
)
...
...
@@ -157,9 +178,16 @@ public class SettlementServiceImpl implements SettlementService {
}
}
final
var
client
=
inventoryServiceRpcClient
.
getClientById
(
operatorLoginInfo
.
getEnterpriseId
(),
settlementRequest
.
getClientId
()).
getClient
();
final
var
settlementDataDto
=
SettlementDataDto
.
builder
()
.
classifyOrders
(
classifyOrders
)
.
client
(
client
.
getName
())
.
startTime
(
DateUtil
.
formatDate
(
settlementRequest
.
getTimeStart
(),
DateUtil
.
YYYY_MM_DD
))
.
endTime
(
DateUtil
.
formatDate
(
settlementRequest
.
getTimeEnd
(),
DateUtil
.
YYYY_MM_DD
))
.
build
();
try
{
final
var
bytes
=
writeToExcel
(
classifyOrders
);
final
var
bytes
=
writeToExcel
(
settlementDataDto
);
return
bytes
;
}
catch
(
IOException
e
)
{
throw
BusinessException
.
build
(
ErrorCodeEnum
.
GENERATE_EXCEL_ERROR
);
...
...
@@ -167,12 +195,21 @@ public class SettlementServiceImpl implements SettlementService {
}
public
static
ByteArrayOutputStream
writeToExcel
(
Map
<
String
,
Map
<
String
,
List
<
SettlementMenuSkuDto
>>>
classifyOrders
)
public
static
ByteArrayOutputStream
writeToExcel
(
SettlementDataDto
settlementDataDto
)
throws
IOException
{
Workbook
workbook
=
new
XSSFWorkbook
();
Sheet
sheet
=
workbook
.
createSheet
(
"订单数据"
);
final
var
classifyOrders
=
settlementDataDto
.
getClassifyOrders
();
int
rowNum
=
0
;
Row
sheetTitleRow
=
sheet
.
createRow
(
rowNum
++);
Cell
sheetTitleCell
=
sheetTitleRow
.
createCell
(
0
);
sheetTitleCell
.
setCellValue
(
settlementDataDto
.
getClient
());
Row
dateRangeRow
=
sheet
.
createRow
(
rowNum
++);
Cell
dateRangeCell
=
dateRangeRow
.
createCell
(
0
);
final
var
dateRange
=
settlementDataDto
.
getStartTime
()
+
"至"
+
settlementDataDto
.
getEndTime
();
dateRangeCell
.
setCellValue
(
dateRange
);
Row
titleRow
=
sheet
.
createRow
(
rowNum
++);
Cell
dateTitleCell
=
titleRow
.
createCell
(
0
);
dateTitleCell
.
setCellValue
(
"点餐日期"
);
...
...
src/main/java/com/infoloop/tianting/streamController/SettlementController.java
View file @
07f1c66
...
...
@@ -32,7 +32,7 @@ public class SettlementController {
private
final
SettlementService
settlementService
;
@ApiIgnore
@ApiOperation
(
value
=
"结算账单生成excel"
)
@ApiOperation
(
value
=
"
企业端
结算账单生成excel"
)
@PostMapping
(
"/enterprise/settlement/generate-excel"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
ResponseEntity
<
byte
[]>
enterpriseSettlementGenerateExcel
(
@Valid
@RequestBody
SettlementRequestDto
settlementRequestDto
)
{
...
...
src/main/java/com/infoloop/tianting/utils/DateUtil.java
View file @
07f1c66
...
...
@@ -36,6 +36,8 @@ public final class DateUtil extends DateUtils {
public
final
static
DateTimeFormatter
YYYY_MM_DD
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
)
.
withZone
(
CHINA_ZONE
);
public
final
static
DateTimeFormatter
YYYY_MM_DD_UTC
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
);
public
final
static
DateTimeFormatter
YYYY_MM_DD_LEFT_SYMBOL
=
DateTimeFormatter
.
ofPattern
(
"yyyy/MM/dd"
)
.
withZone
(
CHINA_ZONE
);
...
...
@@ -89,6 +91,14 @@ public final class DateUtil extends DateUtils {
.
format
(
formatter
);
}
public
static
String
formatDateOfUtc
(
final
long
epochMillis
,
DateTimeFormatter
formatter
)
{
if
(
epochMillis
==
0L
)
{
return
null
;
}
return
Instant
.
ofEpochMilli
(
epochMillis
).
atOffset
(
ZoneOffset
.
UTC
)
.
format
(
formatter
);
}
public
static
String
formatDate
(
final
LocalDate
localDate
,
DateTimeFormatter
formatter
)
{
if
(
localDate
==
null
)
{
return
null
;
...
...
Please
register
or
login
to post a comment