| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610 | 
							- <template>
 
-   <div class="app-container">
 
-     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px" style="text-align: center;">
 
-       <el-form-item style="width: 208px; display: inline-block;">
 
-         <div style="display: flex; align-items: center; justify-content: center;">
 
-           <el-button icon="ArrowLeft" @click="navigateDay(-1)" size="small" style="margin-right: 15px;"></el-button>
 
-           <el-date-picker clearable
 
-                           v-model="queryParams.dataDate"
 
-                           type="date"
 
-                           value-format="YYYY-MM-DD"
 
-                           placeholder="请选择日期"
 
-                           style="width: 130px"
 
-                           @change="handleQuery">
 
-           </el-date-picker>
 
-           <el-button icon="ArrowRight" @click="navigateDay(1)" size="small" style="margin-left: 15px;"></el-button>
 
-         </div>
 
-       </el-form-item>
 
-     </el-form>
 
-     <!-- 产线选择 -->
 
-     <el-row :gutter="20" style="margin-bottom: 20px;">
 
-       <el-col :span="24">
 
-         <el-card>
 
-           <div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-bottom: 10px;">
 
-             <span>选择产线进行对比:</span>
 
-             <el-button size="small" @click="selectAllLines">全选</el-button>
 
-             <el-button size="small" @click="invertSelection">反选</el-button>
 
-             <el-checkbox-group v-model="selectedLines" @change="getList" style="padding-left: 30px;">
 
-               <el-checkbox v-for="line in allLines" :key="line" :label="line">{{ line }}</el-checkbox>
 
-             </el-checkbox-group>
 
-           </div>
 
- <!--          <div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-bottom: 10px;">-->
 
- <!--            <el-checkbox-group v-model="selectedLines" @change="getList">-->
 
- <!--              <el-checkbox v-for="line in allLines" :key="line" :label="line">{{ line }}</el-checkbox>-->
 
- <!--            </el-checkbox-group>-->
 
- <!--          </div>-->
 
-           <div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-bottom: 10px;">
 
-             <span>选择指标:</span>
 
-             <el-button size="small" @click="selectAllMetrics">全选</el-button>
 
-             <el-button size="small" @click="invertMetrics">反选</el-button>
 
-             <el-checkbox-group v-model="selectedMetrics" @change="updateChart" style="padding-left: 30px;">
 
-               <el-checkbox label="开机率">开机率</el-checkbox>
 
-               <el-checkbox label="温度">温度</el-checkbox>
 
-               <el-checkbox label="速度">速度</el-checkbox>
 
-               <el-checkbox label="电量">电量</el-checkbox>
 
-               <el-checkbox label="电流">电流</el-checkbox>
 
-             </el-checkbox-group>
 
-           </div>
 
- <!--          <div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">-->
 
- <!--            <el-checkbox-group v-model="selectedMetrics" @change="updateChart">-->
 
- <!--              <el-checkbox label="开机率">开机率</el-checkbox>-->
 
- <!--              <el-checkbox label="温度">温度</el-checkbox>-->
 
- <!--              <el-checkbox label="速度">速度</el-checkbox>-->
 
- <!--              <el-checkbox label="电量">电量</el-checkbox>-->
 
- <!--              <el-checkbox label="电流">电流</el-checkbox>-->
 
- <!--            </el-checkbox-group>-->
 
- <!--          </div>-->
 
-         </el-card>
 
-       </el-col>
 
-     </el-row>
 
-     <!-- 折线图和表格左右布局 -->
 
-     <el-row :gutter="20">
 
-       <!-- 左侧折线图 -->
 
-       <el-col :span="12">
 
-         <el-card style="margin-bottom: 20px;">
 
-           <div ref="chartRef" style="width: 100%; height: 520px;"></div>
 
-         </el-card>
 
-       </el-col>
 
-       <!-- 右侧表格 -->
 
-       <el-col :span="12">
 
-         <el-card style="margin-bottom: 20px;">
 
-           <el-table :data="rzLineList" height="520" :span-method="spanMethod">
 
-             <el-table-column label="小时" align="center" prop="hour" width="60" />
 
-             <el-table-column label="产线" align="center" prop="line" width="60" />
 
-             <el-table-column label="开机率(%)" align="center" prop="openRate" />
 
-             <el-table-column label="温度(°C)" align="center" prop="tmp" />
 
-             <el-table-column label="速度(米/min)" align="center" prop="speed" />
 
-             <el-table-column label="电量(kW·h)" align="center" prop="energy" />
 
