Browse Source

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

MaiXinRong 10 hours atrás
parent
commit
f2d2bd44cb

+ 4 - 1
app/controller/file_controller.js

@@ -389,7 +389,10 @@ module.exports = app => {
                 this.checkFilePermission(ctx, 'manage_dir');
                 this.checkLock(ctx);
                 const data = JSON.parse(ctx.request.body.data);
-                const result = await this.updateFiling(ctx, data);
+                if (data.updateType === 'save' && data.is_deleted !== undefined) throw '请使用删除操作删除目录';
+                const result = data.updateType === 'del'
+                    ? await new FilingDirectory(ctx).remove({ id: data.id, ids: data.ids }, { fromConfig: true })
+                    : await this.updateFiling(ctx, data);
                 if (result && result.create) await this.fillFilingAddUserNames(ctx, result.create);
                 ctx.body = { err: 0, msg: '', data: result };
             } catch (err) {

+ 11 - 7
app/lib/filing_directory.js

@@ -30,7 +30,7 @@ class FilingDirectory {
         return result;
     }
 
-    async remove(data) {
+    async remove(data, { fromConfig = false } = {}) {
         const values = data && data.ids !== undefined ? data.ids : [data && data.id];
         if (!Array.isArray(values) || values.length === 0 || values.some(id => typeof id !== 'string' || !id.trim())) {
             throw '请选择需要删除的分类';
@@ -43,12 +43,15 @@ class FilingDirectory {
         try {
             const filingList = await service.getAllDataForUpdate({ spid, is_deleted: 0 }, transaction, 'id');
             const scope = this.getDeleteScope(filingList, ids);
-            const permissionMap = await this.getPermissionMap(filingList);
-            for (const filing of scope) {
-                if (Number(filing.is_fixed)) throw '固定分类不可删除';
-                const permission = permissionMap[filing.id];
-                if (!permission || !permission.can_view || !permission.can_edit_dir) {
-                    throw '部分分类或子分类没有编辑目录权限,无法删除';
+            // 目录配置入口已校验 manage_dir;资料管理入口仍逐个检查目录权限。
+            if (!fromConfig) {
+                const permissionMap = await this.getPermissionMap(filingList);
+                for (const filing of scope) {
+                    if (Number(filing.is_fixed)) throw '固定分类不可删除';
+                    const permission = permissionMap[filing.id];
+                    if (!permission || !permission.can_view || !permission.can_edit_dir) {
+                        throw '部分分类或子分类没有编辑目录权限,无法删除';
+                    }
                 }
             }
             if (scope.some(filing => Number(filing.file_count || 0) !== 0)) {
@@ -57,6 +60,7 @@ class FilingDirectory {
             const deleteIds = scope.map(filing => filing.id);
             const files = await service.getDirectoryFilesForUpdate(spid, deleteIds, transaction);
             if (files.length > 0) throw '此分类已存在文件,请先删除所有文件。';
+            if (fromConfig && scope.some(filing => Number(filing.is_fixed))) throw '固定分类不可删除';
             const updateData = this.getRemainingOrders(filingList, scope);
             await service.deleteEmptyDirectories(spid, deleteIds, updateData, transaction);
             await transaction.commit();

+ 60 - 30
app/public/js/config_dir.js

@@ -60,7 +60,7 @@ $(document).ready(function() {
             this.curNode = null;
             this.editableTextColumnIndexes = [];
             this.spreadSetting.cols.forEach((col, index) => {
-                col.readOnly = col.field !== 'file_company' && col.field !== 'upload_tips';
+                col.readOnly = !['name', 'file_company', 'upload_tips'].includes(col.field);
                 if (!col.readOnly) {
                     this.editableTextColumnIndexes.push(index);
                     col.getTip = node => _.escape(node[col.field] || '');
@@ -172,12 +172,20 @@ $(document).ready(function() {
             this._applyLastColumnRightBorder();
         }
 
-        _reloadTree() {
+        _reloadTree(focusId) {
             var convertedData = this._convertData(filingData);
             this.filingTree.loadDatas(convertedData);
             SpreadJsObj.loadSheetData(this.sheet, SpreadJsObj.DataType.Tree, this.filingTree, true);
             this._applyEditableTextCellType();
             this._resizeSpreadColumns();
+            if (!focusId) return;
+            const row = this.filingTree.nodes.findIndex(node => node.id === focusId);
+            if (row < 0) return;
+            const rows = this.sheet.getSelections().map(selection => selection.row);
+            this.sheet.setSelection(row, 0, 1, 1);
+            SpreadJsObj.reloadRowsBackColor(this.sheet, rows.concat(row));
+            this.sheet.showCell(row, 0, spreadNS.VerticalPosition.nearest, spreadNS.HorizontalPosition.nearest);
+            this.spread.focus();
         }
 
         _isEditableTextColumn(columnIndex) {
@@ -201,6 +209,8 @@ $(document).ready(function() {
             }
             var self = this;
             this.editableTextColumnIndexes.forEach(function(columnIndex) {
+                // 名称使用原有树形单元格;仅给多行文本列设置回车换行。
+                if (!self.spreadSetting.cols[columnIndex].wordWrap) return;
                 self.sheet.getRange(-1, columnIndex, -1, 1)
                     .cellType(self._editableTextCellType)
                     .wordWrap(true);
@@ -293,9 +303,8 @@ $(document).ready(function() {
             $('#cd-add-sibling').click(function() {
                 var node = self._getSelectedNode();
                 if (!node) { toastr.warning('请先选择一个分类'); return; }
-                if (node.is_fixed) { toastr.error('固定分类不可添加同级'); return; }
                 var treePid = node.tree_pid === -1 ? '-1' : self._findOriginalId(node.tree_pid);
-                postData('config-dir/update', { updateType: 'add', tree_pid: treePid, tree_pre_id: node.id }, function(result) {
+                postData('config-dir/update', { updateType: 'add', tree_pid: treePid, tree_pre_id: node.id, name: '' }, function(result) {
                     filingData.push.apply(filingData, result.create);
                     if (result.update) {
                         for (var i = 0; i < result.update.length; i++) {
@@ -303,9 +312,7 @@ $(document).ready(function() {
                             if (srcNode) srcNode.tree_order = result.update[i].tree_order;
                         }
                     }
-                    self._reloadTree();
-                    var newIdx = self.filingTree.nodes.findIndex(function(x) { return x.id === result.create[0].id; });
-                    if (newIdx >= 0) self.sheet.setSelection(newIdx, 0, 1, 1);
+                    self._reloadTree(result.create[0].id);
                 });
             });
 
@@ -316,11 +323,9 @@ $(document).ready(function() {
                 var fixedChild = children.find(function(x) { return x.is_fixed; });
                 if (fixedChild) { toastr.error('该分类下存在固定分类,不可添加子级'); return; }
                 if (node.file_count > 0) { toastr.error('该分类下已导入文件,不可添加子级'); return; }
-                postData('config-dir/update', { updateType: 'add', tree_pid: node.id }, function(result) {
+                postData('config-dir/update', { updateType: 'add', tree_pid: node.id, name: '' }, function(result) {
                     filingData.push.apply(filingData, result.create);
-                    self._reloadTree();
-                    var newIdx = self.filingTree.nodes.findIndex(function(x) { return x.id === result.create[0].id; });
-                    if (newIdx >= 0) self.sheet.setSelection(newIdx, 0, 1, 1);
+                    self._reloadTree(result.create[0].id);
                 });
             });
 
@@ -391,26 +396,25 @@ $(document).ready(function() {
             });
 
             $('#cd-delete').click(function() {
-                var node = self._getSelectedNode();
-                if (!node) { toastr.warning('请先选择一个分类'); return; }
-                if (node.is_fixed) { toastr.error('固定分类不可删除'); return; }
-                deleteAfterHint(function() {
-                    postData('config-dir/update', { updateType: 'del', id: node.id }, function(result) {
-                        if (result && result.delete) {
-                            for (var i = 0; i < result.delete.length; i++) {
-                                var idx = filingData.findIndex(function(x) { return x.id === result.delete[i]; });
-                                if (idx >= 0) filingData.splice(idx, 1);
-                            }
-                        }
-                        if (result && result.update) {
-                            for (var j = 0; j < result.update.length; j++) {
-                                var srcNode = filingData.find(function(x) { return x.id === result.update[j].id; });
-                                if (srcNode) srcNode.tree_order = result.update[j].tree_order;
-                            }
+                const { ids, scope } = self._getDeleteSelection();
+                if (!ids.length) { toastr.warning('请先选择需要删除的目录行'); return; }
+                if (scope.some(node => Number(node.file_count || 0) !== 0)) { toastr.error('此分类已存在文件,请先删除所有文件。'); return; }
+                if (scope.some(node => Number(node.is_fixed))) { toastr.error('固定分类不可删除'); return; }
+                const selected = ids.length === 1 ? '目录【' + _.escape(scope[0].name || '未命名目录') + '】' : ids.length + ' 个目录';
+                deleteAfterHint(_.once(function() {
+                    postData('config-dir/update', { updateType: 'del', ids }, function(result) {
+                        const deleted = new Set(result.delete);
+                        const orders = new Map(result.update.map(item => [item.id, item.tree_order]));
+                        let kept = 0;
+                        for (const item of filingData) {
+                            if (deleted.has(item.id)) continue;
+                            if (orders.has(item.id)) item.tree_order = orders.get(item.id);
+                            filingData[kept++] = item;
                         }
+                        filingData.length = kept;
                         self._reloadTree();
                     });
-                }, '确认删除分类【' + node.name + '】及其子分类?');
+                }), '已选中 ' + selected + ',含子目录共 ' + scope.length + ' 个,确认删除?');
             });
 
             $('#cd-edit-name').click(function() {
@@ -515,7 +519,7 @@ $(document).ready(function() {
         _hasSubtreeFiles(node) {
             var subtreeTreeIds = this._getSubtreeTreeIds(node);
             return this.filingTree.nodes.some(function(item) {
-                return subtreeTreeIds.has(item.tree_id) && Number(item.file_count) > 0;
+                return subtreeTreeIds.has(item.tree_id) && Number(item.file_count || 0) !== 0;
             });
         }
 
@@ -1597,6 +1601,12 @@ $(document).ready(function() {
         }
 
         _persistTextCellValue(editing, value) {
+            const isName = editing.field === 'name';
+            if (isName && (!value || value.length > 100)) {
+                this.sheet.setValue(editing.row, editing.col, editing.originalValue);
+                this._showTextCellStatus(value ? '目录名称不能超过100个字符' : '目录名称不能为空', 'text-danger');
+                return;
+            }
             this._pendingTextCells.set(editing.key, editing);
             this._showTextCellStatus();
             const finish = saved => {
@@ -1615,7 +1625,7 @@ $(document).ready(function() {
                 this._showTextCellStatus(editing.title + (saved ? ':已保存' : ':保存失败,请重新编辑'),
                     saved ? 'text-success' : 'text-danger');
             };
-            postData('config-dir/update', { updateType: 'save', id: editing.filingId, [editing.field]: value },
+            postData('config-dir/update', { updateType: isName ? 'edit' : 'save', id: editing.filingId, [editing.field]: value },
                 () => finish(true), () => finish(false), false);
         }
 
@@ -1651,6 +1661,26 @@ $(document).ready(function() {
             this.sheet.setValue(cell.row, cell.col, value);
             this._persistTextCellValue(editing, value);
         }
+
+        _getDeleteSelection() {
+            const nodes = this.filingTree.nodes;
+            const selected = new Set();
+            for (const range of this.sheet.getSelections()) {
+                if (range.row < 0) continue; // 整列选择不作为删除目录的范围。
+                const end = Math.min(range.row + range.rowCount, nodes.length);
+                for (let row = range.row; row < end; row++) {
+                    if (this.sheet.getRowVisible(row)) selected.add(nodes[row].id);
+                }
+            }
+            const included = new Set(selected);
+            // 树的显示顺序是父目录在前,被折叠的子目录也在 nodes 中。
+            const scope = nodes.filter(node => {
+                const parent = this.filingTree.getParent(node);
+                if (parent && included.has(parent.id)) included.add(node.id);
+                return included.has(node.id);
+            });
+            return { ids: [...selected], scope };
+        }
     }
 
     new ConfigDir();

+ 72 - 59
app/public/js/filesjs.js

@@ -64,6 +64,8 @@ $(document).ready(function() {
                 headRowHeight: [32],
                 defaultRowHeight: 21,
                 headColWidth: [25],
+                frozenColCount: 1,
+                frozenLineColor: '#d9d9d9',
                 headerFont: '12px 微软雅黑',
                 font: '12px 微软雅黑',
                 readOnly: false,
@@ -212,20 +214,16 @@ $(document).ready(function() {
          * 根据目录区域宽度调整树表列宽,拖动分隔条时保持 SpreadJS 填满容器。
          */
         resizeSpreadColumns() {
-            const containerWidth = Math.floor($('#filing-spread').innerWidth() || 0);
-            if (containerWidth <= 0) return;
-
-            const rowHeaderWidth = 25;
-            const fileCountWidth = 70;
-            const scrollbarWidth = 18;
-            const borderWidth = 2;
-            const nameWidth = Math.max(
-                containerWidth - rowHeaderWidth - fileCountWidth - scrollbarWidth - borderWidth,
-                60
-            );
-            this.sheet.setColumnWidth(0, nameWidth);
-            this.sheet.setColumnWidth(1, fileCountWidth);
+            if (!this.spread.getHost().clientWidth) return;
             this.spread.refresh();
+            const sheet = this.sheet;
+            // 分栏骤然变窄时,旧的冻结列可能占满视口;先缩小它,才能量到实际可用宽度。
+            if (sheet.getViewportWidth(1) === 0) sheet.setColumnWidth(0, 1);
+            const viewportWidth = sheet.getViewportWidth(0) + sheet.getViewportWidth(1);
+            const fileCountWidth = this.spreadSetting.cols[1].width;
+            const nameWidth = Math.max(1, Math.floor(viewportWidth / sheet.zoom()) - fileCountWidth);
+            if (sheet.getColumnWidth(0) !== nameWidth) sheet.setColumnWidth(0, nameWidth);
+            if (sheet.getColumnWidth(1) !== fileCountWidth) sheet.setColumnWidth(1, fileCountWidth);
         }
 
         /**
@@ -294,18 +292,19 @@ $(document).ready(function() {
             // 分类右键菜单
             $.contextMenu({
                 selector: '#filing-spread',
-                build: function ($trigger, e) {
-                    const hit = SpreadJsObj.getHitTest($trigger, e, self.sheet);
-                    if (!hit || hit.row < 0 || hit.row >= self.filingTree.nodes.length) return false;
-                    const target = SpreadJsObj.safeRightClickSelection($trigger, e, self.spread);
-                    return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader;
-                },
+                build: ($trigger, e) => self._prepareNameMenu($trigger, e, self.spread),
                 items: {
+                    'copy-name': {
+                        name: '复制名称',
+                        icon: 'fa-copy',
+                        callback: function() { self._copySelectedNames(self.spread); },
+                        disabled: function() { return !self.sheet.getSelections().some(range => range.col <= 0); },
+                    },
                     'paste-name': {
                         name: '粘贴名称',
                         icon: 'fa-paste',
                         callback: function() { self._showNamePastePreview(); },
-                        disabled: function() { return !self._referenceNameClipboard || self._namePasteSaving || self._nameSaving; },
+                        disabled: function() { return !self._nameClipboard || self._namePasteSaving || self._nameSaving; },
                     },
                     'delete': {
                         name: '删除',
@@ -991,30 +990,31 @@ $(document).ready(function() {
         }
 
         _initNameClipboard() {
-            this._referenceNameClipboard = null;
+            this._nameClipboard = null;
             this._namePasteItems = [];
             this._namePasteSaving = false;
             const container = $('#filing-spread')[0];
+            this._bindNameCopy(this.spread);
             // 先于 SpreadJS 的只读单元格处理,保留浏览器原生粘贴事件以读取本次剪贴板。
             container.addEventListener('keydown', e => {
-                if (!(e.ctrlKey || e.metaKey) || e.altKey || e.keyCode !== 86 || this._isRenaming) return;
+                if (!(e.ctrlKey || e.metaKey) || e.altKey || e.keyCode !== 86 || this._isRenaming || this.sheet.isEditing()) return;
                 e.stopImmediatePropagation();
-                if (!this._referenceNameClipboard || this._namePasteSaving) {
+                if (!this._nameClipboard || this._namePasteSaving) {
                     e.preventDefault();
-                    if (!this._namePasteSaving) toastr.warning('请先从右侧参考文件复制名称');
+                    if (!this._namePasteSaving) toastr.warning('请先从左侧分类或右侧参考文件复制名称');
                 }
             }, true);
             container.addEventListener('paste', e => {
-                if (this._isRenaming) return;
+                if (this._isRenaming || this.sheet.isEditing()) return;
                 e.preventDefault();
                 e.stopImmediatePropagation();
                 const text = e.clipboardData ? e.clipboardData.getData('text/plain') : '';
-                this._pasteReferenceText(text);
+                this._pasteCopiedNames(text);
             }, true);
             this.sheet.bind(spreadNS.Events.ClipboardPasting, (e, info) => {
                 if (this._isRenaming || this.sheet.isEditing()) return;
                 info.cancel = true;
-                this._pasteReferenceText(info.pasteData ? info.pasteData.text : '');
+                this._pasteCopiedNames(info.pasteData ? info.pasteData.text : '');
             });
             $('#filing-name-paste-ok').on('click.filesjsNames', () => { this._savePastedNames(); });
             $('#filing-name-paste').on('hide.bs.modal.filesjsNames', e => {
@@ -1026,60 +1026,43 @@ $(document).ready(function() {
         }
 
         initReferenceNameClipboard(spread) {
-            const container = $('#std-reference-spread')[0];
             const sheet = spread.getActiveSheet();
-            container.addEventListener('keydown', e => {
-                if (!(e.ctrlKey || e.metaKey) || e.altKey || e.keyCode !== 67 || sheet.isEditing()) return;
-                e.preventDefault();
-                e.stopImmediatePropagation();
-                this._copyReferenceNames(spread);
-            }, true);
-            container.addEventListener('copy', e => {
-                if (sheet.isEditing()) return;
-                e.preventDefault();
-                e.stopImmediatePropagation();
-                this._copyReferenceNames(spread, e.clipboardData);
-            }, true);
+            this._bindNameCopy(spread);
             $.contextMenu({
                 selector: '#std-reference-spread',
-                build: function($trigger, e) {
-                    const hit = SpreadJsObj.getHitTest($trigger, e, sheet);
-                    if (!hit || hit.row < 0 || !sheet.zh_tree || hit.row >= sheet.zh_tree.nodes.length) return false;
-                    if (hit.hitTestType !== spreadNS.SheetArea.viewport && hit.hitTestType !== spreadNS.SheetArea.rowHeader) return false;
-                    SpreadJsObj.safeRightClickSelection($trigger, e, spread);
-                    return true;
-                },
+                build: ($trigger, e) => this._prepareNameMenu($trigger, e, spread),
                 items: {
                     'copy-name': {
                         name: '复制名称',
                         icon: 'fa-copy',
-                        callback: () => { this._copyReferenceNames(spread); },
+                        callback: () => { this._copySelectedNames(spread); },
+                        disabled: () => !sheet.getSelections().some(range => range.col <= 0),
                     },
                 },
             });
         }
 
-        _copyReferenceNames(spread, clipboardData) {
+        _copySelectedNames(spread, clipboardData) {
             const sheet = spread.getActiveSheet();
+            if (sheet.isEditing()) return false;
             const tree = sheet.zh_tree;
             const rows = new Set();
             for (const selection of sheet.getSelections()) {
                 if (selection.col > 0) continue;
                 const first = Math.max(0, selection.row);
-                const last = selection.row < 0 ? sheet.getRowCount() : first + selection.rowCount;
+                const last = selection.row < 0 ? sheet.getRowCount() : Math.min(sheet.getRowCount(), first + selection.rowCount);
                 for (let row = first; row < last; row++) {
                     if (tree && tree.nodes[row] && sheet.getRowVisible(row)) rows.add(row);
                 }
             }
             if (!rows.size) {
-                this._referenceNameClipboard = null;
-                toastr.warning('请先选中参考文件的名称列');
-                return;
+                this._nameClipboard = null;
+                return false;
             }
             const names = [...rows].sort((a, b) => a - b).map(row => String(tree.nodes[row].name || ''));
             const text = names.join('\r\n');
             // 保留原始数组,名称内的换行仍属于同一个分类。
-            this._referenceNameClipboard = { names, text };
+            this._nameClipboard = { names, text };
             SpreadJsObj.Clipboard.setCopyData(text);
             if (clipboardData) {
                 clipboardData.setData('text/plain', text);
@@ -1088,12 +1071,14 @@ $(document).ready(function() {
             }
             spread.focus();
             toastr.success(`已复制 ${names.length} 条名称`);
+            return true;
         }
 
-        _pasteReferenceText(text) {
-            const clipboard = this._referenceNameClipboard;
+        _pasteCopiedNames(text) {
+            if (this._namePasteItems.length || this._namePasteSaving) return;
+            const clipboard = this._nameClipboard;
             if (!clipboard || String(text || '').replace(/\r\n?/g, '\n') !== clipboard.text.replace(/\r\n?/g, '\n')) {
-                toastr.warning('请重新从右侧参考文件复制名称后粘贴');
+                toastr.warning('请重新从左侧分类或右侧参考文件复制名称后粘贴');
                 return;
             }
             this._showNamePastePreview();
@@ -1131,8 +1116,8 @@ $(document).ready(function() {
 
         _showNamePastePreview() {
             if (this._namePasteSaving || this._nameSaving || $('#filing-name-paste').hasClass('show')) return;
-            const clipboard = this._referenceNameClipboard;
-            if (!clipboard) { toastr.warning('请先从右侧参考文件复制名称'); return; }
+            const clipboard = this._nameClipboard;
+            if (!clipboard) { toastr.warning('请先从左侧分类或右侧参考文件复制名称'); return; }
             if (this._isRenaming) return;
             const row = this.sheet.getActiveRowIndex();
             if (row < 0 || !this.filingTree.nodes[row] || !this.sheet.getRowVisible(row)) {
@@ -1332,6 +1317,34 @@ $(document).ready(function() {
             this.sheet.setValue(range.row, 0, '');
             this.renameFiling(node, '');
         }
+
+        _bindNameCopy(spread) {
+            // 在表格复制命令中取得原选区,避免默认复制把文件数或备注拼进名称。
+            const commands = spread.commandManager();
+            const key = GC.Spread.Commands.Key.c;
+            const copy = () => this._copySelectedNames(spread);
+            commands.register('filesjsCopyNames', copy, key, true, false, false, false);
+            commands.register('filesjsCopyNamesMac', copy, key, false, false, false, true);
+            spread.getHost().addEventListener('copy', e => {
+                if (!e.clipboardData || !this._copySelectedNames(spread, e.clipboardData)) return;
+                e.preventDefault();
+                e.stopImmediatePropagation();
+            }, true);
+        }
+
+        _prepareNameMenu($trigger, e, spread) {
+            const sheet = spread.getActiveSheet();
+            if (sheet.isEditing()) return false;
+            const hit = SpreadJsObj.getHitTest($trigger, e, sheet);
+            if (!hit || !sheet.zh_tree || hit.row < 0 || hit.row >= sheet.zh_tree.nodes.length) return false;
+            const area = spreadNS.SheetArea;
+            if (hit.hitTestType !== area.viewport && hit.hitTestType !== area.rowHeader) return false;
+            // 在选中名称行的行号上右键,也保留原来的多行选区。
+            if (hit.hitTestType === area.rowHeader && sheet.getSelections().some(range =>
+                range.col <= 0 && range.row >= 0 && hit.row >= range.row && hit.row < range.row + range.rowCount)) return true;
+            SpreadJsObj.safeRightClickSelection($trigger, e, spread);
+            return true;
+        }
     }
 
     // 初始化

+ 8 - 0
app/service/filing.js

@@ -428,6 +428,14 @@ module.exports = app => {
             const name = String(data.name || '').trim();
             if (!name) throw '目录名称不能为空';
             if (name.length > 100) throw '目录名称不能超过100个字符';
+            if (data.tree_pid === undefined && data.is_fixed === undefined) {
+                if (typeof data.name !== 'string') throw '目录名称格式错误';
+                const result = await this.db.update(this.tableName, { name }, {
+                    where: { id: filing.id, spid: filing.spid, is_deleted: 0 },
+                });
+                if (result.affectedRows === 0) throw '更新目录失败';
+                return { update: [{ id: filing.id, name }] };
+            }
             const isFixed = Number(data.is_fixed);
             if (isFixed !== 0 && isFixed !== 1) throw '固定目录状态错误';
             if (data.tree_pid === undefined || data.tree_pid === null || data.tree_pid === '') throw '请选择目录';