Commit 27724e37b73dd0e894a32876c9ef064ff1611c65

Authored by 曾国涛
1 parent c146806b

feat(shop): 添加产品关联文章功能

- 新增产品关联文章导入接口和相关服务
- 实现产品和文章的关联逻辑- 添加文章和文章类别相关的数据结构和接口
Showing 17 changed files with 211 additions and 101 deletions
admin/pom.xml
... ... @@ -36,6 +36,11 @@
36 36 <optional>true</optional>
37 37 </dependency>
38 38 <dependency>
  39 + <groupId>com.alibaba</groupId>
  40 + <artifactId>easyexcel</artifactId>
  41 + <version>3.3.4</version>
  42 + </dependency>
  43 + <dependency>
39 44 <groupId>org.springframework.boot</groupId>
40 45 <artifactId>spring-boot-starter-aop</artifactId>
41 46 </dependency>
... ...
admin/src/main/java/com/canrd/shop/domain/dto/ImportProductRelatedArticle.java 0 → 100644
  1 +package com.canrd.shop.domain.dto;
  2 +
  3 +import com.alibaba.excel.annotation.ExcelProperty;
  4 +import lombok.Data;
  5 +
  6 +/**
  7 + * @author zgt
  8 + * @project canrd-services
  9 + * @description
  10 + * @date 2024/11/22
  11 + */
  12 +@Data
  13 +public class ImportProductRelatedArticle {
  14 + @ExcelProperty("Product ID")
  15 + private String productId;
  16 + @ExcelProperty("Link")
  17 + private String link;
  18 + @ExcelProperty("Title")
  19 + private String title;
  20 +}
... ...
shop/src/main/java/com/canrd/shop/common/excel/listenter/ImportRelatedArticleListener.java 0 → 100644
  1 +package com.canrd.shop.common.excel.listenter;
  2 +
  3 +import com.alibaba.excel.context.AnalysisContext;
  4 +import com.alibaba.excel.event.AnalysisEventListener;
  5 +import com.alibaba.excel.metadata.data.ReadCellData;
  6 +import com.canrd.shop.module.dto.*;
  7 +import com.canrd.shop.service.*;
  8 +import lombok.NoArgsConstructor;
  9 +import lombok.NonNull;
  10 +import lombok.RequiredArgsConstructor;
  11 +
  12 +import java.util.HashSet;
  13 +import java.util.List;
  14 +import java.util.Map;
  15 +import java.util.Set;
  16 +import java.util.stream.Collectors;
  17 +
  18 +/**
  19 + * @author zgt
  20 + * @project canrd-services
  21 + * @description
  22 + * @date 2024/11/22
  23 + */
  24 +@RequiredArgsConstructor
  25 +@NoArgsConstructor
  26 +public class ImportRelatedArticleListener extends AnalysisEventListener<ImportProductRelatedJournal> {
  27 + @NonNull
  28 + private ProductService productService;
  29 + @NonNull
  30 + private IProductcategoryrelationService productCategoryrelationService;
  31 + @NonNull
  32 + private IJournalCategoryRelationService journalCategoryService;
  33 + @NonNull
  34 + private IJournalService journalService;
  35 + @NonNull
  36 + private ProductCategoryService productCategoryService;
  37 + private Set<String> rootCategoryIds = new HashSet<>();
  38 + @Override
  39 + public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
  40 + List<ProductCategoryDO> list = productCategoryService.list();
  41 + Set<String> parentIds = list.stream().map(ProductCategoryDO::getParentId).collect(Collectors.toSet());
  42 + List<ProductCategoryDO> rootCate = list.stream().filter(cate -> !parentIds.contains(cate.getId())).collect(Collectors.toList());
  43 + rootCategoryIds = rootCate.stream().map(ProductCategoryDO::getId).collect(Collectors.toSet());
  44 + super.invokeHead(headMap, context);
  45 + }
  46 +
  47 + @Override
  48 + public void invoke(ImportProductRelatedJournal importProductRelatedJournal, AnalysisContext analysisContext) {
  49 + String productId = importProductRelatedJournal.getProductId();
  50 + Journal journal = Journal.builder()
  51 + .link(importProductRelatedJournal.getLink())
  52 + .title(importProductRelatedJournal.getTitle())
  53 + .productId(productId)
  54 + .build();
  55 + journalService.save(journal);
  56 + List<Productcategoryrelation> list = productCategoryrelationService.lambdaQuery()
  57 + .eq(Productcategoryrelation::getProductId, productId)
  58 + .in(Productcategoryrelation::getCategoryId, rootCategoryIds)
  59 + .list();
  60 + List<JournalCategoryRelation> relations = list.stream().map(productcategoryrelation -> JournalCategoryRelation.builder()
  61 + .journalId(journal.getId())
  62 + .categoryId(productcategoryrelation.getCategoryId())
  63 + .build()).collect(Collectors.toList());
  64 + journalCategoryService.saveBatch(relations);
  65 + }
  66 +
  67 + @Override
  68 + public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  69 + }
  70 +}
