Selaa lähdekoodia

台账分解,右侧,动态加载标准清单,并动态加载3层以上节点

MaiXinRong 7 vuotta sitten
vanhempi
commit
c054d7ead2

+ 54 - 0
app/controller/standard_lib_controller.js

@@ -0,0 +1,54 @@
+'use strict';
+
+/**
+ * 标准库控制器基类
+ *
+ * @author Mai
+ * @date 2018/3/13
+ * @version
+ */
+
+
+const BaseController = require('../base/base_controller');
+
+
+class StandardLibController extends BaseController {
+
+    /**
+     * 构造函数
+     *
+     * @param {Object} ctx - egg全局变量
+     * @param {Object} model - 标准库名称
+     * @return {void}
+     */
+    constructor(ctx, model) {
+        super(ctx);
+        this.model = model;
+        this.app = null;
+    }
+
+    async getData(ctx) {
+        const responseData = {
+            err: 0,
+            msg: '',
+            data: [],
+        };
+        try {
+            const data = JSON.parse(ctx.request.body.data);
+            if (isNaN(data.list_id) || data.list_id <= 0) {
+                throw '参数错误';
+            }
+            const libData = await this.model.getData(data.list_id);
+
+            responseData.data = libData;
+        } catch (error) {
+            responseData.err = 1;
+            responseData.msg = error;
+        }
+
+        ctx.body = responseData;
+    }
+
+}
+
+module.exports = StandardLibController;

+ 58 - 0
app/controller/std_bills_controller.js

@@ -0,0 +1,58 @@
+'use strict';
+
+/**
+ * 标准清单控制器
+ *
+ * @author Mai
+ * @date 2018/3/13
+ * @version
+ */
+const StandardLibController = require('./standard_lib_controller');
+
+module.exports = app => {
+    class StdBillsController extends StandardLibController {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx, ctx.service.stdBills);
+            this.app = app;
+        }
+
+        /**
+         * 根据id获取子项
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async getChildren(ctx) {
+            const responseData = {
+                err: 0,
+                msg: '',
+                data: [],
+            };
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                if (isNaN(data.bill_id) || data.bill_id <= 0 || isNaN(data.list_id) || data.list_id <= 0) {
+                    throw '参数错误';
+                }
+                const condition = { pid: data.bill_id, list_id: data.list_id };
+                const libData = await this.model.getAllDataByCondition({ where: condition });
+
+                responseData.data = libData;
+            } catch (error) {
+                responseData.err = 1;
+                responseData.msg = error;
+            }
+
+            ctx.body = responseData;
+        }
+
+    }
+
+    return StdBillsController;
+};

+ 58 - 0
app/controller/std_chapter_controller.js

@@ -0,0 +1,58 @@
+'use strict';
+
+/**
+ * 标准清单控制器
+ *
+ * @author Mai
+ * @date 2018/3/13
+ * @version
+ */
+const StandardLibController = require('./standard_lib_controller');
+
+module.exports = app => {
+    class StdChapterController extends StandardLibController {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx, ctx.service.stdChapter);
+            this.app = app;
+        }
+
+        /**
+         * 根据id获取子项
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async getChildren(ctx) {
+            const responseData = {
+                err: 0,
+                msg: '',
+                data: [],
+            };
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                if (isNaN(data.chapter_id) || data.chapter_id <= 0 || isNaN(data.list_id) || data.list_id <= 0) {
+                    throw '参数错误';
+                }
+                const condition = { pid: data.chapter_id, list_id: data.list_id };
+                const libData = await this.model.getAllDataByCondition({ where: condition });
+
+                responseData.data = libData;
+            } catch (error) {
+                responseData.err = 1;
+                responseData.msg = error;
+            }
+
+            ctx.body = responseData;
+        }
+
+    }
+
+    return StdChapterController;
+};

+ 16 - 2
app/extend/helper.js

@@ -7,6 +7,7 @@
  * @date 2017/9/28
  * @version
  */
