|  | @@ -1,15 +1,316 @@
 | 
	
		
			
				|  |  |  <template>
 | 
	
		
			
				|  |  |    <div style="margin-top: 50px">
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +    <el-form :model="value" ref="productAttrForm" label-width="120px" style="width: 780px" size="small">
 | 
	
		
			
				|  |  | +      <el-form-item label="属性类型:">
 | 
	
		
			
				|  |  | +        <el-select v-model="value.productAttributeCategoryId"
 | 
	
		
			
				|  |  | +                   placeholder="请选择属性类型"
 | 
	
		
			
				|  |  | +                   @change="handleProductAttrChange">
 | 
	
		
			
				|  |  | +          <el-option
 | 
	
		
			
				|  |  | +            v-for="item in productAttributeCategoryOptions"
 | 
	
		
			
				|  |  | +            :key="item.value"
 | 
	
		
			
				|  |  | +            :label="item.label"
 | 
	
		
			
				|  |  | +            :value="item.value">
 | 
	
		
			
				|  |  | +          </el-option>
 | 
	
		
			
				|  |  | +        </el-select>
 | 
	
		
			
				|  |  | +      </el-form-item>
 | 
	
		
			
				|  |  | +      <el-form-item label="商品规格:">
 | 
	
		
			
				|  |  | +        <el-card shadow="never" class="cardBg">
 | 
	
		
			
				|  |  | +          <div v-for="(productAttr,idx) in selectProductAttr">
 | 
	
		
			
				|  |  | +            {{productAttr.name}}:
 | 
	
		
			
				|  |  | +            <el-checkbox-group v-if="productAttr.handAddStatus===0" v-model="selectProductAttr[idx].values">
 | 
	
		
			
				|  |  | +              <el-checkbox v-for="item in getInputListArr(productAttr.inputList)" :label="item" :key="item"
 | 
	
		
			
				|  |  | +                           class="littleMarginLeft"></el-checkbox>
 | 
	
		
			
				|  |  | +            </el-checkbox-group>
 | 
	
		
			
				|  |  | +            <div v-else>
 | 
	
		
			
				|  |  | +              <el-checkbox-group v-model="selectProductAttr[idx].values">
 | 
	
		
			
				|  |  | +                <div v-for="(item,index) in selectProductAttr[idx].options" style="display: inline-block"
 | 
	
		
			
				|  |  | +                     class="littleMarginLeft">
 | 
	
		
			
				|  |  | +                  <el-checkbox :label="item" :key="item"></el-checkbox>
 | 
	
		
			
				|  |  | +                  <el-button type="text" class="littleMarginLeft" @click="handleRemoveProductAttrValue(idx,index)">删除
 | 
	
		
			
				|  |  | +                  </el-button>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </el-checkbox-group>
 | 
	
		
			
				|  |  | +              <el-input v-model="addProductAttrValue" style="width: 160px;margin-left: 10px" clearable></el-input>
 | 
	
		
			
				|  |  | +              <el-button class="littleMarginLeft" @click="handleAddProductAttrValue(idx)">增加</el-button>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </el-card>
 | 
	
		
			
				|  |  | +        <el-table style="width: 100%;margin-top: 20px"
 | 
	
		
			
				|  |  | +                  :data="value.skuStockList"
 | 
	
		
			
				|  |  | +                  border>
 | 
	
		
			
				|  |  | +          <el-table-column
 | 
	
		
			
				|  |  | +            v-for="(item,index) in selectProductAttr"
 | 
	
		
			
				|  |  | +            :label="item.name"
 | 
	
		
			
				|  |  | +            :key="item.id"
 | 
	
		
			
				|  |  | +            align="center">
 | 
	
		
			
				|  |  | +            <template slot-scope="scope">
 | 
	
		
			
				|  |  | +              {{getProductSkuSp(scope.row,index)}}
 | 
	
		
			
				|  |  | +            </template>
 | 
	
		
			
				|  |  | +          </el-table-column>
 | 
	
		
			
				|  |  | +          <el-table-column
 | 
	
		
			
				|  |  | +            label="销售价格"
 | 
	
		
			
				|  |  | +            width="80"
 | 
	
		
			
				|  |  | +            align="center">
 | 
	
		
			
				|  |  | +            <template slot-scope="scope">
 | 
	
		
			
				|  |  | +              <el-input v-model="scope.row.price"></el-input>
 | 
	
		
			
				|  |  | +            </template>
 | 
	
		
			
				|  |  | +          </el-table-column>
 | 
	
		
			
				|  |  | +          <el-table-column
 | 
	
		
			
				|  |  | +            label="商品库存"
 | 
	
		
			
				|  |  | +            width="80"
 | 
	
		
			
				|  |  | +            align="center">
 | 
	
		
			
				|  |  | +            <template slot-scope="scope">
 | 
	
		
			
				|  |  | +              <el-input v-model="scope.row.stock"></el-input>
 | 
	
		
			
				|  |  | +            </template>
 | 
	
		
			
				|  |  | +          </el-table-column>
 | 
	
		
			
				|  |  | +          <el-table-column
 | 
	
		
			
				|  |  | +            label="库存预警值"
 | 
	
		
			
				|  |  | +            width="80"
 | 
	
		
			
				|  |  | +            align="center">
 | 
	
		
			
				|  |  | +            <template slot-scope="scope">
 | 
	
		
			
				|  |  | +              <el-input v-model="scope.row.lowStock"></el-input>
 | 
	
		
			
				|  |  | +            </template>
 | 
	
		
			
				|  |  | +          </el-table-column>
 | 
	
		
			
				|  |  | +          <el-table-column
 | 
	
		
			
				|  |  | +            label="SKU编号"
 | 
	
		
			
				|  |  | +            align="center">
 | 
	
		
			
				|  |  | +            <template slot-scope="scope">
 | 
	
		
			
				|  |  | +              <el-input v-model="scope.row.skuCode"></el-input>
 | 
	
		
			
				|  |  | +            </template>
 | 
	
		
			
				|  |  | +          </el-table-column>
 | 
	
		
			
				|  |  | +          <el-table-column
 | 
	
		
			
				|  |  | +            label="操作"
 | 
	
		
			
				|  |  | +            width="80"
 | 
	
		
			
				|  |  | +            align="center">
 | 
	
		
			
				|  |  | +            <template slot-scope="scope">
 | 
	
		
			
				|  |  | +              <el-button
 | 
	
		
			
				|  |  | +                type="text"
 | 
	
		
			
				|  |  | +                @click="handleRemoveProductSku(scope.$index, scope.row)">删除
 | 
	
		
			
				|  |  | +              </el-button>
 | 
	
		
			
				|  |  | +            </template>
 | 
	
		
			
				|  |  | +          </el-table-column>
 | 
	
		
			
				|  |  | +        </el-table>
 | 
	
		
			
				|  |  | +        <el-button
 | 
	
		
			
				|  |  | +          type="primary"
 | 
	
		
			
				|  |  | +          style="margin-top: 20px"
 | 
	
		
			
				|  |  | +          @click="handleRefreshProductSkuList">刷新列表
 | 
	
		
			
				|  |  | +        </el-button>
 | 
	
		
			
				|  |  | +      </el-form-item>
 | 
	
		
			
				|  |  | +      <el-form-item label="属性图片:" v-if="hasAttrPic">
 | 
	
		
			
				|  |  | +        <div v-for="(item,index) in selectProductAttr[0].values">
 | 
	
		
			
				|  |  | +          <span style="position:relative;top: -150px;">{{item}}:</span>
 | 
	
		
			
				|  |  | +          <single-upload v-model="selectProductAttr[0].pics[index]" style="width: 250px;display: inline-block;margin-left: 10px"></single-upload>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +      </el-form-item>
 | 
	
		
			
				|  |  | +      <el-form-item label="商品参数:">
 | 
	
		
			
				|  |  | +        <el-card shadow="never" class="cardBg">
 | 
	
		
			
				|  |  | +        <div v-for="(item,index) in selectProductParam" :class="{littleMarginTop:index!==0}">
 | 
	
		
			
				|  |  | +          <div class="paramInputLabel">{{item.name}}:</div>
 | 
	
		
			
				|  |  | +          <el-select v-if="item.inputType===1" class="paramInput" v-model="selectProductParam[index].value">
 | 
	
		
			
				|  |  | +            <el-option
 | 
	
		
			
				|  |  | +              v-for="item in getParamInputList(item.inputList)"
 | 
	
		
			
				|  |  | +              :key="item"
 | 
	
		
			
				|  |  | +              :label="item"
 | 
	
		
			
				|  |  | +              :value="item">
 | 
	
		
			
				|  |  | +            </el-option>
 | 
	
		
			
				|  |  | +          </el-select>
 | 
	
		
			
				|  |  | +          <el-input v-else class="paramInput" v-model="selectProductParam[index].value"></el-input>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +        </el-card>
 | 
	
		
			
				|  |  | +      </el-form-item>
 | 
	
		
			
				|  |  | +    </el-form>
 | 
	
		
			
				|  |  |    </div>
 | 
	
		
			
				|  |  |  </template>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <script>
 | 
	
		
			
				|  |  | +  import {fetchList as fetchProductAttrCateList} from '@/api/productAttrCate'
 | 
	
		
			
				|  |  | +  import {fetchList as fetchProductAttrList} from '@/api/productAttr'
 | 
	
		
			
				|  |  | +  import SingleUpload from '@/components/Upload/singleUpload'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    export default {
 | 
	
		
			
				|  |  | -    name: "addProductAttr"
 | 
	
		
			
				|  |  | +    name: "addProductAttr",
 | 
	
		
			
				|  |  | +    components:{SingleUpload},
 | 
	
		
			
				|  |  | +    props: {
 | 
	
		
			
				|  |  | +      value: Object
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    data() {
 | 
	
		
			
				|  |  | +      return {
 | 
	
		
			
				|  |  | +        productAttributeCategoryOptions: [],
 | 
	
		
			
				|  |  | +        selectProductAttr: [],
 | 
	
		
			
				|  |  | +        selectProductParam:[],
 | 
	
		
			
				|  |  | +        addProductAttrValue: null
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    computed: {
 | 
	
		
			
				|  |  | +      hasAttrPic() {
 | 
	
		
			
				|  |  | +        if(this.selectProductAttr.length<1){
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if(this.selectProductAttr[0].values.length<1){
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    created() {
 | 
	
		
			
				|  |  | +      this.getProductAttrCateList();
 | 
	
		
			
				|  |  | +      if (this.value.productAttributeCategoryId != null) {
 | 
	
		
			
				|  |  | +        this.handleProductAttrChange(this.value.productAttributeCategoryId);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    methods: {
 | 
	
		
			
				|  |  | +      getProductAttrCateList() {
 | 
	
		
			
				|  |  | +        let param = {pageNum: 1, pageSize: 100};
 | 
	
		
			
				|  |  | +        fetchProductAttrCateList(param).then(response => {
 | 
	
		
			
				|  |  | +          this.productAttributeCategoryOptions = [];
 | 
	
		
			
				|  |  | +          let list = response.data.list;
 | 
	
		
			
				|  |  | +          for (let i = 0; i < list.length; i++) {
 | 
	
		
			
				|  |  | +            this.productAttributeCategoryOptions.push({label: list[i].name, value: list[i].id});
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      getProductAttrList(type, cid) {
 | 
	
		
			
				|  |  | +        let param = {pageNum: 1, pageSize: 100, type: type};
 | 
	
		
			
				|  |  | +        fetchProductAttrList(cid, param).then(response => {
 | 
	
		
			
				|  |  | +          let list = response.data.list;
 | 
	
		
			
				|  |  | +          if (type === 0) {
 | 
	
		
			
				|  |  | +            this.selectProductAttr = [];
 | 
	
		
			
				|  |  | +            for (let i = 0; i < list.length; i++) {
 | 
	
		
			
				|  |  | +              this.selectProductAttr.push({
 | 
	
		
			
				|  |  | +                id: list[i].id,
 | 
	
		
			
				|  |  | +                name:list[i].name,
 | 
	
		
			
				|  |  | +                handAddStatus: list[i].handAddStatus,
 | 
	
		
			
				|  |  | +                inputList:list[i].inputList,
 | 
	
		
			
				|  |  | +                values: [],
 | 
	
		
			
				|  |  | +                options: [],
 | 
	
		
			
				|  |  | +                pics:[]
 | 
	
		
			
				|  |  | +              });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            this.selectProductParam = [];
 | 
	
		
			
				|  |  | +            for (let i = 0; i < list.length; i++) {
 | 
	
		
			
				|  |  | +              this.selectProductParam.push({
 | 
	
		
			
				|  |  | +                id: list[i].id,
 | 
	
		
			
				|  |  | +                name:list[i].name,
 | 
	
		
			
				|  |  | +                value: null,
 | 
	
		
			
				|  |  | +                inputType:list[i].inputType,
 | 
	
		
			
				|  |  | +                inputList:list[i].inputList
 | 
	
		
			
				|  |  | +              });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      handleProductAttrChange(value) {
 | 
	
		
			
				|  |  | +        this.getProductAttrList(0, value);
 | 
	
		
			
				|  |  | +        this.getProductAttrList(1, value);
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      getInputListArr(inputList) {
 | 
	
		
			
				|  |  | +        return inputList.split(',');
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      handleAddProductAttrValue(idx) {
 | 
	
		
			
				|  |  | +        let options = this.selectProductAttr[idx].options;
 | 
	
		
			
				|  |  | +        if (this.addProductAttrValue == null || this.addProductAttrValue == '') {
 | 
	
		
			
				|  |  | +          this.$message({
 | 
	
		
			
				|  |  | +            message: '属性值不能为空',
 | 
	
		
			
				|  |  | +            type: 'warning',
 | 
	
		
			
				|  |  | +            duration: 1000
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +          return
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (options.indexOf(this.addProductAttrValue) !== -1) {
 | 
	
		
			
				|  |  | +          this.$message({
 | 
	
		
			
				|  |  | +            message: '属性值不能重复',
 | 
	
		
			
				|  |  | +            type: 'warning',
 | 
	
		
			
				|  |  | +            duration: 1000
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +          return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        this.selectProductAttr[idx].options.push(this.addProductAttrValue);
 | 
	
		
			
				|  |  | +        this.addProductAttrValue = null;
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      handleRemoveProductAttrValue(idx, index) {
 | 
	
		
			
				|  |  | +        this.selectProductAttr[idx].options.splice(index, 1);
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      getProductSkuSp(row, index) {
 | 
	
		
			
				|  |  | +        if (index === 0) {
 | 
	
		
			
				|  |  | +          return row.sp1;
 | 
	
		
			
				|  |  | +        } else if (index === 1) {
 | 
	
		
			
				|  |  | +          return row.sp2;
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          return row.sp3;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      handleRefreshProductSkuList() {
 | 
	
		
			
				|  |  | +        this.value.skuStockList = [];
 | 
	
		
			
				|  |  | +        let skuList = this.value.skuStockList;
 | 
	
		
			
				|  |  | +        //只有一个属性时
 | 
	
		
			
				|  |  | +        if (this.selectProductAttr.length === 1) {
 | 
	
		
			
				|  |  | +          let values = this.selectProductAttr[0].values;
 | 
	
		
			
				|  |  | +          for (let i = 0; i < values.length; i++) {
 | 
	
		
			
				|  |  | +            skuList.push({
 | 
	
		
			
				|  |  | +              sp1: values[i]
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        } else if (this.selectProductAttr.length === 2) {
 | 
	
		
			
				|  |  | +          let values0 = this.selectProductAttr[0].values;
 | 
	
		
			
				|  |  | +          let values1 = this.selectProductAttr[1].values;
 | 
	
		
			
				|  |  | +          for (let i = 0; i < values0.length; i++) {
 | 
	
		
			
				|  |  | +            for (let j = 0; j < values1.length; j++) {
 | 
	
		
			
				|  |  | +              skuList.push({
 | 
	
		
			
				|  |  | +                sp1: values0[i],
 | 
	
		
			
				|  |  | +                sp2: values1[j]
 | 
	
		
			
				|  |  | +              });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          let values0 = this.selectProductAttr[0].values;
 | 
	
		
			
				|  |  | +          let values1 = this.selectProductAttr[1].values;
 | 
	
		
			
				|  |  | +          let values2 = this.selectProductAttr[2].values;
 | 
	
		
			
				|  |  | +          for (let i = 0; i < values0.length; i++) {
 | 
	
		
			
				|  |  | +            for (let j = 0; j < values1.length; j++) {
 | 
	
		
			
				|  |  | +              for (let k = 0; k < values2.length; k++) {
 | 
	
		
			
				|  |  | +                skuList.push({
 | 
	
		
			
				|  |  | +                  sp1: values0[i],
 | 
	
		
			
				|  |  | +                  sp2: values1[j],
 | 
	
		
			
				|  |  | +                  sp3: values2[k]
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      handleRemoveProductSku(index, row) {
 | 
	
		
			
				|  |  | +        let list = this.value.skuStockList;
 | 
	
		
			
				|  |  | +        if (list.length === 1) {
 | 
	
		
			
				|  |  | +          list.pop();
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          list.splice(index, 1);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      getParamInputList(inputList){
 | 
	
		
			
				|  |  | +        return inputList.split(',');
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  </script>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <style scoped>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +  .littleMarginLeft {
 | 
	
		
			
				|  |  | +    margin-left: 10px;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  .littleMarginTop {
 | 
	
		
			
				|  |  | +    margin-top: 10px;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  .paramInput{
 | 
	
		
			
				|  |  | +    width: 250px;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  .paramInputLabel{
 | 
	
		
			
				|  |  | +    display: inline-block;
 | 
	
		
			
				|  |  | +    width: 100px;
 | 
	
		
			
				|  |  | +    text-align: right;
 | 
	
		
			
				|  |  | +    padding-right: 10px
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  .cardBg{
 | 
	
		
			
				|  |  | +    background: #F8F9FC;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  </style>
 |