wangyingyang

fix and update order detail

......@@ -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',
......
......@@ -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;
/**
* 调整配料备注
*/
......
......@@ -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;
......
......@@ -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.setNotServe(false);
orderDetailDb.setServeStatus(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.setNotServe(false);
orderDetailDb.setServeStatus(ServeStatusEnum.SERVE_NOT_START_VALUE);
if (detailCreation.getShouldCreateMealDetailJson()) {
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
.allergies(detailCreation.getMealDetailJson().getAllergiesList())
......
......@@ -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.setNotServe(false);
orderDetailDb.setServeStatus(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.setNotServe(false);
orderDetailDb.setServeStatus(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().getShouldUpdateNotServe()) {
orderDetailDb.setNotServe(updateOrderDetailRequest.getModification().getNotServe());
if (updateOrderDetailRequest.getModification().getShouldUpdateServeStatus()) {
orderDetailDb.setServeStatus(updateOrderDetailRequest.getModification().getServeStatusValue());
}
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.getShouldUpdateNotServe()) {
orderDetailDb.setNotServe(modification.getNotServe());
if (modification.getShouldUpdateServeStatus()) {
orderDetailDb.setServeStatus(modification.getServeStatusValue());
}
if (modification.getShouldUpdateMealDetailJson()) {
ObjectMapper objectMapper = new ObjectMapper();
......
......@@ -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(energyNode.textValue());
mealDetailProto.setFat(fatNode.textValue());
}
JsonNode proteinNode = orderDetailDb.getMealDetailJson().get("protein");
if (proteinNode!= null && proteinNode.isTextual()) {
mealDetailProto.setProtein(energyNode.textValue());
mealDetailProto.setProtein(proteinNode.textValue());
}
JsonNode carbohydrateNode = orderDetailDb.getMealDetailJson().get("carbohydrate");
if (carbohydrateNode!= null && carbohydrateNode.isTextual()) {
mealDetailProto.setCarbohydrate(energyNode.textValue());
mealDetailProto.setCarbohydrate(carbohydrateNode.textValue());
}
JsonNode allergiesNode = orderDetailDb.getMealDetailJson().get("allergies");
......
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
......@@ -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 shouldUpdateNotServe = 20;
bool notServe = 21;
bool shouldUpdateServeStatus = 20;
ServeStatusEnum serveStatus = 21;
}
message UpdateClientCustomerOrderDetailRpcRequest {
......