433 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			433 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						||
  <div class="seckill-goods">
 | 
						||
    <Card>
 | 
						||
      <Table border :columns="columns" :data="data">
 | 
						||
        <template slot-scope="{ row }" slot="applyEndTime">
 | 
						||
          {{ unixDate(row.applyEndTime) }}
 | 
						||
        </template>
 | 
						||
        <template slot-scope="{ row }" slot="hours">
 | 
						||
          <Tag v-for="item in unixHours(row.hours)" :key="item">{{ item }}</Tag>
 | 
						||
        </template>
 | 
						||
      </Table>
 | 
						||
 | 
						||
      <Row class="operation">
 | 
						||
        <template v-if="promotionStatus == 'NEW'">
 | 
						||
          <Button type="primary" @click="openSkuList">选择商品</Button>
 | 
						||
          <!-- <Button @click="delAll">批量删除</Button> -->
 | 
						||
        </template>
 | 
						||
      </Row>
 | 
						||
      <Row class="operation">
 | 
						||
        <Tabs type="card" v-model="tabIndex">
 | 
						||
          <TabPane
 | 
						||
            v-for="(tab, tabIndex) in goodsList"
 | 
						||
            :key="tabIndex"
 | 
						||
            :label="tab.hour"
 | 
						||
            :name="tabIndex + ''"
 | 
						||
          >
 | 
						||
            <Table
 | 
						||
              :loading="loading"
 | 
						||
              border
 | 
						||
              :columns="goodsColumns"
 | 
						||
              :data="tab.list"
 | 
						||
              :ref="'table' + tabIndex"
 | 
						||
              @on-selection-change="changeSelect"
 | 
						||
            >
 | 
						||
              <template slot-scope="{ row }" slot="originalPrice">
 | 
						||
                <div>{{ row.originalPrice | unitPrice("¥") }}</div>
 | 
						||
              </template>
 | 
						||
 | 
						||
              <template slot-scope="{ row, index }" slot="quantity">
 | 
						||
                <Input
 | 
						||
                  v-model="row.quantity"
 | 
						||
                  :disabled="row.promotionApplyStatus == 'PASS'"
 | 
						||
                  @input="
 | 
						||
                    goodsList[tabIndex].list[index].quantity = row.quantity
 | 
						||
                  "
 | 
						||
                />
 | 
						||
              </template>
 | 
						||
 | 
						||
              <template slot-scope="{ row, index }" slot="price">
 | 
						||
                <Input
 | 
						||
                  v-model="row.price"
 | 
						||
                  :disabled="row.promotionApplyStatus == 'PASS'"
 | 
						||
                  @input="goodsList[tabIndex].list[index].price = row.price"
 | 
						||
                />
 | 
						||
              </template>
 | 
						||
 | 
						||
              <template slot-scope="{ row }" slot="promotionApplyStatus">
 | 
						||
                <Badge
 | 
						||
                  status="success"
 | 
						||
                  v-if="row.promotionApplyStatus == 'PASS'"
 | 
						||
                  :text="promotionApplyStatus(row.promotionApplyStatus)"
 | 
						||
                />
 | 
						||
                <Badge
 | 
						||
                  status="blue"
 | 
						||
                  v-if="row.promotionApplyStatus == 'APPLY'"
 | 
						||
                  :text="promotionApplyStatus(row.promotionApplyStatus)"
 | 
						||
                />
 | 
						||
                <Badge
 | 
						||
                  status="error"
 | 
						||
                  v-if="row.promotionApplyStatus == 'REFUSE'"
 | 
						||
                  :text="promotionApplyStatus(row.promotionApplyStatus)"
 | 
						||
                />
 | 
						||
                <span
 | 
						||
                  v-if="row.promotionApplyStatus == 'REFUSE'"
 | 
						||
                  @click="showReason(row.failReason)"
 | 
						||
                  class="reason"
 | 
						||
                >(拒绝原因)</span
 | 
						||
                >
 | 
						||
                <Badge
 | 
						||
                  status="error"
 | 
						||
                  v-if="row.promotionApplyStatus == ''"
 | 
						||
                  :text="promotionApplyStatus(row.promotionApplyStatus)"
 | 
						||
                />
 | 
						||
              </template>
 | 
						||
 | 
						||
              <template slot-scope="{ row }" slot="QRCode">
 | 
						||
                <img
 | 
						||
                  v-if="row.QRCode"
 | 
						||
                  :src="row.QRCode || '../../../assets/lili.png'"
 | 
						||
                  width="50px"
 | 
						||
                  height="50px"
 | 
						||
                  alt=""
 | 
						||
                />
 | 
						||
              </template>
 | 
						||
              <template slot-scope="{ row, index }" slot="action">
 | 
						||
                <Button
 | 
						||
                  type="error"
 | 
						||
                  v-if="promotionStatus === 'NEW'"
 | 
						||
                  size="small"
 | 
						||
                  ghost
 | 
						||
                  @click="delGoods(index, row)"
 | 
						||
                >删除
 | 
						||
                </Button
 | 
						||
                >
 | 
						||
              </template>
 | 
						||
            </Table>
 | 
						||
          </TabPane>
 | 
						||
        </Tabs>
 | 
						||
      </Row>
 | 
						||
 | 
						||
      <Row class="operation">
 | 
						||
        <Button @click="closeCurrentPage">返回</Button>
 | 
						||
        <Button
 | 
						||
          type="primary"
 | 
						||
          :loading="submitLoading"
 | 
						||
          v-if="promotionStatus === 'NEW'"
 | 
						||
          @click="save"
 | 
						||
        >提交
 | 
						||
        </Button
 | 
						||
        >
 | 
						||
      </Row>
 | 
						||
    </Card>
 | 
						||
 | 
						||
    <sku-select
 | 
						||
      ref="skuSelect"
 | 
						||
      @selectedGoodsData="selectedGoodsData"
 | 
						||
    ></sku-select>
 | 
						||
  </div>
 | 
						||
