index.vue 19.5 KB
Newer Older
1 2 3 4 5
<template>
  <div class="app-container">

    <!-- 搜索工作栏 -->
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
6
      <el-form-item label="商品编码" prop="productCode">
7
        <el-input v-model="queryParams.productCode" placeholder="请输入商品编码" clearable @keyup.enter.native="handleQuery" />
8 9 10
      </el-form-item>

      <el-form-item label="海关编码" prop="customsCode">
11
        <el-input v-model="queryParams.customsCode" placeholder="请输入海关编码" clearable @keyup.enter.native="handleQuery" />
12 13 14
      </el-form-item>

      <el-form-item label="商品名称" prop="titleZh">
15
        <el-input v-model="queryParams.titleZh" placeholder="请输入商品名称" clearable @keyup.enter.native="handleQuery" />
16
      </el-form-item>
17

18 19
      <el-form-item label="商品类型" prop="typeId">
        <el-select v-model="queryParams.typeId" placeholder="选择商品类型" clearable>
20
          <el-option v-for="type in typeList" :key="type.id" :label="type.titleZh" :value="type.id" />
21 22
        </el-select>
      </el-form-item>
23 24 25

      <el-form-item label="商品特性" prop="attrId">
        <el-select v-model="queryParams.attrId" placeholder="选择商品特性" clearable>
26
          <el-option v-for="attr in attrList" :key="attr.id" :label="attr.attrName" :value="attr.id" />
27 28
        </el-select>
      </el-form-item>
29

30 31
      <el-form-item label="审核状态" prop="auditStatus">
        <el-select v-model="queryParams.auditStatus" placeholder="选择审核状态" clearable>
32
          <el-option v-for="auditStatusItem in auditStatusDictDatas" :key="auditStatusItem.id" :label="auditStatusItem.label" :value="auditStatusItem.value" />
33 34
        </el-select>
      </el-form-item>
35

36 37
      <el-form-item label="上架状态" prop="status">
        <el-select v-model="queryParams.status" placeholder="选择上架状态" clearable>
38
          <el-option v-for="statusItem in statusDictDatas" :key="statusItem.id" :label="statusItem.value == CommonStatusEnum.ENABLE ? '已上架' : '已下架'" :value="statusItem.value" />
39 40
        </el-select>
      </el-form-item>
41

42 43 44 45 46 47 48 49 50
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>

    <!-- 操作工具栏 -->
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
51
        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['ecw:product:create']">新增</el-button>
52
      </el-col>
53 54 55 56
      <el-col :span="1.5">
        <el-button type="primary" plain icon="el-icon-setting" size="mini" @click="handleEdit" :disabled="multiple" v-hasPermi="['ecw:product:attr']">批量设置商品属性</el-button>
      </el-col>

57 58 59 60
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>

    <!-- 列表 -->
61 62 63
    <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center">
      </el-table-column>
64 65
      <el-table-column label="商品编号" align="center" prop="id" />
      <el-table-column label="商品类型" align="center" prop="typeId">
66 67 68 69
        <template slot-scope="scope">
          <span>{{ getTypeName(scope.row.typeId) }}</span>
        </template>
      </el-table-column>
70
      <el-table-column label="海关编码" align="center" prop="customsCode" />
71 72
      <el-table-column label="中文标题" align="center" prop="titleZh" />
      <el-table-column label="英文标题" align="center" prop="titleEn" />
73
      <el-table-column label="商品特性" align="center" prop="attrId">
74 75 76 77 78 79 80
        <template slot-scope="scope">
          <span>{{ getAttrName(scope.row.attrId) }}</span>
        </template>
      </el-table-column>

      <el-table-column prop="auditStatus" align="center" label="是否审核" width="120">
        <template slot-scope="scope">
81 82 83
          <el-select v-model="scope.row.auditStatus" @change="handleStatusChange(scope.row, 'auditStatus')">
            <el-option v-for="auditStatusItem in auditStatusDictDatas" :key="auditStatusItem.id" :label="auditStatusItem.label" :value="parseInt(auditStatusItem.value)" />
          </el-select>
84 85
        </template>
      </el-table-column>
86

87 88
      <el-table-column prop="status" align="center" label="状态" width="120">
        <template slot-scope="scope">
89 90 91
          <el-select v-model="scope.row.status" @change="handleStatusChange(scope.row, 'status')">
            <el-option v-for="statusItem in statusDictDatas" :key="statusItem.id" :label="statusItem.value == CommonStatusEnum.ENABLE + '' ? '已上架' : '已下架'" :value="parseInt(statusItem.value)" />
          </el-select>
92 93 94 95 96
        </template>
      </el-table-column>

      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
wanglianghe's avatar
wanglianghe committed
97

