瀏覽代碼

调差清单页面数据

laiguoran 5 年之前
父節點
當前提交
78059a615b
共有 7 個文件被更改,包括 320 次插入2 次删除
  1. 28 0
      app/controller/material_controller.js
  2. 146 0
      app/public/js/material_list.js
  3. 3 1
      app/router.js
  4. 24 0
      app/service/stage_bills.js
  5. 25 1
      app/service/stage_pos.js
  6. 76 0
      app/view/material/list.ejs
  7. 18 0
      config/web.js

+ 28 - 0
app/controller/material_controller.js

@@ -232,6 +232,34 @@ module.exports = app => {
         }
 
         /**
+         * 调差清单页面 (Get)
+         * @param {Object} ctx - egg全局变量
+         * @returns {Promise<void>}
+         */
+        async list(ctx) {
+            try {
+                await this._getMaterialAuditViewData(ctx);
+                const renderData = await this._getDefaultRenderData(ctx);
+                // 取所有工料表
+                renderData.materialBillsData = await ctx.service.materialBills.getAllDataByCondition({ where: { tid: ctx.tender.id } });
+                // 取所有已被调用的工料清单表
+                renderData.materialListData = await ctx.service.materialList.getAllDataByCondition({ where: { tid: ctx.tender.id } });
+                renderData.materialType = JSON.stringify(materialConst);
+                renderData.jsFiles = this.app.jsFiles.common.concat(this.app.jsFiles.material.list);
+                // 获取清单数据
+                renderData.ledger = await ctx.service.ledger.getData(ctx.tender.id);
+                renderData.pos = await ctx.service.pos.getPosData({ tid: ctx.tender.id });
+                // 获取所选期数据并合并相加同类清单项
+                renderData.curLedgerData = await ctx.service.stageBills.getStagesData(ctx.tender.id, ctx.material.stage_id);
+                renderData.curPosData = await ctx.service.stagePos.getStagesData(ctx.tender.id, ctx.material.stage_id);
+                await this.layout('material/list.ejs', renderData);
+            } catch (err) {
+                this.log(err);
+                ctx.redirect('/tender/' + ctx.tender.id + '/measure/material');
+            }
+        }
+
+        /**
          * 调差工料 - 编辑工料项 (Ajax)
          * @param ctx
          * @returns {Promise<void>}

+ 146 - 0
app/public/js/material_list.js

@@ -0,0 +1,146 @@
+'use strict';
+
+/**
+ * 材料调差 - 调差清单
+ *
+ * @author EllisRan
+ * @date 2019/10/25
+ * @version
+ */
+
+$(document).ready(() => {
+    autoFlashHeight();
+    // 清单table
+    const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]);
+    const ledgerSpreadSetting = {
+        cols: [
+            {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 150, formatter: '@'},
+            {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 250, formatter: '@'},
+            {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 120, formatter: '@'},
+            {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 120, type: 'Number'},
+            {title: '本期计量数量|合同', colSpan: '3|1', rowSpan: '1|1', field: 'contract_qty', hAlign: 2, width: 120, type: 'Number'},
+            {title: '|数量变更', colSpan: '|1', rowSpan: '|1', field: 'qc_qty', hAlign: 2, width: 120, type: 'Number'},
+            {title: '|小计', colSpan: '|1', rowSpan: '|1', field: 'total_qty', hAlign: 2, width: 120, type: 'Number', getValue: 'getValue.qty'},
+        ],
+        emptyRows: 0,
+        headRows: 2,
+        headRowHeight: [32, 32],
+        defaultRowHeight: 30,
+        headerFont: '10pt 微软雅黑',
+        readOnly: true,
+        font: '10pt 微软雅黑',
+    };
+
+    const ledgerCol = {
+        getValue: {
+            qty: function (data) {
+                return ZhCalc.add(data.contract_qty, data.qc_qty);
+            }
+        }
+    };
+    // 解析清单汇总数据
+    gclGatherModel.loadLedgerData(ledger, curLedgerData);
+    gclGatherModel.loadPosData(pos, curPosData);
+    const gclGatherData = gclGatherModel.gatherGclData();
+    // 获取项目节数据
+    function loadLeafXmjData(iGclRow) {
+        const gcl = gclGatherData[iGclRow];
+        if (gcl) {
+            SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gcl.leafXmjs);
+        } else {
+            SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, []);
+        }
+    }
+    SpreadJsObj.initSpreadSettingEvents(ledgerSpreadSetting, ledgerCol);
+    SpreadJsObj.initSheet(ledgerSpread.getActiveSheet(), ledgerSpreadSetting);
+
+    // 项目明细table
+    const leafXmjSpread = SpreadJsObj.createNewSpread($('#leaf-xmj-spread')[0]);
+    const leafXmjSpreadSetting = {
+        cols: [
+            {title: '项目节|编号', colSpan: '2|1', rowSpan: '1|1', field: 'code', hAlign: 0, width: 80, formatter: '@'},
+            {title: '|项目节名称', colSpan: '|1', rowSpan: '|1', field: 'jldy', hAlign: 0, width: 100, formatter: '@'},
+            {title: '部位明细|部位明细', colSpan: '2|1', rowSpan: '1|1', field: 'bwmx', hAlign: 0, width: 100, formatter: '@'},
+            {title: '|复核数量', colSpan: '|1', rowSpan: '|1', field: 'quantity', hAlign: 0, width: 80, type: 'Number'},
+            {title: '部位信息|单位工程', colSpan: '3|1', rowSpan: '1|1', field: 'dwgc', hAlign: 0, width: 100, formatter: '@'},
+            {title: '|分部工程', colSpan: '|1', rowSpan: '|1', field: 'fbgc', hAlign: 0, width: 100, formatter: '@'},
+            {title: '|分项工程', colSpan: '|1', rowSpan: '|1', field: 'fxgc', hAlign: 0, width: 180, formatter: '@'},
+            {title: '本期计量数量|合同', colSpan: '3|1', rowSpan: '1|1', field: 'contract_qty', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|数量变更', colSpan: '|1', rowSpan: '|1', field: 'qc_qty', hAlign: 2, width: 80, type: 'Number'},
+            {title: '|小计', colSpan: '|1', rowSpan: '|1', field: 'total_qty', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.qty'},
+            {title: '本期价差', colSpan: '1', rowSpan: '2', field: 'jijia', hAlign: 2, width: 80, type: 'Number'},
+        ],
+        emptyRows: 0,
+        headRows: 2,
+        headRowHeight: [32, 32],
+        defaultRowHeight: 30,
+        headerFont: '10pt 微软雅黑',
+        readOnly: true,
+        font: '10pt 微软雅黑',
+    };
+    const leafXmjCol = {
+        getValue: {
+            qty: function (data) {
+                return ZhCalc.add(data.contract_qty, data.qc_qty);
+            }
+        }
+    };
+    SpreadJsObj.initSpreadSettingEvents(leafXmjSpreadSetting, leafXmjCol);
+    SpreadJsObj.initSheet(leafXmjSpread.getActiveSheet(), leafXmjSpreadSetting);
+    // 加载清单数据
+    SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gclGatherData);
+    loadLeafXmjData(0);
+    SpreadJsObj.forbiddenSpreadContextMenu('#ledger-spread', ledgerSpread);
+
+    // 调差清单工料table
+    const materialSpread = SpreadJsObj.createNewSpread($('#material-spread')[0]);
+    const materialSpreadSetting = {
+        cols: [
+            {title: '清单调差工料|编号', colSpan: '4|1', rowSpan: '1|1', field: 'code', hAlign: 0, width: 80, formatter: '@'},
+            {title: '|名称', colSpan: '|1', rowSpan: '|1', field: 'name', hAlign: 0, width: 100, formatter: '@'},
+            {title: '|单位', colSpan: '|1', rowSpan: '|1', field: 'unit', hAlign: 1, width: 60, formatter: '@'},
+            {title: '|kg数量', colSpan: '1', rowSpan: '|1', field: 'num', hAlign: 2, width: 60, type: 'Number'},
+        ],
+        emptyRows: 0,
+        headRows: 2,
+        headRowHeight: [32, 32],
+        defaultRowHeight: 30,
+        headerFont: '10pt 微软雅黑',
+        readOnly: true,
+        font: '10pt 微软雅黑',
+    };
+    SpreadJsObj.initSheet(materialSpread.getActiveSheet(), materialSpreadSetting);
+
+    if (!readOnly) {
+    } else {
+        SpreadJsObj.forbiddenSpreadContextMenu('#leaf-xmj-spread', leafXmjSpread);
+        SpreadJsObj.forbiddenSpreadContextMenu('#material-spread', materialSpread);
+    }
+
+    // 切换清单行,读取所属项目节数据
+    ledgerSpread.getActiveSheet().bind(spreadNS.Events.SelectionChanged, function (e, info) {
+        const iOldRow = info.oldSelections[0].row, iNewRow = info.newSelections[0].row;
+        if (iNewRow !== iOldRow) {
+            loadLeafXmjData(iNewRow);
+        }
+    });
+
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        //key: 'stage.compare.memu.1.0.0',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+            }
+            autoFlashHeight();
+            ledgerSpread.refresh();
+            leafXmjSpread.refresh();
+            materialSpread.refresh();
+        }
+    });
+});

