Forráskód Böngészése

fix: 根据类型分开编辑弹窗

jiaxing.liao 2 hete
szülő
commit
e920157071

+ 196 - 293
src/pages/excel/ConfigDrawer.vue

@@ -1,7 +1,7 @@
 <template>
   <el-drawer
     v-model="visible"
-    title="BOM详情配置"
+    title="制造BOM详情配置"
     size="600"
     v-loading="loading"
   >
@@ -18,7 +18,7 @@
           <el-form-item label="级号" prop="lever_number">
             <el-input
               placeholder="请输入"
-              readonly
+              disabled
               v-model="formData.lever_number"
             />
           </el-form-item>
@@ -27,36 +27,56 @@
         <!-- 序号 -->
         <el-col :span="12">
           <el-form-item label="序号" prop="gridorders">
-            <el-input placeholder="请输入" v-model="formData.gridorders" />
-          </el-form-item>
-        </el-col>
-
-        <!-- 客户零件号 -->
-        <el-col :span="12" v-if="type == '1'">
-          <el-form-item label="客户零件号" prop="customer_part_code">
             <el-input
+              disabled
               placeholder="请输入"
-              v-model="formData.customer_part_code"
+              v-model="formData.gridorders"
             />
           </el-form-item>
         </el-col>
 
-        <!-- 客户零件名称 -->
-        <el-col :span="12" v-if="type == '1'">
-          <el-form-item label="客户零件名称" prop="customer_part_name">
-            <el-input
-              placeholder="请输入"
-              v-model="formData.customer_part_name"
-            />
+        <!-- NK零件号 -->
+        <el-col :span="12">
+          <el-form-item label="NK零件号" name="erp_code">
+            <div class="flex gap-8px">
+              <el-input
+                placeholder="推荐或生成..."
+                v-model="formData.erp_code"
+                :disabled="true"
+              />
+              <el-button
+                type="text"
+                :icon="CirclePlus"
+                :disabled="!isEmpty || erpCodeDisabled"
+                @click="openRecomendModal"
+              >
+                推荐
+              </el-button>
+              <el-button
+                type="text"
+                :disabled="!isEmpty || erpCodeDisabled"
+                @click="handleGenratorErpCode"
+              >
+                生成
+              </el-button>
+              <el-button
+                type="text"
+                v-if="!isEmpty"
+                @click="handleEmptyErpCode"
+              >
+                置空
+              </el-button>
+            </div>
           </el-form-item>
         </el-col>
 
-        <!-- 客户图纸号 -->
-        <el-col :span="12" v-if="type == '1'">
-          <el-form-item label="客户图纸号" prop="customer_part_vesion">
+        <!-- NK零件名称 -->
+        <el-col :span="12">
+          <el-form-item label="NK零件名称" prop="part_name">
             <el-input
               placeholder="请输入"
-              v-model="formData.customer_part_vesion"
+              :disabled="!isEmpty"
+              v-model="formData.part_name"
             />
           </el-form-item>
         </el-col>
@@ -66,10 +86,7 @@
           <el-form-item label="产品类别" name="product_category">
             <!-- 非空值,或者为制造bom时 -->
             <el-select
-              :disabled="
-                (!!originFormData?.erp_code && !isEmpty) ||
-                (!!originFormData?.erp_code && type === '2')
-              "
+              disabled
               v-model="formData.product_category"
               placeholder="请选择"
             >
@@ -89,11 +106,7 @@
         <!-- 制造工艺 -->
         <el-col :span="12">
           <el-form-item label="制造工艺" name="process">
-            <el-select
-              v-model="formData.process"
-              :disabled="!!originFormData?.erp_code"
-              placeholder="请选择"
-            >
+            <el-select v-model="formData.process" disabled placeholder="请选择">
               <el-option
                 v-for="item in processOptions.map((item) => ({
                   label: item,
@@ -107,145 +120,61 @@
           </el-form-item>
         </el-col>
 
-        <!-- 材料牌号 -->
-        <el-col :span="12">
-          <el-form-item label="材料牌号" name="material_grade">
-            <el-input
-              :disabled="!!originFormData?.erp_code"
-              placeholder="请输入"
-              v-model="formData.material_grade"
-            />
-          </el-form-item>
-        </el-col>
-
-        <!-- 材料供应商 -->
-        <el-col :span="12">
-          <el-form-item label="材料供应商" name="supplier">
-            <el-input
-              :disabled="!!originFormData?.erp_code && type === '2'"
-              placeholder="请输入"
-              v-model="formData.supplier"
-            />
-          </el-form-item>
-        </el-col>
-
-        <!-- 标准用量 -->
-        <el-col :span="12"
-          ><el-form-item label="标准用量" name="qty">
-            <el-input-number
-              :disabled="!!originFormData?.erp_code && type === '2'"
-              class="inline-block w-full!"
-              placeholder="请输入"
-              v-model="formData.qty"
-            />
-          </el-form-item>
-        </el-col>
-
-        <!-- 制造区域 -->
-        <el-col :span="12">
-          <el-form-item label="制造区域" prop="manufacture_area">
-            <el-select
-              :disabled="
-                (!!originFormData?.erp_code && !isEmpty) ||
-                (!!originFormData?.erp_code && type === '1')
-              "
-              v-model="formData.manufacture_area"
-              placeholder="请选择"
-            >
-              <el-option
-                v-for="item in manufatureAreaOptions.map((item) => ({
-                  label: item,
-                  value: item,
-                }))"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
+        <!-- 长宽高 -->
+        <el-row :gutter="8">
+          <el-col :span="8"
+            ><el-form-item label="长" name="length">
+              <el-input-number
+                disabled
+                class="inline-block w-full!"
+                placeholder="请输入"
+                v-model="formData.length"
               />
-            </el-select>
-          </el-form-item>
-        </el-col>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="宽" name="width">
+              <el-input-number
+                disabled
+                class="inline-block w-full!"
+                placeholder="请输入"
+                v-model="formData.width"
+              /> </el-form-item
+          ></el-col>
+          <el-col :span="8">
+            <el-form-item label="高" name="height">
+              <el-input-number
+                disabled
+                class="inline-block w-full!"
+                placeholder="请输入"
+                v-model="formData.height"
+              /> </el-form-item
+          ></el-col>
+        </el-row>
 
-        <!-- 制造单元 -->
+        <!-- 颜色 -->
         <el-col :span="12">
-          <el-form-item label="制造单元" prop="manufacture_report">
-            <el-select
-              :disabled="
-                (!!originFormData?.erp_code && !isEmpty) ||
-                (!!originFormData?.erp_code && type === '1')
-              "
-              v-model="formData.manufacture_report"
-              placeholder="请选择"
-            >
-              <el-option
-                v-for="item in manufatureUnitOptions.map((item) => ({
-                  label: item,
-                  value: item,
-                }))"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              />
-            </el-select>
+          <el-form-item label="颜色" name="color">
+            <el-input disabled placeholder="请输入" v-model="formData.color" />
           </el-form-item>
         </el-col>
 
-        <!-- NK零件名称 -->
+        <!-- 光泽度 -->
         <el-col :span="12">
-          <el-form-item label="NK零件名称" prop="part_name">
+          <el-form-item label="光泽度" name="color_config">
             <el-input
+              disabled
               placeholder="请输入"
-              :disabled="!!originFormData?.erp_code"
-              v-model="formData.part_name"
+              v-model="formData.color_config"
             />
           </el-form-item>
         </el-col>
 
