Commit 926db6dd5d07985f5d79f76a99d2dee1dd1158a7
1 parent
7375407d
feat(shop): 添加商品关联类别导入功能
- 新增 EbCategorysRelation 模型和相关 mapper、service - 实现 ProductController 中的 importRelatedCategory 方法 - 添加 ImportRelatedCategoryVo 和 ImportRelatedCategoryListenter 用于处理导入逻辑 - 在 pom.xml 中添加 easyexcel 依赖
Showing
13 changed files
with
326 additions
and
2 deletions
shop/pom.xml
@@ -37,6 +37,11 @@ | @@ -37,6 +37,11 @@ | ||
37 | <optional>true</optional> | 37 | <optional>true</optional> |
38 | </dependency> | 38 | </dependency> |
39 | <dependency> | 39 | <dependency> |
40 | + <groupId>com.alibaba</groupId> | ||
41 | + <artifactId>easyexcel</artifactId> | ||
42 | + <version>3.3.4</version> | ||
43 | + </dependency> | ||
44 | + <dependency> | ||
40 | <groupId>org.springframework.boot</groupId> | 45 | <groupId>org.springframework.boot</groupId> |
41 | <artifactId>spring-boot-starter-freemarker</artifactId> | 46 | <artifactId>spring-boot-starter-freemarker</artifactId> |
42 | <version>3.3.5</version> | 47 | <version>3.3.5</version> |
shop/src/main/java/com/canrd/shop/common/excel/listenter/ImportRelatedCategoryListenter.java
0 → 100644
1 | +package com.canrd.shop.common.excel.listenter; | ||
2 | + | ||
3 | +import cn.hutool.core.bean.BeanUtil; | ||
4 | +import com.alibaba.excel.context.AnalysisContext; | ||
5 | +import com.alibaba.excel.event.AnalysisEventListener; | ||
6 | +import com.canrd.shop.module.dto.EbCategorysRelation; | ||
7 | +import com.canrd.shop.module.dto.ProductCategoryDO; | ||
8 | +import com.canrd.shop.module.vo.ImportRelatedCategoryVo; | ||
9 | +import com.canrd.shop.service.IEbCategorysRelationService; | ||
10 | +import com.canrd.shop.service.ProductCategoryService; | ||
11 | + | ||
12 | + | ||
13 | +import java.util.Optional; | ||
14 | + | ||
15 | +/** | ||
16 | + * @author zgt | ||
17 | + * @project mobile.canrd.com-service | ||
18 | + * @description | ||
19 | + * @date 2024/8/26 | ||
20 | + */ | ||
21 | +public class ImportRelatedCategoryListenter extends AnalysisEventListener<ImportRelatedCategoryVo> { | ||
22 | + | ||
23 | + private IEbCategorysRelationService ebCategorysRelationService; | ||
24 | + private ProductCategoryService categoryService; | ||
25 | + | ||
26 | + public ImportRelatedCategoryListenter(IEbCategorysRelationService ebCategorysRelationService, ProductCategoryService categoryService) { | ||
27 | + this.ebCategorysRelationService = ebCategorysRelationService; | ||
28 | + this.categoryService = categoryService; | ||
29 | + } | ||
30 | + | ||
31 | + @Override | ||
32 | + public void invoke(ImportRelatedCategoryVo importRelatedCategoryVo, AnalysisContext analysisContext) { | ||
33 | + Optional<ProductCategoryDO> categoryOptional = categoryService.lambdaQuery() | ||
34 | + .eq(ProductCategoryDO::getName, importRelatedCategoryVo.getCategoryName()) | ||
35 | + .select(ProductCategoryDO::getId) | ||
36 | + .oneOpt(); | ||
37 | + Optional<ProductCategoryDO> relatedCategoryOptional = categoryService.lambdaQuery() | ||
38 | + .eq(ProductCategoryDO::getName, importRelatedCategoryVo.getRelatedCategoryName()) | ||
39 | + .select(ProductCategoryDO::getId) | ||
40 | + .oneOpt(); | ||
41 | + if (!categoryOptional.isPresent()||!relatedCategoryOptional.isPresent()){ | ||
42 | + return; | ||
43 | + } | ||
44 | + EbCategorysRelation bean = BeanUtil.toBean(importRelatedCategoryVo, EbCategorysRelation.class); | ||
45 | + bean.setCategoryId(categoryOptional.get().getId()); | ||
46 | + bean.setRelatedCategoryId(relatedCategoryOptional.get().getId()); | ||
47 | + ebCategorysRelationService.save(bean); | ||
48 | + } | ||
49 | + | ||
50 | + @Override | ||
51 | + public void doAfterAllAnalysed(AnalysisContext analysisContext) { | ||
52 | + | ||
53 | + } | ||
54 | + | ||
55 | + @Override | ||
56 | + public void onException(Exception exception, AnalysisContext context) throws Exception { | ||
57 | + super.onException(exception, context); | ||
58 | + } | ||
59 | +} |
shop/src/main/java/com/canrd/shop/controller/ProductController.java
1 | package com.canrd.shop.controller; | 1 | package com.canrd.shop.controller; |
2 | 2 | ||
3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
4 | +import com.alibaba.excel.EasyExcel; | ||
4 | import com.canrd.shop.common.constant.ServerResult; | 5 | import com.canrd.shop.common.constant.ServerResult; |
6 | +import com.canrd.shop.common.excel.listenter.ImportRelatedCategoryListenter; | ||
5 | import com.canrd.shop.common.exception.BusinessException; | 7 | import com.canrd.shop.common.exception.BusinessException; |
6 | import com.canrd.shop.common.jsr303.OperateGroup; | 8 | import com.canrd.shop.common.jsr303.OperateGroup; |
7 | import com.canrd.shop.config.StaticHtmlConfig; | 9 | import com.canrd.shop.config.StaticHtmlConfig; |
8 | import com.canrd.shop.module.dto.ProductCategoryDO; | 10 | import com.canrd.shop.module.dto.ProductCategoryDO; |
9 | import com.canrd.shop.module.dto.ProductDO; | 11 | import com.canrd.shop.module.dto.ProductDO; |
10 | import com.canrd.shop.module.dto.ProductFunctionDO; | 12 | import com.canrd.shop.module.dto.ProductFunctionDO; |
13 | +import com.canrd.shop.module.vo.ImportRelatedCategoryVo; | ||
11 | import com.canrd.shop.module.vo.ProductCategoryQueryVO; | 14 | import com.canrd.shop.module.vo.ProductCategoryQueryVO; |
12 | import com.canrd.shop.module.vo.ProductQueryVO; | 15 | import com.canrd.shop.module.vo.ProductQueryVO; |
13 | import com.canrd.shop.module.vo.ProductVO; | 16 | import com.canrd.shop.module.vo.ProductVO; |
17 | +import com.canrd.shop.service.IEbCategorysRelationService; | ||
14 | import com.canrd.shop.service.ProductCategoryService; | 18 | import com.canrd.shop.service.ProductCategoryService; |
15 | import com.canrd.shop.service.ProductFunctionService; | 19 | import com.canrd.shop.service.ProductFunctionService; |
16 | import com.canrd.shop.service.ProductService; | 20 | import com.canrd.shop.service.ProductService; |
17 | import freemarker.template.Configuration; | 21 | import freemarker.template.Configuration; |
18 | import freemarker.template.Template; | 22 | import freemarker.template.Template; |
19 | import freemarker.template.TemplateException; | 23 | import freemarker.template.TemplateException; |
24 | +import org.apache.catalina.Server; | ||
20 | import org.apache.commons.lang3.StringUtils; | 25 | import org.apache.commons.lang3.StringUtils; |
21 | import org.springframework.beans.factory.annotation.Autowired; | 26 | import org.springframework.beans.factory.annotation.Autowired; |
22 | import org.springframework.beans.factory.annotation.Value; | 27 | import org.springframework.beans.factory.annotation.Value; |
23 | import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; | 28 | import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; |
24 | import org.springframework.validation.annotation.Validated; | 29 | import org.springframework.validation.annotation.Validated; |
25 | import org.springframework.web.bind.annotation.*; | 30 | import org.springframework.web.bind.annotation.*; |
31 | +import org.springframework.web.multipart.MultipartFile; | ||
26 | 32 | ||
27 | import javax.annotation.Resource; | 33 | import javax.annotation.Resource; |
28 | import java.io.*; | 34 | import java.io.*; |
@@ -59,6 +65,9 @@ public class ProductController { | @@ -59,6 +65,9 @@ public class ProductController { | ||
59 | @Autowired | 65 | @Autowired |
60 | private ProductFunctionService productFunctionService; | 66 | private ProductFunctionService productFunctionService; |
61 | 67 | ||
68 | + @Autowired | ||
69 | + private IEbCategorysRelationService ebCategorysRelationService; | ||
70 | + | ||
62 | /** | 71 | /** |
63 | * 产品分类 | 72 | * 产品分类 |
64 | * | 73 | * |
@@ -87,7 +96,7 @@ public class ProductController { | @@ -87,7 +96,7 @@ public class ProductController { | ||
87 | } | 96 | } |
88 | 97 | ||
89 | /** | 98 | /** |
90 | - * 分页查询 | 99 | + * 生成静态页面 |
91 | * | 100 | * |
92 | * @param productQueryVO 查询条件 | 101 | * @param productQueryVO 查询条件 |
93 | * @return 查询结果 | 102 | * @return 查询结果 |
@@ -158,7 +167,7 @@ public class ProductController { | @@ -158,7 +167,7 @@ public class ProductController { | ||
158 | } | 167 | } |
159 | 168 | ||
160 | System.out.println("文件已成功保存到 " + outputFile.getAbsolutePath()); | 169 | System.out.println("文件已成功保存到 " + outputFile.getAbsolutePath()); |
161 | - return null; | 170 | + return ServerResult.success(fileName); |
162 | } | 171 | } |
163 | 172 | ||
164 | /** | 173 | /** |
@@ -210,5 +219,23 @@ public class ProductController { | @@ -210,5 +219,23 @@ public class ProductController { | ||
210 | return productService.chatgpt(productQueryVO); | 219 | return productService.chatgpt(productQueryVO); |
211 | } | 220 | } |
212 | 221 | ||
222 | + /** | ||
223 | + * 导入商品关联文章 | ||
224 | + */ | ||
225 | + @RequestMapping(value = "/importRelatedCategory", method = RequestMethod.POST) | ||
226 | + public ServerResult importRelatedCategory(@RequestParam MultipartFile file) throws IOException { | ||
227 | + //校验表格后缀是否为以.xlsx或者xls结尾的 | ||
228 | + String suffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1, | ||
229 | + file.getOriginalFilename().length() - 1); | ||
230 | + if (!"xlsx".equals(suffixName) && !"xls".equals(suffixName)) { | ||
231 | + throw new RuntimeException("文件格式错误"); | ||
232 | + } | ||
233 | + EasyExcel.read(file.getInputStream(), ImportRelatedCategoryVo.class, | ||
234 | + new ImportRelatedCategoryListenter(ebCategorysRelationService,productCategoryService)) | ||
235 | + .sheet(0) | ||
236 | + .doRead(); | ||
237 | + return ServerResult.success(); | ||
238 | + } | ||
239 | + | ||
213 | } | 240 | } |
214 | 241 |
shop/src/main/java/com/canrd/shop/mapper/EbCategorysRelationMapper.java
0 → 100644
1 | +package com.canrd.shop.mapper; | ||
2 | + | ||
3 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | ||
4 | +import com.canrd.shop.module.dto.EbCategorysRelation; | ||
5 | + | ||
6 | +/** | ||
7 | + * <p> | ||
8 | + * Mapper 接口 | ||
9 | + * </p> | ||
10 | + * | ||
11 | + * @author author | ||
12 | + * @since 2024-11-14 | ||
13 | + */ | ||
14 | +public interface EbCategorysRelationMapper extends BaseMapper<EbCategorysRelation> { | ||
15 | + | ||
16 | +} |
shop/src/main/java/com/canrd/shop/module/dto/EbCategorysRelation.java
0 → 100644
1 | +package com.canrd.shop.module.dto; | ||
2 | + | ||
3 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
4 | +import com.baomidou.mybatisplus.annotation.IdType; | ||
5 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
6 | +import java.io.Serializable; | ||
7 | +import lombok.Data; | ||
8 | +import lombok.EqualsAndHashCode; | ||
9 | +import lombok.experimental.Accessors; | ||
10 | + | ||
11 | +/** | ||
12 | + * <p> | ||
13 | + * | ||
14 | + * </p> | ||
15 | + * | ||
16 | + * @author author | ||
17 | + * @since 2024-11-14 | ||
18 | + */ | ||
19 | +@Data | ||
20 | +@EqualsAndHashCode(callSuper = false) | ||
21 | +@Accessors(chain = true) | ||
22 | +@TableName("eb_categorys_relation") | ||
23 | +public class EbCategorysRelation implements Serializable { | ||
24 | + | ||
25 | + private static final long serialVersionUID = 1L; | ||
26 | + | ||
27 | + @TableId(value = "id", type = IdType.AUTO) | ||
28 | + private Long id; | ||
29 | + | ||
30 | + private String categoryName; | ||
31 | + | ||
32 | + private String relatedCategoryName; | ||
33 | + | ||
34 | + private String categoryId; | ||
35 | + | ||
36 | + private String relatedCategoryId; | ||
37 | + | ||
38 | + private Integer relevance; | ||
39 | + | ||
40 | + | ||
41 | +} |
shop/src/main/java/com/canrd/shop/module/vo/ImportRelatedCategoryVo.java
0 → 100644
1 | +package com.canrd.shop.module.vo; | ||
2 | + | ||
3 | +import com.alibaba.excel.annotation.ExcelProperty; | ||
4 | +import lombok.Data; | ||
5 | +import lombok.EqualsAndHashCode; | ||
6 | + | ||
7 | +/** | ||
8 | + * @author zgt | ||
9 | + * @project mobile.canrd.com-service | ||
10 | + * @description | ||
11 | + * @date 2024/8/27 | ||
12 | + */ | ||
13 | +@Data | ||
14 | +@EqualsAndHashCode(callSuper = false) | ||
15 | +public class ImportRelatedCategoryVo { | ||
16 | + @ExcelProperty(value = "分类") | ||
17 | + private String categoryName; | ||
18 | + @ExcelProperty(value = "关联分类") | ||
19 | + private String relatedCategoryName; | ||
20 | + | ||
21 | + @ExcelProperty(value = "排序") | ||
22 | + private Integer relevance; | ||
23 | +} |
shop/src/main/java/com/canrd/shop/service/IEbCategorysRelationService.java
0 → 100644
1 | +package com.canrd.shop.service; | ||
2 | + | ||
3 | +import com.baomidou.mybatisplus.extension.service.IService; | ||
4 | +import com.canrd.shop.module.dto.EbCategorysRelation; | ||
5 | + | ||
6 | +/** | ||
7 | + * <p> | ||
8 | + * 服务类 | ||
9 | + * </p> | ||
10 | + * | ||
11 | + * @author author | ||
12 | + * @since 2024-11-14 | ||
13 | + */ | ||
14 | +public interface IEbCategorysRelationService extends IService<EbCategorysRelation> { | ||
15 | + | ||
16 | +} |
shop/src/main/java/com/canrd/shop/service/impl/EbCategorysRelationServiceImpl.java
0 → 100644
1 | +package com.canrd.shop.service.impl; | ||
2 | + | ||
3 | + | ||
4 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||
5 | +import com.canrd.shop.mapper.EbCategorysRelationMapper; | ||
6 | +import com.canrd.shop.module.dto.EbCategorysRelation; | ||
7 | +import com.canrd.shop.service.IEbCategorysRelationService; | ||
8 | +import org.springframework.stereotype.Service; | ||
9 | + | ||
10 | +/** | ||
11 | + * <p> | ||
12 | + * 服务实现类 | ||
13 | + * </p> | ||
14 | + * | ||
15 | + * @author author | ||
16 | + * @since 2024-11-14 | ||
17 | + */ | ||
18 | +@Service | ||
19 | +public class EbCategorysRelationServiceImpl extends ServiceImpl<EbCategorysRelationMapper, EbCategorysRelation> implements IEbCategorysRelationService { | ||
20 | + | ||
21 | +} |
src/main/java/com/order/erp/domain/model/EbCategorysRelation.java
0 → 100644
1 | +package com.order.erp.domain.model; | ||
2 | + | ||
3 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
4 | +import com.baomidou.mybatisplus.annotation.IdType; | ||
5 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
6 | +import java.io.Serializable; | ||
7 | +import io.swagger.annotations.ApiModel; | ||
8 | +import io.swagger.annotations.ApiModelProperty; | ||
9 | +import lombok.Data; | ||
10 | +import lombok.EqualsAndHashCode; | ||
11 | +import lombok.experimental.Accessors; | ||
12 | + | ||
13 | +/** | ||
14 | + * <p> | ||
15 | + * | ||
16 | + * </p> | ||
17 | + * | ||
18 | + * @author author | ||
19 | + * @since 2024-11-14 | ||
20 | + */ | ||
21 | +@Data | ||
22 | +@EqualsAndHashCode(callSuper = false) | ||
23 | +@Accessors(chain = true) | ||
24 | +@TableName("eb_categorys_relation") | ||
25 | +@ApiModel(value="EbCategorysRelation对象", description="") | ||
26 | +public class EbCategorysRelation implements Serializable { | ||
27 | + | ||
28 | + private static final long serialVersionUID = 1L; | ||
29 | + | ||
30 | + @TableId(value = "id", type = IdType.AUTO) | ||
31 | + private Long id; | ||
32 | + | ||
33 | + private String categoryName; | ||
34 | + | ||
35 | + private String relatedCategoryName; | ||
36 | + | ||
37 | + private Integer categoryId; | ||
38 | + | ||
39 | + private Integer relatedCategoryId; | ||
40 | + | ||
41 | + private Integer relevance; | ||
42 | + | ||
43 | + | ||
44 | +} |
src/main/java/com/order/erp/mapper/EbCategorysRelationMapper.java
0 → 100644
1 | +package com.order.erp.mapper; | ||
2 | + | ||
3 | +import com.order.erp.domain.model.EbCategorysRelation; | ||
4 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | ||
5 | + | ||
6 | +/** | ||
7 | + * <p> | ||
8 | + * Mapper 接口 | ||
9 | + * </p> | ||
10 | + * | ||
11 | + * @author author | ||
12 | + * @since 2024-11-14 | ||
13 | + */ | ||
14 | +public interface EbCategorysRelationMapper extends BaseMapper<EbCategorysRelation> { | ||
15 | + | ||
16 | +} |
src/main/java/com/order/erp/service/IEbCategorysRelationService.java
0 → 100644
1 | +package com.order.erp.service; | ||
2 | + | ||
3 | +import com.order.erp.domain.model.EbCategorysRelation; | ||
4 | +import com.baomidou.mybatisplus.extension.service.IService; | ||
5 | + | ||
6 | +/** | ||
7 | + * <p> | ||
8 | + * 服务类 | ||
9 | + * </p> | ||
10 | + * | ||
11 | + * @author author | ||
12 | + * @since 2024-11-14 | ||
13 | + */ | ||
14 | +public interface IEbCategorysRelationService extends IService<EbCategorysRelation> { | ||
15 | + | ||
16 | +} |
src/main/java/com/order/erp/service/impl/EbCategorysRelationServiceImpl.java
0 → 100644
1 | +package com.order.erp.service.impl; | ||
2 | + | ||
3 | +import com.order.erp.domain.model.EbCategorysRelation; | ||
4 | +import com.order.erp.mapper.EbCategorysRelationMapper; | ||
5 | +import com.order.erp.service.IEbCategorysRelationService; | ||
6 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||
7 | +import org.springframework.stereotype.Service; | ||
8 | + | ||
9 | +/** | ||
10 | + * <p> | ||
11 | + * 服务实现类 | ||
12 | + * </p> | ||
13 | + * | ||
14 | + * @author author | ||
15 | + * @since 2024-11-14 | ||
16 | + */ | ||
17 | +@Service | ||
18 | +public class EbCategorysRelationServiceImpl extends ServiceImpl<EbCategorysRelationMapper, EbCategorysRelation> implements IEbCategorysRelationService { | ||
19 | + | ||
20 | +} |
src/main/resources/mapper/EbCategorysRelationMapper.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||
3 | +<mapper namespace="com.order.erp.mapper.EbCategorysRelationMapper"> | ||
4 | + | ||
5 | + <!-- 通用查询映射结果 --> | ||
6 | + <resultMap id="BaseResultMap" type="com.order.erp.domain.model.EbCategorysRelation"> | ||
7 | + <id column="id" property="id" /> | ||
8 | + <result column="category_name" property="categoryName" /> | ||
9 | + <result column="related_category_name" property="relatedCategoryName" /> | ||
10 | + <result column="category_id" property="categoryId" /> | ||
11 | + <result column="related_category_id" property="relatedCategoryId" /> | ||
12 | + <result column="relevance" property="relevance" /> | ||
13 | + </resultMap> | ||
14 | + | ||
15 | + <!-- 通用查询结果列 --> | ||
16 | + <sql id="Base_Column_List"> | ||
17 | + id, category_name, related_category_name, category_id, related_category_id, relevance | ||
18 | + </sql> | ||
19 | + | ||
20 | +</mapper> |