浏览代码

1. 删除部位明细后,切换节点,删除的数据又出现
2. 批量插入清单部位,部位明细为空时,应正确插入
3. 台账分解,可调整上下布局
4. 工程量清单,设计数量不允许输入
5. 仅最底层节点可输入数量,子项变为父项后,单价、数量清空,金额重算
6. 树结构绘制调整

CinYung 6 年之前
父节点
当前提交
79be6eb93b

+ 2 - 2
app/const/spread.js

@@ -19,8 +19,8 @@ const ledgerSpread = {
         {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'},
         {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@'},
         {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.unit_price'},
-        {title: '设计数量|数量1',  colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 60, type: 'Number'},
-        {title: '|数量2',  colSpan: '|1', rowSpan: '|1', field: 'dgn_qty2', hAlign: 2, width: 60, type: 'Number'},
+        {title: '设计数量|数量1',  colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.dgnQty'},
+        {title: '|数量2',  colSpan: '|1', rowSpan: '|1', field: 'dgn_qty2', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.dgnQty'},
         {title: '经济指标',  colSpan: '1', rowSpan: '2', field: 'dgn_price', hAlign: 2, width: 60, type: 'Number', realyOnly: true},
         {title: '签约|数量', colSpan: '2|1', rowSpan: '1|1', field: 'deal_qty', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.quantity'},
         {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'deal_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},

+ 98 - 0
app/public/js/div_resizer.js

@@ -0,0 +1,98 @@
+'use strict';
+
+/**
+ *
+ * div可拖动调整分栏
+ *
+ * 示例结构:
+ * <div id="top-div"></div>
+ * <div r-Type="height|width" div1="#top-div" div2="#bottom-div" store-id="XXX" min="100">
+ * <div id="bottom-div"></div>
+ *
+ * 其中:
+ * r-Type: height表示上下拖动调整, width表示左右拖动调整
+ * div1: 上(左)部结构的id
+ * div2: 下(右)部结构的id
+ * store-id:可选,存在则以该值生成key,将调整结果写入localStorage
+ * min: 可选,无则默认两部分结构相加的10%
+ *
+ * setting: {select, callback}
+ * 其中:
+ * select:选定分栏
+ * callback:回调(除了上述两个div外需要调整的,自定义放在此处)
+ *
+ * @author Mai
+ * @date 2019/3/15
+ * @version
+ */
+
+(function($){
+    $.divResizer = function(setting) {
+        const obj = $(setting.select);
+        let drag, mouseMoveCount, startPos, orgSize1, orgSize2, newSize1, newSize2, objSize;
+        if (obj.attr('r-type') === 'height') {
+            obj.css('width', '100%').css('height', '1%').css('resize', 'vertical').css('cursor', 's-resize').css('float', 'top');
+        } else {
+            obj.css('width', '1%').css('height', '100%').css('resize', 'horizontal').css('cursor', 'w-resize').css('float', 'left');
+        }
+        // 根据localStorage初始化
+        if (obj.attr('store-id')) {
+            const rType = obj.attr('r-type');
+            const objSize1 = getLocalCache('v-resize-1-' + obj.attr('store-id'));
+            if (objSize1) {
+                $(obj.attr('div1')).css(rType, objSize1);
+            }
+            const objSize2 = getLocalCache('v-resize-2-' + obj.attr('store-id'));
+            if (objSize2) {
+                $(obj.attr('div2')).css(rType, objSize2);
+            }
+            if (setting.callback) { setting.callback(); }
+        }
+
+        obj.mousedown(function (e) {
+            const rType = obj.attr('r-type');
+            mouseMoveCount = 0;
+            drag = true;
+            startPos = rType === 'height' ? e.clientY : e.clientX;
+            // 获取左(上)部分的宽度(高度)
+            orgSize1 = $($(this).attr('div1'))[rType]();
+            // 获取右(下)部分的宽度(高度)
+            orgSize2 = $($(this).attr('div2'))[rType]();
+            // nav宽(高度)部分
+            objSize = $(this)[rType]();
+            //resizeElement.tooltip('hide');
+
+        });
+        $('body').mousemove(function (e) {
+            if (drag) {
+                const rType = obj.attr('r-type');
+                const moveSize = rType === 'height' ? e.clientY - startPos : e.clientX - startPos;
+                //实时刷新页面
+                mouseMoveCount += moveSize;
+                //当累计移动超过5个像素时,才刷新,减少刷新次数
+                if(Math.abs(mouseMoveCount) >=5){
+                    const min = obj.attr('min') ? obj.attr('min') : parseInt(((orgSize1 + orgSize2) / 10).toFixed(0));
+                    const max = orgSize1 + orgSize2 - min;
+
+                    // 判断拖动范围不能超出
+                    newSize1 = Math.min(Math.max(orgSize1 + moveSize, min), max);
+                    newSize2 = Math.min(Math.max(orgSize2 - moveSize, min), max);
+                    $(obj.attr('div1')).css(rType, newSize1);
+                    $(obj.attr('div2')).css(rType, newSize2);
+
+                    if(setting.callback) { setting.callback(); }
+                    mouseMoveCount = 0;
+                }
+            }
+        });
+        $('body').mouseup(function () {
+            if (drag) {
+                drag = false;
+                const rType = obj.attr('r-type');
+                const localId = obj.attr('store-id'), div1 = $(obj.attr('div1')), div2 = $(obj.attr('div2'));
+                setLocalCache('v-resize-1-' + localId, div1[rType]());
+                setLocalCache('v-resize-2-' + localId, div2[rType]());
+            }
+        });
+    }
+})(jQuery);

+ 44 - 0
app/public/js/global.js

@@ -250,4 +250,48 @@ function getQueryVariable(variable) {
 const zeroRange = 0.00000001;
 function checkZero(value) {
     return _.isNumber(value) && value !== Math.abs(value) < zeroRange;
+}
+
+/**
+ * 设置本地缓存
+ *
+ * @param {String} key
+ * @param {String|Number} value
+ * @return {void}
+ */
+function setLocalCache(key, value) {
+    const storage = window.localStorage;
+    if (!storage || key === '' || value === '') {
+        return;
+    }
+
+    storage.setItem(key, value);
+}
+
+/**
+ * 获取本地缓存
+ *
+ * @param {String} key
+ * @return {String}
+ */
+function getLocalCache(key) {
+    const storage = window.localStorage;
+    if (!storage || key === '') {
+        return null;
+    }
+
+    return storage.getItem(key);
+}
+
+/**
+ * 移除本地缓存
+ * @param {String} key
+ * @returns {Boolean}
+ */
+function removeLocalCache(key) {
+    const storage = window.localStorage;
+    if (!storage || key === '') {
+        return null;
+    }
+    return storage.removeItem(key);
 }

+ 11 - 1
app/public/js/ledger.js

@@ -600,6 +600,15 @@ $(document).ready(function() {
 
     // 台账模式加载部位明细数据
     if (checkTzMeasureType()) {
+        $.divResizer({
+            select: '#main-resize',
+            callback: function () {
+                ledgerSpread.refresh();
+                let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
+                $(".sp-wrap").height(bcontent-40);
+                posSpread.refresh();
+            }
+        });
         SpreadJsObj.initSheet(posSpread.getActiveSheet(), posSpreadSetting);
         postData('/tender/' + getTenderId() + '/pos', null, function (data) {
             pos.loadDatas(data);
@@ -737,7 +746,7 @@ $(document).ready(function() {
                 data.updateData.push(sortData[iRow + row].id);
             }
             postData('/tender/' + getTenderId() + '/pos/update', data, function (result) {
-                pos.updateDatas(result.pos);
+                pos.removeDatas(result.pos);
                 sheet.deleteRows(row, count);
                 ledgerTree.loadPostData(result.ledger, function (loadResult) {
                     treeOperationObj.refreshTree(ledgerSpread.getActiveSheet(), loadResult);
@@ -1122,6 +1131,7 @@ $(document).ready(function() {
                     insertData.batchType = (select.code && select.code !== '') ? 'child' : 'next';
                     insertData.id = select[ledgerTree.setting.id];
                     insertData.batchData = self.getBatchData();
+                    console.log(insertData.batchData);
                     postData('/tender/' + getTenderId() + '/ledger/batch-insert', insertData, function (data) {
                         pos.updateDatas(data.pos);
                         ledgerTree.loadPostData(data.ledger, function (result) {

+ 9 - 0
app/public/js/ledger_audit.js

@@ -40,6 +40,15 @@ $(document).ready(() => {
 
     // 台账模式加载部位明细数据
     if (checkTzMeasureType()) {
+        $.divResizer({
+            select: '#main-resize',
+            callback: function () {
+                ledgerSpread.refresh();
+                let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
+                $(".sp-wrap").height(bcontent-40);
+                posSpread.refresh();
+            }
+        });
         SpreadJsObj.initSheet(posSpread.getActiveSheet(), posSpreadSetting);
         postData('/tender/' + getTenderId() + '/pos', null, function (data) {
             pos.loadDatas(data);

+ 5 - 2
app/public/js/ledger_tree_col.js

@@ -14,11 +14,14 @@ const ledgerTreeCol = {
             return node.children && node.children.length > 0;
         },
         quantity: function (node) {
-            return (node.children && node.children.length > 0) || _.isEmpty(node.b_code);
+            return (node.children && node.children.length > 0);
         },
         total_price: function (node) {
             return node.children && node.children.length > 0;
-        }
+        },
+        dgnQty: function (node) {
+            return !_.isEmpty(node.b_code);
+        },
     },
     getEvent: function (eventName) {
         const names = eventName.split('.');

+ 15 - 5
app/public/js/path_tree.js

@@ -72,9 +72,11 @@ class PosData {
      * @param datas
      */
     removeDatas(data) {
+        if (!data) { return; }
         const datas = data instanceof Array ? data : [data];
         for (let i = datas.length - 1; i >= 0; i--) {
-            const d = datas[i];
+            const id = datas[i];
+            const d = this.getPos(id);
             this.datas.splice(this.datas.indexOf(d), 1);
             const key = itemsPre + d[this.setting.id];
             delete this.items[key];
@@ -550,21 +552,29 @@ const createNewPathTree = function (type, setting) {
          */
         _updateData (datas) {
             datas = datas instanceof Array ? datas : [datas];
-            const loadedData = [];
+            let loadedData = [];
             for (const data of datas) {
                 let node = this.getItems(data[this.setting.id]);
                 if (node) {
                     for (const prop in node) {
-                        if (data[prop] !== undefined) {
+                        if (prop === this.setting.pid && data[prop] !== node[prop]) {
+
+                        }
+                        if (data[prop] !== undefined && data[prop] !== node[prop]) {
+                            if (prop === this.setting.pid) {
+                                loadedData.push(this.getItems(node[this.setting.pid]));
+                                loadedData.push(this.getItems(data[this.setting.pid]));
+                            }
                             node[prop] = data[prop];
                         }
                     }
                     loadedData.push(node);
                 }
             }
+            loadedData = _.uniq(loadedData);
             for (const node of loadedData) {
-                const children = this.getChildren(node);
-                node.expanded = children.length > 0 && children[0].visible;
+                node.children = this.getChildren(node);
+                node.expanded = node.children.length > 0 && node.children[0].visible;
             }
             this.sortTreeNode(true);
             return loadedData;

+ 4 - 4
app/public/js/spreadjs_rela/spreadjs_zh.js

@@ -695,7 +695,7 @@ const SpreadJsObj = {
                             if (centerX < x + w) {
                                 const x1 = centerX + indent / 2;
                                 //drawLine(canvas, centerX, centerY, Math.min(x1, x + w), centerY, 'gray');
-                                drawDotLine(canvas, centerX, centerY, Math.min(x1, x + w), centerY, '#ccc');
+                                drawDotLine(canvas, centerX, centerY, Math.min(x1, x + w), centerY, '#b8b8b8');
                             }
                             // Draw Vertical Line
                             if (centerX < x + w) {
@@ -704,10 +704,10 @@ const SpreadJsObj = {
                                 const y2 = y1 - centerY;
                                 if (node.order === 1 && !parent) {
                                     //drawLine(canvas, centerX, centerY, centerX, y1, 'gray');
-                                    drawDotLine(canvas, centerX, centerY, centerX, y1, '#ccc');
+                                    drawDotLine(canvas, centerX, centerY, centerX, y1, '#b8b8b8');
                                 } else {
                                     //drawLine(canvas, centerX, y, centerX, y1, 'gray');
-                                    drawDotLine(canvas, centerX, y, centerX, y1, '#ccc');
+                                    drawDotLine(canvas, centerX, y, centerX, y1, '#b8b8b8');
                                 }
                             }
                         }
@@ -722,7 +722,7 @@ const SpreadJsObj = {
                                 if (!tree.isLastSibling(parent)) {
                                     if (parentCenterX < x + w) {
                                         //drawLine(canvas, parentCenterX, y, parentCenterX, y + h, 'gray');
-                                        drawDotLine(canvas, parentCenterX, y, parentCenterX, y + h, '#ccc');
+                                        drawDotLine(canvas, parentCenterX, y, parentCenterX, y + h, '#b8b8b8');
                                     }
                                 }
                                 parent = tree.getParent(parent);

+ 10 - 0
app/public/js/stage.js

@@ -457,6 +457,16 @@ $(document).ready(() => {
             }
         },
     };
+    // 加载上下窗口resizer
+    $.divResizer({
+        select: '#main-resize',
+        callback: function () {
+            slSpread.refresh();
+            let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
+            $(".sp-wrap").height(bcontent-40);
+            spSpread.refresh();
+        }
+    });
 
     // 加载部位明细数据 - 暂时统一加载,如有需要,切换成动态加载并缓存
     postData(window.location.pathname + '/pos', null, function (result) {

+ 10 - 0
app/public/js/stage_compare.js

@@ -50,6 +50,16 @@ $(document).ready(function () {
     // 初始化部位
     const posSpread = SpreadJsObj.createNewSpread($('#pos-spread')[0]);
     SpreadJsObj.initSheet(posSpread.getActiveSheet(), posSpreadSetting);
+    // 上下窗口resizer
+    $.divResizer({
+        select: '#main-resize',
+        callback: function () {
+            ledgerSpread.refresh();
+            let bcontent = $(".bcontent-wrap").length > 0 ? $(".bcontent-wrap").height() : 0;
+            $(".sp-wrap").height(bcontent-40);
+            posSpread.refresh();
+        }
+    });
     // 加载 台账树结构 数据
     const scTreeSetting = {
         id: 'ledger_id',

+ 10 - 0
app/public/js/stage_gather.js

@@ -16,6 +16,16 @@ $(document).ready(function () {
     // 初始化所属项目节
     const leafXmjSpread = SpreadJsObj.createNewSpread($('#leaf-xmj-spread')[0]);
     SpreadJsObj.initSheet(leafXmjSpread.getActiveSheet(), leafXmjSpreadSetting);
+    // 上下窗口resizer
+    $.divResizer({
+        select: '#main-resize',
+        callback: function () {
+            gclSpread.refresh();
+            let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
+            $(".sp-wrap").height(bcontent-40);
+            leafXmjSpread.refresh();
+        }
+    });
     // 解析清单汇总数据
     gclGatherModel.loadLedgerData(ledger, curLedgerData, []);
     gclGatherModel.loadPosData(pos, curPosData);

+ 23 - 6
app/service/ledger.js

@@ -1167,6 +1167,14 @@ module.exports = app => {
                     level: selectData.level - 1,
                     full_path: newFullPath,
                 };
+                const nexts = await this.getNextsData(tenderId, parentData.ledger_id, selectData.order);
+                if (nexts.length > 0) {
+                    updateData.unit_price = null;
+                    updateData.quantity = null;
+                    updateData.total_price = null;
+                    updateData.deal_qty = null;
+                    updateData.deal_tp = null;
+                }
                 await this.transaction.update(this.tableName, updateData);
                 // 选中节点--全部子节点(含孙) level-1, full_path变更
                 await this._syncUplevelChildren(selectData);
@@ -1257,11 +1265,16 @@ module.exports = app => {
                 await this.transaction.update(this.tableName, updateData);
                 // 选中节点--全部子节点(含孙) level++, full_path
                 await this._syncDownlevelChildren(selectData, preData);
-                // 选中节点--前兄弟节点 is_leaf应为false
-                if (preData.is_leaf) {
+                // 选中节点--前兄弟节点 is_leaf应为false, 清空计算相关字段
+                if (preData.is_leaf || preData.unit_price || preData.quantity || preData.total_price || preData.deal_qty || preData.deal_tp) {
                     const updateData2 = {
                         id: preData.id,
                         is_leaf: false,
+                        unit_price: null,
+                        quantity: null,
+                        total_price: null,
+                        deal_qty: null,
+                        deal_tp: null,
                     };
                     await this.transaction.update(this.tableName, updateData2);
                 }
@@ -1723,8 +1736,10 @@ module.exports = app => {
                     const insertResult = await this.transaction.insert(this.tableName, qd);
                     qd.id = insertResult.insertId;
                     newIds.push(insertResult.insertId);
-                    await this.ctx.service.pos.insertLedgerPosData(this.transaction, tenderId, qd, data[i].pos);
-                    await this.calc(tenderId, insertResult.insertId, this.transaction);
+                    if (data[i].pos.length > 0) {
+                        await this.ctx.service.pos.insertLedgerPosData(this.transaction, tenderId, qd, data[i].pos);
+                        await this.calc(tenderId, insertResult.insertId, this.transaction);
+                    }
                 }
                 this.cache.set(cacheKey, maxId + data.length + 1, 'EX', this.ctx.app.config.cacheTime);
                 await this.transaction.commit();
@@ -1793,8 +1808,10 @@ module.exports = app => {
                     const insertResult = await this.transaction.insert(this.tableName, qd);
                     qd.id = insertResult.insertId;
                     newIds.push(insertResult.insertId);
-                    await this.ctx.service.pos.insertLedgerPosData(this.transaction, tenderId, qd, data[i].pos);
-                    await this.calc(tenderId, insertResult.insertId, this.transaction);
+                    if (data[i].pos.length > 0) {
+                        await this.ctx.service.pos.insertLedgerPosData(this.transaction, tenderId, qd, data[i].pos);
+                        await this.calc(tenderId, insertResult.insertId, this.transaction);
+                    }
                 }
                 this.cache.set(cacheKey, maxId + data.length + 1, 'EX', this.ctx.app.config.cacheTime);
                 await this.transaction.commit();

+ 2 - 1
app/view/ledger/audit.ejs

@@ -29,7 +29,8 @@
                 <div class="sjs-height-1" id="ledger-spread">
                 </div>
                 <% if (tender.measure_type === measureType.tz.value) { %>
-                <div class="bcontent-wrap">
+                <div id="main-resize" r-Type="height" div1="#ledger-spread" div2="#main-bottom" store-id="audit-main" min="100"></div>
+                <div class="bcontent-wrap" id="main-bottom">
                     <div class="bc-bar mb-1">
                         <ul class="nav nav-tabs">
                             <li class="nav-item">

+ 2 - 1
app/view/ledger/explode.ejs

@@ -59,7 +59,8 @@
             <div class="c-body col-12">
                 <div id="ledger-spread" class="<% if (tender.measure_type === measureType.tz.value) { %>sjs-height-1<% } else { %>sjs-height-0<% } %>"></div>
                 <% if (tender.measure_type === measureType.tz.value) { %>
-                <div class="bcontent-wrap">
+                <div id="main-resize" r-Type="height" div1="#ledger-spread" div2="#main-bottom" store-id="explode-main" min="100"></div>
+                <div class="bcontent-wrap" id="main-bottom">
                     <div class="bc-bar mb-1">
                         <ul class="nav nav-tabs">
                             <li class="nav-item">

+ 2 - 1
app/view/stage/compare.ejs

@@ -20,7 +20,8 @@
         <div class="c-body">
             <div class="sjs-height-1" id="ledger-spread">
             </div>
-            <div class="bcontent-wrap">
+            <div id="main-resize" r-Type="height" div1="#ledger-spread" div2="#main-bottom" store-id="stage-compare" min="100"></div>
+            <div class="bcontent-wrap" id="main-bottom">
                 <div class="bc-bar mb-1">
                     <ul class="nav nav-tabs">
                         <li class="nav-item">

+ 2 - 1
app/view/stage/gather.ejs

@@ -43,7 +43,8 @@
         <div class="c-body">
             <div class="sjs-height-1" id="gcl-spread">
             </div>
-            <div class="bcontent-wrap">
+            <div id="main-resize" r-Type="height" div1="#gcl-spread" div2="#main-bottom" store-id="stage-gather" min="100"></div>
+            <div class="bcontent-wrap" id="main-bottom">
                 <div class="bc-bar mb-1">
                     <ul class="nav nav-tabs">
                         <li class="nav-item">

+ 3 - 2
app/view/stage/index.ejs

@@ -37,8 +37,9 @@
                 <!--上部分-->
                 <div class="sjs-height-1" id="stage-ledger">
                 </div>
+                <div id="main-resize" r-Type="height" div1="#stage-ledger" div2="#main-bottom" store-id="stage-main" min="100"></div>
                 <!--下部分-->
-                <div class="bcontent-wrap">
+                <div class="bcontent-wrap" id="main-bottom">
                     <div class="bc-bar mb-1">
                         <ul class="nav nav-tabs">
                             <li class="nav-item">
@@ -68,7 +69,7 @@
                 <div class="tab-content">
                     <!--中间审批记录-->
                     <div id="spjilu" class="tab-pane active">
-                        <div class="side-bar-1">
+                        <div class="sjs-bar-1">
                             <table class="table table-bordered m-0">
                                 <tr><th>清单编号</th><th>清单名称</th><th>上报数量</th></tr>
                                 <tr><td>201-1</td><td>清理现场</td><td>10</td></tr>

+ 6 - 0
config/web.js

@@ -70,11 +70,13 @@ const JsFiles = {
         ledger: {
             explode: {
                 files: [
+                    "/public/js/iframe-resizer/iframeResizer.js",
                     "/public/js/js-xlsx/xlsx.full.min.js",
                     "/public/js/js-xlsx/xlsx.utils.js",
                     "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
                 ],
                 mergeFiles: [
+                    "/public/js/div_resizer.js",
                     "/public/js/spreadjs_rela/spreadjs_zh.js",
                     "/public/js/path_tree.js",
                     "/public/js/ledger_tree_col.js",
@@ -87,6 +89,7 @@ const JsFiles = {
                     "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
                 ],
                 mergeFiles: [
+                    "/public/js/div_resizer.js",
                     "/public/js/spreadjs_rela/spreadjs_zh.js",
                     "/public/js/path_tree.js",
                     "/public/js/ledger_audit.js",
@@ -101,6 +104,7 @@ const JsFiles = {
                     "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
                 ],
                 mergeFiles: [
+                    "/public/js/div_resizer.js",
                     "/public/js/spreadjs_rela/spreadjs_zh.js",
                     "/public/js/path_tree.js",
                     "/public/js/stage.js",
@@ -128,6 +132,7 @@ const JsFiles = {
                     "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
                 ],
                 mergeFiles: [
+                    "/public/js/div_resizer.js",
                     "/public/js/spreadjs_rela/spreadjs_zh.js",
                     "/public/js/path_tree.js",
                     "/public/js/gcl_gather.js",
@@ -140,6 +145,7 @@ const JsFiles = {
                     "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
                 ],
                 mergeFiles: [
+                    "/public/js/div_resizer.js",
                     "/public/js/spreadjs_rela/spreadjs_zh.js",
                     "/public/js/path_tree.js",
                     "/public/js/stage_compare.js",