浏览代码

总分包,台账修订v0.6

MaiXinRong 3 年之前
父节点
当前提交
ff71b408d3

+ 0 - 23
app/base/base_bills_service.js

@@ -18,7 +18,6 @@ const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty'];
 const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp'];
 const measureType = require('../const/tender').measureType;
 const billsUtils = require('../lib/bills_utils');
-const SumLoad = require('../lib/sum_load');
 
 class BaseBillsSerivce extends TreeService {
 
@@ -691,28 +690,6 @@ class BaseBillsSerivce extends TreeService {
         };
     }
 
-    async sumLoad(lid, tenders) {
-        const maxId = await this._getMaxLid(this.ctx.tender.id);
-        const select = await this.getDataById(lid);
-        const sumLoad = new SumLoad(this.ctx);
-        const loadTree = await sumLoad.loadGatherGcl(select, maxId, tenders, {
-
-        });
-        const result = loadTree.getUpdateData();
-
-        const conn = await this.db.beginTransaction();
-        try {
-            this._cacheMaxLid(this.ctx.tender.id, loadTree.keyNodeId);
-            await conn.update(this.tableName, result.update);
-            await conn.insert(this.tableName, result.create);
-            await conn.commit();
-            return result;
-        } catch (err) {
-            console.log(err);
-            await conn.rollback();
-            throw (err.stack ? '导入工程量数据出错': err);
-        }
-    }
 }
 
 module.exports = BaseBillsSerivce;

+ 8 - 15
app/controller/tender_controller.js

@@ -1058,21 +1058,21 @@ module.exports = app => {
                         return x.ledger_status === auditConst.ledger.status.checked;
                     });
                     const history = await this.ctx.service.sumLoadHistory.getLedgerHistory(data.tid, data.lid);
-                    if (history) responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'ledger' };
+                    if (history) responseData.data.history = { tenders: history.tenders, load_time: history.load_time, type: 'ledger' };
                 } else if (data.type === 'stage') {
                     responseData.data.tenders = tenderList.filter(x => {
                         return x.ledger_status === auditConst.ledger.status.checked && !!x.lastStage;
                     });
                     let history = await this.ctx.service.sumLoadHistory.getStageHistory(data.tid, data.lid);
                     if (history) {
-                        responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'stage' };
+                        responseData.data.history = { tenders: history.tenders, load_time: history.load_time, type: 'stage' };
                     } else {
                         history = await this.ctx.service.sumLoadHistory.getReviseHistory(data.tid, data.lid);
                         if (history) {
-                            responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'revise' };
+                            responseData.data.history = { tenders: history.tenders, load_time: history.load_time, type: 'revise' };
                         } else {
                             history = await this.ctx.service.sumLoadHistory.getLedgerHistory(data.tid, data.lid);
-                            if (history) responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'ledger' };
+                            if (history) responseData.data.history = { tenders: history.tenders, load_time: history.load_time, type: 'ledger' };
                         }
                     }
                 } else if (data.type === 'revise') {
@@ -1081,10 +1081,10 @@ module.exports = app => {
                     });
                     let history = await this.ctx.service.sumLoadHistory.getReviseHistory(data.tid, data.lid);
                     if (history) {
-                        responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'revise' };
+                        responseData.data.history = { tenders: history.tenders, load_time: history.load_time, type: 'revise' };
                     } else {
                         history = await this.ctx.service.sumLoadHistory.getLedgerHistory(data.tid, data.lid);
-                        if (history) responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'ledger' };
+                        if (history) responseData.data.history = { tenders: history.tenders, load_time: history.load_time, type: 'ledger' };
                     }
                 }
                 ctx.body = responseData;
@@ -1094,14 +1094,6 @@ module.exports = app => {
             }
         }
 
