瀏覽代碼

1. 台账修订,清单对比,增加项目节汇总
2. 计量期, 清单汇总,增加项目节汇总

MaiXinRong 1 年之前
父節點
當前提交
c18b5d4d42

+ 24 - 0
app/const/spread.js

@@ -1275,6 +1275,30 @@ const stageGather = {
         headerFont: '12px 微软雅黑',
         font: '12px 微软雅黑',
         readOnly: true,
+    },
+    gatherLeafXmj: {
+        cols: [
+            {title: '单位工程', colSpan: '1', rowSpan: '2', field: 'dwgc', hAlign: 0, width: 80, formatter: '@', visible: false},
+            {title: '分部工程', colSpan: '1', rowSpan: '2', field: 'fbgc', hAlign: 0, width: 80, formatter: '@', visible: false},
+            {title: '分项工程', colSpan: '1', rowSpan: '2', field: 'fxgc', hAlign: 0, width: 80, formatter: '@', visible: false},
+            {title: '细目', colSpan: '1', rowSpan: '2', field: 'jldy', hAlign: 0, width: 80, formatter: '@', visible: false},
+            {title: '计量单元', colSpan: '1', rowSpan: '2', field: 'bwmx', hAlign: 0, width: 80, formatter: '@'},
+            {title: '台账数量', colSpan: '1', rowSpan: '2', field: 'quantity', hAlign: 2, width: 60, type: 'Number'},
+            {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: 60, type: 'Number'},
+            {title: '|完成', colSpan: '|1', rowSpan: '1|1', field: 'gather_qty', hAlign: 2, width: 60, type: 'Number'},
+            {title: '截止本期计量数量|合同', colSpan: '3|1', rowSpan: '1|1', field: 'end_contract_qty', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|数量变更', colSpan: '|1', rowSpan: '|1', field: 'end_qc_qty', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|完成', colSpan: '|1', rowSpan: '|1', field: 'end_gather_qty', hAlign: 2, width: 60, type: 'Number'},
+        ],
+        emptyRows: 0,
+        headRows: 2,
+        headRowHeight: [25, 25],
+        headColWidth: [30],
+        defaultRowHeight: 21,
+        headerFont: '12px 微软雅黑',
+        font: '12px 微软雅黑',
+        readOnly: true,
     }
 };
 // 期 -- 审核比较

+ 1 - 1
app/controller/stage_controller.js

