From 2cdbad409e82d4354e4eca5cffa65c6bef7a4d20 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期一, 16 三月 2026 13:36:37 +0800
Subject: [PATCH] bom添加产品编码

---
 src/views/productionManagement/productionProcess/index.vue | 1294 +++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 1,047 insertions(+), 247 deletions(-)

diff --git a/src/views/productionManagement/productionProcess/index.vue b/src/views/productionManagement/productionProcess/index.vue
index 67430cb..af6bbfa 100644
--- a/src/views/productionManagement/productionProcess/index.vue
+++ b/src/views/productionManagement/productionProcess/index.vue
@@ -1,308 +1,1108 @@
 <template>
   <div class="app-container">
-    <div class="search_form">
-      <el-form :model="searchForm"
-               :inline="true">
-        <el-form-item label="宸ュ簭鍚嶇О:">
-          <el-input v-model="searchForm.name"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    prefix-icon="Search"
-                    style="width: 200px;"
-                    @change="handleQuery" />
-        </el-form-item>
-        <el-form-item label="宸ュ簭缂栧彿:">
-          <el-input v-model="searchForm.no"
-                    placeholder="璇疯緭鍏�"
-                    clearable
-                    prefix-icon="Search"
-                    style="width: 200px;"
-                    @change="handleQuery" />
-        </el-form-item>
-        <el-form-item>
+    <div class="process-config-container">
+      <!-- 宸︿晶宸ュ簭鍒楄〃 -->
+      <div class="process-list-section">
+        <div class="section-header">
+          <h3 class="section-title">宸ュ簭鍒楄〃</h3>
           <el-button type="primary"
-                     @click="handleQuery">鎼滅储</el-button>
+                     size="small"
+                     @click="handleAddProcess">
+            <el-icon>
+              <Plus />
+            </el-icon>鏂板宸ュ簭
+          </el-button>
+        </div>
+        <div class="process-card-list"
+             v-loading="processLoading">
+          <div v-for="process in processValueList"
+               :key="process.id"
+               class="process-card"
+               :class="{ active: selectedProcess?.id === process.id }"
+               @click="selectProcess(process)">
+            <div class="card-header">
+              <div class="process-name">{{ process.name }} <span class="process-code">{{ process.no }}</span></div>
+              <div class="card-actions">
+                <el-button link
+                           type="primary"
+                           @click.stop="handleEditProcess(process)">
+                  <el-icon>
+                    <Edit />
+                  </el-icon>
+                  缂栬緫
+                </el-button>
+                <el-button link
+                           type="danger"
+                           @click.stop="handleDeleteProcess(process)">
+                  <el-icon>
+                    <Delete />
+                  </el-icon>
+                  鍒犻櫎
+                </el-button>
+              </div>
+            </div>
+            <div class="card-body">
+              <!-- <div class="process-name">{{ process.name }}</div> -->
+              <div class="process-desc">{{ process.remark || '鏆傛棤鎻忚堪' }}</div>
+            </div>
+            <div class="card-footer">
+              <div class="status-tag"> <el-tag size="small"
+                        :type="process.status ? 'success' : 'info'">
+                  {{ process.status ? '鍚敤' : '鍋滅敤' }}
+                </el-tag>
+                <el-tag size="small"
+                        :type="process.isQuality ? 'warning' : 'info'"
+                        style="margin-left: 8px">
+                  {{ process.isQuality ? '璐ㄦ' : '闈炶川妫�' }}
+                </el-tag>
+              </div>
+              <span class="param-count">宸ヨ祫瀹氶: 楼{{ process.salaryQuota || 0 }}</span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <!-- 鍙充晶鍙傛暟鍒楄〃 -->
+      <div class="param-list-section">
+        <div class="section-header">
+          <h3 class="section-title">
+            {{ selectedProcess ? selectedProcess.name + ' - 鍙傛暟閰嶇疆' : '璇烽�夋嫨宸ュ簭' }}
+          </h3>
+          <el-button type="primary"
+                     size="small"
+                     :disabled="!selectedProcess"
+                     @click="handleSelectParam">
+            <el-icon>
+              <Plus />
+            </el-icon>閫夋嫨鍙傛暟
+          </el-button>
+        </div>
+        <div class="param-table-wrapper">
+          <PIMTable v-if="selectedProcess"
+                    rowKey="id"
+                    :column="paramColumn"
+                    :tableData="paramList"
+                    :page="paramPage"
+                    height="calc(100vh - 280px)"
+                    :isSelection="false"
+                    @pagination="handleParamPagination" />
+          <div v-else
+               class="empty-tip">
+            <el-empty description="璇蜂粠宸︿晶閫夋嫨涓�涓伐搴�" />
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- 宸ュ簭鏂板/缂栬緫瀵硅瘽妗� -->
+    <el-dialog v-model="processDialogVisible"
+               :title="isProcessEdit ? '缂栬緫宸ュ簭' : '鏂板宸ュ簭'"
+               width="500px">
+      <el-form :model="processForm"
+               :rules="processRules"
+               ref="processFormRef"
+               label-width="100px">
+        <el-form-item label="宸ュ簭缂栫爜"
+                      prop="no">
+          <el-input v-model="processForm.no"
+                    placeholder="璇疯緭鍏ュ伐搴忕紪鐮�" />
+        </el-form-item>
+        <el-form-item label="宸ュ簭鍚嶇О"
+                      prop="name">
+          <el-input v-model="processForm.name"
+                    placeholder="璇疯緭鍏ュ伐搴忓悕绉�" />
+        </el-form-item>
+        <el-form-item label="宸ヨ祫瀹氶"
+                      prop="salaryQuota">
+          <el-input v-model="processForm.salaryQuota"
+                    type="number"
+                    :step="0.001" />
+        </el-form-item>
+        <el-form-item label="鏄惁璐ㄦ"
+                      prop="isQuality">
+          <el-switch v-model="processForm.isQuality"
+                     :active-value="true"
+                     inactive-value="false" />
+        </el-form-item>
+        <el-form-item label="宸ュ簭鎻忚堪"
+                      prop="remark">
+          <el-input v-model="processForm.remark"
+                    type="textarea"
+                    :rows="3"
+                    placeholder="璇疯緭鍏ュ伐搴忔弿杩�" />
+        </el-form-item>
+        <el-form-item label="鐘舵��"
+                      prop="status">
+          <el-radio-group v-model="processForm.status">
+            <el-radio :label="true">鍚敤</el-radio>
+            <el-radio :label="false">鍋滅敤</el-radio>
+          </el-radio-group>
         </el-form-item>
       </el-form>
