取消订单

订单打印 单数
This commit is contained in:
wangw 2025-03-31 11:47:02 +08:00
parent fa36cd135f
commit 7ca93edc5a
9 changed files with 161 additions and 3 deletions

View File

@ -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<Boolean> printOrder(@Validated @RequestBody OrderInfoPrintDTO orderInfoPrintDTO) {
return CzgResult.success(orderInfoService.printOrder(StpKit.USER.getShopId(), orderInfoPrintDTO));
}
@PostMapping("/cancelOrder")
public CzgResult<Void> cancelOrder(@Validated @RequestBody OrderCannelDTO param) {
orderInfoService.cancelledOrder(param.getShopId(), param.getOrderId());
return CzgResult.success();
}
@PostMapping("/rmPlaceOrder")
public CzgResult<Void> cancelledPlaceOrder(@Validated @RequestBody OrderCannelDTO param) {
AssertUtil.isNull(param.getPlaceNum(), "{}不能为空", "取消单次");
orderInfoService.cancelledPlaceOrder(param.getShopId(), param.getOrderId(), param.getPlaceNum());
return CzgResult.success();
}
}

View File

@ -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<Void> 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<Void> cancelOrder(@Validated @RequestBody OrderCannelDTO param) {
orderInfoService.cancelledOrder(param.getShopId(), param.getOrderId());
return CzgResult.success();
}
@PostMapping("/rmPlaceOrder")
@Debounce(value = "#param.orderId")
public CzgResult<Void> cancelledPlaceOrder(@Validated @RequestBody OrderCannelDTO param) {
AssertUtil.isNull(param.getPlaceNum(), "{}不能为空", "取消单次");
orderInfoService.cancelledPlaceOrder(param.getShopId(), param.getOrderId(), param.getPlaceNum());
return CzgResult.success();
}
}

View File

@ -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;
}

View File

@ -60,4 +60,8 @@ public interface OrderInfoService extends IService<OrderInfo> {
Boolean removeOrderDetail(Long shopId, Long orderId, Long detailId);
Boolean cancelledOrder(Long shopId, Long orderId);
Boolean cancelledPlaceOrder(Long shopId, Long orderId, Integer placeNum);
}

View File

@ -15,4 +15,5 @@ import java.util.Map;
@Data
public class HistoryOrderPrintVo extends OrderInfo {
private Map<String, List<OrderDetailPrintVo>> detailMap;
private long orderNum;
}

View File

@ -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<OrderDetail> 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);

View File

@ -125,6 +125,7 @@ public abstract class PrinterHandler {
private String outNumber;
private String discountAmount;
private String discountRadio;
private String orderNum;
// 是否退款单
private boolean isReturn;

View File

@ -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<OrderDetail> 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");
}

View File

@ -120,6 +120,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
.eq(OrderInfo::getUserId, param.getUserId())
.eq(OrderInfo::getTableCode, CzgStrUtils.getStrOrNull(param.getTableCode()))
.eq(OrderInfo::getOrderNo, CzgStrUtils.getStrOrNull(param.getOrderNo()))
.eq(OrderInfo::getIsDel, param.getIsDel())
.gt(OrderInfo::getCreateTime, CzgStrUtils.getStrOrNull(param.getStartTime()))
.le(OrderInfo::getCreateTime, CzgStrUtils.getStrOrNull(param.getEndTime()))
.in(OrderInfo::getId, like)
@ -145,6 +146,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
public CzgResult<HistoryOrderPrintVo> getOrderByIdPrint(Long orderId) {
HistoryOrderPrintVo historyOrderVo = getOneAs(new QueryWrapper()
.eq(OrderInfo::getId, orderId), HistoryOrderPrintVo.class);
AssertUtil.isNull(historyOrderVo, "订单不存在");
List<OrderDetailPrintVo> orderDetails = orderDetailService.getOrderDetailPrint(orderId);
Map<String, List<OrderDetailPrintVo>> resultMap = new HashMap<>();
// 遍历订单详情列表
@ -159,6 +161,10 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
resultMap.computeIfAbsent(placeNum.toString(), k -> 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<OrderInfoMapper, OrderInfo
orderInfo.setOriginAmount(param.getOriginAmount());
if (param.getOrderAmount() != null && param.getOrderAmount().compareTo(BigDecimal.ZERO) >= 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<OrderInfoMapper, OrderInfo
}
throw new ApiNotPrintException("操作失败");
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean cancelledOrder(Long shopId, Long orderId) {
OrderInfo orderInfo = getById(orderId);
if (orderInfo == null) {
throw new ApiNotPrintException("订单不存在");
}
if (!OrderStatusEnums.UNPAID.getCode().equals(orderInfo.getStatus())) {
throw new ApiNotPrintException("订单不可取消");
}
updateChain()
.set(OrderInfo::getStatus, OrderStatusEnums.CANCELLED.getCode())
.eq(OrderInfo::getShopId, shopId)
.eq(OrderInfo::getId, orderId)
.update();
redisService.del(RedisCst.classKeyExpired.EXPIRED_ORDER + orderInfo.getId());
throw new ApiNotPrintException("操作失败");
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean cancelledPlaceOrder(Long shopId, Long orderId, Integer placeNum) {
OrderInfo orderInfo = getById(orderId);
if (orderInfo == null) {
throw new ApiNotPrintException("订单不存在");
}
if (!OrderStatusEnums.UNPAID.getCode().equals(orderInfo.getStatus())) {
throw new ApiNotPrintException("订单不可取消");
}
if (orderInfo.getPlaceNum().equals(1)) {
updateChain()
.set(OrderInfo::getStatus, OrderStatusEnums.CANCELLED.getCode())
.eq(OrderInfo::getShopId, shopId)
.eq(OrderInfo::getId, orderId);
return true;
}
orderDetailService.remove(new QueryWrapper().eq(OrderDetail::getOrderId, orderId).eq(OrderDetail::getPlaceNum, placeNum));
List<OrderDetail> 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("操作失败");
}
}