xiaoyong931011
2021-09-22 b4ee04b14d289262fc303967412a56202b6e002f
Merge branch 'master' of http://120.27.238.55:7000/r/xc-mall

 Conflicts:
 src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java
 src/main/resources/mapper/modules/MallGoodsSkuMapper.xml
9 files added
16 files modified
603 ■■■■■ changed files
sql/xc_mall.sql 81 ●●●●● 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/ApiMallGoodsCategoryController.java 6 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java 37 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java 19 ●●●● 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/dto/PayOrderDto.java 28 ●●●●● 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/entity/MallMember.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java 10 ●●●●● 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/mapper/MallMemberWalletMapper.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java 53 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 145 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java 6 ●●●●● 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
src/main/resources/mapper/modules/MallMemberWalletMapper.xml 15 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallOrderInfoMapper.xml 3 ●●●●● patch | view | raw | blame | history
sql/xc_mall.sql
@@ -144,3 +144,84 @@
      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 = '资金流水';
alter table mall_order_info add del_flag int default 2 null comment '1-已删除2-未删除' after latitude;
alter table mall_order_info add pay_order_no varchar(500) null comment '支付订单号' after pay_method;
alter table mall_order_info add pay_result int null comment '支付结果 1-成功2-未成功' after pay_order_no;
alter table mall_member add trade_password varchar(500) null comment '支付密码' after password;
DROP TABLE IF EXISTS mall_member_wallet;
CREATE TABLE mall_member_wallet(
   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 '主键' ,
   balance DECIMAL(20,2)    COMMENT '余额' ,
   member_id    bigint         null comment '用户ID',
   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/ApiMallGoodsCategoryController.java
@@ -29,7 +29,7 @@
    private final IApiMallGoodsCategoryService mallGoodsCategoryService;
    @ApiOperation(value = "findAllCategoryList", notes = "获取商品分类列表")
    @ApiOperation(value = "获取商品分类列表", notes = "获取商品分类列表")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = MallGoodsCategoryVo.class)
    })
@@ -38,13 +38,13 @@
        return new FebsResponse().success().data(mallGoodsCategoryService.findAllCategoryList());
    }
    @ApiOperation(value = "findChildCategoryListById", notes = "获取父分类下分类")
    @ApiOperation(value = "获取父分类下分类", notes = "获取父分类下分类")
    @GetMapping(value = "/findChildCategoryListById/{id}")
    public FebsResponse findChildCategoryListById(@PathVariable("id") Long id) {
        return new FebsResponse().success().data(mallGoodsCategoryService.findChildCategoryListById(id));
    }
    @ApiOperation(value = "findRecommendCategory", notes = "获取推荐分类")
    @ApiOperation(value = "获取推荐分类", notes = "获取推荐分类")
    @GetMapping(value = "/findRecommendCategory")
    public FebsResponse findRecommendCategory() {
        return new FebsResponse().success().data(mallGoodsCategoryService.findRecommendCategory());
src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java
@@ -2,18 +2,18 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.AddOrderDto;
import cc.mrbird.febs.mall.dto.PayOrderDto;
import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author wzy
@@ -29,9 +29,30 @@
    private final IApiMallOrderInfoService mallOrderInfoService;
    @ApiOperation(value = "addOrder", notes = "提交订单")
    @PostMapping(value = "/addOrder")
    public FebsResponse addOrder(@RequestBody List<AddOrderDto> list) {
        return null;
    @ApiOperation(value = "创建订单", notes = "创建订单")
    @PostMapping(value = "/createOrder")
    public FebsResponse createOrder(@RequestBody AddOrderDto addOrderDto) {
        Long orderId = mallOrderInfoService.createOrder(addOrderDto);
        return new FebsResponse().success().data(orderId).message("创建订单成功");
    }
    @ApiOperation(value = "取消订单", notes = "取消订单")
    @PostMapping(value = "/cancelOrder/{id}")
    public FebsResponse cancelOrder(@PathVariable("id") Long id) {
        mallOrderInfoService.cancelOrder(id);
        return new FebsResponse().success();
    }
    @ApiOperation(value = "支付订单", notes = "支付订单")
    @PostMapping(value = "/payOrder")
    public FebsResponse payOrder(@RequestBody PayOrderDto payOrderDto) {
        String result = mallOrderInfoService.payOrder(payOrderDto);
        Map<String, Object> map = new HashMap<>();
        map.put("orderNo", result);
        map.put("type", payOrderDto.getType());
        return new FebsResponse().success().data(map).message("支付成功");
    }
}
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,17 @@
@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 = "订单提交类型", example = "1从购物车提交, 2从商品直接提交")
    private Integer type;
    @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/dto/PayOrderDto.java