-    </div>
-    <div class="table_list">
-      <div style="text-align: right"
-           class="mb10">
-        <el-button type="primary"
-                   @click="showNewModal">鏂板宸ュ簭</el-button>
-        <el-button type="info"
-                   plain
-                   @click="handleImport">瀵煎叆</el-button>
-        <el-button type="danger"
-                   @click="handleDelete"
-                   :disabled="selectedRows.length === 0"
-                   plain>鍒犻櫎宸ュ簭</el-button>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="processDialogVisible = false">鍙栨秷</el-button>
+          <el-button type="primary"
+                     @click="handleProcessSubmit">纭畾</el-button>
+        </span>
+      </template>
+    </el-dialog>
+    <!-- 閫夋嫨鍙傛暟瀵硅瘽妗� -->
+    <el-dialog v-model="paramDialogVisible"
+               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="handleSelectParam">
+              <template #prefix>
+                <el-icon>
+                  <Search />
+                </el-icon>
+              </template>
+            </el-input>
+          </div>
+          <el-table :data="filteredParamList"
+                    height="300"
+                    border
+                    highlight-current-row
+                    @current-change="handleParamSelect">
+            <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="handleParamSizeChange"
+                           @current-change="handleParamCurrentChange"
+                           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'">
+              <el-input v-model="selectedParam.standardValue"
+                        type="number"
+                        placeholder="璇疯緭鍏ラ粯璁ゅ��" />
+            </el-form-item>
+            <el-form-item label="鏈�灏忓��"
+                          v-if="selectedParam.valueMode == '2'">
+              <el-input v-model="selectedParam.minValue"
+                        type="number"
+                        placeholder="璇疯緭鍏ユ渶灏忓��" />
+            </el-form-item>
+            <el-form-item label="鏈�澶у��"
+                          v-if="selectedParam.valueMode == '2'">
+              <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"
+                         :active-value="1"
+                         :inactive-value="0" />
+            </el-form-item>
+          </el-form>
+          <el-empty v-else
+                    description="璇蜂粠宸︿晶閫夋嫨鍙傛暟" />
+        </div>
       </div>
