From 298a75f485465ad049c1d5922a94026f81ca40d1 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 14 九月 2026 11:15:03 +0800
Subject: [PATCH] feat: 优化下单-检验

---
 src/api/standard/standardLibrary.js                     |    8 ++
 src/views/standard/standardLibrary/index.vue            |   49 ++++++++++++
 src/views/business/productOrder/components/addOrder.vue |   79 +++++++++++--------
 src/utils/standardTree.js                               |    5 +
 src/views/business/productOrder/components/addView.vue  |   35 +++++++-
 src/views/business/inspectionView/index.vue             |   15 +++
 src/views/business/inspectionTask/inspection.vue        |   15 +++
 7 files changed, 167 insertions(+), 39 deletions(-)

diff --git a/src/api/standard/standardLibrary.js b/src/api/standard/standardLibrary.js
index ce53868..73d1965 100644
--- a/src/api/standard/standardLibrary.js
+++ b/src/api/standard/standardLibrary.js
@@ -132,6 +132,14 @@
   });
 }
 
+export function selectTemplateBindings(query) {
+  return request({ url: "/standardTree/selectTemplateBindings", method: "get", params: query });
+}
+
+export function saveTemplateBindings(data) {
+  return request({ url: "/standardTree/saveTemplateBindings", method: "post", data });
+}
+
 // 鑾峰彇鏍囧噯鏂规硶鏋氫妇
 export function selectStandardMethods(query) {
   return request({
diff --git a/src/utils/standardTree.js b/src/utils/standardTree.js
index 458f12d..c69f81e 100644
--- a/src/utils/standardTree.js
+++ b/src/utils/standardTree.js
@@ -1,7 +1,8 @@
 /**
  * 鏍囧噯搴撴爲閫氱敤宸ュ叿
  *
- * 灞傜骇涓嶅浐瀹氾細children 涓� null / undefined / 绌烘暟缁勭殑鑺傜偣鍗充负銆屾爣鍑嗐�嶅彾瀛愩��
+ * 鏍囧噯搴撳浐瀹氫袱绾э細code=[1] 涓鸿涓氾紝code=[2] 涓烘爣鍑嗐��
+ * 鍏煎娌℃湁 code 鐨勬棫鎺ュ彛鏁版嵁鏃讹紝鍐嶅洖閫�鍒� children 鍒ゆ柇鍙跺瓙銆�
  * 鏍戣矾寰勭粺涓�鐢� " - " 杩炴帴锛屾牸寮忎笌鍘嗗彶瀹炵幇閫愬瓧鑺備繚鎸佷竴鑷达細
  * 椤跺眰鐪熷疄鑺傜偣鐨� parent 鏄� Element UI 鐨勮櫄鎷熸牴锛屽洜姝ゆ牴鑺傜偣浼氳繘鍏ヨ矾寰勩��
  */
@@ -9,6 +10,8 @@
 // 鏄惁鍙跺瓙锛堟爣鍑嗭級
 export function isLeaf(data) {
   if (!data) return true;
+  if (data.code === '[1]') return false;
+  if (data.code === '[2]') return true;
   const children = data.children;
   return children === null || children === undefined || children.length === 0;
 }
diff --git a/src/views/business/inspectionTask/inspection.vue b/src/views/business/inspectionTask/inspection.vue
index 8b4c763..e446166 100644
--- a/src/views/business/inspectionTask/inspection.vue
+++ b/src/views/business/inspectionTask/inspection.vue
@@ -1974,6 +1974,21 @@
       });
       // 鏈寰幆涓昏鏄帶鍒跺悎骞�,浠ュ強鎺у埗妫�楠岄」淇℃伅鏄惁灞曠ず鍑烘潵,浠ヤ究鍚庣画妫�楠�
       this.tableList.forEach((a) => {
+        // 鏂拌仛璁㈠崟鐩存帴鎸夆�滄ā鏉縄D + 妯℃澘琛屽彿鈥濈粦瀹氭楠岃褰曪紝涓嶅啀鍖归厤鍒嗙被鍜屾楠屽瓙椤广��
+        const directProducts = this.currentSample.insProduct.filter(
+          (product) => product.templateId === a.templateId &&
+            product.templateRowIndex !== null && product.templateRowIndex !== undefined
+        );
+        if (directProducts.length > 0) {
+          directProducts.forEach((product) => {
+            a.template.forEach((cell) => {
+              if (cell.r === product.templateRowIndex) {
+                cell.i = product.id;
+              }
+            });
+          });
+          return;
+        }
         let dels = new Set(); //闇�瑕佸垹闄ょ殑琛�
         let ids = []; //鎵�鏈夋楠岄」鐨刬d
         let set3 = new Set();
diff --git a/src/views/business/inspectionView/index.vue b/src/views/business/inspectionView/index.vue
index 09e38b9..70374e3 100644
--- a/src/views/business/inspectionView/index.vue
+++ b/src/views/business/inspectionView/index.vue
@@ -1756,6 +1756,21 @@
       });
       // 鏈寰幆涓昏鏄帶鍒跺悎骞�,浠ュ強鎺у埗妫�楠岄」淇℃伅鏄惁灞曠ず鍑烘潵,浠ヤ究鍚庣画妫�楠�
       this.tableList.forEach((a) => {
+        // 鏂拌仛璁㈠崟鐩存帴鎸夆�滄ā鏉縄D + 妯℃澘琛屽彿鈥濈粦瀹氭楠岃褰曪紝涓嶅啀鍖归厤鍒嗙被鍜屾楠屽瓙椤广��
+        const directProducts = this.currentSample.insProduct.filter(
+          (product) => product.templateId === a.templateId &&
+            product.templateRowIndex !== null && product.templateRowIndex !== undefined
+        );
+        if (directProducts.length > 0) {
+          directProducts.forEach((product) => {
+            a.template.forEach((cell) => {
+              if (cell.r === product.templateRowIndex) {
+                cell.i = product.id;
+              }
+            });
+          });
+          return;
+        }
         let dels = new Set(); //闇�瑕佸垹闄ょ殑琛�
         let ids = []; //鎵�鏈夋楠岄」鐨刬d
         let set3 = new Set();
diff --git a/src/views/business/productOrder/components/addOrder.vue b/src/views/business/productOrder/components/addOrder.vue
index 975f4ea..000296d 100644
--- a/src/views/business/productOrder/components/addOrder.vue
+++ b/src/views/business/productOrder/components/addOrder.vue
@@ -42,7 +42,28 @@
     </div>
     <div v-show="!cableConfigShow&&!auxiliaryShow" style="margin-top: 10px">
       <div class="search">
-        <el-form ref="addObj" :inline="true" :model="addObj" :rules="addObjRules" label-width="108px" label-position="right">
+        <el-form ref="newJuOrder" :inline="true" :model="addObj" label-width="108px" label-position="right">
+          <el-row>
+            <el-col :span="6"><el-form-item label="浜у搧鍚嶇О"><el-input v-model="addObj.sample" disabled size="small"><template slot="append"><el-button :disabled="active>1" icon="el-icon-search" @click="selectStandardTree = true" /></template></el-input></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鐢熶骇鍗曚綅"><el-input v-model="addObj.production" :disabled="active>1" size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="濮旀墭鍗曚綅"><el-input v-model="addObj.company" disabled size="small"><template slot="append"><el-button :disabled="active>1" icon="el-icon-search" @click="openCompanyList" /></template></el-input></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="妫�楠岀被鍒�"><el-select v-model="addObj.orderType" :disabled="active>1" size="small"><el-option v-for="item in dict.type.check_type1" :key="item.value" :label="item.label" :value="item.value" /></el-select></el-form-item></el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="6"><el-form-item label="鏍峰搧鏁伴噺"><el-input v-model="addObj.testQuantity" :disabled="active>1" placeholder="濡傦細2妗躲��500mL" size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鏍峰搧缂栧彿"><el-input v-model="sampleCode" :disabled="active>1" size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鏍峰搧澶栬"><el-input v-model="addObj.sampleStatus" :disabled="active>1" size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="閫佹牱浜�"><el-input v-model="addObj.prepareUser" :disabled="active>1" size="small" /></el-form-item></el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="6"><el-form-item label="鐢熶骇鏃ユ湡"><el-date-picker v-model="addObj.productionDate" type="date" value-format="yyyy-MM-dd" :disabled="active>1" size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鐢熶骇鎵瑰彿"><el-input v-model="addObj.productionBatch" :disabled="active>1" size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="閫佹牱鏃ユ湡"><el-date-picker v-model="addObj.sampleDate" type="date" value-format="yyyy-MM-dd" :disabled="active>1" size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鑱旂郴鏂瑰紡"><el-input v-model="addObj.phone" :disabled="active>1" size="small" /></el-form-item></el-col>
+          </el-row>
+          <el-row><el-col :span="6"><el-form-item label="鐜鏉′欢"><el-input v-model="addObj.temperature" :disabled="active>1" placeholder="娓╁害" size="small" /></el-form-item></el-col><el-col :span="6"><el-form-item label="婀垮害"><el-input v-model="addObj.humidity" :disabled="active>1" size="small" /></el-form-item></el-col><el-col :span="6"><el-form-item label="澶囨敞"><el-input v-model="addObj.remark" :disabled="active>1" size="small" /></el-form-item></el-col></el-row>
+        </el-form>
+        <el-form v-if="false" ref="addObj" :inline="true" :model="addObj" :rules="addObjRules" label-width="108px" label-position="right">
           <el-row>
             <el-col :span="6">
               <el-form-item label="濮旀墭缂栧彿:" prop="entrustCode">
@@ -205,7 +226,7 @@
           </el-row>
         </el-form>
       </div>
-      <div>
+      <div v-if="false">
         <div style="display: flex;justify-content: space-between;background-color: #F5F7FB;margin-bottom: 6px">
           <div v-if="active==1">
             <el-form :inline="true" :model="addObj1" label-width="90px">
@@ -427,7 +448,7 @@
               <el-col :span="24">
                 <span><i
                     :class="`node_i ${data.children != undefined ? (data.code==='[1]'?'el-icon-folder-opened':'el-icon-folder') : 'el-icon-tickets'}`"></i>
-                  {{ data.code }} {{ data.label }}</span>
+                  {{ data.label }}</span>
               </el-col>
             </el-row>
           </div>
@@ -615,7 +636,6 @@
 import {
   isLeafPath,
   buildSelectTree,
-  deriveTreeFields,
   dropLastLabel,
 } from "@/utils/standardTree";
 
@@ -644,6 +664,7 @@
       active: '',
       tabIndex: '',
       currentId: '',
+      sampleCode: '',
       sampleSelectionList: [],//鏍峰搧琛ㄦ牸閫変腑鏁版嵁
       editTable:[],
       template: null,
@@ -1157,6 +1178,14 @@
         return str.replaceAll(find, value);
       },
       save() {
+        if (this.addObj.standardTreeId) {
+          if (!this.addObj.sample || !this.addObj.company || !this.addObj.orderType || !this.addObj.testQuantity) {
+            this.$message.error('璇峰~鍐欎骇鍝佸悕绉般�佸鎵樺崟浣嶃�佹楠岀被鍒拰鏍峰搧鏁伴噺');
+            return;
+          }
+          this.saveData([]);
+          return;
+        }
         this.$refs['addObj'].validate((valid) => {
           if (valid) {
             this.sampleList.forEach(item => {
@@ -1337,6 +1366,10 @@
         }
       },
       saveMethod(sampleList){
+        if (this.addObj.standardTreeId) {
+          this.saveData([]);
+          return;
+        }
         if (this.addObj.quarterItemId) {
           this.addObj.quarterItemId = this.addObj.quarterItemId[1]
         }
@@ -1383,7 +1416,10 @@
         })
       }else{
         // 甯歌鎻愪氦
-        addInsOrder({insOrder: {...this.addObj,typeSource:-1}, sampleList: sampleList}).then(res => {
+        const payload = this.addObj.standardTreeId
+          ? { insOrder: {...this.addObj,typeSource:-1}, standardTreeId: this.addObj.standardTreeId, sampleCode: this.sampleCode }
+          : { insOrder: {...this.addObj,typeSource:-1}, sampleList: sampleList }
+        addInsOrder(payload).then(res => {
           this.saveLoad = false
           this.$message.success('宸叉彁浜�')
           this.bsm3Dia = false;
@@ -1512,38 +1548,15 @@
         return data.label.indexOf(value) !== -1;
       },
       activeStandardTree() {
-        const fields = deriveTreeFields(this.selectTreeNode)
-        if (fields.labels.length < 2) {
-          this.$message.error('鏈�夋嫨瀵硅薄')
+        if (!this.selectTreeNode || this.selectTreeNode.data.code !== '[2]') {
+          this.$message.error('璇烽�夋嫨浜岀骇浜у搧')
           return
         }
-        this.addObj.factory = fields.factory
-        this.addObj.laboratory = fields.laboratory
-        this.addObj.sampleType = fields.sampleType
-        this.addObj.sample = fields.sample || fields.sampleType
-        this.addObj.sampleView = this.addObj.sample
-        this.addObj.sampleViewEn = this.sampleViewEn
-        this.addObj.model = fields.model
+        const productName = this.selectTreeNode.data.label
+        this.addObj.sample = productName
+        this.addObj.standardTreeId = this.selectTreeNode.data.id
         this.selectStandardTree = false
         this.sampleList = []
-        for (var i = 0; i < this.addObj.sampleNum; i++) {
-          this.sample.joinName = null
-          this.sample.joinModel = null
-          this.sample.joinNum = 1
-          this.sample.sample = this.addObj.sample
-          this.sample.model = this.addObj.model
-          this.sample.unit = this.addObj.unit
-          this.sample.standardMethodListId = null
-          this.sample.insProduct = []
-          this.sample.id = this.count
-          this.sample.childSampleList = []
-          this.sample.insulating = null
-          this.sample.sheath = null
-          this.sampleList.push(this.HaveJson(this.sample))
-          this.count++
-        }
-        this.$refs.sampleTable.doLayout()
-        // this.selectsStandardMethodByFLSSM()
       },
       // 鐢ㄦ寚瀹氬瀷鍙锋浛鎹㈡爲璺緞鏈锛堟湯娈靛嵆鏍囧噯/鍨嬪彿锛�
       buildFactoryPath(model) {
diff --git a/src/views/business/productOrder/components/addView.vue b/src/views/business/productOrder/components/addView.vue
index 3f39632..7c3bbd6 100644
--- a/src/views/business/productOrder/components/addView.vue
+++ b/src/views/business/productOrder/components/addView.vue
@@ -4,7 +4,7 @@
       <div style="display: flex;justify-content: space-between;align-items:center;">
         <div>濮旀墭鍗曚俊鎭�</div>
         <div>
-          <el-cascader
+          <el-cascader v-if="false"
             v-model="addObj.quarterItemId"
             :disabled="active>1"
             :options="quarterItemOptions"
@@ -38,7 +38,32 @@
     </div>
     <div v-show="!cableConfigShow&&!auxiliaryShow" style="margin-top: 10px">
       <div class="search">
-        <el-form ref="addObj" :inline="true" :model="addObj" :rules="addObjRules" label-width="108px" label-position="right">
+        <el-form :inline="true" :model="addObj" label-width="108px" label-position="right">
+          <el-row>
+            <el-col :span="6"><el-form-item label="浜у搧鍚嶇О"><el-input v-model="addObj.sample" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鐢熶骇鍗曚綅"><el-input v-model="addObj.production" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="濮旀墭鍗曚綅"><el-input v-model="addObj.company" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="妫�楠岀被鍒�"><el-select v-model="addObj.orderType" disabled size="small"><el-option v-for="item in dict.type.check_type1" :key="item.value" :label="item.label" :value="item.value" /></el-select></el-form-item></el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="6"><el-form-item label="鏍峰搧鏁伴噺"><el-input v-model="addObj.testQuantity" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鏍峰搧缂栧彿"><el-input v-model="sampleCode" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鏍峰搧澶栬"><el-input v-model="addObj.sampleStatus" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="閫佹牱浜�"><el-input v-model="addObj.prepareUser" disabled size="small" /></el-form-item></el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="6"><el-form-item label="鐢熶骇鏃ユ湡"><el-date-picker v-model="addObj.productionDate" type="date" value-format="yyyy-MM-dd" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鐢熶骇鎵瑰彿"><el-input v-model="addObj.productionBatch" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="閫佹牱鏃ユ湡"><el-date-picker v-model="addObj.sampleDate" type="date" value-format="yyyy-MM-dd" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="鑱旂郴鏂瑰紡"><el-input v-model="addObj.phone" disabled size="small" /></el-form-item></el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="6"><el-form-item label="鐜鏉′欢"><el-input v-model="addObj.temperature" disabled placeholder="娓╁害" size="small" /></el-form-item></el-col>
+            <el-col :span="6"><el-form-item label="婀垮害"><el-input v-model="addObj.humidity" disabled size="small" /></el-form-item></el-col>
+            <el-col :span="12"><el-form-item label="澶囨敞"><el-input v-model="addObj.remark" disabled size="small" style="width: 520px" /></el-form-item></el-col>
+          </el-row>
+        </el-form>
+        <el-form v-show="false" ref="addObj" :inline="true" :model="addObj" :rules="addObjRules" label-width="108px" label-position="right">
           <el-row>
             <el-col :span="6">
               <el-form-item label="濮旀墭缂栧彿:" prop="entrustCode">
@@ -201,7 +226,7 @@
           </el-row>
         </el-form>
       </div>
-      <div>
+      <div v-show="false">
         <div style="display: flex;justify-content: space-between;background-color: #F5F7FB;margin-bottom: 6px">
           <div v-if="active==1">
             <el-form :inline="true" :model="addObj1" label-width="90px">
@@ -415,7 +440,7 @@
               <el-col :span="24">
                 <span><i
                     :class="`node_i ${data.children != undefined ? (data.code==='[1]'?'el-icon-folder-opened':'el-icon-folder') : 'el-icon-tickets'}`"></i>
-                  {{ data.code }} {{ data.label }}</span>
+                  {{ data.label }}</span>
               </el-col>
             </el-row>
           </div>
@@ -618,6 +643,7 @@
       active: '',
       tabIndex: '',
       currentId: '',
+      sampleCode: '',
       sampleSelectionList: [],//鏍峰搧琛ㄦ牸閫変腑鏁版嵁
       editTable:[],
       template: null,
@@ -862,6 +888,7 @@
           };
           this.addObj.type = String(this.addObj.type)
           this.sampleList = this.HaveJson(res.data.sampleProduct);
+          this.sampleCode = this.sampleList.length ? this.sampleList[0].sampleCode : ''
           this.specialStandardMethod = this.sampleList[0].specialStandardMethod
           this.getProNum()
           this.addObj.sampleNum = this.sampleList.length
diff --git a/src/views/standard/standardLibrary/index.vue b/src/views/standard/standardLibrary/index.vue
index 7f57755..16b01f8 100644
--- a/src/views/standard/standardLibrary/index.vue
+++ b/src/views/standard/standardLibrary/index.vue
@@ -56,6 +56,17 @@
         </pane>
         <!--鐢ㄦ埛鏁版嵁-->
         <pane size="88">
+          <el-card v-if="selected.isLeaf" shadow="never" class="template-binding-card">
+            <div slot="header"><span>鍘熷璁板綍妯℃澘</span><el-button v-if="checkPermi(['standard:standardLibrary:upStandardProduct'])" type="primary" size="mini" style="float:right" @click="saveBindings">淇濆瓨缁戝畾</el-button></div>
+            <p v-if="!templateBindings.length" class="binding-tip">璇蜂负褰撳墠鏍囧噯缁戝畾鍘熷璁板綍妯℃澘锛涙ā鏉夸腑椤讳娇鐢ㄢ�滄楠岄」鈥濇爣璁般��</p>
+            <el-table :data="templateBindings" border size="small">
+              <el-table-column type="index" label="椤哄簭" width="70" /><el-table-column label="妯℃澘缂栧彿" prop="number" width="180" /><el-table-column label="妯℃澘鍚嶇О" prop="name" /><el-table-column label="妫�娴嬩緷鎹紙妯℃澘澶囨敞锛�" prop="remark" />
+              <el-table-column v-if="checkPermi(['standard:standardLibrary:upStandardProduct'])" label="鎿嶄綔" width="150"><template slot-scope="scope"><el-button type="text" :disabled="scope.$index === 0" @click="moveBinding(scope.$index, -1)">涓婄Щ</el-button><el-button type="text" :disabled="scope.$index === templateBindings.length - 1" @click="moveBinding(scope.$index, 1)">涓嬬Щ</el-button><el-button type="text" @click="removeBinding(scope.$index)">绉婚櫎</el-button></template></el-table-column>
+            </el-table>
+            <el-select v-if="checkPermi(['standard:standardLibrary:upStandardProduct'])" v-model="templateToBind" filterable placeholder="閫夋嫨鍘熷璁板綍妯℃澘" size="small" style="width:320px;margin-top:16px" @change="addBinding"><el-option v-for="template in templateList.filter(item => !templateBindings.some(binding => binding.templateId === item.id))" :key="template.id" :label="template.number ? template.number + ' - ' + template.name : template.name" :value="template.id" /></el-select>
+          </el-card>
+          <el-empty v-else description="璇烽�夋嫨浜岀骇鏍囧噯锛岀淮鎶ゅ叾鍘熷璁板綍妯℃澘" />
+          <div v-if="false">
           <div class="search_form">
             <div style="height:37px">
               <p style="font-size: 14px; color: #999;margin-left: 10px">{{ selectTree }}</p>
@@ -192,6 +203,7 @@
               <p style="text-align: right;margin-right: 20px;color: #333;">鍏眥{ total }}鏉�</p>
             </el-row>
           </el-col>
+          </div>
         </pane>
       </splitpanes>
     </el-row>
@@ -321,6 +333,8 @@
   selectStandardProductListByMethodId,
   updateSection,
   getStandardTemplate,
+  selectTemplateBindings,
+  saveTemplateBindings,
 } from "@/api/standard/standardLibrary";
 import bindSupplierDensityDialogAsk from "./components/bindSupplierDensityDialogAsk.vue";
 import BatchCopy from "./components/BatchCopy.vue";
@@ -391,6 +405,8 @@
       sectionRow: null,
       sectionList: [],
       templateList: [],
+      templateBindings: [],
+      templateToBind: null,
       total: 0,
       currentPage: 1,
       standardId: 0,
@@ -495,6 +511,7 @@
       this.currentPage = 1;
       this.selectTree = buildSelectTree(node, "null");
       this.selected = {
+        id: val.id,
         label: val.label,
         tree: this.selectTree,
         isLeaf: leaf,
@@ -504,10 +521,11 @@
       this.standardList = [];
       this.productList = [];
       if (leaf) {
-        this.selectsStandardMethodByFLSSM();
+        this.loadTemplateBindings(val.id);
       } else {
         this.standardId = 0;
         this.syncSortable();
+        this.templateBindings = [];
       }
     },
     remove(node, data) {
@@ -965,6 +983,35 @@
         this.templateList = res.data;
       });
     },
+    loadTemplateBindings(standardTreeId) {
+      selectTemplateBindings({ standardTreeId }).then((res) => {
+        this.templateBindings = res.data || [];
+        this.templateToBind = null;
+      });
+    },
+    addBinding(templateId) {
+      const template = this.templateList.find((item) => item.id === templateId);
+      if (template && !this.templateBindings.some((item) => item.templateId === templateId)) {
+        this.templateBindings.push({ ...template, templateId, sort: this.templateBindings.length });
+      }
+      this.templateToBind = null;
+    },
+    removeBinding(index) {
+      this.templateBindings.splice(index, 1);
+    },
+    moveBinding(index, offset) {
+      const target = index + offset;
+      const item = this.templateBindings.splice(index, 1)[0];
+      this.templateBindings.splice(target, 0, item);
+    },
+    saveBindings() {
+      saveTemplateBindings({ standardTreeId: this.selected.id,
+        templates: this.templateBindings.map((item, index) => ({ templateId: item.templateId, sort: index }))
+      }).then(() => {
+        this.$message.success("妯℃澘缁戝畾宸蹭繚瀛�");
+        this.loadTemplateBindings(this.selected.id);
+      });
+    },
     handleCurrentChange(val) {
       this.currentPage = val;
       this.tableLoad2 = true;

--
Gitblit v1.9.3