index.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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="186" :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. </div>
  31. </div>
  32. </div>
  33. </template>
  34. <script>
  35. import { ref } from "vue";
  36. import dateUtil from "@/utils/dateUtil";
  37. import { getLoginUser } from "@/common/js/utils";
  38. // import { showToast } from "vant";
  39. import { useI18n } from 'vue-i18n';
  40. export default {
  41. name: "dateSelectList",
  42. components: {},
  43. setup(props, { emit }) {
  44. const minDate = new Date(2022, 0, 1);
  45. const maxDate = new Date();
  46. const { t } = useI18n();
  47. const user = getLoginUser();
  48. // 时间类型
  49. const timeType = ref("0");
  50. // 统计类型
  51. const chartType = ref("0");
  52. // 时间类型切换
  53. const timeChange = (data) => {
  54. timeType.value = data;
  55. // 当时时间类型切换为其他时间弹出日期控件
  56. // (data === "4") ? calendarShow.value = true : outputDate();
  57. (data === "4") ? timeTypeShow.value = true : outputDate();
  58. };
  59. let calendarDate = [];
  60. const calendarShow = ref(false);
  61. // 其他时间日期组件确认返回
  62. const calendarConfirm = (data) => {
  63. calendarShow.value = false;
  64. console.log(data);
  65. calendarDate = data;
  66. outputDate();
  67. };
  68. const outputDate = async () => {
  69. const params = {};
  70. // 今日
  71. if (timeType.value === "0") {
  72. params.chartType = "day";
  73. params.startDate = dateUtil.formateDate(
  74. new Date(new Date(new Date().getTime()).setHours(0, 0, 0, 0)),
  75. "yyyy-MM-dd hh:mm:ss"
  76. );
  77. params.endDate = dateUtil.formateDate(
  78. new Date(new Date(new Date().getTime()).setHours(23, 59, 59, 59)),
  79. "yyyy-MM-dd hh:mm:ss"
  80. );
  81. }
  82. // 昨日
  83. if (timeType.value === "1") {
  84. let yesterday = new Date();
  85. yesterday.setDate(yesterday.getDate() - 1);
  86. params.chartType = "day";
  87. params.startDate = dateUtil.formateDate(
  88. new Date(new Date(yesterday.getTime()).setHours(0, 0, 0, 0)),
  89. "yyyy-MM-dd hh:mm:ss"
  90. );
  91. params.endDate = dateUtil.formateDate(
  92. new Date(new Date(yesterday.getTime()).setHours(23, 59, 59, 59)),
  93. "yyyy-MM-dd hh:mm:ss"
  94. );
  95. }
  96. // 本周
  97. if (timeType.value === "2") {
  98. const curr = new Date();
  99. const dayOfWeek = curr.getDay();
  100. // 如果是周日,将当前日期设置到本周的周一
  101. if (dayOfWeek === 0 && user.ifForeign != '1') {
  102. curr.setDate(curr.getDate() - 6); // 将当前日期设置为本周的周一
  103. }
  104. const firstday = new Date(
  105. curr.setDate(curr.getDate() - curr.getDay() + 1)
  106. );
  107. const lastday = new Date(
  108. curr.setDate(curr.getDate() - curr.getDay() + 7)
  109. );
  110. params.chartType = "week";
  111. params.startDate =
  112. dateUtil.formateDate(firstday, "yyyy-MM-dd") + " 00:00:00";
  113. params.endDate =
  114. dateUtil.formateDate(lastday, "yyyy-MM-dd") + " 23:59:59";
  115. }
  116. // 本月
  117. if (timeType.value === "3") {
  118. const now = new Date(); //当前日期
  119. const nowMonth = now.getMonth(); //当前月
  120. const nowYear = now.getFullYear(); //当前年
  121. params.chartType = "month";
  122. params.startDate =
  123. dateUtil.formateDate(new Date(nowYear, nowMonth, 1), "yyyy-MM-dd") +
  124. " 00:00:00";
  125. params.endDate =
  126. dateUtil.formateDate(
  127. new Date(nowYear, nowMonth + 1, 0),
  128. "yyyy-MM-dd"
  129. ) + " 23:59:59";
  130. }
  131. // 其他时间
  132. if (timeType.value === "4") {
  133. let startTime = null;
  134. let endTime = null;
  135. if (chartType.value == '1') {
  136. // 按日统计
  137. const firstday = Date.parse(calendarDate[0]);
  138. const lastday = Date.parse(calendarDate[1]);
  139. const diffDate = Math.abs(firstday - lastday);
  140. const totalDays = Math.floor(diffDate / (1000 * 3600 * 24));
  141. if (totalDays === 0) {
  142. params.chartType = "day";
  143. } else {
  144. params.chartType = "month";
  145. }
  146. timeTypeShow.value = false;
  147. startTime = calendarDate[0];
  148. endTime = calendarDate[1];
  149. params.startDate =
  150. dateUtil.formateDate(startTime, "yyyy-MM-dd") + " 00:00:00";
  151. params.endDate =
  152. dateUtil.formateDate(endTime, "yyyy-MM-dd") + " 23:59:59";
  153. } else {
  154. // 按月统计
  155. params.chartType = "month";
  156. startTime = new Date(monthDate.value[0] + '-' + monthDate.value[1] + '-01');
  157. endTime = new Date(monthDate.value[0], monthDate.value[1], 0);
  158. // endTime = new Date(monthEndDate.value[0] + '-' + monthEndDate.value[1] + '-01');
  159. console.log("startTime", startTime);
  160. console.log("endTime", endTime);
  161. params.startDate =
  162. dateUtil.formateDate(startTime, "yyyy-MM-dd") + " 00:00:00";
  163. params.endDate =
  164. dateUtil.formateDate(endTime, "yyyy-MM-dd") + " 23:59:59";
  165. timeTypeShow.value = false;
  166. }
  167. }
  168. emit('update', params);
  169. };
  170. // 统计类型
  171. const timeTypeShow = ref(false);
  172. const timeTypeList = [
  173. { text: t('dateSelectList.dayType'), value: "1" },
  174. { text: t('dateSelectList.monthType'), value: "2" },
  175. ];
  176. const timeTypeConfirm = ({ selectedOptions }) => {
  177. console.log('selectedOptions[0].text', selectedOptions[0].value);
  178. // 按日统计
  179. chartType.value = selectedOptions[0].value;
  180. if (selectedOptions[0].value == '1') {
  181. calendarShow.value = true;
  182. } else {
  183. monthDateShow.value = true;
  184. }
  185. }
  186. const timeTypeCancel = () => { timeTypeShow.value = false; }
  187. // 按月统计
  188. // 创建一个Date对象,表示当前时间
  189. const currentDate = new Date();
  190. // 获取当前时间的年份
  191. const currentYear = currentDate.getFullYear();
  192. // 获取当前时间的月份(注意,月份是从0开始的,所以要加1)
  193. const currentMonth = currentDate.getMonth() + 1;
  194. const monthDateShow = ref(false);
  195. const monthDate = ref([currentYear, currentMonth]);
  196. const monthDateType = ['year', 'month'];
  197. const monthDateConfirm = () => {
  198. const date1 = new Date(monthDate.value[0], monthDate.value[1], 0);
  199. console.log('date1', date1);
  200. monthDateShow.value = false;
  201. outputDate();
  202. }
  203. const monthDateCancel = () => { monthDateShow.value = false; }
  204. return {
  205. minDate,
  206. maxDate,
  207. timeType,
  208. timeChange,
  209. calendarShow,
  210. calendarConfirm,
  211. timeTypeShow,
  212. timeTypeList,
  213. timeTypeConfirm,
  214. timeTypeCancel,
  215. monthDateShow,
  216. monthDateType,
  217. monthDateConfirm,
  218. monthDateCancel,
  219. monthDate,
  220. };
  221. },
  222. };
  223. </script>
  224. <style lang="less" scoped>
  225. @import "@/common/style/common.less";
  226. @import "./index.less";
  227. </style>