-        <!-- NK零件号 -->
-        <el-col :span="12">
-          <el-form-item label="NK零件号" name="erp_code">
-            <div class="flex gap-8px">
-              <el-input
-                placeholder="推荐或生成..."
-                v-model="formData.erp_code"
-                :disabled="true"
-              />
-              <el-button
-                type="text"
-                :icon="CirclePlus"
-                :disabled="
-                  layerIndex === 1 ||
-                  (!!originFormData?.erp_code && !isEmpty) ||
-                  erpCodeDisabled
-                "
-                @click="openRecomendModal"
-              >
-                推荐
-              </el-button>
-              <el-button
-                type="text"
-                :disabled="
-                  (!!originFormData?.erp_code && !isEmpty) || erpCodeDisabled
-                "
-                @click="handleGenratorErpCode"
-              >
-                生成
-              </el-button>
-              <el-button
-                type="text"
-                v-if="!!originFormData?.erp_code"
-                @click="handleEmptyErpCode"
-              >
-                置空
-              </el-button>
-            </div>
-          </el-form-item>
-        </el-col>
-
         <!-- 自制/外购/支给(M/P/C) -->
         <el-col :span="12">
           <el-form-item label="自制/外购/支给(M/P/C)" prop="part_type">
             <el-select
-              :disabled="!!originFormData?.erp_code && !isEmpty"
+              disabled
               v-model="formData.part_type"
               placeholder="请选择"
               @change="handlePartTypeChange"
@@ -263,11 +192,7 @@
         <!-- 零件属性 -->
         <el-col :span="12">
           <el-form-item label="零件属性" name="part_attribute">
-            <el-select
-              :disabled="!!originFormData?.erp_code && !isEmpty"
-              v-model="formData.part_attribute"
-              placeholder="请先选择M/P/C类型"
-            >
+            <el-select disabled placeholder="">
               <el-option
                 v-for="item in partAttributeOptions.map((item) => ({
                   label: item,
@@ -281,78 +206,24 @@
           </el-form-item>
         </el-col>
 
-        <!-- 辆份配置 -->
-        <el-col :span="12" v-if="type == '1'">
-          <el-form-item label="辆份配置" name="unit_config">
-            <el-input placeholder="请输入" v-model="formData.unit_config" />
-          </el-form-item>
-        </el-col>
-
-        <!-- 配置比 -->
-        <el-col :span="12" v-if="type == '1'">
-          <el-form-item label="配置比" name="config_ratio">
-            <el-input-number
-              placeholder="请输入"
-              v-model="formData.config_ratio"
-              style="width: 100%"
-            >
-              <template #suffix>
-                <span>%</span>
-              </template>
-            </el-input-number>
-          </el-form-item>
-        </el-col>
-
-        <!-- 长宽高 -->
-        <el-row :gutter="8">
-          <el-col :span="8"
-            ><el-form-item label="长" name="length">
-              <el-input-number
-                :disabled="!!originFormData?.erp_code && type === '2'"
-                class="inline-block w-full!"
-                placeholder="请输入"
-                v-model="formData.length"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="宽" name="width">
-              <el-input-number
-                :disabled="!!originFormData?.erp_code && type === '2'"
-                class="inline-block w-full!"
-                placeholder="请输入"
-                v-model="formData.width"
-              /> </el-form-item
-          ></el-col>
-          <el-col :span="8">
-            <el-form-item label="高" name="height">
-              <el-input-number
-                :disabled="!!originFormData?.erp_code && type === '2'"
-                class="inline-block w-full!"
-                placeholder="请输入"
-                v-model="formData.height"
-              /> </el-form-item
-          ></el-col>
-        </el-row>
-
-        <!-- 颜色 -->
+        <!-- 材料牌号 -->
         <el-col :span="12">
-          <el-form-item label="颜色" name="color">
+          <el-form-item label="材料牌号" name="material_grade">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '2'"
+              disabled
               placeholder="请输入"
-              v-model="formData.color"
+              v-model="formData.material_grade"
             />
           </el-form-item>
         </el-col>
 
-        <!-- 光泽度 -->
+        <!-- 材料供应商 -->
         <el-col :span="12">
-          <el-form-item label="光泽度" name="color_config">
+          <el-form-item label="材料供应商" name="supplier">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '2'"
+              disabled
               placeholder="请输入"
-              v-model="formData.color_config"
+              v-model="formData.supplier"
             />
           </el-form-item>
         </el-col>
@@ -360,10 +231,18 @@
         <!-- 计量单位 -->
         <el-col :span="12"
           ><el-form-item label="计量单位" name="unit">
-            <el-input
-              :disabled="!!originFormData?.erp_code && type === '2'"
+            <el-input disabled placeholder="请输入" v-model="formData.unit" />
+          </el-form-item>
+        </el-col>
+
+        <!-- 标准用量 -->
+        <el-col :span="12"
+          ><el-form-item label="标准用量" name="qty">
+            <el-input-number
+              disabled
+              class="inline-block w-full!"
               placeholder="请输入"
-              v-model="formData.unit"
+              v-model="formData.qty"
             />
           </el-form-item>
         </el-col>
@@ -372,7 +251,6 @@
         <el-col :span="12">
           <el-form-item label="工艺消耗" name="technology_consume">
             <el-input-number
-              :disabled="!!originFormData?.erp_code && type === '1'"
               class="inline-block w-full!"
               placeholder="请输入"
               v-model="formData.technology_consume"
@@ -384,7 +262,6 @@
         <el-col :span="12">
           <el-form-item label="不良率%" name="nonperform_rate">
             <el-input-number
-              :disabled="!!originFormData?.erp_code && type === '1'"
               class="inline-block w-full!"
               placeholder="请输入"
               v-model="formData.nonperform_rate"
@@ -396,8 +273,50 @@
           </el-form-item>
         </el-col>
 
+        <!-- 制造区域 -->
+        <el-col :span="12">
+          <el-form-item label="制造区域" prop="manufacture_area">
+            <el-select
+              :disabled="!isEmpty"
+              v-model="formData.manufacture_area"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in manufatureAreaOptions.map((item) => ({
+                  label: item,
+                  value: item,
+                }))"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <!-- 制造单元 -->
+        <el-col :span="12">
+          <el-form-item label="制造单元" prop="manufacture_report">
+            <el-select
+              :disabled="!isEmpty"
+              v-model="formData.manufacture_report"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in manufatureUnitOptions.map((item) => ({
+                  label: item,
+                  value: item,
+                }))"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
         <!-- 制造设备类(组) -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="制造设备类(组)" prop="manufature_equip">
             <el-input
               placeholder="请输入"
@@ -407,7 +326,7 @@
         </el-col>
 
         <!-- 模具/工装治具 -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="模具/工装治具" prop="moldtooling_fixture">
             <el-input
               placeholder="请输入"
@@ -417,7 +336,7 @@
         </el-col>
 
         <!-- 模腔数/取数(pcs) -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="模腔数/取数(pcs)" prop="production_cycle">
             <el-input-number
               :step="1"
@@ -429,14 +348,14 @@
         </el-col>
 
         <!-- 制造周期(S) -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="制造周期(S)" prop="cavities">
             <el-input-number placeholder="请输入" v-model="formData.cavities" />
           </el-form-item>
         </el-col>
 
         <!-- 持台人数 -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="持台人数" prop="holding_number">
             <el-input-number
               :step="1"
@@ -448,7 +367,7 @@
         </el-col>
 
         <!-- 单件节拍(S) -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="单件节拍(S)" prop="single_piece">
             <el-input-number
               placeholder="请输入"
@@ -458,14 +377,14 @@
         </el-col>
 
         <!-- 外包类型 -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="外包类型" prop="package_type">
             <el-input placeholder="请输入" v-model="formData.package_type" />
           </el-form-item>
         </el-col>
 
         <!-- 内包类型 -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="内包类型" prop="innerpackage_type">
             <el-input
               placeholder="请输入"
