ellisran 1 рік тому
батько
коміт
df5547ec30

+ 9 - 0
app/const/project_setting.js

@@ -64,8 +64,17 @@ const defaultColSet = {
         { field: 'wf_tp', show: 0, alias: '' },
     ],
 };
+// 决策大屏06 报表数据统计值设置及保存
+const daPing06Set = {
+    sr: null,
+    sr_value: null,
+    cb: null,
+    cb_value: null,
+    cb_show: [],
+};
 module.exports = {
     noticeSetting: notice_setting,
     colSet,
     defaultColSet,
+    daPing06Set,
 };

+ 24 - 1
app/controller/datacollect_controller.js

@@ -23,6 +23,7 @@ const sendToWormhole = require('stream-wormhole');
 const scheduleConst = require('../const/schedule');
 const changeConst = require('../const/change');
 const tenderInfoModel = require('../lib/tender_info');
+const projectSettingConst = require('../const/project_setting');
 const mapConst = require('../const/map');
 
 module.exports = app => {
@@ -73,6 +74,11 @@ module.exports = app => {
                         map_json.lat = mapInfo.lat;
                     }
                 }
+                if (ctx.params.index) {
+                    ctx.session.sessionProject.dataCollect = parseInt(ctx.params.index);
+                }
+                const is_dz2 = ['P0505', 'P0506', 'GY18Y'].indexOf(ctx.session.sessionProject.code) !== -1
+                    && projectData.data_collect_pages.includes('6') && ctx.session.sessionProject.dataCollect === 6;
                 const renderData = {
                     projectData,
                     noticeList,
@@ -87,8 +93,21 @@ module.exports = app => {
                     pushType: auditConst.pushType,
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.datacollect.index),
                 };
-                await this.layout('datacollect/index.ejs', renderData);
+                if (is_dz2) {
+                    const commonJson = projectData.common_json ? JSON.parse(projectData.common_json) : null;
+                    renderData.daping06Set = commonJson && commonJson.daPing06_set ? commonJson.daPing06_set : ctx.helper._.cloneDeep(projectSettingConst.daPing06Set);
+                    const glCategory = categoryData.find(item => item.name === '管理类别');
+                    const dpCategory = [];
+                    for (const d of renderData.daping06Set.cb_show) {
+                        dpCategory.push(glCategory.value.find(item => item.id === d));
+                    }
+                    renderData.dpCategory = dpCategory;
+                    await this.layout('datacollect/index4GY18Y.ejs', renderData);
+                } else {
+                    await this.layout('datacollect/index.ejs', renderData);
+                }
             } catch (err) {
+                console.log(err);
                 this.log(err);
                 ctx.redirect(this.menu.menu.dashboard.url);
             }
