Bläddra i källkod

台账修订,查看修订内容

MaiXinRong 5 år sedan
förälder
incheckning
c9ccf22299

+ 51 - 18
app/controller/revise_controller.js

@@ -61,6 +61,17 @@ module.exports = app => {
                 // 分页相关
                 const count = await ctx.service.ledgerRevise.count({tid: ctx.tender.id});
                 const ledgerRevise = await ctx.service.ledgerRevise.getReviseList(ctx.tender.id);
+                if (ledgerRevise.length > 0) {
+                    const revise = ledgerRevise[0];
+                    if (revise.status === audit.revise.status.checked || !revise.valid) {
+                        revise.lastest = true;
+                    } else {
+                        if (ledgerRevise.length > 1) ledgerRevise[1].lastest = true;
+                        if (revise.status === audit.revise.status.checking) {
+                            revise.curAuditor = await ctx.service.reviseAudit.getCurAuditor(revise.id, revise.times);
+                        }
+                    }
+                }
                 const addValid = await this._getAddReviseValid(ctx);
                 const [stdBills, stdChapters] = await this.ctx.service.valuation.getValuationStdList(ctx.tender.data.valuation);
                 const renderData = {
@@ -219,7 +230,7 @@ module.exports = app => {
                 reviseBills, revisePos, ledgerSpread, posSpread, tenderMenu, measureType,
                 preUrl: '/tender/' + ctx.tender.id,
                 audit: audit.revise,
-                jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.ledger.revise),
+                jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.revise.info),
                 stdBills,
                 stdChapters,
                 curAuditor,
@@ -328,11 +339,44 @@ module.exports = app => {
             }
         }
 