98
          <el-button size="mini" type="text" @click="toPriceManager(scope.row)" v-hasPermi="['ecw:product-price:query']">路线价格</el-button>
wanglianghe's avatar
wanglianghe committed
99

100 101
          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['ecw:product:update']">修改</el-button>
          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['ecw:product:delete']">删除</el-button>
102 103 104 105
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页组件 -->
106
    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getList" />
107 108

    <!-- 对话框(添加 / 修改) -->
109
    <el-dialog :title="title" :visible.sync="open" width="550px" append-to-body>
110
      <el-form ref="form" :model="form" :rules="rules" label-width="110px">
111 112
        <el-form-item label="商品类型" prop="typeId">
          <el-select v-model="form.typeId" placeholder="选择商品类型" clearable>
113
            <el-option v-for="type in typeList" :key="type.id" :label="type.titleZh" :value="type.id" />
114 115 116 117 118 119
          </el-select>
        </el-form-item>

        <el-form-item label="中文标题" prop="titleZh">
          <el-input v-model="form.titleZh" placeholder="请输入中文标题" />
        </el-form-item>
120

121 122 123 124
        <el-form-item label="英文标题" prop="titleEn">
          <el-input v-model="form.titleEn" placeholder="请输入英文标题" />
        </el-form-item>

125 126
        <el-form-item label="商品图片" prop="img">
          <el-col :span="8">
127
            <el-input v-model="form.imgs" placeholder="请上传图片" disabled />
128 129
          </el-col>

130
          <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
            <el-button size="small">
              上传图片
              <i class="el-icon-upload el-icon--right"></i>
            </el-button>
          </el-upload>

        </el-form-item>

        <el-form-item label="商品编码" prop="productCode">
          <el-input v-model="form.productCode" placeholder="请输入商品编码" />
        </el-form-item>

        <el-form-item label="海关编码" prop="customsCode">
          <el-input v-model="form.customsCode" placeholder="请输入海关编码" />
        </el-form-item>

        <el-form-item label="商品特性" prop="attrArray">
          <el-select v-model="form.attrArray" placeholder="选择商品特性" clearable multiple>
149 150
            <el-option v-for="attr in attrList" :key="attr.id" :label="attr.attrName" :value="attr.id" />
          </el-select>
151
        </el-form-item>
152

153 154
        <el-form-item label="商品材质" prop="materialType">
          <el-select v-model="form.materialType" placeholder="选择商品材质" clearable>
155
            <el-option v-for="materialItem in materialList" :key="materialItem.value" :label="materialItem.label" :value="materialItem.value" />
156 157 158 159
          </el-select>
        </el-form-item>

        <el-form-item label="出运要求" prop="requirements">
160
          <el-checkbox v-model="form.requirements" :checked="form.requirements===1? true:false" :true-label="1" :false-label="0">证书要求(支持多证书)</el-checkbox>
161 162 163 164
        </el-form-item>

        <el-form-item label="包装要求" prop="packaging">
          <el-select v-model="form.packaging" placeholder="选择包装要求" clearable>
165
            <el-option v-for="packageItem in packagingList" :key="packageItem.value" :label="packageItem.label" :value="packageItem.value" />
166 167 168 169 170
          </el-select>
        </el-form-item>

        <el-form-item label="默认货柜位置" prop="containerLocation">
          <el-select v-model="form.containerLocation" placeholder="选择货柜位置" clearable>
171
            <el-option v-for="locationItem in locationList" :key="locationItem.value" :label="locationItem.label" :value="locationItem.value" />
172 173 174 175 176 177 178 179 180
          </el-select>
        </el-form-item>

        <el-form-item label="默认方数要求" prop="square">
          <el-input v-model.number="form.square" type="number">
            <!-- <template slot="append">立方米</template> -->
          </el-input>
        </el-form-item>

181 182 183 184 185 186 187 188 189 190
        <el-form-item label="需要预约入仓" prop="needBook">
          <el-radio v-model.number="form.needBook" :label="1"></el-radio>
          <el-radio v-model.number="form.needBook" :label="0"></el-radio>
        </el-form-item>

        <el-form-item label="每日入仓上限" prop="dayLimit">
          <el-input v-model.number="form.dayLimit" type="number">
            <template slot="append">立方米</template>
          </el-input>
        </el-form-item>
191

192 193 194 195 196 197 198 199 200 201 202 203 204 205
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import { createProduct, updateProduct, deleteProduct, getProduct, getProductPage, exportProductExcel } from "@/api/ecw/product";
import { getProductAttrList } from "@/api/ecw/productAttr";
import { getProductTypeList } from "@/api/ecw/productType";
import { getDictDatas, DICT_TYPE } from '@/utils/dict';
206 207
import { CommonStatusEnum, AuditStatusEnum } from '@/utils/constants';
import { uploadFile } from "@/api/infra/file";
208 209

