Browse Source

染整线工艺参数模块

wukai 2 months ago
parent
commit
ab4404387c

+ 44 - 0
src/api/dye/device.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询染整线设备管理列表
+export function listDevice(query) {
+    return request({
+        url: '/dye/device/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询染整线设备管理详细
+export function getDevice(deviceId) {
+    return request({
+        url: '/dye/device/' + deviceId,
+        method: 'get'
+    })
+}
+
+// 新增染整线设备管理
+export function addDevice(data) {
+    return request({
+        url: '/dye/device',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改染整线设备管理
+export function updateDevice(data) {
+    return request({
+        url: '/dye/device',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除染整线设备管理
+export function delDevice(deviceId) {
+    return request({
+        url: '/dye/device/' + deviceId,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/dye/energy.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询染整线能源基础管理列表
+export function listEnergy(query) {
+    return request({
+        url: '/dye/energy/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询染整线能源基础管理详细
+export function getEnergy(engId) {
+    return request({
+        url: '/dye/energy/' + engId,
+        method: 'get'
+    })
+}
+
+// 新增染整线能源基础管理
+export function addEnergy(data) {
+    return request({
+        url: '/dye/energy',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改染整线能源基础管理
+export function updateEnergy(data) {
+    return request({
+        url: '/dye/energy',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除染整线能源基础管理
+export function delEnergy(engId) {
+    return request({
+        url: '/dye/energy/' + engId,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/dye/hour.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询小时统计数据列表
+export function listHour(query) {
+    return request({
+        url: '/dye/hour/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询小时统计数据详细
+export function getHour(chId) {
+    return request({
+        url: '/dye/hour/' + chId,
+        method: 'get'
+    })
+}
+
+// 新增小时统计数据
+export function addHour(data) {
+    return request({
+        url: '/dye/hour',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改小时统计数据
+export function updateHour(data) {
+    return request({
+        url: '/dye/hour',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除小时统计数据
+export function delHour(chId) {
+    return request({
+        url: '/dye/hour/' + chId,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/dye/type.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询染整线设备类型管理列表
+export function listType(query) {
+    return request({
+        url: '/dye/type/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询染整线设备类型管理详细
+export function getType(typeId) {
+    return request({
+        url: '/dye/type/' + typeId,
+        method: 'get'
+    })
+}
+
+// 新增染整线设备类型管理
+export function addType(data) {
+    return request({
+        url: '/dye/type',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改染整线设备类型管理
+export function updateType(data) {
+    return request({
+        url: '/dye/type',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除染整线设备类型管理
+export function delType(typeId) {
+    return request({
+        url: '/dye/type/' + typeId,
+        method: 'delete'
+    })
+}

+ 584 - 0
src/views/dye/device/index.vue

@@ -0,0 +1,584 @@
+<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-select v-model="queryParams.wsName" placeholder="请选择车间" clearable style="width: 150px"
+                   @change="handleQuery">
+          <el-option
+              v-for="dict in dye_ws"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="产线编号" prop="line">
+        <el-select
+            v-model="queryParams.line"
+            placeholder="请选择产线编号"
+            clearable
+            style="width: 150px"
+            @change="handleQuery"
+        >
+          <el-option
+              v-for="item in Array.from({length: 8}, (_, i) => i + 1)"
+              :key="item"
+              :label="item.toString()"
+              :value="item.toString()"
+          />
+        </el-select>
+      </el-form-item>
+      <!--      <el-form-item label="设备类型" prop="typeId">-->
+      <!--        <el-select-->
+      <!--            v-model="queryParams.typeId"-->
+      <!--            placeholder="请选择设备类型"-->
+      <!--            clearable-->
+      <!--            style="width: 150px"-->
+      <!--            @change="handleQuery"-->
+      <!--        >-->
+      <!--          <el-option-->
+      <!--              v-for="item in typeList"-->
+      <!--              :key="item.typeId"-->
+      <!--              :label="item.typeName"-->
+      <!--              :value="item.typeId"-->
+      <!--          />-->
+      <!--        </el-select>-->
+      <!--      </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"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="deviceList" @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="类型ID" align="center" prop="typeId"/>-->
+      <el-table-column label="车间" align="center" prop="wsName" width="80px">
+        <template #default="scope">
+          <dict-tag :options="dye_ws" :value="scope.row.wsName"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="产线编号" align="center" prop="line" width="80px"/>
+      <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" prop="sortNum" width="80px"/>
+      <!--      <el-table-column label="设备路径" align="center" prop="devicePath"/>-->
+      <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="['dye:device:edit']">
+            修改
+          </el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['dye:device: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="1200px" append-to-body>
+      <el-form ref="deviceRef" :model="form" :rules="rules" label-width="80px">
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="产线编号" prop="line">
+              <el-radio-group v-model="form.line" placeholder="请选择产线编号">
+                <el-radio
+                    v-for="item in Array.from({length: 8}, (_, i) => i + 1)"
+                    :key="item"
+                    :label="item.toString()"
+                >{{ item }}
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="设备类型" prop="typeId">
+              <el-select
+                  v-model="form.typeId"
+                  placeholder="请选择类型"
+                  @change="handleTypeChange"
+              >
+                <el-option
+                    v-for="item in typeList"
+                    :key="item.typeId"
+                    :label="item.typeName"
+                    :value="item.typeId"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="车间" prop="wsName">
+              <el-select v-model="form.wsName" placeholder="请选择车间" disabled>
+                <el-option
+                    v-for="dict in dye_ws"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="设备名称" prop="deviceName">
+              <el-input v-model="form.deviceName" placeholder="请输入设备名称"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="设备顺序" prop="deviceName">
+              <el-input-number v-model="form.sortNum" placeholder="请输入设备顺序" :min="1" controls-position="right"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="设备编码" prop="deviceCode">
+              <el-input v-model="form.deviceCode" placeholder="请输入设备编码"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="设备路径" prop="devicePath">
+              <el-input v-model="form.devicePath" placeholder="请输入设备路径"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-divider content-position="center">染整线设备参数管理信息</el-divider>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" icon="Plus" @click="handleAddDyeDevicePara">添加</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" icon="Delete" @click="handleDeleteDyeDevicePara">删除</el-button>
+          </el-col>
+        </el-row>
+        <el-table :data="dyeDeviceParaList" :row-class-name="rowDyeDeviceParaIndex"
+                  @selection-change="handleDyeDeviceParaSelectionChange" ref="dyeDevicePara">
+          <el-table-column type="selection" width="50" align="center">
+            <template #default="scope">
+              <!-- 从能源基础配置导入的参数不允许选择删除 -->
+              <el-checkbox
+                  v-model="scope.row.checked"
+                  :disabled="scope.row.isFromEnergy"
+                  @change="(val) => handleRowSelection(val, scope.row)">
+              </el-checkbox>
+            </template>
+          </el-table-column>
+          <el-table-column label="序号" align="center" prop="index" width="50"/>
+          <el-table-column label="参数编码" prop="paraCode" width="150">
+            <template #default="scope">
+              <el-input
+                  v-model="scope.row.paraCode"
+                  placeholder="请输入参数编码"
+                  :disabled="scope.row.isFromEnergy"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="参数名称" prop="paraName" width="180">
+            <template #default="scope">
+              <el-input
+                  v-model="scope.row.paraName"
+                  placeholder="请输入参数名称"
+                  :disabled="scope.row.isFromEnergy"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="参数表达式" prop="paraExp" width="350">
+            <template #default="scope">
+              <el-input v-model="scope.row.paraExp" type="textarea" placeholder="请输入参数表达式"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="告警规则" prop="paraAlarm" width="150">
+            <template #default="scope">
+              <el-input v-model="scope.row.paraAlarm" placeholder="使用区间表达"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="产线标准" prop="lineStand" width="150">
+            <template #default="scope">
+              <el-select v-model="scope.row.lineStand" placeholder="产线标准" :disabled="scope.row.isFromEnergy">
+                <el-option
+                    v-for="dict in line_stand"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+        </el-table>
+      </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="Device">
+import {addDevice, delDevice, getDevice, listDevice, updateDevice} from "@/api/dye/device";
+import {listType} from "@/api/dye/type";
+import {listEnergy} from "@/api/dye/energy"; // 导入能源列表API
+import {createUniqueString} from "@/utils/index"; // 引入生成唯一字符串的工具函数
+
+const {proxy} = getCurrentInstance();
+const {dye_ws, sys_yes_no, line_stand} = proxy.useDict('dye_ws', 'sys_yes_no', 'line_stand');
+
+const deviceList = ref([]);
+const dyeDeviceParaList = ref([]);
+const typeList = ref([]); // 添加类型列表
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const checkedDyeDevicePara = 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,
+    typeId: null,
+    wsName: null,
+    line: null,
+    typeName: null,
+    deviceCode: null,
+    deviceName: null,
+    devicePath: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  },
+  rules: {
+    typeId: [
+      { required: true, message: "设备类型不能为空", trigger: "blur" }
+    ],
+    line: [
+      { required: true, message: "产线编号不能为空", trigger: "blur" }
+    ],
+    typeName: [
+      { required: true, message: "类型名称不能为空", trigger: "blur" }
+    ],
+    deviceCode: [
+      { required: true, message: "设备编码不能为空", trigger: "blur" }
+    ],
+    sortNum: [
+      { required: true, message: "设备顺序号不能为空", trigger: "blur" }
+    ],
+    deviceName: [
+      { required: true, message: "设备名称不能为空", trigger: "blur" }
+    ],
+    devicePath: [
+      { required: true, message: "设备路径不能为空", trigger: "blur" }
+    ],
+  }
+});
+
+const {queryParams, form, rules} = toRefs(data);
+
+/** 查询染整线设备管理列表 */
+function getList() {
+  loading.value = true;
+  // 先获取类型列表
+  listType({pageSize: 10000}).then(response => {
+    typeList.value = response.rows;
+    // 再获取设备列表
+    listDevice(queryParams.value).then(response => {
+      deviceList.value = response.rows;
+      total.value = response.total;
+      loading.value = false;
+    });
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    deviceId: null,
+    typeId: null,
+    wsName: null,
+    line: null,
+    typeName: null,
+    deviceCode: null,
+    deviceName: null,
+    devicePath: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  };
+  dyeDeviceParaList.value = [];
+  proxy.resetForm("deviceRef");
+}
+
+/** 搜索按钮操作 */
+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();
+  // 自动导入能源基础配置
+  listEnergy({pageSize: 10000}).then(response => {
+    if (response.rows && response.rows.length > 0) {
+      response.rows.forEach(energy => {
+        let obj = {};
+        obj.paraCode = energy.engCode; // 使用能源编码
+        obj.paraName = energy.engName; // 使用能源名称
+        obj.paraExp = "";
+        obj.paraAlarm = "";
+        obj.lineStand = energy.lineStand || ""; // 导入能源的产线标准
+        // 添加标记,表示这是从能源基础配置导入的,不可修改删除
+        obj.isFromEnergy = true;
+        dyeDeviceParaList.value.push(obj);
+      });
+    }
+    open.value = true;
+    title.value = "添加染整线设备管理";
+  });
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _deviceId = row.deviceId || ids.value
+  getDevice(_deviceId).then(response => {
+    form.value = response.data;
+    // 获取所有能源数据,用于判断哪些参数是从能源导入的
+    listEnergy({pageSize: 10000}).then(energyResponse => {
+      const energyMap = new Map();
+      if (energyResponse.rows) {
+        energyResponse.rows.forEach(energy => {
+          energyMap.set(energy.engCode, {
+            name: energy.engName,
+            lineStand: energy.lineStand
+          });
+        });
+      }
+
+      // 为从能源导入的参数添加标记
+      if (response.data.dyeDeviceParaList) {
+        response.data.dyeDeviceParaList.forEach(item => {
+          // 如果参数编码在能源编码列表中,则标记为从能源导入
+          if (energyMap.has(item.paraCode)) {
+            const energyInfo = energyMap.get(item.paraCode);
+            // 同时检查名称是否匹配,避免误判
+            if (item.paraName === energyInfo.name) {
+              item.isFromEnergy = true;
+              // 如果产线标准为空,则使用能源的产线标准
+              if (!item.lineStand && energyInfo.lineStand) {
+                item.lineStand = energyInfo.lineStand;
+              }
+            } else {
+              item.isFromEnergy = false;
+            }
+          } else {
+            item.isFromEnergy = false;
+          }
+        });
+      }
+      dyeDeviceParaList.value = response.data.dyeDeviceParaList;
+      open.value = true;
+      title.value = "修改染整线设备管理";
+    });
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["deviceRef"].validate(valid => {
+    if (valid) {
+      form.value.dyeDeviceParaList = dyeDeviceParaList.value;
+      if (form.value.deviceId != null) {
+        updateDevice(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addDevice(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 delDevice(_deviceIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {
+  });
+}
+
+/** 染整线设备参数管理序号 */
+function rowDyeDeviceParaIndex({row, rowIndex}) {
+  row.index = rowIndex + 1;
+}
+
+/** 染整线设备参数管理添加按钮操作 */
+function handleAddDyeDevicePara() {
+  let obj = {};
+  obj.paraCode = "PARA_" + createUniqueString(); // 自动生成唯一编码
+  obj.paraName = "";
+  obj.paraExp = "";
+  obj.paraAlarm = "";
+  obj.lineStand = "";
+  dyeDeviceParaList.value.push(obj);
+}
+
+/** 染整线设备参数管理删除按钮操作 */
+function handleDeleteDyeDevicePara() {
+  if (checkedDyeDevicePara.value.length == 0) {
+    proxy.$modal.msgError("请先选择要删除的染整线设备参数管理数据");
+  } else {
+    const dyeDeviceParas = dyeDeviceParaList.value;
+    const checkedDyeDeviceParas = checkedDyeDevicePara.value;
+    dyeDeviceParaList.value = dyeDeviceParas.filter(function (item) {
+      // 如果是从能源基础配置导入的参数,不允许删除
+      if (item.isFromEnergy) {
+        return true;
+      }
+      return checkedDyeDeviceParas.indexOf(item.index) == -1;
+    });
+  }
+}
+
+/** 复选框选中数据 */
+function handleDyeDeviceParaSelectionChange(selection) {
+  // 不再使用这个方法处理选择变更
+  // checkedDyeDevicePara.value = selection.map(item => item.index)
+}
+
+/** 处理类型选择变化 */
+function handleTypeChange(typeId) {
+  // 根据选择的类型ID查找对应的类型对象
+  const selectedType = typeList.value.find(item => item.typeId === typeId);
+  if (selectedType) {
+    // 设置车间名称
+    form.value.wsName = selectedType.wsName;
+    // 设置类型名称
+    form.value.typeName = selectedType.typeName;
+  }
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('dye/device/export', {
+    ...queryParams.value
+  }, `device_${new Date().getTime()}.xlsx`)
+}
+
+// 添加行选择处理函数
+function handleRowSelection(val, row) {
+  if (val) {
+    checkedDyeDevicePara.value.push(row.index);
+  } else {
+    const index = checkedDyeDevicePara.value.indexOf(row.index);
+    if (index > -1) {
+      checkedDyeDevicePara.value.splice(index, 1);
+    }
+  }
+}
+
+getList();
+</script>

+ 307 - 0
src/views/dye/energy/index.vue

@@ -0,0 +1,307 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="能源编码" prop="engCode">
+        <el-input
+          v-model="queryParams.engCode"
+          placeholder="请输入能源编码"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="能源名称" prop="engName">
+        <el-input
+          v-model="queryParams.engName"
+          placeholder="请输入能源名称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="产线标准" prop="lineStand">
+        <el-select v-model="queryParams.lineStand" placeholder="请选择产线标准" clearable style="width: 150px">
+          <el-option
+            v-for="dict in line_stand"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </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"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="energyList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="能源ID" align="center" prop="engId" />-->
+      <el-table-column label="能源编码" align="center" prop="engCode" />
+      <el-table-column label="能源名称" align="center" prop="engName" />
+      <el-table-column label="产线标准" align="center" prop="lineStand">
+        <template #default="scope">
+          <dict-tag :options="line_stand" :value="scope.row.lineStand"/>
+        </template>
+      </el-table-column>
+<!--      <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>-->
+<!--      &lt;!&ndash;      <el-table-column label="更新人" align="center" prop="updatedBy" />&ndash;&gt;-->
+<!--      <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="['dye:energy:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dye:energy: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="energyRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="能源编码" prop="engCode">
+          <el-input v-model="form.engCode" placeholder="请输入能源编码" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="能源名称" prop="engName">
+          <el-input v-model="form.engName" placeholder="请输入能源名称" />
+        </el-form-item>
+        <el-form-item label="产线标准" prop="lineStand">
+          <el-select v-model="form.lineStand" placeholder="请选择产线标准">
+            <el-option
+              v-for="dict in line_stand"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </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" type="textarea" 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="Energy">
+import { listEnergy, getEnergy, delEnergy, addEnergy, updateEnergy } from "@/api/dye/energy";
+import { createUniqueString } from "@/utils/index"; // 引入生成唯一字符串的工具函数
+
+const { proxy } = getCurrentInstance();
+const { line_stand } = proxy.useDict('line_stand');
+
+const energyList = 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,
+    engCode: null,
+    engName: null,
+    lineStand: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询染整线能源基础管理列表 */
+function getList() {
+  loading.value = true;
+  listEnergy(queryParams.value).then(response => {
+    energyList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    engId: null,
+    engCode: null,
+    engName: null,
+    lineStand: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  };
+  proxy.resetForm("energyRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.engId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  form.value.engCode = "ENG_" + createUniqueString(); // 自动生成唯一编码,前缀为ENG
+  open.value = true;
+  title.value = "添加染整线能源基础管理";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _engId = row.engId || ids.value
+  getEnergy(_engId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改染整线能源基础管理";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["energyRef"].validate(valid => {
+    if (valid) {
+      if (form.value.engId != null) {
+        updateEnergy(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addEnergy(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _engIds = row.engId || ids.value;
+  proxy.$modal.confirm('是否确认删除染整线能源基础管理编号为"' + _engIds + '"的数据项?').then(function() {
+    return delEnergy(_engIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('dye/energy/export', {
+    ...queryParams.value
+  }, `energy_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 325 - 0
src/views/dye/hour/index.vue

@@ -0,0 +1,325 @@
+<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="小时" prop="hour">
+        <el-input
+          v-model="queryParams.hour"
+          placeholder="请输入小时"
+          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="paraCode">
+        <el-input
+          v-model="queryParams.paraCode"
+          placeholder="请输入参数编码"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="参数名称" prop="paraName">
+        <el-input
+          v-model="queryParams.paraName"
+          placeholder="请输入参数名称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="参数值" prop="paraValue">
+        <el-input
+          v-model="queryParams.paraValue"
+          placeholder="请输入参数值"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="参数分钟级数据" prop="paraMValue">
+        <el-input
+          v-model="queryParams.paraMValue"
+          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="['dye:hour:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dye:hour:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dye:hour:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['dye:hour:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="hourList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="统计ID" align="center" prop="chId" />
+      <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="小时" align="center" prop="hour" />
+      <el-table-column label="设备ID" align="center" prop="deviceId" />
+      <el-table-column label="参数编码" align="center" prop="paraCode" />
+      <el-table-column label="参数名称" align="center" prop="paraName" />
+      <el-table-column label="参数值" align="center" prop="paraValue" />
+      <el-table-column label="参数分钟级数据" align="center" prop="paraMValue" />
+      <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="['dye:hour:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dye:hour: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="hourRef" :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="小时" prop="hour">
+          <el-input v-model="form.hour" placeholder="请输入小时" />
+        </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="paraCode">
+          <el-input v-model="form.paraCode" placeholder="请输入参数编码" />
+        </el-form-item>
+        <el-form-item label="参数名称" prop="paraName">
+          <el-input v-model="form.paraName" placeholder="请输入参数名称" />
+        </el-form-item>
+        <el-form-item label="参数值" prop="paraValue">
+          <el-input v-model="form.paraValue" placeholder="请输入参数值" />
+        </el-form-item>
+        <el-form-item label="参数分钟级数据" prop="paraMValue">
+          <el-input v-model="form.paraMValue" 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="Hour">
+import { listHour, getHour, delHour, addHour, updateHour } from "@/api/dye/hour";
+
+const { proxy } = getCurrentInstance();
+
+const hourList = 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,
+    paraCode: null,
+    paraName: null,
+    paraValue: null,
+    paraMValue: null,
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询小时统计数据列表 */
+function getList() {
+  loading.value = true;
+  listHour(queryParams.value).then(response => {
+    hourList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    chId: null,
+    dataDate: null,
+    hour: null,
+    deviceId: null,
+    paraCode: null,
+    paraName: null,
+    paraValue: null,
+    paraMValue: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  };
+  proxy.resetForm("hourRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.chId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加小时统计数据";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _chId = row.chId || ids.value
+  getHour(_chId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改小时统计数据";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["hourRef"].validate(valid => {
+    if (valid) {
+      if (form.value.chId != null) {
+        updateHour(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addHour(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _chIds = row.chId || ids.value;
+  proxy.$modal.confirm('是否确认删除小时统计数据编号为"' + _chIds + '"的数据项?').then(function() {
+    return delHour(_chIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('dye/hour/export', {
+    ...queryParams.value
+  }, `hour_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 349 - 0
src/views/dye/type/index.vue

@@ -0,0 +1,349 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <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="wsName">
+        <el-select v-model="queryParams.wsName" placeholder="请选择车间" clearable style="width: 150px">
+          <el-option
+              v-for="dict in dye_ws"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+          />
+        </el-select>
+      </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"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="ID" align="center" prop="typeId" />-->
+      <el-table-column label="IOT通配" align="center" prop="typeMatch" />
+      <el-table-column label="类型名称" align="center" prop="typeName"/>
+      <el-table-column label="车间" align="center" prop="wsName">
+        <template #default="scope">
+          <dict-tag :options="dye_ws" :value="scope.row.wsName"/>
+        </template>
+      </el-table-column>
+      <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)">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</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="1200px" append-to-body>
+      <el-form ref="typeRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="IOT通配" prop="typeMatch">
+          <el-input v-model="form.typeMatch" placeholder="请输入IOT通配" />
+        </el-form-item>
+        <el-form-item label="类型名称" prop="typeName">
+          <el-input v-model="form.typeName" placeholder="请输入类型名称" />
+        </el-form-item>
+        <el-form-item label="车间" prop="wsName">
+          <el-select v-model="form.wsName" placeholder="请选择车间">
+            <el-option
+                v-for="dict in dye_ws"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-divider content-position="center">染整线设备类型参数管理信息</el-divider>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" icon="Plus" @click="handleAddDyeTypePara">添加</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" icon="Delete" @click="handleDeleteDyeTypePara">删除</el-button>
+          </el-col>
+        </el-row>
+        <el-table :data="dyeTypeParaList" :row-class-name="rowDyeTypeParaIndex" @selection-change="handleDyeTypeParaSelectionChange" ref="dyeTypePara">
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column label="序号" align="center" prop="index" width="50"/>
+          <el-table-column label="参数编码" prop="paraCode">
+            <template #default="scope">
+              {{scope.row.paraCode}}
+            </template>
+          </el-table-column>
+          <el-table-column label="参数名称" prop="paraName" width="180">
+            <template #default="scope">
+              <el-input v-model="scope.row.paraName" placeholder="请输入参数名称" />
+            </template>
+          </el-table-column>
+          <el-table-column label="参数表达式" prop="paraExp" width="300">
+            <template #default="scope">
+              <el-input v-model="scope.row.paraExp" type="textarea" placeholder="请输入参数表达式" />
+            </template>
+          </el-table-column>
+          <el-table-column label="告警规则" prop="paraAlarm" width="150">
+            <template #default="scope">
+              <el-input v-model="scope.row.paraAlarm" placeholder="使用区间表达" />
+            </template>
+          </el-table-column>
+          <el-table-column label="产线标准" prop="lineStand" width="150">
+            <template #default="scope">
+              <el-select v-model="scope.row.lineStand" placeholder="产线标准">
+                <el-option
+                    v-for="dict in line_stand"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="独立配置" prop="lineStand" width="150">
+            <template #default="scope">
+              <el-switch
+                  v-model="scope.row.customConfig"
+                  active-value="Y"
+                  inactive-value="N"
+                  active-text="是"
+                  inactive-text="否">
+              </el-switch>
+            </template>
+          </el-table-column>
+        </el-table>
+      </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="Type">
+import { listType, getType, delType, addType, updateType } from "@/api/dye/type";
+import { createUniqueString } from "@/utils/index"; // 引入生成唯一字符串的工具函数
+
+const { proxy } = getCurrentInstance();
+const { dye_ws,sys_yes_no,line_stand } = proxy.useDict('dye_ws','sys_yes_no','line_stand');
+
+const typeList = ref([]);
+const dyeTypeParaList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const checkedDyeTypePara = 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,
+    typeName: null,
+    wsName: null,
+    typeMatch: null,
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询染整线设备类型管理列表 */
+function getList() {
+  loading.value = true;
+  listType(queryParams.value).then(response => {
+    typeList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    typeId: null,
+    typeName: null,
+    wsName: null,
+    typeMatch: null,
+    createdBy: null,
+    createdTime: null,
+    updatedBy: null,
+    updatedTime: null,
+    remark: null
+  };
+  dyeTypeParaList.value = [];
+  proxy.resetForm("typeRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.typeId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加染整线设备类型管理";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _typeId = row.typeId || ids.value
+  getType(_typeId).then(response => {
+    form.value = response.data;
+    dyeTypeParaList.value = response.data.dyeTypeParaList;
+    open.value = true;
+    title.value = "修改染整线设备类型管理";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["typeRef"].validate(valid => {
+    if (valid) {
+      form.value.dyeTypeParaList = dyeTypeParaList.value;
+      if (form.value.typeId != null) {
+        updateType(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addType(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _typeIds = row.typeId || ids.value;
+  proxy.$modal.confirm('是否确认删除染整线设备类型管理编号为"' + _typeIds + '"的数据项?').then(function() {
+    return delType(_typeIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 染整线设备类型参数管理序号 */
+function rowDyeTypeParaIndex({ row, rowIndex }) {
+  row.index = rowIndex + 1;
+}
+
+/** 染整线设备类型参数管理添加按钮操作 */
+function handleAddDyeTypePara() {
+  let obj = {};
+  obj.paraCode = "P_" + createUniqueString(); // 自动生成唯一编码
+  obj.paraName = "";
+  obj.paraExp = "";
+  obj.paraAlarm = "";
+  dyeTypeParaList.value.push(obj);
+}
+
+/** 染整线设备类型参数管理删除按钮操作 */
+function handleDeleteDyeTypePara() {
+  if (checkedDyeTypePara.value.length == 0) {
+    proxy.$modal.msgError("请先选择要删除的染整线设备类型参数管理数据");
+  } else {
+    const dyeTypeParas = dyeTypeParaList.value;
+    const checkedDyeTypeParas = checkedDyeTypePara.value;
+    dyeTypeParaList.value = dyeTypeParas.filter(function(item) {
+      return checkedDyeTypeParas.indexOf(item.index) == -1
+    });
+  }
+}
+
+/** 复选框选中数据 */
+function handleDyeTypeParaSelectionChange(selection) {
+  checkedDyeTypePara.value = selection.map(item => item.index)
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('dye/type/export', {
+    ...queryParams.value
+  }, `type_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>