From 404966637eda6881a0f17683c5aacc7c1c34aed8 Mon Sep 17 00:00:00 2001
From: 田源 <tianyuan@vci-tech.com>
Date: 星期四, 16 一月 2025 16:18:34 +0800
Subject: [PATCH] 增加操作类型

---
 Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/linkType/index.vue | 1049 ++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 830 insertions(+), 219 deletions(-)

diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/linkType/index.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/linkType/index.vue
index 4aee662..2a6af8a 100644
--- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/linkType/index.vue
+++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/linkType/index.vue
@@ -2,32 +2,12 @@
   <el-container v-loading="createViewLoading">
     <el-aside>
       <basic-container>
-        <div ref="TreeBox" style="height: calc(100vh - 144px);!important;">
-          <div class="headerCon">
-            <el-button icon="el-icon-plus" plain size="small" type="primary" @click="addClickHandler">鍒涘缓
-            </el-button>
-            <el-button icon="el-icon-edit" plain size="small" type="primary">淇敼
-            </el-button>
-            <el-button icon="el-icon-delete" plain size="small" type="danger">鍒犻櫎
-            </el-button>
-            <el-button icon="el-icon-view" plain size="small" type="primary">鏌ョ湅
-            </el-button>
-            <el-button icon="el-icon-download" plain size="small" type="primary">瀵煎嚭
-            </el-button>
-            <el-button icon="el-icon-upload2" plain size="small" type="primary">瀵煎叆
-            </el-button>
-            <el-button icon="el-icon-circle-plus-outline" plain size="small"
-                       type="primary" @click="createViewClickHandler">鍒涘缓瑙嗗浘
-            </el-button>
-            <el-button icon="el-icon-menu" plain size="small"
-                       type="primary" @click="checkClickHandler">涓�鑷存�ф鏌�
-            </el-button>
-          </div>
-          <!-- 宸︿晶鏍�         -->
-          <div style="height:  calc(100vh - 300px);">
+        <div ref="TreeBox" style="height: calc(100vh - 154px);!important;">
+          <!-- 宸︿晶鏍� -->
+          <div style="height:  calc(100vh - 190px);">
             <avue-tree :data="treeData" :option="treeOption" @node-click="nodeClick">
           <span slot-scope="{ node, data }" class="el-tree-node__label">
-           <span style="font-size: 15px">
+           <span>
               <i class="el-icon-s-promotion"></i>
                 {{ (node || {}).label }}
             </span>
@@ -41,121 +21,144 @@
     <el-main>
       <basic-container>
         <div>
-          <el-descriptions :column="2" border class="margin-top" size="medium">
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.id"></i>
-                鍚嶇О
-              </template>
-              {{ nodeRow.name }}
-            </el-descriptions-item>
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.name"></i>
-                鏍囩
-              </template>
-              {{ nodeRow.tag }}
-            </el-descriptions-item>
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.tableName"></i>
-                瀹炵幇绫�
-              </template>
-              {{ nodeRow.implClass }}
-            </el-descriptions-item>
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.domain"></i>
-                褰㈢姸
-              </template>
-              <el-tag v-if="nodeRow.shape">
-                {{ nodeRow.shape }}
-              </el-tag>
-            </el-descriptions-item>
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.desc"></i>
-                鎻忚堪
-              </template>
-              {{ nodeRow.description }}
-            </el-descriptions-item>
-          </el-descriptions>
-
-          <el-descriptions :column="3" border class="margin-top" direction="vertical">
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.from"></i>
-                From绔被鍨�
-              </template>
-              <span v-for="item in nodeRow.btmItemsFrom" style="margin-left:2px;">
-              <el-tag effect="plain" style="margin-top: 2px;">
-                  {{ item }}
-              </el-tag>
-            </span>
-            </el-descriptions-item>
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.from"></i>
-                Form绔富绫诲瀷
-              </template>
-              <el-tag v-if="nodeRow.primitivesFrom" effect="plain">
-                {{ nodeRow.primitivesFrom === '璇烽�夋嫨' ? nodeRow.btmItemsFrom[0] : nodeRow.primitivesFrom }}
-              </el-tag>
-            </el-descriptions-item>
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.from"></i>
-                From绔搴斿叧绯�
-              </template>
-              <el-tag v-if="nodeRow.relationFrom" effect="plain">{{ nodeRow.relationFrom }}</el-tag>
-            </el-descriptions-item>
-
-          </el-descriptions>
-
-          <el-descriptions :column="3" border class="margin-top" direction="vertical">
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.to"></i>
-                To绔被鍨�
-              </template>
-              <span v-for="item in nodeRow.btmItemsTo" style="margin-left:2px;">
-              <el-tag effect="plain" style="margin-top: 2px;">
-                  {{ item }}
-              </el-tag>
-            </span>
-            </el-descriptions-item>
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.to"></i>
-                To绔富绫诲瀷
-              </template>
-              <el-tag v-if="nodeRow.primitivesTo" effect="plain">
-                {{ nodeRow.primitivesTo === '璇烽�夋嫨' ? nodeRow.btmItemsTo[0] : nodeRow.primitivesTo }}
-              </el-tag>
-            </el-descriptions-item>
-            <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
-                                  :labelStyle="descriptionOption.labelStyle">
-              <template slot="label">
-                <i :class="icons.to"></i>
-                To绔搴斿叧绯�
-              </template>
-              <el-tag v-if="nodeRow.relationTo" effect="plain">{{ nodeRow.relationTo }}</el-tag>
-            </el-descriptions-item>
-
-          </el-descriptions>
+          <el-button v-if="permissionList.addBtn" class="button-custom-icon" plain size="small" type="primary"
+                     @click="addClickHandler">
+            <icon-show :name="permissionList.addBtn.source"></icon-show>
+            鍒涘缓
+          </el-button>
+          <el-button v-if="permissionList.editBtn" class="button-custom-icon" plain size="small" type="primary" @click="editClickHandler">
+            <icon-show :name="permissionList.editBtn.source"></icon-show>
+            淇敼
+          </el-button>
+          <el-button v-if="permissionList.delBtn" class="button-custom-icon" plain size="small" type="danger" @click="deleteClickHandler">
+            <icon-show :name="permissionList.delBtn.source"></icon-show>
+            鍒犻櫎
+          </el-button>
+          <el-button v-if="permissionList.importBtn" class="button-custom-icon" plain size="small" type="primary" @click="upLoadClickHandler">
+            <icon-show :name="permissionList.importBtn.source"></icon-show>
+            瀵煎叆
+          </el-button>
+          <el-button v-if="permissionList.exportBtn" class="button-custom-icon" plain size="small" type="primary" @click="exportClickHandler">
+            <icon-show :name="permissionList.exportBtn.source"></icon-show>
+            瀵煎嚭
+          </el-button>
+          <el-button v-if="permissionList.createViewBtn" class="button-custom-icon" plain size="small" type="primary" @click="createViewClickHandler">
+            <icon-show :name="permissionList.createViewBtn.source"></icon-show>
+            鍒涘缓瑙嗗浘
+          </el-button>
+          <el-button v-if="permissionList.consistencyCheckBtn" class="button-custom-icon" plain size="small" type="primary" @click="checkClickHandler">
+            <icon-show :name="permissionList.consistencyCheckBtn.source"></icon-show>
+            涓�鑷存�ф鏌�
+          </el-button>
         </div>
