diff --git a/dating-agency-mall-constant/pom.xml b/dating-agency-mall-constant/pom.xml
index 33ce483..7b2e8d7 100644
--- a/dating-agency-mall-constant/pom.xml
+++ b/dating-agency-mall-constant/pom.xml
@@ -17,4 +17,19 @@
UTF-8
+
+
+ org.projectlombok
+ lombok
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ compile
+
+
+ com.qniao
+ mybatis-plus-starter
+
+
\ No newline at end of file
diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductMainCategoryEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductMainCategoryEnum.java
new file mode 100644
index 0000000..6f74014
--- /dev/null
+++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductMainCategoryEnum.java
@@ -0,0 +1,40 @@
+package com.qniao.dam.domian.aggregate.product.constant;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum ProductMainCategoryEnum {
+ /**
+ * 认证、资料编辑、解锁信息、线下服务
+ */
+
+ AUTHENTICATION(1, "认证"),
+ DATE_EDITING(2, "资料编辑"),
+ UNLOCKING_INFORMATION(3, "解锁信息"),
+ OFFLINE_SERVICES(4, "线下服务");
+
+ @EnumValue
+ @JsonValue
+ private final Integer value;
+ private final String desc;
+
+ ProductMainCategoryEnum(Integer value, String desc) {
+ this.value = value;
+ this.desc = desc;
+ }
+
+ @JsonCreator
+ public static ProductMainCategoryEnum get(Object code) {
+ for (ProductMainCategoryEnum e : ProductMainCategoryEnum.values()) {
+ if (e.getValue().equals(code)) {
+ return e;
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductStatusEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductStatusEnum.java
new file mode 100644
index 0000000..0ca4c27
--- /dev/null
+++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductStatusEnum.java
@@ -0,0 +1,35 @@
+package com.qniao.dam.domian.aggregate.product.constant;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum ProductStatusEnum {
+
+ PHYSICAL(1, "实物"),
+ VIRTUAL(2, "虚拟物品");
+
+ @EnumValue
+ @JsonValue
+ private final Integer value;
+ private final String desc;
+
+ ProductStatusEnum(Integer value, String desc) {
+ this.value = value;
+ this.desc = desc;
+ }
+
+ @JsonCreator
+ public static ProductStatusEnum get(Object code) {
+ for (ProductStatusEnum e : ProductStatusEnum.values()) {
+ if (e.getValue().equals(code)) {
+ return e;
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductSubCategoryEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductSubCategoryEnum.java
new file mode 100644
index 0000000..6b0bef3
--- /dev/null
+++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductSubCategoryEnum.java
@@ -0,0 +1,44 @@
+package com.qniao.dam.domian.aggregate.product.constant;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum ProductSubCategoryEnum {
+ /**
+ * 学历认证、解锁更多人数、头像修改、高级搜索、线下约见面
+ */
+ EDUCATION_CERTIFICATION(101, "学历认证"),
+
+ PROFILE_MODIFICATION(201, "头像修改"),
+
+ UNLOCK_MORE_PEOPLE(301, "解锁更多人数"),
+
+ ADVANCED_SEARCH(302, "高级搜索"),
+
+ OFFLINE_MEET(401, "线下约见面");
+
+ @EnumValue
+ @JsonValue
+ private final Integer value;
+ private final String desc;
+
+ ProductSubCategoryEnum(Integer value, String desc) {
+ this.value = value;
+ this.desc = desc;
+ }
+
+ @JsonCreator
+ public static ProductSubCategoryEnum get(Object code) {
+ for (ProductSubCategoryEnum e : ProductSubCategoryEnum.values()) {
+ if (e.getValue().equals(code)) {
+ return e;
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductTypeEnum.java
new file mode 100644
index 0000000..3c0a57e
--- /dev/null
+++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/product/constant/ProductTypeEnum.java
@@ -0,0 +1,35 @@
+package com.qniao.dam.domian.aggregate.product.constant;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum ProductTypeEnum {
+
+ PHYSICAL(1, "实物"),
+ VIRTUAL(2, "虚拟物品");
+
+ @EnumValue
+ @JsonValue
+ private final Integer value;
+ private final String desc;
+
+ ProductTypeEnum(Integer value, String desc) {
+ this.value = value;
+ this.desc = desc;
+ }
+
+ @JsonCreator
+ public static ProductTypeEnum get(Object code) {
+ for (ProductTypeEnum e : ProductTypeEnum.values()) {
+ if (e.getValue().equals(code)) {
+ return e;
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/productspec/constant/ProductSpecTermNameEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/productspec/constant/ProductSpecTermNameEnum.java
new file mode 100644
index 0000000..eda8097
--- /dev/null
+++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/productspec/constant/ProductSpecTermNameEnum.java
@@ -0,0 +1,40 @@
+package com.qniao.dam.domian.aggregate.productspec.constant;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum ProductSpecTermNameEnum {
+
+ SPEC(1, "规格"),
+
+ PURCHASE_TIME(2,"购买次数"),
+
+ VALIDITY_PERIOD(3,"有效期"),
+
+ DAILY_USE_LIMIT(4,"单日使用上限");
+
+ @EnumValue
+ @JsonValue
+ private final Integer value;
+ private final String desc;
+
+ ProductSpecTermNameEnum(Integer value, String desc) {
+ this.value = value;
+ this.desc = desc;
+ }
+
+ @JsonCreator
+ public static ProductSpecTermNameEnum get(Object code) {
+ for (ProductSpecTermNameEnum e : ProductSpecTermNameEnum.values()) {
+ if (e.getValue().equals(code)) {
+ return e;
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/productspec/constant/ProductSpecTermUnitEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/productspec/constant/ProductSpecTermUnitEnum.java
new file mode 100644
index 0000000..4335e40
--- /dev/null
+++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/productspec/constant/ProductSpecTermUnitEnum.java
@@ -0,0 +1,45 @@
+package com.qniao.dam.domian.aggregate.productspec.constant;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum ProductSpecTermUnitEnum {
+
+ /**
+ * 1 规格
+ */
+ SPEC_PERIOD(101, "周期"),
+ SPEC_TIME(102, "次数"),
+
+ /**
+ * 3 有效期
+ */
+ VALIDITY_PERIOD_DAYS(301, "有效期天数");
+
+
+
+ @EnumValue
+ @JsonValue
+ private final Integer value;
+ private final String desc;
+
+ ProductSpecTermUnitEnum(Integer value, String desc) {
+ this.value = value;
+ this.desc = desc;
+ }
+
+ @JsonCreator
+ public static ProductSpecTermUnitEnum get(Object code) {
+ for (ProductSpecTermUnitEnum e : ProductSpecTermUnitEnum.values()) {
+ if (e.getValue().equals(code)) {
+ return e;
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/dating-agency-mall-entity/pom.xml b/dating-agency-mall-entity/pom.xml
index 2928c88..3bc4cec 100644
--- a/dating-agency-mall-entity/pom.xml
+++ b/dating-agency-mall-entity/pom.xml
@@ -17,4 +17,15 @@
UTF-8
+
+
+ io.swagger
+ swagger-annotations
+
+
+ com.qniao
+ dating-agency-mall-constant
+ 0.0.1-SNAPSHOT
+
+
\ No newline at end of file
diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/product/entity/Product.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/product/entity/Product.java
new file mode 100644
index 0000000..7bd4635
--- /dev/null
+++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/product/entity/Product.java
@@ -0,0 +1,38 @@
+package com.qniao.dam.domain.aggregate.product.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.qniao.dam.domian.aggregate.product.constant.ProductMainCategoryEnum;
+import com.qniao.dam.domian.aggregate.product.constant.ProductStatusEnum;
+import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum;
+import com.qniao.dam.domian.aggregate.product.constant.ProductTypeEnum;
+import com.qniao.domain.Entity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("da_product")
+public class Product extends Entity {
+
+ @ApiModelProperty("产品类型(实物、虚拟物品)")
+ private ProductTypeEnum productType;
+
+ @ApiModelProperty("产品主分类")
+ private ProductMainCategoryEnum mainCategory;
+
+ @ApiModelProperty("产品次分类")
+ private ProductSubCategoryEnum subCategory;
+
+ @ApiModelProperty("产品标题")
+ private String productTitle;
+
+ @ApiModelProperty("产品描述")
+ private String productDesc;
+
+ @ApiModelProperty("详情描述")
+ private String detailDesc;
+
+ @ApiModelProperty("状态(已上架、已下架)")
+ private ProductStatusEnum status;
+}
diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/productspec/entity/ProductSpec.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/productspec/entity/ProductSpec.java
new file mode 100644
index 0000000..039498e
--- /dev/null
+++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/productspec/entity/ProductSpec.java
@@ -0,0 +1,34 @@
+package com.qniao.dam.domain.aggregate.productspec.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.qniao.domain.Entity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("da_product_spec")
+public class ProductSpec extends Entity {
+
+ @ApiModelProperty("产品标识")
+ private Long productId;
+
+ @ApiModelProperty("原价")
+ private BigDecimal unitOriginalPrice;
+
+ @ApiModelProperty("售价")
+ private BigDecimal unitSellingPrice;
+
+ @ApiModelProperty("可用库存数量")
+ private Integer availableStockNumber;
+
+ private transient List productSpecTermList;
+
+ private transient List insertProductSpecTermList;
+ private transient List updateProductSpecTermList;
+ private transient List deleteProductSpecTermList;
+}
diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/productspec/entity/ProductSpecTerm.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/productspec/entity/ProductSpecTerm.java
new file mode 100644
index 0000000..702cbc8
--- /dev/null
+++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/productspec/entity/ProductSpecTerm.java
@@ -0,0 +1,30 @@
+package com.qniao.dam.domain.aggregate.productspec.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermNameEnum;
+import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermUnitEnum;
+import com.qniao.domain.Entity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("da_product_spec_term")
+public class ProductSpecTerm extends Entity {
+
+ @ApiModelProperty("产品规格标识")
+ private Long productSpecId;
+
+ @ApiModelProperty("展示名称")
+ private String displayName;
+
+ @ApiModelProperty("名称")
+ private ProductSpecTermNameEnum name;
+
+ @ApiModelProperty("单位")
+ private ProductSpecTermUnitEnum unit;
+
+ @ApiModelProperty("值")
+ private String value;
+}
diff --git a/dating-agency-mall-server/pom.xml b/dating-agency-mall-server/pom.xml
index 60b7207..5a0b602 100644
--- a/dating-agency-mall-server/pom.xml
+++ b/dating-agency-mall-server/pom.xml
@@ -56,6 +56,11 @@
com.qniao
redis-starter
+
+ com.qniao
+ dating-agency-mall-entity
+ 0.0.1-SNAPSHOT
+
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/product/ProductAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/product/ProductAggregate.java
new file mode 100644
index 0000000..d6776c1
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/product/ProductAggregate.java
@@ -0,0 +1,7 @@
+package com.qniao.dam.domain.aggregate.product;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class ProductAggregate {
+}
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/product/repository/ProductRepository.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/product/repository/ProductRepository.java
new file mode 100644
index 0000000..5e4b698
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/product/repository/ProductRepository.java
@@ -0,0 +1,7 @@
+package com.qniao.dam.domain.aggregate.product.repository;
+
+import com.qniao.dam.domain.aggregate.product.entity.Product;
+import com.qniao.domain.Repository;
+
+public interface ProductRepository extends Repository {
+}
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/productspec/ProductSpecAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/productspec/ProductSpecAggregate.java
new file mode 100644
index 0000000..b5c2885
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/productspec/ProductSpecAggregate.java
@@ -0,0 +1,7 @@
+package com.qniao.dam.domain.aggregate.productspec;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class ProductSpecAggregate {
+}
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/productspec/repository/ProductSpecRepository.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/productspec/repository/ProductSpecRepository.java
new file mode 100644
index 0000000..d17d438
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/productspec/repository/ProductSpecRepository.java
@@ -0,0 +1,7 @@
+package com.qniao.dam.domain.aggregate.productspec.repository;
+
+import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec;
+import com.qniao.domain.Repository;
+
+public interface ProductSpecRepository extends Repository {
+}
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ProductDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ProductDao.java
new file mode 100644
index 0000000..abb8036
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ProductDao.java
@@ -0,0 +1,7 @@
+package com.qniao.dam.infrastructure.persistent.dao.domain;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qniao.dam.domain.aggregate.product.entity.Product;
+
+public interface ProductDao extends BaseMapper {
+}
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ProductSpecDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ProductSpecDao.java
new file mode 100644
index 0000000..d0c3def
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ProductSpecDao.java
@@ -0,0 +1,7 @@
+package com.qniao.dam.infrastructure.persistent.dao.domain;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec;
+
+public interface ProductSpecDao extends BaseMapper {
+}
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ProductSpecTermDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ProductSpecTermDao.java
new file mode 100644
index 0000000..d78b1f9
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ProductSpecTermDao.java
@@ -0,0 +1,7 @@
+package com.qniao.dam.infrastructure.persistent.dao.domain;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpecTerm;
+
+public interface ProductSpecTermDao extends BaseMapper {
+}
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ProductRepositoryImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ProductRepositoryImpl.java
new file mode 100644
index 0000000..c9c1577
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ProductRepositoryImpl.java
@@ -0,0 +1,31 @@
+package com.qniao.dam.infrastructure.persistent.repository.impl;
+
+import com.qniao.dam.domain.aggregate.product.entity.Product;
+import com.qniao.dam.domain.aggregate.product.repository.ProductRepository;
+import com.qniao.dam.infrastructure.persistent.dao.domain.ProductDao;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Objects;
+
+@Service
+public class ProductRepositoryImpl implements ProductRepository {
+
+ @Resource
+ private ProductDao productDao;
+
+ @Override
+ public Product load(Long id) {
+ return productDao.selectById(id);
+ }
+
+ @Override
+ public Long save(Product entity) {
+ if (Objects.isNull(entity) || Objects.isNull(productDao.selectById(entity.getId()))) {
+ productDao.insert(entity);
+ } else {
+ productDao.updateById(entity);
+ }
+ return entity.getId();
+ }
+}
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ProductSpecRepositoryImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ProductSpecRepositoryImpl.java
new file mode 100644
index 0000000..d42c529
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/ProductSpecRepositoryImpl.java
@@ -0,0 +1,60 @@
+package com.qniao.dam.infrastructure.persistent.repository.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec;
+import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpecTerm;
+import com.qniao.dam.domain.aggregate.productspec.repository.ProductSpecRepository;
+import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecDao;
+import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecTermDao;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+public class ProductSpecRepositoryImpl implements ProductSpecRepository {
+
+ @Resource
+ private ProductSpecDao productSpecDao;
+ @Resource
+ private ProductSpecTermDao productSpecTermDao;
+
+ @Override
+ public ProductSpec load(Long id) {
+ ProductSpec productSpec = productSpecDao.selectById(id);
+ if (Objects.nonNull(productSpec)) {
+ productSpec.setProductSpecTermList(productSpecTermDao.selectList(new LambdaQueryWrapper()
+ .eq(ProductSpecTerm::getProductSpecId, productSpec.getId())));
+ }
+ return productSpec;
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public Long save(ProductSpec entity) {
+ if (Objects.isNull(entity) || Objects.isNull(productSpecDao.selectById(entity.getId()))) {
+ productSpecDao.insert(entity);
+ } else {
+ productSpecDao.updateById(entity);
+ }
+ if (CollUtil.isNotEmpty(entity.getInsertProductSpecTermList())) {
+ entity.getInsertProductSpecTermList().forEach(term -> {
+ term.setProductSpecId(entity.getId());
+ productSpecTermDao.insert(term);
+ });
+ }
+ if (CollUtil.isNotEmpty(entity.getUpdateProductSpecTermList())) {
+ entity.getUpdateProductSpecTermList().forEach(term -> {
+ term.setProductSpecId(entity.getId());
+ productSpecTermDao.updateById(term);
+ });
+ }
+ if (CollUtil.isNotEmpty(entity.getDeleteProductSpecTermList())) {
+ productSpecTermDao.deleteBatchIds(entity.getDeleteProductSpecTermList().stream().map(ProductSpecTerm::getId).collect(Collectors.toList()));
+ }
+ return entity.getId();
+ }
+}
diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/CompareEntityUtil.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/CompareEntityUtil.java
new file mode 100644
index 0000000..975f690
--- /dev/null
+++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/CompareEntityUtil.java
@@ -0,0 +1,40 @@
+package com.qniao.dam.infrastructure.utils;
+
+import cn.hutool.core.lang.Tuple;
+import com.qniao.domain.Entity;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author Derran
+ * @date 2023/7/19 15:57
+ **/
+public class CompareEntityUtil {
+
+ public static > Tuple compareEntityList(List newList, List oldList) {
+ List insertList = new ArrayList<>();
+ List updateList = new ArrayList<>();
+ List deleteList;
+ for (T newT : newList) {
+ if (Objects.isNull(newT.getId())) {
+ insertList.add(newT);
+ } else {
+ T updateT = null;
+ for (T oldT : oldList) {
+ if (oldT.getId().equals(newT.getId())) {
+ updateT = oldT;
+ updateList.add(newT);
+ }
+ }
+ if (Objects.nonNull(updateT)) {
+ oldList.remove(updateT);
+ }
+ }
+ }
+ deleteList = oldList;
+ return new Tuple(insertList, updateList, deleteList);
+ }
+
+}