... ...
shop/src/main/java/com/canrd/shop/controller/ProductController.java
... ... @@ -4,9 +4,11 @@ import cn.hutool.core.collection.CollUtil;
4 4 import com.alibaba.excel.EasyExcel;
5 5 import com.canrd.shop.common.constant.ServerResult;
6 6 import com.canrd.shop.common.excel.listenter.ImportRelatedCategoryListenter;
  7 +import com.canrd.shop.common.excel.listenter.ImportRelatedArticleListener;
7 8 import com.canrd.shop.common.exception.BusinessException;
8 9 import com.canrd.shop.common.jsr303.OperateGroup;
9 10 import com.canrd.shop.config.StaticHtmlConfig;
  11 +import com.canrd.shop.module.dto.ImportProductRelatedJournal;
10 12 import com.canrd.shop.module.dto.ProductCategoryDO;
11 13 import com.canrd.shop.module.dto.ProductDO;
12 14 import com.canrd.shop.module.dto.ProductFunctionDO;
... ... @@ -14,14 +16,11 @@ import com.canrd.shop.module.vo.ImportRelatedCategoryVo;
14 16 import com.canrd.shop.module.vo.ProductCategoryQueryVO;
15 17 import com.canrd.shop.module.vo.ProductQueryVO;
16 18 import com.canrd.shop.module.vo.ProductVO;
17   -import com.canrd.shop.service.IEbCategorysRelationService;
18   -import com.canrd.shop.service.ProductCategoryService;
19   -import com.canrd.shop.service.ProductFunctionService;
20   -import com.canrd.shop.service.ProductService;
  19 +import com.canrd.shop.service.*;
21 20 import freemarker.template.Configuration;
22 21 import freemarker.template.Template;
23 22 import freemarker.template.TemplateException;
24   -import org.apache.catalina.Server;
  23 +import lombok.NonNull;