-        <div style="margin-top: 20px">
-          <h3>灞炴�ф睜鍒楄〃</h3>
+        <el-descriptions style="margin: 10px 0 20px" :column="2" border class="margin-top" size="medium">
+          <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.id"></i>
+              鍚嶇О
+            </template>
+            {{ nodeRow.name }}
+          </el-descriptions-item>
+          <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.name"></i>
+              鏍囩
+            </template>
+            {{ nodeRow.tag }}
+          </el-descriptions-item>
+          <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.tableName"></i>
+              瀹炵幇绫�
+            </template>
+            <el-tooltip v-if="nodeRow.implClass" :content="nodeRow.implClass" class="item" effect="dark"
+                        placement="top-start">
+              <el-tag style="max-width: 100%;overflow: hidden;display: block">{{ nodeRow.implClass }}</el-tag>
+            </el-tooltip>
+          </el-descriptions-item>
+          <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.domain"></i>
+              褰㈢姸
+            </template>
+            <el-tag v-if="nodeRow.shape">
+              {{ nodeRow.shape }}
+            </el-tag>
+          </el-descriptions-item>
+          <el-descriptions-item :span="2" :contentStyle="descriptionOption.contentStyle"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.desc"></i>
+              鎻忚堪
+            </template>
+            {{ nodeRow.description }}
+          </el-descriptions-item>
+          <el-descriptions-item :span="2" contentStyle="word-break:break-all;"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.from"></i>From绔被鍨�
+            </template>
+            <span v-for="item in nodeRow.btmItemsFrom">
+                <el-tag effect="plain" style="margin:2px 5px 2px 0;">
+                    {{ item }}
+                </el-tag>
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.from"></i>
+              Form绔富绫诲瀷
+            </template>
+            <el-tag v-if="nodeRow.primitivesFrom" effect="plain">
+              {{ nodeRow.primitivesFrom === '璇烽�夋嫨' ? nodeRow.btmItemsFrom[0] : nodeRow.primitivesFrom }}
+            </el-tag>
+          </el-descriptions-item>
+          <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.from"></i>
+              From绔搴斿叧绯�
+            </template>
+            <el-tag v-if="nodeRow.relationFrom" effect="plain">{{ nodeRow.relationFrom }}</el-tag>
+          </el-descriptions-item>
+          <el-descriptions-item :span="2" contentStyle="word-break:break-all;"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.to"></i>
+              To绔被鍨�
+            </template>
+            <span v-for="item in nodeRow.btmItemsTo">
+                 <el-tag effect="plain" style="margin:2px 5px 2px 0;">
+                  {{ item }}
+                 </el-tag>
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.to"></i>
+              To绔富绫诲瀷
+            </template>
+            <el-tag v-if="nodeRow.primitivesTo" effect="plain">
+              {{ nodeRow.primitivesTo === '璇烽�夋嫨' ? nodeRow.btmItemsTo[0] : nodeRow.primitivesTo }}
+            </el-tag>
+          </el-descriptions-item>
+          <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
+                                :labelStyle="descriptionOption.labelStyle">
+            <template slot="label">
+              <i :class="icons.to"></i>
+              To绔搴斿叧绯�
+            </template>
+            <el-tag v-if="nodeRow.relationTo" effect="plain">{{ nodeRow.relationTo }}</el-tag>
+          </el-descriptions-item>
+        </el-descriptions>
+        <div style="position: relative">
+          <h3 style="margin: 0;position: absolute;top:0;z-index: 1000;">灞炴�у垪琛�</h3>
           <avue-crud
             :data="tableData"
             :option="tableOption"
@@ -164,83 +167,136 @@
       </basic-container>
     </el-main>
 
-    <!-- 鍒涘缓 && 缂栬緫   -->
+    <!-- 鍒涘缓 && 缂栬緫 -->
     <el-dialog
       v-dialogDrag
+      :title="title === 'add' ? '鍒涘缓' : '淇敼'"
       :visible.sync="visible"
       append-to-body="true"
       class="avue-dialog"
-      title="鍒涘缓"
       width="70%"
+      @close="addDialogClose"
     >
