Commit 41f9002cd94dcf46918aaf195f802e30df30a160

Authored by 曾国涛
1 parent 2d4b3f38

feat(shop): 添加产品分类关系功能并优化日志配置

- 新增 Productcategoryrelation 相关的 DTO、Mapper、Service 接口及其实现类
- 在 ProductDO 中添加 relatedProductIds 字段
- 优化 ProductMapper接口和 XML 文件中的方法命名
- 更新 log4j2-dev.xml 配置,调整日志输出级别和格式
- 修改 ImportRelatedCategoryListenter 中的查询逻辑
shop/src/main/java/com/canrd/shop/common/excel/listenter/ImportRelatedCategoryListenter.java
1 package com.canrd.shop.common.excel.listenter; 1 package com.canrd.shop.common.excel.listenter;
2 2
3 import cn.hutool.core.bean.BeanUtil; 3 import cn.hutool.core.bean.BeanUtil;
  4 +import cn.hutool.core.collection.CollUtil;
4 import com.alibaba.excel.context.AnalysisContext; 5 import com.alibaba.excel.context.AnalysisContext;
5 import com.alibaba.excel.event.AnalysisEventListener; 6 import com.alibaba.excel.event.AnalysisEventListener;
6 import com.canrd.shop.module.dto.EbCategorysRelation; 7 import com.canrd.shop.module.dto.EbCategorysRelation;
@@ -10,6 +11,7 @@ import com.canrd.shop.service.IEbCategorysRelationService; @@ -10,6 +11,7 @@ import com.canrd.shop.service.IEbCategorysRelationService;
10 import com.canrd.shop.service.ProductCategoryService; 11 import com.canrd.shop.service.ProductCategoryService;
11 12
12 13
  14 +import java.util.List;