export default {
wanglianghe's avatar
wanglianghe committed
210
  name: "ProductList",
211 212 213 214
  components: {
  },
  data() {
    return {
215 216 217 218 219 220
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
221
      //特性列表
222
      attrList: [],
223
      //类型列表
224
      typeList: [],
225
      //材质列表
226
      materialList: [],
227
      //包装列表
228
      packagingList: [],
229
      //货柜位置
230
      locationList: [],
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261

      // 遮罩层
      loading: true,
      // 导出遮罩层
      exportLoading: false,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 产品列表
      list: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      dateRangeCreateTime: [],
      // 查询参数
      queryParams: {
        pageNo: 1,
        pageSize: 10,
        typeId: null,
        attrId: null,
        titleZh: null,
        titleEn: null,
        auditStatus: null,
        status: null,
      },
      // 表单参数
      form: {},
      // 表单校验
      rules: {
262 263
        typeId: [{ required: true, message: "商品类型不能为空", trigger: "change" }],
        attrArray: [{ required: true, message: "商品特性不能为空", trigger: "change" }],
264 265
        titleZh: [{ required: true, message: "中文标题不能为空", trigger: "blur" }],
        titleEn: [{ required: true, message: "英文标题不能为空", trigger: "blur" }],
266 267 268 269 270
        materialType: [{ required: true, message: "商品材质不能为空", trigger: "blur" }],
        packaging: [{ required: true, message: "包装要求不能为空", trigger: "blur" }],
        containerLocation: [{ required: true, message: "默认货柜位置不能为空", trigger: "blur" }],
        square: [{ required: true, message: "默认方数不能为空", trigger: "blur" }],
        needBook: [{ required: true, message: "预约入仓不能为空", trigger: "blur" }],
271 272 273 274 275
      },

      CommonStatusEnum: CommonStatusEnum,
      AuditStatusEnum: AuditStatusEnum,
      statusDictDatas: getDictDatas(DICT_TYPE.COMMON_STATUS),
276 277 278 279
      auditStatusDictDatas: getDictDatas(DICT_TYPE.AUDIT_STATUS),
      materialList: getDictDatas(DICT_TYPE.ECW_PRODUCT_MATERIAL),
      packagingList: getDictDatas(DICT_TYPE.ECW_PACKAGING_TYPE),
      locationList: getDictDatas(DICT_TYPE.ECW_CONTAINER_LOCATION)
280 281 282 283 284 285
    };
  },

  computed: {
    getTypeName() {
      return typeId => {
286
        for (let index in this.typeList) {
287
          let typeItem = this.typeList[index];
288
          if (typeItem.id == typeId) {
289 290 291 292 293 294 295
            return typeItem.titleZh;
          }
        }
      }
    },

    getAttrName() {
296 297 298
      return attrIds => {
        let productAttrArray = [];
        let attrArray = attrIds.split(',');
299
        for (let attrIndex in attrArray) {
300
          let attrId = attrArray[attrIndex];
301
          for (let index in this.attrList) {
302
            let attrItem = this.attrList[index];
303
            if (attrItem.id == attrId) {
304 305
              productAttrArray.push(attrItem.attrName);
            }
306 307
          }
        }
308
        return productAttrArray.join(',');
309 310 311 312
      }
    },
  },

wanglianghe's avatar
wanglianghe committed
313

314
  created() {
315
    let typeId = this.$route.query.typeId;
316
    if (typeId) {
317 318
      this.queryParams.typeId = parseInt(typeId);
    }
319 320 321 322 323 324 325 326
    this.getAttrList();
    this.getTypeList();
    this.getList();
  },
  methods: {
    /** 获取产品属性列表 */
    getAttrList() {
      getProductAttrList().then(response => {
327
        this.attrList = response.data;
328 329 330 331 332 333 334 335 336 337
      })
    },

    /** 获取产品类型列表 */
    getTypeList() {
      getProductTypeList().then(response => {
        this.typeList = response.data;
      })
    },

wanglianghe's avatar
wanglianghe committed
338 339
    /**跳转价格管理 */
    toPriceManager(row) {
340 341
      /* localStorage.setItem('product', JSON.stringify(row));
      localStorage.setItem('typeList', JSON.stringify(this.typeList)); */
wanglianghe's avatar
wanglianghe committed
342
      this.$router.push({
343
        name: 'ProductPrice',
344
        query: {
wanglianghe's avatar
wanglianghe committed
345 346
          product_id: row.id,
          product_type: row.typeId
347
        }
wanglianghe's avatar
wanglianghe committed
348
      })
wanglianghe's avatar
wanglianghe committed
349 350
    },

351 352 353
    handleStatusChange(row, statusType) {
      updateProduct(row).then(() => {
        this.$modal.msgSuccess("修改成功");
354 355
      }).catch(function () {
        if (statusType == 'status') {
356 357 358 359
          row.status = row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE : CommonStatusEnum.ENABLE;
        } else {
          row.auditStatus = row.auditStatus === AuditStatusEnum.PASS ? AuditStatusEnum.NOT_PASS : AuditStatusEnum.PASS;
        }
360

361 362 363 364 365 366 367
      });
    },

    /** 查询列表 */
    getList() {
      this.loading = true;
      // 处理查询参数
368
      let params = { ...this.queryParams };
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386
      this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
      // 执行查询
      getProductPage(params).then(response => {
        this.list = response.data.list;
        this.total = response.data.total;
        this.loading = false;
      });
    },
    /** 取消按钮 */
    cancel() {
      this.open = false;
      this.reset();
    },
    /** 表单重置 */
    reset() {
      this.form = {
        id: undefined,
        typeId: undefined,
387
        attrArray: undefined,
388 389 390 391 392
        attrId: undefined,
        titleZh: undefined,
        titleEn: undefined,
        auditStatus: undefined,
        status: undefined,
393
        requirements: 0,
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
      };
      this.resetForm("form");
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNo = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.dateRangeCreateTime = [];
      this.resetForm("queryForm");
      this.handleQuery();
    },
    /** 新增按钮操作 */
    handleAdd() {
      this.reset();
      this.open = true;
412
      this.title = "添加商品";
413
      if (this.queryParams.typeId) {
414 415
        this.form.typeId = this.queryParams.typeId;
      }
416 417 418 419 420 421 422
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
      this.reset();
      const id = row.id;
      getProduct(id).then(response => {
        this.form = response.data;
423
        let attrArray = this.form.attrId.split(',');
424
        for (let index in attrArray) {
425 426 427 428
          let value = attrArray[index];
          attrArray[index] = parseInt(value);
        }
        this.form.attrArray = attrArray;
429
        this.open = true;
430
        this.title = "修改商品";
431 432
      });
    },
433

434 435 436 437 438 439 440
    /** 提交按钮 */
    submitForm() {
      console.log(this.form);
      this.$refs["form"].validate(valid => {
        if (!valid) {
          return;
        }
441 442 443
        //商品特性转字符串
        this.form.attrId = this.form.attrArray.join(',');

444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
        // 修改的提交
        if (this.form.id != null) {
          updateProduct(this.form).then(response => {
            this.$modal.msgSuccess("修改成功");
            this.open = false;
            this.getList();
          });
          return;
        }
        // 添加的提交
        createProduct(this.form).then(response => {
          this.$modal.msgSuccess("新增成功");
          this.open = false;
          this.getList();
        });
      });
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const id = row.id;
464 465 466 467 468 469
      this.$modal.confirm('是否确认删除商品编号为"' + id + '"的数据项?').then(function () {
        return deleteProduct(id);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => { });
470 471 472 473
    },
    /** 导出按钮操作 */
    handleExport() {
      // 处理查询参数
474
      let params = { ...this.queryParams };
475 476 477 478
      params.pageNo = undefined;
      params.pageSize = undefined;
      this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
      // 执行导出
479
      this.$modal.confirm('是否确认导出所有商品数据项?').then(() => {
480 481 482 483 484 485
        this.exportLoading = true;
        return exportProductExcel(params);
      }).then(response => {
        this.$download.excel(response, '${table.classComment}.xls');
        this.exportLoading = false;
      }).catch(() => { });
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
    },

    // 覆盖默认的上传行为
    requestUpload() {
    },
    // 上传预处理
    beforeUpload(file) {
      if (file.type.indexOf("image/") == -1) {
        this.$modal.msgError("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
      } else {
        //上传
        let formData = new FormData();
        formData.append("file", file);
        formData.append("path", this.uuid());
        uploadFile(formData).then(response => {
          this.$set(this.form, 'imgs', response.data);
          // this.form.img = response.data;
        })
      }
    },

    uuid() {
      var s = [];
      var hexDigits = "0123456789abcdef";
      for (var i = 0; i < 36; i++) {
511
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
512 513 514 515 516 517 518 519
      }
      s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
      s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
      s[8] = s[13] = s[18] = s[23] = "-";

      var uuid = s.join("");
      return uuid;
    },
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534
    // 表格多选
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id)
      this.single = selection.length !== 1
      this.multiple = !selection.length
    },
    // 批量设置商品属性
    handleEdit() {
      this.$router.push({
        path: "product-attr/edit",
        query: {
          ids: this.ids
        }
      });
    }
535 536 537
  }
};
</script>
538