Ver código fonte

总分包相关V0.9

MaiXinRong 3 anos atrás
pai
commit
40bc9215f1

+ 2 - 1
app/controller/tender_controller.js

@@ -1168,7 +1168,8 @@ module.exports = app => {
                         ctx.body = {err: 0, msg: '', data: reviseData};
                         break;
                     case 'stage':
-                        ctx.body = await this._sumLoadStage(data.tid, data.lid, data.tenders);
+                        const stageData = await this.ctx.service.stageBills.sumLoad(data.lid, data.tenders);
+                        ctx.body = {err: 0, msg: '', data: stageData};
                         break;
                     default:
                         throw '数据错误';

+ 9 - 6
app/lib/sum_load.js

@@ -168,10 +168,13 @@ class updateReviseGclTree extends loadGclBaseTree {
                 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);
+                    result.errors.push({
+                        b_code: bn.b_code, name: bn.name, unit: bn.unit,
+                        sgfh_qty: bn.sgfh_qty, sjcl_qty: bn.sjcl_qty, qtcl_qty: bn.qtcl_qty, qty: bn.quantity, type: 'less',
+                    });
                 } 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,
+                        id: bn.id, sgfh_qty: bn.sgfh_qty, sjcl_qty: bn.sjcl_qty, qtcl_qty: bn.qtcl_qty, qty: bn.quantity
                     })
                 }
             }