25 24 import org.apache.commons.lang3.StringUtils;
26 25 import org.springframework.beans.factory.annotation.Autowired;
27 26 import org.springframework.beans.factory.annotation.Value;
... ... @@ -32,10 +31,7 @@ import org.springframework.web.multipart.MultipartFile;
32 31  
33 32 import javax.annotation.Resource;
34 33 import java.io.*;
35   -import java.lang.reflect.Field;
36   -import java.net.URL;
37 34 import java.util.*;
38   -import java.util.stream.Stream;
39 35  
40 36 /**
41 37 * (Product)表控制层
... ... @@ -47,6 +43,12 @@ import java.util.stream.Stream;
47 43 @RequestMapping("/shop/product")
48 44 public class ProductController {
49 45 @Autowired
  46 + private IProductcategoryrelationService productCategoryrelationService;
  47 + @Autowired
  48 + private IJournalCategoryRelationService journalCategoryService;
  49 + @Autowired
  50 + private IJournalService journalService;
  51 + @Autowired
50 52 private Configuration freeMarkerConfig;
51 53 @Value("${spring.profiles.active}")
52 54 private String activeProfile;
... ... @@ -238,5 +240,16 @@ public class ProductController {
238 240 return ServerResult.success();
239 241 }
240 242  
  243 +
  244 + @PostMapping("importRelatedJournal")
  245 + @ResponseBody
  246 + public ServerResult importRelatedJournal(MultipartFile file) throws IOException {
  247 + EasyExcel.read(file.getInputStream(),
  248 + ImportProductRelatedJournal.class,
  249 + new ImportRelatedArticleListener(productService,productCategoryrelationService,journalCategoryService,journalService,productCategoryService))
  250 + .sheet()
  251 + .doRead();
  252 + return ServerResult.success();
  253 + }
241 254 }
242 255  
... ...
src/main/java/com/order/erp/mapper/ProductcategoryrelationMapper.java renamed to shop/src/main/java/com/canrd/shop/mapper/JournalCategoryRelationMapper.java
1   -package com.order.erp.mapper;
  1 +package com.canrd.shop.mapper;
2 2  
3   -import com.order.erp.domain.model.Productcategoryrelation;
4 3 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import com.canrd.shop.module.dto.JournalCategoryRelation;
5 5  
6 6 /**
7 7 * <p>
... ... @@ -9,8 +9,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
9 9 * </p>
10 10 *
11 11 * @author author
12   - * @since 2024-11-14
  12 + * @since 2024-11-25
13 13 */
14   -public interface ProductcategoryrelationMapper extends BaseMapper<Productcategoryrelation> {
  14 +public interface JournalCategoryRelationMapper extends BaseMapper<JournalCategoryRelation> {
15 15  
16 16 }
... ...
src/main/java/com/order/erp/mapper/EbCategorysRelationMapper.java renamed to shop/src/main/java/com/canrd/shop/mapper/JournalMapper.java
1   -package com.order.erp.mapper;
  1 +package com.canrd.shop.mapper;
2 2  
3   -import com.order.erp.domain.model.EbCategorysRelation;
4 3 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import com.canrd.shop.module.dto.Journal;
5 5  
6 6 /**
7 7 * <p>
... ... @@ -9,8 +9,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
9 9 * </p>
10 10 *
11 11 * @author author
12   - * @since 2024-11-14
  12 + * @since 2024-11-25
13 13 */
14   -public interface EbCategorysRelationMapper extends BaseMapper<EbCategorysRelation> {
  14 +public interface JournalMapper extends BaseMapper<Journal> {
15 15  
16 16 }
... ...
shop/src/main/java/com/canrd/shop/module/dto/ImportProductRelatedJournal.java 0 → 100644
  1 +package com.canrd.shop.module.dto;
  2 +
  3 +import com.alibaba.excel.annotation.ExcelProperty;
  4 +import lombok.Data;
  5 +
  6 +/**
  7 + * @author zgt
  8 + * @project canrd-services
  9 + * @description
  10 + * @date 2024/11/22
  11 + */
  12 +@Data
  13 +public class ImportProductRelatedJournal {
  14 + @ExcelProperty("Product ID")
  15 + private String productId;
  16 + @ExcelProperty("Link")
  17 + private String link;
  18 + @ExcelProperty("Title")
  19 + private String title;
  20 +}
... ...
src/main/java/com/order/erp/domain/model/Productcategoryrelation.java renamed to shop/src/main/java/com/canrd/shop/module/dto/Journal.java
1   -package com.order.erp.domain.model;
  1 +package com.canrd.shop.module.dto;
2 2  
3 3 import com.baomidou.mybatisplus.annotation.TableName;
4 4 import com.baomidou.mybatisplus.annotation.IdType;
5   -import java.time.LocalDateTime;
6 5 import com.baomidou.mybatisplus.annotation.TableId;
7 6 import java.io.Serializable;
8   -import io.swagger.annotations.ApiModel;
9   -import io.swagger.annotations.ApiModelProperty;
  7 +
  8 +import lombok.AllArgsConstructor;
10 9 import lombok.Data;
11 10 import lombok.EqualsAndHashCode;
  11 +import lombok.NoArgsConstructor;
12 12 import lombok.experimental.Accessors;
  13 +import lombok.experimental.SuperBuilder;
13 14  
14 15 /**
15 16 * <p>
... ... @@ -17,22 +18,25 @@ import lombok.experimental.Accessors;
17 18 * </p>
18 19 *
19 20 * @author author
20   - * @since 2024-11-14
  21 + * @since 2024-11-25
21 22 */
22 23 @Data
23 24 @EqualsAndHashCode(callSuper = false)
24   -@Accessors(chain = true)
25   -@TableName("productcategoryrelation")
26   -@ApiModel(value="Productcategoryrelation对象", description="")
27   -public class Productcategoryrelation implements Serializable {
  25 +@SuperBuilder
  26 +@AllArgsConstructor
  27 +@NoArgsConstructor
  28 +@TableName("journal")
  29 +public class Journal implements Serializable {
28 30  
29 31 private static final long serialVersionUID = 1L;
30 32  
31   - private String productId;
  33 + @TableId(value = "id", type = IdType.AUTO)
  34 + private Long id;
32 35  
33   - private String categoryId;
  36 + private String link;
34 37  
35   - private LocalDateTime modifyDate;
  38 + private String productId;
36 39  
  40 + private String title;
37 41  
38 42 }
... ...
src/main/java/com/order/erp/domain/model/EbCategorysRelation.java renamed to shop/src/main/java/com/canrd/shop/module/dto/JournalCategoryRelation.java
1   -package com.order.erp.domain.model;
  1 +package com.canrd.shop.module.dto;
2 2  
3 3 import com.baomidou.mybatisplus.annotation.TableName;
4 4 import com.baomidou.mybatisplus.annotation.IdType;
5 5 import com.baomidou.mybatisplus.annotation.TableId;
6 6 import java.io.Serializable;
7   -import io.swagger.annotations.ApiModel;
8   -import io.swagger.annotations.ApiModelProperty;
  7 +
  8 +import lombok.AllArgsConstructor;
9 9 import lombok.Data;
10 10 import lombok.EqualsAndHashCode;
  11 +import lombok.NoArgsConstructor;
11 12 import lombok.experimental.Accessors;
  13 +import lombok.experimental.SuperBuilder;
12 14  
13 15 /**
14 16 * <p>
... ... @@ -16,29 +18,24 @@ import lombok.experimental.Accessors;
16 18 * </p>
17 19 *
18 20 * @author author
19   - * @since 2024-11-14
  21 + * @since 2024-11-25
20 22 */
21 23 @Data
22 24 @EqualsAndHashCode(callSuper = false)
23   -@Accessors(chain = true)
24   -@TableName("eb_categorys_relation")
25   -@ApiModel(value="EbCategorysRelation对象", description="")
26   -public class EbCategorysRelation implements Serializable {
  25 +@SuperBuilder
  26 +@AllArgsConstructor
  27 +@NoArgsConstructor
  28 +@TableName("journal_category_relation")
  29 +public class JournalCategoryRelation implements Serializable {
27 30  
28 31 private static final long serialVersionUID = 1L;
29 32  
30 33 @TableId(value = "id", type = IdType.AUTO)
31 34 private Long id;
32 35  
33   - private String categoryName;
34   -
35   - private String relatedCategoryName;
36   -
37   - private Integer categoryId;
38   -
39   - private Integer relatedCategoryId;
  36 + private Long journalId;
40 37  
41   - private Integer relevance;
  38 + private String categoryId;
42 39  
43 40  
44 41 }
... ...
shop/src/main/java/com/canrd/shop/module/vo/ProductVO.java
1 1 package com.canrd.shop.module.vo;
2 2  
  3 +import com.canrd.shop.module.dto.Journal;
3 4 import lombok.*;
4 5 import lombok.experimental.SuperBuilder;
5 6  
... ... @@ -145,4 +146,6 @@ public class ProductVO implements Serializable {
145 146  
146 147 private List<String> RelatedProductIds;
147 148  
  149 + private List<Journal> journals;
  150 +
148 151 }
... ...
src/main/java/com/order/erp/service/IProductcategoryrelationService.java renamed to shop/src/main/java/com/canrd/shop/service/IJournalCategoryRelationService.java
1   -package com.order.erp.service;
  1 +package com.canrd.shop.service;
2 2  
3   -import com.order.erp.domain.model.Productcategoryrelation;
4 3 import com.baomidou.mybatisplus.extension.service.IService;
  4 +import com.canrd.shop.module.dto.JournalCategoryRelation;
5 5  
6 6 /**
7 7 * <p>
... ... @@ -9,8 +9,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
9 9 * </p>
10 10 *
11 11 * @author author
12   - * @since 2024-11-14
  12 + * @since 2024-11-25
13 13 */
14   -public interface IProductcategoryrelationService extends IService<Productcategoryrelation> {
  14 +public interface IJournalCategoryRelationService extends IService<JournalCategoryRelation> {
15 15  
16 16 }
... ...
src/main/java/com/order/erp/service/IEbCategorysRelationService.java renamed to shop/src/main/java/com/canrd/shop/service/IJournalService.java
1   -package com.order.erp.service;
  1 +package com.canrd.shop.service;
2 2  
3   -import com.order.erp.domain.model.EbCategorysRelation;
4 3 import com.baomidou.mybatisplus.extension.service.IService;
  4 +import com.canrd.shop.module.dto.Journal;
5 5  
6 6 /**
7 7 * <p>
... ... @@ -9,8 +9,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
9 9 * </p>
10 10 *
11 11 * @author author
12   - * @since 2024-11-14
  12 + * @since 2024-11-25
13 13 */
14   -public interface IEbCategorysRelationService extends IService<EbCategorysRelation> {
  14 +public interface IJournalService extends IService<Journal> {
15 15  
16 16 }
... ...
src/main/java/com/order/erp/service/impl/ProductcategoryrelationServiceImpl.java renamed to shop/src/main/java/com/canrd/shop/service/impl/JournalCategoryRelationServiceImpl.java
1   -package com.order.erp.service.impl;
  1 +package com.canrd.shop.service.impl;
2 2  
3   -import com.order.erp.domain.model.Productcategoryrelation;
4   -import com.order.erp.mapper.ProductcategoryrelationMapper;
5   -import com.order.erp.service.IProductcategoryrelationService;
6 3 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4 +import com.canrd.shop.mapper.JournalCategoryRelationMapper;
  5 +import com.canrd.shop.module.dto.JournalCategoryRelation;
  6 +import com.canrd.shop.service.IJournalCategoryRelationService;
7 7 import org.springframework.stereotype.Service;
8 8  
9 9 /**
... ... @@ -12,9 +12,9 @@ import org.springframework.stereotype.Service;
12 12 * </p>
13 13 *
14 14 * @author author
15   - * @since 2024-11-14
  15 + * @since 2024-11-25
16 16 */
17 17 @Service
18   -public class ProductcategoryrelationServiceImpl extends ServiceImpl<ProductcategoryrelationMapper, Productcategoryrelation> implements IProductcategoryrelationService {
  18 +public class JournalCategoryRelationServiceImpl extends ServiceImpl<JournalCategoryRelationMapper, JournalCategoryRelation> implements IJournalCategoryRelationService {
19 19  
20 20 }
... ...
src/main/java/com/order/erp/service/impl/EbCategorysRelationServiceImpl.java renamed to shop/src/main/java/com/canrd/shop/service/impl/JournalServiceImpl.java
1   -package com.order.erp.service.impl;
  1 +package com.canrd.shop.service.impl;
2 2  
3   -import com.order.erp.domain.model.EbCategorysRelation;
4   -import com.order.erp.mapper.EbCategorysRelationMapper;
5   -import com.order.erp.service.IEbCategorysRelationService;
  3 +import com.canrd.shop.module.dto.Journal;
  4 +import com.canrd.shop.service.IJournalService;
6 5 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6 +import com.canrd.shop.mapper.JournalMapper;
7 7 import org.springframework.stereotype.Service;
8 8  
9 9 /**
... ... @@ -12,9 +12,9 @@ import org.springframework.stereotype.Service;
12 12 * </p>
13 13 *
14 14 * @author author
15   - * @since 2024-11-14
  15 + * @since 2024-11-25
16 16 */
17 17 @Service
18   -public class EbCategorysRelationServiceImpl extends ServiceImpl<EbCategorysRelationMapper, EbCategorysRelation> implements IEbCategorysRelationService {
  18 +public class JournalServiceImpl extends ServiceImpl<JournalMapper, Journal> implements IJournalService {
19 19  
20 20 }
... ...
shop/src/main/java/com/canrd/shop/service/impl/ProductServiceImpl.java
... ... @@ -77,6 +77,11 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
77 77 @Autowired
78 78 private IEbCategorysRelationService ebCategorysRelationService;
79 79  
  80 + @Autowired
  81 + private IJournalCategoryRelationService journalCategoryService;
  82 + @Autowired
  83 + private IJournalService journalService;
  84 +
80 85 /**
81 86 * 通过ID查询单条数据
82 87 * <p>
... ... @@ -144,9 +149,11 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
144 149 StringJoiner orderByJoiner = new StringJoiner(" when "," order by case pc.id when "," else 0 end ");
145 150 cateId2Relevance.forEach((k,v)->orderByJoiner.add("'"+k+"'"+" then "+v));
146 151 QueryWrapper<ProductDO> objectQueryWrapper = new QueryWrapper<ProductDO>()
  152 + .eq("ismarketable",true)
147 153 .in("pc.id", cateId2Relevance.keySet())
148 154 .select("distinct p.id","pc.id")
149 155 .last(orderByJoiner.toString());
  156 +
150 157 List<ProductDO> relatedProducts = this
151 158 .list(objectQueryWrapper);
152 159 List<String> relatedProductIds = relatedProducts.stream()
... ... @@ -156,6 +163,14 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
156 163 .collect(Collectors.toList());
157 164 productVO.setRelatedProductIds(relatedProductIds);
158 165  
  166 + List<JournalCategoryRelation> journalCategoryRelations = journalCategoryService.lambdaQuery()
  167 + .in(JournalCategoryRelation::getCategoryId, categoryIds)
  168 + .list();
  169 + List<Long> journalIds = journalCategoryRelations.stream().map(JournalCategoryRelation::getJournalId).collect(Collectors.toList());
  170 + List<Journal> journals = journalService.lambdaQuery()
  171 + .in(Journal::getId, journalIds)
  172 + .page(new Page<>(1,10)).getRecords();
  173 + productVO.setJournals(journals);
159 174 productVO.setPriceShow(productPriceShow);
160 175  
161 176  
... ...
src/main/resources/mapper/EbCategorysRelationMapper.xml deleted 100644 → 0
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>
src/main/resources/mapper/ProductcategoryrelationMapper.xml deleted 100644 → 0
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.ProductcategoryrelationMapper">
4   -
5   - <!-- 通用查询映射结果 -->
6   - <resultMap id="BaseResultMap" type="com.order.erp.domain.model.Productcategoryrelation">
7   - <result column="productId" property="productId" />
8   - <result column="categoryId" property="categoryId" />
9   - <result column="modifyDate" property="modifyDate" />
10   - </resultMap>
11   -
12   - <!-- 通用查询结果列 -->
13   - <sql id="Base_Column_List">
14   - productId, categoryId, modifyDate
15   - </sql>
16   -
17   -</mapper>