c_Package.vue 9.25 KB
<template>
  <div class="package top_border">
    <p class="package_title">套餐类型/日期</p>
    <template v-if="bindId">
      <div class="package_box" v-if="packageArr.length > 0">
        <div style="overflow:auto;">
          <div
            class="package_item"
            :class="packageActive == index ? 'active' : ''"
            v-for="(item, index) in packageArr"
            :key="index"
            @click="handlePackageDay(index)"
          >
            <p class="date">{{ item.day }}</p>
            <p class="week">{{ item.week }}</p>
            <p class="price"><span>¥</span>{{ item.marketPrice }}<span class="des">起</span></p>
            <img class="select" src="@/assets/service/select.png" alt="" />
          </div>
        </div>
        <div class="package_item package_item_more" @click="checkDatePackage()" v-if="packageArr.length > 5">
          <img class="more_icon" src="@/assets/service/more.png" alt="" />
          <p class="more_text">查看更多</p>
        </div>
      </div>
      <div class="notime" v-if="packageArr.length == 0">
        <img src="@/assets/service/notime.png" alt="" />
      </div>
    </template>
    <template v-else>
      <div class="period_item_box" v-if="periodArr.length > 0">
        <div class="period_item" v-for="(item, index) in periodArr" :key="index">
          <div>
            <p class="period_title">{{ item.productSceneName }}</p>
            <p class="period_des">{{ item.productSceneDescription }}</p>
            <p class="price" v-if="item.groupPeriodActivityList">
              活动价¥{{ item.groupPeriodActivityList.actualPrice }}/{{ item.unitName }}
              <span class="old_price">市场价¥{{ item.groupPeriodActivityList.productPrice }}/{{ item.unitName }}</span>
            </p>
          </div>
          <div>
            <span class="btn" @click="handleReserve(item)">预约</span>
          </div>
        </div>
      </div>
      <p v-else class="period_nodata">暂无可选团期</p>
    </template>
  </div>
