index.vue 7.25 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">
6
          <el-select v-model="queryParams.typeId" :placeholder="$t('选择类型')" style="width:120px" clearable @change="getList" :disabled="loading">
7 8
            <el-option v-for="item in typeList" :key="item.id" :label="item.titleZh" :value="item.id" />
          </el-select>
9
          <el-select v-model="queryParams.attrId" :placeholder="$t('选择属性')" style="width:120px" clearable @change="getList" :disabled="loading">
10 11
            <el-option v-for="item in attrList" :key="item.id" :label="item.attrName" :value="item.id" />
          </el-select>
12 13
          <el-input v-model="queryParams.titleZh" :placeholder="$t('产品关键字')" style="width:120px" clearable  :disabled="loading"/>
          <el-button type="primary" @click="reLoad" :loading="loading">{{$t('搜索')}}</el-button>
14 15

          <div v-if="showAll">
16 17 18
            <el-checkbox :label="$t('全选') + `(${total > 500 ? $t('最多500') : $t('{total}个', {total})})`" @change="toggleAll" :disabled="isAllProduct || loading"></el-checkbox>
            <el-checkbox :label="$t('全选库内商品(共{cnt}个)', {cnt: allTotal})" v-model="isAllProduct" :disabled="loading"></el-checkbox>
						<el-checkbox v-if="showFiltered && enableFiltered" :label="$t('根据商品搜索结果(共{cnt}个)', {cnt: total})" v-model="isAllFiltered" :disabled="loading"></el-checkbox>
19
          </div>
20 21 22
        </div>
        <div class="list">
          <div class="item" v-for="item in list" :key="item.id">
dragondean@qq.com's avatar
dragondean@qq.com committed
23
            <el-checkbox @change="toggleCheck(item, $event)" :value="ids.indexOf(item.id) > -1" :disabled="isAllProduct" /> {{item.titleZh}}
24 25 26 27
            <div>{{item.titleEn}}</div>
          </div>
        </div>
      </el-card>
dragondean@qq.com's avatar
dragondean@qq.com committed
28 29 30
    </div>
    <div class="flex-1 ml-10">
      <el-card style="height:100%">
dragondean@qq.com's avatar
dragondean@qq.com committed
31
        <div slot="header" class="header flex">
32
          <div class="flex-1 flex items-center">{{$t('已选{cnt}个产品', {cnt: isAllProduct || isAllFiltered ? total : choosedList.length})}}</div>
dragondean@qq.com's avatar
dragondean@qq.com committed
33

34
          <el-button :disabled="!choosedList.length" type="text" @click="clearAll">{{$t('全部清除')}}</el-button>
35 36 37
        </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
38
            <el-link class="el-icon-delete" @click="remove(choosed)" :disabled="isAllProduct"/> {{choosed.titleZh}}
39 40 41 42
            <div>{{choosed.titleEn}}</div>
          </div>
        </div>
      </el-card>
dragondean@qq.com's avatar
dragondean@qq.com committed
43 44
    </div>
  </div>
45 46
</template>
<script>
47
import {getProductPage, getProductList, getProductIds} from '@/api/ecw/product'
48 49
import { getProductTypeList } from '@/api/ecw/productType'
import { getProductAttrList } from '@/api/ecw/productAttr'
50 51

