Browse Source

计量期上报日期范围设置及限制

laiguoran 2 years atrás
parent
commit
8cefc5c8e6

+ 29 - 0
app/const/fun_set.js

@@ -0,0 +1,29 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+const endMonth = [
+    { val: 1, name: '本月' },
+    { val: 2, name: '次月' },
+    // { val: 3, name: '隔月' },
+];
+const parseInfo = ['stage_start'];
+const defaultInfo = {
+    // 合同信息
+    stage_start: {
+        start_day: 0,
+        end_month: 0,
+        end_day: 0,
+    },
+};
+
+module.exports = {
+    parseInfo,
+    endMonth,
+    defaultInfo,
+};

+ 1 - 0
app/const/page_show.js

@@ -47,6 +47,7 @@ const defaultSetting = {
     openChangePlan: 0,
     isPreset: 0,
     isOnlyChecked: 1,
+    openStageStart: 0,
 };
 
 

+ 13 - 1
app/controller/setting_controller.js

@@ -19,6 +19,7 @@ const S2b = require('../lib/s2b');
 const measureType = require('../const/tender').measureType;
 const sendToWormhole = require('stream-wormhole');
 const path = require('path');
+const funSet = require('../const/fun_set');
 
 module.exports = app => {
 
@@ -915,11 +916,15 @@ module.exports = app => {
                 if (ctx.session.sessionUser.is_admin === 0) {
                     throw '没有访问权限';
                 }
+                const fun_set = await ctx.service.project.getFunSet(projectData.fun_set);
+                console.log(fun_set);
                 await this.layout('setting/fun.ejs', {
                     projectData,
                     funRela,
                     imType,
-                })
+                    endMonth: funSet.endMonth,
+                    funSet: fun_set,
+                });
             } catch (error) {
                 ctx.helper.log(error);
                 ctx.redirect('/dashboard');
@@ -956,8 +961,15 @@ module.exports = app => {
                 this.ctx.session.sessionProject.page_show.openMaterialChecklist = data.openMaterialChecklist ? 1 : 0;
                 this.ctx.session.sessionProject.page_show.openMaterialSelf = data.openMaterialSelf ? 1 : 0;
                 this.ctx.session.sessionProject.page_show.openMaterialEditForAudit = data.openMaterialEditForAudit ? 1 : 0;
+                this.ctx.session.sessionProject.page_show.openStageStart = data.openStageStart ? 1 : 0;
                 const result2 = await ctx.service.project.updatePageshow(projectId);
                 if (!result2) throw '保存数据失败';
+                if (data.addFunSet) {
+                    const funSet = projectData.fun_set ? JSON.parse(projectData.fun_set) : {};
+                    ctx.helper._.defaultsDeep(data.addFunSet, funSet);
+                    const result3 = await ctx.service.project.updateFunSet(projectId, data.addFunSet);
+                    if (!result3) throw '保存数据失败';
+                }
 
                 ctx.body = { err: 0, msg: '', data: null };
             } catch (error) {

+ 48 - 0
app/controller/stage_controller.js

@@ -26,6 +26,7 @@ const fs = require('fs');
 const stdConst = require('../const/standard');
 const LzString = require('lz-string');
 const spreadSetting = require('../lib/spread_setting');
+const funSetConst = require('../const/fun_set');
 
 module.exports = app => {
     class StageController extends app.BaseController {
@@ -108,6 +109,48 @@ module.exports = app => {
             if (status === auditConst.status.uncheck || status === auditConst.status.checkNo) {
                 ctx.stage.auditorList = await ctx.service.stageAudit.getAuditors(ctx.stage.id, ctx.stage.times);
             }
+            await this._checkStageStart(ctx);
+        }
+
+        async _checkStageStart(ctx) {
+            // 上报日期获取,及上报权限开关
+            if (ctx.session.sessionProject.page_show.openStageStart) {
+                const stageStart = ctx.session.sessionProject.funSet.stage_start;
+                const thisYear = moment().year();
+                // const thisYear = 2021;
+                const thisMonth = moment().month();
+                // const thisMonth = 11;
+                const thisDate = new Date();
+                const onMonth = stageStart.end_month === funSetConst.endMonth[1].val && thisMonth === parseInt(moment(thisDate).format('MM')) - 1;
+                let startEndDay = stageStart.end_day + '号';
+                // const nowDay = Date.now();
+                let startDay = moment([thisYear, thisMonth, stageStart.start_day]).isValid() ? [thisYear, thisMonth, stageStart.start_day] : [thisYear, thisMonth + 1, 1];
+                const maxDay = moment(thisDate).format('YYYY-MM-DD') >= moment(startDay).format('YYYY-MM-DD');
+                startEndDay = maxDay && stageStart.end_month === funSetConst.endMonth[1].val ? funSetConst.endMonth[stageStart.end_month - 1].name + startEndDay : startEndDay;
+                if (moment(thisDate).format('YYYY-MM-DD') < moment(startDay).format('YYYY-MM-DD') && stageStart.end_month === funSetConst.endMonth[1].val) {
+                    startDay = thisMonth !== 0 && moment([thisYear, thisMonth - 1, stageStart.start_day]).isValid() ? [thisYear, thisMonth - 1, stageStart.start_day] : (thisMonth !== 0 ? [thisYear, thisMonth - 1, 1] : [thisYear - 1, 11, stageStart.start_day]);
+                }
+                ctx.stage.startEndDay = startEndDay; // 上报截止时间
+                let endDay = [thisYear, thisMonth, stageStart.end_day];
+                if (stageStart.end_month === funSetConst.endMonth[0].val && !moment(endDay).isValid()) {
+                    endDay = thisMonth === 11 ? [thisYear + 1, 0, 1] : [thisYear, thisMonth + 1, 1];
+                    endDay = moment(endDay).subtract(1, 'days');
+                } else if (stageStart.end_month === funSetConst.endMonth[1].val && maxDay) {
+                    if (!moment(endDay).isValid()) {
+                        endDay = [thisYear, thisMonth + 1, 1];
+                        endDay = moment(endDay).subtract(1, 'days');
+                    } else {
+                        endDay = thisMonth === 11 ? [thisYear + 1, 0, stageStart.end_day] : [thisYear, thisMonth + 1, stageStart.end_day];
+                    }
+                }
+                if (!moment(endDay).isValid()) {
+                    endDay = [thisYear, thisMonth + 1, 1];
+                    endDay = moment(endDay).subtract(1, 'days');
+                }
+                console.log(moment(thisDate).format('YYYY-MM-DD'), moment(startDay).format('YYYY-MM-DD'), moment(endDay).format('YYYY-MM-DD'));
+                const startPermission = moment(moment(thisDate).format('YYYY-MM-DD')).isBetween(moment(startDay).format('YYYY-MM-DD'), moment(endDay).format('YYYY-MM-DD'), null, '[]');
+                ctx.stage.startPermission = startPermission;
+            }
         }
 
         _checkStageCanModify(ctx) {
@@ -1217,6 +1260,11 @@ module.exports = app => {
                     throw '该期数据当前无法上报';
                 }
 
+                await this._checkStageStart(ctx);
+                if (ctx.session.sessionProject.page_show.openStageStart && !ctx.stage.startPermission) {
+                    throw '非指定日期范围内无法上报';
+                }
+
                 await ctx.service.stageAudit.start(ctx.stage.id, ctx.stage.times);
                 ctx.body = { err: 0, msg: '', data: [] };
             } catch (err) {

+ 1 - 0
app/middleware/session_auth.js

@@ -37,6 +37,7 @@ module.exports = options => {
             this.session.sessionProject.custom = projectData.custom;
             this.session.sessionProject.dataCollect = projectData.data_collect;
             this.session.sessionProject.customType = projectData.customType;
+            this.session.sessionProject.funSet = projectData.fun_set ? JSON.parse(projectData.fun_set) : null;
             // 判断是否有权限查看决策大屏
             let showDataCollect = 0;
             if (projectData.data_collect) {

+ 19 - 0
app/service/project.js

@@ -15,8 +15,14 @@ const defaultFunRela = {
     imType: imType.zl.value,
     needGcl: false,
 };
+const funSet = require('../const/fun_set');
+const defaultFunSet = funSet.defaultInfo;
 const sjsRelaConst = require('../const/setting').sjsRela;
 
+
+const infoConst = require('../const/tender_info');
+const parseInfo = infoConst.parseInfo;
+
 module.exports = app => {
 
     class Project extends app.BaseService {
@@ -263,6 +269,19 @@ module.exports = app => {
             const result = await this.cache.get('pmDeal-' + pid);
             return result ? result.split(',') : [];
         }
+
+        async getFunSet(fun_set = null) {
+            const result = fun_set ? JSON.parse(fun_set) : {};
+            this.ctx.helper._.defaults(result, defaultFunSet);
+            return result;
+        }
+
+        async updateFunSet(id, funSet) {
+            const result = await this.db.update(this.tableName, {
+                id, fun_set: JSON.stringify(funSet),
+            });
+            return result.affectedRows === 1;
+        }
     }
 
     return Project;

+ 110 - 3
app/view/setting/fun.ejs

@@ -9,7 +9,7 @@
         <div class="c-body">
             <div class="sjs-height-0">
                 <div class="row m-0 mt-3">
-                    <div class="col-6">
+                    <div class="col-7">
                         <div class="card mb-3">
                             <div class="card-body">
                                 <h5 class="card-title">超计控制</h5>
@@ -40,6 +40,57 @@
                                 </div>
                             </div>
                         </div>
+                        <div class="card mb-3 ">
+                            <div class="card-body pb-2">
+                                <div class="row m-0">
+                                    <h5 class="card-title">计量期上报</h5>
+                                    <div class="pull-right d-inline-block form-group form-check ml-auto">
+                                        <div class="custom-control custom-switch">
+                                            <input type="checkbox" class="custom-control-input" id="openStageStart" <% if(ctx.session.sessionProject.page_show.openStageStart) { %>checked<% } %> onchange="updateSetting();">
+                                            <label class="custom-control-label" for="openStageStart"></label>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="form-group mb-1">
+                                    <div>
+                                        <div class="input-group input-group-sm mb-2">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">开始日期:</span>
+                                                <span class="input-group-text" style="width: 90px;padding-left: 12px;">每月</span>
+                                            </div>
+                                            <select class="form-control form-control-sm" id="start_day" style="width: 90px!important;flex: none;" <% if (ctx.session.sessionProject.page_show.openStageStart) { %>disabled<% } %>>
+                                                <option value="0">请选择日</option>
+                                                <% for (let i = 1; i <= 31;i++) { %>
+                                                    <option value="<%- i %>" <% if (funSet.stage_start.start_day === i) {%>selected<% } %>><%- i %></option>
+                                                <% } %>
+                                            </select>
+                                            <span class="text-danger mx-2"></span>
+                                        </div>
+                                        <div class="input-group input-group-sm mb-2">
+                                            <div class="input-group-prepend">
+                                                <span class="input-group-text">截止日期:</span>
+                                            </div>
+                                            <select class="form-control form-control-sm" id="end_month" style="width: 90px!important;flex: none;" <% if (ctx.session.sessionProject.page_show.openStageStart) { %>disabled<% } %>>
+                                                <option value="0">请选择月</option>
+                                                <% for (const i of endMonth) { %>
+                                                <option value="<%- i.val %>" <% if (funSet.stage_start.end_month === i.val) {%>selected<% } %> ><%- i.name %></option>
+                                                <% } %>
+                                            </select>
+                                            <select class="form-control form-control-sm" id="end_day" style="width: 90px!important;flex: none;" <% if (ctx.session.sessionProject.page_show.openStageStart) { %>disabled<% } %>>
+                                                <option value="0">请选择日</option>
+                                                <% for (let i = 1; i <= 31;i++) { %>
+                                                    <option value="<%- i %>" <% if (funSet.stage_start.end_day === i) {%>selected<% } %>><%- i %></option>
+                                                <% } %>
+                                            </select>
+                                            <span class="text-danger mx-2"></span>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="mt-3">
+                                    <label class="form-text alert alert-danger">开启选项后,超出范围内的日期,则不允许上报期计量。</label>
+                                </div>
+                            </div>
+                        </div>
                         <div class="card mb-3">
                             <div class="card-body">
                                 <h5 class="card-title">中间计量模式设置</h5>
@@ -59,7 +110,7 @@
                             </div>
                         </div>
                         <div class="row">
-                            <div class="col-6">
+                            <div class="col-5">
                                 <div class="card mb-3">
                                     <div class="card-body">
                                         <h5 class="card-title">工程变更</h5>
@@ -84,7 +135,7 @@
                                     </div>
                                 </div>
                             </div>
-                            <div class="col-6">
+                            <div class="col-7">
                                 <div class="card mb-3">
                                     <div class="card-body">
                                         <h5 class="card-title">材料调差</h5>
@@ -158,6 +209,60 @@
             $('#openChangeApply').prop('checked', false);
             $('#openChangeProject').prop('checked', false);
         }
+        const pushData = {};
+        if($('#openStageStart')[0].checked) {
+            // 判断是否已选开始日,截止月日
+            const startDay = parseInt($('#start_day').val());
+            const endMonth = parseInt($('#end_month').val());
+            const endDay = parseInt($('#end_day').val());
+            let flag = false;
+            if (startDay === 0) {
+                $('#start_day').siblings('span').text('请选择日');
+                flag = true;
+            } else {
+                $('#start_day').siblings('span').text('');
+            }
+            const endErrorMsg = [];
+            if (endMonth === 0) {
+                endErrorMsg.push('请选择月');
+                flag = true;
+            }
+            if (endDay === 0) {
+                endErrorMsg.push('请选择日');
+                flag = true;
+            }
+            if (endErrorMsg.length > 0) {
+                $('#end_day').siblings('span').text(endErrorMsg.join(' '));
+            } else {
+                // 本月截止日不允许小于开始日
+                if (endMonth === 1 && startDay > endDay) {
+                    $('#end_day').siblings('span').text('本月截止日不允许小于开始日');
+                    flag = true;
+                } else if (endMonth === 2 && startDay <= endDay){
+                    $('#end_day').siblings('span').text('次月截止日不允许大于开始日');
+                    flag = true;
+                } else {
+                    $('#end_day').siblings('span').text('');
+                }
+            }
+            if (flag) {
+                $('#openStageStart')[0].checked = 0;
+                $('#openStageStart').prop('checked', false);
+                return;
+            }
+            pushData.stage_start = {
+                start_day: startDay,
+                end_month: endMonth,
+                end_day: endDay,
+            }
+            $('#start_day').attr('disabled', true);
+            $('#end_month').attr('disabled', true);
+            $('#end_day').attr('disabled', true);
+        } else {
+            $('#start_day').removeAttr('disabled');
+            $('#end_month').removeAttr('disabled');
+            $('#end_day').removeAttr('disabled');
+        }
         postData('/setting/fun/update', {
             imType: parseInt($('[name=im_type]:checked').val()),
             banOver: $('[name=ban_over]')[0].checked,
@@ -171,6 +276,8 @@
             openMaterialChecklist: $('#openMaterialChecklist')[0].checked,
             openMaterialSelf: $('#openMaterialSelf')[0].checked,
             openMaterialEditForAudit: $('#openMaterialEditForAudit')[0].checked,
+            openStageStart: $('#openStageStart')[0].checked,
+            addFunSet: _.size(pushData) !== 0 ? pushData : null,
         });
     }
 </script>

+ 10 - 0
app/view/stage/audit_btn.ejs

@@ -1,8 +1,13 @@
 <div class="contarl-box">
     <% if (ctx.stage.status === auditConst.status.uncheck) { %>
     <% if (ctx.session.sessionUser.accountId === ctx.stage.user_id) { %>
+    <% if (!ctx.session.sessionProject.page_show.openStageStart || (ctx.session.sessionProject.page_show.openStageStart && ctx.stage.startPermission)) { %>
     <a id="sub-sp-btn" href="javascript: void(0);" data-toggle="modal" data-target="#sub-sp" class="btn btn-primary btn-sm btn-block">上报审批</a>
     <% } else { %>
+    <a href="javascript:void(0);" data-toggle="tooltip" data-placement="right" class="btn btn-secondary btn-sm btn-block" data-original-title="不在上报时间范围内">上报审批</a>
+    <% } %>
+    <% if (ctx.session.sessionProject.page_show.openStageStart && ctx.stage.startPermission) { %><p class="text-warning text-center">截止日期:<%- ctx.stage.startEndDay %></p><% } %>
+    <% } else { %>
     <a id="sub-sp-btn" href="javascript: void(0);" data-toggle="modal" data-target="#sub-sp" class="btn btn-outline-secondary btn-sm btn-block">上报中</a>
     <% } %>
     <% } else if (ctx.stage.status === auditConst.status.checking) { %>
@@ -17,7 +22,12 @@
     <% } else if (ctx.stage.status === auditConst.status.checkNo) { %>
         <a href="#sp-list"  data-type="hide" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm btn-block text-muted sp-list-btn">审批退回</a>
         <% if (ctx.session.sessionUser.accountId === ctx.stage.user_id) { %>
+            <% if (!ctx.session.sessionProject.page_show.openStageStart || (ctx.session.sessionProject.page_show.openStageStart && ctx.stage.startPermission)) { %>
             <a href="#sp-list" data-type="show" data-toggle="modal" data-target="#sp-list"  class="btn btn-primary btn-sm btn-block sp-list-btn">重新上报</a>
+            <% } else { %>
+            <a href="javascript:void(0);" data-toggle="tooltip" data-placement="right" class="btn btn-secondary btn-sm btn-block" data-original-title="不在上报时间范围内">重新上报</a>
+            <% } %>
+            <% if (ctx.session.sessionProject.page_show.openStageStart && ctx.stage.startPermission) { %><p class="text-warning text-center">截止日期:<%- ctx.stage.startEndDay %></p><% } %>
         <% } %>
     <% } else if (ctx.stage.status === auditConst.status.checkNoPre) { %>
         <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm btn-block text-muted">审批退回</a>

+ 3 - 1
sql/update.sql

@@ -239,4 +239,6 @@ Update zh_stage_bills_final_9 sp LEFT JOIN zh_ledger_9 p on sp.lid = p.id Set sp
 ALTER TABLE `zh_stage`
 ADD COLUMN `contract_pc_tp`  decimal(24,8) NOT NULL DEFAULT 0 COMMENT '本期补差(合同)' AFTER `qc_tp`,
 ADD COLUMN `qc_pc_tp`  decimal(24,8) NOT NULL DEFAULT 0 COMMENT '本期补差(变更)' AFTER `contract_pc_tp`,
-ADD COLUMN `pc_tp`  decimal(24,8) NOT NULL DEFAULT 0 COMMENT '本期补差' AFTER `qc_pc_tp`;
+ADD COLUMN `pc_tp`  decimal(24,8) NOT NULL DEFAULT 0 COMMENT '本期补差' AFTER `qc_pc_tp`;
+
+ALTER TABLE `zh_project` ADD `fun_set` VARCHAR(1000) NULL DEFAULT NULL COMMENT '项目设置页内容json' AFTER `map_json`;