From 2a146bcbd2c3752d699338bad39a07feabe6890e Mon Sep 17 00:00:00 2001
From: chenhj <1263187585@qq.com>
Date: 星期五, 26 十二月 2025 16:39:52 +0800
Subject: [PATCH] 产品结构

---
 src/api/basicData/product.js                                      |    8 --
 src/api/productionManagement/productStructure.js                  |    2 
 src/views/productionManagement/productStructure/StructureEdit.vue |  161 ++++++++++++++++++++++++++++++++++++-----------------
 src/views/productionManagement/productStructure/index.vue         |    9 +--
 4 files changed, 113 insertions(+), 67 deletions(-)

diff --git a/src/api/basicData/product.js b/src/api/basicData/product.js
index 3be642d..10f8fd1 100644
--- a/src/api/basicData/product.js
+++ b/src/api/basicData/product.js
@@ -56,11 +56,3 @@
         params: query
     })
 }
-
-export function modelPage(query) {
-    return request({
-        url: '/basic/product/pageModel',
-        method: 'get',
-        params: query
-    })
-}
diff --git a/src/api/productionManagement/productStructure.js b/src/api/productionManagement/productStructure.js
index ce2c31f..074e27a 100644
--- a/src/api/productionManagement/productStructure.js
+++ b/src/api/productionManagement/productStructure.js
@@ -4,7 +4,7 @@
 // 鍒嗛〉鏌ヨ
 export function queryList(id) {
   return request({
-    url: "/productStructure/" + id,
+    url: "/productStructure/listByproductModelId/" + id,
     method: "get",
   });
 }
diff --git a/src/views/productionManagement/productStructure/StructureEdit.vue b/src/views/productionManagement/productStructure/StructureEdit.vue
index c202473..fb5784f 100644
--- a/src/views/productionManagement/productStructure/StructureEdit.vue
+++ b/src/views/productionManagement/productStructure/StructureEdit.vue
@@ -1,50 +1,74 @@
 <template>
   <el-dialog
       v-model="visible"
-      title="Tips"
-      width="500"
-      :before-close="visible = false"
+      title="缁撴瀯"
+      width="1200"
+      close-on-click-modal
+      @close="visible = false"
   >
+    <el-button
+        v-if="dataValue.isEdit"
+        type="primary"
+        @click="addItem"
+        style="margin-bottom: 10px"
+    >娣诲姞
+    </el-button>
+    <el-button
+        v-if="!dataValue.isEdit"
+        type="primary"
+        @click="dataValue.isEdit = true"
+        style="margin-bottom: 10px"
+    >缂栬緫
+    </el-button>
+    <el-button
+        v-if="dataValue.isEdit"
+        type="primary"
+        @click="cancelEdit"
+        style="margin-bottom: 10px"
+    >鍙栨秷
+    </el-button>
     <el-form
         ref="form"
         :model="dataValue"
-        label-width="80px"
     >
       <el-table :data="dataValue.dataList" style="width: 100%">
-        <el-table-column prop="productName" label="浜у搧" width="180" />
-        <el-table-column prop="model" label="瑙勬牸" width="180">
-          <template #default="{ row, index }">
+        <el-table-column prop="productName" label="浜у搧" width="150"/>
+        <el-table-column prop="model" label="瑙勬牸" width="150">
+          <template #default="{ row, $index }">
             <el-form-item
-                :prop="`dataList.${index}.model`"
+                v-if="dataValue.isEdit"
+                :prop="`dataList.${$index}.model`"
                 :rules="[{ required: true, message: '璇烽�夋嫨瑙勬牸', trigger: ['blur','change'] }]"
                 style="margin: 0"
             >
-              <el-input
-                  v-model="dataValue.dataList[index].model"
+              <el-select
+                  v-model="row.model"
                   placeholder="璇烽�夋嫨浜у搧"
-                  readonly
-                  @focus="() => {
-              dataValue.currentRowIndex = index
-              showModel = true
-            }"
-              />
+                  clearable
+                  :disabled="!dataValue.isEdit"
+                  style="width: 100%"
+                  @visible-change="(v) => { if (v) openDialog($index) }"
+              >
+                <el-option v-if="row.model" :label="row.model" :value="row.model" />
+              </el-select>
             </el-form-item>
           </template>
         </el-table-column>
 
-        <el-table-column prop="processName" label="娑堣�楀伐搴�" width="180">
-          <template #default="{ row, index }">
+        <el-table-column prop="processId" label="娑堣�楀伐搴�" width="150">
+          <template #default="{ row, $index }">
             <el-form-item
-                :prop="`dataList.${index}.processId`"
+                :prop="`dataList.${$index}.processId`"
                 :rules="[{ required: true, message: '璇烽�夋嫨娑堣�楀伐搴�', trigger: 'change' }]"
                 style="margin: 0"
             >
               <el-select
