wangyingyang

update order

No preview for this file type
No preview for this file type
......@@ -49,6 +49,7 @@ public class InventoryController {
return inventoryService.getStallsByClientId(enterpriseId, clientId);
}
@SaIgnore
@ApiOperation(value = "获取桌号")
@PostMapping("/tableCodes")
@ResponseStatus(HttpStatus.OK)
......
package com.infoloop.tianting.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.infoloop.tianting.model.dto.OrderDbDTO;
import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse;
......@@ -71,6 +72,15 @@ public class OrderController {
return orderService.createOrder(createOrderDto);
}
@ApiOperation(value = "创建订单")
@PostMapping("/operator/orders")
@ResponseStatus(HttpStatus.OK)
public CreateOrderResponse createOrderByOperator(
@Valid @RequestBody OrderDbDTO.OperatorCreateOrderDto createOrderDto) {
return orderService.orderCreation(createOrderDto);
}
// @SaIgnore
@ApiOperation(value = "修改订单")
@PatchMapping("/orders/modification")
@ResponseStatus(HttpStatus.OK)
......@@ -78,6 +88,7 @@ public class OrderController {
return orderService.updateOrder(updateOrderDto);
}
// @SaIgnore
@ApiOperation(value = "批量修改订单详情")
@PatchMapping("/order_details/modification")
@ResponseStatus(HttpStatus.OK)
......
......@@ -13,8 +13,10 @@ import java.util.List;
import java.util.Optional;
import javax.validation.Valid;
import jdk.jfr.StackTrace;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
......@@ -144,9 +146,35 @@ public class OrderDbDTO {
private List<String> doctors;
}
@Data
@Builder
@ApiModel(description = "创建订单视图")
public static class OperatorCreateOrderDto {
@ApiModelProperty(value = "档口 ID")
private Integer stallId;
@ApiModelProperty(value = "客户 ID")
private Integer customerId;
@ApiModelProperty(value = "餐单 id")
private Integer menuId;
@ApiModelProperty(value = "用餐日期")
private LocalDateTime mealTime;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "订单菜品详情列表")
private List<OperatorCreateOrderDetailDto> orderDetailDtos;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "创建订单视图")
public static class CreateOrderDto {
@ApiModelProperty(value = "企业 ID")
private Integer enterpriseId;
......@@ -158,7 +186,7 @@ public class OrderDbDTO {
private Integer stallId;
@ApiModelProperty(value = "需要创建客户 ID")
public Boolean shouldCreateCustomerId;
private Boolean shouldCreateCustomerId;
@ApiModelProperty(value = "客户 ID")
private Integer customerId;
......@@ -440,6 +468,18 @@ public class OrderDbDTO {
@Builder
@ToString
@ApiModel(description = "订单详情信息,即菜品细节")
public static class OperatorCreateOrderDetailDto {
@ApiModelProperty(value = "餐单详情 id,即菜品")
private Integer menuDetailId;
@ApiModelProperty(value = "菜品所点份数")
private Integer count;
}
@Data
@Builder
@ToString
@ApiModel(description = "订单详情信息,即菜品细节")
public static class CreateOrderDetailDto {
@ApiModelProperty(value = "餐单详情 id,即菜品")
private Integer menuDetailId;
......
......@@ -4,6 +4,7 @@ import com.infoloop.tianting.model.common.PageResult;
import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.OperatorCreateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderAndDetailsDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailBatchUpdateDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailDto;
......@@ -20,6 +21,7 @@ public interface OrderService {
PageResult<OrderDto> getOrdersByPagination(QueryOrderByPaginationDto queryOrderDto);
List<OrderDetailDto> getOrderDetailsByOrderId(Integer orderId);
CreateOrderResponse createOrder(CreateOrderDto createOrderDto);
CreateOrderResponse orderCreation(OperatorCreateOrderDto createOrderDto);
UpdateOrderResponse updateOrder(UpdateOrderDto updateOrderDto);
BatchUpdateOrderDetailResponse batchUpdateOrderDetails(OrderDetailBatchUpdateDto batchUpdateDto);
}
......
package com.infoloop.tianting.service.client;
import com.infoloop.tianting.deliveryruleservice.ClientLabelTypeEnum;
import com.infoloop.tianting.deliveryruleservice.GetClientLabelsByIdsRpcRequest;
import com.infoloop.tianting.deliveryruleservice.GetClientLabelsByIdsRpcResponse;
import com.infoloop.tianting.deliveryruleservice.QueryClientLabelsByConditionRpcRequest;
import com.infoloop.tianting.deliveryruleservice.QueryClientLabelsByConditionRpcResponse;
import com.infoloop.tianting.deliveryruleservice.TiantingDeliveryRuleServiceRpcGrpc;
import com.infoloop.tianting.model.dto.ClientLabelDTO.QueryLabelsDto;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -26,4 +29,16 @@ public class DeliveryRuleServiceRpcClient {
return deliveryRuleServiceRpcBlockingStub.queryClientLabelsByCondition(request);
}
public GetClientLabelsByIdsRpcResponse GetClientLabelsByIds(Integer enterpriseId, List<Integer> ids) {
final var request = GetClientLabelsByIdsRpcRequest
.newBuilder()
.setEnterpriseId(enterpriseId)
.setIncludeDeleted(false)
.addAllIds(ids)
.build();
return deliveryRuleServiceRpcBlockingStub.getClientLabelsByIds(request);
}
}
......
......@@ -39,7 +39,6 @@ import io.swagger.models.auth.In;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -67,12 +66,26 @@ public class OrderServiceRpcClient {
public UpdateClientCustomerOrderRpcResponse updateClientCustomerOrder(
UpdateOrderDto updateOrderDto) {
OrderStatusEnum status = OrderStatusEnum.UNKNOWN_STATUS;
if (updateOrderDto.isShouldUpdateStatus()) {
status = updateOrderDto.getStatus();
}
String roomNo = "";
if (updateOrderDto.isShouldUpdateRoomNo()) {
roomNo = updateOrderDto.getRoomNo();
}
String tableCode = "";
if (updateOrderDto.isShouldUpdateTableCode()) {
tableCode = updateOrderDto.getTableCode();
}
final var modification = ClientCustomerOrderModification.newBuilder()
.setId(updateOrderDto.getId())
.setShouldUpdateStatus(updateOrderDto.isShouldUpdateStatus())
.setStatus(updateOrderDto.getStatus())
.setStatus(status)
.setShouldUpdateTableCode(updateOrderDto.isShouldUpdateTableCode())
.setTableCode(updateOrderDto.getTableCode())
.setTableCode(tableCode)
.setShouldUpdateRoomNo(updateOrderDto.isShouldUpdateRoomNo())
.setRoomNo(roomNo)
.build();
final var request = UpdateClientCustomerOrderRpcRequest.newBuilder()
.setEnterpriseId(updateOrderDto.getEnterpriseId())
......@@ -86,25 +99,10 @@ public class OrderServiceRpcClient {
public BatchUpdateClientCustomerOrderDetailsRpcResponse batchUpdateClientCustomerOrderDetails(
OrderDetailBatchUpdateDto orderDetailBatchUpdateDto) {
final var modifications = orderDetailBatchUpdateDto.getDetails().stream().map( d->
ClientCustomerOrderDetailModification.newBuilder()
.setId(d.getId())
.setShouldUpdateMenuDetailId(d.getShouldUpdateMenuDetailId())
.setMenuDetailId(d.getMenuDetailId())
.setShouldUpdateCount(d.getShouldUpdateCount())
.setCount(d.getCount())
.setShouldUpdateMealId(d.getShouldUpdateMealId())
.setMealId(d.getMealId())
.setShouldUpdateCategoryId(d.getShouldUpdateCategoryId())
.setCategoryId(d.getCategoryId())
.setShouldUpdateSkuId(d.getShouldUpdateSkuId())
.setSkuId(d.getSkuId())
.setShouldUpdateShowName(d.getShouldUpdateShowName())
.setShowName(d.getShowName())
.setShouldUpdateNotServe(d.getShouldUpdateNotServe())
.setNotServe(d.getNotServe())
.setShouldUpdateMealDetailJson(d.getShouldUpdateMealDetailJson())
.setMealDetailJson(MealDetail.newBuilder()
final var modifications = orderDetailBatchUpdateDto.getDetails().stream().map( d-> {
MealDetail mealDetail;
if(d.getShouldUpdateMealDetailJson()) {
mealDetail = MealDetail.newBuilder()
.setBasicMaterials(d.getMealDetailJson().getBasicMaterials())
.addAllTastes(d.getMealDetailJson().getTastes())
.addAllEfficacies(d.getMealDetailJson().getEfficacies())
......@@ -116,8 +114,59 @@ public class OrderServiceRpcClient {
.addAllAllergies(d.getMealDetailJson().getAllergies())
.addAllAvoids(d.getMealDetailJson().getAvoids())
.addAllSkus(d.getMealDetailJson().getSkus())
.build())
.build()
.build();
} else {
mealDetail = MealDetail.newBuilder().build();
}
Integer menuDetailId = 0;
if (d.getShouldUpdateMenuDetailId()) {
menuDetailId = d.getMenuDetailId();
}
Integer count = 0;
if (d.getShouldUpdateCount()) {
count = d.getCount();
}
Integer mealId = 0;
if (d.getShouldUpdateMealId()) {
mealId = d.getMealId();
}
Integer categoryId = 0;
if (d.getShouldUpdateCategoryId()) {
categoryId = d.getCategoryId();
}
Integer skuId = 0;
if (d.getShouldUpdateSkuId()) {
skuId = d.getSkuId();
}
String showName = "";
if (d.getShouldUpdateShowName()) {
showName = d.getShowName();
}
Boolean notServe = false;
if (d.getShouldUpdateNotServe()) {
notServe = true;
}
final var detail = ClientCustomerOrderDetailModification.newBuilder()
.setId(d.getId())
.setShouldUpdateMenuDetailId(d.getShouldUpdateMenuDetailId())
.setMenuDetailId(menuDetailId)
.setShouldUpdateCount(d.getShouldUpdateCount())
.setCount(count)
.setShouldUpdateMealId(d.getShouldUpdateMealId())
.setMealId(mealId)
.setShouldUpdateCategoryId(d.getShouldUpdateCategoryId())
.setCategoryId(categoryId)
.setShouldUpdateSkuId(d.getShouldUpdateSkuId())
.setSkuId(skuId)
.setShouldUpdateShowName(d.getShouldUpdateShowName())
.setShowName(showName)
.setShouldUpdateNotServe(d.getShouldUpdateNotServe())
.setNotServe(notServe)
.setShouldUpdateMealDetailJson(d.getShouldUpdateMealDetailJson())
.setMealDetailJson(mealDetail)
.build();
return detail;
}
).collect(Collectors.toList());
final var request = BatchUpdateClientCustomerOrderDetailsRpcRequest.newBuilder()
.setEnterpriseId(orderDetailBatchUpdateDto.getEnterpriseId())
......
package com.infoloop.tianting.service.impl;
import com.infoloop.tianting.SingleResponse;
import com.infoloop.tianting.SingleSpecialResponse;
import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType;
import com.infoloop.tianting.clientcustomerorderservice.OrderSourceEnum;
import com.infoloop.tianting.clientcustomerorderservice.OrderTypeEnum;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerLabelRefRpcResponse;
import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.deliveryruleservice.ClientLabelTypeEnum;
import com.infoloop.tianting.deliveryruleservice.SingleClientLabelRpcResponse;
import com.infoloop.tianting.menuservice.CloseTimeTypeEnum;
import com.infoloop.tianting.menuservice.ModeOfPaymentEnum;
import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse;
import com.infoloop.tianting.model.common.PageResult;
import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.CustomerDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CustomerNotice;
import com.infoloop.tianting.model.dto.OrderDbDTO.MealDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OperatorCreateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderAndDetailsDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailBatchUpdateDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailDto;
......@@ -20,9 +34,14 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse;
import com.infoloop.tianting.service.ClientCustomerService;
import com.infoloop.tianting.service.OrderService;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import com.infoloop.tianting.service.client.DeliveryRuleServiceRpcClient;
import com.infoloop.tianting.service.client.MenuServiceRpcClient;
import com.infoloop.tianting.service.client.OperatorServiceRpcClient;
import com.infoloop.tianting.service.client.OrderServiceRpcClient;
import com.infoloop.tianting.service.client.SkuServiceRpcClient;
import com.infoloop.tianting.utils.DateUtil;
import com.infoloop.tianting.utils.PageUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
......@@ -37,6 +56,10 @@ import org.springframework.stereotype.Service;
public class OrderServiceImpl implements OrderService {
private final OrderServiceRpcClient orderServiceRpcClient;
private final ClientCustomerServiceRpcClient clientCustomerServiceRpcClient;
private final OperatorServiceRpcClient operatorServiceRpcClient;
private final MenuServiceRpcClient menuServiceRpcClient;
private final SkuServiceRpcClient skuServiceRpcClient;
private final DeliveryRuleServiceRpcClient deliveryRuleServiceRpcClient;
@Override
public CreateOrderResponse createOrder(CreateOrderDto createOrderDto) {
......@@ -44,6 +67,120 @@ public class OrderServiceImpl implements OrderService {
}
@Override
public CreateOrderResponse orderCreation(OperatorCreateOrderDto operatorCreateOrderDto) {
final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
final var operator = operatorServiceRpcClient.getCOperatorById(operatorLoginInfo.getId());
final var customer = clientCustomerServiceRpcClient.getClientCustomerById(operatorCreateOrderDto.getCustomerId()).getResponse();
final var record = clientCustomerServiceRpcClient.getClientCustomerHospitalRecordsByCustomerId(customer.getEnterpriseId(), customer.getId()).getResponse();
CreateOrderDto createOrderDto = new CreateOrderDto();
createOrderDto.setCustomerId(operatorCreateOrderDto.getCustomerId());
createOrderDto.setStallId(operatorCreateOrderDto.getStallId());
createOrderDto.setMenuId(operatorCreateOrderDto.getMenuId());
createOrderDto.setMealTime(operatorCreateOrderDto.getMealTime());
createOrderDto.setRemark(operatorCreateOrderDto.getRemark());
createOrderDto.setCreatedBy(operatorLoginInfo.getId());
createOrderDto.setClientId(customer.getClientId());
createOrderDto.setAddress(record.getDepartmentName() + record.getRoomNo());
final var menu = menuServiceRpcClient.getMenuById(operator.getEnterpriseId(),
createOrderDto.getMenuId()).getResponse();
createOrderDto.setCloseTimeType(
CloseTimeType.forNumber(menu.getOrderRuleJson().getCloseTimeType().getNumber()));
createOrderDto.setRoomNo(record.getRoomNo());
createOrderDto.setClientId(customer.getClientId());
createOrderDto.setCreationSource(OrderSourceEnum.STALL.getNumber());
createOrderDto.setEnterpriseId(operatorLoginInfo.getEnterpriseId());
// createOrderDto.setStallId();
var onlinePay = false;
if(menu.getOrderRuleJson().getModeOfPayment() == ModeOfPaymentEnum.ONLINE) {
onlinePay = true;
}
createOrderDto.setOnlinePay(onlinePay);
OrderTypeEnum orderType;
if (menu.getOrderRuleJson().getCloseTimeType() == CloseTimeTypeEnum.RESERVATION) {
orderType = OrderTypeEnum.DELIVERY;
} else {
orderType = OrderTypeEnum.DINE_IN;
}
createOrderDto.setOrderType(orderType.getNumber());
createOrderDto.setShouldCreateCustomerId(true);
createOrderDto.setShouldCreateOpenId(false);
final var labelRefs = clientCustomerServiceRpcClient.getCustomerLabelsByCustomerId(customer.getEnterpriseId(), customer.getId()).getResponsesList();
final var labelIds = labelRefs.stream().map(SingleClientCustomerLabelRefRpcResponse::getLabelId).collect(Collectors.toList());
final var labels = deliveryRuleServiceRpcClient.GetClientLabelsByIds(customer.getEnterpriseId(), labelIds).getResponsesList();
final var avoids = labels.stream().filter(l -> l.getType() == ClientLabelTypeEnum.CLIENT_LABEL_TYPE_AVOID).map(
SingleClientLabelRpcResponse::getName).collect(Collectors.toList());
final var doctors = labels.stream().filter(l -> l.getType() == ClientLabelTypeEnum.CLIENT_LABEL_TYPE_DOCTOR).map(
SingleClientLabelRpcResponse::getName).collect(Collectors.toList());
final var customerNotice = CustomerNotice.builder()
.avoids(avoids)
.doctors(doctors)
.build();
createOrderDto.setCustomerNoticeJson(customerNotice);
createOrderDto.setTableCode("");
createOrderDto.setUpdatedBy(operatorLoginInfo.getId());
createOrderDto.setUpdateSource(OrderSourceEnum.STALL.getNumber());
List<CreateOrderDetailDto> orderDetailDtoList = new ArrayList<>();
final var menuDetails = menuServiceRpcClient.queryMenuDetailsByMenuId(menu.getEnterpriseId(), operatorCreateOrderDto.getMenuId()).getResponsesList();
final var skuIds =
menuDetails.stream()
.map(SingleMenuDetailRpcResponse::getSkuId)
.collect(Collectors.toList());
final var rpcSkus = skuServiceRpcClient.getDishSkusByIds(skuIds).getResponseList();
Integer totalSkuCount = 0;
for (CreateOrderDetailDto orderDetail: createOrderDto.getOrderDetailDtos()) {
totalSkuCount += orderDetail.getCount();
final var optionalTargetMenuDetail = menuDetails.stream().filter(detail -> detail.getId() == orderDetail.getMenuDetailId()).findFirst();
if(optionalTargetMenuDetail.isEmpty()) {
continue;
}
final var optionalSku = rpcSkus.stream().filter(sku -> sku.getId() == optionalTargetMenuDetail.get().getSkuId()).findFirst();
if (optionalSku.isEmpty()) {
continue;
}
final var skus = optionalSku.get().getSkusList().stream().map(SingleResponse::getName).collect(Collectors.toList());
final var skuAvoids = optionalSku.get().getAvoidsList().stream().map(SingleResponse::getName).collect(Collectors.toList());
final var tastes = optionalSku.get().getTastesList().stream().map(SingleResponse::getName).collect(Collectors.toList());
final var efficacies = optionalSku.get().getEfficaciesList().stream().map(SingleResponse::getName).collect(Collectors.toList());
final var allergies = optionalSku.get().getAllergiesList().stream().map(
SingleSpecialResponse::getName).collect(Collectors.toList());
final var skuDoctors = optionalSku.get().getDoctorsList().stream().map(SingleSpecialResponse::getName).collect(Collectors.toList());
final var mealDetail = MealDetailDto
.builder()
.skus(skus)
.basicMaterials(optionalSku.get().getBasicMaterials())
.energy(optionalSku.get().getEnergy())
.protein(optionalSku.get().getProtein())
.avoids(skuAvoids)
.carbohydrate(optionalSku.get().getCarbohydrate())
.fat(optionalSku.get().getFat())
.tastes(tastes)
.efficacies(efficacies)
.allergies(allergies)
.dockers(skuDoctors)
.build();
final var createOrderDetail = CreateOrderDetailDto
.builder()
.count(orderDetail.getCount())
.notServe(false)
.menuDetailId(orderDetail.getMenuDetailId())
.categoryId(optionalTargetMenuDetail.get().getCategoryId())
.mealId(optionalTargetMenuDetail.get().getMealId())
.price(optionalTargetMenuDetail.get().getPrice())
.showName(optionalTargetMenuDetail.get().getShowName())
.skuId(optionalTargetMenuDetail.get().getSkuId())
.mealDetailJson(mealDetail)
.build();
orderDetailDtoList.add(createOrderDetail);
}
createOrderDto.setOrderDetailDtos(orderDetailDtoList);
createOrderDto.setTotalNum(totalSkuCount);
// createOrderDto.setPayPrice();
return orderServiceRpcClient.createOrder(createOrderDto);
}
@Override
public UpdateOrderResponse updateOrder(UpdateOrderDto updateOrderDto) {
final var response = orderServiceRpcClient.updateClientCustomerOrder(updateOrderDto);
return UpdateOrderResponse.builder()
......