wangyingyang

update order

......@@ -88,4 +88,9 @@ public class MybatisPlusConfig {
return new MybatisPlusSqlInjector();
}
@Bean
public MysqlTypeTransferUtil mysqlTypeTransferUtil() {
return new MysqlTypeTransferUtil();
}
}
......
......@@ -15,6 +15,7 @@ import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
import org.apache.ibatis.type.JdbcType;
/**
* order DB
......@@ -153,6 +154,7 @@ public class OrderDb extends Model<OrderDb> implements Serializable {
* "doctors":["String"]
* }
*/
@TableField(jdbcType = JdbcType.OTHER)
private JsonNode customerNoticeJson;
/**
* 是否删除;0:未删除,1:已删除
......
......@@ -14,6 +14,7 @@ import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.apache.ibatis.type.JdbcType;
/**
* order detail DB
......@@ -76,6 +77,7 @@ public class OrderDetailDb extends Model<OrderDetailDb> implements Serializable
* "allergies": [] //过敏源
* }
*/
@TableField(jdbcType = JdbcType.OTHER)
private JsonNode mealDetailJson;
/**
* 是否删除;0:未删除,1:已删除
......
package com.tianting.infoloop.model.dto;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CustomerNoticeDto {
private List<String> avoids;
private List<String> doctors;
}
\ No newline at end of file
package com.tianting.infoloop.model.dto;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MealDetailJson {
private String basicMaterials;
private List<String> tastes;
private List<String> efficacies;
private List<String> dockers;
private String energy;
private String fat;
private String protein;
private String carbohydrate;
private List<String> allergies;
private List<String> avoids;
private List<String> skus;
}
......@@ -57,6 +57,8 @@ import com.tianting.infoloop.model.db.OrderOperationRecordDb;
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;
......@@ -120,8 +122,10 @@ public class OrderGrpcService extends ClientCustomerOrderServiceRpcGrpc.ClientCu
try {
final var list = orderDbService.getOrdersByCustomerId(request.getCustomerId());
if (!list.isEmpty()) {
builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(list,
SingleClientCustomerOrderRpcResponse.class));
// final var allResponses = ProtoBeanUtil.beanListToProtoList(list,
// SingleClientCustomerOrderRpcResponse.class);
final var allResponses = DbToProtoUtil.orderDbListToProtoList(list);
builder.addAllResponses(allResponses);
}
} catch (final Exception e) {
log.error("getClientCustomerOrdersByCustomerId error;", e);
......@@ -139,7 +143,8 @@ public class OrderGrpcService extends ClientCustomerOrderServiceRpcGrpc.ClientCu
try {
final var data = orderDbService.getById(request.getId());
if (data != null) {
builder.setResponse(ProtoBeanUtil.beanToProto(data, SingleClientCustomerOrderRpcResponse.class));
// builder.setResponse(ProtoBeanUtil.beanToProto(data, SingleClientCustomerOrderRpcResponse.class));
builder.setResponse(DbToProtoUtil.orderDbToProto(data));
}
} catch (final Exception e) {
log.error("getClientCustomerOrderById error;", e);
......@@ -162,7 +167,8 @@ public class OrderGrpcService extends ClientCustomerOrderServiceRpcGrpc.ClientCu
}
final var list = orderDbService.listByIds(request.getIdsList());
if (!list.isEmpty()) {
builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(list, SingleClientCustomerOrderRpcResponse.class));
// builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(list, SingleClientCustomerOrderRpcResponse.class));
builder.addAllResponses(DbToProtoUtil.orderDbListToProtoList(list));
}
} catch (final Exception e) {
log.error("getClientCustomerOrdersByIds error;", e);
......@@ -186,11 +192,13 @@ public class OrderGrpcService extends ClientCustomerOrderServiceRpcGrpc.ClientCu
queryWrapper.eq(OrderDb::getEnterpriseId, request.getEnterpriseId());
queryWrapper.eq(OrderDb::getClientId, request.getClientId());
queryWrapper.eq(OrderDb::getStatus, request.getStatusValue());
queryWrapper.orderByDesc(OrderDb::getCreatedAt);
final var result = orderDbService.page(page, queryWrapper);
builder.setTotal(result.getTotal());
builder.setPages(result.getPages());
if (!result.getRecords().isEmpty()) {
builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(result.getRecords(), SingleClientCustomerOrderRpcResponse.class));
// builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(result.getRecords(), SingleClientCustomerOrderRpcResponse.class));
builder.addAllResponses(DbToProtoUtil.orderDbListToProtoList(result.getRecords()));
}
} catch (final Exception e) {
log.error("queryClientCustomerOrdersByPagination error;", e);
......@@ -298,9 +306,11 @@ public class OrderGrpcService extends ClientCustomerOrderServiceRpcGrpc.ClientCu
if (request.getShouldFilterIsRead()) {
queryWrapper.eq(OrderDb::getIsRead, request.getIsRead());
}
queryWrapper.orderByDesc(OrderDb::getCreatedAt);
final var list = orderDbService.list(queryWrapper);
if (!list.isEmpty()) {
builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(list, SingleClientCustomerOrderRpcResponse.class));
// builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(list, SingleClientCustomerOrderRpcResponse.class));
builder.addAllResponses(DbToProtoUtil.orderDbListToProtoList(list));
}
} catch (final Exception e) {
log.error("queryTestExampleDbByCondition error;", e);
......@@ -391,7 +401,8 @@ public class OrderGrpcService extends ClientCustomerOrderServiceRpcGrpc.ClientCu
try {
final var data = orderDetailDbService.getById(request.getId());
if (data != null) {
builder.setResponse(ProtoBeanUtil.beanToProto(data, SingleClientCustomerOrderDetailRpcResponse.class));
// builder.setResponse(ProtoBeanUtil.beanToProto(data, SingleClientCustomerOrderDetailRpcResponse.class));
builder.setResponse(DbToProtoUtil.orderDetailDbToProto(data));
}
} catch (final Exception e) {
log.error("getClientCustomerOrderDetailById error;", e);
......@@ -416,7 +427,8 @@ public class OrderGrpcService extends ClientCustomerOrderServiceRpcGrpc.ClientCu
}
final var list = orderDetailDbService.listByIds(request.getIdsList());
if (!list.isEmpty()) {
builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(list, SingleClientCustomerOrderDetailRpcResponse.class));
// builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(list, SingleClientCustomerOrderDetailRpcResponse.class));
builder.addAllResponses(DbToProtoUtil.orderDetailDbListToProtoList(list));
}
} catch (final Exception e) {
log.error("getClientCustomerOrderDetailsByIds error;", e);
......@@ -442,7 +454,8 @@ public class OrderGrpcService extends ClientCustomerOrderServiceRpcGrpc.ClientCu
}
final var list = orderDetailDbService.getOrderDetailsByOrderIds(request);
if (!list.isEmpty()) {
builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(list, SingleClientCustomerOrderDetailRpcResponse.class));
// builder.addAllResponses(ProtoBeanUtil.beanListToProtoList(list, SingleClientCustomerOrderDetailRpcResponse.class));
builder.addAllResponses(DbToProtoUtil.orderDetailDbListToProtoList(list));
}
} catch (final Exception e) {
log.error("getClientCustomerOrderDetailsByIds error;", e);
......
......@@ -16,6 +16,8 @@ import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrde
import com.tianting.infoloop.mapper.OrderDbMapper;
import com.tianting.infoloop.model.db.OrderDb;
import com.tianting.infoloop.model.db.OrderDetailDb;
import com.tianting.infoloop.model.dto.CustomerNoticeDto;
import com.tianting.infoloop.model.dto.MealDetailJson;
import com.tianting.infoloop.service.OrderDbService;
import com.tianting.infoloop.service.OrderDetailDbService;
import com.tianting.infoloop.utils.exception.ErrorCodeConstants;
......@@ -98,9 +100,12 @@ public class OrderDbServiceImpl extends ServiceImpl<OrderDbMapper, OrderDb> impl
if (createOrderRpcRequest.getCreation().getShouldCreateRemark()) {
orderDb.setRemark(createOrderRpcRequest.getCreation().getRemark());
}
if (createOrderRpcRequest.getCreation().getShouldCreateCustomerNoticeJson()) {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode notice = objectMapper.valueToTree(createOrderRpcRequest.getCreation().getCustomerNoticeJson());
if (createOrderRpcRequest.getCreation().getShouldCreateCustomerNoticeJson()) {
JsonNode notice = objectMapper.valueToTree(CustomerNoticeDto.builder()
.avoids(createOrderRpcRequest.getCreation().getCustomerNoticeJson().getAvoidsList())
.doctors(createOrderRpcRequest.getCreation().getCustomerNoticeJson().getDoctorsList())
.build());
orderDb.setCustomerNoticeJson(notice);
}
LocalDateTime mealTime = Instant.ofEpochMilli(createOrderRpcRequest.getCreation().getMealTime())
......@@ -149,7 +154,19 @@ public class OrderDbServiceImpl extends ServiceImpl<OrderDbMapper, OrderDb> impl
}
orderDetailDb.setNotServe(false);
if (detailCreation.getShouldCreateMealDetailJson()) {
// orderDetailDb.setMealDetailJson(objectMapper.valueToTree(detailCreation.getMealDetailJson()));
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
.allergies(detailCreation.getMealDetailJson().getAllergiesList())
.avoids(detailCreation.getMealDetailJson().getAvoidsList())
.basicMaterials(detailCreation.getMealDetailJson().getBasicMaterials())
.carbohydrate(detailCreation.getMealDetailJson().getCarbohydrate())
.dockers(detailCreation.getMealDetailJson().getDockersList())
.efficacies(detailCreation.getMealDetailJson().getEfficaciesList())
.energy(detailCreation.getMealDetailJson().getEnergy())
.fat(detailCreation.getMealDetailJson().getFat())
.protein(detailCreation.getMealDetailJson().getProtein())
.skus(detailCreation.getMealDetailJson().getSkusList())
.tastes(detailCreation.getMealDetailJson().getTastesList())
.build()));//detailCreation.getMealDetailJson()
}
return orderDetailDb;
})
......@@ -308,7 +325,10 @@ public class OrderDbServiceImpl extends ServiceImpl<OrderDbMapper, OrderDb> impl
orderDb.setRemark(creation.getRemark());
}
if (creation.getShouldCreateCustomerNoticeJson()) {
JsonNode notice = objectMapper.valueToTree(creation.getCustomerNoticeJson());
JsonNode notice = objectMapper.valueToTree(CustomerNoticeDto.builder()
.avoids(creation.getCustomerNoticeJson().getAvoidsList())
.doctors(creation.getCustomerNoticeJson().getDoctorsList())
.build());
orderDb.setCustomerNoticeJson(notice);
}
LocalDateTime mealTime = Instant.ofEpochMilli(creation.getMealTime())
......@@ -356,7 +376,19 @@ public class OrderDbServiceImpl extends ServiceImpl<OrderDbMapper, OrderDb> impl
}
orderDetailDb.setNotServe(false);
if (detailCreation.getShouldCreateMealDetailJson()) {
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(detailCreation.getMealDetailJson()));
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
.allergies(detailCreation.getMealDetailJson().getAllergiesList())
.avoids(detailCreation.getMealDetailJson().getAvoidsList())
.basicMaterials(detailCreation.getMealDetailJson().getBasicMaterials())
.carbohydrate(detailCreation.getMealDetailJson().getCarbohydrate())
.dockers(detailCreation.getMealDetailJson().getDockersList())
.efficacies(detailCreation.getMealDetailJson().getEfficaciesList())
.energy(detailCreation.getMealDetailJson().getEnergy())
.fat(detailCreation.getMealDetailJson().getFat())
.protein(detailCreation.getMealDetailJson().getProtein())
.skus(detailCreation.getMealDetailJson().getSkusList())
.tastes(detailCreation.getMealDetailJson().getTastesList())
.build()));
}
return orderDetailDb;
})
......@@ -377,7 +409,8 @@ public class OrderDbServiceImpl extends ServiceImpl<OrderDbMapper, OrderDb> impl
QueryWrapper<OrderDb> wrapper = new QueryWrapper<>();
wrapper.eq("customerId", customerId)
.orderByDesc("createdAt");
return orderDbMapper.selectList(wrapper);
final var res = orderDbMapper.selectList(wrapper);
return res;
}
@Override
......@@ -462,7 +495,10 @@ public class OrderDbServiceImpl extends ServiceImpl<OrderDbMapper, OrderDb> impl
}
ObjectMapper objectMapper = new ObjectMapper();
if (updateOrderRequest.getModification().getShouldUpdateCustomerNoticeJson()) {
orderDb.setCustomerNoticeJson(objectMapper.valueToTree(updateOrderRequest.getModification().getCustomerNoticeJson()));
orderDb.setCustomerNoticeJson(objectMapper.valueToTree(CustomerNoticeDto.builder()
.avoids(updateOrderRequest.getModification().getCustomerNoticeJson().getAvoidsList())
.doctors(updateOrderRequest.getModification().getCustomerNoticeJson().getDoctorsList())
.build()));
}
if (updateOrderRequest.getModification().getShouldUpdateIsRead()) {
orderDb.setIsRead(updateOrderRequest.getModification().getIsRead());
......@@ -557,7 +593,10 @@ public class OrderDbServiceImpl extends ServiceImpl<OrderDbMapper, OrderDb> impl
}
ObjectMapper objectMapper = new ObjectMapper();
if (modification.getShouldUpdateCustomerNoticeJson()) {
orderDb.setCustomerNoticeJson(objectMapper.valueToTree(modification.getCustomerNoticeJson()));
orderDb.setCustomerNoticeJson(objectMapper.valueToTree(CustomerNoticeDto.builder()
.avoids(modification.getCustomerNoticeJson().getAvoidsList())
.doctors(modification.getCustomerNoticeJson().getDoctorsList())
.build()));
}
if (modification.getShouldUpdateIsRead()) {
orderDb.setIsRead(modification.getIsRead());
......
......@@ -17,6 +17,7 @@ import com.tianting.infoloop.mapper.OrderDbMapper;
import com.tianting.infoloop.mapper.OrderDetailMapper;
import com.tianting.infoloop.model.db.OrderDb;
import com.tianting.infoloop.model.db.OrderDetailDb;
import com.tianting.infoloop.model.dto.MealDetailJson;
import com.tianting.infoloop.service.OrderDetailDbService;
import com.tianting.infoloop.utils.ProtoBeanUtil;
import com.tianting.infoloop.utils.exception.ErrorCodeConstants;
......@@ -67,7 +68,19 @@ public class OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, Ord
}
orderDetailDb.setNotServe(false);
if (createOrderDetailRequest.getCreation().getShouldCreateMealDetailJson()) {
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(createOrderDetailRequest.getCreation().getMealDetailJson()));
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
.allergies(createOrderDetailRequest.getCreation().getMealDetailJson().getAllergiesList())
.avoids(createOrderDetailRequest.getCreation().getMealDetailJson().getAvoidsList())
.basicMaterials(createOrderDetailRequest.getCreation().getMealDetailJson().getBasicMaterials())
.carbohydrate(createOrderDetailRequest.getCreation().getMealDetailJson().getCarbohydrate())
.dockers(createOrderDetailRequest.getCreation().getMealDetailJson().getDockersList())
.efficacies(createOrderDetailRequest.getCreation().getMealDetailJson().getEfficaciesList())
.energy(createOrderDetailRequest.getCreation().getMealDetailJson().getEnergy())
.fat(createOrderDetailRequest.getCreation().getMealDetailJson().getFat())
.protein(createOrderDetailRequest.getCreation().getMealDetailJson().getProtein())
.skus(createOrderDetailRequest.getCreation().getMealDetailJson().getSkusList())
.tastes(createOrderDetailRequest.getCreation().getMealDetailJson().getTastesList())
.build()));
}
boolean res = this.save(orderDetailDb);
if (!res) {
......@@ -80,8 +93,6 @@ public class OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, Ord
public List<OrderDetailDb> batchCreateOrderDetailDb(BatchCreateClientCustomerOrderDetailsRpcRequest
batchCreateOrderDetailsRequest) {
ObjectMapper objectMapper = new ObjectMapper();
// objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
// objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
var list = batchCreateOrderDetailsRequest.getCreationsList().stream()
.map(creation -> {
OrderDetailDb orderDetailDb = new OrderDetailDb();
......@@ -110,14 +121,19 @@ public class OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, Ord
orderDetailDb.setAdjustSkuRemark(creation.getAdjustSkuRemark());
}
if (creation.getShouldCreateMealDetailJson()) {
// final JsonNode a;
// try {
// a = objectMapper.readTree(ProtoBeanUtil.protoToJson(creation.getMealDetailJson()));
// orderDetailDb.setMealDetailJson(a);
// System.out.println(a);
// } catch (JsonProcessingException e) {
// e.printStackTrace();
// }
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
.allergies(creation.getMealDetailJson().getAllergiesList())
.avoids(creation.getMealDetailJson().getAvoidsList())
.basicMaterials(creation.getMealDetailJson().getBasicMaterials())
.carbohydrate(creation.getMealDetailJson().getCarbohydrate())
.dockers(creation.getMealDetailJson().getDockersList())
.efficacies(creation.getMealDetailJson().getEfficaciesList())
.energy(creation.getMealDetailJson().getEnergy())
.fat(creation.getMealDetailJson().getFat())
.protein(creation.getMealDetailJson().getProtein())
.skus(creation.getMealDetailJson().getSkusList())
.tastes(creation.getMealDetailJson().getTastesList())
.build()));
}
return orderDetailDb;
})
......@@ -162,8 +178,19 @@ public class OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, Ord
}
if (updateOrderDetailRequest.getModification().getShouldUpdateMealDetailJson()) {
ObjectMapper objectMapper = new ObjectMapper();
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(updateOrderDetailRequest.
getModification().getMealDetailJson()));
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
.allergies(updateOrderDetailRequest.getModification().getMealDetailJson().getAllergiesList())
.avoids(updateOrderDetailRequest.getModification().getMealDetailJson().getAvoidsList())
.basicMaterials(updateOrderDetailRequest.getModification().getMealDetailJson().getBasicMaterials())
.carbohydrate(updateOrderDetailRequest.getModification().getMealDetailJson().getCarbohydrate())
.dockers(updateOrderDetailRequest.getModification().getMealDetailJson().getDockersList())
.efficacies(updateOrderDetailRequest.getModification().getMealDetailJson().getEfficaciesList())
.energy(updateOrderDetailRequest.getModification().getMealDetailJson().getEnergy())
.fat(updateOrderDetailRequest.getModification().getMealDetailJson().getFat())
.protein(updateOrderDetailRequest.getModification().getMealDetailJson().getProtein())
.skus(updateOrderDetailRequest.getModification().getMealDetailJson().getSkusList())
.tastes(updateOrderDetailRequest.getModification().getMealDetailJson().getTastesList())
.build()));
}
return orderDetailMapper.updateById(orderDetailDb) > 0;
}
......@@ -203,7 +230,19 @@ public class OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, Ord
}
if (modification.getShouldUpdateMealDetailJson()) {
ObjectMapper objectMapper = new ObjectMapper();
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(modification.getMealDetailJson()));
orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
.allergies(modification.getMealDetailJson().getAllergiesList())
.avoids(modification.getMealDetailJson().getAvoidsList())
.basicMaterials(modification.getMealDetailJson().getBasicMaterials())
.carbohydrate(modification.getMealDetailJson().getCarbohydrate())
.dockers(modification.getMealDetailJson().getDockersList())
.efficacies(modification.getMealDetailJson().getEfficaciesList())
.energy(modification.getMealDetailJson().getEnergy())
.fat(modification.getMealDetailJson().getFat())
.protein(modification.getMealDetailJson().getProtein())
.skus(modification.getMealDetailJson().getSkusList())
.tastes(modification.getMealDetailJson().getTastesList())
.build()));
}
return orderDetailDb;
}).collect(Collectors.toList());
......
This diff is collapsed. Click to expand it.
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
......@@ -8,7 +8,12 @@ import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
@MappedTypes(JsonNode.class)
// 定义这个类型处理器对应的JDBC类型为OTHER(因为JSON数据在这种情况下没有直接对应的标准JDBC类型)
@MappedJdbcTypes(JdbcType.OTHER)
public class MysqlTypeTransferUtil extends BaseTypeHandler<JsonNode> {
private static final ObjectMapper objectMapper = new ObjectMapper();
......
package com.tianting.infoloop.utils;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
......@@ -159,7 +161,24 @@ public class ProtoBeanUtil {
return LocalDate.ofInstant(Instant.ofEpochMilli(Long.parseLong(in.nextString())), DateFormatterConstants.CHINA_ZONE);
}
}
).create();
)
// .registerTypeAdapter(JsonNode.class, new TypeAdapter<JsonNode>() {
// private final ObjectMapper objectMapper = new ObjectMapper();
// @Override
// public void write(JsonWriter out, JsonNode value) throws IOException {
// if (value!= null) {
// out.value(value.toString());
// } else {
// out.nullValue();
// }
// }
//
// @Override
// public JsonNode read(JsonReader in) throws IOException {
// return objectMapper.readValue(in.nextString(), JsonNode.class);
// }
// })
.create();
return gson;
}
......