浏览代码

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

QuYueTing 1 天之前
父节点
当前提交
e102156e14
共有 1 个文件被更改,包括 155 次插入73 次删除
  1. 155 73
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

+ 155 - 73
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -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);