Browse Source

调整填报时长、节假日、项目管理成本管理

Lijy 2 years ago
parent
commit
579388c6b8

+ 91 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue

@@ -72,6 +72,53 @@
                     </div>
                 </el-col>
             </el-row>
+
+            <el-row :gutter="24">
+                <el-col :span="24">
+                    <div class="box">
+                        <div class="box_head">
+                            <el-date-picker
+                            v-model="dateSelect"
+                            type="daterange"
+                            size="small"
+                            range-separator="-"
+                            :start-placeholder="$t('interval')"
+                            :end-placeholder="$t('interval')"
+                            value-format="yyyy-MM-dd"
+                            clearable
+                            @change="hiddens()">
+                        </el-date-picker>
+                        </div>
+
+                        <div class="boxBoxMax">
+                            <div class="boxBoxMax_con">
+                                <el-card class="box-card">
+                                    <div slot="header" class="clearfix">
+                                        <span>工时成本</span>
+                                    </div>
+                                    <div class="text item boxBoxMax_con_one">
+                                        工时合计: {{ chengbenData.workingTime }}
+                                    </div>
+                                    <div class="text item">
+                                        成本: {{ chengbenData.cost }}
+                                    </div>
+                                </el-card>
+                            </div>
+                            <div class="boxBoxMax_con">
+                                <el-card class="box-card">
+                                    <div slot="header" class="clearfix">
+                                        <span>费用报销成本</span>
+                                    </div>
+                                    <div class="text item boxBoxMax_con_two">
+                                        报销合计: {{ chengbenData.expense }}
+                                    </div>
+                                </el-card>
+                            </div>
+                        </div>
+                        
+                    </div>
+                </el-col>
+            </el-row>
         </div>
 
 
@@ -126,7 +173,9 @@
                 nowBaseList: [],
                 correctBaseDialog: false,
                 projectContractAmount: null,
