Browse Source

台账,计量单元,书签相关

MaiXinRong 1 year ago
parent
commit
a6f627e2b1
5 changed files with 195 additions and 64 deletions
  1. 126 52
      app/public/js/ledger.js
  2. 53 6
      app/public/js/shares/cs_tools.js
  3. 12 4
      app/public/js/shares/new_tag.js
  4. 2 2
      app/service/ledger_tag.js
  5. 2 0
      sql/update.sql

+ 126 - 52
app/public/js/ledger.js

@@ -97,12 +97,18 @@ $(document).ready(function() {
     const billsTag = $.billsTag({
         selector: '#bills-tag',
         relaSpread: ledgerSpread,
+        relaPosSpread: posSpread,
         updateUrl: window.location.pathname + '/tag',
         afterModify: function (nodes) {
             SpreadJsObj.repaintNodesRowHeader(ledgerSpread.getActiveSheet(), nodes);
         },
-        afterLocated:  function () {
+        afterLocated:  function (lid, pos_id) {
             posOperationObj.loadCurPosData();
+            if (pos_id) {
+                const posSheet = posSpread.getActiveSheet();
+                const relaPos = posSheet.zh_data.find(x => { return x.id === pos_id; });
+                SpreadJsObj.locateData(posSheet, relaPos);
+            }
         },
         afterShow: function () {
             ledgerSpread.refresh();
@@ -1255,7 +1261,7 @@ $(document).ready(function() {
     //     const $obj = $('<div>' + item.name +)
     // };
     // 右键菜单
-    const addTag = newTag({ledgerSheet: ledgerSpread.getActiveSheet(), billsTag});
+    const addTag = newTag({ledgerSheet: ledgerSpread.getActiveSheet(), posSheet: posSpread.getActiveSheet(), billsTag});
     const billsContextMenuOptions = {
         selector: '#ledger-spread',
         build: function ($trigger, e) {
@@ -1743,6 +1749,36 @@ $(document).ready(function() {
         });
         sjsSettingObj.setGridSelectStyle(posSpreadSetting);
     }
+    posSpreadSetting.headColWidth = [50];
+    posSpreadSetting.rowHeader = [
+        {
+            rowHeaderType: 'tag',
+            setting: {
+                indent: 14,
+                tagSize: 0.8,
+                tagFont: '8px 微软雅黑',
+                getColor: function (index, data) {
+                    if (!data) return;
+                    return billsTag.getPosTagsColor(data.lid, data.id);
+                },
+                getTagHtml: function (index, data) {
+                    if (!data) return;
+                    const getHtml = function (list) {
+                        if (!list || list.length === 0) return '';
+                        const html = [];
+                        for (const l of list) {
+                            html.push('<div class="row mr-1">');
+                            html.push(`<div class="col-auto pr-1 ${l.tagClass}">`, '<i class="fa fa-tag"></i>', '</div>');
+                            html.push('<div class="col p-0">', '<p>', l.comment, '</p>', '</div>');
+                            html.push('</div>');
+                        }
+                        return html.join('');
+                    };
+                    return getHtml(billsTag.getPosTagsInfo(data.lid, data.id));
+                }
+            },
+        },
+    ];
     SpreadJsObj.initSheet(posSpread.getActiveSheet(), posSpreadSetting);
     //绑定计量单元编辑事件
     const posOperationObj = {
@@ -1877,13 +1913,18 @@ $(document).ready(function() {
             if (data.updateData.length > 0) {
                 postData('/tender/' + getTenderId() + '/pos/update', data, function (result) {
                     if (type === 'delete') {
+                        for (const p of result.pos) {
+                            const posInfo = pos.getPos(p);
+                            billsTag.afterDeletePos(posInfo);
+                        }
                         pos.removeDatas(result.pos);
                         sheet.deleteRows(row, count);
                         const loadResult = ledgerTree.loadPostData(result.ledger);
                         treeOperationObj.refreshTree(ledgerSpread.getActiveSheet(), loadResult);
                         treeOperationObj.refreshOperationValid(ledgerSpread.getActiveSheet());
                     } else {
-                        pos.updateDatas(result.pos);
+                        const updateRst = pos.updateDatas(result.pos);
+                        billsTag.refreshPosTagView(updateRst.update);
 
                         const sel = selection[0];
                         if (sel) {
@@ -1976,6 +2017,7 @@ $(document).ready(function() {
 
                 postData('/tender/' + getTenderId() + '/pos/update', data, function (result) {
                     const updateRst = pos.updateDatas(result.pos);
+                    billsTag.refreshPosTagView(updateRst.update);
                     // 刷新当前行, 不适用于新增(在非下一空白行新增)
                     if (updateRst.create.length > 0) {
                         // info.sheet.addRows(info.row, 1);
@@ -2036,7 +2078,8 @@ $(document).ready(function() {
                 }
                 if (datas.length > 0) {
                     postData('/tender/' + getTenderId() + '/pos/update', {updateType: 'update', updateData: datas}, function (result) {
-                        pos.updateDatas(result.pos);
+                        const updateRst = pos.updateDatas(result.pos);
+                        billsTag.refreshPosTagView(updateRst.update);
                         posOperationObj.loadCurPosData();
                         const loadResult = ledgerTree.loadPostData(result.ledger);
                         treeOperationObj.refreshTree(ledgerSpread.getActiveSheet(), loadResult);
@@ -2066,6 +2109,10 @@ $(document).ready(function() {
             }
             if (data.updateData.length > 0) {
                 postData('/tender/' + getTenderId() + '/pos/update', data, function (result) {
+                    for (const p of result.pos) {
+                        const posInfo = pos.getPos(p);
+                        billsTag.afterDeletePos(posInfo);
+                    }
                     pos.removeDatas(result.pos);
                     sheet.deleteRows(row, count);
                     const loadResult = ledgerTree.loadPostData(result.ledger);
@@ -2175,7 +2222,8 @@ $(document).ready(function() {
                 }
                 if (data.length > 0) {
                     postData('/tender/' + getTenderId() + '/pos/paste', data, function (result) {
-                        pos.updateDatas(result.pos);
+                        const updateRst = pos.updateDatas(result.pos);
+                        billsTag.refreshPosTagView(updateRst.update);
                         posOperationObj.loadCurPosData();
                         const loadResult = ledgerTree.loadPostData(result.ledger);
                         treeOperationObj.refreshTree(ledgerSpread.getActiveSheet(), loadResult);
@@ -2266,69 +2314,95 @@ $(document).ready(function() {
         posSpread.bind(spreadNS.Events.EditStarting, posOperationObj.editStarting);
         posSpread.bind(spreadNS.Events.EditEnded, posOperationObj.editEnded);
         posSpread.bind(spreadNS.Events.ClipboardPasted, posOperationObj.clipboardPasted);
-        const mergePeg = NewMergePeg({ callback: posOperationObj.addPegs });
-        // 右键菜单
-        $.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;
+    }
+    const mergePeg = NewMergePeg({ callback: posOperationObj.addPegs });
+    // 右键菜单
+    $.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: {
+            'insert': {
+                name: '插入',
+                icon: 'fa-plus',
+                disabled: function (key, opt) {
+                    const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
+                    return node && node.children && node.children.length > 0;
+                },
+                callback: function (key, opt) {
+                    posOperationObj.insertPos(posSpread.getActiveSheet());
+                },
+                visible: function(key, opt) {
+                    return !readOnly;
+                }
             },
-            items: {
-                'insert': {
-                    name: '插入',
-                    icon: 'fa-plus',
-                    disabled: function (key, opt) {
-                        const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
-                        return node && node.children && node.children.length > 0;
-                    },
-                    callback: function (key, opt) {
-                        posOperationObj.insertPos(posSpread.getActiveSheet());
+            '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;
                     }
                 },
-                '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());
-                    }
+                callback: function (key, opt) {
+                    posOperationObj.deletePos(posSpread.getActiveSheet());
                 },
-                'merge-peg': {
-                    name: '合并起讫桩号',
-                    disabled: function (key, opt) {
-                        const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
-                        return _.isNil(node) || _.isNil(node.b_code) || node.b_code === '';
-                    },
-                    callback: function (key, opt) {
-                        mergePeg.show();
-                    }
+                visible: function(key, opt) {
+                    return !readOnly;
+                }
+            },
+            'merge-peg': {
+                name: '合并起讫桩号',
+                disabled: function (key, opt) {
+                    const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
+                    return _.isNil(node) || _.isNil(node.b_code) || node.b_code === '';
+                },
+                callback: function (key, opt) {
+                    mergePeg.show();
+                },
+                visible: function(key, opt) {
+                    return !readOnly;
+                }
+            },
+            tag: {
+                name: '书签',
+                disabled: function(key, opt) {
+                    const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
+                    const pos = SpreadJsObj.getSelectObject(posSpread.getActiveSheet());
+                    return _.isNil(node) || _.isNil(pos);
+                },
+                callback: function(key, opt) {
+                    const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
+                    const pos = SpreadJsObj.getSelectObject(posSpread.getActiveSheet());
+                    addTag.do(node, pos);
                 }
             }
-        });
-    }
+        }
+    });
 
     postData(window.location.pathname + '/load', {}, function (data) {
         ledgerTree.loadDatas(data.bills);
         treeCalc.calculateAll(ledgerTree);
+        checkShowLast(data.bills.length);
+        pos.loadDatas(data.pos);
+
         for (const t of data.tags) {
-            t.node = ledgerTree.datas.find(x => {return x.id === t.lid});
+            t.node = ledgerTree.datas.find(x => { return x.id === t.lid; });
+            if (t.pos_id) {
+                const posRange = pos.getLedgerPos(t.lid) || [];
+                t.pos = posRange.find(x => { return x.id === t.pos_id; });
+            }
         }
         billsTag.loadDatas(data.tags);
         SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree);
         SpreadJsObj.loadTopAndSelect(ledgerSpread.getActiveSheet(), ckBillsSpread);
 
-        checkShowLast(data.bills.length);
-
-        pos.loadDatas(data.pos);
         posOperationObj.loadCurPosData();
         SpreadJsObj.resetTopAndSelect(posSpread.getActiveSheet());
 

+ 53 - 6
app/public/js/shares/cs_tools.js

@@ -823,7 +823,10 @@ const showSelectTab = function(select, spread, afterShow) {
                 '<a class="dropdown-item text-warning " href="javascript: void(0);" name="tag-color"><i class="fa fa-tint"></i></a>',
                 '<a class="dropdown-item text-info " href="javascript: void(0);" name="tag-color"><i class="fa fa-tint"></i></a>', '</div>');
             tagHtml.push('</div>');
-            tag.node && tagHtml.push((tag.node.code || '') + (tag.node.b_code || ''), ' / ', tag.node.name || '');
+            if (tag.node) {
+                const posHint = tag.pos ? ' - ' + tag.pos.name : '';
+                tagHtml.push((tag.node.code || '') + (tag.node.b_code || ''), ' / ', tag.node.name || '', posHint);
+            }
             tagHtml.push('</div>');
 
             tagHtml.push('<div class="card-body p-2">');
@@ -854,13 +857,16 @@ const showSelectTab = function(select, spread, afterShow) {
             tagHtml.push('<div class="card-header p-2"><div class="dropdown">');
             tagHtml.push(`<div class="pull-left mr-2"><i class="fa fa-tag ${tagClass.tagClass}"></i></div>`);
             tagHtml.push('</div>');
-            tag.node && tagHtml.push((tag.node.code || '') + (tag.node.b_code || ''), ' / ', tag.node.name || '');
+            if (tag.node) {
+                const posHint = tag.pos ? ' - ' + tag.pos.name : '';
+                tagHtml.push((tag.node.code || '') + (tag.node.b_code || ''), ' / ', tag.node.name || '', posHint);
+            }
             if (tag.share) {
                 tagHtml.push(`<div class="pull-right"><i class="fa fa-users text-warning" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="所有参与台账审批管理的用户都可以看到这条书签"></i> <span>${tag.u_name}</span></div>`);
             }
             tagHtml.push('<div class="pull-right edit-tag-btn">');
             const lid = tag.node ? tag.node[setting.treeId] : -1;
-            tagHtml.push(`<a class="mr-1" name="bills-tag-locate" href="javascript: void(0);" lid="${lid}"><i class="fa fa-crosshairs"></i> 定位</a>`);
+            tagHtml.push(`<a class="mr-1" name="bills-tag-locate" href="javascript: void(0);" lid="${lid}" pos_id="${tag.pos_id}"><i class="fa fa-crosshairs"></i> 定位</a>`);
             if (tag.uid === userID && !setting.readOnly) tagHtml.push(`<a href="javascript: void(0);" name="bills-tag-edit" tag-id="${tag.id}"><i class="fa fa-edit"></i> 编辑</a>`);
             tagHtml.push('</div>');
             tagHtml.push('<div class="card-body p-2">', '<p class="card-text">', tag.comment, '</p>', '</div>');
@@ -898,6 +904,17 @@ const showSelectTab = function(select, spread, afterShow) {
                 refreshTagView(tag);
             }
         };
+        const refreshPosTagView = function(pos) {
+            const posRange = pos instanceof Array ? pos : [pos];
+            for (const p of posRange) {
+                const bi = billsIndexes[p.lid] || [];
+                const pi = bi.filter(x => { return x.pos_id === p.id; });
+
+                for (const tag of pi) {
+                    refreshTagView(tag);
+                }
+            }
+        };
 
         const reviewTag = function (tag, isTop = false) {
             const obj = $('#bills-tag-' + tag.id);
@@ -1006,7 +1023,6 @@ const showSelectTab = function(select, spread, afterShow) {
             const billsTags = billsIndexes[id] || [];
             return billsTags.length > 0 ? billsTags.map(x => {return x.color}) : undefined;
         };
-
         const getBillsTagsInfo = function (id) {
             const billsTags = billsIndexes[id] || [];
             return billsTags.length > 0 ? billsTags.map(x => {
@@ -1014,6 +1030,19 @@ const showSelectTab = function(select, spread, afterShow) {
                 return {color: x.color, comment: x.comment, tagClass: tagClass.tagClass};
             }) : undefined;
         };
+        const getPosTagsColor = function (lid, pos_id) {
+            const billsTags = billsIndexes[lid] || [];
+            const posTags = billsTags.filter(x => { return x.pos_id === pos_id; });
+            return posTags.length > 0 ? posTags.map(x => {return x.color}) : undefined;
+        };
+        const getPosTagsInfo = function(lid, pos_id) {
+            const billsTags = billsIndexes[lid] || [];
+            const posTags = billsTags.filter(x => { return x.pos_id === pos_id; });
+            return posTags.length > 0 ? posTags.map(x => {
+                const tagClass = classIndexes.find(tc => {return tc.color === x.color}) || {};
+                return {color: x.color, comment: x.comment, tagClass: tagClass.tagClass};
+            }) : undefined;
+        };
 
         const afterDeleteBills = function (nodes) {
             for (const node of nodes) {
@@ -1027,11 +1056,26 @@ const showSelectTab = function(select, spread, afterShow) {
                 }
             }
         };
+        const afterDeletePos = function (pos) {
+            for (const p of pos) {
+                const bi = billsIndexes[p.lid];
+                if (!bi) continue;
+
+                const pi = bi.filter(x => { return x.pos_id === p.id; });
+                for (const piTag of pi) {
+                    const delTag = billsTags.find(x => {return x.id === piTag.id});
+                    billsTags.splice(billsTags.indexOf(delTag), 1);
+                    $('#bills-tag-' + delTag.id).remove();
+                    bi.splice(pi.indexOf(piTag), 1);
+                }
+            }
+        };
 
         $('body').on('click', '[name=bills-tag-locate]', function () {
             const lid = parseInt(this.getAttribute('lid'));
+            const pos_id = this.getAttribute('pos_id');
             SpreadJsObj.locateTreeNode(setting.relaSpread.getActiveSheet(), lid, true);
-            setting.afterLocated && setting.afterLocated();
+            setting.afterLocated && setting.afterLocated(lid, pos_id);
         });
         $('body').on('click', '[name=bills-tag-edit]', function () {
             const tagId = this.getAttribute('tag-id');
@@ -1112,7 +1156,10 @@ const showSelectTab = function(select, spread, afterShow) {
         $('#bills-tag-search').bind('click', () => {searchTagsAndShow();});
         $('#bills-tag-keyword').bind('keydown', e => {if (e.keyCode === 13) searchTagsAndShow();});
 
-        return { loadDatas, updateDatasAndShow, show, getBillsTagsColor, getBillsTagsInfo, refreshBillsTagView, afterDeleteBills }
+        return { loadDatas, updateDatasAndShow, show,
+            getBillsTagsColor, getBillsTagsInfo, getPosTagsColor, getPosTagsInfo,
+            refreshBillsTagView, refreshPosTagView,
+            afterDeleteBills, afterDeletePos }
     };
 
     $.sumLoadMiss = function (setting) {

+ 12 - 4
app/public/js/shares/new_tag.js

@@ -1,12 +1,15 @@
 const newTag = function (setting) {
     const billsTag = setting.billsTag;
     const billsSheet = setting.ledgerSheet;
-    let relaNode;
+    const posSheet = setting.posSheet;
+    let relaNode, relaPos;
 
-    const addTag = function (node) {
+    const addTag = function (node, pos) {
         relaNode = node;
+        relaPos = pos;
         const code = (node.code || '') + (node.b_code || '');
-        $('#addtag-info').html(code + ' / ' + node.name);
+        const posInfo = pos ? ' - ' + pos.name : '';
+        $('#addtag-info').html(code + ' / ' + node.name + posInfo);
         $('#addtag').modal('show');
         $('#addtag-content').val('');
     };
@@ -19,14 +22,19 @@ const newTag = function (setting) {
             add: {
                 color: $('.active[name=addtag-color]').attr('tag-color'),
                 lid: setting.key ? relaNode[setting.key] : relaNode.id,
+                pos_id: relaPos ? (setting.key ? relaPos[setting.key] : relaPos.id) : '',
                 share: $('#addtag-share')[0].checked,
                 comment: $('#addtag-content').val(),
             }
         };
         postData(window.location.pathname + '/tag', data, result => {
-            if (result.add) result.add.node = relaNode;
+            if (result.add) {
+                result.add.node = relaNode;
+                result.add.pos = relaPos;
+            }
             billsTag.updateDatasAndShow(result);
             SpreadJsObj.repaintNodesRowHeader(billsSheet, relaNode);
+            if (relaPos) SpreadJsObj.repaintNodesRowHeader(billsSheet, relaPos);
             $('#addtag').modal('hide');
         });
     });

+ 2 - 2
app/service/ledger_tag.js

@@ -8,7 +8,7 @@
  * @version
  */
 
-const validField = ['lid', 'share', 'color', 'comment'];
+const validField = ['lid', 'pos_id', 'share', 'color', 'comment'];
 
 module.exports = app => {
 
@@ -31,7 +31,7 @@ module.exports = app => {
          * @returns {Promise<void>}
          */
         async getDatas(tid, sid = -1, settleId = -1) {
-            const sql = 'SELECT la.id, la.uid, la.lid, la.share, la.color, la.comment, pa.name as u_name FROM ' + this.tableName + ' la ' +
+            const sql = 'SELECT la.id, la.uid, la.lid, la.pos_id, la.share, la.color, la.comment, pa.name as u_name FROM ' + this.tableName + ' la ' +
                 '  LEFT JOIN ' + this.ctx.service.projectAccount.tableName + ' pa ON la.uid = pa.id' +
                 '  WHERE la.tid = ? and la.sid = ? and la.settle_id = ? and (la.uid = ? or la.share) ORDER BY la.create_time DESC';
             return await this.db.query(sql, [tid, sid, settleId, this.ctx.session.sessionUser.accountId]);

+ 2 - 0
sql/update.sql

@@ -0,0 +1,2 @@
+ALTER TABLE `zh_ledger_tag`
+ADD COLUMN `pos_id` varchar(36) NOT NULL DEFAULT '' COMMENT '关联计量单元id(zh_pos表中的id)' AFTER `id`;