浏览代码

哎呀 终于搞定 前整车间对比

wukai 2 周之前
父节点
当前提交
ae2a0ca51c

+ 44 - 0
src/api/dyeing/rzAvg.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询染整线小时平均统计数据列表
+export function listRzAvg(query) {
+    return request({
+        url: '/dyeing/rzAvg/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询染整线小时平均统计数据详细
+export function getRzAvg(id) {
+    return request({
+        url: '/dyeing/rzAvg/' + id,
+        method: 'get'
+    })
+}
+
+// 新增染整线小时平均统计数据
+export function addRzAvg(data) {
+    return request({
+        url: '/dyeing/rzAvg',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改染整线小时平均统计数据
+export function updateRzAvg(data) {
+    return request({
+        url: '/dyeing/rzAvg',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除染整线小时平均统计数据
+export function delRzAvg(id) {
+    return request({
+        url: '/dyeing/rzAvg/' + id,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/dyeing/rzDevice.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询染整线设备管理列表
+export function listRzDevice(query) {
+    return request({
+        url: '/dyeing/rzDevice/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询染整线设备管理详细
+export function getRzDevice(deviceId) {
+    return request({
+        url: '/dyeing/rzDevice/' + deviceId,
+        method: 'get'
+    })
+}
+
+// 新增染整线设备管理
+export function addRzDevice(data) {
+    return request({
+        url: '/dyeing/rzDevice',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改染整线设备管理
+export function updateRzDevice(data) {
+    return request({
+        url: '/dyeing/rzDevice',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除染整线设备管理
+export function delRzDevice(deviceId) {
+    return request({
+        url: '/dyeing/rzDevice/' + deviceId,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/dyeing/rzEnergy.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询染整线小时能耗统计数据列表
+export function listRzEnergy(query) {
+    return request({
+        url: '/dyeing/rzEnergy/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询染整线小时能耗统计数据详细
+export function getRzEnergy(id) {
+    return request({
+        url: '/dyeing/rzEnergy/' + id,
+        method: 'get'
+    })
+}
+
+// 新增染整线小时能耗统计数据
+export function addRzEnergy(data) {
+    return request({
+        url: '/dyeing/rzEnergy',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改染整线小时能耗统计数据
+export function updateRzEnergy(data) {
+    return request({
+        url: '/dyeing/rzEnergy',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除染整线小时能耗统计数据
+export function delRzEnergy(id) {
+    return request({
+        url: '/dyeing/rzEnergy/' + id,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/dyeing/rzLine.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询染整线产线小时统计数据列表
+export function listRzLine(query) {
+    return request({
+        url: '/dyeing/rzLine/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询染整线产线小时统计数据详细
+export function getRzLine(id) {
+    return request({
+        url: '/dyeing/rzLine/' + id,
+        method: 'get'
+    })
+}
+
+// 新增染整线产线小时统计数据
+export function addRzLine(data) {
+    return request({
+        url: '/dyeing/rzLine',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改染整线产线小时统计数据
+export function updateRzLine(data) {
+    return request({
+        url: '/dyeing/rzLine',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除染整线产线小时统计数据
+export function delRzLine(id) {
+    return request({
+        url: '/dyeing/rzLine/' + id,
+        method: 'delete'
+    })
+}

+ 408 - 0
src/views/dyeing/rzAvg/index.vue

@@ -0,0 +1,408 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="日期" prop="dataDate">
+        <el-date-picker clearable
+          v-model="queryParams.dataDate"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="小时;0-23" prop="hour">
+        <el-input
+          v-model="queryParams.hour"
+          placeholder="请输入小时;0-23"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="设备ID" prop="deviceId">
+        <el-input
+          v-model="queryParams.deviceId"
+          placeholder="请输入设备ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="停机时间" prop="online">
+        <el-input
+          v-model="queryParams.online"
+          placeholder="请输入停机时间"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="长度" prop="length">
+        <el-input
+          v-model="queryParams.length"
+          placeholder="请输入长度"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="温度" prop="tmp">
+        <el-input
+          v-model="queryParams.tmp"
+          placeholder="请输入温度"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="速度" prop="speed">
+        <el-input
+          v-model="queryParams.speed"
+          placeholder="请输入速度"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建人" prop="createdBy">
+        <el-input
+          v-model="queryParams.createdBy"
+          placeholder="请输入创建人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createdTime">
+        <el-date-picker clearable
+          v-model="queryParams.createdTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择创建时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="更新人" prop="updatedBy">
+        <el-input
+          v-model="queryParams.updatedBy"
+          placeholder="请输入更新人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="更新时间" prop="updatedTime">
+        <el-date-picker clearable
+          v-model="queryParams.updatedTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择更新时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="备注" prop="remark">
+        <el-input
+          v-model="queryParams.remark"
+          placeholder="请输入备注"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="Plus"
+          @click="handleAdd"
+          v-hasPermi="['dyeing:rzAvg:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dyeing:rzAvg:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dyeing:rzAvg:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['dyeing:rzAvg:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="rzAvgList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" />
+      <el-table-column label="日期" align="center" prop="dataDate" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.dataDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="小时;0-23" align="center" prop="hour" />
+      <el-table-column label="设备ID" align="center" prop="deviceId" />
+      <el-table-column label="停机时间" align="center" prop="online" />
+      <el-table-column label="长度" align="center" prop="length" />
+      <el-table-column label="温度" align="center" prop="tmp" />
+      <el-table-column label="速度" align="center" prop="speed" />
+      <el-table-column label="创建人" align="center" prop="createdBy" />
+      <el-table-column label="创建时间" align="center" prop="createdTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新人" align="center" prop="updatedBy" />
+      <el-table-column label="更新时间" align="center" prop="updatedTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.updatedTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dyeing:rzAvg:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dyeing:rzAvg:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改染整线小时平均统计数据对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="rzAvgRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="日期" prop="dataDate">
+          <el-date-picker clearable
+            v-model="form.dataDate"
+            type="date"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="小时;0-23" prop="hour">
+          <el-input v-model="form.hour" placeholder="请输入小时;0-23" />
+        </el-form-item>
+        <el-form-item label="设备ID" prop="deviceId">
+          <el-input v-model="form.deviceId" placeholder="请输入设备ID" />
+        </el-form-item>
+        <el-form-item label="停机时间" prop="online">
+          <el-input v-model="form.online" placeholder="请输入停机时间" />
+        </el-form-item>
+        <el-form-item label="长度" prop="length">
+          <el-input v-model="form.length" placeholder="请输入长度" />
+        </el-form-item>
+        <el-form-item label="温度" prop="tmp">
+          <el-input v-model="form.tmp" placeholder="请输入温度" />
+        </el-form-item>
+        <el-form-item label="速度" prop="speed">
+          <el-input v-model="form.speed" placeholder="请输入速度" />
+        </el-form-item>
+        <el-form-item label="创建人" prop="createdBy">
+          <el-input v-model="form.createdBy" placeholder="请输入创建人" />
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createdTime">
+          <el-date-picker clearable
+            v-model="form.createdTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择创建时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="更新人" prop="updatedBy">
+          <el-input v-model="form.updatedBy" placeholder="请输入更新人" />
+        </el-form-item>
+        <el-form-item label="更新时间" prop="updatedTime">
+          <el-date-picker clearable
+            v-model="form.updatedTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择更新时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="RzAvg">
+import { listRzAvg, getRzAvg, delRzAvg, addRzAvg, updateRzAvg } from "@/api/dyeing/rzAvg";
+
+const { proxy } = getCurrentInstance();
+
+const rzAvgList = 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 data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    dataDate: null,
+    hour: null,
+    deviceId: null,
+    online: null,
+    length: null,
+    tmp: null,
+    speed: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询染整线小时平均统计数据列表 */
+function getList() {
+  loading.value = true;
+  listRzAvg(queryParams.value).then(response => {
+    rzAvgList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    id: null,
+    dataDate: null,
+    hour: null,
+    deviceId: null,
+    online: null,
+    length: null,
+    tmp: null,
+    speed: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  };
+  proxy.resetForm("rzAvgRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+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
+  getRzAvg(_id).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改染整线小时平均统计数据";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["rzAvgRef"].validate(valid => {
+    if (valid) {
+      if (form.value.id != null) {
+        updateRzAvg(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addRzAvg(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 delRzAvg(_ids);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('dyeing/rzAvg/export', {
+    ...queryParams.value
+  }, `rzAvg_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 330 - 0
src/views/dyeing/rzDevice/index.vue

@@ -0,0 +1,330 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="车间" prop="wsName">
+        <el-input
+            v-model="queryParams.wsName"
+            placeholder="请输入车间"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="产线编号" prop="line">
+        <el-input
+            v-model="queryParams.line"
+            placeholder="请输入产线编号"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="ID" prop="typeId">
+        <el-input
+            v-model="queryParams.typeId"
+            placeholder="请输入ID"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="类型名称" prop="typeName">
+        <el-input
+            v-model="queryParams.typeName"
+            placeholder="请输入类型名称"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="设备编码" prop="deviceCode">
+        <el-input
+            v-model="queryParams.deviceCode"
+            placeholder="请输入设备编码"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="设备名称" prop="deviceName">
+        <el-input
+            v-model="queryParams.deviceName"
+            placeholder="请输入设备名称"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="primary"
+            plain
+            icon="Plus"
+            @click="handleAdd"
+            v-hasPermi="['dyeing:rzDevice:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['dyeing:rzDevice:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['dyeing:rzDevice:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['dyeing:rzDevice:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="rzDeviceList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="deviceId" />
+      <el-table-column label="车间" align="center" prop="wsName" />
+      <el-table-column label="产线编号" align="center" prop="line" />
+      <el-table-column label="ID" align="center" prop="typeId" />
+      <el-table-column label="类型名称" align="center" prop="typeName" />
+      <el-table-column label="设备编码" align="center" prop="deviceCode" />
+      <el-table-column label="设备名称" align="center" prop="deviceName" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dyeing:rzDevice:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dyeing:rzDevice:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <!-- 添加或修改染整线设备管理对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="rzDeviceRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="车间" prop="wsName">
+          <el-input v-model="form.wsName" placeholder="请输入车间" />
+        </el-form-item>
+        <el-form-item label="产线编号" prop="line">
+          <el-input v-model="form.line" placeholder="请输入产线编号" />
+        </el-form-item>
+        <el-form-item label="ID" prop="typeId">
+          <el-input v-model="form.typeId" placeholder="请输入ID" />
+        </el-form-item>
+        <el-form-item label="类型名称" prop="typeName">
+          <el-input v-model="form.typeName" placeholder="请输入类型名称" />
+        </el-form-item>
+        <el-form-item label="设备编码" prop="deviceCode">
+          <el-input v-model="form.deviceCode" placeholder="请输入设备编码" />
+        </el-form-item>
+        <el-form-item label="设备名称" prop="deviceName">
+          <el-input v-model="form.deviceName" placeholder="请输入设备名称" />
+        </el-form-item>
+        <el-form-item label="设备路径" prop="devicePath">
+          <el-input v-model="form.devicePath" placeholder="请输入设备路径" />
+        </el-form-item>
+        <el-form-item label="米长表达式" prop="lengthExp">
+          <el-input v-model="form.lengthExp" placeholder="请输入米长表达式" />
+        </el-form-item>
+        <el-form-item label="状态表达式" prop="statusExp">
+          <el-input v-model="form.statusExp" placeholder="请输入状态表达式" />
+        </el-form-item>
+        <el-form-item label="速度表达式" prop="speedExp">
+          <el-input v-model="form.speedExp" placeholder="请输入速度表达式" />
+        </el-form-item>
+        <el-form-item label="温度表达式" prop="tmpExp">
+          <el-input v-model="form.tmpExp" placeholder="请输入温度表达式" />
+        </el-form-item>
+        <el-form-item label="电量表达式" prop="energyExp">
+          <el-input v-model="form.energyExp" placeholder="请输入电量表达式" />
+        </el-form-item>
+        <el-form-item label="电流表达式" prop="ampExp">
+          <el-input v-model="form.ampExp" placeholder="请输入电流表达式" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="RzDevice">
+import { listRzDevice, getRzDevice, delRzDevice, addRzDevice, updateRzDevice } from "@/api/dyeing/rzDevice";
+
+const { proxy } = getCurrentInstance();
+
+const rzDeviceList = 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 data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    wsName: null,
+    line: null,
+    typeId: null,
+    typeName: null,
+    deviceCode: null,
+    deviceName: null,
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询染整线设备管理列表 */
+function getList() {
+  loading.value = true;
+  listRzDevice(queryParams.value).then(response => {
+    rzDeviceList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    deviceId: null,
+    wsName: null,
+    line: null,
+    typeId: null,
+    typeName: null,
+    deviceCode: null,
+    deviceName: null,
+    devicePath: null,
+    lengthExp: null,
+    statusExp: null,
+    speedExp: null,
+    tmpExp: null,
+    energyExp: null,
+    ampExp: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  };
+  proxy.resetForm("rzDeviceRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.deviceId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加染整线设备管理";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _deviceId = row.deviceId || ids.value
+  getRzDevice(_deviceId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改染整线设备管理";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["rzDeviceRef"].validate(valid => {
+    if (valid) {
+      if (form.value.deviceId != null) {
+        updateRzDevice(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addRzDevice(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _deviceIds = row.deviceId || ids.value;
+  proxy.$modal.confirm('是否确认删除染整线设备管理编号为"' + _deviceIds + '"的数据项?').then(function() {
+    return delRzDevice(_deviceIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('dyeing/rzDevice/export', {
+    ...queryParams.value
+  }, `rzDevice_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 380 - 0
src/views/dyeing/rzEnergy/index.vue

@@ -0,0 +1,380 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="日期" prop="dataDate">
+        <el-date-picker clearable
+          v-model="queryParams.dataDate"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="小时;0-23" prop="hour">
+        <el-input
+          v-model="queryParams.hour"
+          placeholder="请输入小时;0-23"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="设备ID" prop="deviceId">
+        <el-input
+          v-model="queryParams.deviceId"
+          placeholder="请输入设备ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="电量" prop="energy">
+        <el-input
+          v-model="queryParams.energy"
+          placeholder="请输入电量"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="电流" prop="amp">
+        <el-input
+          v-model="queryParams.amp"
+          placeholder="请输入电流"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建人" prop="createdBy">
+        <el-input
+          v-model="queryParams.createdBy"
+          placeholder="请输入创建人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createdTime">
+        <el-date-picker clearable
+          v-model="queryParams.createdTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择创建时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="更新人" prop="updatedBy">
+        <el-input
+          v-model="queryParams.updatedBy"
+          placeholder="请输入更新人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="更新时间" prop="updatedTime">
+        <el-date-picker clearable
+          v-model="queryParams.updatedTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择更新时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="备注" prop="remark">
+        <el-input
+          v-model="queryParams.remark"
+          placeholder="请输入备注"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="Plus"
+          @click="handleAdd"
+          v-hasPermi="['dyeing:rzEnergy:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dyeing:rzEnergy:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dyeing:rzEnergy:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['dyeing:rzEnergy:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="rzEnergyList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" />
+      <el-table-column label="日期" align="center" prop="dataDate" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.dataDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="小时;0-23" align="center" prop="hour" />
+      <el-table-column label="设备ID" align="center" prop="deviceId" />
+      <el-table-column label="电量" align="center" prop="energy" />
+      <el-table-column label="电流" align="center" prop="amp" />
+      <el-table-column label="创建人" align="center" prop="createdBy" />
+      <el-table-column label="创建时间" align="center" prop="createdTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新人" align="center" prop="updatedBy" />
+      <el-table-column label="更新时间" align="center" prop="updatedTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.updatedTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dyeing:rzEnergy:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dyeing:rzEnergy:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改染整线小时能耗统计数据对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="rzEnergyRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="日期" prop="dataDate">
+          <el-date-picker clearable
+            v-model="form.dataDate"
+            type="date"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="小时;0-23" prop="hour">
+          <el-input v-model="form.hour" placeholder="请输入小时;0-23" />
+        </el-form-item>
+        <el-form-item label="设备ID" prop="deviceId">
+          <el-input v-model="form.deviceId" placeholder="请输入设备ID" />
+        </el-form-item>
+        <el-form-item label="电量" prop="energy">
+          <el-input v-model="form.energy" placeholder="请输入电量" />
+        </el-form-item>
+        <el-form-item label="电流" prop="amp">
+          <el-input v-model="form.amp" placeholder="请输入电流" />
+        </el-form-item>
+        <el-form-item label="创建人" prop="createdBy">
+          <el-input v-model="form.createdBy" placeholder="请输入创建人" />
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createdTime">
+          <el-date-picker clearable
+            v-model="form.createdTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择创建时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="更新人" prop="updatedBy">
+          <el-input v-model="form.updatedBy" placeholder="请输入更新人" />
+        </el-form-item>
+        <el-form-item label="更新时间" prop="updatedTime">
+          <el-date-picker clearable
+            v-model="form.updatedTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择更新时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="RzEnergy">
+import { listRzEnergy, getRzEnergy, delRzEnergy, addRzEnergy, updateRzEnergy } from "@/api/dyeing/rzEnergy";
+
+const { proxy } = getCurrentInstance();
+
+const rzEnergyList = 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 data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    dataDate: null,
+    hour: null,
+    deviceId: null,
+    energy: null,
+    amp: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询染整线小时能耗统计数据列表 */
+function getList() {
+  loading.value = true;
+  listRzEnergy(queryParams.value).then(response => {
+    rzEnergyList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    id: null,
+    dataDate: null,
+    hour: null,
+    deviceId: null,
+    energy: null,
+    amp: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  };
+  proxy.resetForm("rzEnergyRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+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
+  getRzEnergy(_id).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改染整线小时能耗统计数据";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["rzEnergyRef"].validate(valid => {
+    if (valid) {
+      if (form.value.id != null) {
+        updateRzEnergy(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addRzEnergy(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 delRzEnergy(_ids);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('dyeing/rzEnergy/export', {
+    ...queryParams.value
+  }, `rzEnergy_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 610 - 0
src/views/dyeing/rzLine/index.vue

@@ -0,0 +1,610 @@
+<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>