-                nowBaseHeight: ''
+                nowBaseHeight: '',
+                dateSelect: [],
+                chengbenData: {}
             };
         },
         filters: {
@@ -146,6 +195,30 @@
             }
         },
         methods: {
+            hiddens() {
+                this.getTimeCostAndExpenseByProject()
+            },
+            getTimeCostAndExpenseByProject() {
+                this.http.post('/project/timeCostAndExpenseByProject',{
+                    startDate: this.dateSelect[0],
+                    endDate: this.dateSelect[1],
+                    projectId: this.curProjectId
+                },res => {
+                    if(res.code == 'ok'){
+                        this.chengbenData = res.data
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
             restrictNumber(targetId) {
                 let inpu = document.getElementById(targetId);
                 inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
@@ -453,6 +526,7 @@
             this.getAddList()
             this.getNowBase()
             this.getProjectInfo()
+            this.getTimeCostAndExpenseByProject()
         }
     };
 </script>
@@ -507,4 +581,20 @@
 .gray_label {
     color: #999;
 }
+.box_head {
+    margin: 20px 20px 20px 20px;
+}
+.boxBoxMax {
+    display: flex;
+}
+.boxBoxMax_con {
+    width: 30%;
+    margin-right: 30px;
+}
+.boxBoxMax_con_one {
+    margin-bottom: 8px;
+}
+.boxBoxMax_con_two {
+    margin-bottom: 25px;
+}
 </style>

+ 51 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -207,8 +207,8 @@
                     </el-form-item>
                     <el-form-item :label="$t('remindertext')" prop="alertMsg" style="width: 50%;margin-left:10px;">
                             <el-input :placeholder="$t('peaseenterthe')" v-model="timeType.alertMsg" clearable class="apu" maxlength="20"></el-input>
-                            <div style="display: inline-block;margin: 0 10px 0 20px" v-if="timeType.alertTime">周末节假日提醒</div>
-                            <el-switch v-if="timeType.alertTime" v-model="timeType.alertNonWorkday" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
+                            <!-- <div style="display: inline-block;margin: 0 10px 0 20px" v-if="timeType.alertTime">周末节假日提醒</div> -->
+                            <!-- <el-switch v-if="timeType.alertTime" v-model="timeType.alertNonWorkday" active-color="#13ce66" inactive-color="#ff4949"></el-switch> -->
                     </el-form-item>
 
                     </el-form>
@@ -232,8 +232,20 @@
         <p style="margin-left:10px;color:#666;">{{ $t('timesetting') }}</p>
         <el-row :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
         <el-col :span="24" >
-            <div class="panel" style="height:180px;">
+            <div class="panel" style="height:260px;">
                 <el-form :inline="true" :model="timeType"  style="margin-top:10px;">
+                <div class="panel_flx">
+                    <el-form-item>额外工作日设置:</el-form-item>
+                    <el-form-item>
+                        <el-checkbox v-model="settOne" label="周六" />
+                    </el-form-item>
+                    <el-form-item>
+                        <el-checkbox v-model="settTwo" label="周日" />
+                    </el-form-item>
+                    <el-form-item>
+                        <el-checkbox v-model="settThree" label="其他法定节日" />
+                    </el-form-item>
+                </div>
                 <el-form-item>
                     <el-checkbox v-model="timeType.includeWeekends" label="批量/代填含周末" />
                 </el-form-item><br/>
@@ -497,6 +509,9 @@
     export default {
         data() {
             return {
+                settThree: false,
+                settTwo: false,
+                settOne: false,
                 tourFlg: false,
                 steps: [{
                         target: '[data-v-step="timetypeBox"]',
@@ -556,7 +571,6 @@
                     fillAhead: false,
                     includeWeekends: false,
                     maxReportTime: 8,
-                    alertNonWorkday: false
                 },
                 customDegreeActive: false,
                 needDeptAudit: false,
@@ -1128,7 +1142,14 @@
 
                         param.workContentState = param.workContentState ? 1 : 0
 
-                        param.alertNonWorkday = param.alertNonWorkday ? 1: 0
+                        var oneseet = 0
+                        var twoset = 0
+                        var threeset = 0
+                        this.settOne ? oneseet = 1 : oneseet = 0;
+                        this.settTwo ? twoset = 1 : twoset = 0;
+                        this.settThree ? threeset = 1 : threeset = 0;
+
+                        param.alertNonWorkday = parseInt(`${oneseet}${twoset}${threeset}`)
 
                         delete param.excludeTimeList
                         // console.log(param, '将要提交的值')
@@ -1182,7 +1203,27 @@
                             this.timeType.customDataMaxStatus = this.timeType.customDataMaxStatus ? true : false 
                             this.timeType.customDataMaxValue = this.timeType.customDataMaxValue ? this.timeType.customDataMaxValue : 100
                             this.timeType.reportAutoApproveDays = this.timeType.reportAutoApproveDays ? this.timeType.reportAutoApproveDays : 1
-                            this.timeType.alertNonWorkday = this.timeType.alertNonWorkday ? true : false
+                            // this.timeType.alertNonWorkday = this.timeType.alertNonWorkday ? true : false
+
+                            if(this.timeType.alertNonWorkday) {
+                                let str = this.timeType.alertNonWorkday + ''
+                                let arr = str.split('')
+                                if(arr.length == 1) {
+                                    arr.unshift('0')
+                                    arr.unshift('0')
+                                } else if(arr.length == 2) {
+                                    arr.unshift('0')
+                                }
+                                console.log(arr)
+                                this.settThree = arr[2] == 1 ? true : false
+                                this.settTwo = arr[1] == 1 ? true : false
+                                this.settOne = arr[0] == 1 ? true : false
+                            } else {
+                                this.settThree = false
+                                this.settTwo = false
+                                this.settOne = false
+                            }
+
                             this.timeChange();
 
                             this.maxReportTimeRange = [] // 填报时长上限
@@ -1344,4 +1385,8 @@
     justify-content: center;
     align-items: center;
 }
+.panel_flx {
+    display: flex;
+    align-items: center;
+}
 </style>

+ 25 - 13
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -744,6 +744,7 @@
             <span slot="footer" class="dialog-footer">
                 <el-button @click="cancel(workForm.domains,true)" v-if="canCancelInDialog" style="float:left;">{{$t('btn.withdraw')}}</el-button>
                 <span style="margin-right:20px">合计工时:{{totalReportHours}}小时</span>
+                <!-- <span style="margin-right:20px">合计工时:{{jsTime}}小时</span> -->
                 <el-button @click="deleteReport"  v-if="workForm.domains[0].id != null && canEdit && reportCanDelete">{{$t('btn.delete')}}</el-button>
                 <el-button @click="dialogVisible = false">{{$t('btn.cancel')}}</el-button>
                 <el-button v-if="!isSubstitude" @click="submitReport(1)" :loading="submitingReport" :disabled="workForm.domains.length==0?true:(canEdit?false:true)">{{$t('btn.temporaryStorage')}}</el-button>
@@ -1990,7 +1991,8 @@
                                         subtractedData += +this.timeOverlap(j, arr)
                                     }
                                     console.log(selectionTime, subtractedData)
-                                    hours = +selectionTime - +subtractedData
+                                    hours += (+selectionTime - +subtractedData) * this.jsDay
+                                    console.log(hours)
                                     // hours += this.getHour(domains[i].startTime, domains[i].endTime)
                                 }
                             }else{
@@ -1999,7 +2001,7 @@
                         }
                     }
                 }
-                return hours.toFixed(1)
+                return hours.toFixed(2)
             },
         },
         mounted() {
@@ -2600,17 +2602,27 @@
                 var zhi = ''
                 for(var i in sl) {
                     if(sl[i].startTime && sl[i].endTime) {
-                        var date2 = '2021/12/12 ' + sl[i].endTime +':00'
-                        var date1 = '2021/12/12 ' + sl[i].startTime +':00'
-                        var date3 = new Date(date2).getTime() - new Date(date1).getTime();
-                        var leave1=date3%(24*3600*1000)
-                        var hours=Math.floor(leave1/(3600*1000))
-                        var leave2=leave1%(3600*1000)
-                        var minutes=Math.floor(leave2/(60*1000))
-                        var shi = hours+'.'+ minutes
-                        var sll = +shi + 0
-                        zhi = this.jsDay * sll
-                        quanbu = +quanbu + zhi
+                        // var date2 = '2021/12/12 ' + sl[i].endTime +':00'
+                        // var date1 = '2021/12/12 ' + sl[i].startTime +':00'
+                        // var date3 = new Date(date2).getTime() - new Date(date1).getTime();
+                        // var leave1=date3%(24*3600*1000)
+                        // var hours=Math.floor(leave1/(3600*1000))
+                        // var leave2=leave1%(3600*1000)
+                        // var minutes=Math.floor(leave2/(60*1000))
+                        // var shi = hours+'.'+ minutes
+                        // var sll = +shi + 0
+                        // zhi = this.jsDay * sll
+                        // quanbu = +quanbu + zhi
+                        let selectionTime = this.getHour(sl[i].startTime, sl[i].endTime)
+                        let subtractedData = 0
+                        let arr = JSON.parse(JSON.stringify(this.vacationTime))
+                        arr.unshift({s: sl[i].startTime, e: sl[i].endTime})
+                        console.log(arr, '要看的数据')
+                        for(var j in arr) {
+                            subtractedData += +this.timeOverlap(j, arr)
+                        }
+                        zhi = (+selectionTime - +subtractedData) * this.jsDay
+                        quanbu += zhi
                     }
                 }
                 this.jsTime = quanbu

+ 60 - 3
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -484,7 +484,8 @@ import timetoolVue from '../timetool/timetool.vue';
                     item: {},
                     list: [],
                     searchList: []
-                }
+                },
+                vacationTime: {}
             };
         },
 