-                  v-model="dataValue.dataList[index].processId"
+                  v-model="row.processId"
                   placeholder="璇烽�夋嫨"
                   filterable
                   clearable
                   style="width: 100%"
+                  :disabled="!dataValue.isEdit"
               >
                 <el-option
                     v-for="item in dataValue.processOptions"
@@ -57,86 +81,89 @@
           </template>
         </el-table-column>
 
-        <el-table-column prop="unitQuantity" label="鍗曚綅浜у嚭鎵�闇�鏁伴噺">
-          <template #default="{ row, index }">
+        <el-table-column prop="unitQuantity" label="鍗曚綅浜у嚭鎵�闇�鏁伴噺" width="150">
+          <template #default="{ row, $index }">
             <el-form-item
-                :prop="`dataList.${index}.unitQuantity`"
+                :prop="`dataList.${$index}.unitQuantity`"
                 :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣嶄骇鍑烘墍闇�鏁伴噺', trigger: ['blur','change'] }]"
                 style="margin: 0"
             >
               <el-input-number
-                  v-model="dataValue.dataList[index].unitQuantity"
+                  v-model="row.unitQuantity"
                   :min="0"
                   :precision="2"
                   :step="1"
                   controls-position="right"
                   style="width: 100%"
+                  :disabled="!dataValue.isEdit"
               />
             </el-form-item>
           </template>
         </el-table-column>
 
-        <el-table-column prop="demandedQuantity" label="闇�姹傛�婚噺">
-          <template #default="{ row, index }">
+        <el-table-column prop="demandedQuantity" label="闇�姹傛�婚噺" width="150">
+          <template #default="{ row, $index }">
             <el-form-item
-                :prop="`dataList.${index}.demandedQuantity`"
+                :prop="`dataList.${$index}.demandedQuantity`"
                 :rules="[{ required: true, message: '璇疯緭鍏ラ渶姹傛�婚噺', trigger: ['blur','change'] }]"
                 style="margin: 0"
             >
               <el-input-number
-                  v-model="dataValue.dataList[index].demandedQuantity"
+                  v-model="row.demandedQuantity"
                   :min="0"
                   :precision="2"
                   :step="1"
                   controls-position="right"
                   style="width: 100%"
+                  :disabled="!dataValue.isEdit"
               />
             </el-form-item>
           </template>
         </el-table-column>
 
-        <el-table-column prop="unit" label="鍗曚綅">
-          <template #default="{ row, index }">
+        <el-table-column prop="unit" label="鍗曚綅" width="150">
+          <template #default="{ row, $index }">
             <el-form-item
-                :prop="`dataList.${index}.unit`"
+                :prop="`dataList.${$index}.unit`"
                 :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣�', trigger: ['blur','change'] }]"
                 style="margin: 0"
             >
               <el-input
-                  v-model="dataValue.dataList[index].unit"
+                  v-model="row.unit"
                   placeholder="璇疯緭鍏ュ崟浣�"
                   clearable
+                  :disabled="!dataValue.isEdit"
               />
             </el-form-item>
           </template>
         </el-table-column>
 
-        <el-table-column prop="address" label="鐩樻暟锛堢洏锛�">
-          <template #default="{ row, index }">
+        <el-table-column prop="diskQuantity" label="鐩樻暟锛堢洏锛�" width="150">
+          <template #default="{ row, $index }">
             <el-form-item
-                :prop="`dataList.${index}.address`"
+                :prop="`dataList.${$index}.diskQuantity`"
                 :rules="[{ required: true, message: '璇疯緭鍏ョ洏鏁�', trigger: ['blur','change'] }]"
                 style="margin: 0"
             >
               <el-input-number
-                  v-model="dataValue.dataList[index].address"
+                  v-model="row.diskQuantity"
                   :min="0"
                   :precision="0"
                   :step="1"
                   controls-position="right"
                   style="width: 100%"
+                  :disabled="!dataValue.isEdit"
               />
             </el-form-item>
           </template>
         </el-table-column>
 
         <el-table-column label="鎿嶄綔">
-          <template #default="{ row, index }">
+          <template #default="{ row, $index }">
             <el-button
                 type="danger"
-                icon="el-icon-delete"
-                circle
-                @click="dataValue.dataList.splice(index, 1)"
+                text
+                @click="dataValue.dataList.splice($index, 1)"
             >鍒犻櫎
             </el-button>
           </template>
@@ -146,12 +173,12 @@
 
     <product-select-dialog
         v-if="dataValue.showProductDialog"
-        :model-value="dataValue.showProductDialog"
+        v-model:model-value="dataValue.showProductDialog"
         @confirm="handleProduct"/>
     <template #footer>
       <div class="dialog-footer">
         <el-button @click="visible = false">鍙栨秷</el-button>
