<template>
  <view class="w-picker-view">
    <view
      style="
			        display: flex;
			        justify-content: space-around;
			        font-size: 18px;
			        font-weight: 700;
			        padding: 30upx 0;
			        border-bottom: 1rpx solid rgb(134 134 134);
			        border-top: 1rpx solid rgb(134 134 134);
			        color:#1936C9
			      "
    >
      <template v-if="fields == 'minute'">
        <view>年份</view>
        <view>月</view>
        <view>日</view>
        <view>时</view>
        <view>分</view>
      </template>
      <template v-if="fields == 'day'">
        <view>年份</view>
        <view>月</view>
        <view>日</view>
      </template>
    </view>
    <picker-view
      v-if="fields == 'year'"
      class="d-picker-view"
      :indicator-style="itemHeight"
      :value="pickVal"
      @change="handlerChange"
    >
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.years" :key="index">{{ item }}年</view>
      </picker-view-column>
    </picker-view>
    <picker-view
      v-if="fields == 'month'"
      class="d-picker-view"
      :indicator-style="itemHeight"
      :value="pickVal"
      @change="handlerChange"
    >
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.years" :key="index">{{ item }}年</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.months" :key="index">{{ item }}月</view>
      </picker-view-column>
    </picker-view>
    <picker-view
      v-if="fields == 'day'"
      class="d-picker-view"
      :indicator-style="itemHeight"
      :value="pickVal"
      @change="handlerChange"
    >
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.years" :key="index">{{ item }}年</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.months" :key="index">{{ item }}月</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.days" :key="index">{{ item }}日</view>
      </picker-view-column>
    </picker-view>
    <picker-view
      v-if="fields == 'hour'"
      class="d-picker-view"
      :indicator-style="itemHeight"
      :value="pickVal"
      @change="handlerChange"
    >
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.years" :key="index">{{ item }}年</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.months" :key="index">{{ item }}月</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.days" :key="index">{{ item }}日</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.hours" :key="index">{{ item }}时</view>
      </picker-view-column>
    </picker-view>
    <picker-view
      v-if="fields == 'minute'"
      class="d-picker-view"
      :indicator-style="itemHeight"
      :value="pickVal"
      @change="handlerChange"
    >
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.years" :key="index">{{ item }}年</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.months" :key="index">{{ item }}月</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.days" :key="index">{{ item }}日</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.hours" :key="index">{{ item }}时</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.minutes" :key="index">{{ item }}分</view>
      </picker-view-column>
    </picker-view>
    <picker-view
      v-if="fields == 'second'"
      class="d-picker-view"
      :indicator-style="itemHeight"
      :value="pickVal"
      @change="handlerChange"
    >
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.years" :key="index">{{ item }}年</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.months" :key="index">{{ item }}月</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.days" :key="index">{{ item }}日</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.hours" :key="index">{{ item }}时</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.minutes" :key="index">{{ item }}分</view>
      </picker-view-column>
      <picker-view-column>
        <view class="w-picker-item" v-for="(item, index) in range.seconds" :key="index">{{ item }}秒</view>
      </picker-view-column>
    </picker-view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      pickVal: [],
      range: {
        years: [],
        months: [],
        days: [],
        hours: [],
        minutes: [],
        seconds: []
      },
      checkObj: {}
    };
  },
  props: {
    itemHeight: {
      type: String,
      default: "44px"
    },
    startYear: {
      type: [String, Number],
      default: ""
    },
    endYear: {
      type: [String, Number],
      default: ""
    },
    value: {
      type: [String, Array, Number],
      default: ""
    },
    current: {
      //是否默认选中当前日期
      type: Boolean,
      default: false
    },
    disabledAfter: {
      //是否禁用当前之后的日期
      type: Boolean,
      default: false
    },
    fields: {
      type: String,
      default: "day"
    },
    // disabledMonth: {
    // 	type: Number,
    // 	default: 0,
    // },
    // disabledRange: {
    // 	type: Array,
    // 	default: ''
    // },
    disabledBefore: {
      //是否禁用当前之前的日期
      type: Boolean,
      default: false
    }
  },
  watch: {
    fields(val) {
      this.initData();
    },
    value(val) {
      this.initData();
    }
  },
  created() {
    this.initData();
  },
  methods: {
    formatNum(n) {
      return Number(n) < 10 ? "0" + Number(n) : Number(n) + "";
    },
    checkValue(value) {
      let strReg, example;
      switch (this.fields) {
        case "year":
          strReg = /^\d{4}$/;
          example = "2019";
          break;
        case "month":
          strReg = /^\d{4}-\d{2}$/;
          example = "2019-02";
          break;
        case "day":
          strReg = /^\d{4}-\d{2}-\d{2}$/;
          example = "2019-02-01";
          break;
        case "hour":
          strReg = /^\d{4}-\d{2}-\d{2} \d{2}(:\d{2}){1,2}?$/;
          example = "2019-02-01 18:00:00或2019-02-01 18";
          break;
        case "minute":
          strReg = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}(:\d{2}){0,1}?$/;
          example = "2019-02-01 18:06:00或2019-02-01 18:06";
          break;
        case "second":
          strReg = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
          example = "2019-02-01 18:06:01";
          break;
      }
      if (!strReg.test(value)) {
        console.log(
          new Error(
            "请传入与mode、fields匹配的value值,例value=" + example + ""
          )
        );
      }
      return strReg.test(value);
    },
    resetData(year, month, day, hour, minute) {
      // let disabledRange = this.disabledRange
      let curDate = this.getCurrenDate();
      let curFlag = this.current;
      let curYear = curDate.curYear;
      let curMonth = curDate.curMonth;
      let curDay = curDate.curDay;
      let curHour = curDate.curHour;
      let curMinute = curDate.curMinute;
      let curSecond = curDate.curSecond;
      let months = [],
        days = [],
        hours = [],
        minutes = [],
        seconds = [];
      let disabledAfter = this.disabledAfter;
      let disabledBefore = this.disabledBefore;
      let monthsLen = disabledAfter ? (year * 1 < curYear ? 12 : curMonth) : 12;
      let totalDays = new Date(year, month, 0).getDate(); //计算当月有几天;
      let daysLen = disabledAfter
        ? year * 1 < curYear || month * 1 < curMonth
          ? totalDays
          : curDay
        : totalDays;
      let hoursLen = disabledAfter
        ? year * 1 < curYear || month * 1 < curMonth || day * 1 < curDay
          ? 24
          : curHour + 1
        : 24;
      let minutesLen = disabledAfter
        ? year * 1 < curYear ||
          month * 1 < curMonth ||
          day * 1 < curDay ||
          hour * 1 < curHour
          ? 60
          : curMinute + 1
        : 60;
      let secondsLen = disabledAfter
        ? year * 1 < curYear ||
          month * 1 < curMonth ||
          day * 1 < curDay ||
          hour * 1 < curHour ||
          minute * 1 < curMinute
          ? 60
          : curSecond + 1
        : 60;
      for (let month = 1; month <= monthsLen; month++) {
        months.push(this.formatNum(month));
      }

      for (let day = 1; day <= daysLen; day++) {
        days.push(this.formatNum(day));
      }
      for (let hour = 0; hour < hoursLen; hour++) {
        hours.push(this.formatNum(hour));
      }
      for (let minute = 0; minute < minutesLen; minute++) {
        minutes.push(this.formatNum(minute));
      }
      for (let second = 0; second < secondsLen; second++) {
        seconds.push(this.formatNum(second));
      }
      const index2 = days.findIndex(item => item === this.formatNum(curDay));
      const electiveDays = days.slice(index2);
      const index = months.findIndex(item => item === this.formatNum(curMonth));
      const electiveMonths = months.slice(index);
      // let electiveDays = days.filter(item => !disabledRange.includes(item))
      days = this.disabledBefore
        ? year * 1 === curYear && month * 1 === curMonth
          ? electiveDays
          : days
        : days;
      months = this.disabledBefore
        ? year * 1 === curYear
          ? electiveMonths
          : months
        : months;

      return {
        months,
        days,
        hours,
        minutes,
        seconds
      };
    },
    isLeapYear(Year) {
      if ((Year % 4 == 0 && Year % 100 != 0) || Year % 400 == 0) {
        return true;
      } else {
        return false;
      }
    },
    getData(dVal) {
      //用来处理初始化数据
      let curFlag = this.current;
      let disabledAfter = this.disabledAfter;
      let fields = this.fields;
      let curDate = this.getCurrenDate();
      let curYear = curDate.curYear;
      let curMonthdays = curDate.curMonthdays;
      let curMonth = curDate.curMonth;
      let curDay = curDate.curDay;
      let curHour = curDate.curHour;
      let curMinute = curDate.curMinute;
      let curSecond = curDate.curSecond;
      let defaultDate = this.getDefaultDate();
      let startYear = this.getStartDate().getFullYear();
      let endYear = this.getEndDate().getFullYear();
      //颗粒度,禁用当前之后日期仅对year,month,day,hour生效;分钟秒禁用没有意义,
      let years = [],
        months = [],
        days = [],
        hours = [],
        minutes = [],
        seconds = [];
      let year = dVal[0] * 1;
      let month = dVal[1] * 1;
      let day = dVal[2] * 1;
      let hour = dVal[3] * 1;
      let minute = dVal[4] * 1;
      let monthsLen = disabledAfter
        ? year < curYear
          ? 12
          : curDate.curMonth
        : 12;
      let daysLen = disabledAfter
        ? year < curYear || month < curMonth
          ? defaultDate.defaultDays
          : curDay
        : curFlag
        ? curMonthdays
        : defaultDate.defaultDays;
      let hoursLen = disabledAfter
        ? year < curYear || month < curMonth || day < curDay
          ? 24
          : curHour + 1
        : 24;
      let minutesLen = disabledAfter
        ? year < curYear || month < curMonth || day < curDay || hour < curHour
          ? 60
          : curMinute + 1
        : 60;
      let secondsLen = disabledAfter
        ? year < curYear ||
          month < curMonth ||
          day < curDay ||
          hour < curHour ||
          minute < curMinute
          ? 60
          : curSecond + 1
        : 60;
      for (
        let year = startYear;
        year <= (disabledAfter ? curYear : endYear);
        year++
      ) {
        years.push(year.toString());
      }
      for (let month = 1; month <= monthsLen; month++) {
        months.push(this.formatNum(month));
      }
      for (let day = 1; day <= daysLen; day++) {
        days.push(this.formatNum(day));
      }
      for (let hour = 0; hour < hoursLen; hour++) {
        hours.push(this.formatNum(hour));
      }
      for (let minute = 0; minute < minutesLen; minute++) {
        minutes.push(this.formatNum(minute));
      }
      // for(let second=0;second<(disabledAfter?curDate.curSecond+1:60);second++){
      // 	seconds.push(this.formatNum(second));
      // }
      for (let second = 0; second < 60; second++) {
        seconds.push(this.formatNum(second));
      }
      const index2 = days.findIndex(item => item === this.formatNum(curDay));
      const electiveDays = days.slice(index2);
      const index = months.findIndex(item => item === this.formatNum(curMonth));
      const electiveMonths = months.slice(index);
      days = this.disabledBefore
        ? year * 1 === curYear && month * 1 === curMonth
          ? electiveDays
          : days
        : days;
      months = this.disabledBefore
        ? year * 1 === curYear
          ? electiveMonths
          : months
        : months;
      return {
        years,
        months,
        days,
        hours,
        minutes,
        seconds
      };
    },
    getCurrenDate() {
      let curDate = new Date();
      let curYear = curDate.getFullYear();
      let curMonth = curDate.getMonth() + 1;
      let curMonthdays = new Date(curYear, curMonth, 0).getDate();
      let curDay = curDate.getDate();
      let curHour = curDate.getHours();
      let curMinute = curDate.getMinutes();
      let curSecond = curDate.getSeconds();
      return {
        curDate,
        curYear,
        curMonth,
        curMonthdays,
        curDay,
        curHour,
        curMinute,
        curSecond
      };
    },
    getDefaultDate() {
      let value = this.value;
      let reg = /-/g;
      let defaultDate = value ? new Date(value.replace(reg, "/")) : new Date();
      let defaultYear = defaultDate.getFullYear();
      let defaultMonth = defaultDate.getMonth() + 1;
      let defaultDay = defaultDate.getDate();
      let defaultDays = new Date(defaultYear, defaultMonth, 0).getDate() * 1;
      return {
        defaultDate,
        defaultYear,
        defaultMonth,
        defaultDay,
        defaultDays
      };
    },
    getStartDate() {
      let start = this.startYear;
      let startDate = "";
      let reg = /-/g;
      if (start) {
        startDate = new Date(start + "/01/01");
      } else {
        startDate = new Date("1970/01/01");
      }
      return startDate;
    },
    getEndDate() {
      let end = this.endYear;
      let reg = /-/g;
      let endDate = "";
      if (end) {
        endDate = new Date(end + "/12/01");
      } else {
        endDate = new Date();
      }
      return endDate;
    },
    getDval() {
      let value = this.value;
      let fields = this.fields;
      let dVal = null;
      let aDate = new Date();
      let year = this.formatNum(aDate.getFullYear());
      let month = this.formatNum(aDate.getMonth() + 1);
      let day = this.formatNum(aDate.getDate());
      let hour = this.formatNum(aDate.getHours());
      let minute = this.formatNum(aDate.getMinutes());
      let second = this.formatNum(aDate.getSeconds());
      if (value) {
        let flag = this.checkValue(value);
        if (!flag) {
          dVal = [year, month, day, hour, minute, second];
        } else {
          switch (this.fields) {
            case "year":
              dVal = value ? [value] : [];
              break;
            case "month":
              dVal = value ? value.split("-") : [];
              break;
            case "day":
              dVal = value ? value.split("-") : [];
              break;
            case "hour":
              dVal = [
                ...value.split(" ")[0].split("-"),
                ...value.split(" ")[1].split(":")
              ];
              break;
            case "minute":
              dVal = value
                ? [
                    ...value.split(" ")[0].split("-"),
                    ...value.split(" ")[1].split(":")
                  ]
                : [];
              break;
            case "second":
              dVal = [
                ...value.split(" ")[0].split("-"),
                ...value.split(" ")[1].split(":")
              ];
              break;
          }
        }
      } else {
        dVal = [year, month, day, hour, minute, second];
      }
      return dVal;
    },
    initData() {
      let startDate,
        endDate,
        startYear,
        endYear,
        startMonth,
        endMonth,
        startDay,
        endDay;
      let years = [],
        months = [],
        days = [],
        hours = [],
        minutes = [],
        seconds = [];
      let dVal = [],
        pickVal = [];
      let value = this.value;
      let reg = /-/g;
      let range = {};
      let result = "",
        full = "",
        year,
        month,
        day,
        hour,
        minute,
        second,
        obj = {};
      let defaultDate = this.getDefaultDate();
      let defaultYear = defaultDate.defaultYear;
      let defaultMonth = defaultDate.defaultMonth;
      let defaultDay = defaultDate.defaultDay;
      let defaultDays = defaultDate.defaultDays;
      let curFlag = this.current;
      let disabledAfter = this.disabledAfter;
      let curDate = this.getCurrenDate();
      let curYear = curDate.curYear;
      let curMonth = curDate.curMonth;
      let curMonthdays = curDate.curMonthdays;
      let curDay = curDate.curDay;
      let curHour = curDate.curHour;
      let curMinute = curDate.curMinute;
      let curSecond = curDate.curSecond;
      let dateData = [];
      dVal = this.getDval();
      startDate = this.getStartDate();
      endDate = this.getEndDate();
      startYear = startDate.getFullYear();
      startMonth = startDate.getMonth();
      startDay = startDate.getDate();
      endYear = endDate.getFullYear();
      endMonth = endDate.getMonth();
      endDay = endDate.getDate();
      dateData = this.getData(dVal);
      years = dateData.years;
      months = dateData.months;
      days = dateData.days;
      hours = dateData.hours;
      minutes = dateData.minutes;
      seconds = dateData.seconds;
      switch (this.fields) {
        case "year":
          pickVal = disabledAfter
            ? [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0
              ]
            : curFlag
            ? [years.indexOf(curYear + "")]
            : [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0
              ];
          range = { years };
          year = dVal[0] ? dVal[0] : years[0];
          result = full = `${year}`;
          obj = {
            year
          };
          break;
        case "month":
          pickVal = disabledAfter
            ? [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0
              ]
            : curFlag
            ? [
                years.indexOf(curYear + ""),
                months.indexOf(this.formatNum(curMonth))
              ]
            : [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0
              ];
          range = { years, months };
          year = dVal[0] ? dVal[0] : years[0];
          month = dVal[1] ? dVal[1] : months[0];
          result = full = `${year + "-" + month}`;
          obj = {
            year,
            month
          };
          break;
        case "day":
          pickVal = disabledAfter
            ? [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0,
                dVal[2] && days.indexOf(dVal[2]) != -1
                  ? days.indexOf(dVal[2])
                  : 0
              ]
            : curFlag
            ? [
                years.indexOf(curYear + ""),
                months.indexOf(this.formatNum(curMonth)),
                days.indexOf(this.formatNum(curDay))
              ]
            : [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0,
                dVal[2] && days.indexOf(dVal[2]) != -1
                  ? days.indexOf(dVal[2])
                  : 0
              ];
          range = { years, months, days };
          year = dVal[0] ? dVal[0] : years[0];
          month = dVal[1] ? dVal[1] : months[0];
          day = dVal[2] ? dVal[2] : days[0];
          result = full = `${year + "-" + month + "-" + day}`;
          obj = {
            year,
            month,
            day
          };
          break;
        case "hour":
          pickVal = disabledAfter
            ? [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0,
                dVal[2] && days.indexOf(dVal[2]) != -1
                  ? days.indexOf(dVal[2])
                  : 0,
                dVal[3] && hours.indexOf(dVal[3]) != -1
                  ? hours.indexOf(dVal[3])
                  : 0
              ]
            : curFlag
            ? [
                years.indexOf(curYear + ""),
                months.indexOf(this.formatNum(curMonth)),
                days.indexOf(this.formatNum(curDay)),
                hours.indexOf(this.formatNum(curHour))
              ]
            : [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0,
                dVal[2] && days.indexOf(dVal[2]) != -1
                  ? days.indexOf(dVal[2])
                  : 0,
                dVal[3] && hours.indexOf(dVal[3]) != -1
                  ? hours.indexOf(dVal[3])
                  : 0
              ];
          range = { years, months, days, hours };
          year = dVal[0] ? dVal[0] : years[0];
          month = dVal[1] ? dVal[1] : months[0];
          day = dVal[2] ? dVal[2] : days[0];
          hour = dVal[3] ? dVal[3] : hours[0];
          result = `${year + "-" + month + "-" + day + " " + hour}`;
          full = `${year + "-" + month + "-" + day + " " + hour + ":00:00"}`;
          obj = {
            year,
            month,
            day,
            hour
          };
          break;
        case "minute":
          pickVal = disabledAfter
            ? [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0,
                dVal[2] && days.indexOf(dVal[2]) != -1
                  ? days.indexOf(dVal[2])
                  : 0,
                dVal[3] && hours.indexOf(dVal[3]) != -1
                  ? hours.indexOf(dVal[3])
                  : 0,
                dVal[4] && minutes.indexOf(dVal[4]) != -1
                  ? minutes.indexOf(dVal[4])
                  : 0
              ]
            : curFlag
            ? [
                years.indexOf(curYear + ""),
                months.indexOf(this.formatNum(curMonth)),
                days.indexOf(this.formatNum(curDay)),
                hours.indexOf(this.formatNum(curHour)),
                minutes.indexOf(this.formatNum(curMinute))
              ]
            : [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0,
                dVal[2] && days.indexOf(dVal[2]) != -1
                  ? days.indexOf(dVal[2])
                  : 0,
                dVal[3] && hours.indexOf(dVal[3]) != -1
                  ? hours.indexOf(dVal[3])
                  : 0,
                dVal[4] && minutes.indexOf(dVal[4]) != -1
                  ? minutes.indexOf(dVal[4])
                  : 0
              ];
          range = { years, months, days, hours, minutes };
          year = dVal[0] ? dVal[0] : years[0];
          month = dVal[1] ? dVal[1] : months[0];
          day = dVal[2] ? dVal[2] : days[0];
          hour = dVal[3] ? dVal[3] : hours[0];
          minute = dVal[4] ? dVal[4] : minutes[0];
          full = `${year +
            "-" +
            month +
            "-" +
            day +
            " " +
            hour +
            ":" +
            minute +
            ":00"}`;
          result = `${year +
            "-" +
            month +
            "-" +
            day +
            " " +
            hour +
            ":" +
            minute}`;
          obj = {
            year,
            month,
            day,
            hour,
            minute
          };
          break;
        case "second":
          pickVal = disabledAfter
            ? [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0,
                dVal[2] && days.indexOf(dVal[2]) != -1
                  ? days.indexOf(dVal[2])
                  : 0,
                dVal[3] && hours.indexOf(dVal[3]) != -1
                  ? hours.indexOf(dVal[3])
                  : 0,
                dVal[4] && minutes.indexOf(dVal[4]) != -1
                  ? minutes.indexOf(dVal[4])
                  : 0,
                dVal[5] && seconds.indexOf(dVal[5]) != -1
                  ? seconds.indexOf(dVal[5])
                  : 0
              ]
            : curFlag
            ? [
                years.indexOf(curYear + ""),
                months.indexOf(this.formatNum(curMonth)),
                days.indexOf(this.formatNum(curDay)),
                hours.indexOf(this.formatNum(curHour)),
                minutes.indexOf(this.formatNum(curMinute)),
                seconds.indexOf(this.formatNum(curSecond))
              ]
            : [
                dVal[0] && years.indexOf(dVal[0]) != -1
                  ? years.indexOf(dVal[0])
                  : 0,
                dVal[1] && months.indexOf(dVal[1]) != -1
                  ? months.indexOf(dVal[1])
                  : 0,
                dVal[2] && days.indexOf(dVal[2]) != -1
                  ? days.indexOf(dVal[2])
                  : 0,
                dVal[3] && hours.indexOf(dVal[3]) != -1
                  ? hours.indexOf(dVal[3])
                  : 0,
                dVal[4] && minutes.indexOf(dVal[4]) != -1
                  ? minutes.indexOf(dVal[4])
                  : 0,
                dVal[5] && seconds.indexOf(dVal[5]) != -1
                  ? seconds.indexOf(dVal[5])
                  : 0
              ];
          range = { years, months, days, hours, minutes, seconds };
          year = dVal[0] ? dVal[0] : years[0];
          month = dVal[1] ? dVal[1] : months[0];
          day = dVal[2] ? dVal[2] : days[0];
          hour = dVal[3] ? dVal[3] : hours[0];
          minute = dVal[4] ? dVal[4] : minutes[0];
          second = dVal[5] ? dVal[5] : seconds[0];
          result = full = `${year +
            "-" +
            month +
            "-" +
            day +
            " " +
            hour +
            ":" +
            minute +
            ":" +
            second}`;
          obj = {
            year,
            month,
            day,
            hour,
            minute,
            second
          };
          break;
        default:
          range = { years, months, days };
          break;
      }
      this.range = range;
      this.checkObj = obj;
      this.$emit("change", {
        result: result,
        value: full,
        obj: obj
      });
      this.$nextTick(() => {
        this.pickVal = pickVal;
      });
    },
    handlerChange(e) {
      let arr = [...e.detail.value];
      let data = this.range;
      let year = "",
        month = "",
        day = "",
        hour = "",
        minute = "",
        second = "";
      let result = "",
        full = "",
        obj = {};
      let months = null,
        days = null,
        hours = null,
        minutes = null,
        seconds = null;
      let disabledAfter = this.disabledAfter;
      let leapYear = false,
        resetData = {};
      year =
        arr[0] || arr[0] == 0
          ? data.years[arr[0]] || data.years[data.years.length - 1]
          : "";
      month =
        arr[1] || arr[1] == 0
          ? data.months[arr[1]] || data.months[data.months.length - 1]
          : "";
      day =
        arr[2] || arr[2] == 0
          ? data.days[arr[2]] || data.days[data.days.length - 1]
          : "";
      hour =
        arr[3] || arr[3] == 0
          ? data.hours[arr[3]] || data.hours[data.hours.length - 1]
          : "";
      minute =
        arr[4] || arr[4] == 0
          ? data.minutes[arr[4]] || data.minutes[data.minutes.length - 1]
          : "";
      second =
        arr[5] || arr[5] == 0
          ? data.seconds[arr[5]] || data.seconds[data.seconds.length - 1]
          : "";
      resetData = this.resetData(year, month, day, hour, minute); //重新拉取当前日期数据;
      month =
        arr[1] || arr[1] == 0
          ? resetData.months[arr[1]] ||
            resetData.months[resetData.months.length - 1]
          : "";
      day =
        arr[2] || arr[2] == 0
          ? resetData.days[arr[2]] || resetData.days[resetData.days.length - 1]
          : "";
      resetData = this.resetData(year, month, day, hour, minute); //重新拉取当前日期数据;
      month =
        arr[1] || arr[1] == 0
          ? resetData.months[arr[1]] ||
            resetData.months[resetData.months.length - 1]
          : "";
      day =
        arr[2] || arr[2] == 0
          ? resetData.days[arr[2]] || resetData.days[resetData.days.length - 1]
          : "";
      resetData = this.resetData(year, month, day, hour, minute); //重新拉取当前日期数据;
      leapYear = this.isLeapYear(year); //判断是否为闰年;
      switch (this.fields) {
        case "year":
          result = full = `${year}`;
          obj = {
            year
          };
          break;
        case "month":
          result = full = `${year + "-" + month}`;
          if (this.disabledAfter) months = resetData.months;
          if (this.disabledBefore) months = resetData.months;
          if (months) this.range.months = months;
          obj = {
            year,
            month
          };
          break;
        case "day":
          result = full = `${year + "-" + month + "-" + day}`;
          if (this.disabledAfter) {
            months = resetData.months;
            days = resetData.days;
          } else if (this.disabledBefore) {
            months = resetData.months;
            days = resetData.days;
          } else {
            if (leapYear || month != this.checkObj.month || month == 2) {
              days = resetData.days;
            }
          }
          if (months) this.range.months = months;
          if (days) this.range.days = days;
          obj = {
            year,
            month,
            day
          };
          break;
        case "hour":
          result = `${year + "-" + month + "-" + day + " " + hour}`;
          full = `${year + "-" + month + "-" + day + " " + hour + ":00:00"}`;
          if (this.disabledAfter) {
            months = resetData.months;
            days = resetData.days;
            hours = resetData.hours;
          } else if (this.disabledBefore) {
            months = resetData.months;
            days = resetData.days;
            hours = resetData.hours;
          } else {
            if (leapYear || month != this.checkObj.month || month == 2) {
              days = resetData.days;
            }
          }
          if (months) this.range.months = months;
          if (days) this.range.days = days;
          if (hours) this.range.hours = hours;
          obj = {
            year,
            month,
            day,
            hour
          };
          break;
        case "minute":
          full = `${year +
            "-" +
            month +
            "-" +
            day +
            " " +
            hour +
            ":" +
            minute +
            ":00"}`;
          result = `${year +
            "-" +
            month +
            "-" +
            day +
            " " +
            hour +
            ":" +
            minute}`;
          if (this.disabledAfter) {
            months = resetData.months;
            days = resetData.days;
            hours = resetData.hours;
            minutes = resetData.minutes;
          } else if (this.disabledBefore) {
            months = resetData.months;
            days = resetData.days;
            hours = resetData.hours;
            minutes = resetData.minutes;
          } else {
            if (leapYear || month != this.checkObj.month || month == 2) {
              days = resetData.days;
            }
          }
          if (months) this.range.months = months;
          if (days) this.range.days = days;
          if (hours) this.range.hours = hours;
          if (minutes) this.range.minutes = minutes;
          obj = {
            year,
            month,
            day,
            hour,
            minute
          };
          break;
        case "second":
          result = full = `${year +
            "-" +
            month +
            "-" +
            day +
            " " +
            hour +
            ":" +
            minute +
            ":" +
            second}`;
          if (this.disabledAfter) {
            months = resetData.months;
            days = resetData.days;
            hours = resetData.hours;
            minutes = resetData.minutes;
            //seconds=resetData.seconds;
          } else {
            if (leapYear || month != this.checkObj.month || month == 2) {
              days = resetData.days;
            }
          }
          if (months) this.range.months = months;
          if (days) this.range.days = days;
          if (hours) this.range.hours = hours;
          if (minutes) this.range.minutes = minutes;
          //if(seconds)this.range.seconds=seconds;
          obj = {
            year,
            month,
            day,
            hour,
            minute,
            second
          };
          break;
      }
      this.checkObj = obj;
      this.$emit("change", {
        result: result,
        value: full,
        obj: obj
      });
    }
  }
};
</script>

<style lang="scss">
@import "./w-picker.css";
</style>