| <template> | 
|   <!-- 2021.11.18移除voltable方法@cell-mouse-leave="rowEndEdit" --> | 
|   <div | 
|     class="vol-table" | 
|     :class="[ | 
|       textInline ? 'text-inline' : '', | 
|       fxRight ? 'fx-right' : '', | 
|       isChrome ? 'chrome' : '', | 
|     ]" | 
|   > | 
|     <div class="mask" v-show="loading"></div> | 
|     <div class="message" v-show="loading">加载中.....</div> | 
|     <el-table | 
|       :show-summary="summary" | 
|       :summary-method="getSummaryData" | 
|       :row-key="rowKey" | 
|       :key="randomTableKey" | 
|       lazy | 
|       stripe | 
|       :load="loadTreeChildren" | 
|       @select="userSelect" | 
|       @select-all="userSelect" | 
|       @selection-change="selectionChange" | 
|       @row-dblclick="rowDbClick" | 
|       @row-click="rowClick" | 
|       @header-click="headerClick" | 
|       :highlight-current-row="highlightCurrentRow" | 
|       ref="table" | 
|       class="v-table" | 
|       @sort-change="sortChange" | 
|       tooltip-effect="dark" | 
|       :height="realHeight" | 
|       :max-height="realMaxHeight" | 
|       :data="url ? rowData : tableData" | 
|       border | 
|       :row-class-name="initIndex" | 
|       :cell-style="getCellStyle" | 
|       style="width: 100%" | 
|       :scrollbar-always-on="true" | 
|     > | 
|       <el-table-column | 
|         v-if="ck" | 
|         type="selection" | 
|         :fixed="fixed" | 
|         :selectable="selectable" | 
|         width="55" | 
|       ></el-table-column> | 
|       <el-table-column | 
|         v-if="columnIndex" | 
|         type="index" | 
|         :fixed="fixed" | 
|         width="55" | 
|       ></el-table-column> | 
|   | 
|       <!-- 2020.10.10移除table第一行强制排序 --> | 
|       <el-table-column | 
|         v-for="(column, cindex) in filterColumns" | 
|         :prop="column.field" | 
|         :label="column.title" | 
|         :min-width="column.width" | 
|         :formatter="formatter" | 
|         :fixed="column.fixed" | 
|         :key="column.field + cindex" | 
|         :align="column.align" | 
|         :sortable="column.sort ? 'custom' : false" | 
|         :show-overflow-tooltip="true" | 
|       > | 
|         <template #header> | 
|           <span | 
|             v-if="(column.require || column.required) && column.edit" | 
|             class="column-required" | 
|             >*</span | 
|           >{{ column.title }} | 
|         </template> | 
|   | 
|         <template #default="scope"> | 
|           <!-- 2022.01.08增加多表头,现在只支持常用功能渲染,不支持编辑功能(涉及到组件重写) --> | 
|           <el-table-column | 
|             style="border: none" | 
|             v-for="columnChildren in filterChildrenColumn(column.children)" | 
|             :key="columnChildren.field" | 
|             :min-width="columnChildren.width" | 
|             :class-name="columnChildren.class" | 
|             :prop="columnChildren.field" | 
|             :align="columnChildren.align" | 
|             :label="columnChildren.title" | 
|           > | 
|             <template #default="scopeChildren"> | 
|               <a | 
|                 href="javascript:void(0)" | 
|                 style="text-decoration: none" | 
|                 @click="link(scopeChildren.row, columnChildren, $event)" | 
|                 v-if="column.link" | 
|                 v-text="scopeChildren.row[columnChildren.field]" | 
|               ></a> | 
|               <div | 
|                 v-else-if="columnChildren.formatter" | 
|                 @click=" | 
|                   columnChildren.click && | 
|                     columnChildren.click( | 
|                       scopeChildren.row, | 
|                       columnChildren, | 
|                       scopeChildren.$index | 
|                     ) | 
|                 " | 
|                 v-html=" | 
|                   columnChildren.formatter( | 
|                     scopeChildren.row, | 
|                     columnChildren, | 
|                     scopeChildren.$index | 
|                   ) | 
|                 " | 
|               ></div> | 
|               <div v-else-if="column.bind"> | 
|                 {{ formatter(scopeChildren.row, columnChildren, true) }} | 
|               </div> | 
|               <span v-else-if="column.type == 'date'">{{ | 
|                 formatterDate(scopeChildren.row, columnChildren) | 
|               }}</span> | 
|               <template v-else> | 
|                 {{ scopeChildren.row[columnChildren.field] }} | 
|               </template> | 
|             </template> | 
|           </el-table-column> | 
|           <!-- 2020.06.18增加render渲染自定义内容 --> | 
|           <table-render | 
|             v-if="column.render && typeof column.render == 'function'" | 
|             :row="scope.row" | 
|             key="rd-01" | 
|             :index="scope.$index" | 
|             :column="column" | 
|             :render="column.render" | 
|           ></table-render> | 
|           <!-- 启用双击编辑功能,带编辑功能的不会渲染下拉框文本背景颜色 --> | 
|           <!-- @click="rowBeginEdit(scope.$index,cindex)" --> | 
|           <!-- 2021.09.21增加编辑时对readonly属性判断 --> | 
|           <template | 
|             v-else-if=" | 
|               column.edit && | 
|               !column.readonly && | 
|               ['file', 'img', 'excel'].indexOf(column.edit.type) != -1 | 
|             " | 
|           > | 
|             <div style="display: flex; align-items: center" @click.stop> | 
|               <i | 
|                 style=" | 
|                   padding: 3px; | 
|                   margin-right: 10px; | 
|                   color: #8f9293; | 
|                   cursor: pointer; | 
|                 " | 
|                 @click="showUpload(scope.row, column)" | 
|                 class="el-icon-upload" | 
|               ></i> | 
|               <img | 
|                 v-show="column.edit.type == 'img'" | 
|                 v-for="(file, imgIndex) in getFilePath( | 
|                   scope.row[column.field], | 
|                   column | 
|                 )" | 
|                 :key="imgIndex" | 
|                 :onerror="defaultImg" | 
|                 @click="viewImg(scope.row, column, file.path, $event)" | 
|                 class="table-img" | 
|                 :src="file.path" | 
|               /> | 
|               <a | 
|                 style="margin-right: 8px" | 
|                 v-show="column.edit.type != 'img'" | 
|                 class="t-file" | 
|                 v-for="(file, fIndex) in getFilePath( | 
|                   scope.row[column.field], | 
|                   column | 
|                 )" | 
|                 :key="fIndex" | 
|                 @click="dowloadFile(file)" | 
|                 >{{ file.name }}</a | 
|               > | 
|             </div> | 
|           </template> | 
|           <div | 
|             v-else-if=" | 
|               column.edit && | 
|               !column.readonly && | 
|               (column.edit.keep || edit.rowIndex == scope.$index) | 
|             " | 
|             class="edit-el" | 
|           > | 
|             <div @click.stop class="e-item"> | 
|               <div> | 
|                 <!-- 2020.07.24增加日期onChange事件 --> | 
|                 <el-date-picker | 
|                   clearable | 
|                   size="default" | 
|                   style="width: 100%" | 
|                   v-if="['date', 'datetime'].indexOf(column.edit.type) != -1" | 
|                   v-model="scope.row[column.field]" | 
|                   @change=" | 
|                     (val) => { | 
|                       column.onChange && | 
|                         column.onChange(scope.row, column, val); | 
|                     } | 
|                   " | 
|                   :type="column.edit.type" | 
|                   :placeholder="column.placeholder || column.title" | 
|                   :disabledDate="(val) => getDateOptions(val, column)" | 
|                   :value-format="getDateFormat(column)" | 
|                   :disabled="initColumnDisabled(scope.row, column)" | 
|                 > | 
|                 </el-date-picker> | 
|                 <el-time-picker | 
|                   clearable | 
|                   size="default" | 
|                   style="width: 100%" | 
|                   v-else-if="column.edit.type == 'time'" | 
|                   v-model="scope.row[column.field]" | 
|                   @change=" | 
|                     (val) => { | 
|                       column.onChange && | 
|                         column.onChange(scope.row, column, val); | 
|                     } | 
|                   " | 
|                   :placeholder="column.placeholder || column.title" | 
|                   :value-format="column.format || 'HH:mm:ss'" | 
|                   :disabled="initColumnDisabled(scope.row, column)" | 
|                 > | 
|                 </el-time-picker> | 
|                 <el-switch | 
|                   v-else-if="column.edit.type == 'switch'" | 
|                   v-model="scope.row[column.field]" | 
|                   active-color="#0f84ff" | 
|                   inactive-color="rgb(194 194 194)" | 
|                   @change=" | 
|                     (val) => { | 
|                       switchChange(val, scope.row, column); | 
|                     } | 
|                   " | 
|                   :active-value=" | 
|                     typeof scope.row[column.field] == 'boolean' | 
|                       ? true | 
|                       : typeof scope.row[column.field] == 'string' | 
|                       ? '1' | 
|                       : 1 | 
|                   " | 
|                   :inactive-value=" | 
|                     typeof scope.row[column.field] == 'boolean' | 
|                       ? false | 
|                       : typeof scope.row[column.field] == 'string' | 
|                       ? '0' | 
|                       : 0 | 
|                   " | 
|                   :disabled="initColumnDisabled(scope.row, column)" | 
|                 > | 
|                 </el-switch> | 
|                 <template | 
|                   v-else-if=" | 
|                     ['select', 'selectList'].indexOf(column.edit.type) != -1 | 
|                   " | 
|                 > | 
|                   <el-select-v2 | 
|                     style="width: 100%" | 
|                     :size="size" | 
|                     v-if="column.bind.data.length >= select2Count" | 
|                     v-model="scope.row[column.field]" | 
|                     filterable | 
|                     :multiple="column.edit.type == 'select' ? false : true" | 
|                     :placeholder="column.placeholder || column.title" | 
|                     :autocomplete="column.autocomplete" | 
|                     :options="column.bind.data" | 
|                     @change=" | 
|                       column.onChange && column.onChange(scope.row, column) | 
|                     " | 
|                     clearable | 
|                     :disabled="initColumnDisabled(scope.row, column)" | 
|                   > | 
|                     <template #default="{ item }"> | 
|                       {{ item.label }} | 
|                     </template> | 
|                   </el-select-v2> | 
|   | 
|                   <el-select | 
|                     size="default" | 
|                     style="width: 100%" | 
|                     v-else | 
|                     v-model="scope.row[column.field]" | 
|                     :filterable=" | 
|                       column.filter || column.bind.data.length > 10 | 
|                         ? true | 
|                         : false | 
|                     " | 
|                     :multiple="column.edit.type == 'select'" | 
|                     :placeholder="column.placeholder || column.title" | 
|                     :autocomplete="column.autocomplete" | 
|                     @change=" | 
|                       column.onChange && column.onChange(scope.row, column) | 
|                     " | 
|                     clearable | 
|                     :disabled="initColumnDisabled(scope.row, column)" | 
|                   > | 
|                     <el-option | 
|                       v-for="item in column.bind.data" | 
|                       :key="item.key" | 
|                       v-show="!item.hidden" | 
|                       :disabled="item.disabled" | 
|                       :label="item.value" | 
|                       :value="item.key" | 
|                       >{{ item.value }} | 
|                     </el-option> | 
|                   </el-select> | 
|                 </template> | 
|                 <el-input | 
|                   v-else-if="column.edit.type == 'textarea'" | 
|                   type="textarea" | 
|                   :placeholder="column.placeholder || column.title" | 
|                   v-model="scope.row[column.field]" | 
|                   :disabled="initColumnDisabled(scope.row, column)" | 
|                 > | 
|                 </el-input> | 
|                 <input | 
|                   class="table-input" | 
|                   v-else-if="!column.summary && !column.onKeyPress" | 
|                   v-model.lazy="scope.row[column.field]" | 
|                   :disabled="initColumnDisabled(scope.row, column)" | 
|                 /> | 
|                 <el-input | 
|                   v-else | 
|                   @change="inputKeyPress(scope.row, column, $event)" | 
|                   @input="inputKeyPress(scope.row, column, $event)" | 
|                   @keyup.enter="inputKeyPress(scope.row, column, $event)" | 
|                   size="default" | 
|                   v-model="scope.row[column.field]" | 
|                   :placeholder="column.placeholder || column.title" | 
|                   :disabled="initColumnDisabled(scope.row, column)" | 
|                 ></el-input> | 
|               </div> | 
|               <div | 
|                 class="extra" | 
|                 v-if="column.extra && edit.rowIndex == scope.$index" | 
|               > | 
|                 <a | 
|                   :style="column.extra.style" | 
|                   style="text-decoration: none" | 
|                   @click="extraClick(scope.row, column)" | 
|                 > | 
|                   <i v-if="column.extra.icon" :class="[column.extra.icon]" /> | 
|                   {{ column.extra.text }} | 
|                 </a> | 
|               </div> | 
|             </div> | 
|           </div> | 
|           <!--没有编辑功能的直接渲染标签--> | 
|           <template v-else> | 
|             <a | 
|               href="javascript:void(0)" | 
|               style="text-decoration: none" | 
|               @click="link(scope.row, column, $event)" | 
|               v-if="column.link" | 
|               v-text="scope.row[column.field]" | 
|             ></a> | 
|             <img | 
|               v-else-if="column.type == 'img'" | 
|               v-for="(file, imgIndex) in getFilePath( | 
|                 scope.row[column.field], | 
|                 column | 
|               )" | 
|               :key="imgIndex" | 
|               :onerror="defaultImg" | 
|               @click="viewImg(scope.row, column, file.path, $event)" | 
|               class="table-img" | 
|               :src="file.path" | 
|             /> | 
|             <a | 
|               style="margin-right: 8px" | 
|               v-else-if="column.type == 'file' || column.type == 'excel'" | 
|               class="t-file" | 
|               v-for="(file, fIndex) in getFilePath( | 
|                 scope.row[column.field], | 
|                 column | 
|               )" | 
|               :key="fIndex" | 
|               @click="dowloadFile(file)" | 
|               >{{ file.name }}</a | 
|             > | 
|             <span v-else-if="column.type == 'date'">{{ | 
|               formatterDate(scope.row, column) | 
|             }}</span> | 
|             <div | 
|               v-else-if="column.formatter" | 
|               @click="formatterClick(scope.row, column, $event)" | 
|               v-html="column.formatter(scope.row, column)" | 
|             ></div> | 
|             <!-- 2021.11.18修复table数据源设置为normal后点击行$event缺失的问题 --> | 
|             <div | 
|               v-else-if="column.bind && (column.normal || column.edit)" | 
|               @click="formatterClick(scope.row, column, $event)" | 
|               :style="column.getStyle && column.getStyle(scope.row, column)" | 
|             > | 
|               {{ formatter(scope.row, column, true) }} | 
|             </div> | 
|             <div | 
|               v-else-if="column.click && !column.bind" | 
|               @click="formatterClick(scope.row, column)" | 
|             > | 
|               {{ scope.row[column.field] }} | 
|             </div> | 
|             <div | 
|               @click=" | 
|                 () => { | 
|                   column.click && formatterClick(scope.row, column); | 
|                 } | 
|               " | 
|               v-else-if="column.bind" | 
|             > | 
|               <el-tag | 
|                 v-if="useTag" | 
|                 :class="[isEmptyTag(scope.row, column)]" | 
|                 :type="getColor(scope.row, column)" | 
|                 :effect="column.effect" | 
|                 >{{ formatter(scope.row, column, true) }}</el-tag | 
|               > | 
|               <template v-else>{{ | 
|                 formatter(scope.row, column, true) | 
|               }}</template> | 
|             </div> | 
|   | 
|             <span v-else>{{ formatter(scope.row, column, true) }}</span> | 
|           </template> | 
|         </template> | 
|       </el-table-column> | 
|     </el-table> | 
|     <template v-if="!paginationHide"> | 
|       <div class="block pagination" key="pagination-01" style="display: flex"> | 
|         <div style="flex: 1"></div> | 
|         <el-pagination | 
|           key="pagination-02" | 
|           @size-change="handleSizeChange" | 
|           @current-change="handleCurrentChange" | 
|           :current-page="paginations.page" | 
|           :page-sizes="paginations.sizes" | 
|           :page-size="paginations.size" | 
|           layout="total, sizes, prev, pager, next, jumper" | 
|           :total="paginations.total" | 
|         ></el-pagination> | 
|       </div> | 
|     </template> | 
|   </div> | 
|   | 
|   <VolBox | 
|     v-model="uploadModel" | 
|     title="上传" | 
|     :height="228" | 
|     :width="500" | 
|     :padding="15" | 
|     lazy | 
|   > | 
|     <!-- 上传图片、excel或其他文件、文件数量、大小限制都可以,参照volupload组件api --> | 
|     <div style="height: 200px; display: flex; align-items: center"> | 
|       <VolUpload | 
|         style="text-align: center" | 
|         :autoUpload="currentColumn.edit.autoUpload" | 
|         :multiple="currentColumn.edit.multiple" | 
|         :url="uploadUrl" | 
|         :max-file="currentColumn.edit.maxFile" | 
|         :img="currentColumn.edit.type == 'img'" | 
|         :excel="currentColumn.edit.type == 'excel'" | 
|         :fileTypes=" | 
|           currentColumn.edit.fileTypes ? currentColumn.edit.fileTypes : [] | 
|         " | 
|         :fileInfo="fileInfo" | 
|         :upload-after="uploadAfter" | 
|       > | 
|         <div>{{ currentColumn.message }}</div> | 
|       </VolUpload> | 
|     </div> | 
|     <template #footer> | 
|       <div style="text-align: center"> | 
|         <el-button type="default" size="small" @click="uploadModel = false" | 
|           >关闭</el-button | 
|         > | 
|         <el-button type="primary" size="small" @click="saveUpload" | 
|           >保存</el-button | 
|         > | 
|       </div> | 
|     </template> | 
|   </VolBox> | 
| </template> | 
| <script> | 
| import VolTableRender from "./VolTable/VolTableRender"; | 
| let _errMsg; | 
| import { defineComponent, defineAsyncComponent } from "vue"; | 
| export default defineComponent({ | 
|   //https://github.com/element-plus/element-plus/issues/1483 | 
|   //没有原先的selection属性了,看issue上使用select/selectall获取 | 
|   //监听数组长度,如果删除了数据,现在只能被迫清除所有选中的行 | 
|   watch: { | 
|     "tableData.length": { | 
|       handler(newLen, oldLen) { | 
|         this.watchRowSelectChange(newLen, oldLen); | 
|       }, | 
|     }, | 
|     "rowData.length": { | 
|       handler(newLen, oldLen) { | 
|         this.watchRowSelectChange(newLen, oldLen); | 
|       }, | 
|     }, | 
|   }, | 
|   components: { | 
|     "table-render": VolTableRender, | 
|     VolUpload: defineAsyncComponent(() => | 
|       import("@/components/basic/VolUpload.vue") | 
|     ), | 
|     VolBox: defineAsyncComponent(() => import("@/components/basic/VolBox.vue")), | 
|   }, | 
|   props: { | 
|     rowKey: { | 
|       // 树形结构的主键字段,如果设置值默认会开启树形table;注意rowKey字段的值必须是唯一(2021.05.02) | 
|       typeof: String, | 
|       default: undefined, | 
|     }, | 
|     loadTreeChildren: { | 
|       // 树形结构加载子节点 | 
|       type: Function, | 
|       default: (tree, treeNode, resolve) => { | 
|         return resolve([]); | 
|       }, | 
|     }, | 
|     textInline: { | 
|       // 表格内容超出后是否换行显示(2020.01.16) | 
|       type: Boolean, | 
|       default: true, | 
|     }, | 
|     tableData: { | 
|       // 表数据源,配置了url就不用传这个参数了 | 
|       type: Array, | 
|       default: () => { | 
|         return []; | 
|       }, | 
|     }, | 
|     columns: { | 
|       type: Array, | 
|       default: [], | 
|     }, | 
|     height: { | 
|       type: Number, | 
|       default: 0, | 
|     }, | 
|     maxHeight: { | 
|       type: Number, | 
|       default: 0, | 
|     }, | 
|     linkView: { | 
|       type: Function, | 
|       default: function () { | 
|         return 1; | 
|       }, | 
|     }, | 
|     pagination: { | 
|       type: Object, | 
|       default: function () { | 
|         return { total: 0, size: 30, sortName: "" }; | 
|       }, | 
|     }, | 
|     url: { | 
|       type: String, | 
|       default: "", | 
|     }, | 
|     paginationHide: { | 
|       type: Boolean, | 
|       default: true, | 
|     }, | 
|     color: { | 
|       type: Boolean, | 
|       default: true, | 
|     }, | 
|     index: { | 
|       // 是否创建索引号,如果需要表格编辑功能,这里需要设置为true | 
|       type: Boolean, | 
|       default: false, | 
|     }, | 
|     allowEmpty: { | 
|       // 表格数据为空时是否默认为-- | 
|       type: Boolean, | 
|       default: true, | 
|     }, | 
|     defaultLoadPage: { | 
|       // 传入了url,是否默认加载表格数据 | 
|       type: Boolean, | 
|       default: true, | 
|     }, | 
|     loadKey: { | 
|       // 是否自动从后台加载数据源 | 
|       type: Boolean, | 
|       default: true, | 
|     }, | 
|     single: { | 
|       type: Boolean, // 是否单选 | 
|       default: false, | 
|     }, | 
|     doubleEdit: { | 
|       type: Boolean, // 是否双击启用编辑功能 | 
|       default: true, | 
|     }, | 
|     beginEdit: { | 
|       // 编辑开始 | 
|       type: Function, | 
|       default: function (row, column, index) { | 
|         return true; | 
|       }, | 
|     }, | 
|     endEditBefore: { | 
|       // 结束编辑前 | 
|       type: Function, | 
|       default: function (row, column, index) { | 
|         return true; | 
|       }, | 
|     }, | 
|     endEditAfter: { | 
|       // 结束编辑前 | 
|       type: Function, | 
|       default: function (row, column, index) { | 
|         return true; | 
|       }, | 
|     }, | 
|     ck: { | 
|       // 是否显示checkbox | 
|       type: Boolean, | 
|       default: true, | 
|     }, | 
|     columnIndex: { | 
|       // 是否显示行号(2020..11.1) | 
|       type: Boolean, | 
|       default: true, | 
|     }, | 
|     highlightCurrentRow: { | 
|       //增加选中行高亮显示(2022.10.07) | 
|       type: Boolean, | 
|       default: true, | 
|     }, | 
|     select2Count: { | 
|       //超出数量显示select2组件 | 
|       type: Number, | 
|       default: 500, | 
|     }, | 
|     selectable: { | 
|       type: Function, | 
|       default: (row, index) => { | 
|         return true; | 
|       }, | 
|     }, | 
|   }, | 
|   data() { | 
|     return { | 
|       fixed: false, //是固定行号与checkbox | 
|       clickEdit: true, //2021.07.17设置为点击行结束编辑 | 
|       randomTableKey: 1, | 
|       visiblyColumns: [], | 
|       key: "", | 
|       realHeight: 0, | 
|       realMaxHeight: 0, | 
|       enableEdit: false, // 是否启表格用编辑功能 | 
|       empty: this.allowEmpty ? "" : "--", | 
|       defaultImg: 'this.src="' + require("@/assets/imgs/error.png") + '"', | 
|       loading: false, | 
|       footer: {}, | 
|       total: 0, | 
|       formatConfig: {}, | 
|       // defaultColor: "", | 
|       // 2020.09.06调整table列数据源的背景颜色 | 
|       colors: ["", "warning", "success", "danger", "info"], | 
|       rule: { | 
|         phone: /^[1][3,4,5,6,7,8,9][0-9]{9}$/, | 
|         decimal: /(^[\-0-9][0-9]*(.[0-9]+)?)$/, | 
|         number: /(^[\-0-9][0-9]*([0-9]+)?)$/, | 
|       }, | 
|       columnNames: [], | 
|       rowData: [], | 
|       paginations: { | 
|         sort: "", | 
|         order: "desc", | 
|         Foots: "", | 
|         total: 0, | 
|         // 2020.08.29增加自定义分页条大小 | 
|         sizes: [30, 60, 100, 120], | 
|         size: 30, // 默认分页大小 | 
|         Wheres: [], | 
|         page: 1, | 
|         rows: 30, | 
|       }, | 
|       errorFiled: "", | 
|       edit: { columnIndex: -1, rowIndex: -1 }, // 当前双击编辑的行与列坐标 | 
|       editStatus: {}, | 
|       summary: false, // 是否显示合计 | 
|       // 目前只支持从后台返回的summaryData数据 | 
|       summaryData: [], | 
|       summaryIndex: {}, | 
|       remoteColumns: [], // 需要每次刷新或分页后从后台加载字典数据源的列配置 | 
|       cellStyleColumns: {}, // 有背景颜色的配置 | 
|       fxRight: false, //是否有右边固定表头 | 
|       selectRows: [], //当前选中的行 | 
|       isChrome: false, | 
|       //vol-table带数据源的单元格是否启用tag标签(下拉框等单元格以tag标签显示) | 
|       //2023.04.02更新voltable与main.js | 
|       useTag: true, | 
|       currentRow: {}, | 
|       currentColumn: [], | 
|       fileInfo: [], | 
|       uploadUrl: "", | 
|       uploadModel: false, | 
|     }; | 
|   }, | 
|   created() { | 
|     try { | 
|       this.useTag = this.$global.table.useTag; | 
|     } catch (error) { | 
|       console.log(error.message); | 
|     } | 
|     //2021.06.19判断谷歌内核浏览重新计算table高度 | 
|     // if ( | 
|     //   navigator.userAgent.indexOf('Chrome') != -1 || | 
|     //   navigator.userAgent.indexOf('Edge') != -1 | 
|     // ) { | 
|     //   this.isChrome = true; | 
|     // } | 
|     this.realHeight = this.getHeight(); | 
|     this.realMaxHeight = this.getMaxHeight(); | 
|     this.fxRight = this.columns.some((x) => { | 
|       return x.fixed == "right"; | 
|     }); | 
|     //2021.09.21移除强制固定行号与checkbox列 | 
|     if ( | 
|       this.columns.some((x) => { | 
|         return x.fixed && x.fixed != "right"; | 
|       }) | 
|     ) { | 
|       this.fixed = true; | 
|     } | 
|     //2022.04.06优化table合计固定列显示 | 
|     // if ( | 
|     //   this.columns.some((x) => { | 
|     //     return x.summary; | 
|     //   }) | 
|     // ) { | 
|     //   this.columns.forEach((x) => { | 
|     //     if (x.fixed && x.fixed != 'right') { | 
|     //       x.fixed = false; | 
|     //     } | 
|     //   }); | 
|     //   this.fixed = false; | 
|     // } | 
|   | 
|     // 从后台加下拉框的[是否启用的]数据源 | 
|     let keys = []; | 
|     let columnBind = []; | 
|     this.summaryData.push("合计"); | 
|     if (this.columnIndex) { | 
|       this.summaryData.push(" "); | 
|     } | 
|     this.columns.forEach((x, _index) => { | 
|       if (x.cellStyle) { | 
|         this.cellStyleColumns[x.field] = x.cellStyle; | 
|       } | 
|       if (!x.hidden) { | 
|         // this.summaryIndex[x.field] = _index; | 
|         // 2020.10.11修复求和列错位的问题 | 
|         this.summaryData.push(""); | 
|         this.summaryIndex[x.field] = this.summaryData.length - 1; | 
|       } | 
|       // 求和 | 
|       if (x.summary && !this.summary) { | 
|         this.summary = true; | 
|       } | 
|       if (x.bind && x.bind.key && (!x.bind.data || x.bind.data.length == 0)) { | 
|         // 写入远程 | 
|         if (!x.bind.data) x.bind.data = []; | 
|         if (x.bind.remote) { | 
|           this.remoteColumns.push(x); | 
|         } else if (this.loadKey) { | 
|           keys.push(x.bind.key); | 
|           x.bind.valueTyoe = x.type; | 
|           columnBind.push(x.bind); | 
|         } | 
|       } | 
|     }); | 
|     if (keys.length > 0) { | 
|       this.http | 
|         .post("/api/Sys_Dictionary/GetVueDictionary", keys) | 
|         .then((dic) => { | 
|           dic.forEach((x) => { | 
|             if (x.data.length > this.select2Count) { | 
|               x.data.forEach((item) => { | 
|                 item.label = item.value; | 
|                 item.value = item.key; | 
|               }); | 
|             } | 
|             columnBind.forEach((c) => { | 
|               // 转换数据源的类型与列的类型一致(2020.04.04) | 
|               if ( | 
|                 c.key == x.dicNo && | 
|                 (c.valueTyoe == "int" || c.valueTyoe == "sbyte") | 
|               ) { | 
|                 x.data.forEach((d) => { | 
|                   // 2020.09.01增加对数字类型的二次判断 | 
|                   if (!isNaN(d.key)) { | 
|                     d.key = ~~d.key; | 
|                   } | 
|                 }); | 
|               } | 
|               if (c.key == x.dicNo) c.data.push(...x.data); | 
|             }); | 
|           }); | 
|         }); | 
|     } | 
|   | 
|     this.paginations.sort = this.pagination.sortName; | 
|     // 2020.08.29增加自定义分页条大小 | 
|     Object.assign(this.paginations, this.pagination); | 
|     if (this.pagination.size) { | 
|       this.paginations.rows = this.pagination.size; | 
|     } | 
|     this.enableEdit = this.columns.some((x) => { | 
|       return x.hasOwnProperty("edit"); | 
|     }); | 
|     let keyColumn = this.columns.find((x) => { | 
|       return x.isKey; | 
|     }); | 
|     if (keyColumn) { | 
|       this.key = keyColumn.field; | 
|     } | 
|     this.defaultLoadPage && this.load(); | 
|   }, | 
|   computed: { | 
|     filterColumns() { | 
|       return this.columns.filter((x, index) => { | 
|         if (!x.field) { | 
|           x.field = x.title + index; | 
|         } | 
|         return !x.hidden; | 
|       }); | 
|     }, | 
|   }, | 
|   methods: { | 
|     watchRowSelectChange(newLen, oldLen) { | 
|       if (newLen < oldLen && this.selectRows.length) { | 
|         this.selectRows = []; | 
|         this.$refs.table.clearSelection(); | 
|       } | 
|     }, | 
|     switchChange(val, row, column) { | 
|       //这里在初始化的时候也会触发change事件 | 
|       if (Object.keys(row).length <= 1) { | 
|         return; | 
|       } | 
|       if (column.onChange) { | 
|         column.onChange(val, row, column); | 
|       } | 
|     }, | 
|     inputKeyPress(row, column, $event, $e) { | 
|       column.onKeyPress && column.onKeyPress(row, column, $event); | 
|       this.getInputSummaries(null, null, $event, column); | 
|     }, | 
|     extraClick(row, column) { | 
|       column.extra.click && | 
|         column.extra.click( | 
|           row, | 
|           column, | 
|           this.url ? this.rowData : this.tableData | 
|         ); | 
|     }, | 
|     headerClick(column, event) { | 
|       if (this.clickEdit && this.edit.rowIndex != -1) { | 
|         if ( | 
|           this.rowEndEdit( | 
|             this.url | 
|               ? this.rowData[this.edit.rowIndex] | 
|               : this.tableData[this.edit.rowIndex], | 
|             column | 
|           ) | 
|         ) { | 
|           this.edit.rowIndex = -1; | 
|         } | 
|       } | 
|       // this.edit.rowIndex = -1; | 
|     }, | 
|     rowDbClick(row, column, event) { | 
|       //2021.05.23增加双击行事件 | 
|       this.$emit("rowDbClick", { row, column, event }); | 
|     }, | 
|     rowClick(row, column, event) { | 
|       //2022.02.20增加点击时表格参数判断 | 
|       if (!column) { | 
|         return; | 
|       } | 
|       //正在编辑时,禁止出发rowClick事件 | 
|       if (this.edit.rowIndex == -1) { | 
|         this.$emit("rowClick", { row, column, event }); | 
|       } | 
|       // 点击行事件(2020.11.07) | 
|   | 
|       if (!this.doubleEdit) { | 
|         return; | 
|       } | 
|       // 点击其他行时,如果点击的行与正在编辑的行相同,保持编辑状态 | 
|       if (this.clickEdit && this.edit.rowIndex != -1) { | 
|         if (row.elementIndex == this.edit.rowIndex) { | 
|           // 点击的单元格如果不可以编辑,直接结束编辑 | 
|           // 2020.10.12修复结束编辑时,element table高版本属性获取不到的问题 | 
|           let _col = this.columns.find((x) => { | 
|             return x.field == ((event && event.property) || column.property); | 
|           }); | 
|           if (_col && (!_col.edit || _col.readonly)) { | 
|             if (this.rowEndEdit(row, event)) { | 
|               this.edit.rowIndex = -1; | 
|             } | 
|           } | 
|           return; | 
|         } | 
|         if (this.rowEndEdit(row, event && event.property ? event : column)) { | 
|           this.edit.rowIndex = -1; | 
|         } | 
|         //当正在编辑,且点击到其他行时,在原编辑的行结束编辑后,触发新行的rowClick事件 | 
|         //正在编辑时,禁止出发rowClick事件 | 
|         if (this.edit.rowIndex == -1) { | 
|           this.$emit("rowClick", { row, column, event }); | 
|         } | 
|       } | 
|       this.rowBeginEdit(row, column); | 
|     }, | 
|     dowloadFile(file) { | 
|       this.base.dowloadFile( | 
|         file.path, | 
|         file.name, | 
|         { | 
|           Authorization: this.$store.getters.getToken(), | 
|         }, | 
|         this.http.ipAddress | 
|       ); | 
|     }, | 
|     getFilePath(pathSring, column) { | 
|       // 获取表的图片与文件显示 | 
|       if (!pathSring) return []; | 
|       // 增加图片自定义操作 | 
|       // 返回格式必须是[{name:"文件名",path:"图片全路径或base64格式"}] | 
|       if (column.formatter) { | 
|         return column.formatter(pathSring); | 
|       } | 
|       let filePath; | 
|       if (column.base64 && pathSring.indexOf("data") != -1) { | 
|         filePath = ("," + pathSring) | 
|           .split(",data") | 
|           .filter((x) => { | 
|             return x; | 
|           }) | 
|           .map((m) => { | 
|             return "data" + m; | 
|           }); | 
|       } else { | 
|         filePath = pathSring.replace(/\\/g, "/").split(","); | 
|       } | 
|   | 
|       let fileInfo = []; | 
|       for (let index = 0; index < filePath.length; index++) { | 
|         let file = filePath[index]; | 
|         // 2020.12.19增加base64图片显示 | 
|         if (column.base64) { | 
|           fileInfo.push({ | 
|             name: "", | 
|             path: | 
|               (file.indexOf("data") == -1 ? "data:image/png;base64," : "") + | 
|               file, | 
|           }); | 
|         } else if (file.indexOf(".") != -1) { | 
|           let splitFile = file.split("/"); | 
|           if (splitFile.length > 0) { | 
|             fileInfo.push({ | 
|               name: splitFile[splitFile.length - 1], | 
|               path: this.base.isUrl(file) ? file : this.http.ipAddress + file, | 
|             }); | 
|           } | 
|         } | 
|       } | 
|       return fileInfo; | 
|     }, | 
|     // 重置table | 
|     reset() { | 
|       if (this.tableData && this.tableData.length > 0) { | 
|         this.tableData.splice(0); | 
|       } | 
|       if (this.rowData && this.rowData.length > 0) { | 
|         this.rowData.splice(0); | 
|       } | 
|       if (!this.paginationHide) { | 
|         this.paginations.page = 1; | 
|         // this.paginations.rows = 30; | 
|         if (this.paginations.wheres && this.paginations.wheres.length > 0) { | 
|           this.paginations.wheres.splice(0); | 
|         } | 
|       } | 
|       this.errorFiled = ""; | 
|       this.edit.columnIndex = -1; | 
|       this.edit.rowIndex = -1; | 
|     }, | 
|     getHeight() { | 
|       // 没有定义高度与最大高度,使用table默认值 | 
|       if (!this.height && !this.maxHeight) { | 
|         return null; | 
|       } | 
|       // 定义了最大高度则不使用高度 | 
|       if (this.maxHeight) { | 
|         return null; | 
|       } | 
|       // 使用当前定义的高度 | 
|       return this.height; | 
|     }, | 
|     getMaxHeight() { | 
|       // 没有定义高度与最大高度,使用table默认值 | 
|       if (!this.height && !this.maxHeight) { | 
|         return null; | 
|       } | 
|       // 定义了最大高度使用最大高度 | 
|       if (this.maxHeight) { | 
|         return this.maxHeight; | 
|       } | 
|       // 不使用最大高度 | 
|       return null; | 
|     }, | 
|     getSelectedOptions(column) { | 
|       if (column.bind && column.bind.data && column.bind.data.length > 0) { | 
|         return column.bind.data; | 
|       } | 
|       return []; | 
|     }, | 
|     formatterClick(row, column, event) { | 
|       if (column.click) { | 
|         column.click(row, column, event); | 
|         event.stopPropagation && event.stopPropagation(); | 
|       } else { | 
|         this.rowClick(row, column, event); | 
|       } | 
|     }, | 
|     initIndex({ row, rowIndex }) { | 
|       if (this.index) { | 
|         row.elementIndex = rowIndex; | 
|       } | 
|       // if (rowIndex%2!==0) { | 
|       //  return "even-row"; | 
|       // } | 
|       return; | 
|     }, | 
|     toggleEdit(event) {}, | 
|     setEditStatus(status) { | 
|       // this.columns.forEach((x) => { | 
|       //   if (x.hasOwnProperty("edit")) { | 
|       //     this.$set(x.edit, "status", status); | 
|       //   } | 
|       // }); | 
|     }, | 
|     // 通过button按钮启用编辑 | 
|     beginWithButtonEdit(scope) { | 
|       // url?rowData:tableData | 
|       this.rowBeginEdit(scope.row, this.columns[scope.$index]); | 
|     }, | 
|     rowBeginEdit(row, column) { | 
|       if (this.edit.rowIndex != -1) { | 
|         return; | 
|       } | 
|       let _row = this.columns.find((x) => x.field == column.property); | 
|       if (_row) { | 
|         if (_row.readonly) { | 
|           return; | 
|         } | 
|         if ( | 
|           //不能编辑的字段、switch,点击不开启启编辑功能 | 
|           !_row.edit || | 
|           (_row.edit.keep && _row.edit.type == "switch") | 
|         ) { | 
|           return; | 
|         } | 
|       } | 
|       if (!this.enableEdit) return; | 
|       _errMsg = ""; | 
|       // 编辑前 | 
|       this.columns | 
|         .filter((x) => { | 
|           return x.bind && x.bind.data && x.bind.data.length; | 
|         }) | 
|         .forEach((column) => { | 
|           let val = row[column.field]; | 
|           if (typeof column.bind.data[0].key == "string") { | 
|             if (typeof val == "number") { | 
|               row[column.field] = row[column.field] + ""; | 
|             } | 
|           } else { | 
|             if (typeof val == "string" && val) { | 
|               let _val = val * 1; | 
|               if (_val + "" === val) { | 
|                 row[column.field] = _val; | 
|               } | 
|             } | 
|           } | 
|         }); | 
|       if (!this.beginEdit(row, column, row.elementIndex)) return; | 
|       if (row.hasOwnProperty("elementIndex")) { | 
|         if (this.edit.rowIndex == row.elementIndex) { | 
|           return; | 
|         } | 
|         this.edit.rowIndex = row.elementIndex; | 
|       } | 
|     }, | 
|     rowEndEdit(row, column, event) { | 
|       if (this.clickEdit && event) { | 
|         return true; | 
|       } | 
|       if (!this.enableEdit) { | 
|         if (!this.errorFiled) { | 
|           if ( | 
|             this.edit.rowIndex != -1 && | 
|             !this.endEditAfter(row, column, this.edit.rowIndex) | 
|           ) { | 
|             return false; | 
|           } | 
|           this.edit.rowIndex = -1; | 
|         } | 
|         return true; | 
|       } | 
|       if (!this.doubleEdit && event) { | 
|         return true; | 
|       } | 
|       let _row = this.url | 
|         ? this.rowData[this.edit.rowIndex] | 
|         : this.tableData[this.edit.rowIndex]; | 
|       // 结束编辑前 | 
|       if (!this.endEditBefore(_row, column, this.edit.rowIndex)) return false; | 
|       if (this.edit.rowIndex != -1) { | 
|         //2022.06.26修复表格内容切换后行数不一致时不能编辑的问题 | 
|         if (this.edit.rowIndex - 1 > (this.rowData || this.tableData).length) { | 
|           this.edit.rowIndex = -1; | 
|           return; | 
|         } | 
|         let row = (this.url ? this.rowData : this.tableData)[ | 
|           this.edit.rowIndex | 
|         ]; | 
|         for (let index = 0; index < this.columns.length; index++) { | 
|           const _column = this.columns[index]; | 
|           if (_column.edit) { | 
|             if (!this.validateRow(row, _column)) { | 
|               return; | 
|             } | 
|           } | 
|         } | 
|       } | 
|       if (!this.endEditAfter(_row, column, this.edit.rowIndex)) return false; | 
|       this.edit.rowIndex = -1; | 
|       return true; | 
|     }, | 
|     validateRow(row, option1) { | 
|       if (!this.validateColum(option1, row)) { | 
|         this.errorFiled = option1.field; | 
|         // 2022.05.06 修改错误信息重复的问题 | 
|         this.$message.error(option1.title + _errMsg); | 
|         return false; | 
|       } | 
|       this.errorFiled = ""; | 
|       return true; | 
|     }, | 
|     validateColum(option, data) { | 
|       if (option.hidden || option.bind) return true; | 
|       let val = data[option.field]; | 
|       if (option.require || option.required) { | 
|         if (val != "0" && (val === "" || val === undefined)) { | 
|           if (!this.errorFiled) { | 
|             _errMsg = "不能为空"; | 
|           } | 
|           return false; | 
|         } | 
|       } | 
|       if (!option.edit) { | 
|         return true; | 
|       } | 
|       let editType = option.edit.type; | 
|       // 验证数字 | 
|       if (editType == "int" || editType == "decimal" || editType == "number") { | 
|         if (val == "" || val == undefined) return true; | 
|         if (editType == "decimal") { | 
|           if (!this.rule.decimal.test(val)) { | 
|             _errMsg = "只能是数字"; | 
|             return false; | 
|           } | 
|         } else if (!this.rule.decimal.test(val)) { | 
|           _errMsg = "只能是数字"; | 
|           return false; | 
|         } | 
|         if ( | 
|           option.edit.min != undefined && | 
|           typeof option.edit.min === "number" && | 
|           val < option.edit.min | 
|         ) { | 
|           _errMsg = "不能小于" + option.edit.min; | 
|           return false; | 
|         } | 
|         if ( | 
|           option.edit.max != undefined && | 
|           typeof option.edit.max === "number" && | 
|           val > option.edit.max | 
|         ) { | 
|           _errMsg = "不能大于" + option.edit.max; | 
|           return false; | 
|         } | 
|         return true; | 
|       } | 
|   | 
|       // 验证字符串 | 
|       if (val && (editType == "text" || editType == "string")) { | 
|         if ( | 
|           option.edit.min != undefined && | 
|           typeof option.edit.min === "number" && | 
|           val.length < option.edit.min | 
|         ) { | 
|           _errMsg = "至少" + option.edit.min + "个字符"; | 
|           return false; | 
|         } | 
|         if ( | 
|           option.edit.max != undefined && | 
|           typeof option.edit.max === "number" && | 
|           val.length > option.edit.max | 
|         ) { | 
|           _errMsg = "最多" + option.edit.max + "个字符"; | 
|           return false; | 
|         } | 
|       } | 
|       return true; | 
|     }, | 
|     delRow() { | 
|       let rows = this.getSelected(); | 
|       if (rows.length == 0) return this.$Message.error("请选择要删除的行!"); | 
|   | 
|       let data = this.url ? this.rowData : this.tableData; | 
|       let indexArr = this.getSelectedIndex(); | 
|       if (indexArr.length == 0) { | 
|         return this.$Message.error( | 
|           "删除操作必须设置VolTable的属性index='true'" | 
|         ); | 
|       } | 
|       // if (indexArr.length == 0 || !this.key) { | 
|       //   return this.$message.error( | 
|       //     "请设置index=true属性或指columns的字段为key" | 
|       //   ); | 
|       // } | 
|       if (indexArr.length == 0) { | 
|         // let keyValues=[] | 
|         // rows.forEach(x=>{ | 
|         //   if (x[this.key]) { | 
|         //   } | 
|         //   keyValues.push(x[this.key]) | 
|         // }) | 
|         // data.find(x=>) | 
|       } else { | 
|         for (let i = data.length - 1; i >= 0; i--) { | 
|           if (indexArr.indexOf(i) != -1) { | 
|             data.splice(i, 1); | 
|           } | 
|         } | 
|       } | 
|       this.edit.rowIndex = -1; | 
|       return rows; | 
|     }, | 
|     addRow(row) { | 
|       if (!row) { | 
|         row = {}; | 
|       } | 
|       this.columns.forEach((x) => { | 
|         // 2022.05.06 添加行时,如果列有编辑属性,设置开启编辑(避免关闭编辑后,无法再次启用编辑)?? | 
|         //x.readonly = false; | 
|         if (!row.hasOwnProperty(x.field)) { | 
|           if (x.edit && x.edit.type == "switch") { | 
|             row[x.field] = x.type == "bool" ? false : 0; | 
|           } else if (!row.hidden) { | 
|             // 2020.09.06添加行时,设置默认字段 | 
|             row[x.field] = undefined; | 
|           } | 
|         } | 
|       }); | 
|       if (!this.url) { | 
|         this.tableData.push(row); | 
|         return; | 
|       } | 
|       this.rowData.push(row); | 
|     }, | 
|     viewImg(row, column, url, $event) { | 
|       $event.stopPropagation(); | 
|       this.base.previewImg(url); | 
|       // window.open(row[column.field]); | 
|     }, | 
|     link(row, column, $e) { | 
|       $e.stopPropagation(); | 
|       this.$props.linkView(row, column); | 
|     }, | 
|     getSelected() { | 
|       return this.selectRows; | 
|     }, | 
|     getSelectedIndex() { | 
|       if (!this.index) { | 
|         // 只有设置了属性index才有索引行 | 
|         return []; | 
|       } | 
|       let indexArr = this.selectRows.map((x) => { | 
|         return x.elementIndex; | 
|       }); | 
|       return indexArr || []; | 
|     }, | 
|     GetTableDictionary(rows) { | 
|       // 分页或刷新或重新绑定数据源 | 
|       if (this.remoteColumns.length == 0 || !rows || rows.length == 0) return; | 
|       let remoteInfo = {}; | 
|       for (let index = 0; index < this.remoteColumns.length; index++) { | 
|         const column = this.remoteColumns[index]; | 
|         //  column.bind.data.splice(0); | 
|         let key = column.bind.key; | 
|         let data = []; | 
|         rows.forEach((row) => { | 
|           if (row[column.field] || row[column.field] == "0") { | 
|             if (data.indexOf(row[column.field]) == -1) { | 
|               data.push(row[column.field]); | 
|             } | 
|           } | 
|         }); | 
|         if (data.length > 0) { | 
|           remoteInfo[key] = data; | 
|         } | 
|       } | 
|       if (remoteInfo.length == 0) return; | 
|       // ha= Object.assign([], ha, hb) | 
|       this.http | 
|         .post("/api/Sys_Dictionary/GetTableDictionary", remoteInfo) | 
|         .then((dic) => { | 
|           dic.forEach((x) => { | 
|             this.remoteColumns.forEach((column) => { | 
|               if (column.bind.key == x.key) { | 
|                 column.bind.data = Object.assign([], column.bind.data, x.data); | 
|                 // column.bind.data.push(...x.data); | 
|               } | 
|             }); | 
|           }); | 
|           this.$emit("dicInited", dic); | 
|         }); | 
|     }, | 
|     load(query, isResetPage) { | 
|       // isResetPage重置分页数据 | 
|       if (!this.url) return; | 
|       if (isResetPage) { | 
|         this.resetPage(); | 
|       } | 
|       let param = { | 
|         page: this.paginations.page, | 
|         rows: this.paginations.rows, | 
|         sort: this.paginations.sort, | 
|         order: this.paginations.order, | 
|         wheres: [], // 查询条件,格式为[{ name: "字段", value: "xx" }] | 
|       }; | 
|       let status = true; | 
|       // 合并查询信息(包查询分页、排序、查询条件等) | 
|       if (query) { | 
|         param = Object.assign(param, query); | 
|       } | 
|       /* 查询前处理(如果需要查询条件,实现组件方法loadBefore方法即可: | 
|         loadBefore=(param, callBack)=>{ | 
|           param.wheres = [{ name: "PhoneNo", value: "13419098211" }]; | 
|           callBack(true); | 
|         }) | 
|       */ | 
|       this.$emit("loadBefore", param, (result) => { | 
|         status = result; | 
|       }); | 
|       if (!status) return; | 
|   | 
|       if (param.wheres && param.wheres instanceof Array) { | 
|         param.wheres = JSON.stringify(param.wheres); | 
|       } | 
|       this.loading = true; | 
|       this.http.post(this.url, param).then( | 
|         (data) => { | 
|           //2021.06.04修复tree不刷新的问题 | 
|           if (this.rowKey) { | 
|             this.randomTableKey++; | 
|             this.rowData.splice(0); | 
|           } | 
|           this.loading = false; | 
|           // 查询返回结果后处理 | 
|           // 2020.10.30增加查询后返回所有的查询信息 | 
|           this.$emit( | 
|             "loadAfter", | 
|             data.rows || [], | 
|             (result) => { | 
|               status = result; | 
|             }, | 
|             data | 
|           ); | 
|           if (!status) return; | 
|           this.GetTableDictionary(data.rows); | 
|           this.rowData = data.rows || []; | 
|           this.paginations.total = data.total; | 
|           // 合计 | 
|           this.getSummaries(data); | 
|           // this.$nextTick(() => { | 
|           //   this.$refs.table.doLayout(); | 
|           // }); | 
|         }, | 
|         (error) => { | 
|           this.loading = false; | 
|           // this.$Message.error(error || "网络异常"); | 
|         } | 
|       ); | 
|     }, // 获取统计 | 
|     getSummaries(data) { | 
|       if (!this.summary || !data.summary) return; | 
|       this.summaryData.splice(0); | 
|       // 开启了行号的,+1 | 
|       if (this.columnIndex) { | 
|         this.summaryData.push(""); | 
|       } | 
|       // 如果有checkbox,应该算作是第一行 | 
|       if (this.ck) { | 
|         this.summaryData.push(""); | 
|       } | 
|   | 
|       this.columns.forEach((col) => { | 
|         if (col.children && col.children.length) { | 
|           col.children.forEach((item) => { | 
|             this.getColumnSummaries(item, data); | 
|           }); | 
|         } else { | 
|           this.getColumnSummaries(col, data); | 
|         } | 
|       }); | 
|       if (this.summaryData.length > 0 && this.summaryData[0] == "") { | 
|         this.summaryData[0] = "合计"; | 
|       } | 
|     }, | 
|     getColumnSummaries(col, data) { | 
|       if (!col.hidden) { | 
|         if (data.summary.hasOwnProperty(col.field)) { | 
|           let sum = data.summary[col.field]; | 
|           if (sum) { | 
|             sum = | 
|               (sum * 1.0).toFixed(col.numberLength || 2).replace(".00", "") * | 
|               1.0; | 
|           } | 
|           this.summaryData.push(sum); | 
|         } else { | 
|           this.summaryData.push(""); | 
|         } | 
|       } | 
|     }, | 
|     getInputChangeSummaries() {}, | 
|     handleSizeChange(val) { | 
|       this.paginations.size = val; | 
|       this.paginations.rows = val; | 
|       this.load(); | 
|     }, | 
|     handleCurrentChange(val) { | 
|       this.paginations.page = val; | 
|       this.load(); | 
|     }, | 
|     sortChange(sort) { | 
|       this.paginations.sort = sort.prop; | 
|       this.paginations.order = sort.order == "ascending" ? "asc" : "desc"; | 
|       this.load(); | 
|     }, | 
|     resetPage() { | 
|       // 重置查询分页 | 
|       // this.paginations.rows = 30; | 
|       this.paginations.page = 1; | 
|     }, | 
|     selectionChange(selection) { | 
|       // console.log(selection); | 
|       // 选择行事件,只有单选才触发 | 
|       this.selectRows = selection; | 
|       if (this.single) { | 
|         if (selection.length == 1) { | 
|           this.$emit("rowChange", selection[0]); | 
|         } | 
|         if (selection.length > 1) { | 
|           let _row = selection[selection.length - 1]; | 
|           this.$refs.table.toggleRowSelection(selection[0]); | 
|           this.selectRows = [_row]; | 
|         } | 
|       } | 
|       // 将selectionchange暴露出去 | 
|       this.$emit("selectionChange", selection); | 
|     }, | 
|     getColor(row, column) { | 
|       let val = row[column.field]; | 
|       if (column.getColor && typeof column.getColor === "function") { | 
|         let _color = column.getColor(row, column); | 
|         if (_color) { | 
|           return _color; | 
|         } | 
|       } | 
|       if (!val && val != "0") { | 
|         return ""; | 
|       } | 
|       if (!this.formatConfig[column.field]) { | 
|         this.formatConfig[column.field] = [val]; | 
|         return this.colors[0]; | 
|       } | 
|       let index = this.formatConfig[column.field].indexOf(val); | 
|       if (index != -1) { | 
|         return this.colors[index]; | 
|       } | 
|       if (this.formatConfig[column.field].length > 5) { | 
|         return ""; | 
|       } | 
|   | 
|       if (index == -1) { | 
|         this.formatConfig[column.field].push(val); | 
|         index = this.formatConfig[column.field].length - 1; | 
|       } | 
|       return this.colors[index]; | 
|     }, | 
|     formatterDate(row, column) { | 
|       return (row[column.field] || "").substr(0, 10); | 
|     }, | 
|     formatter(row, column, template) { | 
|       if (!template) return row[column.property]; | 
|       let val = row[column.field]; | 
|       if (!val && val != 0) return val; | 
|       // 是否值 | 
|       if (column.edit && column.edit.type == "switch") { | 
|         return val ? "是" : "否"; | 
|       } | 
|       if (!column.bind || !column.bind.data) { | 
|         return row[column.field]; | 
|       } | 
|   | 
|       if ( | 
|         column.edit && | 
|         (column.edit.type == "selectList" || column.edit.type == "treeSelect") | 
|       ) { | 
|         if (!Array.isArray(val)) { | 
|           row[column.field] = val.split(","); | 
|         } else { | 
|           val = val.join(","); | 
|         } | 
|         return this.getSelectFormatter(column, val); | 
|       } | 
|       // 编辑多选table显示 | 
|       if ( | 
|         column.bind.type == "selectList" || | 
|         column.bind.type == "checkbox" || | 
|         column.bind.type == "treeSelect" | 
|       ) { | 
|         // if (typeof val === 'string' && val.indexOf(',') != -1) { | 
|         return this.getSelectFormatter(column, val + ""); | 
|         //  } | 
|       } | 
|       let source = column.bind.data.filter((x) => { | 
|         // return x.key != "" && x.key == val; | 
|         // 2020.06.06修复单独使用table组件时,key为数字0时转换成文本失败的问题 | 
|         return x.key !== "" && x.key !== undefined && x.key + "" === val + ""; | 
|       }); | 
|       if (source && source.length > 0) val = source[0].label || source[0].value; | 
|       return val; | 
|     }, | 
|     getSelectFormatter(column, val) { | 
|       // 编辑多选table显示 | 
|       let valArr = val.split(","); | 
|       for (let index = 0; index < valArr.length; index++) { | 
|         (column.bind.orginData && column.bind.orginData.length | 
|           ? column.bind.orginData | 
|           : column.bind.data | 
|         ).forEach((x) => { | 
|           // 2020.06.06修复数据源为selectList时,key为数字0时不能转换文本的问题 | 
|           if ( | 
|             x.key !== "" && | 
|             x.key !== undefined && | 
|             x.key + "" == valArr[index] + "" | 
|           ) { | 
|             valArr[index] = x.label || x.value; | 
|           } | 
|         }); | 
|       } | 
|       return valArr.join(","); | 
|     }, | 
|     onChange(scope, val, event, column) { | 
|       // 2020.09.03修复onChange不触发的问题 | 
|       let row = scope.row; | 
|       if (column.onChange && !column.onChange(row, val, event)) { | 
|         return; | 
|       } | 
|       // 输入框求和实时计算 | 
|       this.getInputSummaries(scope, val, event, column); | 
|     }, | 
|     // input输入实时求和 | 
|     getInputSummaries(scope, val, event, column) { | 
|       // column列设置了summary属性的才计算值 | 
|       if (!column.summary) return; | 
|       let sum = 0; | 
|       //  let _index = 0; | 
|       (this.url ? this.rowData : this.tableData).forEach((x, index) => { | 
|         if (x.hasOwnProperty(column.field) && !isNaN(x[column.field])) { | 
|           // _index = index; | 
|           sum += x[column.field] * 1; | 
|         } | 
|       }); | 
|       if (sum) { | 
|         if (column.summary == "avg") { | 
|           sum = sum / (this.rowData.length || this.tableData.length || 1); | 
|         } | 
|         sum = | 
|           (sum * 1.0).toFixed(column.numberLength || 2).replace(".00", "") * | 
|           1.0; | 
|       } | 
|       this.summaryData[this.summaryIndex[column.field]] = sum; | 
|     }, | 
|     getSummaryData({ columns, data }) { | 
|       return this.summaryData; | 
|     }, | 
|     getCellStyle(row) { | 
|       // 2020.12.13增加设置单元格颜色 | 
|       if (row.column.property) { | 
|         return ( | 
|           this.cellStyleColumns[row.column.property] && | 
|           this.cellStyleColumns[row.column.property]( | 
|             row.row, | 
|             row.rowIndex, | 
|             row.columnIndex | 
|           ) | 
|         ); | 
|       } | 
|     }, | 
|     compareDate(date1, date2) { | 
|       if (!date2) { | 
|         return true; | 
|       } | 
|       return ( | 
|         date1.valueOf() < | 
|         (typeof date2 == "number" ? date2 : new Date(date2).valueOf()) | 
|       ); | 
|     }, | 
|     getDateOptions(date, item) { | 
|       //2021.07.17设置时间可选范围 | 
|       if ((!item.min && !item.max) || !date) { | 
|         return false; | 
|       } | 
|       if (item.min && item.min.indexOf(" ") == -1) { | 
|         //不设置时分秒,后面会自动加上 08:00 | 
|         item.min = item.min + " 00:00:000"; | 
|       } | 
|       return ( | 
|         this.compareDate(date, item.min) || !this.compareDate(date, item.max) | 
|       ); | 
|     }, | 
|     getDateFormat(column) { | 
|       //见https://day.js.org/docs/zh-CN/display/format | 
|       return column.edit.type == "date" ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm:ss"; | 
|     }, | 
|     userSelect(selection, row) { | 
|       this.selectRows = selection; | 
|       if (!this.single) { | 
|         this.$emit("rowChange", { row, selection }); | 
|       } | 
|     }, | 
|     isEmptyTag(row, column) { | 
|       if (!row[column.field] && row[column.field] != "0") { | 
|         return "empty-tag"; | 
|       } | 
|       return ""; | 
|     }, | 
|     filterChildrenColumn(children) { | 
|       if (!children) { | 
|         return []; | 
|       } | 
|       return children.filter((x) => { | 
|         return !x.hidden; | 
|       }); | 
|     }, | 
|     initColumnDisabled(row, column) { | 
|       return column.getDisabled && column.getDisabled(row, column); | 
|     }, | 
|     showUpload(row, column) { | 
|       this.fileInfo = (row[column.field] || "") | 
|         .split(",") | 
|         .filter((x) => { | 
|           return x; | 
|         }) | 
|         .map((item) => { | 
|           return { path: item, name: "" }; | 
|         }); | 
|       this.currentRow = row; | 
|       this.currentColumn = column; | 
|       if (this.currentColumn.edit.autoUpload === undefined) { | 
|         this.currentColumn.edit.autoUpload = true; | 
|       } | 
|       if (this.currentColumn.edit.multiple === undefined) { | 
|         this.currentColumn.edit.multiple = false; | 
|       } | 
|   | 
|       if (this.currentColumn.edit.url === undefined) { | 
|         this.uploadUrl = | 
|           "api/" + | 
|           (this.url || "").replace("/api", "api").split("/")[1] + | 
|           "/upload"; | 
|       } else { | 
|         this.uploadUrl = this.currentColumn.edit.url; | 
|       } | 
|       this.uploadModel = true; | 
|     }, | 
|     uploadAfter(result, files) { | 
|       this.currentColumn.uploadAfter && | 
|         this.currentColumn.uploadAfter(result, files); | 
|       return true; | 
|     }, | 
|     saveUpload() { | 
|       //生成保存后返回的路径 | 
|       let arr = this.fileInfo.map((x) => { | 
|         if (x.path) { | 
|           return x.path; | 
|         } | 
|         return result.data + x.name; | 
|       }); | 
|   | 
|       this.currentRow[this.currentColumn.field] = arr.join(","); | 
|       this.uploadModel = false; | 
|       return true; | 
|     }, | 
|   }, | 
| }); | 
| </script> | 
| <style lang="less" scoped> | 
| .vol-table { | 
|   position: relative; | 
|   .mask { | 
|     opacity: 0.2; | 
|     position: absolute; | 
|     width: 100%; | 
|     height: 100%; | 
|     background: #d0d0d0; | 
|     z-index: 100; | 
|   } | 
|   .message { | 
|     text-align: center; | 
|     color: #635c5c; | 
|     font-size: 15px; | 
|     font-weight: 600; | 
|     background: #eee; | 
|     transform: translateY(-50%); | 
|     top: 50%; | 
|     position: absolute; | 
|     z-index: 200; | 
|     left: 0; | 
|     right: 0; | 
|     width: 150px; | 
|     margin: 0 auto; | 
|     line-height: 40px; | 
|     border-radius: 4px; | 
|     border: 1px solid #a09e9e; | 
|   } | 
| } | 
| .e-item { | 
|   display: flex; | 
|   > div:first-child { | 
|     flex: 1; | 
|   } | 
| } | 
| .vol-table ::v-deep(.el-pager .number) { | 
|   padding: 0 7px; | 
|   border-radius: 5px; | 
|   border: 1px solid #e6e6e6; | 
|   margin-left: 8px; | 
|   font-weight: 500; | 
|   min-width: 28px; | 
| } | 
| .vol-table ::v-deep(.el-pager .number.active) { | 
|   background: #ed4014; | 
|   color: #fff; | 
| } | 
| .vol-table .t-file { | 
|   color: #1e8cff; | 
|   cursor: pointer; | 
|   border-bottom: 1px solid; | 
|   padding-bottom: 2px; | 
| } | 
| .vol-table .empty-tag { | 
|   border: none; | 
|   background: none; | 
| } | 
| .v-table ::v-deep(.el-date-editor .el-icon-date), | 
| .v-table ::v-deep(.el-date-editor .el-icon-time) { | 
|   width: 10px; | 
| } | 
|   | 
| .column-required { | 
|   position: relative; | 
|   color: #f20303; | 
|   font-size: 14px; | 
|   top: 2px; | 
|   right: 2px; | 
| } | 
| </style> | 
|   | 
| <style scoped> | 
| /* .v-table ::v-deep(.even-row){ | 
|   background: rgb(245,247,250); | 
| } */ | 
| .pagination { | 
|   text-align: right; | 
|   padding: 2px 28px; | 
|   border: 1px solid #eee; | 
|   border-top: 0px; | 
| } | 
| /* .v-table ::v-deep(.el-input .el-input__inner) { | 
|   padding: 0 7px; | 
| } */ | 
| .v-table ::v-deep(.el-table__header th) { | 
|   /* padding: 0px !important; */ | 
|   background-color: #f8f8f9 !important; | 
|   font-size: 13px; | 
|   height: 46px; | 
|   color: #616161; | 
| } | 
|   | 
| .v-table ::v-deep(.el-table__header th.is-sortable) { | 
|   padding: 3px !important; | 
| } | 
| .vol-table.text-inline ::v-deep(.el-table__body .cell), | 
| .vol-table.text-inline ::v-deep(.el-table__header-wrapper .cell) { | 
|   word-break: inherit !important; | 
|   white-space: nowrap !important; | 
| } | 
| /* .v-table  ::v-deep(.el-table__body td) { | 
|   padding: 9px 0 !important; | 
| } */ | 
|   | 
| .v-table ::v-deep(.el-table__footer td) { | 
|   padding: 7px 0 !important; | 
| } | 
|   | 
| .vol-table ::v-deep(.el-table-column--selection .cell) { | 
|   display: inline; | 
| } | 
| .vol-table.text-inline ::v-deep(.el-table th > .cell) { | 
|   white-space: nowrap !important; | 
| } | 
|   | 
| .vol-table .table-img { | 
|   height: 40px; | 
|   border-radius: 5px; | 
|   margin-right: 10px; | 
|   width: 40px; | 
|   object-fit: cover; | 
| } | 
| .vol-table .table-img:hover { | 
|   cursor: pointer; | 
| } | 
|   | 
| .vol-table ::v-deep(.cell) { | 
|   padding: 2px 10px; | 
| } | 
| .vol-table ::v-deep(.cell .el-tag) { | 
|   padding: 5px 9px; | 
| } | 
| .table-input { | 
|   color: rgb(104, 103, 103); | 
|   padding: 3px 10px; | 
|   height: 32px; | 
|   line-height: 32px; | 
|   width: 100%; | 
|   border-radius: 4px; | 
|   border: 1px solid #dcdcdc; | 
| } | 
| .table-input:focus { | 
|   outline: 1px solid #49a3fd; | 
| } | 
| </style> |