DeviceHistoryChart.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <template>
  2. <div>
  3. <a-form :model="formState" layout="inline" :label-col="{ style: { width: '80px' } }"
  4. :wrapper-col="{ span: 8 }" autocomplete="off" @submit.prevent="handleQuery">
  5. <a-form-item label="查询设备">
  6. <a-select v-model:value="formState.selectedDeviceId" style="width: 180px">
  7. <a-select-option v-for="d in deviceList" :key="d.deviceId" :value="d.deviceId">{{ d.name }}</a-select-option>
  8. </a-select>
  9. </a-form-item>
  10. <a-form-item label="分析点位">
  11. <a-select v-model:value="formState.selectedValueCode" style="width: 180px">
  12. <a-select-option v-for="item in valueCodeList" :key="item.valuecode" :value="item.valuecode">
  13. {{ item.valuename || item.valuecode }}
  14. </a-select-option>
  15. </a-select>
  16. </a-form-item>
  17. <a-form-item label="开始时间">
  18. <a-date-picker
  19. v-model:value="formState.startTime"
  20. style="width:180px"
  21. show-time
  22. valueFormat="YYYY-MM-DD HH:mm:ss"
  23. placeholder="请选择开始时间"
  24. :disabled-date="disabledStartDate"
  25. />
  26. </a-form-item>
  27. <a-form-item label="结束时间">
  28. <a-date-picker
  29. v-model:value="formState.endTime"
  30. style="width:180px"
  31. show-time
  32. valueFormat="YYYY-MM-DD HH:mm:ss"
  33. placeholder="请选择结束时间"
  34. :disabled-date="disabledEndDate"
  35. />
  36. </a-form-item>
  37. <a-form-item>
  38. <a-button type="primary" html-type="submit">查询</a-button>
  39. </a-form-item>
  40. </a-form>
  41. <div style="margin-top: 16px;" class="wang">
  42. <BarAndLine
  43. :key="chartKey"
  44. v-if="finalDataSource.length && finalChartsColumns.length"
  45. :chartsColumnsType="chartsColumnsType"
  46. :xAxisPropType="xAxisPropType"
  47. :dataSource="finalDataSource"
  48. :height="height"
  49. :chartsColumns="finalChartsColumns"
  50. :chartsType="chartsType"
  51. :option="option"
  52. @refresh="$emit('refresh')"
  53. />
  54. </div>
  55. </div>
  56. </template>
  57. <script lang="ts">
  58. import { defineComponent, ref, watch, onMounted, computed, reactive } from 'vue';
  59. import { message } from 'ant-design-vue';
  60. import dayjs from 'dayjs';
  61. import BarAndLine from './BarAndLine.vue';
  62. import { getDeviceHistoryData } from '@/views/vent/monitorManager/deviceMonitor/components/device/device.api';
  63. import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
  64. export default defineComponent({
  65. name: 'DeviceHistoryChart',
  66. components: { BarAndLine },
  67. props: {
  68. chartsColumnsType: String,
  69. xAxisPropType: String,
  70. dataSource: {
  71. type: Array,
  72. default: () => [],
  73. },
  74. height: {
  75. type: String,
  76. default: '400px',
  77. },
  78. chartsColumns: {
  79. type: Array,
  80. default: () => [],
  81. },
  82. chartsType: {
  83. type: String,
  84. default: 'history',
  85. },
  86. option: {
  87. type: Object,
  88. default: () => ({
  89. grid: { top: '20%', left: '10px', right: '5px', bottom: '10%', containLabel: true },
  90. toolbox: { feature: {} },
  91. }),
  92. },
  93. },
  94. emits: ['refresh'],
  95. setup(props, { emit }) {
  96. // 查询表单相关
  97. const deviceList = ref([
  98. { deviceId: '1657545388451663016', name: '辅运平硐111' },
  99. ]);
  100. const valueCodeList = ref(props.chartsColumns);
  101. // 用reactive统一管理表单状态
  102. const formState = reactive({
  103. selectedDeviceId: deviceList.value[0]?.deviceId || '',
  104. selectedValueCode: valueCodeList.value[0]?.valuecode || '',
  105. startTime: dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'),
  106. endTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  107. });
  108. const chartData = ref<any[]>([]);
  109. const chartColumns = ref<any[]>([]);
  110. const isQueried = ref(false);
  111. // 图表key,用于查询后强制刷新图表
  112. const chartKey = ref(0);
  113. function disabledStartDate(current: any) {
  114. if (!formState.endTime) return false;
  115. return current && current.valueOf() > dayjs(formState.endTime).valueOf();
  116. }
  117. function disabledEndDate(current: any) {
  118. if (!formState.startTime) return false;
  119. return current && current.valueOf() < dayjs(formState.startTime).valueOf();
  120. }
  121. watch(() => formState.selectedDeviceId, (newVal) => {
  122. if (!newVal) return;
  123. chartColumns.value = getTableHeaderColumns(formState.selectedDeviceId + '_chart');
  124. });
  125. onMounted(() => {
  126. chartColumns.value = getTableHeaderColumns(formState.selectedDeviceId + '_chart');
  127. });
  128. async function handleQuery() {
  129. if (!formState.selectedDeviceId || !formState.selectedValueCode) {
  130. message.warning('请选择设备和分析点位');
  131. return;
  132. }
  133. try {
  134. const res = await getDeviceHistoryData({
  135. deviceId: formState.selectedDeviceId,
  136. valueCode: formState.selectedValueCode,
  137. startTime: formState.startTime,
  138. endTime: formState.endTime,
  139. });
  140. if (res && Array.isArray(res.list)) {
  141. chartData.value = res.list.map(item => ({
  142. ...item,
  143. [formState.selectedValueCode]: Number(item.val),
  144. }));
  145. chartColumns.value = getTableHeaderColumns(formState.selectedDeviceId + '_chart');
  146. isQueried.value = true;
  147. // 查询成功后更新key,强制刷新图表
  148. chartKey.value += 1;
  149. } else {
  150. chartData.value = [];
  151. chartColumns.value = [];
  152. isQueried.value = true;
  153. message.info('未查询到数据');
  154. }
  155. } catch (e) {
  156. chartData.value = [];
  157. chartColumns.value = [];
  158. isQueried.value = true;
  159. message.error('查询失败');
  160. }
  161. }
  162. // 只要查询过就用查询数据,否则用外部props
  163. const finalDataSource = computed(() => {
  164. return isQueried.value ? chartData.value : props.dataSource;
  165. });
  166. const finalChartsColumns = computed(() => {
  167. return isQueried.value ? chartColumns.value : props.chartsColumns;
  168. });
  169. return {
  170. deviceList,
  171. valueCodeList,
  172. formState,
  173. chartData,
  174. chartColumns,
  175. handleQuery,
  176. finalDataSource,
  177. finalChartsColumns,
  178. chartsColumnsType: props.chartsColumnsType,
  179. xAxisPropType: props.xAxisPropType,
  180. height: props.height,
  181. chartsType: props.chartsType,
  182. option: props.option,
  183. disabledStartDate,
  184. disabledEndDate,
  185. chartKey,
  186. };
  187. },
  188. });
  189. </script>
  190. <style lang="less" scoped>
  191. @import '/@/design/theme.less';
  192. .zxm-form-item {
  193. margin-right: 26px ;
  194. ::v-deep .zxm-form-item-label {
  195. color: #fff;
  196. > label {
  197. color: #fff;
  198. }
  199. }
  200. }
  201. </style>