13 import java.util.Optional; 15 import java.util.Optional;
14 16
15 /** 17 /**
@@ -30,20 +32,20 @@ public class ImportRelatedCategoryListenter extends AnalysisEventListener<Import @@ -30,20 +32,20 @@ public class ImportRelatedCategoryListenter extends AnalysisEventListener<Import
30 32
31 @Override 33 @Override
32 public void invoke(ImportRelatedCategoryVo importRelatedCategoryVo, AnalysisContext analysisContext) { 34 public void invoke(ImportRelatedCategoryVo importRelatedCategoryVo, AnalysisContext analysisContext) {
33 - Optional<ProductCategoryDO> categoryOptional = categoryService.lambdaQuery() 35 + List<ProductCategoryDO> ProductCategoryDOs = categoryService.lambdaQuery()
34 .eq(ProductCategoryDO::getName, importRelatedCategoryVo.getCategoryName()) 36 .eq(ProductCategoryDO::getName, importRelatedCategoryVo.getCategoryName())
35 .select(ProductCategoryDO::getId) 37 .select(ProductCategoryDO::getId)
36 - .oneOpt();  
37 - Optional<ProductCategoryDO> relatedCategoryOptional = categoryService.lambdaQuery() 38 + .list();
  39 + List<ProductCategoryDO> relatedProductCategoryDOs = categoryService.lambdaQuery()
38 .eq(ProductCategoryDO::getName, importRelatedCategoryVo.getRelatedCategoryName()) 40 .eq(ProductCategoryDO::getName, importRelatedCategoryVo.getRelatedCategoryName())
39 .select(ProductCategoryDO::getId) 41 .select(ProductCategoryDO::getId)
40 - .oneOpt();  
41 - if (!categoryOptional.isPresent()||!relatedCategoryOptional.isPresent()){ 42 + .list();
  43 + if (CollUtil.isEmpty(ProductCategoryDOs) ||CollUtil.isEmpty(relatedProductCategoryDOs)){
42 return; 44 return;
43 } 45 }
44 EbCategorysRelation bean = BeanUtil.toBean(importRelatedCategoryVo, EbCategorysRelation.class); 46 EbCategorysRelation bean = BeanUtil.toBean(importRelatedCategoryVo, EbCategorysRelation.class);
45 - bean.setCategoryId(categoryOptional.get().getId());  
46 - bean.setRelatedCategoryId(relatedCategoryOptional.get().getId()); 47 + bean.setCategoryId(ProductCategoryDOs.get(0).getId());
  48 + bean.setRelatedCategoryId(relatedProductCategoryDOs.get(0).getId());
47 ebCategorysRelationService.save(bean); 49 ebCategorysRelationService.save(bean);
48 } 50 }
49 51
shop/src/main/java/com/canrd/shop/mapper/ProductMapper.java
@@ -10,7 +10,6 @@ import com.canrd.shop.module.dto.ProductDO; @@ -10,7 +10,6 @@ import com.canrd.shop.module.dto.ProductDO;
10 import com.canrd.shop.module.vo.ProductQueryVO; 10 import com.canrd.shop.module.vo.ProductQueryVO;
11 import org.apache.ibatis.annotations.Mapper; 11 import org.apache.ibatis.annotations.Mapper;
12 import org.apache.ibatis.annotations.Param; 12 import org.apache.ibatis.annotations.Param;
13 -import org.apache.ibatis.annotations.Select;  
14 13
15 import java.util.List; 14 import java.util.List;
16 15
@@ -24,8 +23,8 @@ import java.util.List; @@ -24,8 +23,8 @@ import java.util.List;
24 public interface ProductMapper extends BaseMapper<ProductDO> { 23 public interface ProductMapper extends BaseMapper<ProductDO> {
25 24
26 25
27 - IPage<ProductDO> selectAll(Page<ProductQueryVO> productQueryVOPage, @Param(Constants.WRAPPER) Wrapper<ProductQueryVO> wrapper); 26 + IPage<ProductDO> queryAll(Page<ProductQueryVO> productQueryVOPage, @Param(Constants.WRAPPER) Wrapper<ProductQueryVO> wrapper);
28 27
29 - List<ProductDO> selectList(@Param(Constants.WRAPPER) QueryWrapper<ProductQueryVO> queryWrapper); 28 + List<ProductDO> queryList(@Param(Constants.WRAPPER) QueryWrapper<ProductQueryVO> queryWrapper);
30 } 29 }
31 30
shop/src/main/java/com/canrd/shop/mapper/ProductcategoryrelationMapper.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.Productcategoryrelation;
  5 +
  6 +/**
  7 + * <p>
  8 + * Mapper 接口
  9 + * </p>
  10 + *
  11 + * @author author
  12 + * @since 2024-11-14
  13 + */
  14 +public interface ProductcategoryrelationMapper extends BaseMapper<Productcategoryrelation> {
  15 +
  16 +}
shop/src/main/java/com/canrd/shop/module/dto/ProductDO.java
@@ -8,6 +8,7 @@ import lombok.experimental.SuperBuilder; @@ -8,6 +8,7 @@ import lombok.experimental.SuperBuilder;
8 import java.io.Serializable; 8 import java.io.Serializable;
9 import java.math.BigDecimal; 9 import java.math.BigDecimal;
10 import java.util.Date; 10 import java.util.Date;
  11 +import java.util.List;
11 12
12 /** 13 /**
13 * (Product)实体类 14 * (Product)实体类
@@ -137,5 +138,7 @@ public class ProductDO implements Serializable { @@ -137,5 +138,7 @@ public class ProductDO implements Serializable {
137 private Integer similar; 138 private Integer similar;
138 @TableField(exist = false) 139 @TableField(exist = false)
139 private Integer ttsTotalSimilar=0; 140 private Integer ttsTotalSimilar=0;
  141 + @TableField(exist = false)
  142 + private List<String> relatedProductIds;
140 143
141 } 144 }
shop/src/main/java/com/canrd/shop/module/dto/Productcategoryrelation.java 0 → 100644
  1 +package com.canrd.shop.module.dto;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.TableField;
  4 +import com.baomidou.mybatisplus.annotation.TableName;
  5 +import com.baomidou.mybatisplus.annotation.IdType;
  6 +import java.time.LocalDateTime;
  7 +import com.baomidou.mybatisplus.annotation.TableId;
  8 +import java.io.Serializable;
  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("productcategoryrelation")
  25 +public class Productcategoryrelation implements Serializable {
  26 +
  27 + private static final long serialVersionUID = 1L;
  28 +
  29 + @TableField(value = "productId")
  30 + private String productId;
  31 + @TableField(value = "categoryId")
  32 + private String categoryId;
  33 + @TableField(value = "modifyDate")
  34 + private LocalDateTime modifyDate;
  35 +
  36 +
  37 +}
shop/src/main/java/com/canrd/shop/service/IProductcategoryrelationService.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.Productcategoryrelation;
  5 +
  6 +/**
  7 + * <p>
  8 + * 服务类
  9 + * </p>
  10 + *
  11 + * @author author
  12 + * @since 2024-11-14
  13 + */
  14 +public interface IProductcategoryrelationService extends IService<Productcategoryrelation> {
  15 +
  16 +}
