From 595cf086067e3dae05f7896b7772d8b689cc6ea4 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Wed, 22 Sep 2021 11:50:23 +0800 Subject: [PATCH] add addOrder and fix --- src/main/resources/mapper/modules/MallGoodsMapper.xml | 2 src/main/java/cc/mrbird/febs/mall/dto/AddOrderItemDto.java | 24 ++++ src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java | 18 ++- src/main/java/cc/mrbird/febs/common/enumerates/OrderStatusEnum.java | 46 +++++++ src/main/java/cc/mrbird/febs/common/utils/MallUtils.java | 30 +++++ src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java | 3 src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java | 16 ++ src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java | 3 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 83 +++++++++++++ sql/xc_mall.sql | 62 ++++++++++ src/main/resources/mapper/modules/MallGoodsSkuMapper.xml | 10 + src/main/java/cc/mrbird/febs/mall/entity/MallGoodsSku.java | 7 + 12 files changed, 290 insertions(+), 14 deletions(-) diff --git a/sql/xc_mall.sql b/sql/xc_mall.sql index 1b723cd..51a5b35 100644 --- a/sql/xc_mall.sql +++ b/sql/xc_mall.sql @@ -144,3 +144,65 @@ is_default INT COMMENT '是否默认;1-是2-否' , PRIMARY KEY (ID) ) COMMENT = '用户地址'; + +DROP TABLE IF EXISTS mall_order_info; +CREATE TABLE mall_order_info( + REVISION INT COMMENT '乐观锁' , + CREATED_BY VARCHAR(32) COMMENT '创建人' , + CREATED_TIME DATETIME COMMENT '创建时间' , + UPDATED_BY VARCHAR(32) COMMENT '更新人' , + UPDATED_TIME DATETIME COMMENT '更新时间' , + ID BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键' , + order_no VARCHAR(32) COMMENT '订单号' , + member_id BIGINT COMMENT '用户ID' , + order_time DATETIME COMMENT '下单时间' , + pay_time DATETIME COMMENT '支付时间' , + amount DECIMAL(20,2) COMMENT '订单金额' , + pay_method VARCHAR(32) COMMENT '支付方式' , + status INT COMMENT '状态;1-待支付2-待发货3-待收货4-已完成5-退款中6-已退款7-已取消' , + cancel_type INT COMMENT '取消类型;1-超时未支付2-主动取消' , + name VARCHAR(32) COMMENT '联系人' , + phone VARCHAR(32) COMMENT '联系方式' , + address TEXT COMMENT '收货地址' , + longitude VARCHAR(255) COMMENT '经度' , + latitude VARCHAR(255) COMMENT '纬度' , + remark TEXT COMMENT '备注' , + PRIMARY KEY (ID) +) COMMENT = '订单表'; + +DROP TABLE IF EXISTS mall_order_item; +CREATE TABLE mall_order_item( + REVISION INT COMMENT '乐观锁' , + CREATED_BY VARCHAR(32) COMMENT '创建人' , + CREATED_TIME DATETIME COMMENT '创建时间' , + UPDATED_BY VARCHAR(32) COMMENT '更新人' , + UPDATED_TIME DATETIME COMMENT '更新时间' , + ID BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键' , + order_id BIGINT COMMENT '订单ID' , + sku_id BIGINT COMMENT 'skuID' , + goods_id BIGINT COMMENT '商品ID' , + goods_name VARCHAR(255) COMMENT '商品名称' , + style_name VARCHAR(255) COMMENT '样式名称' , + sku_name VARCHAR(255) COMMENT 'sku名称' , + cnt INT COMMENT '数量' , + price DECIMAL(20,2) COMMENT '单价' , + amount DECIMAL(20,2) COMMENT '金额' , + PRIMARY KEY (ID) +) COMMENT = '订单明细表'; + +DROP TABLE IF EXISTS mall_money_flow; +CREATE TABLE mall_money_flow( + REVISION INT COMMENT '乐观锁' , + CREATED_BY VARCHAR(32) COMMENT '创建人' , + CREATED_TIME DATETIME COMMENT '创建时间' , + UPDATED_BY VARCHAR(32) COMMENT '更新人' , + UPDATED_TIME DATETIME COMMENT '更新时间' , + ID BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键' , + member_id BIGINT COMMENT '用户ID' , + amount DECIMAL(20,2) COMMENT '金额' , + type INT COMMENT '流水类型;1-分红收入2-业绩奖励3-订单支付4-退款' , + order_no VARCHAR(32) COMMENT '订单号' , + description TEXT COMMENT '描述' , + remark TEXT COMMENT '备注' , + PRIMARY KEY (ID) +) COMMENT = '资金流水'; diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/OrderStatusEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/OrderStatusEnum.java new file mode 100644 index 0000000..a03318e --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/enumerates/OrderStatusEnum.java @@ -0,0 +1,46 @@ +package cc.mrbird.febs.common.enumerates; + +import lombok.Getter; + +@Getter +public enum OrderStatusEnum { + + /** + * 待支付 + */ + WAIT_PAY(1), + /** + * 待发货 + */ + WAIT_SHIPPING(2), + /** + * 待收货 + */ + WAIT_FINISH(3), + /** + * 完成 + */ + FINISH(4), + /** + * 退款中 + */ + REFUNDING(5), + /** + * 已退款 + */ + REFUNDED(6), + /** + * 取消 + */ + CANCEL(7), + /** + * 不退款 + */ + UNREFUND(8); + + private final int value; + + OrderStatusEnum(int value) { + this.value = value; + } +} diff --git a/src/main/java/cc/mrbird/febs/common/utils/MallUtils.java b/src/main/java/cc/mrbird/febs/common/utils/MallUtils.java new file mode 100644 index 0000000..fb61d3f --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/utils/MallUtils.java @@ -0,0 +1,30 @@ +package cc.mrbird.febs.common.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +/** + * @author wzy + * @date 2021-09-22 + **/ +public class MallUtils { + + public static String getRandomNum(int length) { + String str = "0123456789"; + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < length; ++i) { + int number = random.nextInt(str.length()); + sb.append(str.charAt(number)); + } + + return sb.toString(); + } + + public static String getOrderNum() { + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + String dd=df.format(new Date()); + return dd+getRandomNum(5); + } +} diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java index 72f57c1..cd8fb00 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java @@ -8,10 +8,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -29,9 +26,18 @@ private final IApiMallOrderInfoService mallOrderInfoService; - @ApiOperation(value = "addOrder", notes = "提交订单") + @ApiOperation(value = "提交订单", notes = "提交订单") @PostMapping(value = "/addOrder") - public FebsResponse addOrder(@RequestBody List<AddOrderDto> list) { + public FebsResponse addOrder(@RequestBody AddOrderDto addOrderDto) { + String orderNo = mallOrderInfoService.createOrder(addOrderDto); + + // TODO 创建支付订单 + return new FebsResponse().success().message("创建订单成功"); + } + + @ApiOperation(value = "取消订单", notes = "取消订单") + @PostMapping(value = "/cancelOrder/{id}") + public FebsResponse cancelOrder(@PathVariable("id") Long id) { return null; } } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java index 2d78d52..6cb01fc 100644 --- a/src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java +++ b/src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java @@ -4,6 +4,9 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotNull; +import java.util.List; + /** * @author wzy * @date 2021-09-18 @@ -12,9 +15,14 @@ @ApiModel(value = "AddOrderDto", description = "新增订单接口参数接收类") public class AddOrderDto { - @ApiModelProperty(value = "skuID", example = "1") - private Long skuId; + @NotNull(message = "参数不能为空") + @ApiModelProperty(value = "地址ID", example = "1") + private Long addressId; - @ApiModelProperty(value = "数量", example = "2") - private Integer cnt; + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "商品明细") + private List<AddOrderItemDto> items; + } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AddOrderItemDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AddOrderItemDto.java new file mode 100644 index 0000000..f4f9be6 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/AddOrderItemDto.java @@ -0,0 +1,24 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author wzy + * @date 2021-09-22 + **/ +@Data +@ApiModel(value = "AddOrderItemDto", description = "新增订单明细参数接收类") +public class AddOrderItemDto { + + @NotNull(message = "参数不能为空") + @ApiModelProperty(value = "skuID", example = "1") + private Long skuId; + + @NotNull(message = "参数不能为空") + @ApiModelProperty(value = "数量", example = "2") + private Integer cnt; +} diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallGoodsSku.java b/src/main/java/cc/mrbird/febs/mall/entity/MallGoodsSku.java index 9d52895..4c2317b 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallGoodsSku.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallGoodsSku.java @@ -1,6 +1,7 @@ package cc.mrbird.febs.mall.entity; import cc.mrbird.febs.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -29,4 +30,10 @@ private Long styleId; private Long goodsId; + + @TableField(exist = false) + private String goodsName; + + @TableField(exist = false) + private String styleName; } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java index 2fb2f54..9781436 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java @@ -2,6 +2,9 @@ import cc.mrbird.febs.mall.entity.MallGoodsSku; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; public interface MallGoodsSkuMapper extends BaseMapper<MallGoodsSku> { + + MallGoodsSku selectSkuInfoById(@Param("id") Long id); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java index fc76a83..aea0580 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java @@ -1,7 +1,10 @@ package cc.mrbird.febs.mall.service; +import cc.mrbird.febs.mall.dto.AddOrderDto; import cc.mrbird.febs.mall.entity.MallOrderInfo; import com.baomidou.mybatisplus.extension.service.IService; public interface IApiMallOrderInfoService extends IService<MallOrderInfo> { + + String createOrder(AddOrderDto addOrderDto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java index 41a6417..d6b93d2 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java @@ -1,12 +1,24 @@ package cc.mrbird.febs.mall.service.impl; -import cc.mrbird.febs.mall.entity.MallOrderInfo; -import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; +import cc.mrbird.febs.common.enumerates.OrderStatusEnum; +import cc.mrbird.febs.common.exception.FebsException; +import cc.mrbird.febs.common.utils.LoginUserUtil; +import cc.mrbird.febs.common.utils.MallUtils; +import cc.mrbird.febs.mall.dto.AddOrderDto; +import cc.mrbird.febs.mall.dto.AddOrderItemDto; +import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; /** * @author wzy @@ -16,4 +28,71 @@ @Service @RequiredArgsConstructor public class ApiMallOrderInfoServiceImpl extends ServiceImpl<MallOrderInfoMapper, MallOrderInfo> implements IApiMallOrderInfoService { + + private final MallGoodsMapper mallGoodsMapper; + private final MallGoodsSkuMapper mallGoodsSkuMapper; + private final MallAddressInfoMapper mallAddressInfoMapper; + private final MallOrderItemMapper mallOrderItemMapper; + + @Override + public String createOrder(AddOrderDto addOrderDto) { + MallMember member = LoginUserUtil.getLoginUser(); + + MallAddressInfo address = mallAddressInfoMapper.selectById(addOrderDto.getAddressId()); + if (address == null) { + throw new FebsException("地址不存在"); + } + + String orderNo = MallUtils.getOrderNum(); + MallOrderInfo orderInfo = new MallOrderInfo(); + orderInfo.setOrderNo(orderNo); + orderInfo.setOrderTime(new Date()); + orderInfo.setMemberId(member.getId()); + orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue()); + orderInfo.setName(address.getName()); + orderInfo.setAddress(address.getArea() + address.getAddress()); + orderInfo.setPhone(address.getPhone()); + orderInfo.setLatitude(address.getLatitude()); + orderInfo.setLongitude(address.getLongitude()); + orderInfo.setRemark(addOrderDto.getRemark()); + + if (CollUtil.isEmpty(addOrderDto.getItems())) { + throw new FebsException("参数错误"); + } + + this.baseMapper.insert(orderInfo); + BigDecimal total = BigDecimal.ZERO; + for (AddOrderItemDto item : addOrderDto.getItems()) { + MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId()); + if (sku == null) { + throw new FebsException("购买商品或sku不存在"); + } + + if (sku.getStock() < item.getCnt()) { + throw new FebsException("库存不足"); + } + + MallOrderItem orderItem = new MallOrderItem(); + BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt())); + orderItem.setAmount(amount); + orderItem.setCnt(item.getCnt()); + orderItem.setOrderId(orderInfo.getId()); + orderItem.setPrice(sku.getPresentPrice()); + orderItem.setGoodsId(sku.getGoodsId()); + orderItem.setGoodsName(sku.getGoodsName()); + orderItem.setSkuId(sku.getId()); + orderItem.setStyleName(sku.getStyleName()); + + total = total.add(amount); + mallOrderItemMapper.insert(orderItem); + + sku.setStock(sku.getStock() - item.getCnt()); + mallGoodsSkuMapper.updateById(sku); + } + + + return orderNo; + } + + } diff --git a/src/main/resources/mapper/modules/MallGoodsMapper.xml b/src/main/resources/mapper/modules/MallGoodsMapper.xml index 39bc47b..c0c3d02 100644 --- a/src/main/resources/mapper/modules/MallGoodsMapper.xml +++ b/src/main/resources/mapper/modules/MallGoodsMapper.xml @@ -72,7 +72,7 @@ and a.is_hot = 1 </if> <if test="record.categoryId != null and record.categoryId != ''"> - and (c.category_id = #{record.categoryId} or c.parent_id=#{record.categoryId}) + and (c.id = #{record.categoryId} or c.parent_id=#{record.categoryId}) </if> <if test="record.query != null and record.query != ''"> and a.goods_name like CONCAT('%', CONCAT(#{record.query}, '%')) diff --git a/src/main/resources/mapper/modules/MallGoodsSkuMapper.xml b/src/main/resources/mapper/modules/MallGoodsSkuMapper.xml index 176ea27..f742c02 100644 --- a/src/main/resources/mapper/modules/MallGoodsSkuMapper.xml +++ b/src/main/resources/mapper/modules/MallGoodsSkuMapper.xml @@ -4,6 +4,14 @@ <select id="selectSkuInfoById" resultType="cc.mrbird.febs.mall.entity.MallGoodsSku"> - select * from mall_goods_sku where id=#{id} + select + a.*, + b.name styleName, + c.goods_name goodsName + from mall_goods_sku a + inner join mall_goods_style b on a.style_id=b.ID + inner join mall_goods c on a.goods_id= c.ID + where a.id=#{id} </select> + </mapper> \ No newline at end of file -- Gitblit v1.9.1