加入销量字段,解决数据库自动填充字段问题

This commit is contained in:
litianxiang
2026-04-28 13:16:45 +08:00
parent e433921abe
commit f0f772ae89
20 changed files with 90 additions and 118 deletions

10
pom.xml
View File

@@ -24,7 +24,7 @@
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<mybatis-plus.version>3.5.5</mybatis-plus.version>
<mybatis-plus.version>3.5.7</mybatis-plus.version>
<minio.version>8.5.7</minio.version>
<jwt.version>0.12.3</jwt.version>
<hutool.version>5.8.26</hutool.version>
@@ -86,7 +86,7 @@
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
<version>8.2.0</version>
</dependency>
<!-- MinIO -->
@@ -149,12 +149,6 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- ==================== 微服务 ==================== -->
<dependency>

View File

@@ -5,11 +5,13 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@MapperScan("com.aida.seller.module.*.mapper")
@EnableFeignClients
@EnableDiscoveryClient
@ComponentScan(basePackages = "com.aida.seller")
public class AidaSellerApplication {
public static void main(String[] args) {

View File

@@ -1,38 +0,0 @@
package com.aida.seller.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public MetaObjectHandler metaObjectHandler() {
return new MetaObjectHandler() {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime::now);
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime::now);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime::now);
}
};
}
}

View File

@@ -0,0 +1,23 @@
package com.aida.seller.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}

View File

