|
@@ -96,7 +96,7 @@
|
|
|
</template>
|
|
|
|
|
|
<!-- 时间段筛选 ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 12 || ins == 5 || ins == 16 || ins == 17 || ins == 18 || ins == 20 || ins == 21 || ins == 22 -->
|
|
|
- <template v-if="screeningCondition.timePeriod.includes(ins)">
|
|
|
+ <template v-if="screeningCondition.timePeriod.includes(ins) && !(ins == 6 && overtimeTabActive === 'project')">
|
|
|
<span>
|
|
|
<!-- <span class="demonstration" style="color:#999;padding:0 10px">
|
|
|
{{ ins == 15 ? $t('xiang-mu-chuang-jian-shi-jian-duan') : $t('message.period') }}
|
|
@@ -128,13 +128,14 @@
|
|
|
</el-select>
|
|
|
</span>
|
|
|
</template>
|
|
|
- <template v-if="ins == 6">
|
|
|
+ <template v-if="ins == 6 && overtimeTabActive != 'project'">
|
|
|
<el-select v-model="writeOffStatus" :placeholder="$t('defaultText.pleaseChoose')" @change="picks()" size="small" clearable>
|
|
|
<el-option label="正常" :value="0" ></el-option>
|
|
|
<el-option label="已核销" :value="1" ></el-option>
|
|
|
</el-select>
|
|
|
</template>
|
|
|
|
|
|
+
|
|
|
<template v-if="ins == 24">
|
|
|
<el-radio-group v-model="tabPosition" size="small" @input="getGroupConsumptionData">
|
|
|
<el-radio-button label="0">表格</el-radio-button>
|
|
@@ -157,7 +158,7 @@
|
|
|
</el-option>
|
|
|
</el-select>
|
|
|
</div>
|
|
|
-
|
|
|
+
|
|
|
|
|
|
<template v-if="ins == 27">
|
|
|
<el-radio-group v-model="estimatedWorkingHoursType" size="small" @change="groupChange()">
|
|
@@ -197,7 +198,7 @@
|
|
|
start-placeholder="开始月份"
|
|
|
end-placeholder="结束月份" :clearable="false" @change="selcts()" size="small"></el-date-picker>
|
|
|
<!-- 部门筛选 ins == 15 || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14) -->
|
|
|
- <el-cascader v-if="(screeningCondition.departments.includes(ins) || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
|
|
|
+ <el-cascader v-if="(screeningCondition.departments.includes(ins) || (ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime && overtimeTabActive != 'project') || (ins == 11 && permissions.reportPersonnel)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
|
|
|
:props="{ checkStrictly: true,expandTrigger: 'hover',multiple: ins == 6 ? true : false }" collapse-tags :show-all-levels="false" clearable
|
|
|
@change="selcts(9)" size="small" style="margin-left:10px"
|
|
|
></el-cascader>
|
|
@@ -224,7 +225,7 @@
|
|
|
</el-select>
|
|
|
|
|
|
<!-- 人员筛选 ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 14 || ins == 18 -->
|
|
|
- <el-select v-if="(screeningCondition.staff.includes(ins)) && user.userNameNeedTranslate != '1'" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="width:100px">
|
|
|
+ <el-select v-if="(screeningCondition.staff.includes(ins)) && user.userNameNeedTranslate != '1' && overtimeTabActive != 'project'" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="width:100px">
|
|
|
<el-option v-for="(item, index) in selUserList" :key="index" :label="item.name" :value="item.id"></el-option>
|
|
|
</el-select>
|
|
|
<!-- 人员兹自定义配置 员工类型筛选 只针对优立科技 -->
|
|
@@ -707,74 +708,106 @@
|
|
|
|
|
|
<!-- 项目加班情况统计报表 -->
|
|
|
<div v-if="ins == 6 || ins == 8">
|
|
|
-
|
|
|
- <el-table v-if="ins == 6" key="6" border :data="overTimeList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
|
|
|
- <el-table-column prop="projectCode" :label="$t('headerTop.serialNumber')" width="80">
|
|
|
- <template slot-scope="scope">
|
|
|
- <div>
|
|
|
- {{scope.$index + 1}}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="projectCode" :label="user.companyId == '7030' ? '项目令号' : $t('Itemno')" width="220"></el-table-column>
|
|
|
- <el-table-column prop="projectName" :label="$t('headerTop.projectName')" width="220"></el-table-column>
|
|
|
- <el-table-column prop="degreeName" :label="user.timeType.customDegreeName" width="180" v-if="user.timeType.customDegreeActive == 1"></el-table-column>
|
|
|
- <el-table-column prop="username" :label="$t('lable.name')" width="120">
|
|
|
- <template slot-scope="scope" >
|
|
|
- <span v-if="user.userNameNeedTranslate == '1'">
|
|
|
- <TranslationOpenDataText type='userName' :openid='scope.row.username'></TranslationOpenDataText>
|
|
|
- </span>
|
|
|
- <span v-if="user.userNameNeedTranslate != '1'">
|
|
|
- {{scope.row.username}}
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="jobNumber" :label="$t('Worknumber')" width="120"></el-table-column>
|
|
|
- <el-table-column prop="departmentName" :label="$t('lable.department')" width="140">
|
|
|
- <template slot-scope="scope" >
|
|
|
- <span v-if="user.userNameNeedTranslate == '1'">
|
|
|
- <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
|
|
|
- </span>
|
|
|
+
|
|
|
+ <div v-if="ins == 6">
|
|
|
+ <div style="margin-bottom: 15px;">
|
|
|
+ <el-tabs v-model="overtimeTabActive" @tab-click="handleOvertimeTabClick">
|
|
|
+ <el-tab-pane label="每日加班明细" name="detail"></el-tab-pane>
|
|
|
+ <el-tab-pane label="按项目统计" name="project"></el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 每日加班明细表 -->
|
|
|
+ <el-table v-if="overtimeTabActive === 'detail'" key="6" border :data="overTimeList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
|
|
|
+ <el-table-column prop="projectCode" :label="$t('headerTop.serialNumber')" width="80">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <div>
|
|
|
+ {{scope.$index + 1}}
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="projectCode" :label="user.companyId == '7030' ? '项目令号' : $t('Itemno')" width="220"></el-table-column>
|
|
|
+ <el-table-column prop="projectName" :label="$t('headerTop.projectName')" width="220"></el-table-column>
|
|
|
+ <el-table-column prop="degreeName" :label="user.timeType.customDegreeName" width="180" v-if="user.timeType.customDegreeActive == 1"></el-table-column>
|
|
|
+ <el-table-column prop="username" :label="$t('lable.name')" width="120">
|
|
|
+ <template slot-scope="scope" >
|
|
|
+ <span v-if="user.userNameNeedTranslate == '1'">
|
|
|
+ <TranslationOpenDataText type='userName' :openid='scope.row.username'></TranslationOpenDataText>
|
|
|
+ </span>
|
|
|
<span v-if="user.userNameNeedTranslate != '1'">
|
|
|
- {{scope.row.departmentName}}
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="createDate" :label="$t('screening.workingDate')" width="120"></el-table-column>
|
|
|
- <el-table-column prop="workingTime" :label="$t('screening.workTime')+ '(h)'" width="100" align="right">
|
|
|
- <template slot-scope="scope">
|
|
|
- <span style="padding-right: 15px;">{{scope.row.workingTime.toFixed(1)}}h</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="writeOffValue" :label="$t('heXiaoZhuangTai')" width="120">
|
|
|
- <template slot-scope="scope" >
|
|
|
+ {{scope.row.username}}
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="jobNumber" :label="$t('Worknumber')" width="120"></el-table-column>
|
|
|
+ <el-table-column prop="departmentName" :label="$t('lable.department')" width="140">
|
|
|
+ <template slot-scope="scope" >
|
|
|
+ <span v-if="user.userNameNeedTranslate == '1'">
|
|
|
+ <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
|
|
|
+ </span>
|
|
|
+ <span v-if="user.userNameNeedTranslate != '1'">
|
|
|
+ {{scope.row.departmentName}}
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="createDate" :label="$t('screening.workingDate')" width="120"></el-table-column>
|
|
|
+ <el-table-column prop="workingTime" :label="$t('screening.workTime')+ '(h)'" width="100" align="right">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span style="padding-right: 15px;">{{scope.row.workingTime.toFixed(1)}}h</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="writeOffValue" :label="$t('heXiaoZhuangTai')" width="120">
|
|
|
+ <template slot-scope="scope" >
|
|
|
{{ scope.row.writeOffValue == 1 ? '已核销' : '正常' }}
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="writeOffUser" :label="$t('heXiaoRen')" width="120">
|
|
|
- <template slot-scope="scope" >
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="writeOffUser" :label="$t('heXiaoRen')" width="120">
|
|
|
+ <template slot-scope="scope" >
|
|
|
<TranslationOpenDataText type='userName' :openid='scope.row.writeOffUser'></TranslationOpenDataText>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="writeOffTime" :label="$t('heXiaoShiJian')" width="160"></el-table-column>
|
|
|
- <el-table-column prop="writeOffReason" :label="$t('heXiaoYanYing')" width="160"></el-table-column>
|
|
|
- <el-table-column prop="overtimeHours" :label="$t('jia-ban-shi-chang')+'(h)'" width="100" fixed="right" align="right">
|
|
|
- <template slot-scope="scope">
|
|
|
- <span style="padding-right: 15px;">{{scope.row.overtimeHours.toFixed(1)}}h</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="cost" :label="$t('overtimecost')" width="100" v-if="permissions.reportCost" fixed="right" align="right">
|
|
|
- <template slot-scope="scope">
|
|
|
- <span>¥{{scope.row.cost | numberToCurrency}}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="cost" :label="$t('operation')" width="100" v-if="user.roleName == $t('role.superAdministrator')" fixed="right" align="right">
|
|
|
- <template slot-scope="scope">
|
|
|
- <el-button type="text" @click="writeOffOperation(scope.row, 'restore')" v-if="scope.row.writeOffValue == 1">{{ $t('huiFu') }}</el-button>
|
|
|
- <el-button type="text" @click="writeOffOperation(scope.row, 'writeoff')" v-else>{{ $t('heXiao') }}</el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="writeOffTime" :label="$t('heXiaoShiJian')" width="160"></el-table-column>
|
|
|
+ <el-table-column prop="writeOffReason" :label="$t('heXiaoYanYing')" width="160"></el-table-column>
|
|
|
+ <el-table-column prop="overtimeHours" :label="$t('jia-ban-shi-chang')+'(h)'" width="100" fixed="right" align="right">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span style="padding-right: 15px;">{{scope.row.overtimeHours.toFixed(1)}}h</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="cost" :label="$t('overtimecost')" width="100" v-if="permissions.reportCost" fixed="right" align="right">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span>¥{{scope.row.cost | numberToCurrency}}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="cost" :label="$t('operation')" width="100" v-if="user.roleName == $t('role.superAdministrator')" fixed="right" align="right">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <el-button type="text" @click="writeOffOperation(scope.row, 'restore')" v-if="scope.row.writeOffValue == 1">{{ $t('huiFu') }}</el-button>
|
|
|
+ <el-button type="text" @click="writeOffOperation(scope.row, 'writeoff')" v-else>{{ $t('heXiao') }}</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <!-- 按项目统计表 -->
|
|
|
+ <el-table v-if="overtimeTabActive === 'project'" key="6-project" border :data="projectOvertimeList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
|
|
|
+ <el-table-column type="index" label="序号" width="80"></el-table-column>
|
|
|
+ <el-table-column prop="projectCode" :label="user.companyId == '7030' ? '项目令号' : $t('Itemno')" width="220"></el-table-column>
|
|
|
+ <el-table-column prop="projectName" :label="$t('headerTop.projectName')" width="220"></el-table-column>
|
|
|
+ <el-table-column prop="workingTime" label="工作时长(h)" width="120" align="right">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span>{{scope.row.workingTime.toFixed(1)}}h</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="overtimeHours" label="加班时长(h)" width="120" align="right">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span>{{scope.row.overtimeHours.toFixed(1)}}h</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="cost" label="加班成本" width="120" align="right">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span>¥{{scope.row.cost | numberToCurrency}}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
|
|
|
<!-- 人员工时分配表 -->
|
|
|
<el-table v-if="ins == 8" key="8" border :data="userWorkHoursList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
|
|
@@ -2269,7 +2302,8 @@ export default {
|
|
|
baseCostList: [],
|
|
|
baseCostColumns: [],
|
|
|
proListOvertime: [], // 加班情况项目筛选
|
|
|
-
|
|
|
+ overtimeTabActive: 'detail', // 'detail' 表示每日加班明细, 'project' 表示按项目统计
|
|
|
+ projectOvertimeList: [],
|
|
|
customerList: [],
|
|
|
customerId: '',
|
|
|
cusProJuctId: '',
|
|
@@ -2564,6 +2598,34 @@ export default {
|
|
|
});
|
|
|
});
|
|
|
},
|
|
|
+ // 处理按项目统计的加班数据
|
|
|
+ processProjectOvertimeData() {
|
|
|
+ // 按项目分组统计
|
|
|
+ const projectMap = new Map();
|
|
|
+
|
|
|
+ this.overTimeList.forEach(item => {
|
|
|
+ const key = item.projectCode || item.projectName;
|
|
|
+ if (!projectMap.has(key)) {
|
|
|
+ projectMap.set(key, {
|
|
|
+ projectCode: item.projectCode,
|
|
|
+ projectName: item.projectName,
|
|
|
+ workingTime: 0,
|
|
|
+ overtimeHours: 0,
|
|
|
+ cost: 0
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ const projectItem = projectMap.get(key);
|
|
|
+ projectItem.workingTime += item.workingTime || 0;
|
|
|
+ projectItem.overtimeHours += item.overtimeHours || 0;
|
|
|
+ projectItem.cost += item.cost || 0;
|
|
|
+ });
|
|
|
+
|
|
|
+ // 转换为数组并按项目代码排序
|
|
|
+ this.projectOvertimeList = Array.from(projectMap.values()).sort((a, b) => {
|
|
|
+ return (a.projectCode || a.projectName).localeCompare(b.projectCode || b.projectName);
|
|
|
+ });
|
|
|
+ },
|
|
|
expensesSummaries(param) {
|
|
|
const { columns, data } = param;
|
|
|
const sums = [];
|
|
@@ -2911,7 +2973,11 @@ export default {
|
|
|
this.childrenList = row.children;
|
|
|
this.addFormVisible = true;
|
|
|
},
|
|
|
-
|
|
|
+ handleOvertimeTabClick(tab) {
|
|
|
+ if (tab.name === 'project' && this.projectOvertimeList.length === 0) {
|
|
|
+ this.processProjectOvertimeData();
|
|
|
+ }
|
|
|
+ },
|
|
|
//分页
|
|
|
handleCurrentChange(val) {
|
|
|
this.page = val;
|
|
@@ -3925,6 +3991,12 @@ export default {
|
|
|
}
|
|
|
return item.writeOffValue == 0 ? { ...item, ...obj } : { ...item }
|
|
|
})
|
|
|
+ //清空项目统计数据,下次切换tab时重新计算
|
|
|
+ this.projectOvertimeList = [];
|
|
|
+ //如果当前是项目统计tab,则处理数据
|
|
|
+ if (this.overtimeTabActive === 'project') {
|
|
|
+ this.processProjectOvertimeData();
|
|
|
+ }
|
|
|
} else {
|
|
|
this.$message({
|
|
|
message: res.msg,
|
|
@@ -4510,7 +4582,11 @@ export default {
|
|
|
},
|
|
|
picks() {
|
|
|
if(this.ins == 6){
|
|
|
- this.overTime()
|
|
|
+ if (this.overtimeTabActive === 'detail') {
|
|
|
+ this.overTime();
|
|
|
+ } else {
|
|
|
+ this.processProjectOvertimeData();
|
|
|
+ }
|
|
|
}
|
|
|
if(this.ins == 8){
|
|
|
this.getWorkHoursList()
|
|
@@ -4683,6 +4759,12 @@ export default {
|
|
|
this.getGroupWorktimeList()
|
|
|
}else if(this.ins == 15){
|
|
|
this.getDepartmentsInvolved()
|
|
|
+ }else if(this.ins == 6){
|
|
|
+ if (this.overtimeTabActive === 'detail') {
|
|
|
+ this.overTime();
|
|
|
+ } else {
|
|
|
+ this.processProjectOvertimeData();
|
|
|
+ }
|
|
|
}else{
|
|
|
if(e == 9){
|
|
|
console.log(this.departmentIdArray);
|