mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2025-02-07 21:10:05 +08:00
product:商品规格,调整成商品属性,避免和 sku 概念冲突
This commit is contained in:
parent
373188b58d
commit
fac3e7c726
@ -28,7 +28,7 @@ public class ProductSkuRespDTO {
|
|||||||
private String spuName;
|
private String spuName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值数组,JSON 格式
|
* 属性数组,JSON 格式
|
||||||
*/
|
*/
|
||||||
private List<Property> properties;
|
private List<Property> properties;
|
||||||
/**
|
/**
|
||||||
|
@ -22,13 +22,13 @@ public interface ErrorCodeConstants {
|
|||||||
ErrorCode BRAND_DISABLED = new ErrorCode(1008002001, "品牌不存在");
|
ErrorCode BRAND_DISABLED = new ErrorCode(1008002001, "品牌不存在");
|
||||||
ErrorCode BRAND_NAME_EXISTS = new ErrorCode(1008002002, "品牌名称已存在");
|
ErrorCode BRAND_NAME_EXISTS = new ErrorCode(1008002002, "品牌名称已存在");
|
||||||
|
|
||||||
// ========== 商品规格名称 1008003000 ==========
|
// ========== 商品属性项 1008003000 ==========
|
||||||
ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1008003000, "规格名称不存在");
|
ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1008003000, "属性项不存在");
|
||||||
ErrorCode PROPERTY_EXISTS = new ErrorCode(1008003001, "规格名称已存在");
|
ErrorCode PROPERTY_EXISTS = new ErrorCode(1008003001, "属性项的名称已存在");
|
||||||
|
|
||||||
// ========== 规格值 1008004000 ==========
|
// ========== 商品属性值 1008004000 ==========
|
||||||
ErrorCode PROPERTY_VALUE_NOT_EXISTS = new ErrorCode(1008004000, "规格值不存在");
|
ErrorCode PROPERTY_VALUE_NOT_EXISTS = new ErrorCode(1008004000, "属性值不存在");
|
||||||
ErrorCode PROPERTY_VALUE_EXISTS = new ErrorCode(1008004001, "规格值已存在");
|
ErrorCode PROPERTY_VALUE_EXISTS = new ErrorCode(1008004001, "属性值的名称已存在");
|
||||||
|
|
||||||
// ========== 商品 SPU 1008005000 ==========
|
// ========== 商品 SPU 1008005000 ==========
|
||||||
ErrorCode SPU_NOT_EXISTS = new ErrorCode(1008005000, "商品 SPU 不存在");
|
ErrorCode SPU_NOT_EXISTS = new ErrorCode(1008005000, "商品 SPU 不存在");
|
||||||
@ -36,7 +36,7 @@ public interface ErrorCodeConstants {
|
|||||||
// ========== 商品 SKU 1008006000 ==========
|
// ========== 商品 SKU 1008006000 ==========
|
||||||
ErrorCode SKU_NOT_EXISTS = new ErrorCode(1008006000, "商品 SKU 不存在");
|
ErrorCode SKU_NOT_EXISTS = new ErrorCode(1008006000, "商品 SKU 不存在");
|
||||||
ErrorCode SKU_PROPERTIES_DUPLICATED = new ErrorCode(1008006001, "商品 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 SPU_SKU_NOT_DUPLICATE = new ErrorCode(1008006003, "一个 SPU 下的每个 SKU,必须不重复");
|
||||||
ErrorCode SKU_STOCK_NOT_ENOUGH = new ErrorCode(1008006004, "商品 SKU 库存不足");
|
ErrorCode SKU_STOCK_NOT_ENOUGH = new ErrorCode(1008006004, "商品 SKU 库存不足");
|
||||||
|
|
||||||
|
@ -21,11 +21,11 @@ public enum ProductSpuSpecTypeEnum implements IntArrayValuable {
|
|||||||
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductSpuSpecTypeEnum::getType).toArray();
|
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductSpuSpecTypeEnum::getType).toArray();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格
|
* 规格类型
|
||||||
*/
|
*/
|
||||||
private final Integer type;
|
private final Integer type;
|
||||||
/**
|
/**
|
||||||
* 规格名
|
* 规格名称
|
||||||
*/
|
*/
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
@Api(tags = "管理后台 - 规格名称")
|
@Api(tags = "管理后台 - 商品属性项")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/product/property")
|
@RequestMapping("/product/property")
|
||||||
@Validated
|
@Validated
|
||||||
@ -28,14 +28,14 @@ public class ProductPropertyController {
|
|||||||
private ProductPropertyService productPropertyService;
|
private ProductPropertyService productPropertyService;
|
||||||
|
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
@ApiOperation("创建规格名称")
|
@ApiOperation("创建属性项")
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:create')")
|
@PreAuthorize("@ss.hasPermission('product:property:create')")
|
||||||
public CommonResult<Long> createProperty(@Valid @RequestBody ProductPropertyCreateReqVO createReqVO) {
|
public CommonResult<Long> createProperty(@Valid @RequestBody ProductPropertyCreateReqVO createReqVO) {
|
||||||
return success(productPropertyService.createProperty(createReqVO));
|
return success(productPropertyService.createProperty(createReqVO));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("/update")
|
@PutMapping("/update")
|
||||||
@ApiOperation("更新规格名称")
|
@ApiOperation("更新属性项")
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:update')")
|
@PreAuthorize("@ss.hasPermission('product:property:update')")
|
||||||
public CommonResult<Boolean> updateProperty(@Valid @RequestBody ProductPropertyUpdateReqVO updateReqVO) {
|
public CommonResult<Boolean> updateProperty(@Valid @RequestBody ProductPropertyUpdateReqVO updateReqVO) {
|
||||||
productPropertyService.updateProperty(updateReqVO);
|
productPropertyService.updateProperty(updateReqVO);
|
||||||
@ -43,7 +43,7 @@ public class ProductPropertyController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("/delete")
|
@DeleteMapping("/delete")
|
||||||
@ApiOperation("删除规格名称")
|
@ApiOperation("删除属性项")
|
||||||
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:delete')")
|
@PreAuthorize("@ss.hasPermission('product:property:delete')")
|
||||||
public CommonResult<Boolean> deleteProperty(@RequestParam("id") Long id) {
|
public CommonResult<Boolean> deleteProperty(@RequestParam("id") Long id) {
|
||||||
@ -52,7 +52,7 @@ public class ProductPropertyController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/get")
|
@GetMapping("/get")
|
||||||
@ApiOperation("获得规格名称")
|
@ApiOperation("获得属性项")
|
||||||
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
||||||
public CommonResult<ProductPropertyRespVO> getProperty(@RequestParam("id") Long id) {
|
public CommonResult<ProductPropertyRespVO> getProperty(@RequestParam("id") Long id) {
|
||||||
@ -60,21 +60,21 @@ public class ProductPropertyController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
@ApiOperation("获得规格名称列表")
|
@ApiOperation("获得属性项列表")
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
||||||
public CommonResult<List<ProductPropertyRespVO>> getPropertyList(@Valid ProductPropertyListReqVO listReqVO) {
|
public CommonResult<List<ProductPropertyRespVO>> getPropertyList(@Valid ProductPropertyListReqVO listReqVO) {
|
||||||
return success(productPropertyService.getPropertyList(listReqVO));
|
return success(productPropertyService.getPropertyList(listReqVO));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
@ApiOperation("获得规格名称分页")
|
@ApiOperation("获得属性项分页")
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
||||||
public CommonResult<PageResult<ProductPropertyRespVO>> getPropertyPage(@Valid ProductPropertyPageReqVO pageVO) {
|
public CommonResult<PageResult<ProductPropertyRespVO>> getPropertyPage(@Valid ProductPropertyPageReqVO pageVO) {
|
||||||
return success(productPropertyService.getPropertyPage(pageVO));
|
return success(productPropertyService.getPropertyPage(pageVO));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/listAndValue")
|
@GetMapping("/listAndValue")
|
||||||
@ApiOperation("获得规格名称列表")
|
@ApiOperation("获得属性项列表")
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
||||||
public CommonResult<List<ProductPropertyAndValueRespVO>> getPropertyAndValueList(@Valid ProductPropertyListReqVO listReqVO) {
|
public CommonResult<List<ProductPropertyAndValueRespVO>> getPropertyAndValueList(@Valid ProductPropertyListReqVO listReqVO) {
|
||||||
return success(productPropertyService.getPropertyAndValueList(listReqVO));
|
return success(productPropertyService.getPropertyAndValueList(listReqVO));
|
||||||
|
@ -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.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.ProductPropertyValueCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO;
|
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO;
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
|
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;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
@Api(tags = "管理后台 - 规格值名称")
|
@Api(tags = "管理后台 - 商品属性值")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/product/property/value")
|
@RequestMapping("/product/property/value")
|
||||||
@Validated
|
@Validated
|
||||||
@ -30,14 +29,14 @@ public class ProductPropertyValueController {
|
|||||||
private ProductPropertyValueService productPropertyValueService;
|
private ProductPropertyValueService productPropertyValueService;
|
||||||
|
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
@ApiOperation("创建规格名称")
|
@ApiOperation("创建属性值")
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:create')")
|
@PreAuthorize("@ss.hasPermission('product:property:create')")
|
||||||
public CommonResult<Long> createProperty(@Valid @RequestBody ProductPropertyValueCreateReqVO createReqVO) {
|
public CommonResult<Long> createProperty(@Valid @RequestBody ProductPropertyValueCreateReqVO createReqVO) {
|
||||||
return success(productPropertyValueService.createPropertyValue(createReqVO));
|
return success(productPropertyValueService.createPropertyValue(createReqVO));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("/update")
|
@PutMapping("/update")
|
||||||
@ApiOperation("更新规格名称")
|
@ApiOperation("更新属性值")
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:update')")
|
@PreAuthorize("@ss.hasPermission('product:property:update')")
|
||||||
public CommonResult<Boolean> updateProperty(@Valid @RequestBody ProductPropertyValueUpdateReqVO updateReqVO) {
|
public CommonResult<Boolean> updateProperty(@Valid @RequestBody ProductPropertyValueUpdateReqVO updateReqVO) {
|
||||||
productPropertyValueService.updatePropertyValue(updateReqVO);
|
productPropertyValueService.updatePropertyValue(updateReqVO);
|
||||||
@ -45,7 +44,7 @@ public class ProductPropertyValueController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("/delete")
|
@DeleteMapping("/delete")
|
||||||
@ApiOperation("删除规格名称")
|
@ApiOperation("删除属性值")
|
||||||
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:delete')")
|
@PreAuthorize("@ss.hasPermission('product:property:delete')")
|
||||||
public CommonResult<Boolean> deleteProperty(@RequestParam("id") Long id) {
|
public CommonResult<Boolean> deleteProperty(@RequestParam("id") Long id) {
|
||||||
@ -54,7 +53,7 @@ public class ProductPropertyValueController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/get")
|
@GetMapping("/get")
|
||||||
@ApiOperation("获得规格名称")
|
@ApiOperation("获得属性值")
|
||||||
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
||||||
public CommonResult<ProductPropertyValueRespVO> getProperty(@RequestParam("id") Long id) {
|
public CommonResult<ProductPropertyValueRespVO> getProperty(@RequestParam("id") Long id) {
|
||||||
@ -62,7 +61,7 @@ public class ProductPropertyValueController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
@ApiOperation("获得规格名称分页")
|
@ApiOperation("获得属性值分页")
|
||||||
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
@PreAuthorize("@ss.hasPermission('product:property:query')")
|
||||||
public CommonResult<PageResult<ProductPropertyValueRespVO>> getPropertyValuePage(@Valid ProductPropertyValuePageReqVO pageVO) {
|
public CommonResult<PageResult<ProductPropertyValueRespVO>> getPropertyValuePage(@Valid ProductPropertyValuePageReqVO pageVO) {
|
||||||
return success(productPropertyValueService.getPropertyValueListPage(pageVO));
|
return success(productPropertyValueService.getPropertyValueListPage(pageVO));
|
||||||
|
@ -7,28 +7,23 @@ import lombok.ToString;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
// TODO 芋艿:看看怎么删除
|
||||||
* @Description: ProductPropertyViewRespVO
|
@ApiModel("管理后台 - 商品属性详情展示 Request VO")
|
||||||
* @Author: franky
|
|
||||||
* @CreateDate: 2022/7/5 21:29
|
|
||||||
* @Version: 1.0.0
|
|
||||||
*/
|
|
||||||
@ApiModel("管理后台 - 规格名称详情展示 Request VO")
|
|
||||||
@Data
|
@Data
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class ProductPropertyViewRespVO {
|
public class ProductPropertyViewRespVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格名称id", example = "1")
|
@ApiModelProperty(value = "属性项 id", example = "1")
|
||||||
public Long propertyId;
|
public Long propertyId;
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格名称", example = "内存")
|
@ApiModelProperty(value = "属性项的名字", example = "内存")
|
||||||
public String name;
|
public String name;
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格属性值集合", example = "[{\"v1\":11,\"v2\":\"64G\"},{\"v1\":10,\"v2\":\"32G\"}]")
|
@ApiModelProperty(value = "属性值数组")
|
||||||
public List<Tuple2> propertyValues;
|
public List<Tuple2> propertyValues;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ApiModel(value = "规格属性值元组")
|
@ApiModel(value = "属性值元组")
|
||||||
public static class Tuple2 {
|
public static class Tuple2 {
|
||||||
private final long id;
|
private final long id;
|
||||||
private final String name;
|
private final String name;
|
||||||
|
@ -10,20 +10,20 @@ import lombok.ToString;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格 + 规格值 Response VO")
|
@ApiModel("管理后台 - 商品属性项 + 属性值 Response VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class ProductPropertyAndValueRespVO extends ProductPropertyBaseVO {
|
public class ProductPropertyAndValueRespVO extends ProductPropertyBaseVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格的编号", required = true, example = "1024")
|
@ApiModelProperty(value = "属性项的编号", required = true, example = "1024")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "创建时间", required = true)
|
@ApiModelProperty(value = "创建时间", required = true)
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值的集合
|
* 属性值的集合
|
||||||
*/
|
*/
|
||||||
private List<ProductPropertyValueRespVO> values;
|
private List<ProductPropertyValueRespVO> values;
|
||||||
|
|
||||||
|
@ -7,14 +7,14 @@ import javax.validation.constraints.NotBlank;
|
|||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格名称 Base VO,提供给添加、修改、详细的子 VO 使用
|
* 商品属性项 Base VO,提供给添加、修改、详细的子 VO 使用
|
||||||
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ProductPropertyBaseVO {
|
public class ProductPropertyBaseVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格名称", required = true, example = "颜色")
|
@ApiModelProperty(value = "名称", required = true, example = "颜色")
|
||||||
@NotBlank(message = "规格名称不能为空")
|
@NotBlank(message = "名称不能为空")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@ApiModelProperty(value = "备注", example = "颜色")
|
@ApiModelProperty(value = "备注", example = "颜色")
|
||||||
|
@ -5,7 +5,7 @@ import lombok.Data;
|
|||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格名称创建 Request VO")
|
@ApiModel("管理后台 - 属性项创建 Request VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
|
@ -5,12 +5,12 @@ import io.swagger.annotations.ApiModelProperty;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格名称 List Request VO")
|
@ApiModel("管理后台 - 属性项 List Request VO")
|
||||||
@Data
|
@Data
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class ProductPropertyListReqVO {
|
public class ProductPropertyListReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格名称", example = "颜色")
|
@ApiModelProperty(value = "名称", example = "颜色")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
|
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
|
||||||
|
@ -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;
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格名称分页 Request VO")
|
@ApiModel("管理后台 - 属性项 Request VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class ProductPropertyPageReqVO extends PageParam {
|
public class ProductPropertyPageReqVO extends PageParam {
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格名称", example = "颜色")
|
@ApiModelProperty(value = "名称", example = "颜色")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
|
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
|
||||||
|
@ -8,13 +8,13 @@ import lombok.ToString;
|
|||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格 + 规格值 Response VO")
|
@ApiModel("管理后台 - 属性项 Response VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class ProductPropertyRespVO extends ProductPropertyBaseVO {
|
public class ProductPropertyRespVO extends ProductPropertyBaseVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格的编号", required = true, example = "1024")
|
@ApiModelProperty(value = "编号", required = true, example = "1024")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "创建时间", required = true)
|
@ApiModelProperty(value = "创建时间", required = true)
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
package cn.iocoder.yudao.module.product.controller.admin.property.vo.property;
|
package cn.iocoder.yudao.module.product.controller.admin.property.vo.property;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO;
|
import io.swagger.annotations.ApiModel;
|
||||||
import lombok.*;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import io.swagger.annotations.*;
|
import lombok.Data;
|
||||||
import javax.validation.constraints.*;
|
import lombok.EqualsAndHashCode;
|
||||||
import java.util.List;
|
import lombok.ToString;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格名称更新 Request VO")
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
@ApiModel("管理后台 - 属性项更新 Request VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
|
@ -7,18 +7,18 @@ import javax.validation.constraints.NotEmpty;
|
|||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值 Base VO,提供给添加、修改、详细的子 VO 使用
|
* 属性值 Base VO,提供给添加、修改、详细的子 VO 使用
|
||||||
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ProductPropertyValueBaseVO {
|
public class ProductPropertyValueBaseVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格编号", required = true, example = "1024")
|
@ApiModelProperty(value = "属性项的编号", required = true, example = "1024")
|
||||||
@NotNull(message = "规格编号不能为空")
|
@NotNull(message = "属性项的编号不能为空")
|
||||||
private Long propertyId;
|
private Long propertyId;
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格值名字", required = true, example = "红色")
|
@ApiModelProperty(value = "名称", required = true, example = "红色")
|
||||||
@NotEmpty(message = "规格值名字不能为空")
|
@NotEmpty(message = "名称名字不能为空")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
|
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
|
||||||
|
@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.product.controller.admin.property.vo.value;
|
|||||||
import lombok.*;
|
import lombok.*;
|
||||||
import io.swagger.annotations.*;
|
import io.swagger.annotations.*;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格值创建 Request VO")
|
@ApiModel("管理后台 - 商品属性值创建 Request VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
|
@ -6,23 +6,17 @@ import io.swagger.annotations.ApiModelProperty;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotEmpty;
|
@ApiModel("管理后台 - 商品属性值分页 Request VO")
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格名称值分页 Request VO")
|
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class ProductPropertyValuePageReqVO extends PageParam {
|
public class ProductPropertyValuePageReqVO extends PageParam {
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格id", example = "1024")
|
@ApiModelProperty(value = "属性项的编号", example = "1024")
|
||||||
private String propertyId;
|
private String propertyId;
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格值", example = "红色")
|
@ApiModelProperty(value = "名称", example = "红色")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
|
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
|
||||||
|
@ -8,13 +8,13 @@ import lombok.ToString;
|
|||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格值 Response VO")
|
@ApiModel("管理后台 - 商品属性值 Response VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class ProductPropertyValueRespVO extends ProductPropertyValueBaseVO {
|
public class ProductPropertyValueRespVO extends ProductPropertyValueBaseVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "主键", required = true, example = "10")
|
@ApiModelProperty(value = "编号", required = true, example = "10")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "创建时间")
|
@ApiModelProperty(value = "创建时间")
|
||||||
|
@ -4,7 +4,7 @@ import lombok.*;
|
|||||||
import io.swagger.annotations.*;
|
import io.swagger.annotations.*;
|
||||||
import javax.validation.constraints.*;
|
import javax.validation.constraints.*;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 规格值更新 Request VO")
|
@ApiModel("管理后台 - 商品属性值更新 Request VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
|
@ -55,7 +55,7 @@ public class ProductSkuBaseVO {
|
|||||||
@ApiModelProperty(value = "商品体积", example = "1024", notes = "单位:m^3 平米")
|
@ApiModelProperty(value = "商品体积", example = "1024", notes = "单位:m^3 平米")
|
||||||
private Double volume;
|
private Double volume;
|
||||||
|
|
||||||
@ApiModel("规格值")
|
@ApiModel("商品属性")
|
||||||
@Data
|
@Data
|
||||||
public static class Property {
|
public static class Property {
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ public class ProductSkuCreateOrUpdateReqVO extends ProductSkuBaseVO {
|
|||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值数组
|
* 属性数组
|
||||||
*/
|
*/
|
||||||
private List<Property> properties;
|
private List<Property> properties;
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ public class ProductSkuRespVO extends ProductSkuBaseVO {
|
|||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值数组
|
* 属性数组
|
||||||
*/
|
*/
|
||||||
private List<Property> properties;
|
private List<Property> properties;
|
||||||
|
|
||||||
|
@ -35,22 +35,22 @@ public class ProductSpuDetailRespVO extends ProductSpuBaseVO {
|
|||||||
public static class Sku extends ProductSkuBaseVO {
|
public static class Sku extends ProductSkuBaseVO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格的数组
|
* 属性数组
|
||||||
*/
|
*/
|
||||||
private List<ProductSpuDetailRespVO.Property> properties;
|
private List<ProductSpuDetailRespVO.Property> properties;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiModel(value = "管理后台 - 商品规格的详细 Response VO")
|
@ApiModel(value = "管理后台 - 商品属性的详细 Response VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public static class Property extends ProductSkuBaseVO.Property {
|
public static class Property extends ProductSkuBaseVO.Property {
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格的名字", required = true, example = "颜色")
|
@ApiModelProperty(value = "属性项的名字", required = true, example = "颜色")
|
||||||
private String propertyName;
|
private String propertyName;
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格值的名字", required = true, example = "蓝色")
|
@ApiModelProperty(value = "属性值的名称", required = true, example = "蓝色")
|
||||||
private String valueName;
|
private String valueName;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -59,7 +59,7 @@ public class ProductSpuDetailRespVO extends ProductSpuBaseVO {
|
|||||||
private Long categoryId;
|
private Long categoryId;
|
||||||
|
|
||||||
// TODO @芋艿:在瞅瞅~
|
// 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;
|
private List<ProductPropertyViewRespVO> productPropertyViews;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.ProductPropertyCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyRespVO;
|
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.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.ProductPropertyDO;
|
||||||
import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;
|
|
||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格名称 Convert
|
* 属性项 Convert
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.product.convert.propertyvalue;
|
package cn.iocoder.yudao.module.product.convert.propertyvalue;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.ProductPropertyValueCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
|
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO;
|
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.Mapper;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值 Convert
|
* 属性值 Convert
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
|
@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
|||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格名称 DO
|
* 商品属性项 DO
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@ -28,7 +28,7 @@ public class ProductPropertyDO extends BaseDO {
|
|||||||
@TableId
|
@TableId
|
||||||
private Long id;
|
private Long id;
|
||||||
/**
|
/**
|
||||||
* 规格名称
|
* 名称
|
||||||
*/
|
*/
|
||||||
private String name;
|
private String name;
|
||||||
/**
|
/**
|
||||||
|
@ -9,7 +9,7 @@ import lombok.*;
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值 DO
|
* 商品属性值 DO
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@ -29,13 +29,13 @@ public class ProductPropertyValueDO extends BaseDO {
|
|||||||
@TableId
|
@TableId
|
||||||
private Long id;
|
private Long id;
|
||||||
/**
|
/**
|
||||||
* 规格键编号
|
* 属性项的编号
|
||||||
*
|
*
|
||||||
* 关联 {@link ProductPropertyDO#getId()}
|
* 关联 {@link ProductPropertyDO#getId()}
|
||||||
*/
|
*/
|
||||||
private Long propertyId;
|
private Long propertyId;
|
||||||
/**
|
/**
|
||||||
* 规格值名字
|
* 名称
|
||||||
*/
|
*/
|
||||||
private String name;
|
private String name;
|
||||||
/**
|
/**
|
||||||
|
@ -48,7 +48,7 @@ public class ProductSkuDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private String spuName;
|
private String spuName;
|
||||||
/**
|
/**
|
||||||
* 规格值数组,JSON 格式
|
* 属性数组,JSON 格式
|
||||||
*/
|
*/
|
||||||
@TableField(typeHandler = PropertyTypeHandler.class)
|
@TableField(typeHandler = PropertyTypeHandler.class)
|
||||||
private List<Property> properties;
|
private List<Property> properties;
|
||||||
|
@ -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 cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 规格名称 Mapper
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface ProductPropertyMapper extends BaseMapperX<ProductPropertyDO> {
|
public interface ProductPropertyMapper extends BaseMapperX<ProductPropertyDO> {
|
||||||
|
|
||||||
|
@ -9,11 +9,6 @@ import org.apache.ibatis.annotations.Mapper;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
|
||||||
* 规格值 Mapper
|
|
||||||
*
|
|
||||||
* @author 芋道源码
|
|
||||||
*/
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface ProductPropertyValueMapper extends BaseMapperX<ProductPropertyValueDO> {
|
public interface ProductPropertyValueMapper extends BaseMapperX<ProductPropertyValueDO> {
|
||||||
|
|
||||||
|
@ -1,23 +1,21 @@
|
|||||||
package cn.iocoder.yudao.module.product.service.property;
|
package cn.iocoder.yudao.module.product.service.property;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.controller.admin.property.vo.property.*;
|
||||||
import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
|
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格名称 Service 接口
|
* 商品属性项 Service 接口
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
public interface ProductPropertyService {
|
public interface ProductPropertyService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建规格名称
|
* 创建属性项
|
||||||
*
|
*
|
||||||
* @param createReqVO 创建信息
|
* @param createReqVO 创建信息
|
||||||
* @return 编号
|
* @return 编号
|
||||||
@ -25,23 +23,23 @@ public interface ProductPropertyService {
|
|||||||
Long createProperty(@Valid ProductPropertyCreateReqVO createReqVO);
|
Long createProperty(@Valid ProductPropertyCreateReqVO createReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新规格名称
|
* 更新属性项
|
||||||
*
|
*
|
||||||
* @param updateReqVO 更新信息
|
* @param updateReqVO 更新信息
|
||||||
*/
|
*/
|
||||||
void updateProperty(@Valid ProductPropertyUpdateReqVO updateReqVO);
|
void updateProperty(@Valid ProductPropertyUpdateReqVO updateReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除规格名称
|
* 删除属性项
|
||||||
*
|
*
|
||||||
* @param id 编号
|
* @param id 编号
|
||||||
*/
|
*/
|
||||||
void deleteProperty(Long id);
|
void deleteProperty(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得规格名称列表
|
* 获得属性项列表
|
||||||
* @param listReqVO 集合查询
|
* @param listReqVO 集合查询
|
||||||
* @return 规格名称集合
|
* @return 属性项集合
|
||||||
*/
|
*/
|
||||||
List<ProductPropertyRespVO> getPropertyList(ProductPropertyListReqVO listReqVO);
|
List<ProductPropertyRespVO> getPropertyList(ProductPropertyListReqVO listReqVO);
|
||||||
|
|
||||||
@ -49,31 +47,31 @@ public interface ProductPropertyService {
|
|||||||
* 获取属性名称分页
|
* 获取属性名称分页
|
||||||
*
|
*
|
||||||
* @param pageReqVO 分页条件
|
* @param pageReqVO 分页条件
|
||||||
* @return 规格名称分页
|
* @return 属性项分页
|
||||||
*/
|
*/
|
||||||
PageResult<ProductPropertyRespVO> getPropertyPage(ProductPropertyPageReqVO pageReqVO);
|
PageResult<ProductPropertyRespVO> getPropertyPage(ProductPropertyPageReqVO pageReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得指定编号的规格名称
|
* 获得指定编号的属性项
|
||||||
*
|
*
|
||||||
* @param id 编号
|
* @param id 编号
|
||||||
* @return 规格名称
|
* @return 属性项
|
||||||
*/
|
*/
|
||||||
ProductPropertyRespVO getProperty(Long id);
|
ProductPropertyRespVO getProperty(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据规格属性编号的集合,获得对应的规格 + 规格值的集合
|
* 根据属性项的编号的集合,获得对应的属性项数组
|
||||||
*
|
*
|
||||||
* @param ids 规格编号的集合
|
* @param ids 属性项的编号的集合
|
||||||
* @return 对应的规格
|
* @return 属性项数组
|
||||||
*/
|
*/
|
||||||
List<ProductPropertyRespVO> getPropertyList(Collection<Long> ids);
|
List<ProductPropertyRespVO> getPropertyList(Collection<Long> ids);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得规格名称 + 值的列表
|
* 获得属性项 + 值的列表
|
||||||
*
|
*
|
||||||
* @param listReqVO 列表查询
|
* @param listReqVO 列表查询
|
||||||
* @return 规格名称 + 值的列表
|
* @return 属性项 + 值的列表
|
||||||
*/
|
*/
|
||||||
List<ProductPropertyAndValueRespVO> getPropertyAndValueList(ProductPropertyListReqVO listReqVO);
|
List<ProductPropertyAndValueRespVO> getPropertyAndValueList(ProductPropertyListReqVO listReqVO);
|
||||||
|
|
||||||
|
@ -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.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
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.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.*;
|
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.*;
|
||||||
import cn.iocoder.yudao.module.product.convert.property.ProductPropertyConvert;
|
import cn.iocoder.yudao.module.product.convert.property.ProductPropertyConvert;
|
||||||
@ -19,14 +18,13 @@ import javax.annotation.Resource;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
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_EXISTS;
|
||||||
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_NOT_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格名称 Service 实现类
|
* 商品属性项 Service 实现类
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@ -58,7 +56,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void updateProperty(ProductPropertyUpdateReqVO updateReqVO) {
|
public void updateProperty(ProductPropertyUpdateReqVO updateReqVO) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
this.validatePropertyExists(updateReqVO.getId());
|
validatePropertyExists(updateReqVO.getId());
|
||||||
ProductPropertyDO productPropertyDO = productPropertyMapper.selectByName(updateReqVO.getName());
|
ProductPropertyDO productPropertyDO = productPropertyMapper.selectByName(updateReqVO.getName());
|
||||||
if (productPropertyDO != null && !productPropertyDO.getId().equals(updateReqVO.getId())) {
|
if (productPropertyDO != null && !productPropertyDO.getId().equals(updateReqVO.getId())) {
|
||||||
throw exception(PROPERTY_EXISTS);
|
throw exception(PROPERTY_EXISTS);
|
||||||
@ -71,10 +69,10 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
|
|||||||
@Override
|
@Override
|
||||||
public void deleteProperty(Long id) {
|
public void deleteProperty(Long id) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
this.validatePropertyExists(id);
|
validatePropertyExists(id);
|
||||||
// 删除
|
// 删除
|
||||||
productPropertyMapper.deleteById(id);
|
productPropertyMapper.deleteById(id);
|
||||||
//同步删除属性值
|
// 同步删除属性值
|
||||||
productPropertyValueMapper.deletePropertyValueByPropertyId(id);
|
productPropertyValueMapper.deletePropertyValueByPropertyId(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +91,6 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<ProductPropertyRespVO> getPropertyPage(ProductPropertyPageReqVO pageReqVO) {
|
public PageResult<ProductPropertyRespVO> getPropertyPage(ProductPropertyPageReqVO pageReqVO) {
|
||||||
//获取属性列表
|
|
||||||
PageResult<ProductPropertyDO> pageResult = productPropertyMapper.selectPage(pageReqVO);
|
PageResult<ProductPropertyDO> pageResult = productPropertyMapper.selectPage(pageReqVO);
|
||||||
return ProductPropertyConvert.INSTANCE.convertPage(pageResult);
|
return ProductPropertyConvert.INSTANCE.convertPage(pageResult);
|
||||||
}
|
}
|
||||||
@ -104,11 +101,13 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
|
|||||||
return ProductPropertyConvert.INSTANCE.convert(property);
|
return ProductPropertyConvert.INSTANCE.convert(property);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @芋艿:丢到 Controller
|
||||||
@Override
|
@Override
|
||||||
public List<ProductPropertyRespVO> getPropertyList(Collection<Long> ids) {
|
public List<ProductPropertyRespVO> getPropertyList(Collection<Long> ids) {
|
||||||
return ProductPropertyConvert.INSTANCE.convertList(productPropertyMapper.selectBatchIds(ids));
|
return ProductPropertyConvert.INSTANCE.convertList(productPropertyMapper.selectBatchIds(ids));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @芋艿:丢到 Controller
|
||||||
@Override
|
@Override
|
||||||
public List<ProductPropertyAndValueRespVO> getPropertyAndValueList(ProductPropertyListReqVO listReqVO) {
|
public List<ProductPropertyAndValueRespVO> getPropertyAndValueList(ProductPropertyListReqVO listReqVO) {
|
||||||
List<ProductPropertyRespVO> propertyList = getPropertyList(listReqVO);
|
List<ProductPropertyRespVO> propertyList = getPropertyList(listReqVO);
|
||||||
|
@ -9,16 +9,14 @@ import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.Produc
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* 商品属性值 Service 接口
|
||||||
* 规格值 Service 接口
|
|
||||||
* </p>
|
|
||||||
*
|
*
|
||||||
* @author LuoWenFeng
|
* @author LuoWenFeng
|
||||||
*/
|
*/
|
||||||
public interface ProductPropertyValueService {
|
public interface ProductPropertyValueService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建规格值
|
* 创建属性值
|
||||||
*
|
*
|
||||||
* @param createReqVO 创建信息
|
* @param createReqVO 创建信息
|
||||||
* @return 编号
|
* @return 编号
|
||||||
@ -26,40 +24,40 @@ public interface ProductPropertyValueService {
|
|||||||
Long createPropertyValue(ProductPropertyValueCreateReqVO createReqVO);
|
Long createPropertyValue(ProductPropertyValueCreateReqVO createReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新规格值
|
* 更新属性值
|
||||||
*
|
*
|
||||||
* @param updateReqVO 更新信息
|
* @param updateReqVO 更新信息
|
||||||
*/
|
*/
|
||||||
void updatePropertyValue(ProductPropertyValueUpdateReqVO updateReqVO);
|
void updatePropertyValue(ProductPropertyValueUpdateReqVO updateReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除规格值
|
* 删除属性值
|
||||||
*
|
*
|
||||||
* @param id 编号
|
* @param id 编号
|
||||||
*/
|
*/
|
||||||
void deletePropertyValue(Long id);
|
void deletePropertyValue(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得规格值
|
* 获得属性值
|
||||||
*
|
*
|
||||||
* @param id 编号
|
* @param id 编号
|
||||||
* @return 规格名称
|
* @return 属性值
|
||||||
*/
|
*/
|
||||||
ProductPropertyValueRespVO getPropertyValue(Long id);
|
ProductPropertyValueRespVO getPropertyValue(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得规格值
|
* 获得属性值
|
||||||
*
|
*
|
||||||
* @param id 编号
|
* @param id 编号
|
||||||
* @return 规格名称
|
* @return 属性值
|
||||||
*/
|
*/
|
||||||
List<ProductPropertyValueRespVO> getPropertyValueListByPropertyId(List<Long> id);
|
List<ProductPropertyValueRespVO> getPropertyValueListByPropertyId(List<Long> id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取规格值 分页
|
* 获取属性值的分页
|
||||||
*
|
*
|
||||||
* @param pageReqVO 查询条件
|
* @param pageReqVO 查询条件
|
||||||
* @return
|
* @return 属性值的分页
|
||||||
*/
|
*/
|
||||||
PageResult<ProductPropertyValueRespVO> getPropertyValueListPage(ProductPropertyValuePageReqVO pageReqVO);
|
PageResult<ProductPropertyValueRespVO> getPropertyValueListPage(ProductPropertyValuePageReqVO pageReqVO);
|
||||||
}
|
}
|
||||||
|
@ -14,13 +14,12 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_VALUE_EXISTS;
|
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_VALUE_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值 Service 实现类
|
* 商品属性值 Service 实现类
|
||||||
*
|
*
|
||||||
* @author LuoWenFeng
|
* @author LuoWenFeng
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -84,15 +84,17 @@ public class ProductSkuServiceImpl implements ProductSkuService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1、校验规格属性存在
|
// 1、校验属性项存在
|
||||||
Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null).flatMap(p -> p.getProperties().stream()) // 遍历多个 Property 属性
|
Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null)
|
||||||
.map(ProductSkuBaseVO.Property::getPropertyId).collect(Collectors.toSet()); // 将每个 Property 转换成对应的 propertyId,最后形成集合
|
.flatMap(p -> p.getProperties().stream()) // 遍历多个 Property 属性
|
||||||
|
.map(ProductSkuBaseVO.Property::getPropertyId) // 将每个 Property 转换成对应的 propertyId,最后形成集合
|
||||||
|
.collect(Collectors.toSet());
|
||||||
List<ProductPropertyRespVO> propertyList = productPropertyService.getPropertyList(propertyIds);
|
List<ProductPropertyRespVO> propertyList = productPropertyService.getPropertyList(propertyIds);
|
||||||
if (propertyList.size() != propertyIds.size()) {
|
if (propertyList.size() != propertyIds.size()) {
|
||||||
throw exception(PROPERTY_NOT_EXISTS);
|
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);
|
Map<Long, ProductPropertyValueRespVO> propertyValueMap = CollectionUtils.convertMap(productPropertyValueService.getPropertyValueListByPropertyId(new ArrayList<>(propertyIds)), ProductPropertyValueRespVO::getId);
|
||||||
skus.forEach(sku -> {
|
skus.forEach(sku -> {
|
||||||
Set<Long> skuPropertyIds = convertSet(sku.getProperties(), propertyItem -> propertyValueMap.get(propertyItem.getValueId()).getPropertyId());
|
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();
|
int attrValueIdsSize = skus.get(0).getProperties().size();
|
||||||
for (int i = 1; i < skus.size(); i++) {
|
for (int i = 1; i < skus.size(); i++) {
|
||||||
if (attrValueIdsSize != skus.get(i).getProperties().size()) {
|
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) {
|
public void updateSkus(Long spuId, String spuName, List<ProductSkuCreateOrUpdateReqVO> skus) {
|
||||||
// 查询 SPU 下已经存在的 SKU 的集合
|
// 查询 SPU 下已经存在的 SKU 的集合
|
||||||
List<ProductSkuDO> existsSkus = productSkuMapper.selectListBySpuId(spuId);
|
List<ProductSkuDO> existsSkus = productSkuMapper.selectListBySpuId(spuId);
|
||||||
// 构建规格与 SKU 的映射关系;
|
// 构建属性与 SKU 的映射关系;
|
||||||
// TODO @luowenfeng: 可以下 existsSkuMap2; 会简洁一点; 另外, 可以考虑抽一个小方法, 用于 Properties 生成一个串; 这样 177 也可以复用了
|
// TODO @luowenfeng: 可以下 existsSkuMap2; 会简洁一点; 另外, 可以考虑抽一个小方法, 用于 Properties 生成一个串; 这样 177 也可以复用了
|
||||||
Map<String, Long> existsSkuMap = existsSkus.stream()
|
Map<String, Long> existsSkuMap = existsSkus.stream()
|
||||||
.map(v -> {
|
.map(v -> {
|
||||||
|
@ -133,7 +133,7 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
|||||||
if (null != spu) {
|
if (null != spu) {
|
||||||
List<ProductSpuDetailRespVO.Sku> skuReqs = ProductSkuConvert.INSTANCE.convertList03(productSkuService.getSkusBySpuId(id));
|
List<ProductSpuDetailRespVO.Sku> skuReqs = ProductSkuConvert.INSTANCE.convertList03(productSkuService.getSkusBySpuId(id));
|
||||||
respVO.setSkus(skuReqs);
|
respVO.setSkus(skuReqs);
|
||||||
// 组合 sku 规格属性
|
// 组合 sku 属性
|
||||||
if (spu.getSpecType().equals(ProductSpuSpecTypeEnum.DISABLE.getType())) {
|
if (spu.getSpecType().equals(ProductSpuSpecTypeEnum.DISABLE.getType())) {
|
||||||
List<ProductSkuRespVO.Property> properties = new ArrayList<>();
|
List<ProductSkuRespVO.Property> properties = new ArrayList<>();
|
||||||
for (ProductSpuDetailRespVO.Sku productSkuRespVO : skuReqs) {
|
for (ProductSpuDetailRespVO.Sku productSkuRespVO : skuReqs) {
|
||||||
|
@ -265,7 +265,7 @@ public class PriceServiceImpl implements PriceService {
|
|||||||
|
|
||||||
private void calculatePriceByRewardActivity(PriceCalculateRespDTO priceCalculate, List<PriceCalculateRespDTO.OrderItem> orderItems,
|
private void calculatePriceByRewardActivity(PriceCalculateRespDTO priceCalculate, List<PriceCalculateRespDTO.OrderItem> orderItems,
|
||||||
RewardActivityDO rewardActivity) {
|
RewardActivityDO rewardActivity) {
|
||||||
// 获得最大匹配的满减送活动的规格
|
// 获得最大匹配的满减送活动的规则
|
||||||
RewardActivityDO.Rule rule = getLastMatchRewardActivityRule(rewardActivity, orderItems);
|
RewardActivityDO.Rule rule = getLastMatchRewardActivityRule(rewardActivity, orderItems);
|
||||||
if (rule == null) {
|
if (rule == null) {
|
||||||
// 获取不到的情况下,记录不满足的优惠明细
|
// 获取不到的情况下,记录不满足的优惠明细
|
||||||
@ -288,11 +288,11 @@ public class PriceServiceImpl implements PriceService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得最大匹配的满减送活动的规格
|
* 获得最大匹配的满减送活动的规则
|
||||||
*
|
*
|
||||||
* @param rewardActivity 满减送活动
|
* @param rewardActivity 满减送活动
|
||||||
* @param orderItems 商品项
|
* @param orderItems 商品项
|
||||||
* @return 匹配的活动规格
|
* @return 匹配的活动规则
|
||||||
*/
|
*/
|
||||||
private RewardActivityDO.Rule getLastMatchRewardActivityRule(RewardActivityDO rewardActivity,
|
private RewardActivityDO.Rule getLastMatchRewardActivityRule(RewardActivityDO rewardActivity,
|
||||||
List<PriceCalculateRespDTO.OrderItem> orderItems) {
|
List<PriceCalculateRespDTO.OrderItem> orderItems) {
|
||||||
|
@ -72,7 +72,7 @@ public class TradeAfterSaleBaseVO {
|
|||||||
@NotNull(message = "商品 SKU 编号不能为空")
|
@NotNull(message = "商品 SKU 编号不能为空")
|
||||||
private Long skuId;
|
private Long skuId;
|
||||||
|
|
||||||
@ApiModelProperty(value = "规格值数组")
|
@ApiModelProperty(value = "商品属性数组")
|
||||||
private List<ProductPropertyValueDetailRespVO> properties;
|
private List<ProductPropertyValueDetailRespVO> properties;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品图片", example = "https://www.iocoder.cn/2.png")
|
@ApiModelProperty(value = "商品图片", example = "https://www.iocoder.cn/2.png")
|
||||||
|
@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
|
|||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 商品规格 + 规格值的明细 Response VO")
|
@ApiModel("管理后台 - 商品属性值的明细 Response VO")
|
||||||
@Data
|
@Data
|
||||||
public class ProductPropertyValueDetailRespVO {
|
public class ProductPropertyValueDetailRespVO {
|
||||||
|
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
package cn.iocoder.yudao.module.trade.controller.admin.order;
|
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.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.TradeOrderDeliveryReqVO;
|
||||||
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageItemRespVO;
|
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.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.TradeOrderDO;
|
||||||
|
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
|
||||||
import cn.iocoder.yudao.module.trade.service.order.TradeOrderService;
|
import cn.iocoder.yudao.module.trade.service.order.TradeOrderService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
@ -15,8 +18,11 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
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.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;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
|
|
||||||
@Api(tags = "管理后台 - 交易订单")
|
@Api(tags = "管理后台 - 交易订单")
|
||||||
@ -33,7 +39,19 @@ public class TradeOrderController {
|
|||||||
@ApiOperation("获得交易订单分页")
|
@ApiOperation("获得交易订单分页")
|
||||||
@PreAuthorize("@ss.hasPermission('trade:order:query')")
|
@PreAuthorize("@ss.hasPermission('trade:order:query')")
|
||||||
public CommonResult<PageResult<TradeOrderPageItemRespVO>> getOrderPage(TradeOrderPageReqVO reqVO) {
|
public CommonResult<PageResult<TradeOrderPageItemRespVO>> getOrderPage(TradeOrderPageReqVO reqVO) {
|
||||||
|
// 查询订单
|
||||||
PageResult<TradeOrderDO> pageResult = tradeOrderService.getOrderPage(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);
|
return success(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ public class TradeOrderPageItemRespVO {
|
|||||||
public static class Item extends TradeOrderItemBaseVO {
|
public static class Item extends TradeOrderItemBaseVO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值数组
|
* 属性数组
|
||||||
*/
|
*/
|
||||||
private List<ProductPropertyValueDetailRespVO> properties;
|
private List<ProductPropertyValueDetailRespVO> properties;
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.trade.controller.admin.order.vo;
|
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.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
|
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
@ -8,7 +9,7 @@ import lombok.Data;
|
|||||||
|
|
||||||
@ApiModel("管理后台 - 交易订单的分页 Request VO")
|
@ApiModel("管理后台 - 交易订单的分页 Request VO")
|
||||||
@Data
|
@Data
|
||||||
public class TradeOrderPageReqVO {
|
public class TradeOrderPageReqVO extends PageParam {
|
||||||
|
|
||||||
@ApiModelProperty(value = "订单状态", example = "1", notes = "参见 TradeOrderStatusEnum 枚举")
|
@ApiModelProperty(value = "订单状态", example = "1", notes = "参见 TradeOrderStatusEnum 枚举")
|
||||||
@InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}")
|
@InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}")
|
||||||
|
@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModel;
|
|||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@ApiModel("用户 App - 商品规格 + 规格值的明细 Response VO")
|
@ApiModel("用户 App - 商品属性值的明细 Response VO")
|
||||||
@Data
|
@Data
|
||||||
public class AppProductPropertyValueDetailRespVO {
|
public class AppProductPropertyValueDetailRespVO {
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ public class AppProductSkuBaseRespVO {
|
|||||||
private Integer stock;
|
private Integer stock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格数组
|
* 属性数组
|
||||||
*/
|
*/
|
||||||
private List<AppProductPropertyValueDetailRespVO> properties;
|
private List<AppProductPropertyValueDetailRespVO> properties;
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ public class AppTradeOrderGetCreateInfoRespVO {
|
|||||||
*/
|
*/
|
||||||
private String picURL;
|
private String picURL;
|
||||||
// /**
|
// /**
|
||||||
// * 规格值数组
|
// * 属性数组
|
||||||
// */
|
// */
|
||||||
// private List<ProductAttrKeyValueRespVO> attrs; // TODO 后面改下
|
// private List<ProductAttrKeyValueRespVO> attrs; // TODO 后面改下
|
||||||
/**
|
/**
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.trade.convert.order;
|
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.framework.common.util.collection.CollectionUtils;
|
||||||
import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
|
import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
|
||||||
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
|
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.Mappings;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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.collection.CollectionUtils.convertMap;
|
||||||
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime;
|
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime;
|
||||||
@ -88,4 +92,14 @@ public interface TradeOrderConvert {
|
|||||||
return createReqDTO;
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -120,7 +120,7 @@ public class TradeAfterSaleDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private Long skuId;
|
private Long skuId;
|
||||||
/**
|
/**
|
||||||
* 规格值数组,JSON 格式
|
* 属性数组,JSON 格式
|
||||||
*
|
*
|
||||||
* 冗余 {@link TradeOrderItemDO#getProperties()}
|
* 冗余 {@link TradeOrderItemDO#getProperties()}
|
||||||
*/
|
*/
|
||||||
|
@ -63,7 +63,7 @@ public class TradeOrderItemDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private Long skuId;
|
private Long skuId;
|
||||||
/**
|
/**
|
||||||
* 规格值数组,JSON 格式
|
* 属性数组,JSON 格式
|
||||||
*
|
*
|
||||||
* 冗余 ProductSkuDO 的 properties 字段
|
* 冗余 ProductSkuDO 的 properties 字段
|
||||||
*/
|
*/
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package cn.iocoder.yudao.module.trade.dal.mysql.order;
|
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.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 cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
@ -14,8 +17,12 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default TradeOrderDO selectByIdAndUserId(Long id, Long userId) {
|
default TradeOrderDO selectByIdAndUserId(Long id, Long userId) {
|
||||||
return selectOne(TradeOrderDO::getId, id,
|
return selectOne(TradeOrderDO::getId, id, TradeOrderDO::getUserId, userId);
|
||||||
TradeOrderDO::getUserId, userId);
|
}
|
||||||
|
|
||||||
|
default PageResult<TradeOrderDO> selectPage(TradeOrderPageReqVO reqVO) {
|
||||||
|
return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>()
|
||||||
|
.eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.TradeOrderDO;
|
||||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
|
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 接口
|
* 交易订单 Service 接口
|
||||||
*
|
*
|
||||||
@ -90,4 +96,23 @@ public interface TradeOrderService {
|
|||||||
void updateOrderItemAfterSaleStatus(Long id, Integer oldAfterSaleStatus,
|
void updateOrderItemAfterSaleStatus(Long id, Integer oldAfterSaleStatus,
|
||||||
Integer newAfterSaleStatus, Integer refundPrice);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -43,10 +43,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
||||||
@ -423,7 +420,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) {
|
public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) {
|
||||||
return null;
|
return tradeOrderMapper.selectPage(reqVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
// =================== Order Item ===================
|
// =================== Order Item ===================
|
||||||
@ -475,6 +472,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|||||||
// TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效
|
// TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<TradeOrderItemDO> getOrderItems(Collection<Long> ids) {
|
||||||
|
return tradeOrderItemMapper.selectBatchIds(ids);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断指定订单的所有订单项,是不是都售后成功
|
* 判断指定订单的所有订单项,是不是都售后成功
|
||||||
*
|
*
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
|
|
||||||
// 创建规格名称
|
// ------------------------ 属性项 -------------------
|
||||||
|
|
||||||
|
// 创建属性项
|
||||||
export function createProperty(data) {
|
export function createProperty(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/create',
|
url: '/product/property/create',
|
||||||
@ -9,7 +11,7 @@ export function createProperty(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新规格名称
|
// 更新属性项
|
||||||
export function updateProperty(data) {
|
export function updateProperty(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/update',
|
url: '/product/property/update',
|
||||||
@ -18,7 +20,7 @@ export function updateProperty(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除规格名称
|
// 删除属性项
|
||||||
export function deleteProperty(id) {
|
export function deleteProperty(id) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/delete?id=' + id,
|
url: '/product/property/delete?id=' + id,
|
||||||
@ -26,7 +28,7 @@ export function deleteProperty(id) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得规格名称
|
// 获得属性项
|
||||||
export function getProperty(id) {
|
export function getProperty(id) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/get?id=' + id,
|
url: '/product/property/get?id=' + id,
|
||||||
@ -34,7 +36,7 @@ export function getProperty(id) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得规格名称分页
|
// 获得属性项分页
|
||||||
export function getPropertyPage(query) {
|
export function getPropertyPage(query) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/page',
|
url: '/product/property/page',
|
||||||
@ -43,7 +45,7 @@ export function getPropertyPage(query) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得规格名称列表
|
// 获得属性项列表
|
||||||
export function getPropertyList(query) {
|
export function getPropertyList(query) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/list',
|
url: '/product/property/list',
|
||||||
@ -52,7 +54,7 @@ export function getPropertyList(query) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得规格名称列表
|
// 获得属性项列表
|
||||||
export function getPropertyListAndValue(query) {
|
export function getPropertyListAndValue(query) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/listAndValue',
|
url: '/product/property/listAndValue',
|
||||||
@ -62,7 +64,7 @@ export function getPropertyListAndValue(query) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 导出规格名称 Excel
|
// 导出属性项 Excel
|
||||||
export function exportPropertyExcel(query) {
|
export function exportPropertyExcel(query) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/export-excel',
|
url: '/product/property/export-excel',
|
||||||
@ -72,9 +74,9 @@ export function exportPropertyExcel(query) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------ 规格名称值 -------------------
|
// ------------------------ 属性值 -------------------
|
||||||
|
|
||||||
// 获得规格名称值分页
|
// 获得属性值分页
|
||||||
export function getPropertyValuePage(query) {
|
export function getPropertyValuePage(query) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/value/page',
|
url: '/product/property/value/page',
|
||||||
@ -83,7 +85,7 @@ export function getPropertyValuePage(query) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得规格名称值
|
// 获得属性值
|
||||||
export function getPropertyValue(id) {
|
export function getPropertyValue(id) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/value/get?id=' + id,
|
url: '/product/property/value/get?id=' + id,
|
||||||
@ -92,7 +94,7 @@ export function getPropertyValue(id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 创建规格名称值
|
// 创建属性值
|
||||||
export function createPropertyValue(data) {
|
export function createPropertyValue(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/value/create',
|
url: '/product/property/value/create',
|
||||||
@ -101,7 +103,7 @@ export function createPropertyValue(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新规格名称值
|
// 更新属性值
|
||||||
export function updatePropertyValue(data) {
|
export function updatePropertyValue(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/value/update',
|
url: '/product/property/value/update',
|
||||||
@ -110,7 +112,7 @@ export function updatePropertyValue(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除规格名称
|
// 删除属性值
|
||||||
export function deletePropertyValue(id) {
|
export function deletePropertyValue(id) {
|
||||||
return request({
|
return request({
|
||||||
url: '/product/property/value/delete?id=' + id,
|
url: '/product/property/value/delete?id=' + id,
|
||||||
|
@ -106,7 +106,7 @@ export const constantRoutes = [
|
|||||||
path: 'value/:propertyId(\\d+)',
|
path: 'value/:propertyId(\\d+)',
|
||||||
component: (resolve) => require(['@/views/mall/product/property/value'], resolve),
|
component: (resolve) => require(['@/views/mall/product/property/value'], resolve),
|
||||||
name: 'PropertyValue',
|
name: 'PropertyValue',
|
||||||
meta: {title: '规格数据', icon: '', activeMenu: '/product/property'}
|
meta: {title: '商品属性值', icon: '', activeMenu: '/product/property'}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="规格名称" prop="name">
|
<el-form-item label="名称" prop="name">
|
||||||
<el-input v-model="queryParams.name" placeholder="请输入规格名称" clearable @keyup.enter.native="handleQuery"/>
|
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter.native="handleQuery"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="请选择开启状态" clearable size="small">
|
<el-select v-model="queryParams.status" placeholder="请选择开启状态" clearable size="small">
|
||||||
@ -33,8 +33,8 @@
|
|||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="规格id" align="center" prop="id" />
|
<el-table-column label="编号" align="center" prop="id" />
|
||||||
<el-table-column label="规格名称" align="center" :show-overflow-tooltip="true">
|
<el-table-column label="名称" align="center" :show-overflow-tooltip="true">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<router-link :to="'/property/value/' + scope.row.id" class="link-type">
|
<router-link :to="'/property/value/' + scope.row.id" class="link-type">
|
||||||
<span>{{ scope.row.name }}</span>
|
<span>{{ scope.row.name }}</span>
|
||||||
@ -68,13 +68,13 @@
|
|||||||
<!-- 对话框(添加 / 修改) -->
|
<!-- 对话框(添加 / 修改) -->
|
||||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
<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 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-input v-model="form.id" disabled />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="规格名称" prop="name">
|
<el-form-item label="名称" prop="name">
|
||||||
<el-input v-model="form.name" placeholder="请输入规格名称" />
|
<el-input v-model="form.name" placeholder="请输入名称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="开启状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-radio-group v-model="form.status">
|
<el-radio-group v-model="form.status">
|
||||||
<el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
|
<el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
|
||||||
:key="dict.value" :label="parseInt(dict.value)">{{ dict.label }}
|
:key="dict.value" :label="parseInt(dict.value)">{{ dict.label }}
|
||||||
@ -110,7 +110,7 @@ export default {
|
|||||||
showSearch: true,
|
showSearch: true,
|
||||||
// 总条数
|
// 总条数
|
||||||
total: 0,
|
total: 0,
|
||||||
// 规格名称列表
|
// 属性项列表
|
||||||
list: [],
|
list: [],
|
||||||
// 弹出层标题
|
// 弹出层标题
|
||||||
title: "",
|
title: "",
|
||||||
@ -134,7 +134,7 @@ export default {
|
|||||||
// 表单校验
|
// 表单校验
|
||||||
rules: {
|
rules: {
|
||||||
name: [
|
name: [
|
||||||
{ required: true, message: "规格不能为空", trigger: "blur" }
|
{ required: true, message: "名称不能为空", trigger: "blur" }
|
||||||
],
|
],
|
||||||
status: [
|
status: [
|
||||||
{ required: true, message: "状态不能为空", trigger: "blur" }
|
{ required: true, message: "状态不能为空", trigger: "blur" }
|
||||||
@ -185,7 +185,7 @@ export default {
|
|||||||
handleAdd() {
|
handleAdd() {
|
||||||
this.reset();
|
this.reset();
|
||||||
this.open = true;
|
this.open = true;
|
||||||
this.title = "添加规格";
|
this.title = "添加属性项";
|
||||||
},
|
},
|
||||||
/** 修改按钮操作 */
|
/** 修改按钮操作 */
|
||||||
handleUpdate(row) {
|
handleUpdate(row) {
|
||||||
@ -194,7 +194,7 @@ export default {
|
|||||||
getProperty(id).then(response => {
|
getProperty(id).then(response => {
|
||||||
this.form = response.data;
|
this.form = response.data;
|
||||||
this.open = true;
|
this.open = true;
|
||||||
this.title = "修改规格";
|
this.title = "修改属性项";
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
/** 提交按钮 */
|
/** 提交按钮 */
|
||||||
@ -223,7 +223,7 @@ export default {
|
|||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
handleDelete(row) {
|
handleDelete(row) {
|
||||||
const id = row.id;
|
const id = row.id;
|
||||||
this.$modal.confirm('是否确认删除规格名称为"' + row.name + '"的数据项?').then(function() {
|
this.$modal.confirm('是否确认删除名称为"' + row.name + '"的数据项?').then(function() {
|
||||||
return deleteProperty(id);
|
return deleteProperty(id);
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.getList();
|
this.getList();
|
||||||
@ -237,11 +237,11 @@ export default {
|
|||||||
params.pageNo = undefined;
|
params.pageNo = undefined;
|
||||||
params.pageSize = undefined;
|
params.pageSize = undefined;
|
||||||
// 执行导出
|
// 执行导出
|
||||||
this.$modal.confirm('是否确认导出所有规格名称数据项?').then(() => {
|
this.$modal.confirm('是否确认导出所有名称数据项?').then(() => {
|
||||||
this.exportLoading = true;
|
this.exportLoading = true;
|
||||||
return exportPropertyExcel(params);
|
return exportPropertyExcel(params);
|
||||||
}).then(response => {
|
}).then(response => {
|
||||||
this.$download.excel(response, '规格名称.xls');
|
this.$download.excel(response, '名称.xls');
|
||||||
this.exportLoading = false;
|
this.exportLoading = false;
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
},
|
},
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
<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-select v-model="queryParams.propertyId">
|
||||||
<el-option v-for="item in propertyOptions" :key="item.id" :label="item.id +'-'+ item.name" :value="item.id"/>
|
<el-option v-for="item in propertyOptions" :key="item.id" :label="item.id +'-'+ item.name" :value="item.id"/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="规格值" prop="name">
|
<el-form-item label="名称" prop="name">
|
||||||
<el-input v-model="queryParams.name" placeholder="请输入规格值" clearable @keyup.enter.native="handleQuery"/>
|
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter.native="handleQuery"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="状态" clearable size="small">
|
<el-select v-model="queryParams.status" placeholder="状态" clearable size="small">
|
||||||
@ -35,8 +35,8 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="dataList">
|
<el-table v-loading="loading" :data="dataList">
|
||||||
<el-table-column label="规格值id" align="center" prop="id"/>
|
<el-table-column label="编号" align="center" prop="id"/>
|
||||||
<el-table-column label="规格值" align="center" prop="name"/>
|
<el-table-column label="名称" align="center" prop="name"/>
|
||||||
<el-table-column label="状态" align="center" prop="status">
|
<el-table-column label="状态" align="center" prop="status">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
|
<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-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="90px">
|
<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-input v-model="form.propertyId" :disabled="true"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="规格值" prop="name">
|
<el-form-item label="名称" prop="name">
|
||||||
<el-input v-model="form.name" placeholder="请输入数据标签"/>
|
<el-input v-model="form.name" placeholder="请输入名称"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-radio-group v-model="form.status">
|
<el-radio-group v-model="form.status">
|
||||||
@ -137,7 +137,7 @@ export default {
|
|||||||
// 表单校验
|
// 表单校验
|
||||||
rules: {
|
rules: {
|
||||||
name: [
|
name: [
|
||||||
{required: true, message: "规格值不能为空", trigger: "blur"}
|
{required: true, message: "名称不能为空", trigger: "blur"}
|
||||||
],
|
],
|
||||||
status: [
|
status: [
|
||||||
{required: true, message: "状态不能为空", trigger: "blur"}
|
{required: true, message: "状态不能为空", trigger: "blur"}
|
||||||
@ -206,7 +206,7 @@ export default {
|
|||||||
handleAdd() {
|
handleAdd() {
|
||||||
this.reset();
|
this.reset();
|
||||||
this.open = true;
|
this.open = true;
|
||||||
this.title = "添加规格值";
|
this.title = "添加属性值";
|
||||||
this.form.propertyId = this.queryParams.propertyId;
|
this.form.propertyId = this.queryParams.propertyId;
|
||||||
},
|
},
|
||||||
/** 修改按钮操作 */
|
/** 修改按钮操作 */
|
||||||
@ -216,7 +216,7 @@ export default {
|
|||||||
getPropertyValue(id).then(response => {
|
getPropertyValue(id).then(response => {
|
||||||
this.form = response.data;
|
this.form = response.data;
|
||||||
this.open = true;
|
this.open = true;
|
||||||
this.title = "修改规格值";
|
this.title = "修改属性值";
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
/** 提交按钮 */
|
/** 提交按钮 */
|
||||||
|
Loading…
Reference in New Issue
Block a user