-             <el-table-column label="电流(A)" align="center" prop="amp" />
 
-           </el-table>
 
-         </el-card>
 
-       </el-col>
 
-     </el-row>
 
-   </div>
 
- </template>
 
- <script setup name="RzLine">
 
- import * as echarts from 'echarts';
 
- import { listRzLine, getRzLine, delRzLine, addRzLine, updateRzLine } from "@/api/dyeing/rzLine";
 
- const { proxy } = getCurrentInstance();
 
- const rzLineList = ref([]);
 
- const open = ref(false);
 
- const loading = ref(true);
 
- const showSearch = ref(true);
 
- const ids = ref([]);
 
- const single = ref(true);
 
- const multiple = ref(true);
 
- const total = ref(0);
 
- const title = ref("");
 
- const chartRef = ref(null);
 
- let chartInstance = null;
 
- const data = reactive({
 
-   form: {},
 
-   queryParams: {
 
-     pageNum: 1,
 
-     pageSize: 10000,
 
-     dataDate: new Date(new Date().getTime() - 24 * 60 * 60 * 1000).Format('yyyy-MM-dd'),
 
-     hour: null,
 
-     lines: null,
 
-     openRate: null,
 
-     length: null,
 
-     tmp: null,
 
-     speed: null,
 
-     energy: null,
 
-     amp: null,
 
-     createdBy: null,
 
-     createdTime: null,
 
-     updatedBy: null,
 
-     updatedTime: null,
 
-     remark: null
 
-   },
 
-   rules: {
 
-   }
 
- });
 
- const selectedMetrics = ref(['开机率', '温度', '速度', '电量', '电流']);
 
- const selectedLines = ref(['1', '2', '3', '4', '5', '6', '7', '8']);
 
- const allLines = ref(['1', '2', '3', '4', '5', '6', '7', '8']);
 
- const { queryParams, form, rules } = toRefs(data);
 
- // 按产线分组的数据
 
- const groupedRzLineList = computed(() => {
 
-   const grouped = {};
 
-   rzLineList.value.forEach(item => {
 
-     if (!grouped[item.line]) {
 
-       grouped[item.line] = [];
 
-     }
 
-     grouped[item.line].push(item);
 
-   });
 
-   // 按产线编号排序
 
-   const sortedGrouped = {};
 
-   Object.keys(grouped).sort().forEach(key => {
 
-     sortedGrouped[key] = grouped[key];
 
-   });
 
-   return sortedGrouped;
 
- });
 
- // 合并单元格处理函数
 
- const spanMethod = ({ row, column, rowIndex, columnIndex }) => {
 
-   if (columnIndex === 0) { // 小时列
 
-     // 获取当前行小时值
 
-     const currentHour = row.hour;
 
-     // 计算当前小时值第一次出现的位置
 
-     let firstIndex = -1;
 
-     for (let i = 0; i < rzLineList.value.length; i++) {
 
-       if (rzLineList.value[i].hour === currentHour) {
 
-         firstIndex = i;
 
-         break;
 
-       }
 
-     }
 
-     // 如果当前行是该小时值第一次出现的位置
 
-     if (firstIndex === rowIndex) {
 
-       // 计算该小时值连续出现的次数
 
-       let spanCount = 0;
 
-       for (let i = firstIndex; i < rzLineList.value.length; i++) {
 
-         if (rzLineList.value[i].hour === currentHour) {
 
-           spanCount++;
 
-         } else {
 
-           break;
 
-         }
 
-       }
 
-       return [spanCount, 1];
 
-     } else {
 
-       // 如果不是第一次出现,隐藏该单元格
 
-       return [0, 0];
 
-     }
 
-   }
 
-   return [1, 1]; // 其他列不合并
 
- };
 
- function navigateDay(offset) {
 
-   const currentDate = new Date(queryParams.value.dataDate);
 
-   currentDate.setDate(currentDate.getDate() + offset);
 
-   queryParams.value.dataDate = currentDate.toISOString().split('T')[0];
 
-   handleQuery();
 
- }
 
- /** 查询染整线产线小时统计数据列表 */
 