-      <el-form ref="form" :model="form" :rules="rules" label-width="90px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="85px" size="small">
         <div class="dialogForm">
           <div class="leftForm">
             <el-form-item label="鍚嶇О锛�" prop="name">
-              <el-input v-model="form.name"></el-input>
+              <el-input v-model="form.name" :readOnly="title === 'edit'"></el-input>
             </el-form-item>
             <el-form-item label="鏍囩锛�">
               <el-input v-model="form.tag"></el-input>
             </el-form-item>
             <el-form-item label="瀹炵幇绫伙細">
-              <el-input v-model="form.impClass"></el-input>
+              <el-input v-model="form.implClass"></el-input>
             </el-form-item>
             <el-form-item label="褰㈢姸">
               <el-input v-model="form.shape"></el-input>
             </el-form-item>
             <el-form-item label="鎻忚堪">
-              <el-input v-model="form.description" :rows="2" type="textarea"></el-input>
+              <el-input v-model="form.description" :rows="3" type="textarea"></el-input>
             </el-form-item>
           </div>
 
           <div class="centerForm">
-            <el-form-item label="Form绔被鍨嬶細" label-width="110px">
-              <el-input v-model="form.btmItemsFrom"></el-input>
+            <el-form-item label-width="110px" style="margin-bottom: 5px;">
+              <div slot="label">
+                <span>Form绔被鍨嬶細</span>
+                <el-button plain size="mini" style="margin-right: 10px" type="success"  @click="FormItemReferChange('form')">娣诲姞</el-button>
+              </div>
+              <div style="height: 190px;border: 1px solid #EBEEF5;overflow-y: auto">
+                <el-table :data="bizFormData" :show-header="false" style="width: 100%" size="mini">
+                  <el-table-column
+                    align="center"
+                    prop="name">
+                  </el-table-column>
+                  <el-table-column
+                    label="鎿嶄綔"
+                    width="60">
+                    <template slot-scope="scope">
+                      <el-button
+                        size="mini"
+                        style="color:#F56C6C;"
+                        type="text"
+                        @click.native.prevent="bizTypeDeleteRow('form',scope.$index)">
+                        绉婚櫎
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
             </el-form-item>
-            <el-form-item label="瀵瑰簲鍏崇郴锛�" label-width="110px">
-              <el-select v-model="form.relationFrom">
-                <el-option label="N" value="N"></el-option>
-                <el-option label="1" value="1"></el-option>
-              </el-select>
+            <el-form-item label="瀵瑰簲鍏崇郴锛�" label-width="110px" style="margin-bottom: 5px;">
+              <el-radio v-model="form.relationFrom" label="N">N</el-radio>
+              <el-radio v-model="form.relationFrom" label="1">1</el-radio>
             </el-form-item>
             <el-form-item label="涓荤被鍨嬶細" label-width="110px">
-              <el-input v-model="form.primitivesFrom"></el-input>
+              <el-select v-model="form.primitivesFrom">
+                <el-option v-for="(item,index) in bizFormData" :key="index" :label="item.name"
+                           :value="item.name"></el-option>
+              </el-select>
             </el-form-item>
           </div>
 
           <div class="rightForm">
-            <el-form-item label="To绔被鍨嬶細" label-width="110px">
-              <el-input v-model="form.btmItemsTo"></el-input>
+            <el-form-item label-width="100px" style="margin-bottom: 5px;">
+              <div slot="label">
+                <span>To绔被鍨嬶細</span>
+                <el-button plain size="mini" style="margin-right: 10px" type="success"  @click="FormItemReferChange('to')">娣诲姞</el-button>
+              </div>
+              <div style="height: 190px;border: 1px solid #EBEEF5;overflow-y: auto">
+                <el-table :data="bizToData" :show-header="false" style="width: 100%" size="mini">
+                  <el-table-column
+                    align="center"
+                    prop="name">
+                  </el-table-column>
+                  <el-table-column
+                    label="鎿嶄綔"
+                    width="60">
+                    <template slot-scope="scope">
+                      <el-button
+                        size="mini"
+                        style="color:#F56C6C;"
+                        type="text"
+                        @click.native.prevent="bizTypeDeleteRow('to',scope.$index)">
+                        绉婚櫎
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
             </el-form-item>
-            <el-form-item label="瀵瑰簲鍏崇郴锛�" label-width="110px">
-              <el-select v-model="form.relationTo">
-                <el-option label="N" value="N"></el-option>
-                <el-option label="1" value="1"></el-option>
-              </el-select>
+            <el-form-item label="瀵瑰簲鍏崇郴锛�" label-width="110px" style="margin-bottom: 5px;">
+              <el-radio v-model="form.relationTo" label="N">N</el-radio>
+              <el-radio v-model="form.relationTo" label="1">1</el-radio>
             </el-form-item>
             <el-form-item label="涓荤被鍨嬶細" label-width="110px">
-              <el-input v-model="form.primitivesTo"></el-input>
+              <el-select v-model="form.primitivesTo">
+                <el-option v-for="(item,index) in bizToData" :key="index" :label="item.name"
+                           :value="item.name"></el-option>
+              </el-select>
             </el-form-item>
           </div>
         </div>
       </el-form>
 
-      <div class="bottomForm">
-        <h3>灞炴�ф睜鍒楄〃</h3>
+      <div class="bottomForm" style="margin-top: 10px;">
         <avue-crud
+          size="mini"
           :data="dialogBottomData"
           :option="dialogBottomOption"
+          @row-del="dialogBottomAttrDel"
         >
           <template slot="menuLeft" slot-scope="scope">
-            <el-button icon="el-icon-plus" plain size="small" type="primary" @click="dialogAddClickHandler">澧� 鍔�
+            <h3 style="display: inline-block;margin-right: 20px;margin-bottom: 10px;">灞炴�ф睜鍒楄〃</h3>
+            <el-button icon="el-icon-plus" plain size="mini" type="primary" @click="dialogAddClickHandler">澧� 鍔�
             </el-button>
           </template>
         </avue-crud>
       </div>
       <span slot="footer" class="dialog-footer">
