优惠劵相关逻辑的迁移
parent
2c6331eb75
commit
5b3c464faf
|
@ -1,85 +0,0 @@
|
||||||
package cn.iocoder.mall.system.api.constant;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 错误码枚举类
|
|
||||||
*
|
|
||||||
* 管理员系统,使用 1-002-000-000 段
|
|
||||||
*/
|
|
||||||
public enum AdminErrorCodeEnum {
|
|
||||||
|
|
||||||
// ========== OAUTH2 模块 ==========
|
|
||||||
OAUTH2_UNKNOWN(1002001000, "未知错误"), // 预留
|
|
||||||
// OAUTH2_INVALID_GRANT_BAD_CREDENTIALS(1001001001, "密码不正确"), // 暂时没用到
|
|
||||||
// OAUTH2_INVALID_GRANT_USERNAME_NOT_FOUND(1001001002, "账号不存在"), // 暂时没用到
|
|
||||||
// OAUTH2_INVALID_GRANT(1001001010, ""), // 预留
|
|
||||||
OAUTH2_INVALID_TOKEN_NOT_FOUND(1002001011, "访问令牌不存在"),
|
|
||||||
OAUTH2_INVALID_TOKEN_EXPIRED(1002001012, "访问令牌已过期"),
|
|
||||||
OAUTH2_INVALID_TOKEN_INVALID(1002001013, "访问令牌已失效"),
|
|
||||||
OAUTH2_NOT_LOGIN(1002001015, "账号未登陆"),
|
|
||||||
OAUTH2_INVALID_TOKEN_ERROR_USER_TYPE(1002001016, "访问令牌用户类型不正确"),
|
|
||||||
OAUTH_INVALID_REFRESH_TOKEN_NOT_FOUND(1002001017, "刷新令牌不存在"),
|
|
||||||
OAUTH_INVALID_REFRESH_TOKEN_EXPIRED(1002001018, "访问令牌已过期"),
|
|
||||||
OAUTH_INVALID_REFRESH_TOKEN_INVALID(1002001019, "刷新令牌已失效"),
|
|
||||||
|
|
||||||
// ========== 管理员模块 1002002000 ==========
|
|
||||||
ADMIN_USERNAME_NOT_REGISTERED(1002002000, "账号不存在"),
|
|
||||||
ADMIN_PASSWORD_ERROR(1002002001, "密码不正确"),
|
|
||||||
ADMIN_IS_DISABLE(1002002002, "账号被禁用"),
|
|
||||||
ADMIN_USERNAME_EXISTS(1002002002, "账号已经存在"),
|
|
||||||
ADMIN_STATUS_EQUALS(1002002003, "账号已经是该状态"),
|
|
||||||
ADMIN_DELETE_ONLY_DISABLE(1002002004, "只有关闭的账号才可以删除"),
|
|
||||||
ADMIN_ADMIN_STATUS_CAN_NOT_UPDATE(1002002005, "管理员的账号状态不允许变更"),
|
|
||||||
ADMIN_ASSIGN_ROLE_NOT_EXISTS(1002002006, "分配员工角色时,有角色不存在"),
|
|
||||||
ADMIN_INVALID_PERMISSION(1002002007, "没有该操作权限"),
|
|
||||||
ADMIN_ADMIN_CAN_NOT_UPDATE(1002002008, "管理员的账号不允许变更"),
|
|
||||||
ADMIN_DEMO_CAN_NOT_WRITE(1002002009, "演示账号,暂不允许写操作。欢迎加入我们的交流群:http://t.cn/EKEr5WE"),
|
|
||||||
|
|
||||||
// ========== 资源模块 1002003000 ==========
|
|
||||||
RESOURCE_NAME_DUPLICATE(1002003000, "已经存在该名字的资源"),
|
|
||||||
RESOURCE_PARENT_NOT_EXISTS(1002003001, "父资源不存在"),
|
|
||||||
RESOURCE_PARENT_ERROR(1002003002, "不能设置自己为父资源"),
|
|
||||||
RESOURCE_NOT_EXISTS(1002003003, "资源不存在"),
|
|
||||||
RESOURCE_EXISTS_CHILDREN(1002003004, "存在子资源,无法删除"),
|
|
||||||
RESOURCE_PARENT_NOT_MENU(1002003005, "父资源的类型必须是菜单"),
|
|
||||||
|
|
||||||
// ========== 角色模块 1002004000 ==========
|
|
||||||
ROLE_NOT_EXISTS(1002004000, "角色不存在"),
|
|
||||||
ROLE_ASSIGN_RESOURCE_NOT_EXISTS(1002004001, "分配角色资源时,有资源不存在"),
|
|
||||||
|
|
||||||
// ========== 数据字典模块 1002005000 ==========
|
|
||||||
DATA_DICT_EXISTS(1002005000, "该数据字典已经存在"),
|
|
||||||
DATA_DICT_NOT_EXISTS(1002005001, "该数据字典不存在"),
|
|
||||||
|
|
||||||
// ========== 短信模板 1002006000 ==========
|
|
||||||
SMS_PLATFORM_FAIL(1002006000, "短信平台调用失败【具体错误会动态替换】"),
|
|
||||||
SMS_SIGN_NOT_EXISTENT(1002006001, "短信签名不存在"),
|
|
||||||
SMS_SIGN_IS_EXISTENT(1002006002, "短信签名已存在"),
|
|
||||||
SMS_TEMPLATE_NOT_EXISTENT(1002006020, "短信签名不存在"),
|
|
||||||
SMS_TEMPLATE_IS_EXISTENT(1002006021, "短信签名不存在"),
|
|
||||||
SMS_NOT_SEND_CLIENT(1002006030, "短信没有发送的client"),
|
|
||||||
|
|
||||||
// ========== 部门模块 1002007000 ==========
|
|
||||||
DEPT_SAME_LEVEL_NAME_EXITS(1002007001,"当前级别部门名字已存在"),
|
|
||||||
DEPT_PARENT_NOT_EXITS(1002007002,"父级部门不存在"),
|
|
||||||
DEPT_NOT_EXITS(1002007003, "当前部门不存在"),
|
|
||||||
DEPT_EXITS_CHILDREN(1002007004, "当前部门存在子部门"),
|
|
||||||
DEPT_PARENT_NOT_LEGAL(1002007005, "父级部门不合法"),
|
|
||||||
;
|
|
||||||
|
|
||||||
private final int code;
|
|
||||||
private final String message;
|
|
||||||
|
|
||||||
AdminErrorCodeEnum(int code, String message) {
|
|
||||||
this.code = code;
|
|
||||||
this.message = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCode() {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMessage() {
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,72 +0,0 @@
|
||||||
package cn.iocoder.mall.order.rest.controller.cart;
|
|
||||||
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("users/cart")
|
|
||||||
public class UsersCartController {
|
|
||||||
|
|
||||||
// @Reference(validation = "true", version = "${dubbo.provider.CartService.version}")
|
|
||||||
// private CartService cartService;
|
|
||||||
//
|
|
||||||
// @Reference(validation = "true", version = "${dubbo.provider.OrderService.version}")
|
|
||||||
// private OrderService orderService;
|
|
||||||
//
|
|
||||||
// @Reference(validation = "true", version = "${dubbo.consumer.CouponService.version}")
|
|
||||||
// private CouponService couponService;
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// @GetMapping("/confirm_create_order")
|
|
||||||
// public CommonResult<UsersOrderConfirmCreateVO> getConfirmCreateOrder(@RequestParam(value = "couponCardId", required = false) Integer couponCardId) {
|
|
||||||
// Integer userId = UserSecurityContextHolder.getContext().getUserId();
|
|
||||||
// // 获得购物车中选中的
|
|
||||||
// List<CartItemBO> cartItems = cartService.list(userId, true);
|
|
||||||
// // 购物车为空时,构造空的 UsersOrderConfirmCreateVO 返回
|
|
||||||
// if (cartItems.isEmpty()) {
|
|
||||||
// UsersOrderConfirmCreateVO result = new UsersOrderConfirmCreateVO();
|
|
||||||
// result.setItemGroups(Collections.emptyList());
|
|
||||||
// result.setFee(new UsersOrderConfirmCreateVO.Fee(0, 0, 0, 0));
|
|
||||||
// return success(result);
|
|
||||||
// }
|
|
||||||
// // 计算商品价格
|
|
||||||
// CalcOrderPriceBO calcOrderPrice = list0(cartItems, couponCardId);
|
|
||||||
// // 获得优惠劵
|
|
||||||
// List<CouponCardAvailableBO> couponCards = couponService.getCouponCardList(userId,
|
|
||||||
// CartConvert.INSTANCE.convertList(calcOrderPrice.getItemGroups()));
|
|
||||||
// // 执行数据拼装
|
|
||||||
// return success(CartConvert.INSTANCE.convert(calcOrderPrice).setCouponCards(couponCards));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private CalcOrderPriceBO list0(List<CartItemBO> cartItems, Integer couponCardId) {
|
|
||||||
// // 创建计算的 DTO
|
|
||||||
// CalcOrderPriceDTO calcOrderPriceDTO = new CalcOrderPriceDTO()
|
|
||||||
// .setUserId(UserSecurityContextHolder.getContext().getUserId())
|
|
||||||
// .setItems(new ArrayList<>(cartItems.size()))
|
|
||||||
// .setCouponCardId(couponCardId);
|
|
||||||
// for (CartItemBO item : cartItems) {
|
|
||||||
// calcOrderPriceDTO.getItems().add(new CalcOrderPriceDTO.Item(item.getSkuId(), item.getQuantity(), item.getSelected()));
|
|
||||||
// }
|
|
||||||
// // 执行计算
|
|
||||||
// return cartService.calcOrderPrice(calcOrderPriceDTO);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @GetMapping("/calc_sku_price")
|
|
||||||
// public CommonResult<UsersCalcSkuPriceVO> calcSkuPrice(@RequestParam("skuId") Integer skuId) {
|
|
||||||
// // 计算 sku 的价格
|
|
||||||
// CalcSkuPriceBO calcSkuPrice = cartService.calcSkuPrice(skuId);
|
|
||||||
// return success(CartConvert.INSTANCE.convert2(calcSkuPrice));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public CommonResult<Object> confirmOrder() {
|
|
||||||
// // 查询购物车列表(选中的)
|
|
||||||
//// cartService.list(userId, true);
|
|
||||||
// // 查询确认订单信息的明细
|
|
||||||
//
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
|
@ -76,25 +76,7 @@ public class UsersOrderController {
|
||||||
// return createResult;
|
// return createResult;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// @GetMapping("confirm_create_order")
|
|
||||||
// @RequiresLogin
|
|
||||||
// @ApiOperation("确认创建订单")
|
|
||||||
// public CommonResult<UsersOrderConfirmCreateVO> getConfirmCreateOrder(@RequestParam("skuId") Integer skuId,
|
|
||||||
// @RequestParam("quantity") Integer quantity,
|
|
||||||
// @RequestParam(value = "couponCardId", required = false) Integer couponCardId) {
|
|
||||||
// Integer userId = UserSecurityContextHolder.getContext().getUserId();
|
|
||||||
// // 创建 CalcOrderPriceDTO 对象,并执行价格计算
|
|
||||||
// CalcOrderPriceDTO calcOrderPriceDTO = new CalcOrderPriceDTO()
|
|
||||||
// .setUserId(userId)
|
|
||||||
// .setItems(Collections.singletonList(new CalcOrderPriceDTO.Item(skuId, quantity, true)))
|
|
||||||
// .setCouponCardId(couponCardId);
|
|
||||||
// CalcOrderPriceBO calcOrderPrice = cartService.calcOrderPrice(calcOrderPriceDTO);
|
|
||||||
// // 获得优惠劵
|
|
||||||
// List<CouponCardAvailableBO> couponCards = couponService.getCouponCardList(userId,
|
|
||||||
// CartConvert.INSTANCE.convertList(calcOrderPrice.getItemGroups()));
|
|
||||||
// // 执行数据拼装
|
|
||||||
// return success(CartConvert.INSTANCE.convert(calcOrderPrice).setCouponCards(couponCards));
|
|
||||||
// }
|
|
||||||
//
|
//
|
||||||
// @PostMapping("confirm_receiving")
|
// @PostMapping("confirm_receiving")
|
||||||
// @RequiresLogin
|
// @RequiresLogin
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
package cn.iocoder.mall.order.rest.convert;
|
|
||||||
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface CartConvert {
|
|
||||||
|
|
||||||
CartConvert INSTANCE = Mappers.getMapper(CartConvert.class);
|
|
||||||
|
|
||||||
// UsersOrderConfirmCreateVO convert(CalcOrderPriceBO calcOrderPriceBO);
|
|
||||||
//
|
|
||||||
// UsersCartDetailVO convert2(CalcOrderPriceBO calcOrderPriceBO);
|
|
||||||
//
|
|
||||||
// UsersCalcSkuPriceVO convert2(CalcSkuPriceBO calcSkuPriceBO);
|
|
||||||
//
|
|
||||||
// default List<CouponCardSpuDTO> convertList(List<CalcOrderPriceBO.ItemGroup> itemGroups) {
|
|
||||||
// List<CouponCardSpuDTO> items = new ArrayList<>();
|
|
||||||
// itemGroups.forEach(itemGroup -> items.addAll(itemGroup.getItems().stream().map(
|
|
||||||
// item -> new CouponCardSpuDTO()
|
|
||||||
// .setSpuId(item.getSpu().getId())
|
|
||||||
// .setSkuId(item.getId())
|
|
||||||
// .setCategoryId(item.getSpu().getCid())
|
|
||||||
// .setPrice(item.getBuyPrice())
|
|
||||||
// .setQuantity(item.getBuyQuantity()))
|
|
||||||
// .collect(Collectors.toList())));
|
|
||||||
// return items;
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
package cn.iocoder.mall.order.rest.convert;
|
|
||||||
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* application 订单 convert
|
|
||||||
*
|
|
||||||
* TODO 这种方式 文件名不能一样哈!
|
|
||||||
*
|
|
||||||
* @author Sin
|
|
||||||
* @time 2019-03-24 10:45
|
|
||||||
*/
|
|
||||||
@Mapper
|
|
||||||
public interface OrderConvertAPP {
|
|
||||||
|
|
||||||
OrderConvertAPP INSTANCE = Mappers.getMapper(OrderConvertAPP.class);
|
|
||||||
|
|
||||||
// @Mappings({})
|
|
||||||
// OrderQueryDTO convert(OrderPageQueryPO orderPageQueryVO);
|
|
||||||
//
|
|
||||||
// @Mappings({})
|
|
||||||
// OrderLogisticsUpdateDTO convert(OrderLogisticsPO orderLogisticsVO);
|
|
||||||
//
|
|
||||||
// @Mappings({})
|
|
||||||
// OrderItemUpdateDTO convert(OrderItemUpdatePO orderItemUpdateVO);
|
|
||||||
//
|
|
||||||
// @Mappings({})
|
|
||||||
// OrderCreateDTO convert(OrderCreatePO orderCreatePO);
|
|
||||||
//
|
|
||||||
// @Mappings({})
|
|
||||||
// List<OrderCreateDTO.OrderItem> convert(List<CartItemBO> cartItems);
|
|
||||||
//
|
|
||||||
// default OrderCreateDTO createOrderCreateDTO(Integer userId, Integer userAddressId,
|
|
||||||
// String remark, String ip,
|
|
||||||
// List<CartItemBO> cartItems, Integer couponCardId) {
|
|
||||||
// return new OrderCreateDTO()
|
|
||||||
// .setUserId(userId)
|
|
||||||
// .setUserAddressId(userAddressId)
|
|
||||||
// .setRemark(remark)
|
|
||||||
// .setIp(ip)
|
|
||||||
// .setOrderItems(this.convert(cartItems))
|
|
||||||
// .setCouponCardId(couponCardId);
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
package cn.iocoder.mall.order.rest.convert;
|
|
||||||
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Sin
|
|
||||||
* @time 2019-04-05 17:00
|
|
||||||
*/
|
|
||||||
@Mapper
|
|
||||||
public interface OrderDeliveryConvert {
|
|
||||||
|
|
||||||
OrderDeliveryConvert INSTANCE = Mappers.getMapper(OrderDeliveryConvert.class);
|
|
||||||
|
|
||||||
// @Mappings({})
|
|
||||||
// OrderDeliveryDTO convert(OrderDeliverPO orderDeliverPO);
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
package cn.iocoder.mall.order.rest.convert;
|
|
||||||
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 订单退货
|
|
||||||
*
|
|
||||||
* @author Sin
|
|
||||||
* @time 2019-04-25 21:54
|
|
||||||
*/
|
|
||||||
@Mapper
|
|
||||||
public interface OrderReturnConvert {
|
|
||||||
|
|
||||||
OrderReturnConvert INSTANCE = Mappers.getMapper(OrderReturnConvert.class);
|
|
||||||
|
|
||||||
// @Mappings({})
|
|
||||||
// OrderReturnApplyDTO convert(OrderReturnApplyPO orderReturnApplyPO);
|
|
||||||
//
|
|
||||||
// @Mappings({})
|
|
||||||
// OrderReturnQueryDTO convert(OrderReturnQueryPO orderReturnQueryPO);
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
# 服务器的配置项
|
|
||||||
server:
|
|
||||||
port: 18088
|
|
||||||
servlet:
|
|
||||||
context-path: /order-api/
|
|
||||||
|
|
||||||
# Swagger 配置项
|
|
||||||
swagger:
|
|
||||||
title: 订单子系统
|
|
||||||
description: 订单子系统
|
|
||||||
version: 1.0.0
|
|
||||||
base-package: cn.iocoder.mall.order.rest.controller
|
|
|
@ -1,17 +0,0 @@
|
||||||
package cn.iocoder.mall.order.api;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.order.api.bo.CalcSkuPriceBO;
|
|
||||||
|
|
||||||
public interface CartService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 计算指定商品 SKU 的金额,并返回计算结果
|
|
||||||
*
|
|
||||||
* TODO 芋艿,此处只会计算,限时折扣带来的价格变化。
|
|
||||||
*
|
|
||||||
* @param skuId 商品 SKU 编号
|
|
||||||
* @return 计算订单金额结果
|
|
||||||
*/
|
|
||||||
CalcSkuPriceBO calcSkuPrice(Integer skuId);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
package cn.iocoder.mall.order.api.bo;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.bo.PromotionActivityBO;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 计算商品 SKU 价格结果 BO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CalcSkuPriceBO implements Serializable {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 满减送促销活动
|
|
||||||
*/
|
|
||||||
private PromotionActivityBO fullPrivilege;
|
|
||||||
/**
|
|
||||||
* 限时折扣促销活动
|
|
||||||
*/
|
|
||||||
private PromotionActivityBO timeLimitedDiscount;
|
|
||||||
/**
|
|
||||||
* 原价格,单位:分。
|
|
||||||
*/
|
|
||||||
private Integer originalPrice;
|
|
||||||
/**
|
|
||||||
* 购买价格,单位:分。
|
|
||||||
*/
|
|
||||||
private Integer buyPrice;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,100 +0,0 @@
|
||||||
package cn.iocoder.mall.order.api.bo;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 购物车的商品信息 DO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CartItemBO {
|
|
||||||
|
|
||||||
// ========= 基础字段 BEGIN =========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 编号,唯一自增。
|
|
||||||
*/
|
|
||||||
private Integer id;
|
|
||||||
/**
|
|
||||||
* 状态
|
|
||||||
*
|
|
||||||
* 1-正常
|
|
||||||
* 2-主动删除
|
|
||||||
* 3-下单删除
|
|
||||||
*/
|
|
||||||
private Integer status;
|
|
||||||
/**
|
|
||||||
* 是否选中
|
|
||||||
*/
|
|
||||||
private Boolean selected;
|
|
||||||
|
|
||||||
// ========= 基础字段 END =========
|
|
||||||
|
|
||||||
// ========= 买家信息 BEGIN =========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*/
|
|
||||||
private Integer userId;
|
|
||||||
// /**
|
|
||||||
// * 会话 key
|
|
||||||
// */
|
|
||||||
// private String nobody;
|
|
||||||
|
|
||||||
// ========= 买家信息 END =========
|
|
||||||
|
|
||||||
// ========= 商品信息 BEGIN =========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 商品 SPU 编号
|
|
||||||
*/
|
|
||||||
private Integer spuId;
|
|
||||||
/**
|
|
||||||
* 商品 SKU 编号
|
|
||||||
*/
|
|
||||||
private Integer skuId;
|
|
||||||
/**
|
|
||||||
* 商品购买数量
|
|
||||||
*/
|
|
||||||
private Integer quantity;
|
|
||||||
|
|
||||||
// TODO 冗余字段
|
|
||||||
|
|
||||||
|
|
||||||
// ========= 商品信息 END =========
|
|
||||||
|
|
||||||
// ========= 交易信息 BEGIN =========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 订单编号
|
|
||||||
*/
|
|
||||||
private Integer orderId;
|
|
||||||
/**
|
|
||||||
* 订单创建时间
|
|
||||||
*/
|
|
||||||
private Date orderCreateTime;
|
|
||||||
|
|
||||||
// ========= 交易信息 BEGIN =========
|
|
||||||
|
|
||||||
// ========= 优惠信息 BEGIN =========
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * 商品营销活动编号
|
|
||||||
// */
|
|
||||||
// private Integer activityId;
|
|
||||||
// /**
|
|
||||||
// * 商品营销活动类型
|
|
||||||
// */
|
|
||||||
// private Integer activityType;
|
|
||||||
|
|
||||||
// ========= 优惠信息 END =========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
*/
|
|
||||||
private Date createTime;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
package cn.iocoder.mall.order.api.dto;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 计算订单价格 DTO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
@Deprecated
|
|
||||||
public class CalcOrderPriceDTO {
|
|
||||||
|
|
||||||
@NotNull(message = "用户编号不能为空")
|
|
||||||
private Integer userId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵编号
|
|
||||||
*/
|
|
||||||
private Integer couponCardId;
|
|
||||||
|
|
||||||
@NotNull(message = "商品数组不能为空")
|
|
||||||
private List<Item> items;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public static class Item {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SKU 编号
|
|
||||||
*/
|
|
||||||
private Integer skuId;
|
|
||||||
/**
|
|
||||||
* 数量
|
|
||||||
*/
|
|
||||||
private Integer quantity;
|
|
||||||
/**
|
|
||||||
* 是否选中
|
|
||||||
*
|
|
||||||
* 注意下,目前只有在购物车的时候,才可能出现该属性为 false 。其它情况下,都会为 true 为主。
|
|
||||||
*/
|
|
||||||
private Boolean selected;
|
|
||||||
|
|
||||||
public Item() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public Item(Integer skuId, Integer quantity, Boolean selected) {
|
|
||||||
this.skuId = skuId;
|
|
||||||
this.quantity = quantity;
|
|
||||||
this.selected = selected;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
package cn.iocoder.mall.order.biz.config;
|
|
||||||
|
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|
||||||
|
|
||||||
@Configuration
|
|
||||||
@MapperScan("cn.iocoder.mall.order.biz.dao") // 扫描对应的 Mapper 接口
|
|
||||||
@EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理。为什么使用 proxyTargetClass 参数,参见 https://blog.csdn.net/huang_550/article/details/76492600
|
|
||||||
public class DatabaseConfiguration {
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
package cn.iocoder.mall.order.biz.config;
|
|
||||||
|
|
||||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.context.event.EventListener;
|
|
||||||
|
|
||||||
@Configuration
|
|
||||||
public class ServiceExceptionConfiguration {
|
|
||||||
|
|
||||||
@EventListener(ApplicationReadyEvent.class) // 可参考 https://www.cnblogs.com/ssslinppp/p/7607509.html
|
|
||||||
public void initMessages() {
|
|
||||||
// 从 service_exception_message.properties 加载错误码的方案
|
|
||||||
// Properties properties;
|
|
||||||
// try {
|
|
||||||
// properties = PropertiesLoaderUtils.loadAllProperties("classpath:service_exception_message.properties");
|
|
||||||
// } catch (IOException e) {
|
|
||||||
// throw new RuntimeException(e);
|
|
||||||
// }
|
|
||||||
} // TODO FROM 芋艿 to 小范,这里记得配置下,不然错误提示不出去呀。
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
package cn.iocoder.mall.order.biz.convert;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.order.api.bo.CalcOrderPriceBO;
|
|
||||||
import cn.iocoder.mall.order.api.bo.CartItemBO;
|
|
||||||
import cn.iocoder.mall.order.biz.dataobject.CartItemDO;
|
|
||||||
import cn.iocoder.mall.product.api.bo.ProductSkuDetailBO;
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface CartConvert {
|
|
||||||
|
|
||||||
CartConvert INSTANCE = Mappers.getMapper(CartConvert.class);
|
|
||||||
|
|
||||||
CalcOrderPriceBO.Item convert(ProductSkuDetailBO sku);
|
|
||||||
|
|
||||||
List<CartItemBO> convert(List<CartItemDO> items);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
package cn.iocoder.mall.order.biz.service;
|
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 购物车服务 Service 实现类
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
@org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.CartService.version}")
|
|
||||||
public class CartServiceImpl {
|
|
||||||
|
|
||||||
|
|
||||||
// @Override
|
|
||||||
// @SuppressWarnings("Duplicates")
|
|
||||||
// public CalcSkuPriceBO calcSkuPrice(Integer skuId) {
|
|
||||||
// // 查询 SKU 是否合法
|
|
||||||
// ProductSkuBO sku = productSpuService.getProductSku(skuId);
|
|
||||||
// if (sku == null
|
|
||||||
// || CommonStatusEnum.DISABLE.getValue().equals(sku.getStatus())) { // sku 被禁用
|
|
||||||
// throw ServiceExceptionUtil.exception(OrderErrorCodeEnum.CARD_ITEM_SKU_NOT_FOUND.getCode());
|
|
||||||
// }
|
|
||||||
// // 查询促销活动
|
|
||||||
// List<PromotionActivityBO> activityList = promotionActivityService.getPromotionActivityListBySpuId(sku.getSpuId(),
|
|
||||||
// Arrays.asList(PromotionActivityStatusEnum.WAIT.getValue(), PromotionActivityStatusEnum.RUN.getValue()));
|
|
||||||
// if (activityList.isEmpty()) { // 如果无促销活动,则直接返回默认结果即可
|
|
||||||
// return new CalcSkuPriceBO().setOriginalPrice(sku.getPrice()).setBuyPrice(sku.getPrice());
|
|
||||||
// }
|
|
||||||
// // 如果有促销活动,则开始做计算 TODO 芋艿,因为现在暂时只有限时折扣 + 满减送。所以写的比较简单先
|
|
||||||
// PromotionActivityBO fullPrivilege = findPromotionActivityByType(activityList, PromotionActivityTypeEnum.FULL_PRIVILEGE);
|
|
||||||
// PromotionActivityBO timeLimitedDiscount = findPromotionActivityByType(activityList, PromotionActivityTypeEnum.TIME_LIMITED_DISCOUNT);
|
|
||||||
// Integer presentPrice = calcSkuPriceByTimeLimitDiscount(sku, timeLimitedDiscount);
|
|
||||||
// // 返回结果
|
|
||||||
// return new CalcSkuPriceBO().setFullPrivilege(fullPrivilege).setTimeLimitedDiscount(timeLimitedDiscount)
|
|
||||||
// .setOriginalPrice(sku.getPrice()).setBuyPrice(presentPrice);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// private PromotionActivityBO findPromotionActivityByType(List<PromotionActivityBO> activityList, PromotionActivityTypeEnum type) {
|
|
||||||
// return activityList.stream()
|
|
||||||
// .filter(activity -> type.getValue().equals(activity.getActivityType()))
|
|
||||||
// .findFirst().orElse(null);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private List<PromotionActivityBO> findPromotionActivityListByType(List<PromotionActivityBO> activityList, PromotionActivityTypeEnum type) {
|
|
||||||
// return activityList.stream()
|
|
||||||
// .filter(activity -> type.getValue().equals(activity.getActivityType()))
|
|
||||||
// .collect(Collectors.toList());
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.mall.promotion.api.enums;
|
package cn.iocoder.mall.promotion.api.enums.activity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 促销活动状态枚举
|
* 促销活动状态枚举
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.mall.promotion.api.enums;
|
package cn.iocoder.mall.promotion.api.enums.activity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 推广活动类型枚举
|
* 推广活动类型枚举
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.mall.promotion.api.enums;
|
package cn.iocoder.mall.promotion.api.enums.coupon.card;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.core.IntArrayValuable;
|
import cn.iocoder.common.framework.core.IntArrayValuable;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.mall.promotion.api.enums;
|
package cn.iocoder.mall.promotion.api.enums.coupon.card;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.core.IntArrayValuable;
|
import cn.iocoder.common.framework.core.IntArrayValuable;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.mall.promotion.api.enums;
|
package cn.iocoder.mall.promotion.api.enums.coupon.template;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.core.IntArrayValuable;
|
import cn.iocoder.common.framework.core.IntArrayValuable;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.mall.promotion.api.enums;
|
package cn.iocoder.mall.promotion.api.enums.coupon.template;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.core.IntArrayValuable;
|
import cn.iocoder.common.framework.core.IntArrayValuable;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.mall.promotion.api.enums;
|
package cn.iocoder.mall.promotion.api.enums.coupon.template;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package cn.iocoder.mall.promotion.api.enums;
|
package cn.iocoder.mall.promotion.api.enums.recommend;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.core.IntArrayValuable;
|
import cn.iocoder.common.framework.core.IntArrayValuable;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.activity.dto;
|
package cn.iocoder.mall.promotion.api.rpc.activity.dto;
|
||||||
|
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityStatusEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
@ -25,13 +27,13 @@ public class PromotionActivityRespDTO implements Serializable {
|
||||||
/**
|
/**
|
||||||
* 活动类型
|
* 活动类型
|
||||||
*
|
*
|
||||||
* 参见 {@link cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum} 枚举
|
* 参见 {@link PromotionActivityTypeEnum} 枚举
|
||||||
*/
|
*/
|
||||||
private Integer activityType;
|
private Integer activityType;
|
||||||
/**
|
/**
|
||||||
* 活动状态
|
* 活动状态
|
||||||
*
|
*
|
||||||
* 参见 {@link cn.iocoder.mall.promotion.api.enums.PromotionActivityStatusEnum} 枚举
|
* 参见 {@link PromotionActivityStatusEnum} 枚举
|
||||||
*/
|
*/
|
||||||
private Integer status;
|
private Integer status;
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
package cn.iocoder.mall.promotion.api.rpc.coupon;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
|
import cn.iocoder.common.framework.vo.PageResult;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵 Rpc 接口
|
||||||
|
*/
|
||||||
|
public interface CouponCardRpc {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得优惠劵分页
|
||||||
|
*
|
||||||
|
* @param pageReqDTO 优惠劵分页查询
|
||||||
|
* @return 优惠劵分页结果
|
||||||
|
*/
|
||||||
|
CommonResult<PageResult<CouponCardRespDTO>> pageCouponCard(CouponCardPageReqDTO pageReqDTO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给用户添加优惠劵
|
||||||
|
*
|
||||||
|
* @param createReqDTO 创建信息
|
||||||
|
* @return 优惠劵编号
|
||||||
|
*/
|
||||||
|
CommonResult<Integer> createCouponCard(CouponCardCreateReqDTO createReqDTO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户使用优惠劵
|
||||||
|
*
|
||||||
|
* @param useReqDTO 使用信息
|
||||||
|
* @return 成功
|
||||||
|
*/
|
||||||
|
CommonResult<Boolean> useCouponCard(CouponCardUseReqDTO useReqDTO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户取消使用优惠劵
|
||||||
|
*
|
||||||
|
* @param cancelUseReqDTO 取消使用信息
|
||||||
|
* @return 成功
|
||||||
|
*/
|
||||||
|
CommonResult<Boolean> cancelUseCouponCard(CouponCardCancelUseReqDTO cancelUseReqDTO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得用户优惠劵的可用信息列表
|
||||||
|
*
|
||||||
|
* @param listReqDTO 查询信息
|
||||||
|
* @return 优惠劵的可用信息列表
|
||||||
|
*/
|
||||||
|
CommonResult<List<CouponCardAvailableRespDTO>> listAvailableCouponCards(CouponCardAvailableListReqDTO listReqDTO);
|
||||||
|
|
||||||
|
}
|
|
@ -1,12 +1,9 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.coupon;
|
package cn.iocoder.mall.promotion.api.rpc.coupon;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.validator.InEnum;
|
import cn.iocoder.common.framework.validator.InEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.CouponTemplateStatusEnum;
|
import cn.iocoder.mall.promotion.api.enums.coupon.template.CouponTemplateStatusEnum;
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.*;
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.*;
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public interface CouponRpc {
|
public interface CouponRpc {
|
||||||
|
|
||||||
// ========== 优惠劵(码)模板 ==========
|
// ========== 优惠劵(码)模板 ==========
|
||||||
|
@ -58,67 +55,4 @@ public interface CouponRpc {
|
||||||
Boolean updateCouponTemplateStatus(Integer adminId, Integer couponTemplateId,
|
Boolean updateCouponTemplateStatus(Integer adminId, Integer couponTemplateId,
|
||||||
@InEnum(value = CouponTemplateStatusEnum.class, message = "修改状态必须是 {value}") Integer status);
|
@InEnum(value = CouponTemplateStatusEnum.class, message = "修改状态必须是 {value}") Integer status);
|
||||||
|
|
||||||
// ========== 优惠劵 ==========
|
|
||||||
|
|
||||||
CouponCardPageRespDTO getCouponCardPage(CouponCardPageReqDTO couponCardPageDTO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 基于优惠劵模板,领取优惠劵
|
|
||||||
*
|
|
||||||
* @param userId 用户编号
|
|
||||||
* @param couponTemplateId 优惠劵模板
|
|
||||||
* @return 优惠劵
|
|
||||||
*/
|
|
||||||
CouponCardReqDTO addCouponCard(Integer userId, Integer couponTemplateId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 使用优惠劵下单
|
|
||||||
*
|
|
||||||
* @param userId 用户编号
|
|
||||||
* @param couponCardId 优惠劵编号
|
|
||||||
* @return 是否成功
|
|
||||||
*/
|
|
||||||
Boolean useCouponCard(Integer userId,
|
|
||||||
@NotNull(message = "优惠劵编号不能为空") Integer couponCardId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 取消优惠劵的使用
|
|
||||||
*
|
|
||||||
* @param userId 用户编号
|
|
||||||
* @param couponCardId 优惠劵编号
|
|
||||||
* @return 是否成功
|
|
||||||
*/
|
|
||||||
Boolean cancelUseCouponCard(Integer userId, Integer couponCardId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得指定优惠劵
|
|
||||||
*
|
|
||||||
* @param userId 用户编号
|
|
||||||
* @param couponCardId 优惠劵编号
|
|
||||||
* @return 优惠劵
|
|
||||||
*/
|
|
||||||
CouponCardDetailRespDTO getCouponCardDetail(Integer userId, Integer couponCardId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得用户所有优惠劵,并标明是否可用
|
|
||||||
* <p>
|
|
||||||
* 注意,spus 是作为条件,判断优惠劵是否可用
|
|
||||||
*
|
|
||||||
* @param userId 用户编号
|
|
||||||
* @param spus 匹配的商品/分类
|
|
||||||
* @return 优惠劵列表
|
|
||||||
*/
|
|
||||||
List<CouponCardAvailableRespDTO> getCouponCardList(Integer userId, List<CouponCardSpuRespDTO> spus);
|
|
||||||
|
|
||||||
// ========== 优惠码 ==========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 使用优惠码,兑换优惠劵
|
|
||||||
*
|
|
||||||
* @param userId 用户编号
|
|
||||||
* @param code 优惠码
|
|
||||||
* @return 优惠劵
|
|
||||||
*/
|
|
||||||
CouponCardReqDTO useCouponCode(Integer userId, String code);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,143 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.coupon.dto;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵明细 BO 。
|
|
||||||
*
|
|
||||||
* 主要是,会带上 {@link CouponTemplateReqDTO} 的信息
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCardDetailRespDTO implements Serializable {
|
|
||||||
|
|
||||||
// ========== 基本信息 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 优惠劵编号
|
|
||||||
*/
|
|
||||||
private Integer id;
|
|
||||||
/**
|
|
||||||
* 优惠劵(码)分组编号
|
|
||||||
*/
|
|
||||||
private Integer templateId;
|
|
||||||
/**
|
|
||||||
* 优惠劵名
|
|
||||||
*/
|
|
||||||
private String title;
|
|
||||||
// /**
|
|
||||||
// * 核销码
|
|
||||||
// */
|
|
||||||
// private String verifyCode;
|
|
||||||
/**
|
|
||||||
* 优惠码状态
|
|
||||||
*
|
|
||||||
* 1-未使用
|
|
||||||
* 2-已使用
|
|
||||||
* 3-已失效
|
|
||||||
*/
|
|
||||||
private Integer status;
|
|
||||||
|
|
||||||
// ========== 基本信息 END ==========
|
|
||||||
|
|
||||||
// ========== 领取情况 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*/
|
|
||||||
private Integer userId;
|
|
||||||
/**
|
|
||||||
* 领取类型
|
|
||||||
*
|
|
||||||
* 1 - 用户主动领取
|
|
||||||
* 2 - 后台自动发放
|
|
||||||
*/
|
|
||||||
private Integer takeType;
|
|
||||||
// ========== 领取情况 END ==========
|
|
||||||
|
|
||||||
// ========== 使用规则 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 是否设置满多少金额可用,单位:分
|
|
||||||
*/
|
|
||||||
private Integer priceAvailable;
|
|
||||||
/**
|
|
||||||
* 生效开始时间
|
|
||||||
*/
|
|
||||||
private Date validStartTime;
|
|
||||||
/**
|
|
||||||
* 生效结束时间
|
|
||||||
*/
|
|
||||||
private Date validEndTime;
|
|
||||||
// ========== 使用规则 END ==========
|
|
||||||
|
|
||||||
// ========== 使用效果 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 优惠类型
|
|
||||||
*
|
|
||||||
* 1-代金卷
|
|
||||||
* 2-折扣卷
|
|
||||||
*/
|
|
||||||
private Integer preferentialType;
|
|
||||||
/**
|
|
||||||
* 折扣
|
|
||||||
*/
|
|
||||||
private Integer percentOff;
|
|
||||||
/**
|
|
||||||
* 优惠金额,单位:分。
|
|
||||||
*/
|
|
||||||
private Integer priceOff;
|
|
||||||
/**
|
|
||||||
* 折扣上限,仅在 {@link #preferentialType} 等于 2 时生效。
|
|
||||||
*
|
|
||||||
* 例如,折扣上限为 20 元,当使用 8 折优惠券,订单金额为 1000 元时,最高只可折扣 20 元,而非 80 元。
|
|
||||||
*/
|
|
||||||
private Integer discountPriceLimit;
|
|
||||||
// ========== 使用效果 END ==========
|
|
||||||
|
|
||||||
// ========== 使用情况 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 是否使用
|
|
||||||
*/
|
|
||||||
private Boolean used;
|
|
||||||
/**
|
|
||||||
* 使用订单号
|
|
||||||
*/
|
|
||||||
private Integer usedOrderId;
|
|
||||||
/**
|
|
||||||
* 订单中优惠面值,单位:分
|
|
||||||
*/
|
|
||||||
private Integer usedPrice;
|
|
||||||
/**
|
|
||||||
* 使用时间
|
|
||||||
*/
|
|
||||||
private Date usedTime;
|
|
||||||
|
|
||||||
// TODO 芋艿,后续要加优惠劵的使用日志,因为下单后,可能会取消。
|
|
||||||
|
|
||||||
// ========== 使用情况 END ==========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
*/
|
|
||||||
private Date createTime;
|
|
||||||
|
|
||||||
// ========== FROM template 使用规则 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 可用范围的类型
|
|
||||||
*
|
|
||||||
* 10-全部(ALL):所有可用
|
|
||||||
* 20-部分(PART):部分商品可用,或指定商品可用
|
|
||||||
* 21-部分(PART):部分商品不可用,或指定商品可用
|
|
||||||
* 30-部分(PART):部分分类可用,或指定商品可用
|
|
||||||
* 31-部分(PART):部分分类不可用,或指定商品可用
|
|
||||||
*/
|
|
||||||
private Integer rangeType;
|
|
||||||
/**
|
|
||||||
* 指定商品 / 分类列表,使用逗号分隔商品编号
|
|
||||||
*/
|
|
||||||
private List<Integer> rangeValues;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.coupon.dto;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵分页 DTO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCardPageReqDTO implements Serializable {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*/
|
|
||||||
private Integer userId;
|
|
||||||
/**
|
|
||||||
* 状态
|
|
||||||
*/
|
|
||||||
private Integer status;
|
|
||||||
|
|
||||||
@NotNull(message = "页码不能为空")
|
|
||||||
private Integer pageNo;
|
|
||||||
@NotNull(message = "每页条数不能为空")
|
|
||||||
private Integer pageSize;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.coupon.dto;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵分页 BO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCardPageRespDTO implements Serializable {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵数组
|
|
||||||
*/
|
|
||||||
private List<CouponCardReqDTO> list;
|
|
||||||
/**
|
|
||||||
* 总量
|
|
||||||
*/
|
|
||||||
private Integer total;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,112 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.coupon.dto;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵 BO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCardReqDTO implements Serializable {
|
|
||||||
|
|
||||||
// ========== 基本信息 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 优惠劵编号
|
|
||||||
*/
|
|
||||||
private Integer id;
|
|
||||||
/**
|
|
||||||
* 优惠劵(码)分组编号
|
|
||||||
*/
|
|
||||||
private Integer templateId;
|
|
||||||
/**
|
|
||||||
* 优惠劵名
|
|
||||||
*/
|
|
||||||
private String title;
|
|
||||||
// /**
|
|
||||||
// * 核销码
|
|
||||||
// */
|
|
||||||
// private String verifyCode;
|
|
||||||
/**
|
|
||||||
* 优惠码状态
|
|
||||||
*
|
|
||||||
* 1-未使用
|
|
||||||
* 2-已使用
|
|
||||||
* 3-已失效
|
|
||||||
*/
|
|
||||||
private Integer status;
|
|
||||||
|
|
||||||
// ========== 基本信息 END ==========
|
|
||||||
|
|
||||||
// ========== 领取情况 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*/
|
|
||||||
private Integer userId;
|
|
||||||
/**
|
|
||||||
* 领取类型
|
|
||||||
*
|
|
||||||
* 1 - 用户主动领取
|
|
||||||
* 2 - 后台自动发放
|
|
||||||
*/
|
|
||||||
private Integer takeType;
|
|
||||||
// ========== 领取情况 END ==========
|
|
||||||
|
|
||||||
// ========== 使用规则 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 是否设置满多少金额可用,单位:分
|
|
||||||
*/
|
|
||||||
private Integer priceAvailable;
|
|
||||||
/**
|
|
||||||
* 生效开始时间
|
|
||||||
*/
|
|
||||||
private Date validStartTime;
|
|
||||||
/**
|
|
||||||
* 生效结束时间
|
|
||||||
*/
|
|
||||||
private Date validEndTime;
|
|
||||||
// ========== 使用规则 END ==========
|
|
||||||
|
|
||||||
// ========== 使用效果 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 优惠类型
|
|
||||||
*
|
|
||||||
* 1-代金卷
|
|
||||||
* 2-折扣卷
|
|
||||||
*/
|
|
||||||
private Integer preferentialType;
|
|
||||||
/**
|
|
||||||
* 折扣
|
|
||||||
*/
|
|
||||||
private Integer percentOff;
|
|
||||||
/**
|
|
||||||
* 优惠金额,单位:分。
|
|
||||||
*/
|
|
||||||
private Integer priceOff;
|
|
||||||
/**
|
|
||||||
* 折扣上限,仅在 {@link #preferentialType} 等于 2 时生效。
|
|
||||||
*
|
|
||||||
* 例如,折扣上限为 20 元,当使用 8 折优惠券,订单金额为 1000 元时,最高只可折扣 20 元,而非 80 元。
|
|
||||||
*/
|
|
||||||
private Integer discountPriceLimit;
|
|
||||||
// ========== 使用效果 END ==========
|
|
||||||
|
|
||||||
// ========== 使用情况 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 使用时间
|
|
||||||
*/
|
|
||||||
private Date usedTime;
|
|
||||||
|
|
||||||
// TODO 芋艿,后续要加优惠劵的使用日志,因为下单后,可能会取消。
|
|
||||||
|
|
||||||
// ========== 使用情况 END ==========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
*/
|
|
||||||
private Date createTime;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.coupon.dto;
|
package cn.iocoder.mall.promotion.api.rpc.coupon.dto;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.validator.InEnum;
|
import cn.iocoder.common.framework.validator.InEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.CouponTemplateDateTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.coupon.template.CouponTemplateDateTypeEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.PreferentialTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.PreferentialTypeEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.RangeTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.RangeTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
package cn.iocoder.mall.promotion.api.rpc.coupon.dto.card;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import javax.validation.constraints.Min;
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵可用信息列表 Request DTO
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CouponCardAvailableListReqDTO implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "用户编号不能为空")
|
||||||
|
private Integer userId;
|
||||||
|
/**
|
||||||
|
* 商品数组
|
||||||
|
*/
|
||||||
|
@NotEmpty(message = "商品数组不能为空")
|
||||||
|
private List<Item> items;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public static class Item implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品 SPU 编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "商品 SPU 编号不能为空")
|
||||||
|
private Integer spuId;
|
||||||
|
/**
|
||||||
|
* 商品 SKU 编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "商品 SKU 编号不能为空")
|
||||||
|
private Integer skuId;
|
||||||
|
/**
|
||||||
|
* 商品 SKU 编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "商品 Category 编号不能为空")
|
||||||
|
private Integer cid;
|
||||||
|
/**
|
||||||
|
* 商品数量
|
||||||
|
*/
|
||||||
|
@NotNull(message = "商品数量不能为空")
|
||||||
|
@Min(value = 1L, message = "最小商品数量 1")
|
||||||
|
private Integer quantity;
|
||||||
|
/**
|
||||||
|
* 商品价格,单位:分
|
||||||
|
*
|
||||||
|
* 为什么需要传递价格?因为商品的价格是经过计算,部署商品原始价格
|
||||||
|
*/
|
||||||
|
@NotNull(message = "商品价格不能为空")
|
||||||
|
private Integer price;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.coupon.dto;
|
package cn.iocoder.mall.promotion.api.rpc.coupon.dto.card;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -9,8 +10,9 @@ import lombok.experimental.Accessors;
|
||||||
* 注意,如果优惠劵不可用,标记 available = false ,并写明 unavailableReason 原因
|
* 注意,如果优惠劵不可用,标记 available = false ,并写明 unavailableReason 原因
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
public class CouponCardAvailableRespDTO extends CouponCardReqDTO {
|
public class CouponCardAvailableRespDTO extends CouponCardRespDTO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否可用
|
* 是否可用
|
|
@ -0,0 +1,27 @@
|
||||||
|
package cn.iocoder.mall.promotion.api.rpc.coupon.dto.card;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵取消使用 Request DTO
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CouponCardCancelUseReqDTO implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "用户编号不能为空")
|
||||||
|
private Integer userId;
|
||||||
|
/**
|
||||||
|
* 优惠劵编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "优惠劵编号不能为空")
|
||||||
|
private Integer couponCardId;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package cn.iocoder.mall.promotion.api.rpc.coupon.dto.card;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵创建 Request DTO
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CouponCardCreateReqDTO implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "用户编号不能为空")
|
||||||
|
private Integer userId;
|
||||||
|
/**
|
||||||
|
* 优惠劵模板编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "优惠劵模板编号不能为空")
|
||||||
|
private Integer couponTemplateId;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package cn.iocoder.mall.promotion.api.rpc.coupon.dto.card;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.PageParam;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵分页 DTO
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CouponCardPageReqDTO extends PageParam {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编号
|
||||||
|
*/
|
||||||
|
private Integer userId;
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package cn.iocoder.mall.promotion.api.rpc.coupon.dto.card;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵使用 Request DTO
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CouponCardUseReqDTO implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "用户编号不能为空")
|
||||||
|
private Integer userId;
|
||||||
|
/**
|
||||||
|
* 优惠劵编号
|
||||||
|
*/
|
||||||
|
@NotNull(message = "优惠劵编号不能为空")
|
||||||
|
private Integer couponCardId;
|
||||||
|
|
||||||
|
}
|
|
@ -17,7 +17,6 @@ public class PriceProductCalcReqDTO implements Serializable {
|
||||||
/**
|
/**
|
||||||
* 用户编号
|
* 用户编号
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "用户编号不能为空")
|
|
||||||
private Integer userId;
|
private Integer userId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.price.dto;
|
package cn.iocoder.mall.promotion.api.rpc.price.dto;
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.recommend.dto;
|
package cn.iocoder.mall.promotion.api.rpc.recommend.dto;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.validator.InEnum;
|
import cn.iocoder.common.framework.validator.InEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.recommend.ProductRecommendTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
import org.hibernate.validator.constraints.Length;
|
import org.hibernate.validator.constraints.Length;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.recommend.dto;
|
package cn.iocoder.mall.promotion.api.rpc.recommend.dto;
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.recommend.ProductRecommendTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.mall.promotion.api.rpc.recommend.dto;
|
package cn.iocoder.mall.promotion.api.rpc.recommend.dto;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.validator.InEnum;
|
import cn.iocoder.common.framework.validator.InEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.recommend.ProductRecommendTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
import org.hibernate.validator.constraints.Length;
|
import org.hibernate.validator.constraints.Length;
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
package cn.iocoder.mall.promotionservice.convert.coupon;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponCardDetailRespDTO;
|
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponCardReqDTO;
|
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
|
|
||||||
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardAvailableBO;
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import org.mapstruct.Mappings;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface CouponCardConvert {
|
|
||||||
|
|
||||||
CouponCardConvert INSTANCE = Mappers.getMapper(CouponCardConvert.class);
|
|
||||||
|
|
||||||
// @Mappings({})
|
|
||||||
// CouponCardBO convertToBO(CouponCardDO banner);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
List<CouponCardReqDTO> convertToDTO(List<CouponCardDO> cardList);
|
|
||||||
|
|
||||||
CouponCardReqDTO convertToSingleDTO(CouponCardDO card);
|
|
||||||
|
|
||||||
@Mappings({})
|
|
||||||
CouponCardDetailRespDTO convert2(CouponCardDO card);
|
|
||||||
|
|
||||||
CouponCardAvailableBO convertAvailBO(CouponCardDO card,boolean x);
|
|
||||||
|
|
||||||
//@Mappings({})
|
|
||||||
//CouponCardAvailableBO convert2(CouponCardDO card, boolean x); // TODO 芋艿,临时用来解决 mapstruct 无法正确匹配方法的问题
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,8 +1,13 @@
|
||||||
package cn.iocoder.mall.promotionservice.convert.coupon.card;
|
package cn.iocoder.mall.promotionservice.convert.coupon.card;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.PageResult;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardAvailableRespDTO;
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardRespDTO;
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardRespDTO;
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
|
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.Mapping;
|
||||||
|
import org.mapstruct.Named;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
|
@ -12,4 +17,10 @@ public interface CouponCardConvert {
|
||||||
|
|
||||||
CouponCardRespDTO convert(CouponCardDO bean);
|
CouponCardRespDTO convert(CouponCardDO bean);
|
||||||
|
|
||||||
|
@Mapping(source = "records", target = "list")
|
||||||
|
PageResult<CouponCardRespDTO> convertPage(IPage<CouponCardDO> page);
|
||||||
|
|
||||||
|
@Named("convertCouponCardDOToCouponCardAvailableRespDTO") // 避免生成的方法名的冲突
|
||||||
|
CouponCardAvailableRespDTO convert01(CouponCardDO bean);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity;
|
package cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity;
|
||||||
|
|
||||||
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityStatusEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityTypeEnum;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
|
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
|
||||||
|
@ -31,7 +33,7 @@ public class PromotionActivityDO extends BaseDO {
|
||||||
/**
|
/**
|
||||||
* 活动类型
|
* 活动类型
|
||||||
*
|
*
|
||||||
* 参见 {@link cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum} 枚举
|
* 参见 {@link PromotionActivityTypeEnum} 枚举
|
||||||
*/
|
*/
|
||||||
private Integer activityType;
|
private Integer activityType;
|
||||||
// /**
|
// /**
|
||||||
|
@ -42,7 +44,7 @@ public class PromotionActivityDO extends BaseDO {
|
||||||
/**
|
/**
|
||||||
* 活动状态
|
* 活动状态
|
||||||
*
|
*
|
||||||
* 参见 {@link cn.iocoder.mall.promotion.api.enums.PromotionActivityStatusEnum} 枚举
|
* 参见 {@link PromotionActivityStatusEnum} 枚举
|
||||||
*/
|
*/
|
||||||
private Integer status;
|
private Integer status;
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon;
|
package cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon;
|
||||||
|
|
||||||
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -9,7 +11,9 @@ import java.util.Date;
|
||||||
/**
|
/**
|
||||||
* 优惠劵 DO
|
* 优惠劵 DO
|
||||||
*/
|
*/
|
||||||
|
@TableName("coupon_card")
|
||||||
@Data
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
public class CouponCardDO extends BaseDO {
|
public class CouponCardDO extends BaseDO {
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
package cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon;
|
package cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon;
|
||||||
|
|
||||||
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.coupon.template.CouponTemplateStatusEnum;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -11,7 +14,9 @@ import java.util.Date;
|
||||||
*
|
*
|
||||||
* 当用户领取时,会生成 {@link CouponCardDO} 优惠劵(码)。
|
* 当用户领取时,会生成 {@link CouponCardDO} 优惠劵(码)。
|
||||||
*/
|
*/
|
||||||
|
@TableName("coupon_template")
|
||||||
@Data
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
public class CouponTemplateDO extends BaseDO {
|
public class CouponTemplateDO extends BaseDO {
|
||||||
|
|
||||||
|
@ -38,7 +43,7 @@ public class CouponTemplateDO extends BaseDO {
|
||||||
/**
|
/**
|
||||||
* 优惠码状态
|
* 优惠码状态
|
||||||
*
|
*
|
||||||
* {@link cn.iocoder.mall.promotion.api.enums.CouponTemplateStatusEnum}
|
* {@link CouponTemplateStatusEnum}
|
||||||
*
|
*
|
||||||
* 当优惠劵(码)开启中,可以手动操作,设置禁用中。
|
* 当优惠劵(码)开启中,可以手动操作,设置禁用中。
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2,7 +2,7 @@ package cn.iocoder.mall.promotionservice.dal.mysql.dataobject.recommend;
|
||||||
|
|
||||||
|
|
||||||
import cn.iocoder.mall.mybatis.core.dataobject.DeletableDO;
|
import cn.iocoder.mall.mybatis.core.dataobject.DeletableDO;
|
||||||
import cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.recommend.ProductRecommendTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
|
|
@ -1,36 +1,38 @@
|
||||||
package cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon;
|
package cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon;
|
||||||
|
|
||||||
|
import cn.iocoder.mall.mybatis.core.query.QueryWrapperX;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardPageReqDTO;
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
|
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface CouponCardMapper {
|
public interface CouponCardMapper extends BaseMapper<CouponCardDO> {
|
||||||
|
|
||||||
CouponCardDO selectById(@Param("id") Integer id);
|
default List<CouponCardDO> selectListByUserIdAndStatus(Integer userId, Integer status) {
|
||||||
|
return selectList(new QueryWrapper<CouponCardDO>().eq("user_id", userId)
|
||||||
|
.eq("status", status));
|
||||||
|
}
|
||||||
|
|
||||||
List<CouponCardDO> selectListByUserIdAndStatus(@Param("userId") Integer userId,
|
default int selectCountByUserIdAndTemplateId(Integer userId, Integer templateId) {
|
||||||
@Param("status") Integer status);
|
return selectCount(new QueryWrapper<CouponCardDO>().eq("user_id", userId)
|
||||||
|
.eq("template_id", templateId));
|
||||||
|
}
|
||||||
|
|
||||||
List<CouponCardDO> selectListByPage(@Param("userId") Integer userId,
|
default int updateByIdAndStatus(Integer id, Integer status, CouponCardDO updateObj) {
|
||||||
@Param("status") Integer status,
|
return update(updateObj, new QueryWrapper<CouponCardDO>().eq("id", id)
|
||||||
@Param("offset") Integer offset,
|
.eq("status", status));
|
||||||
@Param("limit") Integer limit);
|
}
|
||||||
|
|
||||||
Integer selectCountByPage(@Param("userId") Integer userId,
|
default IPage<CouponCardDO> selectPage(CouponCardPageReqDTO pageReqDTO) {
|
||||||
@Param("status") Integer status);
|
return selectPage(new Page<>(pageReqDTO.getPageNo(), pageReqDTO.getPageSize()),
|
||||||
|
new QueryWrapperX<CouponCardDO>().eqIfPresent("user_id", pageReqDTO.getUserId())
|
||||||
int selectCountByUserIdAndTemplateId(@Param("userId") Integer userId,
|
.eqIfPresent("status", pageReqDTO.getStatus()));
|
||||||
@Param("templateId") Integer templateId);
|
}
|
||||||
|
|
||||||
void insert(CouponCardDO couponCardDO);
|
|
||||||
|
|
||||||
int update(CouponCardDO couponCardDO);
|
|
||||||
|
|
||||||
int updateByIdAndStatus(@Param("id") Integer id,
|
|
||||||
@Param("status") Integer status,
|
|
||||||
@Param("updateObj") CouponCardDO updateObj);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,14 @@
|
||||||
package cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon;
|
package cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon;
|
||||||
|
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO;
|
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface CouponTemplateMapper {
|
public interface CouponTemplateMapper extends BaseMapper<CouponTemplateDO> {
|
||||||
|
|
||||||
CouponTemplateDO selectById(@Param("id") Integer id);
|
|
||||||
|
|
||||||
List<CouponTemplateDO> selectListByIds(@Param("ids") Collection<Integer> ids);
|
|
||||||
|
|
||||||
List<CouponTemplateDO> selectListByPage(@Param("type") Integer type,
|
List<CouponTemplateDO> selectListByPage(@Param("type") Integer type,
|
||||||
@Param("title") String title,
|
@Param("title") String title,
|
||||||
|
@ -26,10 +22,14 @@ public interface CouponTemplateMapper {
|
||||||
@Param("status") Integer status,
|
@Param("status") Integer status,
|
||||||
@Param("preferentialType") Integer preferentialType);
|
@Param("preferentialType") Integer preferentialType);
|
||||||
|
|
||||||
void insert(CouponTemplateDO couponTemplate);
|
/**
|
||||||
|
* 更新优惠劵模板已领取的数量
|
||||||
int update(CouponTemplateDO couponTemplate);
|
*
|
||||||
|
* 如果超过领取上限,则返回 0
|
||||||
|
*
|
||||||
|
* @param id 优惠劵模板编号
|
||||||
|
* @return 更新数量
|
||||||
|
*/
|
||||||
int updateStatFetchNumIncr(@Param("id") Integer id);
|
int updateStatFetchNumIncr(@Param("id") Integer id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
package cn.iocoder.mall.promotionservice.manager.coupon.card;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.PageResult;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.*;
|
||||||
|
import cn.iocoder.mall.promotionservice.service.coupon.CouponCardService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Validated
|
||||||
|
public class CouponCardManager {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CouponCardService couponCardService;
|
||||||
|
|
||||||
|
public PageResult<CouponCardRespDTO> pageCouponCard(CouponCardPageReqDTO pageReqDTO) {
|
||||||
|
return couponCardService.pageCouponCard(pageReqDTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer createCouponCard(CouponCardCreateReqDTO createReqDTO) {
|
||||||
|
return couponCardService.createCouponCard(createReqDTO.getUserId(), createReqDTO.getCouponTemplateId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean useCouponCard(CouponCardUseReqDTO useReqDTO) {
|
||||||
|
couponCardService.useCouponCard(useReqDTO.getUserId(), useReqDTO.getCouponCardId());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean cancelUseCouponCard(CouponCardCancelUseReqDTO cancelUseReqDTO) {
|
||||||
|
couponCardService.cancelUseCouponCard(cancelUseReqDTO.getUserId(), cancelUseReqDTO.getCouponCardId());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CouponCardAvailableRespDTO> listAvailableCouponCards(CouponCardAvailableListReqDTO listReqDTO) {
|
||||||
|
return couponCardService.listAvailableCouponCards(listReqDTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -9,6 +9,8 @@ import cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO;
|
||||||
import cn.iocoder.mall.productservice.rpc.spu.ProductSpuRpc;
|
import cn.iocoder.mall.productservice.rpc.spu.ProductSpuRpc;
|
||||||
import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO;
|
import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO;
|
||||||
import cn.iocoder.mall.promotion.api.enums.*;
|
import cn.iocoder.mall.promotion.api.enums.*;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityStatusEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityTypeEnum;
|
||||||
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
|
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardRespDTO;
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardRespDTO;
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.template.CouponTemplateRespDTO;
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.template.CouponTemplateRespDTO;
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
package cn.iocoder.mall.promotionservice.rpc.coupon;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
|
import cn.iocoder.common.framework.vo.PageResult;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.CouponCardRpc;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.*;
|
||||||
|
import cn.iocoder.mall.promotionservice.manager.coupon.card.CouponCardManager;
|
||||||
|
import org.apache.dubbo.config.annotation.DubboService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.common.framework.vo.CommonResult.success;
|
||||||
|
|
||||||
|
@DubboService
|
||||||
|
public class CouponCardRpcImpl implements CouponCardRpc {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CouponCardManager couponCardManager;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<PageResult<CouponCardRespDTO>> pageCouponCard(CouponCardPageReqDTO pageReqDTO) {
|
||||||
|
return success(couponCardManager.pageCouponCard(pageReqDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<Integer> createCouponCard(CouponCardCreateReqDTO createReqDTO) {
|
||||||
|
return success(couponCardManager.createCouponCard(createReqDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<Boolean> useCouponCard(CouponCardUseReqDTO useReqDTO) {
|
||||||
|
return success(couponCardManager.useCouponCard(useReqDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<Boolean> cancelUseCouponCard(CouponCardCancelUseReqDTO cancelUseReqDTO) {
|
||||||
|
return success(couponCardManager.cancelUseCouponCard(cancelUseReqDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<List<CouponCardAvailableRespDTO>> listAvailableCouponCards(CouponCardAvailableListReqDTO listReqDTO) {
|
||||||
|
return success(couponCardManager.listAvailableCouponCards(listReqDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.activity;
|
package cn.iocoder.mall.promotionservice.service.activity;
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityTypeEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.RangeTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.RangeTypeEnum;
|
||||||
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityListReqDTO;
|
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityListReqDTO;
|
||||||
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
|
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.activity.bo;
|
package cn.iocoder.mall.promotionservice.service.activity.bo;
|
||||||
|
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityStatusEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
@ -22,13 +24,13 @@ public class PromotionActivityBO implements Serializable {
|
||||||
/**
|
/**
|
||||||
* 活动类型
|
* 活动类型
|
||||||
*
|
*
|
||||||
* 参见 {@link cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum} 枚举
|
* 参见 {@link PromotionActivityTypeEnum} 枚举
|
||||||
*/
|
*/
|
||||||
private Integer activityType;
|
private Integer activityType;
|
||||||
/**
|
/**
|
||||||
* 活动状态
|
* 活动状态
|
||||||
*
|
*
|
||||||
* 参见 {@link cn.iocoder.mall.promotion.api.enums.PromotionActivityStatusEnum} 枚举
|
* 参见 {@link PromotionActivityStatusEnum} 枚举
|
||||||
*/
|
*/
|
||||||
private Integer status;
|
private Integer status;
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,14 +1,34 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.coupon;
|
package cn.iocoder.mall.promotionservice.service.coupon;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
|
||||||
|
import cn.iocoder.common.framework.util.CollectionUtils;
|
||||||
|
import cn.iocoder.common.framework.util.DateUtil;
|
||||||
|
import cn.iocoder.common.framework.util.StringUtils;
|
||||||
|
import cn.iocoder.common.framework.vo.PageResult;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.PromotionErrorCodeConstants;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.RangeTypeEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.coupon.card.CouponCardStatusEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.coupon.card.CouponCardTakeTypeEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.coupon.template.CouponTemplateDateTypeEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.coupon.template.CouponTemplateStatusEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.enums.coupon.template.CouponTemplateTypeEnum;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardAvailableListReqDTO;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardAvailableRespDTO;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardPageReqDTO;
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardRespDTO;
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardRespDTO;
|
||||||
import cn.iocoder.mall.promotionservice.convert.coupon.card.CouponCardConvert;
|
import cn.iocoder.mall.promotionservice.convert.coupon.card.CouponCardConvert;
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
|
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
|
||||||
|
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO;
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponCardMapper;
|
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponCardMapper;
|
||||||
|
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponTemplateMapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 优惠劵 Service
|
* 优惠劵 Service
|
||||||
|
@ -19,6 +39,8 @@ public class CouponCardService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CouponCardMapper couponCardMapper;
|
private CouponCardMapper couponCardMapper;
|
||||||
|
@Autowired
|
||||||
|
private CouponTemplateMapper couponTemplateMapper;
|
||||||
|
|
||||||
public CouponCardRespDTO getCouponCard(Integer userId, Integer couponCardId) {
|
public CouponCardRespDTO getCouponCard(Integer userId, Integer couponCardId) {
|
||||||
CouponCardDO card = couponCardMapper.selectById(couponCardId);
|
CouponCardDO card = couponCardMapper.selectById(couponCardId);
|
||||||
|
@ -31,4 +53,199 @@ public class CouponCardService {
|
||||||
return CouponCardConvert.INSTANCE.convert(card);
|
return CouponCardConvert.INSTANCE.convert(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得优惠劵分页
|
||||||
|
*
|
||||||
|
* @param pageReqDTO 优惠劵分页查询
|
||||||
|
* @return 优惠劵分页结果
|
||||||
|
*/
|
||||||
|
public PageResult<CouponCardRespDTO> pageCouponCard(CouponCardPageReqDTO pageReqDTO) {
|
||||||
|
IPage<CouponCardDO> couponCardDOPage = couponCardMapper.selectPage(pageReqDTO);
|
||||||
|
return CouponCardConvert.INSTANCE.convertPage(couponCardDOPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给用户添加优惠劵
|
||||||
|
*
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @param couponTemplateId 优惠劵模板编号
|
||||||
|
* @return 优惠劵编号
|
||||||
|
*/
|
||||||
|
@Transactional
|
||||||
|
public Integer createCouponCard(Integer userId, Integer couponTemplateId) {
|
||||||
|
// 校验 CouponCardTemplate 存在
|
||||||
|
CouponTemplateDO template = couponTemplateMapper.selectById(couponTemplateId);
|
||||||
|
if (template == null) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_NOT_EXISTS.getCode());
|
||||||
|
}
|
||||||
|
// 校验 CouponCardTemplate 是 CARD
|
||||||
|
if (!CouponTemplateTypeEnum.CARD.getValue().equals(template.getType())) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_NOT_CARD.getCode());
|
||||||
|
}
|
||||||
|
// 校验 CouponCardTemplate 状态是否开启
|
||||||
|
if (!CouponTemplateStatusEnum.ENABLE.getValue().equals(template.getStatus())) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_STATUS_NOT_ENABLE.getCode());
|
||||||
|
}
|
||||||
|
// 校验 CouponCardTemplate 是否到达可领取的上限
|
||||||
|
if (template.getStatFetchNum() > template.getTotal()) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_TOTAL_NOT_ENOUGH.getCode());
|
||||||
|
}
|
||||||
|
// 校验单人可领取优惠劵是否到达上限
|
||||||
|
if (couponCardMapper.selectCountByUserIdAndTemplateId(userId, couponTemplateId) > template.getQuota()) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA.getCode());
|
||||||
|
}
|
||||||
|
// 增加优惠劵已领取量
|
||||||
|
int updateTemplateCount = couponTemplateMapper.updateStatFetchNumIncr(couponTemplateId);
|
||||||
|
if (updateTemplateCount == 0) { // 超过 CouponCardTemplate 发放量
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA.getCode());
|
||||||
|
}
|
||||||
|
// 创建优惠劵
|
||||||
|
// 1. 基本信息 + 领取情况
|
||||||
|
CouponCardDO card = new CouponCardDO()
|
||||||
|
.setTemplateId(couponTemplateId)
|
||||||
|
.setTitle(template.getTitle())
|
||||||
|
.setStatus(CouponCardStatusEnum.UNUSED.getValue())
|
||||||
|
.setUserId(userId)
|
||||||
|
.setTakeType(CouponCardTakeTypeEnum.BY_USER.getValue()); // TODO 需要改
|
||||||
|
// 2. 使用规则
|
||||||
|
card.setPriceAvailable(template.getPriceAvailable());
|
||||||
|
setCouponCardValidTime(card, template);
|
||||||
|
// 3. 使用效果
|
||||||
|
card.setPreferentialType(template.getPreferentialType())
|
||||||
|
.setPriceOff(template.getPriceOff())
|
||||||
|
.setPercentOff(template.getPercentOff()).setDiscountPriceLimit(template.getDiscountPriceLimit());
|
||||||
|
// 保存优惠劵模板到数据库
|
||||||
|
couponCardMapper.insert(card);
|
||||||
|
// 返回成功
|
||||||
|
return card.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户使用优惠劵
|
||||||
|
*
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @param couponCardId 优惠劵编号
|
||||||
|
*/
|
||||||
|
public void useCouponCard(Integer userId, Integer couponCardId) {
|
||||||
|
// 查询优惠劵
|
||||||
|
CouponCardDO card = couponCardMapper.selectById(couponCardId);
|
||||||
|
if (card == null) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_NOT_EXISTS.getCode());
|
||||||
|
}
|
||||||
|
if (!userId.equals(card.getUserId())) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_ERROR_USER.getCode());
|
||||||
|
}
|
||||||
|
if (!CouponCardStatusEnum.UNUSED.getValue().equals(card.getStatus())) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_UNUSED.getCode());
|
||||||
|
}
|
||||||
|
if (DateUtil.isBetween(card.getValidStartTime(), card.getValidEndTime())) { // 为避免定时器没跑,实际优惠劵已经过期
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_UNUSED.getCode());
|
||||||
|
}
|
||||||
|
// 更新优惠劵已使用
|
||||||
|
int updateCount = couponCardMapper.updateByIdAndStatus(card.getId(), CouponCardStatusEnum.UNUSED.getValue(),
|
||||||
|
new CouponCardDO().setStatus(CouponCardStatusEnum.USED.getValue()).setUsedTime(new Date()));
|
||||||
|
if (updateCount == 0) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_UNUSED.getCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户取消使用优惠劵
|
||||||
|
*
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @param couponCardId 优惠劵编号
|
||||||
|
*/
|
||||||
|
public void cancelUseCouponCard(Integer userId, Integer couponCardId) {
|
||||||
|
// 查询优惠劵
|
||||||
|
CouponCardDO card = couponCardMapper.selectById(couponCardId);
|
||||||
|
if (card == null) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_NOT_EXISTS.getCode());
|
||||||
|
}
|
||||||
|
if (!userId.equals(card.getUserId())) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_ERROR_USER.getCode());
|
||||||
|
}
|
||||||
|
if (!CouponCardStatusEnum.USED.getValue().equals(card.getStatus())) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_USED.getCode());
|
||||||
|
}
|
||||||
|
// 更新优惠劵已使用
|
||||||
|
int updateCount = couponCardMapper.updateByIdAndStatus(card.getId(), CouponCardStatusEnum.USED.getValue(),
|
||||||
|
new CouponCardDO().setStatus(CouponCardStatusEnum.UNUSED.getValue())); // TODO 芋艿,usedTime 未设置空,后面处理。
|
||||||
|
if (updateCount == 0) {
|
||||||
|
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_USED.getCode());
|
||||||
|
}
|
||||||
|
// 有一点要注意,更新会未使用时,优惠劵可能已经过期了,直接让定时器跑过期,这里不做处理。
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得用户优惠劵的可用信息列表
|
||||||
|
*
|
||||||
|
* @param listReqDTO 查询信息
|
||||||
|
* @return 优惠劵的可用信息列表
|
||||||
|
*/
|
||||||
|
public List<CouponCardAvailableRespDTO> listAvailableCouponCards(CouponCardAvailableListReqDTO listReqDTO) {
|
||||||
|
// 查询用户未使用的优惠劵列表
|
||||||
|
List<CouponCardDO> cards = couponCardMapper.selectListByUserIdAndStatus(listReqDTO.getUserId(), CouponCardStatusEnum.UNUSED.getValue());
|
||||||
|
if (cards.isEmpty()) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
// 查询优惠劵模板集合
|
||||||
|
Map<Integer, CouponTemplateDO> templates = CollectionUtils.convertMap(
|
||||||
|
couponTemplateMapper.selectBatchIds(CollectionUtils.convertSet(cards, CouponCardDO::getTemplateId)),
|
||||||
|
CouponTemplateDO::getId);
|
||||||
|
// 逐个判断是否可用
|
||||||
|
return cards.stream().map(card -> {
|
||||||
|
CouponCardAvailableRespDTO availableCard = CouponCardConvert.INSTANCE.convert01(card);
|
||||||
|
availableCard.setUnavailableReason(isMatch(card, templates.get(card.getTemplateId()), listReqDTO.getItems()));
|
||||||
|
availableCard.setAvailable(availableCard.getUnavailableReason() == null);
|
||||||
|
return availableCard;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 匹配商品是否可以使用指定优惠劵
|
||||||
|
*
|
||||||
|
* @param card 优惠劵
|
||||||
|
* @param template 优惠劵模板
|
||||||
|
* @param items 商品 SKU 数组
|
||||||
|
* @return 如果不匹配,返回原因
|
||||||
|
*/
|
||||||
|
private String isMatch(CouponCardDO card, CouponTemplateDO template, List<CouponCardAvailableListReqDTO.Item> items) {
|
||||||
|
int totalPrice = 0;
|
||||||
|
if (RangeTypeEnum.ALL.getValue().equals(template.getRangeType())) {
|
||||||
|
totalPrice = items.stream().mapToInt(spu -> spu.getPrice() * spu.getQuantity()).sum();
|
||||||
|
} else if (RangeTypeEnum.PRODUCT_INCLUDE_PART.getValue().equals(template.getRangeType())) {
|
||||||
|
List<Integer> spuIds = StringUtils.splitToInt(template.getRangeValues(), ",");
|
||||||
|
totalPrice = items.stream().mapToInt(spu -> spuIds.contains(spu.getSpuId()) ? spu.getPrice() * spu.getQuantity() : 0).sum();
|
||||||
|
} else if (RangeTypeEnum.PRODUCT_EXCLUDE_PART.getValue().equals(template.getRangeType())) {
|
||||||
|
List<Integer> spuIds = StringUtils.splitToInt(template.getRangeValues(), ",");
|
||||||
|
totalPrice = items.stream().mapToInt(spu -> !spuIds.contains(spu.getSpuId()) ? spu.getPrice() * spu.getQuantity() : 0).sum();
|
||||||
|
} else if (RangeTypeEnum.CATEGORY_INCLUDE_PART.getValue().equals(template.getRangeType())) {
|
||||||
|
List<Integer> spuIds = StringUtils.splitToInt(template.getRangeValues(), ",");
|
||||||
|
totalPrice = items.stream().mapToInt(spu -> spuIds.contains(spu.getCid()) ? spu.getPrice() * spu.getQuantity() : 0).sum();
|
||||||
|
} else if (RangeTypeEnum.CATEGORY_EXCLUDE_PART.getValue().equals(template.getRangeType())) {
|
||||||
|
List<Integer> spuIds = StringUtils.splitToInt(template.getRangeValues(), ",");
|
||||||
|
totalPrice = items.stream().mapToInt(spu -> !spuIds.contains(spu.getCid()) ? spu.getPrice() * spu.getQuantity() : 0).sum();
|
||||||
|
}
|
||||||
|
// 总价为 0 时,说明优惠劵丫根不匹配
|
||||||
|
if (totalPrice == 0) {
|
||||||
|
return "优惠劵不匹配";
|
||||||
|
}
|
||||||
|
// 如果不满足金额
|
||||||
|
if (totalPrice < card.getPriceAvailable()) {
|
||||||
|
return String.format("差 %1$,.2f 元可用优惠劵", (card.getPriceAvailable() - totalPrice) / 100D);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCouponCardValidTime(CouponCardDO card, CouponTemplateDO template) {
|
||||||
|
if (CouponTemplateDateTypeEnum.FIXED_DATE.getValue().equals(template.getDateType())) {
|
||||||
|
card.setValidStartTime(template.getValidStartTime()).setValidEndTime(template.getValidEndTime());
|
||||||
|
} else if (CouponTemplateDateTypeEnum.FIXED_TERM.getValue().equals(template.getDateType())) {
|
||||||
|
Date validStartTime = DateUtil.getDayBegin(new Date());
|
||||||
|
card.setValidStartTime(DateUtil.addDate(validStartTime, Calendar.DAY_OF_YEAR, template.getFixedStartTerm()));
|
||||||
|
Date validEndTime = DateUtil.getDayEnd(card.getValidStartTime());
|
||||||
|
card.setValidEndTime(DateUtil.addDate(validEndTime, Calendar.DAY_OF_YEAR, template.getFixedEndTerm() - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,23 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.coupon;
|
package cn.iocoder.mall.promotionservice.service.coupon;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
|
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
|
||||||
import cn.iocoder.common.framework.util.DateUtil;
|
import cn.iocoder.mall.promotion.api.enums.PromotionErrorCodeConstants;
|
||||||
import cn.iocoder.mall.promotion.api.enums.*;
|
import cn.iocoder.mall.promotion.api.enums.coupon.template.CouponTemplateStatusEnum;
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.*;
|
import cn.iocoder.mall.promotion.api.enums.coupon.template.CouponTemplateTypeEnum;
|
||||||
import cn.iocoder.mall.promotionservice.convert.coupon.CouponCardConvert;
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponTemplatePageReqDTO;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponTemplatePageRespDTO;
|
||||||
import cn.iocoder.mall.promotionservice.convert.coupon.card.CouponTemplateConvert;
|
import cn.iocoder.mall.promotionservice.convert.coupon.card.CouponTemplateConvert;
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponCardDO;
|
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO;
|
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO;
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponCardMapper;
|
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponCardMapper;
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponTemplateMapper;
|
import cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponTemplateMapper;
|
||||||
import cn.iocoder.mall.promotionservice.service.coupon.bo.*;
|
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardTemplateAddBO;
|
||||||
import cn.iocoder.common.framework.util.*;
|
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardTemplateUpdateBO;
|
||||||
|
import cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCodeTemplateUpdateBO;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.Date;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Validated
|
@Validated
|
||||||
|
@ -86,7 +85,7 @@ public class CouponService {
|
||||||
}
|
}
|
||||||
// 更新优惠劵模板到数据库
|
// 更新优惠劵模板到数据库
|
||||||
CouponTemplateDO updateTemplateDO = CouponTemplateConvert.INSTANCE.convert(couponCardTemplateUpdateDTO);
|
CouponTemplateDO updateTemplateDO = CouponTemplateConvert.INSTANCE.convert(couponCardTemplateUpdateDTO);
|
||||||
couponTemplateMapper.update(updateTemplateDO);
|
couponTemplateMapper.updateById(updateTemplateDO);
|
||||||
// 返回成功
|
// 返回成功
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -99,7 +98,7 @@ public class CouponService {
|
||||||
}
|
}
|
||||||
// 更新到数据库
|
// 更新到数据库
|
||||||
CouponTemplateDO updateTemplateDO = new CouponTemplateDO().setId(couponTemplateId).setStatus(status);
|
CouponTemplateDO updateTemplateDO = new CouponTemplateDO().setId(couponTemplateId).setStatus(status);
|
||||||
couponTemplateMapper.update(updateTemplateDO);
|
couponTemplateMapper.updateById(updateTemplateDO);
|
||||||
// 返回成功
|
// 返回成功
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -149,200 +148,6 @@ public class CouponService {
|
||||||
|
|
||||||
// ========== 优惠劵 ==========
|
// ========== 优惠劵 ==========
|
||||||
|
|
||||||
public CouponCardPageRespDTO getCouponCardPage(CouponCardPageReqDTO couponCardPageDTO) {
|
|
||||||
CouponCardPageRespDTO pageBO = new CouponCardPageRespDTO();
|
|
||||||
// 查询分页数据
|
|
||||||
int offset = (couponCardPageDTO.getPageNo() - 1) * couponCardPageDTO.getPageSize();
|
|
||||||
pageBO.setList(CouponCardConvert.INSTANCE.convertToDTO(couponCardMapper.selectListByPage(
|
|
||||||
couponCardPageDTO.getUserId(), couponCardPageDTO.getStatus(),
|
|
||||||
offset, couponCardPageDTO.getPageSize())));
|
|
||||||
// 查询分页总数
|
|
||||||
pageBO.setTotal(couponCardMapper.selectCountByPage(
|
|
||||||
couponCardPageDTO.getUserId(), couponCardPageDTO.getStatus()));
|
|
||||||
return pageBO;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public CouponCardReqDTO addCouponCard(Integer userId, Integer couponTemplateId) {
|
|
||||||
// 校验 CouponCardTemplate 存在
|
|
||||||
CouponTemplateDO template = couponTemplateMapper.selectById(couponTemplateId);
|
|
||||||
if (template == null) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_NOT_EXISTS.getCode());
|
|
||||||
}
|
|
||||||
// 校验 CouponCardTemplate 是 CARD
|
|
||||||
if (!CouponTemplateTypeEnum.CARD.getValue().equals(template.getType())) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_NOT_CARD.getCode());
|
|
||||||
}
|
|
||||||
// 校验 CouponCardTemplate 状态是否开启
|
|
||||||
if (!CouponTemplateStatusEnum.ENABLE.getValue().equals(template.getStatus())) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_STATUS_NOT_ENABLE.getCode());
|
|
||||||
}
|
|
||||||
// 校验 CouponCardTemplate 是否到达可领取的上限
|
|
||||||
if (template.getStatFetchNum() > template.getTotal()) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_TOTAL_NOT_ENOUGH.getCode());
|
|
||||||
}
|
|
||||||
// 校验单人可领取优惠劵是否到达上限
|
|
||||||
if (couponCardMapper.selectCountByUserIdAndTemplateId(userId, couponTemplateId) > template.getQuota()) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA.getCode());
|
|
||||||
}
|
|
||||||
// 增加优惠劵已领取量
|
|
||||||
int updateTemplateCount = couponTemplateMapper.updateStatFetchNumIncr(couponTemplateId);
|
|
||||||
if (updateTemplateCount == 0) { // 超过 CouponCardTemplate 发放量
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA.getCode());
|
|
||||||
}
|
|
||||||
// 创建优惠劵
|
|
||||||
// 1. 基本信息 + 领取情况
|
|
||||||
CouponCardDO card = new CouponCardDO()
|
|
||||||
.setTemplateId(couponTemplateId)
|
|
||||||
.setTitle(template.getTitle())
|
|
||||||
.setStatus(CouponCardStatusEnum.UNUSED.getValue())
|
|
||||||
.setUserId(userId)
|
|
||||||
.setTakeType(CouponCardTakeTypeEnum.BY_USER.getValue()); // TODO 需要改
|
|
||||||
// 2. 使用规则
|
|
||||||
card.setPriceAvailable(template.getPriceAvailable());
|
|
||||||
setCouponCardValidTime(card, template);
|
|
||||||
// 3. 使用效果
|
|
||||||
card.setPreferentialType(template.getPreferentialType())
|
|
||||||
.setPriceOff(template.getPriceOff())
|
|
||||||
.setPercentOff(template.getPercentOff()).setDiscountPriceLimit(template.getDiscountPriceLimit());
|
|
||||||
// 保存优惠劵模板到数据库
|
|
||||||
card.setCreateTime(new Date());
|
|
||||||
couponCardMapper.insert(card);
|
|
||||||
// 返回成功
|
|
||||||
return CouponCardConvert.INSTANCE.convertToSingleDTO(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Boolean useCouponCard(Integer userId, Integer couponCardId) {
|
|
||||||
// 查询优惠劵
|
|
||||||
CouponCardDO card = couponCardMapper.selectById(couponCardId);
|
|
||||||
if (card == null) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_NOT_EXISTS.getCode());
|
|
||||||
}
|
|
||||||
if (!userId.equals(card.getUserId())) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_ERROR_USER.getCode());
|
|
||||||
}
|
|
||||||
if (!CouponCardStatusEnum.UNUSED.getValue().equals(card.getStatus())) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_UNUSED.getCode());
|
|
||||||
}
|
|
||||||
if (DateUtil.isBetween(card.getValidStartTime(), card.getValidEndTime())) { // 为避免定时器没跑,实际优惠劵已经过期
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_UNUSED.getCode());
|
|
||||||
}
|
|
||||||
// 更新优惠劵已使用
|
|
||||||
int updateCount = couponCardMapper.updateByIdAndStatus(card.getId(), CouponCardStatusEnum.UNUSED.getValue(),
|
|
||||||
new CouponCardDO().setStatus(CouponCardStatusEnum.USED.getValue()).setUsedTime(new Date()));
|
|
||||||
if (updateCount == 0) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_UNUSED.getCode());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Boolean cancelUseCouponCard(Integer userId, Integer couponCardId) {
|
|
||||||
// 查询优惠劵
|
|
||||||
CouponCardDO card = couponCardMapper.selectById(couponCardId);
|
|
||||||
if (card == null) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_NOT_EXISTS.getCode());
|
|
||||||
}
|
|
||||||
if (!userId.equals(card.getUserId())) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_ERROR_USER.getCode());
|
|
||||||
}
|
|
||||||
if (!CouponCardStatusEnum.USED.getValue().equals(card.getStatus())) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_USED.getCode());
|
|
||||||
}
|
|
||||||
// 更新优惠劵已使用
|
|
||||||
int updateCount = couponCardMapper.updateByIdAndStatus(card.getId(), CouponCardStatusEnum.USED.getValue(),
|
|
||||||
new CouponCardDO().setStatus(CouponCardStatusEnum.UNUSED.getValue())); // TODO 芋艿,usedTime 未设置空,后面处理。
|
|
||||||
if (updateCount == 0) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_STATUS_NOT_USED.getCode());
|
|
||||||
}
|
|
||||||
// 有一点要注意,更新会未使用时,优惠劵可能已经过期了,直接让定时器跑过期,这里不做处理。
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CouponCardDetailRespDTO getCouponCardDetail(Integer userId, Integer couponCardId) {
|
|
||||||
// 查询优惠劵
|
|
||||||
CouponCardDO card = couponCardMapper.selectById(couponCardId);
|
|
||||||
if (card == null) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_NOT_EXISTS.getCode());
|
|
||||||
}
|
|
||||||
if (!userId.equals(card.getUserId())) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_CARD_ERROR_USER.getCode());
|
|
||||||
}
|
|
||||||
// 查询优惠劵模板
|
|
||||||
CouponTemplateDO template = couponTemplateMapper.selectById(card.getTemplateId());
|
|
||||||
if (template == null) {
|
|
||||||
throw ServiceExceptionUtil.exception(PromotionErrorCodeConstants.COUPON_TEMPLATE_NOT_EXISTS.getCode());
|
|
||||||
}
|
|
||||||
// 拼接结果
|
|
||||||
CouponCardDetailRespDTO detail = CouponCardConvert.INSTANCE.convert2(card);
|
|
||||||
detail.setRangeType(template.getRangeType());
|
|
||||||
detail.setRangeValues(StringUtils.splitToInt(template.getRangeValues(), ","));
|
|
||||||
return detail;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<CouponCardAvailableBO> getCouponCardList(Integer userId, List<CouponCardSpuBO> spus) {
|
|
||||||
// 查询用户未使用的优惠劵列表
|
|
||||||
List<CouponCardDO> cards = couponCardMapper.selectListByUserIdAndStatus(userId, CouponCardStatusEnum.UNUSED.getValue());
|
|
||||||
if (cards.isEmpty()) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
// 查询优惠劵模板集合
|
|
||||||
Map<Integer, CouponTemplateDO> templates = couponTemplateMapper.selectListByIds(cards.stream().map(CouponCardDO::getTemplateId).collect(Collectors.toSet()))
|
|
||||||
.stream().collect(Collectors.toMap(CouponTemplateDO::getId, template -> template));
|
|
||||||
// 逐个判断是否可用
|
|
||||||
List<CouponCardAvailableBO> availableCards = cards.stream().map(card -> {
|
|
||||||
CouponCardAvailableBO availableCard = CouponCardConvert.INSTANCE.convertAvailBO(card, true);
|
|
||||||
availableCard.setUnavailableReason(isMatch(card, templates.get(card.getTemplateId()), spus));
|
|
||||||
availableCard.setAvailable(availableCard.getUnavailableReason() == null);
|
|
||||||
return availableCard;
|
|
||||||
}).collect(Collectors.toList());
|
|
||||||
// 返回结果
|
|
||||||
return availableCards;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setCouponCardValidTime(CouponCardDO card, CouponTemplateDO template) {
|
|
||||||
if (CouponTemplateDateTypeEnum.FIXED_DATE.getValue().equals(template.getDateType())) {
|
|
||||||
card.setValidStartTime(template.getValidStartTime()).setValidEndTime(template.getValidEndTime());
|
|
||||||
} else if (CouponTemplateDateTypeEnum.FIXED_TERM.getValue().equals(template.getDateType())) {
|
|
||||||
Date validStartTime = DateUtil.getDayBegin(new Date());
|
|
||||||
card.setValidStartTime(DateUtil.addDate(validStartTime, Calendar.DAY_OF_YEAR, template.getFixedStartTerm()));
|
|
||||||
Date validEndTime = DateUtil.getDayEnd(card.getValidStartTime());
|
|
||||||
card.setValidEndTime(DateUtil.addDate(validEndTime, Calendar.DAY_OF_YEAR, template.getFixedEndTerm() - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果匹配,则返回 null 即可。
|
|
||||||
private String isMatch(CouponCardDO card, CouponTemplateDO template, List<CouponCardSpuBO> spus) {
|
|
||||||
int totalPrice = 0;
|
|
||||||
if (RangeTypeEnum.ALL.getValue().equals(template.getRangeType())) {
|
|
||||||
totalPrice = spus.stream().mapToInt(spu -> spu.getPrice() * spu.getQuantity()).sum();
|
|
||||||
} else if (RangeTypeEnum.PRODUCT_INCLUDE_PART.getValue().equals(template.getRangeType())) {
|
|
||||||
List<Integer> spuIds = StringUtils.splitToInt(template.getRangeValues(), ",");
|
|
||||||
totalPrice = spus.stream().mapToInt(spu -> spuIds.contains(spu.getSpuId()) ? spu.getPrice() * spu.getQuantity() : 0).sum();
|
|
||||||
} else if (RangeTypeEnum.PRODUCT_EXCLUDE_PART.getValue().equals(template.getRangeType())) {
|
|
||||||
List<Integer> spuIds = StringUtils.splitToInt(template.getRangeValues(), ",");
|
|
||||||
totalPrice = spus.stream().mapToInt(spu -> !spuIds.contains(spu.getSpuId()) ? spu.getPrice() * spu.getQuantity() : 0).sum();
|
|
||||||
} else if (RangeTypeEnum.CATEGORY_INCLUDE_PART.getValue().equals(template.getRangeType())) {
|
|
||||||
List<Integer> spuIds = StringUtils.splitToInt(template.getRangeValues(), ",");
|
|
||||||
totalPrice = spus.stream().mapToInt(spu -> spuIds.contains(spu.getCategoryId()) ? spu.getPrice() * spu.getQuantity() : 0).sum();
|
|
||||||
} else if (RangeTypeEnum.CATEGORY_EXCLUDE_PART.getValue().equals(template.getRangeType())) {
|
|
||||||
List<Integer> spuIds = StringUtils.splitToInt(template.getRangeValues(), ",");
|
|
||||||
totalPrice = spus.stream().mapToInt(spu -> !spuIds.contains(spu.getCategoryId()) ? spu.getPrice() * spu.getQuantity() : 0).sum();
|
|
||||||
}
|
|
||||||
// 总价为 0 时,说明优惠劵丫根不匹配
|
|
||||||
if (totalPrice == 0) {
|
|
||||||
return "优惠劵不匹配";
|
|
||||||
}
|
|
||||||
// 如果不满足金额
|
|
||||||
if (totalPrice < card.getPriceAvailable()) {
|
|
||||||
return String.format("差 %1$,.2f 元可用优惠劵", (card.getPriceAvailable() - totalPrice) / 100D);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ========== 优惠码 ==========
|
|
||||||
|
|
||||||
public CouponCardReqDTO useCouponCode(Integer userId, String code) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.coupon.bo;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponCardReqDTO;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 可用优惠劵 BO
|
|
||||||
*
|
|
||||||
* 注意,如果优惠劵不可用,标记 available = false ,并写明 unavailableReason 原因
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCardAvailableBO extends CouponCardReqDTO {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否可用
|
|
||||||
*/
|
|
||||||
private Boolean available;
|
|
||||||
/**
|
|
||||||
* 不可用原因
|
|
||||||
*/
|
|
||||||
private String unavailableReason;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,143 +0,0 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.coupon.bo;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵明细 BO 。
|
|
||||||
*
|
|
||||||
* 主要是,会带上 {@link CouponTemplateBO} 的信息
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCardDetailBO implements Serializable {
|
|
||||||
|
|
||||||
// ========== 基本信息 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 优惠劵编号
|
|
||||||
*/
|
|
||||||
private Integer id;
|
|
||||||
/**
|
|
||||||
* 优惠劵(码)分组编号
|
|
||||||
*/
|
|
||||||
private Integer templateId;
|
|
||||||
/**
|
|
||||||
* 优惠劵名
|
|
||||||
*/
|
|
||||||
private String title;
|
|
||||||
// /**
|
|
||||||
// * 核销码
|
|
||||||
// */
|
|
||||||
// private String verifyCode;
|
|
||||||
/**
|
|
||||||
* 优惠码状态
|
|
||||||
*
|
|
||||||
* 1-未使用
|
|
||||||
* 2-已使用
|
|
||||||
* 3-已失效
|
|
||||||
*/
|
|
||||||
private Integer status;
|
|
||||||
|
|
||||||
// ========== 基本信息 END ==========
|
|
||||||
|
|
||||||
// ========== 领取情况 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*/
|
|
||||||
private Integer userId;
|
|
||||||
/**
|
|
||||||
* 领取类型
|
|
||||||
*
|
|
||||||
* 1 - 用户主动领取
|
|
||||||
* 2 - 后台自动发放
|
|
||||||
*/
|
|
||||||
private Integer takeType;
|
|
||||||
// ========== 领取情况 END ==========
|
|
||||||
|
|
||||||
// ========== 使用规则 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 是否设置满多少金额可用,单位:分
|
|
||||||
*/
|
|
||||||
private Integer priceAvailable;
|
|
||||||
/**
|
|
||||||
* 生效开始时间
|
|
||||||
*/
|
|
||||||
private Date validStartTime;
|
|
||||||
/**
|
|
||||||
* 生效结束时间
|
|
||||||
*/
|
|
||||||
private Date validEndTime;
|
|
||||||
// ========== 使用规则 END ==========
|
|
||||||
|
|
||||||
// ========== 使用效果 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 优惠类型
|
|
||||||
*
|
|
||||||
* 1-代金卷
|
|
||||||
* 2-折扣卷
|
|
||||||
*/
|
|
||||||
private Integer preferentialType;
|
|
||||||
/**
|
|
||||||
* 折扣
|
|
||||||
*/
|
|
||||||
private Integer percentOff;
|
|
||||||
/**
|
|
||||||
* 优惠金额,单位:分。
|
|
||||||
*/
|
|
||||||
private Integer priceOff;
|
|
||||||
/**
|
|
||||||
* 折扣上限,仅在 {@link #preferentialType} 等于 2 时生效。
|
|
||||||
*
|
|
||||||
* 例如,折扣上限为 20 元,当使用 8 折优惠券,订单金额为 1000 元时,最高只可折扣 20 元,而非 80 元。
|
|
||||||
*/
|
|
||||||
private Integer discountPriceLimit;
|
|
||||||
// ========== 使用效果 END ==========
|
|
||||||
|
|
||||||
// ========== 使用情况 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 是否使用
|
|
||||||
*/
|
|
||||||
private Boolean used;
|
|
||||||
/**
|
|
||||||
* 使用订单号
|
|
||||||
*/
|
|
||||||
private Integer usedOrderId;
|
|
||||||
/**
|
|
||||||
* 订单中优惠面值,单位:分
|
|
||||||
*/
|
|
||||||
private Integer usedPrice;
|
|
||||||
/**
|
|
||||||
* 使用时间
|
|
||||||
*/
|
|
||||||
private Date usedTime;
|
|
||||||
|
|
||||||
// TODO 芋艿,后续要加优惠劵的使用日志,因为下单后,可能会取消。
|
|
||||||
|
|
||||||
// ========== 使用情况 END ==========
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
*/
|
|
||||||
private Date createTime;
|
|
||||||
|
|
||||||
// ========== FROM template 使用规则 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 可用范围的类型
|
|
||||||
*
|
|
||||||
* 10-全部(ALL):所有可用
|
|
||||||
* 20-部分(PART):部分商品可用,或指定商品可用
|
|
||||||
* 21-部分(PART):部分商品不可用,或指定商品可用
|
|
||||||
* 30-部分(PART):部分分类可用,或指定商品可用
|
|
||||||
* 31-部分(PART):部分分类不可用,或指定商品可用
|
|
||||||
*/
|
|
||||||
private Integer rangeType;
|
|
||||||
/**
|
|
||||||
* 指定商品 / 分类列表,使用逗号分隔商品编号
|
|
||||||
*/
|
|
||||||
private List<Integer> rangeValues;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.coupon.bo;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponCardReqDTO;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵分页 BO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCardPageBO implements Serializable {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵数组
|
|
||||||
*/
|
|
||||||
private List<CouponCardReqDTO> list;
|
|
||||||
/**
|
|
||||||
* 总量
|
|
||||||
*/
|
|
||||||
private Integer total;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.coupon.bo;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.rpc.coupon.CouponRpc;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵商品 DTO
|
|
||||||
*
|
|
||||||
* 主要用于 {@link CouponRpc#getCouponCardList(Integer, List)}
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCardSpuBO implements Serializable {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 商品 SPU 编号
|
|
||||||
*/
|
|
||||||
private Integer spuId;
|
|
||||||
/**
|
|
||||||
* 商品 SKU 编号
|
|
||||||
*/
|
|
||||||
private Integer skuId;
|
|
||||||
/**
|
|
||||||
* 分类编号
|
|
||||||
*/
|
|
||||||
private Integer categoryId;
|
|
||||||
/**
|
|
||||||
* 价格
|
|
||||||
*/
|
|
||||||
private Integer price;
|
|
||||||
/**
|
|
||||||
* 数量
|
|
||||||
*/
|
|
||||||
private Integer quantity;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.coupon.bo;
|
package cn.iocoder.mall.promotionservice.service.coupon.bo;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.validator.InEnum;
|
import cn.iocoder.common.framework.validator.InEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.CouponTemplateDateTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.coupon.template.CouponTemplateDateTypeEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.PreferentialTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.PreferentialTypeEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.RangeTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.RangeTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.recommend.bo;
|
package cn.iocoder.mall.promotionservice.service.recommend.bo;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.validator.InEnum;
|
import cn.iocoder.common.framework.validator.InEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.recommend.ProductRecommendTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
import org.hibernate.validator.constraints.Length;
|
import org.hibernate.validator.constraints.Length;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.recommend.bo;
|
package cn.iocoder.mall.promotionservice.service.recommend.bo;
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.recommend.ProductRecommendTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.mall.promotionservice.service.recommend.bo;
|
package cn.iocoder.mall.promotionservice.service.recommend.bo;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.validator.InEnum;
|
import cn.iocoder.common.framework.validator.InEnum;
|
||||||
import cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum;
|
import cn.iocoder.mall.promotion.api.enums.recommend.ProductRecommendTypeEnum;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
import org.hibernate.validator.constraints.Length;
|
import org.hibernate.validator.constraints.Length;
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?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="cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponTemplateMapper">
|
||||||
|
|
||||||
|
<update id="updateStatFetchNumIncr" parameterType="Integer">
|
||||||
|
UPDATE coupon_template
|
||||||
|
SET stat_fetch_Num = stat_fetch_Num + 1
|
||||||
|
WHERE id = #{id}
|
||||||
|
AND total > stat_fetch_Num
|
||||||
|
</update>
|
||||||
|
|
||||||
|
</mapper>
|
|
@ -1,6 +1,6 @@
|
||||||
package cn.iocoder.mall.promotionservice.dal.mysql.mapper.activity;
|
package cn.iocoder.mall.promotionservice.dal.mysql.mapper.activity;
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.enums.PromotionActivityStatusEnum;
|
import cn.iocoder.mall.promotion.api.enums.activity.PromotionActivityStatusEnum;
|
||||||
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity.PromotionActivityDO;
|
import cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity.PromotionActivityDO;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.biz.dao;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.biz.dataobject.CouponCardDO;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface CouponCardMapper {
|
|
||||||
|
|
||||||
CouponCardDO selectById(@Param("id") Integer id);
|
|
||||||
|
|
||||||
List<CouponCardDO> selectListByUserIdAndStatus(@Param("userId") Integer userId,
|
|
||||||
@Param("status") Integer status);
|
|
||||||
|
|
||||||
List<CouponCardDO> selectListByPage(@Param("userId") Integer userId,
|
|
||||||
@Param("status") Integer status,
|
|
||||||
@Param("offset") Integer offset,
|
|
||||||
@Param("limit") Integer limit);
|
|
||||||
|
|
||||||
Integer selectCountByPage(@Param("userId") Integer userId,
|
|
||||||
@Param("status") Integer status);
|
|
||||||
|
|
||||||
int selectCountByUserIdAndTemplateId(@Param("userId") Integer userId,
|
|
||||||
@Param("templateId") Integer templateId);
|
|
||||||
|
|
||||||
void insert(CouponCardDO couponCardDO);
|
|
||||||
|
|
||||||
int update(CouponCardDO couponCardDO);
|
|
||||||
|
|
||||||
int updateByIdAndStatus(@Param("id") Integer id,
|
|
||||||
@Param("status") Integer status,
|
|
||||||
@Param("updateObj") CouponCardDO updateObj);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.biz.dao;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.biz.dataobject.CouponTemplateDO;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface CouponTemplateMapper {
|
|
||||||
|
|
||||||
CouponTemplateDO selectById(@Param("id") Integer id);
|
|
||||||
|
|
||||||
List<CouponTemplateDO> selectListByIds(@Param("ids") Collection<Integer> ids);
|
|
||||||
|
|
||||||
List<CouponTemplateDO> selectListByPage(@Param("type") Integer type,
|
|
||||||
@Param("title") String title,
|
|
||||||
@Param("status") Integer status,
|
|
||||||
@Param("preferentialType") Integer preferentialType,
|
|
||||||
@Param("offset") Integer offset,
|
|
||||||
@Param("limit") Integer limit);
|
|
||||||
|
|
||||||
Integer selectCountByPage(@Param("type") Integer type,
|
|
||||||
@Param("title") String title,
|
|
||||||
@Param("status") Integer status,
|
|
||||||
@Param("preferentialType") Integer preferentialType);
|
|
||||||
|
|
||||||
void insert(CouponTemplateDO couponTemplate);
|
|
||||||
|
|
||||||
int update(CouponTemplateDO couponTemplate);
|
|
||||||
|
|
||||||
int updateStatFetchNumIncr(@Param("id") Integer id);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,119 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.biz.dataobject;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵 DO
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCardDO extends BaseDO {
|
|
||||||
|
|
||||||
// ========== 基本信息 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 优惠劵编号
|
|
||||||
*/
|
|
||||||
private Integer id;
|
|
||||||
/**
|
|
||||||
* 优惠劵(码)分组编号,{@link CouponTemplateDO} 的 id
|
|
||||||
*/
|
|
||||||
private Integer templateId;
|
|
||||||
/**
|
|
||||||
* 优惠劵名
|
|
||||||
*
|
|
||||||
* 冗余自 {@link CouponTemplateDO} 的 title
|
|
||||||
*
|
|
||||||
* TODO 芋艿,暂时不考虑冗余的更新
|
|
||||||
*/
|
|
||||||
private String title;
|
|
||||||
// /**
|
|
||||||
// * 核销码
|
|
||||||
// */
|
|
||||||
// private String verifyCode;
|
|
||||||
/**
|
|
||||||
* 优惠码状态
|
|
||||||
*
|
|
||||||
* 1-未使用
|
|
||||||
* 2-已使用
|
|
||||||
* 3-已失效
|
|
||||||
*/
|
|
||||||
private Integer status;
|
|
||||||
|
|
||||||
// ========== 基本信息 END ==========
|
|
||||||
|
|
||||||
// ========== 领取情况 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*/
|
|
||||||
private Integer userId;
|
|
||||||
/**
|
|
||||||
* 领取类型
|
|
||||||
*
|
|
||||||
* 1 - 用户主动领取
|
|
||||||
* 2 - 后台自动发放
|
|
||||||
*/
|
|
||||||
private Integer takeType;
|
|
||||||
// ========== 领取情况 END ==========
|
|
||||||
|
|
||||||
// ========== 使用规则 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 是否设置满多少金额可用,单位:分
|
|
||||||
*/
|
|
||||||
private Integer priceAvailable;
|
|
||||||
/**
|
|
||||||
* 生效开始时间
|
|
||||||
*/
|
|
||||||
private Date validStartTime;
|
|
||||||
/**
|
|
||||||
* 生效结束时间
|
|
||||||
*/
|
|
||||||
private Date validEndTime;
|
|
||||||
// ========== 使用规则 END ==========
|
|
||||||
|
|
||||||
// ========== 使用效果 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 优惠类型
|
|
||||||
*
|
|
||||||
* 1-代金卷
|
|
||||||
* 2-折扣卷
|
|
||||||
*/
|
|
||||||
private Integer preferentialType;
|
|
||||||
/**
|
|
||||||
* 折扣
|
|
||||||
*/
|
|
||||||
private Integer percentOff;
|
|
||||||
/**
|
|
||||||
* 优惠金额,单位:分。
|
|
||||||
*/
|
|
||||||
private Integer priceOff;
|
|
||||||
/**
|
|
||||||
* 折扣上限,仅在 {@link #preferentialType} 等于 2 时生效。
|
|
||||||
*
|
|
||||||
* 例如,折扣上限为 20 元,当使用 8 折优惠券,订单金额为 1000 元时,最高只可折扣 20 元,而非 80 元。
|
|
||||||
*/
|
|
||||||
private Integer discountPriceLimit;
|
|
||||||
// ========== 使用效果 END ==========
|
|
||||||
|
|
||||||
// ========== 使用情况 BEGIN ==========
|
|
||||||
// /**
|
|
||||||
// * 使用订单号
|
|
||||||
// */
|
|
||||||
// private Integer usedOrderId; // TODO 芋艿,暂时不考虑这个字段
|
|
||||||
// /**
|
|
||||||
// * 订单中优惠面值,单位:分
|
|
||||||
// */
|
|
||||||
// private Integer usedPrice; // TODO 芋艿,暂时不考虑这个字段
|
|
||||||
/**
|
|
||||||
* 使用时间
|
|
||||||
*/
|
|
||||||
private Date usedTime;
|
|
||||||
|
|
||||||
// TODO 芋艿,后续要加优惠劵的使用日志,因为下单后,可能会取消。
|
|
||||||
|
|
||||||
// ========== 使用情况 END ==========
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.biz.dataobject;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠码
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponCodeDO extends BaseDO {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 编号
|
|
||||||
*/
|
|
||||||
private Integer id;
|
|
||||||
/**
|
|
||||||
* 模板编号 {@link CouponTemplateDO} 的 id
|
|
||||||
*/
|
|
||||||
private Integer templateId;
|
|
||||||
/**
|
|
||||||
* 优惠码
|
|
||||||
*/
|
|
||||||
private Integer code;
|
|
||||||
/**
|
|
||||||
* 领取时间
|
|
||||||
*/
|
|
||||||
private Date takeTime;
|
|
||||||
/**
|
|
||||||
* 领取用户编号
|
|
||||||
*/
|
|
||||||
private Integer userId;
|
|
||||||
/**
|
|
||||||
* 领取的优惠劵编号
|
|
||||||
*/
|
|
||||||
private Integer couponId;
|
|
||||||
|
|
||||||
// TODO 芋艿,后续要考虑状态的追踪
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,220 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.biz.dataobject;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵(码)模板 DO
|
|
||||||
*
|
|
||||||
* 当用户领取时,会生成 {@link CouponCardDO} 优惠劵(码)。
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class CouponTemplateDO extends BaseDO {
|
|
||||||
|
|
||||||
// ========== 基本信息 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 模板编号,自增唯一。
|
|
||||||
*/
|
|
||||||
private Integer id;
|
|
||||||
/**
|
|
||||||
* 标题
|
|
||||||
*/
|
|
||||||
private String title;
|
|
||||||
/**
|
|
||||||
* 使用说明
|
|
||||||
*/
|
|
||||||
private String description;
|
|
||||||
/**
|
|
||||||
* 类型
|
|
||||||
*
|
|
||||||
* 1-优惠劵
|
|
||||||
* 2-优惠码
|
|
||||||
*/
|
|
||||||
private Integer type;
|
|
||||||
/**
|
|
||||||
* 优惠码状态
|
|
||||||
*
|
|
||||||
* {@link cn.iocoder.mall.promotion.api.enums.CouponTemplateStatusEnum}
|
|
||||||
*
|
|
||||||
* 当优惠劵(码)开启中,可以手动操作,设置禁用中。
|
|
||||||
*/
|
|
||||||
private Integer status;
|
|
||||||
// /**
|
|
||||||
// * 是否可分享领取链接
|
|
||||||
// */
|
|
||||||
// private Boolean isShare;
|
|
||||||
// /**
|
|
||||||
// * 设置为失效时间
|
|
||||||
// */
|
|
||||||
// private Date invalidTime;
|
|
||||||
// /**
|
|
||||||
// * 删除时间
|
|
||||||
// */
|
|
||||||
// private Date deleteTime;
|
|
||||||
|
|
||||||
// ========== 基本信息 END ==========
|
|
||||||
|
|
||||||
// ========== 领取规则 BEGIN ==========
|
|
||||||
// /**
|
|
||||||
// * 是否限制领用者的等级
|
|
||||||
// *
|
|
||||||
// * 0-不限制
|
|
||||||
// * 大于0-领用者必须是这个等级编号
|
|
||||||
// *
|
|
||||||
// * 【优惠劵独有】
|
|
||||||
// */
|
|
||||||
// private Integer needUserLevel;
|
|
||||||
/**
|
|
||||||
* 每人限领个数
|
|
||||||
*
|
|
||||||
* null - 则表示不限制
|
|
||||||
*/
|
|
||||||
private Integer quota;
|
|
||||||
/**
|
|
||||||
* 发行总量
|
|
||||||
*/
|
|
||||||
private Integer total;
|
|
||||||
// ========== 领取规则 END ==========
|
|
||||||
|
|
||||||
// ========== 使用规则 BEGIN ==========
|
|
||||||
// /**
|
|
||||||
// * 是否仅原价购买商品时可用
|
|
||||||
// *
|
|
||||||
// * true-是
|
|
||||||
// * false-否
|
|
||||||
// */
|
|
||||||
// private Boolean isForbidPreference;
|
|
||||||
/**
|
|
||||||
* 是否设置满多少金额可用,单位:分
|
|
||||||
*
|
|
||||||
* 0-不限制
|
|
||||||
* 大于0-多少金额可用
|
|
||||||
*/
|
|
||||||
private Integer priceAvailable;
|
|
||||||
/**
|
|
||||||
* 可用范围的类型
|
|
||||||
*
|
|
||||||
* 10-全部(ALL):所有可用
|
|
||||||
* 20-部分(PART):部分商品可用,或指定商品可用
|
|
||||||
* 21-部分(PART):部分商品不可用,或指定商品可用
|
|
||||||
* 30-部分(PART):部分分类可用,或指定商品可用
|
|
||||||
* 31-部分(PART):部分分类不可用,或指定商品可用
|
|
||||||
*/
|
|
||||||
private Integer rangeType;
|
|
||||||
/**
|
|
||||||
* 指定商品 / 分类列表,使用逗号分隔商品编号
|
|
||||||
*/
|
|
||||||
private String rangeValues;
|
|
||||||
/**
|
|
||||||
* 生效日期类型
|
|
||||||
*
|
|
||||||
* 1-固定日期
|
|
||||||
* 2-领取日期:领到券 {@link #fixedStartTerm} 日开始 N 天内有效
|
|
||||||
*/
|
|
||||||
private Integer dateType;
|
|
||||||
/**
|
|
||||||
* 固定日期-生效开始时间
|
|
||||||
*/
|
|
||||||
private Date validStartTime;
|
|
||||||
/**
|
|
||||||
* 固定日期-生效结束时间
|
|
||||||
*/
|
|
||||||
private Date validEndTime;
|
|
||||||
/**
|
|
||||||
* 领取日期-开始天数
|
|
||||||
*
|
|
||||||
* 例如,0-当天;1-次天
|
|
||||||
*/
|
|
||||||
private Integer fixedStartTerm;
|
|
||||||
/**
|
|
||||||
* 领取日期-结束天数
|
|
||||||
*/
|
|
||||||
private Integer fixedEndTerm;
|
|
||||||
// /**
|
|
||||||
// * 是否到期前4天发送提醒
|
|
||||||
// *
|
|
||||||
// * true-发送
|
|
||||||
// * false-不发送
|
|
||||||
// */
|
|
||||||
// private Boolean expireNotice;
|
|
||||||
// ========== 使用规则 END ==========
|
|
||||||
|
|
||||||
// ========== 使用效果 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 优惠类型
|
|
||||||
*
|
|
||||||
* 1-代金卷
|
|
||||||
* 2-折扣卷
|
|
||||||
*/
|
|
||||||
private Integer preferentialType;
|
|
||||||
/**
|
|
||||||
* 折扣百分比。
|
|
||||||
*
|
|
||||||
* 例如,80% 为 80。
|
|
||||||
* 当 100% 为 100 ,则代表免费。
|
|
||||||
*/
|
|
||||||
private Integer percentOff;
|
|
||||||
// /**
|
|
||||||
// * 是否是随机优惠券
|
|
||||||
// *
|
|
||||||
// * true-随机
|
|
||||||
// * false-不随机
|
|
||||||
// *
|
|
||||||
// * 【优惠劵独有】
|
|
||||||
// */
|
|
||||||
// private Boolean isRandom;
|
|
||||||
/**
|
|
||||||
* 优惠金额,单位:分
|
|
||||||
*/
|
|
||||||
// * 当 {@link #isRandom} 为 true 时,代表随机优惠金额的下限
|
|
||||||
private Integer priceOff;
|
|
||||||
// /**
|
|
||||||
// * 优惠金额上限
|
|
||||||
// *
|
|
||||||
// * 【优惠劵独有】
|
|
||||||
// */
|
|
||||||
// private Integer valueRandomTo;
|
|
||||||
/**
|
|
||||||
* 折扣上限,仅在 {@link #preferentialType} 等于 2 时生效。
|
|
||||||
*
|
|
||||||
* 例如,折扣上限为 20 元,当使用 8 折优惠券,订单金额为 1000 元时,最高只可折扣 20 元,而非 80 元。
|
|
||||||
*/
|
|
||||||
private Integer discountPriceLimit;
|
|
||||||
// ========== 使用效果 END ==========
|
|
||||||
|
|
||||||
// ========== 统计信息 BEGIN ==========
|
|
||||||
// /**
|
|
||||||
// * 领取优惠券的人数
|
|
||||||
// */
|
|
||||||
// private Integer statFetchUserNum;
|
|
||||||
/**
|
|
||||||
* 领取优惠券的次数
|
|
||||||
*/
|
|
||||||
private Integer statFetchNum;
|
|
||||||
// /**
|
|
||||||
// * 使用优惠券的次数
|
|
||||||
// */
|
|
||||||
// private Integer statUseNum;
|
|
||||||
// ========== 统计信息 END ==========
|
|
||||||
|
|
||||||
// ========== 优惠码 BEGIN ==========
|
|
||||||
/**
|
|
||||||
* 码类型
|
|
||||||
*
|
|
||||||
* 1-一卡一码(UNIQUE)
|
|
||||||
* 2-通用码(GENERAL)
|
|
||||||
*
|
|
||||||
* 【优惠码独有】 @see CouponCodeDO
|
|
||||||
*/
|
|
||||||
private Integer codeType;
|
|
||||||
/**
|
|
||||||
* 通用码
|
|
||||||
*/
|
|
||||||
private String commonCode;
|
|
||||||
// ========== 优惠码 BEGIN ==========
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.biz.mybatis;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.mybatis.core.type.JSONTypeHandler;
|
|
||||||
import cn.iocoder.mall.promotion.biz.dataobject.PromotionActivityDO;
|
|
||||||
|
|
||||||
public class TestHandler extends JSONTypeHandler<PromotionActivityDO.TimeLimitedDiscount> {
|
|
||||||
|
|
||||||
public TestHandler(Class<PromotionActivityDO.TimeLimitedDiscount> clazz) {
|
|
||||||
super(clazz);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.biz.scheduler;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优惠劵过期 Job
|
|
||||||
*
|
|
||||||
* TODO 芋艿
|
|
||||||
*/
|
|
||||||
public class CouponCardExpireJob {
|
|
||||||
}
|
|
|
@ -1,76 +0,0 @@
|
||||||
spring:
|
|
||||||
# datasource
|
|
||||||
datasource:
|
|
||||||
type: com.alibaba.druid.pool.DruidDataSource
|
|
||||||
url: jdbc:mysql://s1.iocoder.cn:3306/mall_promotion?useSSL=false&useUnicode=true&characterEncoding=UTF-8
|
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
|
||||||
username: root
|
|
||||||
password: 3WLiVUBEwTbvAfsh
|
|
||||||
|
|
||||||
# Spring Cloud 配置项
|
|
||||||
cloud:
|
|
||||||
nacos:
|
|
||||||
# Spring Cloud Nacos Discovery 配置项
|
|
||||||
discovery:
|
|
||||||
server-addr: s1.iocoder.cn:8848 # Nacos 服务器地址
|
|
||||||
|
|
||||||
# mybatis-plus
|
|
||||||
mybatis-plus:
|
|
||||||
configuration:
|
|
||||||
map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
|
|
||||||
global-config:
|
|
||||||
db-config:
|
|
||||||
id-type: auto
|
|
||||||
mapper-locations: classpath*:mapper/*.xml
|
|
||||||
type-aliases-package: cn.iocoder.mall.promotion.biz.dataobject
|
|
||||||
|
|
||||||
# Dubbo 配置项
|
|
||||||
dubbo:
|
|
||||||
# Dubbo 注册中心
|
|
||||||
registry:
|
|
||||||
address: spring-cloud://s1.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
|
|
||||||
# Spring Cloud Alibaba Dubbo 专属配置
|
|
||||||
cloud:
|
|
||||||
subscribed-services: admin-application, product-application # 设置订阅的应用列表,默认为 * 订阅所有应用
|
|
||||||
# Dubbo 提供者的协议
|
|
||||||
protocol:
|
|
||||||
name: dubbo
|
|
||||||
port: -1
|
|
||||||
# Dubbo 提供服务的扫描基础包
|
|
||||||
scan:
|
|
||||||
base-packages: cn.iocoder.mall.promotion.biz.service
|
|
||||||
consumer:
|
|
||||||
ProductSpuService:
|
|
||||||
version: 1.0.0
|
|
||||||
# Dubbo 服务提供者的配置
|
|
||||||
provider:
|
|
||||||
filter: -exception
|
|
||||||
BannerService:
|
|
||||||
version: 1.0.0
|
|
||||||
CouponService:
|
|
||||||
version: 1.0.0
|
|
||||||
ProductRecommendService:
|
|
||||||
version: 1.0.0
|
|
||||||
PromotionActivityService:
|
|
||||||
version: 1.0.0
|
|
||||||
|
|
||||||
# Seata 配置项
|
|
||||||
seata:
|
|
||||||
tx-service-group: default # Seata 事务组编号,用于 TC 集群名
|
|
||||||
# 服务配置项,对应 ServiceProperties 类
|
|
||||||
service:
|
|
||||||
# 虚拟组和分组的映射
|
|
||||||
vgroup-mapping:
|
|
||||||
default: default
|
|
||||||
# Seata 注册中心配置项
|
|
||||||
registry:
|
|
||||||
type: nacos # 注册中心类型
|
|
||||||
nacos:
|
|
||||||
serverAddr: ${spring.cloud.nacos.discovery.server-addr} # Nacos 服务地址
|
|
||||||
namespace: # Nacos 命名空间
|
|
||||||
cluster: default # 使用的 Seata 分组
|
|
||||||
|
|
||||||
# logging
|
|
||||||
logging:
|
|
||||||
level:
|
|
||||||
cn.iocoder.mall.promotion.dao: debug
|
|
|
@ -1,134 +0,0 @@
|
||||||
<?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="cn.iocoder.mall.promotion.biz.dao.CouponCardMapper">
|
|
||||||
|
|
||||||
<sql id="FIELDS">
|
|
||||||
id, template_id, title, status, user_id, take_type,
|
|
||||||
price_available, valid_start_time, valid_end_time, preferential_type, percent_off, price_off,
|
|
||||||
discount_price_limit, used_time,
|
|
||||||
create_time
|
|
||||||
</sql>
|
|
||||||
|
|
||||||
<!-- <select id="selectListByPidAndStatusOrderBySort" resultType="CouponCardDO">-->
|
|
||||||
<!-- SELECT-->
|
|
||||||
<!-- <include refid="FIELDS" />-->
|
|
||||||
<!-- FROM coupon_card-->
|
|
||||||
<!-- WHERE pid = #{pid}-->
|
|
||||||
<!-- AND status = #{status}-->
|
|
||||||
<!-- AND deleted = 0-->
|
|
||||||
<!-- ORDER BY sort ASC-->
|
|
||||||
<!-- </select>-->
|
|
||||||
|
|
||||||
<!-- <select id="selectList" resultType="CouponCardDO">-->
|
|
||||||
<!-- SELECT-->
|
|
||||||
<!-- <include refid="FIELDS" />-->
|
|
||||||
<!-- FROM coupon_card-->
|
|
||||||
<!-- WHERE deleted = 0-->
|
|
||||||
<!-- </select>-->
|
|
||||||
|
|
||||||
<select id="selectById" parameterType="Integer" resultType="CouponCardDO">
|
|
||||||
SELECT
|
|
||||||
<include refid="FIELDS" />
|
|
||||||
FROM coupon_card
|
|
||||||
WHERE id = #{id}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectListByUserIdAndStatus" resultType="CouponCardDO">
|
|
||||||
SELECT
|
|
||||||
<include refid="FIELDS" />
|
|
||||||
FROM coupon_card
|
|
||||||
<where>
|
|
||||||
<if test="userId != null">
|
|
||||||
AND user_id = #{userId}
|
|
||||||
</if>
|
|
||||||
<if test="status != null">
|
|
||||||
AND status = #{status}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectListByPage" resultType="CouponCardDO">
|
|
||||||
SELECT
|
|
||||||
<include refid="FIELDS" />
|
|
||||||
FROM coupon_card
|
|
||||||
<where>
|
|
||||||
<if test="userId != null">
|
|
||||||
AND user_id = #{userId}
|
|
||||||
</if>
|
|
||||||
<if test="status != null">
|
|
||||||
AND status = #{status}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
LIMIT #{offset}, #{limit}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectCountByPage" resultType="Integer">
|
|
||||||
SELECT
|
|
||||||
COUNT(1)
|
|
||||||
FROM coupon_card
|
|
||||||
<where>
|
|
||||||
<if test="userId != null">
|
|
||||||
AND user_id = #{userId}
|
|
||||||
</if>
|
|
||||||
<if test="status != null">
|
|
||||||
AND status = #{status}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectCountByUserIdAndTemplateId" resultType="Integer">
|
|
||||||
SELECT
|
|
||||||
COUNT(1)
|
|
||||||
FROM coupon_card
|
|
||||||
<where>
|
|
||||||
<if test="userId != null">
|
|
||||||
AND user_id = #{userId}
|
|
||||||
</if>
|
|
||||||
<if test="templateId != null">
|
|
||||||
AND template_id = #{templateId}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<insert id="insert" parameterType="CouponCardDO" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
|
|
||||||
INSERT INTO coupon_card (
|
|
||||||
template_id, title, status, user_id, take_type,
|
|
||||||
price_available, valid_start_time, valid_end_time, preferential_type, percent_off, price_off,
|
|
||||||
discount_price_limit, used_time,
|
|
||||||
create_time
|
|
||||||
) VALUES (
|
|
||||||
#{templateId}, #{title}, #{status}, #{userId}, #{takeType},
|
|
||||||
#{priceAvailable}, #{validStartTime}, #{validEndTime}, #{preferentialType}, #{percentOff}, #{priceOff},
|
|
||||||
#{discountPriceLimit}, #{usedTime},
|
|
||||||
#{createTime}
|
|
||||||
)
|
|
||||||
</insert>
|
|
||||||
|
|
||||||
<update id="update" parameterType="CouponCardDO">
|
|
||||||
UPDATE coupon_card
|
|
||||||
<set>
|
|
||||||
<if test="status != null">
|
|
||||||
status = #{status},
|
|
||||||
</if>
|
|
||||||
<if test="usedTime != null">
|
|
||||||
used_time = #{usedTime},
|
|
||||||
</if>
|
|
||||||
</set>
|
|
||||||
WHERE id = #{id}
|
|
||||||
</update>
|
|
||||||
|
|
||||||
<update id="updateByIdAndStatus">
|
|
||||||
UPDATE coupon_card
|
|
||||||
<set>
|
|
||||||
<if test="updateObj.status != null">
|
|
||||||
status = #{updateObj.status},
|
|
||||||
</if>
|
|
||||||
<if test="updateObj.usedTime != null">
|
|
||||||
used_time = #{updateObj.usedTime},
|
|
||||||
</if>
|
|
||||||
</set>
|
|
||||||
WHERE id = #{id}
|
|
||||||
AND status = #{status}
|
|
||||||
</update>
|
|
||||||
|
|
||||||
</mapper>
|
|
|
@ -1,169 +0,0 @@
|
||||||
<?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="cn.iocoder.mall.promotion.biz.dao.CouponTemplateMapper">
|
|
||||||
|
|
||||||
<sql id="FIELDS">
|
|
||||||
id, title, description, type, code_type,
|
|
||||||
status, quota, total, price_available, range_type,
|
|
||||||
range_values, date_type, valid_start_time, valid_end_time, fixed_start_term, fixed_end_term,
|
|
||||||
preferential_type, percent_off, price_off, discount_price_limit, stat_fetch_num,
|
|
||||||
create_time
|
|
||||||
</sql>
|
|
||||||
|
|
||||||
<!-- <select id="selectListByPidAndStatusOrderBySort" resultType="CouponTemplateDO">-->
|
|
||||||
<!-- SELECT-->
|
|
||||||
<!-- <include refid="FIELDS" />-->
|
|
||||||
<!-- FROM coupon_template-->
|
|
||||||
<!-- WHERE pid = #{pid}-->
|
|
||||||
<!-- AND status = #{status}-->
|
|
||||||
<!-- AND deleted = 0-->
|
|
||||||
<!-- ORDER BY sort ASC-->
|
|
||||||
<!-- </select>-->
|
|
||||||
|
|
||||||
<!-- <select id="selectList" resultType="CouponTemplateDO">-->
|
|
||||||
<!-- SELECT-->
|
|
||||||
<!-- <include refid="FIELDS" />-->
|
|
||||||
<!-- FROM coupon_template-->
|
|
||||||
<!-- WHERE deleted = 0-->
|
|
||||||
<!-- </select>-->
|
|
||||||
|
|
||||||
<select id="selectById" parameterType="Integer" resultType="CouponTemplateDO">
|
|
||||||
SELECT
|
|
||||||
<include refid="FIELDS" />
|
|
||||||
FROM coupon_template
|
|
||||||
WHERE id = #{id}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectListByIds" resultType="CouponTemplateDO">
|
|
||||||
SELECT
|
|
||||||
<include refid="FIELDS"/>
|
|
||||||
FROM coupon_template
|
|
||||||
WHERE id IN
|
|
||||||
<foreach item="id" collection="ids" separator="," open="(" close=")" index="">
|
|
||||||
#{id}
|
|
||||||
</foreach>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectListByPage" resultType="CouponTemplateDO">
|
|
||||||
SELECT
|
|
||||||
<include refid="FIELDS" />
|
|
||||||
FROM coupon_template
|
|
||||||
<where>
|
|
||||||
<if test="type != null">
|
|
||||||
AND type = #{type}
|
|
||||||
</if>
|
|
||||||
<if test="title != null">
|
|
||||||
AND title LIKE "%"#{title}"%"
|
|
||||||
</if>
|
|
||||||
<if test="status != null">
|
|
||||||
AND status = #{status}
|
|
||||||
</if>
|
|
||||||
<if test="preferentialType != null">
|
|
||||||
AND preferential_type = #{preferentialType}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
LIMIT #{offset}, #{limit}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectCountByPage" resultType="Integer">
|
|
||||||
SELECT
|
|
||||||
COUNT(1)
|
|
||||||
FROM coupon_template
|
|
||||||
<where>
|
|
||||||
<if test="type != null">
|
|
||||||
AND type = #{type}
|
|
||||||
</if>
|
|
||||||
<if test="title != null">
|
|
||||||
AND title LIKE "%"#{title}"%"
|
|
||||||
</if>
|
|
||||||
<if test="status != null">
|
|
||||||
AND status = #{status}
|
|
||||||
</if>
|
|
||||||
<if test="preferentialType != null">
|
|
||||||
AND preferential_type = #{preferentialType}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<insert id="insert" parameterType="CouponTemplateDO" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
|
|
||||||
INSERT INTO coupon_template (
|
|
||||||
title, description, type, code_type,
|
|
||||||
status, quota, total, price_available, range_type,
|
|
||||||
range_values, date_type, valid_start_time, valid_end_time, fixed_start_term, fixed_end_term,
|
|
||||||
preferential_type, percent_off, price_off, discount_price_limit, stat_fetch_num,
|
|
||||||
create_time
|
|
||||||
) VALUES (
|
|
||||||
#{title}, #{description}, #{type}, #{codeType},
|
|
||||||
#{status}, #{quota}, #{total}, #{priceAvailable}, #{rangeType},
|
|
||||||
#{rangeValues}, #{dateType}, #{validStartTime}, #{validEndTime}, #{fixedStartTerm}, #{fixedEndTerm}
|
|
||||||
#{preferentialType}, #{percentOff}, #{priceOff}, #{discountPriceLimit}, #{statFetchNum},
|
|
||||||
#{createTime}
|
|
||||||
)
|
|
||||||
</insert>
|
|
||||||
|
|
||||||
<update id="update" parameterType="CouponTemplateDO">
|
|
||||||
UPDATE coupon_template
|
|
||||||
<set>
|
|
||||||
<if test="title != null">
|
|
||||||
title = #{title},
|
|
||||||
</if>
|
|
||||||
<if test="description != null">
|
|
||||||
description = #{description},
|
|
||||||
</if>
|
|
||||||
<if test="status != null">
|
|
||||||
status = #{status},
|
|
||||||
</if>
|
|
||||||
<if test="quota != null">
|
|
||||||
quota = #{quota},
|
|
||||||
</if>
|
|
||||||
<if test="total != null">
|
|
||||||
total = #{total},
|
|
||||||
</if>
|
|
||||||
<if test="priceAvailable != null">
|
|
||||||
price_available = #{priceAvailable},
|
|
||||||
</if>
|
|
||||||
<if test="rangeType != null">
|
|
||||||
range_type = #{rangeType},
|
|
||||||
</if>
|
|
||||||
<if test="rangeValues != null">
|
|
||||||
range_values = #{rangeValues},
|
|
||||||
</if>
|
|
||||||
<if test="dateType != null">
|
|
||||||
date_type = #{dateType},
|
|
||||||
</if>
|
|
||||||
<if test="validStartTime != null">
|
|
||||||
valid_start_time = #{validStartTime},
|
|
||||||
</if>
|
|
||||||
<if test="validEndTime != null">
|
|
||||||
valid_end_time = #{validEndTime},
|
|
||||||
</if>
|
|
||||||
<if test="fixedStartTerm != null">
|
|
||||||
fixed_start_term = #{fixedStartTerm},
|
|
||||||
</if>
|
|
||||||
<if test="fixedEndTerm != null">
|
|
||||||
fixed_end_term = #{fixedEndTerm},
|
|
||||||
</if>
|
|
||||||
<if test="preferentialType != null">
|
|
||||||
preferential_type = #{preferentialType},
|
|
||||||
</if>
|
|
||||||
<if test="percentOff != null">
|
|
||||||
percent_off = #{percentOff},
|
|
||||||
</if>
|
|
||||||
<if test="priceOff != null">
|
|
||||||
price_off = #{priceOff},
|
|
||||||
</if>
|
|
||||||
<if test="discountPriceLimit != null">
|
|
||||||
discount_price_limit = #{discountPriceLimit},
|
|
||||||
</if>
|
|
||||||
</set>
|
|
||||||
WHERE id = #{id}
|
|
||||||
</update>
|
|
||||||
|
|
||||||
<update id="updateStatFetchNumIncr" parameterType="Integer">
|
|
||||||
UPDATE coupon_template
|
|
||||||
SET stat_fetch_Num = stat_fetch_Num + 1
|
|
||||||
WHERE id = #{id}
|
|
||||||
AND total > stat_fetch_Num
|
|
||||||
</update>
|
|
||||||
|
|
||||||
</mapper>
|
|
|
@ -1,7 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.biz;
|
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
||||||
|
|
||||||
@SpringBootApplication(scanBasePackages = {"cn.iocoder.mall.promotion"})
|
|
||||||
public class Application {
|
|
||||||
}
|
|
|
@ -1,94 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.biz.dao;
|
|
||||||
|
|
||||||
import cn.iocoder.common.framework.util.DateUtil;
|
|
||||||
import cn.iocoder.mall.promotion.api.enums.PreferentialTypeEnum;
|
|
||||||
import cn.iocoder.mall.promotion.api.enums.PromotionActivityStatusEnum;
|
|
||||||
import cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum;
|
|
||||||
import cn.iocoder.mall.promotion.api.enums.RangeTypeEnum;
|
|
||||||
import cn.iocoder.mall.promotion.biz.dataobject.PromotionActivityDO;
|
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
|
||||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
|
|
||||||
public class PromotionActivityMapperTest {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private PromotionActivityMapper promotionActivityMapper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 插入限时折扣活动
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
@Ignore
|
|
||||||
public void testInsert01() {
|
|
||||||
// 创建 PromotionActivityDO 对象
|
|
||||||
PromotionActivityDO activityDO = new PromotionActivityDO();
|
|
||||||
activityDO.setTitle("老板跑路了");
|
|
||||||
activityDO.setActivityType(PromotionActivityTypeEnum.TIME_LIMITED_DISCOUNT.getValue());
|
|
||||||
activityDO.setStatus(PromotionActivityStatusEnum.RUN.getValue());
|
|
||||||
activityDO.setStartTime(new Date());
|
|
||||||
activityDO.setEndTime(DateUtil.addDate(new Date(), Calendar.DAY_OF_YEAR, 100));
|
|
||||||
activityDO.setCreateTime(new Date());
|
|
||||||
// 创建 TimeLimitedDiscount 对象
|
|
||||||
PromotionActivityDO.TimeLimitedDiscount discount = new PromotionActivityDO.TimeLimitedDiscount();
|
|
||||||
discount.setQuota(0);
|
|
||||||
discount.setItems(new ArrayList<>());
|
|
||||||
PromotionActivityDO.TimeLimitedDiscount.Item item01 = new PromotionActivityDO.TimeLimitedDiscount.Item();
|
|
||||||
item01.setSpuId(32);
|
|
||||||
item01.setPreferentialType(PreferentialTypeEnum.DISCOUNT.getValue());
|
|
||||||
item01.setPreferentialValue(40);
|
|
||||||
discount.getItems().add(item01);
|
|
||||||
activityDO.setTimeLimitedDiscount(discount);
|
|
||||||
promotionActivityMapper.insert(activityDO);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 插入满减送活动
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testInsert02() {
|
|
||||||
// 创建 PromotionActivityDO 对象
|
|
||||||
PromotionActivityDO activityDO = new PromotionActivityDO();
|
|
||||||
activityDO.setTitle("老四赶海");
|
|
||||||
activityDO.setActivityType(PromotionActivityTypeEnum.FULL_PRIVILEGE.getValue());
|
|
||||||
activityDO.setStatus(PromotionActivityStatusEnum.RUN.getValue());
|
|
||||||
activityDO.setStartTime(new Date());
|
|
||||||
activityDO.setEndTime(DateUtil.addDate(new Date(), Calendar.DAY_OF_YEAR, 100));
|
|
||||||
activityDO.setCreateTime(new Date());
|
|
||||||
// 创建 TimeLimitedDiscount 对象
|
|
||||||
PromotionActivityDO.FullPrivilege fullPrivilege = new PromotionActivityDO.FullPrivilege();
|
|
||||||
fullPrivilege.setRangeType(RangeTypeEnum.ALL.getValue());
|
|
||||||
fullPrivilege.setCycled(Boolean.FALSE);
|
|
||||||
fullPrivilege.setPrivileges(new ArrayList<>());
|
|
||||||
PromotionActivityDO.FullPrivilege.Privilege privilege01 = new PromotionActivityDO.FullPrivilege.Privilege();
|
|
||||||
privilege01.setMeetType(1); // TODO 芋艿,硬编码
|
|
||||||
privilege01.setMeetValue(20);
|
|
||||||
privilege01.setPreferentialType(PreferentialTypeEnum.DISCOUNT.getValue());
|
|
||||||
privilege01.setPreferentialValue(80);
|
|
||||||
fullPrivilege.getPrivileges().add(privilege01);
|
|
||||||
activityDO.setFullPrivilege(fullPrivilege);
|
|
||||||
promotionActivityMapper.insert(activityDO);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询促销活动
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testSelectById() {
|
|
||||||
PromotionActivityDO activity01 = promotionActivityMapper.selectById(1);
|
|
||||||
System.out.println(activity01);
|
|
||||||
|
|
||||||
PromotionActivityDO activity02 = promotionActivityMapper.selectById(2);
|
|
||||||
System.out.println(activity02);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.application;
|
|
||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
||||||
|
|
||||||
@SpringBootApplication(scanBasePackages = {"cn.iocoder.mall.promotion"})
|
|
||||||
public class PromotionApplication {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
SpringApplication.run(PromotionApplication.class, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.application.convert;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.bo.CouponCardBO;
|
|
||||||
import cn.iocoder.mall.promotion.api.bo.CouponCardPageBO;
|
|
||||||
import cn.iocoder.mall.promotion.application.vo.users.UsersCouponCardPageVO;
|
|
||||||
import cn.iocoder.mall.promotion.application.vo.users.UsersCouponCardVO;
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import org.mapstruct.Mappings;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface CouponCardConvert {
|
|
||||||
|
|
||||||
CouponCardConvert INSTANCE = Mappers.getMapper(CouponCardConvert.class);
|
|
||||||
|
|
||||||
@Mappings({})
|
|
||||||
UsersCouponCardVO convert(CouponCardBO result);
|
|
||||||
|
|
||||||
@Mappings({})
|
|
||||||
UsersCouponCardPageVO convert2(CouponCardPageBO result);
|
|
||||||
|
|
||||||
//
|
|
||||||
// @Mappings({})
|
|
||||||
// List<UsersCouponTemplateVO> convertList2(List<CouponTemplateBO> banners);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.application.convert;
|
|
||||||
|
|
||||||
import cn.iocoder.mall.promotion.api.bo.CouponTemplateBO;
|
|
||||||
import cn.iocoder.mall.promotion.api.bo.CouponTemplatePageBO;
|
|
||||||
import cn.iocoder.mall.promotion.application.vo.admins.AdminsCouponTemplatePageVO;
|
|
||||||
import cn.iocoder.mall.promotion.application.vo.admins.AdminsCouponTemplateVO;
|
|
||||||
import cn.iocoder.mall.promotion.application.vo.users.UsersCouponTemplateVO;
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import org.mapstruct.Mappings;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface CouponTemplateConvert {
|
|
||||||
|
|
||||||
Users USERS = Mappers.getMapper(Users.class);
|
|
||||||
|
|
||||||
Admins ADMINS = Mappers.getMapper(Admins.class);
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
interface Admins {
|
|
||||||
|
|
||||||
@Mappings({})
|
|
||||||
AdminsCouponTemplateVO convert(CouponTemplateBO template);
|
|
||||||
|
|
||||||
@Mappings({})
|
|
||||||
AdminsCouponTemplatePageVO convertPage(CouponTemplatePageBO result);
|
|
||||||
|
|
||||||
@Mappings({})
|
|
||||||
List<AdminsCouponTemplateVO> convertList(List<CouponTemplateBO> templates);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
interface Users {
|
|
||||||
|
|
||||||
@Mappings({})
|
|
||||||
UsersCouponTemplateVO convert2(CouponTemplateBO template);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
package cn.iocoder.mall.promotion.application.vo.users;
|
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@ApiModel("优惠劵分页 VO")
|
|
||||||
@Data
|
|
||||||
@Accessors(chain = true)
|
|
||||||
public class UsersCouponCardPageVO {
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "优惠劵数组")
|
|
||||||
private List<UsersCouponCardVO> list;
|
|
||||||
@ApiModelProperty(value = "优惠劵总数")
|
|
||||||
private Integer total;
|
|
||||||
|
|
||||||
}
|
|
|
@ -3,7 +3,7 @@ package cn.iocoder.mall.shopweb.controller.order;
|
||||||
import cn.iocoder.common.framework.vo.CommonResult;
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
import cn.iocoder.mall.security.user.core.context.UserSecurityContextHolder;
|
import cn.iocoder.mall.security.user.core.context.UserSecurityContextHolder;
|
||||||
import cn.iocoder.mall.shopweb.controller.order.vo.cart.CartDetailVO;
|
import cn.iocoder.mall.shopweb.controller.order.vo.cart.CartDetailVO;
|
||||||
import cn.iocoder.mall.shopweb.manager.order.cart.CartManager;
|
import cn.iocoder.mall.shopweb.manager.order.CartManager;
|
||||||
import cn.iocoder.security.annotations.RequiresAuthenticate;
|
import cn.iocoder.security.annotations.RequiresAuthenticate;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
### /order/confirm-create-order-info 基于商品,确认创建订单
|
||||||
|
GET {{shop-api-base-url}}/order/confirm-create-order-info?skuId=33&quantity=1
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
Authorization: Bearer {{user-access-token}}
|
||||||
|
|
||||||
|
### /order/confirm-create-order-info-from-cart 基于购物车,确认创建订单
|
||||||
|
GET {{shop-api-base-url}}/order/confirm-create-order-info-from-cart
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
Authorization: Bearer {{user-access-token}}
|
||||||
|
|
||||||
|
###
|
|
@ -0,0 +1,49 @@
|
||||||
|
package cn.iocoder.mall.shopweb.controller.order;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
|
import cn.iocoder.mall.security.user.core.context.UserSecurityContextHolder;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.order.vo.order.OrderConfirmCreateInfoRespVO;
|
||||||
|
import cn.iocoder.mall.shopweb.manager.order.OrderManager;
|
||||||
|
import cn.iocoder.security.annotations.RequiresAuthenticate;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiImplicitParams;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import static cn.iocoder.common.framework.vo.CommonResult.success;
|
||||||
|
|
||||||
|
@Api(tags = "订单 API")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/order")
|
||||||
|
@Validated
|
||||||
|
public class OrderController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private OrderManager orderManager;
|
||||||
|
|
||||||
|
@GetMapping("confirm-create-order-info")
|
||||||
|
@ApiOperation("基于商品,确认创建订单")
|
||||||
|
@ApiImplicitParams({
|
||||||
|
@ApiImplicitParam(name = "skuId", required = true, value = "商品 SKU 编号", example = "1024"),
|
||||||
|
@ApiImplicitParam(name = "quantity", required = true, value = "购买数量", example = "2"),
|
||||||
|
@ApiImplicitParam(name = "couponCardId", value = "优惠劵编号", example = "1"),
|
||||||
|
})
|
||||||
|
@RequiresAuthenticate
|
||||||
|
public CommonResult<OrderConfirmCreateInfoRespVO> getOrderConfirmCreateInfo(@RequestParam("skuId") Integer skuId,
|
||||||
|
@RequestParam("quantity") Integer quantity,
|
||||||
|
@RequestParam(value = "couponCardId", required = false) Integer couponCardId) {
|
||||||
|
return success(orderManager.getOrderConfirmCreateInfo(UserSecurityContextHolder.getUserId(), skuId, quantity, couponCardId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("confirm-create-order-info-from-cart")
|
||||||
|
@ApiOperation("基于购物车,确认创建订单")
|
||||||
|
@ApiImplicitParam(name = "couponCardId", value = "优惠劵编号", example = "1")
|
||||||
|
@RequiresAuthenticate
|
||||||
|
public CommonResult<OrderConfirmCreateInfoRespVO> getOrderConfirmCreateInfoFromCart(@RequestParam(value = "couponCardId", required = false) Integer couponCardId) {
|
||||||
|
return success(orderManager.getOrderConfirmCreateInfoFromCart(UserSecurityContextHolder.getUserId(), couponCardId));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -8,7 +8,7 @@ import lombok.experimental.Accessors;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ApiModel(value = "用户的购物车明细 VO")
|
@ApiModel(value = "用户的购物车明细 Response VO") // TODO 芋艿:swagger 文档完善
|
||||||
@Data
|
@Data
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
public class CartDetailVO {
|
public class CartDetailVO {
|
||||||
|
|
|
@ -1,12 +1,19 @@
|
||||||
package cn.iocoder.mall.order.rest.response;
|
package cn.iocoder.mall.shopweb.controller.order.vo.order;
|
||||||
|
|
||||||
import java.util.List;
|
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardAvailableRespDTO;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.order.vo.cart.CartDetailVO;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.product.vo.attr.ProductAttrKeyValueRespVO;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@ApiModel(value = "订单确认创建信息 Response VO") // TODO 芋艿:swagger 文档完善
|
||||||
@Data
|
@Data
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true) // TODO 芋艿:和 CartDetailVO、ProductSkuCalcPriceRespVO 有点重复,后续要优化下;
|
||||||
public class UsersOrderConfirmCreateResponse {
|
public class OrderConfirmCreateInfoRespVO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品分组数组
|
* 商品分组数组
|
||||||
|
@ -16,14 +23,12 @@ public class UsersOrderConfirmCreateResponse {
|
||||||
* 费用
|
* 费用
|
||||||
*/
|
*/
|
||||||
private Fee fee;
|
private Fee fee;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 优惠劵列表 TODO 芋艿,后续改改
|
* 优惠劵列表 TODO 芋艿,后续改改
|
||||||
*/
|
*/
|
||||||
// private List<CouponCardAvailableBO> couponCards;
|
private List<CouponCardAvailableRespDTO> couponCards;
|
||||||
/**
|
|
||||||
* 优惠劵优惠金额
|
|
||||||
*/
|
|
||||||
private Integer couponCardDiscountTotal;
|
|
||||||
/**
|
/**
|
||||||
* 商品分组
|
* 商品分组
|
||||||
*
|
*
|
||||||
|
@ -36,13 +41,18 @@ public class UsersOrderConfirmCreateResponse {
|
||||||
/**
|
/**
|
||||||
* 优惠活动
|
* 优惠活动
|
||||||
*/
|
*/
|
||||||
// TODO 芋艿,目前只会有【满减送】的情况,未来有新的促销方式,可能需要改成数组
|
private PromotionActivityRespDTO activity; // TODO 芋艿,偷懒
|
||||||
// TODO 芋艿,后面改成 VO
|
/**
|
||||||
// private PromotionActivityBO activity;
|
* 促销减少的金额
|
||||||
|
*
|
||||||
|
* 1. 若未参与促销活动,或不满足促销条件,返回 null
|
||||||
|
* 2. 该金额,已经分摊到每个 Item 的 discountTotal ,需要注意。
|
||||||
|
*/
|
||||||
|
private Integer activityDiscountTotal;
|
||||||
/**
|
/**
|
||||||
* 商品数组
|
* 商品数组
|
||||||
*/
|
*/
|
||||||
private List<Sku> items;
|
private List<CartDetailVO.Sku> items;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,7 +76,7 @@ public class UsersOrderConfirmCreateResponse {
|
||||||
/**
|
/**
|
||||||
* 规格值数组
|
* 规格值数组
|
||||||
*/
|
*/
|
||||||
// private List<ProductAttrAndValuePairBO> attrs; // TODO 后面改下
|
private List<ProductAttrKeyValueRespVO> attrs; // TODO 后面改下
|
||||||
/**
|
/**
|
||||||
* 价格,单位:分
|
* 价格,单位:分
|
||||||
*/
|
*/
|
||||||
|
@ -82,6 +92,10 @@ public class UsersOrderConfirmCreateResponse {
|
||||||
* 购买数量
|
* 购买数量
|
||||||
*/
|
*/
|
||||||
private Integer buyQuantity;
|
private Integer buyQuantity;
|
||||||
|
/**
|
||||||
|
* 优惠活动
|
||||||
|
*/
|
||||||
|
private PromotionActivityRespDTO activity; // TODO 芋艿,偷懒
|
||||||
/**
|
/**
|
||||||
* 原始单价,单位:分。
|
* 原始单价,单位:分。
|
||||||
*/
|
*/
|
||||||
|
@ -182,10 +196,11 @@ public class UsersOrderConfirmCreateResponse {
|
||||||
this.postageTotal = postageTotal;
|
this.postageTotal = postageTotal;
|
||||||
this.presentTotal = presentTotal;
|
this.presentTotal = presentTotal;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 邮费信息
|
* 邮费信息 TODO 芋艿,未完成
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
|
@ -0,0 +1,5 @@
|
||||||
|
### /product-spu/page 计算商品 SKU 价格
|
||||||
|
GET {{shop-api-base-url}}/product-sku/cal-price?id=33
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
|
||||||
|
###
|
|
@ -0,0 +1,33 @@
|
||||||
|
package cn.iocoder.mall.shopweb.controller.product;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
|
import cn.iocoder.mall.security.user.core.context.UserSecurityContextHolder;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.product.vo.sku.ProductSkuCalcPriceRespVO;
|
||||||
|
import cn.iocoder.mall.shopweb.manager.product.ProductSkuManager;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@Api(tags = "商品 SKU API")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/product-sku")
|
||||||
|
@Validated
|
||||||
|
public class ProductSkuController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ProductSkuManager productSkuManager;
|
||||||
|
|
||||||
|
@GetMapping("/cal-price")
|
||||||
|
@ApiOperation("计算商品 SKU 价格")
|
||||||
|
@ApiImplicitParam(name = "id", required = true, value = "商品 SKU 编号", example = "1024")
|
||||||
|
public CommonResult<ProductSkuCalcPriceRespVO> calcProductSkuPrice(@RequestParam("id") Integer id) {
|
||||||
|
return CommonResult.success(productSkuManager.calcProductSkuPrice(UserSecurityContextHolder.getUserId(), id));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package cn.iocoder.mall.shopweb.controller.product.vo.sku;
|
||||||
|
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
@ApiModel("计算商品 SKU 价格结果 VO")
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
// TODO 芋艿:swagger 注解
|
||||||
|
public class ProductSkuCalcPriceRespVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 原价格,单位:分。
|
||||||
|
*/
|
||||||
|
private Integer originalPrice;
|
||||||
|
/**
|
||||||
|
* 最终价格,单位:分。
|
||||||
|
*/
|
||||||
|
private Integer buyPrice;
|
||||||
|
/**
|
||||||
|
* 满减送促销活动
|
||||||
|
*
|
||||||
|
* TODO 芋艿,后续改成 VO
|
||||||
|
*/
|
||||||
|
private PromotionActivityRespDTO fullPrivilege;
|
||||||
|
/**
|
||||||
|
* 限时折扣促销活动
|
||||||
|
*
|
||||||
|
* TODO 芋艿,后续改成 VO
|
||||||
|
*/
|
||||||
|
private PromotionActivityRespDTO timeLimitedDiscount;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
### /promotion/coupon-card/page 优惠劵分页(未使用)
|
||||||
|
GET {{shop-api-base-url}}/promotion/coupon-card/page?pageNo=1&pageSize=10&status=1
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
Authorization: Bearer {{user-access-token}}
|
||||||
|
|
||||||
|
### /promotion/coupon-card/page 优惠劵分页(已使用)
|
||||||
|
GET {{shop-api-base-url}}/promotion/coupon-card/page?pageNo=1&pageSize=10&status=2
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
Authorization: Bearer {{user-access-token}}
|
||||||
|
|
||||||
|
### /promotion/coupon-card/page 优惠劵分页(已过期)
|
||||||
|
GET {{shop-api-base-url}}/promotion/coupon-card/page?pageNo=1&pageSize=10&status=3
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
Authorization: Bearer {{user-access-token}}
|
||||||
|
|
||||||
|
### /promotion/coupon-card/create 用户领取优惠劵(成功)
|
||||||
|
POST {{shop-api-base-url}}/promotion/coupon-card/create
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
Authorization: Bearer {{user-access-token}}
|
||||||
|
|
||||||
|
couponTemplateId=1
|
||||||
|
|
||||||
|
###
|
|
@ -0,0 +1,43 @@
|
||||||
|
package cn.iocoder.mall.shopweb.controller.promotion;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
|
import cn.iocoder.common.framework.vo.PageResult;
|
||||||
|
import cn.iocoder.mall.security.user.core.context.UserSecurityContextHolder;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.promotion.vo.coupon.card.CouponCardPageReqVO;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.promotion.vo.coupon.card.CouponCardRespVO;
|
||||||
|
import cn.iocoder.mall.shopweb.manager.promotion.CouponCardManager;
|
||||||
|
import cn.iocoder.security.annotations.RequiresAuthenticate;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import static cn.iocoder.common.framework.vo.CommonResult.success;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/promotion/coupon-card")
|
||||||
|
@Api(tags = "优惠劵 API")
|
||||||
|
@Validated
|
||||||
|
public class CouponCardController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CouponCardManager couponCardManager;
|
||||||
|
|
||||||
|
@GetMapping("/page")
|
||||||
|
@ApiOperation("获得优惠劵分页")
|
||||||
|
@RequiresAuthenticate
|
||||||
|
public CommonResult<PageResult<CouponCardRespVO>> pageCouponCard(CouponCardPageReqVO pageVO) {
|
||||||
|
return success(couponCardManager.pageCouponCard(UserSecurityContextHolder.getUserId(),pageVO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/create")
|
||||||
|
@ApiOperation("用户领取优惠劵")
|
||||||
|
@ApiImplicitParam(name = "couponTemplateId", value = "优惠劵模板编号", required = true, example = "1024")
|
||||||
|
@RequiresAuthenticate
|
||||||
|
public CommonResult<Integer> createCouponCard(@RequestParam("couponTemplateId") Integer couponTemplateId) {
|
||||||
|
return success(couponCardManager.createCouponCard(UserSecurityContextHolder.getUserId(), couponTemplateId));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package cn.iocoder.mall.shopweb.controller.promotion.vo.coupon.card;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.PageParam;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@ApiModel("优惠劵分页 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class CouponCardPageReqVO extends PageParam {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "优惠码状态", required = true, example = "1", notes = "对应 CouponCardStatusEnum 枚举")
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
}
|
|
@ -1,17 +1,16 @@
|
||||||
package cn.iocoder.mall.promotion.application.vo.users;
|
package cn.iocoder.mall.shopweb.controller.promotion.vo.coupon.card;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
@ApiModel("优惠劵 Response VO")
|
||||||
* 优惠劵 VO
|
|
||||||
*/
|
|
||||||
@Data
|
@Data
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
public class UsersCouponCardVO {
|
public class CouponCardRespVO {
|
||||||
|
|
||||||
// ========== 基本信息 BEGIN ==========
|
// ========== 基本信息 BEGIN ==========
|
||||||
@ApiModelProperty(value = "优惠劵编号", required = true, example = "1")
|
@ApiModelProperty(value = "优惠劵编号", required = true, example = "1")
|
||||||
|
@ -47,8 +46,6 @@ public class UsersCouponCardVO {
|
||||||
|
|
||||||
// ========== 使用情况 BEGIN ==========
|
// ========== 使用情况 BEGIN ==========
|
||||||
|
|
||||||
// TODO 芋艿,后续要加优惠劵的使用日志,因为下单后,可能会取消。
|
|
||||||
|
|
||||||
// ========== 使用情况 END ==========
|
// ========== 使用情况 END ==========
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package cn.iocoder.mall.shopweb.convert.order;
|
||||||
|
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardAvailableListReqDTO;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcRespDTO;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.order.vo.order.OrderConfirmCreateInfoRespVO;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface OrderConvert {
|
||||||
|
|
||||||
|
OrderConvert INSTANCE = Mappers.getMapper(OrderConvert.class);
|
||||||
|
|
||||||
|
OrderConfirmCreateInfoRespVO.Fee convert(PriceProductCalcRespDTO.Fee bean);
|
||||||
|
|
||||||
|
default List<CouponCardAvailableListReqDTO.Item> convertList(List<PriceProductCalcRespDTO.ItemGroup> itemGroups) {
|
||||||
|
List<CouponCardAvailableListReqDTO.Item> items = new ArrayList<>();
|
||||||
|
itemGroups.forEach(itemGroup -> items.addAll(itemGroup.getItems().stream().map(
|
||||||
|
item -> new CouponCardAvailableListReqDTO.Item()
|
||||||
|
.setSpuId(item.getSpuId())
|
||||||
|
.setSkuId(item.getSkuId())
|
||||||
|
.setCid(item.getCid())
|
||||||
|
.setPrice(item.getBuyPrice())
|
||||||
|
.setQuantity(item.getBuyQuantity()))
|
||||||
|
.collect(Collectors.toList())));
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package cn.iocoder.mall.shopweb.convert.product;
|
||||||
|
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcRespDTO;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.product.vo.sku.ProductSkuCalcPriceRespVO;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface ProductSkuConvert {
|
||||||
|
|
||||||
|
ProductSkuConvert INSTANCE = Mappers.getMapper(ProductSkuConvert.class);
|
||||||
|
|
||||||
|
default ProductSkuCalcPriceRespVO convert(PriceProductCalcRespDTO.Item item,
|
||||||
|
PromotionActivityRespDTO fullPrivilege, PromotionActivityRespDTO timeLimitedDiscount) {
|
||||||
|
return new ProductSkuCalcPriceRespVO().setOriginalPrice(item.getOriginPrice()).setBuyPrice(item.getBuyPrice())
|
||||||
|
.setFullPrivilege(fullPrivilege).setTimeLimitedDiscount(timeLimitedDiscount);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package cn.iocoder.mall.shopweb.convert.promotion;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.vo.PageResult;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardPageReqDTO;
|
||||||
|
import cn.iocoder.mall.promotion.api.rpc.coupon.dto.card.CouponCardRespDTO;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.promotion.vo.coupon.card.CouponCardPageReqVO;
|
||||||
|
import cn.iocoder.mall.shopweb.controller.promotion.vo.coupon.card.CouponCardRespVO;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠劵 Convert
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface CouponCardConvert {
|
||||||
|
|
||||||
|
CouponCardConvert INSTANCE = Mappers.getMapper(CouponCardConvert.class);
|
||||||
|
|
||||||
|
PageResult<CouponCardRespVO> convertPage(PageResult<CouponCardRespDTO> page);
|
||||||
|
|
||||||
|
CouponCardPageReqDTO convert(CouponCardPageReqVO bean);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package cn.iocoder.mall.shopweb.enums;
|
||||||
|
|
||||||
|
import cn.iocoder.common.framework.exception.ErrorCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误码枚举类
|
||||||
|
*
|
||||||
|
* shop web 系统,使用 1-007-000-000 段
|
||||||
|
*/
|
||||||
|
public interface ShopWebErrorCodeConstants {
|
||||||
|
|
||||||
|
// ========== ORDER 模块 ==========
|
||||||
|
ErrorCode ORDER_PRODUCT_SKU_NOT_EXISTS = new ErrorCode(1007000001, "商品 SKU 不存在!");
|
||||||
|
ErrorCode ORDER_PRODUCT_SKU_QUANTITY_NOT_ENOUGH = new ErrorCode(1007000001, "商品 SKU 库存不足!");
|
||||||
|
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue