Commit 4207b2b61d6c8b0573b2ceb2e62db9bd8884a7df

Authored by luowenfeng
1 parent 4a39f2d9

feature(uniapp商品): 商品加载

yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/brand/ProductBrandController.java
@@ -5,8 +5,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -5,8 +5,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 5 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; 6 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7 import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*; 7 import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*;
  8 +import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
  9 +import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryRespVO;
8 import cn.iocoder.yudao.module.product.convert.brand.ProductBrandConvert; 10 import cn.iocoder.yudao.module.product.convert.brand.ProductBrandConvert;
  11 +import cn.iocoder.yudao.module.product.convert.category.ProductCategoryConvert;
9 import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO; 12 import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
  13 +import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
10 import cn.iocoder.yudao.module.product.service.brand.ProductBrandService; 14 import cn.iocoder.yudao.module.product.service.brand.ProductBrandService;
11 import io.swagger.annotations.Api; 15 import io.swagger.annotations.Api;
12 import io.swagger.annotations.ApiImplicitParam; 16 import io.swagger.annotations.ApiImplicitParam;
@@ -19,6 +23,7 @@ import javax.annotation.Resource; @@ -19,6 +23,7 @@ import javax.annotation.Resource;
19 import javax.servlet.http.HttpServletResponse; 23 import javax.servlet.http.HttpServletResponse;
20 import javax.validation.Valid; 24 import javax.validation.Valid;
21 import java.io.IOException; 25 import java.io.IOException;
  26 +import java.util.Comparator;
22 import java.util.List; 27 import java.util.List;
23 28
24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 29 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -74,4 +79,14 @@ public class ProductBrandController { @@ -74,4 +79,14 @@ public class ProductBrandController {
74 return success(ProductBrandConvert.INSTANCE.convertPage(pageResult)); 79 return success(ProductBrandConvert.INSTANCE.convertPage(pageResult));
75 } 80 }
76 81
  82 + @GetMapping("/list")
  83 + @ApiOperation("获得品牌列表")
  84 + @PreAuthorize("@ss.hasPermission('product:brand:query')")
  85 + public CommonResult<List<ProductBrandRespVO>> getProductCategoryList(@Valid ProductBrandListReqVO listVO) {
  86 + List<ProductBrandDO> list = brandService.getBrandList(listVO);
  87 + list.sort(Comparator.comparing(ProductBrandDO::getSort));
  88 + return success(ProductBrandConvert.INSTANCE.convertList(list));
  89 + }
  90 +
  91 +