New file
@@ -0,0 +1,28 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
 * @author wzy
 * @date 2021-09-22
 **/
@Data
@ApiModel(value = "PayOrderDto", description = "支付订单接口参数接口类")
public class PayOrderDto {
    @NotNull(message = "参数不能为空")
    @ApiModelProperty(value = "订单ID")
    private Long id;
    @NotBlank(message = "参数不能为空")
    @ApiModelProperty(value = "支付类型", example = "1微信2支付宝3余额")
    private String type;
    @ApiModelProperty(value = "支付密码", example = "如果选择余额支付需要输入")
    private String tradePwd;
}
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/entity/MallMember.java
@@ -36,6 +36,11 @@
    private String password;
    /**
     * 资金密码
     */
    private String tradePassword;
    /**
     * 头像
     */
    private String avatar;
src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
New file
@@ -0,0 +1,26 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author wzy
 * @date 2021-09-22
 **/
@Data
@TableName("mall_member_wallet")
public class MallMemberWallet extends BaseEntity {
    /**
     * 用户ID
     */
    private Long memberId;
    /**
     * 余额
     */
    private BigDecimal balance;
}
src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java
@@ -27,6 +27,10 @@
    private String payMethod;
    private String payOrderNo;
    private String payResult;
    /**
     * 状态 1-待支付2-待发货3-待收货4-已完成5-退款中6-已退款7-已取消
     */
@@ -36,6 +40,8 @@
     * 取消类型 1-超时未支付2-主动取消
     */
    private Integer cancelType;
    public static final Integer CANCEL_OVERTIME_NO_PAY = 1;
    public static final Integer CANCEL_BY_SELF = 2;
    private String name;
@@ -46,4 +52,8 @@
    private String longitude;
    private String latitude;
    private String remark;
    private Integer delFlag;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java
