zhuyifan

Merge branch 'feature/2025-11-17' into 'master'

Feature/2025 11 17



See merge request !13
......@@ -60,4 +60,5 @@ public class PayController {
public String cancel(@Valid @RequestBody PayDTO.PayRefundRequestDto payRefundRequestDto) {
return payServiceClient.orderPayRefund(payRefundRequestDto);
}
}
\ No newline at end of file
......
package com.infoloop.tianting.model.bo;
import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum;
import lombok.Data;
@Data
public class OrderDetailBO {
private int id;
public int skuId;
private String skuName;
private Integer price;
private int count;
private String adjustSkuRemark;
private ServeStatusEnum serveStatus;
}
......@@ -520,6 +520,7 @@ public class OrderDbDTO {
private Integer count;
private String adjustSkuRemark;
private String serveStatus;
private Integer price;
}
......@@ -730,6 +731,10 @@ public class OrderDbDTO {
@Builder.Default
private Boolean shouldUpdateServeStatus = false;
@ApiModelProperty(value = "价格")
@Builder.Default
private Integer price = null;
@ApiModelProperty(value = "出餐状态: 默认未出餐=1; 不出餐=2; 已出餐=3")
@Builder.Default
private ServeStatusEnum serveStatus = ServeStatusEnum.SERVE_NOT_START;
......
......@@ -9,6 +9,8 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@ApiModel(description = "支付DTO")
public class PayDTO {
......@@ -31,6 +33,7 @@ public class PayDTO {
@AllArgsConstructor
public static class PayRefundRequestDto {
private Integer orderId;
private List<Integer> orderDetailIds;
private String hospitalCode;
}
......
......@@ -18,6 +18,9 @@ public class PaymentCallbackResult {
@JacksonXmlProperty(localName = "TransSN")
private String transSN;
@JacksonXmlProperty(localName = "TradeReferenceNo")
private String tradeReferenceNo;
@JacksonXmlProperty(localName = "TransType")
private String transType;
......
......@@ -103,6 +103,8 @@ public class SettlementDTO {
private String remark;
private String avoidRemark;
private String onlinePay;
private String operationType;
private String tradeReferenceNo;
}
@Data
......
......@@ -22,6 +22,8 @@ import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderBy
import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderDetailsByIdsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderDetailsByOrderIdsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrdersByCustomerIdRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.GetOrderOperationRecordsByOrderIdsRequest;
import com.infoloop.tianting.clientcustomerorderservice.GetOrderOperationRecordsByOrderIdsResponse;
import com.infoloop.tianting.clientcustomerorderservice.MealDetail;
import com.infoloop.tianting.clientcustomerorderservice.OnlinePayEnum;
import com.infoloop.tianting.clientcustomerorderservice.OrderOperationRecordCreation;
......@@ -240,8 +242,10 @@ public class OrderServiceRpcClient {
final var operator = operatorServiceRpcClient.getCOperatorById(operatorLoginInfo.getId());
final var idsOfNeedUpdateMenuDetails = new ArrayList<Integer>();
final var idsOfAddCount = new ArrayList<Integer>();
final var idsOfNoReject = new ArrayList<Integer>();
List<OrderDetailDto> originalOrderDetails = new ArrayList<>();
List<OrderDetailDto> newOrderDetails;
final var orderDetailsMap = orderDetailBatchUpdateDto.getDetails().stream().collect(Collectors.toMap(OrderDbDTO.OrderDetailUpdateDto::getId, Function.identity()));
final var modifications = orderDetailBatchUpdateDto.getDetails().stream().map(d -> {
var mealDetail = MealDetail.newBuilder().build();
Integer menuDetailId = 0;
......@@ -280,9 +284,11 @@ public class OrderServiceRpcClient {
.build();
}
}
ServeStatusEnum serveStatus = ServeStatusEnum.UNKNOWN_SERVE_STATUS;
if (d.getShouldUpdateServeStatus()) {
if (d.getServeStatus() == ServeStatusEnum.SERVE_REJECT) {
idsOfNoReject.add(d.getId());
}
serveStatus = d.getServeStatus();
}
Integer count = 0;
......@@ -319,7 +325,8 @@ public class OrderServiceRpcClient {
.build();
final var totalIds = new ArrayList<>(idsOfNeedUpdateMenuDetails);
totalIds.addAll(idsOfAddCount);
if (!idsOfNeedUpdateMenuDetails.isEmpty() || !idsOfAddCount.isEmpty()) {
totalIds.addAll(idsOfNoReject);
if (!totalIds.isEmpty()) {
final var orgionalResponseList = getClientCustomerOrderDetailsByIds(totalIds);
originalOrderDetails = orgionalResponseList.stream().map(d -> OrderDetailDto.builder()
.id(d.getId())
......@@ -357,7 +364,7 @@ public class OrderServiceRpcClient {
}
final var res = orderServiceRpcBlockingStub.batchUpdateClientCustomerOrderDetails(request);
if (res.getIsUpdated()) {
if (!idsOfNeedUpdateMenuDetails.isEmpty() || !idsOfAddCount.isEmpty()) {
if (!totalIds.isEmpty()) {
final var newResponseList = getClientCustomerOrderDetailsByIds(totalIds);
newOrderDetails = newResponseList.stream().map(d ->
OrderDetailDto.builder()
......@@ -392,15 +399,21 @@ public class OrderServiceRpcClient {
.updateSource(d.getUpdateSource().getNumber())
.updatedAt(DateUtil.formatDate(d.getUpdatedAt()))
.updatedBy(d.getUpdatedBy())
.build()).collect(Collectors.toList());
.build()).toList();
// 替换菜品的操作记录
List<SingleOperationDto> operations = new ArrayList<>();
for (OrderDetailDto originalDetail : originalOrderDetails) {
if (!totalIds.contains(originalDetail.getId())) {
continue;
}
final var orderDetailUpdateDto = orderDetailsMap.get(originalDetail.getId());
OrderOperationType orderOperationType = OrderOperationType.UNKNOWN_OPERATION_TYPE;
if (idsOfNeedUpdateMenuDetails.contains(originalDetail.getId())) {
orderOperationType = OrderOperationType.REPLACE_DISHES;
} else if (idsOfAddCount.contains(originalDetail.getId())) {
orderOperationType = OrderOperationType.ADD_DISHES;
} else if (idsOfNoReject.contains(originalDetail.getId())) {
orderOperationType = OrderOperationType.NOT_SERVE;
}
String originalDetailStr;
String newDetailStr = "";
......@@ -413,6 +426,7 @@ public class OrderServiceRpcClient {
.count(newDetail.get().getCount())
.adjustSkuRemark(newDetail.get().getAdjustSkuRemark())
.serveStatus(newDetail.get().getServeStatus().name())
.price(orderDetailUpdateDto.getPrice() == null ? newDetail.get().getPrice() : orderDetailUpdateDto.getPrice())
.build();
newDetailStr = JsonUtil.writeAsJson(List.of(newOrderDetailOperation));
}
......@@ -423,6 +437,7 @@ public class OrderServiceRpcClient {
.count(originalDetail.getCount())
.adjustSkuRemark(originalDetail.getAdjustSkuRemark())
.serveStatus(originalDetail.getServeStatus().name())
.price(originalDetail.getPrice())
.build();
originalDetailStr = JsonUtil.writeAsJson(List.of(originalOrderDetailOperation));
final var operation = SingleOperationDto.builder()
......@@ -471,7 +486,6 @@ public class OrderServiceRpcClient {
.setCreationSource(batchOperationDto.getCreationSource())
.build();
return orderServiceRpcBlockingStub.batchCreateOrderOperationRecords(request);
}
public QueryClientCustomerOrdersByPaginationRpcResponse queryClientCustomerOrdersByPagination(QueryOrderByPaginationDto queryOrderDto) {
......@@ -489,6 +503,14 @@ public class OrderServiceRpcClient {
return orderServiceRpcBlockingStub.queryClientCustomerOrdersByPagination(request);
}
public GetOrderOperationRecordsByOrderIdsResponse getOrderOperationRecordsByOrderIds(int enterpriseId, List<Integer> orderIds) {
final var request = GetOrderOperationRecordsByOrderIdsRequest.newBuilder()
.setEnterpriseId(enterpriseId)
.addAllOrderIds(orderIds)
.build();
return orderServiceRpcBlockingStub.getOrderOperationRecordsByOrderIds(request);
}
public QueryClientCustomerOrdersByConditionRpcResponse queryClientCustomerOrdersByCondition(OrderDbDTO.QueryOrderDto queryOrderDto) {
final var request = QueryClientCustomerOrdersByConditionRpcRequest.newBuilder()
.setShouldFilterStatus(true)
......
......@@ -38,6 +38,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
......@@ -202,6 +204,8 @@ public class PayServiceClient {
.setStatus(OrderStatusEnum.PREPARING)
.setShouldUpdateTransactionId(true)
.setTransactionId(paymentCallbackResult.getTransSN())
.setShouldUpdateTradeReferenceNo(StringUtils.isNotEmpty(paymentCallbackResult.getTradeReferenceNo()))
.setTradeReferenceNo(StringUtils.isNotEmpty(paymentCallbackResult.getTradeReferenceNo()) ? paymentCallbackResult.getTradeReferenceNo() : "")
.build();
final var updateResponse =
orderServiceRpcClient.updateClientCustomerOrderPaymentResult(orderById, build);
......@@ -346,6 +350,11 @@ public class PayServiceClient {
log.info("Order {} pay is beyond cancel time.", orderId);
throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.ORDER_PAY_REFUND_FAILED);
}
BigDecimal detailPrice = BigDecimal.ZERO;
if (CollectionUtils.isNotEmpty(payRefundRequestDto.getOrderDetailIds())) {
final var orderDetails = orderServiceRpcClient.getClientCustomerOrderDetailsByIds(payRefundRequestDto.getOrderDetailIds());
detailPrice = orderDetails.stream().filter(e -> e.getPrice() > 0).map(e -> new BigDecimal(e.getPrice()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)).reduce(BigDecimal.ZERO, BigDecimal::add);
}
String appId = businessConfig.getPayClientId();
......@@ -355,9 +364,9 @@ public class PayServiceClient {
.minusHours(8)
.format(DateUtil.YMDHMS);
BigDecimal price =
new BigDecimal(orderById.getPayPrice())
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).negate();
BigDecimal price = detailPrice.compareTo(BigDecimal.ZERO) == 0 ?
new BigDecimal(orderById.getPayPrice()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).negate()
: detailPrice.negate();
String payContentStr =
orderById.getId()
......
......@@ -2,6 +2,7 @@ package com.infoloop.tianting.utils;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
......@@ -41,6 +42,14 @@ public class JsonUtil {
}
}
public static <T> T readJsonAs(final String json, final TypeReference<T> typeRef) {
try {
return OBJECT_MAPPER.readValue(json, typeRef);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static <T> T convertValue(final Object object, final Class<T> clazz) {
return OBJECT_MAPPER.convertValue(object, clazz);
}
......
......@@ -32,6 +32,7 @@ service ClientCustomerOrderServiceRpc {
// 操作记录
rpc GetOrderOperationRecordsByOrderId (GetOrderOperationRecordsByOrderIdRequest) returns (GetOrderOperationRecordsByOrderIdResponse) {}
rpc GetOrderOperationRecordsByOrderIds (GetOrderOperationRecordsByOrderIdsRequest) returns (GetOrderOperationRecordsByOrderIdsResponse) {}
rpc BatchCreateOrderOperationRecords (BatchCreateOrderOperationRecordsRequest) returns (BatchCreateOrderOperationRecordsResponse) {}
......@@ -147,6 +148,7 @@ message SingleClientCustomerOrderRpcResponse {
string syncRoomNo = 36;
bool isCanceled = 37;
string avoidRemark = 38;
string tradeReferenceNo = 39;
}
message GetClientCustomerOrderByIdRpcRequest {
......@@ -393,6 +395,8 @@ message ClientCustomerOrderModification {
bool isCanceled = 57;
bool shouldUpdateAvoidRemark = 58;
string avoidRemark = 59;
bool shouldUpdateTradeReferenceNo = 60;
string tradeReferenceNo = 61;
}
message UpdateClientCustomerOrderRpcRequest {
......@@ -624,6 +628,15 @@ message GetOrderOperationRecordsByOrderIdResponse {
repeated OrderOperationRecord responses = 1;
}
message GetOrderOperationRecordsByOrderIdsRequest {
int32 enterpriseId = 1;
repeated int32 orderIds = 2;
}
message GetOrderOperationRecordsByOrderIdsResponse {
repeated OrderOperationRecord responses = 1;
}
message OrderOperationRecordCreation {
int32 orderId = 1;
OrderOperationType type = 2;
......