@@ -261,18 +264,18 @@ class gatherStageGclTree extends loadGclBaseTree {
                 for (const cd of bn.change_detail) {
                     result.errors.push({
                         b_code: bn.b_code, name: bn.name, unit: bn.unit,
-                        c_code: cd.c_code, qty: cd.qty
+                        c_code: cd.c_code, qty: cd.qty, type: 'qc',
                     });
                 }
             }
         }
         for (const i of this.items) {
-            result.errors.push({ b_code: i.b_code, name: i.name, unit: i.unit, qty: i.qty });
+            result.errors.push({ b_code: i.b_code, name: i.name, unit: i.unit, qty: i.contract_qty, type: 'miss' });
             if (i.change_detail && i.change_detail.length > 0) {
                 for (const cd of i.change_detail) {
                     result.errors.push({
                         b_code: i.b_code, name: i.name, unit: i.unit,
-                        c_code: cd.c_code, qty: cd.qty
+                        c_code: cd.c_code, qty: cd.qty, type: 'miss-qc',
                     });
                 }
             }
@@ -383,7 +386,7 @@ class sumLoad {
             const stage = await this.ctx.service.stage.getDataByCondition({tid: tender.tid, order: tender.stage});
             if (!stage) throw '选择的期不存在';
             const curStageData = await this.ctx.service.stageBills.getLastestStageData(tender.tid, stage.id);
-            const curStageChange = await this.ctx.service.stageChangeFinal.getSumLoadFinalData({tid: tender.tid, sid: stage.id});
+            const curStageChange = await this.ctx.service.stageChangeFinal.getSumLoadFinalData(stage.id);
             this._loadCurStageAndChange(billsData, curStageData, curStageChange);
             const billsTree = new Ledger.billsTree(this.ctx, {
                 id: 'ledger_id',

+ 119 - 1
app/public/js/shares/cs_tools.js

@@ -931,5 +931,123 @@ const showSelectTab = function(select, spread, afterShow) {
         $('#bills-tag-keyword').bind('keydown', e => {if (e.keyCode === 13) searchTagsAndShow();});
 
         return { loadDatas, updateDatasAndShow, show, getBillsTagsColor, getBillsTagsInfo, refreshBillsTagView, }
-    }
+    };
+
+    $.sumLoadMiss = function (setting) {
+        if (!setting.spreadSetting) {
+            setting.spreadSetting = {
+                cols: [
+                    { title: '清单编号', field: 'b_code', width: 80, formatter: '@' },
+                    { title: '清单名称', field: 'name', width: 120, formatter: '@' },
+                    { title: '单位', field: 'unit', width: 50, formatter: '@' },
+                    { title: '数量', field: 'qty', width: 60 },
+                    {
+                        title: '类型', field: 'type', width: 100, getValue: function (x) {
+                            switch (x.type) {
+                                case 'less': return '数量变小';
+                                case 'miss': return '找不到清单';
+                                case 'qc': return '变更';
+                                case 'miss-qc': return '变更(找不到清单)';
+                                default: return '';
+                            }
+                        }
+                    }
+                ],
+                emptyRows: 0,
+                headRows: 1,
+                headRowHeight: [32],
+                defaultRowHeight: 21,
+                headerFont: '12px 微软雅黑',
+                font: '12px 微软雅黑',
+                selectedBackColor: '#fffacd',
+                readOnly: true,
+            };
+        }
+
+        const clearMissData = function () {
+            if (setting.storeKey) removeLocalCache(setting.storeKey);
+        };
+
+        const autoShowHistory = function (show) {
+            if (setting.storeKey) {
+                setLocalCache(setting.storeKey + '-showHis', show.toString());
+            }
+        };
+
+        if (setting.selector && setting.relaSpread) {
+            const resultId = setting.id + '-spread';
+            const obj = $(setting.selector);
+            obj.html(
+                '                        <div id="' + resultId + '" class="sjs-sh">\n' +
+                '                        </div>'
+            );
+            autoFlashHeight();
+
+            const spread = SpreadJsObj.createNewSpread($('#' + resultId)[0]);
+            const sheet = spread.getActiveSheet();
+            SpreadJsObj.initSheet(sheet, setting.spreadSetting);
+
+            const loadMissData = function (data, his = false) {
+                const sourceTree = setting.relaSpread.getActiveSheet().zh_tree;
+                if (!sourceTree) return;
+
+                for (const d of data) {
+                    d.serialNo = sourceTree.getNodeIndex(sourceTree.getItems(d.ledger_id)) + 1;
+                }
+                data.sort(function (a, b) {
+                    return a.serialNo - b.serialNo;
+                });
+
+                SpreadJsObj.loadSheetData(sheet, SpreadJsObj.DataType.Data, data);
+                if (!his && setting.storeKey) {
+                    setLocalCache(setting.storeKey, JSON.stringify(data));
+                }
+                $(setting.tabSelector).show();
+            };
+            const showMissList = function () {
+                const tab = $(setting.tabSelector), tabPanel = $(tab.attr('content'));
+                $('a', '.side-menu').removeClass('active');
+                tab.addClass('active');
+                $('.tab-content .tab-pane').removeClass('active');
+                tabPanel.addClass('active');
+                showSideTools(true);
+                spread.refresh();
+                if (setting.afterShow) setting.afterShow();
+            };
+            const loadHisMissData = function () {
+                if (setting.storeKey) {
+                    const storeStr = getLocalCache(setting.storeKey);
+
+                    const storeData = storeStr ? JSON.parse(storeStr) : [];
+                    if (storeData.length > 0) {
+                        loadMissData(storeData, true);
+                        const showHis = getLocalCache(setting.storeKey + '-showHis');
+                        if (showHis === 'true') {
+                            showMissList();
+                            removeLocalCache(setting.storeKey + '-showHis');
+                        }
+                    }
+                }
+            };
+            return {
+                spread: spread,
+                loadMissData: loadMissData,
+                clearMissData: clearMissData,
+                loadHisMissData: loadHisMissData,
+                show: showMissList,
+                autoShowHistory: autoShowHistory,
+            };
+        } else {
+            const loadMissData = function (data) {
+                if (setting.storeKey) {
+                    setLocalCache(setting.storeKey, JSON.stringify(data));
+                }
+            };
+            return {
+                loadErrorData: loadMissData,
+                clearErrorData: clearMissData,
+                autoShowHistory: autoShowHistory,
+            };
+        }
+    };
 })(jQuery);

+ 27 - 18
app/public/js/stage.js

@@ -831,6 +831,17 @@ $(document).ready(() => {
             if (spSpread) spSpread.refresh();
         },
     });
