Explorar el Código

调差期列表显示控制

ellisran hace 1 año
padre
commit
1b2e090197

+ 7 - 0
app/const/tender.js

@@ -90,6 +90,12 @@ const buildStatus = (function (){
     return {status, statusStr}
 })();
 
+const materialColShow = [
+    { name: '信息价调差', value: 'm', checked: true },
+    { name: '指数调差', value: 'ex', checked: false },
+    { name: '合计', value: 'total', checked: false },
+];
+
 
 module.exports = {
     status,
@@ -103,4 +109,5 @@ module.exports = {
     imType,
     valuationField,
     buildStatus,
+    materialColShow,
 };

+ 46 - 1
app/controller/material_controller.js

@@ -45,12 +45,16 @@ module.exports = app => {
          */
         async index(ctx) {
             try {
+                // 列展示
+                const tenderMsg = await ctx.service.tender.getTender(ctx.tender.id, ['material_col_show']);
+                const material_col_show = tenderMsg.material_col_show ? JSON.parse(tenderMsg.material_col_show) : ctx.helper._.cloneDeep(tenderConst.materialColShow);
                 const renderData = {
                     tender: ctx.tender.data,
                     tenderMenu: this.menu.tenderMenu,
                     preUrl: '/tender/' + ctx.tender.id,
                     auditConst,
                     auditConst2: JSON.stringify(auditConst),
+                    materialColShow: material_col_show,
                 };
                 let openMaterialTax = ctx.session.sessionProject.page_show.openMaterialTax;
                 let allMaterialTax = true;
@@ -62,6 +66,13 @@ module.exports = app => {
                 }
                 // 获取未选中和已完成的计量期
                 const stages = await ctx.service.stage.getAllDataByCondition({ where: { tid: ctx.tender.id, status: auditStageConst.status.checked } });
+                const materialTotalPrice = {
+                    m_tp: 0,
+                    tax_tp: 0,
+                    ex_tp: 0,
+                    ex_tax_tp: 0,
+                    m_tax_tp: 0,
+                };
                 for (const s of renderData.materials) {
                     // s.curAuditor = null;
                     // 根据期状态返回展示用户
@@ -80,7 +91,14 @@ module.exports = app => {
                         openMaterialTax = 1;
                     }
                     s.decimal = s.decimal ? JSON.parse(s.decimal) : materialConst.decimal;
-                }
+                    materialTotalPrice.m_tp = ctx.helper.add(materialTotalPrice.m_tp, ctx.helper.round(s.m_tp, s.decimal.tp));
+                    materialTotalPrice.tax_tp = !s.material_tax ? ctx.helper.add(materialTotalPrice.tax_tp, ctx.helper.round(ctx.helper.mul(s.m_tp, 1 + s.rate / 100), s.decimal.tp)) : materialTotalPrice.tax_tp;
+                    materialTotalPrice.ex_tp = ctx.helper.add(materialTotalPrice.ex_tp, ctx.helper.round(s.ex_tp, s.decimal.tp));
+                    materialTotalPrice.ex_tax_tp = ctx.helper.add(materialTotalPrice.ex_tax_tp, ctx.helper.round(ctx.helper.mul(s.ex_tp, 1 + s.exponent_rate / 100), s.decimal.tp));
+                    materialTotalPrice.m_tax_tp = s.material_tax ? ctx.helper.add(materialTotalPrice.m_tax_tp, ctx.helper.round(s.m_tax_tp, s.decimal.tp)) : materialTotalPrice.m_tax_tp;
+                }
+                materialTotalPrice.total_tp = ctx.helper.add(materialTotalPrice.m_tp, materialTotalPrice.ex_tp);
+                materialTotalPrice.total_tax_tp = ctx.helper.add(materialTotalPrice.tax_tp, materialTotalPrice.ex_tax_tp);
                 if (lastMaterial && lastMaterial.status === auditConst.status.checked && ctx.session.sessionUser.accountId === ctx.tender.data.user_id && stages.length > 0) {
                     renderData.lastMaterialList = lastMaterial.is_new ? await ctx.service.materialListGcl.getAllDataByCondition({ where: { tid: ctx.tender.id } }) : await ctx.service.materialList.getMaterialData(ctx.tender.id, lastMaterial.id);
                 } else {
@@ -89,6 +107,7 @@ module.exports = app => {
                 renderData.stages = stages;
                 renderData.openMaterialTax = openMaterialTax;
                 renderData.allMaterialTax = allMaterialTax;
+                renderData.materialTotalPrice = materialTotalPrice;
                 await this.layout('material/index.ejs', renderData, 'material/modal.ejs');
             } catch (err) {
                 this.log(err);
@@ -162,6 +181,32 @@ module.exports = app => {
         }
 
         /**
+         * 编辑期数据(Post)
+         * @param ctx
+         * @return {Promise<void>}
+         */
+        async saveData(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                const responseData = {
+                    err: 0,
+                    msg: '',
+                    data: {},
+                };
+                switch (data.type) {
+                    case 'material_col_set':
+                        responseData.data = await ctx.service.tender.saveTenderData(ctx.tender.id, { material_col_show: JSON.stringify(data.material_col_data) });
+                        break;
+                    default: throw '参数有误';
+                }
+                ctx.body = responseData;
+            } catch (err) {
+                this.log(err);
+                ctx.body = { err: 1, msg: err.toString(), data: null };
+            }
+        }
+
+        /**
          * 新增期(Post)
          * @param ctx
          * @return {Promise<void>}

+ 22 - 0
app/public/js/measure_material.js

@@ -539,7 +539,29 @@ $(function () {
         if (period.length > 0) {
             editPeriod.selectDate(period);
         }
+    });
+
+    $('#row-view').on('show.bs.modal', function () {
+        let html = '';
+        for (const col of materialColShow) {
+            html += `<tr><td>${col.name}</td><td><input type="checkbox" value="${col.value}" ${col.checked ? 'checked=""' : ''}></td></tr>`;
+        }
+        $('#material_col_table').html(html);
+    });
 
+    $('#set_material_list_show_btn').on('click', function () {
+        // 至少展示一个
+        const material_col_data = [];
+        $('#material_col_table input').each(function () {
+            material_col_data.push({
+                name: $(this).parents('tr').children('td').eq(0).text(),
+                value: $(this).val(),
+                checked: $(this).is(':checked'),
+            });
+        });
+        postData('/tender/' + tenderId + '/measure/material/save/data', { type: 'material_col_set', material_col_data }, function (result) {
+           window.location.reload();
+        });
     });
 });
 function checkForm () {

+ 1 - 0
app/router.js

@@ -555,6 +555,7 @@ module.exports = app => {
     app.post('/tender/:id/measure/material/auditors', sessionAuth, tenderCheck, uncheckTenderCheck, 'materialController.materialAuditors');
     app.post('/tender/:id/measure/material/:order/save/decimal', sessionAuth, tenderCheck, uncheckTenderCheck, materialCheck, 'materialController.saveDecimal');
     app.post('/tender/:id/measure/material/save', sessionAuth, tenderCheck, uncheckTenderCheck, 'materialController.save');
+    app.post('/tender/:id/measure/material/save/data', sessionAuth, tenderCheck, uncheckTenderCheck, 'materialController.saveData');
     // 审批
     app.post('/tender/:id/measure/material/:order/audit/add', sessionAuth, tenderCheck, uncheckTenderCheck, materialCheck, 'materialController.addAudit');
     app.post('/tender/:id/measure/material/:order/audit/delete', sessionAuth, tenderCheck, uncheckTenderCheck, materialCheck, 'materialController.deleteAudit');

+ 38 - 8
app/view/material/index.ejs

@@ -3,9 +3,17 @@
     <div class="panel-title">
         <div class="title-main d-flex">
             <% include ../tender/tender_sub_mini_menu.ejs %>
-            <h2>
+            <div class="d-inline-block">
                 材料调差期列表
-            </h2>
+            </div>
+            <% if (ctx.session.sessionUser.accountId === ctx.tender.data.user_id || ctx.session.sessionUser.is_admin) { %>
+            <div class="d-inline-block mx-1">
+                <button href="#cate-set" class="btn btn-sm btn-light text-primary" data-toggle="modal" data-target="#row-view"><i class="fa fa-table"></i> 列显示</button>
+            </div>
+            <% } %>
+            <div class="d-inline-block">
+                <button href="#zjhj" class="btn btn-sm btn-light text-primary" data-toggle="modal" data-target="#zjhj">期合计</button>
+            </div>
             <div class="ml-auto">
                 <% if (ctx.session.sessionUser.accountId === ctx.tender.data.user_id && stages.length > 0 &&
                         (materials.length === 0 || materials[0].status === auditConst.status.checked)) { %>
@@ -20,26 +28,41 @@
                 <table class="table table-bordered">
                     <thead>
                     <tr>
-                        <th rowspan="2">期数</th>
-                        <th class="text-center" rowspan="2">添加时间</th>
-                        <th class="text-center" rowspan="2">计量期</th>
-                        <th class="text-center" rowspan="2">调差周期</th>
+                        <% const rowSpan = ctx.helper._.findIndex(materialColShow, { checked: true}) !== -1 ? 2 : 1%>
+                        <th rowspan="<%- rowSpan %>">期数</th>
+                        <th class="text-center" rowspan="<%- rowSpan %>">添加时间</th>
+                        <th class="text-center" rowspan="<%- rowSpan %>">计量期</th>
+                        <th class="text-center" rowspan="<%- rowSpan %>">调差周期</th>
+                        <% if (materialColShow[0].checked) { %>
                         <th class="text-center" colspan="<% if (openMaterialTax && !allMaterialTax) { %>3<% } else { %>2<% } %>">信息价调差</th>
+                        <% } %>
+                        <% if (materialColShow[1].checked) { %>
                         <th class="text-center" colspan="2">指数法调差</th>
+                        <% } %>
+                        <% if (materialColShow[2].checked) { %>
                         <th class="text-center" colspan="<% if (openMaterialTax) { %>3<% } else { %>2<% } %>">合计</th>
-                        <th class="text-center" rowspan="2">审批进度</th>
-                        <th class="text-center" rowspan="2" width="140">操作</th>
+                        <% } %>
+                        <th class="text-center" rowspan="<%- rowSpan %>">审批进度</th>
+                        <th class="text-center" rowspan="<%- rowSpan %>" width="140">操作</th>
                     </tr>
+                    <% if (rowSpan === 2) { %>
                     <tr>
+                        <% if (materialColShow[0].checked) { %>
                         <th class="text-center">价差费用</th>
                         <% if (openMaterialTax) { %><th class="text-center">价差费用(含材料税)</th><% } %>
                         <% if ((openMaterialTax && !allMaterialTax) || !openMaterialTax) { %><th class="text-center">价差费用(含建筑税)</th><% } %>
+                        <% } %>
+                        <% if (materialColShow[1].checked) { %>
                         <th class="text-center">价差费用</th>
                         <th class="text-center">价差费用(含建筑税)</th>
+                        <% } %>
+                        <% if (materialColShow[2].checked) { %>
                         <th class="text-center">价差费用</th>
                         <% if (openMaterialTax) { %><th class="text-center">价差费用(含材料税)</th><% } %>
                         <th class="text-center">价差费用(含建筑税)</th>
+                        <% } %>
                     </tr>
+                    <% } %>
                     </thead>
                     <tbody>
                     <% for (const m of materials) { %>
@@ -55,14 +78,20 @@
                                 </span>
                                 <a href="#edit" class="edit-material" data-mid="<%- m.id %>" data-order="<%- m.order %>" data-period="<%- m.period %>" data-toggle="modal" data-target="#edit"><i class="fa fa-pencil-square-o "></i></a>
                             </td>
+                            <% if (materialColShow[0].checked) { %>
                             <td class="text-right"><%= m.m_tp !== null ? ctx.helper.round(m.m_tp, m.decimal.tp) : null %></td>
                             <% if (openMaterialTax) { %><td class="text-right"><% if (m.material_tax) { %><% if (m.m_tax_tp) { %><%- m.m_tax_tp %><% } else { %><%- m.m_tp %><% } %><% } %></td><% } %>
                             <% if ((openMaterialTax && !allMaterialTax) || !openMaterialTax) { %><td class="text-right"><% if (!m.material_tax) { %><%= m.m_tp !== null ? ctx.helper.round(ctx.helper.mul(m.m_tp, 1+m.rate/100), m.decimal.tp) : null %><% } %></td><% } %>
+                            <% } %>
+                            <% if (materialColShow[1].checked) { %>
                             <td class="text-right"><%= m.ex_tp !== null ? ctx.helper.round(m.ex_tp, m.decimal.tp) : null %></td>
                             <td class="text-right"><%= m.ex_tp !== null ? ctx.helper.round(ctx.helper.mul(m.ex_tp, 1+m.exponent_rate/100), m.decimal.tp) : null %></td>
+                            <% } %>
+                            <% if (materialColShow[2].checked) { %>
                             <td class="text-right"><%= ctx.helper.add(ctx.helper.round(m.ex_tp, m.decimal.tp), ctx.helper.round(m.m_tp, m.decimal.tp)) %></td>
                             <% if (openMaterialTax) { %><td class="text-right"><% if (m.material_tax) { %><% if (m.m_tax_tp) { %><%- m.m_tax_tp %><% } else { %><%- m.m_tp %><% } %><% } %></td><% } %>
                             <td class="text-right"><% if (m.material_tax) { %><%= m.ex_tp !== null ? ctx.helper.round(ctx.helper.mul(m.ex_tp, 1+m.exponent_rate/100), m.decimal.tp) : null %><% } else { %><%= ctx.helper.add(ctx.helper.round(ctx.helper.mul(m.ex_tp, 1+m.exponent_rate/100), m.decimal.tp), ctx.helper.round(ctx.helper.mul(m.m_tp, 1+m.rate/100), m.decimal.tp)) %><% } %></td>
+                            <% } %>
                             <td class="<%- auditConst.auditProgressClass[m.status] %>">
                                 <% if (m.curAuditor) { %>
                                     <a href="#sp-list" data-toggle="modal" data-target="#sp-list" m-order="<%- m.order %>"><%- m.curAuditor.name %><%if (m.curAuditor.role !== '' && m.curAuditor.role !== null) { %>-<%- m.curAuditor.role %><% } %></a>
@@ -104,6 +133,7 @@
     const auditConst = JSON.parse('<%- auditConst2 %>');
     const preUrl = JSON.parse(unescape('<%- escape(JSON.stringify(preUrl)) %>'));
     const lastMaterialListNum = parseInt('<%- lastMaterialList ? lastMaterialList.length : 0 %>');
+    const materialColShow = JSON.parse(unescape('<%- escape(JSON.stringify(materialColShow)) %>'));
     $.subMenu({
         menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
         toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',

+ 74 - 1
app/view/material/modal.ejs

@@ -144,5 +144,78 @@
         </div>
     </div>
 </div>
+<% if (ctx.session.sessionUser.accountId === ctx.tender.data.user_id || ctx.session.sessionUser.is_admin) { %>
+<!--列显示-->
+<div class="modal fade" id="row-view" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">列显示</h5>
+            </div>
+            <div class="modal-body">
+                <table class="table table-bordered table-sm">
+                    <tr><th>列项</th><th width="90">显示</th></tr>
+                    <tbody id="material_col_table">
+                    <% for (const col of materialColShow) { %>
+                    <tr><td><%- col.name %></td><td><input type="checkbox" value="<%- col.value %>" <% if (col.checked) { %>checked=""<% } %>></td></tr>
+                    <% } %>
+                    </tbody>
+                </table>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-sm btn-primary" id="set_material_list_show_btn">确认</button>
+            </div>
+        </div>
+    </div>
+</div>
+<% } %>
+<!--章节合计-->
+<div class="modal fade" id="zjhj" data-backdrop="static">
+    <div class="modal-dialog modal-lg" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">调差期合计</h5>
+            </div>
+            <div class="modal-body">
+                <table class="table table-bordered table-sm">
+                    <thead>
+                    <tr>
+                        <th></th>
+                        <th width="120px" class="text-center">信息价调差</th>
+                        <th width="120px" class="text-center">指数调差</th>
+                        <th width="120px" class="text-center">合计</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr>
+                        <th width="200px">价差费用</th>
+                        <td class="text-right"><%- materialTotalPrice.m_tp %></td>
+                        <td class="text-right"><%- materialTotalPrice.ex_tp %></td>
+                        <td class="text-right"><%- materialTotalPrice.total_tp %></td>
+                    </tr>
+                    <tr>
+                        <th width="200px">价差费用(含建筑税)</th>
+                        <td class="text-right"><%- materialTotalPrice.tax_tp %></td>
+                        <td class="text-right"><%- materialTotalPrice.ex_tax_tp %></td>
+                        <td class="text-right"><%- materialTotalPrice.total_tax_tp %></td>
+                    </tr>
+                    <% if (openMaterialTax) { %>
+                    <tr>
+                        <th width="200px">价差费用(含材料税)</th>
+                        <td class="text-right"><%- materialTotalPrice.m_tax_tp %></td>
+                        <td class="text-right"></td>
+                        <td class="text-right"><%- materialTotalPrice.m_tax_tp %></td>
+                    </tr>
+                    <% } %>
+                    </tbody>
+                </table>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
 <script src="/public/js/moment/moment.min.js"></script>
-<script src="/public/js/measure_material.js?202210091"></script>
+<script src="/public/js/measure_material.js?202308281"></script>

+ 3 - 0
sql/update.sql

@@ -3,3 +3,6 @@ ADD COLUMN `tp_data` json DEFAULT NULL COMMENT '金额数据(报表用)' AFTER `
 
 ALTER TABLE `zh_material`
 ADD COLUMN `tp_data` json DEFAULT NULL COMMENT '上报人上报时的金额数据(报表用)' AFTER `is_stage_self`;
+
+ALTER TABLE `zh_tender`
+ADD COLUMN `material_col_show` json DEFAULT NULL COMMENT '调差列表展示合计控制';