shop/src/main/java/com/canrd/shop/service/impl/ProductServiceImpl.java
@@ -17,11 +17,7 @@ import com.canrd.shop.common.utils.PageUtils; @@ -17,11 +17,7 @@ import com.canrd.shop.common.utils.PageUtils;
17 import com.canrd.shop.common.utils.StringUtils; 17 import com.canrd.shop.common.utils.StringUtils;
18 import com.canrd.shop.converter.ProductConverter; 18 import com.canrd.shop.converter.ProductConverter;
19 import com.canrd.shop.mapper.ProductMapper; 19 import com.canrd.shop.mapper.ProductMapper;
20 -import com.canrd.shop.module.dto.BrandDO;  
21 -import com.canrd.shop.module.dto.ProductAttributeDO;  
22 -import com.canrd.shop.module.dto.ProductAttributeMapStoreDO;  
23 -import com.canrd.shop.module.dto.ProductDO;  
24 -import com.canrd.shop.module.dto.TicketTypeDO; 20 +import com.canrd.shop.module.dto.*;
25 import com.canrd.shop.module.vo.ProductAttributeVO; 21 import com.canrd.shop.module.vo.ProductAttributeVO;
26 import com.canrd.shop.module.vo.ProductQueryVO; 22 import com.canrd.shop.module.vo.ProductQueryVO;
27 import com.canrd.shop.module.vo.ProductVO; 23 import com.canrd.shop.module.vo.ProductVO;
@@ -63,6 +59,8 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im @@ -63,6 +59,8 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
63 59
64 @Autowired 60 @Autowired
65 private ProductAttributeService productAttributeService; 61 private ProductAttributeService productAttributeService;
  62 + @Autowired
  63 + private IProductcategoryrelationService productCategoryRelationService;
66 64
67 @Autowired 65 @Autowired
68 private ProductAttributeMapStoreService productAttributeMapStoreService; 66 private ProductAttributeMapStoreService productAttributeMapStoreService;
@@ -76,6 +74,9 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im @@ -76,6 +74,9 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
76 @Autowired 74 @Autowired
77 private ISwitchControlService switchControlService; 75 private ISwitchControlService switchControlService;
78 76
  77 + @Autowired
  78 + private IEbCategorysRelationService ebCategorysRelationService;
  79 +
