diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCreateCardComputeVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCreateCardComputeVo.java
new file mode 100644
index 000000000..1e2b1f02b
--- /dev/null
+++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCreateCardComputeVo.java
@@ -0,0 +1,35 @@
+package com.bsd.pjcloud.hard.api.vo.order;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 一次商品查询同时完成购物车落库、总价计算和商品描述的结果。
+ *
+ * 用于收银下单路径合并原本 computerCarTotalPrice/createCard/computerCarSubject
+ * 三次重复的商品远程查询。
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class HardCreateCardComputeVo {
+
+ /**
+ * 新建的父购物车 id
+ */
+ private Long parentCarId;
+
+ /**
+ * 按商品快照计算出的总价(分)
+ */
+ private Integer totalPrice;
+
+ /**
+ * 商品描述,如 "苹果x2;香蕉x0.5/kg;"
+ */
+ private String subject;
+
+}
diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java
index 42e8e6dfc..5255951d8 100644
--- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java
+++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java
@@ -10,6 +10,7 @@ import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto;
import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity;
import com.bsd.pjcloud.hard.api.vo.order.HardCarVo;
+import com.bsd.pjcloud.hard.api.vo.order.HardCreateCardComputeVo;
import com.bsd.pjcloud.thirdparty.dto.pay.PayDto;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
@@ -40,6 +41,14 @@ public interface HardCarService extends IService {
*/
Long createCard(Long userId, Long merchantId, HardTypeEnum sysType, HardOrderTypeEnum orderTYpe, List list);
+ /**
+ * 一次商品查询同时完成购物车落库、总价计算和商品描述拼装。
+ *
+ * 仅覆盖收银下单路径(食堂线上/线下、超市线下);其他业态组合返回 null,
+ * 调用方需回落到 computerCarTotalPrice + createCard + computerCarSubject 三段式调用。
+ */
+ HardCreateCardComputeVo createCardWithCompute(Long userId, Long merchantId, HardTypeEnum sysType, HardOrderTypeEnum orderType, List list);
+
/**
* 创建第三方支付购物车
*/
diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java
index fec153c34..112818622 100644
--- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java
+++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java
@@ -24,6 +24,7 @@ import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity;
import com.bsd.pjcloud.hard.api.vo.order.HardCarVo;
+import com.bsd.pjcloud.hard.api.vo.order.HardCreateCardComputeVo;
import com.bsd.pjcloud.hard.mapper.order.HardCarMapper;
import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
import com.bsd.pjcloud.hard.mapper.order.HardParentCarMapper;
@@ -288,6 +289,92 @@ public class HardCarServiceImpl extends ServiceImpl list) {
+ List productIds = list.stream().map(HardCreateCarDto::getProductId).toList();
+ List carObjectList = new ArrayList<>();
+ StringBuffer subject = new StringBuffer();
+ AtomicInteger totalPrice = new AtomicInteger();
+ // 食堂
+ if (ObjectUtil.equals(sysType, HardTypeEnum.CANTEEN)) {
+ // 线上
+ if (ObjectUtil.equals(HardOrderTypeEnum.RESERVE, orderType)) {
+ List supList = onlineCanteenSpuService.getSpuListByIds(productIds).getData();
+ for (HardCreateCarDto v : list) {
+ supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> {
+ int itemTotalPrice = v.getProductCount() * spu.getPrice();
+ totalPrice.addAndGet(itemTotalPrice);
+ subject.append(spu.getName()).append("x").append(v.getProductCount()).append(";");
+ carObjectList.add(HardCarEntity.builder().parentCarId(null).productId(spu.getId()).productName(spu.getName())
+ .productPrice(spu.getPrice()).productPic(spu.getPicUrl()).totalPrice((long) itemTotalPrice)
+ .productNature(ObjectUtil.isNotEmpty(v.getProductNature()) ? v.getProductNature().getType() : null)
+ .productCount(v.getProductCount()).productWeight(new BigDecimal(0))
+ .isDiscountsProduct(buildIsPriceIncreased(v)).build());
+ });
+ }
+ }
+ // 线下
+ else if (ObjectUtil.equals(HardOrderTypeEnum.BELOW, orderType)) {
+ List supList = canteenSpuService.getSpuListByIds(productIds).getData();
+ for (HardCreateCarDto v : list) {
+ supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> {
+ int itemTotalPrice = v.getProductCount() * spu.getPrice();
+ totalPrice.addAndGet(itemTotalPrice);
+ subject.append(spu.getName()).append("x").append(v.getProductCount()).append(";");
+ carObjectList.add(HardCarEntity.builder().parentCarId(null).productId(spu.getId()).productName(spu.getName())
+ .productPrice(spu.getPrice()).productPic(spu.getPicUrl()).totalPrice((long) itemTotalPrice)
+ .productNature(ObjectUtil.isNotEmpty(v.getProductNature()) ? v.getProductNature().getType() : null)
+ .productCount(v.getProductCount()).productWeight(new BigDecimal(0))
+ .isDiscountsProduct(buildIsPriceIncreased(v)).build());
+ });
+ }
+ } else {
+ return null;
+ }
+ }
+ // 超市
+ else if (ObjectUtil.equals(sysType, HardTypeEnum.SUPERMARKET) && ObjectUtil.equals(HardOrderTypeEnum.BELOW, orderType)) {
+ List supList = supermarketUnitSkuService.getSupermarketUnits(productIds).getData();
+ for (HardCreateCarDto v : list) {
+ supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> {
+ Integer price = getSupermarket(spu);
+ int itemTotalPrice = 0;
+ if (ObjectUtil.isNotEmpty(v.getProductCount()) && !ObjectUtil.equals(v.getProductCount(), 0)) {
+ // 按数量
+ itemTotalPrice = v.getProductCount() * price;
+ } else if (ObjectUtil.isNotEmpty(v.getProductWeight()) && v.getProductWeight().compareTo(BigDecimal.valueOf(0)) != 0) {
+ // 按重量,向上取整
+ itemTotalPrice = v.getProductWeight().multiply(BigDecimal.valueOf(price)).setScale(0, RoundingMode.CEILING).intValue();
+ }
+ totalPrice.addAndGet(itemTotalPrice);
+ subject.append(spu.getProductName()).append("x").append(v.getProductCount()).append(";");
+ carObjectList.add(HardCarEntity.builder().parentCarId(null).productId(spu.getId()).productName(spu.getProductName())
+ .productPrice(price).productPic(spu.getPicUrl()).totalPrice((long) itemTotalPrice)
+ .productNature(ObjectUtil.isNotEmpty(v.getProductNature()) ? v.getProductNature().getType() : null)
+ .productCount(v.getProductCount()).productWeight(v.getProductWeight())
+ .isDiscountsProduct(buildIsPriceIncreased(v)).build());
+ });
+ }
+ } else {
+ return null;
+ }
+ // 创建父订单,状态与 createCard 保持一致
+ HardParentCarEntity parentCarObj = HardParentCarEntity.builder().userId(userId).merchantId(merchantId).hardType(sysType.getType()).orderStatus(HardOrderStatusEnum.PAY.getType()).build();
+ hardParentCarMapper.insert(parentCarObj);
+ carObjectList.forEach(item -> item.setParentCarId(parentCarObj.getId()));
+ baseMapper.insert(carObjectList);
+ return HardCreateCardComputeVo.builder().parentCarId(parentCarObj.getId()).totalPrice(totalPrice.get()).subject(subject.toString()).build();
+ }
+
+ private String buildIsPriceIncreased(HardCreateCarDto v) {
+ return ObjectUtil.isNotEmpty(v.getIsPriceIncreased()) && v.getIsPriceIncreased() ? YesNoEnum.YES.getCode() : YesNoEnum.NO.getCode();
+ }
+
/**
* 创建第三方支付购物车
*/
diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java
index 0963988da..7d9737b13 100644
--- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java
+++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java
@@ -62,6 +62,7 @@ import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity;
import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo;
import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo;
import com.bsd.pjcloud.hard.api.vo.order.HardCarVo;
+import com.bsd.pjcloud.hard.api.vo.order.HardCreateCardComputeVo;
import com.bsd.pjcloud.hard.api.vo.order.HardCreateHardQrCodeScanOrderVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
import com.bsd.pjcloud.hard.api.vo.spu.HardSpuJoinVo;
@@ -319,7 +320,21 @@ public class HardOrderServiceImpl extends ServiceImpl