diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java index 800ce67d..8fb6fe16 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java @@ -12,6 +12,7 @@ import com.czg.order.vo.OrderInfoVo; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; import com.czg.service.order.service.PayService; +import com.czg.utils.AssertUtil; import com.czg.utils.ServletUtil; import com.mybatisflex.core.paginate.Page; import jakarta.annotation.Resource; @@ -100,4 +101,17 @@ public class AdminOrderController { public CzgResult printOrder(@Validated @RequestBody OrderInfoPrintDTO orderInfoPrintDTO) { return CzgResult.success(orderInfoService.printOrder(StpKit.USER.getShopId(), orderInfoPrintDTO)); } + + @PostMapping("/cancelOrder") + public CzgResult cancelOrder(@Validated @RequestBody OrderCannelDTO param) { + orderInfoService.cancelledOrder(param.getShopId(), param.getOrderId()); + return CzgResult.success(); + } + + @PostMapping("/rmPlaceOrder") + public CzgResult cancelledPlaceOrder(@Validated @RequestBody OrderCannelDTO param) { + AssertUtil.isNull(param.getPlaceNum(), "{}不能为空", "取消单次"); + orderInfoService.cancelledPlaceOrder(param.getShopId(), param.getOrderId(), param.getPlaceNum()); + return CzgResult.success(); + } } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java b/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java index c8280228..127892e8 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java @@ -1,6 +1,8 @@ package com.czg.controller.user; import com.czg.annotation.Debounce; +import com.czg.exception.CzgException; +import com.czg.order.dto.OrderCannelDTO; import com.czg.order.dto.OrderInfoAddDTO; import com.czg.order.dto.OrderInfoQueryDTO; import com.czg.order.entity.OrderInfo; @@ -9,11 +11,13 @@ import com.czg.order.vo.HistoryOrderVo; import com.czg.order.vo.OrderInfoVo; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; +import com.czg.service.order.enums.OrderStatusEnums; import com.czg.utils.AssertUtil; import com.czg.utils.ServletUtil; import com.mybatisflex.core.paginate.Page; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -70,10 +74,30 @@ public class UserOrderController { public CzgResult upOrderIsDel(@PathVariable("id") Long id) { //效验数据 AssertUtil.isNull(id, "{}不能为空", "订单Id"); + OrderInfo orderInfo = orderInfoService.getById(id); + AssertUtil.isNull(orderInfo, "删除失败订单不存在"); + if (orderInfo.getStatus().equals(OrderStatusEnums.UNPAID.getCode())) { + throw new CzgException("待支付订单不可删除"); + } orderInfoService.updateChain() .set(OrderInfo::getIsDel, 1) .eq(OrderInfo::getId, id) .update(); return CzgResult.success(); } + + @PostMapping("/cancelOrder") + @Debounce(value = "#param.orderId") + public CzgResult cancelOrder(@Validated @RequestBody OrderCannelDTO param) { + orderInfoService.cancelledOrder(param.getShopId(), param.getOrderId()); + return CzgResult.success(); + } + + @PostMapping("/rmPlaceOrder") + @Debounce(value = "#param.orderId") + public CzgResult cancelledPlaceOrder(@Validated @RequestBody OrderCannelDTO param) { + AssertUtil.isNull(param.getPlaceNum(), "{}不能为空", "取消单次"); + orderInfoService.cancelledPlaceOrder(param.getShopId(), param.getOrderId(), param.getPlaceNum()); + return CzgResult.success(); + } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderCannelDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderCannelDTO.java new file mode 100644 index 00000000..bd7583e7 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderCannelDTO.java @@ -0,0 +1,17 @@ +package com.czg.order.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author ww + * @description + */ +@Data +public class OrderCannelDTO { + @NotNull(message = "店铺ID不可为空") + private Long shopId; + @NotNull(message = "订单ID不可为空") + private Long orderId; + private Integer placeNum; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java index 47b40ae3..27332d99 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java @@ -60,4 +60,8 @@ public interface OrderInfoService extends IService { Boolean removeOrderDetail(Long shopId, Long orderId, Long detailId); + + Boolean cancelledOrder(Long shopId, Long orderId); + + Boolean cancelledPlaceOrder(Long shopId, Long orderId, Integer placeNum); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/HistoryOrderPrintVo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/HistoryOrderPrintVo.java index 6b71a1c8..edc3a7a7 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/HistoryOrderPrintVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/HistoryOrderPrintVo.java @@ -15,4 +15,5 @@ import java.util.Map; @Data public class HistoryOrderPrintVo extends OrderInfo { private Map> detailMap; + private long orderNum; } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/print/FeiPrinter.java b/cash-service/order-service/src/main/java/com/czg/service/order/print/FeiPrinter.java index c353d5e6..66af4cd3 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/print/FeiPrinter.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/print/FeiPrinter.java @@ -10,6 +10,7 @@ import com.czg.account.entity.ShopInfo; import com.czg.account.service.ShopInfoService; import com.czg.order.entity.OrderDetail; import com.czg.order.entity.OrderInfo; +import com.czg.service.order.enums.OrderStatusEnums; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; @@ -110,6 +111,9 @@ public class FeiPrinter extends PrinterHandler implements PrinterImpl { @Override protected void normalOrderPrint(OrderInfo orderInfo, boolean isPre, PrintMachine machine, String balance, List detailList) { ShopInfo shopInfo = shopInfoService.getById(orderInfo.getShopId()); + long count = orderInfoService.queryChain() + .eq(OrderInfo::getTradeDay, orderInfo.getTradeDay()) + .eq(OrderInfo::getStatus, OrderStatusEnums.DONE.getCode()).count(); String printerNum = "1"; if (StrUtil.isNotBlank(machine.getPrintQty())) { printerNum = machine.getPrintQty().split("\\^")[1]; @@ -122,6 +126,8 @@ public class FeiPrinter extends PrinterHandler implements PrinterImpl { .setBalance(balance).setPayType((ObjectUtil.isEmpty(orderInfo.getPayType()) || ObjectUtil.isNull(orderInfo.getPayType()) ? "" : orderInfo.getPayType())).setIntegral("0") .setOutNumber(orderInfo.getTakeCode()).setPrintTitle(isPre ? "预结算单" : "结算单") .setRemark(orderInfo.getRemark()).setDiscountAmount(orderInfo.getOriginAmount().subtract(orderInfo.getPayAmount()).toPlainString()); + printInfoDTO.setPrintTitle(printInfoDTO.getPrintTitle() + " #" + count); + String string = buildOrderPrintData(printInfoDTO, detailList); Object resp = sendPrintRequest(machine.getAddress(), string, null, printerNum); printMachineLogService.save(machine, "结算单", string, resp); diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/print/PrinterHandler.java b/cash-service/order-service/src/main/java/com/czg/service/order/print/PrinterHandler.java index e7f6a71d..96546a73 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/print/PrinterHandler.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/print/PrinterHandler.java @@ -125,6 +125,7 @@ public abstract class PrinterHandler { private String outNumber; private String discountAmount; private String discountRadio; + private String orderNum; // 是否退款单 private boolean isReturn; diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/print/YxyPrinter.java b/cash-service/order-service/src/main/java/com/czg/service/order/print/YxyPrinter.java index ae780d57..d4951281 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/print/YxyPrinter.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/print/YxyPrinter.java @@ -11,6 +11,7 @@ import com.czg.account.entity.ShopInfo; import com.czg.account.service.ShopInfoService; import com.czg.order.entity.OrderDetail; import com.czg.order.entity.OrderInfo; +import com.czg.service.order.enums.OrderStatusEnums; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -156,13 +157,16 @@ public class YxyPrinter extends PrinterHandler implements PrinterImpl { @Override protected void normalOrderPrint(OrderInfo orderInfo, boolean isPre, PrintMachine machine, String balance, List detailList) { ShopInfo shopInfo = shopInfoService.getById(orderInfo.getShopId()); + long count = orderInfoService.queryChain() + .eq(OrderInfo::getTradeDay, orderInfo.getTradeDay()) + .eq(OrderInfo::getStatus, OrderStatusEnums.DONE.getCode()).count(); PrintInfoDTO printInfoDTO = new PrintInfoDTO().setShopName(shopInfo.getShopName()).setPrintType("普通打印").setPickupNum(getPickupNum(orderInfo)) .setOrderNo(orderInfo.getOrderNo()).setTradeDate(DateUtil.format(orderInfo.getCreateTime(), "yyyy-MM-dd HH:mm:ss")).setOperator("【POS-1】001").setPayAmount(orderInfo.getPayAmount().toPlainString()) .setOriginalAmount(orderInfo.getOriginAmount().toPlainString()).setReturn(isReturn(orderInfo)) .setBalance(balance).setPayType((ObjectUtil.isEmpty(orderInfo.getPayType()) || ObjectUtil.isNull(orderInfo.getPayType()) ? "" : orderInfo.getPayType())).setIntegral("0") .setOutNumber(orderInfo.getTakeCode()).setPrintTitle(isPre ? "预结算单" : "结算单") .setRemark(orderInfo.getRemark()).setDiscountAmount(orderInfo.getOriginAmount().subtract(orderInfo.getPayAmount()).toPlainString()); - + printInfoDTO.setPrintTitle(printInfoDTO.getPrintTitle()+" #"+count); String data = buildOrderPrintData(printInfoDTO, detailList); String voiceJson = "{\"PbizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; // String voiceJson = "{\"bizType\":\"2\",\"content\":\"\"}"; @@ -178,7 +182,7 @@ public class YxyPrinter extends PrinterHandler implements PrinterImpl { @Override protected void callNumPrint(PrintMachine machine, String callNum, String shopName, String tableName, String tableNote, String preNum, String codeUrl, LocalDateTime takeTime, String shopNote) { - String resp = buildCallTicketData(shopName, tableName, callNum, preNum, codeUrl,shopNote, takeTime); + String resp = buildCallTicketData(shopName, tableName, callNum, preNum, codeUrl, shopNote, takeTime); sendPrintRequest(machine.getAddress(), resp, null, "1"); } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java index 132b9e89..6f14a05e 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java @@ -120,6 +120,7 @@ public class OrderInfoServiceImpl extends ServiceImpl getOrderByIdPrint(Long orderId) { HistoryOrderPrintVo historyOrderVo = getOneAs(new QueryWrapper() .eq(OrderInfo::getId, orderId), HistoryOrderPrintVo.class); + AssertUtil.isNull(historyOrderVo, "订单不存在"); List orderDetails = orderDetailService.getOrderDetailPrint(orderId); Map> resultMap = new HashMap<>(); // 遍历订单详情列表 @@ -159,6 +161,10 @@ public class OrderInfoServiceImpl extends ServiceImpl new ArrayList<>()).add(orderDetail); } historyOrderVo.setDetailMap(resultMap); + long count = queryChain() + .eq(OrderInfo::getTradeDay, historyOrderVo.getTradeDay()) + .eq(OrderInfo::getStatus,OrderStatusEnums.DONE.getCode()).count(); + historyOrderVo.setOrderNum(count); return CzgResult.success(historyOrderVo); } @@ -840,7 +846,7 @@ public class OrderInfoServiceImpl extends ServiceImpl= 0) { orderInfo.setOrderAmount(param.getOrderAmount()); - }else { + } else { orderInfo.setOrderAmount(BigDecimal.ZERO); } orderInfo.setPackFee(orderInfo.getPackFee().add(param.getPackFee())); @@ -985,4 +991,85 @@ public class OrderInfoServiceImpl extends ServiceImpl list = orderDetailService.queryChain().eq(OrderDetail::getOrderId, orderId).eq(OrderDetail::getShopId, shopId).list(); + if (CollUtil.isEmpty(list)) { + updateChain() + .set(OrderInfo::getStatus, OrderStatusEnums.CANCELLED.getCode()) + .set(OrderInfo::getOriginAmount, BigDecimal.ZERO) + .eq(OrderInfo::getShopId, shopId) + .eq(OrderInfo::getId, orderId); + return true; + } else { + BigDecimal totalAmount = BigDecimal.ZERO; + for (OrderDetail orderDetail : list) { + BigDecimal subtract = orderDetail.getNum().subtract(orderDetail.getReturnNum()); + if (subtract.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal unitPrice; + if (orderDetail.getDiscountSaleAmount().compareTo(BigDecimal.ZERO) > 0) { + unitPrice = orderDetail.getDiscountSaleAmount(); + } else { + unitPrice = orderDetail.getPrice(); + } + totalAmount = totalAmount.add((orderDetail.getNum().subtract(orderDetail.getReturnNum()))) + .multiply(unitPrice); + } + if (subtract.compareTo(BigDecimal.ZERO) > 0 + && orderDetail.getPackAmount().compareTo(BigDecimal.ZERO) > 0 + && orderDetail.getPackNumber().compareTo(BigDecimal.ZERO) > 0) { + totalAmount = totalAmount.add(orderDetail.getPackAmount().multiply(orderDetail.getPackNumber())); + } + if (orderDetail.getPlaceNum() > placeNum) { + orderDetailService.updateChain() + .eq(OrderDetail::getId, orderDetail.getId()) + .set(OrderDetail::getPlaceNum, orderDetail.getPlaceNum() - 1) + .update(); + } + } + updateChain().eq(OrderInfo::getId, orderId) + .eq(OrderInfo::getShopId, shopId) + .set(OrderInfo::getOriginAmount, totalAmount) + .set(OrderInfo::getPlaceNum, orderInfo.getPlaceNum() - 1) + .update(); + } + throw new ApiNotPrintException("操作失败"); + } }