zhuyifan

Merge branch 'feature/order_cancel' into 'master'

Feature/order cancel



See merge request !1
Showing 171 changed files with 456 additions and 76 deletions
......@@ -16,4 +16,6 @@ public class BusinessConfig {
private String clientCustomerQueryUrl;
private String payUrl;
private String payClientId;
private String cancelPayUrl;
private String refundSecurityKey;
}
......
......@@ -7,10 +7,10 @@ import com.infoloop.tianting.intercepter.LoginInterceptor;
import com.infoloop.tianting.intercepter.RequestMonitor;
import com.infoloop.tianting.intercepter.ResourceInjector;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import com.infoloop.tianting.service.client.MeiZhongYiHeServiceClient;
import com.infoloop.tianting.service.client.OperatorServiceRpcClient;
import com.infoloop.tianting.service.client.WOperatorServiceRpcClient;
import com.infoloop.tianting.tracing.HttpTracingInterceptor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
......@@ -37,12 +37,13 @@ public class WebMvcConfig implements WebMvcConfigurer {
final ResourceInjector resourceInjector,
final ClientCustomerServiceRpcClient clientCustomerServiceRpcClient,
final OperatorServiceRpcClient operatorServiceRpcClient,
final WOperatorServiceRpcClient wOperatorServiceRpcClient) {
final WOperatorServiceRpcClient wOperatorServiceRpcClient,
final MeiZhongYiHeServiceClient meiZhongYiHeServiceClient) {
this.httpInterceptors = new ArrayList<>();
this.httpInterceptors.add(new HttpTracingInterceptor(tracing));
this.httpInterceptors.add(new RequestMonitor());
this.httpInterceptors.add(new ApiSignInterceptor());
this.httpInterceptors.add(new LoginInterceptor(clientCustomerServiceRpcClient, operatorServiceRpcClient, wOperatorServiceRpcClient));
this.httpInterceptors.add(new LoginInterceptor(clientCustomerServiceRpcClient, meiZhongYiHeServiceClient, operatorServiceRpcClient, wOperatorServiceRpcClient));
this.httpInterceptors.add(resourceInjector);
}
......
......@@ -35,4 +35,11 @@ public class ClientOrderController {
return orderService.getOrdersByPagination(queryOrderDto);
}
@ApiOperation(value = "院区端已撤销订单")
@PostMapping("/client/orders/refund/pagination")
@ResponseStatus(HttpStatus.OK)
public OrderPageResult<OrderDto> getRefundOrderByByPagination(@Valid @RequestBody OrderDbDTO.QueryRefundOrderByPaginationDto queryOrderDto) {
return orderService.getRefundOrdersByPagination(queryOrderDto);
}
}
......
package com.infoloop.tianting.controller;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.infoloop.tianting.model.dto.ClientLabelDTO;
import com.infoloop.tianting.model.dto.ClientLabelDTO.LabelDto;
import com.infoloop.tianting.model.dto.KdsDTO;
import com.infoloop.tianting.model.dto.KdsDTO.KdsMealDetailDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderLocationDto;
......@@ -10,8 +8,6 @@ import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderSkuDto;
import com.infoloop.tianting.service.KdsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import javax.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -22,6 +18,9 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.util.List;
@Api(tags = "KDS")
@ApiSupport(order = -1)
@Slf4j
......
......@@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -53,4 +54,10 @@ public class PayController {
return payServiceClient.callback(paymentCallbackDTO);
}
@ApiOperation(value = "支付撤销")
@PostMapping(value = "/pay/refund", produces = MediaType.TEXT_HTML_VALUE)
@ResponseStatus(HttpStatus.OK)
public String cancel(@Valid @RequestBody PayDTO.PayRefundRequestDto payRefundRequestDto) {
return payServiceClient.orderPayRefund(payRefundRequestDto);
}
}
\ No newline at end of file
......
......@@ -34,7 +34,15 @@ public enum ErrorCodeEnum implements BaseEnum {
SKUS_STOCK_NO_ENOUGH_TODAY(406000008, "下单菜品: {0} 库存不足"),
ORDER_CANCEL(406000009, "订单已自动取消")
ORDER_CANCEL(406000009, "订单已自动取消"),
ORDER_PAY_REFUND_FAILED(406000010, "支付撤销失败"),
ORDER_NOT_FOUND(406000011, "订单未找到"),
ORDER_NOT_ONLINE_PAY(406000012, "该订单不是在线支付"),
ORDER_NOT_SUCCESS(406000013, "该订单未支付成功")
;
private final int code;
......
......@@ -4,12 +4,13 @@ import com.infoloop.tianting.clientcustomerservice.ClientCustomerHospitalRecordH
import com.infoloop.tianting.clientcustomerservice.ClientCustomerSexEnum;
import com.infoloop.tianting.model.dto.MenuDbDTO.MenuDto;
import io.swagger.annotations.ApiModel;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@ApiModel(description = "ClientCustomerDTO")
public class ClientCustomerDbDTO {
......
......@@ -5,12 +5,12 @@ import com.infoloop.tianting.clientcustomerorderservice.OrderSourceEnum;
import com.infoloop.tianting.deliveryruleservice.ClientDishLabelStatusEnum;
import com.infoloop.tianting.deliveryruleservice.ClientLabelTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.models.auth.In;
import java.util.List;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import java.util.List;
@Data
@ApiModel(description = "标签DTO")
public class ClientLabelDTO {
......
......@@ -3,11 +3,11 @@ package com.infoloop.tianting.model.dto;
import com.infoloop.tianting.clientinventoryservice.ClientType;
import com.infoloop.tianting.clientinventoryservice.CustomerSource;
import io.swagger.annotations.ApiModel;
import io.swagger.models.auth.In;
import java.util.List;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(description = "院区DTO")
public class InventoryDbDTO {
......
......@@ -6,13 +6,13 @@ import com.infoloop.tianting.model.dto.InventoryDbDTO.ClientDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CustomerDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CustomerNotice;
import io.swagger.annotations.ApiModel;
import io.swagger.models.auth.In;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@ApiModel(description = "kds DTO")
public class KdsDTO {
......
......@@ -2,11 +2,12 @@ package com.infoloop.tianting.model.dto;
import com.infoloop.tianting.setmealscheduleservice.MealStatus;
import io.swagger.annotations.ApiModel;
import java.util.List;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import java.util.List;
@Data
@ApiModel(description = "餐别相关DTO")
public class MealDbDTO {
......
......@@ -2,14 +2,13 @@ package com.infoloop.tianting.model.dto;
import com.infoloop.tianting.clientcustomerorderservice.OrderOperationType;
import com.infoloop.tianting.clientcustomerorderservice.OrderSourceEnum;
import com.infoloop.tianting.model.dto.MenuDbDTO.DishRuleJson;
import com.infoloop.tianting.model.dto.MenuDbDTO.OrderRuleJson;
import io.swagger.annotations.ApiModel;
import java.util.List;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import java.util.List;
@Data
@ApiModel(description = "操作记录DTO")
public class OperationDTO {
......
......@@ -64,6 +64,17 @@ public class OrderDbDTO {
}
@Data
@ApiModel(description = "查询已撤销订单Dto")
public static class QueryRefundOrderByPaginationDto {
private Integer enterpriseId;
private Integer clientId;
private Integer pn;
private Integer pz;
private String keyword;
private List<Integer> stallIds;
}
@Data
@Builder
@ApiModel(description = "订单不同状态的数量Dto")
public static class OrderCountByStatusDto {
......@@ -72,6 +83,7 @@ public class OrderDbDTO {
private Integer preparingCount;
private Integer allServedCount;
private Integer canceledCount;
private Integer refundCount;
}
@Data
......@@ -395,7 +407,7 @@ public class OrderDbDTO {
@ApiModelProperty(value = "支付时间")
private String payTime;
@ApiModelProperty(value = "支付状态,1=待支付,2=支付中,3=支付成功,4=支付失败,5=支付取消")
@ApiModelProperty(value = "支付状态,1=待支付,2=支付中,3=支付成功,4=支付失败,5=支付取消, 6=支付已撤销")
private Integer payStatus;
@ApiModelProperty(value = "支付失败原因")
......@@ -455,12 +467,18 @@ public class OrderDbDTO {
@ApiModelProperty(value = "是否已读")
private Boolean isRead;
@ApiModelProperty(value = "是否已撤销")
private Boolean isCanceled;
@ApiModelProperty(value = "截单类型")
private Integer closeTimeType;
@ApiModelProperty(value = "订单所属用户的信息")
private CustomerDetailDto customer;
@ApiModelProperty(value = "该订单的忌口冲突、医嘱信息")
private List<String> orderNotice;
// @ApiModelProperty(value = "订单菜品详情列表")
// private List<OrderDetailDto> orderDetailDtos;
}
......
......@@ -26,6 +26,15 @@ public class PayDTO {
}
@Data
@ApiModel(description = "支付撤销请求dto")
@NoArgsConstructor
@AllArgsConstructor
public static class PayRefundRequestDto {
private Integer orderId;
private String hospitalCode;
}
@Data
@ApiModel(description = "支付MiniPay结果")
@NoArgsConstructor
@AllArgsConstructor
......@@ -76,6 +85,15 @@ public class PayDTO {
}
@Data
@ApiModel(description = "取消支付响应")
@NoArgsConstructor
@AllArgsConstructor
public static class CancelPayResponseDto {
private Integer code;
private String message;
}
@Data
@Builder
@ApiModel(description = "第三方支付平台通知请求dto")
@NoArgsConstructor
......
......@@ -2,13 +2,13 @@ package com.infoloop.tianting.model.dto;
import com.infoloop.tianting.enums.SettlementDimensionEnum;
import io.swagger.annotations.ApiModel;
import java.util.ArrayList;
import java.util.Map;
import lombok.Builder;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Data
@ApiModel(description = "统计DTO")
......
package com.infoloop.tianting.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
......
package com.infoloop.tianting.service;
import com.infoloop.tianting.model.dto.CategoryDbDTO.CategoryDto;
import java.util.List;
public interface CategoriesService {
......
package com.infoloop.tianting.service;
import com.infoloop.tianting.deliveryruleservice.ClientLabelTypeEnum;
import com.infoloop.tianting.model.dto.ClientLabelDTO.LabelDto;
import com.infoloop.tianting.model.dto.ClientLabelDTO.QueryLabelsDto;
import java.util.List;
public interface DeliveryRuleService {
......
package com.infoloop.tianting.service;
import com.infoloop.tianting.clientinventoryservice.QueryClientTableCodesByConditionRpcResponse;
import com.infoloop.tianting.model.dto.InventoryDbDTO.ClientDto;
import com.infoloop.tianting.model.dto.InventoryDbDTO.ClientTableCodeDto;
import com.infoloop.tianting.model.dto.InventoryDbDTO.TableCodeQueryConditionDto;
import java.util.List;
public interface InventoryService {
......
......@@ -5,6 +5,7 @@ import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderLocationDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderLocationQueryDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderSkuDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderSkuQueryDto;
import java.util.List;
public interface KdsService {
......
package com.infoloop.tianting.service;
import com.infoloop.tianting.model.dto.MealDbDTO.MealDto;
import java.util.List;
public interface MealService {
......
......@@ -2,6 +2,7 @@ package com.infoloop.tianting.service;
import com.infoloop.tianting.model.dto.ClientLabelDTO.HisAllergy;
import com.infoloop.tianting.model.dto.ClientLabelDTO.HisMedicalAdviceDto;
import java.util.List;
public interface MeiZhongYiHeService {
......
......@@ -11,6 +11,7 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryRefundOrderByPaginationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto;
......@@ -21,6 +22,8 @@ public interface OrderService {
OrderAndDetailsDto getOrdersByCustomerId(Integer customerId);
OrderAndDetailsDto getOrdersByCondition(QueryOrderByConditionDto queryOrderDto);
OrderPageResult<OrderDto> getOrdersByPagination(QueryOrderByPaginationDto queryOrderDto);
OrderPageResult<OrderDto> getRefundOrdersByPagination(
QueryRefundOrderByPaginationDto queryOrderDto);
List<OrderDetailDto> getOrderDetailsByOrderId(Integer orderId);
CreateOrderResponse createOrder(CreateOrderDto createOrderDto);
CreateOrderResponse orderCreation(OperatorCreateOrderDto createOrderDto);
......
package com.infoloop.tianting.service;
import com.infoloop.tianting.model.dto.SettlementDTO.SettlementRequestDto;
import java.io.ByteArrayOutputStream;
public interface SettlementService {
......
package com.infoloop.tianting.service;
import com.infoloop.tianting.model.dto.SkuDbDTO.SkuDto;
import com.infoloop.tianting.model.dto.WxUserDto.WxUserOpenIdDto;
import com.infoloop.tianting.model.dto.WxUserDto.WxUserPhoneResponseDto;
import java.util.List;
public interface WxMiniProgramService {
WxUserOpenIdDto getWxUserOpenIdByCode(String code);
......
......@@ -66,6 +66,7 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailOperationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryRefundOrderByPaginationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto;
import com.infoloop.tianting.server.UserAuthData;
import com.infoloop.tianting.server.WebSocketServer;
......@@ -186,7 +187,19 @@ public class OrderServiceRpcClient {
.setUpdateSource(updateOrderDto.getUpdatedSource())
.setModification(modification)
.build();
return orderServiceRpcBlockingStub.updateClientCustomerOrder(request);
final UpdateClientCustomerOrderRpcResponse updateClientCustomerOrderRpcResponse = orderServiceRpcBlockingStub.updateClientCustomerOrder(request);
if (updateClientCustomerOrderRpcResponse.getIsUpdated() && updateOrderDto.getStatus() == OrderStatusEnum.ORDER_CANCELED) {
final var orderById = getOrderById(updateOrderDto.getId());
if (orderById != null && orderById.getCloseTimeType() == CloseTimeType.IMMEDIATELY) {
final var orderDetails = getOrderDetailsByOrderId(orderById.getId());
final var isSuccess = addSkusSellQuantities(orderById.getEnterpriseId(), orderById.getStallId(), orderDetails.stream().map(e -> AddSkusSellQuantityBO.builder()
.skuId(e.getSkuId())
.quantity(-e.getCount())
.build()).collect(Collectors.toList()));
log.info("Order {} returnSkusSellQuantities result: {}", orderById.getId(), isSuccess);
}
}
return updateClientCustomerOrderRpcResponse;
}
public boolean updateClientCustomerOrderCancel(int enterpriseId, int id) {
......@@ -461,6 +474,8 @@ public class OrderServiceRpcClient {
.setKeyword(queryOrderDto.getKeyword() == null ? "" : queryOrderDto.getKeyword())
.setPageNo(queryOrderDto.getPn())
.setPageSize(queryOrderDto.getPz())
.setShouldFilterStatus(true)
.setShouldFilterPayStatus(false)
.setStatus(queryOrderDto.getStatus())
.setEnterpriseId(queryOrderDto.getEnterpriseId())
.setClientId(queryOrderDto.getClientId())
......@@ -469,6 +484,22 @@ public class OrderServiceRpcClient {
return orderServiceRpcBlockingStub.queryClientCustomerOrdersByPagination(request);
}
public QueryClientCustomerOrdersByPaginationRpcResponse queryRefundClientCustomerOrdersByPagination(
QueryRefundOrderByPaginationDto queryOrderDto) {
final var request = QueryClientCustomerOrdersByPaginationRpcRequest.newBuilder()
.setKeyword(queryOrderDto.getKeyword() == null ? "" : queryOrderDto.getKeyword())
.setPageNo(queryOrderDto.getPn())
.setPageSize(queryOrderDto.getPz())
.setShouldFilterStatus(false)
.setShouldFilterPayStatus(true)
.setPayStatus(PayStatusEnum.REFUND)
.setEnterpriseId(queryOrderDto.getEnterpriseId())
.setClientId(queryOrderDto.getClientId())
.addAllStallIds(queryOrderDto.getStallIds())
.build();
return orderServiceRpcBlockingStub.queryClientCustomerOrdersByPagination(request);
}
public List<SingleClientCustomerOrderDetailRpcResponse> getOrderDetailsByOrderId(Integer orderId) {
return orderServiceRpcBlockingStub.getClientCustomerOrderDetailsByOrderIds(
GetClientCustomerOrderDetailsByOrderIdsRpcRequest.newBuilder()
......
......@@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModification;
import com.infoloop.tianting.clientcustomerorderservice.OnlinePayEnum;
import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
import com.infoloop.tianting.clientresourcetagservice.SingleResourceLabelEntityRefsResponse;
......@@ -16,6 +17,7 @@ import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.exception.ClientEndExceptions;
import com.infoloop.tianting.exception.ErrorCodeEnum;
import com.infoloop.tianting.model.dto.PayDTO.PayInformRequestDto;
import com.infoloop.tianting.model.dto.PayDTO.PayRefundRequestDto;
import com.infoloop.tianting.model.dto.PayDTO.PayResponseDto;
import com.infoloop.tianting.model.dto.PayDTO.ThirdPartyPayInformRequestDto;
import com.infoloop.tianting.model.dto.PaymentCallbackDTO;
......@@ -34,6 +36,9 @@ import com.infoloop.tianting.utils.EncryptionUtil;
import com.infoloop.tianting.utils.JsonUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
......@@ -45,6 +50,9 @@ import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import java.text.ParseException;
import java.time.LocalDate;
......@@ -53,7 +61,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
......@@ -71,9 +78,14 @@ public class PayServiceClient {
private final XmlMapper xmlMapper = new XmlMapper();
private final OkHttpClient client = new OkHttpClient();
public PayResponseDto payInform(PayInformRequestDto payRequestDto) {
final var orderById = orderServiceRpcClient.getOrderById(Integer.valueOf(payRequestDto.getOrderId()));
if (orderById == null || orderById.getPayStatus() == PayStatusEnum.PAY_CANCELED || orderById.getStatus() == OrderStatusEnum.ORDER_CANCELED) {
final var orderById =
orderServiceRpcClient.getOrderById(Integer.valueOf(payRequestDto.getOrderId()));
if (orderById == null
|| orderById.getPayStatus() == PayStatusEnum.PAY_CANCELED
|| orderById.getStatus() == OrderStatusEnum.ORDER_CANCELED) {
log.info("Order {} not found or canceled, skipping.", payRequestDto.getOrderId());
throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.ORDER_CANCEL);
}
......@@ -93,11 +105,13 @@ public class PayServiceClient {
}
HttpEntity<String> requestEntity = new HttpEntity<>(jsonDataString, createHeaders());
log.info("payInform request: {}", jsonDataString);
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
ResponseEntity<String> responseEntity =
restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
return processResponse(responseEntity);
}
private ThirdPartyPayInformRequestDto buildRequestData(PayInformRequestDto payRequestDto, String requestDate) {
private ThirdPartyPayInformRequestDto buildRequestData(
PayInformRequestDto payRequestDto, String requestDate) {
ThirdPartyPayInformRequestDto jsonData = new ThirdPartyPayInformRequestDto();
jsonData.setClientId(businessConfig.getPayClientId());
jsonData.setTradeId(payRequestDto.getOrderId());
......@@ -105,11 +119,16 @@ public class PayServiceClient {
jsonData.setRequestSource("OFWXApplet");
jsonData.setPayerOpenId(LoginContextHolder.getOpenId());
jsonData.setHospitalCode(payRequestDto.getHospitalCode());
jsonData.setPID(payRequestDto.getPhone());
jsonData.setPID(LoginContextHolder.getOpenId());
jsonData.setRemark("");
jsonData.setTransAmount(payRequestDto.getPrice());
jsonData.setTradeDesc("");
jsonData.setSign(EncryptionUtil.sha1Encryption(businessConfig.getPayClientId() + payRequestDto.getOrderId() + requestDate + businessConfig.getPayClientId()));
jsonData.setSign(
EncryptionUtil.sha1Encryption(
businessConfig.getPayClientId()
+ payRequestDto.getOrderId()
+ requestDate
+ businessConfig.getPayClientId()));
return jsonData;
}
......@@ -136,7 +155,8 @@ public class PayServiceClient {
public boolean callback(PaymentCallbackDTO paymentCallbackDTO) {
log.info("callback request received: {}", paymentCallbackDTO);
try {
final var paymentCallbackResult = xmlMapper.readValue(paymentCallbackDTO.getPayResult(), PaymentCallbackResult.class);
final var paymentCallbackResult =
xmlMapper.readValue(paymentCallbackDTO.getPayResult(), PaymentCallbackResult.class);
log.info("Parsed paymentCallbackResult: {}", paymentCallbackResult);
final var orderId = Integer.parseInt(paymentCallbackResult.getTradeId());
final var orderById = orderServiceRpcClient.getOrderById(orderId);
......@@ -144,13 +164,18 @@ public class PayServiceClient {
log.error("Order not found, orderId: {}", orderId);
return false;
}
if (orderById.getPayStatus() != PayStatusEnum.TO_PAY && orderById.getPayStatus() != PayStatusEnum.IN_PROGRESS) {
final var transType = paymentCallbackResult.getTransType();
if (transType.equals("00")) {
if (orderById.getPayStatus() != PayStatusEnum.TO_PAY
&& orderById.getPayStatus() != PayStatusEnum.IN_PROGRESS) {
log.error("Order status is not TO_PAY or IN_PROGRESS, orderId: {}", orderId);
return true;
}
long payTime;
try {
payTime = DateUtil.parseDate(paymentCallbackResult.getTransDate(), "yyyyMMddHHmmss").getTime();
payTime =
DateUtil.parseDate(paymentCallbackResult.getTransDate(), "yyyyMMddHHmmss").getTime();
} catch (ParseException e) {
log.error("Failed to parse TransDate: {}", paymentCallbackResult.getTransDate(), e);
throw new IllegalArgumentException("支付时间格式错误: " + paymentCallbackResult.getTransDate(), e);
......@@ -165,65 +190,107 @@ public class PayServiceClient {
log.error("Invalid RealAmount value: {}", paymentCallbackResult.getRealAmount(), e);
throw new IllegalArgumentException("支付金额错误: " + paymentCallbackResult.getRealAmount(), e);
}
final var build = ClientCustomerOrderModification.newBuilder()
final var build =
ClientCustomerOrderModification.newBuilder()
.setId(orderId)
.setShouldUpdatePayTime(true).setPayTime(payTime)
.setShouldUpdatePayPrice(true).setPayPrice(realAmount.multiply(new BigDecimal("100")).intValue())
.setShouldUpdatePayStatus(true).setPayStatus(PayStatusEnum.SUCCEED)
.setShouldUpdateStatus(true).setStatus(OrderStatusEnum.PREPARING)
.setShouldUpdateTransactionId(true).setTransactionId(paymentCallbackResult.getTransSN())
.setShouldUpdatePayTime(true)
.setPayTime(payTime)
.setShouldUpdatePayPrice(true)
.setPayPrice(realAmount.multiply(new BigDecimal("100")).intValue())
.setShouldUpdatePayStatus(true)
.setPayStatus(PayStatusEnum.SUCCEED)
.setShouldUpdateStatus(true)
.setStatus(OrderStatusEnum.PREPARING)
.setShouldUpdateTransactionId(true)
.setTransactionId(paymentCallbackResult.getTransSN())
.build();
final var updateResponse = orderServiceRpcClient.updateClientCustomerOrderPaymentResult(orderById, build);
final var updateResponse =
orderServiceRpcClient.updateClientCustomerOrderPaymentResult(orderById, build);
log.info("callback updateClientCustomerOrder result: {}", updateResponse.getIsUpdated());
if (updateResponse.getIsUpdated()) {
final var orderPaymentSuccessData = OrderPaymentSuccessData.builder()
final var orderPaymentSuccessData =
OrderPaymentSuccessData.builder()
.orderId(orderById.getId())
.orderCode(orderById.getOrderCode())
.createTime(DateUtil.formatDate(orderById.getCreatedAt(), DateUtil.Y_M_D_H_M_S))
.payTime(DateUtil.formatDate(orderById.getPayTime(), DateUtil.Y_M_D_H_M_S))
.build();
final var data = SocketMessage.<OrderPaymentSuccessData>builder()
final var data =
SocketMessage.<OrderPaymentSuccessData>builder()
.type(MessageTypeEnum.ORDER)
.noticeType(NoticeTypeEnum.ORDER_PAYMENT_SUCCESS)
.subject(NoticeTypeEnum.ORDER_PAYMENT_SUCCESS.getDescription())
.message("您的订单:" + orderById.getOrderCode() + " 支付成功啦,快去查看吧~")
.data(orderPaymentSuccessData)
.build();
WebSocketServer.sendMessageToUser(UserSessionKey.builder()
WebSocketServer.sendMessageToUser(
UserSessionKey.builder()
.userId(orderById.getOpenId())
.userType(UserTypeEnum.MICRO)
.build(), data);
.build(),
data);
if (LocalDate.now().equals(DateUtil.toLocalDate(orderById.getMealTime()))) {
final var orderCreateSuccessData = OrderCreateSuccessData.builder()
.orderId(orderById.getId())
.build();
final var createOrderData = SocketMessage.<OrderCreateSuccessData>builder()
final var orderCreateSuccessData =
OrderCreateSuccessData.builder().orderId(orderById.getId()).build();
final var createOrderData =
SocketMessage.<OrderCreateSuccessData>builder()
.type(MessageTypeEnum.ORDER)
.noticeType(NoticeTypeEnum.ORDER_CREATED)
.subject(NoticeTypeEnum.ORDER_CREATED.getDescription())
.message("有新的订单下单成功啦,快去查看吧~")
.data(orderCreateSuccessData)
.build();
final var clientOperatorIds = clientResourceTagServiceRpcClient.getOperatorIdsByStallIds(List.of(orderById.getStallId())).stream().map(SingleResourceLabelEntityRefsResponse::getEntityId).distinct().collect(Collectors.toList());
final var enterpriseOperatorIds = enterpriseResourceServiceRpcClient.getOperatorIdsByStallId(orderById.getEnterpriseId(), orderById.getStallId());
final var clientOperatorIds =
clientResourceTagServiceRpcClient
.getOperatorIdsByStallIds(List.of(orderById.getStallId())).stream()
.map(SingleResourceLabelEntityRefsResponse::getEntityId)
.distinct()
.collect(Collectors.toList());
final var enterpriseOperatorIds =
enterpriseResourceServiceRpcClient.getOperatorIdsByStallId(
orderById.getEnterpriseId(), orderById.getStallId());
final var userAuthData = new ArrayList<UserAuthData>();
userAuthData.addAll(clientOperatorIds.stream().map(e -> UserAuthData.builder().operatorId(e).userType(UserTypeEnum.CLIENT).build()).collect(Collectors.toList()));
userAuthData.addAll(enterpriseOperatorIds.stream().map(e -> UserAuthData.builder().operatorId(e).userType(UserTypeEnum.KDS).build()).collect(Collectors.toList()));
userAuthData.addAll(
clientOperatorIds.stream()
.map(
e ->
UserAuthData.builder()
.operatorId(e)
.userType(UserTypeEnum.CLIENT)
.build())
.collect(Collectors.toList()));
userAuthData.addAll(
enterpriseOperatorIds.stream()
.map(e -> UserAuthData.builder().operatorId(e).userType(UserTypeEnum.KDS).build())
.collect(Collectors.toList()));
log.info("received userAuthData:{}", JsonUtil.writeAsJson(userAuthData));
try {
WebSocketServer.sendMessageByUserTypes(List.of(UserTypeEnum.CLIENT, UserTypeEnum.KDS), userAuthData, createOrderData);
WebSocketServer.sendMessageByUserTypes(
List.of(UserTypeEnum.CLIENT, UserTypeEnum.KDS), userAuthData, createOrderData);
} catch (IOException e) {
log.error("Failed to send message to user", e);
}
}
}
return updateResponse.getIsUpdated();
} else {
final var build =
ClientCustomerOrderModification.newBuilder()
.setId(orderId)
.setShouldUpdatePayStatus(true)
.setPayStatus(PayStatusEnum.REFUND)
.build();
final var updateResponse =
orderServiceRpcClient.updateClientCustomerOrderPaymentResult(orderById, build);
log.info("callback updateClientCustomerOrder result: {}", updateResponse.getIsUpdated());
return updateResponse.getIsUpdated();
}
} catch (JsonProcessingException e) {
log.error("Failed to parse XML response, raw XML: {}", paymentCallbackDTO.getPayResult(), e);
throw new RuntimeException("支付通知结果解析失败", e);
throw new RuntimeException("支付/退款通知结果解析失败", e);
} catch (Exception e) {
log.error("Unexpected error in callback, request: {}", paymentCallbackDTO, e);
throw new RuntimeException("支付通知处理失败", e);
throw new RuntimeException("支付/退款通知处理失败", e);
}
}
......@@ -237,12 +304,98 @@ public class PayServiceClient {
log.info("waiting Order {} already processed, skipping.", orderId);
return false;
}
final var build = ClientCustomerOrderModification.newBuilder()
final var build =
ClientCustomerOrderModification.newBuilder()
.setId(orderId)
.setShouldUpdatePayStatus(true).setPayStatus(PayStatusEnum.IN_PROGRESS)
.setShouldUpdatePayStatus(true)
.setPayStatus(PayStatusEnum.IN_PROGRESS)
.build();
final var updateResponse = orderServiceRpcClient.updateClientCustomerOrderPaymentResult(orderById, build);
final var updateResponse =
orderServiceRpcClient.updateClientCustomerOrderPaymentResult(orderById, build);
log.info("waiting updateClientCustomerOrder result: {}", updateResponse.getIsUpdated());
return updateResponse.getIsUpdated();
}
public String orderPayRefund(PayRefundRequestDto payRefundRequestDto) {
Integer orderId = payRefundRequestDto.getOrderId();
final var orderById = orderServiceRpcClient.getOrderById(orderId);
if (orderById == null) {
log.error("Order not found, orderId: {}", orderId);
throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.ORDER_NOT_FOUND);
}
if (orderById.getOnlinePay() != OnlinePayEnum.ONLINE) {
log.info("Order {} is not online pay.", orderId);
throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.ORDER_NOT_ONLINE_PAY);
}
if (orderById.getPayStatus() != PayStatusEnum.SUCCEED) {
log.info("Order {} pay is not succeed.", orderId);
throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.ORDER_NOT_SUCCESS);
}
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalDateTime tomorrowZero = tomorrow.atStartOfDay();
LocalDateTime orderPayTime = DateUtil.toLocalDateTime(orderById.getPayTime()).minusHours(8);
if (!orderPayTime.isBefore(tomorrowZero)) {
log.info("Order {} pay is beyond cancel time.", orderId);
throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.ORDER_PAY_REFUND_FAILED);
}
String appId = businessConfig.getPayClientId();
// 构建paycontent
String payTime = DateUtil.formatDate(orderById.getPayTime(), DateUtil.YMDHMS);
BigDecimal price =
new BigDecimal(orderById.getPayPrice())
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).negate();
String payContentStr =
orderById.getId()
+ "^"
+ "01"
+ "^"
+ ""
+ "^"
+ orderById.getOpenId()
+ "^"
+ orderById.getOrderCode()
+ "^"
+ price
+ "^"
+ payTime
+ "^"
+ orderById.getTransactionId()
+ "^"
+ payRefundRequestDto.getHospitalCode()
+ "^"
+ ""
+ "^"
+ LoginContextHolder.getId()
+ "^"
+ LoginContextHolder.getName();
String payContent =
URLEncoder.encode(
Base64.encodeBase64String(payContentStr.getBytes()), StandardCharsets.UTF_8);
// 构建signinfo
String signInfoStr = appId + orderById.getId() + payTime + businessConfig.getRefundSecurityKey();
String signInfo = DigestUtils.sha1Hex(signInfoStr.getBytes());
// 构建请求
try {
String url = businessConfig.getCancelPayUrl() + "?" + "appid=" + appId + "&paycontent=" + payContent + "&signinfo=" + signInfo;
log.info("cancel order pay url:" + url);
// Request request =
// new Request.Builder().url(url).get().build();
// Response payResponse = client.newCall(request).execute();
// if (payResponse.code() != 200) {
// throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.ORDER_PAY_REFUND_FAILED);
// }
// String htmlContent = payResponse.body().string();
return url;
} catch (Exception e) {
log.error(e.getMessage());
throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.ORDER_PAY_REFUND_FAILED);
}
}
}
......
......@@ -18,6 +18,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
......@@ -70,8 +71,10 @@ public class MenuServiceImpl implements MenuService {
@Override
public List<MenuDto> queryPublishedMenusByStallId(Integer enterpriseId, List<Integer> stallIds) {
final var response = menuServiceRpcClient.queryPublishedMenusByStallId(enterpriseId, stallIds);
return response.getResponsesList().stream().map(menu ->
MenuDto.builder()
return new ArrayList<>(response.getResponsesList().stream()
.collect(Collectors.toMap(
SingleMenuRpcResponse::getId,
menu -> MenuDto.builder()
.id(menu.getId())
.code(menu.getCode())
.enterpriseId(menu.getEnterpriseId())
......@@ -103,7 +106,10 @@ public class MenuServiceImpl implements MenuService {
.updateSource(menu.getUpdateSource())
.updatedAt(DateUtil.formatDate(menu.getUpdatedAt()))
.publishAt(DateUtil.formatDate(menu.getPublishAt()))
.build()).collect(Collectors.toList());
.build(),
(existing, replacement) -> existing
))
.values());
}
@Override
......
......@@ -7,6 +7,7 @@ import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType;
import com.infoloop.tianting.clientcustomerorderservice.OrderSourceEnum;
import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.OrderTypeEnum;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerLabelRefRpcResponse;
import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcResponse;
......@@ -37,6 +38,7 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryRefundOrderByPaginationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto;
......@@ -56,6 +58,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
......@@ -318,6 +321,7 @@ public class OrderServiceImpl implements OrderService {
.updateSource(r.getUpdateSource().getNumber())
.updatedAt(DateUtil.formatDate(r.getUpdatedAt()))
.updatedBy(r.getUpdatedBy())
.isCanceled(r.getIsCanceled())
.build()).collect(Collectors.toList());
final var ids = orders.stream().map(OrderDto::getId).collect(Collectors.toList());
final var detailsResponse = orderServiceRpcClient.getOrderDetailsByOrderIds(ids);
......@@ -391,6 +395,7 @@ public class OrderServiceImpl implements OrderService {
.updateSource(r.getUpdateSource().getNumber())
.updatedAt(DateUtil.formatDate(r.getUpdatedAt()))
.updatedBy(r.getUpdatedBy())
.isCanceled(r.getIsCanceled())
.build()).collect(Collectors.toList());
final var ids = orders.stream().map(OrderDto::getId).collect(Collectors.toList());
final var detailsResponse = orderServiceRpcClient.getOrderDetailsByOrderIds(ids);
......@@ -437,7 +442,28 @@ public class OrderServiceImpl implements OrderService {
final var customerIds = response.getResponsesList().stream().map(SingleClientCustomerOrderRpcResponse::getCustomerId).collect(Collectors.toList());
final var customerResponse = clientCustomerServiceRpcClient.getClientCustomersByIds(
queryOrderDto.getEnterpriseId(), customerIds);
final var results = response.getResponsesList().stream().map(r -> OrderDto.builder()
final var orderIds = response.getResponsesList().stream().map(SingleClientCustomerOrderRpcResponse::getId).collect(Collectors.toList());
final var orderDetails = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds);
final var results = response.getResponsesList().stream().map(r -> {
final var curOrderDetails = orderDetails.stream().filter(d ->
d.getOrderId() == r.getId()).collect(Collectors.toList());
List<String> orderNotice = new ArrayList<>();
for (SingleClientCustomerOrderDetailRpcResponse detail: curOrderDetails) {
final var avoids = detail.getMealDetailJson().getAvoidsList();
final var existAvoids = r.getCustomerNoticeJson().getAvoidsList().stream().anyMatch(avoids::contains);
if (existAvoids) {
orderNotice.add("忌口冲突");
break;
}
}
String[] keywords = {"禁食", "禁水", "禁食水"};
final var result = Arrays.stream(keywords)
.filter(keyword -> r.getCustomerNoticeJson().getDoctorsList().stream().anyMatch(str -> str.contains(keyword)))
.findFirst();
if (result.isPresent()) {
orderNotice.add("医嘱包含" + result.get());
}
return OrderDto.builder()
.id(r.getId())
.enterpriseId(r.getEnterpriseId())
.clientId(r.getClientId())
......@@ -472,19 +498,102 @@ public class OrderServiceImpl implements OrderService {
.updatedBy(r.getUpdatedBy())
.closeTimeType(r.getCloseTimeTypeValue())
.totalNum(r.getTotalNum())
.isCanceled(r.getIsCanceled())
.customer(getCustomerDetail(r.getCustomerId(), customerResponse.getResponsesList()))
.build()).collect(Collectors.toList());
.orderNotice(orderNotice)
.build();
}).collect(Collectors.toList());
final var orderCountByStatus = OrderCountByStatusDto.builder()
.allServedCount(response.getCountByStatus().getAllServedCount())
.canceledCount(response.getCountByStatus().getCanceledCount())
.preparingCount(response.getCountByStatus().getPreparingCount())
.toPrepareCount(response.getCountByStatus().getToPrepareCount())
.unknownCount(response.getCountByStatus().getUnknownCount())
.refundCount(response.getCountByStatus().getRefundCount())
.build();
return PageUtil.from(results, response.getTotal(), response.getPages(),
queryOrderDto.getPn(), queryOrderDto.getPz(), orderCountByStatus);
}
@Override
public OrderPageResult<OrderDto> getRefundOrdersByPagination(
QueryRefundOrderByPaginationDto queryOrderDto) {
final var response = orderServiceRpcClient.queryRefundClientCustomerOrdersByPagination(queryOrderDto);
final var customerIds = response.getResponsesList().stream().map(SingleClientCustomerOrderRpcResponse::getCustomerId).collect(Collectors.toList());
final var customerResponse = clientCustomerServiceRpcClient.getClientCustomersByIds(
queryOrderDto.getEnterpriseId(), customerIds);
final var orderIds = response.getResponsesList().stream().map(SingleClientCustomerOrderRpcResponse::getId).collect(Collectors.toList());
final var orderDetails = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds);
final var results = response.getResponsesList().stream().map(r -> {
final var curOrderDetails = orderDetails.stream().filter(d ->
d.getOrderId() == r.getId()).collect(Collectors.toList());
List<String> orderNotice = new ArrayList<>();
for (SingleClientCustomerOrderDetailRpcResponse detail: curOrderDetails) {
final var avoids = detail.getMealDetailJson().getAvoidsList();
final var existAvoids = r.getCustomerNoticeJson().getAvoidsList().stream().anyMatch(avoids::contains);
if (existAvoids) {
orderNotice.add("忌口冲突");
break;
}
}
String[] keywords = {"禁食", "禁水", "禁食水"};
final var result = Arrays.stream(keywords)
.filter(keyword -> r.getCustomerNoticeJson().getDoctorsList().stream().anyMatch(str -> str.contains(keyword)))
.findFirst();
if (result.isPresent()) {
orderNotice.add("医嘱包含" + result.get());
}
return OrderDto.builder()
.id(r.getId())
.enterpriseId(r.getEnterpriseId())
.clientId(r.getClientId())
.stallId(r.getStallId())
.customerId(r.getCustomerId())
.openId(r.getOpenId())
.address(r.getAddress())
.orderCode(r.getOrderCode())
.menuId(r.getMenuId())
.pickupCode(r.getPickupCode())
.tableCode(r.getTableCode())
.roomNo(r.getSyncRoomNo().isEmpty() ? r.getRoomNo() : r.getSyncRoomNo())
.adjustRoomNo(!r.getSyncRoomNo().isEmpty())
.status(r.getStatus())
.customerNoticeJson(CustomerNotice.builder()
.avoids(r.getCustomerNoticeJson().getAvoidsList())
.doctors(r.getCustomerNoticeJson().getDoctorsList()).build())
.onlinePay(r.getOnlinePay())
.payStatus(r.getPayStatusValue())
.payPrice(r.getPayPrice())
.payTime(DateUtil.formatDate(r.getPayTime()))
.mealTime(DateUtil.formatDate(r.getMealTime()))
.orderType(r.getOrderTypeValue())
.remark(r.getRemark())
.isDeleted(r.getIsDeleted())
.isRead(r.getIsRead())
.creationSource(r.getCreationSource().getNumber())
.createdBy(r.getCreatedBy())
.createdAt(DateUtil.formatDate(r.getCreatedAt()))
.updateSource(r.getUpdateSource().getNumber())
.updatedAt(DateUtil.formatDate(r.getUpdatedAt()))
.updatedBy(r.getUpdatedBy())
.closeTimeType(r.getCloseTimeTypeValue())
.totalNum(r.getTotalNum())
.isCanceled(r.getIsCanceled())
.customer(getCustomerDetail(r.getCustomerId(), customerResponse.getResponsesList()))
.orderNotice(orderNotice)
.build();
}).collect(Collectors.toList());
final var orderCountByStatus = OrderCountByStatusDto.builder()
.allServedCount(response.getCountByStatus().getAllServedCount())
.canceledCount(response.getCountByStatus().getCanceledCount())
.preparingCount(response.getCountByStatus().getPreparingCount())
.toPrepareCount(response.getCountByStatus().getToPrepareCount())
.unknownCount(response.getCountByStatus().getUnknownCount())
.refundCount(response.getCountByStatus().getRefundCount())
.build();
return PageUtil.from(results, response.getTotal(), response.getPages(),
queryOrderDto.getPn(), queryOrderDto.getPz(), orderCountByStatus);
}
private CustomerDetailDto getCustomerDetail(Integer customerId,
List<SingleClientCustomerRpcResponse> customers) {
final var filterCustomers = customers.stream().filter(c -> c.getId() == customerId)
......
......@@ -65,7 +65,7 @@ public class SkuServiceImpl implements SkuService {
.efficacyList(sku.getEfficaciesList().stream().map(efficacy -> SkuDetailSingleResponseDto.builder().id(efficacy.getId()).name(efficacy.getName()).build()).collect(
Collectors.toList()))
.doctorList(sku.getDoctorsList().stream().map(doctor -> SkuSpecialDetailSingleResponseDto
.builder().id(doctor.getId()).name(doctor.getName()).build()).collect(
.builder().id(doctor.getId()).code(doctor.getCode()).name(doctor.getName()).build()).collect(
Collectors.toList()))
.avoidList(sku.getAvoidsList().stream().map(avoid -> SkuDetailSingleResponseDto.builder().id(avoid.getId()).name(avoid.getName()).build()).collect(
Collectors.toList()))
......
......@@ -158,4 +158,8 @@ public final class DateUtil extends DateUtils {
return Instant.ofEpochMilli(timestamp).atZone(CHINA_ZONE).toLocalDate();
}
public static LocalDateTime toLocalDateTime(long timestamp) {
return Instant.ofEpochMilli(timestamp).atZone(CHINA_ZONE).toLocalDateTime();
}
}
\ No newline at end of file
......
......@@ -74,6 +74,7 @@ enum PayStatusEnum {
SUCCEED = 3;
FAILED = 4;
PAY_CANCELED = 5;
REFUND = 6;
}
enum CloseTimeType {
......@@ -139,6 +140,7 @@ message SingleClientCustomerOrderRpcResponse {
bool isConfirm = 34;
bool isAllocation = 35;
string syncRoomNo = 36;
bool isCanceled = 37;
}
message GetClientCustomerOrderByIdRpcRequest {
......@@ -173,12 +175,15 @@ message GetClientCustomerOrdersByCustomerIdRpcResponse {
message QueryClientCustomerOrdersByPaginationRpcRequest {
string keyword = 1;
OrderStatusEnum status = 2;
int32 clientId = 3;
int32 enterpriseId = 4;
int32 pageNo = 5;
int32 pageSize = 6;
repeated int32 stallIds = 7;
bool shouldFilterStatus = 2;
OrderStatusEnum status = 3;
int32 clientId = 4;
int32 enterpriseId = 5;
int32 pageNo = 6;
int32 pageSize = 7;
repeated int32 stallIds = 8;
bool shouldFilterPayStatus = 9;
PayStatusEnum payStatus = 10;
}
message OrderCountByStatus {
......@@ -187,6 +192,7 @@ message OrderCountByStatus {
int32 preparingCount = 3;
int32 allServedCount = 4;
int32 canceledCount = 5;
int32 refundCount = 6;
}
message QueryClientCustomerOrdersByPaginationRpcResponse {
......@@ -246,6 +252,8 @@ message QueryClientCustomerOrdersByConditionRpcRequest {
bool isAllocation = 47;
bool shouldFilterStatues = 48;
repeated OrderStatusEnum statues = 49;
bool shouldFilterIsCanceled = 50;
bool isCanceled = 51;
}
message QueryClientCustomerOrdersByConditionRpcResponse {
......@@ -375,6 +383,8 @@ message ClientCustomerOrderModification {
bool isAllocation = 53;
bool shouldUpdateSyncRoomNo = 54;
string syncRoomNo = 55;
bool shouldUpdateIsCanceled = 56;
bool isCanceled = 57;
}
message UpdateClientCustomerOrderRpcRequest {
......
......@@ -80,6 +80,8 @@ business-config.hisCustomerQueryUrl = https://nutri.amcare.com.cn/v3/hiscustomer
business-config.clientCustomerQueryUrl = https://nutri.amcare.com.cn/v3/clientcustomers/current/query
business-config.payUrl = http://10.2.5.162:21051/API/Microapp/CreateOrder?appid={0}
business-config.payClientId = Order
business-config.cancelPayUrl = http://10.2.5.162:21051/frame/requestbase64
business-config.refundSecurityKey = 0987654321
##Actuator\u914D\u7F6E
management.server.port=8088
......