</template>
<script>
export default {
  props: {
    courseId: {
      type: String,
      default: '',
    },
    packageArr: {
      type: Array,
      default: () => {
        return []
      },
    },
  },
  data() {
    return {
      bindId: '',
      // packageArr: [], //套餐列表
      packageActive: 0, //套餐
      packageTypeActive: 0, //行程
      periodArr: [],
    }
  },
  mounted() {
    this.bindId = this.$route.query.bindId
    this.getPeriod() // 获取可使用行程套餐
  },
  methods: {
    // 点击套餐日期
    handlePackageDay(index) {
      this.packageActive = index
      this.packageTypeActive = 0 //重置套餐类型选择
      this.getDateInfoById()
      //TODO 获取该日所包含的套餐

      // this.setShare()
    },
    // 根据选择的档期显示成团状态
    getDateInfoById() {
      const bindId = this.packageArr[this.packageActive]?.comboInfoList[this.packageTypeActive].bindId
      const comboId = this.packageArr[this.packageActive]?.comboInfoList[this.packageTypeActive].id
      if (!bindId || !comboId) {
        console.log('没有bindId||comboId')
        return
      }
      // this.getExpectMoney(comboId)
      this.yxAxios
        .get(`${this.yanxueUrl}/api/Product/DateInfo/ById?productId=${this.courseId}&bindId=${bindId}&comboId=${comboId}`)
        .then((res) => {
          // console.log(res.data)
          if (res.data.status == 1) {
            let data = res.data.data
            // console.log(data.clusterTime)
            data.clusterTime = this.Moment(new Date(data.clusterTime.replace(/\-/g, '/')))
              .add(1, 'days')
              .subtract(1, 'seconds')
              .format('YYYY/MM/DD HH:mm:ss')
            data.periodOfValidity = this.Moment(new Date(data.periodOfValidity.replace(/\-/g, '/')))
              .add(1, 'days')
              .subtract(1, 'seconds')
              .format('YYYY/MM/DD HH:mm:ss')
            this.bottomBoxData = data
          } else {
            this.$toast('获取成团状态失败')
          }
        })
    },
    // 获取可使用行程套餐
    getPeriod() {
      let date = this.Moment().format('YYYY-MM-DD')
      let weekOfday = this.Moment().format('E') // 计算今天是这周第几天
      // 如果为限时团购,就传星期三的日期
      if (this.$route.query.ProgramType == 1) {
        let TGMSTabActive = localStorage.getItem('TGMSTabActive')
        if (TGMSTabActive == 1) {
          date = this.Moment()
            .add(weekOfday == 7 ? 3 : 10 - weekOfday, 'days')
            .format('YYYY-MM-DD')
        } else {
          date = this.Moment()
            .add(weekOfday == 7 ? -4 : 3 - weekOfday, 'days')
            .format('YYYY-MM-DD')
        }
      }
      let param = {
        productId: this.courseId,
        state: '1',
        pageIndex: 1,
        pageSize: 999,
        date: date,
      }
      if (this.$route.query.productSceneId) {
        param.productSceneId = this.$route.query.productSceneId
      }
      if (this.$route.query.DateComboType) {
        param.DateComboType = this.$route.query.DateComboType
      }
      if (this.$route.query.ProgramType) {
        param.ProgramType = this.$route.query.ProgramType
      }
      this.yxAxios.post(`${this.yanxueUrl}/api/Product/ProductScene/List`, param).then((res) => {
        console.log('套餐列表:', res.data.data)
        let data = res.data.data.data
        let periodArr = []
        for (let i in data) {
          if (data[i].groupPeriodActivityList) {
            // 如果是直通车产品,不显示常规拼团套餐
            if (this.$route.query.ProgramType && data[i].dateBindTypeName == '常规拼团') {
            } else {
              periodArr.push(data[i])
            }
          }
        }
        this.periodArr = periodArr.sort(this.sortUpDate)
      })
    },
    // 日期排序
    sortUpDate(a, b) {
      return a.groupPeriodActivityList.actualPrice - b.groupPeriodActivityList.actualPrice
    },
    // 预约
    handleReserve(item) {
      if (this.$route.query.ProgramType == 1 && this.$route.query.ZZCTCanBuy != 1) {
        this.$toast('未到预约时间,请稍后再试')
        return
      }
      localStorage.setItem('TalentReserveGroupData', JSON.stringify(item))
      this.$router.push({
        path: '/talent_reserve',
        query: {
          ProgramType: this.$route.query.ProgramType,
          productSceneId: item.id,
        },
      })
    },
  },
}
</script>
<style lang="scss" scoped>
.package {
  padding: 18px 22px;
  .package_title {
    font-size: 28px;
    color: #999;
  }
  .package_box {
    display: flex;
    white-space: nowrap;
    margin-top: 22px;
    .package_item {
      position: relative;
      width: 128px;
      height: 152px;
      border-radius: 12px;
      border: 2px solid #dde3ef;
      box-sizing: border-box;
      display: inline-flex;
      align-content: center;
      justify-content: center;
      flex-wrap: wrap;
      vertical-align: top;
      margin-right: 16px;
      flex-shrink: 0;
      &.active {
        border-color: #3f92ff;
        .select {
          display: block;
        }
      }
      p {
        width: 100%;
        margin: 0;
        text-align: center;
      }
      .more_icon {
        width: 36px;
        margin-top: 10px;
      }
      .more_text {
        font-size: 22px;
        color: #fff;
        margin-top: 22px;
      }
      .date {
        font-size: 32px;
        font-weight: bold;
      }
      .week {
        font-size: 22px;
        color: #999;
      }
      .price {
        font-size: 28px;
        color: #ff2b2b;
        margin-top: 14px;
        span {
          font-size: 20px;
        }
      }
      .index {
        margin-right: 10px;
        font-size: 26px;
        font-weight: bold;
        color: #333;
      }
      .name {
        margin-top: 8px;
        font-size: 26px;
        white-space: nowrap;
      }
      .select {
        display: none;
        position: absolute;
        bottom: 0;
        right: 0;
        width: 46px;
        height: 48px;
      }
    }
    .package_item_more {
      background: #3f92ff;
      border: 2px solid #3f92ff;
      box-shadow: 6px 12px 16px 0px rgba(63, 146, 255, 0.29);
      margin-right: 0;
    }
    .package_item_type {
      width: auto;
      height: 118px;
      padding: 0 34px;
      .price {
        margin-top: 0;
      }
    }
  }
  .package_des {
    margin-top: 28px;
    font-size: 26px;
    line-height: 40px;
    color: #a9a9aa;
  }
  .period_item_box {
    background: rgb(246, 249, 254);
    border-radius: 20px;
    padding: 10px 20px;
    margin-top: 20px;
  }
  .period_nodata {
    margin-top: 20px;
    font-size: 28px;
    color: #999;
    text-align: center;
  }
  .period_item {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 20px 0;
    .period_des {
      font-size: 24px;
      margin-top: 10px;
    }
    .period_title {
      font-weight: bold;
      font-size: 28px;
    }
    .price {
      font-size: 28px;
      color: rgb(255, 47, 81);
      .old_price {
        text-decoration: line-through;
        font-size: 24px;
        color: #999;
      }
    }
    .btn {
      display: block;
      font-size: 24px;
      color: #fff;
      background: rgb(255, 47, 81);
      border-radius: 8px;
      padding: 10px 24px;
      margin-top: 10px;
    }
  }
}
</style>