Helius
2021-09-22 595cf086067e3dae05f7896b7772d8b689cc6ea4
add addOrder and fix
3 files added
9 files modified
304 ■■■■■ changed files
sql/xc_mall.sql 62 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/OrderStatusEnum.java 46 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/utils/MallUtils.java 30 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java 16 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AddOrderItemDto.java 24 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallGoodsSku.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 83 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallGoodsMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallGoodsSkuMapper.xml 10 ●●●●● patch | view | raw | blame | history
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 = '资金流水';
src/main/java/cc/mrbird/febs/common/enumerates/OrderStatusEnum.java
New file
@@ -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;
    }
}
src/main/java/cc/mrbird/febs/common/utils/MallUtils.java
New file
@@ -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);
    }
}
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;
    }
}
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;
}
src/main/java/cc/mrbird/febs/mall/dto/AddOrderItemDto.java
New file
@@ -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;
}
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;
}
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);
}
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);
}
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;
    }
}
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}, '%'))
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>