From b4ee04b14d289262fc303967412a56202b6e002f Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Wed, 22 Sep 2021 16:41:04 +0800 Subject: [PATCH] Merge branch 'master' of http://120.27.238.55:7000/r/xc-mall --- src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java | 3 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 145 +++++++++++++ sql/xc_mall.sql | 81 +++++++ src/main/java/cc/mrbird/febs/mall/entity/MallGoodsSku.java | 7 src/main/java/cc/mrbird/febs/mall/dto/AddOrderItemDto.java | 24 ++ src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java | 53 ++++ src/main/java/cc/mrbird/febs/common/utils/MallUtils.java | 30 ++ src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsCategoryController.java | 6 src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java | 19 + src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java | 13 + src/main/resources/mapper/modules/MallGoodsSkuMapper.xml | 10 src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java | 3 src/main/java/cc/mrbird/febs/mall/dto/PayOrderDto.java | 28 ++ src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java | 37 ++ src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java | 12 + src/main/resources/mapper/modules/MallOrderInfoMapper.xml | 3 src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java | 26 ++ src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java | 11 + src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java | 6 src/main/resources/mapper/modules/MallGoodsMapper.xml | 2 src/main/java/cc/mrbird/febs/common/enumerates/OrderStatusEnum.java | 46 ++++ src/main/java/cc/mrbird/febs/mall/entity/MallMember.java | 5 src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java | 8 src/main/resources/mapper/modules/MallMemberWalletMapper.xml | 15 + src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java | 10 25 files changed, 584 insertions(+), 19 deletions(-) diff --git a/sql/xc_mall.sql b/sql/xc_mall.sql index 1b723cd..7b8eaa3 100644 --- a/sql/xc_mall.sql +++ b/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 = '用户钱包'; + 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/ApiMallGoodsCategoryController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsCategoryController.java index a7f6555..3a525be 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsCategoryController.java +++ b/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()); 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..9d7ef92 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java +++ b/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("支付成功"); + } + } 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..4bf68c5 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,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; + } 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/dto/PayOrderDto.java b/src/main/java/cc/mrbird/febs/mall/dto/PayOrderDto.java new file mode 100644 index 0000000..ce805d1 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/PayOrderDto.java @@ -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; +} 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/entity/MallMember.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java index b01bd14..33117f0 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java @@ -36,6 +36,11 @@ private String password; /** + * 资金密码 + */ + private String tradePassword; + + /** * 头像 */ private String avatar; diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java new file mode 100644 index 0000000..d7cdab9 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java @@ -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; +} diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java index 8d9fc8b..fa133c2 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java +++ b/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; } 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 9ae1040..65b693f 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsSkuMapper.java +++ b/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); } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java new file mode 100644 index 0000000..8fdc1a0 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java @@ -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); +} diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java index 74bdcd4..647c5fb 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java +++ b/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); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java new file mode 100644 index 0000000..79aed18 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberWalletService.java @@ -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); +} 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..1014a7a 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,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); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java index 0483305..c796705 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java +++ b/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("注册成功"); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java new file mode 100644 index 0000000..3a01906 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java @@ -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("余额支付失败"); + } + } + } + } +} 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..e02856a 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,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(); + } } diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java index f94ff77..3f358ae 100644 --- a/src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java +++ b/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; diff --git a/src/main/resources/mapper/modules/MallGoodsMapper.xml b/src/main/resources/mapper/modules/MallGoodsMapper.xml index eb13be2..3797ee2 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 dd7a27d..5bcfd23 100644 --- a/src/main/resources/mapper/modules/MallGoodsSkuMapper.xml +++ b/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> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallMemberWalletMapper.xml b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml new file mode 100644 index 0000000..6036704 --- /dev/null +++ b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml @@ -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> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml b/src/main/resources/mapper/modules/MallOrderInfoMapper.xml index bd39908..66cd3b6 100644 --- a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml +++ b/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> \ No newline at end of file -- Gitblit v1.9.1