79 /** 80 /**
80 * 通过ID查询单条数据 81 * 通过ID查询单条数据
81 * <p> 82 * <p>
@@ -152,14 +153,16 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im @@ -152,14 +153,16 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
152 queryWapper.eq("pf.id",productQueryVO.getProductFunctionId()); 153 queryWapper.eq("pf.id",productQueryVO.getProductFunctionId());
153 } 154 }
154 if(StringUtils.isNotBlank(productQueryVO.getKeyword())){ 155 if(StringUtils.isNotBlank(productQueryVO.getKeyword())){
155 - List<TicketTypeDO> tickeyTypeDOList = ticketTypeService.lambdaQuery().like(TicketTypeDO::getRank, productQueryVO.getKeyword()).list(); 156 + List<TicketTypeDO> tickeyTypeDOList = ticketTypeService.lambdaQuery()
  157 + .like(TicketTypeDO::getRank, productQueryVO.getKeyword())
  158 + .list();
156 Set<String> productIds = tickeyTypeDOList.stream().map(TicketTypeDO::getProductId).collect(Collectors.toSet()); 159 Set<String> productIds = tickeyTypeDOList.stream().map(TicketTypeDO::getProductId).collect(Collectors.toSet());
157 queryWapper.and(subQueryWapper -> { 160 queryWapper.and(subQueryWapper -> {
158 subQueryWapper.like("p.name", productQueryVO.getKeyword()).or().in("p.id", productIds); 161 subQueryWapper.like("p.name", productQueryVO.getKeyword()).or().in("p.id", productIds);
159 }); 162 });
160 } 163 }
161 Page page = new Page<>(productQueryVO.getPageNo(), productQueryVO.getPageSize()); 164 Page page = new Page<>(productQueryVO.getPageNo(), productQueryVO.getPageSize());
162 - IPage<ProductDO> iPage = productMapper.selectAll(page,queryWapper); 165 + IPage<ProductDO> iPage = productMapper.queryAll(page,queryWapper);
163 suppleProducts(iPage.getRecords()); 166 suppleProducts(iPage.getRecords());
164 productQueryVO.setTotal(Long.valueOf(iPage.getTotal()).intValue()); 167 productQueryVO.setTotal(Long.valueOf(iPage.getTotal()).intValue());
165 return ServerResult.success().setData(PageUtils.getPageReturn(iPage.getRecords(), productQueryVO)); 168 return ServerResult.success().setData(PageUtils.getPageReturn(iPage.getRecords(), productQueryVO));
@@ -179,6 +182,24 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im @@ -179,6 +182,24 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
179 } 182 }
180 } 183 }
181 } 184 }
  185 +
  186 + List<Productcategoryrelation> productcategoryrelations = productCategoryRelationService.lambdaQuery()
  187 + .in(Productcategoryrelation::getProductId, productIds)
  188 + .list();
  189 + List<String> categoryIds = productcategoryrelations.stream().map(Productcategoryrelation::getCategoryId).collect(Collectors.toList());
  190 + Map<String,List<String>> productId2cateIds = productcategoryrelations.stream()
  191 + .collect(Collectors.groupingBy(Productcategoryrelation::getProductId,
  192 + Collectors.mapping(Productcategoryrelation::getCategoryId, Collectors.toList())));
  193 + List<EbCategorysRelation> cateRelations = ebCategorysRelationService.lambdaQuery()
  194 + .in(EbCategorysRelation::getCategoryId, categoryIds)
  195 + .list();
  196 + Map<String,List<EbCategorysRelation>> cateId2relCates = cateRelations.stream()
  197 + .collect(Collectors.groupingBy(EbCategorysRelation::getCategoryId,
  198 + Collectors.mapping(Function.identity(), Collectors.toList())));
  199 + Map<String,List<EbCategorysRelation>> prodId2relCateIds = productId2cateIds.entrySet().stream()
  200 + .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream()
  201 + .flatMap(cateId -> Optional.ofNullable(cateId2relCates.get(cateId)).orElse(Collections.emptyList()).stream())
  202 + .collect(Collectors.toList())));
182 records.forEach(product -> { 203 records.forEach(product -> {
183 if (productPriceShow){ 204 if (productPriceShow){
184 if (Objects.nonNull(pId2ttMinPriceMap.get(product.getId()))){ 205 if (Objects.nonNull(pId2ttMinPriceMap.get(product.getId()))){
@@ -189,6 +210,26 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im @@ -189,6 +210,26 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
189 List<Map> maps = JSON.parseArray(product.getProductimageliststore(), Map.class); 210 List<Map> maps = JSON.parseArray(product.getProductimageliststore(), Map.class);
190 Map map = maps.get(0); 211 Map map = maps.get(0);
191 product.setImageFileKey(map.get("fileKey").toString()); 212 product.setImageFileKey(map.get("fileKey").toString());
  213 +
  214 +
  215 + List<EbCategorysRelation> ebCategorysRelations = prodId2relCateIds.get(product.getId());
  216 + if (CollUtil.isNotEmpty(ebCategorysRelations)){
  217 + Map<String,Integer> relatedCateId2Relevance = ebCategorysRelations.stream()
  218 + .collect(Collectors.toMap(EbCategorysRelation::getRelatedCategoryId, EbCategorysRelation::getRelevance,(a, b) -> a));
  219 + TreeMap<String, Integer> cateId2Relevance = new TreeMap<>(relatedCateId2Relevance);
  220 + StringJoiner orderByJoiner = new StringJoiner(" when "," order by case pcid when "," else 0 end limit 10 ");
  221 + cateId2Relevance.forEach((k,v)->orderByJoiner.add("'"+k+"'"+" then "+v));
  222 + QueryWrapper<ProductDO> objectQueryWrapper = new QueryWrapper<ProductDO>()
  223 + .in("pc.id", cateId2Relevance.keySet())
  224 + .select("id")
  225 + .last(orderByJoiner.toString());
  226 + List<ProductDO> relatedProducts = this
  227 + .list(objectQueryWrapper);
  228 + List<String> relatedProductIds = relatedProducts.stream()
  229 + .map(ProductDO::getId)
  230 + .collect(Collectors.toList());
  231 + product.setRelatedProductIds(relatedProductIds);
  232 + }
192 }); 233 });
193 } 234 }
194 235
@@ -224,7 +265,7 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im @@ -224,7 +265,7 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
224 subQueryWapper.like("p.name", productQueryVO.getKeyword()).or().in(CollUtil.isNotEmpty(finalProductIds),"p.id", finalProductIds); 265 subQueryWapper.like("p.name", productQueryVO.getKeyword()).or().in(CollUtil.isNotEmpty(finalProductIds),"p.id", finalProductIds);
225 }); 266 });
226 } 267 }
227 - List<ProductDO> productDOS = this.baseMapper.selectList(queryWapper); 268 + List<ProductDO> productDOS = this.baseMapper.queryList(queryWapper);
228 List<ProductDO> accurateProducts = Lists.newArrayList(); 269 List<ProductDO> accurateProducts = Lists.newArrayList();
229 Set<String> accurateProductIdSet = Sets.newHashSet(); 270 Set<String> accurateProductIdSet = Sets.newHashSet();
230 //区分大小写 271 //区分大小写
@@ -382,7 +423,7 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im @@ -382,7 +423,7 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
382 queryWapper.like("p.name", productQueryVO.getKeyword()); 423 queryWapper.like("p.name", productQueryVO.getKeyword());
383 } 424 }
384 Page page = new Page<>(productQueryVO.getPageNo(), productQueryVO.getPageSize()); 425 Page page = new Page<>(productQueryVO.getPageNo(), productQueryVO.getPageSize());
385 - IPage<ProductDO> iPage = productMapper.selectAll(page,queryWapper); 426 + IPage<ProductDO> iPage = productMapper.queryAll(page,queryWapper);
386 productQueryVO.setTotal(Long.valueOf(iPage.getTotal()).intValue()); 427 productQueryVO.setTotal(Long.valueOf(iPage.getTotal()).intValue());
387 return ServerResult.success().setData(PageUtils.getPageReturn(iPage.getRecords(), productQueryVO)); 428 return ServerResult.success().setData(PageUtils.getPageReturn(iPage.getRecords(), productQueryVO));
388 } 429 }
shop/src/main/java/com/canrd/shop/service/impl/ProductcategoryrelationServiceImpl.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.ProductcategoryrelationMapper;
  6 +import com.canrd.shop.module.dto.Productcategoryrelation;
  7 +import com.canrd.shop.service.IProductcategoryrelationService;
  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 ProductcategoryrelationServiceImpl extends ServiceImpl<ProductcategoryrelationMapper, Productcategoryrelation> implements IProductcategoryrelationService {
  20 +
  21 +}
shop/src/main/resources/application-test.yml
1 mybatis-plus: 1 mybatis-plus:
2 configuration: 2 configuration:
  3 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3 cache-enabled: false 4 cache-enabled: false
4 call-setters-on-nulls: true 5 call-setters-on-nulls: true
5 jdbc-type-for-null: 'null' 6 jdbc-type-for-null: 'null'
6 map-underscore-to-camel-case: true 7 map-underscore-to-camel-case: true
7 - log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl  
8 global-config: 8 global-config:
9 db-config: 9 db-config:
10 capital-mode: false 10 capital-mode: false
shop/src/main/resources/log4j2-dev.xml
@@ -3,13 +3,12 @@ @@ -3,13 +3,12 @@
3 <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 --> 3 <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
4 <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 --> 4 <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
5 <configuration status="debug" monitorInterval="30"> 5 <configuration status="debug" monitorInterval="30">
6 - <!--<contextName>log4j2</contextName>-->  
7 <properties> 6 <properties>
8 <!--${sys:catalina.home}表示linux中环境变量中的tomcat根目录 用户主目录--> 7 <!--${sys:catalina.home}表示linux中环境变量中的tomcat根目录 用户主目录-->
9 <!--原来用logback时候在统一配置中心也配置一个logging.path=/opt/tomcat-log/${spring.application.name} LOG_PATH是内置变量--> 8 <!--原来用logback时候在统一配置中心也配置一个logging.path=/opt/tomcat-log/${spring.application.name} LOG_PATH是内置变量-->
10 <!--${sys:user.home} 用户主目录--> 9 <!--${sys:user.home} 用户主目录-->
11 - <!-- <Property name="log_path">${sys:user.home}/logs</Property>-->  
12 -<!-- <Property name="log_path" value="./logs/" />--> 10 + <!-- <Property name="log_path">${sys:user.home}/logs</Property>-->
  11 + <!-- <Property name="log_path" value="./logs/" />-->
13 <property name="console_log_pattern">%d|%t|%traceId|%-5level|%F:%L|%M|%m%n</property> 12 <property name="console_log_pattern">%d|%t|%traceId|%-5level|%F:%L|%M|%m%n</property>
14 <!-- 保留日志天数 D H M S 分别对应天 小时 分钟 秒 --> 13 <!-- 保留日志天数 D H M S 分别对应天 小时 分钟 秒 -->
15 <property name="KEEP_LOG_DAY">60D</property> 14 <property name="KEEP_LOG_DAY">60D</property>
@@ -20,34 +19,22 @@ @@ -20,34 +19,22 @@
20 <appenders> 19 <appenders>
21 <console name="Console" target="SYSTEM_OUT"> 20 <console name="Console" target="SYSTEM_OUT">
22 <!--输出日志的格式 --> 21 <!--输出日志的格式 -->
23 - <PatternLayout charset="UTF-8" pattern="${console_log_pattern}"/>  
24 - <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> 22 + <PatternLayout charset="UTF-8" pattern="${console_log_pattern}"/>
  23 + <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
25 </console> 24 </console>
26 - <!--这个输出控制台的配置 -->  
27 - <!--<console name="Console" target="SYSTEM_OUT" follow="false">-->  
28 - <!--&lt;!&ndash;输出日志的格式 &ndash;&gt;-->  
29 - <!--<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />-->  
30 - <!--</console>-->  
31 -  
32 <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 --> 25 <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
33 <RollingFile name="RollingFileInfo" fileName="${sys:logging.path}/logs/overtime.log" filePattern="${sys:logging.path}/logs/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log"> 26 <RollingFile name="RollingFileInfo" fileName="${sys:logging.path}/logs/overtime.log" filePattern="${sys:logging.path}/logs/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log">
34 <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> 27 <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
35 <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /> 28 <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
36 - <!--<Filters>-->  
37 - <!--<ThresholdFilter level="INFO"/>-->  
38 - <!--<ThresholdFilter level="WARN" onMatch="DENY"-->  
39 - <!--onMismatch="NEUTRAL"/>-->  
40 - <!--</Filters>-->  
41 - <PatternLayout charset="UTF-8" pattern="${console_log_pattern}"/> 29 + <PatternLayout charset="UTF-8" pattern="${console_log_pattern}"/>
42 <Policies> 30 <Policies>
43 <!-- 归档每天的文件 --> 31 <!-- 归档每天的文件 -->
44 - <!--<TimeBasedTriggeringPolicy interval="1" modulate="true"/>-->  
45 <TimeBasedTriggeringPolicy /> 32 <TimeBasedTriggeringPolicy />
46 <!-- 限制单个文件大小 --> 33 <!-- 限制单个文件大小 -->
47 <SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/> 34 <SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/>
48 </Policies> 35 </Policies>
49 <!-- 限制每天文件个数 --> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了100 --> 36 <!-- 限制每天文件个数 --> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了100 -->
50 - <DefaultRolloverStrategy max="256"> 37 + <DefaultRolloverStrategy max="256">
51 <Delete basePath="${sys:logging.path}/logs/" maxDepth="3"> 38 <Delete basePath="${sys:logging.path}/logs/" maxDepth="3">
52 <IfFileName glob="*/*info*.log"/> 39 <IfFileName glob="*/*info*.log"/>
53 <IfLastModified age="${KEEP_LOG_DAY}"/> 40 <IfLastModified age="${KEEP_LOG_DAY}"/>
@@ -58,19 +45,15 @@ @@ -58,19 +45,15 @@
58 <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 --> 45 <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
59 <loggers> 46 <loggers>
60 <!--过滤掉spring和mybatis的一些无用的DEBUG信息 --> 47 <!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
61 - <logger name="org.springframework" level="debug" >  
62 - <ThresholdFilter level="debug"/> 48 + <logger name="org.springframework" level="debug" additivity="false">
63 <appender-ref ref="RollingFileInfo" /> 49 <appender-ref ref="RollingFileInfo" />
64 </logger> 50 </logger>
65 - <logger name="org.mybatis" level="DEBUG" >  
66 - <ThresholdFilter level="debug"/> 51 + <logger name="org.mybatis" level="debug" additivity="false">
67 <appender-ref ref="RollingFileInfo" /> 52 <appender-ref ref="RollingFileInfo" />
68 </logger> 53 </logger>
69 - <logger name="com.canrd.shop" level="DEBUG" >  
70 - <ThresholdFilter level="debug"/> 54 + <logger name="com.canrd.shop" level="debug" additivity="false">
71 <appender-ref ref="RollingFileInfo" /> 55 <appender-ref ref="RollingFileInfo" />
72 </logger> 56 </logger>
73 - <!--<root level="all">-->  
74 <root level="debug"> 57 <root level="debug">
75 <appender-ref ref="Console" /> 58 <appender-ref ref="Console" />
76 </root> 59 </root>
shop/src/main/resources/mapper/ProductMapper.xml
@@ -6,8 +6,8 @@ @@ -6,8 +6,8 @@
6 <result column="name" property="name"/> 6 <result column="name" property="name"/>
7 </resultMap> 7 </resultMap>
8 8
9 - <select id="selectAll" resultMap="BaseResultMap">  
10 - select distinct p.id,p.name,p.productImageListStore,p.htmlFilePath 9 + <select id="queryAll" resultMap="BaseResultMap">
  10 + select distinct p.id,p.name,p.productImageListStore,p.htmlFilePath,pc.id as pcid
11 from product p 11 from product p
12 left join productcategoryrelation pcr on p.id=pcr.productId 12 left join productcategoryrelation pcr on p.id=pcr.productId
13 left join productcategory pc on pc.id=pcr.categoryId 13 left join productcategory pc on pc.id=pcr.categoryId
@@ -16,8 +16,8 @@ @@ -16,8 +16,8 @@
16 ${ew.customSqlSegment} 16 ${ew.customSqlSegment}
17 </select> 17 </select>
18 18
19 - <select id="selectList" resultMap="BaseResultMap">  
20 - select distinct p.id,p.name,p.productImageListStore,p.htmlFilePath 19 + <select id="queryList" resultMap="BaseResultMap">
  20 + select distinct p.id,p.name,p.productImageListStore,p.htmlFilePath,p.productCategory_id,pc.id as pcid
21 from product p 21 from product p
22 left join productcategoryrelation pcr on p.id=pcr.productId 22 left join productcategoryrelation pcr on p.id=pcr.productId
23 left join productcategory pc on pc.id=pcr.categoryId 23 left join productcategory pc on pc.id=pcr.categoryId
@@ -26,4 +26,20 @@ @@ -26,4 +26,20 @@
26 left join tickettype tt on p.id=tt.productId 26 left join tickettype tt on p.id=tt.productId
27 ${ew.customSqlSegment} 27 ${ew.customSqlSegment}
28 </select> 28 </select>
  29 +
  30 + <select id="selectAll" resultMap="BaseResultMap">
  31 + select distinct p.id,p.name,p.productImageListStore,p.htmlFilePath,pc.id as pcid
  32 + from product p
  33 + left join productcategoryrelation pcr on p.id=pcr.productId
  34 + left join productcategory pc on pc.id=pcr.categoryId
  35 + ${ew.customSqlSegment}
  36 + </select>
  37 +
  38 + <select id="selectList" resultMap="BaseResultMap">
  39 + select distinct p.id,p.name,p.productImageListStore,p.htmlFilePath,p.productCategory_id,pc.id as pcid
  40 + from product p
  41 + left join productcategoryrelation pcr on p.id=pcr.productId
  42 + left join productcategory pc on pc.id=pcr.categoryId
  43 + ${ew.customSqlSegment}
  44 + </select>
29 </mapper> 45 </mapper>
30 \ No newline at end of file 46 \ No newline at end of file
src/main/java/com/order/erp/domain/model/Productcategoryrelation.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 java.time.LocalDateTime;
  6 +import com.baomidou.mybatisplus.annotation.TableId;
  7 +import java.io.Serializable;
  8 +import io.swagger.annotations.ApiModel;
  9 +import io.swagger.annotations.ApiModelProperty;
  10 +import lombok.Data;
  11 +import lombok.EqualsAndHashCode;
  12 +import lombok.experimental.Accessors;
  13 +
  14 +/**
  15 + * <p>
  16 + *
  17 + * </p>
  18 + *
  19 + * @author author
  20 + * @since 2024-11-14
  21 + */
  22 +@Data
  23 +@EqualsAndHashCode(callSuper = false)
  24 +@Accessors(chain = true)
  25 +@TableName("productcategoryrelation")
  26 +@ApiModel(value="Productcategoryrelation对象", description="")
  27 +public class Productcategoryrelation implements Serializable {
  28 +
  29 + private static final long serialVersionUID = 1L;
  30 +
  31 + private String productId;
  32 +
  33 + private String categoryId;
  34 +
  35 + private LocalDateTime modifyDate;
  36 +
  37 +
  38 +}
