From d84285761bfd2ddb83563ad0f3bc8ec19dd25ac0 Mon Sep 17 00:00:00 2001 From: chuzhichao Date: Sun, 25 Jun 2023 16:24:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E5=8D=95=E5=89=8D=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E3=80=81=E8=AE=A1=E7=AE=97=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/H5MemberAddressController.java | 5 +- ...Controller.java => H5OrderController.java} | 15 ++++- .../com/cyl/h5/pojo/dto/OrderCreateDTO.java | 36 +++++++++++ .../cyl/h5/pojo/dto/OrderProductListDTO.java | 42 ++++++++++++ .../java/com/cyl/h5/pojo/vo/OrderCalcVO.java | 20 ++++++ .../java/com/cyl/h5/pojo/vo/SkuViewDTO.java | 30 +++++++++ .../com/cyl/oms/service/OrderService.java | 64 +++++++++++++++++++ 7 files changed, 207 insertions(+), 5 deletions(-) rename ruoyi-mall/src/main/java/com/cyl/h5/controller/{Order1Controller.java => H5OrderController.java} (70%) create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderCreateDTO.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderProductListDTO.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/OrderCalcVO.java create mode 100644 ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java index 542001b..0d35fa5 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberAddressController.java @@ -4,6 +4,7 @@ import com.cyl.h5.service.H5MemberAddressService; import com.cyl.ums.domain.MemberAddress; import com.ruoyi.common.core.domain.AjaxResult; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController @@ -19,8 +20,8 @@ public class H5MemberAddressController { } @GetMapping("/default") - public AjaxResult getDefault(){ - return AjaxResult.success(h5MemberAddressService.getDefault()); + public ResponseEntity getDefault(){ + return ResponseEntity.ok(h5MemberAddressService.getDefault()); } @PostMapping("/create") diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/Order1Controller.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java similarity index 70% rename from ruoyi-mall/src/main/java/com/cyl/h5/controller/Order1Controller.java rename to ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java index 1a2ee60..40fe10a 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/Order1Controller.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java @@ -1,9 +1,12 @@ package com.cyl.h5.controller; +import com.cyl.h5.pojo.dto.OrderCreateDTO; +import com.cyl.h5.pojo.vo.OrderCalcVO; import com.cyl.h5.pojo.vo.form.OrderSubmitForm; import com.cyl.h5.pojo.vo.query.OrderH5Query; import com.cyl.oms.pojo.vo.OrderVO; import com.cyl.oms.service.OrderService; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -16,11 +19,11 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController -@RequestMapping("/h5-order") -public class Order1Controller { +@RequestMapping("/h5/order") +public class H5OrderController { @Autowired private OrderService orderService; - @PostMapping("submit") + @PostMapping("/add") public ResponseEntity submit(@RequestBody OrderSubmitForm form) { return ResponseEntity.ok(orderService.submit(form)); } @@ -28,4 +31,10 @@ public class Order1Controller { public ResponseEntity> queryOrderPage(@RequestBody OrderH5Query query, Pageable pageReq) { return ResponseEntity.ok(orderService.queryOrderPage(query, pageReq)); } + + @ApiOperation("下单前校验") + @PostMapping("/addOrderCheck") + public ResponseEntity addOrderCheck(@RequestBody OrderCreateDTO orderCreateDTO){ + return ResponseEntity.ok(orderService.addOrderCheck(orderCreateDTO)); + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderCreateDTO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderCreateDTO.java new file mode 100644 index 0000000..5b217ce --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderCreateDTO.java @@ -0,0 +1,36 @@ + package com.cyl.h5.pojo.dto; + + import io.swagger.annotations.ApiModel; + import io.swagger.annotations.ApiModelProperty; + import lombok.Data; + + import java.util.List; + + + /** + * 创建订单请求VO + * @author Jinxin + * + */ + @Data + @ApiModel(value = "创建订单请求VO") + public class OrderCreateDTO { + @ApiModelProperty(value = "商品购买明细",required = true) + private List skuList; + + @ApiModelProperty(value = "收货地址id") + private Long receiveAddressId; + + @ApiModelProperty(value = "收货方式 1:快递 2:自提 代理商只有1", required = false) + private Integer deliveryType = 1; + + @ApiModelProperty(value = "支付方式:1-支付宝,2-微信(默认)", required = false, allowableValues = "1,2") +// @NotNull(message = "支付方式不能为空") + private Integer payType; + + @ApiModelProperty(value = "订单备注") + private String note; + + @ApiModelProperty(value = "订单来源 购物车是 cart") + private String from; + } \ No newline at end of file diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderProductListDTO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderProductListDTO.java new file mode 100644 index 0000000..ee0d9d3 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/dto/OrderProductListDTO.java @@ -0,0 +1,42 @@ + package com.cyl.h5.pojo.dto; + + import com.cyl.pms.domain.Product; + import com.cyl.pms.domain.Sku; + import io.swagger.annotations.ApiModel; + import io.swagger.annotations.ApiModelProperty; + import lombok.Data; + + import javax.validation.constraints.Min; + import javax.validation.constraints.NotNull; + import java.math.BigDecimal; + + + /** + * 创建订单请求VO + * @author Jinxin + * + */ + @Data + @ApiModel(value = "创建订单请求VO") + public class OrderProductListDTO { + @ApiModelProperty(value = "商品skuId", required = true) + @NotNull(message = "商品skuId不能为空") + private Long skuId; + + @ApiModelProperty(value = "数量", required = true) + @NotNull(message = "数量不能为空") + @Min(value = 1, message = "数量不能小于1") + private Integer quantity; + + @ApiModelProperty(value = "消费金", hidden = true) + private BigDecimal consumption; + + @ApiModelProperty(value = "运费", hidden = true) + private BigDecimal freightAmount; + + @ApiModelProperty(value = "隐藏 业务过程中的数据", hidden = true) + private Sku sku; + + @ApiModelProperty(value = "隐藏 业务过程中的数据", hidden = true) + private Product product; + } \ No newline at end of file diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/OrderCalcVO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/OrderCalcVO.java new file mode 100644 index 0000000..a656ea2 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/OrderCalcVO.java @@ -0,0 +1,20 @@ +package com.cyl.h5.pojo.vo; + +import com.cyl.pms.pojo.vo.SkuVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel("下单前校验返回数据") +public class OrderCalcVO { + @ApiModelProperty("sku数据") + private List skuList; + @ApiModelProperty("商品总金额") + private BigDecimal productTotalAmount; + @ApiModelProperty("订单总金额") + private BigDecimal orderTotalAmount; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java new file mode 100644 index 0000000..95eff74 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java @@ -0,0 +1,30 @@ +package com.cyl.h5.pojo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + + +/** + * sku渲染详情 + * + * @author Jinxin + */ +@Data +@ApiModel(value = "sku渲染详情") +public class SkuViewDTO { + private Long productId; + private Long skuId; + @ApiModelProperty(value = "商品名称") + private String productName; + @ApiModelProperty(value = "销售属性") + private String spData; + @ApiModelProperty(value = "购买数量") + private Integer quantity; + @ApiModelProperty(value = "主图") + private String pic; + @ApiModelProperty(value = "售价") + private BigDecimal price; +} \ No newline at end of file diff --git a/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java b/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java index c6c2be2..d483fab 100644 --- a/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java +++ b/ruoyi-mall/src/main/java/com/cyl/oms/service/OrderService.java @@ -7,28 +7,38 @@ import java.time.LocalDateTime; import java.util.stream.Collectors; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cyl.h5.pojo.dto.OrderCreateDTO; +import com.cyl.h5.pojo.dto.OrderProductListDTO; +import com.cyl.h5.pojo.vo.OrderCalcVO; +import com.cyl.h5.pojo.vo.SkuViewDTO; import com.cyl.h5.pojo.vo.form.OrderSubmitForm; import com.cyl.h5.pojo.vo.query.OrderH5Query; import com.cyl.oms.convert.OrderConvert; import com.cyl.oms.domain.OrderItem; import com.cyl.oms.mapper.OrderItemMapper; import com.cyl.oms.pojo.vo.OrderVO; +import com.cyl.pms.convert.SkuConvert; import com.cyl.pms.domain.Product; import com.cyl.pms.domain.Sku; import com.cyl.pms.mapper.ProductMapper; import com.cyl.pms.mapper.SkuMapper; +import com.cyl.pms.pojo.vo.SkuVO; +import com.cyl.ums.domain.Member; import com.cyl.ums.domain.MemberAddress; import com.cyl.ums.mapper.MemberAddressMapper; import com.github.pagehelper.PageHelper; +import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.framework.config.LocalDataUtil; import com.ruoyi.system.mapper.SysUserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -40,6 +50,8 @@ import com.cyl.oms.mapper.OrderMapper; import com.cyl.oms.domain.Order; import com.cyl.oms.pojo.query.OrderQuery; +import javax.validation.constraints.NotNull; + /** * 订单表Service业务层处理 * @@ -60,6 +72,8 @@ public class OrderService { private SkuMapper skuMapper; @Autowired private ProductMapper productMapper; + @Autowired + private SkuConvert skuConvert; /** * 查询订单表 @@ -341,4 +355,54 @@ public class OrderService { }); return new PageImpl<>(res, pageReq, total); } + + public OrderCalcVO addOrderCheck(OrderCreateDTO orderCreateDTO) { + OrderCalcVO res = new OrderCalcVO(); + List skuList = new ArrayList<>(); + List list = orderCreateDTO.getSkuList(); + if (CollectionUtil.isEmpty(list)){ + throw new RuntimeException("商品SKU信息不能为空"); + } + //将购买的sku信息转化为key:skuId value:数量 + Map quantityMap = list.stream(). + collect(Collectors.toMap(OrderProductListDTO::getSkuId, OrderProductListDTO::getQuantity, (v1, v2) -> v2)); + //查询所有sku信息 + Set collect = list.stream().map(OrderProductListDTO::getSkuId).collect(Collectors.toSet()); + Map querySkuMap = skuMapper.selectBatchIds(collect).stream().collect(Collectors.toMap(Sku::getId, it -> it)); + //计算商品总金额、订单总金额 + BigDecimal productTotalAmount = BigDecimal.ZERO; + BigDecimal orderTotalAmount = BigDecimal.ZERO; + for (OrderProductListDTO dto : list){ + if (!querySkuMap.containsKey(dto.getSkuId())){ + throw new RuntimeException("商品SKU不存在"); + } + Sku sku = querySkuMap.get(dto.getSkuId()); + //查product + Product product = productMapper.selectById(sku.getProductId()); + if (product == null){ + throw new RuntimeException("商品不存在"); + } + if (Constants.PublishStatus.UNDERCARRIAGE.equals(product.getPublishStatus())){ + throw new RuntimeException("商品" + product.getName() + "已下架"); + } + BigDecimal addAmount = sku.getPrice().multiply(BigDecimal.valueOf(dto.getQuantity())); + //由于目前没有运费等数据,暂时订单总金额=商品总金额了 + productTotalAmount = productTotalAmount.add(addAmount); + orderTotalAmount = orderTotalAmount.add(addAmount); + //封装sku信息 + SkuViewDTO skuViewDTO = new SkuViewDTO(); + skuViewDTO.setPic(product.getPic()); + skuViewDTO.setPrice(sku.getPrice()); + skuViewDTO.setProductId(product.getId()); + skuViewDTO.setProductName(product.getName()); + skuViewDTO.setQuantity(quantityMap.get(sku.getId())); + skuViewDTO.setSkuId(sku.getId()); + skuViewDTO.setSpData(sku.getSpData()); + skuList.add(skuViewDTO); + } + res.setSkuList(skuList); + res.setOrderTotalAmount(orderTotalAmount); + res.setProductTotalAmount(productTotalAmount); + return res; + } }