-        /**
-         * 增、删、上下移、升降级
-         * @param ctx
-         * @returns {Promise<void>}
-         */
+        async history(ctx) {
+            try {
+                const revise = await ctx.service.ledgerRevise.getLastestRevise(ctx.tender.id, false);
+                if (!revise) throw '台账修订数据有误';
+
+                const reviseBills = await ctx.service.ledger.getData(ctx.tender.id);
+                const revisePos = await ctx.service.pos.getPosData({tid: ctx.tender.id});
+                const [ledgerSpread, posSpread] = this._getSpreadSetting(revise);
+                ledgerSpread.readOnly = true;
+                posSpread.readOnly = true;
+                const historyRevise = await ctx.service.ledgerRevise.getReviseList(ctx.tender.id);
+                const renderData = {
+                    measureType, audit, revise,
+                    ledgerSpread, posSpread,
+                    reviseBills, revisePos,
+                    readOnly: true,
+                    historyRevise,
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.revise.history),
+                };
+                await this.layout('revise/history.ejs', renderData);
+            } catch (err) {
+                this.log(err);
+                ctx.redirect(ctx.request.header.referer);
+            }
+        }
+
+        async historyInfo(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                if (!data || !data.rid || data.rid === '') throw '查询的台账修订有误';
+                const reviseInfo = await ctx.service.ledgerRevise.getRevise(ctx.tender.id, data.rid);
+                ctx.body = { err: 0, msg: '', data: reviseInfo };
+            } catch(err) {
+                this.log(err);
+                ctx.body = this.ajaxErrorBody(err, '获取台账修订历史数据错误');
+            }
+        }
+
         async _billsBase(revise, type, data) {
             if (isNaN(data.id) || data.id <= 0) throw '数据错误';
             if (type !== 'add') {
@@ -353,17 +397,6 @@ module.exports = app => {
                     return await this.ctx.service.reviseBills.downLevelNode(revise.tid, data.id, data.count);
             }
         }
-        /**
-         * 批量插入数据 (Ajax)
-         *
-         * data = {id, batchData, batchType}
-         * data.batchType = 'batchInsertChild'/'batchInsertNext'
-         * data.batchData = [{name, children}] -- 项目节列表
-         * data.batchData.children = [{code, name, unit, unit_price, quantity}] -- 工程量清单列表
-         *
-         * @param ctx
-         * @return {Promise<void>}
-         */
         async _batchInsert(revise, data) {
             if ((isNaN(data.id) || data.id <= 0) || !data.batchType) {
                 throw '参数错误';
@@ -469,7 +502,7 @@ module.exports = app => {
                         responseData.data = await this._billsBase(revise, data.postType, data.postData);
                         break;
                     case 'update':
-                        responseData.data = await this.ctx.service.reviseBills.updateCalc(revise, data.postData);
+                        responseData.data = await this.ctx.service.reviseBills.updateCalc(revise.tid, data.postData);
                         break;
                     case 'batch-insert':
                         responseData.data = await this._batchInsert(revise, data.postData);

+ 298 - 0
app/public/js/revise_history.js

@@ -0,0 +1,298 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+const ckBillsSpread = window.location.pathname + '-billsSelect';
+
+$(document).ready(() => {
+    toastr.options = {
+        "closeButton": false,
+        "debug": false,
+        "newestOnTop": false,
+        "progressBar": false,
+        "positionClass": "toast-top-center",
+        "preventDuplicates": false,
+        "onclick": null,
+        "showDuration": "300",
+        "hideDuration": "1000",
+        "timeOut": "5000",
+        "extendedTimeOut": "1000",
+        "showEasing": "swing",
+        "hideEasing": "linear",
+        "showMethod": "fadeIn",
+        "hideMethod": "fadeOut"
+    };
+    autoFlashHeight();
+    // 初始化spread
+    const billsSpread = SpreadJsObj.createNewSpread($('#bills-spread')[0]);
+    const billsSheet = billsSpread.getActiveSheet();
+    SpreadJsObj.initSheet(billsSheet, billsSpreadSetting);
+    const posSpread = isTz ? SpreadJsObj.createNewSpread($('#pos-spread')[0]) : null;
+    const posSheet = isTz ? posSpread.getActiveSheet() : null;
+    if (isTz) SpreadJsObj.initSheet(posSheet, posSpreadSetting);
+
+    const posSearch = isTz ? $.posSearch({selector: '#pos-search', searchSpread: posSpread}) : null;
+
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        key: 'revise.history.memu.1.0.0',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+            }
+            autoFlashHeight();
+            billsSpread.refresh();
+            if (isTz) posSpread.refresh();
+        }
+    });
+
+    // 初始化 清单树结构
+    const treeSetting = {
+        id: 'ledger_id',
+        pid: 'ledger_pid',
+        order: 'order',
+        level: 'level',
+        rootId: -1,
+        keys: ['id', 'tender_id', 'ledger_id'],
+        calcFields: ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price'],
+    };
+    if (!isTz) {
+        treeSetting.calcFields.push('deal_tp');
+    }
+    treeSetting.calcFun = function (node) {
+        node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2);
+    };
+    const billsTree = createNewPathTree('revise', treeSetting);
+    billsTree.loadDatas(billsData);
+    treeCalc.calculateAll(billsTree);
+    // 加载至spread
+    SpreadJsObj.loadSheetData(billsSheet, SpreadJsObj.DataType.Tree, billsTree);
+    SpreadJsObj.loadTopAndSelect(billsSheet, ckBillsSpread);
+    // 初始化 部位明细
+    const pos = new PosData({ id: 'id', ledgerId: 'lid' });
+    pos.loadDatas(posData);
+
+    const billsTreeSpreadObj = {
+        /**
+         *
+         * @param sheet
+         * @param data
+         */
+        refreshTree: function (sheet, data) {
+            SpreadJsObj.massOperationSheet(sheet, function () {
+                const tree = sheet.zh_tree;
+                // 处理删除
+                if (data.delete) {
+                    data.delete.sort(function (a, b) {
+                        return b.deleteIndex - a.deleteIndex;
+                    });
+                    for (const d of data.delete) {
+                        sheet.deleteRows(d.deleteIndex, 1);
+                    }
+                }
+                // 处理新增
+                if (data.create) {
+                    const newNodes = data.create;
+                    if (newNodes) {
+                        newNodes.sort(function (a, b) {
+                            return a.index - b.index;
+                        });
+
+                        for (const node of newNodes) {
+                            sheet.addRows(node.index, 1);
+                            SpreadJsObj.reLoadRowData(sheet, tree.nodes.indexOf(node), 1);
+                        }
+                    }
+                }
+                // 处理更新
+                if (data.update) {
+                    const rows = [];
+                    for (const u of data.update) {
+                        rows.push(tree.nodes.indexOf(u));
+                    }
+                    SpreadJsObj.reLoadRowsData(sheet, rows);
+                }
+                // 处理展开
+                if (data.expand) {
+                    const expanded = [];
+                    for (const e of data.expand) {
+                        if (expanded.indexOf(e) === -1) {
+                            const posterity = tree.getPosterity(e);
+                            for (const p of posterity) {
+                                sheet.setRowVisible(tree.nodes.indexOf(p), p.visible);
+                                expanded.push(p);
+                            }
+                        }
+                    }
+                }
+            });
+        },
+        selectionChanged: function (e, info) {
+            if (info.newSelections[0].row !== info.oldSelections[0].row) {
+                SpreadJsObj.saveTopAndSelect(billsSheet, ckBillsSpread);
+                if (isTz) {
+                    posSpreadObj.loadCurPosData();
+                    posSearch.search($('#pos-keyword').val());
+                }
+            }
+        },
+        topRowChanged: function (e, info) {
+            SpreadJsObj.saveTopAndSelect(info.sheet, ckBillsSpread);
+        },
+    };
+    billsSpread.bind(spreadNS.Events.SelectionChanged, billsTreeSpreadObj.selectionChanged);
+    billsSpread.bind(spreadNS.Events.topRowChanged, billsTreeSpreadObj.topRowChanged);
+
+    const posSpreadObj = {
+        /**
+         * 加载部位明细 根据当前台账选择节点
+         */
+        loadCurPosData: function () {
+            const node = SpreadJsObj.getSelectObject(billsSheet);
+            if (node) {
+                const posData = pos.getLedgerPos(node.id) || [];
+                SpreadJsObj.loadSheetData(posSheet, 'data', posData);
+            } else {
+                SpreadJsObj.loadSheetData(posSheet, 'data', []);
+            }
+            SpreadJsObj.resetFieldReadOnly(posSheet);
+        },
+    };
+    posSpreadObj.loadCurPosData();
+    SpreadJsObj.resetTopAndSelect(posSheet);
+    $.divResizer({
+        select: '#revise-resize',
+        callback: function () {
+            billsSpread.refresh();
+            let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
+            $(".sp-wrap").height(bcontent-40);
+            posSpread.refresh();
+        }
+    });
+
+    let searchLedger;
+    $.divResizer({
+        select: '#revise-right-spr',
+        callback: function () {
+            billsSpread.refresh();
+            if (posSpread) {
+                posSpread.refresh();
+            }
+            if (searchLedger && searchLedger.spread) {
+                searchLedger.spread.refresh();
+            }
+        }
+    });
+    // 展开收起标准清单
+    $('a', '#side-menu').bind('click', function (e) {
+        e.preventDefault();
+        const tab = $(this), tabPanel = $(tab.attr('content'));
+        const showSideTools = function (show) {
+            const left = $('#left-view'), right = $('#right-view'), parent = left.parent();
+            if (show) {
+                right.show();
+                autoFlashHeight();
+                /**
+                 * right.show()后, parent被撑开成2倍left.height, 导致parent.width减少了10px
+                 * 第一次left.width调整后,parent的缩回left.height, 此时parent.width又增加了10px
+                 * 故需要通过最终的parent.width再计算一次left.width
+                 *
+                 * Q: 为什么不通过先计算left.width的宽度,以避免计算两次left.width?
+                 * A: 右侧工具栏不一定显示,当右侧工具栏显示过一次后,就必须使用parent和right来计算left.width
+                 *
+                 */
+                    //left.css('width', parent.width() - right.outerWidth());
+                    //left.css('width', parent.width() - right.outerWidth());
+                const percent = 100 - right.outerWidth() /parent.width() * 100;
+                left.css('width', percent + '%');
+            } else {
+                left.width(parent.width());
+                right.hide();
+            }
+        };
+        // 展开工具栏、切换标签
+        if (!tab.hasClass('active')) {
+            const close = $('.active', '#side-menu').length === 0;
+            $('a', '#side-menu').removeClass('active');
+            tab.addClass('active');
+            $('.tab-content .tab-pane').removeClass('active');
+            tabPanel.addClass('active');
+            showSideTools(tab.hasClass('active'));
+            if (tab.attr('content') === '#search' && !searchLedger) {
+                if (!searchLedger) {
+                    searchLedger = $.billsSearch({
+                        selector: '#search',
+                        searchSpread: billsSpread,
+                        resultSpreadSetting: {
+                            cols: [
+                                {title: '项目节编号', field: 'code', hAlign: 0, width: 120, formatter: '@', readOnly: true},
+                                {title: '清单编号', field: 'b_code', hAlign: 0, width: 120, formatter: '@', readOnly: true},
+                                {title: '名称', field: 'name', width: 230, hAlign: 0, formatter: '@', readOnly: true},
+                                {title: '单位', field: 'unit', width: 50, hAlign: 1, formatter: '@', readOnly: true},
+                                {title: '单价', field: 'unit_price', hAlign: 2, width: 50, readOnly: true},
+                                {title: '数量', field: 'quantity', hAlign: 2, width: 50, readOnly: true},
+                            ],
+                            emptyRows: 0,
+                            headRows: 1,
+                            headRowHeight: [40],
+                            defaultRowHeight: 21,
+                        },
+                        afterLocated: function () {
+                            posSpreadObj.loadCurPosData();
+                        }
+                    });
+                }
+                searchLedger.spread.refresh();
+            }
+        }
+        billsSpread.refresh();
+        if (posSpread) {
+            posSpread.refresh();
+        }
+    });
+
+    // 显示层次
+    (function (select, sheet) {
+        $(select).click(function () {
+            if (!sheet.zh_tree) return;
+            const tag = $(this).attr('tag');
+            const tree = sheet.zh_tree;
+            switch (tag) {
+                case "1":
+                case "2":
+                case "3":
+                case "4":
+                case "5":
+                    tree.expandByLevel(parseInt(tag));
+                    SpreadJsObj.refreshTreeRowVisible(sheet);
+                    break;
+                case "last":
+                    tree.expandByCustom(() => { return true; });
+                    SpreadJsObj.refreshTreeRowVisible(sheet);
+                    break;
+                case "leafXmj":
+                    tree.expandToLeafXmj();
+                    SpreadJsObj.refreshTreeRowVisible(sheet);
+                    break;
+            }
+        });
+    })('a[name=showLevel]', billsSheet);
+
+    $('#reviseHistory').change(function () {
+        postData(window.location.pathname + '/info', { rid: this.value }, function (result) {
+            $('#user-name').value(result.user_name);
+            $('#content')[0].textContent = result.content;
+            $('#end-time').value(result.end_time.toLocaleString());
+        });
+    });
+});