export default {
52 53 54
  props: {
    defaultIds: {
      type: Array,
55 56 57
      default: () => {
        return []
      }
58
    },
dragondean@qq.com's avatar
dragondean@qq.com committed
59
    showAll: Boolean,
60 61 62
    isall: Boolean,
    // 是否允许勾选全部搜索结果,优惠券那边无法回显所以不能启用,编辑路线价格等不需要回显的场景可以启用
    enableFiltered: Boolean
63 64 65
  },
  data() {
    return {
66
      loading: false,
67 68 69
      list: [],
      page: 1,
      pages: 1,
70 71
      total: 0, // 当前筛选条件的商品总数
      allTotal: 0, // 全库商品总数
72
      queryParams: {
dragondean@qq.com's avatar
dragondean@qq.com committed
73
        pageNo: 1,
74
        pageSize: 500,
75 76 77 78 79 80
        attrId: null,
        titleZh: null,
        typeId: null
      },
      choosedList: [],
      typeList: [],
81
      attrList: [],
82 83 84 85
      isAllProduct: false,
      isAllFiltered: false, // 是否全部搜索结果
      // 是否显示搜索结果勾选,有筛选条件才显示
      showFiltered: false
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
    }
  },
  computed: {
    ids: {
      get() {
        let arr = []
        this.choosedList.forEach(item => {
          arr.push(item.id)
        })
        return arr
      },
      set(v) {

      }
    }
  },
  watch: {
    ids(val) {
      this.$emit('input', val)
105 106
    },
    isAllProduct(isAllProduct){
107 108
      console.log('isAllProduct', isAllProduct)
      this.choosedList = []
109
      this.$emit('setall', isAllProduct)
dragondean@qq.com's avatar
dragondean@qq.com committed
110
    },
111 112 113 114 115
    isAllFiltered(isAllFiltered){
      this.choosedList = []
      this.isAllProduct = false
      this.$emit('setFiltered', isAllFiltered)
    },
dragondean@qq.com's avatar
dragondean@qq.com committed
116 117 118 119
    defaultIds(newValue, oldValue){
      if(!oldValue || !oldValue.length){
        this.loadDefaultProds()
      }
dragondean@qq.com's avatar
dragondean@qq.com committed
120 121 122
    },
    isall(isall){
      this.isAllProduct = isall
123 124 125 126 127 128 129
    }
  },
  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
130
    this.isAllProduct = this.isall
dragondean@qq.com's avatar
dragondean@qq.com committed
131 132 133 134
    // 如果有默认商品则获取内容供回显
    if(this.defaultIds.length){
      this.loadDefaultProds()
    }
135 136 137 138 139

    // 获取全库商品总数
    getProductPage({pageNo: 1, pageSize: 1}).then(res => {
      this.allTotal = res.data.total
    })
140 141
  },
  methods: {
142 143 144
    /* setAllProduct(status){
      this.isAllProduct = true
    }, */
dragondean@qq.com's avatar
dragondean@qq.com committed
145
    loadDefaultProds(){
dragondean@qq.com's avatar
dragondean@qq.com committed
146 147 148
      if(!this.defaultIds || !this.defaultIds.length){
        return false
      }
dragondean@qq.com's avatar
dragondean@qq.com committed
149 150 151 152 153 154
      getProductList({ids: this.defaultIds.join(',')}).then(res => {
        res.data.forEach(item => {
          this.choose(item)
        })
      })
    },
155 156 157 158 159
    toggleAll(status){
      this.list.forEach(item => {
        this.toggleCheck(item, status)
      })
    },
160 161 162 163
    reLoad() {
      this.queryParams.page = 1
      this.list = []
      this.getList()
164
    },
165 166
    loadNextPage() {
      if (this.page >= this.pages) {
dragondean@qq.com's avatar
dragondean@qq.com committed
167
        return this.$message.error(this.$t('已加载全部'))
168 169 170 171 172
      }
      this.queryParams.page++
      this.getList()
    },
    getList() {
173
      this.loading = true
174 175 176 177
      getProductPage(this.queryParams).then(res => {
        this.list = res.data.list //.concat(res.data.list || [])
        this.page = res.data.page
        this.pages = res.data.pages
178
        this.total = res.data.total
179 180 181 182 183 184 185 186 187 188 189

        // 必须在搜索之后才显示勾选,这个时候才有数量
        this.showFiltered = !!this.queryParams.attrId || !!this.queryParams.titleZh || !!this.queryParams.typeId
      }).finally(() => {
        this.loading = false
      })
    },
    // 获得指定条件的商品的全部ID
    getFilteredIds(){
      return getProductIds(this.queryParams).then(res => {
        return res.data
190
      })
191
    },
192 193 194 195 196 197
    toggleCheck(item, checked) {
      if (checked) {
        this.choose(item)
      } else {
        this.remove(item)
      }
198
    },
199
    choose(item) {
200 201 202
      if(!this.choosedList.find(it => it.id == item.id)){
        this.choosedList.push(item)
      }
203
    },
204 205 206 207
    remove(item) {
      this.choosedList.forEach((choosed, index) => {
        if (choosed.id == item.id) this.choosedList.splice(index, 1)
      })
dragondean@qq.com's avatar
dragondean@qq.com committed
208 209 210 211 212
    },
    // 清除全部
    async clearAll() {
      await this.$confirm(this.$t('确定要全部清除么?'))
      this.choosedList = []
213
    }
214
  }
215 216 217
}
</script>
<style scoped lang="scss">
218 219 220 221
.header {
  > div {
    margin-right: 5px;
  }
222
}
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
.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;
  }
240
}
241
</style>