+const zeroRange = 0.0000000001;
 module.exports = {
 
     /**
@@ -201,12 +202,25 @@ module.exports = {
 
     /**
      * 检查数字是否为0
-     * @param value
+     * @param {Number} value
+     * @return {boolean}
      */
     checkZero(value) {
-        const zeroRange = 0.0000000001;
         return value && Math.abs(value) > zeroRange;
     },
+    /**
+     * 检查数字是否相等
+     * @param {Number} value1
+     * @param {Number} value2
+     * @returns {boolean}
+     */
+    checkNumberEqual(value1, value2) {
+        if (value1 && value2) {
+            return Math.abs(value2 - value1) > zeroRange;
+        } else {
+            return (!value1 && !value2)
+        }
+    },
 
     /**
      * 判断当前用户是否有指定权限

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

@@ -77,3 +77,43 @@ function toast(message, type, icon)
         toast.children('.icon').removeClass(iconClass);
     }, 3000);
 }
+
+/**
+ * 动态请求数据
+ * @param {String} url - 请求链接
+ * @param data - 提交数据
+ * @param {function} successCallback - 返回成功回调
+ * @param {function} errorCallBack - 返回失败回调
+ */
+const postData = function (url, data, successCallback, errorCallBack) {
+    $.ajax({
+        type:"POST",
+        url: url,
+        data: {'data': JSON.stringify(data)},
+        dataType: 'json',
+        cache: false,
+        timeout: 5000,
+        beforeSend: function(xhr) {
+            let csrfToken = Cookies.get('csrfToken');
+            xhr.setRequestHeader('x-csrf-token', csrfToken);
+        },
+        success: function(result){
+            if (result.err === 0) {
+                if (successCallback) {
+                    successCallback(result.data);
+                }
+            } else {
+                toast('error: ' + result.message, 'error', 'exclamation-circle');
+                if (errorCallBack) {
+                    errorCallBack();
+                }
+            }
+        },
+        error: function(jqXHR, textStatus, errorThrown){
+            toast('error ' + textStatus + " " + errorThrown, 'error', 'exclamation-circle');
+            if (errorCallBack) {
+                errorCallBack();
+            }
+        }
+    });
+};

+ 88 - 6
app/public/js/ledger.js

@@ -59,7 +59,7 @@ $(document).ready(function() {
             setObjEnable($('#delete'), node);
             setObjEnable($('#up-move'), node && node.order > 1);
             setObjEnable($('#down-move'), node && !tree.isLastSibling(node));
-            setObjEnable($('#up-level'), tree.getParent(node));
+            setObjEnable($('#up-level'), node && tree.getParent(node));
             setObjEnable($('#down-level'), node && node.order > 1);
         },
         /**
@@ -358,15 +358,12 @@ $(document).ready(function() {
     ledgerSpread.bind(GC.Spread.Sheets.Events.ClipboardPasted, treeOperationObj.clipboardPasted);
     SpreadJsObj.addDeleteBind(ledgerSpread, treeOperationObj.deletePress);
     ledgerSpread.bind(GC.Spread.Sheets.Events.ClipboardChanging, function (e, info) {
-        info.copyData.html = SpreadJsObj.getFilterCopyHTML(info.sheet);
-        info.copyData.text = SpreadJsObj.getFilterCopyText(info.sheet);
-        console.log(info.copyData.text);
+        const copyText = SpreadJsObj.getFilterCopyText(info.sheet);
     });
     ledgerSpread.bind(GC.Spread.Sheets.Events.ClipboardChanged, function (e, info) {
         console.log(info.copyData.text);
     });
     ledgerSpread.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (e, info) {
-       console.log(info.pasteData.text);
     });
 
     // 绑定 删除等 顶部按钮
@@ -474,4 +471,89 @@ $(document).ready(function() {
             }
         }
     });
-});
+
+    let stdChapter, stdBills;
+    // 展开收起标准清单
+    $('a', '#std-lib').bind('click', function () {
+        const tab = $(this), tabPanel = $(tab.attr('content'));
+        const showSideTools = function (show) {
+            if (show) {
+                $('.c-body.col-12').removeClass('col-12').addClass('col-8');
+                $('.c-body.col-0').removeClass('col-0').addClass('col-4').show();
+            } else {
+                $('.c-body.col-8').removeClass('col-8').addClass('col-12');
+                $('.c-body.col-4').removeClass('col-4').addClass('col-0').hide();
+            }
+        }
+        if (!tab.hasClass('active')) {
+            $('a', '#std-lib').removeClass('active');
+            tab.addClass('active');
+            showSideTools(tab.hasClass('active'));
+            $('.tab-content .tab-pane').hide();
+            tabPanel.show();
+            if (tab.attr('content') === '#std-chapter' && !stdChapter) {
+                stdChapter = new stdLib($('#std-chapter-spread')[0], '/std/chapter', {
+                    id: 'chapter_id',
+                    pid: 'pid',
+                    order: 'order',
+                    level: 'level',
+                    rootId: -1,
+                    keys: ['id', 'list_id', 'chapter_id'],
+                }, {
+                    cols: [
+                        {title: '项目节编号', field: 'code', width: 120, cellType: 'tree'},
+                        {title: '名称', field: 'name', width: 230},
+                        {title: '单位', field: 'unit', width: 50}
+                    ],
+                    treeCol: 0,
+                    emptyRows: 0
+                });
+                stdChapter.loadLib(1);
+            } else if (tab.attr('content') === '#std-bills' && !stdBills) {
+                stdBills = new stdLib($('#std-bills-spread')[0], '/std/bills', {
+                    id: 'bill_id',
+                    pid: 'pid',
+                    order: 'order',
+                    level: 'level',
+                    rootId: -1,
+                    keys: ['id', 'list_id', 'bill_id']
+                }, {
+                    cols: [
+                        {title: '清单编号', field: 'code', width: 120, cellType: 'tree'},
+                        {title: '名称', field: 'name', width: 230},
+                        {title: '单位', field: 'unit', width: 50}
+                    ],
+                    treeCol: 0,
+                    emptyRows: 0
+                });
+                stdBills.loadLib(1);
+            }
+        } else {
+            tab.removeClass('active');
+            showSideTools(tab.hasClass('active'));
+            tabPanel.hide();
+        }
+        ledgerSpread.refresh();
+    });
+
+    class stdLib {
+        constructor(obj, url, treeSetting, spreadSetting) {
+            this.obj = obj;
+            this.url = url;
+            this.treeSetting = treeSetting;
+            treeSetting.preUrl = url;
+            this.spreadSetting = spreadSetting;
+            this.spread = SpreadJsObj.createNewSpread(this.obj);
+            SpreadJsObj.initSheet(this.spread.getActiveSheet(), this.spreadSetting);
+            this.pathTree = createNewPathTree(this.treeSetting);
+        }
+        loadLib (listId) {
+            const self = this;
+            postData(this.url+'/get-data', {list_id: listId}, function (data) {
+                self.pathTree.loadDatas(data);
+                SpreadJsObj.loadSheetData(self.spread.getActiveSheet(), 'tree', self.pathTree);
+            });
+        }
+    };
+});
+

+ 2 - 33
app/public/js/path_tree.js

@@ -2,38 +2,6 @@
 const createNewPathTree = function (setting) {
     const treeSetting = JSON.parse(JSON.stringify(setting));
     const itemsPre = 'id_';
-    const postData = function (url, data, successCallback, errowCallBack) {
-        $.ajax({
-            type:"POST",
-            url: url,
-            data: {'data': JSON.stringify(data)},
-            dataType: 'json',
-            cache: false,
-            timeout: 5000,
-            beforeSend: function(xhr) {
-                let csrfToken = Cookies.get('csrfToken');
-                xhr.setRequestHeader('x-csrf-token', csrfToken);
-            },
-            success: function(result){
-                if (result.err === 0) {
-                    if (successCallback) {
-                        successCallback(result.data);
-                    }
-                } else {
-                    toast('error: ' + result.message, 'error', 'exclamation-circle');
-                    if (errowCallBack) {
-                        errowCallBack();
-                    }
-                }
-            },
-            error: function(jqXHR, textStatus, errorThrown){
-                toast('error ' + textStatus + " " + errorThrown, 'error', 'exclamation-circle');
-                if (errowCallBack) {
-                    errowCallBack();
-                }
-            }
-        });
-    };
 
     const PathTree = function () {
         // 无索引
@@ -246,7 +214,8 @@ const createNewPathTree = function (setting) {
      */
     proto.loadChildren = function (node, callback) {
         const self = this;
-        postData('get-children', {id: node[treeSetting.id]}, function (data) {
+        const url = treeSetting.preUrl ? treeSetting.preUrl + '/get-children' : 'get-children';
+        postData(url, this.getNodeKeyData(node), function (data) {
             self._loadData(data);
             callback();
         });

+ 6 - 0
app/router.js

@@ -54,4 +54,10 @@ module.exports = app => {
 
     // 计量管理相关
     app.get('/measure/middle', sessionAuth, 'measureController.middle');
+
+    //标准库相关
+    app.post('/std/bills/get-data', sessionAuth, 'stdBillsController.getData');
+    app.post('/std/bills/get-children', sessionAuth, 'stdBillsController.getChildren');
+    app.post('/std/chapter/get-data', sessionAuth, 'stdChapterController.getData');
+    app.post('/std/chapter/get-children', sessionAuth, 'stdChapterController.getChildren');
 };

+ 33 - 28
app/service/ledger.js

@@ -40,6 +40,29 @@ module.exports = app => {
             this.tableName = 'ledger';
         }
 
+        async innerAdd(data, tenderId, transaction) {
+            const datas = data instanceof Array ? data : [data];
+            if (tenderId <= 0) {
+                throw '标段id错误';
+            }
+            // 数组则为批量插入
+            if (datas.length <= 0) {
+                throw '插入数据为空';
+            }
+            // 整理数据
+            const insertData = [];
+            for (const tmp of datas) {
+                tmp.ledger_id = tmp.id;
+                tmp.ledger_pid = tmp.pid;
+                tmp.tender_id = tenderId;
+                delete tmp.id;
+                delete tmp.pid;
+                insertData.push(tmp);
+            }
+            const operate = await transaction.insert(this.tableName, insertData);
+            return operate.affectedRows === datas.length;
+        }
+
         /**
          * 新增数据
          *
@@ -51,31 +74,13 @@ module.exports = app => {
             this.transaction = await this.db.beginTransaction();
             let result = false;
             try {
-                if (tenderId <= 0) {
-                    throw '标段id错误';
-                }
-                if (data instanceof Array) {
-                    // 数组则为批量插入
-                    if (data.length <= 0) {
-                        throw '插入数据为空';
-                    }
-                    // 整理数据
-                    const insertData = [];
-                    for (const tmp of data) {
-                        tmp.ledger_id = tmp.id;
-                        tmp.ledger_pid = tmp.pid;
-                        tmp.tender_id = tenderId;
-                        delete tmp.id;
-                        delete tmp.pid;
-                        insertData.push(tmp);
-                    }
-                    const operate = await this.transaction.insert(this.tableName, insertData);
-                    this.transaction.commit();
-                    result = operate.affectedRows > 0;
-                } else {
-                    // 对象则单个插入
+                result = await this.innerAdd(data, tenderId, this.transaction);
+                if (!result) {
+                    throw '新增数据错误';
                 }
+                this.transaction.commit();
             } catch (error) {
+                this.transaction.rollback();
                 result = false;
             }
 
@@ -550,7 +555,7 @@ module.exports = app => {
                 // 选中节点--全部后节点 order--
                 await this._updateSelectNextsOrder(selectData, -1);
                 // 更新父项金额
-                if (selectData.total_price && Math.abs(selectData.total_price) > zeroRange) {
+                if (this.ctx.helper.checkZero(selectData.total_price)) {
                     const parentFullPath = selectData.full_path.replace('.' + selectData.ledger_id, '');
                     const updateMap = {};
                     updateMap[parentFullPath] = -selectData.total_price;
@@ -568,7 +573,7 @@ module.exports = app => {
                 updateData = await this.getNextsData(tenderId, selectData.ledger_pid, selectData.order - 1);
                 updateData = updateData ? updateData : [];
                 const updateData1 = await this.getDataByNodeId(tenderId, selectData.ledger_pid);
-                if (selectData.total_price && Math.abs(selectData.total_price) > zeroRange) {
+                if (this.ctx.helper.checkZero(selectData.total_price)) {
                     const updateData2 = await this.getFullLevelDataByFullPath(tenderId, updateData1.full_path);
                     updateData = updateData.concat(updateData2);
                 } else if (updateData1.is_leaf !== parentData.is_leaf) {
@@ -1108,7 +1113,7 @@ module.exports = app => {
                     await this.transaction.insert(this.tableName, datas);
                 }
                 // 更新父节点金额
-                if (Math.abs(incre) > zeroRange) {
+                if (this.ctx.helper.checkZero(incre)) {
                     const updateMap = {};
                     updateMap[newParentPath] = incre;
                     await this._increCalcParent(tenderId, updateMap);
@@ -1126,7 +1131,7 @@ module.exports = app => {
             }
             const createData = await this.getDataByParentAndOrder(selectData.tender_id, selectData.ledger_pid, order);
             const updateData = await this.getNextsData(selectData.tender_id, selectData.ledger_pid, selectData.order + copyNodes.length);
-            if (Math.abs(incre) > zeroRange) {
+            if (this.ctx.helper.checkZero(incre)) {
                 const updateData1 = await this.getFullLevelDataByFullPath(selectData.tender_id, newParentPath);
                 return { create: createData, update: updateData.concat(updateData1) };
             } else {
@@ -1204,7 +1209,7 @@ module.exports = app => {
                         if (updateNode.is_leaf) {
                             calcData.total_price = calcData.quantity * calcData.unit_price;
                         }
-                        if (updateNode.total_price === undefined || Math.abs(calcData.total_price - updateNode.total_price) > zeroRange) {
+                        if (updateNode.total_price === undefined || this.ctx.helper.checkZero(calcData.total_price - updateNode.total_price)) {
                             const pfp = updateNode.full_path.replace('.' + updateNode.ledger_id, '');
                             if (updateMap[pfp]) {
                                 updateMap[pfp] = updateMap[pfp] + calcData.total_price - updateNode.total_price;

+ 51 - 0
app/service/standard_lib.js

@@ -0,0 +1,51 @@
+'use strict';
+/**
+ * 标准库基类
+ *
+ * @author Mai
+ * @date 2018/3/13
+ * @version
+ */
+
+const BaseService = require('../base/base_service');
+
+class StandardLib extends BaseService {
+
+    /**
+     * 构造函数
+     *
+     * @param {Object} ctx - egg全局变量
+     * @param {String} tableName - 表名
+     * @return {void}
+     */
+    constructor(ctx, tableName) {
+        super(ctx);
+        this.tableName = tableName;
+    }
+
+    /**
+     * 获取数据
+     *
+     * @param {Number} listId - 项目节列表id
+     * @param {Number} level - 小于此层级的全部不显示
+     * @return {Array} - 返回对应数据
+     */
+    async getData(listId, level = 2) {
+        this.initSqlBuilder();
+        this.sqlBuilder.setAndWhere('list_id', {
+            operate: '=',
+            value: listId,
+        });
+
+        this.sqlBuilder.setAndWhere('level', {
+            operate: '<=',
+            value: level,
+        });
+        const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+        const list = await this.db.query(sql, sqlParam);
+
+        return list;
+    }
+}
+
+module.exports = StandardLib;

+ 30 - 0
app/service/std_bills.js

@@ -0,0 +1,30 @@
+'use strict';
+
+/**
+ * 标准清单业务逻辑
+ *
+ * @author Mai
+ * @date 2018/3/13
+ * @version
+ */
+
+const StandardLib = require('./standard_lib');
+module.exports = app => {
+
+    class StdBills extends StandardLib {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx, 'bill');
+            this.dataId = 'bill_id';
+        }
+
+    }
+
+    return StdBills;
+};

+ 30 - 0
app/service/std_chapter.js

@@ -0,0 +1,30 @@
+'use strict';
+
+/**
+ * 标准项目节业务逻辑
+ *
+ * @author Mai
+ * @date 2018/3/13
+ * @version
+ */
+
+const StandardLib = require('./standard_lib');
+module.exports = app => {
+
+    class StdChapter extends StandardLib {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx, 'project_chapter');
+            this.dataId = 'chapter_id';
+        }
+
+    }
+
+    return StdChapter;
+};

+ 37 - 14
app/service/tender.js

@@ -73,20 +73,43 @@ module.exports = app => {
          * @return {Boolean} - 返回新增结果
          */
         async add(postData) {
-            // 获取当前用户信息
-            const sessionUser = this.ctx.session.sessionUser;
-            // 获取当前项目信息
-            const sessionProject = this.ctx.session.sessionProject;
-            const insertData = {
-                name: postData.name,
-                status: tenderConst.status.APPROVAL,
-                project_id: sessionProject.id,
-                user_id: sessionUser.accountId,
-                create_time: postData.create_time,
-                type: postData.type,
-            };
-            const operate = await this.db.insert(this.tableName, insertData);
-            return operate.insertId > 0;
+            let result = false;
+            this.transaction = await this.db.beginTransaction();
+            try {
+                // 获取当前用户信息
+                const sessionUser = this.ctx.session.sessionUser;
+                // 获取当前项目信息
+                const sessionProject = this.ctx.session.sessionProject;
+
+                const insertData = {
+                    name: postData.name,
+                    status: tenderConst.status.APPROVAL,
+                    project_id: sessionProject.id,
+                    user_id: sessionUser.accountId,
+                    create_time: postData.create_time,
+                    type: postData.type,
+                };
+                const operate = await this.transaction.insert(this.tableName, insertData);
+
+                result = operate.insertId > 0;
+                if (!result) {
+                    throw '新增标段数据失败';
+                }
+
+                // 获取标段项目节点模板
+                const tenderNodeTemplateData = await this.ctx.service.tenderNodeTemplate.getData();
+                // 复制模板数据到标段数据表
+                result = await this.ctx.service.ledger.innerAdd(tenderNodeTemplateData, operate.insertId, this.transaction);
+
+                if (!result) {
+                    throw '新增标段项目节点失败';
+                }
+                this.transaction.commit();
+            } catch (error) {
+                result = false;
+                this.transaction.rollback();
+            }
+            return result;
         }
 
     }

+ 9 - 107
app/view/ledger/explode.ejs

@@ -51,129 +51,31 @@
         <div class="c-header p-0 col-12 d-flex flex-row-reverse">
 
             <!--标准清单-->
-            <ul class="nav nav-tabs">
+            <ul class="nav nav-tabs" id="std-lib">
                 <li class="nav-item">
-                    <a class="nav-link active" data-toggle="tab" href="#xiangmujie" role="tab">项目节</a>
+                    <a class="nav-link" content="#std-chapter">项目节</a>
                 </li>
                 <li class="nav-item">
-                    <a class="nav-link" data-toggle="tab" href="#qingdan" role="tab">工程量清单</a>
+                    <a class="nav-link" content="#std-bills">工程量清单</a>
                 </li>
             </ul>
         </div>
-        <div class="c-body col-8">
+        <div class="c-body col-12">
             <div id="ledger-spread" class="sjs-height-1"></div>
-            <!--<table class="table table-bordered">-->
-                <!--<tr>-->
-                    <!--<th></th>-->
-                    <!--<th>项目节编号</th>-->
-                    <!--<th>清单编号</th>-->
-                    <!--<th>名称</th>-->
-                    <!--<th>单位</th>-->
-                    <!--<th>单价</th>-->
-                    <!--<th>数量</th>-->
-                    <!--<th>金额</th>-->
-                    <!--<th>施工图原设计</th>-->
-                    <!--<th>图(册)号</th>-->
-                    <!--<th>备注</th>-->
-                <!--</tr>-->
-            <!--</table>-->
-            <!--查看审批过程-->
-            <!--<table class="table table-bordered">-->
-                <!--<thead>-->
-                <!--<tr>-->
-                    <!--<th rowspan="2">1</th>-->
-                    <!--<th rowspan="2">项目节编号</th>-->
-                    <!--<th rowspan="2">清单编号</th>-->
-                    <!--<th rowspan="2">名称</th>-->
-                    <!--<th rowspan="2">单位</th>-->
-                    <!--<th rowspan="2">单价</th>-->
-                    <!--<th colspan="2">上报</th>-->
-                    <!--<th colspan="3">一审王五</th>-->
-                    <!--<th colspan="3">二审张三</th>-->
-                    <!--<th rowspan="2">图(册)号</th>-->
-                    <!--<th rowspan="2">备注</th>-->
-                    <!--<th rowspan="2">审批新增</th>-->
-                <!--</tr>-->
-                <!--<tr>-->
-                    <!--<th>数量</th>-->
-                    <!--<th>金额</th>-->
-                    <!--<th>数量</th>-->
-                    <!--<th>金额</th>-->
-                    <!--<th>审批意见</th>-->
-                    <!--<th>数量</th>-->
-                    <!--<th>金额</th>-->
-                    <!--<th>审批意见</th>-->
-                <!--</tr>-->
-                <!--</thead>-->
-                <!--<tbody>-->
-                <!--<tr>-->
-                    <!--<td>2</td>-->
-                    <!--<td></td>-->
-                    <!--<td>203-1-1</td>-->
-                    <!--<td>挖土方</td>-->
-                    <!--<td>m3</td>-->
-                    <!--<td>7.54</td>-->
-                    <!--<td>92954.75</td>-->
-                    <!--<td>699949</td>-->
-                    <!--<td>92954.75</td>-->
-                    <!--<td>699949</td>-->
-                    <!--<td>审批意见</td>-->
-                    <!--<td>92954.75</td>-->
-                    <!--<td>699949</td>-->
-                    <!--<td>审批意见</td>-->
-                    <!--<td></td>-->
-                    <!--<td></td>-->
-                    <!--<td></td>-->
-                <!--</tr>-->
-                <!--<tr class="table-success">-->
-                    <!--<td>2</td>-->
-                    <!--<td></td>-->
-                    <!--<td>203-1-1</td>-->
-                    <!--<td>挖土方</td>-->
-                    <!--<td>m3</td>-->
-                    <!--<td>7.54</td>-->
-                    <!--<td>92954.75</td>-->
-                    <!--<td>699949</td>-->
-                    <!--<td>92954.75</td>-->
-                    <!--<td>699949</td>-->
-                    <!--<td>审批意见</td>-->
-                    <!--<td>92954.75</td>-->
-                    <!--<td>699949</td>-->
-                    <!--<td>审批意见</td>-->
-                    <!--<td></td>-->
-                    <!--<td></td>-->
-                    <!--<td>一审王五</td>-->
-                <!--</tr>-->
-                <!--</tbody>-->
-            <!--</table>-->
         </div>
-        <div class="c-body col-4">
+        <div class="c-body col-0" style="display: none;">
             <div class="tab-content">
-                <div id="xiangmujie" class="tab-pane active">
+                <div id="std-chapter" class="tab-pane">
                     <select class="form-control form-control-sm">
                         <option>0号计量台帐部位参考(项目节)</option>
                     </select>
-                    <table class="table table-bordered">
-                        <tr>
-                            <th></th>
-                            <th>项目节编号</th>
-                            <th>名称</th>
-                            <th>单位</th>
-                        </tr>
-                    </table>
+                    <div id="std-chapter-spread" class="sjs-height-2"></div>
                 </div>
-                <div id="qingdan" class="tab-pane">
+                <div id="std-bills" class="tab-pane">
                     <select class="form-control form-control-sm">
                         <option>0号计量台帐部位参考(项目节)</option>
                     </select>
-                    <table class="table table-bordered">
-                        <tr>
-                            <th></th>
-                            <th>清单编号</th>
-                            <th>名称</th>
-                            <th>单位</th>
-                        </tr>
-                    </table>
+                    <div id="std-bills-spread" class="sjs-height-2"></div>
                 </div>
             </div>
         </div>