@@ -475,7 +394,7 @@
         </el-col>
 
         <!-- snp -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="SNP" prop="snp">
             <el-input-number
               :step="1"
@@ -487,7 +406,7 @@
         </el-col>
 
         <!-- 循环次数(次) -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="循环次数(次)" name="cycle_number">
             <el-input-number
               :step="1"
@@ -500,14 +419,14 @@
         </el-col>
 
         <!-- 供货地信息 -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="供货地信息" prop="supply_local">
             <el-input placeholder="请输入" v-model="formData.supply_local" />
           </el-form-item>
         </el-col>
 
         <!-- 供货距离(KM) -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="供货距离(KM)" prop="supplier_distance">
             <el-input-number
               placeholder="请输入"
@@ -517,14 +436,14 @@
         </el-col>
 
         <!-- 供应商编码 -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="供应商编码" prop="supply_code">
             <el-input placeholder="请输入" v-model="formData.supply_code" />
           </el-form-item>
         </el-col>
 
         <!-- 最小起订量 -->
-        <el-col :span="12" v-if="type == '2'">
+        <el-col :span="12">
           <el-form-item label="最小起订量" name="min_order">
             <el-input-number
               :step="1"
@@ -535,11 +454,23 @@
           </el-form-item>
         </el-col>
 
+        <!-- 备注 -->
+        <el-col :span="12">
+          <el-form-item label="备注" name="remark">
+            <el-input
+              placeholder="请输入"
+              type="textarea"
+              :rows="4"
+              v-model="formData.remark"
+            />
+          </el-form-item>
+        </el-col>
+
         <!-- 备用字段1 -->
         <el-col :span="12">
           <el-form-item label="工程BOM备用字段1" name="engin_var1">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '2'"
+              disabled
               placeholder="请输入"
               v-model="formData.engin_var1"
             />
@@ -549,7 +480,7 @@
         <el-col :span="12">
           <el-form-item label="工程BOM备用字段2" name="engin_var2">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '2'"
+              disabled
               placeholder="请输入"
               v-model="formData.engin_var2"
             />
@@ -559,7 +490,7 @@
         <el-col :span="12">
           <el-form-item label="工程BOM备用字段3" name="engin_var3">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '2'"
+              disabled
               placeholder="请输入"
               v-model="formData.engin_var3"
             />
@@ -569,7 +500,7 @@
         <el-col :span="12">
           <el-form-item label="工程BOM备用字段4" name="engin_var4">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '2'"
+              disabled
               placeholder="请输入"
               v-model="formData.engin_var4"
             />
@@ -579,7 +510,7 @@
         <el-col :span="12">
           <el-form-item label="工程BOM备用字段5" name="engin_var5">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '2'"
+              disabled
               placeholder="请输入"
               v-model="formData.engin_var5"
             />
@@ -590,7 +521,6 @@
         <el-col :span="12">
           <el-form-item label="制造BOM备用字段1" name="manufacture_var1">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '1'"
               placeholder="请输入"
               v-model="formData.manufacture_var1"
             />
@@ -600,7 +530,6 @@
         <el-col :span="12">
           <el-form-item label="制造BOM备用字段2" name="manufacture_var2">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '1'"
               placeholder="请输入"
               v-model="formData.manufacture_var2"
             />
@@ -610,7 +539,6 @@
         <el-col :span="12">
           <el-form-item label="制造BOM备用字段3" name="manufacture_var3">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '1'"
               placeholder="请输入"
               v-model="formData.manufacture_var3"
             />
@@ -620,7 +548,6 @@
         <el-col :span="12">
           <el-form-item label="制造BOM备用字段4" name="manufacture_var4">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '1'"
               placeholder="请输入"
               v-model="formData.manufacture_var4"
             />
@@ -630,21 +557,12 @@
         <el-col :span="12">
           <el-form-item label="制造BOM备用字段5" name="manufacture_var5">
             <el-input
-              :disabled="!!originFormData?.erp_code && type === '1'"
               placeholder="请输入"
               v-model="formData.manufacture_var5"
             />
           </el-form-item>
         </el-col>
       </el-row>
-      <el-form-item label="备注" name="remark">
-        <el-input
-          placeholder="请输入"
-          type="textarea"
-          :rows="4"
-          v-model="formData.remark"
-        />
-      </el-form-item>
     </el-form>
     <template #footer>
       <el-button @click="visible = false">取消</el-button>
@@ -663,20 +581,16 @@ import { cloneDeep } from "lodash-es";
 import { CirclePlus } from "@element-plus/icons-vue";
 import TableModal from "./TableModal.vue";
 import type { IRecomend } from "./TableModal.vue";
-import { useRoute } from "vue-router";
 
-const route = useRoute();
-const type = (route.query?.type as string) ?? "1"; // 1工程bom 2制造bom
 defineProps<{
   readonly: boolean;
 }>();