-         <el-button>鍙� 娑�</el-button>
-         <el-button type="primary">纭� 瀹�</el-button>
-        </span>
+         <el-button size="small" type="primary" @click="addDialogSavaHandler">纭� 瀹�</el-button>
+         <el-button size="small" @click="addDialogClose">鍙� 娑�</el-button>
+      </span>
 
       <!-- 灞炴�ф睜鍒楄〃 -->
       <el-dialog
@@ -253,18 +309,23 @@
         @close="dialogAttrClose"
       >
         <avue-crud
-          ref="dialogAttrCrud"
           :key="dialogAttrReload"
+          ref="dialogAttrCrud"
           :data="dialogAttrData"
           :option="dialogAttrOption"
+          :page.sync="attrPage"
           :table-loading="dialogAttrLoading"
           @selection-change="dialogAttrSelectChange"
           @row-click="dialogAttrRowClickHandler"
+          @size-change="attrSizeChange"
+          @current-change="attrCurrentChange"
+          @search-change="attrHandleSearch"
+          @search-reset="attrHandleReset"
         >
         </avue-crud>
         <span slot="footer" class="dialog-footer">
-         <el-button @click="dialogAttrClose">鍙� 娑�</el-button>
-         <el-button type="primary">纭� 瀹�</el-button>
+         <el-button size="small" type="primary" @click="dialogAttrAddClickHandler">纭� 瀹�</el-button>
+         <el-button size="small" @click="dialogAttrClose">鍙� 娑�</el-button>
         </span>
       </el-dialog>
     </el-dialog>
@@ -272,58 +333,210 @@
     <!-- 涓�鑷存�ф鏌� -->
     <el-dialog
       v-dialogDrag
-      :visible.sync="checkVisible"
+      :visible.sync="conCheckVisible"
       append-to-body="true"
       class="avue-dialog"
       title="涓�鑷存�ф鏌�"
       width="60%"
     >
+      <avue-crud
+        :data="conCheckData"
+        :option="conCheckOption"
+        :table-loading="conCheckLoading">
+      </avue-crud>
+      <span slot="footer" class="dialog-footer">
+         <el-button size="small" @click="conCheckVisible = false">鍙� 娑�</el-button>
+         <el-button size="small" type="primary" @click="repairClickHandler">淇� 澶�</el-button>
+        </span>
     </el-dialog>
+
+    <!-- form to 绔被鍨嬪璇濇琛ㄦ牸 -->
+    <el-dialog
+      v-dialogDrag
+      :title="bizTypeTitle === 'form' ? 'Form绔被鍨�' : 'To绔被鍨�'"
+      :visible.sync="bizTypeVisible"
+      append-to-body="true"
+      class="avue-dialog"
+      width="70%"
+    >
+      <avue-crud
+        :key="bizTypeReload"
+        ref="bizTypeCrud"
+        :data="bizTypeData"
+        :option="bizTypeOption"
+        :table-loading="bizTypeLoading"
+        @search-change="bizTypeHandleSearch"
+        @search-reset="bizTypeHandleReset"
+        @selection-change="bizTypeSelection"
+        @row-click="bizTypeRowClick">
+      </avue-crud>
+
+      <span slot="footer" class="dialog-footer">
+         <el-button size="small" type="primary" @click="bizTypeAddHandler">纭� 瀹�</el-button>
+         <el-button size="small" @click="bizTypeVisible = false">鍙� 娑�</el-button>
+        </span>
+    </el-dialog>
+
+    <!-- 瀵煎叆 -->
+    <upload-file ref="upload" :fileType="upFileType" :fileUrl="fileUrl" :tipList="tipList" title="瀵煎叆"
+                 @updata="getTreeList"></upload-file>
   </el-container>
 </template>
 
 <script>
-import {gridLink, getByAttributeNames, checkLinkType, createView} from "@/api/modeling/linkType/api";
+import {
+  gridLink,
+  getByAttributeNames,
+  checkLinkType,
+  createView,
+  getBizTypes,
+  addAndEditLink,
+  expData,
+  repairTable,
+  deleteLink
+} from "@/api/modeling/linkType/api";
 import basicOption from '@/util/basic-option'
 import {gridAttribute} from "@/api/modeling/attributePool/api";
