提交 41f641e3 authored 作者: liuhaiquan's avatar liuhaiquan

Merge remote-tracking branch 'origin/v6.4_transportation_20231110' into test

...@@ -13,7 +13,6 @@ import lombok.AllArgsConstructor; ...@@ -13,7 +13,6 @@ import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List; import java.util.List;
...@@ -61,14 +60,4 @@ public class OrderChildFeignController { ...@@ -61,14 +60,4 @@ public class OrderChildFeignController {
return Result.ok(feignOrderChildService.getLineStatistics(sendSystemAddressId, receiveSystemAddressId)); return Result.ok(feignOrderChildService.getLineStatistics(sendSystemAddressId, receiveSystemAddressId));
} }
@ApiOperation(value = "运单取消/到达最晚拉运时间 同步最后一车", notes = "<br>By:刘海泉")
@RequestMapping(value = "/syncLastTruck", method = RequestMethod.GET)
Result<?> syncLastTruck(@RequestParam("orderNo") @NotBlank(message = "订单编号不能为空") String orderNo){
return lastTruckService.syncLastTruckChild4OrderTrigger(orderNo);
}
} }
...@@ -52,7 +52,7 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int ...@@ -52,7 +52,7 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int
IPage<PageCarrierOrderChildVO> pageCarrierOrderChildList(PageCarrierOrderChildParam param); IPage<PageCarrierOrderChildVO> pageCarrierOrderChildList(PageCarrierOrderChildParam param);
Optional<List<OrderChild>> getOrderChildInfoByOrderGoodsNo(String childNo); Optional<List<OrderChild>> getOrderChildInfoByOrderGoodsNo(String orderGoodsNo);
OrderChild getGoingLatestOrderChild(Long driverUserNo); OrderChild getGoingLatestOrderChild(Long driverUserNo);
...@@ -153,5 +153,7 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int ...@@ -153,5 +153,7 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int
BigDecimal getLastDriverFreightByTransportLine(Integer sendSystemAddressId, Integer receiveSystemAddressId); BigDecimal getLastDriverFreightByTransportLine(Integer sendSystemAddressId, Integer receiveSystemAddressId);
OrderChild findLastTruckChildByCreateTime(String orderNo); OrderChild getOrderCompleteLastTruck(String orderNo);
Long haveArriveReceiveChild(String orderNo);
} }
...@@ -458,6 +458,7 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild, ...@@ -458,6 +458,7 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
LambdaQueryWrapper<OrderChild> query = new LambdaQueryWrapper<>(); LambdaQueryWrapper<OrderChild> query = new LambdaQueryWrapper<>();
query.eq(OrderChild :: getSendSystemAddressId,sendSystemAddressId); query.eq(OrderChild :: getSendSystemAddressId,sendSystemAddressId);
query.eq(OrderChild :: getReceiveSystemAddressId,receiveSystemAddressId); query.eq(OrderChild :: getReceiveSystemAddressId,receiveSystemAddressId);
query.le(OrderChild::getStatus, OrderChildEnum.Status.COMPLETE.getCode());
query.orderByDesc(OrderChild :: getCreateTime); query.orderByDesc(OrderChild :: getCreateTime);
query.last("limit 1"); query.last("limit 1");
OrderChild child = baseMapper.selectOne(query); OrderChild child = baseMapper.selectOne(query);
...@@ -468,11 +469,21 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild, ...@@ -468,11 +469,21 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
} }
@Override @Override
public OrderChild findLastTruckChildByCreateTime(String orderNo) { public OrderChild getOrderCompleteLastTruck(String orderNo) {
LambdaQueryWrapper<OrderChild> query = new LambdaQueryWrapper<>(); LambdaQueryWrapper<OrderChild> query = new LambdaQueryWrapper<>();
query.eq(OrderChild :: getOrderNo,orderNo); query.eq(OrderChild ::getOrderNo,orderNo);
query.orderByDesc(OrderChild ::getCreateTime); query.ge(OrderChild :: getStatus,OrderChildEnum.Status.ARRIVE_SEND.getCode());
query.le(OrderChild :: getStatus,OrderChildEnum.Status.COMPLETE.getCode());
query.orderByDesc(OrderChild :: getArriveReceiveTime);
query.last("limit 1"); query.last("limit 1");
return baseMapper.selectOne(query); return baseMapper.selectOne(query);
} }
@Override
public Long haveArriveReceiveChild(String orderNo) {
LambdaQueryWrapper<OrderChild> query = new LambdaQueryWrapper<>();
query.eq(OrderChild ::getOrderNo,orderNo);
query.lt(OrderChild :: getStatus,OrderChildEnum.Status.ARRIVE_RECEIVE.getCode());
return baseMapper.selectCount(query);
}
} }
...@@ -25,6 +25,6 @@ public class OrderChildLogDaoImpl extends BaseDaoImpl<OrderChildLogMapper, Order ...@@ -25,6 +25,6 @@ public class OrderChildLogDaoImpl extends BaseDaoImpl<OrderChildLogMapper, Order
, OrderChildLogEnum.Type.LOAD.getCode(), OrderChildLogEnum.Type.UNLOAD.getCode() , OrderChildLogEnum.Type.LOAD.getCode(), OrderChildLogEnum.Type.UNLOAD.getCode()
, OrderChildLogEnum.Type.DRIVER_CANCEL.getCode(), OrderChildLogEnum.Type.PLATFORM_CANCEL.getCode() , OrderChildLogEnum.Type.DRIVER_CANCEL.getCode(), OrderChildLogEnum.Type.PLATFORM_CANCEL.getCode()
, OrderChildLogEnum.Type.OWNER_CANCEL.getCode(), OrderChildLogEnum.Type.DRIVER_CONFIRM.getCode() , OrderChildLogEnum.Type.OWNER_CANCEL.getCode(), OrderChildLogEnum.Type.DRIVER_CONFIRM.getCode()
, OrderChildLogEnum.Type.ARTIFICIAL_CANCEL.getCode()).groupBy(OrderChildLog::getType)); , OrderChildLogEnum.Type.ARTIFICIAL_CANCEL.getCode()).groupBy(OrderChildLog::getType).orderByAsc(OrderChildLog::getId));
} }
} }
...@@ -50,6 +50,9 @@ public class OrderGoodsTruckBindDaoImpl extends BaseDaoImpl<OrderGoodsTruckBindM ...@@ -50,6 +50,9 @@ public class OrderGoodsTruckBindDaoImpl extends BaseDaoImpl<OrderGoodsTruckBindM
return Optional.ofNullable(getOne(lQrWrapper() return Optional.ofNullable(getOne(lQrWrapper()
.eq(OrderGoodsTruckBind::getOrderGoodsNo, orderGoodsNo) .eq(OrderGoodsTruckBind::getOrderGoodsNo, orderGoodsNo)
.eq(OrderGoodsTruckBind::getTruckNo, truckNo) .eq(OrderGoodsTruckBind::getTruckNo, truckNo)
.in(OrderGoodsTruckBind::getStatus, OrderGoodsTruckBindEnum.Status.NORMAL.getCode(),
OrderGoodsTruckBindEnum.Status.GET.getCode()
)
)); ));
} }
...@@ -136,6 +139,7 @@ public class OrderGoodsTruckBindDaoImpl extends BaseDaoImpl<OrderGoodsTruckBindM ...@@ -136,6 +139,7 @@ public class OrderGoodsTruckBindDaoImpl extends BaseDaoImpl<OrderGoodsTruckBindM
query.in(OrderGoodsTruckBind::getStatus, OrderGoodsTruckBindEnum.Status.NORMAL.getCode(), query.in(OrderGoodsTruckBind::getStatus, OrderGoodsTruckBindEnum.Status.NORMAL.getCode(),
OrderGoodsTruckBindEnum.Status.GET.getCode(), OrderGoodsTruckBindEnum.Status.SUCCESS.getCode()); OrderGoodsTruckBindEnum.Status.GET.getCode(), OrderGoodsTruckBindEnum.Status.SUCCESS.getCode());
query.orderByDesc(OrderGoodsTruckBind :: getCreateTime); query.orderByDesc(OrderGoodsTruckBind :: getCreateTime);
query.groupBy(OrderGoodsTruckBind::getTruckNo);
return baseMapper.selectList(query); return baseMapper.selectList(query);
} }
......
...@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; ...@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.clx.open.sdk.callback.OpenCallBackClient; import com.clx.open.sdk.callback.OpenCallBackClient;
import com.clx.open.sdk.callback.message.OrderChildMessage; import com.clx.open.sdk.callback.message.OrderChildMessage;
import com.clx.open.sdk.enums.ResultStatusEnum; import com.clx.open.sdk.enums.ResultStatusEnum;
import com.clx.order.enums.OrderEnum;
import com.clx.order.enums.SyncPlatformEnum; import com.clx.order.enums.SyncPlatformEnum;
import com.clx.order.feign.OrderFeign; import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignOrderVO; import com.clx.order.vo.feign.FeignOrderVO;
...@@ -95,14 +96,29 @@ public class OrderChildDtsListener { ...@@ -95,14 +96,29 @@ public class OrderChildDtsListener {
OpenCallBackClient client = new OpenCallBackClient(mslAppConfig.getUrl(),mslAppConfig.getAppId(),mslAppConfig.getSecret()); OpenCallBackClient client = new OpenCallBackClient(mslAppConfig.getUrl(),mslAppConfig.getAppId(),mslAppConfig.getSecret());
Result<?> result = client.encryptPost(JSON.toJSONString(after),after.topic()); Result<?> result = client.encryptPost(JSON.toJSONString(after),after.topic());
log.info("运单信息同步,运单编号:{},响应结果:{}",after.getChildNo(),JSON.toJSONString(result)); log.info("运单信息同步,运单编号:{},响应结果:{}",after.getChildNo(),JSON.toJSONString(result));
syncLastTruck(orderInfoFeign,after);
}
}
public void syncLastTruck(FeignOrderVO orderInfoFeign,OrderChildMessage after){
//当运单状态为到达目的地之后的状态时候,需要判断最后一车的逻辑 //当运单状态为到达目的地之后的状态时候,需要判断最后一车的逻辑
if(after.getStatus() >= OrderChildEnum.Status.ARRIVE_RECEIVE.getCode() && after.getStatus() <= OrderChildEnum.Status.COMPLETE.getCode()){ if(after.getStatus() >= OrderChildEnum.Status.ARRIVE_RECEIVE.getCode() && after.getStatus() <= OrderChildEnum.Status.COMPLETE.getCode()){
OrderChild child = lastTruckService.getLastTruckChild(after.getOrderNo()); OrderChild child;
if(Objects.equals(orderInfoFeign.getOrderStatus(), OrderEnum.Status.COMPLETED.getCode()) ||
Objects.equals(orderInfoFeign.getOrderStatus(), OrderEnum.Status.SUCCESS.getCode())) { //订单变成已完成 || 已完结
OrderEnum.Status byCode = OrderEnum.Status.getByCode(orderInfoFeign.getOrderStatus());
log.info("订单号:{},运单号:{},订单状态:{},开始查询最后一车运单===========" ,orderInfoFeign.getOrderNo(),after.getChildNo(),
Objects.nonNull(byCode)?byCode.getName():"未知状态");
child = lastTruckService.getOrderCompleteLastTruck(after.getOrderNo());
}else{ // 订单除 已完成 || 已完结 外的其他状态
child = lastTruckService.getLastTruckChild(after.getOrderNo());
}
if(Objects.nonNull(child)){ if(Objects.nonNull(child)){
lastTruckService.syncLastTruckChild(child); lastTruckService.syncLastTruckChild(child);
} }
} }
} }
}
} }
package com.clx.performance.service; package com.clx.performance.service;
import com.clx.performance.model.OrderChild; import com.clx.performance.model.OrderChild;
import com.msl.common.result.Result;
public interface LastTruckService { public interface LastTruckService {
OrderChild getLastTruckChild(String orderNo); OrderChild getLastTruckChild(String orderNo);
Result<?> syncLastTruckChild(OrderChild child); void syncLastTruckChild(OrderChild child);
Result<?> syncLastTruckChild4OrderTrigger(String orderNo);
OrderChild getOrderCompleteLastTruck(String orderNo);
} }
...@@ -67,29 +67,24 @@ public class LastTruckServiceImpl implements LastTruckService { ...@@ -67,29 +67,24 @@ public class LastTruckServiceImpl implements LastTruckService {
* @return * @return
**/ **/
@Override @Override
public Result<?> syncLastTruckChild(OrderChild child) { public void syncLastTruckChild(OrderChild child) {
OrderChildMessage message = orderChildStruct.convertMessage(child); OrderChildMessage message = orderChildStruct.convertMessage(child);
message.setLastFlag(ResultStatusEnum.YES.getCode()); message.setLastFlag(ResultStatusEnum.YES.getCode());
log.info("开始同步最后一车的运单,运单编号:{},运单信息:{}",child.getChildNo(), JSON.toJSONString(message)); log.info("开始同步最后一车的运单,运单编号:{},运单信息:{}",child.getChildNo(), JSON.toJSONString(message));
OpenCallBackClient client2 = new OpenCallBackClient(mslAppConfig.getUrl(),mslAppConfig.getAppId(),mslAppConfig.getSecret()); OpenCallBackClient client2 = new OpenCallBackClient(mslAppConfig.getUrl(),mslAppConfig.getAppId(),mslAppConfig.getSecret());
Result<?> result2 = client2.encryptPost(JSON.toJSONString(message),message.topic()); Result<?> result2 = client2.encryptPost(JSON.toJSONString(message),message.topic());
log.info("结束同步最后一车的运单,运单编号:{},响应结果:{}",child.getChildNo(),JSON.toJSONString(result2)); log.info("结束同步最后一车的运单,运单编号:{},响应结果:{}",child.getChildNo(),JSON.toJSONString(result2));
return result2;
} }
/** @Override
* @Author kavin public OrderChild getOrderCompleteLastTruck(String orderNo) {
* @Description 订单取消、到达最晚拉运时间 同步最后一车 //判断当前订单下是否存在未到达目的地之前的运单 && 排除掉已取消的运单
* @Param [orderNo] Long count = orderChildDao.haveArriveReceiveChild(orderNo);
* @return log.info("已完成/已完结的订单号:{},查询运单状态非取消并且在到达目的地之前的运单数量为:{}",orderNo,count);
**/ if(count == 0 ){
public Result<?> syncLastTruckChild4OrderTrigger(String orderNo) { //说明排除已取消的运单后,剩下的所有运单都已经是到达目的地之后的状态,根据到达目的地的时间倒序取出第一条运单作为最后一车
OrderChild child = orderChildDao.findLastTruckChildByCreateTime(orderNo); return orderChildDao.getOrderCompleteLastTruck(orderNo);
log.info("订单取消/到达最晚拉运时间获取最后一车运单,订单号:{} ,获取到的最后一车的运单信息:{}",orderNo,JSON.toJSONString(child));
if(Objects.nonNull(child)){
return syncLastTruckChild(child);
} }
return Result.ok("承运系统提示:承运系统未查询到该订单下的运单信息"); return null;
} }
} }
...@@ -1276,9 +1276,9 @@ public class OrderChildServiceImpl implements OrderChildService { ...@@ -1276,9 +1276,9 @@ public class OrderChildServiceImpl implements OrderChildService {
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND); OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
OrderChildVO result = orderChildStruct.convert(orderChild); OrderChildVO result = orderChildStruct.convert(orderChild);
result.setLastArriveSendTime(LocalDateTimeUtils.convertLocalDateTimeToDefaultString(orderGoods.getLastArriveSendTime())); result.setLastArriveSendTime(orderGoods.getLastArriveSendTime()==null? null : LocalDateTimeUtils.convertLocalDateTimeToDefaultString(orderGoods.getLastArriveSendTime()));
result.setLastArriveReceiveTime(LocalDateTimeUtils.convertLocalDateTimeToDefaultString(orderGoods.getLastArriveReceiveTime())); result.setLastArriveReceiveTime(orderGoods.getLastArriveReceiveTime()==null? null : LocalDateTimeUtils.convertLocalDateTimeToDefaultString(orderGoods.getLastArriveReceiveTime()));
result.setLastLoadTime(LocalDateTimeUtils.convertLocalDateTimeToDefaultString(orderGoods.getLastLoadTime())); result.setLastLoadTime(orderGoods.getLastLoadTime()==null? null : LocalDateTimeUtils.convertLocalDateTimeToDefaultString(orderGoods.getLastLoadTime()));
// 磅单 // 磅单
if (Objects.equals(orderChild.getPoundStatus(), OrderChildPoundAuditEnum.Status.REJECT.getCode())) { if (Objects.equals(orderChild.getPoundStatus(), OrderChildPoundAuditEnum.Status.REJECT.getCode())) {
......
...@@ -364,7 +364,7 @@ public class OrderGoodsServiceImpl implements OrderGoodsService { ...@@ -364,7 +364,7 @@ public class OrderGoodsServiceImpl implements OrderGoodsService {
} }
String orderGoodsNo = orderGoodsParams.getOrderGoodsNo(); String orderGoodsNo = orderGoodsParams.getOrderGoodsNo();
List<OrderChild> orderChildList = orderChildDao.getOrderChildInfoByOrderGoodsNo(orderGoodsNo).get(); List<OrderChild> orderChildList = orderChildDao.selectListByOrderGoodsNo(orderGoodsNo);
boolean pendingOrderWayFlag = CollectionUtils.isNotEmpty(orderChildList); boolean pendingOrderWayFlag = CollectionUtils.isNotEmpty(orderChildList);
if (pendingOrderWayFlag) { if (pendingOrderWayFlag) {
......
...@@ -18,6 +18,7 @@ import com.clx.performance.param.pc.payment.PayParam; ...@@ -18,6 +18,7 @@ import com.clx.performance.param.pc.payment.PayParam;
import com.clx.performance.param.pc.payment.PayUnitDTO; import com.clx.performance.param.pc.payment.PayUnitDTO;
import com.clx.performance.param.pc.payment.PayUserDTO; import com.clx.performance.param.pc.payment.PayUserDTO;
import com.clx.performance.service.ThirdPartRequestLogService; import com.clx.performance.service.ThirdPartRequestLogService;
import com.google.gson.Gson;
import com.msl.common.dto.HttpDTO; import com.msl.common.dto.HttpDTO;
import com.msl.common.enums.ResultCodeEnum; import com.msl.common.enums.ResultCodeEnum;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
...@@ -92,7 +93,7 @@ public class PaymentServiceImpl implements PaymentService { ...@@ -92,7 +93,7 @@ public class PaymentServiceImpl implements PaymentService {
log.info("发起支付请求日志 {}", JSON.toJSONString(payUserDTO)); log.info("发起支付请求日志 {}", JSON.toJSONString(payUserDTO));
Result<Object> notify = (Result<Object>) postRequest(mslPaymentConfig.getHost()+ PERFORMANCE_PAY_CLX_PAYMENT.getUrl(), JSON.toJSONString(payUserDTO)); Result<Object> notify = (Result<Object>) postRequest(mslPaymentConfig.getHost()+ PERFORMANCE_PAY_CLX_PAYMENT.getUrl(), JSON.toJSONString(payUserDTO));
log.info("支付返回日志 {}", notify); log.info("支付返回日志 {}", notify);
if (notify == null || StringUtils.isNotBlank(notify.getMsg())) { if (notify == null || notify.getCode() != 0) {
//FEGIN返回null //FEGIN返回null
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, notify.getMsg()); throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, notify.getMsg());
} }
...@@ -133,7 +134,7 @@ public class PaymentServiceImpl implements PaymentService { ...@@ -133,7 +134,7 @@ public class PaymentServiceImpl implements PaymentService {
log.info("发起支付请求日志 {}", payUserDTO); log.info("发起支付请求日志 {}", payUserDTO);
Result<Object> notify = (Result<Object>) postRequest(mslPaymentConfig.getHost()+ PERFORMANCE_PAY_CLX_PAYMENT.getUrl(), JSON.toJSONString(payUserDTO)); Result<Object> notify = (Result<Object>) postRequest(mslPaymentConfig.getHost()+ PERFORMANCE_PAY_CLX_PAYMENT.getUrl(), JSON.toJSONString(payUserDTO));
log.info("支付返回日志 {}", notify); log.info("支付返回日志 {}", notify);
if (notify == null || StringUtils.isNotBlank(notify.getMsg())) { if (notify == null || notify.getCode() != 0) {
//FEGIN返回null //FEGIN返回null
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, notify.getMsg()); throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, notify.getMsg());
} }
...@@ -169,9 +170,11 @@ public class PaymentServiceImpl implements PaymentService { ...@@ -169,9 +170,11 @@ public class PaymentServiceImpl implements PaymentService {
})) }))
.peek(dto -> log.info("http请求返回------dto->{}", dto)) .peek(dto -> log.info("http请求返回------dto->{}", dto))
.mapTry(dto -> EncryptUtil.decrypt(dto.getData(), TRANSPORT_KEY)) .mapTry(dto -> EncryptUtil.decrypt(dto.getData(), TRANSPORT_KEY))
.map(this::covertResult)
.mapWithObj(new TypeReference<Result<Object>>() {
}, this::covertResult)
.peek(result -> thirdPartRequestLogService.updateResult(httpLogId, result)) .peek(result -> thirdPartRequestLogService.updateResult(httpLogId, result))
.filter(Result::succeed) // .filter(Result::succeed)
.orElseThrow(); .orElseThrow();
} catch (GeneralSecurityException e) { } catch (GeneralSecurityException e) {
log.error("解密失败", e); log.error("解密失败", e);
...@@ -179,9 +182,12 @@ public class PaymentServiceImpl implements PaymentService { ...@@ -179,9 +182,12 @@ public class PaymentServiceImpl implements PaymentService {
} }
} }
private <T> Result<?> covertResult(String result) { private <T> Result<T> covertResult(String result, TypeReference<Result<T>> reference) {
return JSON.parseObject(result, Result.class); return new Gson().fromJson(result, reference.getType());
} }
} }
package com.clx.performance.sqlProvider; package com.clx.performance.sqlProvider;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.enums.OrderChildEnum; import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.param.app.PageOrderChildOfDriverParam; import com.clx.performance.param.app.PageOrderChildOfDriverParam;
...@@ -16,7 +15,6 @@ import org.apache.commons.lang3.StringUtils; ...@@ -16,7 +15,6 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL; import org.apache.ibatis.jdbc.SQL;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论