+    const sumLoadMiss = $.sumLoadMiss({
+        tabSelector: '#sum-load-miss-tab',
+        selector: '#sum-load-miss',
+        relaSpread: slSpread,
+        storeKey: 'stage-slm-' + stage.id,
+        id: 'stage-slm',
+        afterShow: function () {
+            slSpread.refresh();
+            if (spSpread) spSpread.refresh();
+        },
+    });
 
     const stageTreeSpreadObj = {
         loadExprToInput(sheet) {
@@ -1449,6 +1460,12 @@ $(document).ready(() => {
             } else {
                 stageIm.loadUpdateLedgerData(result, nodes);
             }
+            if (result.sumLoadHis.errors.length > 0) {
+                sumLoadMiss.loadMissData(result.sumLoadHis.errors);
+                sumLoadMiss.show();
+            } else {
+                sumLoadMiss.clearMissData();
+            }
         }
     });
     $.contextMenu({
@@ -2007,6 +2024,7 @@ $(document).ready(() => {
 
         errorList.loadHisErrorData();
         checkList.loadHisCheckData();
+        sumLoadMiss.loadHisMissData();
     }, null, true);
     spSpread.bind(spreadNS.Events.EditEnded, stagePosSpreadObj.editEnded);
     spSpread.bind(spreadNS.Events.ClipboardPasting, stagePosSpreadObj.clipboardPasting);
@@ -2171,20 +2189,13 @@ $(document).ready(() => {
             autoFlashHeight();
             slSpread.refresh();
             spSpread.refresh();
-            if (searchLedger) {
-                searchLedger.spread.refresh();
-            }
-            if (detail) {
-                detail.spread.refresh();
-            }
+            if (searchLedger) searchLedger.spread.refresh();
+            if (detail) detail.spread.refresh();
             if (checkedChanges) checkedChanges.refresh();
 
-            if (errorList && errorList.spread) {
-                errorList.spread.refresh();
-            }
-            if (checkList) {
-                checkList.spread.refresh();
-            }
+            if (errorList && errorList.spread) errorList.spread.refresh();
+            if (checkList) checkList.spread.refresh();
+            if (sumLoadMiss) sumLoadMiss.spread.refresh();
         }
     });
 
@@ -2364,12 +2375,9 @@ $(document).ready(() => {
                 detail.spread.refresh();
             }
             if (checkedChanges) checkedChanges.refresh();
-            if (errorList && errorList.spread) {
-                errorList.spread.refresh();
-            }
-            if (checkList) {
-                checkList.spread.refresh();
-            }
+            if (errorList && errorList.spread) errorList.spread.refresh();
+            if (checkList) checkList.spread.refresh();
+            if (sumLoadMiss) sumLoadMiss.spread.refresh();
             window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
         }
     });
