123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578 |
- <template>
- <div class="h-full flex flex-col gap-y-3">
- <n-page-header @back="$router.back">
- <template #title> 数据编辑 </template>
- </n-page-header>
- <div class="flex-1 grid grid-cols-4 gap-x-3">
- <n-card>
- <n-tabs display-directive="show">
- <n-tab-pane name="1" tab="设备">
- <n-list>
- <template #header>
- <n-checkbox v-model:checked="checked" @update:checked="handleSelectAll">
- 全选
- </n-checkbox>
- </template>
- <n-scrollbar :style="{ maxHeight: `${height - 310}px` }" trigger="none">
- <n-checkbox-group v-model:value="checkValues" @update:value="handleCheckValues">
- <template v-for="item of classList" :key="item.T_id">
- <n-list-item class="mr-5">
- <template #prefix>
- <n-checkbox :value="item.T_id" />
- </template>
- <template #suffix>
- <n-space :wrap="false">
- <EditClass :task="task" :taskClass="item" :getClassList="getClassList" />
- <DeleteClass :task="task" :taskClass="item" :getClassList="getClassList" />
- </n-space>
- </template>
- <n-thing>
- <template #header> {{ item.T_id }} </template>
- <template #description> {{ item.T_sn }} </template>
- </n-thing>
- </n-list-item>
- </template>
- </n-checkbox-group>
- </n-scrollbar>
- <template #footer>
- <n-gradient-text type="info">
- 传感器总数:{{ classList.length }}
- </n-gradient-text>
- </template>
- </n-list>
- </n-tab-pane>
- <n-tab-pane name="2" tab="表单">
- <FormList :task="task" :class-list="classList" :time="time" :temporal-interval="temporalInterval" />
- </n-tab-pane>
- </n-tabs>
- </n-card>
- <n-card class="h-full col-span-3">
- <div class="h-full flex flex-col gap-y-3">
- <n-space justify="space-between">
- <n-input-group>
- <n-date-picker format="yyyy-MM-dd HH:mm" :time-picker-props="{ format: 'HH:mm' }" @update:formatted-value="(value) => {
- queryData.Time_start = value[0];
- queryData.Time_end = value[1];
- }
- " type="datetimerange" clearable />
- <n-button type="primary" @click="getDataList">搜索</n-button>
- </n-input-group>
- <n-space>
- <ExportVue :task="task" :class-list="classList" />
- <ImportVue :task="task" />
- <ImportPlatform :task="task" />
- <AddVue :class-list="classList" :task="task" />
- <SetVue @submit="handleSet" />
- </n-space>
- </n-space>
- <n-tabs type="segment" animated v-model:value="tabChart" @update:value="handleTabChange">
- <n-tab-pane name="温度" tab="温度">
- <Chart :style="{ minHeight: `${height - 300}px` }" ref="chart1" constructor-type="stockChart"
- :options="chartOptions1"></Chart>
- </n-tab-pane>
- <n-tab-pane name="湿度" tab="湿度">
- <Chart :style="{ minHeight: `${height - 300}px` }" ref="chart2" constructor-type="stockChart"
- :options="chartOptions2"></Chart>
- </n-tab-pane>
- </n-tabs>
- </div>
- </n-card>
- </div>
- </div>
- <n-modal v-model:show="modal.showModal" :title="modal.title" :show-icon="false" preset="dialog">
- <template v-if="modal.title === '温度'">
- <n-form-item show-require-mark>
- <n-input v-model:value="formValue.T_t" />
- </n-form-item>
- </template>
- <template v-else>
- <n-form-item show-require-mark>
- <n-input v-model:value="formValue.T_rh" />
- </n-form-item>
- </template>
- <n-space justify="end">
- <n-popconfirm @positive-click="deleteTask">
- <template #trigger>
- <n-button type="error">删除该点</n-button>
- </template>
- 是否确认删除?
- </n-popconfirm>
- <n-button type="primary" @click="editTask">确定</n-button>
-
- </n-space>
- </n-modal>
- </template>
- <script setup>
- import { Chart } from 'highcharts-vue';
- import {
- deleteTaskData,
- editTaskData,
- getTaskDataClassList,
- getTaskDataList,
- } from '@/api';
- import AddVue from './AddVue.vue';
- import ImportVue from './ImportVue.vue';
- import ImportPlatform from './ImportPlatform.vue';
- import SetVue from './SetVue.vue';
- import ExportVue from './ExportVue.vue';
- import FormList from './FormList.vue';
- // import ForData from './formData.vue';
- import { useWindowSize } from '@vueuse/core';
- import { useNow, useDateFormat } from '@vueuse/core';
- import EditClass from './EditTaskClass.vue';
- import DeleteClass from './DeleteTaskClass.vue';
- import { dateFormat } from 'highcharts';
- import { TimeData } from '@/plugin/timeFun';
- const formatted = useDateFormat(useNow(), 'YYYY-MM-DD HH:mm:ss');
- const notification = useNotification();
- const { height } = useWindowSize();
- const message = useMessage();
- const task = window.sessionStorage.getItem('task')
- ? JSON.parse(window.sessionStorage.getItem('task'))
- : {};
- const chart1 = ref(null);
- const chart2 = ref(null);
- // Modal 数据源
- const modal = reactive({
- showModal: false,
- title: '',
- });
- // 查询数据
- const queryData = reactive({
- T_task_id: task.T_task_id,
- T_sn: '',
- T_id: '',
- Time_start: '2023-02-06 21:00',
- Time_end: '2023-02-06 21:10',
- page: 1,
- page_z: 9999999,
- });
- // 表单数据
- const formValue = reactive({
- T_t: null,
- T_rh: null,
- });
- // 数据源对象
- // const state = reactive({});
- // 设备列表
- const classList = ref([]);
- // 列表
- const dataList = ref([]);
- //
- const dataInfo = ref({});
- // 选项组受控模式下的值
- const checkValues = ref(null);
- // tab
- const tabChart = ref('温度');
- const handleTabChange = (value) => {
- console.log(value);
- checkValues.value = [];
- checked.value = false;
- };
- //
- const handleSet = (data) => {
- if (tabChart.value === '温度') {
- chart1.value.chart.yAxis[0].addPlotLine({
- color: 'red',
- width: 2,
- value: data.tTop,
- label: {
- text: `上限(${data.tTop})`,
- },
- });
- chart1.value.chart.yAxis[0].addPlotLine({
- color: 'red',
- width: 2,
- value: data.tBottom,
- label: {
- text: `下限(${data.tBottom})`,
- },
- });
- } else {
- chart2.value.chart.yAxis[0].addPlotLine({
- color: 'red',
- width: 2,
- value: data.hTop,
- label: {
- text: `上限(${data.hTop})`,
- },
- });
- chart2.value.chart.yAxis[0].addPlotLine({
- color: 'red',
- width: 2,
- value: data.hBottom,
- label: {
- text: `下限(${data.hBottom})`,
- },
- });
- }
- };
- const checked = ref(false);
- // 全选
- const handleSelectAll = async (value) => {
- if (value) {
- checkValues.value = classList.value.map((item) => item.T_id);
- const arr = classList.value.filter(
- (item) => !selectedValue.value.includes(item.T_id)
- );
- for (let item of arr) {
- queryData.T_id = item.T_id;
- queryData.T_sn = item.T_sn;
- await getDataList();
- if (tabChart.value === '温度') {
- const data1 = dataList.value
- .map((item) => [new Date(item.T_time).getTime(), item.T_t])
- .sort((a, b) => a[0] - b[0]);
- chart1.value.chart.addSeries({
- id: item.T_id,
- name: item.T_id,
- data: data1,
- lineWidth: 1,
- cursor: 'pointer',
- events: {
- click(e) {
-
- modal.title = '温度';
- modal.showModal = true;
- time.value = dateFormat('%Y-%m-%d %H:%M:%S', e.point.x);
- formValue.T_t = e.point.y;
- queryData.T_id = e.point.series.name;
- getDataList();
- dataInfo.value = dataList.value[e.point.index];
- },
- },
- });
- } else {
- const data2 = dataList.value
- .map((item) => [new Date(item.T_time).getTime(), item.T_rh])
- .sort((a, b) => a[0] - b[0]);
- chart2.value.chart.addSeries({
- id: item.T_id,
- name: item.T_id,
- data: data2,
- lineWidth: 1,
- cursor: 'pointer',
- events: {
- click(e) {
- console.log('////',e)
- modal.title = '湿度';
- modal.showModal = true;
- time.value = dateFormat('%Y-%m-%d %H:%M:%S', e.point.x);
- formValue.T_rh = e.point.y;
- queryData.T_id = e.point.series.name;
- getDataList();
- dataInfo.value = dataList.value[e.point.index];
- },
- },
- });
- }
- }
- } else {
- if (tabChart.value === '温度') {
- classList.value.forEach((item) => {
- chart1.value.chart.get(item.T_id).remove();
- });
- } else {
- classList.value.forEach((item) => {
- chart2.value.chart.get(item.T_id).remove();
- });
- }
- checkValues.value = [];
- }
- };
- const time = ref('');
- const selectedValue = ref([]);
- // 选项组的值改变时的回调
- const handleCheckValues = async (values, meta) => {
- selectedValue.value = values;
- const classInfo = classList.value.find((item) => item.T_id === meta.value);
- queryData.T_id = classInfo.T_id;
- queryData.T_sn = classInfo.T_sn;
- await getDataList();
- const data1 = dataList.value
- .map((item) => [new Date(item.T_time).getTime(), item.T_t])
- .sort((a, b) => a[0] - b[0]);
- const data2 = dataList.value
- .map((item) => [new Date(item.T_time).getTime(), item.T_rh])
- .sort((a, b) => a[0] - b[0]);
- if (meta.actionType === 'check') {
- if (tabChart.value === '温度') {
- chart1.value.chart.addSeries({
- id: meta.value,
- name: meta.value,
- data: data1,
- cursor: 'pointer',
- events: {
- click(e) {
- console.log('/=======================///',e,TimeData(e.point.x))
-
- modal.title = '温度';
- modal.showModal = true;
- time.value = TimeData(e.point.x);
- formValue.T_t = e.point.y;
- queryData.T_id = e.point.series.name;
- getDataList();
- dataInfo.value = dataList.value[e.point.index];
- },
- },
- });
- } else {
- chart2.value.chart.addSeries({
- id: meta.value,
- name: meta.value,
- data: data2,
- events: {
- click(e) {
- console.log('点击11119',e)
- modal.title = '湿度';
- modal.showModal = true;
- time.value = dateFormat('%Y-%m-%d %H:%M:%S', e.point.x);
- formValue.T_rh = e.point.y;
- queryData.T_id = e.point.series.name;
- getDataList();
- dataInfo.value = dataList.value[e.point.index];
- },
- },
- });
- }
- } else {
- if (tabChart.value === '温度') {
- chart1.value.chart.get(meta.value).remove();
- } else {
- chart2.value.chart.get(meta.value).remove();
- }
- }
- };
- const temporalInterval = ref('');
- // 图表配置
- const chartOptions1 = {
- xAxis: {
- labels: {
- format: '{value:%Y-%m-%d %H:%M:%S}',
- },
- },
- time: {
- useUTC: false
- },
- boost: {
- useGPUTranslations: true
- },
- tooltip: {
- xDateFormat: '%Y-%m-%d %H:%M:%S',
- // headerFormat: '<small class="headerFormat">{.key}:{point.stackTotal}</small><table>',
- // valueDecimals: 0 //会导致提示框内容显示错误
-
- },
- yAxis: {
- labels: {
- format: '{text}℃',
- },
- plotLines: [],
- },
- legend: {
- enabled: true,
- },
- accessibility: {
- enabled: false,
- },
- boost: {
- useGPUTranslations: true,
- seriesThreshold: 5,
- },
- scrollbar: {
- enabled: false,
- },
- // tooltip: {
- // formatter() {
- // return `${this.y} ${dateFormat('%Y-%m-%d %H:%M:%S', this.x)}`;
- // },
- // },
- chart: {
- zooming: {
- singleTouch: true,
- resetButton: {},
- type: 'xy',
- },
- events: {
- selection(event) {
- // console.log(
- // dateFormat('%Y-%m-%d %H:%M', event.xAxis[0].min),
- // dateFormat('%Y-%m-%d %H:%M', event.xAxis[0].max)
- // );
- if (event.xAxis) {
- console.log('时间区间选择', event.xAxis)
- temporalInterval.value = [
- dateFormat('%Y-%m-%d %H:%M', event.xAxis[0].min),
- dateFormat('%Y-%m-%d %H:%M', event.xAxis[0].max),
- ];
- }
- },
- },
- },
- series: [],
- };
- const chartOptions2 = {
- xAxis: {
- labels: {
- format: '{value:%Y-%m-%d %H:%M:%S}',
- },
- },
- yAxis: {
- labels: {
- format: '{text}%',
- },
- },
- legend: {
- enabled: true,
- },
- accessibility: {
- enabled: false,
- },
- boost: {
- useGPUTranslations: true,
- seriesThreshold: 5,
- },
- scrollbar: {
- enabled: false,
- },
- chart: {
- zoomType: 'xy',
- },
- series: [],
- };
- // 删除
- const deleteTask = async () => {
- const { data: res } = await deleteTaskData({
- T_task_id: queryData.T_task_id,
- Id: dataInfo.value.ID,
- });
- if (res.Code === 200) {
- modal.showModal = false;
- message.success(res.Msg);
- }
- };
- // 编辑
- const editTask = async () => {
- console.log('提交',dataInfo,time.value)
-
- const { data: res } = await editTaskData({
- T_task_id: queryData.T_task_id,
- Id: dataInfo.value.ID,
- T_t: formValue.T_t ? formValue.T_t : dataInfo.value.T_t,
- T_rh: formValue.T_rh ? formValue.T_rh : dataInfo.value.T_rh,
- T_time: time.value,
- });
- if (res.Code === 200) {
- modal.showModal = false;
- message.success(res.Msg);
- }
- };
- // 获取设备列表
- const getClassList = async () => {
- const { data: res } = await getTaskDataClassList({
- T_task_id: queryData.T_task_id,
- });
- classList.value = res.Data || [];
- };
- // 获取任务数据列表
- const getDataList = async () => {
- const { data: res } = await getTaskDataList(queryData);
- if (queryData.page_z <= res.Data.Page_size) {
- const arr = classList.value.filter((item) =>
- checkValues.value.includes(item.T_sn)
- );
- arr.forEach((item) => {
- item.T_sn = queryData.T_sn;
- item.T_id = queryData.T_id;
- getDataList();
- });
- }
- dataList.value = res.Data.List || [];
- };
- getClassList();
- onMounted(() => {
- if (task.T_collection_state === 0) {
- notification.info({
- closable: false,
- title: '未完成',
- meta: `当前时间:${formatted.value}`,
- duration: 2500,
- keepAliveOnHover: true,
- });
- } else if (task.T_collection_state === 1) {
- notification.info({
- closable: false,
- title: '已完成',
- meta: `当前时间:${formatted.value}`,
- duration: 2500,
- keepAliveOnHover: true,
- });
- } else if (task.T_collection_state === 2) {
- notification.info({
- closable: false,
- title: '处理中',
- meta: `当前时间:${formatted.value}`,
- duration: 2500,
- keepAliveOnHover: true,
- });
- } else if (task.T_collection_state === 3) {
- notification.info({
- closable: false,
- title: '已采集-无数据',
- meta: `当前时间:${formatted.value}`,
- duration: 2500,
- keepAliveOnHover: true,
- });
- }
- });
- </script>
- <style lang="scss" scoped></style>
|