+ 5 - 0
app/router.js

@@ -104,8 +104,13 @@ module.exports = app => {
     app.post('/tender/:id/revise/add', sessionAuth, tenderCheck, 'reviseController.add');
     app.post('/tender/:id/revise/cancel', sessionAuth, tenderCheck, 'reviseController.cancel');
     app.post('/tender/:id/revise/save', sessionAuth, tenderCheck, 'reviseController.save');
+
     app.get('/tender/:id/revise/info', sessionAuth, tenderCheck, 'reviseController.info');
     app.post('/tender/:id/revise/info/update', sessionAuth, tenderCheck, 'reviseController.update');
+
+    app.get('/tender/:id/revise/history', sessionAuth, tenderCheck, 'reviseController.history');
+    app.post('/tender/:id/revise/history/info', sessionAuth, tenderCheck, 'reviseController.historyInfo');
+
     app.post('/tender/:id/revise/audit/add', sessionAuth, tenderCheck, 'reviseController.addAuditor');
     app.post('/tender/:id/revise/audit/remove', sessionAuth, tenderCheck, 'reviseController.removeAuditor');
     app.post('/tender/:id/revise/audit/start', sessionAuth, tenderCheck, 'reviseController.start');

+ 0 - 20
app/service/ledger_audit.js

@@ -208,22 +208,6 @@ module.exports = app => {
         }
 
         /**
-         * 拷贝一份台账备份(每一次审批结束时)
-         * @param {Number} tenderId - 标段Id
-         * @param transaction - 事务
-         * @param {Number} times - 次数
-         * @returns {Promise<void>}
-         * @private
-         */
-        async _copyHisytoryLedger(tenderId, transaction, times = 1) {
-            const sql = 'Insert Into ?? ' +
-                'Select *, ? As times From ?? ' +
-                'Where ?? = ?';
-            const sqlParam = [this.tableName + '_copy', times, this.ctx.service.ledger.tableName, 'tender_id', tenderId];
-            return await transaction.query(sql, sqlParam);
-        }
-
-        /**
          * 审批
          * @param {Number} tenderId - 标段id
          * @param {auditConst.status.checked|auditConst.status.checkNo} checkType - 审批结果
@@ -266,8 +250,6 @@ module.exports = app => {
                     } else {
                         // 同步标段信息
                         await transaction.update(this.ctx.service.tender.tableName, {id: tenderId, ledger_status: checkType});
-                        // 拷贝备份台账数据
-                        await this._copyHisytoryLedger(tenderId, transaction, times);
 
                         // 添加短信通知-审批通过提醒功能
                         const tenderInfo = await this.ctx.service.tender.getDataById(tenderId);
@@ -295,8 +277,6 @@ module.exports = app => {
                         a.status = auditConst.status.uncheck;
                     }
                     await transaction.insert(this.tableName, auditors);
-                    // 拷贝备份台账数据
-                    await this._copyHisytoryLedger(tenderId, transaction, times);
 
                     // 添加短信通知-审批退回提醒功能
                     const tenderInfo = await this.ctx.service.tender.getDataById(tenderId);

+ 19 - 6
app/service/ledger_revise.js

@@ -30,7 +30,8 @@ module.exports = app => {
          * @returns {Promise<*>} - ledger_change下所有数据,并关联 project_account(读取提交人名称、单位、公司)
          */
         async getReviseList (tid) {
-            const sql = 'SELECT lc.*, pa.name As user_name, pa.role As user_role, pa.company As user_company' +
+            const sql = 'SELECT lc.id, lc.tid, lc.corder, lc.in_time, lc.uid, lc.begin_time, lc.end_time, lc.times, lc.status, lc.valid,' +
+                '    pa.name As user_name, pa.role As user_role, pa.company As user_company' +
                 '  FROM ' + this.tableName + ' As lc' +
                 '  INNER JOIN ' + this.ctx.service.projectAccount.tableName + ' As pa ON lc.uid = pa.id' +
                 '  WHERE lc.tid = ?' +
@@ -41,17 +42,30 @@ module.exports = app => {
             return await this.db.query(sql, sqlParam);
         }
 
-        async getLastestRevise(tid) {
-            const sql = 'SELECT lc.*, pa.name As user_name, pa.role As user_role, pa.company As user_company' +
+        async getLastestRevise(tid, valid = true) {
+            const sql = 'SELECT lc.*,' +
+                '    pa.name As user_name, pa.role As user_role, pa.company As user_company' +
                 '  FROM ' + this.tableName + ' As lc' +
                 '  INNER JOIN ' + this.ctx.service.projectAccount.tableName + ' As pa ON lc.uid = pa.id' +
-                '  WHERE lc.tid = ? And lc.valid' +
+                '  WHERE lc.tid = ? ' + (valid ? ' And lc.valid' : '') +
                 '  ORDER BY lc.in_time DESC' +
                 '  LIMIT 0, 1';
             const sqlParam = [tid];
             return await this.db.queryOne(sql, sqlParam);
         }
 
+        async getRevise(tid, rid) {
+            const sql = 'SELECT lc.*,' +
+                '    pa.name As user_name, pa.role As user_role, pa.company As user_company' +
+                '  FROM ' + this.tableName + ' As lc' +
+                '  INNER JOIN ' + this.ctx.service.projectAccount.tableName + ' As pa ON lc.uid = pa.id' +
+                '  WHERE lc.tid = ? and lc.id = ? ' +
+                '  ORDER BY lc.in_time DESC' +
+                '  LIMIT 0, 1';
+            const sqlParam = [tid, rid];
+            return await this.db.queryOne(sql, sqlParam);
+        }
+
         /**
          * 获取新增修订的序号
          * @param {Number}tid - 标段id
@@ -156,8 +170,7 @@ module.exports = app => {
          * @returns {Promise<void>}
          */
         async cancelRevise(revise) {
-            const [billsHis, posHis] = await this.ctx.service.reviseAudit.saveReviseHistoryFile(revise);
-            const result = await this.db.update(this.tableName, {id: revise.id, valid: false, bills_file: billsHis, pos_file: posHis});
+            const result = await this.db.update(this.tableName, {id: revise.id, valid: false, end_time: new Date()});
             return result.affectedRows === 1;
         }
 

+ 13 - 31
app/service/revise_audit.js

@@ -174,26 +174,6 @@ module.exports = app => {
         }
 
         /**
-         * 拷贝一份台账备份
-         * @param {Object} revise - 修订
-         * @returns {Promise<void>}
-         * @private
-         */
-        async saveReviseHistoryFile(revise) {
-            const timestamp = (new Date()).getTime();
-
-            const billsHis = '/file/revise/bills' + timestamp + '.json';
-            const bills = await this.ctx.service.reviseBills.getData(revise.tid);
-            await this.ctx.helper.saveBufferFile(JSON.stringify(bills), this.ctx.app.baseDir + billsHis);
-
-            const posHis = '/file/revise/pos' + timestamp + '.json';
-            const pos = await this.ctx.service.revisePos.getData(revise.tid);
-            await this.ctx.helper.saveBufferFile(JSON.stringify(pos), this.ctx.app.baseDir + posHis);
-
-            return [billsHis, posHis];
-        }
-
-        /**
          * 开始审批
          *
          * @param {Object} revise - 修订
@@ -203,16 +183,18 @@ module.exports = app => {
         async start(revise, times = 1) {
             const audit = await this.getDataByCondition({rid: revise.id, times: times, audit_order: 1});
             if (!audit) throw '审核人信息错误';
+            const time = new Date();
 
-            // 拷贝备份台账数据
-            const [billsHis, posHis] = await this.saveReviseHistoryFile(revise);
             const transaction = await this.db.beginTransaction();
             try {
-                await transaction.update(this.tableName, {id: audit.id, status: auditConst.status.checking, begin_time: new Date()});
-                await transaction.update(this.ctx.service.ledgerRevise.tableName, {
+                await transaction.update(this.tableName, {id: audit.id, status: auditConst.status.checking, begin_time: time});
+                const reviseData = {
                     id: revise.id, status: auditConst.status.checking,
-                    bills_file: billsHis, pos_file: posHis,
-                });
+                };
+                if (revise.times === 1) {
+                    reviseData.begin_time = time;
+                }
+                await transaction.update(this.ctx.service.ledgerRevise.tableName, reviseData);
 
                 // 添加短信通知-需要审批提醒功能
                 const smsUser = await this.ctx.service.projectAccount.getDataById(audit.audit_id);
@@ -248,12 +230,12 @@ module.exports = app => {
                 '  Where `tender_id` = ?';
             await transaction.query(bSql, sqlParam);
             await transaction.delete(this.ctx.service.pos.tableName, {tid: revise.tid});
-            const pSql = 'Insert Into ' + this.ctx.service.revisePos.tableName +
+            const pSql = 'Insert Into ' + this.ctx.service.pos.tableName +
                 '  (id, tid, lid, name, drawing_code, quantity, add_stage, add_times, add_user,' +
-                '     sgfh_qty, sjcl_qty, qtcl_qty, crid)' +
+                '     sgfh_qty, sjcl_qty, qtcl_qty, crid, porder)' +
                 '  Select id, tid, lid, name, drawing_code, quantity, add_stage, add_times, add_user,' +
-                '     sgfh_qty, sjcl_qty, qtcl_qty, crid' +
-                '  From ' + this.ctx.service.pos.tableName +
+                '     sgfh_qty, sjcl_qty, qtcl_qty, crid, porder' +
+                '  From ' + this.ctx.service.revisePos.tableName +
                 '  Where `tid` = ?';
             await transaction.query(pSql, sqlParam);
         }
@@ -299,7 +281,7 @@ module.exports = app => {
                         }
                     } else {
                         // 同步修订信息
-                        await transaction.update(this.ctx.service.ledgerRevise.tableName, {id: revise.id, status: checkType});
+                        await transaction.update(this.ctx.service.ledgerRevise.tableName, {id: revise.id, status: checkType, end_time: time});
                         // 拷贝修订数据至台账
                         await this._replaceLedgerByRevise(transaction, revise);
 

+ 0 - 1
app/service/tender.js

@@ -255,7 +255,6 @@ module.exports = app => {
                 await transaction.delete(this.ctx.service.tenderInfo.tableName, {tid: id});
                 await transaction.delete(this.ctx.service.ledger.tableName, {tender_id: id});
                 await transaction.delete(this.ctx.service.ledgerAudit.tableName, {tender_id: id});
-                await transaction.delete(this.ctx.service.ledgerAudit.tableName + '_copy', {tender_id: id});
                 await transaction.delete(this.ctx.service.pos.tableName, {tid: id});
                 await transaction.delete(this.ctx.service.pay.tableName, {tid: id});
                 await transaction.delete(this.ctx.service.stage.tableName, {tid: id});

+ 117 - 0
app/view/revise/history.ejs

@@ -0,0 +1,117 @@
+<% include ../tender/tender_sub_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main d-flex justify-content-between">
+            <% include ../tender/tender_sub_mini_menu.ejs %>
+            <!--工具-->
+            <div>
+                <div class="d-inline-block">
+                    <div class="dropdown">
+                        <button class="btn btn-sm btn-light dropdown-toggle text-primary" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                            <i class="fa fa-list-ol"></i> 显示层级
+                        </button>
+                        <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+                            <a class="dropdown-item" name="showLevel" tag="1" href="javascirpt: void(0);">第一层</a>
+                            <a class="dropdown-item" name="showLevel" tag="2" href="javascirpt: void(0);">第二层</a>
+                            <a class="dropdown-item" name="showLevel" tag="3" href="javascirpt: void(0);">第三层</a>
+                            <a class="dropdown-item" name="showLevel" tag="4" href="javascirpt: void(0);">第四层</a>
+                            <a class="dropdown-item" name="showLevel" tag="5" href="javascirpt: void(0);">第五层</a>
+                            <a class="dropdown-item" name="showLevel" tag="last" href="javascirpt: void(0);">最底层</a>
+                            <a class="dropdown-item" name="showLevel" tag="leafXmj" href="javascirpt: void(0);">只显示项目节</a>
+                        </div>
+                    </div>
+                </div>
+                <div class="d-inline-flex">
+                    <%- (revise.in_time ? revise.in_time.toLocaleString() : '') %>
+                </div>
+            </div>
+            <div class="ml-auto">
+                <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm pull-right">审批完成</a>
+            </div>
+        </div>
+    </div>
+    <div class="content-wrap row pr-46">
+        <div class="c-header p-0 col-12"></div>
+        <!--核心内容(两栏)-->
+        <div class="row w-100 sub-content">
+            <!--左栏-->
+            <div class="c-body" id="left-view" style="width: 100%">
+                <!--0号台帐模式-->
+                <div class="sjs-height-1" style="overflow: hidden" id="bills-spread">
+                </div>
+                <div class="bcontent-wrap">
+                    <div id="revise-resize" class="resize-y" id="top-spr" r-Type="height" div1=".sjs-height-1" div2=".bcontent-wrap" title="调整大小"><!--调整上下高度条--></div>
+                    <div class="bc-bar mb-1">
+                        <ul class="nav nav-tabs">
+                            <li class="nav-item">
+                                <a class="nav-link active" href="javascript:void(0)">部位明细</a>
+                            </li>
+                            <li class="nav-item" id="pos-search">
+                            </li>
+                        </ul>
+                    </div>
+                    <div class="sp-wrap" id="pos-spread">
+                    </div>
+                </div>
+            </div>
+            <!--右栏-->
+            <div class="c-body" id="right-view" style="display: none; width: 33%;">
+                <div class="resize-x" id="revise-right-spr" r-Type="width" div1="#left-view" div2="#right-view" title="调整大小" a-type="percent"><!--调整左右高度条--></div>
+                <div class="tab-content">
+                    <div id="xd-content" class="tab-pane">
+                        <div class="sjs-bar-2">
+                            <div class="d-flex"><a href="javascirpt: void(0);" class="btn btn-sm btn-outline-success mb-1 ml-auto" id="save">保存</a></div>
+                        </div>
+                        <div class="sjs-sh-2" style="overflow:auto">
+                            <div class="form-group mt-2">
+                                <label >创建时间</label>
+                                <select class="form-control form-control-sm" id="reviseHistory">
+                                    <% for (const hr of historyRevise) { %>
+                                    <option value="<%- hr.id %>"><%- hr.corder + '#' + (hr.in_time ? hr.in_time.toLocaleDateString() : '') + (hr.valid ? '' : '(作废)')%></option>
+                                    <% } %>
+                                </select>
+                            </div>
+                            <div class="alert alert-warning">历史修订暂不支持查看历史台帐。</div>
+                            <div class="form-group mt-2">
+                                <label >提交人</label>
+                                <input id="user-name" type="" class="form-control" value="<%- revise.user_name %>" disabled>
+                            </div>
+                            <div class="form-group">
+                                <label >修订内容<b class="text-danger">*</b></label>
+                                <textarea id="content" class="form-control" value="编写错漏5" rows="12"><%- revise.content %></textarea>
+                            </div>
+                            <div class="form-group">
+                                <label >审批完成</label>
+                                <input id="end-time" type="" class="form-control" value="<%- (revise.end_time ? revise.end_time.toLocaleString() : '') %>" disabled>
+                            </div>
+                        </div>
+                    </div>
+                    <div id="search" class="tab-pane">
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--右侧菜单-->
+        <div class="side-menu">
+            <!--右侧菜单-->
+            <ul class="nav flex-column right-nav" id="side-menu">
+                <li class="nav-item">
+                    <a class="nav-link" content="#xd-content" href="javascript: void(0);">修订详情</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" content="#search" href="javascript: void(0);">查找定位</a>
+                </li>
+            </ul>
+        </div>
+    </div>
+</div>
+<script>
+    <% if (ctx.tender.data.measure_type === measureType.tz.value) { %>
+    const posSpreadSetting = JSON.parse('<%- JSON.stringify(posSpread) %>');
+    const posData = JSON.parse('<%- JSON.stringify(revisePos) %>');
+    <% } %>
+    const readOnly = <%- readOnly %>;
+    const isTz = <%- ctx.tender.data.measure_type === measureType.tz.value %>;
+    const billsSpreadSetting = JSON.parse('<%- JSON.stringify(ledgerSpread) %>');
+    const billsData = JSON.parse('<%- JSON.stringify(reviseBills) %>');
+</script>

+ 6 - 5
app/view/revise/index.ejs

@@ -51,18 +51,19 @@
                     <td><%- lr.end_time ? lr.end_time.toLocaleDateString() : '' %></td>
                     <td>
                         <% if (lr.valid) { %>
-                        <% if (lr.status === auditConst.status.uncheck) { %>
+                        <% if (lr.status === auditConst.status.uncheck && lr.uid === ctx.session.sessionUser.accountId) { %>
                         <a href="<%- preUrl + '/revise/info' %>" class="btn btn-primary btn-sm">修订</a>
                         <a href="#remove" data-toggle="modal" data-target="#remove" class="btn btn-secondary btn-sm">作废</a>
-                        <% } else if (lr.status === auditConst.status.checking) { %>
+                        <% } else if (lr.status === auditConst.status.checking && lr.curAuditor.audit_id === ctx.session.sessionUser.accountId) { %>
                         <a href="<%- preUrl + '/revise/info' %>" class="btn btn-success btn-sm">审批</a>
-                        <% } else if (lr.status === auditConst.status.checkNo) { %>
+                        <% } else if (lr.status === auditConst.status.checkNo && lr.uid === ctx.session.sessionUser.accountId) { %>
                         <a href="<%- preUrl + '/revise/info' %>" class="btn btn-primary btn-sm">重新上报</a>
                         <a href="#remove" data-toggle="modal" data-target="#remove" class="btn btn-secondary btn-sm">作废</a>
-                        <% } else if (ledgerRevise.indexOf(lr) === ledgerRevise.length - 1) { %>
-                        <a href="<%- preUrl + '/revise/info' %>">查看修订内容</a>
                         <% } %>
                         <% } %>
+                        <% if (lr.lastest) { %>
+                        <a href="<%- preUrl + '/revise/history' %>">查看修订内容</a>
+                        <% } %>
                     </td>
                 </tr>
                 <% } %>

+ 1 - 1
app/view/tender/tender_sub_menu.ejs

@@ -1,7 +1,7 @@
 <div class="panel-sidebar" id="sub-menu">
     <div class="panel-title">
         <div class="title-bar">
-            <h2 class="text-truncate" data-toggle="tooltip" data-placement="right" title=""  data-original-title="<%- tender.name %>"><%- tender.name %></h2>
+            <h2 class="text-truncate" data-toggle="tooltip" data-placement="right" title=""  data-original-title="<%- ctx.tender.data.name %>"><%- ctx.tender.data.name %></h2>
         </div>
     </div>
     <div class="scrollbar-auto">

+ 36 - 0
config/web.js

@@ -146,6 +146,42 @@ const JsFiles = {
                 mergeFile: 'revise',
             }
         },
+        revise: {
+            info: {
+                files: [
+                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/decimal.min.js",
+                    "/public/js/toastr.min.js",
+                ],
+                mergeFiles: [
+                    "/public/js/sub_menu.js",
+                    "/public/js/div_resizer.js",
+                    "/public/js/spreadjs_rela/spreadjs_zh.js",
+                    "/public/js/ledger_search.js",
+                    "/public/js/zh_calc.js",
+                    "/public/js/path_tree.js",
+                    "/public/js/revise.js",
+                ],
+                mergeFile: 'revise',
+            },
+            history: {
+                files: [
+                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/decimal.min.js",
+                    "/public/js/toastr.min.js",
+                ],
+                mergeFiles: [
+                    "/public/js/sub_menu.js",
+                    "/public/js/div_resizer.js",
+                    "/public/js/spreadjs_rela/spreadjs_zh.js",
+                    "/public/js/ledger_search.js",
+                    "/public/js/zh_calc.js",
+                    "/public/js/path_tree.js",
+                    "/public/js/revise_history.js",
+                ],
+                mergeFile: 'revise_history',
+            }
+        },
         stage: {
             // 本期计量台账
             index: {