Browse Source

部位明细:

MaiXinRong 6 years ago
parent
commit
d5d2260a19
4 changed files with 193 additions and 18 deletions
  1. 166 6
      app/public/js/ledger.js
  2. 1 1
      app/public/js/spreadjs_rela/spreadjs_zh.js
  3. 1 0
      app/service/ledger.js
  4. 25 11
      app/service/pos.js

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

@@ -101,7 +101,7 @@ $(document).ready(function() {
             setObjEnable($('#up-move'), valid && node && node.order > 1);
             setObjEnable($('#down-move'), valid && node && !tree.isLastSibling(node));
             if (checkTzMeasureType()) {
-                const posRange = pos.getMasterRange(node.id);
+                const posRange = node ? pos.getMasterRange(node.id) : [];
                 setObjEnable($('#up-level'), valid && node && tree.getParent(node) && (!posRange || posRange.length === 0));
             } else {
                 setObjEnable($('#up-level'), valid && node && tree.getParent(node));
@@ -350,7 +350,7 @@ $(document).ready(function() {
                         nodes.push(node);
                     }
                 }
-                info.sheet.zh_tree.update('/ledger/update', datas, function (result) {
+                info.sheet.zh_tree.update(preUrl + '/ledger/update', datas, function (result) {
                     const rows = [];
                     for (const data of result) {
                         rows.push(sortData.indexOf(data));
@@ -586,6 +586,9 @@ $(document).ready(function() {
     }
     // 绑定部位明细编辑事件
     const posOperationObj = {
+        /**
+         * 加载部位明细 根据当前台账选择节点
+         */
         loadCurPosData: function () {
             const node = treeOperationObj.getSelectNode(ledgerSpread.getActiveSheet());
             if (node) {
@@ -608,7 +611,11 @@ $(document).ready(function() {
                     return;
                 }
                 const node = treeOperationObj.getSelectNode(ledgerSpread.getActiveSheet());
-                if (info.editingText !== '' && node.children && node.children > 0) {
+                if (!node) {
+                    toast('数据错误, 请刷新页面后再试', 'warning')
+                    info.cancel = true;
+                    return;
+                } else if (info.editingText !== '' && node.children && node.children > 0) {
                     toast('父节点不可插入部位明细', 'error');
                     info.cancel = true;
                     return;
@@ -656,13 +663,166 @@ $(document).ready(function() {
                 });
             }
         },
+        /**
+         * 删除按钮响应事件
+         * @param sheet
+         */
+        deletePress: function (sheet) {
+            const self = this;
+            if (sheet.zh_setting) {
+                const sortData = sheet.zh_data;
+                const datas = [], posSelects = [];
+                const sel = sheet.getSelections()[0];
+                for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) {
+                    const node = sortData[iRow];
+                    if (node) {
+                        const data = {id: node.id};
+                        for (let iCol = sel.col; iCol < sel.col + sel.colCount; iCol++) {
+                            const colSetting = sheet.zh_setting.cols[iCol];
+                            if (colSetting.field === 'name') {
+                                toast('部位名称不能为空', 'error');
+                                return;
+                            }
+                            data[colSetting.field] = null;
+                        }
+                        datas.push(data);
+                        posSelects.push(node);
+                    }
+                }
+                sheet.zh_tree.update(preUrl + '/pos/update', datas, function (result) {
+                    pos.updateDatas(result);
+                    // todo 只加载改变项
+                    self.loadCurPosData();
+                });
+            }
+        },
+        /**
+         * 删除 部位明细
+         * @param sheet
+         */
+        deletePos: function (sheet) {
+            const selection = sheet.getSelections();
+            const data = {
+                updateType: 'delete',
+                updateData: [],
+            }
+            const row = selection[0].row, count = selection[0].rowCount;
+            const sortData = sheet.zh_data;
+            for (let iRow = 0; iRow < count; iRow++) {
+                data.updateData.push(sortData[iRow + row].id);
+            }
+            postData(preUrl + '/pos/update', data, function (result) {
+                pos.updateDatas(result.pos);
+                sheet.deleteRows(row, count);
+                ledgerTree.loadPostData(result.ledger, function (loadResult) {
+                    treeOperationObj.refreshTree(ledgerSpread.getActiveSheet(), loadResult);
+                });
+            });
+        },
+        /**
+         * 粘贴单元格响应事件
+         * @param e
+         * @param info
+         */
+        clipboardPasted: function (e, info) {
+            const self = this;
+            const node = treeOperationObj.getSelectNode(ledgerSpread.getActiveSheet());
+            if (node.code && (node.code !== '')) {
+                toast('项目节不可含有清单明细', 'error');
+                self.loadCurPosData();
+                return;
+            }
+            if (node.children && (node.children.length > 0)) {
+                toast('仅清单子项可以含有部位明细', 'error');
+                self.loadCurPosData();
+                return;
+            }
+
+            if (info.sheet.zh_setting) {
+                const data = { updateType: '', updateData: [], };
+                const sortData = info.sheet.zh_data;
+                if (sortData && (info.cellRange.row >= sortData.length)) {
+                    data.updateType = 'add';
+                    if (info.cellRange.col !== 0) {
+                        toast('新增部位请先输入名称', 'warning');
+                        self.loadCurPosData();
+                        return;
+                    }
+                    for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
+                        const curRow = info.cellRange.row + iRow;
+                        const newData = {};
+                        for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) {
+                            const curCol = info.cellRange.col + iCol;
+                            const colSetting = info.sheet.zh_setting.cols[curCol];
+                            data[colSetting.field] = info.sheet.getText(curRow, curCol);
+                            if (colSetting.type === 'Number') {
+                                data[colSetting.field] = _.toNumber(data[colSetting.field]);
+                            }
+                        }
+                        data.updateData.push(newData);
+                    }
+                } else {
+                    data.updateType = 'update';
+                    for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
+                        const curRow = info.cellRange.row + iRow;
+                        const curPos = sortData[curRow];
+                        if (curPos) {
+                            const newData = {id: curPos.id};
+                            for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) {
+                                const curCol = info.cellRange.col + iCol;
+                                const colSetting = info.sheet.zh_setting.cols[curCol];
+                                newData[colSetting.field] = info.sheet.getText(curRow, curCol);
+                                if (colSetting.type === 'Number') {
+                                    newData[colSetting.field] = _.toNumber(newData[colSetting.field]);
+                                }
+                            }
+                            data.updateData.push(newData);
+                        }
+                    }
+                }
+                postData(preUrl + '/pos/update', data, function (result) {
+                    pos.updateDatas(result.pos);
+                    ledgerTree.loadPostData(result.ledger, function (loadResult) {
+                        treeOperationObj.refreshTree(ledgerSpread.getActiveSheet(), loadResult);
+                    });
+                    posOperationObj.loadCurPosData();
+                });
+            }
+        },
     };
     posOperationObj.loadCurPosData();
     if (!posSpreadSetting.readOnly) {
-        SpreadJsObj.addDeleteBind(posSpread, treeOperationObj.deletePress);
+        SpreadJsObj.addDeleteBind(posSpread, posOperationObj.deletePress);
         posSpread.bind(GC.Spread.Sheets.Events.EditEnding, posOperationObj.editEnding);
-        posSpread.bind(GC.Spread.Sheets.Events.CellClick, function (e, info) {
-            console.log(info.sheet.getCell(info.row, info.col));
+        posSpread.bind(GC.Spread.Sheets.Events.ClipboardPasted, posOperationObj.clipboardPasted);
+        // posSpread.bind(GC.Spread.Sheets.Events.CellClick, function (e, info) {
+        //     console.log(info.sheet.getCell(info.row, info.col));
+        // });
+        // 右键菜单
+        $.contextMenu({
+            selector: '#pos-spread',
+            build: function ($trigger, e) {
+                const target = SpreadJsObj.safeRightClickSelection($trigger, e, posSpread);
+                return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
+            },
+            items: {
+                'delete': {
+                    name: '删除',
+                    icon: 'fa-remove',
+                    disabled: function (key, opt) {
+                        const sheet = posSpread.getActiveSheet();
+                        if (sheet.zh_data) {
+                            const selection = sheet.getSelections();
+                            return sheet.zh_data.length < selection[0].row + selection[0].rowCount;
+                        } else {
+                            return true;
+                        }
+                    },
+                    callback: function (key, opt) {
+                        posOperationObj.deletePos(posSpread.getActiveSheet());
+                    }
+                },
+            }
         });
     }
 

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

@@ -144,7 +144,7 @@ const SpreadJsObj = {
         spread.commandManager().register('deleteEvent', function () {
             fun(spread.getActiveSheet());
         });
-        spread.commandManager().setShortcutKey('null', GC.Spread.Commands.Key.del, false, false, false, false);
+        spread.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
         spread.commandManager().setShortcutKey('deleteEvent', GC.Spread.Commands.Key.del, false, false, false, false);
     },
     /**

+ 1 - 0
app/service/ledger.js

@@ -879,6 +879,7 @@ module.exports = app => {
                 await this._updateSelectNextsOrder(selectData, -1);
                 // 删除部位明细
                 await this.transaction.delete(this.ctx.service.pos.tableName, {tid: tenderId, lid: this._.map(deleteData, 'id')});
+                await this.ctx.service.pos.deletePosData(this.transaction, tenderId, this._.map(deleteData, 'id'));
                 await this.transaction.commit();
             } catch (err) {
                 deleteData = [];

+ 25 - 11
app/service/pos.js

@@ -43,20 +43,34 @@ module.exports = app => {
                     const addRst = await transaction.insert(this.tableName, data.updateData);
                     data.updateData.id = addRst.insertId;
                 } else if (data.updateType === 'update') {
-                    await transaction.update(this.tableName, data.updateData, {id: data.updateData.id});
-                    // 计算台账最底层
-                    if (data.updateData.quantity) {
-                        const pos = await this.getDataByCondition({id: data.updateData.id});
-                        await this.ctx.service.ledger.calc(tid, pos.lid, transaction);
-                        result.ledger.update = [pos.lid];
+                    const datas = data.updateData instanceof Array ? data.updateData : [data.updateData];
+                    result.ledger.update = [];
+                    const orgPos = await this.getPosData({tid: tid, id: this._.map(datas, 'id')});
+                    console.log(datas);
+                    for (const d of datas) {
+                        const op = this._.find(orgPos, function (p) { return p.id = d.id; });
+                        await transaction.update(this.tableName, d, {tid: tid, id: d.id});
+                        if (d.quantity && op && (result.ledger.update.indexOf(op.lid) === -1)) {
+                            result.ledger.update.push(op.lid);
+                        }
+                    }
+                    console.log(result.ledger.update);
+                    for (const lid of result.ledger.update) {
+                        await this.ctx.service.ledger.calc(tid, lid, transaction);
                     }
                 } else if (data.updateType === 'delete') {
-                    const pos = await this.getPosData({id: data.updateData.id});
-                    await transaction.delete(this.tableName, {id: data.updateData.id});
-                    await this.ctx.service.ledger.calc(tid, pos.lid, transaction);
-                    result.ledger.update = [pos.lid];
+                    if (!data.updateData || data.updateData.length === 0) {
+                        throw '提交数据错误';
+                    }
+                    const pos = await this.getPosData({tid: tid, id: data.updateData});
+                    const ledgerIds = this._.map(pos, 'lid');
+                    await transaction.delete(this.tableName, {tid: tid, id: data.updateData});
+                    for (const lid of ledgerIds) {
+                        await this.ctx.service.ledger.calc(tid, lid, transaction);
+                    }
+                    result.ledger.update = ledgerIds;
                 } else {
-                    throw '数据错误';
+                    throw '提交数据错误';
                 }
                 await transaction.commit();
                 result.pos = data.updateData;