index.vue 5.67 KB
Newer Older
1
<template>
dragondean@qq.com's avatar
dragondean@qq.com committed
2 3
  <div class="flex" :gutter="10">
    <div class="flex-1">
4 5
      <el-card>
        <div slot="header" class="header">
dragondean@qq.com's avatar
dragondean@qq.com committed
6
          <el-select v-model="queryParams.typeId" :placeholder="$t('选择类型')" style="width:120px" clearable>
7 8
            <el-option v-for="item in typeList" :key="item.id" :label="item.titleZh" :value="item.id" />
          </el-select>
dragondean@qq.com's avatar
dragondean@qq.com committed
9
          <el-select v-model="queryParams.attrId" :placeholder="$t('选择属性')" style="width:120px" clearable>
10 11
            <el-option v-for="item in attrList" :key="item.id" :label="item.attrName" :value="item.id" />
          </el-select>
dragondean@qq.com's avatar
dragondean@qq.com committed
12 13
          <el-input v-model="queryParams.titleZh" :placeholder="$t('产品关键字')" style="width:120px" clearable />
          <el-button type="primary" @click="reLoad">{{$t('搜索')}}</el-button>
14 15

          <div v-if="showAll">
dragondean@qq.com's avatar
dragondean@qq.com committed
16
            <el-checkbox :label="$t('全选(最多500)')" @change="toggleAll" :disabled="isAllProduct"></el-checkbox>
17 18
            <el-checkbox :label="$t('全选库内商品(共{cnt}个)', {cnt: total})" v-model="isAllProduct"></el-checkbox>
          </div>
19 20 21
        </div>
        <div class="list">
          <div class="item" v-for="item in list" :key="item.id">
dragondean@qq.com's avatar
dragondean@qq.com committed
22
            <el-checkbox @change="toggleCheck(item, $event)" :value="ids.indexOf(item.id) > -1" :disabled="isAllProduct" /> {{item.titleZh}}
23 24 25 26
            <div>{{item.titleEn}}</div>
          </div>
        </div>
      </el-card>
dragondean@qq.com's avatar
dragondean@qq.com committed
27 28 29
    </div>
    <div class="flex-1 ml-10">
      <el-card style="height:100%">
30
        <div slot="header" class="header">
31
          {{$t('已选{cnt}个产品', {cnt: isAllProduct ? total : choosedList.length})}}
32 33 34
        </div>
        <div class="list">
          <div class="item" v-for="(choosed) in choosedList" :key="choosed.id" :data-data="JSON.stringify(choosed)">
dragondean@qq.com's avatar
dragondean@qq.com committed
35
            <el-link class="el-icon-delete" @click="remove(choosed)" :disabled="isAllProduct"/> {{choosed.titleZh}}
36 37 38 39
            <div>{{choosed.titleEn}}</div>
          </div>
        </div>
      </el-card>
dragondean@qq.com's avatar
dragondean@qq.com committed
40 41
    </div>
  </div>
42 43
</template>
<script>
dragondean@qq.com's avatar
dragondean@qq.com committed
44
import { getProductPage, getProductList } from '@/api/ecw/product'
45 46
import { getProductTypeList } from '@/api/ecw/productType'
import { getProductAttrList } from '@/api/ecw/productAttr'
47 48