-      <PIMTable rowKey="id"
-                :column="tableColumn"
-                :tableData="tableData"
-                :page="page"
-                :isSelection="true"
-                @selection-change="handleSelectionChange"
-                :tableLoading="tableLoading"
-                @pagination="pagination"
-                :total="page.total"></PIMTable>
-    </div>
-    <new-process v-if="isShowNewModal"
-                 v-model:visible="isShowNewModal"
-                 @completed="getList" />
-    <edit-process v-if="isShowEditModal"
-                  v-model:visible="isShowEditModal"
-                  :record="record"
-                  @completed="getList" />
-    <ImportDialog ref="importDialogRef"
-                  v-model="importDialogVisible"
-                  title="瀵煎叆宸ュ簭"
-                  :action="importAction"
-                  :headers="importHeaders"
-                  :auto-upload="false"
-                  :on-success="handleImportSuccess"
-                  :on-error="handleImportError"
-                  @confirm="handleImportConfirm"
-                  @download-template="handleDownloadTemplate"
-                  @close="handleImportClose" />
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="paramDialogVisible = false">鍙栨秷</el-button>
+          <el-button type="primary"
+                     :disabled="!selectedParam"
+                     @click="handleParamSubmit">纭畾</el-button>
+        </span>
+      </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="鏍囧噯鍊�"
+                      v-if="editParamForm.valueMode == '1'"
+                      prop="standardValue">
+          <el-input v-model="editParamForm.standardValue"
+                    type="number"
+                    placeholder="璇疯緭鍏ユ爣鍑嗗��" />
+        </el-form-item>
+        <el-form-item label="鏈�灏忓��"
+                      v-if="editParamForm.valueMode == '2'"
+                      prop="minValue">
+          <el-input v-model="editParamForm.minValue"
+                    type="number"
+                    placeholder="璇疯緭鍏ユ渶灏忓��" />
+        </el-form-item>
+        <el-form-item label="鏈�澶у��"
+                      v-if="editParamForm.valueMode == '2'"
+                      prop="maxValue">
+          <el-input v-model="editParamForm.maxValue"
+                    type="number"
+                    placeholder="璇疯緭鍏ユ渶澶у��" />
+        </el-form-item>
+        <el-form-item label="鎺掑簭"
+                      prop="sort">
+          <el-input v-model="editParamForm.sort"
+                    type="number"
+                    placeholder="璇疯緭鍏ユ帓搴�" />
+        </el-form-item>
+        <el-form-item label="鏄惁蹇呭~"
+                      prop="isRequired">
+          <el-switch v-model="editParamForm.isRequired"
+                     :active-value="1"
+                     :inactive-value="0" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="editParamDialogVisible = false">鍙栨秷</el-button>
+          <el-button type="primary"
+                     @click="handleEditParamSubmit">纭畾</el-button>
+        </span>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
-  import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue";
-  import NewProcess from "@/views/productionManagement/productionProcess/New.vue";
-  import EditProcess from "@/views/productionManagement/productionProcess/Edit.vue";
-  import ImportDialog from "@/components/Dialog/ImportDialog.vue";
+  import { ref, reactive, onMounted } from "vue";
+  import { ElMessage, ElMessageBox } from "element-plus";
+  import { Plus, Edit, Delete, Search } from "@element-plus/icons-vue";
+  import PIMTable from "@/components/PIMTable/PIMTable.vue";
+  import { listType } from "@/api/system/dict/type";
   import {
-    listPage,
+    add,
+    update,
     del,
-    importData,
-    downloadTemplate,
+    list as getProcessListApi,
+    processList,
+    getProcessParamList,
+    addProcessParam,
+    editProcessParam,
+    deleteProcessParam,
   } from "@/api/productionManagement/productionProcess.js";
-  import { getToken } from "@/utils/auth";
+  import { getBaseParamList } from "@/api/basicData/parameterMaintenance.js";
 