-        <el-button type="primary" :loading="dataValue.loading" @click="submit">
+        <el-button type="primary" :loading="dataValue.loading" @click="submit" :disabled="!dataValue.isEdit">
           纭
         </el-button>
       </div>
@@ -160,7 +187,7 @@
 </template>
 
 <script setup lang="ts">
-import {computed, defineComponent, onMounted, reactive, ref} from "vue";
+import {computed, defineAsyncComponent, defineComponent, onMounted, reactive, ref} from "vue";
 import {queryList, add} from '@/api/productionManagement/productStructure.js'
 import {list} from '@/api/productionManagement/productionProcess'
 import {ElMessage} from "element-plus";
@@ -170,8 +197,9 @@
   name: "StructureEdit",
 })
 
-const ProductSelectDialog = () => import('@/views/basicData/product/ProductSelectDialog.vue')
-const from = ref()
+const ProductSelectDialog = defineAsyncComponent(() => import('@/views/basicData/product/ProductSelectDialog.vue'))
+const form = ref()
+
 
 
 const props = defineProps({
@@ -185,13 +213,13 @@
   }
 })
 
-const emits = defineEmits(['update:visible'])
+const emits = defineEmits(['update:showModel'])
 const visible = computed({
   get() {
     return props.showModel
   },
   set(val) {
-    emits('update:visible', val)
+    emits('update:showModel', val)
   }
 })
 
@@ -202,7 +230,13 @@
   showProductDialog: false,
   currentRowIndex: null,
   loading: false,
+  isEdit: false,
 });
+
+const openDialog = (index) => {
+  dataValue.currentRowIndex = index
+  dataValue.showProductDialog = true
+}
 
 const fetchData = async () => {
   const {data} = await queryList(props.productModelId)
@@ -215,18 +249,22 @@
 }
 
 const handleProduct = (row) => {
+  if (row?.length > 1) {
+    ElMessage.error('鍙兘閫夋嫨涓�涓骇鍝�')
+  }
+  dataValue.dataList[dataValue.currentRowIndex].productName = row[0].productName
+  dataValue.dataList[dataValue.currentRowIndex].model = row[0].model
+  dataValue.dataList[dataValue.currentRowIndex].productModelId = row[0].id
   dataValue.showProductDialog = false
-  dataValue.dataList[dataValue.currentRowIndex].speculativeTradingName = row.productName + '-' + row.model
-  dataValue.dataList[dataValue.currentRowIndex].productModelId = row.id
 }
 
 const submit = () => {
-  from.value.validate(valid => {
+  form.value.validate(valid => {
     dataValue.loading = true
     if (valid) {
       add({
-        productModelId: props.productModelId,
-        dataList: dataValue.dataList
+        parentId: props.productModelId,
+        productStructureList: dataValue.dataList || []
       }).then(res => {
         ElMessage.success('淇濆瓨鎴愬姛')
         visible.value = false
@@ -238,6 +276,25 @@
   })
 }
 
+const addItem = () => {
+  dataValue.dataList.push({
+    productName: '',
+    productId: '',
+    model: undefined,
+    productModelId: undefined,
+    processId: '',
+    unitQuantity: 0,
+    demandedQuantity: 0,
+    unit: '',
+    diskQuantity: 0,
+  })
+}
+
+const cancelEdit = () => {
+  dataValue.isEdit = false
+  dataValue.dataList = dataValue.dataList.filter(item => item.id !== undefined)
+}
+
 onMounted(() => {
   fetchData()
   fetchProcessOptions()
diff --git a/src/views/productionManagement/productStructure/index.vue b/src/views/productionManagement/productStructure/index.vue
index 44fae1c..bdbec9c 100644
--- a/src/views/productionManagement/productStructure/index.vue
+++ b/src/views/productionManagement/productStructure/index.vue
@@ -28,11 +28,9 @@
 
 <script setup>
 import {ref} from "vue";
-import {
-  modelPage,
-} from "@/api/basicData/product.js";
+import {productModelList} from "@/api/basicData/productModel.js";
 
-const StructureEdit = () => import('@/views/productionManagement/productStructure/StructureEdit.vue')
+const StructureEdit = defineAsyncComponent(() => import('@/views/productionManagement/productStructure/StructureEdit.vue'))
 
 const tableColumn = ref([
   {
@@ -88,11 +86,10 @@
 };
 const getModelList = () => {
   tableLoading.value = true;
-  modelPage({
+  productModelList({
     current: page.current,
     size: page.size,
   }).then((res) => {
-    console.log("res", res);
     tableData.value = res.records;
     page.total = res.total;
     tableLoading.value = false;

--
Gitblit v1.9.3