- function getList() {
 
-   // 检查是否选择了产线
 
-   if (selectedLines.value.length === 0) {
 
-     proxy.$modal.msgWarning("请至少选择一条产线进行对比");
 
-     return;
 
-   }
 
-   // 设置查询参数
 
-   queryParams.value.lines = selectedLines.value.join(',');
 
-   loading.value = true;
 
-   listRzLine(queryParams.value).then(response => {
 
-     // 按小时排序
 
-     rzLineList.value = response.rows.sort((a, b) => {
 
-       if (a.hour !== b.hour) {
 
-         return a.hour - b.hour;
 
-       }
 
-       return a.line - b.line;
 
-     });
 
-     total.value = response.total;
 
-     loading.value = false;
 
-     // 更新图表
 
-     nextTick(() => {
 
-       updateChart();
 
-     });
 
-   });
 
- }
 
- // 初始化图表
 
- function initChart() {
 
-   if (chartRef.value) {
 
-     chartInstance = echarts.init(chartRef.value);
 
-   }
 
- }
 
- // 更新图表
 
- function updateChart() {
 
-   if (!chartInstance || !rzLineList.value.length) {
 
-     return;
 
-   }
 
-   // 按产线分组数据,只处理已选择的产线
 
-   const lineMap = new Map();
 
-   rzLineList.value.forEach(item => {
 
-     // 只处理已选择的产线
 
-     if (selectedLines.value.includes(item.line)) {
 
-       if (!lineMap.has(item.line)) {
 
-         lineMap.set(item.line, []);
 
-       }
 
-       lineMap.get(item.line).push(item);
 
-     }
 
-   });
 
-   // 获取所有唯一的时间点
 
-   const allTimePoints = [...new Set(rzLineList.value.map(item =>
 
-     `${item.dataDate} ${item.hour.toString().padStart(2, '0')}:00`))].sort();
 
-   // 准备图表数据
 
-   const series = [];
 
-   const legendData = [];
 
-   // 为每个产线生成数据系列
 
-   for (let [line, items] of lineMap) {
 
-     // 为每个产线生成选定指标的数据系列
 
-     const dataMap = new Map();
 
-     items.forEach(item => {
 
-       const timePoint = `${item.dataDate} ${item.hour.toString().padStart(2, '0')}:00`;
 
-       dataMap.set(timePoint, item);
 
-     });
 
-     // 基于统一时间轴生成数据
 
-     const openRateData = selectedMetrics.value.includes('开机率') ? allTimePoints.map(timePoint => {
 
-       const item = dataMap.get(timePoint);
 
-       return item && item.openRate !== null ? parseFloat(item.openRate) : null;
 
-     }) : [];
 
-     const tmpData = selectedMetrics.value.includes('温度') ? allTimePoints.map(timePoint => {
 
-       const item = dataMap.get(timePoint);
 
-       return item && item.tmp !== null ? parseFloat(item.tmp) : null;
 
-     }) : [];
 
-     const speedData = selectedMetrics.value.includes('速度') ? allTimePoints.map(timePoint => {
 
-       const item = dataMap.get(timePoint);
 
-       return item && item.speed !== null ? parseFloat(item.speed) : null;
 
-     }) : [];
 
-     const energyData = selectedMetrics.value.includes('电量') ? allTimePoints.map(timePoint => {
 
-       const item = dataMap.get(timePoint);
 
-       return item && item.energy !== null ? parseFloat(item.energy) : null;
 
-     }) : [];
 
-     const ampData = selectedMetrics.value.includes('电流') ? allTimePoints.map(timePoint => {
 
-       const item = dataMap.get(timePoint);
 
-       return item && item.amp !== null ? parseFloat(item.amp) : null;
 
-     }) : [];
 
-     // 添加产线+指标的数据系列
 
-     if (selectedMetrics.value.includes('开机率')) {
 
-       legendData.push(`${line}-开机率`);
 
-       series.push({
 
-         name: `${line}-开机率`,
 
-         type: 'line',
 
-         data: openRateData,
 
-         smooth: true,
 
-         showSymbol: false
 
-       });
 
-     }
 
-     if (selectedMetrics.value.includes('温度')) {
 
-       legendData.push(`${line}-温度`);
 
-       series.push({
 
-         name: `${line}-温度`,
 
-         type: 'line',
 
-         data: tmpData,
 
-         smooth: true,
 
-         showSymbol: false
 
-       });
 
-     }
 
-     if (selectedMetrics.value.includes('速度')) {
 
-       legendData.push(`${line}-速度`);
 
-       series.push({
 
-         name: `${line}-速度`,
 
-         type: 'line',
 
-         data: speedData,
 
-         smooth: true,
 
-         showSymbol: false
 
-       });
 
-     }
 
-     if (selectedMetrics.value.includes('电量')) {
 
-       legendData.push(`${line}-电量`);
 
-       series.push({
 
-         name: `${line}-电量`,
 
-         type: 'line',
 
-         data: energyData,
 
-         smooth: true,
 
-         showSymbol: false
 
-       });
 
-     }
 
-     if (selectedMetrics.value.includes('电流')) {
 
-       legendData.push(`${line}-电流`);
 
-       series.push({
 
-         name: `${line}-电流`,
 
-         type: 'line',
 
-         data: ampData,
 
-         smooth: true,
 
-         showSymbol: false
 
-       });
 
-     }
 
-   }
 
-   const option = {
 
-     title: {
 
-       text: '前整车间产线对比',
 
-       left: 'center'
 
-     },
 
-     tooltip: {
 
-       trigger: 'axis',
 
-       formatter: function (params) {
 
-         let result = params[0].axisValue + '<br/>';
 
-         params.forEach(param => {
 
-           let valueText = '';
 
-           if (param.seriesName.includes('开机率')) {
 
-             valueText = param.value !== null ? param.value + ' (%)' : '无数据';
 
-           } else if (param.seriesName.includes('温度')) {
 
-             valueText = param.value !== null ? param.value + ' (°C)' : '无数据';
 
-           } else if (param.seriesName.includes('速度')) {
 
-             valueText = param.value !== null ? param.value + ' (米/min)' : '无数据';
 
-           } else if (param.seriesName.includes('电量')) {
 
-             valueText = param.value !== null ? param.value + ' (kW·h)' : '无数据';
 
-           } else if (param.seriesName.includes('电流')) {
 
-             valueText = param.value !== null ? param.value + ' (A)' : '无数据';
 
-           } else {
 
-             valueText = param.value !== null ? param.value : '无数据';
 
-           }
 
-           result += `<div style="display:flex;align-items:center;">
 
-             <span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${param.color};"></span>
 
-             ${param.seriesName}: ${valueText}
 
-           </div>`;
 
-         });
 
-         return result;
 
-       }
 
-     },
 
-     legend: [
 
-       ...Array.from(lineMap.keys()).map((line, index) => {
 
-         const lineLegendData = [];
 
-         if (selectedMetrics.value.includes('开机率')) lineLegendData.push(`${line}-开机率`);
 
-         if (selectedMetrics.value.includes('温度')) lineLegendData.push(`${line}-温度`);
 
-         if (selectedMetrics.value.includes('速度')) lineLegendData.push(`${line}-速度`);
 
-         if (selectedMetrics.value.includes('电量')) lineLegendData.push(`${line}-电量`);
 
-         if (selectedMetrics.value.includes('电流')) lineLegendData.push(`${line}-电流`);
 
-         return {
 
-           data: lineLegendData,
 
-           top: 40 + index * 25,
 
-           left: 'center',
 
-           textStyle: {
 
-             fontSize: 10
 
-           },
 
-           itemWidth: 10,
 
-           itemHeight: 10
 
-         };
 
-       })
 
-     ],
 
-     grid: {
 
-       left: '3%',
 
-       right: '4%',
 
-       top: '25%',
 
-       bottom: 20,
 
-       containLabel: true
 
-     },
 
-     xAxis: {
 
-       type: 'category',
 
-       boundaryGap: false,
 
-       data: allTimePoints
 
-     },
 
-     yAxis: {
 
-       type: 'value',
 
-       name: ''
 
-     },
 
-     series: series
 
-   };
 
-   chartInstance.setOption(option, true);
 
- }
 
