Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
495bf2ed
提交
495bf2ed
authored
7月 29, 2020
作者:
wuwenbin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix promotion优惠券工程继续迁移,未完成,再再再提交下
上级
90047c10
隐藏空白字符变更
内嵌
并排
正在显示
27 个修改的文件
包含
1632 行增加
和
16 行删除
+1632
-16
CouponRpc.java
...a/cn/iocoder/mall/promotion/api/rpc/coupon/CouponRpc.java
+8
-8
CouponCardAvailableRespDTO.java
...motion/api/rpc/coupon/dto/CouponCardAvailableRespDTO.java
+1
-1
CouponCardDetailRespDTO.java
...promotion/api/rpc/coupon/dto/CouponCardDetailRespDTO.java
+143
-0
CouponCardPageRespDTO.java
...l/promotion/api/rpc/coupon/dto/CouponCardPageRespDTO.java
+2
-2
CouponCardReqDTO.java
...r/mall/promotion/api/rpc/coupon/dto/CouponCardReqDTO.java
+1
-1
CouponTemplatePageRespDTO.java
...omotion/api/rpc/coupon/dto/CouponTemplatePageRespDTO.java
+2
-2
CouponTemplateReqDTO.java
...ll/promotion/api/rpc/coupon/dto/CouponTemplateReqDTO.java
+155
-0
pom.xml
promotion-service-project/promotion-service-app/pom.xml
+7
-0
CouponCardConvert.java
...ll/promotionservice/convert/coupon/CouponCardConvert.java
+41
-0
CouponTemplateConvert.java
...romotionservice/convert/coupon/CouponTemplateConvert.java
+48
-0
ProductRecommendConvert.java
...ionservice/convert/recommend/ProductRecommendConvert.java
+34
-0
CouponService.java
...r/mall/promotionservice/service/coupon/CouponService.java
+354
-0
CouponCardAvailableBO.java
...otionservice/service/coupon/bo/CouponCardAvailableBO.java
+25
-0
CouponCardBO.java
...mall/promotionservice/service/coupon/bo/CouponCardBO.java
+112
-0
CouponCardDetailBO.java
...romotionservice/service/coupon/bo/CouponCardDetailBO.java
+1
-1
CouponCardPageBO.java
.../promotionservice/service/coupon/bo/CouponCardPageBO.java
+26
-0
CouponCardSpuBO.java
...l/promotionservice/service/coupon/bo/CouponCardSpuBO.java
+40
-0
CouponCardTemplateAddBO.java
...ionservice/service/coupon/bo/CouponCardTemplateAddBO.java
+140
-0
CouponCardTemplateUpdateBO.java
...service/service/coupon/bo/CouponCardTemplateUpdateBO.java
+201
-0
CouponCodeTemplateUpdateBO.java
...service/service/coupon/bo/CouponCodeTemplateUpdateBO.java
+14
-0
CouponTemplateBO.java
.../promotionservice/service/coupon/bo/CouponTemplateBO.java
+1
-1
CouponTemplatePageBO.java
...motionservice/service/coupon/bo/CouponTemplatePageBO.java
+26
-0
ProductRecommendService.java
...ionservice/service/recommend/ProductRecommendService.java
+114
-0
ProductRecommendAddBO.java
...onservice/service/recommend/bo/ProductRecommendAddBO.java
+29
-0
ProductRecommendBO.java
...otionservice/service/recommend/bo/ProductRecommendBO.java
+50
-0
ProductRecommendPageBO.java
...nservice/service/recommend/bo/ProductRecommendPageBO.java
+26
-0
ProductRecommendUpdateBO.java
...ervice/service/recommend/bo/ProductRecommendUpdateBO.java
+31
-0
没有找到文件。
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/CouponRpc.java
浏览文件 @
495bf2ed
...
...
@@ -11,9 +11,9 @@ public interface CouponRpc {
// ========== 优惠劵(码)模板 ==========
CouponTemplate
B
O
getCouponTemplate
(
Integer
couponTemplateId
);
CouponTemplate
ReqDT
O
getCouponTemplate
(
Integer
couponTemplateId
);
CouponTemplatePage
B
O
getCouponTemplatePage
(
CouponTemplatePageReqDTO
couponTemplatePageDTO
);
CouponTemplatePage
RespDT
O
getCouponTemplatePage
(
CouponTemplatePageReqDTO
couponTemplatePageDTO
);
/**
* 创建优惠码模板
...
...
@@ -21,7 +21,7 @@ public interface CouponRpc {
* @param couponCodeTemplateAddDTO 优惠码模板添加 DTO
* @return 优惠码模板
*/
CouponTemplate
B
O
addCouponCodeTemplate
(
CouponCodeTemplateAddReqDTO
couponCodeTemplateAddDTO
);
CouponTemplate
ReqDT
O
addCouponCodeTemplate
(
CouponCodeTemplateAddReqDTO
couponCodeTemplateAddDTO
);
/**
* 创建优惠劵模板
...
...
@@ -29,7 +29,7 @@ public interface CouponRpc {
* @param couponCardTemplateAddDTO 优惠码模板添加 DTO
* @return 优惠劵模板
*/
CouponTemplate
B
O
addCouponCardTemplate
(
CouponCardTemplateAddReqDTO
couponCardTemplateAddDTO
);
CouponTemplate
ReqDT
O
addCouponCardTemplate
(
CouponCardTemplateAddReqDTO
couponCardTemplateAddDTO
);
/**
* 更新优惠码模板
...
...
@@ -60,7 +60,7 @@ public interface CouponRpc {
// ========== 优惠劵 ==========
CouponCardPage
B
O
getCouponCardPage
(
CouponCardPageReqDTO
couponCardPageDTO
);
CouponCardPage
RespDT
O
getCouponCardPage
(
CouponCardPageReqDTO
couponCardPageDTO
);
/**
* 基于优惠劵模板,领取优惠劵
...
...
@@ -69,7 +69,7 @@ public interface CouponRpc {
* @param couponTemplateId 优惠劵模板
* @return 优惠劵
*/
CouponCard
B
O
addCouponCard
(
Integer
userId
,
Integer
couponTemplateId
);
CouponCard
ReqDT
O
addCouponCard
(
Integer
userId
,
Integer
couponTemplateId
);
/**
* 使用优惠劵下单
...
...
@@ -97,7 +97,7 @@ public interface CouponRpc {
* @param couponCardId 优惠劵编号
* @return 优惠劵
*/
CouponCardDetail
B
O
getCouponCardDetail
(
Integer
userId
,
Integer
couponCardId
);
CouponCardDetail
RespDT
O
getCouponCardDetail
(
Integer
userId
,
Integer
couponCardId
);
/**
* 获得用户所有优惠劵,并标明是否可用
...
...
@@ -119,6 +119,6 @@ public interface CouponRpc {
* @param code 优惠码
* @return 优惠劵
*/
CouponCard
B
O
useCouponCode
(
Integer
userId
,
String
code
);
CouponCard
ReqDT
O
useCouponCode
(
Integer
userId
,
String
code
);
}
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dto/CouponCardAvailableRespDTO.java
浏览文件 @
495bf2ed
...
...
@@ -10,7 +10,7 @@ import lombok.experimental.Accessors;
*/
@Data
@Accessors
(
chain
=
true
)
public
class
CouponCardAvailableRespDTO
extends
CouponCard
B
O
{
public
class
CouponCardAvailableRespDTO
extends
CouponCard
ReqDT
O
{
/**
* 是否可用
...
...
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dto/CouponCardDetailRespDTO.java
0 → 100644
浏览文件 @
495bf2ed
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
;
}
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dto/CouponCardPage
B
O.java
→
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dto/CouponCardPage
RespDT
O.java
浏览文件 @
495bf2ed
...
...
@@ -11,12 +11,12 @@ import java.util.List;
*/
@Data
@Accessors
(
chain
=
true
)
public
class
CouponCardPage
B
O
implements
Serializable
{
public
class
CouponCardPage
RespDT
O
implements
Serializable
{
/**
* 优惠劵数组
*/
private
List
<
CouponCard
B
O
>
list
;
private
List
<
CouponCard
ReqDT
O
>
list
;
/**
* 总量
*/
...
...
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dto/CouponCard
B
O.java
→
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dto/CouponCard
ReqDT
O.java
浏览文件 @
495bf2ed
...
...
@@ -11,7 +11,7 @@ import java.util.Date;
*/
@Data
@Accessors
(
chain
=
true
)
public
class
CouponCard
B
O
implements
Serializable
{
public
class
CouponCard
ReqDT
O
implements
Serializable
{
// ========== 基本信息 BEGIN ==========
/**
...
...
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dto/CouponTemplatePage
B
O.java
→
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dto/CouponTemplatePage
RespDT
O.java
浏览文件 @
495bf2ed
...
...
@@ -11,12 +11,12 @@ import java.util.List;
*/
@Data
@Accessors
(
chain
=
true
)
public
class
CouponTemplatePage
B
O
implements
Serializable
{
public
class
CouponTemplatePage
RespDT
O
implements
Serializable
{
/**
* 优惠劵(码)数组
*/
private
List
<
CouponTemplate
B
O
>
list
;
private
List
<
CouponTemplate
ReqDT
O
>
list
;
/**
* 总量
*/
...
...
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dto/CouponTemplateReqDTO.java
0 → 100644
浏览文件 @
495bf2ed
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
CouponTemplateReqDTO
implements
Serializable
{
// ========== 基本信息 BEGIN ==========
/**
* 模板编号,自增唯一。
*/
private
Integer
id
;
/**
* 标题
*/
private
String
title
;
/**
* 使用说明
*/
private
String
description
;
/**
* 类型
*
* 1-优惠劵
* 2-优惠码
*/
private
Integer
type
;
/**
* 码类型
*
* 1-一卡一码(UNIQUE)
* 2-通用码(GENERAL)
*
* 【优惠码独有】 @see CouponCodeDO
*/
private
Integer
codeType
;
/**
* 优惠码状态
*
* 1-开启中
* 2-禁用中
* 3-已过期
*
* 当优惠劵(码)开启中,可以手动操作,设置禁用中。
*/
private
Integer
status
;
/**
* 每人限领个数
*
* null - 则表示不限制
*/
private
Integer
quota
;
/**
* 发放总量
*/
private
Integer
total
;
// ========== 领取规则 END ==========
// ========== 使用规则 BEGIN ==========
/**
* 是否设置满多少金额可用,单位:分
*
* 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
;
// ========== 使用规则 END ==========
// ========== 使用效果 BEGIN ==========
/**
* 优惠类型
*
* 1-代金卷
* 2-折扣卷
*/
private
Integer
preferentialType
;
/**
* 折扣百分比。
*
* 例如,80% 为 80。
* 当 100% 为 100 ,则代表免费。
*/
private
Integer
percentOff
;
/**
* 优惠金额,单位:分
*/
private
Integer
priceOff
;
/**
* 折扣上限,仅在 {@link #preferentialType} 等于 2 时生效。
*
* 例如,折扣上限为 20 元,当使用 8 折优惠券,订单金额为 1000 元时,最高只可折扣 20 元,而非 80 元。
*/
private
Integer
discountPriceLimit
;
// ========== 使用效果 END ==========
// ========== 统计信息 BEGIN ==========
/**
* 领取优惠券的次数
*/
private
Integer
statFetchNum
;
// ========== 统计信息 END ==========
/**
* 创建时间
*/
private
Date
createTime
;
}
promotion-service-project/promotion-service-app/pom.xml
浏览文件 @
495bf2ed
...
...
@@ -46,6 +46,12 @@
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
mall-spring-boot-starter-mybatis
</artifactId>
</dependency>
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
product-service-api
</artifactId>
<version>
1.0-SNAPSHOT
</version>
<scope>
compile
</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/convert/coupon/CouponCardConvert.java
0 → 100644
浏览文件 @
495bf2ed
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
cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardBO
;
import
cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardDetailBO
;
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);
//
@Mappings
({})
List
<
CouponCardBO
>
convertToBO
(
List
<
CouponCardDO
>
cardList
);
List
<
CouponCardReqDTO
>
convertToDTO
(
List
<
CouponCardDO
>
cardList
);
CouponCardReqDTO
convertToSingleDTO
(
CouponCardDO
card
);
@Mappings
({})
CouponCardBO
convert
(
CouponCardDO
card
);
@Mappings
({})
CouponCardDetailRespDTO
convert2
(
CouponCardDO
card
);
CouponCardAvailableBO
convertAvailBO
(
CouponCardDO
card
,
boolean
x
);
//@Mappings({})
//CouponCardAvailableBO convert2(CouponCardDO card, boolean x); // TODO 芋艿,临时用来解决 mapstruct 无法正确匹配方法的问题
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/convert/coupon/CouponTemplateConvert.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
convert
.
coupon
;
import
cn.iocoder.mall.promotion.api.rpc.coupon.dto.*
;
import
cn.iocoder.mall.promotionservice.dal.mysql.dataobject.coupon.CouponTemplateDO
;
import
cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardTemplateAddBO
;
import
cn.iocoder.mall.promotionservice.service.coupon.bo.CouponCardTemplateUpdateBO
;
import
cn.iocoder.mall.promotionservice.service.coupon.bo.CouponTemplateBO
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mappings
;
import
org.mapstruct.factory.Mappers
;
import
java.util.List
;
@Mapper
public
interface
CouponTemplateConvert
{
CouponTemplateConvert
INSTANCE
=
Mappers
.
getMapper
(
CouponTemplateConvert
.
class
);
// @Mappings({})
// CouponTemplateBO convertToBO(CouponTemplateDO banner);
//
@Mappings
({})
List
<
CouponTemplateBO
>
convertToBO
(
List
<
CouponTemplateDO
>
templateList
);
List
<
CouponTemplateReqDTO
>
convertToDTO
(
List
<
CouponTemplateDO
>
templateList
);
@Mappings
({})
CouponTemplateDO
convert
(
CouponCodeTemplateUpdateReqDTO
template
);
@Mappings
({})
CouponTemplateDO
convert
(
CouponCardTemplateAddReqDTO
template
);
@Mappings
({})
CouponTemplateDO
convert
(
CouponCardTemplateUpdateReqDTO
template
);
@Mappings
({})
CouponTemplateDO
convert
(
CouponCodeTemplateAddReqDTO
template
);
@Mappings
({})
CouponTemplateDO
convert
(
CouponCardTemplateAddBO
template
);
@Mappings
({})
CouponTemplateDO
convert
(
CouponCardTemplateUpdateBO
template
);
@Mappings
({})
CouponTemplateBO
convert
(
CouponTemplateDO
template
);
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/convert/recommend/ProductRecommendConvert.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
convert
.
recommend
;
import
cn.iocoder.mall.promotion.api.rpc.recommend.dto.ProductRecommendRespDTO
;
import
cn.iocoder.mall.promotionservice.dal.mysql.dataobject.recommend.ProductRecommendDO
;
import
cn.iocoder.mall.promotionservice.service.recommend.bo.ProductRecommendAddBO
;
import
cn.iocoder.mall.promotionservice.service.recommend.bo.ProductRecommendBO
;
import
cn.iocoder.mall.promotionservice.service.recommend.bo.ProductRecommendUpdateBO
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mappings
;
import
org.mapstruct.factory.Mappers
;
import
java.util.List
;
@Mapper
public
interface
ProductRecommendConvert
{
ProductRecommendConvert
INSTANCE
=
Mappers
.
getMapper
(
ProductRecommendConvert
.
class
);
@Mappings
({})
ProductRecommendBO
convertToBO
(
ProductRecommendDO
recommend
);
@Mappings
({})
List
<
ProductRecommendBO
>
convertToBO
(
List
<
ProductRecommendDO
>
recommendList
);
@Mappings
({})
List
<
ProductRecommendRespDTO
>
convertToDTO
(
List
<
ProductRecommendDO
>
recommendList
);
@Mappings
({})
ProductRecommendDO
convert
(
ProductRecommendAddBO
recommendAddDTO
);
@Mappings
({})
ProductRecommendDO
convert
(
ProductRecommendUpdateBO
recommendUpdateDTO
);
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/CouponService.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
coupon
;
import
cn.iocoder.common.framework.exception.util.ServiceExceptionUtil
;
import
cn.iocoder.common.framework.util.DateUtil
;
import
cn.iocoder.mall.promotion.api.enums.*
;
import
cn.iocoder.mall.promotion.api.rpc.coupon.dto.*
;
import
cn.iocoder.mall.promotionservice.convert.coupon.CouponCardConvert
;
import
cn.iocoder.mall.promotionservice.convert.coupon.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.mapper.coupon.CouponCardMapper
;
import
cn.iocoder.mall.promotionservice.dal.mysql.mapper.coupon.CouponTemplateMapper
;
import
cn.iocoder.mall.promotionservice.service.coupon.bo.*
;
import
cn.iocoder.common.framework.util.*
;
import
io.netty.util.internal.StringUtil
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.validation.annotation.Validated
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@Service
@Validated
public
class
CouponService
{
@Autowired
private
CouponTemplateMapper
couponTemplateMapper
;
@Autowired
private
CouponCardMapper
couponCardMapper
;
// ========== 优惠劵(码)模板 ==========
public
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
coupon
.
bo
.
CouponTemplateBO
getCouponTemplate
(
Integer
couponTemplateId
)
{
CouponTemplateDO
template
=
couponTemplateMapper
.
selectById
(
couponTemplateId
);
return
CouponTemplateConvert
.
INSTANCE
.
convert
(
template
);
}
public
CouponTemplatePageRespDTO
getCouponTemplatePage
(
CouponTemplatePageReqDTO
couponTemplatePageDTO
)
{
CouponTemplatePageRespDTO
couponTemplatePageBO
=
new
CouponTemplatePageRespDTO
();
// 查询分页数据
int
offset
=
(
couponTemplatePageDTO
.
getPageNo
()
-
1
)
*
couponTemplatePageDTO
.
getPageSize
();
couponTemplatePageBO
.
setList
(
CouponTemplateConvert
.
INSTANCE
.
convertToDTO
(
couponTemplateMapper
.
selectListByPage
(
couponTemplatePageDTO
.
getType
(),
couponTemplatePageDTO
.
getTitle
(),
couponTemplatePageDTO
.
getStatus
(),
couponTemplatePageDTO
.
getPreferentialType
(),
offset
,
couponTemplatePageDTO
.
getPageSize
())));
// 查询分页总数
couponTemplatePageBO
.
setTotal
(
couponTemplateMapper
.
selectCountByPage
(
couponTemplatePageDTO
.
getType
(),
couponTemplatePageDTO
.
getTitle
(),
couponTemplatePageDTO
.
getStatus
(),
couponTemplatePageDTO
.
getPreferentialType
()));
return
couponTemplatePageBO
;
}
public
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
coupon
.
bo
.
CouponTemplateBO
addCouponCardTemplate
(
CouponCardTemplateAddBO
couponCardTemplateAddDTO
)
{
// 校验生效日期相关
checkCouponTemplateDateType
(
couponCardTemplateAddDTO
.
getDateType
(),
couponCardTemplateAddDTO
.
getValidStartTime
(),
couponCardTemplateAddDTO
.
getValidEndTime
(),
couponCardTemplateAddDTO
.
getFixedBeginTerm
(),
couponCardTemplateAddDTO
.
getFixedEndTerm
());
// 校验优惠类型
Boolean
checkCouponTemplateDateTypeResult
=
checkCouponTemplatePreferentialType
(
couponCardTemplateAddDTO
.
getPreferentialType
(),
couponCardTemplateAddDTO
.
getPercentOff
(),
couponCardTemplateAddDTO
.
getPriceOff
(),
couponCardTemplateAddDTO
.
getPriceAvailable
());
// 保存优惠劵模板到数据库
CouponTemplateDO
template
=
CouponTemplateConvert
.
INSTANCE
.
convert
(
couponCardTemplateAddDTO
)
.
setType
(
CouponTemplateTypeEnum
.
CARD
.
getValue
())
.
setStatus
(
CouponTemplateStatusEnum
.
ENABLE
.
getValue
())
.
setStatFetchNum
(
0
);
template
.
setCreateTime
(
new
Date
());
couponTemplateMapper
.
insert
(
template
);
// 返回成功
return
CouponTemplateConvert
.
INSTANCE
.
convert
(
template
);
}
public
Boolean
updateCouponCodeTemplate
(
CouponCodeTemplateUpdateBO
couponCodeTemplateUpdateDTO
)
{
return
null
;
}
public
Boolean
updateCouponCardTemplate
(
CouponCardTemplateUpdateBO
couponCardTemplateUpdateDTO
)
{
// 校验 CouponCardTemplate 存在
CouponTemplateDO
template
=
couponTemplateMapper
.
selectById
(
couponCardTemplateUpdateDTO
.
getId
());
if
(
template
==
null
)
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_TEMPLATE_NOT_EXISTS
.
getCode
());
}
// 校验 CouponCardTemplate 是 CARD
if
(!
CouponTemplateTypeEnum
.
CARD
.
getValue
().
equals
(
template
.
getType
()))
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_TEMPLATE_NOT_CARD
.
getCode
());
}
// 校验发放数量不能减少
if
(
couponCardTemplateUpdateDTO
.
getTotal
()
<
template
.
getTotal
())
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_TEMPLATE_TOTAL_CAN_NOT_REDUCE
.
getCode
());
}
// 更新优惠劵模板到数据库
CouponTemplateDO
updateTemplateDO
=
CouponTemplateConvert
.
INSTANCE
.
convert
(
couponCardTemplateUpdateDTO
);
couponTemplateMapper
.
update
(
updateTemplateDO
);
// 返回成功
return
true
;
}
public
Boolean
updateCouponTemplateStatus
(
Integer
adminId
,
Integer
couponTemplateId
,
Integer
status
)
{
// 校验 CouponCardTemplate 存在
CouponTemplateDO
template
=
couponTemplateMapper
.
selectById
(
couponTemplateId
);
if
(
template
==
null
)
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_TEMPLATE_NOT_EXISTS
.
getCode
());
}
// 更新到数据库
CouponTemplateDO
updateTemplateDO
=
new
CouponTemplateDO
().
setId
(
couponTemplateId
).
setStatus
(
status
);
couponTemplateMapper
.
update
(
updateTemplateDO
);
// 返回成功
return
true
;
}
private
Boolean
checkCouponTemplateDateType
(
Integer
dateType
,
Date
validStartTime
,
Date
validEndTime
,
Integer
fixedBeginTerm
,
Integer
fixedEndTerm
)
{
/*if (CouponTemplateDateTypeEnum.FIXED_DATE.getValue().equals(dateType)) { // 固定日期
if (validStartTime == null) {
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "生效开始时间不能为空");
}
if (validEndTime == null) {
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "生效结束时间不能为空");
}
if (validStartTime.after(validEndTime)) {
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "生效开始时间不能大于生效结束时间");
}
} else if (CouponTemplateDateTypeEnum.FIXED_TERM.getValue().equals(dateType)) { // 领取日期
if (fixedBeginTerm == null) {
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "领取日期开始时间不能为空");
}
if (fixedEndTerm == null) {
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "领取日期结束时间不能为空");
}
} else {
throw new IllegalArgumentException("未知的生效日期类型:" + dateType);
}*/
return
true
;
}
private
Boolean
checkCouponTemplatePreferentialType
(
Integer
preferentialType
,
Integer
percentOff
,
Integer
priceOff
,
Integer
priceAvailable
)
{
/*if (PreferentialTypeEnum.PRICE.getValue().equals(preferentialType)) {
if (priceOff == null) {
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "优惠金额不能为空");
}
if (priceOff >= priceAvailable) {
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "优惠金额不能d大于等于使用金额门槛");
}
} else if (PreferentialTypeEnum.DISCOUNT.getValue().equals(preferentialType)) {
if (percentOff == null) {
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "折扣百分比不能为空");
}
} else {
throw new IllegalArgumentException("未知的优惠类型:" + preferentialType);
}*/
return
true
;
}
// ========== 优惠劵 ==========
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
(
PromotionErrorCodeEnum
.
COUPON_TEMPLATE_NOT_EXISTS
.
getCode
());
}
// 校验 CouponCardTemplate 是 CARD
if
(!
CouponTemplateTypeEnum
.
CARD
.
getValue
().
equals
(
template
.
getType
()))
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_TEMPLATE_NOT_CARD
.
getCode
());
}
// 校验 CouponCardTemplate 状态是否开启
if
(!
CouponTemplateStatusEnum
.
ENABLE
.
getValue
().
equals
(
template
.
getStatus
()))
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_TEMPLATE_STATUS_NOT_ENABLE
.
getCode
());
}
// 校验 CouponCardTemplate 是否到达可领取的上限
if
(
template
.
getStatFetchNum
()
>
template
.
getTotal
())
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_TEMPLATE_TOTAL_NOT_ENOUGH
.
getCode
());
}
// 校验单人可领取优惠劵是否到达上限
if
(
couponCardMapper
.
selectCountByUserIdAndTemplateId
(
userId
,
couponTemplateId
)
>
template
.
getQuota
())
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_TEMPLATE_CARD_ADD_EXCEED_QUOTA
.
getCode
());
}
// 增加优惠劵已领取量
int
updateTemplateCount
=
couponTemplateMapper
.
updateStatFetchNumIncr
(
couponTemplateId
);
if
(
updateTemplateCount
==
0
)
{
// 超过 CouponCardTemplate 发放量
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
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
(
PromotionErrorCodeEnum
.
COUPON_CARD_NOT_EXISTS
.
getCode
());
}
if
(!
userId
.
equals
(
card
.
getUserId
()))
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_CARD_ERROR_USER
.
getCode
());
}
if
(!
CouponCardStatusEnum
.
UNUSED
.
getValue
().
equals
(
card
.
getStatus
()))
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_CARD_STATUS_NOT_UNUSED
.
getCode
());
}
if
(
DateUtil
.
isBetween
(
card
.
getValidStartTime
(),
card
.
getValidEndTime
()))
{
// 为避免定时器没跑,实际优惠劵已经过期
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
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
(
PromotionErrorCodeEnum
.
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
(
PromotionErrorCodeEnum
.
COUPON_CARD_NOT_EXISTS
.
getCode
());
}
if
(!
userId
.
equals
(
card
.
getUserId
()))
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_CARD_ERROR_USER
.
getCode
());
}
if
(!
CouponCardStatusEnum
.
USED
.
getValue
().
equals
(
card
.
getStatus
()))
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
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
(
PromotionErrorCodeEnum
.
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
(
PromotionErrorCodeEnum
.
COUPON_CARD_NOT_EXISTS
.
getCode
());
}
if
(!
userId
.
equals
(
card
.
getUserId
()))
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
COUPON_CARD_ERROR_USER
.
getCode
());
}
// 查询优惠劵模板
CouponTemplateDO
template
=
couponTemplateMapper
.
selectById
(
card
.
getTemplateId
());
if
(
template
==
null
)
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
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
)
/
100
D
);
}
return
null
;
}
// ========== 优惠码 ==========
public
CouponCardReqDTO
useCouponCode
(
Integer
userId
,
String
code
)
{
return
null
;
}
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/bo/CouponCardAvailableBO.java
0 → 100644
浏览文件 @
495bf2ed
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
;
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/bo/CouponCardBO.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
coupon
.
bo
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* 优惠劵 BO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
CouponCardBO
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
;
}
promotion-service-project/promotion-service-ap
i/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dt
o/CouponCardDetailBO.java
→
promotion-service-project/promotion-service-ap
p/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/b
o/CouponCardDetailBO.java
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotion
.
api
.
rpc
.
coupon
.
dt
o
;
package
cn
.
iocoder
.
mall
.
promotion
service
.
service
.
coupon
.
b
o
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
...
...
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/bo/CouponCardPageBO.java
0 → 100644
浏览文件 @
495bf2ed
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
;
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/bo/CouponCardSpuBO.java
0 → 100644
浏览文件 @
495bf2ed
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
;
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/bo/CouponCardTemplateAddBO.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
coupon
.
bo
;
import
cn.iocoder.common.framework.validator.InEnum
;
import
cn.iocoder.mall.promotion.api.enums.CouponTemplateDateTypeEnum
;
import
cn.iocoder.mall.promotion.api.enums.PreferentialTypeEnum
;
import
cn.iocoder.mall.promotion.api.enums.RangeTypeEnum
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
javax.validation.constraints.Max
;
import
javax.validation.constraints.Min
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* 优惠劵模板添加 DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
CouponCardTemplateAddBO
implements
Serializable
{
// ========== 基本信息 BEGIN ==========
/**
* 标题
*/
@NotEmpty
(
message
=
"标题不能为空"
)
private
String
title
;
/**
* 使用说明
*/
private
String
description
;
// ========== 基本信息 END ==========
// ========== 领取规则 BEGIN ==========
/**
* 每人限领个数
*/
@NotNull
(
message
=
"每人限领个数不能为空"
)
@Min
(
value
=
1
,
message
=
"每人限领个数最小为 {value}"
)
private
Integer
quota
;
/**
* 发放总量
*/
@NotNull
(
message
=
"发放总量不能为空"
)
@Min
(
value
=
1
,
message
=
"每人限领个数最小为 {value}"
)
private
Integer
total
;
// ========== 领取规则 END ==========
// ========== 使用规则 BEGIN ==========
/**
* 是否设置满多少金额可用,单位:分
*
* 0-不限制
* 大于0-多少金额可用
*/
@NotNull
(
message
=
"使用金额门槛不能为空"
)
@Min
(
value
=
0L
,
message
=
"使用金额门槛最低为 {value}"
)
private
Integer
priceAvailable
;
/**
* 可用范围的类型
*
* 10-全部(ALL):所有可用
* 20-部分(PART):部分商品可用,或指定商品可用
* 21-部分(PART):部分商品不可用,或指定商品可用
* 30-部分(PART):部分分类可用,或指定分类可用
* 31-部分(PART):部分分类不可用,或指定分类可用
*/
@NotNull
(
message
=
"可用范围的类型不能为空"
)
@InEnum
(
value
=
RangeTypeEnum
.
class
,
message
=
"可用范围的类型必须在 {value}"
)
private
Integer
rangeType
;
/**
* 指定商品 / 分类列表,使用逗号分隔商品编号
*/
private
String
rangeValues
;
/**
* 生效日期类型
*
* 1-固定日期
* 2-领取日期:领到券 {@link #fixedEndTerm} 日开始 N 天内有效
*/
@NotNull
(
message
=
"生效日期类型不能为空"
)
@InEnum
(
value
=
CouponTemplateDateTypeEnum
.
class
,
message
=
"生效日期类型必须在 {value}"
)
private
Integer
dateType
;
/**
* 固定日期-生效开始时间
*/
private
Date
validStartTime
;
/**
* 固定日期-生效结束时间
*/
private
Date
validEndTime
;
/**
* 领取日期-开始天数
*
* 例如,0-当天;1-次天
*/
@Min
(
value
=
0L
,
message
=
"领取日期开始时间最小为 {value}"
)
private
Integer
fixedBeginTerm
;
/**
* 领取日期-结束天数
*/
@Min
(
value
=
1L
,
message
=
"领取日期结束时间最小为 {value}"
)
private
Integer
fixedEndTerm
;
// ========== 使用规则 END ==========
// ========== 使用效果 BEGIN ==========
/**
* 优惠类型
*
* 1-代金卷
* 2-折扣卷
*/
@NotNull
(
message
=
"优惠类型不能为空"
)
@InEnum
(
value
=
PreferentialTypeEnum
.
class
,
message
=
"优惠类型必须在 {value}"
)
private
Integer
preferentialType
;
/**
* 优惠金额,单位:分
*/
@Min
(
value
=
1
,
message
=
"优惠金额最小值为 {value}"
)
private
Integer
priceOff
;
/**
* 折扣百分比。
*
* 例如,80% 为 80。
* 当 100% 为 100 ,则代表免费。
*/
@Max
(
value
=
100
,
message
=
"折扣比最大值为 {value}"
)
private
Integer
percentOff
;
/**
* 折扣上限,仅在 {@link #preferentialType} 等于 2 时生效。
*
* 例如,折扣上限为 20 元,当使用 8 折优惠券,订单金额为 1000 元时,最高只可折扣 20 元,而非 80 元。
*/
@Min
(
value
=
1
,
message
=
"折扣上限最小值为 {value}"
)
private
Integer
discountPriceLimit
;
// ========== 使用效果 END ==========
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/bo/CouponCardTemplateUpdateBO.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
coupon
.
bo
;
import
cn.iocoder.common.framework.validator.InEnum
;
import
cn.iocoder.mall.promotion.api.enums.RangeTypeEnum
;
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
;
/**
* 优惠劵模板更新 DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
CouponCardTemplateUpdateBO
implements
Serializable
{
@NotNull
(
message
=
"编号不能为空"
)
private
Integer
id
;
// ========== 基本信息 BEGIN ==========
/**
* 标题
*/
@NotEmpty
(
message
=
"标题不能为空"
)
private
String
title
;
/**
* 使用说明
*/
private
String
description
;
// ========== 基本信息 END ==========
// ========== 领取规则 BEGIN ==========
/**
* 每人限领个数
*/
@NotNull
(
message
=
"每人限领个数不能为空"
)
@Min
(
value
=
1
,
message
=
"每人限领个数最小为 {value}"
)
private
Integer
quota
;
/**
* 发放总量
*/
@NotNull
(
message
=
"发放总量不能为空"
)
@Min
(
value
=
1
,
message
=
"每人限领个数最小为 {value}"
)
private
Integer
total
;
// ========== 领取规则 END ==========
// ========== 使用规则 BEGIN ==========
// /**
// * 是否设置满多少金额可用,单位:分
// *
// * 0-不限制
// * 大于0-多少金额可用
// */
// @NotNull(message = "使用金额门槛不能为空")
// @Min(value = 0L, message = "使用金额门槛最低为 {value}")
// private Integer priceAvailable;
/**
* 可用范围的类型
*
* 10-全部(ALL):所有可用
* 20-部分(PART):部分商品可用,或指定商品可用
* 21-部分(PART):部分商品不可用,或指定商品可用
* 30-部分(PART):部分分类可用,或指定分类可用
* 31-部分(PART):部分分类不可用,或指定分类可用
*/
@NotNull
(
message
=
"可用范围的类型不能为空"
)
@InEnum
(
value
=
RangeTypeEnum
.
class
,
message
=
"可用范围的类型必须在 {value}"
)
private
Integer
rangeType
;
/**
* 指定商品 / 分类列表,使用逗号分隔商品编号
*/
private
String
rangeValues
;
// /**
// * 生效日期类型
// *
// * 1-固定日期
// * 2-领取日期:领到券 {@link #fixedEndTerm} 日开始 N 天内有效
// */
// @NotNull(message = "生效日期类型不能为空")
// @InEnum(value = CouponTemplateDateTypeEnum.class, message = "生效日期类型必须在 {value}")
// private Integer dateType;
// /**
// * 固定日期-生效开始时间
// */
// private Date validStartTime;
// /**
// * 固定日期-生效结束时间
// */
// private Date validEndTime;
// /**
// * 领取日期-开始天数
// *
// * 例如,0-当天;1-次天
// */
// @Min(value = 0L, message = "领取日期开始时间最小为 {value}")
// private Integer fixedBeginTerm;
// /**
// * 领取日期-结束天数
// */
// @Min(value = 1L, message = "领取日期结束时间最小为 {value}")
// private Integer fixedEndTerm;
// ========== 使用规则 END ==========
// ========== 使用效果 BEGIN ==========
// /**
// * 优惠类型
// *
// * 1-代金卷
// * 2-折扣卷
// */
// @NotNull(message = "优惠类型不能为空")
// @InEnum(value = CouponTemplatePreferentialTypeEnum.class, message = "优惠类型必须在 {value}")
// private Integer preferentialType;
// /**
// * 优惠金额,单位:分
// */
// @Min(value = 1, message = "优惠金额最小值为 {value}")
// private Integer priceOff;
// /**
// * 折扣百分比。
// *
// * 例如,80% 为 80。
// * 当 100% 为 100 ,则代表免费。
// */
// @Max(value = 100, message = "折扣比最大值为 {value}")
// private Integer percentOff;
// /**
// * 折扣上限,仅在 {@link #preferentialType} 等于 2 时生效。
// *
// * 例如,折扣上限为 20 元,当使用 8 折优惠券,订单金额为 1000 元时,最高只可折扣 20 元,而非 80 元。
// */
// @Min(value = 1, message = "折扣上限最小值为 {value}")
// private Integer discountPriceLimit;
// ========== 使用效果 END ==========
public
Integer
getId
()
{
return
id
;
}
public
CouponCardTemplateUpdateBO
setId
(
Integer
id
)
{
this
.
id
=
id
;
return
this
;
}
public
String
getTitle
()
{
return
title
;
}
public
CouponCardTemplateUpdateBO
setTitle
(
String
title
)
{
this
.
title
=
title
;
return
this
;
}
public
String
getDescription
()
{
return
description
;
}
public
CouponCardTemplateUpdateBO
setDescription
(
String
description
)
{
this
.
description
=
description
;
return
this
;
}
public
Integer
getQuota
()
{
return
quota
;
}
public
CouponCardTemplateUpdateBO
setQuota
(
Integer
quota
)
{
this
.
quota
=
quota
;
return
this
;
}
public
Integer
getTotal
()
{
return
total
;
}
public
CouponCardTemplateUpdateBO
setTotal
(
Integer
total
)
{
this
.
total
=
total
;
return
this
;
}
public
Integer
getRangeType
()
{
return
rangeType
;
}
public
CouponCardTemplateUpdateBO
setRangeType
(
Integer
rangeType
)
{
this
.
rangeType
=
rangeType
;
return
this
;
}
public
String
getRangeValues
()
{
return
rangeValues
;
}
public
CouponCardTemplateUpdateBO
setRangeValues
(
String
rangeValues
)
{
this
.
rangeValues
=
rangeValues
;
return
this
;
}
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/bo/CouponCodeTemplateUpdateBO.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
coupon
.
bo
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
/**
* 优惠码模板更新 DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
CouponCodeTemplateUpdateBO
implements
Serializable
{
}
promotion-service-project/promotion-service-ap
i/src/main/java/cn/iocoder/mall/promotion/api/rpc/coupon/dt
o/CouponTemplateBO.java
→
promotion-service-project/promotion-service-ap
p/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/b
o/CouponTemplateBO.java
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotion
.
api
.
rpc
.
coupon
.
dt
o
;
package
cn
.
iocoder
.
mall
.
promotion
service
.
service
.
coupon
.
b
o
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
...
...
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/coupon/bo/CouponTemplatePageBO.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
coupon
.
bo
;
import
cn.iocoder.mall.promotion.api.rpc.coupon.dto.CouponTemplateReqDTO
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
import
java.util.List
;
/**
* 优惠劵(码)模板分页 BO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
CouponTemplatePageBO
implements
Serializable
{
/**
* 优惠劵(码)数组
*/
private
List
<
CouponTemplateReqDTO
>
list
;
/**
* 总量
*/
private
Integer
total
;
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/recommend/ProductRecommendService.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
recommend
;
import
cn.iocoder.common.framework.enums.CommonStatusEnum
;
import
cn.iocoder.common.framework.exception.util.ServiceExceptionUtil
;
import
cn.iocoder.mall.mybatis.core.enums.DeletedStatusEnum
;
import
cn.iocoder.mall.productservice.rpc.spu.ProductSpuRpc
;
import
cn.iocoder.mall.promotion.api.enums.PromotionErrorCodeEnum
;
import
cn.iocoder.mall.promotion.api.rpc.recommend.dto.ProductRecommendPageReqDTO
;
import
cn.iocoder.mall.promotion.api.rpc.recommend.dto.ProductRecommendPageRespDTO
;
import
cn.iocoder.mall.promotionservice.convert.recommend.ProductRecommendConvert
;
import
cn.iocoder.mall.promotionservice.dal.mysql.dataobject.recommend.ProductRecommendDO
;
import
cn.iocoder.mall.promotionservice.dal.mysql.mapper.recommend.ProductRecommendMapper
;
import
cn.iocoder.mall.promotionservice.service.recommend.bo.ProductRecommendAddBO
;
import
cn.iocoder.mall.promotionservice.service.recommend.bo.ProductRecommendBO
;
import
cn.iocoder.mall.promotionservice.service.recommend.bo.ProductRecommendPageBO
;
import
cn.iocoder.mall.promotionservice.service.recommend.bo.ProductRecommendUpdateBO
;
import
org.apache.dubbo.config.annotation.Reference
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.validation.annotation.Validated
;
import
java.util.Date
;
import
java.util.List
;
@Service
@Validated
public
class
ProductRecommendService
{
@Reference
(
validation
=
"true"
,
version
=
"${dubbo.consumer.ProductSpuService.version}"
)
private
ProductSpuRpc
productSpuRpc
;
@Autowired
private
ProductRecommendMapper
productRecommendMapper
;
public
List
<
ProductRecommendBO
>
getProductRecommendList
(
Integer
type
,
Integer
status
)
{
List
<
ProductRecommendDO
>
productRecommends
=
productRecommendMapper
.
selectListByTypeAndStatus
(
type
,
status
);
return
ProductRecommendConvert
.
INSTANCE
.
convertToBO
(
productRecommends
);
}
public
ProductRecommendPageRespDTO
getProductRecommendPage
(
ProductRecommendPageReqDTO
productRecommendPageDTO
)
{
ProductRecommendPageRespDTO
productRecommendPageBO
=
new
ProductRecommendPageRespDTO
();
// 查询分页数据
int
offset
=
(
productRecommendPageDTO
.
getPageNo
()
-
1
)
*
productRecommendPageDTO
.
getPageSize
();
productRecommendPageBO
.
setList
(
ProductRecommendConvert
.
INSTANCE
.
convertToDTO
(
productRecommendMapper
.
selectPageByType
(
productRecommendPageDTO
.
getType
(),
offset
,
productRecommendPageDTO
.
getPageSize
())));
// 查询分页总数
productRecommendPageBO
.
setTotal
(
productRecommendMapper
.
selectCountByType
(
productRecommendPageDTO
.
getType
()));
return
productRecommendPageBO
;
}
public
ProductRecommendBO
addProductRecommend
(
Integer
adminId
,
ProductRecommendAddBO
productRecommendAddDTO
)
{
// 校验商品不存在
if
(
productSpuRpc
.
getProductSpu
(
productRecommendAddDTO
.
getProductSpuId
())
==
null
)
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
PRODUCT_RECOMMEND_PRODUCT_NOT_EXISTS
.
getCode
());
}
// 校验商品是否已经推荐
if
(
productRecommendMapper
.
selectByProductSpuIdAndType
(
productRecommendAddDTO
.
getProductSpuId
(),
productRecommendAddDTO
.
getType
())
!=
null
)
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
PRODUCT_RECOMMEND_EXISTS
.
getCode
());
}
// 保存到数据库
ProductRecommendDO
productRecommend
=
ProductRecommendConvert
.
INSTANCE
.
convert
(
productRecommendAddDTO
).
setStatus
(
CommonStatusEnum
.
ENABLE
.
getValue
());
productRecommend
.
setDeleted
(
DeletedStatusEnum
.
DELETED_NO
.
getValue
()).
setCreateTime
(
new
Date
());
productRecommendMapper
.
insert
(
productRecommend
);
// 返回成功
return
ProductRecommendConvert
.
INSTANCE
.
convertToBO
(
productRecommend
);
}
public
Boolean
updateProductRecommend
(
Integer
adminId
,
ProductRecommendUpdateBO
productRecommendUpdateDTO
)
{
// 校验更新的商品推荐存在
if
(
productRecommendMapper
.
selectById
(
productRecommendUpdateDTO
.
getId
())
==
null
)
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
PRODUCT_RECOMMEND_NOT_EXISTS
.
getCode
());
}
// 校验商品不存在
if
(
productSpuRpc
.
getProductSpu
(
productRecommendUpdateDTO
.
getProductSpuId
())
==
null
)
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
PRODUCT_RECOMMEND_PRODUCT_NOT_EXISTS
.
getCode
());
}
// 校验商品是否已经推荐
ProductRecommendDO
existProductRecommend
=
productRecommendMapper
.
selectByProductSpuIdAndType
(
productRecommendUpdateDTO
.
getProductSpuId
(),
productRecommendUpdateDTO
.
getType
());
if
(
existProductRecommend
!=
null
&&
!
existProductRecommend
.
getId
().
equals
(
productRecommendUpdateDTO
.
getId
()))
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
PRODUCT_RECOMMEND_EXISTS
.
getCode
());
}
// 更新到数据库
ProductRecommendDO
updateProductRecommend
=
ProductRecommendConvert
.
INSTANCE
.
convert
(
productRecommendUpdateDTO
);
productRecommendMapper
.
update
(
updateProductRecommend
);
// 返回成功
return
true
;
}
public
Boolean
updateProductRecommendStatus
(
Integer
adminId
,
Integer
productRecommendId
,
Integer
status
)
{
// 校验更新的商品推荐存在
if
(
productRecommendMapper
.
selectById
(
productRecommendId
)
==
null
)
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
PRODUCT_RECOMMEND_NOT_EXISTS
.
getCode
());
}
// 更新到数据库
ProductRecommendDO
updateProductRecommend
=
new
ProductRecommendDO
().
setId
(
productRecommendId
).
setStatus
(
status
);
productRecommendMapper
.
update
(
updateProductRecommend
);
// 返回成功
return
true
;
}
public
Boolean
deleteProductRecommend
(
Integer
adminId
,
Integer
productRecommendId
)
{
// 校验更新的商品推荐存在
if
(
productRecommendMapper
.
selectById
(
productRecommendId
)
==
null
)
{
throw
ServiceExceptionUtil
.
exception
(
PromotionErrorCodeEnum
.
PRODUCT_RECOMMEND_NOT_EXISTS
.
getCode
());
}
// 更新到数据库
ProductRecommendDO
updateProductRecommend
=
new
ProductRecommendDO
().
setId
(
productRecommendId
);
updateProductRecommend
.
setDeleted
(
DeletedStatusEnum
.
DELETED_YES
.
getValue
());
productRecommendMapper
.
update
(
updateProductRecommend
);
// 返回成功
return
true
;
}
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/recommend/bo/ProductRecommendAddBO.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
recommend
.
bo
;
import
cn.iocoder.common.framework.validator.InEnum
;
import
cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
org.hibernate.validator.constraints.Length
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
/**
* 商品推荐添加 DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
ProductRecommendAddBO
implements
Serializable
{
@InEnum
(
value
=
ProductRecommendTypeEnum
.
class
,
message
=
"修改推荐类型必须是 {value}"
)
@NotNull
(
message
=
"推荐类型不能为空"
)
private
Integer
type
;
@NotNull
(
message
=
"商品编号不能为空"
)
private
Integer
productSpuId
;
@NotNull
(
message
=
"排序不能为空"
)
private
Integer
sort
;
@Length
(
max
=
255
,
message
=
"备注最大长度为 255 位"
)
private
String
memo
;
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/recommend/bo/ProductRecommendBO.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
recommend
.
bo
;
import
cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* 商品推荐 BO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
ProductRecommendBO
implements
Serializable
{
/**
* 编号
*/
private
Integer
id
;
/**
* 类型
*
* {@link ProductRecommendTypeEnum}
*/
private
Integer
type
;
/**
* 商品 Spu 编号
*/
private
Integer
productSpuId
;
/**
* 排序
*/
private
Integer
sort
;
/**
* 状态
*
* {@link cn.iocoder.common.framework.enums.CommonStatusEnum}
*/
private
Integer
status
;
/**
* 备注
*/
private
String
memo
;
/**
* 创建时间
*/
private
Date
createTime
;
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/recommend/bo/ProductRecommendPageBO.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
recommend
.
bo
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
/**
* 商品推荐分页 DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
ProductRecommendPageBO
implements
Serializable
{
/**
* 推荐类型
*/
private
Integer
type
;
@NotNull
(
message
=
"页码不能为空"
)
private
Integer
pageNo
;
@NotNull
(
message
=
"每页条数不能为空"
)
private
Integer
pageSize
;
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/recommend/bo/ProductRecommendUpdateBO.java
0 → 100644
浏览文件 @
495bf2ed
package
cn
.
iocoder
.
mall
.
promotionservice
.
service
.
recommend
.
bo
;
import
cn.iocoder.common.framework.validator.InEnum
;
import
cn.iocoder.mall.promotion.api.enums.ProductRecommendTypeEnum
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
org.hibernate.validator.constraints.Length
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
/**
* 商品推荐更新 DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
ProductRecommendUpdateBO
implements
Serializable
{
@NotNull
(
message
=
"编号不能为空"
)
private
Integer
id
;
@NotNull
(
message
=
"类型不能为空"
)
@InEnum
(
value
=
ProductRecommendTypeEnum
.
class
,
message
=
"修改推荐类型必须是 {value}"
)
private
Integer
type
;
@NotNull
(
message
=
"商品编号不能为空"
)
private
Integer
productSpuId
;
@NotNull
(
message
=
"排序不能为空"
)
private
Integer
sort
;
@Length
(
max
=
255
,
message
=
"备注最大长度为 255 位"
)
private
String
memo
;
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论