+ 3 - 1
app/router.js

@@ -213,7 +213,6 @@ module.exports = app => {
 
     // 材料调差
     app.get('/tender/:id/measure/material', sessionAuth, tenderCheck, 'materialController.index');
-    app.get('/tender/:id/measure/material/:order', sessionAuth, tenderCheck, materialCheck, 'materialController.info');
     app.post('/tender/:id/measure/material/add', sessionAuth, tenderCheck, 'materialController.add');
     app.post('/tender/:id/measure/material/delete', sessionAuth, tenderCheck, 'materialController.delete');
     // 审批
@@ -222,7 +221,10 @@ module.exports = app => {
     app.post('/tender/:id/measure/material/:order/audit/start', sessionAuth, tenderCheck, materialCheck, 'materialController.startAudit');
     app.post('/tender/:id/measure/material/:order/audit/check', sessionAuth, tenderCheck, materialCheck, 'materialController.checkAudit');
     // 调差工料
+    app.get('/tender/:id/measure/material/:order', sessionAuth, tenderCheck, materialCheck, 'materialController.info');
     app.post('/tender/:id/measure/material/:order/save', sessionAuth, tenderCheck, materialCheck, 'materialController.saveBillsData');
+    // 调差清单
+    app.get('/tender/:id/measure/material/:order/list', sessionAuth, tenderCheck, materialCheck, 'materialController.list');
 
     // 个人账号相关
     app.get('/profile/info', sessionAuth, 'profileController.info');

+ 24 - 0
app/service/stage_bills.js

@@ -369,6 +369,30 @@ module.exports = app => {
         async getSumTotalPriceNotGcl(stage) {
             return await this.getSumTotalPriceFilter(stage, '=', this.db.escape(''));
         }
+
+        /**
+         * 多期清单数据整合 (材料调差调用)
+         * @param {Number} tid - 标段id
+         * @param {String} stage_id_list - 期id列表
+         * @returns {Promise<void>}
+         */
+        async getStagesData(tid, stage_id_list) {
+            let stage_id_listSql = '';
+            stage_id_list = stage_id_list.indexOf(',') !== -1 ? stage_id_list.split(',') : stage_id_list;
+            if (stage_id_list) {
+                if (stage_id_list instanceof Array) {
+                    stage_id_listSql = stage_id_list.length > 0 ? ' And sid in (' + this.ctx.helper.getInArrStrSqlFilter(stage_id_list) + ')' : '';
+                } else {
+                    stage_id_listSql = ' And sid in (' + this.db.escape(stage_id_list) + ')';
+                }
+            }
+            const sql = 'SELECT `lid`, `tid`, `sid`, SUM(`contract_qty`) as `contract_qty`, SUM(`contract_tp`) as `contract_tp`, ' +
+                'SUM(`qc_qty`) as `qc_qty`, SUM(`qc_tp`) as `qc_tp` FROM ' + this.tableName + ' WHERE `tid` = ? ' +
+                stage_id_listSql + ' GROUP BY `lid`';
+            const sqlParam = [tid];
+            const result = await this.db.query(sql, sqlParam);
+            return result;
+        }
     }
 
     return StageBills;

+ 25 - 1
app/service/stage_pos.js

@@ -451,7 +451,31 @@ module.exports = app => {
                 return await this.db.queryOne(calcQtySql, sqlParam);
             }
         }
+
+        /**
+         * 多期清单数据整合 (材料调差调用)
+         * @param {Number} tid - 标段id
+         * @param {String} stage_id_list - 期id列表
+         * @returns {Promise<void>}
+         */
+        async getStagesData(tid, stage_id_list) {
+            let stage_id_listSql = '';
+            stage_id_list = stage_id_list.indexOf(',') !== -1 ? stage_id_list.split(',') : stage_id_list;
+            if (stage_id_list) {
+                if (stage_id_list instanceof Array) {
+                    stage_id_listSql = stage_id_list.length > 0 ? ' And sid in (' + this.ctx.helper.getInArrStrSqlFilter(stage_id_list) + ')' : '';
+                } else {
+                    stage_id_listSql = ' And sid in (' + this.db.escape(stage_id_list) + ')';
+                }
+            }
+            const sql = 'SELECT `id`, `tid`, `sid`, `pid`, `lid`, SUM(`contract_qty`) as `contract_qty`, SUM(`qc_qty`) as `qc_qty`' +
+                ' FROM ' + this.tableName + ' WHERE `tid` = ? ' +
+                stage_id_listSql + 'GROUP BY `pid`';
+            const sqlParam = [tid];
+            const result = await this.db.query(sql, sqlParam);
+            return result;
+        }
     }
 
     return StagePos;