- // 窗口大小改变时重置图表大小
 
- function resizeChart() {
 
-   if (chartInstance) {
 
-     chartInstance.resize();
 
-   }
 
- }
 
- onMounted(() => {
 
-   initChart();
 
-   window.addEventListener('resize', resizeChart);
 
-   // 默认选择所有产线
 
-   selectedLines.value = [...allLines.value];
 
-   // 初始加载数据
 
-   getList();
 
- });
 
- onUnmounted(() => {
 
-   window.removeEventListener('resize', resizeChart);
 
-   if (chartInstance) {
 
-     chartInstance.dispose();
 
-   }
 
- });
 
- onActivated(() => {
 
-   resizeChart();
 
- });
 
- // 取消按钮
 
- function cancel() {
 
-   open.value = false;
 
-   reset();
 
- }
 
- // 表单重置
 
- function reset() {
 
-   form.value = {
 
-     id: null,
 
-     dataDate: null,
 
-     hour: null,
 
-     line: null,
 
-     openRate: null,
 
-     length: null,
 
-     tmp: null,
 
-     speed: null,
 
-     energy: null,
 
-     amp: null,
 
-     createdBy: null,
 
-     createdTime: null,
 
-     updatedBy: null,
 
-     updatedTime: null,
 
-     remark: null
 
-   };
 
-   proxy.resetForm("rzLineRef");
 
- }
 
