product:商品规格,调整成商品属性,避免和 sku 概念冲突

This commit is contained in:
YunaiV 2022-12-08 21:12:35 +08:00
parent 373188b58d
commit fac3e7c726
55 changed files with 283 additions and 210 deletions

View File

@ -28,7 +28,7 @@ public class ProductSkuRespDTO {
private String spuName;
/**
* 规格值数组JSON 格式
* 属性数组JSON 格式
*/
private List<Property> properties;
/**

View File

@ -22,13 +22,13 @@ public interface ErrorCodeConstants {
ErrorCode BRAND_DISABLED = new ErrorCode(1008002001, "品牌不存在");
ErrorCode BRAND_NAME_EXISTS = new ErrorCode(1008002002, "品牌名称已存在");
// ========== 商品规格名称 1008003000 ==========
ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1008003000, "规格名称不存在");
ErrorCode PROPERTY_EXISTS = new ErrorCode(1008003001, "规格名称已存在");
// ========== 商品属性项 1008003000 ==========
ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1008003000, "属性项不存在");
ErrorCode PROPERTY_EXISTS = new ErrorCode(1008003001, "属性项的名称已存在");
// ========== 规格 1008004000 ==========
ErrorCode PROPERTY_VALUE_NOT_EXISTS = new ErrorCode(1008004000, "规格值不存在");
ErrorCode PROPERTY_VALUE_EXISTS = new ErrorCode(1008004001, "规格值已存在");
// ========== 商品属性 1008004000 ==========
ErrorCode PROPERTY_VALUE_NOT_EXISTS = new ErrorCode(1008004000, "属性值不存在");
ErrorCode PROPERTY_VALUE_EXISTS = new ErrorCode(1008004001, "属性值的名称已存在");
// ========== 商品 SPU 1008005000 ==========
ErrorCode SPU_NOT_EXISTS = new ErrorCode(1008005000, "商品 SPU 不存在");
@ -36,7 +36,7 @@ public interface ErrorCodeConstants {
// ========== 商品 SKU 1008006000 ==========
ErrorCode SKU_NOT_EXISTS = new ErrorCode(1008006000, "商品 SKU 不存在");
ErrorCode SKU_PROPERTIES_DUPLICATED = new ErrorCode(1008006001, "商品 SKU 的属性组合存在重复");
ErrorCode SPU_ATTR_NUMBERS_MUST_BE_EQUALS = new ErrorCode(1008006002, "一个 SPU 下的每个 SKU规格数必须一致");
ErrorCode SPU_ATTR_NUMBERS_MUST_BE_EQUALS = new ErrorCode(1008006002, "一个 SPU 下的每个 SKU属性项必须一致");
ErrorCode SPU_SKU_NOT_DUPLICATE = new ErrorCode(1008006003, "一个 SPU 下的每个 SKU必须不重复");
ErrorCode SKU_STOCK_NOT_ENOUGH = new ErrorCode(1008006004, "商品 SKU 库存不足");

View File

@ -21,11 +21,11 @@ public enum ProductSpuSpecTypeEnum implements IntArrayValuable {
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductSpuSpecTypeEnum::getType).toArray();
/**
* 规格
* 规格类型
*/
private final Integer type;
/**
* 规格名
* 规格名
*/
private final String name;

View File

@ -18,7 +18,7 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Api(tags = "管理后台 - 规格名称")
@Api(tags = "管理后台 - 商品属性项")
@RestController
@RequestMapping("/product/property")
@Validated
@ -28,14 +28,14 @@ public class ProductPropertyController {
private ProductPropertyService productPropertyService;
@PostMapping("/create")
@ApiOperation("创建规格名称")
@ApiOperation("创建属性项")
@PreAuthorize("@ss.hasPermission('product:property:create')")
public CommonResult<Long> createProperty(@Valid @RequestBody ProductPropertyCreateReqVO createReqVO) {
return success(productPropertyService.createProperty(createReqVO));
}
@PutMapping("/update")
@ApiOperation("更新规格名称")
@ApiOperation("更新属性项")
@PreAuthorize("@ss.hasPermission('product:property:update')")
public CommonResult<Boolean> updateProperty(@Valid @RequestBody ProductPropertyUpdateReqVO updateReqVO) {
productPropertyService.updateProperty(updateReqVO);
@ -43,7 +43,7 @@ public class ProductPropertyController {
}
@DeleteMapping("/delete")
@ApiOperation("删除规格名称")
@ApiOperation("删除属性项")
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('product:property:delete')")
public CommonResult<Boolean> deleteProperty(@RequestParam("id") Long id) {
@ -52,7 +52,7 @@ public class ProductPropertyController {
}
@GetMapping("/get")
@ApiOperation("获得规格名称")
@ApiOperation("获得属性项")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('product:property:query')")
public CommonResult<ProductPropertyRespVO> getProperty(@RequestParam("id") Long id) {
@ -60,21 +60,21 @@ public class ProductPropertyController {
}
@GetMapping("/list")
@ApiOperation("获得规格名称列表")
@ApiOperation("获得属性项列表")
@PreAuthorize("@ss.hasPermission('product:property:query')")
public CommonResult<List<ProductPropertyRespVO>> getPropertyList(@Valid ProductPropertyListReqVO listReqVO) {
return success(productPropertyService.getPropertyList(listReqVO));
}
@GetMapping("/page")
@ApiOperation("获得规格名称分页")
@ApiOperation("获得属性项分页")
@PreAuthorize("@ss.hasPermission('product:property:query')")
public CommonResult<PageResult<ProductPropertyRespVO>> getPropertyPage(@Valid ProductPropertyPageReqVO pageVO) {
return success(productPropertyService.getPropertyPage(pageVO));
}
@GetMapping("/listAndValue")
@ApiOperation("获得规格名称列表")
@ApiOperation("获得属性项列表")
@PreAuthorize("@ss.hasPermission('product:property:query')")
public CommonResult<List<ProductPropertyAndValueRespVO>> getPropertyAndValueList(@Valid ProductPropertyListReqVO listReqVO) {
return success(productPropertyService.getPropertyAndValueList(listReqVO));

View File

@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.product.controller.admin.property;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyPageReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
@ -20,7 +19,7 @@ import javax.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Api(tags = "管理后台 - 规格值名称")
@Api(tags = "管理后台 - 商品属性值")
@RestController
@RequestMapping("/product/property/value")
@Validated
@ -30,14 +29,14 @@ public class ProductPropertyValueController {
private ProductPropertyValueService productPropertyValueService;
@PostMapping("/create")
@ApiOperation("创建规格名称")
@ApiOperation("创建属性值")
@PreAuthorize("@ss.hasPermission('product:property:create')")
public CommonResult<Long> createProperty(@Valid @RequestBody ProductPropertyValueCreateReqVO createReqVO) {
return success(productPropertyValueService.createPropertyValue(createReqVO));
}
@PutMapping("/update")
@ApiOperation("更新规格名称")
@ApiOperation("更新属性值")
@PreAuthorize("@ss.hasPermission('product:property:update')")
public CommonResult<Boolean> updateProperty(@Valid @RequestBody ProductPropertyValueUpdateReqVO updateReqVO) {
productPropertyValueService.updatePropertyValue(updateReqVO);
@ -45,7 +44,7 @@ public class ProductPropertyValueController {
}
@DeleteMapping("/delete")
@ApiOperation("删除规格名称")
@ApiOperation("删除属性值")
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('product:property:delete')")
public CommonResult<Boolean> deleteProperty(@RequestParam("id") Long id) {
@ -54,7 +53,7 @@ public class ProductPropertyValueController {
}
@GetMapping("/get")
@ApiOperation("获得规格名称")
@ApiOperation("获得属性值")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('product:property:query')")
public CommonResult<ProductPropertyValueRespVO> getProperty(@RequestParam("id") Long id) {
@ -62,7 +61,7 @@ public class ProductPropertyValueController {
}
@GetMapping("/page")
@ApiOperation("获得规格名称分页")
@ApiOperation("获得属性值分页")
@PreAuthorize("@ss.hasPermission('product:property:query')")
public CommonResult<PageResult<ProductPropertyValueRespVO>> getPropertyValuePage(@Valid ProductPropertyValuePageReqVO pageVO) {
return success(productPropertyValueService.getPropertyValueListPage(pageVO));

View File

@ -7,28 +7,23 @@ import lombok.ToString;
import java.util.List;
/**
* @Description: ProductPropertyViewRespVO
* @Author: franky
* @CreateDate: 2022/7/5 21:29
* @Version: 1.0.0
*/
@ApiModel("管理后台 - 规格名称详情展示 Request VO")
// TODO 芋艿看看怎么删除
@ApiModel("管理后台 - 商品属性详情展示 Request VO")
@Data
@ToString(callSuper = true)
public class ProductPropertyViewRespVO {
@ApiModelProperty(value = "规格名称id", example = "1")
@ApiModelProperty(value = "属性项 id", example = "1")
public Long propertyId;
@ApiModelProperty(value = "规格名称", example = "内存")
@ApiModelProperty(value = "属性项的名字", example = "内存")
public String name;
@ApiModelProperty(value = "规格属性值集合", example = "[{\"v1\":11,\"v2\":\"64G\"},{\"v1\":10,\"v2\":\"32G\"}]")
@ApiModelProperty(value = "属性值数组")
public List<Tuple2> propertyValues;
@Data
@ApiModel(value = "规格属性值元组")
@ApiModel(value = "属性值元组")
public static class Tuple2 {
private final long id;
private final String name;

View File

@ -10,20 +10,20 @@ import lombok.ToString;
import java.time.LocalDateTime;
import java.util.List;
@ApiModel("管理后台 - 规格 + 规格值 Response VO")
@ApiModel("管理后台 - 商品属性项 + 属性值 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ProductPropertyAndValueRespVO extends ProductPropertyBaseVO {
@ApiModelProperty(value = "规格的编号", required = true, example = "1024")
@ApiModelProperty(value = "属性项的编号", required = true, example = "1024")
private Long id;
@ApiModelProperty(value = "创建时间", required = true)
private LocalDateTime createTime;
/**
* 规格值的集合
* 属性值的集合
*/
private List<ProductPropertyValueRespVO> values;

View File

@ -7,14 +7,14 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 规格名称 Base VO提供给添加修改详细的子 VO 使用
* 商品属性项 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data
public class ProductPropertyBaseVO {
@ApiModelProperty(value = "规格名称", required = true, example = "颜色")
@NotBlank(message = "规格名称不能为空")
@ApiModelProperty(value = "名称", required = true, example = "颜色")
@NotBlank(message = "名称不能为空")
private String name;
@ApiModelProperty(value = "备注", example = "颜色")

View File

@ -5,7 +5,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@ApiModel("管理后台 - 规格名称创建 Request VO")
@ApiModel("管理后台 - 属性项创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

View File

@ -5,12 +5,12 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
@ApiModel("管理后台 - 规格名称 List Request VO")
@ApiModel("管理后台 - 属性项 List Request VO")
@Data
@ToString(callSuper = true)
public class ProductPropertyListReqVO {
@ApiModelProperty(value = "规格名称", example = "颜色")
@ApiModelProperty(value = "名称", example = "颜色")
private String name;
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")

View File

@ -12,13 +12,13 @@ import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("管理后台 - 规格名称分页 Request VO")
@ApiModel("管理后台 - 属性项 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ProductPropertyPageReqVO extends PageParam {
@ApiModelProperty(value = "规格名称", example = "颜色")
@ApiModelProperty(value = "名称", example = "颜色")
private String name;
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")

View File

@ -8,13 +8,13 @@ import lombok.ToString;
import java.time.LocalDateTime;
@ApiModel("管理后台 - 规格 + 规格值 Response VO")
@ApiModel("管理后台 - 属性项 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ProductPropertyRespVO extends ProductPropertyBaseVO {
@ApiModelProperty(value = "规格的编号", required = true, example = "1024")
@ApiModelProperty(value = "编号", required = true, example = "1024")
private Long id;
@ApiModelProperty(value = "创建时间", required = true)

View File

@ -1,12 +1,14 @@
package cn.iocoder.yudao.module.product.controller.admin.property.vo.property;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO;
import lombok.*;
import io.swagger.annotations.*;
import javax.validation.constraints.*;
import java.util.List;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@ApiModel("管理后台 - 规格名称更新 Request VO")
import javax.validation.constraints.NotNull;
@ApiModel("管理后台 - 属性项更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

View File

@ -7,18 +7,18 @@ import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 规格 Base VO提供给添加修改详细的子 VO 使用
* 属性 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data
public class ProductPropertyValueBaseVO {
@ApiModelProperty(value = "规格编号", required = true, example = "1024")
@NotNull(message = "规格编号不能为空")
@ApiModelProperty(value = "属性项的编号", required = true, example = "1024")
@NotNull(message = "属性项的编号不能为空")
private Long propertyId;
@ApiModelProperty(value = "规格值名字", required = true, example = "红色")
@NotEmpty(message = "规格值名字不能为空")
@ApiModelProperty(value = "名称", required = true, example = "红色")
@NotEmpty(message = "名称名字不能为空")
private String name;
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.product.controller.admin.property.vo.value;
import lombok.*;
import io.swagger.annotations.*;
@ApiModel("管理后台 - 规格值创建 Request VO")
@ApiModel("管理后台 - 商品属性值创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

View File

@ -6,23 +6,17 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotEmpty;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("管理后台 - 规格名称值分页 Request VO")
@ApiModel("管理后台 - 商品属性值分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ProductPropertyValuePageReqVO extends PageParam {
@ApiModelProperty(value = "规格id", example = "1024")
@ApiModelProperty(value = "属性项的编号", example = "1024")
private String propertyId;
@ApiModelProperty(value = "规格值", example = "红色")
@ApiModelProperty(value = "名称", example = "红色")
private String name;
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")

View File

@ -8,13 +8,13 @@ import lombok.ToString;
import java.time.LocalDateTime;
@ApiModel("管理后台 - 规格值 Response VO")
@ApiModel("管理后台 - 商品属性值 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ProductPropertyValueRespVO extends ProductPropertyValueBaseVO {
@ApiModelProperty(value = "主键", required = true, example = "10")
@ApiModelProperty(value = "编号", required = true, example = "10")
private Long id;
@ApiModelProperty(value = "创建时间")

View File

@ -4,7 +4,7 @@ import lombok.*;
import io.swagger.annotations.*;
import javax.validation.constraints.*;
@ApiModel("管理后台 - 规格值更新 Request VO")
@ApiModel("管理后台 - 商品属性值更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

View File

@ -55,7 +55,7 @@ public class ProductSkuBaseVO {
@ApiModelProperty(value = "商品体积", example = "1024", notes = "单位m^3 平米")
private Double volume;
@ApiModel("规格值")
@ApiModel("商品属性")
@Data
public static class Property {

View File

@ -18,7 +18,7 @@ public class ProductSkuCreateOrUpdateReqVO extends ProductSkuBaseVO {
private Long id;
/**
* 规格值数组
* 属性数组
*/
private List<Property> properties;

View File

@ -22,7 +22,7 @@ public class ProductSkuRespVO extends ProductSkuBaseVO {
private LocalDateTime createTime;
/**
* 规格值数组
* 属性数组
*/
private List<Property> properties;

View File

@ -35,22 +35,22 @@ public class ProductSpuDetailRespVO extends ProductSpuBaseVO {
public static class Sku extends ProductSkuBaseVO {
/**
* 规格的数组
* 属性数组
*/
private List<ProductSpuDetailRespVO.Property> properties;
}
@ApiModel(value = "管理后台 - 商品规格的详细 Response VO")
@ApiModel(value = "管理后台 - 商品属性的详细 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public static class Property extends ProductSkuBaseVO.Property {
@ApiModelProperty(value = "规格的名字", required = true, example = "颜色")
@ApiModelProperty(value = "属性项的名字", required = true, example = "颜色")
private String propertyName;
@ApiModelProperty(value = "规格值的名字", required = true, example = "蓝色")
@ApiModelProperty(value = "属性值的名称", required = true, example = "蓝色")
private String valueName;
}
@ -59,7 +59,7 @@ public class ProductSpuDetailRespVO extends ProductSpuBaseVO {
private Long categoryId;
// TODO @芋艿在瞅瞅~
@ApiModelProperty(value = "规格属性修改和详情展示组合", example = "[{\"propertyId\":2,\"name\":\"内存\",\"propertyValues\":[{\"v1\":11,\"v2\":\"64G\"},{\"v1\":10,\"v2\":\"32G\"}]},{\"propertyId\":3,\"name\":\"尺寸\",\"propertyValues\":[{\"v1\":16,\"v2\":\"6.1\"},{\"v1\":15,\"v2\":\"5.7\"}]}]")
@ApiModelProperty(value = "属性修改和详情展示组合", example = "[{\"propertyId\":2,\"name\":\"内存\",\"propertyValues\":[{\"v1\":11,\"v2\":\"64G\"},{\"v1\":10,\"v2\":\"32G\"}]},{\"propertyId\":3,\"name\":\"尺寸\",\"propertyValues\":[{\"v1\":16,\"v2\":\"6.1\"},{\"v1\":15,\"v2\":\"5.7\"}]}]")
private List<ProductPropertyViewRespVO> productPropertyViews;
}

View File

@ -5,16 +5,14 @@ import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.Pro
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyRespVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyUpdateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 规格名称 Convert
* 属性项 Convert
*
* @author 芋道源码
*/

View File

@ -1,9 +1,6 @@
package cn.iocoder.yudao.module.product.convert.propertyvalue;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO;
@ -11,8 +8,10 @@ import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyVa
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 规格值 Convert
* 属性 Convert
*
* @author 芋道源码
*/

View File

@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 规格名称 DO
* 商品属性项 DO
*
* @author 芋道源码
*/
@ -28,7 +28,7 @@ public class ProductPropertyDO extends BaseDO {
@TableId
private Long id;
/**
* 规格名称
* 名称
*/
private String name;
/**

View File

@ -9,7 +9,7 @@ import lombok.*;
/**
* 规格 DO
* 商品属性 DO
*
* @author 芋道源码
*/
@ -29,13 +29,13 @@ public class ProductPropertyValueDO extends BaseDO {
@TableId
private Long id;
/**
* 规格键编号
* 属性项的编号
*
* 关联 {@link ProductPropertyDO#getId()}
*/
private Long propertyId;
/**
* 规格值名字
* 名称
*/
private String name;
/**

View File

@ -48,7 +48,7 @@ public class ProductSkuDO extends BaseDO {
*/
private String spuName;
/**
* 规格值数组JSON 格式
* 属性数组JSON 格式
*/
@TableField(typeHandler = PropertyTypeHandler.class)
private List<Property> properties;

View File

@ -7,13 +7,6 @@ import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.Pro
import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 规格名称 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface ProductPropertyMapper extends BaseMapperX<ProductPropertyDO> {

View File

@ -9,11 +9,6 @@ import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 规格值 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface ProductPropertyValueMapper extends BaseMapperX<ProductPropertyValueDO> {

View File

@ -1,23 +1,21 @@
package cn.iocoder.yudao.module.product.service.property;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyRespVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.*;
import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/**
* 规格名称 Service 接口
* 商品属性项 Service 接口
*
* @author 芋道源码
*/
public interface ProductPropertyService {
/**
* 创建规格名称
* 创建属性项
*
* @param createReqVO 创建信息
* @return 编号
@ -25,23 +23,23 @@ public interface ProductPropertyService {
Long createProperty(@Valid ProductPropertyCreateReqVO createReqVO);
/**
* 更新规格名称
* 更新属性项
*
* @param updateReqVO 更新信息
*/
void updateProperty(@Valid ProductPropertyUpdateReqVO updateReqVO);
/**
* 删除规格名称
* 删除属性项
*
* @param id 编号
*/
void deleteProperty(Long id);
/**
* 获得规格名称列表
* 获得属性项列表
* @param listReqVO 集合查询
* @return 规格名称集合
* @return 属性项集合
*/
List<ProductPropertyRespVO> getPropertyList(ProductPropertyListReqVO listReqVO);
@ -49,31 +47,31 @@ public interface ProductPropertyService {
* 获取属性名称分页
*
* @param pageReqVO 分页条件
* @return 规格名称分页
* @return 属性项分页
*/
PageResult<ProductPropertyRespVO> getPropertyPage(ProductPropertyPageReqVO pageReqVO);
/**
* 获得指定编号的规格名称
* 获得指定编号的属性项
*
* @param id 编号
* @return 规格名称
* @return 属性项
*/
ProductPropertyRespVO getProperty(Long id);
/**
* 根据规格属性编号的集合获得对应的规格 + 规格值的集合
* 根据属性项的编号的集合获得对应的属性项数组
*
* @param ids 规格编号的集合
* @return 对应的规格
* @param ids 属性项的编号的集合
* @return 属性项数组
*/
List<ProductPropertyRespVO> getPropertyList(Collection<Long> ids);
/**
* 获得规格名称 + 值的列表
* 获得属性项 + 值的列表
*
* @param listReqVO 列表查询
* @return 规格名称 + 值的列表
* @return 属性项 + 值的列表
*/
List<ProductPropertyAndValueRespVO> getPropertyAndValueList(ProductPropertyListReqVO listReqVO);

View File

@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.product.service.property;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.*;
import cn.iocoder.yudao.module.product.convert.property.ProductPropertyConvert;
@ -19,14 +18,13 @@ import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_EXISTS;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_NOT_EXISTS;
/**
* 规格名称 Service 实现类
* 商品属性项 Service 实现类
*
* @author 芋道源码
*/
@ -58,7 +56,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
@Transactional(rollbackFor = Exception.class)
public void updateProperty(ProductPropertyUpdateReqVO updateReqVO) {
// 校验存在
this.validatePropertyExists(updateReqVO.getId());
validatePropertyExists(updateReqVO.getId());
ProductPropertyDO productPropertyDO = productPropertyMapper.selectByName(updateReqVO.getName());
if (productPropertyDO != null && !productPropertyDO.getId().equals(updateReqVO.getId())) {
throw exception(PROPERTY_EXISTS);
@ -71,10 +69,10 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
@Override
public void deleteProperty(Long id) {
// 校验存在
this.validatePropertyExists(id);
validatePropertyExists(id);
// 删除
productPropertyMapper.deleteById(id);
//同步删除属性值
// 同步删除属性值
productPropertyValueMapper.deletePropertyValueByPropertyId(id);
}
@ -93,7 +91,6 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
@Override
public PageResult<ProductPropertyRespVO> getPropertyPage(ProductPropertyPageReqVO pageReqVO) {
//获取属性列表
PageResult<ProductPropertyDO> pageResult = productPropertyMapper.selectPage(pageReqVO);
return ProductPropertyConvert.INSTANCE.convertPage(pageResult);
}
@ -104,11 +101,13 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
return ProductPropertyConvert.INSTANCE.convert(property);
}
// TODO @芋艿丢到 Controller
@Override
public List<ProductPropertyRespVO> getPropertyList(Collection<Long> ids) {
return ProductPropertyConvert.INSTANCE.convertList(productPropertyMapper.selectBatchIds(ids));
}
// TODO @芋艿丢到 Controller
@Override
public List<ProductPropertyAndValueRespVO> getPropertyAndValueList(ProductPropertyListReqVO listReqVO) {
List<ProductPropertyRespVO> propertyList = getPropertyList(listReqVO);

View File

@ -9,16 +9,14 @@ import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.Produc
import java.util.List;
/**
* <p>
* 规格值 Service 接口
* </p>
* 商品属性值 Service 接口
*
* @author LuoWenFeng
*/
public interface ProductPropertyValueService {
/**
* 创建规格
* 创建属性
*
* @param createReqVO 创建信息
* @return 编号
@ -26,40 +24,40 @@ public interface ProductPropertyValueService {
Long createPropertyValue(ProductPropertyValueCreateReqVO createReqVO);
/**
* 更新规格
* 更新属性
*
* @param updateReqVO 更新信息
*/
void updatePropertyValue(ProductPropertyValueUpdateReqVO updateReqVO);
/**
* 删除规格
* 删除属性
*
* @param id 编号
*/
void deletePropertyValue(Long id);
/**
* 获得规格
* 获得属性
*
* @param id 编号
* @return 规格名称
* @return 属性值
*/
ProductPropertyValueRespVO getPropertyValue(Long id);
/**
* 获得规格
* 获得属性
*
* @param id 编号
* @return 规格名称
* @return 属性值
*/
List<ProductPropertyValueRespVO> getPropertyValueListByPropertyId(List<Long> id);
/**
* 获取规格值 分页
* 获取属性值的分页
*
* @param pageReqVO 查询条件
* @return
* @return 属性值的分页
*/
PageResult<ProductPropertyValueRespVO> getPropertyValueListPage(ProductPropertyValuePageReqVO pageReqVO);
}

View File

@ -14,13 +14,12 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_VALUE_EXISTS;
/**
* 规格 Service 实现类
* 商品属性 Service 实现类
*
* @author LuoWenFeng
*/

View File

@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.product.service.property.bo;
import lombok.Data;
/**
* 商品属性项的明细 Response BO
*
* @author 芋道源码
*/
@Data
public class ProductPropertyValueDetailRespBO {
/**
* 属性的编号
*/
private Long propertyId;
/**
* 属性的名称
*/
private String propertyName;
/**
* 属性值的编号
*/
private Long valueId;
/**
* 属性值的名称
*/
private String valueName;
}

View File

@ -84,15 +84,17 @@ public class ProductSkuServiceImpl implements ProductSkuService {
return;
}
// 1校验规格属性存在
Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null).flatMap(p -> p.getProperties().stream()) // 遍历多个 Property 属性
.map(ProductSkuBaseVO.Property::getPropertyId).collect(Collectors.toSet()); // 将每个 Property 转换成对应的 propertyId最后形成集合
// 1校验属性项存在
Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null)
.flatMap(p -> p.getProperties().stream()) // 遍历多个 Property 属性
.map(ProductSkuBaseVO.Property::getPropertyId) // 将每个 Property 转换成对应的 propertyId最后形成集合
.collect(Collectors.toSet());
List<ProductPropertyRespVO> propertyList = productPropertyService.getPropertyList(propertyIds);
if (propertyList.size() != propertyIds.size()) {
throw exception(PROPERTY_NOT_EXISTS);
}
// 2. 校验一个 SKU 没有重复的规格校验方式是遍历每个 SKU 看看是否有重复的规格 propertyId
// 2. 校验一个 SKU 没有重复的属性校验方式是遍历每个 SKU 看看是否有重复的属性 propertyId
Map<Long, ProductPropertyValueRespVO> propertyValueMap = CollectionUtils.convertMap(productPropertyValueService.getPropertyValueListByPropertyId(new ArrayList<>(propertyIds)), ProductPropertyValueRespVO::getId);
skus.forEach(sku -> {
Set<Long> skuPropertyIds = convertSet(sku.getProperties(), propertyItem -> propertyValueMap.get(propertyItem.getValueId()).getPropertyId());
@ -101,7 +103,7 @@ public class ProductSkuServiceImpl implements ProductSkuService {
}
});
// 3. 再校验每个 Sku 规格值的数量是一致的
// 3. 再校验每个 Sku 属性值的数量是一致的
int attrValueIdsSize = skus.get(0).getProperties().size();
for (int i = 1; i < skus.size(); i++) {
if (attrValueIdsSize != skus.get(i).getProperties().size()) {
@ -151,7 +153,7 @@ public class ProductSkuServiceImpl implements ProductSkuService {
public void updateSkus(Long spuId, String spuName, List<ProductSkuCreateOrUpdateReqVO> skus) {
// 查询 SPU 下已经存在的 SKU 的集合
List<ProductSkuDO> existsSkus = productSkuMapper.selectListBySpuId(spuId);
// 构建规格 SKU 的映射关系;
// 构建属性 SKU 的映射关系;
// TODO @luowenfeng: 可以下 existsSkuMap2; 会简洁一点; 另外, 可以考虑抽一个小方法, 用于 Properties 生成一个串; 这样 177 也可以复用了
Map<String, Long> existsSkuMap = existsSkus.stream()
.map(v -> {

View File

@ -133,7 +133,7 @@ public class ProductSpuServiceImpl implements ProductSpuService {
if (null != spu) {
List<ProductSpuDetailRespVO.Sku> skuReqs = ProductSkuConvert.INSTANCE.convertList03(productSkuService.getSkusBySpuId(id));
respVO.setSkus(skuReqs);
// 组合 sku 规格属性
// 组合 sku 属性
if (spu.getSpecType().equals(ProductSpuSpecTypeEnum.DISABLE.getType())) {
List<ProductSkuRespVO.Property> properties = new ArrayList<>();
for (ProductSpuDetailRespVO.Sku productSkuRespVO : skuReqs) {

View File

@ -265,7 +265,7 @@ public class PriceServiceImpl implements PriceService {
private void calculatePriceByRewardActivity(PriceCalculateRespDTO priceCalculate, List<PriceCalculateRespDTO.OrderItem> orderItems,
RewardActivityDO rewardActivity) {
// 获得最大匹配的满减送活动的规
// 获得最大匹配的满减送活动的规
RewardActivityDO.Rule rule = getLastMatchRewardActivityRule(rewardActivity, orderItems);
if (rule == null) {
// 获取不到的情况下记录不满足的优惠明细
@ -288,11 +288,11 @@ public class PriceServiceImpl implements PriceService {
}
/**
* 获得最大匹配的满减送活动的规
* 获得最大匹配的满减送活动的规
*
* @param rewardActivity 满减送活动
* @param orderItems 商品项
* @return 匹配的活动规
* @return 匹配的活动规
*/
private RewardActivityDO.Rule getLastMatchRewardActivityRule(RewardActivityDO rewardActivity,
List<PriceCalculateRespDTO.OrderItem> orderItems) {

View File

@ -72,7 +72,7 @@ public class TradeAfterSaleBaseVO {
@NotNull(message = "商品 SKU 编号不能为空")
private Long skuId;
@ApiModelProperty(value = "规格值数组")
@ApiModelProperty(value = "商品属性数组")
private List<ProductPropertyValueDetailRespVO> properties;
@ApiModelProperty(value = "商品图片", example = "https://www.iocoder.cn/2.png")

View File

@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("管理后台 - 商品规格 + 规格值的明细 Response VO")
@ApiModel("管理后台 - 商品属性值的明细 Response VO")
@Data
public class ProductPropertyValueDetailRespVO {

View File

@ -1,11 +1,14 @@
package cn.iocoder.yudao.module.trade.controller.admin.order;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageItemRespVO;
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
import cn.iocoder.yudao.module.trade.service.order.TradeOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -15,8 +18,11 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Api(tags = "管理后台 - 交易订单")
@ -33,7 +39,19 @@ public class TradeOrderController {
@ApiOperation("获得交易订单分页")
@PreAuthorize("@ss.hasPermission('trade:order:query')")
public CommonResult<PageResult<TradeOrderPageItemRespVO>> getOrderPage(TradeOrderPageReqVO reqVO) {
// 查询订单
PageResult<TradeOrderDO> pageResult = tradeOrderService.getOrderPage(reqVO);
if (CollUtil.isEmpty(pageResult.getList())) {
return success(PageResult.empty());
}
// 查询订单项
List<TradeOrderItemDO> orderItems = tradeOrderService.getOrderItems(
convertSet(pageResult.getList(), TradeOrderDO::getId));
// 查询属性
Set<Long> propertyValueIds = TradeOrderConvert.INSTANCE.convertPropertyValueIds(orderItems);
return success(null);
}

View File

@ -20,7 +20,7 @@ public class TradeOrderPageItemRespVO {
public static class Item extends TradeOrderItemBaseVO {
/**
* 规格值数组
* 属性数组
*/
private List<ProductPropertyValueDetailRespVO> properties;

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.trade.controller.admin.order.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
import io.swagger.annotations.ApiModel;
@ -8,7 +9,7 @@ import lombok.Data;
@ApiModel("管理后台 - 交易订单的分页 Request VO")
@Data
public class TradeOrderPageReqVO {
public class TradeOrderPageReqVO extends PageParam {
@ApiModelProperty(value = "订单状态", example = "1", notes = "参见 TradeOrderStatusEnum 枚举")
@InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}")

View File

@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("用户 App - 商品规格 + 规格值的明细 Response VO")
@ApiModel("用户 App - 商品属性值的明细 Response VO")
@Data
public class AppProductPropertyValueDetailRespVO {

View File

@ -27,7 +27,7 @@ public class AppProductSkuBaseRespVO {
private Integer stock;
/**
* 规格数组
* 属性数组
*/
private List<AppProductPropertyValueDetailRespVO> properties;

View File

@ -56,7 +56,7 @@ public class AppTradeOrderGetCreateInfoRespVO {
*/
private String picURL;
// /**
// * 规格值数组
// * 属性数组
// */
// private List<ProductAttrKeyValueRespVO> attrs; // TODO 后面改下
/**

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.trade.convert.order;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
@ -18,8 +19,11 @@ import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime;
@ -88,4 +92,14 @@ public interface TradeOrderConvert {
return createReqDTO;
}
default Set<Long> convertPropertyValueIds(List<TradeOrderItemDO> orderItems) {
if (CollUtil.isEmpty(orderItems)) {
return new HashSet<>();
}
return orderItems.stream().filter(item -> item.getProperties() != null)
.flatMap(p -> p.getProperties().stream()) // 遍历多个 Property 属性
.map(TradeOrderItemDO.Property::getValueId) // 将每个 Property 转换成对应的 propertyId最后形成集合
.collect(Collectors.toSet());
}
}

View File

@ -120,7 +120,7 @@ public class TradeAfterSaleDO extends BaseDO {
*/
private Long skuId;
/**
* 规格值数组JSON 格式
* 属性数组JSON 格式
*
* 冗余 {@link TradeOrderItemDO#getProperties()}
*/

View File

@ -63,7 +63,7 @@ public class TradeOrderItemDO extends BaseDO {
*/
private Long skuId;
/**
* 规格值数组JSON 格式
* 属性数组JSON 格式
*
* 冗余 ProductSkuDO properties 字段
*/

View File

@ -1,6 +1,9 @@
package cn.iocoder.yudao.module.trade.dal.mysql.order;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@ -14,8 +17,12 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
}
default TradeOrderDO selectByIdAndUserId(Long id, Long userId) {
return selectOne(TradeOrderDO::getId, id,
TradeOrderDO::getUserId, userId);
return selectOne(TradeOrderDO::getId, id, TradeOrderDO::getUserId, userId);
}
default PageResult<TradeOrderDO> selectPage(TradeOrderPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>()
.eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus()));
}
}

View File

@ -7,6 +7,12 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreate
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap;
/**
* 交易订单 Service 接口
*
@ -90,4 +96,23 @@ public interface TradeOrderService {
void updateOrderItemAfterSaleStatus(Long id, Integer oldAfterSaleStatus,
Integer newAfterSaleStatus, Integer refundPrice);
/**
* 查询交易订单项
*
* @param ids 交易订单项编号数组
* @return 交易订单项数组
*/
List<TradeOrderItemDO> getOrderItems(Collection<Long> ids);
/**
* 查询交易订单项 Map
*
* @param ids 交易订单项编号数组
* @return 交易订单项 Map
*/
default Map<Long, List<TradeOrderItemDO>> getOrderItemMap(Collection<Long> ids) {
List<TradeOrderItemDO> orderItems = getOrderItems(ids);
return convertMultiMap(orderItems, TradeOrderItemDO::getOrderId);
}
}

View File

@ -43,10 +43,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
@ -423,7 +420,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
@Override
public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) {
return null;
return tradeOrderMapper.selectPage(reqVO);
}
// =================== Order Item ===================
@ -475,6 +472,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
// TODO 芋艿未来如果有分佣需要更新相关分佣订单为已失效
}
@Override
public List<TradeOrderItemDO> getOrderItems(Collection<Long> ids) {
return tradeOrderItemMapper.selectBatchIds(ids);
}
/**
* 判断指定订单的所有订单项是不是都售后成功
*

View File

@ -1,6 +1,8 @@
import request from '@/utils/request'
// 创建规格名称
// ------------------------ 属性项 -------------------
// 创建属性项
export function createProperty(data) {
return request({
url: '/product/property/create',
@ -9,7 +11,7 @@ export function createProperty(data) {
})
}
// 更新规格名称
// 更新属性项
export function updateProperty(data) {
return request({
url: '/product/property/update',
@ -18,7 +20,7 @@ export function updateProperty(data) {
})
}
// 删除规格名称
// 删除属性项
export function deleteProperty(id) {
return request({
url: '/product/property/delete?id=' + id,
@ -26,7 +28,7 @@ export function deleteProperty(id) {
})
}
// 获得规格名称
// 获得属性项
export function getProperty(id) {
return request({
url: '/product/property/get?id=' + id,
@ -34,7 +36,7 @@ export function getProperty(id) {
})
}
// 获得规格名称分页
// 获得属性项分页
export function getPropertyPage(query) {
return request({
url: '/product/property/page',
@ -43,7 +45,7 @@ export function getPropertyPage(query) {
})
}
// 获得规格名称列表
// 获得属性项列表
export function getPropertyList(query) {
return request({
url: '/product/property/list',
@ -52,7 +54,7 @@ export function getPropertyList(query) {
})
}
// 获得规格名称列表
// 获得属性项列表
export function getPropertyListAndValue(query) {
return request({
url: '/product/property/listAndValue',
@ -62,7 +64,7 @@ export function getPropertyListAndValue(query) {
}
// 导出规格名称 Excel
// 导出属性项 Excel
export function exportPropertyExcel(query) {
return request({
url: '/product/property/export-excel',
@ -72,9 +74,9 @@ export function exportPropertyExcel(query) {
})
}
// ------------------------ 规格名称值 -------------------
// ------------------------ 属性值 -------------------
// 获得规格名称值分页
// 获得属性值分页
export function getPropertyValuePage(query) {
return request({
url: '/product/property/value/page',
@ -83,7 +85,7 @@ export function getPropertyValuePage(query) {
})
}
// 获得规格名称
// 获得属性
export function getPropertyValue(id) {
return request({
url: '/product/property/value/get?id=' + id,
@ -92,7 +94,7 @@ export function getPropertyValue(id) {
}
// 创建规格名称
// 创建属性
export function createPropertyValue(data) {
return request({
url: '/product/property/value/create',
@ -101,7 +103,7 @@ export function createPropertyValue(data) {
})
}
// 更新规格名称
// 更新属性
export function updatePropertyValue(data) {
return request({
url: '/product/property/value/update',
@ -110,7 +112,7 @@ export function updatePropertyValue(data) {
})
}
// 删除规格名称
// 删除属性值
export function deletePropertyValue(id) {
return request({
url: '/product/property/value/delete?id=' + id,

View File

@ -106,7 +106,7 @@ export const constantRoutes = [
path: 'value/:propertyId(\\d+)',
component: (resolve) => require(['@/views/mall/product/property/value'], resolve),
name: 'PropertyValue',
meta: {title: '规格数据', icon: '', activeMenu: '/product/property'}
meta: {title: '商品属性值', icon: '', activeMenu: '/product/property'}
}
]
}, {

View File

@ -3,8 +3,8 @@
<!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="规格名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入规格名称" clearable @keyup.enter.native="handleQuery"/>
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择开启状态" clearable size="small">
@ -33,8 +33,8 @@
<!-- 列表 -->
<el-table v-loading="loading" :data="list">
<el-table-column label="规格id" align="center" prop="id" />
<el-table-column label="规格名称" align="center" :show-overflow-tooltip="true">
<el-table-column label="编号" align="center" prop="id" />
<el-table-column label="名称" align="center" :show-overflow-tooltip="true">
<template slot-scope="scope">
<router-link :to="'/property/value/' + scope.row.id" class="link-type">
<span>{{ scope.row.name }}</span>
@ -68,13 +68,13 @@
<!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="规格id" prop="id" v-if="form.id != null">
<el-form-item label="编号" prop="id" v-if="form.id != null">
<el-input v-model="form.id" disabled />
</el-form-item>
<el-form-item label="规格名称" prop="name">
<el-input v-model="form.name" placeholder="请输入规格名称" />
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="开启状态" prop="status">
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
:key="dict.value" :label="parseInt(dict.value)">{{ dict.label }}
@ -110,7 +110,7 @@ export default {
showSearch: true,
//
total: 0,
//
//
list: [],
//
title: "",
@ -134,7 +134,7 @@ export default {
//
rules: {
name: [
{ required: true, message: "规格不能为空", trigger: "blur" }
{ required: true, message: "名称不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "blur" }
@ -185,7 +185,7 @@ export default {
handleAdd() {
this.reset();
this.open = true;
this.title = "添加规格";
this.title = "添加属性项";
},
/** 修改按钮操作 */
handleUpdate(row) {
@ -194,7 +194,7 @@ export default {
getProperty(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改规格";
this.title = "修改属性项";
});
},
/** 提交按钮 */
@ -223,7 +223,7 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const id = row.id;
this.$modal.confirm('是否确认删除规格名称为"' + row.name + '"的数据项?').then(function() {
this.$modal.confirm('是否确认删除名称为"' + row.name + '"的数据项?').then(function() {
return deleteProperty(id);
}).then(() => {
this.getList();
@ -237,11 +237,11 @@ export default {
params.pageNo = undefined;
params.pageSize = undefined;
//
this.$modal.confirm('是否确认导出所有规格名称数据项?').then(() => {
this.$modal.confirm('是否确认导出所有名称数据项?').then(() => {
this.exportLoading = true;
return exportPropertyExcel(params);
}).then(response => {
this.$download.excel(response, '规格名称.xls');
this.$download.excel(response, '名称.xls');
this.exportLoading = false;
}).catch(() => {});
},

View File

@ -1,13 +1,13 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="规格名称" prop="propertyId">
<el-form-item label="属性项" prop="propertyId">
<el-select v-model="queryParams.propertyId">
<el-option v-for="item in propertyOptions" :key="item.id" :label="item.id +'-'+ item.name" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item label="规格值" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入规格值" clearable @keyup.enter.native="handleQuery"/>
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="状态" clearable size="small">
@ -35,8 +35,8 @@
</el-row>
<el-table v-loading="loading" :data="dataList">
<el-table-column label="规格值id" align="center" prop="id"/>
<el-table-column label="规格值" align="center" prop="name"/>
<el-table-column label="编号" align="center" prop="id"/>
<el-table-column label="名称" align="center" prop="name"/>
<el-table-column label="状态" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
@ -66,11 +66,11 @@
<!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="90px">
<el-form-item label="规格值编码">
<el-form-item label="属性项">
<el-input v-model="form.propertyId" :disabled="true"/>
</el-form-item>
<el-form-item label="规格值" prop="name">
<el-input v-model="form.name" placeholder="请输入数据标签"/>
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
@ -137,7 +137,7 @@ export default {
//
rules: {
name: [
{required: true, message: "规格值不能为空", trigger: "blur"}
{required: true, message: "名称不能为空", trigger: "blur"}
],
status: [
{required: true, message: "状态不能为空", trigger: "blur"}
@ -206,7 +206,7 @@ export default {
handleAdd() {
this.reset();
this.open = true;
this.title = "添加规格值";
this.title = "添加属性值";
this.form.propertyId = this.queryParams.propertyId;
},
/** 修改按钮操作 */
@ -216,7 +216,7 @@ export default {
getPropertyValue(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改规格值";
this.title = "修改属性值";
});
},
/** 提交按钮 */