Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
8818b350
提交
8818b350
authored
8月 15, 2020
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Price 价格服务的编写
上级
5122b68a
隐藏空白字符变更
内嵌
并排
正在显示
26 个修改的文件
包含
330 行增加
和
60 行删除
+330
-60
ProductSkuRespDTO.java
...er/mall/productservice/rpc/sku/dto/ProductSkuRespDTO.java
+17
-0
pom.xml
product-service-project/product-service-app/pom.xml
+7
-0
ProductSkuConvert.java
...er/mall/productservice/convert/sku/ProductSkuConvert.java
+31
-1
ProductSpuConvert.java
...er/mall/productservice/convert/spu/ProductSpuConvert.java
+6
-6
ProductSkuManager.java
...er/mall/productservice/manager/sku/ProductSkuManager.java
+28
-4
ProductSpuManager.java
...er/mall/productservice/manager/spu/ProductSpuManager.java
+3
-3
ProductSkuManagerTest.java
...all/productservice/manager/spu/ProductSkuManagerTest.java
+34
-0
package-info.java
...est/java/cn/iocoder/mall/productservice/package-info.java
+1
-0
PromotionActivityRpc.java
...mall/promotion/api/rpc/activity/PromotionActivityRpc.java
+13
-8
PromotionActivityListReqDTO.java
...ion/api/rpc/activity/dto/PromotionActivityListReqDTO.java
+21
-0
PromotionActivityRespDTO.java
...motion/api/rpc/activity/dto/PromotionActivityRespDTO.java
+1
-1
PriceProductCalcReqDTO.java
...l/promotion/api/rpc/price/dto/PriceProductCalcReqDTO.java
+9
-1
PriceProductCalcRespDTO.java
.../promotion/api/rpc/price/dto/PriceProductCalcRespDTO.java
+9
-3
PromotionActivityMapper.java
...ce/dal/mysql/mapper/activity/PromotionActivityMapper.java
+6
-0
PromotionActivityManager.java
...ionservice/manager/activity/PromotionActivityManager.java
+26
-0
package-info.java
...n/iocoder/mall/promotionservice/manager/package-info.java
+0
-1
PriceManager.java
...der/mall/promotionservice/manager/price/PriceManager.java
+8
-7
PromotionActivityRpcImpl.java
...omotionservice/rpc/activity/PromotionActivityRpcImpl.java
+26
-0
package-info.java
...va/cn/iocoder/mall/promotionservice/rpc/package-info.java
+0
-1
PromotionActivityService.java
...ionservice/service/activity/PromotionActivityService.java
+6
-14
ProductRecommendService.java
...ionservice/service/recommend/ProductRecommendService.java
+2
-2
CartController.java
...iocoder/mall/shopweb/controller/order/CartController.java
+1
-1
CartConvert.java
...va/cn/iocoder/mall/shopweb/convert/order/CartConvert.java
+7
-0
CartManager.java
.../iocoder/mall/shopweb/manager/order/cart/CartManager.java
+66
-6
package-info.java
...a/cn/iocoder/mall/shopweb/manager/order/package-info.java
+0
-1
application.yml
shop-web-app/src/main/resources/application.yml
+2
-0
没有找到文件。
product-service-project/product-service-api/src/main/java/cn/iocoder/mall/productservice/rpc/sku/dto/ProductSkuRespDTO.java
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
productservice
.
rpc
.
sku
.
dto
;
import
cn.iocoder.mall.productservice.enums.sku.ProductSkuDetailFieldEnum
;
import
cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyValueRespDTO
;
import
cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
...
...
@@ -46,5 +49,19 @@ public class ProductSkuRespDTO implements Serializable {
* 创建时间
*/
private
Date
createTime
;
/**
* 规格值数组
*
* 需要设置 {@link ProductSkuDetailFieldEnum#ATTR} 才返回
*/
private
List
<
ProductAttrKeyValueRespDTO
>
attrs
;
/**
* 商品 SPU 信息
*
* 需要设置 {@link ProductSkuDetailFieldEnum#SPU} 才返回
*
* // TODO 芋艿,后续考虑怎么优化下,目前是内嵌了别的 dto
*/
private
ProductSpuRespDTO
spu
;
}
product-service-project/product-service-app/pom.xml
浏览文件 @
8818b350
...
...
@@ -70,6 +70,13 @@
<artifactId>
spring-boot-starter-actuator
</artifactId>
</dependency>
<!-- Test 相关 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
...
...
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/convert/sku/ProductSkuConvert.java
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
productservice
.
convert
.
sku
;
import
cn.iocoder.common.framework.util.CollectionUtils
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.mall.productservice.dal.mysql.dataobject.sku.ProductSkuDO
;
import
cn.iocoder.mall.productservice.rpc.attr.dto.ProductAttrKeyValueRespDTO
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO
;
import
cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO
;
import
cn.iocoder.mall.productservice.service.attr.bo.ProductAttrKeyValueBO
;
import
cn.iocoder.mall.productservice.service.sku.bo.ProductSkuBO
;
import
cn.iocoder.mall.productservice.service.sku.bo.ProductSkuCreateOrUpdateBO
;
import
cn.iocoder.mall.productservice.service.sku.bo.ProductSkuListQueryBO
;
import
cn.iocoder.mall.productservice.service.spu.bo.ProductSpuBO
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mapping
;
import
org.mapstruct.Named
;
import
org.mapstruct.factory.Mappers
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
@Mapper
public
interface
ProductSkuConvert
{
...
...
@@ -33,7 +40,30 @@ public interface ProductSkuConvert {
ProductSkuListQueryBO
convert
(
ProductSkuListQueryReqDTO
bean
);
List
<
ProductSkuRespDTO
>
convertList03
(
List
<
ProductSkuBO
>
list
);
ProductSpuRespDTO
convert
(
ProductSpuBO
bean
);
ProductAttrKeyValueRespDTO
convert
(
ProductAttrKeyValueBO
bean
);
default
List
<
ProductSkuRespDTO
>
convertList
(
List
<
ProductSkuBO
>
skuBOs
,
List
<
ProductSpuBO
>
spuBOs
,
List
<
ProductAttrKeyValueBO
>
attrBOs
)
{
// 创建 ProductAttrDetailBO 的映射。其中,KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号
Map
<
Integer
,
ProductAttrKeyValueBO
>
attrDetailBOMap
=
CollectionUtils
.
convertMap
(
attrBOs
,
ProductAttrKeyValueBO:
:
getAttrValueId
);
// 构建 ProductSpuBO 的映射。
Map
<
Integer
,
ProductSpuBO
>
spuBOMap
=
CollectionUtils
.
convertMap
(
spuBOs
,
ProductSpuBO:
:
getId
);
// 拼接数据
List
<
ProductSkuRespDTO
>
skuRespDTOs
=
new
ArrayList
<>(
skuBOs
.
size
());
skuBOs
.
forEach
(
skuBO
->
{
ProductSkuRespDTO
skuRespDTO
=
convert
(
skuBO
);
skuRespDTOs
.
add
(
skuRespDTO
);
// 拼接商品 SPU
skuRespDTO
.
setSpu
(
convert
(
spuBOMap
.
get
(
skuBO
.
getSpuId
())));
// 拼接商品 Attr
skuRespDTO
.
setAttrs
(
new
ArrayList
<>());
skuBO
.
getAttrValueIds
().
forEach
(
attrValueId
->
skuRespDTO
.
getAttrs
().
add
(
convert
(
attrDetailBOMap
.
get
(
attrValueId
))));
});
return
skuRespDTOs
;
}
@Named
(
"translateAttrValueIdsFromString"
)
default
List
<
Integer
>
translateAttrValueIdsFromString
(
String
attrValueIdsStar
)
{
...
...
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/convert/spu/ProductSpuConvert.java
浏览文件 @
8818b350
...
...
@@ -63,21 +63,21 @@ public interface ProductSpuConvert {
ProductAttrKeyValueRespDTO
convert
(
ProductAttrKeyValueBO
bean
);
default
ProductSpuDetailRespDTO
convert
(
ProductSpuBO
spuBO
,
List
<
ProductSkuBO
>
skuBOs
,
List
<
ProductAttrKeyValueBO
>
attrBOs
,
ProductCategoryBO
categoryBO
)
{
default
ProductSpuDetailRespDTO
convert
(
ProductSpuBO
spuBO
,
List
<
ProductSkuBO
>
skuBOs
,
List
<
ProductAttrKeyValueBO
>
attrBOs
,
ProductCategoryBO
categoryBO
)
{
// 创建并转换 ProductSpuDetailBO 对象
ProductSpuDetailRespDTO
spuDetailDTO
=
this
.
convert2
(
spuBO
);
// 创建 ProductAttrDetailBO 的映射。其中,KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号
Map
<
Integer
,
ProductAttrKeyValueBO
>
productA
ttrDetailBOMap
=
attrBOs
.
stream
().
collect
(
Map
<
Integer
,
ProductAttrKeyValueBO
>
a
ttrDetailBOMap
=
attrBOs
.
stream
().
collect
(
Collectors
.
toMap
(
ProductAttrKeyValueBO:
:
getAttrValueId
,
attrBO
->
attrBO
));
// 创建并转换 ProductSpuDetailBO 数组
spuDetailDTO
.
setSkus
(
new
ArrayList
<>());
skuBOs
.
forEach
(
sku
->
{
skuBOs
.
forEach
(
sku
BO
->
{
// 创建 ProductSpuDetailBO 对象
ProductSpuDetailRespDTO
.
Sku
skuDetail
=
convert
(
sku
).
setAttrs
(
new
ArrayList
<>());
ProductSpuDetailRespDTO
.
Sku
skuDetail
=
convert
(
sku
BO
).
setAttrs
(
new
ArrayList
<>());
spuDetailDTO
.
getSkus
().
add
(
skuDetail
);
// 设置 ProductSpuDetailBO 的 attrs 规格属性
sku
.
getAttrValueIds
().
forEach
(
attrValueId
->
skuDetail
.
getAttrs
().
add
(
convert
(
productA
ttrDetailBOMap
.
get
(
attrValueId
))));
sku
BO
.
getAttrValueIds
().
forEach
(
attrValueId
->
skuDetail
.
getAttrs
().
add
(
convert
(
a
ttrDetailBOMap
.
get
(
attrValueId
))));
});
// 设置分类名
spuDetailDTO
.
setCategoryName
(
categoryBO
.
getName
());
...
...
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/manager/sku/ProductSkuManager.java
浏览文件 @
8818b350
...
...
@@ -2,15 +2,22 @@ package cn.iocoder.mall.productservice.manager.sku;
import
cn.iocoder.common.framework.util.CollectionUtils
;
import
cn.iocoder.mall.productservice.convert.sku.ProductSkuConvert
;
import
cn.iocoder.mall.productservice.enums.sku.ProductSkuDetailFieldEnum
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO
;
import
cn.iocoder.mall.productservice.service.attr.ProductAttrService
;
import
cn.iocoder.mall.productservice.service.attr.bo.ProductAttrKeyValueBO
;
import
cn.iocoder.mall.productservice.service.sku.ProductSkuService
;
import
cn.iocoder.mall.productservice.service.sku.bo.ProductSkuBO
;
import
cn.iocoder.mall.productservice.service.spu.ProductSpuService
;
import
cn.iocoder.mall.productservice.service.spu.bo.ProductSpuBO
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.Collections
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Set
;
/**
* 商品 SKU Manager
...
...
@@ -20,6 +27,10 @@ public class ProductSkuManager {
@Autowired
private
ProductSkuService
productSkuService
;
@Autowired
private
ProductSpuService
productSpuService
;
@Autowired
private
ProductAttrService
productAttrService
;
/**
* 获得商品 SKU
...
...
@@ -40,13 +51,26 @@ public class ProductSkuManager {
*/
public
List
<
ProductSkuRespDTO
>
listProductSkus
(
ProductSkuListQueryReqDTO
queryReqDTO
)
{
// 获得商品 SKU 列表
List
<
ProductSkuBO
>
productS
kuBOs
=
productSkuService
.
listProductSkus
(
List
<
ProductSkuBO
>
s
kuBOs
=
productSkuService
.
listProductSkus
(
ProductSkuConvert
.
INSTANCE
.
convert
(
queryReqDTO
));
if
(
CollectionUtils
.
isEmpty
(
productS
kuBOs
))
{
if
(
CollectionUtils
.
isEmpty
(
s
kuBOs
))
{
return
Collections
.
emptyList
();
}
//
return
ProductSkuConvert
.
INSTANCE
.
convertList03
(
productSkuBOs
);
// 获得商品 SPU 列表
List
<
ProductSpuBO
>
spuBOs
=
Collections
.
emptyList
();
if
(
queryReqDTO
.
getFields
().
contains
(
ProductSkuDetailFieldEnum
.
SPU
.
getField
()))
{
spuBOs
=
productSpuService
.
listProductSpus
(
CollectionUtils
.
convertSet
(
skuBOs
,
ProductSkuBO:
:
getSpuId
));
}
// 获取商品 SKU 的规格数组
List
<
ProductAttrKeyValueBO
>
attrBOs
=
Collections
.
emptyList
();
if
(
queryReqDTO
.
getFields
().
contains
(
ProductSkuDetailFieldEnum
.
ATTR
.
getField
()))
{
Set
<
Integer
>
attrValueIds
=
new
HashSet
<>();
skuBOs
.
forEach
(
sku
->
attrValueIds
.
addAll
(
sku
.
getAttrValueIds
()));
attrBOs
=
productAttrService
.
validProductAttr
(
attrValueIds
,
false
);
// 读取规格时,不考虑规格是否被禁用
}
// 拼接最终返回
return
ProductSkuConvert
.
INSTANCE
.
convertList
(
skuBOs
,
spuBOs
,
attrBOs
);
}
}
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/manager/spu/ProductSpuManager.java
浏览文件 @
8818b350
...
...
@@ -231,9 +231,9 @@ public class ProductSpuManager {
// 获取商品 SKU 的规格数组
List
<
ProductAttrKeyValueBO
>
attrBOs
=
Collections
.
emptyList
();
if
(
fields
.
contains
(
ProductSpuDetailFieldEnum
.
ATTR
.
getField
())
&&
!
CollectionUtils
.
isEmpty
(
skuBOs
))
{
Set
<
Integer
>
productA
ttrValueIds
=
new
HashSet
<>();
skuBOs
.
forEach
(
sku
->
productA
ttrValueIds
.
addAll
(
sku
.
getAttrValueIds
()));
attrBOs
=
productAttrService
.
validProductAttr
(
productA
ttrValueIds
,
false
);
// 读取规格时,不考虑规格是否被禁用
Set
<
Integer
>
a
ttrValueIds
=
new
HashSet
<>();
skuBOs
.
forEach
(
sku
->
a
ttrValueIds
.
addAll
(
sku
.
getAttrValueIds
()));
attrBOs
=
productAttrService
.
validProductAttr
(
a
ttrValueIds
,
false
);
// 读取规格时,不考虑规格是否被禁用
}
// 拼接最终返回
return
ProductSpuConvert
.
INSTANCE
.
convert
(
spuBO
,
skuBOs
,
attrBOs
,
categoryBO
);
...
...
product-service-project/product-service-app/src/test/java/cn/iocoder/mall/productservice/manager/spu/ProductSkuManagerTest.java
0 → 100644
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
productservice
.
manager
.
spu
;
import
cn.iocoder.mall.productservice.enums.sku.ProductSkuDetailFieldEnum
;
import
cn.iocoder.mall.productservice.manager.sku.ProductSkuManager
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO
;
import
lombok.extern.slf4j.Slf4j
;
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.Arrays
;
import
java.util.List
;
@RunWith
(
SpringJUnit4ClassRunner
.
class
)
@SpringBootTest
(
webEnvironment
=
SpringBootTest
.
WebEnvironment
.
NONE
)
@Slf4j
public
class
ProductSkuManagerTest
{
@Autowired
private
ProductSkuManager
productSkuManager
;
@Test
public
void
testListProductSkus
()
{
List
<
ProductSkuRespDTO
>
skuRespDTOs
=
productSkuManager
.
listProductSkus
(
new
ProductSkuListQueryReqDTO
().
setProductSkuIds
(
Arrays
.
asList
(
3
,
4
))
.
setFields
(
Arrays
.
asList
(
ProductSkuDetailFieldEnum
.
SPU
.
getField
(),
ProductSkuDetailFieldEnum
.
ATTR
.
getField
())));
log
.
info
(
"结果:{}"
,
skuRespDTOs
);
}
}
product-service-project/product-service-app/src/test/java/cn/iocoder/mall/productservice/package-info.java
0 → 100644
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
productservice
;
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/activity/PromotionActivityRpc.java
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
promotion
.
api
.
rpc
.
activity
.
dto
;
package
cn
.
iocoder
.
mall
.
promotion
.
api
.
rpc
.
activity
;
import
cn.iocoder.common.framework.vo.CommonResult
;
import
cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityListReqDTO
;
import
cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO
;
import
java.util.Collection
;
import
java.util.List
;
public
interface
PromotionActivityRpc
{
List
<
PromotionActivityRespDTO
>
getPromotionActivityListBySpuId
(
Integer
spuId
,
Collection
<
Integer
>
activityStatuses
);
List
<
PromotionActivityRespDTO
>
getPromotionActivityListBySpuIds
(
Collection
<
Integer
>
spuIds
,
Collection
<
Integer
>
activityStatuses
);
// List<PromotionActivityRespDTO> getPromotionActivityListBySpuId(Integer spuId,
// Collection<Integer> activityStatuses);
//
// List<PromotionActivityRespDTO> getPromotionActivityListBySpuIds(Collection<Integer> spuIds,
// Collection<Integer> activityStatuses);
//
// PromotionActivityPageReqDTO getPromotionActivityPage(PromotionActivityPageRespDTO promotionActivityPageDTO);
PromotionActivityPageReqDTO
getPromotionActivityPage
(
PromotionActivityPageRespDTO
promotionActivityPage
DTO
);
CommonResult
<
List
<
PromotionActivityRespDTO
>>
listPromotionActivities
(
PromotionActivityListReqDTO
listReq
DTO
);
}
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/activity/dto/PromotionActivityListReqDTO.java
0 → 100644
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
promotion
.
api
.
rpc
.
activity
.
dto
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
import
java.util.Collection
;
/**
* 促销活动列表查询的 Request DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
PromotionActivityListReqDTO
implements
Serializable
{
/**
* 活动编号数组
*/
private
Collection
<
Integer
>
activeIds
;
}
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/activity/dto/PromotionActivityRespDTO.java
浏览文件 @
8818b350
...
...
@@ -8,7 +8,7 @@ import java.util.Date;
import
java.util.List
;
/**
* 促销
伙伴
Response DTO
* 促销
活动
Response DTO
*/
@Data
@Accessors
(
chain
=
true
)
...
...
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/price/dto/PriceProductCalcReqDTO.java
浏览文件 @
8818b350
...
...
@@ -41,18 +41,26 @@ public class PriceProductCalcReqDTO implements Serializable {
/**
* SKU 编号
*/
@NotNull
(
message
=
"商品 SKU 编号不能为空"
)
private
Integer
skuId
;
/**
* 数量
*/
@NotNull
(
message
=
"商品 SKU 数量不能为空"
)
private
Integer
quantity
;
/**
* 是否选中
*/
@NotNull
(
message
=
"是否选中不能为空"
)
private
Boolean
selected
;
public
Item
()
{
}
public
Item
(
Integer
skuId
,
Integer
quantity
)
{
public
Item
(
Integer
skuId
,
Integer
quantity
,
Boolean
selected
)
{
this
.
skuId
=
skuId
;
this
.
quantity
=
quantity
;
this
.
selected
=
selected
;
}
}
...
...
promotion-service-project/promotion-service-api/src/main/java/cn/iocoder/mall/promotion/api/rpc/price/dto/PriceProductCalcRespDTO.java
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
promotion
.
api
.
rpc
.
price
.
dto
;
import
cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum
;
import
cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
...
...
@@ -57,7 +56,7 @@ public class PriceProductCalcRespDTO implements Serializable {
*
* // TODO 芋艿,目前只会有【满减送】的情况,未来有新的促销方式,可能需要改成数组
*/
private
PromotionActivityRespDTO
activity
;
private
Integer
activityId
;
/**
* 促销减少的金额
*
...
...
@@ -94,6 +93,13 @@ public class PriceProductCalcRespDTO implements Serializable {
* 商品 Category 编号
*/
private
Integer
cid
;
// 非 SKU 自带信息
/**
* 是否选中
*/
private
Boolean
selected
;
/**
* 购买数量
*/
...
...
@@ -103,7 +109,7 @@ public class PriceProductCalcRespDTO implements Serializable {
*
* 目前会有限时折扣 {@link PromotionActivityTypeEnum#TIME_LIMITED_DISCOUNT} 类型的活动
*/
private
PromotionActivityRespDTO
activity
;
private
Integer
activityId
;
/**
* 原始单价,单位:分。
*/
...
...
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/dal/mysql/mapper/activity/PromotionActivityMapper.java
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
promotionservice
.
dal
.
mysql
.
mapper
.
activity
;
import
cn.iocoder.mall.mybatis.core.query.QueryWrapperX
;
import
cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityListReqDTO
;
import
cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity.PromotionActivityDO
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
...
...
@@ -26,4 +28,8 @@ public interface PromotionActivityMapper extends BaseMapper<PromotionActivityDO>
@Param
(
"activityType"
)
Integer
activityType
,
@Param
(
"statuses"
)
Collection
<
Integer
>
statuses
);
default
List
<
PromotionActivityDO
>
selectList
(
PromotionActivityListReqDTO
listReqDTO
)
{
return
selectList
(
new
QueryWrapperX
<
PromotionActivityDO
>().
inIfPresent
(
"id"
,
listReqDTO
.
getActiveIds
()));
}
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/manager/activity/PromotionActivityManager.java
0 → 100644
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
promotionservice
.
manager
.
activity
;
import
cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityListReqDTO
;
import
cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO
;
import
cn.iocoder.mall.promotionservice.service.activity.PromotionActivityService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.validation.annotation.Validated
;
import
java.util.List
;
/**
* 促销活动 Manager
*/
@Service
@Validated
public
class
PromotionActivityManager
{
@Autowired
private
PromotionActivityService
promotionActivityService
;
public
List
<
PromotionActivityRespDTO
>
listPromotionActivities
(
PromotionActivityListReqDTO
listReqDTO
)
{
return
promotionActivityService
.
listPromotionActivities
(
listReqDTO
);
}
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/manager/package-info.java
deleted
100644 → 0
浏览文件 @
5122b68a
package
cn
.
iocoder
.
mall
.
promotionservice
.
manager
;
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/manager/price/PriceManager.java
浏览文件 @
8818b350
...
...
@@ -134,7 +134,7 @@ public class PriceManager {
continue
;
}
// 设置优惠
item
.
setActivity
(
timeLimitedDiscount
);
item
.
setActivity
Id
(
timeLimitedDiscount
.
getId
()
);
// 设置价格
item
.
setBuyPrice
(
newBuyPrice
);
item
.
setBuyTotal
(
newBuyPrice
*
item
.
getBuyQuantity
());
...
...
@@ -186,7 +186,7 @@ public class PriceManager {
for
(
PromotionActivityRespDTO
fullPrivilege
:
fullPrivileges
)
{
// 创建 fullPrivilege 对应的分组
PriceProductCalcRespDTO
.
ItemGroup
itemGroup
=
new
PriceProductCalcRespDTO
.
ItemGroup
()
.
setActivity
(
fullPrivilege
)
.
setActivity
Id
(
fullPrivilege
.
getId
()
)
.
setItems
(
new
ArrayList
<>());
// 筛选商品到分组中
for
(
Iterator
<
PriceProductCalcRespDTO
.
Item
>
iterator
=
items
.
iterator
();
iterator
.
hasNext
();
)
{
...
...
@@ -208,8 +208,9 @@ public class PriceManager {
itemGroups
.
add
(
new
PriceProductCalcRespDTO
.
ItemGroup
().
setItems
(
items
));
}
// 计算每个分组的价格
Map
<
Integer
,
PromotionActivityRespDTO
>
activityMap
=
CollectionUtils
.
convertMap
(
activityList
,
PromotionActivityRespDTO:
:
getId
);
for
(
PriceProductCalcRespDTO
.
ItemGroup
itemGroup
:
itemGroups
)
{
itemGroup
.
setActivityDiscountTotal
(
calcSkuPriceByFullPrivilege
(
itemGroup
));
itemGroup
.
setActivityDiscountTotal
(
calcSkuPriceByFullPrivilege
(
itemGroup
,
activityMap
.
get
(
itemGroup
.
getActivityId
())
));
}
// 返回结果
return
itemGroups
;
...
...
@@ -227,11 +228,10 @@ public class PriceManager {
throw
new
IllegalArgumentException
(
String
.
format
(
"促销活动(%s) 可用范围的类型是不正确"
,
activity
.
toString
()));
}
private
Integer
calcSkuPriceByFullPrivilege
(
PriceProductCalcRespDTO
.
ItemGroup
itemGroup
)
{
if
(
itemGroup
.
getActivity
()
==
null
)
{
private
Integer
calcSkuPriceByFullPrivilege
(
PriceProductCalcRespDTO
.
ItemGroup
itemGroup
,
PromotionActivityRespDTO
activity
)
{
if
(
itemGroup
.
getActivity
Id
()
==
null
)
{
return
null
;
}
PromotionActivityRespDTO
activity
=
itemGroup
.
getActivity
();
Assert
.
isTrue
(
PromotionActivityTypeEnum
.
FULL_PRIVILEGE
.
getValue
().
equals
(
activity
.
getActivityType
()),
"传入的必须的满减送活动必须是满减送"
);
// 获得优惠信息
...
...
@@ -246,7 +246,8 @@ public class PriceManager {
if
(
MeetTypeEnum
.
QUANTITY
.
getValue
().
equals
(
privilege
.
getMeetType
()))
{
return
itemCnt
>=
privilege
.
getMeetValue
();
}
throw
new
IllegalArgumentException
(
String
.
format
(
"满减送活动(%s) 的匹配(%s)不正确"
,
itemGroup
.
getActivity
().
toString
(),
privilege
.
toString
()));
throw
new
IllegalArgumentException
(
String
.
format
(
"满减送活动(%s) 的匹配(%s)不正确"
,
activity
.
toString
(),
privilege
.
toString
()));
}).
collect
(
Collectors
.
toList
());
// 获得不到优惠信息,返回原始价格
if
(
privileges
.
isEmpty
())
{
...
...
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/rpc/activity/PromotionActivityRpcImpl.java
0 → 100644
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
promotionservice
.
rpc
.
activity
;
import
cn.iocoder.common.framework.vo.CommonResult
;
import
cn.iocoder.mall.promotion.api.rpc.activity.PromotionActivityRpc
;
import
cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityListReqDTO
;
import
cn.iocoder.mall.promotion.api.rpc.activity.dto.PromotionActivityRespDTO
;
import
cn.iocoder.mall.promotionservice.manager.activity.PromotionActivityManager
;
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
PromotionActivityRpcImpl
implements
PromotionActivityRpc
{
@Autowired
private
PromotionActivityManager
promotionActivityManager
;
@Override
public
CommonResult
<
List
<
PromotionActivityRespDTO
>>
listPromotionActivities
(
PromotionActivityListReqDTO
listReqDTO
)
{
return
success
(
promotionActivityManager
.
listPromotionActivities
(
listReqDTO
));
}
}
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/rpc/package-info.java
deleted
100644 → 0
浏览文件 @
5122b68a
package
cn
.
iocoder
.
mall
.
promotionservice
.
rpc
;
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/activity/PromotionActivityService.java
浏览文件 @
8818b350
...
...
@@ -2,6 +2,7 @@ package cn.iocoder.mall.promotionservice.service.activity;
import
cn.iocoder.mall.promotion.api.enums.PromotionActivityTypeEnum
;
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.PromotionActivityRespDTO
;
import
cn.iocoder.mall.promotionservice.convert.activity.PromotionActivityConvert
;
import
cn.iocoder.mall.promotionservice.dal.mysql.dataobject.activity.PromotionActivityDO
;
...
...
@@ -25,24 +26,15 @@ public class PromotionActivityService {
@Autowired
private
PromotionActivityMapper
promotionActivityMapper
;
/**
* 获取指定商品
*
* @param spuId
* @param activityStatuses
* @return
*/
public
List
<
PromotionActivityRespDTO
>
listPromotionActivities
(
PromotionActivityListReqDTO
listReqDTO
)
{
List
<
PromotionActivityDO
>
activityList
=
promotionActivityMapper
.
selectList
(
listReqDTO
);
return
PromotionActivityConvert
.
INSTANCE
.
convertList
(
activityList
);
}
public
List
<
PromotionActivityRespDTO
>
listPromotionActivitiesBySpuId
(
Integer
spuId
,
Collection
<
Integer
>
activityStatuses
)
{
return
this
.
listPromotionActivitiesBySpuIds
(
Collections
.
singleton
(
spuId
),
activityStatuses
);
}
/**
*
*
* @param spuIds
* @param activityStatuses
* @return
*/
public
List
<
PromotionActivityRespDTO
>
listPromotionActivitiesBySpuIds
(
Collection
<
Integer
>
spuIds
,
Collection
<
Integer
>
activityStatuses
)
{
if
(
spuIds
.
isEmpty
()
||
activityStatuses
.
isEmpty
())
{
return
Collections
.
emptyList
();
...
...
promotion-service-project/promotion-service-app/src/main/java/cn/iocoder/mall/promotionservice/service/recommend/ProductRecommendService.java
浏览文件 @
8818b350
...
...
@@ -13,7 +13,7 @@ import cn.iocoder.mall.promotionservice.dal.mysql.mapper.recommend.ProductRecomm
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.apache.dubbo.config.annotation.Reference
;
import
org.apache.dubbo.config.annotation.
Dubbo
Reference
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.validation.annotation.Validated
;
...
...
@@ -25,7 +25,7 @@ import java.util.List;
@Validated
public
class
ProductRecommendService
{
@
Reference
(
validation
=
"true"
,
version
=
"${dubbo.consumer.ProductSpuService
.version}"
)
@
DubboReference
(
validation
=
"true"
,
version
=
"${dubbo.consumer.ProductSpuRpc
.version}"
)
private
ProductSpuRpc
productSpuRpc
;
@Autowired
...
...
shop-web-app/src/main/java/cn/iocoder/mall/shopweb/controller/order/CartController.java
浏览文件 @
8818b350
...
...
@@ -44,7 +44,7 @@ public class CartController {
@GetMapping
(
"/get-detail"
)
@ApiOperation
(
"查询用户的购物车的商品列表"
)
public
CommonResult
<
CartDetailVO
>
getCartDetail
()
{
return
success
(
cartManager
.
getCartDetail
());
return
success
(
cartManager
.
getCartDetail
(
UserSecurityContextHolder
.
getUserId
()
));
}
}
shop-web-app/src/main/java/cn/iocoder/mall/shopweb/convert/order/CartConvert.java
浏览文件 @
8818b350
package
cn
.
iocoder
.
mall
.
shopweb
.
convert
.
order
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO
;
import
cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcRespDTO
;
import
cn.iocoder.mall.shopweb.controller.order.vo.cart.CartDetailVO
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.factory.Mappers
;
...
...
@@ -8,4 +11,8 @@ public interface CartConvert {
CartConvert
INSTANCE
=
Mappers
.
getMapper
(
CartConvert
.
class
);
CartDetailVO
.
Fee
convert
(
PriceProductCalcRespDTO
.
Fee
bean
);
CartDetailVO
.
Sku
convert
(
PriceProductCalcRespDTO
.
Item
item
,
ProductSkuRespDTO
sku
);
}
shop-web-app/src/main/java/cn/iocoder/mall/shopweb/manager/order/cart/CartManager.java
浏览文件 @
8818b350
...
...
@@ -6,15 +6,22 @@ import cn.iocoder.mall.orderservice.rpc.cart.CartRpc;
import
cn.iocoder.mall.orderservice.rpc.cart.dto.CartItemAddReqDTO
;
import
cn.iocoder.mall.orderservice.rpc.cart.dto.CartItemListReqDTO
;
import
cn.iocoder.mall.orderservice.rpc.cart.dto.CartItemRespDTO
;
import
cn.iocoder.mall.productservice.enums.sku.ProductSkuDetailFieldEnum
;
import
cn.iocoder.mall.productservice.rpc.sku.ProductSkuRpc
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO
;
import
cn.iocoder.mall.promotion.api.rpc.activity.PromotionActivityRpc
;
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.price.PriceRpc
;
import
cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcReqDTO
;
import
cn.iocoder.mall.promotion.api.rpc.price.dto.PriceProductCalcRespDTO
;
import
cn.iocoder.mall.shopweb.controller.order.vo.cart.CartDetailVO
;
import
cn.iocoder.mall.shopweb.convert.order.CartConvert
;
import
org.apache.dubbo.config.annotation.DubboReference
;
import
org.springframework.stereotype.Service
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.*
;
import
java.util.stream.Collectors
;
/**
...
...
@@ -27,6 +34,10 @@ public class CartManager {
private
CartRpc
cartRpc
;
@DubboReference
(
version
=
"${dubbo.consumer.PriceRpc.version}"
)
private
PriceRpc
priceRpc
;
@DubboReference
(
version
=
"${dubbo.consumer.PromotionActivityRpc.version}"
)
private
PromotionActivityRpc
promotionActivityRpc
;
@DubboReference
(
version
=
"${dubbo.consumer.ProductSkuRpc.version}"
)
private
ProductSkuRpc
productSkuRpc
;
/**
* 添加商品到购物车
...
...
@@ -72,14 +83,63 @@ public class CartManager {
// 计算选中的商品价格
CommonResult
<
PriceProductCalcRespDTO
>
calcProductPriceResult
=
priceRpc
.
calcProductPrice
(
new
PriceProductCalcReqDTO
().
setUserId
(
userId
)
.
setItems
(
listCartItemsResult
.
getData
().
stream
()
.
filter
(
CartItemRespDTO:
:
getSelected
)
.
map
(
cartItem
->
new
PriceProductCalcReqDTO
.
Item
(
cartItem
.
getSkuId
(),
cartItem
.
getQuantity
()))
.
map
(
cartItem
->
new
PriceProductCalcReqDTO
.
Item
(
cartItem
.
getSkuId
(),
cartItem
.
getQuantity
(),
cartItem
.
getSelected
()))
.
collect
(
Collectors
.
toList
())));
calcProductPriceResult
.
checkError
();
// 获得促销活动信息
Map
<
Integer
,
PromotionActivityRespDTO
>
promotionActivityMap
=
this
.
getPromotionActivityMap
(
calcProductPriceResult
.
getData
());
// 获得商品 SKU 信息
Map
<
Integer
,
ProductSkuRespDTO
>
productSkuMap
=
this
.
getProductSkuMap
(
listCartItemsResult
.
getData
());
// 拼接结果
CartDetailVO
cartDetailVO
=
new
CartDetailVO
();
cartDetailVO
.
setFee
(
CartConvert
.
INSTANCE
.
convert
(
calcProductPriceResult
.
getData
().
getFee
()));
cartDetailVO
.
setItemGroups
(
new
ArrayList
<>());
calcProductPriceResult
.
getData
().
getItemGroups
().
forEach
(
itemGroupDTO
->
{
CartDetailVO
.
ItemGroup
itemGroupVO
=
new
CartDetailVO
.
ItemGroup
();
cartDetailVO
.
getItemGroups
().
add
(
itemGroupVO
);
// 活动信息
if
(
itemGroupDTO
.
getActivityId
()
!=
null
)
{
itemGroupVO
.
setActivity
(
promotionActivityMap
.
get
(
itemGroupDTO
.
getActivityId
()))
.
setActivityDiscountTotal
(
itemGroupDTO
.
getActivityDiscountTotal
());
}
// 商品 SKU 信息
itemGroupVO
.
setItems
(
new
ArrayList
<>());
itemGroupDTO
.
getItems
().
forEach
(
item
->
{
itemGroupVO
.
getItems
().
add
(
CartConvert
.
INSTANCE
.
convert
(
item
,
productSkuMap
.
get
(
item
.
getSkuId
())));
});
});
return
cartDetailVO
;
}
private
Map
<
Integer
,
PromotionActivityRespDTO
>
getPromotionActivityMap
(
PriceProductCalcRespDTO
calcRespDTO
)
{
// 获得所有促销活动编号
Set
<
Integer
>
activeIds
=
new
HashSet
<>();
calcRespDTO
.
getItemGroups
().
forEach
(
itemGroup
->
{
if
(
itemGroup
.
getActivityId
()
!=
null
)
{
activeIds
.
add
(
itemGroup
.
getActivityId
());
}
itemGroup
.
getItems
().
forEach
(
item
->
{
if
(
item
.
getActivityId
()
!=
null
)
{
activeIds
.
add
(
item
.
getActivityId
());
}
});
});
if
(!
CollectionUtils
.
isEmpty
(
activeIds
))
{
return
Collections
.
emptyMap
();
}
// 查询促销活动列表
CommonResult
<
List
<
PromotionActivityRespDTO
>>
listPromotionActivitiesResult
=
promotionActivityRpc
.
listPromotionActivities
(
new
PromotionActivityListReqDTO
().
setActiveIds
(
activeIds
));
listPromotionActivitiesResult
.
checkError
();
return
CollectionUtils
.
convertMap
(
listPromotionActivitiesResult
.
getData
(),
PromotionActivityRespDTO:
:
getId
);
}
// 执行数据拼装
return
null
;
private
Map
<
Integer
,
ProductSkuRespDTO
>
getProductSkuMap
(
List
<
CartItemRespDTO
>
itemRespDTOs
)
{
CommonResult
<
List
<
ProductSkuRespDTO
>>
listProductSkusResult
=
productSkuRpc
.
listProductSkus
(
new
ProductSkuListQueryReqDTO
()
.
setProductSkuIds
(
CollectionUtils
.
convertSet
(
itemRespDTOs
,
CartItemRespDTO:
:
getSkuId
))
.
setFields
(
Arrays
.
asList
(
ProductSkuDetailFieldEnum
.
SPU
.
getField
(),
ProductSkuDetailFieldEnum
.
ATTR
.
getField
())));
listProductSkusResult
.
checkError
();
return
CollectionUtils
.
convertMap
(
listProductSkusResult
.
getData
(),
ProductSkuRespDTO:
:
getId
);
}
}
shop-web-app/src/main/java/cn/iocoder/mall/shopweb/manager/order/package-info.java
deleted
100644 → 0
浏览文件 @
5122b68a
package
cn
.
iocoder
.
mall
.
shopweb
.
manager
.
order
;
shop-web-app/src/main/resources/application.yml
浏览文件 @
8818b350
...
...
@@ -41,6 +41,8 @@ dubbo:
version
:
1.0.0
PriceRpc
:
version
:
1.0.0
PromotionActivityRpc
:
version
:
1.0.0
# Swagger 配置项
swagger
:
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论