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>