-};
+};

+ 76 - 0
app/view/material/list.ejs

@@ -0,0 +1,76 @@
+<% include ./material_sub_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main d-flex justify-content-between">
+            <% include ./material_sub_mini_menu.ejs %>
+            <div>
+                <div class="d-inline-block">
+                    本期调差计量期:第<span class="mx-2"><%= ctx.material.s_order.split(',').join(',') %></span>期
+                </div>
+                <div class="d-inline-block ml-2">
+                    <a class="btn btn-sm btn-light">
+                        <div class="custom-control custom-checkbox">
+                            <input type="checkbox" class="custom-control-input" id="customCheckDisabled">
+                            <label class="custom-control-label text-primary" for="customCheckDisabled">显示有调差工料清单</label>
+                        </div>
+                    </a>
+                </div>
+            </div>
+            <div class="ml-auto">
+            </div>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-header p-0">
+        </div>
+        <div class="row w-100 sub-content">
+            <div id="main-view" class="c-body" style="width: 100%">
+                <!--上部分-->
+                <div class="sjs-height-1" id="ledger-spread">
+                </div>
+                <!--下部分-->
+                <div class="bcontent-wrap">
+                    <div class="bc-bar mb-1">
+                        <ul class="nav nav-tabs">
+                            <li class="nav-item">
+                                <a class="nav-link active" data-toggle="tab" href="#xmujie" role="tab">清单明细</a>
+                            </li>
+                            <li class="ml-auto">
+                                <a class="btn btn-sm btn-primary" href="#">应用调差工料至其他清单明细</a>
+                            </li>
+                        </ul>
+                    </div>
+                    <div class="tab-content">
+                        <div class="tab-pane active" id="xmujie">
+                            <div class="row">
+                                <div class="col-8">
+                                    <div class="sp-wrap" id="leaf-xmj-spread">
+                                    </div>
+                                </div>
+                                <div class="col-4">
+                                    <div class="sp-wrap" id="material-spread">
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<% if ((ctx.material.status === auditConst.status.uncheck || ctx.material.status === auditConst.status.checkNo) && ctx.session.sessionUser.accountId === ctx.material.user_id) {%>
+<script>
+    const accountList = JSON.parse('<%- JSON.stringify(accountList) %>');
+</script>
+<% } %>
+<script>
+    const materialType = JSON.parse('<%- materialType %>');
+    const materialBillsData = JSON.parse('<%- JSON.stringify(materialBillsData) %>');
+    const materialListData = JSON.parse('<%- JSON.stringify(materialListData) %>');
+    const ledger = JSON.parse('<%- JSON.stringify(ledger) %>');
+    const curLedgerData = JSON.parse('<%- JSON.stringify(curLedgerData) %>');
+    const pos = JSON.parse('<%- JSON.stringify(pos) %>');
+    const curPosData = JSON.parse('<%- JSON.stringify(curPosData) %>');
+    const readOnly = <%- material.readOnly %>;
+</script>

+ 18 - 0
config/web.js

@@ -323,6 +323,24 @@ const JsFiles = {
                 ],
                 mergeFile: 'material',
             },
+            list: {
+                files: [
+                    "/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js",
+                    "/public/js/decimal.min.js",
+                    "/public/js/toastr.min.js",
+                ],
+                mergeFiles: [
+                    "/public/js/sub_menu.js",
+                    "/public/js/div_resizer.js",
+                    "/public/js/spreadjs_rela/spreadjs_zh.js",
+                    "/public/js/zh_calc.js",
+                    "/public/js/path_tree.js",
+                    "/public/js/gcl_gather.js",
+                    "/public/js/material_list.js",
+                    "/public/js/material_audit.js",
+                ],
+                mergeFile: 'material_list',
+            },
         },
     }