index.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <div class="dateSelectListBox flex-col">
  3. <div class="Tabs1 flex-col">
  4. <div class="timeTabBox">
  5. <div class="timeTab" :class="{ active: timeType === '0' }" @click="timeChange('0')">
  6. {{ $t('dateSelectList.today') }}</div>
  7. <div class="timeTab" :class="{ active: timeType === '1' }" @click="timeChange('1')">
  8. {{ $t('dateSelectList.yesterday') }}</div>
  9. <div class="timeTab" :class="{ active: timeType === '2' }" @click="timeChange('2')">
  10. {{ $t('dateSelectList.thisWeek') }}</div>
  11. <div class="timeTab" :class="{ active: timeType === '3' }" @click="timeChange('3')">
  12. {{ $t('dateSelectList.thisMonth') }}</div>
  13. <div class="timeTab" :class="{ active: timeType === '4' }" @click="timeChange('4')">
  14. {{ $t('dateSelectList.other') }}
  15. <div class="block3 flex-col"></div>
  16. </div>
  17. <!-- 日期选择 -->
  18. <van-calendar color="#2c87c8" v-model:show="calendarShow" type="range" :max-range="31" :show-confirm="false"
  19. :allow-same-day="true" :min-date="minDate" :max-date="maxDate" @confirm="calendarConfirm" />
  20. <!-- 选择统计类型 -->
  21. <van-popup v-model:show="timeTypeShow" position="bottom">
  22. <van-picker :title="$t('dateSelectList.timeType')" :columns="timeTypeList" @confirm="timeTypeConfirm"
  23. @cancel="timeTypeCancel" />
  24. </van-popup>
  25. <!-- 按月统计 -->
  26. <van-popup v-model:show="monthDateShow" position="bottom">
  27. <van-date-picker v-model="monthDate" :title="$t('dateSelectList.monthDate')" :min-date="minDate" :max-date="maxDate" @confirm="monthDateConfirm" @cancel="monthDateCancel"
  28. :columns-type="monthDateType" />
  29. </van-popup>
  30. <!-- 按年统计 -->
  31. <van-popup v-model:show="yearDateShow" position="bottom">
  32. <van-date-picker v-model="yearDate" :title="$t('dateSelectList.monthDate')" :min-date="minDate" :max-date="maxDate" @confirm="yearDateConfirm" @cancel="yearDateCancel"
  33. :columns-type="yearDateType" />
  34. </van-popup>
  35. </div>
  36. </div>
  37. </div>
  38. </template>
  39. <script>
  40. import { ref } from "vue";
  41. import dateUtil from "@/utils/dateUtil";
  42. import { getLoginUser } from "@/common/js/utils";
  43. // import { showToast } from "vant";
  44. import { useI18n } from 'vue-i18n';
  45. export default {
  46. name: "dateSelectList",
  47. components: {},
  48. setup(props, { emit }) {
  49. const minDate = new Date(2022, 0, 1);
  50. const maxDate = new Date();
  51. const { t } = useI18n();
  52. const user = getLoginUser();
  53. // 时间类型
  54. const timeType = ref("0");
  55. // 统计类型
  56. const chartType = ref("0");
  57. // 时间类型切换
  58. const timeChange = (data) => {
  59. timeType.value = data;
  60. // 当时时间类型切换为其他时间弹出日期控件
  61. // (data === "4") ? calendarShow.value = true : outputDate();
  62. (data === "4") ? timeTypeShow.value = true : outputDate();
  63. };
  64. let calendarDate = [];
  65. const calendarShow = ref(false);
  66. // 其他时间日期组件确认返回
  67. const calendarConfirm = (data) => {
  68. calendarShow.value = false;
  69. calendarDate = data;
  70. outputDate();
  71. };
  72. const outputDate = async () => {
  73. const params = {};
  74. // 今日
  75. if (timeType.value === "0") {
  76. params.chartType = "day";
  77. params.startDate = dateUtil.formateDate(
  78. new Date(new Date(new Date().getTime()).setHours(0, 0, 0, 0)),
  79. "yyyy-MM-dd hh:mm:ss"
  80. );
  81. params.endDate = dateUtil.formateDate(
  82. new Date(new Date(new Date().getTime()).setHours(23, 59, 59, 59)),
  83. "yyyy-MM-dd hh:mm:ss"
  84. );
  85. params.dateType = "2";
  86. }
  87. // 昨日
  88. if (timeType.value === "1") {
  89. let yesterday = new Date();
  90. yesterday.setDate(yesterday.getDate() - 1);
  91. params.chartType = "day";
  92. params.startDate = dateUtil.formateDate(
  93. new Date(new Date(yesterday.getTime()).setHours(0, 0, 0, 0)),
  94. "yyyy-MM-dd hh:mm:ss"
  95. );
  96. params.endDate = dateUtil.formateDate(
  97. new Date(new Date(yesterday.getTime()).setHours(23, 59, 59, 59)),
  98. "yyyy-MM-dd hh:mm:ss"
  99. );
  100. params.dateType = "2";
  101. }
  102. // 本周
  103. if (timeType.value === "2") {
  104. const curr = new Date();
  105. const dayOfWeek = curr.getDay();
  106. // 如果是周日,将当前日期设置到本周的周一
  107. if (dayOfWeek === 0 && user.ifForeign != '1') {
  108. curr.setDate(curr.getDate() - 6); // 将当前日期设置为本周的周一
  109. }
  110. const firstday = new Date(
  111. curr.setDate(curr.getDate() - curr.getDay() + 1)
  112. );
  113. const lastday = new Date(
  114. curr.setDate(curr.getDate() - curr.getDay() + 7)
  115. );
  116. params.chartType = "week";
  117. params.startDate =
  118. dateUtil.formateDate(firstday, "yyyy-MM-dd") + " 00:00:00";
  119. params.endDate =
  120. dateUtil.formateDate(lastday, "yyyy-MM-dd") + " 23:59:59";
  121. params.dateType = "2";
  122. }
  123. // 本月
  124. if (timeType.value === "3") {
  125. const now = new Date(); //当前日期
  126. const nowMonth = now.getMonth(); //当前月
  127. const nowYear = now.getFullYear(); //当前年
  128. params.chartType = "month";
  129. params.startDate =
  130. dateUtil.formateDate(new Date(nowYear, nowMonth, 1), "yyyy-MM-dd") +
  131. " 00:00:00";
  132. params.endDate =
  133. dateUtil.formateDate(
  134. new Date(nowYear, nowMonth + 1, 0),
  135. "yyyy-MM-dd"
  136. ) + " 23:59:59";
  137. params.dateType = "0";
  138. }
  139. // 其他时间
  140. if (timeType.value === "4") {
  141. let startTime = null;
  142. let endTime = null;
  143. if (chartType.value == '1') {
  144. // 按日统计
  145. const firstday = Date.parse(calendarDate[0]);
  146. const lastday = Date.parse(calendarDate[1]);
  147. const diffDate = Math.abs(firstday - lastday);
  148. const totalDays = Math.floor(diffDate / (1000 * 3600 * 24));
  149. if (totalDays === 0) {
  150. params.chartType = "day";
  151. } else {
  152. params.chartType = "month";
  153. }
  154. timeTypeShow.value = false;
  155. startTime = calendarDate[0];
  156. endTime = calendarDate[1];
  157. params.startDate =
  158. dateUtil.formateDate(startTime, "yyyy-MM-dd") + " 00:00:00";
  159. params.endDate =
  160. dateUtil.formateDate(endTime, "yyyy-MM-dd") + " 23:59:59";
  161. params.dateType = "2";
  162. } else if (chartType.value == '2') {
  163. // 按月统计
  164. params.chartType = "month";
  165. startTime = new Date(monthDate.value[0] + '-' + monthDate.value[1] + '-01');
  166. endTime = new Date(monthDate.value[0], monthDate.value[1], 0);
  167. params.startDate =
  168. dateUtil.formateDate(startTime, "yyyy-MM-dd") + " 00:00:00";
  169. params.endDate =
  170. dateUtil.formateDate(endTime, "yyyy-MM-dd") + " 23:59:59";
  171. timeTypeShow.value = false;
  172. params.dateType = "0";
  173. } else if (chartType.value == '3') {
  174. // 按年统计
  175. params.chartType = "year";
  176. startTime = new Date(yearDate.value[0] + '-01-01');
  177. endTime = new Date(yearDate.value[0] + '-12-31');
  178. params.startDate =
  179. dateUtil.formateDate(startTime, "yyyy-MM-dd") + " 00:00:00";
  180. params.endDate =
  181. dateUtil.formateDate(endTime, "yyyy-MM-dd") + " 23:59:59";
  182. timeTypeShow.value = false;
  183. params.dateType = "1";
  184. }
  185. }
  186. emit('update', params);
  187. };
  188. // 统计类型
  189. const timeTypeShow = ref(false);
  190. const timeTypeList = [
  191. { text: t('dateSelectList.dayType'), value: "1" },
  192. { text: t('dateSelectList.monthType'), value: "2" },
  193. { text: t('dateSelectList.yearType'), value: "3" },
  194. ];
  195. const timeTypeConfirm = ({ selectedOptions }) => {
  196. // 按日统计
  197. chartType.value = selectedOptions[0].value;
  198. if (selectedOptions[0].value == '1') {
  199. calendarShow.value = true;
  200. } else if (selectedOptions[0].value == '2') {
  201. monthDateShow.value = true;
  202. } else if (selectedOptions[0].value == '3') {
  203. yearDateShow.value = true;
  204. }
  205. }
  206. const timeTypeCancel = () => { timeTypeShow.value = false; }
  207. // 按月统计
  208. // 创建一个Date对象,表示当前时间
  209. const currentDate = new Date();
  210. // 获取当前时间的年份
  211. const currentYear = currentDate.getFullYear();
  212. // 获取当前时间的月份(注意,月份是从0开始的,所以要加1)
  213. const currentMonth = currentDate.getMonth() + 1;
  214. const monthDateShow = ref(false);
  215. const monthDate = ref([currentYear, currentMonth]);
  216. const monthDateType = ['year', 'month'];
  217. const monthDateConfirm = () => {
  218. monthDateShow.value = false;
  219. outputDate();
  220. }
  221. const monthDateCancel = () => { monthDateShow.value = false; }
  222. // 按年统计
  223. const yearDateShow = ref(false);
  224. const yearDateType = ['year'];
  225. const yearDate = ref([currentYear]);
  226. const yearDateConfirm = () => {
  227. yearDateShow.value = false;
  228. outputDate();
  229. }
  230. const yearDateCancel = () => { yearDateShow.value = false; }
  231. return {
  232. minDate,
  233. maxDate,
  234. timeType,
  235. timeChange,
  236. calendarShow,
  237. calendarConfirm,
  238. timeTypeShow,
  239. timeTypeList,
  240. timeTypeConfirm,
  241. timeTypeCancel,
  242. monthDateShow,
  243. monthDateType,
  244. monthDateConfirm,
  245. monthDateCancel,
  246. monthDate,
  247. yearDateShow,
  248. yearDateType,
  249. yearDateConfirm,
  250. yearDateCancel,
  251. yearDate
  252. };
  253. },
  254. };
  255. </script>
  256. <style lang="less" scoped>
  257. @import "@/common/style/common.less";
  258. @import "./index.less";
  259. </style>