-        async _sumLoadRevise() {
-
-        }
-
-        async _sumLoadStage() {
-
-        }
-
         async sumLoad(ctx) {
             try {
                 const data = JSON.parse(ctx.request.body.data);
@@ -1114,7 +1106,8 @@ module.exports = app => {
                         ctx.body = {err: 0, msg: '', data: refreshData};
                         break;
                     case 'revise':
-                        ctx.body = await this._sumLoadRevise(data.tid, data.lid, data.tenders);
+                        const reviseData = await this.ctx.service.reviseBills.sumLoad(data.lid, this.ctx.revise.id, data.tenders);
+                        ctx.body = {err: 0, msg: '', data: reviseData};
                         break;
                     case 'stage':
                         ctx.body = await this._sumLoadStage(data.tid, data.lid, data.tenders);

+ 114 - 4
app/lib/sum_load.js

@@ -22,7 +22,6 @@ class loadGclBaseTree {
         this.splitChar = '-';
         // 索引
         // 以code为索引
-        this.codeNodes = {};
         this.items = [];
 
         // 缓存
@@ -39,8 +38,10 @@ class loadGclBaseTree {
         if (!parent.children) return null;
 
         for (const child of parent.children) {
-            if (child.b_code === node.b_code && child.name === node.name && child.unit === node.unit) return child;
+            const checkLeaf = (child.is_leaf && node.is_leaf) || (!child.is_leaf && !node.is_leaf);
+            if (child.b_code === node.b_code && child.name === node.name && child.unit === node.unit && checkLeaf) return child;
         }
+        return null;
     }
 
     /**
@@ -50,11 +51,12 @@ class loadGclBaseTree {
      * @returns {*}
      */
     addNode(source, parent) {
+        if (source.b_code === '101') console.log('101 parent', parent);
         parent = parent ? parent : this.parent;
-        if (!parent.children) parent.children = [];
-
         let node = this.findNode(source, parent);
+        if (source.b_code === '101') console.log('101 cur', node);
         if (!node) {
+            if (!parent.children) parent.children = [];
             node = {
                 id: this.ctx.app.uuid.v4(),
                 tender_id: this.ctx.tender.id,
@@ -67,6 +69,10 @@ class loadGclBaseTree {
                 b_code: source.b_code,
                 name: source.name,
                 unit: source.unit,
+                sgfh_qty: 0,
+                qtcl_qty: 0,
+                sjcl_qyt: 0,
+                quantity: 0,
             };
             this.keyNodeId += 1;
             parent.children.push(node);
@@ -104,6 +110,83 @@ class loadLedgerGclTree extends loadGclBaseTree {
     }
 }
 
+class updateReviseGclTree extends loadGclBaseTree {
+    constructor (ctx, setting) {
+        super(ctx, setting);
+        this.baseNodes = [];
+    }
+    loadBase(datas) {
+        datas.sort((x, y) => { return x.level === y.level ? x.order - y.order : x.level - y.level; });
+        const Index = {};
+        for (const d of datas) {
+            const parent = this.parent.ledger_id === d.ledger_pid ? this.parent : Index[d.ledger_pid];
+            if (!parent) continue;
+
+            if (!parent.children) parent.children = [];
+            const baseNode = {
+                id: d.id,
+                ledger_id: d.ledger_id,
+                ledger_pid: d.ledger_pid,
+                level: d.level,
+                is_leaf: d.is_leaf,
+                full_path: d.full_path,
+                b_code: d.b_code,
+                name: d.name,
+                unit: d.unit,
+                unit_price: d.unit_price,
+                org_sgfh_qty: d.sgfh_qty || 0,
+                org_sjcl_qty: d.sjcl_qty || 0,
+                org_qtcl_qty: d.qtcl_qty || 0,
+                org_qty: d.quantity || 0,
+                org_order: d.order,
+                sgfh_qty: 0,
+                sjcl_qty: 0,
+                qtcl_qty: 0,
+                quantity: 0,
+            };
+            parent.children.push(baseNode);
+            Index[baseNode.ledger_id] = baseNode;
+            this.baseNodes.push(baseNode);
+        }
+    }
+    gather(source, parent) {
+        const node = this.addNode(source, parent);
+        if (source.b_code === '207-2-1') console.log('207-2-1', node, source);
+        node.sgfh_qty = this.ctx.helper.add(node.sgfh_qty, source.sgfh_qty);
+        node.qtcl_qty = this.ctx.helper.add(node.qtcl_qty, source.qtcl_qty);
+        node.sjcl_qty = this.ctx.helper.add(node.sjcl_qty, source.sjcl_qty);
+        node.quantity = this.ctx.helper.add(node.quantity, source.quantity);
+        return node;
+    }
+    getUpdateData() {
+        const result = {update: [], errors: [], create: []};
+        if (this.baseNodes.length === 0) {
+            result.update = [{id: this.parent.id, is_leaf: false}];
+        } else {
+            for (const bn of this.baseNodes) {
+                if (bn.children && bn.children.length > 0) continue;
+
+                if (bn.sjcl_qty < bn.org_sjcl_qty || bn.qtcl_qty < bn.org_qtcl_qty || bn.sgfh_qty < bn.org_sgfh_qty) {
+                    result.errors.push(bn);
+                } else if (bn.sjcl_qty !== bn.org_sjcl_qty || bn.qtcl_qty !== bn.org_qtcl_qty || bn.sgfh_qty !== bn.org_sgfh_qty) {
+                    result.update.push({
+                        id: bn.id, sgfh_qty: bn.sgfh_qty, sjcl_qty: bn.sjcl_qty, qtcl_qty: bn.qtcl_qty, quantity: bn.quantity,
+                    })
+                }
+            }
+        }
+        for (const i of this.items) {
+            result.create.push({
+                id: i.id, tender_id: i.tender_id, ledger_id: i.ledger_id, ledger_pid: i.ledger_pid,
+                level: i.level, order: i.order, full_path: i.full_path, is_leaf: !i.children || i.children.length === 0,
+                b_code: i.b_code, name: i.name, unit: i.unit,
+                sgfh_qty: i.sgfh_qty, sjcl_qty: i.sjcl_qty, qtcl_qty: i.qtcl_qty, quantity: i.quantity,
+            })
+        }
+        return result;
+    }
+}
+
 class sumLoad {
     constructor (ctx) {
         this.ctx = ctx;
@@ -140,6 +223,33 @@ class sumLoad {
         }
         return this.loadTree;
     }
+
+    async updateGatherGcl(select, maxId, tenders, defaultData) {
+        this.loadTree = new updateReviseGclTree(this.ctx, {
+            parent: select, maxId, type: 'ledger', defaultData,
+        });
+        const posterity = await this.ctx.service.reviseBills.getPosterityByParentId(this.ctx.tender.id, select.ledger_id);
+        this.loadTree.loadBase(posterity);
+
+        for (const tender of tenders) {
+            const billsData = await this.ctx.service.ledger.getData(tender.tid);
+            const billsTree = new Ledger.billsTree(this.ctx, {
+                id: 'ledger_id',
+                pid: 'ledger_pid',
+                order: 'order',
+                level: 'level',
+                rootId: -1,
+                keys: ['id', 'tender_id', 'ledger_id'],
+                stageId: 'id',
+            });
+            billsTree.loadDatas(billsData);
+            for (const top of billsTree.children) {
+                if ([1].indexOf(top.node_type) < 0) continue;
+                this.recusiveLoadGatherGcl(top, null);
+            }
+        }
+        return this.loadTree;
+    }
 }
 
 module.exports = sumLoad;

+ 53 - 0
app/middleware/revise_check.js

@@ -0,0 +1,53 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+module.exports = options => {
+    /**
+     * 标段校验 中间件
+     * 1. 读取标段数据(包括属性)
+     * 2. 检验用户是否可见标段(不校验具体权限)
+     *
+     * @param {function} next - 中间件继续执行的方法
+     * @return {void}
+     */
+    return function* reviseAuditCheck(next) {
+        try {
+            // 获取revise
+            this.revise = yield this.service.ledgerRevise.getLastestRevise(this.tender.id);
+            yield next;
+        } catch (err) {
+            // 输出错误到日志
+            if (err.stack) {
+                this.logger.error(err);
+            } else {
+                this.getLogger('fail').info(JSON.stringify({
+                    error: err,
+                    project: this.session.sessionProject,
+                    user: this.session.sessionUser,
+                    body: this.session.body,
+                }));
+            }
+            // 重定向值标段管理
+            if (this.helper.isAjax(this.request)) {
+                if (err.stack) {
+                    this.body = {err: 4, msg: '标段数据未知错误', data: null};
+                } else {
+                    this.body = {err: 3, msg: err.toString(), data: null};
+                }
+            } else {
+                if (this.helper.isWap(this.request)) {
+                    this.redirect('/wap/list');
+                } else {
+                    err === '您无权查看该内容' ? this.redirect(this.request.headers.referer) : this.redirect('/list');
+                }
+            }
+        }
+    };
+};

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

@@ -1516,19 +1516,8 @@ $(document).ready(function() {
             type: 'ledger',
             afterLoad: function (result) {
                 const ledgerSheet = ledgerSpread.getActiveSheet();
-                const sel = ledgerSheet.getSelections();
-
                 const refreshNode = ledgerTree.loadPostData(result);
                 treeOperationObj.refreshTree(ledgerSheet, refreshNode);
-                if (refreshNode.create[0]) {
-                    if (sel && sel[0]) {
-                        ledgerSheet.setSelection(refreshNode.create[0].index, sel[0].col, sel[0].rowCount, sel[0].colCount);
-                        SpreadJsObj.reloadRowsBackColor(ledgerSheet, [sel[0].row, refreshNode.create[0].index]);
-                    } else {
-                        ledgerSheet.setSelection(refreshNode.create[0].index, 0, 1, 1);
-                        SpreadJsObj.reloadRowsBackColor(ledgerSheet, [refreshNode.create[0].index]);
-                    }
-                }
                 treeOperationObj.refreshOperationValid(ledgerSheet);
             }
         });

+ 9 - 1
app/public/js/revise.js

@@ -50,7 +50,6 @@ const checkOption = {
 
 $(document).ready(() => {
     let stdXmj, stdGcl, searchLedger;
-    const tenderSelect = TenderSelect({type: 'revise'});
     autoFlashHeight();
     // 初始化spread
     const billsSpread = SpreadJsObj.createNewSpread($('#bills-spread')[0]);
@@ -1258,6 +1257,15 @@ $(document).ready(() => {
                 });
             }
         };
+
+        const tenderSelect = TenderSelect({
+            type: 'revise',
+            afterLoad: function (result) {
+                const refreshNode = billsTree.loadPostData(result);
+                billsTreeSpreadObj.refreshTree(billsSheet, refreshNode);
+                billsTreeSpreadObj.refreshOperationValid(billsSheet);
+            }
+        });
         billsContextMenuOptions.items.importGclBills2Xmj = {
             name: '更新(其他标段)工程量清单至项目节',
             icon: 'fa-file-excel-o',

+ 40 - 5
app/public/js/shares/tender_select.js

@@ -7,6 +7,7 @@ const TenderSelect = function (setting) {
         resultSheet: null,
         select: null,
         tenderSourceTree: null,
+        trHistory: {},
         trArray: [],
         _rebuildStageSelect: function () {
             if (tsObj.setting.type === 'stage') {
@@ -24,6 +25,30 @@ const TenderSelect = function (setting) {
                 }
             }
         },
+        _initSelected: function () {
+            for (const node of this.tenderSourceTree.nodes) {
+                node.selected = this.trArray.findIndex(x => { return node.tid === x.tid; }) >= 0;
+            }
+        },
+        _checkSelectTender: function () {
+            if (!this.trHistory.tenders || this.trHistory.tenders.length === 0) return;
+            let differ = this.trHistory.tenders.length !== this.trArray.length;
+            if (!differ) {
+                for (const tr of this.trArray) {
+                    if (this.trHistory.tenders.findIndex(x => { return x.tid === tr.tid; }) < 0) {
+                        differ = true;
+                        break;
+                    }
+                }
+            }
+            if (differ) {
+                $('#tender-select-hint').show();
+                const checkType = tsObj.setting.type === tsObj.trHistory.type ? '上次' : '台账';
+                $('#ts-hint-text').html(`勾选的标段与${checkType}不同,请仔细确认。`);
+            } else {
+                $('#tender-select-hint').hide();
+            }
+        },
         _addTender: function (tender) {
             const tr = tsObj.trArray.find(x => { return x.tid === tender.tid; });
             const t = {tid: tender.tid, name: tender.name, stageCount: tender.stageCount};
@@ -38,6 +63,7 @@ const TenderSelect = function (setting) {
         },
         reloadResultData: function () {
             SpreadJsObj.reLoadSheetData(tsObj.resultSheet);
+            this._checkSelectTender();
             this._rebuildStageSelect();
         },
         tsButtonClicked: function (e, info) {
@@ -78,10 +104,9 @@ const TenderSelect = function (setting) {
         },
         loadHistory: function () {
             postData('/list/load', {type: tsObj.setting.type, tid: tsObj.select.tender_id, lid: tsObj.select.id}, data => {
-                tsObj.trArray = data.history ? data.history.tenders : [];
+                tsObj.trHistory = data.history || {};
                 tsObj.tenderSourceTree = Tender2Tree.convert(data.category, data.tenders, data.ledgerAuditConst, data.stageAuditConst);
-                SpreadJsObj.loadSheetData(tsObj.tenderSheet, SpreadJsObj.DataType.Tree, tsObj.tenderSourceTree);
-                SpreadJsObj.loadSheetData(tsObj.resultSheet, SpreadJsObj.DataType.Data, tsObj.trArray);
+                tsObj.resetSelect();
             });
         },
         initTenderSelect: function () {
@@ -120,7 +145,7 @@ const TenderSelect = function (setting) {
                 font: '12px 微软雅黑',
                 headColWidth: [],
             };
-            if (this.setting.type === 'ledger') {
+            if (this.setting.type === 'ledger' || this.setting.type === 'revise') {
                 resultSpreadSetting.cols.push(
                     {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 230, formatter: '@', readOnly: true}
                 );
@@ -145,6 +170,14 @@ const TenderSelect = function (setting) {
             });
 
             this.loadHistory();
+        },
+        resetSelect: function () {
+            tsObj.trArray.length = 0;
+            if (tsObj.trHistory.tenders) tsObj.trArray.push(...tsObj.trHistory.tenders);
+            tsObj._initSelected();
+            SpreadJsObj.loadSheetData(tsObj.tenderSheet, SpreadJsObj.DataType.Tree, tsObj.tenderSourceTree);
+            SpreadJsObj.loadSheetData(tsObj.resultSheet, SpreadJsObj.DataType.Data, tsObj.trArray);
+            $('#tender-select-hint').hide();
         }
     };
 
@@ -153,9 +186,11 @@ const TenderSelect = function (setting) {
         tsObj.loadHistory();
     });
 
+    $('#tender-select-reset').click(tsObj.resetSelect);
+
     const showSelect = function (node) {
         tsObj.select = node;
-        $('#ts-hint').hide();
+        $('#tender-select-hint').hide();
         tsObj.trArray = [];
         $('#tender-select').modal('show');
     };

+ 3 - 1
app/router.js

@@ -27,6 +27,8 @@ module.exports = app => {
     const changeCheck = app.middlewares.changeCheck();
     // 投资进度中间件
     const scheduleCheck = app.middlewares.scheduleCheck();
+    // 修订
+    const reviseCheck = app.middlewares.reviseCheck();
     // 登入登出相关
     app.get('/login', 'loginController.index');
     app.get('/login/port', api2otherCheck, 'loginController.port');
@@ -501,7 +503,7 @@ module.exports = app => {
     // 总分包
     app.post('/tender/:id/ledger/sumLoad', sessionAuth, tenderCheck, uncheckTenderCheck, 'tenderController.sumLoad');
     app.post('/tender/:id/measure/stage/:order/sumLoad', sessionAuth, tenderCheck, uncheckTenderCheck, 'tenderController.sumLoad');
-    app.post('/tender/:id/revise/info/sumLoad', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.loadInfoData');
+    app.post('/tender/:id/revise/info/sumLoad', sessionAuth, tenderCheck, uncheckTenderCheck, reviseCheck, 'tenderController.sumLoad');
 
     // 扫码登录
     app.get('/wxAuth', 'loginController.wxAuth');

+ 25 - 0
app/service/ledger.js

@@ -29,6 +29,7 @@ const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp'];
 const rootId = -1;
 const keyPre = 'tender_node_maxId:';
 const measureType = require('../const/tender').measureType;
+const SumLoad = require('../lib/sum_load');
 
 module.exports = app => {
 
@@ -763,6 +764,30 @@ module.exports = app => {
                 throw err;
             }
         }
+
+        async sumLoad(lid, tenders) {
+            const maxId = await this._getMaxLid(this.ctx.tender.id);
+            const select = await this.getDataById(lid);
+            const sumLoad = new SumLoad(this.ctx);
+            const loadTree = await sumLoad.loadGatherGcl(select, maxId, tenders, {
+
+            });
+            const result = loadTree.getUpdateData();
+
+            const conn = await this.db.beginTransaction();
+            try {
+                this._cacheMaxLid(this.ctx.tender.id, loadTree.keyNodeId);
+                await this.ctx.service.sumLoadHistory.saveLedgerHistory(this.ctx.tender.id, lid, tenders);
+                await conn.update(this.tableName, result.update);
+                await conn.insert(this.tableName, result.create);
+                await conn.commit();
+                return result;
+            } catch (err) {
+                console.log(err);
+                await conn.rollback();
+                throw (err.stack ? '导入工程量数据出错': err);
+            }
+        }
     }
 
     return Ledger;

+ 24 - 0
app/service/revise_bills.js

@@ -7,6 +7,7 @@
  * @date
  * @version
  */
+const SumLoad = require('../lib/sum_load');
 
 module.exports = app => {
     class ReviseBills extends app.BaseBillsService {
@@ -276,6 +277,29 @@ module.exports = app => {
             }
             await this._calcNode(node, transaction);
         }
+
+        async sumLoad(lid, rid, tenders) {
+            const conn = await this.db.beginTransaction();
+            try {
+                const maxId = await this._getMaxLid(this.ctx.tender.id);
+                const select = await this.getDataById(lid);
+                const sumLoad = new SumLoad(this.ctx);
+                const loadTree = await sumLoad.updateGatherGcl(select, maxId, tenders, {
+                    crid: rid,
+                });
+                const result = loadTree.getUpdateData();
+
+                this._cacheMaxLid(this.ctx.tender.id, loadTree.keyNodeId);
+                await this.ctx.service.sumLoadHistory.saveReviseHistory(this.ctx.tender.id, rid, lid, tenders, result.errors);
+                if (result.update.length > 0) await conn.updateRows(this.tableName, result.update);
+                if (result.create.length > 0)await conn.insert(this.tableName, result.create);
+                await conn.commit();
+                return result;
+            } catch (err) {
+                await conn.rollback();
+                throw (err.stack ? err : '导入工程量数据出错');
+            }
+        }
     }
 
     return ReviseBills;

+ 12 - 0
app/service/sum_load_history.js

@@ -74,6 +74,18 @@ module.exports = app => {
             };
             await this.db.insert(this.tableName, data);
         }
+
+        async getReviseLastestData(rid) {
+            const sql = 'SELECT * FROM ' + this.tableName +
+                '  WHERE id in ( SELECT top 1 id FROM ' + this.tableName + ' WHERE rid = ? order by load_time desc)';
+            return await this.db.query(sql, [rid])
+        }
+
+        async getStageLastestData(sid) {
+            const sql = 'SELECT * FROM ' + this.tableName +
+                '  WHERE id in ( SELECT top 1 id FROM ' + this.tableName + ' WHERE sid = ? order by load_time desc)';
+            return await this.db.query(sql, [sid])
+        }
     }
 
     return SumLoadHistory;

+ 1 - 0
app/view/revise/info_modal.ejs

@@ -721,6 +721,7 @@
     <% include ../shares/delete_hint_modal.ejs %>
     <% include ../shares/check_data_modal.ejs %>
     <% include ../shares/check_modal2.ejs %>
+    <% include ../shares/tender_select_modal.ejs %>
     <% if(ctx.session.sessionUser.accountId === revise.uid && (revise.status === auditConst.status.uncheck || revise.status === auditConst.status.checkNo)) { %>
     <script>
         const cur_uid = '<%- ctx.session.sessionUser.accountId %>';

+ 4 - 1
app/view/shares/tender_select_modal.ejs

@@ -19,7 +19,10 @@
                         <div class="modal-height-300" id="ts-result-spread">
                         </div>
                     </div>
-                    <div class="text-danger text-center ml-3" id="ts-hint">我是提示呀</div>
+                    <div id="tender-select-hint">
+                        <div class="text-danger text-center ml-3 d-inline-block" id="ts-hint-text">我是提示呀</div>
+                        <button class="btn btn-sm btn-primary ml-auto" id="tender-select-reset">重置</button>
+                    </div>
                 </div>
             </div>
             <div class="modal-footer">