77 } 92 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/brand/vo/ProductBrandListReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.product.controller.admin.brand.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +@ApiModel(value = "管理后台 - 商品品牌分页 Request VO")
  8 +@Data
  9 +public class ProductBrandListReqVO {
  10 +
  11 + @ApiModelProperty(value = "品牌名称", example = "芋道")
  12 + private String name;
  13 +
  14 +}
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java
@@ -40,7 +40,7 @@ public class ProductSkuDO extends BaseDO { @@ -40,7 +40,7 @@ public class ProductSkuDO extends BaseDO {
40 private String name; 40 private String name;
41 /** 41 /**
42 * SPU 编号 42 * SPU 编号
43 - * 43 + * <p>
44 * 关联 {@link ProductSpuDO#getId()} 44 * 关联 {@link ProductSpuDO#getId()}
45 */ 45 */
46 private Long spuId; 46 private Long spuId;
@@ -71,7 +71,7 @@ public class ProductSkuDO extends BaseDO { @@ -71,7 +71,7 @@ public class ProductSkuDO extends BaseDO {
71 private String picUrl; 71 private String picUrl;
72 /** 72 /**
73 * SKU 状态 73 * SKU 状态
74 - * 74 + * <p>
75 * 枚举 {@link CommonStatusEnum} 75 * 枚举 {@link CommonStatusEnum}
76 */ 76 */
77 private Integer status; 77 private Integer status;
@@ -100,13 +100,13 @@ public class ProductSkuDO extends BaseDO { @@ -100,13 +100,13 @@ public class ProductSkuDO extends BaseDO {
100 100
101 /** 101 /**
102 * 属性编号 102 * 属性编号
103 - * 103 + * <p>
104 * 关联 {@link ProductPropertyDO#getId()} 104 * 关联 {@link ProductPropertyDO#getId()}
105 */ 105 */
106 private Long propertyId; 106 private Long propertyId;
107 /** 107 /**
108 * 属性值编号 108 * 属性值编号
109 - * 109 + * <p>
110 * 关联 {@link ProductPropertyValueDO#getId()} 110 * 关联 {@link ProductPropertyValueDO#getId()}
111 */ 111 */
112 private Long valueId; 112 private Long valueId;
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/brand/ProductBrandMapper.java
@@ -3,10 +3,14 @@ package cn.iocoder.yudao.module.product.dal.mysql.brand; @@ -3,10 +3,14 @@ package cn.iocoder.yudao.module.product.dal.mysql.brand;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandBaseVO;
  7 +import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandListReqVO;
6 import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandPageReqVO; 8 import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandPageReqVO;
7 import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO; 9 import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
8 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
9 11
  12 +import java.util.List;
  13 +
10 @Mapper 14 @Mapper
11 public interface ProductBrandMapper extends BaseMapperX<ProductBrandDO> { 15 public interface ProductBrandMapper extends BaseMapperX<ProductBrandDO> {
12 16
@@ -18,4 +22,9 @@ public interface ProductBrandMapper extends BaseMapperX&lt;ProductBrandDO&gt; { @@ -18,4 +22,9 @@ public interface ProductBrandMapper extends BaseMapperX&lt;ProductBrandDO&gt; {
18 .orderByDesc(ProductBrandDO::getId)); 22 .orderByDesc(ProductBrandDO::getId));
19 } 23 }
20 24
  25 +
  26 + default List<ProductBrandDO> selectList(ProductBrandListReqVO reqVO) {
  27 + return selectList(new LambdaQueryWrapperX<ProductBrandDO>()
  28 + .likeIfPresent(ProductBrandDO::getName, reqVO.getName()));
  29 + }
21 } 30 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandService.java
1 package cn.iocoder.yudao.module.product.service.brand; 1 package cn.iocoder.yudao.module.product.service.brand;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO;  
5 -import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandPageReqVO;  
6 -import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandUpdateReqVO; 4 +import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*;
7 import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO; 5 import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
8 6
9 import javax.validation.Valid; 7 import javax.validation.Valid;
@@ -56,6 +54,20 @@ public interface ProductBrandService { @@ -56,6 +54,20 @@ public interface ProductBrandService {
56 List<ProductBrandDO> getBrandList(Collection<Long> ids); 54 List<ProductBrandDO> getBrandList(Collection<Long> ids);
57 55
58 /** 56 /**
  57 + * 获得品牌列表
  58 + * @param listVo 请求参数
  59 + * @return 品牌列表
  60 + */
  61 + List<ProductBrandDO> getBrandList(ProductBrandListReqVO listVo);
  62 +
  63 + /**
  64 + * 验证选择的商品分类是否合法
  65 + *
  66 + * @param id 分类编号
  67 + */
  68 + void validateProductBrand(Long id);
  69 +
  70 + /**
59 * 获得品牌分页 71 * 获得品牌分页
60 * 72 *
61 * @param pageReqVO 分页查询 73 * @param pageReqVO 分页查询
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandServiceImpl.java
1 package cn.iocoder.yudao.module.product.service.brand; 1 package cn.iocoder.yudao.module.product.service.brand;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO;  
5 -import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandPageReqVO;  
6 -import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandUpdateReqVO; 4 +import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*;
7 import cn.iocoder.yudao.module.product.convert.brand.ProductBrandConvert; 5 import cn.iocoder.yudao.module.product.convert.brand.ProductBrandConvert;
8 import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO; 6 import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
9 import cn.iocoder.yudao.module.product.dal.mysql.brand.ProductBrandMapper; 7 import cn.iocoder.yudao.module.product.dal.mysql.brand.ProductBrandMapper;
  8 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 import org.springframework.stereotype.Service; 9 import org.springframework.stereotype.Service;
11 import org.springframework.validation.annotation.Validated; 10 import org.springframework.validation.annotation.Validated;
12 11
@@ -16,6 +15,7 @@ import java.util.List; @@ -16,6 +15,7 @@ import java.util.List;
16 15
17 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 16 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
18 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PRODUCT_BRAND_NOT_EXISTS; 17 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PRODUCT_BRAND_NOT_EXISTS;
  18 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PRODUCT_CATEGORY_LEVEL;
19 19
20 /** 20 /**
21 * 品牌 Service 实现类 21 * 品牌 Service 实现类
@@ -72,6 +72,18 @@ public class ProductBrandServiceImpl implements ProductBrandService { @@ -72,6 +72,18 @@ public class ProductBrandServiceImpl implements ProductBrandService {
72 } 72 }
73 73
74 @Override 74 @Override
  75 + public List<ProductBrandDO> getBrandList(ProductBrandListReqVO listVo) {
  76 + return brandMapper.selectList(listVo);
  77 + }
  78 +
  79 + @Override
  80 + public void validateProductBrand(Long id) {
  81 + if(getBrand(id) == null){
  82 + throw exception(PRODUCT_BRAND_NOT_EXISTS);
  83 + }
  84 + }
  85 +
  86 + @Override
75 public PageResult<ProductBrandDO> getBrandPage(ProductBrandPageReqVO pageReqVO) { 87 public PageResult<ProductBrandDO> getBrandPage(ProductBrandPageReqVO pageReqVO) {
76 return brandMapper.selectPage(pageReqVO); 88 return brandMapper.selectPage(pageReqVO);
77 } 89 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
@@ -140,7 +140,8 @@ public class ProductSkuServiceImpl implements ProductSkuService { @@ -140,7 +140,8 @@ public class ProductSkuServiceImpl implements ProductSkuService {
140 140
141 @Override 141 @Override
142 public List<ProductSkuDO> getSkusBySpuId(Long spuId) { 142 public List<ProductSkuDO> getSkusBySpuId(Long spuId) {
143 - return productSkuMapper.selectBySpuIds(Collections.singletonList(spuId)); 143 + List<ProductSkuDO> productSkuDOS = productSkuMapper.selectBySpuIds(Collections.singletonList(spuId));
  144 + return productSkuDOS;
144 } 145 }
145 146
146 @Override 147 @Override
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
@@ -20,6 +20,7 @@ import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; @@ -20,6 +20,7 @@ import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
20 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 20 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
21 import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; 21 import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper;
22 import cn.iocoder.yudao.module.product.enums.spu.ProductSpuSpecTypeEnum; 22 import cn.iocoder.yudao.module.product.enums.spu.ProductSpuSpecTypeEnum;
  23 +import cn.iocoder.yudao.module.product.service.brand.ProductBrandService;
23 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService; 24 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService;
24 import cn.iocoder.yudao.module.product.service.property.ProductPropertyService; 25 import cn.iocoder.yudao.module.product.service.property.ProductPropertyService;
25 import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; 26 import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
@@ -55,17 +56,19 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -55,17 +56,19 @@ public class ProductSpuServiceImpl implements ProductSpuService {
55 @Resource 56 @Resource
56 private ProductPropertyService productPropertyService; 57 private ProductPropertyService productPropertyService;
57 58
  59 + @Resource
  60 + private ProductBrandService brandService;
  61 +
58 @Override 62 @Override
59 @Transactional 63 @Transactional
60 public Long createProductSpu(ProductSpuCreateReqVO createReqVO) { 64 public Long createProductSpu(ProductSpuCreateReqVO createReqVO) {
61 // 校验分类 65 // 校验分类
62 categoryService.validateProductCategory(createReqVO.getCategoryId()); 66 categoryService.validateProductCategory(createReqVO.getCategoryId());
63 - // TODO @:校验品牌  
64 - 67 + // 校验品牌
  68 + brandService.validateProductBrand(createReqVO.getBrandId());
65 // 校验SKU 69 // 校验SKU
66 List<ProductSkuCreateOrUpdateReqVO> skuCreateReqList = createReqVO.getSkus(); 70 List<ProductSkuCreateOrUpdateReqVO> skuCreateReqList = createReqVO.getSkus();
67 productSkuService.validateProductSkus(skuCreateReqList, createReqVO.getSpecType()); 71 productSkuService.validateProductSkus(skuCreateReqList, createReqVO.getSpecType());
68 -  
69 // 插入 SPU 72 // 插入 SPU
70 ProductSpuDO spu = ProductSpuConvert.INSTANCE.convert(createReqVO); 73 ProductSpuDO spu = ProductSpuConvert.INSTANCE.convert(createReqVO);
71 spu.setMarketPrice(CollectionUtils.getMaxValue(skuCreateReqList, ProductSkuCreateOrUpdateReqVO::getMarketPrice)); 74 spu.setMarketPrice(CollectionUtils.getMaxValue(skuCreateReqList, ProductSkuCreateOrUpdateReqVO::getMarketPrice));
@@ -73,7 +76,6 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -73,7 +76,6 @@ public class ProductSpuServiceImpl implements ProductSpuService {
73 spu.setMinPrice(CollectionUtils.getMinValue(skuCreateReqList, ProductSkuCreateOrUpdateReqVO::getPrice)); 76 spu.setMinPrice(CollectionUtils.getMinValue(skuCreateReqList, ProductSkuCreateOrUpdateReqVO::getPrice));
74 spu.setTotalStock(CollectionUtils.getSumValue(skuCreateReqList, ProductSkuCreateOrUpdateReqVO::getStock, Integer::sum)); 77 spu.setTotalStock(CollectionUtils.getSumValue(skuCreateReqList, ProductSkuCreateOrUpdateReqVO::getStock, Integer::sum));
75 ProductSpuMapper.insert(spu); 78 ProductSpuMapper.insert(spu);
76 -  
77 // 插入 SKU 79 // 插入 SKU
78 productSkuService.createProductSkus(skuCreateReqList, spu.getId()); 80 productSkuService.createProductSkus(skuCreateReqList, spu.getId());
79 // 返回 81 // 返回
@@ -128,27 +130,29 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -128,27 +130,29 @@ public class ProductSpuServiceImpl implements ProductSpuService {
128 spuVO.setSkus(skuReqs); 130 spuVO.setSkus(skuReqs);
129 List<ProductSkuRespVO.Property> properties = new ArrayList<>(); 131 List<ProductSkuRespVO.Property> properties = new ArrayList<>();
130 // 组合 sku 规格属性 132 // 组合 sku 规格属性
131 - for (ProductSkuRespVO productSkuRespVO : skuReqs) {  
132 - properties.addAll(productSkuRespVO.getProperties());  
133 - }  
134 - Map<Long, List<ProductSkuBaseVO.Property>> propertyMaps = properties.stream().collect(Collectors.groupingBy(ProductSkuBaseVO.Property::getPropertyId));  
135 - List<ProductPropertyRespVO> propertyAndValueList = productPropertyService.selectByIds(new ArrayList<>(propertyMaps.keySet()));  
136 - // 装载组装过后的属性  
137 - List<ProductPropertyViewRespVO> productPropertyViews = new ArrayList<>();  
138 - propertyAndValueList.forEach(p -> {  
139 - ProductPropertyViewRespVO productPropertyViewRespVO = new ProductPropertyViewRespVO();  
140 - productPropertyViewRespVO.setPropertyId(p.getId());  
141 - productPropertyViewRespVO.setName(p.getName());  
142 - Set<ProductPropertyViewRespVO.Tuple2> propertyValues = new HashSet<>();  
143 - Map<Long, ProductPropertyValueRespVO> propertyValueMaps = p.getPropertyValueList().stream().collect(Collectors.toMap(ProductPropertyValueRespVO::getId, pv -> pv));  
144 - propertyMaps.get(p.getId()).forEach(pv -> {  
145 - ProductPropertyViewRespVO.Tuple2 tuple2 = new ProductPropertyViewRespVO.Tuple2(pv.getValueId(), propertyValueMaps.get(pv.getValueId()).getName());  
146 - propertyValues.add(tuple2); 133 + if(spu.getSpecType().equals(ProductSpuSpecTypeEnum.DISABLE.getType())) {
  134 + for (ProductSkuRespVO productSkuRespVO : skuReqs) {
  135 + properties.addAll(productSkuRespVO.getProperties());
  136 + }
  137 + Map<Long, List<ProductSkuBaseVO.Property>> propertyMaps = properties.stream().collect(Collectors.groupingBy(ProductSkuBaseVO.Property::getPropertyId));
  138 + List<ProductPropertyRespVO> propertyAndValueList = productPropertyService.selectByIds(new ArrayList<>(propertyMaps.keySet()));
  139 + // 装载组装过后的属性
  140 + List<ProductPropertyViewRespVO> productPropertyViews = new ArrayList<>();
  141 + propertyAndValueList.forEach(p -> {
  142 + ProductPropertyViewRespVO productPropertyViewRespVO = new ProductPropertyViewRespVO();
  143 + productPropertyViewRespVO.setPropertyId(p.getId());
  144 + productPropertyViewRespVO.setName(p.getName());
  145 + Set<ProductPropertyViewRespVO.Tuple2> propertyValues = new HashSet<>();
  146 + Map<Long, ProductPropertyValueRespVO> propertyValueMaps = p.getPropertyValueList().stream().collect(Collectors.toMap(ProductPropertyValueRespVO::getId, pv -> pv));
  147 + propertyMaps.get(p.getId()).forEach(pv -> {
  148 + ProductPropertyViewRespVO.Tuple2 tuple2 = new ProductPropertyViewRespVO.Tuple2(pv.getValueId(), propertyValueMaps.get(pv.getValueId()).getName());
  149 + propertyValues.add(tuple2);
  150 + });
  151 + productPropertyViewRespVO.setPropertyValues(propertyValues);
  152 + productPropertyViews.add(productPropertyViewRespVO);
147 }); 153 });
148 - productPropertyViewRespVO.setPropertyValues(propertyValues);  
149 - productPropertyViews.add(productPropertyViewRespVO);  
150 - });  
151 - spuVO.setProductPropertyViews(productPropertyViews); 154 + spuVO.setProductPropertyViews(productPropertyViews);
  155 + }
152 // 组合分类 156 // 组合分类
153 if (null != spuVO.getCategoryId()) { 157 if (null != spuVO.getCategoryId()) {
154 LinkedList<Long> categoryArray = new LinkedList<>(); 158 LinkedList<Long> categoryArray = new LinkedList<>();
yudao-ui-admin/src/api/mall/product/brand.js
@@ -34,6 +34,15 @@ export function getBrand(id) { @@ -34,6 +34,15 @@ export function getBrand(id) {
34 }) 34 })
35 } 35 }
36 36
  37 +// 获得品牌list
  38 +export function getBrandList() {
  39 + return request({
  40 + url: '/product/brand/list',
  41 + method: 'get'
  42 + })
  43 +}
  44 +
  45 +
37 // 获得品牌分页 46 // 获得品牌分页
38 export function getBrandPage(query) { 47 export function getBrandPage(query) {
39 return request({ 48 return request({
yudao-ui-admin/src/views/mall/product/spu/index.vue
@@ -179,7 +179,7 @@ @@ -179,7 +179,7 @@
179 179
180 180
181 <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body destroy-on-close :close-on-click-modal="false" > 181 <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body destroy-on-close :close-on-click-modal="false" >
182 - <save @closeDialog="open = false; getList()"/> 182 + <save @closeDialog="closeDialog" :type="dialogType" :obj="dialogObj" v-if="open" />
183 </el-dialog> 183 </el-dialog>
184 </div> 184 </div>
185 </template> 185 </template>
@@ -257,6 +257,10 @@ export default { @@ -257,6 +257,10 @@ export default {
257 title: "", 257 title: "",
258 // 是否显示弹出层 258 // 是否显示弹出层
259 open: false, 259 open: false,
  260 + // 弹出层类型
  261 + dialogType: "add",
  262 + // 弹出层参数
  263 + dialogObj:{},
260 dateRangeCreateTime: [], 264 dateRangeCreateTime: [],
261 // 查询参数 265 // 查询参数
262 queryParams: { 266 queryParams: {
@@ -570,75 +574,25 @@ export default { @@ -570,75 +574,25 @@ export default {
570 }, 574 },
571 /** 新增按钮操作 */ 575 /** 新增按钮操作 */
572 handleAdd() { 576 handleAdd() {
573 - this.reset(); 577 + this.dialogType = "add";
  578 + this.dialogObj={};
574 this.open = true; 579 this.open = true;
575 this.title = "添加商品spu"; 580 this.title = "添加商品spu";
576 - this.getPropertyPageList();  
577 }, 581 },
578 /** 修改按钮操作 */ 582 /** 修改按钮操作 */
579 handleUpdate(row) { 583 handleUpdate(row) {
580 - this.reset();  
581 - const id = row.id;  
582 - getSpu(id).then((response) => {  
583 - let dataSpu = response.data;  
584 - this.form = {  
585 - id: dataSpu.id,  
586 - name: dataSpu.name,  
587 - sellPoint: dataSpu.sellPoint,  
588 - description: dataSpu.sellPoint,  
589 - categoryId: dataSpu.sellPoint,  
590 - categoryIds: dataSpu.categoryIds,  
591 - picUrls: dataSpu.picUrls,  
592 - sort: dataSpu.sort,  
593 - likeCount: dataSpu.likeCount,  
594 - price: dataSpu.price,  
595 - quantity: dataSpu.quantity,  
596 - status: dataSpu.status,  
597 - isShowTagInput: undefined,  
598 - skus: [],  
599 - skusList: dataSpu.skus,  
600 - productPropertyViews: dataSpu.productPropertyViews,  
601 - // skus:dataSpu.productSkuRespVOS,  
602 - };  
603 - this.getDataHandle();  
604 - this.open = true;  
605 - this.title = "修改商品spu";  
606 - }); 584 + this.dialogType = "upd";
  585 + this.dialogObj.id = row.id;
  586 + this.open = true;
  587 + console.log("修改")
  588 + this.title = "修改商品spu";
607 }, 589 },
608 - getDataHandle() {  
609 - let that = this;  
610 - let productPropertyViews = JSON.parse(  
611 - JSON.stringify(this.form.productPropertyViews)  
612 - );  
613 - productPropertyViews = productPropertyViews.sort(  
614 - (a, b) => a.propertyId - b.propertyId  
615 - );  
616 - productPropertyViews.forEach((item) => {  
617 - item.propertyValues = item.propertyValues.sort((a, b) => a.v1 - b.v1);  
618 - });  
619 - let skuIds = [];  
620 - for (let i = 0; i < productPropertyViews.length; i++) {  
621 - let han = {  
622 - name: productPropertyViews[i].name,  
623 - propertyId: productPropertyViews[i].propertyId,  
624 - selectValues: [],  
625 - selectValueIds: [],  
626 - };  
627 - for (  
628 - let j = 0;  
629 - j < productPropertyViews[i].propertyValues.length;  
630 - j++  
631 - ) {  
632 - han.selectValues.push(productPropertyViews[i].propertyValues[j].v2);  
633 - han.selectValueIds.push(productPropertyViews[i].propertyValues[j].v1);  
634 - }  
635 - skuIds.push(han);  
636 - }  
637 - this.skuTags = skuIds;  
638 - this.unUseTags = this.allhistoryTags.filter((v) =>  
639 - skuIds.every((val) => val.name != v.name)  
640 - );  
641 - this.getHandleTable(); 590 + closeDialog(){
  591 + console.log("关闭")
  592 + this.dialogType = "add";
  593 + this.dialogObj={};
  594 + this.open = false;
  595 + this.getList()
642 }, 596 },
643 getHandleTable() { 597 getHandleTable() {
644 this.form.skus = []; 598 this.form.skus = [];
@@ -699,33 +653,6 @@ export default { @@ -699,33 +653,6 @@ export default {
699 } 653 }
700 }); 654 });
701 }, 655 },
702 - /** 提交按钮 */  
703 - submitForm() {  
704 - this.$refs["form"].validate((valid) => {  
705 - if (!valid) {  
706 - return;  
707 - }  
708 - this.form.picUrls = this.form.picUrls.split(",");  
709 - this.form.categoryId =  
710 - this.form.categoryIds[this.form.categoryIds.length - 1];  
711 - this.form.status = Number(this.form.status);  
712 - // 修改的提交  
713 - if (this.form.id != null) {  
714 - updateSpu(this.form).then((response) => {  
715 - this.$modal.msgSuccess("修改成功");  
716 - this.open = false;  
717 - this.getList();  
718 - });  
719 - return;  
720 - }  
721 - // 添加的提交  
722 - createSpu(this.form).then((response) => {  
723 - this.$modal.msgSuccess("新增成功");  
724 - this.open = false;  
725 - this.getList();  
726 - });  
727 - });  
728 - },  
729 /** 删除按钮操作 */ 656 /** 删除按钮操作 */
730 handleDelete(row) { 657 handleDelete(row) {
731 const id = row.id; 658 const id = row.id;
yudao-ui-admin/src/views/mall/product/spu/save.vue
@@ -193,6 +193,16 @@ @@ -193,6 +193,16 @@
193 <!-- 销售设置 --> 193 <!-- 销售设置 -->
194 <el-tab-pane label="销售设置" name="fourth"> 194 <el-tab-pane label="销售设置" name="fourth">
195 <el-form ref="fourth" :model="baseForm" :rules="rules" label-width="100px" style="width: 95%"> 195 <el-form ref="fourth" :model="baseForm" :rules="rules" label-width="100px" style="width: 95%">
  196 + <el-form-item label="所属品牌" prop="brandId">
  197 + <el-select v-model="baseForm.brandId" placeholder="请选择">
  198 + <el-option
  199 + v-for="item in brandList"
  200 + :key="item.id"
  201 + :label="item.name"
  202 + :value="item.id">
  203 + </el-option>
  204 + </el-select>
  205 + </el-form-item>
196 <el-form-item label="虚拟销量" prop="virtualSalesCount"> 206 <el-form-item label="虚拟销量" prop="virtualSalesCount">
197 <el-input v-model="baseForm.virtualSalesCount" placeholder="请输入虚拟销量" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')"/> 207 <el-input v-model="baseForm.virtualSalesCount" placeholder="请输入虚拟销量" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')"/>
198 </el-form-item> 208 </el-form-item>
@@ -221,8 +231,10 @@ @@ -221,8 +231,10 @@
221 </template> 231 </template>
222 232
223 <script> 233 <script>
  234 +
  235 +import {getBrandList} from "@/api/mall/product/brand";
224 import {getProductCategoryList} from "@/api/mall/product/category"; 236 import {getProductCategoryList} from "@/api/mall/product/category";
225 -import {createSpu,} from "@/api/mall/product/spu"; 237 +import {createSpu, getSpu} from "@/api/mall/product/spu";
226 import {getPropertyPage,} from "@/api/mall/product/property"; 238 import {getPropertyPage,} from "@/api/mall/product/property";
227 import Editor from "@/components/Editor"; 239 import Editor from "@/components/Editor";
228 import ImageUpload from "@/components/ImageUpload"; 240 import ImageUpload from "@/components/ImageUpload";
@@ -232,6 +244,13 @@ export default { @@ -232,6 +244,13 @@ export default {
232 Editor, 244 Editor,
233 ImageUpload 245 ImageUpload
234 }, 246 },
  247 + props:{//props列表
  248 + type:{
  249 + type:String,
  250 + default:"add" //定义参数默认值
  251 + },
  252 + obj: Object
  253 + },
235 data() { 254 data() {
236 return { 255 return {
237 activeName: "base", 256 activeName: "base",
@@ -251,6 +270,7 @@ export default { @@ -251,6 +270,7 @@ export default {
251 status: 0, 270 status: 0,
252 virtualSalesCount: 0, 271 virtualSalesCount: 0,
253 showStock: true, 272 showStock: true,
  273 + brandId: null
254 }, 274 },
255 categoryList: [], 275 categoryList: [],
256 // 价格库存 276 // 价格库存
@@ -270,6 +290,7 @@ export default { @@ -270,6 +290,7 @@ export default {
270 // }, 290 // },
271 ], 291 ],
272 propertyPageList: [], 292 propertyPageList: [],
  293 + brandList: [],
273 specValue: null, 294 specValue: null,
274 295
275 // 表单校验 296 // 表单校验
@@ -283,11 +304,13 @@ export default { @@ -283,11 +304,13 @@ export default {
283 }, 304 },
284 }; 305 };
285 }, 306 },
286 -  
287 created() { 307 created() {
288 - 308 + this.getListBrand();
289 this.getListCategory(); 309 this.getListCategory();
290 this.getPropertyPageList(); 310 this.getPropertyPageList();
  311 + if(this.type == 'upd'){
  312 + this.updateType(this.obj.id)
  313 + }
291 }, 314 },
292 methods: { 315 methods: {
293 removeSpec(index){ 316 removeSpec(index){
@@ -352,6 +375,13 @@ export default { @@ -352,6 +375,13 @@ export default {
352 this.categoryList = this.handleTree(response.data, "id", "parentId"); 375 this.categoryList = this.handleTree(response.data, "id", "parentId");
353 }); 376 });
354 }, 377 },
  378 + /** 查询品牌列表 */
  379 + getListBrand() {
  380 + // 执行查询
  381 + getBrandList().then((response) => {
  382 + this.brandList = response.data;
  383 + });
  384 + },
355 cancel() { 385 cancel() {
356 this.$emit("closeDialog"); 386 this.$emit("closeDialog");
357 }, 387 },
@@ -366,7 +396,13 @@ export default { @@ -366,7 +396,13 @@ export default {
366 rates.forEach(r => { 396 rates.forEach(r => {
367 let properties = [] 397 let properties = []
368 Array.of(r.spec).forEach(s => { 398 Array.of(r.spec).forEach(s => {
369 - Array.of(s).forEach((v, i) => { 399 + let obj;
  400 + if (s instanceof Array) {
  401 + obj = s;
  402 + }else{
  403 + obj = Array.of(s);
  404 + }
  405 + obj.forEach((v, i) => {
370 console.log(this.dynamicSpec, r, s, v, i) 406 console.log(this.dynamicSpec, r, s, v, i)
371 let specValue = this.dynamicSpec[i].specValue.find(o => o.name == v); 407 let specValue = this.dynamicSpec[i].specValue.find(o => o.name == v);
372 console.log(specValue) 408 console.log(specValue)
@@ -382,9 +418,6 @@ export default { @@ -382,9 +418,6 @@ export default {
382 rates[0].name = this.baseForm.name; 418 rates[0].name = this.baseForm.name;
383 rates[0].status = this.baseForm.status; 419 rates[0].status = this.baseForm.status;
384 } 420 }
385 -  
386 - console.log(rates)  
387 -  
388 let form = this.baseForm 421 let form = this.baseForm
389 if(form.picUrls instanceof Array){ 422 if(form.picUrls instanceof Array){
390 form.picUrls = form.picUrls.flatMap(m=>m.split(',')) 423 form.picUrls = form.picUrls.flatMap(m=>m.split(','))
@@ -422,6 +455,24 @@ export default { @@ -422,6 +455,24 @@ export default {
422 spec.specValue = obj.propertyValueList; 455 spec.specValue = obj.propertyValueList;
423 this.dynamicSpec = dynamicSpec; 456 this.dynamicSpec = dynamicSpec;
424 this.buildRatesFormRates(); 457 this.buildRatesFormRates();
  458 + },
  459 + updateType(id){
  460 + getSpu(id).then((response) =>{
  461 + console.log(response)
  462 + let data = response.data;
  463 + this.baseForm.name=data.name;
  464 + this.baseForm.sellPoint=data.sellPoint;
  465 + this.baseForm.categoryIds=data.categoryIds;
  466 + this.baseForm.sort=data.sort;
  467 + this.baseForm.description=data.description;
  468 + this.baseForm.picUrls=data.picUrls;
  469 + this.baseForm.status=data.status;
  470 + this.baseForm.virtualSalesCount=data.virtualSalesCount;
  471 + this.baseForm.showStock=data.showStock;
  472 + this.baseForm.brandId=data.brandId;
  473 + this.ratesForm.spec=data.specType;
  474 + this.ratesForm.rates=data.skus
  475 + })
425 } 476 }
426 }, 477 },
427 }; 478 };