+import func from "@/util/func";
+import {mapGetters} from "vuex";
 
 export default {
   name: "index",
   data() {
     return {
+      tipList: [
+        "瀵煎叆閾炬帴鍚嶇О涓嶅彲涓虹┖涓旈摼鎺ョ被鍨嬪悕绉板彧鑳戒负鑻辨枃瀛楁瘝",
+        "瀵煎叆鐨勬枃浠跺寘鎷睘鎬с�佷笟鍔$被鍨嬨�佺敓鍛藉懆鏈熺瓑鏂囦欢",
+        "涓婁紶鐨勬枃浠朵负鍘嬬缉鏂囦欢锛屼笖鍘嬬缉鏍煎紡浠呰兘涓簔ip鏍煎紡"
+      ],
+      upFileType: ['zip'],
+      fileUrl: 'api/linkTypeController/impData',
+      title: '',
+      bizTypeReload: null,
+      bizToData: [],
+      bizFormData: [],
+      bizTypeList: [],
+      bizTypeLoading: false,
+      bizTypeData: [],
+      bizTypeOption: {
+        ...basicOption,
+        menu: false,
+        addBtn: false,
+        index: false,
+        refreshBtn: false,
+        highlightCurrentRow: true,
+        searchMenuSpan: 8,
+        searchLabelWidth: 100,
+        calcHeight: 30,
+        header: false,
+        column: [
+          {
+            label: '涓氬姟绫诲瀷鍚�',
+            prop: 'name',
+            sortable: true,
+            search: true,
+          },
+          {
+            label: '鏍囩',
+            prop: 'label',
+            sortable: true,
+          },
+          {
+            label: '鐖剁被',
+            prop: 'fName',
+            sortable: true,
+          },
+          {
+            label: '鐗堟湰瑙勫垯',
+            prop: 'revRuleName',
+            sortable: true,
+          },
+          {
+            label: '鐢熷懡鍛ㄦ湡',
+            prop: 'lifeCycle',
+            sortable: true,
+          },
+        ]
+      },
+      bizTypeVisible: false,
+      bizTypeTitle: "",
+      conDefaultCheckData: [], // 淇濈暀涓婁釜鎺ュ彛杩斿洖鐨勬暟鎹�
+      conCheckLoading: false,
+      conCheckOption: {
+        ...basicOption,
+        menu: false,
+        addBtn: false,
+        index: false,
+        selection: false,
+        refreshBtn: false,
+        header:false,
+        column: [
+          {
+            label: '绫诲瀷鍚�',
+            prop: 'id',
+          },
+          {
+            label: '鎿嶄綔',
+            prop: 'methods',
+          },
+          {
+            label: '鐘舵��',
+            prop: 'status',
+          }
+        ]
+      },
+      conCheckData: [],
+      conCheckVisible: false,
+      attrPage: {
+        currentPage: 1,
+        pageSize: 30,
+        total: 0,
+        pageSizes: [30, 50, 100, 200],
+      },
+      searchAttrParams: {},
       dialogAttrReload: Math.random(),
       dialogAttrSelectList: [],
       dialogAttrLoading: false,
-      dialogAttrData: [], // 灞炴�ф睜鏂板琛ㄦ牸
+      dialogAttrData: [], // 灞炴�ф睜寮圭獥琛ㄦ牸
       dialogAttrOption: {
         ...basicOption,
+        calcHeight: -60,
         addBtn: false,
         menu: false,
         refreshBtn: false,
-        index:false,
+        index: false,
         highlightCurrentRow: true,
-        height:450,
+        height: 450,
+        searchMenuSpan: 8,
+        header:false,
+        selectable:function(row){
+          return row.selectable;
+        },
         column: [
           {
             label: '灞炴�у悕',
             prop: 'id',
             sortable: true,
+            search: true,
+            width:260,
           },
           {
             label: '灞炴�х被鍨�',
             prop: 'attributeDataType',
             sortable: true,
+            width:150,
           },
           {
             label: '鍒濆鍊�',
             prop: 'defaultValue',
             sortable: true,
+            width:200,
           },
           {
             label: '璇存槑',
             prop: 'description',
             sortable: true,
-            overHidden:true
+            overHidden: true
           }
         ]
       },
@@ -338,7 +551,7 @@
       form: {
         name: '', // 鍚嶇О
         tag: '', // 鏍囩
-        impClass: '', // 瀹炵幇绫�
+        implClass: '', // 瀹炵幇绫�
         shape: '', // 褰㈢姸
         description: '', // 鎻忚堪
         btmItemsFrom: '', // From绔被鍨嬪垪琛�
@@ -346,36 +559,43 @@
         primitivesFrom: '', // form绔富绫诲瀷
         btmItemsTo: '', // to绔被鍨嬪垪琛�
         relationTo: 'N', // to绔搴斿叧绯�
-        primitivesTo: '', // to绔富绫诲瀷
+        primitivesTo: '', // to绔富绫诲瀷,
+        attributes: []
       },
       dialogBottomOption: {
         ...basicOption,
         editBtn: false,
         refreshBtn: false,
         selection: false,
-        height: 300,
+        height: 220,
+        menuWidth:100,
         addBtn: false,
-        delBtn: false,
+        gridBtn:false,
+        columnBtn:false,
         // index:false,
         column: [
           {
             label: '灞炴�у悕',
             prop: 'id',
             sortable: true,
+            width:260,
           },
           {
             label: '灞炴�х被鍨�',
             prop: 'attributeDataType',
             sortable: true,
+            width:150,
           },
           {
             label: '鍒濆鍊�',
             prop: 'defaultValue',
             sortable: true,
+            width:200,
           },
           {
             label: '璇存槑',
             prop: 'description',
+            overHidden: true
           }
         ]
       },
@@ -402,32 +622,37 @@
         // index:false,
         addBtn: false,
         menu: false,
+        calcHeight: -30,
         column: [
           {
             label: '灞炴�у悕',
             prop: 'id',
             sortable: true,
+            width:260,
           },
           {
             label: '灞炴�х被鍨�',
             prop: 'attributeDataType',
             sortable: true,
+            width:150,
           },
           {
             label: '鍒濆鍊�',
             prop: 'defaultValue',
             sortable: true,
+            width:200,
           },
           {
             label: '璇存槑',
             prop: 'description',
+            overHidden: true
           }
         ]
       },
       nodeRow: {},
       descriptionOption: {
         labelStyle: 'text-align:center;width:120px',
-        contentStyle: 'width:240px;text-align:center;word-break;break-all;'
+        contentStyle: 'width:240px;text-align:center;word-break:break-all;'
       },
       icons: {
         id: 'el-icon-finished',
@@ -439,13 +664,26 @@
         main: 'el-icon-warning-outline',
         desc: 'el-icon-chat-line-square'
       },
+      bizLastIndex: null,
+      attrLastIndex: null
     }
   },
   created() {
     this.getTreeList();
   },