export default {
49 50 51
  props: {
    defaultIds: {
      type: Array,
52 53 54
      default: () => {
        return []
      }
55
    },
dragondean@qq.com's avatar
dragondean@qq.com committed
56 57
    showAll: Boolean,
    isall: Boolean
58 59 60 61 62 63
  },
  data() {
    return {
      list: [],
      page: 1,
      pages: 1,
64
      total: 0, // 商品总数
65
      queryParams: {
dragondean@qq.com's avatar
dragondean@qq.com committed
66
        pageNo: 1,
67
        pageSize: 500,
68 69 70 71 72 73
        attrId: null,
        titleZh: null,
        typeId: null
      },
      choosedList: [],
      typeList: [],
74 75
      attrList: [],
      isAllProduct: false
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
    }
  },
  computed: {
    ids: {
      get() {
        let arr = []
        this.choosedList.forEach(item => {
          arr.push(item.id)
        })
        return arr
      },
      set(v) {

      }
    }
  },
  watch: {
    ids(val) {
      this.$emit('input', val)
95 96 97
    },
    isAllProduct(isAllProduct){
      this.$emit('setall', isAllProduct)
dragondean@qq.com's avatar
dragondean@qq.com committed
98
    },
dragondean@qq.com's avatar
dragondean@qq.com committed
99 100 101 102
    defaultIds(newValue, oldValue){
      if(!oldValue || !oldValue.length){
        this.loadDefaultProds()
      }
dragondean@qq.com's avatar
dragondean@qq.com committed
103 104 105
    },
    isall(isall){
      this.isAllProduct = isall
106 107 108 109 110 111 112
    }
  },
  created() {
    getProductTypeList().then(res => this.typeList = res.data)
    getProductAttrList().then(res => this.attrList = res.data)
    this.reLoad()
    this.ids = this.defaultIds //数据回显
dragondean@qq.com's avatar
dragondean@qq.com committed
113
    this.isAllProduct = this.isall
dragondean@qq.com's avatar
dragondean@qq.com committed
114 115 116 117
    // 如果有默认商品则获取内容供回显
    if(this.defaultIds.length){
      this.loadDefaultProds()
    }
118 119
  },
  methods: {
120 121 122
    /* setAllProduct(status){
      this.isAllProduct = true
    }, */
dragondean@qq.com's avatar
dragondean@qq.com committed
123
    loadDefaultProds(){
dragondean@qq.com's avatar
dragondean@qq.com committed
124 125 126
      if(!this.defaultIds || !this.defaultIds.length){
        return false
      }
dragondean@qq.com's avatar
dragondean@qq.com committed
127 128 129 130 131 132
      getProductList({ids: this.defaultIds.join(',')}).then(res => {
        res.data.forEach(item => {
          this.choose(item)
        })
      })
    },
133 134 135 136 137
    toggleAll(status){
      this.list.forEach(item => {
        this.toggleCheck(item, status)
      })
    },
138 139 140 141
    reLoad() {
      this.queryParams.page = 1
      this.list = []
      this.getList()
142
    },
143 144
    loadNextPage() {
      if (this.page >= this.pages) {
dragondean@qq.com's avatar
dragondean@qq.com committed
145
        return this.$message.error(this.$t('已加载全部'))
146 147 148 149 150 151 152 153 154
      }
      this.queryParams.page++
      this.getList()
    },
    getList() {
      getProductPage(this.queryParams).then(res => {
        this.list = res.data.list //.concat(res.data.list || [])
        this.page = res.data.page
        this.pages = res.data.pages
155
        this.total = res.data.total
dragondean@qq.com's avatar
dragondean@qq.com committed
156 157
        // this.choosedList = [] //搜搜重置,数据回显
        /* if (this.defaultIds.length > 0) {
158 159 160 161 162
          this.defaultIds.map(item => {
            this.list.map(items => {
              if (items.id == item) {
                this.choosedList.push(items)
              }
163
            })
164
          })
dragondean@qq.com's avatar
dragondean@qq.com committed
165
        } */
166
      })
167
    },
168 169 170 171 172 173
    toggleCheck(item, checked) {
      if (checked) {
        this.choose(item)
      } else {
        this.remove(item)
      }
174
    },
175
    choose(item) {
176 177 178
      if(!this.choosedList.find(it => it.id == item.id)){
        this.choosedList.push(item)
      }
179
    },
180 181 182 183
    remove(item) {
      this.choosedList.forEach((choosed, index) => {
        if (choosed.id == item.id) this.choosedList.splice(index, 1)
      })
184
    }
185
  }
186 187 188
}
</script>
<style scoped lang="scss">
189 190 191 192
.header {
  > div {
    margin-right: 5px;
  }
193
}
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
.list {
  height: 200px;
  border: 1px solid #ccc;
  overflow-y: auto;
  overflow-x: hidden;
  padding: 0 10px;

  display: flex;
  flex-wrap: wrap;
  .item {
    width: 50%;
    line-height: 20px;
    height: 50px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
211 212
}
</style>