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