-  mounted() {
-
+  computed:{
+    ...mapGetters(["permission"]),
+    permissionList() {
+      return {
+        addBtn: this.vaildData(this.permission[this.$route.query.id].ADD, false),
+        delBtn: this.vaildData(this.permission[this.$route.query.id].DELETE, false),
+        editBtn: this.vaildData(this.permission[this.$route.query.id].EDIT, false),
+        exportBtn: this.vaildData(this.permission[this.$route.query.id].EXPORT, false),
+        importBtn: this.vaildData(this.permission[this.$route.query.id].IMPORT, false),
+        consistencyCheckBtn: this.vaildData(this.permission[this.$route.query.id].USE, false),
+        createViewBtn: this.vaildData(this.permission[this.$route.query.id].ADD2, false),
+      };
+    },
   },
   methods: {
     // 鏍憃nLoad璇锋眰
@@ -454,13 +692,17 @@
         const data = res.data.data;
         this.treeData = data;
         this.tableLoading = false;
-      }).catch(err => {
-        this.$message.error(err)
-      });
+      })
+    },
+
+    // 瀵煎叆
+    upLoadClickHandler() {
+      this.$refs.upload.visible = true;
     },
 
     // 鏍戠偣鍑讳簨浠�
     nodeClick(row) {
+      console.log(row);
       this.nodeRow = row;
       this.getAttrPollData(row); // 鑾峰彇灞炴�ф睜鍒楄〃
     },
@@ -475,18 +717,145 @@
       })
     },
 
+    // 鍒犻櫎鎸夐挳
+    deleteClickHandler() {
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�');
+        return;
+      }
+      ;
+      this.$confirm('鎮ㄧ‘瀹氳鍒犻櫎鎵�閫夋嫨鐨勬暟鎹悧锛�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteLink(this.nodeRow).then(res => {
+          if (res.data.code === 200) {
+            this.$message.success('鍒犻櫎鎴愬姛');
+            this.getTreeList();
+          }
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+
     // 鍒涘缓鎸夐挳
     addClickHandler() {
+      this.visible = true;
+      this.title = 'add';
+    },
+
+    // 缂栬緫鎸夐挳
+    editClickHandler() {
+      this.title = 'edit';
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�');
+        return;
+      }
+      this.form = {...this.nodeRow}; // 娴呮嫹璐� 瑙e喅寮曠敤澶嶅埗
+      console.log(this.nodeRow);
+      this.bizFormData = this.form.btmItemsFrom.length > 0 && this.form.btmItemsFrom.map(item => {
+        return {
+          name: item
+        };
+      });
+
+      this.bizToData = this.form.btmItemsTo.length > 0 && this.form.btmItemsTo.map(item => {
+        return {
+          name: item
+        };
+      });
+
+      if (this.form.attributes.length > 0) {
+        let value = this.form.attributes.join(',');
+        getByAttributeNames({attrNames: value}).then(res => {
+          if (res.data.code === 200) {
+            this.dialogBottomData = res.data.data;
+          }
+        })
+      }
       this.visible = true;
     },
 
     // 涓�鑷存�ф鏌�
     checkClickHandler() {
-      this.checkVisible = true;
       checkLinkType().then(res => {
+        if (res && res.data && res.data.data) {
+          this.conCheckVisible = true;
+          this.conCheckLoading = true;
+          if (res.data.code === 200) {
+            const data = res.data.data;
+            this.conDefaultCheckData = data; // 淇濈暀涓�浠藉師濮嬫暟鎹�
+            this.conCheckLoading = false;
 
+            const outputData = [];
+
+            data.forEach(item => {
+              Object.entries(item.btmCheckMap).forEach(([id, methodsArray]) => {
+                methodsArray.forEach(methods => {
+                  // 鍒ゆ柇鍓嶇紑
+                  const action = methods.startsWith('F_') ? '绉婚櫎form绔笟鍔$被鍨�' : '绉婚櫎to绔笟鍔$被鍨�';
+                  const detail = methods.split('_')[1]; // 鑾峰彇 _ 鍚庨潰鐨勫唴瀹�
+                  outputData.push({
+                    id: id,
+                    methods: `${action}:${detail}`,
+                    status: '鏈慨澶�'
+                  });
+                });
+              });
+
+              // 澶勭悊 dbCheckMap
+              Object.entries(item.dbCheckMap).forEach(([id, methods]) => {
+                const splitMethods = methods.split('(');
+                // 鍒ゆ柇绗竴涓鍙峰墠闈㈢殑鍊�
+                if (splitMethods[0].startsWith('_ADD')) {
+                  outputData.push({
+                    id: id,
+                    methods: '澧炲姞鍒�(' + splitMethods[0].slice(0, -1) + ')', // 缁撴潫浣嶇疆鍑忓幓)鐨勫瓧绗�
+                    status: '鏈慨澶�'
+                  });
+                } else if (splitMethods[0].startsWith('_CREATE')) {
+                  outputData.push({
+                    id: id,
+                    methods: '鍒涘缓琛�(' + splitMethods[0].slice(0, -1) + ')',
+                    status: '鏈慨澶�'
+                  });
+                } else if (splitMethods[0].startsWith('_DROP')) {
+                  outputData.push({
+                    id: id,
+                    methods: '绉婚櫎鍒�(' + splitMethods[0].slice(0, -1) + ')',
+                    status: '鏈慨澶�'
+                  });
+                } else {
+                  this.$message.error("涓嶆敮鎸佺殑 dbCheckMap 绫诲瀷锛� " + methods)
+                }
+              });
+            });
+            this.conCheckData = outputData;
+          }
+        } else {
+          this.$message.success(res.data.msg);
+        }
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err);
+      })
+    },
+
+    // 淇涓�鑷存�ф鏌�
+    repairClickHandler() {
+      const params = this.conDefaultCheckData[0];
+      repairTable(params).then(res => {
+        if (func.isEmptyObject(res.data.obj[0])) {
+          this.$message.success('淇鎴愬姛');
+          this.conCheckData = [];
+        } else {
+          this.$message.error('淇澶辫触锛岃閲嶆柊灏濊瘯锛�');
+        }
+        this.conCheckVisible = false;
       })
     },
 
