From d7ea471fbb4a834b69715cac684bab7d2731688b Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期二, 17 三月 2026 16:32:50 +0800
Subject: [PATCH] 能耗成本核算注释假数据获取方法

---
 src/components/ProcessParamListDialog.vue |  631 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 631 insertions(+), 0 deletions(-)

diff --git a/src/components/ProcessParamListDialog.vue b/src/components/ProcessParamListDialog.vue
new file mode 100644
index 0000000..3b9f158
--- /dev/null
+++ b/src/components/ProcessParamListDialog.vue
@@ -0,0 +1,631 @@
+<template>
+  <el-dialog v-model="visible"
+             :title="title"
+             width="800px"
+             destroy-on-close>
+    <div class="param-list-container">
+      <div class="params-header">
+        <span>鍙傛暟鍒楄〃</span>
+        <el-button v-if="editable"
+                   type="primary"
+                   link
+                   size="small"
+                   @click="handleAddParam">
+          <el-icon>
+            <Plus />
+          </el-icon>鏂板
+        </el-button>
+      </div>
+      <div class="params-list">
+        <div v-for="param in paramList"
+             :key="param.id"
+             class="param-item">
+          <div class="param-info">
+            <span class="param-code">{{ param.paramName }}</span>
+            <span v-if="param.valueMode == 1"
+                  class="param-value">
+              鏍囧噯鍊硷細{{ param.standardValue || "-" }} {{ param.unit }}
+            </span>
+            <span v-else
+                  class="param-value">
+              鏍囧噯鍊硷細{{ param.minValue || "-" }}-{{ param.maxValue || "-" }} {{ param.unit }}
+            </span>
+          </div>
+          <div class="param-actions">
+            <el-button v-if="editable"
+                       link
+                       type="primary"
+                       size="small"
+                       @click="handleEditParam(param)">
+              缂栬緫
+            </el-button>
+            <el-button v-if="editable"
+                       link
+                       type="danger"
+                       size="small"
+                       @click="handleDeleteParam(param)">
+              鍒犻櫎
+            </el-button>
+          </div>
+        </div>
+        <el-empty v-if="!paramList || paramList.length === 0"
+                  description="鏆傛棤鍙傛暟"
+                  :image-size="50" />
+      </div>
+    </div>
+    <!-- 閫夋嫨鍙傛暟瀵硅瘽妗� -->
+    <el-dialog v-model="selectParamDialogVisible"
+               title="閫夋嫨鍙傛暟"
+               width="1000px">
+      <div class="param-select-container">
+        <!-- 宸︿晶鍙傛暟鍒楄〃 -->
+        <div class="param-list-area">
+          <div class="area-title">鍙�夊弬鏁�</div>
+          <div class="search-box">
+            <el-input v-model="paramSearchKeyword"
+                      placeholder="璇疯緭鍏ュ弬鏁板悕绉版悳绱�"
+                      clearable
+                      size="small"
+                      @input="getBaseParamListData">
+              <template #prefix>
+                <el-icon>
+                  <Search />
+                </el-icon>
+              </template>
+            </el-input>
+          </div>
+          <el-table :data="filteredParamList"
+                    height="400"
+                    border
+                    highlight-current-row
+                    @current-change="handleSelectParam">
+            <el-table-column prop="paramName"
+                             label="鍙傛暟鍚嶇О" />
+            <el-table-column prop="paramType"
+                             label="鍙傛暟绫诲瀷">
+              <template #default="scope">
+                <el-tag size="small"
+                        :type="getParamTypeTag(scope.row.paramType)">{{ getParamTypeText(scope.row.paramType) }}</el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+          <!-- 鍒嗛〉鎺т欢 -->
+          <div class="pagination-container"
+               style="margin-top: 10px;">
+            <el-pagination v-model:current-page="paramPage.current"
+                           v-model:page-size="paramPage.size"
+                           :page-sizes="[10, 20, 50, 100]"
+                           layout="total, sizes, prev, pager, next, jumper"
+                           :total="paramPage.total"
+                           @size-change="getBaseParamListData"
+                           @current-change="getBaseParamListData"
+                           size="small" />
+          </div>
+        </div>
+        <!-- 鍙充晶鍙傛暟璇︽儏 -->
+        <div class="param-detail-area">
+          <div class="area-title">鍙傛暟璇︽儏</div>
+          <el-form v-if="selectedParam"
+                   :model="selectedParam"
+                   label-width="100px"
+                   class="param-detail-form">
+            <el-form-item label="鍙傛暟鍚嶇О">
+              <span class="detail-text">{{ selectedParam.paramName }}</span>
+            </el-form-item>
+            <el-form-item label="鍙傛暟妯″紡">
+              <el-tag size="small"
+                      :type="selectedParam.valueMode == '1' ? 'success' : 'warning'">
+                {{ selectedParam.valueMode == '1' ? '鍗曞��' : '鍖洪棿' }}
+              </el-tag>
+            </el-form-item>
+            <el-form-item label="鍙傛暟绫诲瀷">
+              <el-tag size="small"
+                      :type="getParamTypeTag(selectedParam.paramType)">{{ getParamTypeText(selectedParam.paramType) }}</el-tag>
+            </el-form-item>
+            <el-form-item label="鍙傛暟鏍煎紡">
+              <span class="detail-text">{{ selectedParam.paramFormat || '-' }}</span>
+            </el-form-item>
+            <el-form-item label="鍗曚綅">
+              <span class="detail-text">{{ selectedParam.unit || '-' }}</span>
+            </el-form-item>
+            <el-form-item label="鏍囧噯鍊�"
+                          v-if="selectedParam.valueMode == '1' && selectedParam.paramType == '1'">
+              <el-input v-model="selectedParam.standardValue"
+                        type="number"
+                        placeholder="璇疯緭鍏ラ粯璁ゅ��" />
+            </el-form-item>
+            <el-form-item label="鏈�灏忓��"
+                          v-if="selectedParam.valueMode == '2' && selectedParam.paramType == '1'">
+              <el-input v-model="selectedParam.minValue"
+                        type="number"
+                        placeholder="璇疯緭鍏ユ渶灏忓��" />
+            </el-form-item>
+            <el-form-item label="鏈�澶у��"
+                          v-if="selectedParam.valueMode == '2' && selectedParam.paramType == '1'">
+              <el-input v-model="selectedParam.maxValue"
+                        type="number"
+                        placeholder="璇疯緭鍏ユ渶澶у��" />
+            </el-form-item>
+            <el-form-item label="鎺掑簭">
+              <el-input v-model="selectedParam.sort"
+                        type="number"
+                        placeholder="璇疯緭鍏ユ帓搴�" />
+            </el-form-item>
+            <el-form-item label="鏄惁蹇呭~">
+              <el-switch v-model="selectedParam.isRequired" />
+            </el-form-item>
+          </el-form>
+          <el-empty v-else
+                    description="璇蜂粠宸︿晶閫夋嫨鍙傛暟"
+                    :image-size="100" />
+        </div>
+      </div>
+      <template #footer>
+        <el-button @click="selectParamDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary"
+                   @click="handleParamSelectSubmit">纭畾</el-button>
+      </template>
+    </el-dialog>
+    <!-- 缂栬緫鍙傛暟瀵硅瘽妗� -->
+    <el-dialog v-model="editParamDialogVisible"
+               title="缂栬緫鍙傛暟"
+               width="600px">
+      <el-form :model="editParamForm"
+               :rules="editParamRules"
+               ref="editParamFormRef"
+               label-width="120px">
+        <el-form-item label="鍙傛暟鍚嶇О">
+          <span class="detail-text">{{ editParamForm.paramName }}</span>
+        </el-form-item>
+        <el-form-item label="鍙傛暟妯″紡">
+          <el-tag size="small"
+                  :type="editParamForm.valueMode == '1' ? 'success' : 'warning'">
+            {{ editParamForm.valueMode == '1' ? '鍗曞��' : '鍖洪棿' }}
+          </el-tag>
+        </el-form-item>
+        <el-form-item label="鍙傛暟绫诲瀷">
+          <el-tag size="small"
+                  :type="getParamTypeTag(editParamForm.paramType)">
+            {{ getParamTypeText(editParamForm.paramType) }}
+          </el-tag>
+        </el-form-item>
+        <el-form-item label="鍙傛暟鏍煎紡">
+          <span class="detail-text">{{ editParamForm.paramFormat || '-' }}</span>
+        </el-form-item>
+        <el-form-item label="鍗曚綅">
+          <span class="detail-text">{{ editParamForm.unit || '-' }}</span>
+        </el-form-item>
+        <el-form-item label="鏍囧噯鍊�"
+                      v-if="editParamForm.valueMode == '1' && editParamForm.paramType == '1'"
+                      prop="standardValue">
+          <el-input v-model="editParamForm.standardValue"
+                    type="number"
+                    placeholder="璇疯緭鍏ユ爣鍑嗗��" />
+        </el-form-item>
+        <el-form-item label="鏈�灏忓��"
+                      v-if="editParamForm.valueMode == '2' && editParamForm.paramType == '1'"
+                      prop="minValue">
+          <el-input v-model="editParamForm.minValue"
+                    type="number"
+                    placeholder="璇疯緭鍏ユ渶灏忓��" />
+        </el-form-item>
+        <el-form-item label="鏈�澶у��"
+                      v-if="editParamForm.valueMode == '2' && editParamForm.paramType == '1'"
+                      prop="maxValue">
+          <el-input v-model="editParamForm.maxValue"
+                    type="number"
+                    placeholder="璇疯緭鍏ユ渶澶у��" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="editParamDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary"
+                   @click="handleEditParamSubmit">纭畾</el-button>
+      </template>
+    </el-dialog>
+  </el-dialog>
+</template>
+
+<script setup>
+  import { ref, computed, watch } from "vue";
+  import { ElMessage, ElMessageBox } from "element-plus";
+  import { Plus, Search } from "@element-plus/icons-vue";
+  import {
+    delProcessRouteItemParam,
+    editProcessRouteItemParam,
+    addProcessRouteItemParam,
+  } from "@/api/productionManagement/processRouteItem.js";
+  import { getBaseParamList } from "@/api/basicData/parameterMaintenance.js";
+
+  const props = defineProps({
+    modelValue: {
+      type: Boolean,
+      default: false,
+    },
+    title: {
+      type: String,
+      default: "鍙傛暟鍒楄〃",
+    },
+    routeId: {
+      type: Number,
+      default: 0,
+    },
+    process: {
+      type: Object,
+      default: () => ({}),
+    },
+    paramList: {
+      type: Array,
+      default: () => [],
+    },
+    editable: {
+      type: Boolean,
+      default: true,
+    },
+  });
+
+  const emit = defineEmits(["update:modelValue", "refresh"]);
+
+  const visible = computed({
+    get: () => props.modelValue,
+    set: value => emit("update:modelValue", value),
+  });
+
+  // 鍝嶅簲寮忔暟鎹�
+  const selectParamDialogVisible = ref(false);
+  const editParamDialogVisible = ref(false);
+  const paramSearchKeyword = ref("");
+  const selectedParam = ref(null);
+  const filteredParamList = ref([]);
+  const paramPage = ref({
+    current: 1,
+    size: 10,
+    total: 0,
+  });
+  const editParamForm = ref({
+    id: null,
+    processId: null,
+    paramId: null,
+    paramName: "",
+    valueMode: "1",
+    standardValue: null,
+    minValue: null,
+    maxValue: null,
+    sort: 1,
+    isRequired: 0,
+    paramType: null,
+    paramFormat: "",
+    unit: "",
+  });
+  const editParamRules = ref({
+    standardValue: [{ required: true, message: "璇疯緭鍏ユ爣鍑嗗��", trigger: "blur" }],
+    minValue: [{ required: true, message: "璇疯緭鍏ユ渶灏忓��", trigger: "blur" }],
+    maxValue: [{ required: true, message: "璇疯緭鍏ユ渶澶у��", trigger: "blur" }],
+  });
+  const editParamFormRef = ref(null);
+
+  // 鏂板鍙傛暟
+  const handleAddParam = () => {
+    selectedParam.value = null;
+    paramSearchKeyword.value = "";
+    paramPage.current = 1;
+    // 鑾峰彇鍙�夊弬鏁板垪琛�
+    getBaseParamListData();
+    selectParamDialogVisible.value = true;
+  };
+
+  // 缂栬緫鍙傛暟
+  const handleEditParam = param => {
+    editParamForm.value = {
+      id: param.id,
+      processId: props.process.id,
+      paramId: param.paramId,
+      paramName: param.parameterName || param.paramName,
+      valueMode: param.parameterType2 || param.valueMode || "1",
+      standardValue: param.standardValue,
+      minValue: param.minValue,
+      maxValue: param.maxValue,
+      sort: param.sort || 1,
+      isRequired: param.isRequired || 0,
+      paramType: param.parameterType || param.paramType,
+      paramFormat: param.parameterFormat || param.paramFormat,
+      unit: param.unit || param.unit,
+    };
+    editParamDialogVisible.value = true;
+  };
+
+  // 鍒犻櫎鍙傛暟
+  const handleDeleteParam = param => {
+    ElMessageBox.confirm("纭畾瑕佸垹闄よ鍙傛暟鍚楋紵", "鎻愮ず", {
+      confirmButtonText: "纭畾",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        // 璋冪敤API鍒犻櫎鍙傛暟
+        delProcessRouteItemParam(param.id)
+          .then(res => {
+            ElMessage.success("鍒犻櫎鎴愬姛");
+            emit("refresh");
+          })
+          .catch(err => {
+            ElMessage.error("鍒犻櫎鍙傛暟澶辫触");
+            console.error("鍒犻櫎鍙傛暟澶辫触锛�", err);
+          });
+      })
+      .catch(() => {});
+  };
+
+  // 鑾峰彇鍙�夊弬鏁板垪琛�
+  const getBaseParamListData = () => {
+    getBaseParamList({
+      paramName: paramSearchKeyword.value,
+      current: paramPage.current,
+      size: paramPage.size,
+    }).then(res => {
+      if (res.code === 200) {
+        filteredParamList.value = res.data?.records || [];
+        paramPage.total = res.data?.total || 0;
+      } else {
+        ElMessage.error(res.msg || "鏌ヨ澶辫触");
+      }
+    });
+  };
+
+  // 閫夋嫨鍙傛暟
+  const handleSelectParam = param => {
+    selectedParam.value = param;
+  };
+
+  // 鎻愪氦閫夋嫨鍙傛暟
+  const handleParamSelectSubmit = () => {
+    if (!selectedParam.value) {
+      ElMessage.warning("璇峰厛閫夋嫨涓�涓弬鏁�");
+      return;
+    }
+
+    if (!props.process || !props.process.id) {
+      ElMessage.error("宸ヨ壓璺嚎椤圭洰淇℃伅涓嶅畬鏁�");
+      return;
+    }
+
+    // 鍒ゆ柇鍙傛暟绫诲瀷锛屽彧鏈夋暟鍊肩被鍨嬫墠浼犳爣鍑嗗�笺�佹渶澶у�煎拰鏈�灏忓��
+    const isNumericMode = selectedParam.value.valueMode === 1;
+
+    // 璋冪敤API鏂板鍙傛暟
+    addProcessRouteItemParam({
+      routeItemId: props.process.id,
+      paramId: selectedParam.value.id,
+      standardValue: isNumericMode ? selectedParam.value.standardValue || "" : "",
+      minValue: isNumericMode ? selectedParam.value.minValue || 0 : null,
+      maxValue: isNumericMode ? selectedParam.value.maxValue || 0 : null,
+      isRequired: selectedParam.value.isRequired || 0,
+      sort: selectedParam.value.sort || 1,
+    })
+      .then(res => {
+        if (res.code === 200) {
+          ElMessage.success("娣诲姞鍙傛暟鎴愬姛");
+          selectParamDialogVisible.value = false;
+          emit("refresh");
+        } else {
+          ElMessage.error(res.msg || "娣诲姞鍙傛暟澶辫触");
+        }
+      })
+      .catch(err => {
+        ElMessage.error("娣诲姞鍙傛暟澶辫触");
+        console.error("娣诲姞鍙傛暟澶辫触锛�", err);
+      });
+  };
+
+  // 鎻愪氦缂栬緫鍙傛暟
+  const handleEditParamSubmit = () => {
+    if (!editParamFormRef.value) return;
+    editParamFormRef.value.validate(valid => {
+      if (valid) {
+        // 鍒ゆ柇鍙傛暟绫诲瀷锛屽彧鏈夋暟鍊肩被鍨嬫墠浼犳爣鍑嗗�笺�佹渶澶у�煎拰鏈�灏忓��
+        const isNumericMode = editParamForm.value.valueMode == 1;
+
+        // 璋冪敤API淇敼鍙傛暟
+        editProcessRouteItemParam({
+          id: editParamForm.value.id,
+          routeItemId: props.process.id,
+          paramId: editParamForm.value.paramId,
+          standardValue: isNumericMode
+            ? editParamForm.value.standardValue || ""
+            : "",
+          minValue: isNumericMode ? editParamForm.value.minValue || 0 : null,
+          maxValue: isNumericMode ? editParamForm.value.maxValue || 0 : null,
+          isRequired: editParamForm.value.isRequired || 0,
+        })
+          .then(res => {
+            if (res.code === 200) {
+              ElMessage.success("缂栬緫鎴愬姛");
+              editParamDialogVisible.value = false;
+              emit("refresh");
+            } else {
+              ElMessage.error(res.msg || "缂栬緫澶辫触");
+            }
+          })
+          .catch(err => {
+            ElMessage.error("缂栬緫鍙傛暟澶辫触");
+            console.error("缂栬緫鍙傛暟澶辫触锛�", err);
+          });
+      }
+    });
+  };
+
+  // 鑾峰彇鍙傛暟绫诲瀷鏍囩
+  const getParamTypeTag = type => {
+    const typeMap = {
+      1: "primary",
+      2: "info",
+      3: "warning",
+      4: "success",
+    };
+    return typeMap[type] || "default";
+  };
+
+  // 鑾峰彇鍙傛暟绫诲瀷鏂囨湰
+  const getParamTypeText = type => {
+    const typeMap = {
+      1: "鏁板�兼牸寮�",
+      2: "鏂囨湰鏍煎紡",
+      3: "涓嬫媺閫夐」",
+      4: "鏃堕棿鏍煎紡",
+    };
+    return typeMap[type] || type;
+  };
+
+  watch(
+    () => props.modelValue,
+    newVal => {
+      if (!newVal) {
+        // 寮圭獥鍏抽棴鏃堕噸缃暟鎹�
+        selectParamDialogVisible.value = false;
+        editParamDialogVisible.value = false;
+        selectedParam.value = null;
+        paramSearchKeyword.value = "";
+        paramPage.current = 1;
+        filteredParamList.value = [];
+        editParamForm.value = {
+          id: null,
+          processId: null,
+          paramId: null,
+          paramName: "",
+          valueMode: "1",
+          standardValue: null,
+          minValue: null,
+          maxValue: null,
+          sort: 1,
+          isRequired: 0,
+          paramType: null,
+          paramFormat: "",
+          unit: "",
+        };
+      }
+    }
+  );
+</script>
+
+<style scoped>
+  .param-list-container {
+    padding: 10px 0;
+  }
+
+  .params-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 15px;
+    padding-bottom: 10px;
+    border-bottom: 1px solid #e4e7ed;
+  }
+
+  .params-header span {
+    font-size: 16px;
+    font-weight: 500;
+    color: #303133;
+  }
+
+  .params-list {
+    max-height: 400px;
+    overflow-y: auto;
+  }
+
+  .param-item {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 12px 16px;
+    margin-bottom: 8px;
+    background-color: #f9f9f9;
+    border-radius: 4px;
+    transition: all 0.3s ease;
+  }
+
+  .param-item:hover {
+    background-color: #ecf5ff;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+  }
+
+  .param-info {
+    display: flex;
+    align-items: center;
+    gap: 20px;
+    flex: 1;
+  }
+
+  .param-code {
+    font-weight: 500;
+    color: #303133;
+    min-width: 120px;
+  }
+
+  .param-value {
+    color: #606266;
+    font-size: 14px;
+  }
+
+  .param-actions {
+    display: flex;
+    gap: 10px;
+  }
+
+  /* 婊氬姩鏉℃牱寮� */
+  .params-list::-webkit-scrollbar {
+    width: 6px;
+  }
+
+  .params-list::-webkit-scrollbar-track {
+    background: #f1f1f1;
+    border-radius: 3px;
+  }
+
+  .params-list::-webkit-scrollbar-thumb {
+    background: #c1c1c1;
+    border-radius: 3px;
+  }
+
+  .params-list::-webkit-scrollbar-thumb:hover {
+    background: #a8a8a8;
+  }
+
+  /* 閫夋嫨鍙傛暟瀵硅瘽妗嗘牱寮� */
+  .param-select-container {
+    display: flex;
+    gap: 20px;
+  }
+
+  .param-list-area {
+    flex: 1;
+    min-width: 400px;
+  }
+
+  .param-detail-area {
+    flex: 1;
+    min-width: 300px;
+  }
+
+  .area-title {
+    font-size: 14px;
+    font-weight: 500;
+    margin-bottom: 10px;
+    color: #303133;
+  }
+
+  .search-box {
+    display: flex;
+    gap: 10px;
+    margin-bottom: 10px;
+  }
+
+  .param-detail-form {
+    background: #f9f9f9;
+    padding: 15px;
+    border-radius: 4px;
+  }
+
+  .detail-text {
+    font-weight: 500;
+  }
+</style>
\ No newline at end of file

--
Gitblit v1.9.3