src/main/java/com/order/erp/mapper/ProductcategoryrelationMapper.java 0 → 100644
  1 +package com.order.erp.mapper;
  2 +
  3 +import com.order.erp.domain.model.Productcategoryrelation;
  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 ProductcategoryrelationMapper extends BaseMapper<Productcategoryrelation> {
  15 +
  16 +}
src/main/java/com/order/erp/service/IProductcategoryrelationService.java 0 → 100644
  1 +package com.order.erp.service;
  2 +
  3 +import com.order.erp.domain.model.Productcategoryrelation;
  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 IProductcategoryrelationService extends IService<Productcategoryrelation> {
  15 +
  16 +}
src/main/java/com/order/erp/service/impl/ProductcategoryrelationServiceImpl.java 0 → 100644
  1 +package com.order.erp.service.impl;
  2 +
  3 +import com.order.erp.domain.model.Productcategoryrelation;
  4 +import com.order.erp.mapper.ProductcategoryrelationMapper;
  5 +import com.order.erp.service.IProductcategoryrelationService;
  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 ProductcategoryrelationServiceImpl extends ServiceImpl<ProductcategoryrelationMapper, Productcategoryrelation> implements IProductcategoryrelationService {
  19 +
  20 +}
src/main/resources/mapper/ProductcategoryrelationMapper.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.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>