-// 
-const isEmpty = ref(false);
+// erp_code是否为
+const isEmpty = computed(() => !formData.value.erp_code);
 
 // 置空操作
 const handleEmptyErpCode = () => {
   formData.value.erp_code = "";
-  isEmpty.value = true;
 };
 
 const keyMap = {
@@ -827,23 +741,23 @@ const emit = defineEmits(["ok"]);
 const nodeData = ref<any>(null);
 // 推荐弹窗
 const recomendRef = ref<{
-  open: (partName: string, partType: string) => void;
+  open: (
+    partName: string,
+    partType: string,
+    partAttribute: string,
+    productCategory: string
+  ) => void;
 }>();
 
-// 1.工程BOM只有P,C件这两个按钮才可以操作
 // 2.制造BOM只有M件,这两个按钮才可以操作
 const erpCodeDisabled = computed(() => {
-  if (type === "1")
-    return formData.value.part_type === "M" || !formData.value.part_type;
-  if (type === "2")
-    return formData.value.part_type !== "M" || !formData.value.part_type;
+  return formData.value.part_type !== "M" || !formData.value.part_type;
 });
 
 const editType = ref<"add" | "edit">("edit");
 const open = (node: any, type?: "add" | "edit", layer?: number) => {
   layerIndex.value = node?._node?.layerIndex || layer;
   visible.value = true;
-  isEmpty.value = false;
   nodeData.value = cloneDeep(node.data);
   editType.value = type || !node?.id ? "add" : "edit";
   form.value?.resetFields();
@@ -859,29 +773,7 @@ const open = (node: any, type?: "add" | "edit", layer?: number) => {
     } else {
       // 编辑 通过接口获取详情
       loading.value = true;
-      // 测试接口
-      // fetch(`https://sl-yf-bommgr-admin-dev.shalu.com/api/module/Invoke`, {
-      //   method: 'POST',
-      //   headers: {
-      //     Authorization: 'bpm_client_1421883752157548544',
-      //     'content-type': 'application/json;charset=UTF-8',
-      //   },
-      //   body: JSON.stringify({
-      //     interfaceCode: 'Common.getBOMInfo',
-      //     bom_id: node.id,
-      //   }),
-      // })
-      //   .then((res) => res.json())
-      //   .then((res) => {
-      //     console.log('res', res);
-      //     originFormData.value = res.result;
-      //     formData.value = {
-      //       ...node.data,
-      //       ...(res?.result || {}),
-      //       bom_det: {},
-      //     };
-      //     loading.value = false;
-      //   });
+
       window.parent?.BpmTools?.program(
         {
           interfaceCode: "Common.getBOMInfo",
@@ -915,7 +807,18 @@ const handlePartTypeChange = () => {
 
 // 打开推荐
 const openRecomendModal = () => {
-  recomendRef.value?.open(formData.value?.part_name, formData.value?.part_type);
+  // M件并且属性为"完成品"传产品分类
+  const product_category =
+    formData.value.part_type == "M" &&
+    formData.value?.part_attribute === "完成品"
+      ? formData.value.product_category
+      : "";
+  recomendRef.value?.open(
+    formData.value?.part_name,
+    formData.value?.part_type,
+    formData.value?.part_attribute,
+    product_category
+  );
 };
 
 // 添加推荐

+ 844 - 0
src/pages/excel/ConfigDrawerProject.vue

@@ -0,0 +1,844 @@
+<template>
+  <el-drawer
+    v-model="visible"
+    title="工程BOM详情配置"
+    size="600"
+    v-loading="loading"
+  >
+    <el-form
+      ref="form"
+      label-position="top"
+      :model="formData"
+      :disabled="nodeData?.is_disable || readonly"
+      scroll-to-error
+    >
+      <el-row :gutter="12">
+        <!-- 层级号 -->
+        <el-col :span="12">
+          <el-form-item label="级号" prop="lever_number">
+            <el-input
+              placeholder="请输入"
+              disabled
+              v-model="formData.lever_number"
+            />
+          </el-form-item>
+        </el-col>
+
+        <!-- 序号 -->
+        <el-col :span="12">
+          <el-form-item label="序号" prop="gridorders">
+            <el-input placeholder="请输入" v-model="formData.gridorders" />
+          </el-form-item>
+        </el-col>
+
+        <!-- 客户零件号 -->
+        <el-col :span="12">
+          <el-form-item label="客户零件号" prop="customer_part_code">
+            <el-input
+              placeholder="请输入"
+              v-model="formData.customer_part_code"
+            />
+          </el-form-item>
+        </el-col>
+
+        <!-- 客户零件名称 -->
+        <el-col :span="12">
+          <el-form-item label="客户零件名称" prop="customer_part_name">
+            <el-input
+              placeholder="请输入"
+              v-model="formData.customer_part_name"
+            />
+          </el-form-item>
+        </el-col>
+
+        <!-- 客户图纸号 -->
+        <el-col :span="12">
+          <el-form-item label="客户图纸号" prop="customer_part_vesion">
+            <el-input
+              placeholder="请输入"
+              v-model="formData.customer_part_vesion"
+            />
+          </el-form-item>
+        </el-col>
+
+        <!-- NK零件号 -->
+        <el-col :span="12">
+          <el-form-item label="NK零件号" name="erp_code">
+            <div class="flex gap-8px">
+              <el-input
+                placeholder="推荐或生成..."
+                v-model="formData.erp_code"
+                :disabled="true"
+              />
+              <el-button
+                type="text"
+                :icon="CirclePlus"
+                :disabled="!isEmpty || erpCodeDisabled"
+                @click="openRecomendModal"
+              >
+                推荐
+              </el-button>
+              <el-button
+                type="text"
+                :disabled="!isEmpty || erpCodeDisabled"
+                @click="handleGenratorErpCode"
+              >
+                生成
+              </el-button>
+              <el-button
+                type="text"
+                v-if="!isEmpty"
+                @click="handleEmptyErpCode"
+              >
+                置空
+              </el-button>
+            </div>
+          </el-form-item>
+        </el-col>
+
+        <!-- NK零件名称 -->
+        <el-col :span="12">
+          <el-form-item label="NK零件名称" prop="part_name">
+            <el-input
+              placeholder="请输入"
+              :disabled="!isEmpty"
+              v-model="formData.part_name"
+            />
+          </el-form-item>
+        </el-col>
+
+        <!-- 辆份配置 -->
+        <el-col :span="12">
+          <el-form-item label="辆份配置" name="unit_config">
+            <el-input placeholder="请输入" v-model="formData.unit_config" />
+          </el-form-item>
+        </el-col>
+
+        <!-- 配置比 -->
+        <el-col :span="12">
+          <el-form-item label="配置比" name="config_ratio">
+            <el-input-number
+              placeholder="请输入"
+              v-model="formData.config_ratio"
+              style="width: 100%"
+            >
+              <template #suffix>
+                <span>%</span>
+              </template>
+            </el-input-number>
+          </el-form-item>
+        </el-col>
+
+        <!-- 产品类别 -->
+        <el-col :span="12">
+          <el-form-item label="产品类别" name="product_category">
+            <!-- 非空值,或者为制造bom时 -->
+            <el-select
+              :disabled="!isEmpty"
+              v-model="formData.product_category"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in procuctTypeOptions.map((item) => ({
+                  label: item,
+                  value: item,
+                }))"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <!-- 制造工艺 -->
+        <el-col :span="12">
+          <el-form-item label="制造工艺" name="process">
+            <el-select
+              v-model="formData.process"
+              :disabled="!isEmpty"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in processOptions.map((item) => ({
+                  label: item,
+                  value: item,
+                }))"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <!-- 长宽高 -->
+        <el-row :gutter="8">
+          <el-col :span="8"
+            ><el-form-item label="长" name="length">
+              <el-input-number
+                class="inline-block w-full!"
+                placeholder="请输入"
+                v-model="formData.length"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="宽" name="width">
+              <el-input-number
+                class="inline-block w-full!"
+                placeholder="请输入"
+                v-model="formData.width"
+              /> </el-form-item
+          ></el-col>
+          <el-col :span="8">
+            <el-form-item label="高" name="height">
+              <el-input-number
+                class="inline-block w-full!"
+                placeholder="请输入"
+                v-model="formData.height"
+              /> </el-form-item
+          ></el-col>
+        </el-row>
+
+        <!-- 颜色 -->
+        <el-col :span="12">
+          <el-form-item label="颜色" name="color">
+            <el-input placeholder="请输入" v-model="formData.color" />
+          </el-form-item>
+        </el-col>
+
+        <!-- 光泽度 -->
+        <el-col :span="12">
+          <el-form-item label="光泽度" name="color_config">
+            <el-input placeholder="请输入" v-model="formData.color_config" />
+          </el-form-item>
+        </el-col>
+
+        <!-- 自制/外购/支给(M/P/C) -->
+        <el-col :span="12">
+          <el-form-item label="自制/外购/支给(M/P/C)" prop="part_type">
+            <el-select
+              :disabled="!isEmpty"
+              v-model="formData.part_type"
+              placeholder="请选择"
+              @change="handlePartTypeChange"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <!-- 零件属性 -->
+        <el-col :span="12">
+          <el-form-item label="零件属性" name="part_attribute">
+            <el-select
+              :disabled="!isEmpty"
+              v-model="formData.part_attribute"
+              placeholder="请先选择M/P/C类型"
+            >
+              <el-option
+                v-for="item in partAttributeOptions.map((item) => ({
+                  label: item,
+                  value: item,
+                }))"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <!-- 材料牌号 -->
+        <el-col :span="12">
+          <el-form-item label="材料牌号" name="material_grade">
+            <el-input
+              :disabled="!isEmpty"
+              placeholder="请输入"
+              v-model="formData.material_grade"
+            />
+          </el-form-item>
+        </el-col>
+
+        <!-- 材料供应商 -->
+        <el-col :span="12">
+          <el-form-item label="材料供应商" name="supplier">
+            <el-input placeholder="请输入" v-model="formData.supplier" />
+          </el-form-item>
+        </el-col>
+
+        <!-- 计量单位 -->
+        <el-col :span="12"
+          ><el-form-item label="计量单位" name="unit">
+            <el-input
+              :disabled="!isEmpty"
+              placeholder="请输入"
+              v-model="formData.unit"
+            />
+          </el-form-item>
+        </el-col>
+
+        <!-- 标准用量 -->
+        <el-col :span="12"
+          ><el-form-item label="标准用量" name="qty">
+            <el-input-number
+              class="inline-block w-full!"
+              placeholder="请输入"
+              v-model="formData.qty"
+            />
+          </el-form-item>
+        </el-col>
+
+        <!-- 工艺消耗 -->
+        <el-col :span="12">
+          <el-form-item label="工艺消耗" name="technology_consume">
+            <el-input-number
+              disabled
+              class="inline-block w-full!"
+              placeholder="请输入"
+              v-model="formData.technology_consume"
+            />
+          </el-form-item>
+        </el-col>
+
+        <!-- 不良率% -->
+        <el-col :span="12">
+          <el-form-item label="不良率%" name="nonperform_rate">
+            <el-input-number
+              disabled
+              class="inline-block w-full!"
+              placeholder="请输入"
+              v-model="formData.nonperform_rate"
+            >
+              <template #suffix>
+                <span>%</span>
+              </template>
+            </el-input-number>
+          </el-form-item>
+        </el-col>
+
+        <!-- 制造区域 -->
+        <el-col :span="12">
+          <el-form-item label="制造区域" prop="manufacture_area">
+            <el-select
+              :disabled="!!originFormData?.erp_code"
+              v-model="formData.manufacture_area"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in manufatureAreaOptions.map((item) => ({
+                  label: item,
+                  value: item,
+                }))"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <!-- 制造单元 -->
+        <el-col :span="12">
+          <el-form-item label="制造单元" prop="manufacture_report">
+            <el-select
+              :disabled="!isEmpty"
+              v-model="formData.manufacture_report"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in manufatureUnitOptions.map((item) => ({
+                  label: item,
+                  value: item,
+                }))"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <!-- 备注 -->
+        <el-col :span="12">
+          <el-form-item label="备注" name="remark">
+            <el-input
+              placeholder="请输入"
+              type="textarea"
+              :rows="4"
+              v-model="formData.remark"
+            />
+          </el-form-item>
+        </el-col>
+        <!-- 备用字段1 -->
+        <el-col :span="12">
+          <el-form-item label="工程BOM备用字段1" name="engin_var1">
+            <el-input placeholder="请输入" v-model="formData.engin_var1" />
+          </el-form-item>
+        </el-col>
+        <!-- 备用字段2 -->
+        <el-col :span="12">
+          <el-form-item label="工程BOM备用字段2" name="engin_var2">
+            <el-input placeholder="请输入" v-model="formData.engin_var2" />
+          </el-form-item>
+        </el-col>
+        <!-- 备用字段3 -->
+        <el-col :span="12">
+          <el-form-item label="工程BOM备用字段3" name="engin_var3">
+            <el-input placeholder="请输入" v-model="formData.engin_var3" />
+          </el-form-item>
+        </el-col>
+        <!-- 备用字段4 -->
+        <el-col :span="12">
+          <el-form-item label="工程BOM备用字段4" name="engin_var4">
+            <el-input placeholder="请输入" v-model="formData.engin_var4" />
+          </el-form-item>
+        </el-col>
+        <!-- 备用字段5 -->
+        <el-col :span="12">
+          <el-form-item label="工程BOM备用字段5" name="engin_var5">
+            <el-input placeholder="请输入" v-model="formData.engin_var5" />
+          </el-form-item>
+        </el-col>
+
+        <!-- 备用字段1 -->
+        <el-col :span="12">
+          <el-form-item label="制造BOM备用字段1" name="manufacture_var1">
+            <el-input
+              disabled
+              placeholder="请输入"
+              v-model="formData.manufacture_var1"
+            />
+          </el-form-item>
+        </el-col>
+        <!-- 备用字段2 -->
+        <el-col :span="12">
+          <el-form-item label="制造BOM备用字段2" name="manufacture_var2">
+            <el-input
+              disabled
+              placeholder="请输入"
+              v-model="formData.manufacture_var2"
+            />
+          </el-form-item>
+        </el-col>
+        <!-- 备用字段3 -->
+        <el-col :span="12">
+          <el-form-item label="制造BOM备用字段3" name="manufacture_var3">
+            <el-input
+              disabled
+              placeholder="请输入"
+              v-model="formData.manufacture_var3"
+            />
+          </el-form-item>
+        </el-col>
+        <!-- 备用字段4 -->
+        <el-col :span="12">
+          <el-form-item label="制造BOM备用字段4" name="manufacture_var4">
+            <el-input
+              disabled
+              placeholder="请输入"
+              v-model="formData.manufacture_var4"
+            />
+          </el-form-item>
+        </el-col>
+        <!-- 备用字段5 -->
+        <el-col :span="12">
+          <el-form-item label="制造BOM备用字段5" name="manufacture_var5">
+            <el-input
+              disabled
+              placeholder="请输入"
+              v-model="formData.manufacture_var5"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <el-button @click="visible = false">取消</el-button>
+      <el-button v-if="!readonly" type="primary" @click="handleSubmit"
+        >确定</el-button
+      >
+    </template>
+  </el-drawer>
+  <TableModal ref="recomendRef" @ok="handleRecomend" />
+</template>
+
+<script setup lang="ts">
+import { ref, defineExpose, defineEmits, computed, defineProps } from "vue";
+import { ElMessage, type FormInstance } from "element-plus";
+import { cloneDeep } from "lodash-es";
+import { CirclePlus } from "@element-plus/icons-vue";
+import TableModal from "./TableModal.vue";
+import type { IRecomend } from "./TableModal.vue";
+
+defineProps<{
+  readonly: boolean;
+}>();
+// NK零件号是否为空
+const isEmpty = computed(() => {
+  return !formData.value.erp_code;
+});
+
+// 置空操作
+const handleEmptyErpCode = () => {
+  formData.value.erp_code = "";
+};
+
+const keyMap = {
+  gridorders: "序号",
+  customer_part_code: "客户零件号",
+  customer_part_name: "客户零件名称",
+  customer_part_vesion: "客户图纸号",
+  erp_code: "NK零件号",
+  part_name: "NK零件名称",
+  unit_config: "辆份配置",
+  config_ratio: "配置比",
+  product_category: "产品类别",
+  process: "制造工艺",
+  length: "长",
+  width: "宽",
+  height: "高",
+  color: "颜色",
+  color_config: "光泽度",
+  part_type: "自制/外购/支给(M/P/C)",
+  part_attribute: "零件属性",
+  material_grade: "材料牌号",
+  supplier: "材料供应商",
+  unit: "计量单位",
+  qty: "标准用量",
+  technology_consume: "工艺消耗",
+  nonperform_rate: "不良率%",
+  manufacture_area: "制造区域",
+  manufacture_report: "制造单元",
+  manufature_equip: "制造设备类(组)",
+  moldtooling_fixture: "模具/工装治具",
+  cavities: "模腔数/取数(pcs)",
+  production_cycle: "制造周期(S)",
+  holding_number: "持台人数",
+  single_piece: "单件节拍(S)",
+  package_type: "外包类型",
+  innerpackage_type: "内包类型",
+  snp: "SNP",
+  cycle_number: "循环次数(次)",
+  supply_local: "供货地信息",
+  supplier_distance: "供货距离(KM)",
+  supply_code: "供应商编码",
+  min_order: "最小起订量",
+  remark: "备注",
+  picture: "简图",
+  engin_var1: "备用字段1",
+  engin_var2: "备用字段2",
+  engin_var3: "备用字段3",
+  engin_var4: "备用字段4",
+  engin_var5: "备用字段5",
+  manufacture_var1: "备用字段1",
+  manufacture_var2: "备用字段2",
+  manufacture_var3: "备用字段3",
+  manufacture_var4: "备用字段4",
+  manufacture_var5: "备用字段5",
+};
+
+const options = [
+  { label: "自制", value: "M" },
+  { label: "外购", value: "P" },
+  { label: "支给", value: "C" },
+];
+
+// 零件属性
+const partAttributeOptions = computed(() => {
+  if (formData.value.part_type == "M") {
+    return ["完成品", "半成品"];
+  }
+  if (formData.value.part_type == "P") {
+    return ["树脂", "膜片", "碳纤维片", "木皮", "铝片", "涂料", "油墨", "部件"];
+  }
+  if (formData.value.part_type == "C") {
+    return ["树脂", "膜片", "碳纤维片", "木皮", "铝片", "涂料", "油墨", "部件"];
+  }
+  return [];
+});
+
+// 制造单元
+const manufatureUnitOptions = [
+  "成型单元",
+  "组立单元",
+  "产线涂装单元",
+  "丝网印刷单元",
+  "吸塑冲切单元",
+  "模内成型单元",
+  "热压单元",
+  "涂装单元",
+  "CNC单元",
+  "PUR单元",
+  "打磨单元",
+];
+
+// 产品类别
+const procuctTypeOptions = [
+  "成型产品",
+  "涂装产品",
+  "INS产品",
+  "真木产品",
+  "碳纤维产品",
+  "真铝产品",
+  "模具产品",
+];
+
+// 制造区域
+const manufatureAreaOptions = ["大连工厂", "孝感工厂"];
+
+// 制造工艺
+const processOptions = [
+  "普通注塑",
+  "嵌件注塑",
+  "加饰注塑",
+  "机器人喷涂",
+  "往复机喷涂",
+  "手工喷涂",
+  "丝网印刷",
+  "吸塑",
+  "PUR",
+  "产线装配",
+  "焊接",
+  "镭雕",
+  "移印",
+  "冲切",
+  "热压",
+  "CNC",
+  "手工装配",
+  "整理",
+  "打磨",
+];
+
+const visible = ref(false);
+const layerIndex = ref(0);
+const formData = ref<Record<string, any>>({
+  part_name: "",
+  part_type: "",
+  bom_code: "",
+  qty: undefined,
+  is_change: false,
+  change_content: "",
+  is_disable: false,
+  bom_det: undefined,
+});
+const form = ref<FormInstance>();
+const loading = ref(false);
+
+// 表单数据
+const originFormData = ref<any>();
+const emit = defineEmits(["ok"]);
+// 节点数据
+const nodeData = ref<any>(null);
+// 推荐弹窗
+const recomendRef = ref<{
+  open: (
+    partName: string,
+    partType: string,
+    partAttribute: string,
+    productCategory: string
+  ) => void;
+}>();
+
+// 1.工程BOM只有P,C件这两个按钮才可以操作
+const erpCodeDisabled = computed(() => {
+  return formData.value.part_type === "M" || !formData.value.part_type;
+});
+
+const editType = ref<"add" | "edit">("edit");
+const open = (node: any, type?: "add" | "edit", layer?: number) => {
+  layerIndex.value = node?._node?.layerIndex || layer;
+  visible.value = true;
+  nodeData.value = cloneDeep(node.data);
+  editType.value = type || !node?.id ? "add" : "edit";
+  form.value?.resetFields();
+  console.log("add or eidt:", node, type, editType.value);
+  try {
+    // 新增
+    if (type === "add" || !node?.id) {
+      originFormData.value = cloneDeep(node.data);
+      formData.value = {
+        ...node.data?.bom_det,
+        lever_number: layerIndex.value,
+      };
+    } else {
+      // 编辑 通过接口获取详情
+      loading.value = true;
+
+      window.parent?.BpmTools?.program(
+        {
+          interfaceCode: "Common.getBOMInfo",
+          bom_id: node.id,
+        },
+        (res: any) => {
+          originFormData.value = res;
+          formData.value = {
+            ...node.data,
+            ...(res || {}),
+            ...(node.data?.bom_det || {}),
+            bom_det: {},
+            lever_number: layerIndex.value,
+          };
+          loading.value = false;
+        }
+      );
+    }
+  } finally {
+    loading.value = false;
+  }
+};
+
+// 零件类型改变
+// 属性值不在选项中时,清空
+const handlePartTypeChange = () => {
+  if (!partAttributeOptions.value.includes(formData.value.part_attribute)) {
+    formData.value.part_attribute = undefined;
+  }
+};
+
+// 打开推荐
+const openRecomendModal = () => {
+  // M件并且属性为"完成品"传产品分类
+  const product_category =
+    formData.value.part_type == "M" &&
+    formData.value?.part_attribute === "完成品"
+      ? formData.value.product_category
+      : "";
+  recomendRef.value?.open(
+    formData.value?.part_name,
+    formData.value?.part_type,
+    formData.value?.part_attribute,
+    product_category
+  );
+};
+
+// 添加推荐
+const handleRecomend = (record: IRecomend) => {
+  formData.value.erp_code = record.erp_code;
+  formData.value.part_type = record.part_type;
+  formData.value.part_name = record.part_name;
+  formData.value.part_attribute = record.part_attribute;
+  formData.value.product_category = record.product_category;
+  formData.value.manufacture_report = record.manufacture_report;
+  formData.value.manufacture_area = record.manufacture_area;
+  formData.value.material_grade = record.material_grade;
+  formData.value.process = record.process;
+  formData.value.unit = record.unit;
+};
+
+// 生成code
+const handleGenratorErpCode = async () => {
+  const valid = await form.value?.validate();
+  if (!valid) return;
+
+  window.parent?.BpmTools?.program(
+    {
+      interfaceCode: "Partmanagement.generatePart",
+      model: formData.value,
+    },
+    (res: any) => {
+      formData.value.erp_code = res;
+      ElMessage.success("生成成功");
+    }
+  );
+};
+
+// 关闭
+const close = () => {
+  visible.value = false;
+  originFormData.value = null;
+  nodeData.value = null;
+  form.value?.resetFields();
+};
+
+// 提交表单
+const handleSubmit = async () => {
+  const valid = await form.value?.validate();
+  if (!valid) return;
+  // 获取变更之前的数据
+  if (!originFormData.value) return;
+
+  let str = "";
+  Object.entries(formData.value).forEach(([key, value]) => {
+    if (
+      [
+        "is_change",
+        "change_content",
+        "changecontent",
+        "bom_det",
+        "isActive",
+        "is_disable",
+        "expand",
+        "uid",
+        "name",
+        "type",
+      ].includes(key)
+    ) {
+      return;
+    }
+    // 值发生变化
+    if (value !== originFormData.value[key]) {
+      if (key in keyMap)
+        str += `${str ? "," : ""}${keyMap[key as keyof typeof keyMap]}: ${
+          originFormData.value[key] ?? "空"
+        }->${value ?? ""}`;
+      // 更新内部数据
+      if (Object.hasOwnProperty.call(nodeData.value || {}, key)) {
+        nodeData.value[key] = value;
+      }
+      if (formData.value?.bom_det) {
+        formData.value.bom_det[key] = value;
+      } else {
+        formData.value.bom_det = { [key]: value };
+      }
+    }
+  });
+
+  if (editType.value === "edit") {
+    formData.value.change_content = str;
+    formData.value.is_change = !!str;
+  } else {
+    formData.value.change_content = "";
+    formData.value.is_change = false;
+  }
+
+  // 最终编辑结果数据
+  const result = {
+    ...(nodeData.value || {}),
+    type: formData.value.part_type,
+    name: formData.value.part_name,
+    qty: formData.value.qty,
+    is_change: formData.value.is_change,
+    change_content: formData.value.change_content,
+    manufacture_area: formData.value.manufacture_area,
+    manufacture_report: formData.value.manufacture_report,
+    material_grade: formData.value.material_grade,
+    part_attribute: formData.value.part_attribute,
+    process: formData.value.process,
+    product_category: formData.value.product_category,
+    supplier: formData.value.supplier,
+    erp_code: formData.value.erp_code,
+    // 编辑数据
+    bom_det: formData.value.bom_det,
+  };
+  // 不需要这两个字段
+  delete result.part_name;
+  delete result.part_type;
+
+  emit("ok", result);
+  close();
+};
+
+defineExpose({
+  open,
+  close,
+});
+</script>
+
+<style scoped></style>

+ 79 - 54
src/pages/excel/MindmapModal.vue

@@ -41,9 +41,15 @@
         </el-form-item>
       </el-form>
       <div class="flex items-center gap-4px">
-        <span class="text-12px text-green mr-12px">最新版本号:{{ latestVersion || '-'}}</span>
-        <span class="text-12px mr-12px font-bold text-#f56c6c">{{ type == '1' ? '工程BOM' : '制造BOM'}}编辑</span>
-        <span class="text-12px text-yellow mr-12px">当前版本号:{{ version || '-'}}</span>
+        <span class="text-12px text-green mr-12px"
+          >最新版本号:{{ latestVersion || "-" }}</span
+        >
+        <span class="text-12px mr-12px font-bold text-#f56c6c"
+          >{{ type == "1" ? "工程BOM" : "制造BOM" }}编辑</span
+        >
+        <span class="text-12px text-yellow mr-12px"
+          >当前版本号:{{ version || "-" }}</span
+        >
         <el-button type="primary" link @click="handleSave" class="mr-8px"
           ><img class="w-1em mr-4px" :src="saveImg" alt="" />保存</el-button
         >
@@ -111,7 +117,20 @@
     </div> -->
   </div>
 
-  <ConfigDrawer ref="configDrawerRef" @ok="handleConfigOk" :readonly="readonly" />
+  <!-- 工程bom -->
+  <ConfigDrawerProject
+    v-if="type == '1'"
+    ref="configDrawerRef"
+    @ok="handleConfigOk"
+    :readonly="readonly"
+  />
+  <!-- 制造bom -->
+  <ConfigDrawerProduction
+    v-else
+    ref="configDrawerRef"
+    @ok="handleConfigOk"
+    :readonly="readonly"
+  />
 </template>
 
 <script setup lang="ts">
@@ -127,7 +146,7 @@ import {
   inject,
   computed,
   type Ref,
-} from 'vue';
+} from "vue";
 import {
   Aim,
   CirclePlusFilled,
@@ -136,40 +155,41 @@ import {
   Search,
   ZoomIn,
   ZoomOut,
-} from '@element-plus/icons-vue';
-import type { MindMapInstance } from '@/components/mindmap/Mindmap.vue';
-import type { FormInstance } from 'element-plus';
-import { ElMessage, ElMessageBox } from 'element-plus';
-import { bfsWalk, walk } from 'simple-mind-map/src/utils';
-
-import Mindmap from '@/components/mindmap/Mindmap.vue';
-import ConfigDrawer from './ConfigDrawer.vue';
-import AutoIcon from '@/assets/auto.svg';
-import saveImg from '@/assets/save.svg';
-import { BOMItem } from './data';
-import { cloneDeep } from 'lodash-es';
+} from "@element-plus/icons-vue";
+import type { MindMapInstance } from "@/components/mindmap/Mindmap.vue";
+import type { FormInstance } from "element-plus";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { bfsWalk, walk } from "simple-mind-map/src/utils";
+
+import Mindmap from "@/components/mindmap/Mindmap.vue";
+import ConfigDrawerProject from "./ConfigDrawerProject.vue";
+import ConfigDrawerProduction from "./ConfigDrawerProduction.vue";
+import AutoIcon from "@/assets/auto.svg";
+import saveImg from "@/assets/save.svg";
+import { BOMItem } from "./data";
+import { cloneDeep } from "lodash-es";
 
 const props = defineProps<{
   defaultOpen?: boolean;
   hideClose?: boolean;
   defaultData?: any;
-  version?: string
+  version?: string;
   type?: string;
 }>();
 
-const latestVersion = inject<Ref<string>>('latestVersion');
+const latestVersion = inject<Ref<string>>("latestVersion");
 const visible = ref(!!props.defaultOpen);
 const mindmapRef = ref<MindMapInstance>();
 const configDrawerRef = ref();
 const formRef = ref<FormInstance>();
-const emit = defineEmits(['refresh']);
+const emit = defineEmits(["refresh"]);
 // const editBomStore = useEditBomStore();
 
 const data = ref(
   props?.defaultData || {
-    id: 'root',
+    id: "root",
     data: {
-      name: '根节点',
+      name: "根节点",
     },
     children: [],
   }
@@ -178,23 +198,23 @@ const data = ref(
 // 当前版本号与最新版本号不一致时,禁止修改
 const readonly = computed(() => {
   return props.version != latestVersion?.value;
-})
+});
 
 // 1、初次读取本地缓存配置
 const defaultConfig = JSON.parse(
-  localStorage.getItem('mindmap-config') || '{}'
+  localStorage.getItem("mindmap-config") || "{}"
 );
 const formData = reactive({
   level: defaultConfig?.level,
-  layout: defaultConfig?.layout ?? 'logicalStructure',
-  search: defaultConfig?.search || '',
+  layout: defaultConfig?.layout ?? "logicalStructure",
+  search: defaultConfig?.search || "",
 });
 
 // 2、监听配置项变化,保存到本地缓存
 watch(
   () => formData,
   (val) => {
-    localStorage.setItem('mindmap-config', JSON.stringify(val));
+    localStorage.setItem("mindmap-config", JSON.stringify(val));
   },
   {
     deep: true,
@@ -216,7 +236,7 @@ const changeLayout = (value: string) => {
   const mindmap = mindmapRef.value?.getInstance();
   mindmap?.setLayout(value);
   let fited = false;
-  mindmap?.on('node_tree_render_end', () => {
+  mindmap?.on("node_tree_render_end", () => {
     // @ts-ignore
     !fited && mindmap?.view?.fit();
     fited = true;
@@ -226,7 +246,7 @@ const changeLayout = (value: string) => {
 // 切换层级
 const changeLevel = (level: number) => {
   const mindmap = mindmapRef.value?.getInstance();
-  mindmap?.execCommand('UNEXPAND_TO_LEVEL', level);
+  mindmap?.execCommand("UNEXPAND_TO_LEVEL", level);
 };
 
 const autoFit = () => {
@@ -239,7 +259,7 @@ const autoFit = () => {
 const openNodeDetail = () => {
   const activeList = mindmapRef.value?.getActiveNodeList();
   if (!activeList?.length) {
-    ElMessage.warning('请选择查看节点');
+    ElMessage.warning("请选择查看节点");
     return;
   }
   configDrawerRef.value.open(activeList[0].nodeData);
@@ -262,11 +282,11 @@ const addNode = () => {
   const mindmap = mindmapRef.value?.getInstance();
   const activeList = mindmapRef.value?.getActiveNodeList();
   if (!activeList?.length) {
-    ElMessage.warning('请选择父节点');
+    ElMessage.warning("请选择父节点");
     return;
   }
 
-  mindmap?.execCommand('INSERT_CHILD_NODE');
+  mindmap?.execCommand("INSERT_CHILD_NODE");
 };
 
 // 删除节点
@@ -276,7 +296,7 @@ const removeNode = () => {
     ?.getActiveNodeList()
     ?.filter((node) => !node?.isRoot);
   if (!activeList?.length) {
-    ElMessage.warning('请选择删除节点');
+    ElMessage.warning("请选择删除节点");
     return;
   }
 
@@ -293,12 +313,12 @@ const removeNode = () => {
     });
   });
 
-  ElMessageBox.alert('确认删除节点?(已提交数据进入删除流程)', '提示', {
-    confirmButtonText: '确认',
+  ElMessageBox.alert("确认删除节点?(已提交数据进入删除流程)", "提示", {
+    confirmButtonText: "确认",
     callback: (action: string) => {
       // 执行删除
-      if (action === 'confirm') {
-        deleteNodes.length && mindmap?.execCommand('REMOVE_NODE', deleteNodes);
+      if (action === "confirm") {
+        deleteNodes.length && mindmap?.execCommand("REMOVE_NODE", deleteNodes);
         updateNodes.forEach((node) => {
           handleConfigOk({
             ...node?.nodeData.data,
@@ -316,7 +336,7 @@ const handleSearch = () => {
   const result: any[] = [];
   const mindmap = mindmapRef.value?.getInstance();
   const data = mindmap?.getData(false);
-  mindmap?.execCommand('CLEAR_ACTIVE_NODE');
+  mindmap?.execCommand("CLEAR_ACTIVE_NODE");
   bfsWalk(data, (node: any) => {
     if (node.data?.name?.includes(formData.search)) {
       result.push(node);
@@ -336,12 +356,12 @@ const handleSearch = () => {
       mindmap?.renderer?.activeMultiNode(list);
     }, 300);
   } else {
-    ElMessage.warning('未找到节点');
+    ElMessage.warning("未找到节点");
   }
 };
 
 const handleNodeDbClick = (node: any) => {
-  console.log('handleNodeDbClick', node);
+  console.log("handleNodeDbClick", node);
   if (node.isRoot) return;
   configDrawerRef.value.open(node.nodeData);
 };
@@ -382,7 +402,7 @@ const handleSave = () => {
   });
 
   if (!valid) {
-    ElMessage.error('请检查数据是否填写完整!');
+    ElMessage.error("请检查数据是否填写完整!");
     return;
   }
   // 添加版本号
@@ -391,24 +411,24 @@ const handleSave = () => {
   try {
     window.parent?.BpmTools?.program(
       {
-        interfaceCode: 'Common.doSaveBOMAiImageData',
+        interfaceCode: "Common.doSaveBOMAiImageData",
         model: data,
       },
       () => {
         ElMessage.success(`保存成功!`);
-        emit('refresh');
+        emit("refresh");
       }
     );
   } catch (error) {
     console.log(error);
-    ElMessage.error('保存失败!');
+    ElMessage.error("保存失败!");
   }
 };
 
 // 数据变化 处理新增数据
 const handleDataChange = (newData: any) => {
   // 新增数据
-  const addItem = newData?.find((item: any) => item.action === 'create');
+  const addItem = newData?.find((item: any) => item.action === "create");
   if (addItem && !addItem.data.data?.name) {
     const newItemData = new BOMItem();
     delete addItem.data.data.text;
@@ -421,10 +441,10 @@ const handleDataChange = (newData: any) => {
         is_change: false,
         is_add: true,
         qty: undefined,
-        name: '',
-        type: '',
-        bom_code: '',
-        change_content: '',
+        name: "",
+        type: "",
+        bom_code: "",
+        change_content: "",
         bom_det: newItemData,
       },
     };
@@ -432,7 +452,7 @@ const handleDataChange = (newData: any) => {
     const mindmap = mindmapRef.value?.getInstance();
     const nodeData = mindmap?.renderer.findNodeByUid(newNodeData?.data?.uid);
 
-    configDrawerRef.value.open(newNodeData, 'add', nodeData.layerIndex);
+    configDrawerRef.value.open(newNodeData, "add", nodeData.layerIndex);
   }
 };
 
@@ -468,7 +488,12 @@ defineExpose({
 
 const handlePressDel = (e: KeyboardEvent) => {
   // 删除节点
-  if (e.key === 'Delete' && visible.value && props.type == '1' && !readonly.value) {
+  if (
+    e.key === "Delete" &&
+    visible.value &&
+    props.type == "1" &&
+    !readonly.value
+  ) {
     e.preventDefault();
     removeNode();
   }
@@ -478,7 +503,7 @@ watch(
   () => data.value,
   () => {
     const result = cloneDeep(data.value);
-    if (result?.id && result.id !== 'root') {
+    if (result?.id && result.id !== "root") {
       bfsWalk(result, (node: any) => {
         delete node.smmVersion;
         delete node.data?.uid;
@@ -495,11 +520,11 @@ watch(
 );
 
 onMounted(() => {
-  addEventListener('keydown', handlePressDel);
+  addEventListener("keydown", handlePressDel);
 });
 
 onBeforeUnmount(() => {
-  removeEventListener('keydown', handlePressDel);
+  removeEventListener("keydown", handlePressDel);
 });
 </script>
 

+ 19 - 28
src/pages/excel/TableModal.vue

@@ -2,7 +2,7 @@
   <el-dialog title="推荐零件" width="800" v-model="open">
     <el-input
       class="mb-12px"
-      v-model="part_name"
+      v-model.trim="search"
       placeholder="输入零件名模糊匹配"
     >
       <template #append>
@@ -68,17 +68,14 @@ export interface IRecomend {
   unit: string;
 }
 
-// const options = [
-//   { label: "自制", value: "M" },
-//   { label: "外购", value: "P" },
-//   { label: "支给", value: "C" },
-// ];
-
 const emit = defineEmits(["ok"]);
 
 const open = ref(false);
+const search = ref("%");
 const part_name = ref("");
 const part_type = ref("");
+const product_category = ref("");
+const part_attribute = ref("");
 const dataSource = ref([]);
 const loading = ref(false);
 const currentRow = ref<IRecomend>();
@@ -88,29 +85,15 @@ const getData = () => {
     loading.value = true;
   }
 
-  // 测试接口
-  // fetch(`https://sl-yf-bommgr-admin-dev.shalu.com/api/module/Invoke`, {
-  //   method: 'POST',
-  //   headers: {
-  //     Authorization: 'bpm_client_1425496253931720704',
-  //     'content-type': 'application/json;charset=UTF-8',
-  //   },
-  //   body: JSON.stringify({
-  //     interfaceCode: 'Common.getPartRecomendList',
-  //     part_name: part_name.value,
-  //   }),
-  // })
-  //   .then((res) => res.json())
-  //   .then((res) => {
-  //     console.log('res', res);
-  //     dataSource.value = res?.result || [];
-  //   });
-
   window.parent?.BpmTools?.program(
     {
       interfaceCode: "Common.getPartRecomendList",
-      part_name: part_name.value,
+      // search为空或者% 根据part_name查询,否则更加seach查询
+      part_name:
+        search.value === "&" || !search.value ? part_name.value : search.value,
       part_type: part_type.value,
+      part_attribute: part_attribute.value,
+      product_category: product_category.value,
     },
     (res: any) => {
       dataSource.value = res || [];
@@ -130,11 +113,19 @@ const handleSelect = (val: IRecomend) => {
 };
 
 defineExpose({
-  open: (partName: string = "", partType = "") => {
+  open: (
+    partName: string = "",
+    partType = "",
+    partAttribute = "",
+    productCategory = ""
+  ) => {
+    search.value = "%";
     open.value = true;
     part_name.value = partName;
     part_type.value = partType;
-    console.log('partName', partName, partType);
+    part_attribute.value = partAttribute;
+    product_category.value = productCategory;
+    console.log("partName", partName, partType);
     getData();
   },
 });

+ 1 - 0
src/pages/excel/index.vue

@@ -107,6 +107,7 @@ onMounted(() => {
     {
       interfaceCode: "Common.getBOM2OnlineData",
       bom_id: route.query.id,
+      type
     },
     (res: any) => {
       if (res?.code) {

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 1
stats.html