@@ -505,15 +506,61 @@ import timetoolVue from '../timetool/timetool.vue';
                                 }
                             }
                         }else{
-                            hours += domains[i].workingTime ? parseFloat(domains[i].workingTime) : 0
+                            if(this.user.timeType.type == 2){
+                                if(domains[i].startTime && domains[i].endTime){
+                                    let selectionTime = this.getHour(domains[i].startTime, domains[i].endTime)
+                                    let subtractedData = 0
+                                    let arr = JSON.parse(JSON.stringify(this.vacationTime))
+                                    arr.unshift({s: domains[i].startTime, e: domains[i].endTime})
+                                    for(var j in arr) {
+                                        subtractedData += +this.timeOverlap(j, arr)
+                                    }
+                                    console.log(selectionTime, subtractedData)
+                                    hours += +selectionTime - +subtractedData
+                                    console.log(hours)
+                                }
+                            } else {
+                                hours += domains[i].workingTime ? parseFloat(domains[i].workingTime) : 0
+                            }
                         }
                     }
                 }
-                return hours.toFixed(1)
+                return hours.toFixed(2)
             },
         },
 
         methods: {
+            // 判断两个时间段是否重叠
+            timeOverlap(idx, dateAr) {
+                let zhi = 0
+                for (let k in dateAr) {
+                    if (idx !== k) {
+                        if (((dateAr[k].s <= dateAr[idx].s && dateAr[k].e >= dateAr[idx].s) || (dateAr[k].s <= dateAr[idx].s && dateAr[k].e <= dateAr[idx].e))) {
+                            // 选择的时间包含设置的休息时间段 (选择的开始时间和结束时间大于设置的休息时间段)
+                            if(dateAr[idx].s > dateAr[k].s && dateAr[idx].e < dateAr[k].e) {
+                                // zhi += 2
+                                zhi += +this.getHour(dateAr[idx].s, dateAr[idx].e)
+                            }
+                            // 选择的时间包含在设置的休息时间 (选择的开始时间和结束时间都处于在设置的休息时间段内)
+                            if(dateAr[idx].s > dateAr[k].s && dateAr[idx].e > dateAr[k].e) {
+                                zhi += +this.getHour(dateAr[idx].s, dateAr[k].e)
+                            } else if(dateAr[idx].s < dateAr[k].s && dateAr[idx].e > dateAr[k].e) {
+                                zhi += +this.getHour(dateAr[k].e, dateAr[idx].s)
+                            } else {
+                                // 选择的结束时间处于设置的休息时间段内 (选择的结束时间处于的休息时间段)
+                                if(dateAr[k].e < dateAr[idx].e && dateAr[k].e > dateAr[idx].s) {
+                                    zhi += +this.getHour(dateAr[k].e, dateAr[idx].e)
+                                }
+                                // 选择的开始时间处于设置的休息时间段内 (选择的开始时间处于的休息时间段)
+                                if(dateAr[idx].s > dateAr[k].s && dateAr[idx].s < dateAr[k].e) {
+                                    zhi += +this.getHour(dateAr[k].e, dateAr[idx].s)
+                                }
+                            }
+                        }
+                    }
+                }
+                return zhi
+            },
             getHour(s1, s2) {
                 var reDate = /\d{4}-\d{1,2}-\d{1,2} /;
                 s1 = new Date((reDate.test(s1) ? s1 : '2018-1-1 ' + s1).replace(/-/g, '/'));
@@ -1002,6 +1049,16 @@ import timetoolVue from '../timetool/timetool.vue';
                         if (t.pm != null) {
                             this.timeType.push({value:2, label:'下午 - '+t.pm+'小时', hours: t.pm});
                         }
+
+                        let arr = []
+                        for(var i in res.data.excludeTimeList) {
+                            let obj = {
+                                s: res.data.excludeTimeList[i].startTime,
+                                e: res.data.excludeTimeList[i].endTime,
+                            }
+                            arr.push(obj)
+                        }
+                        this.vacationTime = arr
                     } else {
                         this.$toast.clear();
                         this.$toast.fail(res.msg);