@@ -496,8 +865,10 @@
       createView().then(res => {
         if (res.data.code === 200) {
           this.createViewLoading = false;
-          this.$message.success(res.data.obj)
+          this.$message.success(res.data.obj);
         }
+      }).catch(err => {
+        this.createViewLoading = false;
       })
     },
 
@@ -506,12 +877,21 @@
       this.dialogAttrLoading = true;
       this.attrPollDialogVisible = true;
       this.dialogAttrReload = Math.random(); // 寮哄埗鍒锋柊琛ㄦ牸 瑙e喅琛ㄦ牸閿欒
-      gridAttribute(1, -1, this.searchParams).then(res => {
-        const data = res.data.data;
+      this.getAttrDialogDta();
+    },
+
+    // 鏌ヨ灞炴�ф睜鍒楄〃鏁版嵁
+    getAttrDialogDta() {
+      gridAttribute(this.attrPage.currentPage, this.attrPage.pageSize, this.searchAttrParams).then(res => {
+        const data = res.data.data.map(item=>{
+          item.selectable=!this.dialogBottomData.some(existingItem => existingItem.id === item.id);
+          return item;
+        });
         this.dialogAttrData = data;
+        this.attrPage.total = res.data.total;
         this.dialogAttrLoading = false;
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err);
       });
     },
 
@@ -522,12 +902,250 @@
 
     // 娣诲姞灞炴�ф睜 琛岀偣鍑�
     dialogAttrRowClickHandler(row) {
-      this.$refs.dialogAttrCrud.toggleRowSelection(row);
+      if(!row.selectable){
+        return;
+      }
+      func.rowClickHandler(
+        row,
+        this.$refs.dialogAttrCrud,
+        this.attrLastIndex,
+        (newIndex) => {
+          this.attrLastIndex = newIndex;
+        },
+        () => {
+          this.dialogAttrSelectList = [row];
+        }
+      );
     },
 
     // 娣诲姞灞炴�ф睜 鍏抽棴瀵硅瘽妗�
