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 index 0ca4c27..cd632d3 100644 --- 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 @@ -10,8 +10,15 @@ import lombok.Getter; @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum ProductStatusEnum { - PHYSICAL(1, "实物"), - VIRTUAL(2, "虚拟物品"); + /** + * 1-已上架 + */ + SHELVED(1, "已上架"), + + /** + * 2-已下架 + */ + SOLD_OUTED(2, "已下架"); @EnumValue @JsonValue 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 index 039498e..d48984e 100644 --- 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 @@ -1,6 +1,7 @@ package com.qniao.dam.domain.aggregate.productspec.entity; import com.baomidou.mybatisplus.annotation.TableName; +import com.qniao.dam.domain.aggregate.productspec.valueobj.ProductSpecTerm; import com.qniao.domain.Entity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -27,8 +28,4 @@ public class ProductSpec extends Entity { 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/valueobj/ProductSpecTerm.java similarity index 57% rename from dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/productspec/entity/ProductSpecTerm.java rename to dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/productspec/valueobj/ProductSpecTerm.java index 702cbc8..4ae105b 100644 --- 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/valueobj/ProductSpecTerm.java @@ -1,9 +1,9 @@ -package com.qniao.dam.domain.aggregate.productspec.entity; +package com.qniao.dam.domain.aggregate.productspec.valueobj; 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 com.qniao.domain.ValueObject; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName("da_product_spec_term") -public class ProductSpecTerm extends Entity { +public class ProductSpecTerm extends ValueObject { @ApiModelProperty("产品规格标识") private Long productSpecId; @@ -27,4 +27,13 @@ public class ProductSpecTerm extends Entity { @ApiModelProperty("值") private String value; + + public static ProductSpecTerm build(ProductSpecTermNameEnum name, ProductSpecTermUnitEnum unit, String value) { + ProductSpecTerm productSpecTerm = new ProductSpecTerm(); + productSpecTerm.setName(name); + productSpecTerm.setDisplayName(name.getDesc()); + productSpecTerm.setUnit(unit); + productSpecTerm.setValue(value); + return productSpecTerm; + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/ProductUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/ProductUserCommandController.java new file mode 100644 index 0000000..e0bd6fe --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/ProductUserCommandController.java @@ -0,0 +1,46 @@ +package com.qniao.dam.api.command.product.user; + +import com.qniao.dam.api.command.product.user.request.UserCreateProductDto; +import com.qniao.dam.api.command.product.user.request.UserEditProductDto; +import com.qniao.dam.api.command.product.user.request.UserOperateProductDto; +import com.qniao.dam.application.service.product.ProductApplicationService; +import com.qniao.dau.infrastructure.constant.RequestHeaderFields; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +@RestController +@RequestMapping("user") +@Api(tags = "商品") +public class ProductUserCommandController { + + @Resource + private ProductApplicationService productApplicationService; + + @ApiOperation("用户创建商品") + @PostMapping("create/product") + public String userCreateProduct(@RequestBody @Valid UserCreateProductDto dto, + @RequestParam("userId") Long userId, + @RequestHeader(name = RequestHeaderFields.FIELD_ORGANIZATION_ID) Long orgId) { + return productApplicationService.create(dto.trans2Domain(), dto.trans2ProductSpec()).toString(); + } + + @ApiOperation("用户编辑商品") + @PostMapping("edit/product") + public void userCreateProduct(@RequestBody @Valid UserEditProductDto dto, + @RequestParam("userId") Long userId, + @RequestHeader(name = RequestHeaderFields.FIELD_ORGANIZATION_ID) Long orgId) { + productApplicationService.edit(dto.trans2Domain(), dto.trans2ProductSpec()); + } + + @ApiOperation("用户操作商品") + @PostMapping("operate/product") + public void userOperateProduct(@RequestBody @Valid UserOperateProductDto dto, + @RequestParam("userId") Long userId, + @RequestHeader(name = RequestHeaderFields.FIELD_ORGANIZATION_ID) Long orgId) { + productApplicationService.operate(dto.trans2Domain()); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/request/UserCreateProductDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/request/UserCreateProductDto.java new file mode 100644 index 0000000..f692567 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/request/UserCreateProductDto.java @@ -0,0 +1,110 @@ +package com.qniao.dam.api.command.product.user.request; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.qniao.dam.domain.aggregate.product.entity.Product; +import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; +import com.qniao.dam.domain.aggregate.productspec.valueobj.ProductSpecTerm; +import com.qniao.dam.domian.aggregate.product.constant.ProductMainCategoryEnum; +import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; +import com.qniao.dam.domian.aggregate.product.constant.ProductTypeEnum; +import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermNameEnum; +import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermUnitEnum; +import com.qniao.domain.Trans2DomainAssembler; +import com.qniao.framework.exception.BizException; +import com.qniao.framework.utils.TypeConvertUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Data +public class UserCreateProductDto implements Trans2DomainAssembler { + + @ApiModelProperty("产品主分类") + @NotNull(message = "产品主分类不能为空") + private ProductMainCategoryEnum mainCategory; + + @ApiModelProperty("产品次分类") + @NotNull(message = "产品次分类不能为空") + private ProductSubCategoryEnum subCategory; + + @ApiModelProperty("产品标题") + @NotNull(message = "产品标题不能为空") + private String productTitle; + + @ApiModelProperty("产品描述") + @NotNull(message = "产品描述不能为空") + private String productDesc; + + @ApiModelProperty("详情描述") + @NotNull(message = "详情描述不能为空") + private String detailDesc; + + @ApiModelProperty("原价") + @NotNull(message = "原价不能为空") + private BigDecimal unitOriginalPrice; + + @ApiModelProperty("售价") + @NotNull(message = "售价不能为空") + private BigDecimal unitSellingPrice; + + @ApiModelProperty("产品规格(周期、次数)") + @NotNull(message = "产品规格不能为空") + private ProductSpecTermUnitEnum productSpecUnit; + + @ApiModelProperty("有效期天数") + private String validityPeriodValue; + + @ApiModelProperty("购买次数") + private String purchaseTimeValue; + + @ApiModelProperty("单日使用上限") + private String dailyUseLimitValue; + + @Override + public Product trans2Domain() { + Product product = TypeConvertUtils.convert(this, Product.class); + product.setProductType(ProductTypeEnum.VIRTUAL); + return product; + } + + public ProductSpec trans2ProductSpec() { + ProductSpec productSpec = new ProductSpec(); + productSpec.setUnitOriginalPrice(unitOriginalPrice); + productSpec.setUnitSellingPrice(unitSellingPrice); + productSpec.setAvailableStockNumber(-1); + List productSpecTermList = new ArrayList<>(); + if (Objects.nonNull(productSpecUnit)) { + productSpecTermList.add(ProductSpecTerm.build(ProductSpecTermNameEnum.SPEC, productSpecUnit, null)); + } + if (StrUtil.isNotBlank(validityPeriodValue)) { + if (!NumberUtil.isNumber(validityPeriodValue)) { + throw new BizException("有效期天数必须是整数"); + } + productSpecTermList.add(ProductSpecTerm.build(ProductSpecTermNameEnum.VALIDITY_PERIOD, ProductSpecTermUnitEnum.VALIDITY_PERIOD_DAYS, validityPeriodValue)); + } + if (StrUtil.isNotBlank(purchaseTimeValue)) { + if (!NumberUtil.isNumber(purchaseTimeValue)) { + throw new BizException("购买次数必须是整数"); + } + } else { + purchaseTimeValue = "-1"; + } + productSpecTermList.add(ProductSpecTerm.build(ProductSpecTermNameEnum.PURCHASE_TIME, null, purchaseTimeValue)); + if (StrUtil.isNotBlank(dailyUseLimitValue)) { + if (!NumberUtil.isNumber(dailyUseLimitValue)) { + throw new BizException("单日使用上限必须是整数"); + } + } else { + dailyUseLimitValue = "-1"; + } + productSpecTermList.add(ProductSpecTerm.build(ProductSpecTermNameEnum.DAILY_USE_LIMIT, null, dailyUseLimitValue)); + productSpec.setProductSpecTermList(productSpecTermList); + return productSpec; + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/request/UserEditProductDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/request/UserEditProductDto.java new file mode 100644 index 0000000..2e7f4f0 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/request/UserEditProductDto.java @@ -0,0 +1,121 @@ +package com.qniao.dam.api.command.product.user.request; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.qniao.dam.api.validator.ProductStatusIs; +import com.qniao.dam.domain.aggregate.product.entity.Product; +import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; +import com.qniao.dam.domain.aggregate.productspec.valueobj.ProductSpecTerm; +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.dam.domian.aggregate.productspec.constant.ProductSpecTermNameEnum; +import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermUnitEnum; +import com.qniao.domain.Trans2DomainAssembler; +import com.qniao.framework.exception.BizException; +import com.qniao.framework.utils.TypeConvertUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Data +public class UserEditProductDto implements Trans2DomainAssembler { + + @ApiModelProperty("产品标识") + @NotNull(message = "产品标识不能为空") + @ProductStatusIs(status = {ProductStatusEnum.SOLD_OUTED}) + private Long productId; + + @ApiModelProperty("产品规格标识") + @NotNull(message = "产品规格标识不能为空") + private Long productSpecId; + + @ApiModelProperty("产品主分类") + @NotNull(message = "产品主分类不能为空") + private ProductMainCategoryEnum mainCategory; + + @ApiModelProperty("产品次分类") + @NotNull(message = "产品次分类不能为空") + private ProductSubCategoryEnum subCategory; + + @ApiModelProperty("产品标题") + @NotNull(message = "产品标题不能为空") + private String productTitle; + + @ApiModelProperty("产品描述") + @NotNull(message = "产品描述不能为空") + private String productDesc; + + @ApiModelProperty("详情描述") + @NotNull(message = "详情描述不能为空") + private String detailDesc; + + @ApiModelProperty("原价") + @NotNull(message = "原价不能为空") + private BigDecimal unitOriginalPrice; + + @ApiModelProperty("售价") + @NotNull(message = "售价不能为空") + private BigDecimal unitSellingPrice; + + @ApiModelProperty("产品规格(周期、次数)") + @NotNull(message = "产品规格不能为空") + private ProductSpecTermUnitEnum productSpecUnit; + + @ApiModelProperty("有效期天数") + private String validityPeriodValue; + + @ApiModelProperty("购买次数") + private String purchaseTimeValue; + + @ApiModelProperty("单日使用上限") + private String dailyUseLimitValue; + + @Override + public Product trans2Domain() { + Product product = TypeConvertUtils.convert(this, Product.class); + product.setId(productId); + return product; + } + + public ProductSpec trans2ProductSpec() { + ProductSpec productSpec = new ProductSpec(); + productSpec.setId(productSpecId); + productSpec.setUnitOriginalPrice(unitOriginalPrice); + productSpec.setUnitSellingPrice(unitSellingPrice); + List productSpecTermList = new ArrayList<>(); + if (Objects.nonNull(productSpecUnit)) { + productSpecTermList.add(ProductSpecTerm.build(ProductSpecTermNameEnum.SPEC, productSpecUnit, null)); + } + if (StrUtil.isNotBlank(validityPeriodValue)) { + if (!NumberUtil.isNumber(validityPeriodValue)) { + throw new BizException("有效期天数必须是整数"); + } + productSpecTermList.add(ProductSpecTerm.build(ProductSpecTermNameEnum.VALIDITY_PERIOD, ProductSpecTermUnitEnum.VALIDITY_PERIOD_DAYS, validityPeriodValue)); + } + if (StrUtil.isNotBlank(purchaseTimeValue)) { + if (!NumberUtil.isNumber(purchaseTimeValue)) { + throw new BizException("购买次数必须是整数"); + } + } else { + purchaseTimeValue = "-1"; + } + productSpecTermList.add(ProductSpecTerm.build(ProductSpecTermNameEnum.PURCHASE_TIME, null, purchaseTimeValue)); + if (StrUtil.isNotBlank(dailyUseLimitValue)) { + if (!NumberUtil.isNumber(dailyUseLimitValue)) { + throw new BizException("单日使用上限必须是整数"); + } + } else { + dailyUseLimitValue = "-1"; + } + productSpecTermList.add(ProductSpecTerm.build(ProductSpecTermNameEnum.DAILY_USE_LIMIT, null, dailyUseLimitValue)); + productSpec.setProductSpecTermList(productSpecTermList); + return productSpec; + } +} \ No newline at end of file diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/request/UserOperateProductDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/request/UserOperateProductDto.java new file mode 100644 index 0000000..f4c58d4 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/product/user/request/UserOperateProductDto.java @@ -0,0 +1,28 @@ +package com.qniao.dam.api.command.product.user.request; + +import com.qniao.dam.domain.aggregate.product.entity.Product; +import com.qniao.dam.domian.aggregate.product.constant.ProductStatusEnum; +import com.qniao.domain.Trans2DomainAssembler; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class UserOperateProductDto implements Trans2DomainAssembler { + + @ApiModelProperty("产品标识") + @NotNull(message = "产品标识不能为空") + private Long productId; + + @ApiModelProperty("状态(已上架、已下架)") + private ProductStatusEnum status; + + @Override + public Product trans2Domain() { + Product product = new Product(); + product.setId(productId); + product.setStatus(status); + return product; + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/validator/ProductStatusIs.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/validator/ProductStatusIs.java new file mode 100644 index 0000000..e767e09 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/validator/ProductStatusIs.java @@ -0,0 +1,27 @@ +package com.qniao.dam.api.validator; + +import com.qniao.dam.api.validator.impl.ProductStatusIsValidator; +import com.qniao.dam.domian.aggregate.product.constant.ProductStatusEnum; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.FIELD; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({FIELD}) +@Constraint(validatedBy = {ProductStatusIsValidator.class}) +public @interface ProductStatusIs { + ProductStatusEnum[] status(); + + String message() default "商品状态不正确"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/validator/impl/ProductStatusIsValidator.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/validator/impl/ProductStatusIsValidator.java new file mode 100644 index 0000000..8992fee --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/validator/impl/ProductStatusIsValidator.java @@ -0,0 +1,47 @@ +package com.qniao.dam.api.validator.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.qniao.dam.api.validator.ProductStatusIs; +import com.qniao.dam.domain.aggregate.product.entity.Product; +import com.qniao.dam.domian.aggregate.product.constant.ProductStatusEnum; +import com.qniao.dam.infrastructure.persistent.dao.domain.ProductDao; + +import javax.annotation.Resource; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.stream.Collectors; + +public class ProductStatusIsValidator implements ConstraintValidator { + + @Resource + private ProductDao productDao; + + private ProductStatusEnum[] status; + + @Override + public void initialize(ProductStatusIs annotation) { + this.status = annotation.status(); + } + + @Override + public boolean isValid(Long id, ConstraintValidatorContext context) { + + Product product = productDao.selectById(id); + + //订单状态非待上传磅单 + if (CollUtil.toList(this.status).contains(product.getStatus())) { + return true; + } else { + //禁止默认消息返回 + context.disableDefaultConstraintViolation(); + //自定义返回消息 + + context.buildConstraintViolationWithTemplate(StrUtil.format("商品不是{}状态", + CollUtil.join(CollUtil.toList(this.status).stream().map(ProductStatusEnum::getDesc).collect(Collectors.toList()), "或"))) + .addConstraintViolation(); + + return false; + } + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/product/ProductApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/product/ProductApplicationService.java new file mode 100644 index 0000000..f30d05d --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/product/ProductApplicationService.java @@ -0,0 +1,34 @@ +package com.qniao.dam.application.service.product; + +import com.qniao.dam.domain.aggregate.product.ProductAggregate; +import com.qniao.dam.domain.aggregate.product.entity.Product; +import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; +import com.qniao.dam.domain.service.product.CreateProductDomainService; +import com.qniao.dam.domain.service.product.EditProductDomainService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class ProductApplicationService { + + @Resource + private CreateProductDomainService createProductDomainService; + @Resource + private EditProductDomainService editProductDomainService; + @Resource + private ProductAggregate productAggregate; + + public Long create(Product product, ProductSpec productSpec) { + createProductDomainService.handle(product, productSpec); + return product.getId(); + } + + public void edit(Product product, ProductSpec productSpec) { + editProductDomainService.handle(product, productSpec); + } + + public void operate(Product product) { + productAggregate.operate(product); + } +} 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 index d6776c1..a12bcb8 100644 --- 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 @@ -1,7 +1,26 @@ package com.qniao.dam.domain.aggregate.product; +import com.qniao.dam.domain.aggregate.product.entity.Product; +import com.qniao.dam.domain.aggregate.product.repository.ProductRepository; import org.springframework.stereotype.Service; +import javax.annotation.Resource; + @Service public class ProductAggregate { + + @Resource + private ProductRepository productRepository; + + public void create(Product product) { + productRepository.save(product); + } + + public void edit(Product product) { + productRepository.save(product); + } + + public void operate(Product product) { + productRepository.save(product); + } } 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 index b5c2885..0ec96f0 100644 --- 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 @@ -1,7 +1,22 @@ package com.qniao.dam.domain.aggregate.productspec; +import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; +import com.qniao.dam.domain.aggregate.productspec.repository.ProductSpecRepository; import org.springframework.stereotype.Service; +import javax.annotation.Resource; + @Service public class ProductSpecAggregate { + + @Resource + private ProductSpecRepository productSpecRepository; + + public void create(ProductSpec productSpec) { + productSpecRepository.save(productSpec); + } + + public void edit(ProductSpec productSpec) { + productSpecRepository.save(productSpec); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/product/CreateProductDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/product/CreateProductDomainService.java new file mode 100644 index 0000000..2f5e165 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/product/CreateProductDomainService.java @@ -0,0 +1,28 @@ +package com.qniao.dam.domain.service.product; + +import com.qniao.dam.domain.aggregate.product.ProductAggregate; +import com.qniao.dam.domain.aggregate.product.entity.Product; +import com.qniao.dam.domain.aggregate.productspec.ProductSpecAggregate; +import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; +import com.qniao.dam.domian.aggregate.product.constant.ProductStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +@Service +public class CreateProductDomainService { + + @Resource + private ProductAggregate productAggregate; + @Resource + private ProductSpecAggregate productSpecAggregate; + + @Transactional(rollbackFor = Exception.class) + public void handle(Product product, ProductSpec productSpec) { + product.setStatus(ProductStatusEnum.SOLD_OUTED); + productAggregate.create(product); + productSpec.setProductId(product.getId()); + productSpecAggregate.create(productSpec); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/product/EditProductDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/product/EditProductDomainService.java new file mode 100644 index 0000000..f7611ed --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/product/EditProductDomainService.java @@ -0,0 +1,25 @@ +package com.qniao.dam.domain.service.product; + +import com.qniao.dam.domain.aggregate.product.ProductAggregate; +import com.qniao.dam.domain.aggregate.product.entity.Product; +import com.qniao.dam.domain.aggregate.productspec.ProductSpecAggregate; +import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +@Service +public class EditProductDomainService { + @Resource + private ProductAggregate productAggregate; + @Resource + private ProductSpecAggregate productSpecAggregate; + + @Transactional(rollbackFor = Exception.class) + public void handle(Product product, ProductSpec productSpec) { + productAggregate.edit(product); + productSpecAggregate.edit(productSpec); + } + +} \ No newline at end of file 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 index d78b1f9..d388934 100644 --- 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 @@ -1,7 +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; +import com.qniao.dam.domain.aggregate.productspec.valueobj.ProductSpecTerm; public interface ProductSpecTermDao extends BaseMapper { } 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 index d42c529..ebb144b 100644 --- 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 @@ -3,7 +3,7 @@ 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.valueobj.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; @@ -40,21 +40,13 @@ public class ProductSpecRepositoryImpl implements ProductSpecRepository { } else { productSpecDao.updateById(entity); } - if (CollUtil.isNotEmpty(entity.getInsertProductSpecTermList())) { - entity.getInsertProductSpecTermList().forEach(term -> { + if (CollUtil.isNotEmpty(entity.getProductSpecTermList())) { + productSpecTermDao.delete(new LambdaQueryWrapper().eq(ProductSpecTerm::getProductSpecId, entity.getId())); + entity.getProductSpecTermList().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/query/product/impl/ProductQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/impl/ProductQueryServiceImpl.java index fb61352..d019f33 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/impl/ProductQueryServiceImpl.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/product/impl/ProductQueryServiceImpl.java @@ -8,7 +8,7 @@ import com.qniao.dam.api.query.product.user.response.UserGetProductDetailByOpera import com.qniao.dam.api.query.product.user.response.UserPageProductByOperatorVo; import com.qniao.dam.domain.aggregate.product.entity.Product; 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.valueobj.ProductSpecTerm; import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermNameEnum; import com.qniao.dam.domian.aggregate.productspec.constant.ProductSpecTermUnitEnum; import com.qniao.dam.infrastructure.persistent.dao.domain.ProductDao;