index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <template>
  2. <!-- 修改logo -->
  3. <div class="page flex-col">
  4. <s-header :name="$t('device.viewLogs')" :noback="false"></s-header>
  5. <div class="block2 flex-row justify-between">
  6. <div class="block3 flex-col"></div>
  7. <span class="info2">{{ $t('device.equipmentName') }}:{{ deviceDetail ? deviceDetail.name : '' }}</span>
  8. </div>
  9. <div class="wrap1 flex-col o-pt-15">
  10. <van-field v-model="logsTime" is-link readonly label="日期" placeholder="点击选择时间" @click="chooseTime()" />
  11. <van-popup v-model:show="showPicker" round position="bottom">
  12. <van-datetime-picker v-model="logsTime" type="date" :min-date="minDate" :max-date="maxDate"
  13. @confirm="selectTime" @cancel="showPicker = false" />
  14. </van-popup>
  15. <van-button v-if="!downloading" round :disabled="logsTime === ''" type="primary" class="volumeChangeButton"
  16. @click="downloadBtn">{{ $t('device.download') }}</van-button>
  17. <van-button v-else disabled loading round class="volumeChangeButton" type="primary"
  18. :loading-text="$t('device.downloading')" />
  19. </div>
  20. </div>
  21. </template>
  22. <script>
  23. import {
  24. onMounted,
  25. computed,
  26. ref
  27. } from 'vue';
  28. import sHeader from "@/components/SimpleHeader.vue";
  29. import {
  30. downloadLog,
  31. getDeviceDetal
  32. } from "@/service/device";
  33. import { $M_ExportFile } from "@/common/js/utils";
  34. import {
  35. Toast
  36. } from "vant";
  37. import {
  38. useRoute
  39. } from "vue-router";
  40. import dateUtil from "@/utils/dateUtil";
  41. // import {useI18n} from "vue-i18n";
  42. export default ({
  43. components: {
  44. sHeader
  45. },
  46. setup() {
  47. // const { t } = useI18n();
  48. const route = useRoute();
  49. const deviceId = route.query.deviceId;
  50. const deviceDetail = ref(null);
  51. const showPicker = ref(false);
  52. const downloading = ref(false);
  53. const logsTime = ref(null);
  54. const curDate = new Date(); // 获取当前时间日期
  55. // 计算最小日期为当前日期7天前
  56. const minDate = computed(() => {
  57. const minTimestamp = curDate.getTime() - 6 * 24 * 3600 * 1000;
  58. const minDate = dateUtil.formateDate(new Date(minTimestamp), "yyyy-MM-dd");
  59. return new Date(minDate);
  60. });
  61. // 计算最大日期为当前日期
  62. const maxDate = computed(() => {
  63. return curDate;
  64. });
  65. // 初始化页面获取列表
  66. onMounted(async () => {
  67. await getDeviceDetailFun();
  68. // console.log(deviceDetail.value.name);
  69. });
  70. // 选择时间
  71. const chooseTime = () => {
  72. // console.log('chooseTime function is called');
  73. showPicker.value = true;
  74. console.log(showPicker.value);
  75. };
  76. const selectTime = (time) => {
  77. // console.log('selectTime function is called', time);
  78. logsTime.value = dateUtil.formateDate(time, "yyyy-MM-dd");
  79. showPicker.value = false;
  80. };
  81. const getDeviceDetailFun = async () => {
  82. const {
  83. data
  84. } = await getDeviceDetal({
  85. id: deviceId
  86. });
  87. if (data.code === '00000') {
  88. deviceDetail.value = data.data;
  89. } else {
  90. Toast.fail(data.message);
  91. }
  92. }
  93. const downloadBtn = async () => {
  94. const pattern = /^\d{4}-\d{2}-\d{2}$/;
  95. if(!pattern.test(logsTime.value)) {
  96. Toast.fail('日期格式有误');
  97. return;
  98. }
  99. const formattedDate = logsTime.value.replace(/-/g, '');
  100. downloading.value = true;
  101. try {
  102. const {
  103. headers, data
  104. } = await downloadLog({
  105. equipmentId: deviceId,
  106. day: formattedDate,
  107. });
  108. console.log('请求成功', headers, data);
  109. $M_ExportFile(data, headers);
  110. } catch (error) {
  111. if (error.code === 'ECONNABORTED') {
  112. // 处理请求超时的错误
  113. console.error('请求超时:', error);
  114. Toast.fail("请求超时");
  115. } else {
  116. // 处理其他请求错误
  117. console.error('请求失败:', error);
  118. Toast.fail("请求失败");
  119. }
  120. } finally {
  121. downloading.value = false;
  122. }
  123. }
  124. return {
  125. deviceDetail,
  126. downloadBtn,
  127. chooseTime,
  128. selectTime,
  129. showPicker,
  130. logsTime,
  131. minDate,
  132. maxDate,
  133. downloading,
  134. }
  135. },
  136. });
  137. </script>
  138. <style lang="less" scoped>
  139. @import "../../../common/style/common";
  140. .page {
  141. background-color: rgba(255, 255, 255, 1);
  142. position: relative;
  143. width: 100%;
  144. height: calc(100vh - 44px);
  145. overflow: hidden;
  146. .volumeChangeButton {
  147. background-color: #4d6add;
  148. width: 220px;
  149. height: 34px;
  150. margin: 49px auto;
  151. .van-button__text {
  152. font-size: 15px;
  153. }
  154. }
  155. .wrap1 {
  156. width: 100%;
  157. height: 274px;
  158. }
  159. .block2 {
  160. width: 162px;
  161. height: 20px;
  162. margin: 18px 0 0 15px;
  163. .block3 {
  164. background-color: rgba(128, 150, 236, 1);
  165. border-radius: 2px;
  166. width: 4px;
  167. height: 12px;
  168. margin-top: 4px;
  169. }
  170. .info2 {
  171. width: 150px;
  172. height: 20px;
  173. overflow-wrap: break-word;
  174. color: rgba(64, 77, 116, 1);
  175. font-size: 14px;
  176. font-family: PingFangSC-Medium;
  177. text-align: left;
  178. white-space: nowrap;
  179. line-height: 20px;
  180. display: block;
  181. }
  182. }
  183. }
  184. </style>