- /** 搜索按钮操作 */
 
- function handleQuery() {
 
-   queryParams.value.pageNum = 1;
 
-   // 检查查询条件
 
-   if (!queryParams.value.dataDate) {
 
-     proxy.$modal.msgWarning("请选择日期");
 
-     return;
 
-   }
 
-   getList();
 
- }
 
- /** 重置按钮操作 */
 
- function resetQuery() {
 
-   proxy.resetForm("queryRef");
 
-   // 设置默认日期为当前日期
 
-   const now = new Date();
 
-   const year = now.getFullYear();
 
-   const month = (now.getMonth() + 1).toString().padStart(2, '0');
 
-   const day = now.getDate().toString().padStart(2, '0');
 
-   queryParams.value.dataDate = `${year}-${month}-${day}`;
 
-   // 默认选择所有产线
 
-   selectedLines.value = [...allLines.value];
 
-   handleQuery();
 
- }
 
- // 全选产线
 
- function selectAllLines() {
 
-   selectedLines.value = [...allLines.value];
 
-   getList();
 
- }
 
- // 反选产线
 
- function invertSelection() {
 
-   const newSelectedLines = [];
 
-   allLines.value.forEach(line => {
 
-     if (!selectedLines.value.includes(line)) {
 
-       newSelectedLines.push(line);
 
-     }
 
-   });
 
-   selectedLines.value = newSelectedLines;
 
-   getList();
 
- }
 
- // 全选指标
 
- function selectAllMetrics() {
 
-   selectedMetrics.value = ['开机率', '温度', '速度', '电量', '电流'];
 
-   updateChart();
 
- }
 
- // 反选指标
 
- function invertMetrics() {
 
-   const allMetrics = ['开机率', '温度', '速度', '电量', '电流'];
 
-   const newSelectedMetrics = [];
 
-   allMetrics.forEach(metric => {
 
-     if (!selectedMetrics.value.includes(metric)) {
 
-       newSelectedMetrics.push(metric);
 
-     }
 
-   });
 
-   selectedMetrics.value = newSelectedMetrics;
 
-   updateChart();
 
- }
 
- // 多选框选中数据
 
- function handleSelectionChange(selection) {
 
-   ids.value = selection.map(item => item.id);
 
-   single.value = selection.length != 1;
 
-   multiple.value = !selection.length;
 
- }
 
- /** 新增按钮操作 */
 
- function handleAdd() {
 
-   reset();
 
-   open.value = true;
 
-   title.value = "添加染整线产线小时统计数据";
 
- }
 
- /** 修改按钮操作 */
 
- function handleUpdate(row) {
 
-   reset();
 
-   const _id = row.id || ids.value
 
-   getRzLine(_id).then(response => {
 
-     form.value = response.data;
 
-     open.value = true;
 
-     title.value = "修改染整线产线小时统计数据";
 
-   });
 
- }
 
- /** 提交按钮 */
 
- function submitForm() {
 
-   proxy.$refs["rzLineRef"].validate(valid => {
 
-     if (valid) {
 
-       if (form.value.id != null) {
 
-         updateRzLine(form.value).then(response => {
 
-           proxy.$modal.msgSuccess("修改成功");
 
-           open.value = false;
 
-           getList();
 
-         });
 
-       } else {
 
-         addRzLine(form.value).then(response => {
 
-           proxy.$modal.msgSuccess("新增成功");
 
-           open.value = false;
 
-           getList();
 
-         });
 
-       }
 
-     }
 
-   });
 
- }
 
- /** 删除按钮操作 */
 
- function handleDelete(row) {
 
-   const _ids = row.id || ids.value;
 
-   proxy.$modal.confirm('是否确认删除染整线产线小时统计数据编号为"' + _ids + '"的数据项?').then(function() {
 
-     return delRzLine(_ids);
 
-   }).then(() => {
 
-     getList();
 
-     proxy.$modal.msgSuccess("删除成功");
 
-   }).catch(() => {});
 
- }
 
- /** 导出按钮操作 */
 
- function handleExport() {
 
-   proxy.download('dyeing/rzLine/export', {
 
-     ...queryParams.value
 
-   }, `rzLine_${new Date().getTime()}.xlsx`)
 
- }
 
- getList();
 
- </script>
 
 
  |