Browse Source

1. 优化批量插入功能
2. 台账,新增查找定位功能

MaiXinRong 6 years atrás
parent
commit
4a1363a798

+ 25 - 0
app/const/error.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ * 错误信息定义
+ *
+ * @author Mai
+ * @date 2018/7/4
+ * @version
+ */
+
+function getErrorInfo (code, name, hint) {
+    return {
+        code: code,
+        name: name,
+        hint: hint,
+    }
+}
+const login = getErrorInfo(1, '登录异常', '登录信息异常,请重新登录');
+const tender = getErrorInfo(2, '标段异常', '当前未打开标段');
+
+
+module.exports = {
+    login,
+    tender,
+}

+ 61 - 1
app/controller/ledger_controller.js

@@ -57,7 +57,6 @@ module.exports = app => {
                     where: {tender_id: tenderId, times: times, audit_id: auditors[0].audit_id}
                 }) : null;
                 const ledgerData = await ctx.service.ledger.getDataByTenderId(tenderId, 4);
-                console.log(ledgerData.length);
                 const renderData = {
                     tenderData,
                     auditConst,
@@ -373,6 +372,67 @@ module.exports = app => {
         }
 
         /**
+         * 查询
+         *
+         * @param ctx
+         * @returns {Promise<void>}
+         */
+        async search(ctx) {
+            const responseData = {
+                err: 0,
+                msg: '',
+                data: [],
+            };
+            try {
+                const tenderId = ctx.session.sessionUser.tenderId;
+                if (!tenderId) {
+                    throw '当前未打开标段';
+                }
+                const data = JSON.parse(ctx.request.body.data);
+                if (!data.keyword || data.keyword === '') {
+                    throw '参数错误';
+                }
+                responseData.data = await ctx.service.ledger.search(tenderId, {
+                    value: ctx.app.mysql.escape('%' + data.keyword + '%'),
+                    operate: 'Like',
+                    fields: ['code', 'b_code', 'name'],
+                });
+            } catch (err) {
+                console.log(err);
+                responseData.err = 1;
+                responseData.msg = err;
+            }
+
+            ctx.body = responseData;
+        }
+
+        async locate(ctx) {
+
+            const responseData = {
+                err: 0,
+                msg: '',
+                data: [],
+            };
+            try {
+                const tenderId = ctx.session.sessionUser.tenderId;
+                if (!tenderId) {
+                    throw '当前未打开标段';
+                }
+                const data = JSON.parse(ctx.request.body.data);
+                if ((isNaN(data.id) || data.id <= 0)) {
+                    throw '参数错误';
+                }
+                responseData.data = await ctx.service.ledger.locateNode(tenderId, data.id);
+            } catch (err) {
+                console.log(err);
+                responseData.err = 1;
+                responseData.msg = err;
+            }
+
+            ctx.body = responseData;
+        }
+
+        /**
          * 台账变更页面 (Get)
          *
          * @param {object} ctx - egg全局变量

+ 79 - 14
app/public/js/ledger.js

@@ -557,7 +557,7 @@ $(document).ready(function() {
 
     treeOperationObj.refreshOperationValid(ledgerSpread.getActiveSheet(), ledgerSpread.getActiveSheet().getSelections());
 
-    let stdChapter, stdBills, dealBills;
+    let stdChapter, stdBills, dealBills, searchLedger;
     // 展开收起标准清单
     $('a', '#side-menu').bind('click', function () {
         const tab = $(this), tabPanel = $(tab.attr('content'));
@@ -633,6 +633,21 @@ $(document).ready(function() {
                     defaultRowHeight: 21,
                 });
                 dealBills.loadData();
+            } else if (tab.attr('content') === '#search' && !searchLedger) {
+                searchLedger = new SearchLedger($('#search'), {
+                    cols: [
+                        {title: '项目节编号', field: 'code', width: 120, formatter: '@', readOnly: true},
+                        {title: '清单编号', field: 'b_code', width: 120, formatter: '@', readOnly: true},
+                        {title: '名称', field: 'name', width: 230, formatter: '@', readOnly: true},
+                        {title: '单位', field: 'unit', width: 50, formatter: '@', readOnly: true},
+                        {title: '单价', field: 'unit_price', width: 50, readOnly: true},
+                        {title: '数量', field: 'quantity', width: 50, readOnly: true},
+                    ],
+                    emptyRows: 3,
+                    headRows: 1,
+                    headRowHeight: [40],
+                    defaultRowHeight: 21,
+                })
             }
         } else {
             tab.removeClass('active');
@@ -715,29 +730,33 @@ $(document).ready(function() {
             const self = this;
             this.obj = obj;
             this.batchType = batchType;
+            this.billsCount = 6;
 
             this.xmSpreadSetting = {
                 cols: [
-                    {title: '部位', field: 'bw', width: 80, formatter: '@', readOnly: true},
-                    {title: '图册号', field: 'drawingCode', formatter: '@', width: 60, readOnly: true},
-                    {title: '数量1', field: 'bills1', width: 50, readOnly: true},
-                    {title: '数量2', field: 'bills2', width: 50, readOnly: true},
+                    {title: '部位', field: 'bw', width: 80, formatter: '@'},
+                    {title: '图册号', field: 'drawingCode', formatter: '@', width: 60},
                 ],
-                emptyRows: 6,
+                emptyRows: 1000,
                 headRows: 1,
                 headRowHeight: [40],
             };
+            for (let iNum = 1; iNum <= this.billsCount; iNum++) {
+                this.xmSpreadSetting.cols.push(
+                    {title: '清单' + iNum, field: 'bills' + iNum, width: 50}
+                )
+            }
             this.xmSpread = SpreadJsObj.createNewSpread($('.batch-l-t')[0]);
 
             this.gclSpreadSetting = {
                 cols: [
-                    {title: '编号', field: 'code', width: 80, formatter: '@', readOnly: true},
-                    {title: '名称', field: 'name', width: 120, formatter: '@', readOnly: true},
-                    {title: '单位', field: 'unit', width: 50, formatter: '@', readOnly: true},
-                    {title: '单价', field: 'unit_price', width: 50, readOnly: true},
-                    {title: '图册号', field: 'name', width: 60, formatter: '@', readOnly: true},
+                    {title: '编号', field: 'code', width: 80, formatter: '@'},
+                    {title: '名称', field: 'name', width: 120, formatter: '@'},
+                    {title: '单位', field: 'unit', width: 50, formatter: '@'},
+                    {title: '单价', field: 'unit_price', width: 50},
+                    {title: '图册号', field: 'name', width: 60, formatter: '@'},
                 ],
-                emptyRows: 2,
+                emptyRows: this.billsCount,
                 headRows: 1,
                 headRowHeight: [40],
             };
@@ -797,16 +816,29 @@ $(document).ready(function() {
             });
         }
         initView() {
+            let time = new Date();
             const xmSheet = this.xmSpread.getActiveSheet();
             SpreadJsObj.initSheet(xmSheet, this.xmSpreadSetting);
+            console.log(new Date() - time);
+            time = new Date();
+
+            SpreadJsObj.beginMassOperation(xmSheet);
             xmSheet.clear(0, 0, xmSheet.getRowCount(), xmSheet.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data);
+            SpreadJsObj.endMassOperation(xmSheet);
+            console.log(new Date() - time);
+            time = new Date();
 
             const gclSheet = this.gclSpread.getActiveSheet();
             SpreadJsObj.initSheet(gclSheet, this.gclSpreadSetting);
+            SpreadJsObj.beginMassOperation(gclSheet);
             gclSheet.setColumnWidth(0, 45, GC.Spread.Sheets.SheetArea.rowHeader);
-            gclSheet.getCell(0, 0, GC.Spread.Sheets.SheetArea.rowHeader).text('清单1');
-            gclSheet.getCell(1, 0, GC.Spread.Sheets.SheetArea.rowHeader).text('清单2');
+            for (let iRow = 1; iRow <= this.billsCount; iRow ++) {
+                gclSheet.getCell(iRow - 1, 0, GC.Spread.Sheets.SheetArea.rowHeader).text('清单' + iRow);
+            }
             gclSheet.clear(0, 0, gclSheet.getRowCount(), gclSheet.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data);
+            SpreadJsObj.endMassOperation(gclSheet);
+            console.log(new Date() - time);
+            time = new Date();
         }
         getBatchData () {
             const result = [];
@@ -844,6 +876,39 @@ $(document).ready(function() {
             return result;
         }
     }
+    class SearchLedger {
+        constructor(obj, spreadSetting) {
+            const self = this;
+            this.obj = obj;
+            this.url = '/ledger/search';
+            this.spreadSetting = spreadSetting;
+            this.spread = SpreadJsObj.createNewSpread($('div', this.obj)[0]);
+            SpreadJsObj.initSheet(this.spread.getActiveSheet(), this.spreadSetting);
+
+            $('a', this.obj).bind('click', function () {
+                const data = { keyword: $('input', self.obj).val() };
+                postData('/ledger/search', data, function (result) {
+                    SpreadJsObj.loadSheetData(self.spread.getActiveSheet(), 'data', result);
+                });
+            });
+            this.spread.getActiveSheet().bind(GC.Spread.Sheets.Events.CellDoubleClick, function (e, info) {
+                const sheet = info.sheet;
+                const data = sheet.zh_data;
+                if (!data) { return }
+
+                const curBills = data[info.row];
+                if (!curBills) { return }
+
+                const mainSheet = ledgerSpread.getActiveSheet();
+                const mainTree = mainSheet.zh_tree;
+                mainTree.postData('locate', null, {id: curBills.ledger_id}, function (result) {
+                    treeOperationObj.refreshTree(mainSheet, result);
+                    treeOperationObj.refreshOperationValid(mainSheet, mainSheet.getSelections());
+                    SpreadJsObj.locateTreeNode(mainSheet, curBills.ledger_id);
+                })
+            });
+        }
+    }
 
     $('#searchAccount').click(() => {
         const data = {

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

@@ -572,7 +572,9 @@ const createNewPathTree = function (type, setting) {
          */
         postData (url, node, data, callback) {
             const self = this;
-            data.id = node[self.setting.id];
+            if (node) {
+                data.id = node[self.setting.id];
+            }
             postData(url, data, function (datas) {
                 const result = {};
                 console.log(datas);
@@ -587,7 +589,7 @@ const createNewPathTree = function (type, setting) {
                 }
                 if (datas.expand) {
                     const [create, update] = self._loadExpandData(datas.expand);
-                    result.create = result.create.concat(create);
+                    result.create = result.create ? result.create.concat(create) : create;
                     result.expand = update;
                 }
                 callback(result);

+ 35 - 25
app/public/js/spreadjs_rela/spreadjs_zh.js

@@ -151,34 +151,32 @@ const SpreadJsObj = {
      * 根据sheet.zh_setting初始化sheet表头
      * @param {GC.Spread.Sheets.Worksheet} sheet
      */
-    initSheetHeader: function (sheet) {
+    _initSheetHeader: function (sheet) {
         if (!sheet.zh_setting) { return; }
 
-        this.massOperationSheet(sheet, function () {
-            sheet.setColumnCount(sheet.zh_setting.cols.length);
-            sheet.setRowCount(sheet.zh_setting.headRows, spreadNS.SheetArea.colHeader);
-            for (let iRow = 0; iRow < sheet.zh_setting.headRowHeight.length; iRow ++) {
-                sheet.setRowHeight(iRow, sheet.zh_setting.headRowHeight[iRow], spreadNS.SheetArea.colHeader);
-            }
-            for (let iCol = 0; iCol < sheet.zh_setting.cols.length; iCol++) {
-                const col = sheet.zh_setting.cols[iCol];
-                const title = col.title.split('|');
-                const colSpan = col.colSpan ? col.colSpan.split('|'): ['1'], rowSpan = col.rowSpan ? col.rowSpan.split('|'): ['1'];
-                for (let i = 0; i < title.length; i++) {
-                    const cell = sheet.getCell(i, iCol, spreadNS.SheetArea.colHeader);
-                    cell.text(title[i]);
-                    if ((colSpan[i] !== '' && colSpan[i] !== '1') || (rowSpan[i] !== '' && rowSpan[i] !== '1')) {
-                        sheet.addSpan(i, iCol, parseInt(rowSpan[i]), parseInt(colSpan[i]), spreadNS.SheetArea.colHeader);
-                    }
+        sheet.setColumnCount(sheet.zh_setting.cols.length);
+        sheet.setRowCount(sheet.zh_setting.headRows, spreadNS.SheetArea.colHeader);
+        for (let iRow = 0; iRow < sheet.zh_setting.headRowHeight.length; iRow ++) {
+            sheet.setRowHeight(iRow, sheet.zh_setting.headRowHeight[iRow], spreadNS.SheetArea.colHeader);
+        }
+        for (let iCol = 0; iCol < sheet.zh_setting.cols.length; iCol++) {
+            const col = sheet.zh_setting.cols[iCol];
+            const title = col.title.split('|');
+            const colSpan = col.colSpan ? col.colSpan.split('|'): ['1'], rowSpan = col.rowSpan ? col.rowSpan.split('|'): ['1'];
+            for (let i = 0; i < title.length; i++) {
+                const cell = sheet.getCell(i, iCol, spreadNS.SheetArea.colHeader);
+                cell.text(title[i]);
+                if ((colSpan[i] !== '' && colSpan[i] !== '1') || (rowSpan[i] !== '' && rowSpan[i] !== '1')) {
+                    sheet.addSpan(i, iCol, parseInt(rowSpan[i]), parseInt(colSpan[i]), spreadNS.SheetArea.colHeader);
                 }
-                sheet.setColumnWidth(iCol, col.width);
             }
-            sheet.rowOutlines.direction(spreadNS.Outlines.OutlineDirection.backward);
-            sheet.showRowOutline(false);
-            if (sheet.zh_setting.defaultRowHeight) {
-                sheet.defaults.rowHeight = sheet.zh_setting.defaultRowHeight;
-            }
-        });
+            sheet.setColumnWidth(iCol, col.width);
+        }
+        sheet.rowOutlines.direction(spreadNS.Outlines.OutlineDirection.backward);
+        sheet.showRowOutline(false);
+        if (sheet.zh_setting.defaultRowHeight) {
+            sheet.defaults.rowHeight = sheet.zh_setting.defaultRowHeight;
+        }
     },
     /**
      * 初始化sheet, 设置sheet.zh_setting, 并初始化表头
@@ -186,11 +184,13 @@ const SpreadJsObj = {
      * @param setting
      */
     initSheet: function (sheet, setting) {
+        this.beginMassOperation(sheet);
         sheet.zh_setting = setting;
-        this.initSheetHeader(sheet);
+        this._initSheetHeader(sheet);
         sheet.setRowCount(sheet.zh_setting.emptyRows);
         sheet.extendCellType = {};
         sheet.getRange(0, 0, sheet.getRowCount(), sheet.getColumnCount()).locked(setting.readOnly);
+        this.endMassOperation(sheet);
     },
     /**
      * 整个sheet重新加载数据
@@ -410,6 +410,16 @@ const SpreadJsObj = {
         }
         return copyData.join('\n');
     },
+    locateTreeNode: function (sheet, id) {
+        const tree = sheet.zh_tree;
+        if (!tree) { return }
+        const node = tree.getItems(id);
+        if (!node) { return }
+        const index = tree.nodes.indexOf(node);
+        const sels = sheet.getSelections();
+        sheet.setSelection(index, sels[0].col, 1, 1);
+        sheet.showRow(index, spreadNS.VerticalPosition.center);
+    },
 
     CellType: {
         /**

+ 2 - 0
app/router.js

@@ -42,6 +42,8 @@ module.exports = app => {
     app.post('/ledger/paste-block', sessionAuth, 'ledgerController.pasteBlock');
     app.post('/ledger/add-by-std', sessionAuth, 'ledgerController.addFromStandardLib');
     app.post('/ledger/batch-insert', sessionAuth, 'ledgerController.batchInsert');
+    app.post('/ledger/search', sessionAuth, 'ledgerController.search');
+    app.post('/ledger/locate', sessionAuth, 'ledgerController.locate');
 
     app.get('/ledger/change', sessionAuth, 'ledgerController.change');
     app.get('/ledger/index', sessionAuth, 'ledgerController.index');

+ 10 - 0
app/service/ledger.js

@@ -1716,6 +1716,16 @@ module.exports = app => {
                 return { create: createData, update: updateData };
             }
         }
+
+        async locateNode(tenderId, nodeId) {
+            const node = await this.getDataByNodeId(tenderId, nodeId);
+            if (!node) {
+                throw '查询数据有误'
+            }
+            const expandIds = node.full_path.split('.');
+            const expandData = await this.getChildrenByParentId(tenderId, expandIds);
+            return { expand: expandData };
+        }
     }
 
     return Ledger;

+ 8 - 0
app/view/ledger/explode.ejs

@@ -85,6 +85,11 @@
                         <div id="deal-bills-spread" class="sjs-height-2">
                         </div>
                     </div>
+                    <div id="search" class="tab-pane">
+                        <input id="searchKeyword">
+                        <a href="javascript: void(0);" class="btn btn-sm btn-primary">搜索</a>
+                        <div id="search-result" class="sjs-height-2"></div>
+                    </div>
                     <% if (tenderData.ledger_status !== auditConst.status.uncheck) { %>
                     <div id="opinion" class="tab-pane">
                         <div class="side-bar">
@@ -128,6 +133,9 @@
                 <li class="nav-item">
                     <a class="nav-link" content="#deal-bills" href="javascript: void(0);">签约清单</a>
                 </li>
+                <li>
+                    <a class="nav-link" content="#search" href="javascript: void(0);">查找定位</a>
+                </li>
                 <% if (tenderData.ledger_status !== auditConst.status.uncheck) { %>
                 <li class="nav-item">
                     <a class="nav-link" content="#opinion" href="javascript: void(0);">清单意见</a>

+ 1 - 1
config/config.default.js

@@ -106,7 +106,7 @@ module.exports = appInfo => {
     };
 
     // 是否压缩替换前端js
-    config.min = false;
+    config.min = true;
 
     // 压缩设置
     config.gzip = {