@@ -3664,6 +3672,7 @@ $(document).ready(() => {
             if (tab.attr('content') === '#check-list') {
                 checkList.spread.refresh();
             }
+            if (tab.attr('content') === '#sum-load-miss') sumLoadMiss.spread.refresh();
         } else {
             tab.removeClass('active');
             tabPanel.removeClass('active');

+ 1 - 1
app/router.js

@@ -516,7 +516,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/measure/stage/:order/sumLoad', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'tenderController.sumLoad');
     app.post('/tender/:id/revise/info/sumLoad', sessionAuth, tenderCheck, uncheckTenderCheck, reviseCheck, 'tenderController.sumLoad');
 
     // 扫码登录

+ 2 - 2
app/service/revise_bills.js

@@ -290,11 +290,11 @@ module.exports = app => {
                 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);
+                const his = 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;
+                return { create: result.create, update: result.update, sumLoadHis: his};
             } catch (err) {
                 await conn.rollback();
                 throw (err.stack ? err : '导入工程量数据出错');

+ 27 - 9
app/service/stage_bills.js

@@ -477,24 +477,42 @@ module.exports = app => {
             return { contract_tp, qc_tp };
         }
 
-        async sumLoad(lid, tender) {
+        async sumLoad(lid, tenders) {
             const conn = await this.db.beginTransaction();
             try {
-                const maxId = await this._getMaxLid(this.ctx.tender.id);
-                const select = await this.getDataById(lid);
+                const maxId = await this.ctx.service.ledger._getMaxLid(this.ctx.tender.id);
+                const select = await this.ctx.service.ledger.getDataById(lid);
                 const sumLoad = new SumLoad(this.ctx);
                 const loadTree = await sumLoad.stageGatherGcl(select, maxId, tenders);
                 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);
+                const stageBills = await this.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id);
+                const updateStageBills = [], insertStageBills = [];
+                for (const u of result.update) {
+                    const sb = stageBills.find(x => { return x.lid === u.lid; });
+                    if (!sb || sb.times !== this.ctx.stage.curTimes || sb.order !== this.ctx.stage.curOrder) {
+                        u.qc_qty = sb ? sb.qc_qty : null;
+                        u.qc_tp = sb ? sb.qc_tp : null;
+                        u.postil = sb ? sb.postil : null;
+                        u.tid = this.ctx.tender.id;
+                        u.sid = this.ctx.stage.id;
+                        u.said = this.ctx.session.sessionUser.accountId;
+                        u.times = this.ctx.stage.curTimes;
+                        u.order = this.ctx.stage.curOrder;
+                        insertStageBills.push(u);
+                    } else {
+                        u.id = sb.id;
+                        updateStageBills.push(u);
+                    }
+                }
+
+                const his = await this.ctx.service.sumLoadHistory.saveStageHistory(this.ctx.tender.id, this.ctx.stage.id, lid, tenders, result.errors);
                 await conn.commit();
-                return result;
+                return { curStageData: result.update, sumLoadHis: his };
             } catch (err) {
+                this.ctx.helper.log(err);
                 await conn.rollback();
-                throw (err.stack ? err : '导入工程量数据出错');
+                throw (err.stack ? '导入工程量数据出错' : err);
             }
         }
     }

+ 17 - 2
app/service/sum_load_history.js

@@ -55,6 +55,9 @@ module.exports = app => {
                 tenders: JSON.stringify(tenders), errors: errors ? JSON.stringify(errors) : '',
             };
             await this.db.insert(this.tableName, data);
+            data.tenders = tenders;
+            data.errors = errors;
+            return data;
         }
 
         async saveReviseHistory(tid, rid, lid, tenders, errors) {
@@ -64,6 +67,9 @@ module.exports = app => {
                 tenders: JSON.stringify(tenders), errors: errors ? JSON.stringify(errors) : '',
             };
             await this.db.insert(this.tableName, data);
+            data.tenders = tender;
+            data.errors = errors;
+            return data;
         }
 
         async saveStageHistory(tid, sid, lid, tenders, errors) {
@@ -73,18 +79,27 @@ module.exports = app => {
                 tenders: JSON.stringify(tenders), errors: errors ? JSON.stringify(errors) : '',
             };
             await this.db.insert(this.tableName, data);
+            data.tenders = tenders;
+            data.errors = errors;
+            return 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])
+            const data = await this.db.query(sql, [rid]);
+            if (data.tenders) data.tenders = JSON.parse(data.tenders);
+            if (data.errors) data.errors = JSON.parse(data.errors);
+            return data;
         }
 
         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])
+            const data = await this.db.query(sql, [sid]);
+            if (data.tenders) data.tenders = JSON.parse(data.tenders);
+            if (data.errors) data.errors = JSON.parse(data.errors);
+            return data;
         }
     }
 

+ 5 - 0
app/view/stage/index.ejs

@@ -548,6 +548,8 @@
                     </div>
                     <div id="check-list" class="tab-pane tab-select-show">
                     </div>
+                    <div id="sum-load-miss" class="tab-pane tab-select-show">
+                    </div>
                 </div>
             </div>
         </div>
@@ -578,6 +580,9 @@
                 <li class="nav-item">
                     <a class="nav-link" content="#error-list" id="error-list-tab" href="javascript: void(0);" style="display: none;">错误列表</a>
                 </li>
+                <li class="nav-item">
+                    <a class="nav-link" content="#sum-load-miss" id="sum-load-miss-tab" href="javascript: void(0);" style="display: none;">导入信息</a>
+                </li>
             </ul>
         </div>
     </div>