-  const data = reactive({
-    searchForm: {
-      name: "",
-      no: "",
-    },
+  // 宸ュ簭鍒楄〃鏁版嵁
+  const processValueList = ref([]);
+  const selectedProcess = ref(null);
+  const processLoading = ref(false);
+
+  // 鍙傛暟鍒楄〃鏁版嵁
+  const paramList = ref([]);
+  const paramLoading = ref(false);
+
+  // 鏁版嵁瀛楀吀
+  const dictTypes = ref([]);
+
+  // 宸ュ簭瀵硅瘽妗�
+  const processDialogVisible = ref(false);
+  const isProcessEdit = ref(false);
+  const processFormRef = ref(null);
+  const processForm = reactive({
+    id: null,
+    no: "",
+    name: "",
+    salaryQuota: null,
+    isQuality: false,
+    remark: "",
+    status: true,
   });
-  const { searchForm } = toRefs(data);
-  const tableColumn = ref([
-    {
-      label: "宸ュ簭缂栧彿",
-      prop: "no",
-    },
-    {
-      label: "宸ュ簭鍚嶇О",
-      prop: "name",
-    },
+  const processRules = {
+    no: [{ required: true, message: "璇疯緭鍏ュ伐搴忕紪鐮�", trigger: "blur" }],
+    name: [{ required: true, message: "璇疯緭鍏ュ伐搴忓悕绉�", trigger: "blur" }],
+    salaryQuota: [
+      {
+        required: false,
+        message: "璇疯緭鍏ュ伐璧勫畾棰�",
+        trigger: "blur",
+        validator: (rule, value, callback) => {
+          if (isNaN(value) || value < 0) {
+            callback(new Error("宸ヨ祫瀹氶蹇呴』鏄潪璐熸暟瀛�"));
+          } else {
+            callback();
+          }
+        },
+      },
+    ],
+  };
 
+  // 鍙傛暟瀵硅瘽妗�
+  const paramDialogVisible = ref(false);
+  const availableParamList = ref([]);
+  const filteredParamList = ref([]);
+  const selectedParam = ref(null);
+  const paramSearchKeyword = ref("");
+
+  // 鍙�夊弬鏁板垎椤�
+  const paramPage = reactive({
+    current: 1,
+    size: 10,
+    total: 0,
+  });
+
+  // 缂栬緫鍙傛暟瀵硅瘽妗�
+  const editParamDialogVisible = ref(false);
+  const editParamFormRef = ref(null);
+  const editParamForm = reactive({
+    id: null,
+    processId: null,
+    paramId: null,
+    paramName: "",
+    valueMode: "1",
+    standardValue: null,
+    minValue: null,
+    maxValue: null,
+    sort: 1,
+    isRequired: 0,
+    tenantId: 1,
+  });
+  const editParamRules = {
+    standardValue: [
+      {
+        required: true,
+        message: "璇疯緭鍏ユ爣鍑嗗��",
+        trigger: "blur",
+        validator: (rule, value, callback) => {
+          if (value === null || value === undefined || value === "") {
+            callback(new Error("璇疯緭鍏ユ爣鍑嗗��"));
+          } else {
+            callback();
+          }
+        },
+      },
+    ],
+    minValue: [
+      {
+        required: true,
+        message: "璇疯緭鍏ユ渶灏忓��",
+        trigger: "blur",
+        validator: (rule, value, callback) => {
+          if (value === null || value === undefined || value === "") {
+            callback(new Error("璇疯緭鍏ユ渶灏忓��"));
+          } else {
+            callback();
+          }
+        },
+      },
+    ],
+    maxValue: [
+      {
+        required: true,
+        message: "璇疯緭鍏ユ渶澶у��",
+        trigger: "blur",
+        validator: (rule, value, callback) => {
+          if (value === null || value === undefined || value === "") {
+            callback(new Error("璇疯緭鍏ユ渶澶у��"));
+          } else {
+            callback();
+          }
+        },
+      },
+    ],
+    sort: [
+      {
+        required: true,
+        message: "璇疯緭鍏ユ帓搴�",
+        trigger: "blur",
+        validator: (rule, value, callback) => {
+          if (value === null || value === undefined || value === "") {
+            callback(new Error("璇疯緭鍏ユ帓搴�"));
+          } else if (isNaN(value) || value < 1) {
+            callback(new Error("鎺掑簭蹇呴』鏄ぇ浜�0鐨勬暣鏁�"));
+          } else {
+            callback();
+          }
+        },
+      },
+    ],
+  };
+
+  // 鍙傛暟琛ㄦ牸鍒楅厤缃�
+  const paramColumn = ref([
     {
-      label: "宸ヨ祫瀹氶",
-      prop: "salaryQuota",
+      label: "鍙傛暟鍚嶇О",
+      prop: "paramName",
     },
     {
-      label: "澶囨敞",
-      prop: "remark",
+      label: "鍙傛暟妯″紡",
+      prop: "valueMode",
+      dataType: "tag",
+      formatType: row => (row.valueMode === "1" ? "success" : "warning"),
+      formatData: row => (row.valueMode === "1" ? "鍗曞��" : "鍖洪棿"),
     },
     {
-      label: "鏇存柊鏃堕棿",
-      prop: "updateTime",
+      label: "鍙傛暟绫诲瀷",
+      prop: "paramType",
+      dataType: "tag",
+      formatType: params => {
+        const typeMap = {
+          1: "primary",
+          2: "info",
+          3: "warning",
+          4: "success",
+        };
+        return typeMap[params] || "default";
+      },
+      formatData: val => {
+        const labelMap = {
+          1: "鏁板�兼牸寮�",
+          2: "鏂囨湰鏍煎紡",
+          3: "涓嬫媺閫夐」",
+          4: "鏃堕棿鏍煎紡",
+        };
+        return labelMap[val] || val;
+      },
     },
     {
-      dataType: "action",
+      label: "鍙栧�兼牸寮�",
+      prop: "paramFormat",
+      formatData: (val, row) => {
+        if (row.paramType == "3") {
+          const dict = dictTypes.value.find(item => item.dictType === val);
+          return dict ? "瀛楀吀:" + dict.dictName : val;
+        }
+        return val;
+      },
+    },
+    {
+      label: "鏍囧噯鍊�",
+      prop: "standardValue",
+      formatData: (val, row) => {
+        return row.valueMode == "1" ? val : "-";
+      },
+    },
+    {
+      label: "鏈�灏忓��",
+      prop: "minValue",
+      formatData: (val, row) => {
+        return row.valueMode == "2" ? val : "-";
+      },
+    },
+    {
+      label: "鏈�澶у��",
+      prop: "maxValue",
+      formatData: (val, row) => {
+        return row.valueMode == "2" ? val : "-";
+      },
+    },
+    {
+      label: "鍗曚綅",
+      prop: "unit",
+    },
+    {
+      label: "鎺掑簭",
+      prop: "sort",
+    },
+    {
+      label: "鏄惁蹇呭~",
+      prop: "isRequired",
+      dataType: "tag",
+      formatType: row => (row.isRequired === 1 ? "success" : "info"),
+      formatData: row => (row.isRequired === 1 ? "鏄�" : "鍚�"),
+    },
+    {
       label: "鎿嶄綔",
-      align: "center",
-      fixed: "right",
-      width: 280,
+      dataType: "action",
+      width: "150",
       operation: [
         {
           name: "缂栬緫",
-          type: "text",
-          clickFun: row => {
-            showEditModal(row);
-          },
+          clickFun: row => handleEditParam(row),
+        },
+        {
+          name: "鍒犻櫎",
+          clickFun: row => handleDeleteParam(row),
         },
       ],
     },
   ]);
-  const tableData = ref([]);
-  const selectedRows = ref([]);
-  const tableLoading = ref(false);
-  const isShowNewModal = ref(false);
-  const isShowEditModal = ref(false);
-  const record = ref({});
-  const importDialogVisible = ref(false);
-  const importDialogRef = ref(null);
-  const page = reactive({
-    current: 1,
-    size: 100,
-    total: 0,
-  });
-  const { proxy } = getCurrentInstance();
 
-  // 瀵煎叆鐩稿叧閰嶇疆
-  const importAction =
-    import.meta.env.VITE_APP_BASE_API + "/productProcess/importData";
-  const importHeaders = { Authorization: "Bearer " + getToken() };
-
-  // 鏌ヨ鍒楄〃
-  /** 鎼滅储鎸夐挳鎿嶄綔 */
-  const handleQuery = () => {
-    page.current = 1;
-    getList();
-  };
-
-  const pagination = obj => {
-    page.current = obj.page;
-    page.size = obj.limit;
-    getList();
-  };
-  const getList = () => {
-    tableLoading.value = true;
-    const params = { ...searchForm.value, ...page };
-    params.entryDate = undefined;
-    listPage(params)
+  // 鑾峰彇宸ュ簭鍒楄〃
+  const getProcessList = () => {
+    processLoading.value = true;
+    getProcessListApi()
       .then(res => {
-        tableLoading.value = false;
-        tableData.value = res.data.records.map(item => ({
-          ...item,
-        }));
-        page.total = res.data.total;
+        processValueList.value = res.data || [];
       })
-      .catch(err => {
-        tableLoading.value = false;
+      .catch(() => {
+        ElMessage.error("鑾峰彇宸ュ簭鍒楄〃澶辫触");
+      })
+      .finally(() => {
+        processLoading.value = false;
       });
   };
-  // 琛ㄦ牸閫夋嫨鏁版嵁
-  const handleSelectionChange = selection => {
-    selectedRows.value = selection;
+
+  // 鑾峰彇鍙傛暟鍒楄〃
+  const getParamList = processId => {
+    paramLoading.value = true;
+    getProcessParamList(processId)
+      .then(res => {
+        paramList.value = res.data || [];
+        paramPage.total = paramList.value.length;
+      })
+      .catch(() => {
+        ElMessage.error("鑾峰彇鍙傛暟鍒楄〃澶辫触");
+      })
+      .finally(() => {
+        paramLoading.value = false;
+      });
   };
 
-  // 鎵撳紑鏂板寮规
-  const showNewModal = () => {
-    isShowNewModal.value = true;
+  // 閫夋嫨宸ュ簭
+  const selectProcess = process => {
+    selectedProcess.value = process;
+    getParamList(process.id);
   };
 
-  const showEditModal = row => {
-    isShowEditModal.value = true;
-    record.value = row;
+  // 宸ュ簭鎿嶄綔
+  const handleAddProcess = () => {
+    isProcessEdit.value = false;
+    processForm.id = null;
+    processForm.no = "";
+    processForm.name = "";
+    processForm.salaryQuota = null;
+    processForm.isQuality = false;
+    processForm.remark = "";
+    processForm.status = true;
+    processDialogVisible.value = true;
   };
 
-  // 鍒犻櫎
-  function handleDelete() {
-    const no = selectedRows.value.map(item => item.no);
-    const ids = selectedRows.value.map(item => item.id);
-    if (no.length > 2) {
-      proxy.$modal
-        .confirm(
-          '鏄惁纭鍒犻櫎宸ュ簭缂栧彿涓�"' +
-            no[0] +
-            "銆�" +
-            no[1] +
-            '"绛�' +
-            no.length +
-            "鏉℃暟鎹」锛�"
-        )
-        .then(function () {
-          return del(ids);
-        })
+  const handleEditProcess = process => {
+    isProcessEdit.value = true;
+    processForm.id = process.id;
+    processForm.no = process.no;
+    processForm.name = process.name;
+    processForm.salaryQuota = process.salaryQuota;
+    processForm.isQuality = process.isQuality || false;
+    processForm.remark = process.remark || "";
+    processForm.status = process.status;
+    processDialogVisible.value = true;
+  };
+
+  const handleDeleteProcess = process => {
+    ElMessageBox.confirm("纭畾瑕佸垹闄よ宸ュ簭鍚楋紵", "鎻愮ず", {
+      confirmButtonText: "纭畾",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    }).then(() => {
+      del([process.id])
         .then(() => {
-          getList();
-          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getProcessList();
+          if (selectedProcess.value?.id === process.id) {
+            selectedProcess.value = null;
+            paramList.value = [];
+          }
         })
-        .catch(() => {});
-    } else {
-      proxy.$modal
-        .confirm('鏄惁纭鍒犻櫎宸ュ簭缂栧彿涓�"' + no + '"鐨勬暟鎹」锛�')
-        .then(function () {
-          return del(ids);
-        })
-        .then(() => {
-          getList();
-          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        })
-        .catch(() => {});
-    }
-  }
-
-  // 瀵煎叆
-  const handleImport = () => {
-    importDialogVisible.value = true;
+        .catch(() => {
+          ElMessage.error("鍒犻櫎澶辫触");
+        });
+    });
   };
 
-  // 纭瀵煎叆
-  const handleImportConfirm = () => {
-    if (importDialogRef.value) {
-      importDialogRef.value.submit();
-    }
-  };
-
-  // 瀵煎叆鎴愬姛
-  const handleImportSuccess = response => {
-    if (response.code === 200) {
-      proxy.$modal.msgSuccess("瀵煎叆鎴愬姛");
-      importDialogVisible.value = false;
-      if (importDialogRef.value) {
-        importDialogRef.value.clearFiles();
+  const handleProcessSubmit = () => {
+    processFormRef.value.validate(valid => {
+      if (valid) {
+        const apiMethod = isProcessEdit.value ? update : add;
+        apiMethod(processForm)
+          .then(() => {
+            ElMessage.success(isProcessEdit.value ? "缂栬緫鎴愬姛" : "鏂板鎴愬姛");
+            processDialogVisible.value = false;
+            getProcessList();
+          })
+          .catch(() => {
+            ElMessage.error(isProcessEdit.value ? "缂栬緫澶辫触" : "鏂板澶辫触");
+          });
       }
-      getList();
-    } else {
-      proxy.$modal.msgError(response.msg || "瀵煎叆澶辫触");
+    });
+  };
+
+  // 鍙傛暟鎿嶄綔
+  const handleSelectParam = () => {
+    if (!selectedProcess.value) {
+      ElMessage.warning("璇峰厛閫夋嫨涓�涓伐搴�");
+      return;
     }
+    // 鑾峰彇鍙�夊弬鏁板垪琛�
+    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 || "鏌ヨ澶辫触");
+      }
+    });
+    console.log(filteredParamList.value, "鍙�夊弬鏁板垪琛�");
+    selectedParam.value = null;
+    paramDialogVisible.value = true;
   };
 
-  // 瀵煎叆澶辫触
-  const handleImportError = error => {
-    proxy.$modal.msgError("瀵煎叆澶辫触锛�" + (error.message || "鏈煡閿欒"));
+  const handleParamSelect = row => {
+    selectedParam.value = row;
   };
 
-  // 鍏抽棴瀵煎叆寮圭獥
-  const handleImportClose = () => {
-    if (importDialogRef.value) {
-      importDialogRef.value.clearFiles();
+  const handleParamSearch = () => {
+    // 閲嶇疆鍒嗛〉
+    paramPage.current = 1;
+    // 閲嶆柊鍔犺浇鏁版嵁
+    handleSelectParam();
+  };
+
+  // 澶勭悊鍒嗛〉澶у皬鍙樺寲
+  const handleParamSizeChange = size => {
+    paramPage.size = size;
+    handleSelectParam();
+  };
+
+  // 澶勭悊褰撳墠椤电爜鍙樺寲
+  const handleParamCurrentChange = current => {
+    paramPage.current = current;
+    handleSelectParam();
+  };
+  const getParamTypeText = type => {
+    const typeMap = {
+      1: "鏁板�兼牸寮�",
+      2: "鏂囨湰鏍煎紡",
+      3: "涓嬫媺閫夐」",
+      4: "鏃堕棿鏍煎紡",
+    };
+    return typeMap[type] || "鏈煡鍙傛暟绫诲瀷";
+  };
+  const getParamTypeTag = type => {
+    const typeMap = {
+      1: "primary",
+      2: "info",
+      3: "warning",
+      4: "success",
+    };
+    return typeMap[type] || "default";
+  };
+
+  const handleDeleteParam = row => {
+    ElMessageBox.confirm("纭畾瑕佸垹闄よ鍙傛暟鍚楋紵", "鎻愮ず", {
+      confirmButtonText: "纭畾",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    }).then(() => {
+      deleteProcessParam(row.id)
+        .then(() => {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getParamList(selectedProcess.value.id);
+        })
+        .catch(() => {
+          ElMessage.error("鍒犻櫎澶辫触");
+        });
+    });
+  };
+
+  const handleEditParam = row => {
+    editParamForm.id = row.id;
+    editParamForm.processId = row.processId;
+    editParamForm.paramId = row.paramId;
+    editParamForm.paramName = row.paramName;
+    editParamForm.valueMode = row.valueMode;
+    editParamForm.standardValue = row.standardValue;
+    editParamForm.minValue = row.minValue;
+    editParamForm.maxValue = row.maxValue;
+    editParamForm.sort = row.sort || 1;
+    editParamForm.isRequired = row.isRequired || 0;
+    editParamForm.tenantId = 1;
+    editParamDialogVisible.value = true;
+  };
+
+  const handleEditParamSubmit = () => {
+    editParamFormRef.value.validate(valid => {
+      if (valid) {
+        editProcessParam(editParamForm)
+          .then(() => {
+            ElMessage.success("缂栬緫鎴愬姛");
+            editParamDialogVisible.value = false;
+            getParamList(selectedProcess.value.id);
+          })
+          .catch(() => {
+            ElMessage.error("缂栬緫澶辫触");
+          });
+      }
+    });
+  };
+
+  const handleParamSubmit = () => {
+    if (!selectedParam.value) {
+      ElMessage.warning("璇峰厛閫夋嫨涓�涓弬鏁�");
+      return;
     }
-  };
-
-  // 涓嬭浇妯℃澘
-  const handleDownloadTemplate = async () => {
-    try {
-      const res = await downloadTemplate();
-      const blob = new Blob([res], {
-        type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+    addProcessParam({
+      processId: selectedProcess.value.id,
+      paramId: selectedParam.value.id,
+      sort: selectedParam.value.sort || 1,
+      standardValue: selectedParam.value.standardValue,
+      minValue: selectedParam.value.minValue,
+      maxValue: selectedParam.value.maxValue,
+      isRequired: selectedParam.value.isRequired || 0,
+      tenantId: 1,
+    })
+      .then(() => {
+        ElMessage.success("娣诲姞鎴愬姛");
+        paramDialogVisible.value = false;
+        getParamList(selectedProcess.value.id);
+      })
+      .catch(() => {
+        ElMessage.error("娣诲姞澶辫触");
       });
-      const url = window.URL.createObjectURL(blob);
-      const link = document.createElement("a");
-      link.href = url;
-      link.download = "宸ュ簭瀵煎叆妯℃澘.xlsx";
-      link.click();
-      window.URL.revokeObjectURL(url);
-      proxy.$modal.msgSuccess("妯℃澘涓嬭浇鎴愬姛");
-    } catch (error) {
-      proxy.$modal.msgError("妯℃澘涓嬭浇澶辫触");
-    }
   };
 
-  // 瀵煎嚭
-  // const handleOut = () => {
-  // 	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-  // 		confirmButtonText: "纭",
-  // 		cancelButtonText: "鍙栨秷",
-  // 		type: "warning",
-  // 	})
-  // 		.then(() => {
-  // 			proxy.download("/salesLedger/scheduling/exportTwo", {}, "宸ュ簭鎺掍骇.xlsx");
-  // 		})
-  // 		.catch(() => {
-  // 			proxy.$modal.msg("宸插彇娑�");
-  // 		});
-  // };
+  const handleParamPagination = obj => {
+    paramPage.current = obj.page;
+    paramPage.size = obj.limit;
+    getParamList(selectedProcess.value.id);
+  };
+
+  // 鑾峰彇鏁版嵁瀛楀吀
+  const getDictTypes = () => {
+    listType({ pageNum: 1, pageSize: 1000 }).then(res => {
+      dictTypes.value = res.rows || [];
+    });
+  };
 
   onMounted(() => {
-    getList();
+    getProcessList();
+    getDictTypes();
   });
 </script>
 
-<style scoped></style>
+<style scoped lang="scss">
+  .app-container {
+    padding: 20px;
+    background-color: #f0f2f5;
+    min-height: calc(100vh - 84px);
+  }
+
+  .process-config-container {
+    display: flex;
+    gap: 20px;
+    height: calc(100vh - 124px);
+  }
+
+  // 宸︿晶宸ュ簭鍒楄〃
+  .process-list-section {
+    width: 370px;
+    min-width: 370px;
+    flex-shrink: 0;
+    background: #fff;
+    border-radius: 8px;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+    display: flex;
+    flex-direction: column;
+  }
+
+  .section-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 16px 20px;
+    border-bottom: 1px solid #ebeef5;
+
+    .section-title {
+      margin: 0;
+      font-size: 16px;
+      font-weight: 600;
+      color: #303133;
+    }
+  }
+
+  .process-card-list {
+    flex: 1;
+    overflow-y: auto;
+    padding: 16px;
+  }
+
+  .process-card {
+    background: #fff;
+    border: 1px solid #ebeef5;
+    border-radius: 8px;
+    padding: 16px;
+    margin-bottom: 12px;
+    cursor: pointer;
+    transition: all 0.3s ease;
+
+    &:hover {
+      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+      transform: translateY(-2px);
+    }
+
+    &.active {
+      border-color: #409eff;
+      background: #f5f7fa;
+      box-shadow: 0 4px 12px rgba(64, 158, 255, 0.2);
+    }
+
+    .card-header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      margin-bottom: 8px;
+
+      .process-code {
+        font-size: 12px;
+        // color: #909399;
+        color: #cb9b18;
+        font-family: "Courier New", monospace;
+      }
+
+      .card-actions {
+        display: flex;
+        gap: 4px;
+
+        .el-button {
+          padding: 4px;
+        }
+      }
+    }
+
+    .card-body {
+      margin-bottom: 12px;
+
+      .process-name {
+        font-size: 16px;
+        font-weight: 600;
+        color: #303133;
+        margin-bottom: 4px;
+      }
+
+      .process-desc {
+        font-size: 12px;
+        color: #909399;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+    }
+
+    .card-footer {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+
+      .param-count {
+        font-size: 12px;
+        color: #606266;
+      }
+    }
+  }
+
+  // 鍙充晶鍙傛暟鍒楄〃
+  .param-list-section {
+    flex: 1;
+    background: #fff;
+    border-radius: 8px;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+    display: flex;
+    flex-direction: column;
+  }
+
+  .param-table-wrapper {
+    flex: 1;
+    padding: 0 20px 20px;
+    overflow: auto;
+  }
+
+  /* 琛ㄦ牸妯悜婊氬姩 */
+  :deep(.el-table) {
+    // min-width: 800px;
+  }
+
+  .empty-tip {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
+  // 琛ㄦ牸鏍峰紡
+  :deep(.el-table) {
+    border: none;
+    border-radius: 6px;
+    overflow: hidden;
+
+    .el-table__header-wrapper {
+      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+
+      th {
+        background: transparent;
+        font-weight: 600;
+        // color: #ffffff;
+        border-bottom: none;
+        padding: 16px 0;
+      }
+    }
+
+    .el-table__body-wrapper {
+      tr {
+        transition: all 0.3s ease;
+
+        &:hover {
+          background: linear-gradient(
+            90deg,
+            rgba(102, 126, 234, 0.05) 0%,
+            rgba(118, 75, 162, 0.05) 100%
+          );
+        }
+
+        td {
+          border-bottom: 1px solid #f0f0f0;
+          padding: 14px 0;
+          color: #303133;
+        }
+      }
+    }
+  }
+
+  // 缂栫爜鍗曞厓鏍兼牱寮�
+  :deep(.code-cell) {
+    color: #e6a23c;
+    font-family: "Courier New", monospace;
+    font-weight: 500;
+  }
+
+  // 鏁板�煎崟鍏冩牸鏍峰紡
+  :deep(.quantity-cell) {
+    font-weight: 600;
+    color: #409eff;
+    font-family: "Courier New", monospace;
+  }
+
+  // 閫夋嫨鍙傛暟瀵硅瘽妗嗘牱寮�
+  .param-select-container {
+    display: flex;
+    gap: 20px;
+    height: 450px;
+
+    .param-list-area {
+      // flex: 1;
+      width: 380px;
+      display: flex;
+      flex-direction: column;
+
+      .area-title {
+        font-size: 14px;
+        font-weight: 600;
+        color: #303133;
+        margin-bottom: 12px;
+        padding-bottom: 8px;
+        border-bottom: 1px solid #ebeef5;
+      }
+
+      .search-box {
+        margin-bottom: 12px;
+
+        .el-input {
+          width: 100%;
+        }
+      }
+    }
+
+    .param-detail-area {
+      // width: 380px;
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      background: #f5f7fa;
+      border-radius: 8px;
+      padding: 16px;
+
+      .area-title {
+        font-size: 14px;
+        font-weight: 600;
+        color: #303133;
+        margin-bottom: 16px;
+        padding-bottom: 8px;
+        border-bottom: 1px solid #ebeef5;
+      }
+
+      .param-detail-form {
+        .el-form-item {
+          margin-bottom: 12px;
+
+          .el-form-item__label {
+            color: #606266;
+            font-weight: 500;
+          }
+        }
+
+        .detail-text {
+          color: #303133;
+          font-weight: 500;
+        }
+      }
+    }
+  }
+</style>

--
Gitblit v1.9.3