@@ -6,10 +6,13 @@
import org.apache.ibatis.annotations.Param;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface MallGoodsSkuMapper extends BaseMapper<MallGoodsSku> {
    void deleteByGoodsId(@Param("id")Long id);
    List<AdminMailGoodsSkuDetailVo> selectByGoodId(@Param("id")Long id);
    MallGoodsSku selectSkuInfoById(@Param("id") Long id);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
New file
@@ -0,0 +1,12 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallMemberWallet;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
public interface MallMemberWalletMapper extends BaseMapper<MallMemberWallet> {
    MallMemberWallet selectWalletByMemberId(@Param("memberId") Long memberId);
    int updateBalanceWithVersion(@Param("record") MallMemberWallet wallet);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java
@@ -2,10 +2,13 @@
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
 * @author wzy
 * @date 2021-09-18
 **/
public interface MallOrderInfoMapper extends BaseMapper<MallOrderInfo> {
    MallOrderInfo selectOrderByMemberIdAndId(@Param("memberId") Long memberId, @Param("id") Long id);
}
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java
New file
@@ -0,0 +1,13 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.mall.entity.MallMemberWallet;
import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal;
public interface IApiMallMemberWalletService extends IService<MallMemberWallet> {
    void addBalance(BigDecimal amount, Long member);
    void reduceBalance(BigDecimal amount, Long memberId);
}
src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java
@@ -1,7 +1,15 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.mall.dto.AddOrderDto;
import cc.mrbird.febs.mall.dto.PayOrderDto;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import com.baomidou.mybatisplus.extension.service.IService;
public interface IApiMallOrderInfoService extends IService<MallOrderInfo> {
    Long createOrder(AddOrderDto addOrderDto);
    void cancelOrder(Long id);
    String payOrder(PayOrderDto payOrderDto);
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -11,7 +11,9 @@
import cc.mrbird.febs.mall.dto.LoginDto;
import cc.mrbird.febs.mall.dto.RegisterDto;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallMemberWallet;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.service.ICommonService;
import cc.mrbird.febs.mall.vo.MallMemberVo;
@@ -27,7 +29,9 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -41,12 +45,14 @@
@RequiredArgsConstructor
public class ApiMallMemberServiceImpl extends ServiceImpl<MallMemberMapper, MallMember> implements IApiMallMemberService {
    private MallMemberWalletMapper mallMemberWalletMapper;
    private final ICommonService commonService;
    private final RedisUtils redisUtils;
    @Value("${spring.profiles.active}")
    private String active;
    @Transactional(rollbackFor = Exception.class)
    @Override
    public FebsResponse register(RegisterDto registerDto) {
        MallMember mallMember = this.baseMapper.selectInfoByAccount(registerDto.getAccount());
@@ -116,6 +122,11 @@
            mallMember.setReferrerIds(ids);
        }
        this.baseMapper.updateById(mallMember);
        MallMemberWallet wallet = new MallMemberWallet();
        wallet.setBalance(BigDecimal.ZERO);
        wallet.setMemberId(mallMember.getId());
        mallMemberWalletMapper.insert(wallet);
        return new FebsResponse().success().message("注册成功");
    }
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java
New file
@@ -0,0 +1,53 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.mall.entity.MallMemberWallet;
import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
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;
/**
 * @author wzy
 * @date 2021-09-22
 **/
@Slf4j
@Service
@RequiredArgsConstructor
public class ApiMallMemberWalletServiceImpl extends ServiceImpl<MallMemberWalletMapper, MallMemberWallet> implements IApiMallMemberWalletService {
    @Override
    public void addBalance(BigDecimal amount, Long memberId) {
    }
    @Override
    public void reduceBalance(BigDecimal amount, Long memberId) {
        int i = 0;
        boolean flag = true;
        while (flag) {
            i++;
            MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId);
            if (amount.compareTo(wallet.getBalance()) < 0) {
                throw new FebsException("余额不足");
            }
            wallet.setBalance(wallet.getBalance().subtract(amount));
            int result = this.baseMapper.updateBalanceWithVersion(wallet);
            if (result > 0) {
                flag = false;
            } else {
                if (i > 2) {
                    throw new FebsException("余额支付失败");
                }
            }
        }
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -1,12 +1,28 @@
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.dto.PayOrderDto;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
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 +32,129 @@
@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;
    private final MallMemberMapper memberMapper;
    private final IApiMallMemberWalletService memberWalletService;
    @Override
    public Long 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 orderInfo.getId();
    }
    @Override
    public void cancelOrder(Long id) {
        MallMember member = LoginUserUtil.getLoginUser();
        MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id);
        if (orderInfo == null) {
            throw new FebsException("订单不存在");
        }
        if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) {
            throw new FebsException("订单不是待付款, 无法取消");
        }
        orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
        orderInfo.setCancelType(MallOrderInfo.CANCEL_BY_SELF);
        this.baseMapper.updateById(orderInfo);
    }
    @Override
    public String payOrder(PayOrderDto payOrderDto) {
        MallMember member = LoginUserUtil.getLoginUser();
        MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), payOrderDto.getId());
        if (orderInfo == null) {
            throw new FebsException("订单不存在");
        }
        if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) {
            throw new FebsException("订单状态不能支付");
        }
        switch (payOrderDto.getType()) {
            case "1":
                // TODO 微信支付
                break;
            case "2":
                // TODO 支付宝支付
                break;
            case "3":
                return balancePay(orderInfo, payOrderDto.getTradePwd());
            default:
        }
        return "";
    }
    private String balancePay(MallOrderInfo orderInfo, String tradePwd) {
        if (StrUtil.isBlank(tradePwd)) {
            throw new FebsException("支付密码错误");
        }
        MallMember mallMember = memberMapper.selectById(orderInfo.getMemberId());
        if (!mallMember.getTradePassword().equals(SecureUtil.md5(tradePwd))) {
            throw new FebsException("支付密码错误");
        }
        memberWalletService.reduceBalance(orderInfo.getAmount(), mallMember.getId());
        return orderInfo.getOrderNo();
    }
}
src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java
@@ -38,6 +38,12 @@
    @ApiModelProperty(value = "是否上架 1-上架 2-下架")
    private Integer isSale;
    @ApiModelProperty(value = "库存")
    private Integer stock;
    @ApiModelProperty(value = "销量")
    private Integer volume;
    @ApiModelProperty(value = "轮播图")
    private List<String> images;
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,7 +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>
    <delete  id="deleteByGoodsId">
@@ -16,4 +23,5 @@
        select * from mall_goods_sku where goods_id = #{id}
    </select>
</mapper>
src/main/resources/mapper/modules/MallMemberWalletMapper.xml
New file
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.mrbird.febs.mall.mapper.MallMemberWalletMapper">
    <select id="selectWalletByMemberId" resultType="cc.mrbird.febs.mall.entity.MallMemberWallet">
        select * from mall_member_wallet where member_id=#{memberId}
    </select>
    <update id="updateBalanceWithVersion">
        update mall_member_wallet
        set REVISION = REVISION + 1,
            balance = #{record.balance}
        where id=#{record.id} and REVISION=#{record.REVISION}
    </update>
</mapper>
src/main/resources/mapper/modules/MallOrderInfoMapper.xml
@@ -2,4 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.mrbird.febs.mall.mapper.MallOrderInfoMapper">
    <select id="selectOrderByMemberIdAndId" resultType="cc.mrbird.febs.mall.entity.MallOrderInfo">
        select * from mall_order_info where member_id=#{memberId} and id=#{id}
    </select>
</mapper>