@@ -1,7 +1,10 @@
package com.aida.seller.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
@@ -14,16 +17,28 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.aida.seller.module.*.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Autowired
private MybatisPlusInterceptor mybatisPlusInterceptor;
@Autowired
private MetaObjectHandler myMetaObjectHandler;
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
@@ -42,6 +57,7 @@ public class PrimaryDataSourceConfig {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setBanner(false);
globalConfig.setMetaObjectHandler(myMetaObjectHandler);
bean.setGlobalConfig(globalConfig);
bean.setPlugins(mybatisPlusInterceptor);

View File

@@ -1,5 +1,7 @@
package com.aida.seller.module.designer.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

View File

@@ -1,6 +1,8 @@
package com.aida.seller.module.designer.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -16,6 +18,7 @@ public class DesignerEntity implements Serializable {
/** 设计师ID */
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 用户ID(关联用户表) */

View File

@@ -1,5 +1,7 @@
package com.aida.seller.module.designer.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
@@ -14,8 +16,6 @@ public class DesignerApplyDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "设计师ID")
private Long id;
@Schema(description = "店铺名称")
private String shopName;

View File

@@ -68,15 +68,6 @@ public class ListingController {
return Response.success();
}
@Operation(summary = "批量设置库存", description = "入参为商品ID和库存值列表")
@PutMapping("/stock/batch")
public Response<Void> batchUpdateStock(
@Parameter(description = "库存更新列表") @RequestBody List<ListingStockDTO> list) {
Long sellerId = UserContext.getUserId();
listingService.batchUpdateStock(list, sellerId);
return Response.success();
}
@Operation(summary = "设置弹窗提醒标志", description = "在Redis中设置7天过期的弹窗提醒标志")
@PostMapping("/popup/set")
public Response<Void> setPopupReminder() {

View File

@@ -1,5 +1,7 @@
package com.aida.seller.module.listing.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -15,6 +17,7 @@ public class ListingImageDTO implements Serializable {
/** 图片ID有值则更新无则新增 */
@Schema(description = "图片ID有值则更新无则新增")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 图片类别: cover/main_product/product/sketch/apparel */

View File

@@ -1,5 +1,7 @@
package com.aida.seller.module.listing.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -17,6 +19,7 @@ public class ListingSaveDTO implements Serializable {
/** 商品ID无则新建有则更新 */
@Schema(description = "商品ID无则新建有则更新")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 商品标题 */
@@ -31,9 +34,6 @@ public class ListingSaveDTO implements Serializable {
@Schema(description = "价格")
private BigDecimal price;
/** 库存 */
@Schema(description = "库存")
private Integer stock;
/** 浏览量(更新时传入) */
@Schema(description = "浏览量(更新时传入)")

View File

@@ -1,23 +0,0 @@
package com.aida.seller.module.listing.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* 批量库存更新 DTO
*/
@Data
public class ListingStockDTO implements Serializable {
private static final long serialVersionUID = 1L;
/** 商品ID */
@Schema(description = "商品ID")
private Long id;
/** 库存值 */
@Schema(description = "库存值")
private Integer stock;
}

View File

@@ -3,6 +3,9 @@ package com.aida.seller.module.listing.entity;
import com.aida.seller.module.listing.enums.ProductCategoryEnum;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
@@ -21,6 +24,7 @@ public class ListingEntity implements Serializable {
/** 商品ID */
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 卖家ID */
@@ -35,8 +39,8 @@ public class ListingEntity implements Serializable {
/** 价格 */
private BigDecimal price;
/** 库存数量 */
private Integer stock;
/** 量 */
private Integer salesVolume;
/** 封面图URL列表页展示用 */
private String cover;
@@ -48,11 +52,13 @@ public class ListingEntity implements Serializable {
private Integer status;
/** 创建时间 */
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime createTime;
/** 更新时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/** 是否删除0-否1-是 */

View File

@@ -1,6 +1,9 @@
package com.aida.seller.module.listing.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
@@ -17,9 +20,11 @@ public class ListingImageEntity implements Serializable {
/** 图片ID */
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 商品ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long listingId;
/** 图片类别: cover/main_product/product/sketch/apparel */
@@ -35,6 +40,7 @@ public class ListingImageEntity implements Serializable {
private Integer isSelected;
/** 创建时间 */
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime createTime;
}

View File

@@ -58,14 +58,6 @@ public interface ListingService extends IService<ListingEntity> {
*/
void updateStatus(Long id, Integer status, Long sellerId);
/**
* 批量更新库存
*
* @param list 库存列表
* @param sellerId 卖家ID
*/
void batchUpdateStock(java.util.List<ListingStockDTO> list, Long sellerId);
/**
* 设置弹窗提醒标志7天过期
*

View File

@@ -187,26 +187,6 @@ public class ListingServiceImpl extends ServiceImpl<ListingMapper, ListingEntity
this.updateById(update);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void batchUpdateStock(List<ListingStockDTO> list, Long sellerId) {
if (CollectionUtils.isEmpty(list)) {
return;
}
List<Long> ids = list.stream().map(ListingStockDTO::getId).collect(Collectors.toList());
List<ListingEntity> existing = this.list(
new LambdaQueryWrapper<ListingEntity>()
.eq(ListingEntity::getSellerId, sellerId)
.in(ListingEntity::getId, ids));
if (existing.size() != ids.size()) {
throw new BusinessException("部分商品不存在或无权操作");
}
Map<Long, Integer> stockMap = list.stream()
.collect(Collectors.toMap(ListingStockDTO::getId, ListingStockDTO::getStock));
existing.forEach(e -> e.setStock(stockMap.get(e.getId())));
this.updateBatchById(existing);
}
private void handleImages(Long listingId, List<ListingImageDTO> images) {
Map<String, List<ListingImageDTO>> byCategory = images.stream()
.collect(Collectors.groupingBy(img -> img.getCategory() == null ? "" : img.getCategory()));

View File

@@ -1,5 +1,7 @@
package com.aida.seller.module.listing.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
@@ -15,6 +17,7 @@ public class ListingPageVO implements Serializable {
private static final long serialVersionUID = 1L;
/** 商品ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 封面图URL列表页直返无须关联图片表 */
@@ -26,8 +29,8 @@ public class ListingPageVO implements Serializable {
/** 价格 */
private BigDecimal price;
/** 库存 */
private Integer stock;
/** 销量 */
private Integer salesVolume;
/** 浏览量 */
private Integer viewCount;

View File

@@ -1,6 +1,8 @@
package com.aida.seller.module.order.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
@@ -17,6 +19,7 @@ public class OrderInfoEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 卖家ID */

View File

@@ -1,6 +1,8 @@
package com.aida.seller.module.order.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
@@ -18,12 +20,15 @@ public class OrderItemEntity implements Serializable {
/** 主键ID */
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 订单ID关联 seller_orders */
@JsonSerialize(using = ToStringSerializer.class)
private Long orderId;
/** 商品ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long productId;
/** 商品名称 */

View File

@@ -1,5 +1,7 @@
package com.aida.seller.module.order.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -15,6 +17,7 @@ public class OrderVO implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "订单唯一标识")
@JsonSerialize(using = ToStringSerializer.class)
private Long orderId;
@Schema(description = "商品明细列表")
@@ -36,6 +39,7 @@ public class OrderVO implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "商品ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long productId;
@Schema(description = "商品名")