@@ -148,11 +167,15 @@ module.exports = app => {
                         const monthOneStage = ctx.app._.find(month_stage, { yearmonth: s.s_time });
                         if (monthOneStage) {
                             monthOneStage.tp = ctx.helper.add(monthOneStage.tp, s.tp);
+                            monthOneStage.end_yf_tp = ctx.helper.add(monthOneStage.end_yf_tp, s.end_yf_tp);
+                            monthOneStage.end_sf_tp = ctx.helper.add(monthOneStage.end_sf_tp, s.end_sf_tp);
                         } else {
                             const data = {
                                 yearmonth: s.s_time,
                                 tp: s.tp,
                                 end_tp: s.end_tp,
+                                end_yf_tp: s.end_yf_tp,
+                                end_sf_tp: s.end_sf_tp,
                             };
                             month_stage.push(data);
                         }

+ 15 - 4
app/controller/setting_controller.js

@@ -987,7 +987,6 @@ module.exports = app => {
                     throw '没有访问权限';
                 }
                 const fun_set = await ctx.service.project.getFunSet(projectData.fun_set);
-                console.log(fun_set);
                 await this.layout('setting/fun.ejs', {
                     projectData,
                     funRela,
@@ -1139,6 +1138,7 @@ module.exports = app => {
                 const projectData = await ctx.service.project.getDataById(projectId);
                 if (projectData === null) throw '没有对应的项目数据';
                 projectData.data_collect_pages = projectData.data_collect_pages ? projectData.data_collect_pages.split(',') : [];
+                ctx.session.sessionProject.dataCollect = projectData.data_collect;
                 if (ctx.session.sessionUser.is_admin === 0) throw '没有访问权限';
                 const dataCollectAudits = await ctx.service.datacollectAudit.getList(projectId);
                 // 获取所有项目参与者
@@ -1158,7 +1158,8 @@ module.exports = app => {
                 const categoryData = await ctx.service.category.getAllCategory(ctx.session.sessionProject.id);
                 const tenders = await ctx.service.tender.getList('', null, 1);
                 const dcTenders = await ctx.service.datacollectTender.getList(projectId);
-                await this.layout('setting/datacollect.ejs', {
+                const is_dz2 = ['P0505', 'P0506', 'GY18Y'].indexOf(ctx.session.sessionProject.code) !== -1 ? 6 : false;
+                const renderData = {
                     projectData,
                     dataCollectAudits,
                     accountList,
@@ -1167,7 +1168,14 @@ module.exports = app => {
                     tenders,
                     dcTenders,
                     is_dz1: ['P0505', 'MI22U'].indexOf(ctx.session.sessionProject.code) !== -1 ? 5 : false,
-                }, 'setting/datacollect_modal.ejs');
+                    is_dz2,
+                };
+                if (is_dz2) {
+                    // 获取分类及对应值
+                    const commonJson = projectData.common_json ? JSON.parse(projectData.common_json) : null;
+                    renderData.daPing06Set = commonJson && commonJson.daPing06_set ? commonJson.daPing06_set : ctx.helper._.cloneDeep(projectSettingConst.daPing06Set);
+                }
+                await this.layout('setting/datacollect.ejs', renderData, 'setting/datacollect_modal.ejs');
             } catch (error) {
                 ctx.helper.log(error);
                 ctx.session.postError = error.toString();
@@ -1191,7 +1199,7 @@ module.exports = app => {
                     case 'show':
                         responseData.data = await ctx.service.project.update({
                             data_collect: data.data_collect,
-                            data_collect_pages: data.data_collect_pages.join(',')
+                            data_collect_pages: data.data_collect_pages.join(','),
                         }, {id: projectId});
                         ctx.session.sessionProject.dataCollect = data.data_collect;
                         ctx.session.sessionProject.showDataCollect = data.data_collect ? 1 : 0;
@@ -1256,6 +1264,9 @@ module.exports = app => {
                             addDatacollect: ctx.session.sessionProject.page_show.addDataCollect,
                         };
                         break;
+                    case 'save-dp06':
+                        responseData.data = await ctx.service.project.saveCommonJson(projectId, 'daPing06_set', data.daPing06Set);
+                        break;
                     default:
                         throw '参数有误';
                 }

BIN
app/public/images/juecedaping06.png


+ 1 - 0
app/router.js

@@ -793,6 +793,7 @@ module.exports = app => {
 
     // 决策大屏
     app.get('/datacollect', sessionAuth, 'datacollectController.index');
+    app.get('/datacollect/index/:index', sessionAuth, 'datacollectController.index');
     app.post('/datacollect/load', sessionAuth, 'datacollectController.loadData');
 
     app.get('/subproj', sessionAuth, 'subProjController.index');

+ 12 - 0
app/service/project.js

@@ -295,6 +295,18 @@ module.exports = app => {
             const result = await this.db.update(this.tableName, updateData);
             return result.affectedRows === 1;
         }
+
+        async saveCommonJson(id, field, datas) {
+            const projectData = await this.getDataById(id);
+            projectData.common_json = projectData.common_json ? JSON.parse(projectData.common_json) : {};
+            const updateData = {
+                id,
+            };
+            projectData.common_json[field] = datas;
+            updateData.common_json = JSON.stringify(projectData.common_json);
+            const result = await this.db.update(this.tableName, updateData);
+            return result.affectedRows === 1;
+        }
     }
 
     return Project;

+ 3 - 1
app/service/stage.js

@@ -922,7 +922,7 @@ module.exports = app => {
 
         async getStageByDataCollect(tenderId, stage_tp) {
             const allStages = await this.db.select(this.tableName, {
-                columns: ['id', 'user_id', 'times', 'status', 's_time', 'contract_tp', 'qc_tp', 'pc_tp', 'pre_contract_tp', 'pre_qc_tp', 'tp_history'],
+                columns: ['id', 'user_id', 'times', 'status', 's_time', 'contract_tp', 'qc_tp', 'pc_tp', 'pre_contract_tp', 'pre_qc_tp', 'pre_yf_tp', 'yf_tp', 'pre_sf_tp', 'sf_tp', 'tp_history'],
                 where: { tid: tenderId },
                 orders: [['order', 'desc']],
             });
@@ -946,6 +946,8 @@ module.exports = app => {
                 s.tp = this.ctx.helper.sum([s.contract_tp, s.qc_tp, s.pc_tp]);
                 s.pre_tp = this.ctx.helper.add(s.pre_contract_tp, s.pre_qc_tp);
                 s.end_tp = this.ctx.helper.add(s.pre_tp, s.tp);
+                s.end_yf_tp = this.ctx.helper.add(s.pre_yf_tp, s.yf_tp);
+                s.end_sf_tp = this.ctx.helper.add(s.pre_sf_tp, s.sf_tp);
             }
             return stages;
         }

+ 5 - 1
app/view/datacollect/index.ejs

@@ -43,7 +43,11 @@
                     <button type="button" class="btn btn-sm btn-outline-dark text-white dropdown-toggle" data-toggle="dropdown" id="zhankai">决策大屏<span><%- ctx.session.sessionProject.dataCollect %></span></button>
                     <div class="dropdown-menu" aria-labelledby="zhankai">
                         <% for (const i of projectData.data_collect_pages) { %>
-                        <a class="dropdown-item change-collect" href="javascript:void(0)" data-collect="<%- i %>">决策大屏<%- i %></a>
+                        <% if (i === '6') { %>
+                            <a class="dropdown-item" href="/datacollect/index/<%- i %>">决策大屏<%- i %></a>
+                        <% } else { %>
+                            <a class="dropdown-item change-collect" href="javascript:void(0)" data-collect="<%- i %>">决策大屏<%- i %></a>
+                        <% } %>
                         <% } %>
                     </div>
                 </div>

Різницю між файлами не показано, бо вона завелика
+ 1228 - 0
app/view/datacollect/index4GY18Y.ejs


+ 20 - 1
app/view/setting/datacollect.ejs

@@ -20,6 +20,10 @@
                         <a class="nav-item nav-link<% if (ctx.session.sessionProject.dataCollect === is_dz1) { %> active<% } %>" data-datacollect="<%- is_dz1 %>" data-toggle="tab" href="#shujudaping-<%- is_dz1 %>" role="tab">
                             决策大屏<%- ctx.helper.transFormToChinese(is_dz1) %><% if (ctx.helper._.indexOf(projectData.data_collect_pages, is_dz1.toString()) !== -1) { %>(已开启<% if (ctx.session.sessionProject.dataCollect === is_dz1) { %>、默认<% } %>)<% } %></a>
                     <% } %>
+                    <% if (is_dz2) { %>
+                        <a class="nav-item nav-link<% if (ctx.session.sessionProject.dataCollect === is_dz2) { %> active<% } %>" data-datacollect="<%- is_dz2 %>" data-toggle="tab" href="#shujudaping-<%- is_dz2 %>" role="tab">
+                            决策大屏<%- ctx.helper.transFormToChinese(is_dz2) %><% if (ctx.helper._.indexOf(projectData.data_collect_pages, is_dz2.toString()) !== -1) { %>(已开启<% if (ctx.session.sessionProject.dataCollect === is_dz2) { %>、默认<% } %>)<% } %></a>
+                    <% } %>
                     <div class="ml-auto">
                         <!--<div class="form-check form-check-inline">-->
                             <!--<input class="form-check-input" type="checkbox" id="show-datacollect" value="option1" <% if (ctx.session.sessionProject.dataCollect) { %>checked<% } %>>-->
@@ -44,7 +48,14 @@
                         <div id="shujudaping-<%- i %>" class="tab-pane<% if ((ctx.session.sessionProject.dataCollect === 0 && i === 1) || ctx.session.sessionProject.dataCollect === i) { %> active<% } %>"><img src="/public/images/juecedaping0<%- i %>.png" width="100%"></div>
                     <% } %>
                     <% if (is_dz1) { %>
-                        <div id="shujudaping-<%- is_dz1 %>" class="tab-pane<% if (ctx.session.sessionProject.dataCollect === is_dz1) { %> active<% } %>"><img src="/public/images/juecedaping0<%- is_dz1 %>.png" width="100%"></div>
+                        <div id="shujudaping-<%- is_dz1 %>" class="tab-pane<% if (ctx.session.sessionProject.dataCollect === is_dz1) { %> active<% } %>">
+                            山东济邹项目定制(MI22U)<img src="/public/images/juecedaping0<%- is_dz1 %>.png" width="100%">
+                        </div>
+                    <% } %>
+                    <% if (is_dz2) { %>
+                        <div id="shujudaping-<%- is_dz2 %>" class="tab-pane<% if (ctx.session.sessionProject.dataCollect === is_dz2) { %> active<% } %>">
+                            <span>四川广元路桥集团计量内控管理云平台定制(GY18Y)</span><a class="nav-link" style="display: inline-block;" data-toggle="modal" href="#dpsix-set" data-target="#dpsix-set" title="决策大屏六设置"><i class="fa fa-cog"></i></a><img src="/public/images/juecedaping0<%- is_dz2 %>.png" width="100%">
+                        </div>
                     <% } %>
                 </div>
             </div>
@@ -63,6 +74,7 @@
     let dcTenders = JSON.parse(unescape('<%- escape(JSON.stringify(dcTenders)) %>'));
     let addDataCollect = JSON.parse(unescape('<%- escape(JSON.stringify(ctx.session.sessionProject.page_show.addDataCollect)) %>'));
     let is_dz1 = <% if (is_dz1) { %>parseInt('<%- is_dz1 %>');<% } else { %>false;<% } %>
+    let is_dz2 = <% if (is_dz2) { %>parseInt('<%- is_dz2 %>');<% } else { %>false;<% } %>
     $(function () {
         autoFlashHeight();
         // 开启及关闭展示
@@ -132,6 +144,13 @@
                 }
                 $('#tablist a').eq(is_dz1-3).text('决策大屏' + transFormToChinese(is_dz1) + msg);
             }
+            if (is_dz2) {
+                let msg = '';
+                if (_.indexOf(dataCollectPages, is_dz2.toString()) !== -1) {
+                    msg = '(已开启' + (is_dz2=== dataCollect ? '、默认' : '') + ')' ;
+                }
+                $('#tablist a').eq(is_dz2-3).text('决策大屏' + transFormToChinese(is_dz2) + msg);
+            }
         }
         $('#tablist a').click(function () {
             const page = parseInt($(this).data('datacollect'));

+ 151 - 0
app/view/setting/datacollect_modal.ejs

@@ -118,6 +118,157 @@
         </div>
     </div>
 </div>
+<% if (is_dz2) { %>
+<!--决策大屏六设置-->
+<div class="modal fade" id="dpsix-set" 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">
+                <ul class="list-unstyled">
+                    <li class="d-flex justify-content-start align-items-center mb-3">
+                        <span class="col-auto">工程收入:</span>
+                        <span class="mr-2">
+                            <select class="form-control form-control-sm" id="sr_cate_select">
+                                <option value="0">请选择分类</option>
+                                <% for (const c of categoryData) { %>
+                                    <option value="<%- c.id %>"><%- c.name %></option>
+                                <% } %>
+                            </select>
+                          </span>
+                        <span>
+                            <select class="form-control form-control-sm" id="sr_cate_value_select">
+                                <option value="0">请选择值</option>
+                            </select>
+                          </span>
+                    </li>
+                    <li class="d-flex justify-content-start align-items-center mb-3">
+                        <span class="col-auto">工程成本:</span>
+                        <span class="mr-2">
+                            <select class="form-control form-control-sm" id="cb_cate_select">
+                                <option value="0">请选择分类</option>
+                                <% for (const c of categoryData) { %>
+                                    <option value="<%- c.id %>"><%- c.name %></option>
+                                <% } %>
+                            </select>
+                          </span>
+                        <span>
+                            <select class="form-control form-control-sm" id="cb_cate_value_select">
+                                <option value="0">请选择值</option>
+                            </select>
+                          </span>
+                    </li>
+                    <li class="d-flex justify-content-start align-items-center mb-3">
+                        <span class="col-auto">工程成本费用分类(最多只能选择4个,界面只有4个):</span>
+                        <span class="mr-2">
+                            <div class="dropdown show">
+                                <button class="btn btn-sm  dropdown-toggle text-primary" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">请选择值</button>
+                                <div class="dropdown-menu pb-1" aria-labelledby="dropdownMenuButton" x-placement="bottom-start" >
+                                    <div class="px-3" id="cb_show_select">
+                                        <% const xmgl = categoryData.find(item => item.name === '管理类别'); %>
+                                        <% if (xmgl && xmgl.value && xmgl.value.length !== 0) { %>
+                                        <% for (const v of xmgl.value) { %>
+                                        <div class="form-check py-1">
+                                            <input class="form-check-input" type="checkbox" id="xmgl_value_<%- v.id %>" value="<%- v.id %>">
+                                            <label class="form-check-label" for="xmgl_value_<%- v.id %>"><%- v.value %></label>
+                                        </div>
+                                        <% } %>
+                                        <% } %>
+                                    </div>
+                                </div>
+                            </div>
+                        </span>
+                    </li>
+                </ul>
+            </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="dp06_save_btn">确定</button>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    const daPing06Set = JSON.parse(unescape('<%- escape(JSON.stringify(daPing06Set)) %>'));
+    $(function () {
+        $('#sr_cate_select').change(function () {
+            const val = $(this).val()
+            const cate = category.find(item => item.id === parseInt(val))
+            $('#sr_cate_value_select').html(cate ? cate.value.map(item => `<option value="${item.id}">${item.value}</option>`).join('') : '<option value="0">请选择值</option>');
+        })
+        $('#cb_cate_select').change(function () {
+            const val = $(this).val()
+            const cate = category.find(item => item.id === parseInt(val))
+            $('#cb_cate_value_select').html(cate ? cate.value.map(item => `<option value="${item.id}">${item.value}</option>`).join('') : '<option value="0">请选择值</option>');
+        });
+        $('#dpsix-set').on('show.bs.modal', function (e) {
+            if (daPing06Set.sr) {
+                $('#sr_cate_select').val(daPing06Set.sr);
+                $('#sr_cate_value_select').html(category.find(item => item.id === parseInt(daPing06Set.sr)).value.map(item => `<option value="${item.id}" ${daPing06Set.sr_value === item.id ? 'selected' : ''}>${item.value}</option>`).join(''));
+            } else {
+                $('#sr_cate_value_select').html('<option value="0">请选择值</option>')
+            }
+            if (daPing06Set.cb) {
+                $('#cb_cate_select').val(daPing06Set.cb);
+                $('#cb_cate_value_select').html(category.find(item => item.id === parseInt(daPing06Set.cb)).value.map(item => `<option value="${item.id}" ${daPing06Set.cb_value === item.id ? 'selected' : ''}>${item.value}</option>`).join(''));
+            } else {
+                $('#cb_cate_value_select').html('<option value="0">请选择值</option>')
+            }
+            $('#cb_show_select').find('input').prop('checked', false);
+            $('#cb_show_select').find('input').each(function () {
+                if (daPing06Set.cb_show && daPing06Set.cb_show.length > 0 && daPing06Set.cb_show.includes(parseInt($(this).val()))) {
+                    $(this).prop('checked', true);
+                }
+            });
+        });
+        $('#cb_show_select').on('click', function (e) {
+            e.stopPropagation();
+        });
+        $('#cb_show_select input').on('click', function () {
+            const checked = $('#cb_show_select input:checked');
+            if (checked.length > 4) {
+                $(this).prop('checked', false);
+                toastr.warning('最多只能选择4个');
+                return;
+            }
+        });
+        $('#dp06_save_btn').click(function () {
+            if ($('#sr_cate_select').val() === '0') {
+                toastr.warning('请选择工程收入分类');
+                return;
+            }
+            if ($('#sr_cate_value_select').val() === '0') {
+                toastr.warning('请选择工程收入分类值');
+                return;
+            }
+            if ($('#cb_cate_select').val() === '0') {
+                toastr.warning('请选择工程成本费用分类');
+                return;
+            }
+            if ($('#cb_cate_value_select').val() === '0') {
+                toastr.warning('请选择工程成本费用分类值');
+                return;
+            }
+            // if ($('#cb_show_select input:checked').length === 0) {
+            //     toastr.warning('请选择要展示的列');
+            //     return;
+            // }
+            daPing06Set.sr = parseInt($('#sr_cate_select').val());
+            daPing06Set.sr_value = parseInt($('#sr_cate_value_select').val());
+            daPing06Set.cb = parseInt($('#cb_cate_select').val());
+            daPing06Set.cb_value = parseInt($('#cb_cate_value_select').val());
+            daPing06Set.cb_show = $('#cb_show_select input:checked').map((index, item) => parseInt($(item).val())).get();
+            console.log(daPing06Set);
+            postData('/setting/datacollect/save', { type: 'save-dp06', daPing06Set }, function (result) {
+                toastr.success('设置成功');
+                $('#dpsix-set').modal('hide');
+            })
+        });
+    })
+</script>
+<% } %>
 <script>
     $(function () {
         let timer = null

+ 3 - 1
sql/update.sql

@@ -1,2 +1,4 @@
+ALTER TABLE `zh_project`
+ADD COLUMN `common_json` json NULL COMMENT '通用json,没有sql查询值必要的可放这' AFTER `notice_setting`;
 ALTER TABLE `zh_ledger_tag`
-ADD COLUMN `pos_id` varchar(36) NOT NULL DEFAULT '' COMMENT '关联计量单元id(zh_pos表中的id)' AFTER `id`;
+ADD COLUMN `pos_id` varchar(36) NOT NULL DEFAULT '' COMMENT '关联计量单元id(zh_pos表中的id)' AFTER `id`;