vue3项目中季度时间区间选择

10 篇文章 0 订阅

环境要求:vue3中
当前年月之前的可以选择,之后不可以选择;结束季度不能超过开始季度;如图效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
1、html结构代码

<div class="time">
  年:<el-date-picker
    :disabled-date="pickerOptions"
    v-model="startTime"
    type="year"
    placeholder="请选择"
    value-format="YYYY-MM-DD"
    @change="seasonFilterZone"
  />
</div>
<div class="time">
  开始季度:<el-select
    v-model="startSeason"
    class="m-2"
    placeholder="请选择"
    @change="changeFilterOne"
    @focus="seasonFilterOne"
  >
    <el-option
      v-for="item in seasonOpt.startSeasonOpt"
      :key="item.value"
      :label="item.label"
      :value="item.value"
      :disabled="item.disabled"
    />
  </el-select>
</div>
<div class="time">
  结束季度:<el-select
    v-model="endSeason"
    class="m-2"
    placeholder="请选择"
    @focus="seasonFilter"
  >
    <el-option
      v-for="item in seasonOpt.endSeasonOpt"
      :key="item.value"
      :label="item.label"
      :value="item.value"
      :disabled="item.disabled"
    />
  </el-select>
</div>

2、js代码

//引入moment
import moment from "moment";
import { ElMessage } from "element-plus";

let startTime = ref();
startTime.value = nowDate;
let startSeason = ref();
let endSeason = ref();
// 开始季度和结束季度的选择列表
const seasonOpt = reactive({
  startSeasonOpt: [
    {
      value: 1,
      label: "第一季度",
    },
    {
      value: 2,
      label: "第二季度",
    },
    {
      value: 3,
      label: "第三季度",
    },
    {
      value: 4,
      label: "第四季度",
    },
  ],
  endSeasonOpt: [
    {
      value: 1,
      label: "第一季度",
    },
    {
      value: 2,
      label: "第二季度",
    },
    {
      value: 3,
      label: "第三季度",
    },
    {
      value: 4,
      label: "第四季度",
    },
  ],
});

let nowYear = moment().format("YYYY"); //当前年
let nowSeason = moment().quarter(); // 当前季度
let nowMonth = moment().format("MM"); // 当前月
let nowDate = moment().startOf("day").format("YYYY-MM-DD"); // 当前日期
let befDate = moment().subtract(1, "day").format("YYYY-MM-DD"); // 前一天

// 年:控制当前日期前的不能选择
const pickerOptions = (time) => {
  const timedate = moment(time).format("YYYY-MM-DD");
  return moment(nowDate).isBefore(timedate);
};

//清除开始季度禁止选择
const clearStarSeaonOpt = () => {
  seasonOpt.startSeasonOpt.forEach((item) => {
    item.disabled = false;
  });
};
//清除结束季度禁止选择
const clearendSeaonOpt = () => {
  seasonOpt.endSeasonOpt.forEach((item) => {
    item.disabled = false;
  });
};
//年发生变化时清楚开始结束季度值,并且清楚开始季度的禁止选择项
const seasonFilterZone = () => {
  startSeason.value = "";
  endSeason.value = "";
  clearStarSeaonOpt();
};
//开始季度的季度选项控制在当前季度及其之前
const seasonFilterOne = () => {
  let currYear = moment(startTime.value).format("YYYY");
  if (currYear == nowYear) {
    seasonOpt.startSeasonOpt.forEach((item) => {
      if (item.value > nowSeason) {
        item.disabled = true;
      }
    });
    seasonOpt.endSeasonOpt.forEach((item) => {
      if (item.value > nowSeason) {
        item.disabled = true;
      }
    });
  } else {
    seasonOpt.startSeasonOpt.forEach((item) => {
      item.disabled = false;
    });
    seasonOpt.endSeasonOpt.forEach((item) => {
      item.disabled = false;
    });
  }
};
//开始季度改变时,开始季度新值如果在结束季度之后则清楚结束季度值
const changeFilterOne = (val) => {
  if (val > endSeason.value) {
    endSeason.value = "";
    //  clearendSeaonOpt()
  }
};
// 结束季度必须在开始季度之后
const seasonFilter = () => {
  seasonOpt.endSeasonOpt.forEach((item) => {
    if (startSeason.value > item.value) {
      item.disabled = true;
    }
  });
};

//点击统计时获取季度值
let data = {
 	oneTime: "",
 	twoTime: "",
};
if (startTime.value == undefined || startTime.value == "") {
	 ElMessage.warning("请选择时间");
	 return;
	} else if (startSeason.value == undefined || startSeason.value == "") {
	 ElMessage.warning("请选择开始季度");
	 return;
	} else {
	 let checkYear = moment(startTime.value).format("YYYY"); // 选中年
	 let checkStr = getSeaon(startSeason.value); // 选中季度开始月
	 let checkSym = checkYear + "-" + checkStr; // 选中开始年月
	
	 if (endSeason.value) {
		   // 有结束季度
		   data.oneTime = moment(checkSym).startOf("quarter").format("YYYY-MM-DD");
		   let checkEym = checkYear + "-" + getSeaon(endSeason.value);
		   if (checkYear == nowYear) {
		     if (nowSeason == startSeason.value || nowSeason == endSeason.value) {
		       data.twoTime = befDate;
		     }
		   } else {
		     data.twoTime = moment(checkEym).endOf("quarter").format("YYYY-MM-DD");
		   }
		   if (endSeason.value == startSeason.value) {
		     dateStr.startTime =
		       checkYear +
		       "年度-" +
		       seasonOpt.startSeasonOpt[startSeason.value - 1]?.label;
		   } else {
		     dateStr.startTime =
		       checkYear +
		       "年度-" +
		       seasonOpt.startSeasonOpt[startSeason.value - 1]?.value +
		       "~" +
		       seasonOpt.endSeasonOpt[endSeason.value - 1]?.value +
		       "季度";
		   }
	 } else {
		   // 无结束季度
		   data.oneTime = moment(checkSym).startOf("quarter").format("YYYY-MM-DD");
		   if (checkYear == nowYear) {
		     if (nowSeason == startSeason.value) {
		       data.twoTime = befDate;
		     }
		   } else {
		     data.twoTime = moment(checkSym).endOf("quarter").format("YYYY-MM-DD");
		   }
		   dateStr.startTime =
		     checkYear +
		     "年度-" +
		     seasonOpt.startSeasonOpt[startSeason.value - 1]?.label;
	}
	
 console.log("季度-参数", data);
 // ElMessage.warning("di-1");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值