</template>
 | 
						||
<script>
 | 
						||
  import {
 | 
						||
    seckillGoodsList,
 | 
						||
    seckillDetail,
 | 
						||
    setSeckillGoods,
 | 
						||
    delSeckillGoods
 | 
						||
  } from "@/api/promotion.js";
 | 
						||
  import skuSelect from "@/views/lili-dialog";
 | 
						||
 | 
						||
  export default {
 | 
						||
    components: {
 | 
						||
      skuSelect,
 | 
						||
    },
 | 
						||
    data() {
 | 
						||
      return {
 | 
						||
        promotionStatus: "", // 活动状态
 | 
						||
        loading: false, // 表单加载状态
 | 
						||
        searchForm: {
 | 
						||
          // 搜索框初始化对象
 | 
						||
          pageNumber: 0, // 当前页数
 | 
						||
          pageSize: 1000, // 页面大小
 | 
						||
        },
 | 
						||
        tabIndex: 0, // 选择商品的下标
 | 
						||
        submitLoading: false, // 添加或编辑提交状态
 | 
						||
        selectList: [], // 多选数据
 | 
						||
        selectCount: 0, // 多选计数
 | 
						||
        data: [{}], // 表单数据
 | 
						||
        columns: [
 | 
						||
          {
 | 
						||
            title: "活动名称",
 | 
						||
            key: "promotionName",
 | 
						||
            minWidth: 120,
 | 
						||
          },
 | 
						||
          {
 | 
						||
            title: "活动开始时间",
 | 
						||
            key: "startTime",
 | 
						||
          },
 | 
						||
          {
 | 
						||
            title: "报名截止时间",
 | 
						||
            slot: "applyEndTime",
 | 
						||
          },
 | 
						||
          {
 | 
						||
            title: "时间场次",
 | 
						||
            slot: "hours",
 | 
						||
          },
 | 
						||
        ],
 | 
						||
        goodsColumns: [
 | 
						||
          {
 | 
						||
            title: "商品名称",
 | 
						||
            key: "goodsName",
 | 
						||
            minWidth: 120,
 | 
						||
          },
 | 
						||
          {
 | 
						||
            title: "商品价格",
 | 
						||
            slot: "originalPrice",
 | 
						||
            minWidth: 50,
 | 
						||
          },
 | 
						||
          {
 | 
						||
            title: "库存",
 | 
						||
            slot: "quantity",
 | 
						||
            minWidth: 40,
 | 
						||
          },
 | 
						||
          {
 | 
						||
            title: "活动价格",
 | 
						||
            slot: "price",
 | 
						||
            minWidth: 50,
 | 
						||
          },
 | 
						||
          {
 | 
						||
            title: "状态",
 | 
						||
            slot: "promotionApplyStatus",
 | 
						||
            minWidth: 30,
 | 
						||
          },
 | 
						||
          {
 | 
						||
            title: "操作",
 | 
						||
            slot: "action",
 | 
						||
            minWidth: 50,
 | 
						||
          },
 | 
						||
        ],
 | 
						||
        goodsList: [] // 商品列表
 | 
						||
      };
 | 
						||
    },
 | 
						||
    methods: {
 | 
						||
      // 关闭当前页面
 | 
						||
      closeCurrentPage() {
 | 
						||
        this.$store.commit("removeTag", "seckill-goods");
 | 
						||
        localStorage.storeOpenedList = JSON.stringify(
 | 
						||
          this.$store.state.app.storeOpenedList
 | 
						||
        );
 | 
						||
        this.$router.go(-1);
 | 
						||
      },
 | 
						||
      // 提交秒杀商品
 | 
						||
      save() {
 | 
						||
 | 
						||
        let list = JSON.parse(JSON.stringify(this.goodsList));
 | 
						||
 | 
						||
        console.warn(list)
 | 
						||
        let params = {
 | 
						||
          seckillId: this.$route.query.id,
 | 
						||
          applyVos: [],
 | 
						||
        };
 | 
						||
        list.forEach((e, index) => {
 | 
						||
          e.list.forEach((i) => {
 | 
						||
            // if(e.id) delete e.id
 | 
						||
            params.applyVos.push(i);
 | 
						||
          });
 | 
						||
        });
 | 
						||
        this.submitLoading = true;
 | 
						||
 | 
						||
        console.log(list)
 | 
						||
 | 
						||
        setSeckillGoods(params).then((res) => {
 | 
						||
          this.submitLoading = false;
 | 
						||
          if (res && res.success) {
 | 
						||
            this.$Message.success("提交活动商品成功");
 | 
						||
            this.closeCurrentPage();
 | 
						||
          }
 | 
						||
        });
 | 
						||
      },
 | 
						||
      // 初始化数据
 | 
						||
      init() {
 | 
						||
        this.getSeckillMsg();
 | 
						||
      },
 | 
						||
      // 清除选中状态
 | 
						||
      clearSelectAll() {
 | 
						||
        this.$refs.table.selectAll(false);
 | 
						||
      },
 | 
						||
      // 获取选择数据
 | 
						||
      changeSelect(e) {
 | 
						||
        this.selectList = e;
 | 
						||
        this.selectCount = e.length;
 | 
						||
      },
 | 
						||
 | 
						||
      getDataList() {
 | 
						||
        // 获取商品详情
 | 
						||
        this.loading = true;
 | 
						||
        this.searchForm.seckillId = this.$route.query.id;
 | 
						||
        // 处理过的时间 为‘1:00’
 | 
						||
        let hours = this.unixHours(this.data[0].hours);
 | 
						||
        hours.forEach((e) => {
 | 
						||
          this.goodsList.push({
 | 
						||
            hour: e,
 | 
						||
            list: [],
 | 
						||
          });
 | 
						||
        });
 | 
						||
        seckillGoodsList(this.searchForm).then((res) => {
 | 
						||
          this.loading = false;
 | 
						||
          if (res.success && res.result) {
 | 
						||
            let data = res.result.records;
 | 
						||
            // 未处理时间 为'1'
 | 
						||
            let noFilterhours = this.data[0].hours.split(",");
 | 
						||
            if (data.length) {
 | 
						||
              noFilterhours.forEach((e, index) => {
 | 
						||
                data.forEach((i) => {
 | 
						||
                  if (i.timeLine == e) {
 | 
						||
                    this.goodsList[index].list.push(i);
 | 
						||
                  }
 | 
						||
                });
 | 
						||
              });
 | 
						||
            }
 | 
						||
          }
 | 
						||
        });
 | 
						||
      },
 | 
						||
 | 
						||
      getSeckillMsg() {
 | 
						||
        // 获取活动详情
 | 
						||
        seckillDetail(this.$route.query.id).then((res) => {
 | 
						||
          if (res.success && res.result) {
 | 
						||
            this.data = [];
 | 
						||
            this.data.push(res.result);
 | 
						||
            this.promotionStatus = res.result.promotionStatus;
 | 
						||
            this.getDataList();
 | 
						||
          }
 | 
						||
        });
 | 
						||
      },
 | 
						||
      delGoods(index, row) {
 | 
						||
        // 删除商品
 | 
						||
        if (row.promotionApplyStatus === 'PASS') {
 | 
						||
          const params = {
 | 
						||
            seckillId: row.seckillId,
 | 
						||
            id: row.id
 | 
						||
          }
 | 
						||
          delSeckillGoods(params).then(res => {
 | 
						||
            if (res.success) {
 | 
						||
              this.goodsList[this.tabIndex].list.splice(index, 1);
 | 
						||
              this.$Message.success("删除成功!");
 | 
						||
            }
 | 
						||
          })
 | 
						||
        } else {
 | 
						||
          this.goodsList[this.tabIndex].list.splice(index, 1);
 | 
						||
          this.$Message.success("删除成功!");
 | 
						||
        }
 | 
						||
      },
 | 
						||
      selectedGoodsData(item) {
 | 
						||
        // 选择器添加商品
 | 
						||
        item.forEach((e) => {
 | 
						||
          if(this.goodsList[this.tabIndex].list.length == 0){
 | 
						||
            this.goodsList[this.tabIndex].list.push({
 | 
						||
              goodsName: e.goodsName,
 | 
						||
              price: e.price,
 | 
						||
              originalPrice: e.price,
 | 
						||
              promotionApplyStatus: e.promotionApplyStatus || '',
 | 
						||
              quantity: e.quantity,
 | 
						||
              seckillId: this.$route.query.id,
 | 
						||
              storeId: e.storeId,
 | 
						||
              storeName: e.storeName,
 | 
						||
              skuId: e.id,
 | 
						||
              timeLine: this.data[0].hours.split(",")[this.tabIndex],
 | 
						||
            });
 | 
						||
          }else{
 | 
						||
            this.goodsList[this.tabIndex].list.forEach(goods => {
 | 
						||
              if (e.id != goods.skuId) {
 | 
						||
                this.goodsList[this.tabIndex].list.push(
 | 
						||
                  {
 | 
						||
                    goodsName: e.goodsName,
 | 
						||
                    price: e.price,
 | 
						||
                    originalPrice: e.price,
 | 
						||
                    promotionApplyStatus: e.promotionApplyStatus || '',
 | 
						||
                    quantity: e.quantity,
 | 
						||
                    seckillId: this.$route.query.id,
 | 
						||
                    storeId: e.storeId,
 | 
						||
                    storeName: e.storeName,
 | 
						||
                    skuId: e.id,
 | 
						||
                    timeLine: this.data[0].hours.split(",")[this.tabIndex],
 | 
						||
                  }
 | 
						||
                )
 | 
						||
              }
 | 
						||
            })
 | 
						||
          }
 | 
						||
 | 
						||
        })
 | 
						||
 | 
						||
 | 
						||
        this.$nextTick(() => {
 | 
						||
          this.$forceUpdate()
 | 
						||
        })
 | 
						||
      },
 | 
						||
      openSkuList() { // 显示商品选择器
 | 
						||
        this.$refs.skuSelect.open("goods");
 | 
						||
        let data = JSON.parse(JSON.stringify(this.goodsList[this.tabIndex].list))
 | 
						||
        data.forEach(e => {
 | 
						||
          e.id = e.skuId
 | 
						||
        })
 | 
						||
        this.$refs.skuSelect.goodsData = data;
 | 
						||
      },
 | 
						||
      unixDate(time) {
 | 
						||
        // 处理报名截止时间
 | 
						||
        return this.$options.filters.unixToDate(new Date(time) / 1000);
 | 
						||
      },
 | 
						||
      unixHours(item) {
 | 
						||
        if (item) {
 | 
						||
          // 处理小时场次
 | 
						||
          let hourArr = item.split(",");
 | 
						||
          for (let i = 0; i < hourArr.length; i++) {
 | 
						||
            hourArr[i] += ":00";
 | 
						||
          }
 | 
						||
          return hourArr;
 | 
						||
        }
 | 
						||
        return [];
 | 
						||
      },
 | 
						||
      // 格式化申请状态
 | 
						||
      promotionApplyStatus(key) {
 | 
						||
        switch (key) {
 | 
						||
          case "APPLY":
 | 
						||
            return "申请";
 | 
						||
          case "PASS":
 | 
						||
            return "通过";
 | 
						||
          case "REFUSE":
 | 
						||
            return "拒绝";
 | 
						||
          default:
 | 
						||
            return "未申请";
 | 
						||
        }
 | 
						||
      },
 | 
						||
      // 展示审核拒绝原因
 | 
						||
      showReason(reason) {
 | 
						||
        this.$Modal.info({
 | 
						||
          title: "拒绝原因",
 | 
						||
          content: reason,
 | 
						||
        });
 | 
						||
      },
 | 
						||
    },
 | 
						||
    mounted() {
 | 
						||
      this.init();
 | 
						||
    },
 | 
						||
    // 如果是从详情页返回列表页,修改列表页keepAlive为true,确保不刷新页面
 | 
						||
    beforeRouteLeave(to, from, next) {
 | 
						||
      if (to.name === 'seckill') {
 | 
						||
        to.meta.keepAlive = true
 | 
						||
      }
 | 
						||
      next()
 | 
						||
    }
 | 
						||
  };
 | 
						||
</script>
 | 
						||
<style lang="scss" scoped>
 | 
						||
  .operation {
 | 
						||
    margin: 10px 0;
 | 
						||
  }
 | 
						||
 | 
						||
  .reason {
 | 
						||
    cursor: pointer;
 | 
						||
    color: #2d8cf0;
 | 
						||
    font-size: 12px;
 | 
						||
  }
 | 
						||
</style>
 |