index.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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="#4d6add" 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. // console.log(data);
  70. calendarDate = data;
  71. outputDate();
  72. };
  73. const outputDate = async () => {
  74. const params = {};
  75. // 今日
  76. if (timeType.value === "0") {
  77. params.chartType = "day";
  78. params.startDate = dateUtil.formateDate(
  79. new Date(new Date(new Date().getTime()).setHours(0, 0, 0, 0)),
  80. "yyyy-MM-dd hh:mm:ss"
  81. );
  82. params.endDate = dateUtil.formateDate(
  83. new Date(new Date(new Date().getTime()).setHours(23, 59, 59, 59)),
  84. "yyyy-MM-dd hh:mm:ss"
  85. );
  86. params.dateType = "2";
  87. }
  88. // 昨日
  89. if (timeType.value === "1") {
  90. let yesterday = new Date();
  91. yesterday.setDate(yesterday.getDate() - 1);
  92. params.chartType = "day";
  93. params.startDate = dateUtil.formateDate(
  94. new Date(new Date(yesterday.getTime()).setHours(0, 0, 0, 0)),
  95. "yyyy-MM-dd hh:mm:ss"
  96. );
  97. params.endDate = dateUtil.formateDate(
  98. new Date(new Date(yesterday.getTime()).setHours(23, 59, 59, 59)),
  99. "yyyy-MM-dd hh:mm:ss"
  100. );
  101. params.dateType = "2";
  102. }
  103. // 本周
  104. if (timeType.value === "2") {
  105. const curr = new Date();
  106. const dayOfWeek = curr.getDay();
  107. // 如果是周日,将当前日期设置到本周的周一
  108. if (dayOfWeek === 0 && user.ifForeign != '1') {
  109. curr.setDate(curr.getDate() - 6); // 将当前日期设置为本周的周一
  110. }
  111. const firstday = new Date(
  112. curr.setDate(curr.getDate() - curr.getDay() + 1)
  113. );
  114. const lastday = new Date(
  115. curr.setDate(curr.getDate() - curr.getDay() + 7)
  116. );
  117. params.chartType = "week";
  118. params.startDate =
  119. dateUtil.formateDate(firstday, "yyyy-MM-dd") + " 00:00:00";
  120. params.endDate =
  121. dateUtil.formateDate(lastday, "yyyy-MM-dd") + " 23:59:59";
  122. params.dateType = "2";
  123. }
  124. // 本月
  125. if (timeType.value === "3") {
  126. const now = new Date(); //当前日期
  127. const nowMonth = now.getMonth(); //当前月
  128. const nowYear = now.getFullYear(); //当前年
  129. params.chartType = "month";
  130. params.startDate =
  131. dateUtil.formateDate(new Date(nowYear, nowMonth, 1), "yyyy-MM-dd") +
  132. " 00:00:00";
  133. params.endDate =
  134. dateUtil.formateDate(
  135. new Date(nowYear, nowMonth + 1, 0),
  136. "yyyy-MM-dd"
  137. ) + " 23:59:59";
  138. params.dateType = "0";
  139. }
  140. // 其他时间
  141. if (timeType.value === "4") {
  142. let startTime = null;
  143. let endTime = null;
  144. if (chartType.value == '1') {
  145. // 按日统计
  146. const firstday = Date.parse(calendarDate[0]);
  147. const lastday = Date.parse(calendarDate[1]);
  148. const diffDate = Math.abs(firstday - lastday);
  149. const totalDays = Math.floor(diffDate / (1000 * 3600 * 24));
  150. if (totalDays === 0) {
  151. params.chartType = "day";
  152. } else {
  153. params.chartType = "month";
  154. }
  155. timeTypeShow.value = false;
  156. startTime = calendarDate[0];
  157. endTime = calendarDate[1];
  158. params.startDate =
  159. dateUtil.formateDate(startTime, "yyyy-MM-dd") + " 00:00:00";
  160. params.endDate =
  161. dateUtil.formateDate(endTime, "yyyy-MM-dd") + " 23:59:59";
  162. params.dateType = "2";
  163. } else if (chartType.value == '2') {
  164. // 按月统计
  165. params.chartType = "month";
  166. startTime = new Date(monthDate.value[0] + '-' + monthDate.value[1] + '-01');
  167. endTime = new Date(monthDate.value[0], monthDate.value[1], 0);
  168. params.startDate =
  169. dateUtil.formateDate(startTime, "yyyy-MM-dd") + " 00:00:00";
  170. params.endDate =
  171. dateUtil.formateDate(endTime, "yyyy-MM-dd") + " 23:59:59";
  172. timeTypeShow.value = false;
  173. params.dateType = "0";
  174. } else if (chartType.value == '3') {
  175. // 按年统计
  176. params.chartType = "year";
  177. startTime = new Date(yearDate.value[0] + '-01-01');
  178. endTime = new Date(yearDate.value[0] + '-12-31');
  179. params.startDate =
  180. dateUtil.formateDate(startTime, "yyyy-MM-dd") + " 00:00:00";
  181. params.endDate =
  182. dateUtil.formateDate(endTime, "yyyy-MM-dd") + " 23:59:59";
  183. timeTypeShow.value = false;
  184. params.dateType = "1";
  185. }
  186. }
  187. emit('update', params);
  188. };
  189. // 统计类型
  190. const timeTypeShow = ref(false);
  191. const timeTypeList = [
  192. { text: t('dateSelectList.dayType'), value: "1" },
  193. { text: t('dateSelectList.monthType'), value: "2" },
  194. { text: t('dateSelectList.yearType'), value: "3" },
  195. ];
  196. const timeTypeConfirm = ({ selectedOptions }) => {
  197. // console.log('selectedOptions[0].text', selectedOptions[0].value);
  198. // 按日统计
  199. chartType.value = selectedOptions[0].value;
  200. if (selectedOptions[0].value == '1') {
  201. calendarShow.value = true;
  202. } else if (selectedOptions[0].value == '2') {
  203. monthDateShow.value = true;
  204. } else if (selectedOptions[0].value == '3') {
  205. yearDateShow.value = true;
  206. }
  207. }
  208. const timeTypeCancel = () => { timeTypeShow.value = false; }
  209. // 按月统计
  210. // 创建一个Date对象,表示当前时间
  211. const currentDate = new Date();
  212. // 获取当前时间的年份
  213. const currentYear = currentDate.getFullYear();
  214. // 获取当前时间的月份(注意,月份是从0开始的,所以要加1)
  215. const currentMonth = currentDate.getMonth() + 1;
  216. const monthDateShow = ref(false);
  217. const monthDate = ref([currentYear, currentMonth]);
  218. const monthDateType = ['year', 'month'];
  219. const monthDateConfirm = () => {
  220. monthDateShow.value = false;
  221. outputDate();
  222. }
  223. const monthDateCancel = () => { monthDateShow.value = false; }
  224. // 按年统计
  225. const yearDateShow = ref(false);
  226. const yearDateType = ['year'];
  227. const yearDate = ref([currentYear]);
  228. const yearDateConfirm = () => {
  229. yearDateShow.value = false;
  230. outputDate();
  231. }
  232. const yearDateCancel = () => { yearDateShow.value = false; }
  233. return {
  234. minDate,
  235. maxDate,
  236. timeType,
  237. timeChange,
  238. calendarShow,
  239. calendarConfirm,
  240. timeTypeShow,
  241. timeTypeList,
  242. timeTypeConfirm,
  243. timeTypeCancel,
  244. monthDateShow,
  245. monthDateType,
  246. monthDateConfirm,
  247. monthDateCancel,
  248. monthDate,
  249. yearDateShow,
  250. yearDateType,
  251. yearDateConfirm,
  252. yearDateCancel,
  253. yearDate
  254. };
  255. },
  256. };
  257. </script>
  258. <style lang="less" scoped>
  259. @import "@/common/style/common.less";
  260. @import "./index.less";
  261. </style>