Toggle navigation
Toggle navigation
This project
Loading...
Sign in
jiujian
/
client-customer-order-service
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-11-25 13:45:01 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
392b9a966df6bb3731d11e34a3cd2c6c1aa261ec
392b9a96
1 parent
b5544142
fix and update order detail
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
36 additions
and
190 deletions
sql/table.sql
src/main/java/com/tianting/infoloop/model/db/OrderDetailDb.java
src/main/java/com/tianting/infoloop/service/grpc/OrderGrpcService.java
src/main/java/com/tianting/infoloop/service/impl/OrderDbServiceImpl.java
src/main/java/com/tianting/infoloop/service/impl/OrderDetailDbServiceImpl.java
src/main/java/com/tianting/infoloop/utils/DbToProtoUtil.java
src/main/java/com/tianting/infoloop/utils/GenericBeanToProtoListConverter.java
src/main/proto/ClientCustomerOrderService.proto
sql/table.sql
View file @
392b9a9
...
...
@@ -76,7 +76,9 @@ CREATE TABLE `client_customer_order_details` (
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8mb3
COMMENT
=
'项目点客户订单详情表'
;
ALTER
TABLE
`client_customer_order_details`
ADD
COLUMN
`adjustSkuRemark`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'调整配料'
AFTER
`price`
;
ADD
COLUMN
`adjustSkuRemark`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'调整配料'
AFTER
`price`
,
ADD
COLUMN
`serveStatus`
INT
COMMENT
'出餐状态:未出餐=1; 不出餐=2; 已出餐=3'
AFTER
`adjustSkuRemark`
,
DROP
COLUMN
`notServe`
;
CREATE
TABLE
`client_customer_order_operation_records`
(
`id`
INT
AUTO_INCREMENT
PRIMARY
KEY
COMMENT
'订单操作记录id'
,
...
...
src/main/java/com/tianting/infoloop/model/db/OrderDetailDb.java
View file @
392b9a9
...
...
@@ -113,9 +113,9 @@ public class OrderDetailDb extends Model<OrderDetailDb> implements Serializable
*/
private
Integer
updateSource
;
/**
*
不出餐: 默认出餐=0; 不出餐=1
*
出餐状态: 默认未出餐=1; 不出餐=2;已出餐=3
*/
private
Boolean
notServe
;
private
Integer
serveStatus
;
/**
* 调整配料备注
*/
...
...
src/main/java/com/tianting/infoloop/service/grpc/OrderGrpcService.java
View file @
392b9a9
...
...
@@ -58,7 +58,6 @@ import com.tianting.infoloop.service.OrderDbService;
import
com.tianting.infoloop.service.OrderDetailDbService
;
import
com.tianting.infoloop.service.OrderOperationRecordDbService
;
import
com.tianting.infoloop.utils.DbToProtoUtil
;
import
com.tianting.infoloop.utils.GenericBeanToProtoListConverter
;
import
com.tianting.infoloop.utils.ProtoBeanUtil
;
import
io.grpc.Status
;
import
io.grpc.stub.StreamObserver
;
...
...
src/main/java/com/tianting/infoloop/service/impl/OrderDbServiceImpl.java
View file @
392b9a9
...
...
@@ -12,6 +12,7 @@ import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderCreat
import
com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcRequest
;
import
com.tianting.infoloop.mapper.OrderDbMapper
;
import
com.tianting.infoloop.model.db.OrderDb
;
...
...
@@ -152,7 +153,7 @@ public class OrderDbServiceImpl extends ServiceImpl<OrderDbMapper, OrderDb> impl
if
(
detailCreation
.
getShouldCreateAdjustSkuRemark
())
{
orderDetailDb
.
setAdjustSkuRemark
(
detailCreation
.
getAdjustSkuRemark
());
}
orderDetailDb
.
set
NotServe
(
false
);
orderDetailDb
.
set
ServeStatus
(
ServeStatusEnum
.
SERVE_NOT_START_VALUE
);
if
(
detailCreation
.
getShouldCreateMealDetailJson
())
{
orderDetailDb
.
setMealDetailJson
(
objectMapper
.
valueToTree
(
MealDetailJson
.
builder
()
.
allergies
(
detailCreation
.
getMealDetailJson
().
getAllergiesList
())
...
...
@@ -374,7 +375,7 @@ public class OrderDbServiceImpl extends ServiceImpl<OrderDbMapper, OrderDb> impl
if
(
detailCreation
.
getShouldCreateAdjustSkuRemark
())
{
orderDetailDb
.
setAdjustSkuRemark
(
detailCreation
.
getAdjustSkuRemark
());
}
orderDetailDb
.
set
NotServe
(
false
);
orderDetailDb
.
set
ServeStatus
(
ServeStatusEnum
.
SERVE_NOT_START_VALUE
);
if
(
detailCreation
.
getShouldCreateMealDetailJson
())
{
orderDetailDb
.
setMealDetailJson
(
objectMapper
.
valueToTree
(
MealDetailJson
.
builder
()
.
allergies
(
detailCreation
.
getMealDetailJson
().
getAllergiesList
())
...
...
src/main/java/com/tianting/infoloop/service/impl/OrderDetailDbServiceImpl.java
View file @
392b9a9
...
...
@@ -12,6 +12,7 @@ import com.infoloop.tianting.clientcustomerorderservice.BatchCreateClientCustome
import
com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderDetailRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderDetailsByOrderIdsRpcRequest
;
import
com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderDetailRpcRequest
;
import
com.tianting.infoloop.mapper.OrderDbMapper
;
import
com.tianting.infoloop.mapper.OrderDetailMapper
;
...
...
@@ -66,7 +67,7 @@ public class OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, Ord
if
(
createOrderDetailRequest
.
getCreation
().
getShouldCreateAdjustSkuRemark
())
{
orderDetailDb
.
setAdjustSkuRemark
(
createOrderDetailRequest
.
getCreation
().
getAdjustSkuRemark
());
}
orderDetailDb
.
set
NotServe
(
false
);
orderDetailDb
.
set
ServeStatus
(
ServeStatusEnum
.
SERVE_NOT_START_VALUE
);
if
(
createOrderDetailRequest
.
getCreation
().
getShouldCreateMealDetailJson
())
{
orderDetailDb
.
setMealDetailJson
(
objectMapper
.
valueToTree
(
MealDetailJson
.
builder
()
.
allergies
(
createOrderDetailRequest
.
getCreation
().
getMealDetailJson
().
getAllergiesList
())
...
...
@@ -106,7 +107,7 @@ public class OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, Ord
orderDetailDb
.
setCategoryId
(
creation
.
getCategoryId
());
orderDetailDb
.
setSkuId
(
creation
.
getSkuId
());
orderDetailDb
.
setIsDeleted
(
false
);
orderDetailDb
.
set
NotServe
(
false
);
orderDetailDb
.
set
ServeStatus
(
ServeStatusEnum
.
SERVE_NOT_START_VALUE
);
orderDetailDb
.
setEnterpriseId
(
batchCreateOrderDetailsRequest
.
getEnterpriseId
());
if
(
creation
.
getShouldCreateOrderId
())
{
orderDetailDb
.
setOrderId
(
creation
.
getOrderId
());
...
...
@@ -173,8 +174,8 @@ public class OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, Ord
if
(
updateOrderDetailRequest
.
getModification
().
getShouldUpdateAdjustSkuRemark
())
{
orderDetailDb
.
setAdjustSkuRemark
(
updateOrderDetailRequest
.
getModification
().
getAdjustSkuRemark
());
}
if
(
updateOrderDetailRequest
.
getModification
().
getShouldUpdate
NotServe
())
{
orderDetailDb
.
set
NotServe
(
updateOrderDetailRequest
.
getModification
().
getNotServ
e
());
if
(
updateOrderDetailRequest
.
getModification
().
getShouldUpdate
ServeStatus
())
{
orderDetailDb
.
set
ServeStatus
(
updateOrderDetailRequest
.
getModification
().
getServeStatusValu
e
());
}
if
(
updateOrderDetailRequest
.
getModification
().
getShouldUpdateMealDetailJson
())
{
ObjectMapper
objectMapper
=
new
ObjectMapper
();
...
...
@@ -225,8 +226,8 @@ public class OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, Ord
if
(
modification
.
getShouldUpdateAdjustSkuRemark
())
{
orderDetailDb
.
setAdjustSkuRemark
(
modification
.
getAdjustSkuRemark
());
}
if
(
modification
.
getShouldUpdate
NotServe
())
{
orderDetailDb
.
set
NotServe
(
modification
.
getNotServ
e
());
if
(
modification
.
getShouldUpdate
ServeStatus
())
{
orderDetailDb
.
set
ServeStatus
(
modification
.
getServeStatusValu
e
());
}
if
(
modification
.
getShouldUpdateMealDetailJson
())
{
ObjectMapper
objectMapper
=
new
ObjectMapper
();
...
...
src/main/java/com/tianting/infoloop/utils/DbToProtoUtil.java
View file @
392b9a9
...
...
@@ -10,6 +10,7 @@ import com.infoloop.tianting.clientcustomerorderservice.OrderSourceEnum;
import
com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.OrderTypeEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse
;
import
com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse
;
import
com.tianting.infoloop.model.db.OrderDb
;
...
...
@@ -202,9 +203,14 @@ public class DbToProtoUtil {
.
setUpdatedAt
(
orderDetailDb
.
getUpdatedAt
().
toEpochSecond
(
ZoneOffset
.
UTC
)
*
1000
)
.
setUpdateSource
(
OrderSourceEnum
.
forNumber
(
orderDetailDb
.
getUpdateSource
()))
.
setIsDeleted
(
orderDetailDb
.
getIsDeleted
())
.
setNotServe
(
orderDetailDb
.
getNotServe
())
.
setEnterpriseId
(
orderDetailDb
.
getEnterpriseId
());
if
(
orderDetailDb
.
getServeStatus
()
!=
null
)
{
protoBuilder
.
setServeStatus
(
ServeStatusEnum
.
forNumber
(
orderDetailDb
.
getServeStatus
()));
}
else
{
protoBuilder
.
setServeStatus
(
ServeStatusEnum
.
SERVE_NOT_START
);
}
// 处理嵌套的MealDetail字段
if
(
orderDetailDb
.
getMealDetailJson
()!=
null
)
{
// Constructor<MealDetail> mealDetailConstructor =
...
...
@@ -258,17 +264,17 @@ public class DbToProtoUtil {
JsonNode
fatNode
=
orderDetailDb
.
getMealDetailJson
().
get
(
"fat"
);
if
(
fatNode
!=
null
&&
fatNode
.
isTextual
())
{
mealDetailProto
.
setFat
(
energy
Node
.
textValue
());
mealDetailProto
.
setFat
(
fat
Node
.
textValue
());
}
JsonNode
proteinNode
=
orderDetailDb
.
getMealDetailJson
().
get
(
"protein"
);
if
(
proteinNode
!=
null
&&
proteinNode
.
isTextual
())
{
mealDetailProto
.
setProtein
(
energy
Node
.
textValue
());
mealDetailProto
.
setProtein
(
protein
Node
.
textValue
());
}
JsonNode
carbohydrateNode
=
orderDetailDb
.
getMealDetailJson
().
get
(
"carbohydrate"
);
if
(
carbohydrateNode
!=
null
&&
carbohydrateNode
.
isTextual
())
{
mealDetailProto
.
setCarbohydrate
(
energy
Node
.
textValue
());
mealDetailProto
.
setCarbohydrate
(
carbohydrate
Node
.
textValue
());
}
JsonNode
allergiesNode
=
orderDetailDb
.
getMealDetailJson
().
get
(
"allergies"
);
...
...
src/main/java/com/tianting/infoloop/utils/GenericBeanToProtoListConverter.java
deleted
100644 → 0
View file @
b554414
package
com
.
tianting
.
infoloop
.
utils
;
import
com.fasterxml.jackson.databind.JsonNode
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.google.protobuf.Message
;
import
com.google.protobuf.util.JsonFormat
;
import
java.lang.reflect.Constructor
;
import
java.lang.reflect.Field
;
import
java.time.Instant
;
import
java.time.LocalDateTime
;
import
java.time.ZoneOffset
;
import
java.util.ArrayList
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
public
class
GenericBeanToProtoListConverter
{
// 将Java Bean列表转换为对应的ProtoBuf消息列表
public
static
<
M
,
T
extends
Message
>
List
<
T
>
beanListToProtoList
(
List
<
M
>
beanSourceList
,
Class
<
T
>
protoBean
)
{
List
<
T
>
resultList
=
new
ArrayList
<>();
try
{
for
(
M
bean
:
beanSourceList
)
{
// 创建ProtoBuf消息实例
Constructor
<
T
>
declaredConstructor
;
try
{
declaredConstructor
=
protoBean
.
getDeclaredConstructor
();
declaredConstructor
.
setAccessible
(
true
);
T
instance
=
declaredConstructor
.
newInstance
();
// 将Java Bean的各个字段值设置到ProtoBuf消息实例中
setProtoFieldsFromBean
(
bean
,
instance
,
true
);
resultList
.
add
(
instance
);
}
catch
(
NoSuchMethodException
e
)
{
// 如果没有无参构造函数,尝试查找其他构造函数并传入合适参数(这里假设可以传入空参数列表创建实例,实际可能需根据具体情况调整)
Constructor
<?>[]
constructors
=
protoBean
.
getConstructors
();
if
(
constructors
.
length
>
0
)
{
declaredConstructor
=
(
Constructor
<
T
>)
constructors
[
0
];
declaredConstructor
.
setAccessible
(
true
);
T
instance
=
declaredConstructor
.
newInstance
();
// 将Java Bean的各个字段值设置到ProtoBuf消息实例中
setProtoFieldsFromBean
(
bean
,
instance
,
true
);
resultList
.
add
(
instance
);
}
else
{
throw
new
IllegalArgumentException
(
"ProtoBuf消息类型 "
+
protoBean
.
getName
()
+
" 没有可用的构造函数来创建实例"
,
e
);
}
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// 根据具体需求,可在这里进行更详细的错误处理,比如抛出特定的转换失败异常给调用者等
throw
new
RuntimeException
(
"Java Bean列表转换为ProtoBuf消息列表失败"
,
e
);
}
return
resultList
;
}
// 将Java Bean的各个字段值设置到ProtoBuf消息实例中
private
static
<
M
,
T
extends
Message
>
void
setProtoFieldsFromBean
(
M
bean
,
T
protoInstance
,
boolean
ignoreUnknownFields
)
throws
Exception
{
// 获取Java Bean的所有字段
Field
[]
beanFields
=
bean
.
getClass
().
getDeclaredFields
();
for
(
Field
beanField
:
beanFields
)
{
beanField
.
setAccessible
(
true
);
// 获取ProtoBuf消息实例中对应的字段
Field
protoField
;
try
{
protoField
=
protoInstance
.
getClass
().
getDeclaredField
(
beanField
.
getName
());
protoField
.
setAccessible
(
true
);
}
catch
(
NoSuchFieldException
e
)
{
if
(
ignoreUnknownFields
)
{
continue
;
}
else
{
throw
e
;
}
}
// 获取Java Bean字段的值
Object
beanFieldValue
=
beanField
.
get
(
bean
);
if
(
beanFieldValue
!=
null
)
{
if
(
beanFieldValue
instanceof
JsonNode
)
{
// 处理JsonNode类型的字段
JsonNode
jsonNodeValue
=
(
JsonNode
)
beanFieldValue
;
// 创建对应的嵌套ProtoBuf消息实例(假设是嵌套消息类型,这里以通用的处理方式为例)
Constructor
<?>
nestedProtoConstructor
=
protoField
.
getType
().
getDeclaredConstructor
();
nestedProtoConstructor
.
setAccessible
(
true
);
Object
nestedProtoInstance
=
nestedProtoConstructor
.
newInstance
();
// 设置嵌套ProtoBuf消息实例的字段值(这里假设嵌套消息类型有类似的处理逻辑,具体根据实际情况而定)
setProtoFieldsFromBean
(
jsonNodeValue
,
nestedProtoInstance
,
ignoreUnknownFields
);
// 将设置好的嵌套ProtoBuf消息实例设置到ProtoBuf消息实例的对应字段中
protoField
.
set
(
protoInstance
,
nestedProtoInstance
);
}
else
if
(
beanFieldValue
instanceof
LocalDateTime
)
{
// 处理LocalDateTime类型的字段,将其转换为时间戳(毫秒)后设置到ProtoBuf消息实例中
LocalDateTime
localDateTimeValue
=
(
LocalDateTime
)
beanFieldValue
;
long
timestamp
=
localDateTimeValue
.
toInstant
(
ZoneOffset
.
UTC
).
toEpochMilli
();
protoField
.
set
(
protoInstance
,
timestamp
);
}
else
if
(
beanFieldValue
instanceof
Integer
)
{
// 处理Integer类型字段,直接设置到ProtoBuf消息实例对应字段
protoField
.
set
(
protoInstance
,
(
Integer
)
beanFieldValue
);
}
else
if
(
beanFieldValue
instanceof
String
)
{
// 处理String类型字段,直接设置到ProtoBuf消息实例对应字段
protoField
.
set
(
protoInstance
,
(
String
)
beanFieldValue
);
}
else
if
(
beanFieldValue
instanceof
Boolean
)
{
// 处理Boolean类型字段,直接设置到ProtoBuf消息实例对应字段
protoField
.
set
(
protoInstance
,
(
Boolean
)
beanFieldValue
);
}
else
if
(
beanFieldValue
instanceof
Long
)
{
// 处理Long类型字段,直接设置到ProtoBuf消息实例对应字段
protoField
.
set
(
protoInstance
,
(
Long
)
beanFieldValue
);
}
else
{
// 对于其他未明确处理的类型,尝试通过其toString方法转换为字符串后设置(可能需要根据具体类型进一步优化)
protoField
.
set
(
protoInstance
,
beanFieldValue
.
toString
());
}
}
else
{
// 如果Java Bean字段的值为null,将ProtoBuf消息实例的对应字段也设置为null
protoField
.
set
(
protoInstance
,
null
);
}
}
}
// 将JsonNode的值设置到对应的ProtoBuf消息实例(这里假设是嵌套消息类型,以通用处理方式为例)
private
static
void
setProtoFieldsFromBean
(
JsonNode
jsonNode
,
Object
protoInstance
,
boolean
ignoreUnknownFields
)
throws
Exception
{
// 获取JsonNode的所有字段
Iterator
<
Map
.
Entry
<
String
,
JsonNode
>>
jsonNodeFields
=
jsonNode
.
fields
();
while
(
jsonNodeFields
.
hasNext
())
{
Map
.
Entry
<
String
,
JsonNode
>
entry
=
jsonNodeFields
.
next
();
String
fieldName
=
entry
.
getKey
();
JsonNode
fieldValue
=
entry
.
getValue
();
// 获取ProtoBuf消息实例中对应的字段
Field
protoField
;
try
{
protoField
=
protoInstance
.
getClass
().
getDeclaredField
(
fieldName
);
protoField
.
setAccessible
(
true
);
}
catch
(
NoSuchFieldException
e
)
{
if
(
ignoreUnknownFields
)
{
continue
;
}
else
{
throw
e
;
}
}
if
(
fieldValue
!=
null
)
{
if
(
fieldValue
instanceof
JsonNode
)
{
// 递归处理嵌套的JsonNode类型的字段
Constructor
<?>
nestedProtoConstructor
=
protoField
.
getType
().
getDeclaredConstructor
();
nestedProtoConstructor
.
setAccessible
(
true
);
Object
nestedProtoInstance
=
nestedProtoInstance
=
nestedProtoConstructor
.
newInstance
();
setProtoFieldsFromBean
((
JsonNode
)
fieldValue
,
nestedProtoInstance
,
ignoreUnknownFields
);
protoField
.
set
(
protoInstance
,
nestedProtoInstance
);
}
else
{
// 将非JsonNode类型的值设置到ProtoBuf消息实例的对应字段中
protoField
.
set
(
protoInstance
,
fieldValue
.
asText
());
}
}
else
{
// 如果JsonNode字段的值为null,将ProtoBuf消息实例的对应字段也设置为null
protoField
.
set
(
protoInstance
,
null
);
}
}
}
}
\ No newline at end of file
src/main/proto/ClientCustomerOrderService.proto
View file @
392b9a9
...
...
@@ -72,6 +72,13 @@ enum CloseTimeType {
RESERVATION
=
1
;
}
enum
ServeStatusEnum
{
UNKNOWN_SERVE_STATUS
=
0
;
SERVE_NOT_START
=
1
;
SERVE_REJECT
=
2
;
SERVE_FINISHED
=
3
;
}
message
CustomerNotice
{
repeated
string
avoids
=
1
;
repeated
string
doctors
=
2
;
...
...
@@ -403,7 +410,7 @@ message SingleClientCustomerOrderDetailRpcResponse {
int64
updatedAt
=
16
;
OrderSourceEnum
updateSource
=
17
;
bool
isDeleted
=
18
;
bool
notServe
=
19
;
ServeStatusEnum
serveStatus
=
19
;
int32
enterpriseId
=
20
;
}
...
...
@@ -450,7 +457,7 @@ message ClientCustomerOrderDetailCreation{
int32
price
=
13
;
bool
shouldCreateAdjustSkuRemark
=
14
;
string
adjustSkuRemark
=
15
;
bool
notServe
=
16
;
ServeStatusEnum
serveStatus
=
16
;
}
message
CreateClientCustomerOrderDetailRpcRequest
{
...
...
@@ -497,8 +504,8 @@ message ClientCustomerOrderDetailModification {
int32
price
=
17
;
bool
shouldUpdateAdjustSkuRemark
=
18
;
string
adjustSkuRemark
=
19
;
bool
shouldUpdate
NotServe
=
20
;
bool
notServe
=
21
;
bool
shouldUpdate
ServeStatus
=
20
;
ServeStatusEnum
serveStatus
=
21
;
}
message
UpdateClientCustomerOrderDetailRpcRequest
{
...
...
Please
register
or
login
to post a comment