wangyingyang

add kds part1

......@@ -4,6 +4,7 @@ import com.infoloop.rpc.meizhongyiheservice.MeiZhongYiHeServiceRpcGrpc;
import com.infoloop.tianting.COperatorServiceProtoRpcGrpc;
import com.infoloop.tianting.CategoriesServiceProtoRpcGrpc;
import com.infoloop.tianting.SkuServiceProtoRpcGrpc;
import com.infoloop.tianting.WOperatorServiceProtoRpcGrpc;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderServiceRpcGrpc;
import com.infoloop.tianting.clientcustomerservice.ClientCustomerServiceRpcGrpc;
import com.infoloop.tianting.clientinventoryservice.TiantingClientInventoryServiceRpcGrpc;
......@@ -59,6 +60,9 @@ import static com.infoloop.tianting.constant.ConfigConstants.ORDER_SERVICE_RPC_U
import static com.infoloop.tianting.constant.ConfigConstants.SKU_SERVICE_CHANNEL;
import static com.infoloop.tianting.constant.ConfigConstants.SKU_SERVICE_RPC_PORT;
import static com.infoloop.tianting.constant.ConfigConstants.SKU_SERVICE_RPC_URL;
import static com.infoloop.tianting.constant.ConfigConstants.WOPERATOR_SERVICE_CHANNEL;
import static com.infoloop.tianting.constant.ConfigConstants.WOPERATOR_SERVICE_RPC_PORT;
import static com.infoloop.tianting.constant.ConfigConstants.WOPERATOR_SERVICE_RPC_URL;
@Configuration
public class GrpcConfig {
......@@ -235,6 +239,23 @@ public class GrpcConfig {
return COperatorServiceProtoRpcGrpc.newBlockingStub(channel);
}
@Bean(WOPERATOR_SERVICE_CHANNEL)
public ManagedChannel woperatorServiceChannel(@Value(WOPERATOR_SERVICE_RPC_URL) final String url,
@Value(WOPERATOR_SERVICE_RPC_PORT) final int port,
@Autowired final ClientInterceptor clientInterceptor) {
return NettyChannelBuilder.forAddress(url, port)
.idleTimeout(DEFAULT_TIMEOUT_DAYS, TimeUnit.DAYS)
.intercept(clientInterceptor)
.usePlaintext()
.maxInboundMessageSize(Integer.MAX_VALUE)
.build();
}
@Bean
public WOperatorServiceProtoRpcGrpc.WOperatorServiceProtoRpcBlockingStub woperatorServiceRpcBlockingStub(@Autowired @Qualifier(WOPERATOR_SERVICE_CHANNEL) final ManagedChannel channel) {
return WOperatorServiceProtoRpcGrpc.newBlockingStub(channel);
}
@Bean(MEIZHONGYIHE_SERVICE_CHANNEL)
public ManagedChannel meiZhongYiHeServiceChannel(@Value(MEIZHONGYIHE_SERVICE_RPC_URL) final String url,
@Value(MEIZHONGYIHE_SERVICE_RPC_PORT) final int port,
......
......@@ -64,6 +64,10 @@ public interface ConfigConstants {
String OPERATOR_SERVICE_RPC_PORT = "${grpc.operator-service.port}";
String OPERATOR_SERVICE_CHANNEL = "operator-service-channel";
String WOPERATOR_SERVICE_RPC_URL = "${grpc.woperator-service.url}";
String WOPERATOR_SERVICE_RPC_PORT = "${grpc.woperator-service.port}";
String WOPERATOR_SERVICE_CHANNEL = "woperator-service-channel";
String MEIZHONGYIHE_SERVICE_RPC_URL = "${grpc.meizhongyihe-service.url}";
String MEIZHONGYIHE_SERVICE_RPC_PORT = "${grpc.meizhongyihe-service.port}";
String MEIZHONGYIHE_SERVICE_CHANNEL = "meizhongyihe-service-channel";
......
package com.infoloop.tianting.controller;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "KDS")
@ApiSupport(order = -1)
@Slf4j
@Validated
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class KdsController {
}
package com.infoloop.tianting.controller;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.infoloop.tianting.model.dto.SettlementDTO.SettlementRequestDto;
import com.infoloop.tianting.service.SettlementService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.io.ByteArrayOutputStream;
import javax.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "结算")
@ApiSupport(order = 0)
@Slf4j
@Validated
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SettlementController {
private final SettlementService settlementService;
@ApiOperation(value = "结算账单生成excel")
@PostMapping("/settlement/generate-excel")
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<byte[]> settlementGenerateExcel(
@Valid @RequestBody SettlementRequestDto settlementRequestDto) {
ByteArrayOutputStream outputStream = settlementService.generateOrderSettlementExcel(
settlementRequestDto);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", "订单数据.xlsx");
return ResponseEntity.ok()
.headers(headers)
.body(outputStream.toByteArray());
}
}
......@@ -24,6 +24,7 @@ public enum ErrorCodeEnum implements BaseEnum {
UPDATE_DATA_ERROR(406000002, "修改数据失败"),
DELETE_DATA_ERROR(406000003, "删除数据失败"),
GENERATE_EXCEL_ERROR(406000004, "生成excel失败"),
;
private final int code;
......
package com.infoloop.tianting.model.dto;
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;
@Data
@ApiModel(description = "kds DTO")
public class KdsDTO {
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "KdsOrderDto")
public static class KdsOrderDto {
private Integer orderId;
private Integer orderDetailId;
private String tableCode;
private Integer count;
private String roomNo;
private String remark;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "KdsOrderSkuDto")
public static class KdsOrderSkuDto {
private String showName;
private Integer totalCount;
private List<KdsOrderDto> orderList;
}
}
......@@ -3,6 +3,7 @@ package com.infoloop.tianting.model.dto;
import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType;
import com.infoloop.tianting.clientcustomerorderservice.OrderSourceEnum;
import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum;
import com.infoloop.tianting.menuservice.CloseTimeTypeEnum;
import com.infoloop.tianting.model.common.PageInfo;
import io.swagger.annotations.ApiModel;
......@@ -481,8 +482,8 @@ public class OrderDbDTO {
@ApiModelProperty(value = "是否删除;0:未删除,1:已删除")
private Boolean isDeleted;
@ApiModelProperty(value = "是否不出餐: 默认出餐=0; 不出餐=1")
private Boolean notServe;
@ApiModelProperty(value = "出餐状态: 默认未出餐=1; 不出餐=2; 已出餐=3")
private ServeStatusEnum serveStatus;
@ApiModelProperty(value = "调整配料备注")
private String adjustSkuRemark;
......@@ -529,9 +530,6 @@ public class OrderDbDTO {
@ApiModelProperty(value = "菜品价格,以分为单位")
private Integer price;
@ApiModelProperty(value = "是否不出餐: 默认出餐=0; 不出餐=1")
private Boolean notServe;
@ApiModelProperty(value = "调整配料备注")
private String adjustSkuRemark;
}
......@@ -596,11 +594,11 @@ public class OrderDbDTO {
@ApiModelProperty(value = "菜品详情,菜品主料、口味、能量、脂肪、蛋白质、碳水化合物、忌口、医嘱等")
private MealDetailDto mealDetailJson;
@ApiModelProperty(value = "需要修改不出餐")
private Boolean shouldUpdateNotServe;
@ApiModelProperty(value = "需要修改出餐状态")
private Boolean shouldUpdateServeStatus;
@ApiModelProperty(value = "是否不出餐: 默认出餐=0; 不出餐=1")
private Boolean notServe;
@ApiModelProperty(value = "出餐状态: 默认未出餐=1; 不出餐=2; 已出餐=3")
private ServeStatusEnum serveStatus;
}
@Data
......
......@@ -3,6 +3,7 @@ package com.infoloop.tianting.model.dto;
import com.infoloop.tianting.enums.LoginSourceEnum;
import io.swagger.annotations.ApiModel;
import lombok.Builder;
import lombok.Builder.Default;
import lombok.Data;
@Data
......@@ -14,13 +15,26 @@ public class PermissionDTO {
@ApiModel(description = "Login DTO")
public static class LoginDto {
private LoginSourceEnum loginSourceEnum;
private boolean shouldLoginWithHisCustomerId;
private String hisCustomerId;
private boolean shouldLoginWithOperatorPhone;
private String operatorPhone;
private boolean shouldLoginWithOpenCode;
private String openCode;
private Integer enterpriseId;
@Builder.Default
private boolean shouldLoginWithHisCustomerId = false;
@Builder.Default
private String hisCustomerId = "";
@Builder.Default
private boolean shouldLoginWithOperatorPhone = false;
@Builder.Default
private String operatorPhone = "";
@Builder.Default
private boolean shouldLoginWithOpenCode = false;
@Builder.Default
private String openCode = "";
@Builder.Default
private boolean shouldLoginWithKdsEmail = false;
@Builder.Default
private String kdsEmail = "";
@Builder.Default
private String kdsPassword = "";
@Builder.Default
private Integer enterpriseId = 0;
}
}
......
package com.infoloop.tianting.service;
public interface KdsService {
}
......@@ -23,6 +23,7 @@ import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByConditionRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcRequest;
......@@ -154,9 +155,9 @@ public class OrderServiceRpcClient {
}
Boolean notServe = false;
if (d.getShouldUpdateNotServe()) {
notServe = true;
ServeStatusEnum serveStatus = ServeStatusEnum.UNKNOWN_SERVE_STATUS;
if (d.getShouldUpdateServeStatus()) {
serveStatus = d.getServeStatus();
}
Integer count = 0;
if (d.getShouldUpdateCount()) {
......@@ -176,8 +177,8 @@ public class OrderServiceRpcClient {
.setSkuId(skuId)
.setShouldUpdateShowName(d.getShouldUpdateMenuDetailId())
.setShowName(showName)
.setShouldUpdateNotServe(d.getShouldUpdateNotServe())
.setNotServe(notServe)
.setShouldUpdateServeStatus(d.getShouldUpdateServeStatus())
.setServeStatus(serveStatus)
.setShouldUpdateMealDetailJson(d.getShouldUpdateMenuDetailId())
.setMealDetailJson(mealDetail)
.build();
......@@ -221,10 +222,6 @@ public class OrderServiceRpcClient {
.addAllOrderIds(orderIds)
.build()).getResponsesList();
}
// public GetOrdersByOpenIdRpcResponse queryOrdersByOpenId(Integer openId) {
// return orderServiceRpcBlockingStub.getOrdersByCustomerId(
// GetOrdersByOpenIdRpcRequest.newBuilder().setOpenId(openId).build());
// }
public CreateOrderResponse createOrder(CreateOrderDto createOrderDto) {
final var orderDetails = new ArrayList<ClientCustomerOrderDetailCreation>();
......@@ -254,7 +251,7 @@ public class OrderServiceRpcClient {
.setPrice(orderDetailDto.getPrice())
.setMealDetailJson(mealDetail)
// .setAdjustSkuRemark(orderDetailDto.getAdjustSkuRemark())
.setNotServe(orderDetailDto.getNotServe())
.setServeStatus(ServeStatusEnum.SERVE_NOT_START)
.setShouldCreateAdjustSkuRemark(true)
.setShouldCreatePrice(true)
.setShouldCreateMealDetailJson(true)
......
package com.infoloop.tianting.service.client;
import com.infoloop.tianting.COperatorServiceProtoRpcGrpc;
import com.infoloop.tianting.GetWOperatorByEmailRpcRequest;
import com.infoloop.tianting.GetWOperatorByEmailRpcResponse;
import com.infoloop.tianting.WOperatorServiceProtoRpcGrpc;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class WOperatorServiceRpcClient {
private final WOperatorServiceProtoRpcGrpc.WOperatorServiceProtoRpcBlockingStub
wOperatorServiceProtoRpcBlockingStub;
public GetWOperatorByEmailRpcResponse getWOperatorByEmail(String email) {
final var request = GetWOperatorByEmailRpcRequest.newBuilder()
.setEmail(email)
.build();
return wOperatorServiceProtoRpcBlockingStub.getWOperatorByEmail(request);
}
}
package com.infoloop.tianting.service.impl;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderSkuDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import com.infoloop.tianting.service.KdsService;
import com.infoloop.tianting.service.client.MenuServiceRpcClient;
import com.infoloop.tianting.service.client.OrderServiceRpcClient;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.record.DVALRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class KdsServiceImpl implements KdsService {
private final OrderServiceRpcClient orderServiceRpcClient;
private final MenuServiceRpcClient menuServiceRpcClient;
public void getOrderDetailBySku() {
// 获取当日所有的订单 和 订单明细
LocalDate today = LocalDate.now();
LocalDateTime todayZero = today.atStartOfDay();
LocalDate tomorrow = today.plusDays(1);
LocalDateTime tomorrowZero = tomorrow.atStartOfDay();
final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
final var queryOrderDto = QueryOrderByConditionDto.builder()
.enterpriseId(operatorLoginInfo.getEnterpriseId())
.shouldFilterCreatedAtTimeStart(true)
.createdAtTimeStart(todayZero)
.shouldFilterCreatedAtTimeEnd(true)
.createdAtTimeEnd(tomorrowZero)
.build();
final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
List<Integer> orderIds = orderList.stream()
.map(SingleClientCustomerOrderRpcResponse::getId)
.distinct()
.collect(Collectors.toList());
final var orderDetailList = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds);
//在所有的orderDetail里找出所有所有不同的menuDetailId,然后根据menuDetailId进行分类
final var menuDetailIds = orderDetailList.stream()
.map(SingleClientCustomerOrderDetailRpcResponse::getMenuDetailId)
.distinct()
.collect(Collectors.toList());
List<KdsOrderSkuDto> kdsOrderSkuList = new ArrayList<>();
for (Integer menuDetailId: menuDetailIds) {
// 找出该menuDetailId 的所有orderDetail
final var curOrderDetails = orderDetailList.stream()
.filter(d-> d.getMenuDetailId() == menuDetailId)
.collect(Collectors.toList());
final var totalCount = curOrderDetails.stream()
.mapToInt(SingleClientCustomerOrderDetailRpcResponse::getCount)
.sum();
List<KdsOrderDto> kdsOrders = new ArrayList<>();
for(SingleClientCustomerOrderDetailRpcResponse detail: curOrderDetails) {
final var order = orderList.stream()
.filter(o -> o.getId() == detail.getOrderId())
.findFirst();
if (order.isEmpty()) {
continue;
}
final var kdsOrder = KdsOrderDto.builder()
.count(detail.getCount())
.orderDetailId(detail.getId())
.remark(order.get().getRemark())
.orderId(order.get().getId())
.roomNo(order.get().getRoomNo())
.tableCode(order.get().getTableCode())
.build();
kdsOrders.add(kdsOrder);
}
final var kdsOrderSku = KdsOrderSkuDto.builder()
.showName(curOrderDetails.get(0).getShowName())
.totalCount(totalCount)
.orderList(kdsOrders)
.build();
kdsOrderSkuList.add(kdsOrderSku);
}
}
}
......@@ -16,6 +16,7 @@ import com.infoloop.tianting.service.LoginService;
import com.infoloop.tianting.service.WxMiniProgramService;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import com.infoloop.tianting.service.client.OperatorServiceRpcClient;
import com.infoloop.tianting.service.client.WOperatorServiceRpcClient;
import com.infoloop.tianting.service.client.WxMiniProgramClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
......@@ -30,55 +31,83 @@ public class LoginServiceImpl implements LoginService {
private final ClientCustomerServiceRpcClient clientCustomerServiceRpcClient;
private final OperatorServiceRpcClient operatorServiceRpcClient;
private final WxMiniProgramClient wxMiniProgramClient;
private final WOperatorServiceRpcClient wOperatorServiceRpcClient;
@Override
public SaTokenInfo login(LoginDto loginDto) {
if (loginDto.isShouldLoginWithOpenCode()) {
final var wxUserOpenIdDto = wxMiniProgramClient.getUserOpenIdByCode(loginDto.getOpenCode());
StpUtil.login(wxUserOpenIdDto.getOpenid(), SaLoginModel.create()
StpUtil.login(
wxUserOpenIdDto.getOpenid(),
SaLoginModel.create()
.setExtra(CommonConstants.ENTERPRISE_ID, loginDto.getEnterpriseId())
.setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
.build());
return StpUtil.getTokenInfo();
}
else if (loginDto.isShouldLoginWithHisCustomerId()){
var customer = clientCustomerServiceRpcClient.getClientCustomerByHISCustomerId(
loginDto.getHisCustomerId()).getResponse();
} else if (loginDto.isShouldLoginWithHisCustomerId()) {
var customer =
clientCustomerServiceRpcClient
.getClientCustomerByHISCustomerId(loginDto.getHisCustomerId())
.getResponse();
if (customer.getId() == 0) {
// 根据hisCustomerId拿不到用户的话再去根据合同号去his查一次,即认为是月子中心客户
customer = clientCustomerServiceRpcClient.getClientCustomerByContactNo(loginDto.getHisCustomerId()).getResponse();
customer =
clientCustomerServiceRpcClient
.getClientCustomerByContactNo(loginDto.getHisCustomerId())
.getResponse();
if (customer.getId() == 0) {
throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
} else {
var record = clientCustomerServiceRpcClient.getClientCustomerHospitalRecordsByCustomerId(
var record =
clientCustomerServiceRpcClient.getClientCustomerHospitalRecordsByCustomerId(
customer.getEnterpriseId(), customer.getId());
if (!record.hasResponse() || record.getResponse().getHospitalStatus() !=
ClientCustomerHospitalRecordHospitalStatusEnum.CURRENT) {
throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
if (!record.hasResponse()
|| record.getResponse().getHospitalStatus()
!= ClientCustomerHospitalRecordHospitalStatusEnum.CURRENT) {
throw ClientEndExceptions.AuthenticationFailure.build(
ErrorCodeEnum.UNAUTHORIZED.name());
}
}
} else {
}
StpUtil.login(customer.getId(), SaLoginModel.create()
StpUtil.login(
customer.getId(),
SaLoginModel.create()
.setExtra(CommonConstants.ENTERPRISE_ID, customer.getEnterpriseId())
.setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
.build());
return StpUtil.getTokenInfo();
} else if (loginDto.isShouldLoginWithOperatorPhone()) {
final var operator =
operatorServiceRpcClient.getCOperatorByMobileOrEmail(loginDto.getOperatorPhone());
if (operator.getId() == 0) {
throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
}
else {
final var operator = operatorServiceRpcClient.getCOperatorByMobileOrEmail(
loginDto.getOperatorPhone());
StpUtil.login(
operator.getId(),
SaLoginModel.create()
.setExtra(CommonConstants.ENTERPRISE_ID, operator.getEnterpriseId())
.setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
.build());
return StpUtil.getTokenInfo();
} else {
final var operator =
wOperatorServiceRpcClient.getWOperatorByEmail(loginDto.getKdsEmail()).getResponse();
if (operator.getId() == 0) {
throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
}
StpUtil.login(operator.getId(), SaLoginModel.create()
if (!operator.getPassword().equals(loginDto.getKdsPassword())) {
throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.VALIDATE_FAILED.name());
}
StpUtil.login(
operator.getId(),
SaLoginModel.create()
.setExtra(CommonConstants.ENTERPRISE_ID, operator.getEnterpriseId())
.setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
.build());
return StpUtil.getTokenInfo();
}
}
}
......
......@@ -167,7 +167,6 @@ public class OrderServiceImpl implements OrderService {
final var createOrderDetail = CreateOrderDetailDto
.builder()
.count(orderDetail.getCount())
.notServe(false)
.menuDetailId(orderDetail.getMenuDetailId())
.categoryId(optionalTargetMenuDetail.get().getCategoryId())
.mealId(optionalTargetMenuDetail.get().getMealId())
......@@ -230,7 +229,7 @@ public class OrderServiceImpl implements OrderService {
.adjustSkuRemark(d.getAdjustSkuRemark())
.enterpriseId(d.getEnterpriseId())
.skuId(d.getSkuId())
.notServe(d.getNotServe())
.serveStatus(d.getServeStatus())
.creationSource(d.getCreationSource().getNumber())
.createdBy(d.getCreatedBy())
.createdAt(DateUtil.formatDate(d.getCreatedAt()))
......@@ -302,7 +301,7 @@ public class OrderServiceImpl implements OrderService {
.adjustSkuRemark(d.getAdjustSkuRemark())
.enterpriseId(d.getEnterpriseId())
.skuId(d.getSkuId())
.notServe(d.getNotServe())
.s(d.getNotServe())
.creationSource(d.getCreationSource().getNumber())
.createdBy(d.getCreatedBy())
.createdAt(DateUtil.formatDate(d.getCreatedAt()))
......
......@@ -3,6 +3,8 @@ package com.infoloop.tianting.service.impl;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.exception.ClientEndExceptions.BusinessException;
import com.infoloop.tianting.exception.ErrorCodeEnum;
import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse;
import com.infoloop.tianting.menuservice.SingleMenuRpcResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
......@@ -14,6 +16,8 @@ import com.infoloop.tianting.service.client.MenuServiceRpcClient;
import com.infoloop.tianting.service.client.OrderServiceRpcClient;
import com.infoloop.tianting.utils.DateUtil;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
......@@ -22,6 +26,12 @@ import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -122,6 +132,79 @@ public class SettlementServiceImpl implements SettlementService {
}
}
try {
final var bytes = writeToExcel(classifyOrders);
return bytes;
} catch (IOException e) {
throw BusinessException.build(ErrorCodeEnum.GENERATE_EXCEL_ERROR);
}
}
public static ByteArrayOutputStream writeToExcel(Map<String, Map<Integer, List<SettlementMenuSkuDto>>> classifyOrders)
throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("订单数据");
int rowNum = 0;
for (Map.Entry<String, Map<Integer, List<SettlementMenuSkuDto>>> outerEntry : classifyOrders.entrySet()) {
String orderDate = outerEntry.getKey();
Map<Integer, List<SettlementMenuSkuDto>> innerMap = outerEntry.getValue();
// 写入日期列并合并单元格
int startRowForDate = rowNum;
for (int i = 0; i < innerMap.size() * 2; i++) {
Row dateRow = sheet.createRow(rowNum++);
Cell dateCell = dateRow.createCell(0);
dateCell.setCellValue(orderDate);
}
int endRowForDate = rowNum - 1;
if (endRowForDate >= startRowForDate) {
CellRangeAddress region = new CellRangeAddress(startRowForDate, endRowForDate, 0, 0);
sheet.addMergedRegion(region);
}
for (Map.Entry<Integer, List<SettlementMenuSkuDto>> innerEntry : innerMap.entrySet()) {
int menuId = innerEntry.getKey();
List<SettlementMenuSkuDto> skuList = innerEntry.getValue();
// 写入菜单ID列并合并单元格
int startRowForMenu = rowNum;
for (int i = 0; i < skuList.size(); i++) {
Row menuRow = sheet.createRow(rowNum++);
Cell menuCell = menuRow.createCell(1);
menuCell.setCellValue(menuId);
}
int endRowForMenu = rowNum - 1;
if (endRowForMenu >= startRowForMenu) {
CellRangeAddress region = new CellRangeAddress(startRowForMenu, endRowForMenu, 1, 1);
sheet.addMergedRegion(region);
}
// 写入SKU列
for (SettlementMenuSkuDto skuDto : skuList) {
Row skuRow = sheet.createRow(rowNum++);
Cell skuCell = skuRow.createCell(2);
skuCell.setCellValue(skuDto.getShowName());
skuCell.setCellValue(skuDto.getPrice());
skuCell.setCellValue(skuDto.getCount());
skuCell.setCellValue(skuDto.getTotalPrice());
}
}
}
// 自动调整列宽
for (int i = 0; i < 6; i++) {
sheet.autoSizeColumn(i);
}
// 将工作簿内容写入字节数组输出流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
workbook.close();
return outputStream;
}
}
......
......@@ -72,6 +72,13 @@ enum CloseTimeType {
RESERVATION = 1;
}
enum ServeStatusEnum {
UNKNOWN_SERVE_STATUS = 0;
SERVE_NOT_START = 1;
SERVE_REJECT = 2;
SERVE_FINISHED = 3;
}
message CustomerNotice {
repeated string avoids = 1;
repeated string doctors = 2;
......@@ -403,7 +410,7 @@ message SingleClientCustomerOrderDetailRpcResponse {
int64 updatedAt = 16;
OrderSourceEnum updateSource = 17;
bool isDeleted = 18;
bool notServe = 19;
ServeStatusEnum serveStatus = 19;
int32 enterpriseId = 20;
}
......@@ -450,7 +457,7 @@ message ClientCustomerOrderDetailCreation{
int32 price = 13;
bool shouldCreateAdjustSkuRemark = 14;
string adjustSkuRemark = 15;
bool notServe = 16;
ServeStatusEnum serveStatus= 16;
}
message CreateClientCustomerOrderDetailRpcRequest {
......@@ -497,8 +504,8 @@ message ClientCustomerOrderDetailModification {
int32 price = 17;
bool shouldUpdateAdjustSkuRemark = 18;
string adjustSkuRemark = 19;
bool shouldUpdateNotServe = 20;
bool notServe = 21;
bool shouldUpdateServeStatus = 20;
ServeStatusEnum serveStatus = 21;
}
message UpdateClientCustomerOrderDetailRpcRequest {
......
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.infoloop.tianting";
option java_outer_classname = "WOperatorsServiceProto";
option objc_class_prefix = "OP";
package com.infoloop.tianting;
service WOperatorServiceProtoRpc {
rpc GetWOperators(GetWOperatorsRpcRequest) returns (GetWOperatorsRpcResponse) {}
rpc GetWOperatorById(GetWOperatorByIdRpcRequest) returns (GetWOperatorByIdRpcResponse) {}
rpc GetWOperatorsByIds(GetWOperatorsByIdsRpcRequest) returns (GetWOperatorsByIdsRpcResponse) {}
rpc SetWOperatorIsInfoloopOperatorById(SetWOperatorIsInfoloopOperatorByIdRpcRequest) returns (SetWOperatorIsInfoloopOperatorByIdRpcResponse) {}
rpc BatchUpdateWOperatorPasswordByIds(BatchUpdateWOperatorPasswordByIdsRpcRequest) returns (BatchUpdateWOperatorPasswordByIdsRpcResponse) {}
rpc GetWOperatorByEmail(GetWOperatorByEmailRpcRequest) returns (GetWOperatorByEmailRpcResponse) {}
rpc GetOperatorByMobile(GetOperatorByMobileRpcRequest) returns (GetOperatorByMobileRpcResponse) {}
rpc DeleteOperatorById(OperatorByIdDeleteRpcRequest) returns (OperatorByIdDeleteRpcResponse) {}
rpc DeleteOperatorByAccount (OperatorByAccountDeleteRpcRequest) returns (OperatorByAccountDeleteRpcResponse) {}
rpc CreateOperator (OperatorCreateRpcRequest) returns (OperatorCreateRpcResponse) {}
rpc GetOperatorsByEnterpriseId (GetOperatorsByEnterpriseIdRpcRequest) returns (GetOperatorsByEnterpriseIdRpcResponse) {}
rpc UpdateWOperatorStatusByIds (UpdateWOperatorStatusByIdsRpcRequest) returns (UpdateWOperatorStatusByIdsRpcResponse) {}
rpc GetOperatorsByCondition (OperatorsGetByConditionRpcRequest) returns (OperatorsGetByConditionRpcResponse) {}
}
message UpdateWOperatorStatusByIdsRpcRequest {
repeated int32 ids = 1;
WOperatorStatus status = 2;
}
message UpdateWOperatorStatusByIdsRpcResponse {
bool isUpdated = 1;
}
message GetOperatorsByEnterpriseIdRpcRequest {
int32 enterpriseId = 1;
bool includeDeleted = 2;
}
message GetOperatorsByEnterpriseIdRpcResponse {
repeated WOperatorResponse response = 1;
}
message OperatorCreateRpcRequest {
int32 enterpriseId = 2;
string code = 3;
bool isEmailSet = 15;
string email = 4;
string name = 5;
string password = 6;
bool isMobileSet = 16;
string mobile = 7;
string note = 8;
WOperatorStatus status = 9;
string openId = 13;
string telephone = 14;
}
message OperatorCreateRpcResponse {
int32 id = 1;
bool isCreated = 2;
string errorMessage = 3;
}
message OperatorByIdDeleteRpcRequest {
int32 id = 1;
int64 deletedAt = 2;
int32 enterpriseId = 3;
}
message OperatorByIdDeleteRpcResponse {
bool isDeleted = 1;
}
message OperatorByAccountDeleteRpcRequest {
bool isEmailSet = 1;
string email = 2;
bool isMobileSet = 3;
string mobile = 4;
}
message OperatorByAccountDeleteRpcResponse {
bool isDeleted = 1;
}
message GetOperatorByMobileRpcRequest {
string mobile = 1;
}
message GetOperatorByMobileRpcResponse {
WOperatorResponse response = 1;
}
message GetWOperatorsRpcRequest {
bool includeDeleted = 1;
}
message GetWOperatorByIdRpcRequest {
int32 id = 1;
}
message GetWOperatorsByIdsRpcRequest {
repeated int32 ids = 1;
bool includeDeleted = 2;
}
message GetWOperatorByEmailRpcRequest {
string email = 1;
}
message SetWOperatorIsInfoloopOperatorByIdRpcRequest {
int32 id = 1;
bool isInfoloopOperator = 2;
}
message BatchUpdateWOperatorPasswordByIdsRpcRequest {
repeated SingleUpdateWOperator request = 1;
}
message SingleUpdateWOperator {
int32 id = 1;
string password = 2;
}
enum WOperatorStatus {
UN_KNOW = 0;
SHOW = 1;
HIDE = 2;
DELETED = 3;
}
message WOperatorResponse {
int32 id = 1;
int32 enterpriseId = 2;
string code = 3;
string email = 4;
string name = 5;
string password = 6;
string mobile = 7;
string note = 8;
WOperatorStatus status = 9;
int64 createdAt = 10;
int64 updatedAt = 11;
bool isSuper = 12;
string openId = 13;
string telephone = 14;
}
message GetWOperatorsRpcResponse {
repeated WOperatorResponse responses = 1;
}
message GetWOperatorByIdRpcResponse {
WOperatorResponse response = 1;
}
message GetWOperatorsByIdsRpcResponse {
repeated WOperatorResponse responses = 1;
}
message GetWOperatorByEmailRpcResponse {
WOperatorResponse response = 1;
}
message SetWOperatorIsInfoloopOperatorByIdRpcResponse {
}
message BatchUpdateWOperatorPasswordByIdsRpcResponse {
}
message OperatorsGetByConditionRpcRequest {
int32 enterpriseId = 1;
bool includeDeleted = 2;
bool shouldFilterNameKeyword = 3;
string nameKeyword = 4;
}
message OperatorsGetByConditionRpcResponse {
repeated WOperatorResponse responses = 1;
}
......@@ -64,6 +64,9 @@ grpc.delivery-service.port=3017
grpc.operator-service.url=47.101.193.136
grpc.operator-service.port=3031
grpc.woperator-service.url=47.101.193.136
grpc.woperator-service.port=3028
grpc.meizhongyihe-service.url=47.101.193.136
grpc.meizhongyihe-service.port=3040
......