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>