@@ -1460,7 +1460,7 @@ module.exports = app => {
             try {
                 await this._getStageAuditViewData(ctx);
                 const renderData = await this._getDefaultRenderData(ctx);
-                [renderData.gclSpread, renderData.leafXmjSpread] = await spreadSetting.getStageGatherSpreadSetting(ctx);
+                [renderData.gclSpread, renderData.leafXmjSpread, renderData.gatherLeafXmjSpread] = await spreadSetting.getStageGatherSpreadSetting(ctx);
                 const projectFunInfo = await this.ctx.service.project.getFunRela(ctx.session.sessionProject.id);
                 renderData.hintOver = projectFunInfo.hintOver && ctx.tender.info.fun_rela.hintOver;
 

+ 1 - 1
app/lib/revise_price.js

@@ -503,7 +503,7 @@ class revisePriceCalc {
         if (pos.length > 0) await transaction.insert(this.ctx.service.pos.tableName, pos);
 
         // 应用到未审完成期
-        const stages = await this.ctx.service.stage.getAllDataByCondition({ where: { tid: revise.tid }, order: ['order', 'asc'] });
+        const stages = await this.ctx.service.stage.getAllDataByCondition({ where: { tid: revise.tid }, orders: [['order', 'asc']] });
         const latestStage = stages[stages.length - 1];
         let pcTp;
         if (latestStage && latestStage.status !== audit.stage.status.checked) {

+ 7 - 2
app/lib/spread_setting.js

@@ -142,16 +142,21 @@ const getStageGatherSpreadSetting = async function (ctx, tid) {
     const tender = tid ? await getCtxTender(ctx, tid) : ctx.tender;
     const gcl = JSON.parse(JSON.stringify(spreadConst.stageGather.gcl));
     const leafXmj = JSON.parse(JSON.stringify(spreadConst.stageGather.leafXmj));
+    const gatherLeafXmj = JSON.parse(JSON.stringify(spreadConst.stageGather.gatherLeafXmj));
 
     // if (tender.data.measure_type === measureType.tz.value && !tender.info.display.ledger.deal)
     //     removeFieldCols(gcl, spreadConst.filterCols.dealCols);
     if (!tender.info.display.stage.priceDiff) {
         removeFieldCols(gcl, spreadConst.filterCols.priceDiffCols);
         hiddenFieldCols(leafXmj, spreadConst.filterCols.priceDiffCols);
+        hiddenFieldCols(gatherLeafXmj, spreadConst.filterCols.priceDiffCols);
     }
 
-    if (tender.data.measure_type === measureType.gcl.value) removeFieldCols(leafXmj, ['quantity']);
-    return [gcl, leafXmj];
+    if (tender.data.measure_type === measureType.gcl.value) {
+        removeFieldCols(leafXmj, ['quantity']);
+        removeFieldCols(gatherLeafXmj, ['quantity']);
+    }
+    return [gcl, leafXmj, gatherLeafXmj];
 };
 
 module.exports = {

+ 75 - 0
app/public/js/revise_gcl_compare.js

@@ -106,6 +106,35 @@ $(document).ready(() => {
     SpreadJsObj.initSheet(leafXmjSpread.getActiveSheet(), leafXmjSpreadSetting);
     const leafXmjSheet = leafXmjSpread.getActiveSheet();
 
+    const gatherLeafXmjSpread = SpreadJsObj.createNewSpread($('#leaf-xmj-gather-spread')[0]);
+    const gatherLeafXmjSpreadSetting = {
+        cols: [
+            {title: '单位工程', colSpan: '1', rowSpan: '1', field: 'dwgc', hAlign: 0, width: 100, formatter: '@', visible: false},
+            {title: '分部工程', colSpan: '1', rowSpan: '1', field: 'fbgc', hAlign: 0, width: 100, formatter: '@', visible: false},
+            {title: '分项工程', colSpan: '1', rowSpan: '1', field: 'fxgc', hAlign: 0, width: 100, formatter: '@', visible: false},
+            {title: '细目', colSpan: '1', rowSpan: '1', field: 'jldy', hAlign: 0, width: 100, formatter: '@', visible: false},
+            {title: '计量单元', colSpan: '1', rowSpan: '1', field: 'bwmx', hAlign: 0, width: 100, formatter: '@'},
+            {title: '修订台账', colSpan: '1', rowSpan: '1', field: 'new_quantity', hAlign: 2, width: 80, type: 'Number'},
+            {title: '原台账', colSpan: '1', rowSpan: '1', field: 'org_quantity', hAlign: 2, width: 80, type: 'Number'},
+        ],
+        emptyRows: 0,
+        headRows: 1,
+        headRowHeight: [32],
+        headColWidth: [30],
+        defaultRowHeight: 21,
+        headerFont: '12px 微软雅黑',
+        font: '12px 微软雅黑',
+        readOnly: true,
+        localCache: {
+            key: 'ledger-gather-leafXmj',
+            colWidth: true,
+        },
+    };
+    if (!isTz) gatherLeafXmjSpreadSetting.cols.splice(1, 1);
+    if (thousandth) sjsSettingObj.setTpThousandthFormat(gatherLeafXmjSpreadSetting);
+    const gatherLeafXmjSheet = gatherLeafXmjSpread.getActiveSheet();
+    SpreadJsObj.initSheet(gatherLeafXmjSheet, gatherLeafXmjSpreadSetting);
+
     let gclData = [];
     // 获取项目节数据
     function loadLeafXmjData(iGclRow) {
@@ -117,11 +146,21 @@ $(document).ready(() => {
             SpreadJsObj.loadSheetData(leafXmjSheet, SpreadJsObj.DataType.Data, []);
         }
     }
+    function loadGatherLeafXmjData(iGclRow) {
+        const gcl = iGclRow ? gclData[iGclRow] : SpreadJsObj.getSelectObject(gclSheet);
+        SpreadJsObj.resetTopAndSelect(gatherLeafXmjSheet);
+        if (gcl) {
+            SpreadJsObj.loadSheetData(gatherLeafXmjSheet, SpreadJsObj.DataType.Data, gcl.gatherLeafXmjs);
+        } else {
+            SpreadJsObj.loadSheetData(gatherLeafXmjSheet, SpreadJsObj.DataType.Data, []);
+        }
+    }
     // 切换清单行,读取所属项目节数据
     gclSpread.getActiveSheet().bind(spreadNS.Events.SelectionChanged, function (e, info) {
         const iNewRow = info.newSelections[0].row;
         if (!info.oldSelections || iNewRow !== info.oldSelections[0].row) {
             loadLeafXmjData(iNewRow);
+            loadGatherLeafXmjData(iNewRow);
         }
     });
 
@@ -173,8 +212,10 @@ $(document).ready(() => {
         gclCompareModel.gatherLedgerData(data.bills, data.pos, setting);
         gclCompareModel.gatherDealBills(data.dealBills);
         gclCompareModel.checkDiffer();
+        gclCompareModel.reGatherLeafXmj();
         SpreadJsObj.loadSheetData(gclSheet, SpreadJsObj.DataType.Data, gclData);
         loadLeafXmjData(0);
+        loadGatherLeafXmjData(0);
 
         const chapterData = gclCompareModel.chapterData();
         generateChapterHtml(chapterData);
@@ -196,6 +237,38 @@ $(document).ready(() => {
         }
         gclSpread.refresh();
         leafXmjSpread.refresh();
+        gatherLeafXmjSpread.refresh();
+    });
+    // 下部设置显示相关
+    $('a', '[name=pos-tab]').click(function() {
+        const relaTab = this.getAttribute('href');
+        const optionTab = $('#optionTab').children();
+        for (const ot of optionTab) {
+            if (ot.getAttribute('rela-tab') === relaTab) {
+                $(ot).show();
+            } else {
+                $(ot).hide();
+            }
+        }
+    });
+    $('[name=gather-xmj]').change(function() {
+        const checkOption = $('[name=gather-xmj]:checked');
+        if (checkOption.length === 0) {
+            toastr.warning('请至少选择一个汇总条件');
+            return;
+        }
+
+        const fields = [];
+        for (const co of checkOption) {
+            fields.push(co.value);
+        }
+        for (const col of gatherLeafXmjSpreadSetting.cols) {
+            if (col.formatter !== '@') continue;
+            col.visible = col.type === 'Number' || fields.indexOf(col.field) >= 0;
+        }
+        gclCompareModel.reGatherLeafXmj(fields);
+        SpreadJsObj.refreshColumnVisible(gatherLeafXmjSheet);
+        loadGatherLeafXmjData();
     });
     $.subMenu({
         menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
@@ -213,6 +286,7 @@ $(document).ready(() => {
             autoFlashHeight();
             gclSpread.refresh();
             leafXmjSpread.refresh();
+            gatherLeafXmjSpread.refresh();
         }
     });
     $.divResizer({
@@ -222,6 +296,7 @@ $(document).ready(() => {
             let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
             $(".sp-wrap").height(bcontent-30);
             leafXmjSpread.refresh();
+            gatherLeafXmjSpread.refresh();
         }
     });
     $('input[name=compareTag]').change(() => {

+ 38 - 1
app/public/js/shares/gcl_gather_compare.js

@@ -498,9 +498,46 @@ const gclCompareModel = (function () {
         return gclChapter.concat([otherChapter.qd, otherChapter.fqd, otherChapter.zlj, otherChapter.hj]);
     }
 
+    function _gatherLeafXmj(gcl, fields = ['bwmx']) {
+        gcl.gatherLeafXmjs = [];
+        for (const lx of gcl.leafXmjs) {
+            const condition = {};
+            for (const f of fields) {
+                condition[f] = lx[f];
+            }
+            let glx = _.find(gcl.gatherLeafXmjs, condition);
+            if (!glx) {
+                glx = JSON.parse(JSON.stringify(lx));
+                gcl.gatherLeafXmjs.push(glx);
+            } else {
+                gatherfields(glx, lx, ['new_quantity', 'org_quantity']);
+            }
+        }
+        for (const xmj of gcl.gatherLeafXmjs) {
+            xmj.pre_gather_qty = ZhCalc.add(xmj.pre_contract_qty, xmj.pre_qc_qty);
+            xmj.gather_qty = ZhCalc.add(xmj.contract_qty, xmj.qc_qty);
+            xmj.end_contract_qty = ZhCalc.add(xmj.pre_contract_qty, xmj.contract_qty);
+            xmj.end_qc_qty = ZhCalc.add(xmj.pre_qc_qty, xmj.qc_qty);
+            xmj.end_gather_qty = ZhCalc.add(xmj.pre_gather_qty, xmj.gather_qty);
+            xmj.end_final_qty = ZhCalc.add(xmj.end_qc_qty, xmj.quantity);
+            xmj.end_qc_minus_qty = ZhCalc.add(xmj.pre_qc_minus_qty, xmj.qc_minus_qty);
+            xmj.final_1_qty = ZhCalc.add(xmj.quantity, xmj.end_qc_minus_qty);
+            xmj.end_final_1_qty = ZhCalc.add(xmj.final_1_qty, xmj.end_qc_qty);
+            xmj.end_gather_percent = ZhCalc.mul(ZhCalc.div(xmj.end_gather_qty, xmj.end_final_qty), 100, 2);
+            xmj.end_final_1_percent = ZhCalc.mul(ZhCalc.div(xmj.end_gather_qty, xmj.end_final_1_qty), 100, 2);
+        }
+    }
+
+    function reGatherLeafXmj(fields) {
+        gclList.forEach(g => {
+            _gatherLeafXmj(g, fields);
+        });
+    }
+
     return {
         init,
         gatherLedgerData, gatherReviseLedgerData, gatherDealBills, checkDiffer,
-        chapterData
+        chapterData,
+        reGatherLeafXmj,
     };
 })();

+ 48 - 0
app/public/js/stage_gather.js

@@ -70,6 +70,11 @@ $(document).ready(function () {
     if (thousandth) sjsSettingObj.setTpThousandthFormat(leafXmjSpreadSetting);
     SpreadJsObj.initSheet(leafXmjSpread.getActiveSheet(), leafXmjSpreadSetting);
 
+    const gatherLeafXmjSpread = SpreadJsObj.createNewSpread($('#leaf-xmj-gather-spread')[0]);
+    if (thousandth) sjsSettingObj.setTpThousandthFormat(gatherLeafXmjSpreadSetting);
+    const gatherLeafXmjSheet = gatherLeafXmjSpread.getActiveSheet();
+    SpreadJsObj.initSheet(gatherLeafXmjSheet, gatherLeafXmjSpreadSetting);
+
     let gclGatherData;
     // 获取项目节数据
     function loadLeafXmjData(iGclRow) {
@@ -81,6 +86,15 @@ $(document).ready(function () {
             SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, []);
         }
     }
+    function loadGatherLeafXmjData(iGclRow) {
+        const gcl = iGclRow ? gclGatherData[iGclRow] : SpreadJsObj.getSelectObject(gclSheet);
+        SpreadJsObj.resetTopAndSelect(gatherLeafXmjSheet);
+        if (gcl) {
+            SpreadJsObj.loadSheetData(gatherLeafXmjSheet, SpreadJsObj.DataType.Data, gcl.gatherLeafXmjs);
+        } else {
+            SpreadJsObj.loadSheetData(gatherLeafXmjSheet, SpreadJsObj.DataType.Data, []);
+        }
+    }
     // 超计显示
     function checkOverRange(data) {
         const billsGatherOver = function (data, qtyField, tpField, per) {
@@ -112,6 +126,7 @@ $(document).ready(function () {
         const iOldRow = info.oldSelections[0].row, iNewRow = info.newSelections[0].row;
         if (iNewRow !== iOldRow) {
             loadLeafXmjData(iNewRow);
+            loadGatherLeafXmjData(iNewRow);
         }
     });
     $('.custom-radio').click(() => {
@@ -137,10 +152,12 @@ $(document).ready(function () {
         gclGatherModel.loadChangeBillsData(result.changeBills);
         gclGatherData = gclGatherModel.gatherGclData();
         gclGatherModel.checkDiffer(gclGatherData);
+        gclGatherModel.reGatherLeafXmj();
         checkOverRange(gclGatherData);
         // 加载清单数据
         SpreadJsObj.loadSheetData(gclSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gclGatherData);
         loadLeafXmjData(0);
+        loadGatherLeafXmjData(0);
         // 章节合计
         const chapterData = gclGatherModel.gatherChapterData(chapter, result.spec, ['total_price', 'contract_tp', 'qc_tp', 'pre_contract_tp', 'pre_qc_tp', 'contract_pc_tp', 'qc_pc_tp', 'pc_tp']);
         for (const c of chapterData) {
@@ -193,8 +210,38 @@ $(document).ready(function () {
         }
         gclSpread.refresh();
         leafXmjSpread.refresh();
+        gatherLeafXmjSpread.refresh();
     });
+    // 下部设置显示相关
+    $('a', '[name=pos-tab]').click(function() {
+        const relaTab = this.getAttribute('href');
+        const optionTab = $('#optionTab').children();
+        for (const ot of optionTab) {
+            if (ot.getAttribute('rela-tab') === relaTab) {
+                $(ot).show();
+            } else {
+                $(ot).hide();
+            }
+        }
+    });
+    $('[name=gather-xmj]').change(function() {
+        const checkOption = $('[name=gather-xmj]:checked');
+        if (checkOption.length === 0) {
+            toastr.warning('请至少选择一个汇总条件');
+            return;
+        }
 
+        const fields = [];
+        for (const co of checkOption) {
+            fields.push(co.value);
+        }
+        for (const col of gatherLeafXmjSpreadSetting.cols) {
+            col.visible = col.type === 'Number' || fields.indexOf(col.field) >= 0;
+        }
+        gclGatherModel.reGatherLeafXmj(fields);
+        SpreadJsObj.refreshColumnVisible(gatherLeafXmjSheet);
+        loadGatherLeafXmjData();
+    });
     // 上下窗口resizer
     $.divResizer({
         select: '#main-resize',
@@ -229,6 +276,7 @@ $(document).ready(function () {
             autoFlashHeight();
             gclSpread.refresh();
             leafXmjSpread.refresh();
+            gatherLeafXmjSpread.refresh();
         }
     });
     $('#exportExcel').click(function () {

+ 37 - 1
app/view/revise/gcl_compare.ejs

@@ -33,10 +33,42 @@
                 <div class="bcontent-wrap" id="main-bottom">
                     <div id="main-resize" class="resize-y" r-Type="height" div1="#gcl-spread" div2="#main-bottom" store-id="ledger-gather" store-version="1.0.0" min="100"></div>
                     <div class="bc-bar mb-1">
-                        <ul class="nav nav-tabs">
+                        <ul class="nav nav-tabs" name="pos-tab">
                             <li class="nav-item">
                                 <a class="nav-link active" data-toggle="tab" href="#xmujie" role="tab">所属项目节</a>
                             </li>
+                            <li class="nav-item">
+                                <a class="nav-link" data-toggle="tab" href="#xmjGather" role="tab">项目节汇总</a>
+                            </li>
+                            <li class="nav-item" id="optionTab">
+                                <div rela-tab="#xmjGather" style="display: none;">
+                                    <div class="d-inline-block ml-2 mt-1">
+                                        <span>汇总条件:</span>
+                                        <div class="d-inline-block" style="vertical-align: middle">
+                                            <div class="form-check form-check-inline">
+                                                <input class="form-check-input pt-1" type="checkbox" id="gather-xmj-dwgc" value="dwgc" name="gather-xmj">
+                                                <label class="form-check-label" for="gather-xmj-dwgc">单位工程</label>
+                                            </div>
+                                            <div class="form-check form-check-inline">
+                                                <input class="form-check-input" type="checkbox" id="gather-xmj-fbgc" value="fbgc" name="gather-xmj">
+                                                <label class="form-check-label" for="gather-xmj-fbgc">分部工程</label>
+                                            </div>
+                                            <div class="form-check form-check-inline">
+                                                <input class="form-check-input" type="checkbox" id="gather-xmj-fxgc" value="fxgc" name="gather-xmj">
+                                                <label class="form-check-label" for="gather-xmj-fxgc">分项工程</label>
+                                            </div>
+                                            <div class="form-check form-check-inline">
+                                                <input class="form-check-input" type="checkbox" id="gather-xmj-xm" value="jldy" name="gather-xmj">
+                                                <label class="form-check-label" for="gather-xmj-xm">细目</label>
+                                            </div>
+                                            <div class="form-check form-check-inline">
+                                                <input class="form-check-input" type="checkbox" id="gather-xmj-jldy" value="bwmx" checked name="gather-xmj">
+                                                <label class="form-check-label" for="gather-xmj-jldy">计量单元</label>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </li>
                         </ul>
                     </div>
                     <div class="tab-content">
@@ -44,6 +76,10 @@
                             <div class="sp-wrap" id="leaf-xmj-spread">
                             </div>
                         </div>
+                        <div class="tab-pane active" id="xmjGather">
+                            <div class="sp-wrap" id="leaf-xmj-gather-spread">
+                            </div>
+                        </div>
                     </div>
                 </div>
             </div>

+ 42 - 1
app/view/stage/gather.ejs

@@ -61,13 +61,45 @@
             <div class="bcontent-wrap" id="main-bottom">
                 <div id="main-resize" class="resize-y" r-Type="height" div1="#gcl-spread" div2="#main-bottom" store-id="stage-gather" store-version="1.0.0" min="100"></div>
                 <div class="bc-bar mb-1">
-                    <ul class="nav nav-tabs">
+                    <ul class="nav nav-tabs" name="pos-tab">
                         <li class="nav-item">
                             <a class="nav-link active" data-toggle="tab" href="#xmujie" role="tab">所属项目节</a>
                         </li>
                         <!--<li class="nav-item">-->
                         <!--<a class="nav-link " data-toggle="tab" href="#biangeng" role="tab">相关变更令</a>-->
                         <!--</li>-->
+                        <li class="nav-item">
+                            <a class="nav-link" data-toggle="tab" href="#xmjGather" role="tab">项目节汇总</a>
+                        </li>
+                        <li class="nav-item" id="optionTab">
+                            <div rela-tab="#xmjGather" style="display: none;">
+                                <div class="d-inline-block ml-2 mt-1">
+                                    <span>汇总条件:</span>
+                                    <div class="d-inline-block" style="vertical-align: middle">
+                                        <div class="form-check form-check-inline">
+                                            <input class="form-check-input pt-1" type="checkbox" id="gather-xmj-dwgc" value="dwgc" name="gather-xmj">
+                                            <label class="form-check-label" for="gather-xmj-dwgc">单位工程</label>
+                                        </div>
+                                        <div class="form-check form-check-inline">
+                                            <input class="form-check-input" type="checkbox" id="gather-xmj-fbgc" value="fbgc" name="gather-xmj">
+                                            <label class="form-check-label" for="gather-xmj-fbgc">分部工程</label>
+                                        </div>
+                                        <div class="form-check form-check-inline">
+                                            <input class="form-check-input" type="checkbox" id="gather-xmj-fxgc" value="fxgc" name="gather-xmj">
+                                            <label class="form-check-label" for="gather-xmj-fxgc">分项工程</label>
+                                        </div>
+                                        <div class="form-check form-check-inline">
+                                            <input class="form-check-input" type="checkbox" id="gather-xmj-xm" value="jldy" name="gather-xmj">
+                                            <label class="form-check-label" for="gather-xmj-xm">细目</label>
+                                        </div>
+                                        <div class="form-check form-check-inline">
+                                            <input class="form-check-input" type="checkbox" id="gather-xmj-jldy" value="bwmx" checked name="gather-xmj">
+                                            <label class="form-check-label" for="gather-xmj-jldy">计量单元</label>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </li>
                     </ul>
                 </div>
                 <div class="tab-content">
@@ -75,6 +107,10 @@
                         <div class="sp-wrap" id="leaf-xmj-spread">
                         </div>
                     </div>
+                    <div class="tab-pane active" id="xmjGather">
+                        <div class="sp-wrap" id="leaf-xmj-gather-spread">
+                        </div>
+                    </div>
                     <div class="tab-pane" id="biangeng">
                         <div class="sp-wrap">
                             <table class="table table-sm table-bordered">
@@ -101,6 +137,11 @@
         key: 'stage-gather-leafXmj',
         colWidth: true,
     }
+    const gatherLeafXmjSpreadSetting = JSON.parse('<%- JSON.stringify(gatherLeafXmjSpread) %>');
+    leafXmjSpreadSetting.localCache = {
+        key: 'stage-gather-gatherLeafXmj',
+        colWidth: true,
+    }
     const chapter = JSON.parse('<%- JSON.stringify(ctx.tender.info.chapter) %>');
     const thousandth = <%- ctx.tender.info.display.thousandth %>;
     const hintOver = <%- hintOver %>;