Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
981b3d87
提交
981b3d87
authored
7月 30, 2020
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
开始迁移搜索服务
上级
d88da822
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
57 个修改的文件
包含
705 行增加
和
769 行删除
+705
-769
pom.xml
common/mall-spring-boot-starter-rocketmq/pom.xml
+22
-0
pom.xml
common/pom.xml
+1
-0
pom.xml
mall-dependencies/pom.xml
+16
-1
pom.xml
pom.xml
+2
-1
ProductSkuRpc.java
...cn/iocoder/mall/productservice/rpc/sku/ProductSkuRpc.java
+30
-0
ProductSkuListQueryReqDTO.java
...productservice/rpc/sku/dto/ProductSkuListQueryReqDTO.java
+24
-0
ProductSkuRespDTO.java
...er/mall/productservice/rpc/sku/dto/ProductSkuRespDTO.java
+23
-10
pom.xml
product-service-project/product-service-app/pom.xml
+11
-0
AopConfiguration.java
.../iocoder/mall/productservice/config/AopConfiguration.java
+12
-0
ProductSkuConvert.java
...er/mall/productservice/convert/sku/ProductSkuConvert.java
+17
-2
ProductSkuDO.java
...productservice/dal/mysql/dataobject/sku/ProductSkuDO.java
+1
-1
ProductSkuMapper.java
...productservice/dal/mysql/mapper/sku/ProductSkuMapper.java
+7
-1
ProductSkuManager.java
...er/mall/productservice/manager/sku/ProductSkuManager.java
+45
-0
ProductSpuManager.java
...er/mall/productservice/manager/spu/ProductSpuManager.java
+26
-1
ProductMQProducer.java
...er/mall/productservice/mq/producer/ProductMQProducer.java
+30
-0
ProductUpdateMessage.java
...ductservice/mq/producer/message/ProductUpdateMessage.java
+1
-1
ProductSkuRpcImpl.java
...ocoder/mall/productservice/rpc/sku/ProductSkuRpcImpl.java
+33
-0
ProductSkuService.java
...er/mall/productservice/service/sku/ProductSkuService.java
+26
-1
ProductSkuBO.java
...oder/mall/productservice/service/sku/bo/ProductSkuBO.java
+62
-0
ProductSkuCreateOrUpdateBO.java
...uctservice/service/sku/bo/ProductSkuCreateOrUpdateBO.java
+1
-1
ProductSkuListQueryBO.java
.../productservice/service/sku/bo/ProductSkuListQueryBO.java
+9
-8
application.yaml
...t/product-service-app/src/main/resources/application.yaml
+6
-0
ProductAttrPageDTO.java
...iocoder/mall/product/biz/dto/attr/ProductAttrPageDTO.java
+0
-19
ProductAttrUpdateDTO.java
...coder/mall/product/biz/dto/attr/ProductAttrUpdateDTO.java
+0
-28
ProductAttrValueAddDTO.java
...der/mall/product/biz/dto/attr/ProductAttrValueAddDTO.java
+0
-27
ProductAttrValueUpdateDTO.java
.../mall/product/biz/dto/attr/ProductAttrValueUpdateDTO.java
+0
-29
MQStreamProducer.java
...cn/iocoder/mall/product/biz/message/MQStreamProducer.java
+0
-27
UserProductSpuCollectionsConsumer.java
...roduct/biz/message/UserProductSpuCollectionsConsumer.java
+0
-109
ProductAttrService.java
...der/mall/product/biz/service/attr/ProductAttrService.java
+0
-52
ProductAttrServiceImpl.java
...mall/product/biz/service/attr/ProductAttrServiceImpl.java
+0
-0
ProductSpuServiceImpl.java
...r/mall/product/biz/service/spu/ProductSpuServiceImpl.java
+0
-105
biz.properties
product/product-biz/src/main/resources/biz.properties
+0
-2
biz.yaml
product/product-biz/src/main/resources/biz.yaml
+0
-19
ProductSkuMapper.xml
...roduct-biz/src/main/resources/mapper/ProductSkuMapper.xml
+0
-19
AdminsProductAttrController.java
...uct/rest/controller/attr/AdminsProductAttrController.java
+0
-81
AdminsProductBrandController.java
...t/rest/controller/brand/AdminsProductBrandController.java
+0
-93
ProductAttrConvert.java
...er/mall/product/rest/convert/attr/ProductAttrConvert.java
+0
-25
ProductBrandConvert.java
.../mall/product/rest/convert/brand/ProductBrandConvert.java
+0
-36
AdminsProductBrandResponse.java
...oduct/rest/response/brand/AdminsProductBrandResponse.java
+0
-36
ProductSpuServiceImpl.java
...n/iocoder/mall/product/service/ProductSpuServiceImpl.java
+0
-10
AdminsProductSpuController.java
...ication/controller/admins/AdminsProductSpuController.java
+0
-4
pom.xml
search-service-project/pom.xml
+39
-0
pom.xml
search-service-project/search-service-api/pom.xml
+31
-0
pom.xml
search-service-project/search-service-app/pom.xml
+80
-0
SearchServiceApplication.java
.../iocoder/mall/searchservice/SearchServiceApplication.java
+4
-0
ElasticsearchConfiguration.java
...mall/searchservice/config/ElasticsearchConfiguration.java
+2
-2
FieldAnalyzer.java
...a/cn/iocoder/mall/searchservice/dal/es/FieldAnalyzer.java
+1
-1
ESProductDO.java
...der/mall/searchservice/dal/es/dataobject/ESProductDO.java
+3
-3
ProductRepository.java
...ll/searchservice/dal/es/repository/ProductRepository.java
+7
-7
package-info.java
...a/cn/iocoder/mall/searchservice/manager/package-info.java
+4
-0
ProductSearchManager.java
...l/searchservice/manager/product/ProductSearchManager.java
+40
-0
package-info.java
...a/cn/iocoder/mall/searchservice/service/package-info.java
+4
-0
ProductSearchService.java
...l/searchservice/service/product/ProductSearchService.java
+7
-0
application-dev.yaml
...earch-service-app/src/main/resources/application-dev.yaml
+14
-0
application-local.yaml
...rch-service-app/src/main/resources/application-local.yaml
+18
-0
application.yaml
...ct/search-service-app/src/main/resources/application.yaml
+46
-0
ProductSearchServiceImpl.java
...der/mall/search/biz/service/ProductSearchServiceImpl.java
+0
-7
没有找到文件。
common/mall-spring-boot-starter-rocketmq/pom.xml
0 → 100644
浏览文件 @
981b3d87
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<parent>
<artifactId>
common
</artifactId>
<groupId>
cn.iocoder.mall
</groupId>
<version>
1.0-SNAPSHOT
</version>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
mall-spring-boot-starter-rocketmq
</artifactId>
<dependencies>
<!-- MQ 相关 -->
<dependency>
<groupId>
org.apache.rocketmq
</groupId>
<artifactId>
rocketmq-spring-boot-starter
</artifactId>
</dependency>
</dependencies>
</project>
common/pom.xml
浏览文件 @
981b3d87
...
@@ -22,6 +22,7 @@
...
@@ -22,6 +22,7 @@
<module>
mall-spring-boot-starter-mybatis
</module>
<module>
mall-spring-boot-starter-mybatis
</module>
<module>
mall-spring-boot-starter-dubbo
</module>
<module>
mall-spring-boot-starter-dubbo
</module>
<module>
mall-spring-boot-starter-system-error-code
</module>
<module>
mall-spring-boot-starter-system-error-code
</module>
<module>
mall-spring-boot-starter-rocketmq
</module>
</modules>
</modules>
<dependencyManagement>
<dependencyManagement>
...
...
mall-dependencies/pom.xml
浏览文件 @
981b3d87
...
@@ -42,6 +42,8 @@
...
@@ -42,6 +42,8 @@
<spring-boot-starter-data-jest.version>
3.2.5.RELEASE
</spring-boot-starter-data-jest.version>
<spring-boot-starter-data-jest.version>
3.2.5.RELEASE
</spring-boot-starter-data-jest.version>
<!-- RPC 相关 -->
<!-- RPC 相关 -->
<dubbo.version>
2.7.7
</dubbo.version>
<dubbo.version>
2.7.7
</dubbo.version>
<!-- MQ 相关 -->
<rocketmq-spring-boot-starter.version>
2.1.0
</rocketmq-spring-boot-starter.version>
<!-- Job 相关 -->
<!-- Job 相关 -->
<xxl-job.version>
2.0.1
</xxl-job.version>
<xxl-job.version>
2.0.1
</xxl-job.version>
<!-- Transaction 相关 -->
<!-- Transaction 相关 -->
...
@@ -219,12 +221,25 @@
...
@@ -219,12 +221,25 @@
<version>
1.0-SNAPSHOT
</version>
<version>
1.0-SNAPSHOT
</version>
</dependency>
</dependency>
<dependency>
<dependency>
<!-- TODO 需要思考下,归类到哪里 -->
<groupId>
cn.iocoder.mall
</groupId>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
mall-spring-boot-starter-system-error-code
</artifactId>
<!-- 错误码 -->
<artifactId>
mall-spring-boot-starter-system-error-code
</artifactId>
<!-- 错误码 -->
<version>
1.0-SNAPSHOT
</version>
<version>
1.0-SNAPSHOT
</version>
</dependency>
</dependency>
<!-- MQ 相关 -->
<dependency>
<groupId>
org.apache.rocketmq
</groupId>
<artifactId>
rocketmq-spring-boot-starter
</artifactId>
<version>
${rocketmq-spring-boot-starter.version}
</version>
</dependency>
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
mall-spring-boot-starter-rocketmq
</artifactId>
<version>
1.0-SNAPSHOT
</version>
</dependency>
<!-- Job 相关 -->
<!-- Job 相关 -->
<dependency>
<dependency>
<groupId>
com.xuxueli
</groupId>
<groupId>
com.xuxueli
</groupId>
...
...
pom.xml
浏览文件 @
981b3d87
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
<artifactId>
onemall
</artifactId>
<artifactId>
onemall
</artifactId>
<version>
1.0-SNAPSHOT
</version>
<version>
1.0-SNAPSHOT
</version>
<modules>
<modules>
<!-- <module>product</module>--
>
<module>
product
</module
>
<!-- <module>order</module>-->
<!-- <module>order</module>-->
<module>
common
</module>
<module>
common
</module>
<!-- <module>system</module>-->
<!-- <module>system</module>-->
...
@@ -31,6 +31,7 @@
...
@@ -31,6 +31,7 @@
<module>
shop-web-app
</module>
<module>
shop-web-app
</module>
<module>
product-service-project
</module>
<module>
product-service-project
</module>
<module>
promotion-service-project
</module>
<module>
promotion-service-project
</module>
<module>
search-service-project
</module>
</modules>
</modules>
<packaging>
pom
</packaging>
<packaging>
pom
</packaging>
...
...
product-service-project/product-service-api/src/main/java/cn/iocoder/mall/productservice/rpc/sku/ProductSkuRpc.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
rpc
.
sku
;
import
cn.iocoder.common.framework.vo.CommonResult
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO
;
import
java.util.List
;
/**
* 商品 SKU Rpc 接口
*/
public
interface
ProductSkuRpc
{
/**
* 获得商品 SKU
*
* @param productSkuId 商品 SKU 编号
* @return 商品 SKU
*/
CommonResult
<
ProductSkuRespDTO
>
getProductSku
(
Integer
productSkuId
);
/**
* 获得商品 SKU 列表
*
* @param queryReqDTO 商品 SKU 列表的查询请求 DTO
* @return 商品 SKU 列表
*/
CommonResult
<
List
<
ProductSkuRespDTO
>>
listProductSkus
(
ProductSkuListQueryReqDTO
queryReqDTO
);
}
product-service-project/product-service-api/src/main/java/cn/iocoder/mall/productservice/rpc/sku/dto/ProductSkuListQueryReqDTO.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
rpc
.
sku
.
dto
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
/**
* 商品 SKU 列表查询 DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
ProductSkuListQueryReqDTO
implements
Serializable
{
/**
* 商品 SKU 编号
*/
private
Integer
productSkuId
;
/**
* 商品 SPU 编号
*/
private
Integer
productSpuId
;
}
product
/product-biz/src/main/java/cn/iocoder/mall/product/biz/bo/attr/ProductAttrValueB
O.java
→
product
-service-project/product-service-api/src/main/java/cn/iocoder/mall/productservice/rpc/sku/dto/ProductSkuRespDT
O.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
product
.
biz
.
bo
.
attr
;
package
cn
.
iocoder
.
mall
.
product
service
.
rpc
.
sku
.
dto
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.List
;
/**
/**
* 商品
规格值 V
O
* 商品
SKU Response DT
O
*/
*/
@Data
@Data
@Accessors
(
chain
=
true
)
@Accessors
(
chain
=
true
)
public
class
Product
AttrValueB
O
implements
Serializable
{
public
class
Product
SkuRespDT
O
implements
Serializable
{
/**
/**
*
规格值
编号
*
sku
编号
*/
*/
private
Integer
id
;
private
Integer
id
;
/**
/**
*
规格
编号
*
商品
编号
*/
*/
private
Integer
attrId
;
private
Integer
spuId
;
/**
* 规格值名
*/
private
String
name
;
/**
/**
* 状态
* 状态
*/
*/
private
Integer
status
;
private
Integer
status
;
/**
* 图片地址
*/
private
String
picUrl
;
/**
* 规格值编号数组
*/
private
List
<
Integer
>
attrValueIds
;
/**
* 价格,单位:分
*/
private
Integer
price
;
/**
* 库存数量
*/
private
Integer
quantity
;
/**
/**
* 创建时间
* 创建时间
*/
*/
...
...
product-service-project/product-service-app/pom.xml
浏览文件 @
981b3d87
...
@@ -30,6 +30,12 @@
...
@@ -30,6 +30,12 @@
<artifactId>
product-service-api
</artifactId>
<artifactId>
product-service-api
</artifactId>
</dependency>
</dependency>
<!-- MQ 相关 -->
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
mall-spring-boot-starter-rocketmq
</artifactId>
</dependency>
<!-- Registry 和 Config 相关 -->
<!-- Registry 和 Config 相关 -->
<dependency>
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<groupId>
com.alibaba.cloud
</groupId>
...
@@ -72,6 +78,11 @@
...
@@ -72,6 +78,11 @@
<artifactId>
mapstruct-jdk8
</artifactId>
<artifactId>
mapstruct-jdk8
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
org.aspectj
</groupId>
<artifactId>
aspectjweaver
</artifactId>
<version>
1.9.6
</version>
</dependency>
</dependencies>
</dependencies>
</project>
</project>
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/config/AopConfiguration.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
config
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.EnableAspectJAutoProxy
;
/**
* Spring Aop 配置类
*/
@Configuration
@EnableAspectJAutoProxy
(
proxyTargetClass
=
true
,
exposeProxy
=
true
)
public
class
AopConfiguration
{
}
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/convert/sku/ProductSkuConvert.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
convert
.
sku
;
package
cn
.
iocoder
.
mall
.
productservice
.
convert
.
sku
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.mall.productservice.dal.mysql.dataobject.spu.ProductSkuDO
;
import
cn.iocoder.mall.productservice.dal.mysql.dataobject.sku.ProductSkuDO
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO
;
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.ProductSkuCreateOrUpdateBO
;
import
cn.iocoder.mall.productservice.service.sku.bo.ProductSkuListQueryBO
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mapping
;
import
org.mapstruct.Mapping
;
import
org.mapstruct.Named
;
import
org.mapstruct.Named
;
...
@@ -18,7 +22,18 @@ public interface ProductSkuConvert {
...
@@ -18,7 +22,18 @@ public interface ProductSkuConvert {
List
<
ProductSkuDO
>
convertList
(
List
<
ProductSkuCreateOrUpdateBO
>
list
);
List
<
ProductSkuDO
>
convertList
(
List
<
ProductSkuCreateOrUpdateBO
>
list
);
@Mapping
(
source
=
"attrValueIds"
,
target
=
"attrs"
,
qualifiedByName
=
"translatePicUrlsFromStringList"
)
@Mapping
(
source
=
"attrValueIds"
,
target
=
"attrs"
,
qualifiedByName
=
"translatePicUrlsFromStringList"
)
ProductSkuDO
convert
(
ProductSkuCreateOrUpdateBO
skuUpdateDTO
);
ProductSkuDO
convert
(
ProductSkuCreateOrUpdateBO
bean
);
@Mapping
(
source
=
"attrs"
,
target
=
"attrValueIds"
,
qualifiedByName
=
"translateAttrValueIdsFromString"
)
ProductSkuBO
convert
(
ProductSkuDO
bean
);
List
<
ProductSkuBO
>
convertList02
(
List
<
ProductSkuDO
>
list
);
ProductSkuRespDTO
convert
(
ProductSkuBO
bean
);
ProductSkuListQueryBO
convert
(
ProductSkuListQueryReqDTO
bean
);
List
<
ProductSkuRespDTO
>
convertList03
(
List
<
ProductSkuBO
>
list
);
@Named
(
"translateAttrValueIdsFromString"
)
@Named
(
"translateAttrValueIdsFromString"
)
default
List
<
String
>
translateAttrValueIdsFromString
(
String
attrValueIdsStar
)
{
default
List
<
String
>
translateAttrValueIdsFromString
(
String
attrValueIdsStar
)
{
...
...
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/dal/mysql/dataobject/s
p
u/ProductSkuDO.java
→
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/dal/mysql/dataobject/s
k
u/ProductSkuDO.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
dal
.
mysql
.
dataobject
.
s
p
u
;
package
cn
.
iocoder
.
mall
.
productservice
.
dal
.
mysql
.
dataobject
.
s
k
u
;
import
cn.iocoder.common.framework.enums.CommonStatusEnum
;
import
cn.iocoder.common.framework.enums.CommonStatusEnum
;
import
cn.iocoder.mall.mybatis.core.dataobject.DeletableDO
;
import
cn.iocoder.mall.mybatis.core.dataobject.DeletableDO
;
...
...
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/dal/mysql/mapper/sku/ProductSkuMapper.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
dal
.
mysql
.
mapper
.
sku
;
package
cn
.
iocoder
.
mall
.
productservice
.
dal
.
mysql
.
mapper
.
sku
;
import
cn.iocoder.mall.mybatis.core.query.QueryWrapperX
;
import
cn.iocoder.mall.mybatis.core.query.QueryWrapperX
;
import
cn.iocoder.mall.productservice.dal.mysql.dataobject.spu.ProductSkuDO
;
import
cn.iocoder.mall.productservice.dal.mysql.dataobject.sku.ProductSkuDO
;
import
cn.iocoder.mall.productservice.service.sku.bo.ProductSkuListQueryBO
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Param
;
import
org.springframework.stereotype.Repository
;
import
org.springframework.stereotype.Repository
;
...
@@ -18,4 +19,9 @@ public interface ProductSkuMapper extends BaseMapper<ProductSkuDO> {
...
@@ -18,4 +19,9 @@ public interface ProductSkuMapper extends BaseMapper<ProductSkuDO> {
void
insertList
(
@Param
(
"productSkuDOs"
)
List
<
ProductSkuDO
>
productSkuDOs
);
void
insertList
(
@Param
(
"productSkuDOs"
)
List
<
ProductSkuDO
>
productSkuDOs
);
default
List
<
ProductSkuDO
>
selectList
(
ProductSkuListQueryBO
queryBO
)
{
return
selectList
(
new
QueryWrapperX
<
ProductSkuDO
>().
eqIfPresent
(
"id"
,
queryBO
.
getProductSkuId
())
.
eqIfPresent
(
"spu_id"
,
queryBO
.
getProductSpuId
()));
}
}
}
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/manager/sku/ProductSkuManager.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
manager
.
sku
;
import
cn.iocoder.mall.productservice.convert.sku.ProductSkuConvert
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuListQueryReqDTO
;
import
cn.iocoder.mall.productservice.rpc.sku.dto.ProductSkuRespDTO
;
import
cn.iocoder.mall.productservice.service.sku.ProductSkuService
;
import
cn.iocoder.mall.productservice.service.sku.bo.ProductSkuBO
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
/**
* 商品 SKU Manager
*/
@Service
public
class
ProductSkuManager
{
@Autowired
private
ProductSkuService
productSkuService
;
/**
* 获得商品 SKU
*
* @param productSkuId 商品 SKU编号
* @return 商品 SKU
*/
public
ProductSkuRespDTO
getProductSku
(
Integer
productSkuId
)
{
ProductSkuBO
productSkuBO
=
productSkuService
.
getProductSku
(
productSkuId
);
return
ProductSkuConvert
.
INSTANCE
.
convert
(
productSkuBO
);
}
/**
* 获得商品 SKU 列表
*
* @param queryReqDTO 商品 SKU 列表的查询请求 DTO
* @return 商品 SKU列表
*/
public
List
<
ProductSkuRespDTO
>
listProductSkus
(
ProductSkuListQueryReqDTO
queryReqDTO
)
{
List
<
ProductSkuBO
>
productSkuBOs
=
productSkuService
.
listProductSkus
(
ProductSkuConvert
.
INSTANCE
.
convert
(
queryReqDTO
));
return
ProductSkuConvert
.
INSTANCE
.
convertList03
(
productSkuBOs
);
}
}
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/manager/spu/ProductSpuManager.java
浏览文件 @
981b3d87
...
@@ -4,6 +4,7 @@ import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
...
@@ -4,6 +4,7 @@ import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
import
cn.iocoder.common.framework.vo.PageResult
;
import
cn.iocoder.common.framework.vo.PageResult
;
import
cn.iocoder.mall.productservice.convert.spu.ProductSpuConvert
;
import
cn.iocoder.mall.productservice.convert.spu.ProductSpuConvert
;
import
cn.iocoder.mall.productservice.enums.category.ProductCategoryIdEnum
;
import
cn.iocoder.mall.productservice.enums.category.ProductCategoryIdEnum
;
import
cn.iocoder.mall.productservice.mq.producer.ProductMQProducer
;
import
cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuAndSkuCreateReqDTO
;
import
cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuAndSkuCreateReqDTO
;
import
cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuAndSkuUpdateReqDTO
;
import
cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuAndSkuUpdateReqDTO
;
import
cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuPageReqDTO
;
import
cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuPageReqDTO
;
...
@@ -18,6 +19,7 @@ import cn.iocoder.mall.productservice.service.spu.ProductSpuService;
...
@@ -18,6 +19,7 @@ import cn.iocoder.mall.productservice.service.spu.ProductSpuService;
import
cn.iocoder.mall.productservice.service.spu.bo.ProductSpuBO
;
import
cn.iocoder.mall.productservice.service.spu.bo.ProductSpuBO
;
import
cn.iocoder.mall.productservice.service.spu.bo.ProductSpuCreateBO
;
import
cn.iocoder.mall.productservice.service.spu.bo.ProductSpuCreateBO
;
import
cn.iocoder.mall.productservice.service.spu.bo.ProductSpuUpdateBO
;
import
cn.iocoder.mall.productservice.service.spu.bo.ProductSpuUpdateBO
;
import
org.springframework.aop.framework.AopContext
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
...
@@ -42,14 +44,25 @@ public class ProductSpuManager {
...
@@ -42,14 +44,25 @@ public class ProductSpuManager {
@Autowired
@Autowired
private
ProductAttrService
productAttrService
;
private
ProductAttrService
productAttrService
;
@Autowired
private
ProductMQProducer
productMQProducer
;
/**
/**
* 创建商品 SPU 和 SKU
* 创建商品 SPU 和 SKU
*
*
* @param createDTO 创建商品 SPU 和 SKU DTO
* @param createDTO 创建商品 SPU 和 SKU DTO
* @return 商品 SPU
* @return 商品 SPU
*/
*/
@Transactional
public
Integer
createProductSpu
(
ProductSpuAndSkuCreateReqDTO
createDTO
)
{
public
Integer
createProductSpu
(
ProductSpuAndSkuCreateReqDTO
createDTO
)
{
// 创建商品 SPU 和 SKU。注意,这里要调用 self() 方法,因为需要创建事务,否则会失效
Integer
spuId
=
self
().
createProductSpu0
(
createDTO
);
// 发送商品创建的 MQ 消息
productMQProducer
.
sendProductUpdateMessage
(
spuId
);
return
spuId
;
}
@Transactional
public
Integer
createProductSpu0
(
ProductSpuAndSkuCreateReqDTO
createDTO
)
{
// 校验商品分类是否合法
// 校验商品分类是否合法
this
.
checkProductCategory
(
createDTO
.
getCid
());
this
.
checkProductCategory
(
createDTO
.
getCid
());
// 创建商品 SKU 对象,并进行校验
// 创建商品 SKU 对象,并进行校验
...
@@ -71,6 +84,14 @@ public class ProductSpuManager {
...
@@ -71,6 +84,14 @@ public class ProductSpuManager {
* @param updateDTO 更新商品 SPU DTO
* @param updateDTO 更新商品 SPU DTO
*/
*/
public
void
updateProductSpu
(
ProductSpuAndSkuUpdateReqDTO
updateDTO
)
{
public
void
updateProductSpu
(
ProductSpuAndSkuUpdateReqDTO
updateDTO
)
{
// 更新商品 SPU 和 SKU。注意,这里要调用 self() 方法,因为需要创建事务,否则会失效
self
().
updateProductSpu0
(
updateDTO
);
// 发送商品创建的 MQ 消息
productMQProducer
.
sendProductUpdateMessage
(
updateDTO
.
getId
());
}
@Transactional
public
void
updateProductSpu0
(
ProductSpuAndSkuUpdateReqDTO
updateDTO
)
{
// 校验商品分类是否合法
// 校验商品分类是否合法
this
.
checkProductCategory
(
updateDTO
.
getCid
());
this
.
checkProductCategory
(
updateDTO
.
getCid
());
// 创建商品 SKU 对象,并进行校验
// 创建商品 SKU 对象,并进行校验
...
@@ -171,4 +192,8 @@ public class ProductSpuManager {
...
@@ -171,4 +192,8 @@ public class ProductSpuManager {
return
attrKeyValueBOs
;
return
attrKeyValueBOs
;
}
}
private
ProductSpuManager
self
()
{
return
(
ProductSpuManager
)
AopContext
.
currentProxy
();
}
}
}
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/mq/producer/ProductMQProducer.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
mq
.
producer
;
import
cn.iocoder.mall.productservice.mq.producer.message.ProductUpdateMessage
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.rocketmq.client.producer.SendResult
;
import
org.apache.rocketmq.client.producer.SendStatus
;
import
org.apache.rocketmq.spring.core.RocketMQTemplate
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
@Component
@Slf4j
public
class
ProductMQProducer
{
@Autowired
private
RocketMQTemplate
rocketMQTemplate
;
public
void
sendProductUpdateMessage
(
Integer
id
)
{
// TODO 芋艿:后续优化下,考虑下一致性
try
{
SendResult
sendResult
=
rocketMQTemplate
.
syncSend
(
ProductUpdateMessage
.
TOPIC
,
new
ProductUpdateMessage
().
setId
(
id
));
if
(!
SendStatus
.
SEND_OK
.
equals
(
sendResult
.
getSendStatus
()))
{
log
.
error
(
"[sendProductUpdateMessage][product({}) 发送更新消息失败,结果为({})]"
,
id
,
sendResult
);
}
}
catch
(
Throwable
throwable
)
{
log
.
error
(
"[sendProductUpdateMessage][product({}) 发送更新消息失败,发生异常]"
,
id
,
throwable
);
}
}
}
product
/product-service-api/src/main/java/cn/iocoder/mall/product/api
/message/ProductUpdateMessage.java
→
product
-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/mq/producer
/message/ProductUpdateMessage.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
product
.
api
.
message
;
package
cn
.
iocoder
.
mall
.
product
service
.
mq
.
producer
.
message
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
lombok.experimental.Accessors
;
...
...
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/rpc/sku/ProductSkuRpcImpl.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
rpc
.
sku
;
import
cn.iocoder.common.framework.vo.CommonResult
;
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
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
;
/**
* 商品 SKU Rpc 实现类
*/
@DubboService
public
class
ProductSkuRpcImpl
implements
ProductSkuRpc
{
@Autowired
private
ProductSkuManager
productSkuManager
;
@Override
public
CommonResult
<
ProductSkuRespDTO
>
getProductSku
(
Integer
productSkuId
)
{
return
success
(
productSkuManager
.
getProductSku
(
productSkuId
));
}
@Override
public
CommonResult
<
List
<
ProductSkuRespDTO
>>
listProductSkus
(
ProductSkuListQueryReqDTO
queryReqDTO
)
{
return
success
(
productSkuManager
.
listProductSkus
(
queryReqDTO
));
}
}
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/service/sku/ProductSkuService.java
浏览文件 @
981b3d87
...
@@ -4,9 +4,11 @@ import cn.iocoder.common.framework.enums.CommonStatusEnum;
...
@@ -4,9 +4,11 @@ import cn.iocoder.common.framework.enums.CommonStatusEnum;
import
cn.iocoder.common.framework.util.CollectionUtils
;
import
cn.iocoder.common.framework.util.CollectionUtils
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.mall.productservice.convert.sku.ProductSkuConvert
;
import
cn.iocoder.mall.productservice.convert.sku.ProductSkuConvert
;
import
cn.iocoder.mall.productservice.dal.mysql.dataobject.s
p
u.ProductSkuDO
;
import
cn.iocoder.mall.productservice.dal.mysql.dataobject.s
k
u.ProductSkuDO
;
import
cn.iocoder.mall.productservice.dal.mysql.mapper.sku.ProductSkuMapper
;
import
cn.iocoder.mall.productservice.dal.mysql.mapper.sku.ProductSkuMapper
;
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.ProductSkuCreateOrUpdateBO
;
import
cn.iocoder.mall.productservice.service.sku.bo.ProductSkuListQueryBO
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
...
@@ -88,4 +90,27 @@ public class ProductSkuService {
...
@@ -88,4 +90,27 @@ public class ProductSkuService {
return
null
;
return
null
;
}
}
/**
* 获得商品 SKU
*
* @param productSkuId 商品 SKU 编号
* @return 商品 SKU
*/
public
ProductSkuBO
getProductSku
(
Integer
productSkuId
)
{
ProductSkuDO
productSkuDO
=
productSkuMapper
.
selectById
(
productSkuId
);
return
ProductSkuConvert
.
INSTANCE
.
convert
(
productSkuDO
);
}
/**
* 获得商品 SKU 列表
*
* @param queryBO 商品 SKU 列表查询条件 BO
* @return 商品 SKU 列表
*/
public
List
<
ProductSkuBO
>
listProductSkus
(
ProductSkuListQueryBO
queryBO
)
{
// TODO FROM 芋艿:可能要考虑下,是不是要必须传递条件
List
<
ProductSkuDO
>
productSkuDOs
=
productSkuMapper
.
selectList
(
queryBO
);
return
ProductSkuConvert
.
INSTANCE
.
convertList02
(
productSkuDOs
);
}
}
}
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/service/sku/bo/ProductSkuBO.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
productservice
.
service
.
sku
.
bo
;
import
cn.iocoder.mall.productservice.dal.mysql.dataobject.attr.ProductAttrValueDO
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.util.Date
;
/**
* 商品 SKU BO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
ProductSkuBO
{
/**
* sku 编号
*/
private
Integer
id
;
/**
* 商品编号
*/
private
Integer
spuId
;
/**
* 状态
*
* 1-正常
* 2-禁用
*/
private
Integer
status
;
/**
* 图片地址
*/
private
String
picUrl
;
/**
* 规格值({@link ProductAttrValueDO})数组
*
* 数组,以逗号分隔
*/
private
String
attrs
;
/**
* 价格,单位:分
*/
private
Integer
price
;
/**
* 库存数量
*/
private
Integer
quantity
;
/**
* 创建时间
*/
private
Date
createTime
;
/**
* 最后更新时间
*/
private
Date
updateTime
;
/**
* 是否删除
*/
private
Integer
deleted
;
}
product-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/service/sku/bo/ProductSkuCreateOrUpdateBO.java
浏览文件 @
981b3d87
...
@@ -10,7 +10,7 @@ import java.util.List;
...
@@ -10,7 +10,7 @@ import java.util.List;
/**
/**
* 商品 SKU 创建或者修改 BO
* 商品 SKU 创建或者修改 BO
*
*
* 注意,目前该对象是
* 注意,目前该对象是
搭配 {@link}
*/
*/
@Data
@Data
@Accessors
(
chain
=
true
)
@Accessors
(
chain
=
true
)
...
...
product
/product-biz/src/main/java/cn/iocoder/mall/product/biz/dto/attr/ProductAttrAddDT
O.java
→
product
-service-project/product-service-app/src/main/java/cn/iocoder/mall/productservice/service/sku/bo/ProductSkuListQueryB
O.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
product
.
biz
.
dto
.
attr
;
package
cn
.
iocoder
.
mall
.
product
service
.
service
.
sku
.
bo
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
lombok.experimental.Accessors
;
import
javax.validation.constraints.NotEmpty
;
/**
/**
*
Product 规格添加 DT
O
*
商品 SKU 列表查询 B
O
*/
*/
@Data
@Data
@Accessors
(
chain
=
true
)
@Accessors
(
chain
=
true
)
public
class
Product
AttrAddDT
O
{
public
class
Product
SkuListQueryB
O
{
/**
/**
* 名称
* 商品 SKU 编号
*/
private
Integer
productSkuId
;
/**
* 商品 SPU 编号
*/
*/
@NotEmpty
(
message
=
"规格名不能为空"
)
private
Integer
productSpuId
;
private
String
name
;
}
}
product-service-project/product-service-app/src/main/resources/application.yaml
浏览文件 @
981b3d87
...
@@ -40,6 +40,12 @@ dubbo:
...
@@ -40,6 +40,12 @@ dubbo:
ErrorCodeRpc
:
ErrorCodeRpc
:
version
:
1.0.0
version
:
1.0.0
# RocketMQ 配置项
rocketmq
:
name-server
:
400-infra.server.iocoder.cn:9876
producer
:
group
:
${spring.application.name}-producer-group
# Mall 配置项
# Mall 配置项
mall
:
mall
:
# 错误码配置项对应 ErrorCodeProperties 配置类
# 错误码配置项对应 ErrorCodeProperties 配置类
...
...
product/product-biz/src/main/java/cn/iocoder/mall/product/biz/dto/attr/ProductAttrPageDTO.java
deleted
100644 → 0
浏览文件 @
d88da822
package
cn
.
iocoder
.
mall
.
product
.
biz
.
dto
.
attr
;
import
cn.iocoder.common.framework.vo.PageParam
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.experimental.Accessors
;
/**
* 商品规格模块 - 商品规格分页 DTO
*/
@Data
@Accessors
(
chain
=
true
)
@EqualsAndHashCode
(
callSuper
=
true
)
public
class
ProductAttrPageDTO
extends
PageParam
{
/**
* 商品规格名字
*/
private
String
name
;
}
product/product-biz/src/main/java/cn/iocoder/mall/product/biz/dto/attr/ProductAttrUpdateDTO.java
deleted
100644 → 0
浏览文件 @
d88da822
package
cn
.
iocoder
.
mall
.
product
.
biz
.
dto
.
attr
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
/**
* Product 规格修改 DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
ProductAttrUpdateDTO
{
/**
* 规格编号
*/
@NotNull
(
message
=
"规格编号不能为空"
)
private
Integer
id
;
/**
* 名称
*/
@NotEmpty
(
message
=
"规格名不能为空"
)
private
String
name
;
}
product/product-biz/src/main/java/cn/iocoder/mall/product/biz/dto/attr/ProductAttrValueAddDTO.java
deleted
100644 → 0
浏览文件 @
d88da822
package
cn
.
iocoder
.
mall
.
product
.
biz
.
dto
.
attr
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
/**
* Product 规格值添加 DTO
*/
@Data
@Accessors
(
chain
=
true
)
public
class
ProductAttrValueAddDTO
{
/**
* 规格编号
*/
@NotNull
(
message
=
"规格编号不能为空"
)
private
Integer
attrId
;
/**
* 名称
*/
@NotEmpty
(
message
=
"规格值名不能为空"
)
private
String
name
;
}
product/product-biz/src/main/java/cn/iocoder/mall/product/biz/dto/attr/ProductAttrValueUpdateDTO.java
deleted
100644 → 0
浏览文件 @
d88da822
package
cn
.
iocoder
.
mall
.
product
.
biz
.
dto
.
attr
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
/**
* Product 规格值修改 DTO
*
* 注意,不允许修改所属规格
*/
@Data
@Accessors
(
chain
=
true
)
public
class
ProductAttrValueUpdateDTO
{
/**
* 规格值编号
*/
@NotNull
(
message
=
"规格编号不能为空"
)
private
Integer
id
;
/**
* 名称
*/
@NotEmpty
(
message
=
"规格名不能为空"
)
private
String
name
;
}
product/product-biz/src/main/java/cn/iocoder/mall/product/biz/message/MQStreamProducer.java
deleted
100644 → 0
浏览文件 @
d88da822
package
cn
.
iocoder
.
mall
.
product
.
biz
.
message
;
import
org.springframework.cloud.stream.annotation.Output
;
import
org.springframework.messaging.MessageChannel
;
/**
* Spring Cloud Stream Source 接口
*/
public
interface
MQStreamProducer
{
/**
* 商品更新 Output
*/
String
PRODUCT_UPDATE_OUTPUT
=
"product-update-output"
;
@Output
(
PRODUCT_UPDATE_OUTPUT
)
MessageChannel
productUpdateOutput
();
// default boolean sendProductUpdateMessage(ProductUpdateMessage message) {
// // 创建 Spring Message 对象
// Message<ProductUpdateMessage> springMessage = MessageBuilder.withPayload(message)
// .build();
// // 发送消息
// return productUpdateOutput().send(springMessage);
// }
}
product/product-biz/src/main/java/cn/iocoder/mall/product/biz/message/UserProductSpuCollectionsConsumer.java
deleted
100644 → 0
浏览文件 @
d88da822
package
cn
.
iocoder
.
mall
.
product
.
biz
.
message
;
import
org.springframework.stereotype.Service
;
/**
* 商品收藏 消费者
* @author xiaofeng
* @date 2019/07/02 19:57
* @version 1.0
*/
@Service
//@RocketMQMessageListener(topic = ProductSpuCollectionMessage.TOPIC, consumerGroup = "product-spu-consumer-group-"
// + ProductSpuCollectionMessage.TOPIC)
public
class
UserProductSpuCollectionsConsumer
// implements RocketMQListener<ProductSpuCollectionMessage>
{
// @Autowired
// private UserProductSpuCollectionsService userProductSpuCollectionsService;
//
// @Reference(validation = "true", version = "${dubbo.consumer.UserService.version}")
// private UserService userService;
//
// @Override
// public void onMessage(ProductSpuCollectionMessage productSpuCollectionMessage) {
// UserBO userBO = userService.getUser(productSpuCollectionMessage.getUserId());
// if (userBO == null) {
// throw ServiceExceptionUtil.exception(UserErrorCodeEnum.USER_NOT_EXISTS.getCode());
// }
// // 收藏
// if (productSpuCollectionMessage.getHasCollectionType().equals(1)) {
// this.saveUserProductSpuCollections(productSpuCollectionMessage, userBO.getNickname());
// } else if (productSpuCollectionMessage.getHasCollectionType().equals(2)) {
// // 取消收藏
// this.deleteUserProductSpuCollections(productSpuCollectionMessage.getUserId(),
// productSpuCollectionMessage.getSpuId());
// }
//
// }
//
// /**
// * 保存商品收藏
// * @param productSpuCollectionMessage
// * @param nickname
// * @return
// */
// private int saveUserProductSpuCollections(final ProductSpuCollectionMessage productSpuCollectionMessage,
// final String nickname) {
// int result = 0;
// UserProductSpuCollectionsBO userProductSpuCollectionsBO = this.userProductSpuCollectionsService
// .getUserSpuCollectionsByUserIdAndSpuId(productSpuCollectionMessage.getUserId(),
// productSpuCollectionMessage.getSpuId());
// if (userProductSpuCollectionsBO == null) {
// UserProductSpuCollectionsAddDTO userProductSpuCollectionsAddDTO = UserProductSpuCollectionsConvert.INSTANCE
// .convert(productSpuCollectionMessage);
// userProductSpuCollectionsAddDTO.setNickname(StringUtils.isEmpty(nickname) ? "" : nickname);
// userProductSpuCollectionsAddDTO.setCreateTime(new Date());
// userProductSpuCollectionsAddDTO.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
// result = userProductSpuCollectionsService.addUserSkuCollections(userProductSpuCollectionsAddDTO);
// } else {
// // 存在重新收藏
// if (userProductSpuCollectionsBO.getDeleted().equals(DeletedStatusEnum.DELETED_YES.getValue())) {
// UserProductSpuCollectionsUpdateDTO userProductSpuCollectionsUpdateDTO = this
// .setUserProductSpuCollectionsUpdateDTO(userProductSpuCollectionsBO.getId(),
// DeletedStatusEnum.DELETED_NO);
// result = this.userProductSpuCollectionsService
// .updateUserProductSpuCollections(userProductSpuCollectionsUpdateDTO);
// }
// }
// return result;
// }
//
// /**
// * 取消收藏
// * @param userId
// * @param spuId
// * @return
// */
// private int deleteUserProductSpuCollections(final Integer userId, final Integer spuId) {
// UserProductSpuCollectionsBO userProductSpuCollectionsBO = this.userProductSpuCollectionsService
// .getUserSpuCollectionsByUserIdAndSpuId(userId, spuId);
// int result = 0;
// if (userProductSpuCollectionsBO != null) {
// // 未取消收藏的数据
// if (userProductSpuCollectionsBO.getDeleted().equals(DeletedStatusEnum.DELETED_NO.getValue())) {
// UserProductSpuCollectionsUpdateDTO userProductSpuCollectionsUpdateDTO = this
// .setUserProductSpuCollectionsUpdateDTO(userProductSpuCollectionsBO.getId(),
// DeletedStatusEnum.DELETED_YES);
// result = this.userProductSpuCollectionsService
// .updateUserProductSpuCollections(userProductSpuCollectionsUpdateDTO);
// }
// }
// return result;
// }
//
// /**
// * 设置更新值
// * @param id
// * @param deletedStatusEnum
// * @return
// */
// private UserProductSpuCollectionsUpdateDTO setUserProductSpuCollectionsUpdateDTO(final Integer id,
// final DeletedStatusEnum deletedStatusEnum) {
// return new UserProductSpuCollectionsUpdateDTO().setId(id).setUpdateTime(new Date())
// .setDeleted(deletedStatusEnum.getValue());
// }
}
product/product-biz/src/main/java/cn/iocoder/mall/product/biz/service/attr/ProductAttrService.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
product
.
biz
.
service
.
attr
;
package
cn
.
iocoder
.
mall
.
product
.
biz
.
service
.
attr
;
import
cn.iocoder.common.framework.enums.CommonStatusEnum
;
import
cn.iocoder.common.framework.validator.InEnum
;
import
cn.iocoder.common.framework.vo.PageResult
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrBO
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrSimpleWithValueBO
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrSimpleWithValueBO
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrValueBO
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrWithValueBO
;
import
cn.iocoder.mall.product.biz.bo.product.ProductAttrAndValuePairBO
;
import
cn.iocoder.mall.product.biz.dto.attr.*
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Set
;
public
interface
ProductAttrService
{
public
interface
ProductAttrService
{
/**
* 获取规格分页数据
*
* @param productAttrPageDTO 查询参数
* @return 规格分页信息
*/
PageResult
<
ProductAttrWithValueBO
>
getProductAttrPage
(
ProductAttrPageDTO
productAttrPageDTO
);
/**
/**
* 获得规格属性数组
* 获得规格属性数组
...
@@ -31,40 +15,4 @@ public interface ProductAttrService {
...
@@ -31,40 +15,4 @@ public interface ProductAttrService {
*/
*/
List
<
ProductAttrSimpleWithValueBO
>
getProductAttrList
();
List
<
ProductAttrSimpleWithValueBO
>
getProductAttrList
();
/**
* 添加商品规格
*
* @param adminId 操作人ID
* @param productAttrAddDTO 添加参数
* @return 添加的规格
*/
ProductAttrBO
addProductAttr
(
Integer
adminId
,
ProductAttrAddDTO
productAttrAddDTO
);
/**
* 更新规格
*
* @param adminId 操作人
* @param productAttrUpdateDTO 更新规格
* @return 成功标识
*/
Boolean
updateProductAttr
(
Integer
adminId
,
ProductAttrUpdateDTO
productAttrUpdateDTO
);
/**
* 更新规格状态
*
* @param adminId 操作人
* @param productAttrId 规格ID
* @param status 状态
* @return 成功标识
*/
Boolean
updateProductAttrStatus
(
Integer
adminId
,
Integer
productAttrId
,
Integer
status
);
ProductAttrValueBO
addProductAttrValue
(
Integer
adminId
,
ProductAttrValueAddDTO
productAttrValueAddDTO
);
Boolean
updateProductAttrValue
(
Integer
adminId
,
ProductAttrValueUpdateDTO
productAttrValueUpdateDTO
);
Boolean
updateProductAttrValueStatus
(
Integer
adminId
,
Integer
productAttrValueId
,
@InEnum
(
value
=
CommonStatusEnum
.
class
,
message
=
"修改状态必须是 {value}"
)
Integer
status
);
List
<
ProductAttrAndValuePairBO
>
validProductAttrAndValue
(
Set
<
Integer
>
productAttrValueIds
,
boolean
validStatus
);
}
}
product/product-biz/src/main/java/cn/iocoder/mall/product/biz/service/attr/ProductAttrServiceImpl.java
浏览文件 @
981b3d87
差异被折叠。
点击展开。
product/product-biz/src/main/java/cn/iocoder/mall/product/biz/service/spu/ProductSpuServiceImpl.java
浏览文件 @
981b3d87
...
@@ -62,109 +62,4 @@ public class ProductSpuServiceImpl implements ProductSpuService {
...
@@ -62,109 +62,4 @@ public class ProductSpuServiceImpl implements ProductSpuService {
return
ProductSpuConvert
.
INSTANCE
.
convert2
(
spu
,
skus
,
attrAndValuePairList
,
category
);
return
ProductSpuConvert
.
INSTANCE
.
convert2
(
spu
,
skus
,
attrAndValuePairList
,
category
);
}
}
public
ProductSpuDetailBO
addProductSpu
(
Integer
adminId
,
ProductSpuAddDTO
productSpuAddDTO
)
{
ProductSpuDetailBO
productSpuDetailBO
=
addProductSpu0
(
adminId
,
productSpuAddDTO
);
// 如果新增生成,发送创建商品 Topic 消息
// TODO 芋艿,先不考虑事务的问题。等后面的 fescar 一起搞
// sendProductUpdateMessage(productSpuDetailBO.getId());
// 返回成功
return
productSpuDetailBO
;
}
@SuppressWarnings
(
"Duplicates"
)
@Transactional
public
ProductSpuDetailBO
addProductSpu0
(
Integer
adminId
,
ProductSpuAddDTO
productSpuAddDTO
)
{
// 校验商品分类分类存在
ProductCategoryDO
category
=
productCategoryService
.
validProductCategory
(
productSpuAddDTO
.
getCid
());
if
(
ProductCategoryNodeEnum
.
ROOT
.
getId
().
equals
(
category
.
getPid
()))
{
// 商品只能添加到二级分类下
throw
ServiceExceptionUtil
.
exception
(
ProductErrorCodeEnum
.
PRODUCT_SPU_CATEGORY_MUST_BE_LEVEL2
.
getCode
());
}
// 校验规格是否存在
Set
<
Integer
>
productAttrValueIds
=
new
HashSet
<>();
productSpuAddDTO
.
getSkus
().
forEach
(
productSkuAddDTO
->
productAttrValueIds
.
addAll
(
productSkuAddDTO
.
getAttrs
()));
// 读取规格时,需要考虑规格是否被禁用
List
<
ProductAttrAndValuePairBO
>
attrAndValuePairList
=
productAttrService
.
validProductAttrAndValue
(
productAttrValueIds
,
true
);
// 保存 Spu
ProductSpuDO
spu
=
ProductSpuConvert
.
INSTANCE
.
convertToSpuDO
(
productSpuAddDTO
)
.
setPicUrls
(
StringUtil
.
join
(
productSpuAddDTO
.
getPicUrls
(),
","
))
.
setSort
(
0
);
// 排序为 0
spu
.
setCreateTime
(
new
Date
());
spu
.
setDeleted
(
DeletedStatusEnum
.
DELETED_NO
.
getValue
());
// 初始化 sku 相关信息到 spu 中
initSpuFromSkus
(
spu
,
productSpuAddDTO
.
getSkus
());
productSpuMapper
.
insert
(
spu
);
// 保存 Sku
List
<
ProductSkuDO
>
skus
=
productSpuAddDTO
.
getSkus
().
stream
().
map
(
productSkuAddDTO
->
{
ProductSkuDO
sku
=
ProductSpuConvert
.
INSTANCE
.
convertToSkuDO
(
productSkuAddDTO
)
.
setSpuId
(
spu
.
getId
())
.
setStatus
(
ProductSpuConstants
.
SKU_STATUS_ENABLE
)
.
setAttrs
(
StringUtil
.
join
(
productSkuAddDTO
.
getAttrs
(),
","
));
sku
.
setCreateTime
(
new
Date
());
sku
.
setDeleted
(
DeletedStatusEnum
.
DELETED_NO
.
getValue
());
return
sku
;
}).
collect
(
Collectors
.
toList
());
// 校验 Sku 规格
validProductSku
(
productSpuAddDTO
.
getSkus
(),
attrAndValuePairList
);
// 插入 SKU 到数据库
productSkuMapper
.
insertList
(
skus
);
// 返回成功
return
ProductSpuConvert
.
INSTANCE
.
convert2
(
spu
,
skus
,
attrAndValuePairList
,
category
);
}
/**
* 根据 sku 数组,计算相关的字段到 spu 中。
*
* @param spu spu
* @param skus sku 数组
*/
private
void
initSpuFromSkus
(
ProductSpuDO
spu
,
List
<
ProductSkuAddOrUpdateDTO
>
skus
)
{
assert
skus
.
size
()
>
0
;
// 写个断言,避免下面警告
spu
.
setPrice
(
skus
.
stream
().
min
(
Comparator
.
comparing
(
ProductSkuAddOrUpdateDTO:
:
getPrice
)).
get
().
getPrice
());
// 求最小价格
spu
.
setQuantity
(
skus
.
stream
().
mapToInt
(
ProductSkuAddOrUpdateDTO:
:
getQuantity
).
sum
());
// 求库存之和
}
// private boolean sendProductUpdateMessage(Integer id) {
// // 创建 Message 对象
// ProductUpdateMessage message = new ProductUpdateMessage().setId(id);
// // 创建 Spring Message 对象
// Message<ProductUpdateMessage> springMessage = MessageBuilder.withPayload(message)
// .build();
// // 发送消息
// return mqStreamProducer.productUpdateOutput().send(springMessage);
// }
/**
* 校验 sku 是否合法
*
* @param productSkuAddDTOs sku 添加或修改信息
* @param productAttrDetailBOs 商品规格明细数组
*/
private
void
validProductSku
(
List
<
ProductSkuAddOrUpdateDTO
>
productSkuAddDTOs
,
List
<
ProductAttrAndValuePairBO
>
productAttrDetailBOs
)
{
// 创建 ProductAttrDetailBO 的映射。其中,KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号
Map
<
Integer
,
ProductAttrAndValuePairBO
>
productAttrDetailBOMap
=
productAttrDetailBOs
.
stream
().
collect
(
Collectors
.
toMap
(
ProductAttrAndValuePairBO:
:
getAttrValueId
,
productAttrDetailBO
->
productAttrDetailBO
));
// 1. 先校验,一个 Sku 下,没有重复的规格。校验方式是,遍历每个 Sku ,看看是否有重复的规格 attrId
for
(
ProductSkuAddOrUpdateDTO
sku
:
productSkuAddDTOs
)
{
Set
<
Integer
>
attrIds
=
sku
.
getAttrs
().
stream
().
map
(
attrValueId
->
productAttrDetailBOMap
.
get
(
attrValueId
).
getAttrId
())
.
collect
(
Collectors
.
toSet
());
if
(
attrIds
.
size
()
!=
sku
.
getAttrs
().
size
())
{
throw
ServiceExceptionUtil
.
exception
(
ProductErrorCodeEnum
.
PRODUCT_SKU_ATTR_CANT_NOT_DUPLICATE
.
getCode
());
}
}
// 2. 再校验,每个 Sku 的规格值的数量,是一致的。
int
attrSize
=
productSkuAddDTOs
.
get
(
0
).
getAttrs
().
size
();
for
(
int
i
=
1
;
i
<
productSkuAddDTOs
.
size
();
i
++)
{
if
(
attrSize
!=
productSkuAddDTOs
.
get
(
i
).
getAttrs
().
size
())
{
throw
ServiceExceptionUtil
.
exception
(
ProductErrorCodeEnum
.
PRODUCT_SPU_ATTR_NUMBERS_MUST_BE_EQUALS
.
getCode
());
}
}
// 3. 最后校验,每个 Sku 之间不是重复的
Set
<
Set
<
Integer
>>
skuAttrValues
=
new
HashSet
<>();
// 每个元素,都是一个 Sku 的 attrValueId 集合。这样,通过最外层的 Set ,判断是否有重复的.
for
(
ProductSkuAddOrUpdateDTO
sku
:
productSkuAddDTOs
)
{
if
(!
skuAttrValues
.
add
(
new
HashSet
<>(
sku
.
getAttrs
())))
{
// 添加失败,说明重复
throw
ServiceExceptionUtil
.
exception
(
ProductErrorCodeEnum
.
PRODUCT_SPU_SKU__NOT_DUPLICATE
.
getCode
());
}
}
}
}
}
product/product-biz/src/main/resources/biz.properties
deleted
100644 → 0
浏览文件 @
d88da822
##################### 业务模块 #####################
product/product-biz/src/main/resources/biz.yaml
deleted
100644 → 0
浏览文件 @
d88da822
spring
:
# 数据源配置项
datasource
:
url
:
jdbc:mysql://s1.iocoder.cn:3306/mall_product?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name
:
com.mysql.jdbc.Driver
username
:
root
password
:
3WLiVUBEwTbvAfsh
# MyBatis Plus 配置项
mybatis-plus
:
configuration
:
map-underscore-to-camel-case
:
true
# 虽然默认为 true ,但是还是显示去指定下。
global-config
:
db-config
:
id-type
:
auto
logic-delete-value
:
1
# 逻辑已删除值(默认为 1)
logic-not-delete-value
:
0
# 逻辑未删除值(默认为 0)
mapper-locations
:
classpath*:mapper/*.xml
type-aliases-package
:
cn.iocoder.mall.product.biz.dataobject
product/product-biz/src/main/resources/mapper/ProductSkuMapper.xml
deleted
100644 → 0
浏览文件 @
d88da822
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"cn.iocoder.mall.product.biz.dao.sku.ProductSkuMapper"
>
<insert
id=
"insertList"
useGeneratedKeys=
"true"
keyColumn=
"id"
keyProperty=
"id"
>
INSERT INTO product_sku (
spu_id, status, pic_url, attrs, price,
quantity, deleted, create_time
) VALUES
<foreach
collection=
"productSkuDOs"
item=
"productSkuDO"
separator=
","
>
(#{productSkuDO.spuId}, #{productSkuDO.status}, #{productSkuDO.picUrl}, #{productSkuDO.attrs}, #{productSkuDO.price},
#{productSkuDO.quantity}, #{productSkuDO.deleted}, #{productSkuDO.createTime}
)
</foreach>
</insert>
</mapper>
product/product-rest/src/main/java/cn/iocoder/mall/product/rest/controller/attr/AdminsProductAttrController.java
浏览文件 @
981b3d87
...
@@ -43,15 +43,6 @@ public class AdminsProductAttrController {
...
@@ -43,15 +43,6 @@ public class AdminsProductAttrController {
@Autowired
@Autowired
private
ProductAttrService
productAttrService
;
private
ProductAttrService
productAttrService
;
@GetMapping
(
"/attr/page"
)
@ApiOperation
(
"获得规格分页"
)
public
CommonResult
<
PageResult
<
AdminsProductAttrPageResponse
>>
attrPage
(
ProductAttrPageRequest
request
)
{
ProductAttrPageDTO
pageDTO
=
ProductAttrConvert
.
INSTANCE
.
convert
(
request
);
PageResult
<
ProductAttrWithValueBO
>
productAttrPage
=
productAttrService
.
getProductAttrPage
(
pageDTO
);
PageResult
<
AdminsProductAttrPageResponse
>
adminPageResponse
=
ProductAttrConvert
.
INSTANCE
.
convertPage
(
productAttrPage
);
return
CommonResult
.
success
(
adminPageResponse
);
}
@GetMapping
(
"/attr/tree"
)
@GetMapping
(
"/attr/tree"
)
@ApiOperation
(
value
=
"获得规格树结构"
,
notes
=
"该接口返回的信息更为精简。一般用于前端缓存数据字典到本地。"
)
@ApiOperation
(
value
=
"获得规格树结构"
,
notes
=
"该接口返回的信息更为精简。一般用于前端缓存数据字典到本地。"
)
public
CommonResult
<
List
<
AdminsProductAttrSimpleResponse
>>
tree
()
{
public
CommonResult
<
List
<
AdminsProductAttrSimpleResponse
>>
tree
()
{
...
@@ -60,76 +51,4 @@ public class AdminsProductAttrController {
...
@@ -60,76 +51,4 @@ public class AdminsProductAttrController {
return
CommonResult
.
success
(
ProductAttrConvert
.
INSTANCE
.
convertSimple
(
result
));
return
CommonResult
.
success
(
ProductAttrConvert
.
INSTANCE
.
convertSimple
(
result
));
}
}
@PostMapping
(
"/attr/add"
)
@ApiOperation
(
value
=
"创建商品规格"
)
public
CommonResult
<
AdminsProdutAttrResponse
>
addAttr
(
@Validated
ProductAttrAddRequest
addRequest
)
{
// 创建 ProductAttrAddDTO 对象
ProductAttrAddDTO
productAttrAddDTO
=
new
ProductAttrAddDTO
().
setName
(
addRequest
.
getName
());
// 添加
ProductAttrBO
result
=
productAttrService
.
addProductAttr
(
AdminSecurityContextHolder
.
getContext
().
getAdminId
(),
productAttrAddDTO
);
return
CommonResult
.
success
(
ProductAttrConvert
.
INSTANCE
.
convertAttr
(
result
));
}
@PostMapping
(
"/attr/update"
)
@ApiOperation
(
value
=
"修改商品规格"
)
public
CommonResult
<
Boolean
>
updateAttr
(
@Validated
ProductAttrUpdateRequest
updateRequest
)
{
ProductAttrUpdateDTO
productAttrUpdateDTO
=
ProductAttrConvert
.
INSTANCE
.
convertUpdate
(
updateRequest
);
// 更新
return
CommonResult
.
success
(
productAttrService
.
updateProductAttr
(
AdminSecurityContextHolder
.
getContext
().
getAdminId
(),
productAttrUpdateDTO
));
}
@PostMapping
(
"/attr/update_status"
)
@ApiOperation
(
value
=
"修改商品规格状态"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"id"
,
value
=
"规格编号"
,
required
=
true
,
example
=
"100"
),
@ApiImplicitParam
(
name
=
"status"
,
value
=
"状态"
,
required
=
true
,
example
=
"1"
)
})
public
CommonResult
<
Boolean
>
updateAttrStatus
(
@RequestParam
(
"id"
)
Integer
id
,
@RequestParam
(
"status"
)
Integer
status
)
{
return
CommonResult
.
success
(
productAttrService
.
updateProductAttrStatus
(
AdminSecurityContextHolder
.
getContext
().
getAdminId
(),
id
,
status
));
}
// TODO 芋艿 暂时不考虑 delete Attr 。因为关联逻辑比较多
@PostMapping
(
"/attr_value/add"
)
@ApiOperation
(
value
=
"创建商品规格值"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"attrId"
,
value
=
"规格编号"
,
required
=
true
,
example
=
"100"
),
@ApiImplicitParam
(
name
=
"name"
,
value
=
"规格值"
,
required
=
true
,
example
=
"蓝色"
)
})
public
CommonResult
<
AdminsProductAttrValueResponse
>
addAttrValue
(
@Validated
ProductAttrValueAddRequest
addRequest
)
{
// 创建 ProductAttrValueAddDTO 对象
ProductAttrValueAddDTO
productAttrValueAddDTO
=
new
ProductAttrValueAddDTO
().
setAttrId
(
addRequest
.
getAttrId
()).
setName
(
addRequest
.
getName
());
// 添加
ProductAttrValueBO
result
=
productAttrService
.
addProductAttrValue
(
AdminSecurityContextHolder
.
getContext
().
getAdminId
(),
productAttrValueAddDTO
);
// 返回结果
return
CommonResult
.
success
(
ProductAttrConvert
.
INSTANCE
.
convertAddResponse
(
result
));
}
@PostMapping
(
"/attr_value/update"
)
@ApiOperation
(
value
=
"修改商品规格值"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"id"
,
value
=
"规格值编号"
,
required
=
true
,
example
=
"100"
),
@ApiImplicitParam
(
name
=
"name"
,
value
=
"规格值"
,
required
=
true
,
example
=
"蓝色"
)
})
public
CommonResult
<
Boolean
>
updateAttrValue
(
@RequestParam
(
"id"
)
Integer
id
,
@RequestParam
(
"name"
)
String
name
)
{
// 创建 ProductAttrValueUpdateDTO 对象
ProductAttrValueUpdateDTO
productAttrValueUpdateDTO
=
new
ProductAttrValueUpdateDTO
().
setId
(
id
).
setName
(
name
);
// 更新
return
CommonResult
.
success
(
productAttrService
.
updateProductAttrValue
(
AdminSecurityContextHolder
.
getContext
().
getAdminId
(),
productAttrValueUpdateDTO
));
}
@PostMapping
(
"/attr_value/update_status"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"id"
,
value
=
"规格编号"
,
required
=
true
,
example
=
"100"
),
@ApiImplicitParam
(
name
=
"status"
,
value
=
"状态"
,
required
=
true
,
example
=
"1"
)
})
public
CommonResult
<
Boolean
>
updateAttrValueStatus
(
@RequestParam
(
"id"
)
Integer
id
,
@RequestParam
(
"status"
)
Integer
status
)
{
return
CommonResult
.
success
(
productAttrService
.
updateProductAttrValueStatus
(
AdminSecurityContextHolder
.
getContext
().
getAdminId
(),
id
,
status
));
}
// TODO 芋艿 暂时不考虑 delete Attr Value 。因为关联逻辑比较多
}
}
product/product-rest/src/main/java/cn/iocoder/mall/product/rest/controller/brand/AdminsProductBrandController.java
deleted
100644 → 0
浏览文件 @
d88da822
package
cn
.
iocoder
.
mall
.
product
.
rest
.
controller
.
brand
;
import
cn.iocoder.common.framework.vo.CommonResult
;
import
cn.iocoder.common.framework.vo.PageResult
;
import
cn.iocoder.mall.product.biz.bo.brand.ProductBrandBO
;
import
cn.iocoder.mall.product.biz.dto.brand.ProductBrandAddDTO
;
import
cn.iocoder.mall.product.biz.dto.brand.ProductBrandPageDTO
;
import
cn.iocoder.mall.product.biz.dto.brand.ProductBrandUpdateDTO
;
import
cn.iocoder.mall.product.biz.service.brand.ProductBrandService
;
import
cn.iocoder.mall.product.rest.convert.brand.ProductBrandConvert
;
import
cn.iocoder.mall.product.rest.request.brand.ProductBrandAddRequest
;
import
cn.iocoder.mall.product.rest.request.brand.ProductBrandPageRequest
;
import
cn.iocoder.mall.product.rest.request.brand.ProductBrandUpdateRequest
;
import
cn.iocoder.mall.product.rest.response.brand.AdminsProductBrandResponse
;
import
cn.iocoder.mall.security.core.context.AdminSecurityContextHolder
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParams
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.AllArgsConstructor
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
static
cn
.
iocoder
.
common
.
framework
.
vo
.
CommonResult
.
success
;
@RestController
@RequestMapping
(
"admins/brand"
)
@Api
(
"管理员 - 商品品牌 API"
)
@AllArgsConstructor
public
class
AdminsProductBrandController
{
private
final
ProductBrandService
productBrandService
;
@PostMapping
(
"/add"
)
@ApiOperation
(
"创建品牌"
)
public
CommonResult
<
AdminsProductBrandResponse
>
add
(
@Validated
ProductBrandAddRequest
addRequest
)
{
// 创建 ProductBrandAddDTO 对象
ProductBrandAddDTO
productBrandAddDTO
=
ProductBrandConvert
.
INSTANCE
.
convertAdd
(
addRequest
);
// 保存品牌
ProductBrandBO
result
=
productBrandService
.
addProductBrand
(
AdminSecurityContextHolder
.
getContext
().
getAdminId
(),
productBrandAddDTO
);
// 返回结果
return
success
(
ProductBrandConvert
.
INSTANCE
.
convert
(
result
));
}
@PostMapping
(
"/update"
)
@ApiOperation
(
"更新商品"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"id"
,
value
=
"品牌主键"
,
required
=
true
,
example
=
"1"
),
@ApiImplicitParam
(
name
=
"name"
,
value
=
"品牌名称"
,
required
=
true
,
example
=
"安踏"
),
@ApiImplicitParam
(
name
=
"description"
,
value
=
"品牌描述"
,
required
=
true
,
example
=
"安踏拖鞋"
),
@ApiImplicitParam
(
name
=
"picUrl"
,
value
=
"品牌图片"
,
required
=
true
,
example
=
"http://www.iocoder.cn"
),
@ApiImplicitParam
(
name
=
"status"
,
value
=
"状态 1开启 2禁用"
,
required
=
true
,
example
=
"1"
)
})
// TODO FROM 芋艿 to q2118cs:只要改成了 bean 接收,就不用在写 @ApiImplicitParam 注解啦,直接在 bean 里写就 ok 啦
public
CommonResult
<
Boolean
>
update
(
@Validated
ProductBrandUpdateRequest
updateRequest
)
{
// 创建 productBrandUpdateDTO 对象
ProductBrandUpdateDTO
productBrandUpdateDTO
=
ProductBrandConvert
.
INSTANCE
.
convertUpdate
(
updateRequest
);
// 更新商品
return
success
(
productBrandService
.
updateProductBrand
(
AdminSecurityContextHolder
.
getContext
().
getAdminId
(),
productBrandUpdateDTO
));
}
@GetMapping
(
"/get"
)
@ApiOperation
(
"获取品牌"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"id"
,
value
=
"品牌主键"
,
required
=
true
,
example
=
"1"
)
})
public
CommonResult
<
AdminsProductBrandResponse
>
add
(
@RequestParam
(
"id"
)
Integer
id
)
{
// 保存商品
ProductBrandBO
result
=
productBrandService
.
getProductBrand
(
id
);
// 返回结果
return
success
(
ProductBrandConvert
.
INSTANCE
.
convert
(
result
));
}
@GetMapping
(
"/page"
)
@ApiOperation
(
"获得品牌分页"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"name"
,
value
=
"品牌名称"
,
required
=
true
,
example
=
"安踏"
),
@ApiImplicitParam
(
name
=
"description"
,
value
=
"品牌描述"
,
required
=
true
,
example
=
"安踏拖鞋"
),
@ApiImplicitParam
(
name
=
"status"
,
value
=
"状态 1开启 2禁用"
,
required
=
true
,
example
=
"1"
),
@ApiImplicitParam
(
name
=
"pageNo"
,
value
=
"页码"
,
required
=
true
,
example
=
"1"
),
@ApiImplicitParam
(
name
=
"pageSize"
,
value
=
"页面大小"
,
required
=
true
,
example
=
"10"
)
})
public
CommonResult
<
PageResult
<
AdminsProductBrandResponse
>>
attrPage
(
ProductBrandPageRequest
pageRequest
)
{
// 创建 ProductBrandPageDTO 对象
ProductBrandPageDTO
productBrandPageDTO
=
ProductBrandConvert
.
INSTANCE
.
convertPageRequest
(
pageRequest
);
// 查询分页
PageResult
<
ProductBrandBO
>
productBrandPage
=
productBrandService
.
getProductBrandPage
(
productBrandPageDTO
);
PageResult
<
AdminsProductBrandResponse
>
adminPageResponse
=
ProductBrandConvert
.
INSTANCE
.
convertPage
(
productBrandPage
);
return
CommonResult
.
success
(
adminPageResponse
);
}
}
product/product-rest/src/main/java/cn/iocoder/mall/product/rest/convert/attr/ProductAttrConvert.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
product
.
rest
.
convert
.
attr
;
package
cn
.
iocoder
.
mall
.
product
.
rest
.
convert
.
attr
;
import
cn.iocoder.common.framework.vo.PageResult
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrBO
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrSimpleWithValueBO
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrSimpleWithValueBO
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrValueBO
;
import
cn.iocoder.mall.product.biz.bo.attr.ProductAttrWithValueBO
;
import
cn.iocoder.mall.product.biz.dto.attr.ProductAttrPageDTO
;
import
cn.iocoder.mall.product.biz.dto.attr.ProductAttrUpdateDTO
;
import
cn.iocoder.mall.product.rest.request.attr.ProductAttrPageRequest
;
import
cn.iocoder.mall.product.rest.request.attr.ProductAttrUpdateRequest
;
import
cn.iocoder.mall.product.rest.response.attr.AdminsProductAttrPageResponse
;
import
cn.iocoder.mall.product.rest.response.attr.AdminsProductAttrSimpleResponse
;
import
cn.iocoder.mall.product.rest.response.attr.AdminsProductAttrSimpleResponse
;
import
cn.iocoder.mall.product.rest.response.attr.AdminsProdutAttrResponse
;
import
cn.iocoder.mall.product.rest.response.attr.AdminsProductAttrValueResponse
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mappings
;
import
org.mapstruct.Mappings
;
import
org.mapstruct.factory.Mappers
;
import
org.mapstruct.factory.Mappers
;
...
@@ -24,22 +13,8 @@ public interface ProductAttrConvert {
...
@@ -24,22 +13,8 @@ public interface ProductAttrConvert {
ProductAttrConvert
INSTANCE
=
Mappers
.
getMapper
(
ProductAttrConvert
.
class
);
ProductAttrConvert
INSTANCE
=
Mappers
.
getMapper
(
ProductAttrConvert
.
class
);
@Mappings
({})
ProductAttrPageDTO
convert
(
ProductAttrPageRequest
bean
);
@Mappings
({})
PageResult
<
AdminsProductAttrPageResponse
>
convertPage
(
PageResult
<
ProductAttrWithValueBO
>
productAttrPage
);
@Mappings
({})
@Mappings
({})
List
<
AdminsProductAttrSimpleResponse
>
convertSimple
(
List
<
ProductAttrSimpleWithValueBO
>
simpleList
);
List
<
AdminsProductAttrSimpleResponse
>
convertSimple
(
List
<
ProductAttrSimpleWithValueBO
>
simpleList
);
@Mappings
({})
AdminsProdutAttrResponse
convertAttr
(
ProductAttrBO
attrBO
);
@Mappings
({})
ProductAttrUpdateDTO
convertUpdate
(
ProductAttrUpdateRequest
updateRequest
);
@Mappings
({})
AdminsProductAttrValueResponse
convertAddResponse
(
ProductAttrValueBO
result
);
}
}
product/product-rest/src/main/java/cn/iocoder/mall/product/rest/convert/brand/ProductBrandConvert.java
deleted
100644 → 0
浏览文件 @
d88da822
package
cn
.
iocoder
.
mall
.
product
.
rest
.
convert
.
brand
;
import
cn.iocoder.common.framework.vo.PageResult
;
import
cn.iocoder.mall.product.biz.bo.brand.ProductBrandBO
;
import
cn.iocoder.mall.product.biz.dto.brand.ProductBrandAddDTO
;
import
cn.iocoder.mall.product.biz.dto.brand.ProductBrandPageDTO
;
import
cn.iocoder.mall.product.biz.dto.brand.ProductBrandUpdateDTO
;
import
cn.iocoder.mall.product.rest.request.brand.ProductBrandAddRequest
;
import
cn.iocoder.mall.product.rest.request.brand.ProductBrandPageRequest
;
import
cn.iocoder.mall.product.rest.request.brand.ProductBrandUpdateRequest
;
import
cn.iocoder.mall.product.rest.response.brand.AdminsProductBrandResponse
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.Mappings
;
import
org.mapstruct.factory.Mappers
;
@Mapper
public
interface
ProductBrandConvert
{
ProductBrandConvert
INSTANCE
=
Mappers
.
getMapper
(
ProductBrandConvert
.
class
);
@Mappings
({})
AdminsProductBrandResponse
convert
(
ProductBrandBO
brand
);
@Mappings
({})
ProductBrandAddDTO
convertAdd
(
ProductBrandAddRequest
addRequest
);
@Mappings
({})
ProductBrandUpdateDTO
convertUpdate
(
ProductBrandUpdateRequest
updateRequest
);
@Mappings
({})
ProductBrandPageDTO
convertPageRequest
(
ProductBrandPageRequest
pageRequest
);
@Mappings
({})
PageResult
<
AdminsProductBrandResponse
>
convertPage
(
PageResult
<
ProductBrandBO
>
productBrandPage
);
}
\ No newline at end of file
product/product-rest/src/main/java/cn/iocoder/mall/product/rest/response/brand/AdminsProductBrandResponse.java
deleted
100644 → 0
浏览文件 @
d88da822
package
cn
.
iocoder
.
mall
.
product
.
rest
.
response
.
brand
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
javax.validation.constraints.NotEmpty
;
/**
* VO
*/
@ApiModel
(
value
=
"商品品牌"
,
description
=
"商品品牌"
)
@Data
@Accessors
(
chain
=
true
)
public
class
AdminsProductBrandResponse
{
/**
* 规格编号
*/
@ApiModelProperty
(
value
=
"品牌编号"
,
required
=
true
,
example
=
"1"
)
private
Integer
id
;
@ApiModelProperty
(
name
=
"name"
,
value
=
"品牌名称"
,
required
=
true
,
example
=
"安踏"
)
@NotEmpty
(
message
=
"品牌名称不能为空"
)
private
String
name
;
@ApiModelProperty
(
name
=
"description"
,
value
=
"品牌描述"
,
required
=
true
,
example
=
"安踏拖鞋"
)
private
String
description
;
@ApiModelProperty
(
name
=
"picUrl"
,
value
=
"品牌图片"
,
required
=
true
,
example
=
"http://www.iocoder.cn"
)
private
String
picUrl
;
@ApiModelProperty
(
name
=
"status"
,
value
=
"状态 1开启 2禁用"
,
required
=
true
,
example
=
"1"
)
private
Integer
status
;
}
product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductSpuServiceImpl.java
浏览文件 @
981b3d87
...
@@ -151,14 +151,4 @@ public class ProductSpuServiceImpl implements ProductSpuService {
...
@@ -151,14 +151,4 @@ public class ProductSpuServiceImpl implements ProductSpuService {
return
ProductSpuConvert
.
INSTANCE
.
convert3
(
skus
,
spus
,
attrAndValuePairList
);
return
ProductSpuConvert
.
INSTANCE
.
convert3
(
skus
,
spus
,
attrAndValuePairList
);
}
}
private
boolean
sendProductUpdateMessage
(
Integer
id
)
{
// 创建 Message 对象
ProductUpdateMessage
message
=
new
ProductUpdateMessage
().
setId
(
id
);
// 创建 Spring Message 对象
Message
<
ProductUpdateMessage
>
springMessage
=
MessageBuilder
.
withPayload
(
message
)
.
build
();
// 发送消息
return
mqStreamProducer
.
productUpdateOutput
().
send
(
springMessage
);
}
}
}
product/product-start/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java
浏览文件 @
981b3d87
...
@@ -68,8 +68,4 @@ public class AdminsProductSpuController {
...
@@ -68,8 +68,4 @@ public class AdminsProductSpuController {
return
success
(
ProductSpuConvert
.
INSTANCE
.
convert3
(
list
));
return
success
(
ProductSpuConvert
.
INSTANCE
.
convert3
(
list
));
}
}
private
<
T
>
List
<
T
>
parseSkus
(
String
skuStr
,
Class
<
T
>
clazz
)
{
return
JSON
.
parseArray
(
skuStr
,
clazz
);
}
}
}
search-service-project/pom.xml
0 → 100644
浏览文件 @
981b3d87
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<parent>
<artifactId>
onemall
</artifactId>
<groupId>
cn.iocoder.mall
</groupId>
<version>
1.0-SNAPSHOT
</version>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
search-service-project
</artifactId>
<packaging>
pom
</packaging>
<modules>
<module>
search-service-api
</module>
<module>
search-service-app
</module>
</modules>
<dependencyManagement>
<dependencies>
<!-- onemall 基础 bom 文件 -->
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
mall-dependencies
</artifactId>
<version>
1.0-SNAPSHOT
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
<!-- 自身项目 -->
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
search-service-api
</artifactId>
<version>
1.0-SNAPSHOT
</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
search-service-project/search-service-api/pom.xml
0 → 100644
浏览文件 @
981b3d87
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<parent>
<artifactId>
search-service-project
</artifactId>
<groupId>
cn.iocoder.mall
</groupId>
<version>
1.0-SNAPSHOT
</version>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
search-service-api
</artifactId>
<dependencies>
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
common-framework
</artifactId>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>
javax.validation
</groupId>
<artifactId>
validation-api
</artifactId>
</dependency>
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
</dependency>
</dependencies>
</project>
search-service-project/search-service-app/pom.xml
0 → 100644
浏览文件 @
981b3d87
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<parent>
<artifactId>
search-service-project
</artifactId>
<groupId>
cn.iocoder.mall
</groupId>
<version>
1.0-SNAPSHOT
</version>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
search-service-app
</artifactId>
<dependencies>
<!-- RPC 相关 -->
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
mall-spring-boot-starter-dubbo
</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <!– 系统服务 –>-->
<!-- <groupId>cn.iocoder.mall</groupId>-->
<!-- <artifactId>system-service-api</artifactId>-->
<!-- <version>${project.version}</version>-->
<!-- </dependency>-->
<dependency>
<!-- 商品服务 -->
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
product-service-api
</artifactId>
<version>
1.0-SNAPSHOT
</version>
</dependency>
<!-- MQ 相关 -->
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
mall-spring-boot-starter-rocketmq
</artifactId>
</dependency>
<!-- Registry 和 Config 相关 -->
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<artifactId>
spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
</dependency>
<!-- DB 相关 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-elasticsearch
</artifactId>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-validation
</artifactId>
</dependency>
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
</dependency>
<dependency>
<groupId>
org.mapstruct
</groupId>
<artifactId>
mapstruct
</artifactId>
<!-- use mapstruct-jdk8 for Java 8 or higher -->
</dependency>
<dependency>
<groupId>
org.mapstruct
</groupId>
<artifactId>
mapstruct-jdk8
</artifactId>
</dependency>
<dependency>
<groupId>
org.aspectj
</groupId>
<artifactId>
aspectjweaver
</artifactId>
<version>
1.9.6
</version>
</dependency>
</dependencies>
</project>
search-service-project/search-service-app/src/main/java/cn/iocoder/mall/searchservice/SearchServiceApplication.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
searchservice
;
public
class
SearchServiceApplication
{
}
search
/search-service-impl/src/main/java/cn/iocoder/mall/search/biz/config/JPA
Configuration.java
→
search
-service-project/search-service-app/src/main/java/cn/iocoder/mall/searchservice/config/Elasticsearch
Configuration.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
search
.
biz
.
config
;
package
cn
.
iocoder
.
mall
.
search
service
.
config
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories
;
import
org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories
;
@Configuration
@Configuration
@EnableElasticsearchRepositories
(
basePackages
=
"cn.iocoder.mall.search.biz.dao"
)
@EnableElasticsearchRepositories
(
basePackages
=
"cn.iocoder.mall.search.biz.dao"
)
public
class
JPA
Configuration
{
public
class
Elasticsearch
Configuration
{
}
}
search
/search-service-impl/src/main/java/cn/iocoder/mall/search/biz/constant
/FieldAnalyzer.java
→
search
-service-project/search-service-app/src/main/java/cn/iocoder/mall/searchservice/dal/es
/FieldAnalyzer.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
search
.
biz
.
constant
;
package
cn
.
iocoder
.
mall
.
search
service
.
dal
.
es
;
/**
/**
* ES 字段分析器的枚举类
* ES 字段分析器的枚举类
...
...
search
/search-service-impl/src/main/java/cn/iocoder/mall/search/biz
/dataobject/ESProductDO.java
→
search
-service-project/search-service-app/src/main/java/cn/iocoder/mall/searchservice/dal/es
/dataobject/ESProductDO.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
search
.
biz
.
dataobject
;
package
cn
.
iocoder
.
mall
.
search
service
.
dal
.
es
.
dataobject
;
import
cn.iocoder.mall.search
.biz.constant
.FieldAnalyzer
;
import
cn.iocoder.mall.search
service.dal.es
.FieldAnalyzer
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
lombok.experimental.Accessors
;
import
org.springframework.data.annotation.Id
;
import
org.springframework.data.annotation.Id
;
...
@@ -13,7 +13,7 @@ import java.util.List;
...
@@ -13,7 +13,7 @@ import java.util.List;
/**
/**
* 商品 ES DO
* 商品 ES DO
*/
*/
@Document
(
indexName
=
"product"
,
type
=
"
spu
"
,
shards
=
1
,
replicas
=
0
)
@Document
(
indexName
=
"product"
,
type
=
"
product
"
,
shards
=
1
,
replicas
=
0
)
@Data
@Data
@Accessors
(
chain
=
true
)
@Accessors
(
chain
=
true
)
public
class
ESProductDO
{
public
class
ESProductDO
{
...
...
search
/search-service-impl/src/main/java/cn/iocoder/mall/search/biz/dao
/ProductRepository.java
→
search
-service-project/search-service-app/src/main/java/cn/iocoder/mall/searchservice/dal/es/repository
/ProductRepository.java
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
search
.
biz
.
dao
;
package
cn
.
iocoder
.
mall
.
search
service
.
dal
.
es
.
repository
;
import
cn.iocoder.common.framework.util.CollectionUtil
;
import
cn.iocoder.common.framework.util.CollectionUtil
s
;
import
cn.iocoder.common.framework.util.StringUtil
;
import
cn.iocoder.common.framework.util.StringUtil
s
;
import
cn.iocoder.common.framework.vo.SortingField
;
import
cn.iocoder.common.framework.vo.SortingField
;
import
cn.iocoder.mall.search
.biz
.dataobject.ESProductDO
;
import
cn.iocoder.mall.search
service.dal.es
.dataobject.ESProductDO
;
import
org.elasticsearch.common.lucene.search.function.FunctionScoreQuery
;
import
org.elasticsearch.common.lucene.search.function.FunctionScoreQuery
;
import
org.elasticsearch.index.query.QueryBuilders
;
import
org.elasticsearch.index.query.QueryBuilders
;
import
org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder
;
import
org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder
;
...
@@ -35,7 +35,7 @@ public interface ProductRepository extends ElasticsearchRepository<ESProductDO,
...
@@ -35,7 +35,7 @@ public interface ProductRepository extends ElasticsearchRepository<ESProductDO,
nativeSearchQueryBuilder
.
withFilter
(
QueryBuilders
.
termQuery
(
"cid"
,
cid
));
nativeSearchQueryBuilder
.
withFilter
(
QueryBuilders
.
termQuery
(
"cid"
,
cid
));
}
}
// 筛选
// 筛选
if
(
StringUtil
.
hasText
(
keyword
))
{
if
(
StringUtil
s
.
hasText
(
keyword
))
{
FunctionScoreQueryBuilder
.
FilterFunctionBuilder
[]
functions
=
{
// TODO 芋艿,分值随便打的
FunctionScoreQueryBuilder
.
FilterFunctionBuilder
[]
functions
=
{
// TODO 芋艿,分值随便打的
new
FunctionScoreQueryBuilder
.
FilterFunctionBuilder
(
matchQuery
(
"name"
,
keyword
),
new
FunctionScoreQueryBuilder
.
FilterFunctionBuilder
(
matchQuery
(
"name"
,
keyword
),
ScoreFunctionBuilders
.
weightFactorFunction
(
10
)),
ScoreFunctionBuilders
.
weightFactorFunction
(
10
)),
...
@@ -54,10 +54,10 @@ public interface ProductRepository extends ElasticsearchRepository<ESProductDO,
...
@@ -54,10 +54,10 @@ public interface ProductRepository extends ElasticsearchRepository<ESProductDO,
nativeSearchQueryBuilder
.
withQuery
(
QueryBuilders
.
matchAllQuery
());
nativeSearchQueryBuilder
.
withQuery
(
QueryBuilders
.
matchAllQuery
());
}
}
// 排序
// 排序
if
(!
CollectionUtil
.
isEmpty
(
sortFields
))
{
if
(!
CollectionUtil
s
.
isEmpty
(
sortFields
))
{
sortFields
.
forEach
(
sortField
->
nativeSearchQueryBuilder
.
withSort
(
SortBuilders
.
fieldSort
(
sortField
.
getField
())
sortFields
.
forEach
(
sortField
->
nativeSearchQueryBuilder
.
withSort
(
SortBuilders
.
fieldSort
(
sortField
.
getField
())
.
order
(
SortOrder
.
fromString
(
sortField
.
getOrder
()))));
.
order
(
SortOrder
.
fromString
(
sortField
.
getOrder
()))));
}
else
if
(
StringUtil
.
hasText
(
keyword
))
{
}
else
if
(
StringUtil
s
.
hasText
(
keyword
))
{
nativeSearchQueryBuilder
.
withSort
(
SortBuilders
.
scoreSort
().
order
(
SortOrder
.
DESC
));
nativeSearchQueryBuilder
.
withSort
(
SortBuilders
.
scoreSort
().
order
(
SortOrder
.
DESC
));
}
else
{
}
else
{
nativeSearchQueryBuilder
.
withSort
(
SortBuilders
.
fieldSort
(
"sort"
).
order
(
SortOrder
.
DESC
));
nativeSearchQueryBuilder
.
withSort
(
SortBuilders
.
fieldSort
(
"sort"
).
order
(
SortOrder
.
DESC
));
...
...
search-service-project/search-service-app/src/main/java/cn/iocoder/mall/searchservice/manager/package-info.java
0 → 100644
浏览文件 @
981b3d87
/**
* 占位
*/
package
cn
.
iocoder
.
mall
.
searchservice
.
manager
;
search-service-project/search-service-app/src/main/java/cn/iocoder/mall/searchservice/manager/product/ProductSearchManager.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
searchservice
.
manager
.
product
;
import
cn.iocoder.common.framework.vo.CommonResult
;
import
cn.iocoder.mall.productservice.rpc.category.ProductCategoryRpc
;
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.productservice.rpc.spu.ProductSpuRpc
;
import
cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO
;
import
org.apache.dubbo.config.annotation.DubboReference
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
@Service
public
class
ProductSearchManager
{
@DubboReference
(
version
=
"${dubbo.consumer.ProductSpuRpc.version}"
)
private
ProductSpuRpc
productSpuRpc
;
@DubboReference
(
version
=
"${dubbo.consumer.ProductSkuRpc.version}"
)
private
ProductSkuRpc
productSkuRpc
;
@DubboReference
(
version
=
"${dubbo.consumer.ProductCategoryRpc.version}"
)
private
ProductCategoryRpc
productCategoryRpc
;
// @DubboReference( version = "${dubbo.consumer.CartService.version}")
// private CartService cartService;
public
Boolean
saveProduct
(
Integer
id
)
{
// 获得商品 SPU
CommonResult
<
ProductSpuRespDTO
>
productSpuResult
=
productSpuRpc
.
getProductSpu
(
id
);
productSpuResult
.
checkError
();
// 获得商品 SKU
CommonResult
<
List
<
ProductSkuRespDTO
>>
listProductSkusResult
=
productSkuRpc
.
listProductSkus
(
new
ProductSkuListQueryReqDTO
().
setProductSpuId
(
id
));
listProductSkusResult
.
checkError
();
return
true
;
}
}
search-service-project/search-service-app/src/main/java/cn/iocoder/mall/searchservice/service/package-info.java
0 → 100644
浏览文件 @
981b3d87
/**
* 占位
*/
package
cn
.
iocoder
.
mall
.
searchservice
.
service
;
search-service-project/search-service-app/src/main/java/cn/iocoder/mall/searchservice/service/product/ProductSearchService.java
0 → 100644
浏览文件 @
981b3d87
package
cn
.
iocoder
.
mall
.
searchservice
.
service
.
product
;
import
org.springframework.stereotype.Service
;
@Service
public
class
ProductSearchService
{
}
search-service-project/search-service-app/src/main/resources/application-dev.yaml
0 → 100644
浏览文件 @
981b3d87
spring
:
# Spring Cloud 配置项
cloud
:
nacos
:
# Spring Cloud Nacos Discovery 配置项
discovery
:
server-addr
:
400-infra.server.iocoder.cn:8848
# Nacos 服务器地址
namespace
:
dev
# Nacos 命名空间
# Dubbo 配置项
dubbo
:
# Dubbo 注册中心
registry
:
address
:
spring-cloud://400-infra.server.iocoder.cn:8848
# 指定 Dubbo 服务注册中心的地址
search-service-project/search-service-app/src/main/resources/application-local.yaml
0 → 100644
浏览文件 @
981b3d87
spring
:
# Spring Cloud 配置项
cloud
:
nacos
:
# Spring Cloud Nacos Discovery 配置项
discovery
:
server-addr
:
400-infra.server.iocoder.cn:8848
# Nacos 服务器地址
namespace
:
dev
# Nacos 命名空间
# Dubbo 配置项
dubbo
:
# Dubbo 注册中心
registry
:
# address: spring-cloud://400-infra.server.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
address
:
nacos://400-infra.server.iocoder.cn:8848?namespace=dev
# 指定 Dubbo 服务注册中心的地址
# Dubbo 服务提供者的配置
provider
:
tag
:
${DUBBO_TAG}
# Dubbo 路由分组
search-service-project/search-service-app/src/main/resources/application.yaml
0 → 100644
浏览文件 @
981b3d87
spring
:
# Application 的配置项
application
:
name
:
search-service
# Profile 的配置项
profiles
:
active
:
local
# Dubbo 配置项
dubbo
:
# Spring Cloud Alibaba Dubbo 专属配置
cloud
:
subscribed-services
:
'
'
# 设置订阅的应用列表,默认为 * 订阅所有应用
# Dubbo 提供者的协议
protocol
:
name
:
dubbo
port
:
-1
# Dubbo 提供服务的扫描基础包
scan
:
base-packages
:
cn.iocoder.mall.searrchservice.rpc
# Dubbo 服务提供者的配置
provider
:
filter
:
-exception
validation
:
true
# 开启 Provider 参数校验
version
:
1.0.0
# 服务的版本号
# Dubbo 服务消费者的配置
consumer
:
ErrorCodeRpc
:
version
:
1.0.0
ProductCategoryRpc
:
version
:
1.0.0
ProductSpuRpc
:
version
:
1.0.0
# RocketMQ 配置项
rocketmq
:
name-server
:
400-infra.server.iocoder.cn:9876
producer
:
group
:
${spring.application.name}-producer-group
# Mall 配置项
mall
:
# 错误码配置项对应 ErrorCodeProperties 配置类
error-code
:
group
:
${spring.application.name}
constants-class
:
cn.iocoder.mall.searrchservice.enums.ProductErrorCodeConstants
search/search-service-impl/src/main/java/cn/iocoder/mall/search/biz/service/ProductSearchServiceImpl.java
浏览文件 @
981b3d87
...
@@ -46,13 +46,6 @@ public class ProductSearchServiceImpl implements ProductSearchService {
...
@@ -46,13 +46,6 @@ public class ProductSearchServiceImpl implements ProductSearchService {
@Autowired
@Autowired
private
ElasticsearchTemplate
elasticsearchTemplate
;
// 因为需要使用到聚合操作,只好引入 ElasticsearchTemplate 。
private
ElasticsearchTemplate
elasticsearchTemplate
;
// 因为需要使用到聚合操作,只好引入 ElasticsearchTemplate 。
@Reference
(
validation
=
"true"
,
version
=
"${dubbo.consumer.ProductSpuService.version}"
)
private
ProductSpuService
productSpuService
;
@Reference
(
validation
=
"true"
,
version
=
"${dubbo.consumer.ProductCategoryService.version}"
)
private
ProductCategoryService
productCategoryService
;
@Reference
(
validation
=
"true"
,
version
=
"${dubbo.consumer.CartService.version}"
)
private
CartService
cartService
;
@Override
@Override
public
Integer
rebuild
()
{
public
Integer
rebuild
()
{
// TODO 芋艿,因为目前商品比较少,所以写的很粗暴。等未来重构
// TODO 芋艿,因为目前商品比较少,所以写的很粗暴。等未来重构
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论