-    dialogAttrClose(){
+    dialogAttrClose() {
       this.attrPollDialogVisible = false;
+      this.searchAttrParams = {};
+    },
+
+    // 娓呯┖form琛ㄥ崟
+    resetForm() {
+      const form = {
+        name: '', // 鍚嶇О
+        tag: '', // 鏍囩
+        implClass: '', // 瀹炵幇绫�
+        shape: '', // 褰㈢姸
+        description: '', // 鎻忚堪
+        btmItemsFrom: '', // From绔被鍨嬪垪琛�
+        relationFrom: 'N', // form绔搴斿叧绯�
+        primitivesFrom: '', // form绔富绫诲瀷
+        btmItemsTo: '', // to绔被鍨嬪垪琛�
+        relationTo: 'N', // to绔搴斿叧绯�
+        primitivesTo: '', // to绔富绫诲瀷
+      };
+      this.form = form;
+      this.$refs.form.resetFields();
+      this.bizFormData = [];
+      this.bizToData = [];
+      this.dialogBottomData = [];
+    },
+
+    // 娣诲姞灞炴�ф睜 淇濆瓨
+    dialogAttrAddClickHandler() {
+      this.dialogAttrSelectList.forEach(item => {
+        this.dialogBottomData.push({
+          id: item.id,
+          attributeDataType: item.attributeDataType,
+          defaultValue: item.defaultValue,
+          description: item.description
+        });
+      });
+      this.attrPollDialogVisible = false;
+    },
+
+    //娣诲姞灞炴�ф睜 鏉℃暟
+    attrSizeChange(val) {
+      this.attrPage.pageSize = val;
+      this.getAttrDialogDta()
+    },
+
+    //娣诲姞灞炴�ф睜 椤电爜
+    attrCurrentChange(val) {
+      this.attrPage.currentPage = val;
+      this.getAttrDialogDta();
+    },
+
+    //娣诲姞灞炴�ф睜 鎼滅储
+    attrHandleSearch(params, done) {
+      if (func.isEmptyObject(params)) {
+        this.searchAttrParams = {};
+      } else {
+        this.searchAttrParams = {
+          "conditionMap[id]": "*" + params.id + "*"
+        };
+      }
+      this.getAttrDialogDta();
+      done();
+    },
+
+    //娣诲姞灞炴�ф睜 娓呯┖鎼滅储
+    attrHandleReset() {
+      this.searchAttrParams = {};
+      this.getAttrDialogDta();
+    },
+
+    // 灞炴�ф睜鍒犻櫎
+    dialogBottomAttrDel(form, index) {
+      this.dialogBottomData.splice(index, 1);
+    },
+
+    // 鍒涘缓 缂栬緫 瀵硅瘽妗嗗叧闂�
+    addDialogClose() {
+      this.visible = false;
+      this.dialogBottomData = [];
+      this.resetForm();
+    },
+
+    // form to 绫诲瀷blur鍙傜収瀵硅瘽妗�
+    FormItemReferChange(val) {
+      this.bizTypeTitle = val;
+      this.bizTypeLoading = true;
+      this.getBizTypeHandler();
+      this.bizTypeVisible = true;
+      this.bizTypeReload = Math.random(); // 寮哄埗鍒锋柊琛ㄦ牸 瑙e喅琛ㄦ牸閿欒
+    },
+
+    // form to 绫诲瀷琛ㄦ牸鏌ヨ
+    getBizTypeHandler(params) {
+      getBizTypes(params).then(res => {
+        if (res.data.code === 200) {
+          const data = res.data.data;
+          this.bizTypeData = data;
+          this.bizTypeLoading = false;
+        }
+      })
+    },
+
+    // form to 绫诲瀷閫夋嫨妗�
+    bizTypeSelection(row) {
+      this.bizTypeList = row;
+    },
+
+    // form to 绫诲瀷琛岀偣鍑�
+    bizTypeRowClick(row) {
+      func.rowClickHandler(
+        row,
+        this.$refs.bizTypeCrud,
+        this.bizLastIndex,
+        (newIndex) => {
+          this.bizLastIndex = newIndex;
+        },
+        () => {
+          this.bizTypeList = [row];
+        }
+      );
+    },
+
+    // form to 绫诲瀷淇濆瓨
+    bizTypeAddHandler() {
+      if (this.bizTypeList.length === 0) {
+        this.$message.error('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�');
+        return;
+      }
+
+      const data = this.bizTypeList.map(item => ({name: item.name}));
+
+      const dataName = this.bizTypeTitle === 'form' ? 'bizFormData' : 'bizToData';
+
+      let hasDuplicate = false;
+      // 鍏堝垱寤轰竴涓复鏃舵暟缁勬潵瀛樺偍涓嶉噸澶嶇殑椤�
+      const newItems = [];
+      this.bizTypeList.forEach(item => {
+        const exists = this[dataName].some(existingItem => existingItem.name === item.name);
+
+        if (exists) {
+          hasDuplicate = true;
+          return;
+        }
+
+        // 濡傛灉娌℃湁閲嶅椤癸紝鍒欏皢璇ラ」娣诲姞鍒颁复鏃舵暟缁勪腑
+        newItems.push({
+          name: item.name,
+        });
+      });
+
+      if (hasDuplicate) {
+        this.$message.error('璇锋鏌ユ槸鍚︽湁娣诲姞閲嶅椤癸紒');
+      } else {
+        // 濡傛灉娌℃湁閲嶅椤癸紝灏嗘柊椤规坊鍔犲埌 dialogBottomData
+        this[dataName].push(...newItems);
+        this.bizTypeVisible = false;
+      }
+    },
+
+    // form to 绫诲瀷鎼滅储
+    bizTypeHandleSearch(params, done) {
+      console.log(params);
+      let obj = {
+        btmName: params.name
+      };
+      this.getBizTypeHandler(obj);
+
+      done();
+    },
+
+    // form to 绫诲瀷閲嶇疆
+    bizTypeHandleReset() {
+      this.getBizTypeHandler();
+    },
+
+    // form to 绔〃鏍肩Щ闄�
+    bizTypeDeleteRow(val, index) {
+      const dataName = val === 'form' ? 'bizFormData' : 'bizToData';
+      const primitivesName = val === 'form' ? 'primitivesFrom' : 'primitivesTo';
+
+      this[dataName].splice(index, 1);
+
+      if (this[dataName].length === 0) {
+        this.form[primitivesName] = "";
+      }
+    },
+
+    // 鍒涘缓缂栬緫 淇濆瓨
+    addDialogSavaHandler() {
+      if (this.bizFormData.length <= 0 || this.bizToData.length <= 0) {
+        this.$message.error('form绔笟鍔$被鍨嬪拰to绔被鍨嬪潎涓嶈兘涓虹┖锛�')
+        return;
+      }
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.form.btmItemsFrom = this.bizFormData.map(item => item.name);
+          this.form.btmItemsTo = this.bizToData.map(item => item.name);
+          this.form.attributes = this.dialogBottomData.map(item => item.id);
+          let flag = this.title === 'add' ? true : false;
+          addAndEditLink(flag, this.form).then(res => {
+            if (res.data.code === 200) {
+              this.visible = false;
+              this.$message.success(res.data.msg);
+              this.resetForm();
+              this.getTreeList();
+            }
+          });
+        } else {
+          return false;
+        }
+      });
+    },
+
+    // 瀵煎嚭
+    exportClickHandler() {
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�');
+        return;
+      }
+      let name = this.nodeRow.name;
+      expData({name: name}).then(res => {
+        func.downloadFileByBlobHandler(res);
+        this.$message.success('瀵煎嚭鎴愬姛');
+      }).catch(err => {
+        this.$message.error(err);
+      });
     }
   }
 }
@@ -542,39 +1160,32 @@
   .el-form-item .el-select {
     width: 100%;
   }
-}
-
-.headerCon {
-  display: flex;
-  flex-wrap: wrap;
-  margin-bottom: 5px;
-
-  .el-button + .el-button {
-    margin-left: 5px;
+  .el-tag{
+    line-height:22px;
+    height: 24px;
   }
-
-  .el-button {
-    margin-top: 5px;
-  }
-}
-
-.headerCon > .el-button:nth-child(4) {
-  margin-left: 0;
-}
-
-.headerCon > .el-button:nth-child(7) {
-  margin-left: 0;
 }
 
 .dialogForm {
   display: flex;
-  justify-content: space-around;
+  justify-content: space-between;
 }
 
 .dialogForm > div {
-  width: 28%;
-  border: 1px solid #eee;
-  padding: 25px 20px 5px 10px; /* 涓� 鍙� 涓� 宸� */
-  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2); /* 娣诲姞闃村奖鏁堟灉 */
+  width: 31%;
+  border: 1px solid #EBEEF5;
+  border-radius: 2px;
+  padding: 15px 20px 0 10px; /* 涓� 鍙� 涓� 宸� */
+  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); /* 娣诲姞闃村奖鏁堟灉 */
+}
+
+.leftForm {
+  width: 28% !important;
+}
+
+.smallBtn {
+  width: 82px !important;
+  text-align: center !important;
+  padding-left: 0px !important;
 }
 </style>

--
Gitblit v1.9.3