|
@@ -39,6 +39,7 @@
|
|
<el-menu-item index="1-17" v-if="permissions.reportPhaseHours || permissions.reportStageWorkingTime" @click="ssl(16)"><p>{{ $t('xiang-mu-ge-fen-zu-yu-jie-duan-gong-shi-biao') }}</p></el-menu-item>
|
|
<el-menu-item index="1-17" v-if="permissions.reportPhaseHours || permissions.reportStageWorkingTime" @click="ssl(16)"><p>{{ $t('xiang-mu-ge-fen-zu-yu-jie-duan-gong-shi-biao') }}</p></el-menu-item>
|
|
<el-menu-item index="1-18" v-if="permissions.reportAllManhourCost || permissions.reportResponsibleManhourCost" @click="ssl(17)"><p>子项目工时成本表</p></el-menu-item>
|
|
<el-menu-item index="1-18" v-if="permissions.reportAllManhourCost || permissions.reportResponsibleManhourCost" @click="ssl(17)"><p>子项目工时成本表</p></el-menu-item>
|
|
<el-menu-item index="1-19" v-if="user.timeType.restartTaskNeedReason == 1" @click="ssl(18)"><p>任务重启表</p></el-menu-item>
|
|
<el-menu-item index="1-19" v-if="user.timeType.restartTaskNeedReason == 1" @click="ssl(18)"><p>任务重启表</p></el-menu-item>
|
|
|
|
+ <el-menu-item index="1-20" v-if="permissions.reportFTEAll || permissions.reportFTEPart" @click="ssl(19)"><p>FTE报表</p></el-menu-item>
|
|
<!-- <el-menu-item index="1-12"><p @click="ssl(11)">人员工时统计表</p></el-menu-item> -->
|
|
<!-- <el-menu-item index="1-12"><p @click="ssl(11)">人员工时统计表</p></el-menu-item> -->
|
|
</el-submenu>
|
|
</el-submenu>
|
|
</el-menu>
|
|
</el-menu>
|
|
@@ -87,14 +88,14 @@
|
|
<el-option label="查看部门审核人" :value="0"></el-option>
|
|
<el-option label="查看部门审核人" :value="0"></el-option>
|
|
</el-select> -->
|
|
</el-select> -->
|
|
<!-- 项目筛选 -->
|
|
<!-- 项目筛选 -->
|
|
- <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 10 && ins != 11 && ins != 14 && ins != 15 && ins != 17" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
|
|
|
|
|
|
+ <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 19 && ins != 10 && ins != 11 && ins != 14 && ins != 15 && ins != 17" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
|
|
<el-option v-for="(item) in proListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
|
|
<el-option v-for="(item) in proListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
|
|
<span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
|
|
<span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
|
|
<span style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
|
|
<span style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
|
|
</el-option>
|
|
</el-option>
|
|
</el-select>
|
|
</el-select>
|
|
<!-- 月份选择 -->
|
|
<!-- 月份选择 -->
|
|
- <el-date-picker v-if="ins == 14 || ins == 15" value-format="yyyy-MM" v-model="monthPersonnel" type="month" :placeholder="$t('Selectmonth')" :clearable="false" @change="selcts()" size="small"></el-date-picker>
|
|
|
|
|
|
+ <el-date-picker v-if="ins == 14 || ins == 15 || ins == 19" value-format="yyyy-MM" v-model="monthPersonnel" type="month" :placeholder="$t('Selectmonth')" :clearable="false" @change="selcts()" size="small"></el-date-picker>
|
|
|
|
|
|
<!-- 部门筛选 -->
|
|
<!-- 部门筛选 -->
|
|
<el-cascader v-if="(ins == 15 || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
|
|
<el-cascader v-if="(ins == 15 || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
|
|
@@ -118,6 +119,11 @@
|
|
<el-option :label="$t('state.yes')" value="1"></el-option>
|
|
<el-option :label="$t('state.yes')" value="1"></el-option>
|
|
</el-select>
|
|
</el-select>
|
|
|
|
|
|
|
|
+ <!-- 地区筛选 -->
|
|
|
|
+ <el-select v-if="ins == 19" v-model="areaName" placeholder="请选择地区" @change="selcts()" clearable filterable size="small" style="margin-left:10px;width:150px">
|
|
|
|
+ <el-option :label="item" :value="item" v-for="item,index in areaList" :key="index"></el-option>
|
|
|
|
+ </el-select>
|
|
|
|
+
|
|
<!-- 人员筛选 -->
|
|
<!-- 人员筛选 -->
|
|
<el-select v-if="(ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 14 || ins == 18) && user.userNameNeedTranslate != '1'" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="margin-left:10px;width:150px">
|
|
<el-select v-if="(ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 14 || ins == 18) && user.userNameNeedTranslate != '1'" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="margin-left:10px;width:150px">
|
|
<el-option v-for="(item, index) in selUserList" :key="index" :label="item.name" :value="item.id"></el-option>
|
|
<el-option v-for="(item, index) in selUserList" :key="index" :label="item.name" :value="item.id"></el-option>
|
|
@@ -833,6 +839,27 @@
|
|
<el-table-column align="center" prop="restartDate" label="重启时间" min-width="150"></el-table-column>
|
|
<el-table-column align="center" prop="restartDate" label="重启时间" min-width="150"></el-table-column>
|
|
</el-table>
|
|
</el-table>
|
|
|
|
|
|
|
|
+ <!-- ETF报表 -->
|
|
|
|
+ <el-table v-if="ins == 19" key="19" border :data="fTEDataList" highlight-current-row v-loading="listLoading" :height="+tableHeight - 1" style="width: 100%;">
|
|
|
|
+ <el-table-column align="center" prop="area" label="地区" min-width="150"></el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="projectCode" label="项目编号" min-width="150"></el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="projectName" label="项目名称" min-width="250"></el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="userName" label="人名" min-width="150">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <div>
|
|
|
|
+ <span v-if="user.userNameNeedTranslate == '1'">
|
|
|
|
+ <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
|
|
|
|
+ </span>
|
|
|
|
+ <span v-if="user.userNameNeedTranslate != '1'">
|
|
|
|
+ {{scope.row.userName}}
|
|
|
|
+ </span>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="workTime" label="工时" min-width="150"></el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="FTE" label="FTE(工时/当月工时基数)" min-width="250"></el-table-column>
|
|
|
|
+ </el-table>
|
|
|
|
+
|
|
<!--工具条-->
|
|
<!--工具条-->
|
|
<el-col :span="24" class="toolbar" v-if="ins != 6">
|
|
<el-col :span="24" class="toolbar" v-if="ins != 6">
|
|
<el-pagination
|
|
<el-pagination
|
|
@@ -1059,6 +1086,7 @@ export default {
|
|
props: {},
|
|
props: {},
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
|
|
+ areaName: '',
|
|
permissions: JSON.parse(sessionStorage.getItem("permissions")),
|
|
permissions: JSON.parse(sessionStorage.getItem("permissions")),
|
|
curProject:{},
|
|
curProject:{},
|
|
feeType:[this.$t('generalcost'), this.$t('travelexpenses'), this.$t('outsourcingcost')],
|
|
feeType:[this.$t('generalcost'), this.$t('travelexpenses'), this.$t('outsourcingcost')],
|
|
@@ -1106,13 +1134,13 @@ export default {
|
|
this.$t('pojectbalancesheetincomestatement'),this.$t('customerprojectprofitstatement'),this.$t('projectphasetimesheet'),
|
|
this.$t('pojectbalancesheetincomestatement'),this.$t('customerprojectprofitstatement'),this.$t('projectphasetimesheet'),
|
|
this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
|
|
this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
|
|
this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
|
|
this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
|
|
- this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表'],
|
|
|
|
|
|
+ this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表'],
|
|
|
|
|
|
shuzArr: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
|
|
shuzArr: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
|
|
this.$t('projectbalancesheet'),this.$t('customerprojectincomestatement'),this.$t('projectphasetimesheet'),
|
|
this.$t('projectbalancesheet'),this.$t('customerprojectincomestatement'),this.$t('projectphasetimesheet'),
|
|
this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
|
|
this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
|
|
this.$t('employeereporttimelinessrate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
|
|
this.$t('employeereporttimelinessrate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
|
|
- this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表'],
|
|
|
|
|
|
+ this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表'],
|
|
|
|
|
|
ins: 10000,
|
|
ins: 10000,
|
|
user: JSON.parse(sessionStorage.user),
|
|
user: JSON.parse(sessionStorage.user),
|
|
@@ -1179,6 +1207,7 @@ export default {
|
|
subprojectArr: [],
|
|
subprojectArr: [],
|
|
|
|
|
|
taskRestartArr: [], // 任务重启表数据
|
|
taskRestartArr: [], // 任务重启表数据
|
|
|
|
+ fTEDataList: [], // FTE数据
|
|
};
|
|
};
|
|
},
|
|
},
|
|
computed: {},
|
|
computed: {},
|
|
@@ -1269,6 +1298,7 @@ export default {
|
|
if(this.permissions.reportPhaseHours || this.permissions.reportStageWorkingTime) {this.ssl(16);this.defaultActive = '1-17';return}
|
|
if(this.permissions.reportPhaseHours || this.permissions.reportStageWorkingTime) {this.ssl(16);this.defaultActive = '1-17';return}
|
|
if(this.permissions.reportAllManhourCost || this.permissions.reportResponsibleManhourCost) {this.ssl(17);this.defaultActive = '1-18';return}
|
|
if(this.permissions.reportAllManhourCost || this.permissions.reportResponsibleManhourCost) {this.ssl(17);this.defaultActive = '1-18';return}
|
|
if(this.user.timeType.restartTaskNeedReason == 1) {this.ssl(18);this.defaultActive = '1-19';return}
|
|
if(this.user.timeType.restartTaskNeedReason == 1) {this.ssl(18);this.defaultActive = '1-19';return}
|
|
|
|
+ if(this.permissions.reportFTEAll || this.permissions.reportFTEPart) {this.ssl(19);this.defaultActive = '1-20';return}
|
|
{this.allWrong = false}
|
|
{this.allWrong = false}
|
|
},
|
|
},
|
|
rowspan(spanArr,position,spanName){
|
|
rowspan(spanArr,position,spanName){
|
|
@@ -1514,8 +1544,11 @@ export default {
|
|
this.getAubprojectArr()
|
|
this.getAubprojectArr()
|
|
} else if(this.ins == 18) {
|
|
} else if(this.ins == 18) {
|
|
this.taskRestart()
|
|
this.taskRestart()
|
|
|
|
+ } else if(this.ins == 19) {
|
|
|
|
+ this.getETF()
|
|
|
|
+ this.getArea()
|
|
}
|
|
}
|
|
- if(this.ins != 16 && this.ins != 17 && this.ins != 18) {
|
|
|
|
|
|
+ if(this.ins != 16 && this.ins != 17 && this.ins != 18 && this.ins != 19) {
|
|
this.getUserList()
|
|
this.getUserList()
|
|
}
|
|
}
|
|
},
|
|
},
|
|
@@ -1642,6 +1675,11 @@ export default {
|
|
sl.endDate = this.rangeDatas[1]
|
|
sl.endDate = this.rangeDatas[1]
|
|
sl.projectId = this.proJuctId
|
|
sl.projectId = this.proJuctId
|
|
sl.personLiableId = this.userId
|
|
sl.personLiableId = this.userId
|
|
|
|
+ } else if(this.ins == 19) {
|
|
|
|
+ fName = 'FTE报表' + '.xlsx'
|
|
|
|
+ url += "/exportFTEData"
|
|
|
|
+ sl.month = this.monthPersonnel + '-01'
|
|
|
|
+ sl.area = this.areaName || null
|
|
}
|
|
}
|
|
this.http.post(url, sl,
|
|
this.http.post(url, sl,
|
|
res => {
|
|
res => {
|
|
@@ -1729,6 +1767,83 @@ export default {
|
|
this.page = 1
|
|
this.page = 1
|
|
this.getAuditRateList()
|
|
this.getAuditRateList()
|
|
},
|
|
},
|
|
|
|
+ // 获取EFT报表的数据
|
|
|
|
+ getETF() {
|
|
|
|
+ this.listLoading = true;
|
|
|
|
+ let parameter = {
|
|
|
|
+ month: this.monthPersonnel + '-01',
|
|
|
|
+ area: this.areaName || null,
|
|
|
|
+ pageIndex: this.page,
|
|
|
|
+ pageSize: this.size
|
|
|
|
+ }
|
|
|
|
+ this.http.post('/project/getFTEData', parameter,
|
|
|
|
+ res => {
|
|
|
|
+ if (res.code == "ok") {
|
|
|
|
+ for (var i in res.data.resultList) {
|
|
|
|
+ res.data.resultList[i].FTE = res.data.resultList[i].FTE.toFixed(2)
|
|
|
|
+ }
|
|
|
|
+ this.fTEDataList = res.data.resultList;
|
|
|
|
+ this.total = res.data.total;
|
|
|
|
+ this.listLoading = false;
|
|
|
|
+ } else {
|
|
|
|
+ this.$message({
|
|
|
|
+ message: res.msg,
|
|
|
|
+ type: "error"
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ error => {
|
|
|
|
+ this.$message({
|
|
|
|
+ message: error,
|
|
|
|
+ type: "error"
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ getArea() {
|
|
|
|
+ this.http.post('/user/areaData', {},
|
|
|
|
+ res => {
|
|
|
|
+ if (res.code == "ok") {
|
|
|
|
+ this.areaList = res.data
|
|
|
|
+ } else {
|
|
|
|
+ this.$message({
|
|
|
|
+ message: res.msg,
|
|
|
|
+ type: "error"
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ error => {
|
|
|
|
+ this.$message({
|
|
|
|
+ message: error,
|
|
|
|
+ type: "error"
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ getETFSummaries() {
|
|
|
|
+ const { columns, data } = param;
|
|
|
|
+ const sums = [];
|
|
|
|
+ columns.forEach((column, index) => {
|
|
|
|
+ if (index === 0) {
|
|
|
|
+ sums[index] = '总工时';
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ const values = data.map(item => Number(item[column.property]));
|
|
|
|
+ if (!values.every(value => isNaN(value))) {
|
|
|
|
+ sums[index] = values.reduce((prev, curr) => {
|
|
|
|
+ const value = Number(curr);
|
|
|
|
+ if (!isNaN(value)) {
|
|
|
|
+ return prev + curr;
|
|
|
|
+ } else {
|
|
|
|
+ return prev;
|
|
|
|
+ }
|
|
|
|
+ }, 0);
|
|
|
|
+ sums[index] += ' h';
|
|
|
|
+ } else {
|
|
|
|
+ sums[index] = '/';
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ return sums;
|
|
|
|
+ },
|
|
// 获取人员工时统计表
|
|
// 获取人员工时统计表
|
|
getPersonnelList() {
|
|
getPersonnelList() {
|
|
let parameter = {
|
|
let parameter = {
|