Quellcode durchsuchen

钉钉考勤时长bug修复

seyason vor 1 Jahr
Ursprung
Commit
179151741a

+ 10 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -186,8 +186,15 @@ public class DingDingController {
 //        return new HttpRespMsg();
 //    }
 
+    @RequestMapping("/fixAttendance")
+    public HttpRespMsg fixAttendance(Integer companyId) {
+        return dingDingService.fixAttendance(companyId);
+    }
+
+
+
     @RequestMapping("/syncUserWorkData")
-    public HttpRespMsg syncUserWorkData(Integer companyId, String userId, String startDate, String endDate) {
+    public HttpRespMsg syncUserWorkData(Integer companyId, String userId, String startDate, String endDate, @RequestParam(required = false, defaultValue = "false") boolean onlySyncAttendance) {
         CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId).isNotNull("inner_appkey"));
         HttpRespMsg msg = new HttpRespMsg();
         if (startDate.compareTo(endDate) > 0) {
@@ -203,7 +210,7 @@ public class DingDingController {
                 return msg;
             } else {
                 long t1 = System.currentTimeMillis();
-                dingDingService.syncUserWorkData(dingding, userId, startDate, endDate, true);
+                dingDingService.syncUserWorkData(dingding, userId, startDate, endDate, true, onlySyncAttendance);
                 long t2 = System.currentTimeMillis();
                 System.out.println("总共耗时:"+(t2-t1)+"ms");
             }
@@ -221,7 +228,7 @@ public class DingDingController {
             } else {
                 long t1 = System.currentTimeMillis();
                 for (int i=0;i<dingdingList.size(); i++) {
-                    dingDingService.syncUserWorkData(dingdingList.get(i), userId, startDate, endDate, true);
+                    dingDingService.syncUserWorkData(dingdingList.get(i), userId, startDate, endDate, true, onlySyncAttendance);
                 }
                 long t2 = System.currentTimeMillis();
                 System.out.println("总共耗时:"+(t2-t1)+"ms");

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -250,8 +250,8 @@ public class ProjectController {
      * 导出查询者所在公司每个项目的工时成本
      */
     @RequestMapping("/exportTimeCost")
-    public HttpRespMsg exportTimeCost(String exportContent,String startDate, String endDate, Integer projectId, String userIds, Boolean projectSum,Integer type,Integer deptId,@RequestParam(defaultValue = "1") Integer stateKey) {
-        return projectService.exportTimeCost(exportContent,startDate, endDate, projectId, userIds, projectSum,type,deptId,stateKey, request);
+    public HttpRespMsg exportTimeCost(String exportContent,String startDate, String endDate, Integer projectId, String userIds, Boolean projectSum,Integer type,Integer deptId,@RequestParam(defaultValue = "1") Integer stateKey, @RequestParam(required = false, defaultValue = "0") Integer withPercent) {
+        return projectService.exportTimeCost(exportContent,startDate, endDate, projectId, userIds, projectSum,type,deptId,stateKey, withPercent, request);
     }
 
     /**

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java

@@ -33,7 +33,7 @@ public interface DingDingService {
 
     void syncLeaveTime(Integer companyId, String userId, String startDate, String endDate);
 
-    void syncUserWorkData(CompanyDingding dingding,String userId, String startDate, String endDate, boolean showLog);
+    void syncUserWorkData(CompanyDingding dingding,String userId, String startDate, String endDate, boolean showLog, boolean onlySyncAttendance);
 
     void getCorpSelfDefSmartReport(CompanyDingding dingding);
 
@@ -50,4 +50,6 @@ public interface DingDingService {
     void userAddOrg(String corpId, JSONArray userIdArray);
 
     String inactiveUserNotInAuthRange(String corpid);
+
+    HttpRespMsg fixAttendance(Integer companyId);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -69,7 +69,7 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg getAllMembCost(String startDate, String endDate, Integer projectId, HttpServletRequest request);
 
-    HttpRespMsg exportTimeCost(String exportContent,String startDate, String endDate, Integer projectId,String userIds, Boolean projectSum,Integer type,Integer deptId,Integer stateKey,HttpServletRequest request);
+    HttpRespMsg exportTimeCost(String exportContent,String startDate, String endDate, Integer projectId,String userIds, Boolean projectSum,Integer type,Integer deptId,Integer stateKey, Integer withPercent, HttpServletRequest request);
 
     HttpRespMsg updateProgress(Integer id, Integer progress, HttpServletRequest request);
 

+ 103 - 69
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -738,6 +738,36 @@ public class DingDingServiceImpl implements DingDingService {
         return resultStr;
     }
 
+    @Override
+    public HttpRespMsg fixAttendance(Integer companyId) {
+        //查询负数,重新计算工时
+        List<UserDingdingTime> data = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().lt("work_hours", 0).eq("company_id", companyId));
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+        int count = 0;
+        List<UserDingdingTime> upData = new ArrayList<>();
+        for (UserDingdingTime time : data) {
+            LocalDateTime sTime = LocalDateTime.parse("2000-10-10 "+time.getStartTime(),formatter);
+            LocalDateTime eTime = LocalDateTime.parse("2000-10-10 "+time.getEndTime(),formatter);
+            if (eTime.isBefore(sTime)) {
+                eTime = eTime.withHour(23).withMinute(59);
+            }
+            long seconds = Duration.between(sTime, eTime).getSeconds();
+            double hours = seconds/3600.0;
+            UserDingdingTime upItem = new UserDingdingTime();
+            upItem.setId(time.getId());
+            upItem.setWorkHours((float)hours);
+            upData.add(upItem);
+            System.out.println("修改工时为:"+hours);
+            count++;
+        }
+        if (count > 0) {
+            userDingdingTimeService.updateBatchById(upData);
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("修复成功"+count+"条");
+        return msg;
+    }
+
     private void getAuthedDeptsAndUsers(CompanyDingding dingding, String accessToken) {
         try {
             //查找默认角色
@@ -1805,7 +1835,7 @@ public class DingDingServiceImpl implements DingDingService {
 
     //获取当天的员工考勤数据,包括打卡,请假/出差申请单; 仅企业内部应用有权限
     @Override
-    public void syncUserWorkData(CompanyDingding dingding, String userId, String startDate, String endDate, boolean showLog) {
+    public void syncUserWorkData(CompanyDingding dingding, String userId, String startDate, String endDate, boolean showLog, boolean onlySyncAttendance) {
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate sDate = LocalDate.parse(startDate, dateTimeFormatter);
         LocalDate eDate = LocalDate.parse(endDate, dateTimeFormatter);
@@ -1815,7 +1845,7 @@ public class DingDingServiceImpl implements DingDingService {
             LocalDate workDate = sDate.plusDays(i);
             String wDate = dateTimeFormatter.format(workDate);
             System.out.println("同步钉钉考勤假期出差第:"+i+"天, " + wDate);
-            sycUserOneDayWorkData(dingding, userId, wDate, showLog);
+            sycUserOneDayWorkData(dingding, userId, wDate, showLog, onlySyncAttendance);
             //到达结束日期,结束了
             if (workDate.isEqual(eDate)) {
                 break;
@@ -1824,7 +1854,7 @@ public class DingDingServiceImpl implements DingDingService {
         }
     }
 
-    private void sycUserOneDayWorkData(CompanyDingding dingding, String userId, String workDate, boolean showLog) {
+    private void sycUserOneDayWorkData(CompanyDingding dingding, String userId, String workDate, boolean showLog, boolean onlySyncAttendance) {
         List<User> userList = null;
         if (StringUtils.isEmpty(userId)) {
             userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
@@ -1889,6 +1919,7 @@ public class DingDingServiceImpl implements DingDingService {
                         long deltaTimeSec = Duration.between(onDutyEarleast, offDutyLatest).getSeconds();
                         float hours = deltaTimeSec*1.0f/3600;
                         cardTime.setWorkHours(hours);
+                        if (showLog) System.out.println(user.getName()+", "+cardTime.getWorkDate().toString()+" 上下班打卡时间:"+onDutyEarleast+" - "+offDutyLatest+", 时长:"+hours);
                         //对比,看看之前是否已经存了
                         List<UserDingdingTime> old = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().eq("user_id", user.getId())
                                 .eq("work_date", cardTime.getWorkDate()));
@@ -1898,74 +1929,77 @@ public class DingDingServiceImpl implements DingDingService {
                         userDingdingTimeService.saveOrUpdate(cardTime);
                     }
 
+
                     //请假和出差的审批单列表
-                    JSONArray approveList = result.getJSONArray("approve_list");
-                    for (int i=0;i<approveList.size(); i++) {
-                        JSONObject item = approveList.getJSONObject(i);
-                        String tagName = item.getString("tag_name");
-                        if ("出差".equals(tagName)) {
-                            BusinessTrip trip = new BusinessTrip();
-                            trip.setWay(4);//获取不到钉钉出差的方式,默认为其他方式
-                            trip.setOwnerId(user.getId());
-                            trip.setOwnerName(user.getName());
-                            trip.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
-                            trip.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
-                            trip.setCompanyId(dingding.getCompanyId());
-                            Long cha = trip.getEndDate().toEpochDay() - trip.getStartDate().toEpochDay() + 1;
-                            trip.setDayCount(Integer.parseInt(cha.toString()));
-                            trip.setStatus(0);
-                            trip.setProcinstId(item.getString("procInst_id"));
-                            trip.setGmtFinished(item.getString("gmt_finished"));
-                            //检查是否已经存在老的同一个审批单,如果有的话,需要删除
-                            QueryWrapper<BusinessTrip> queryWrapper = new QueryWrapper<BusinessTrip>().eq("company_id", trip.getCompanyId()).eq("procinst_id", trip.getProcinstId()).ne("gmt_finished", trip.getGmtFinished());
-                            int oldProIns = businessTripMapper.selectCount(queryWrapper);
-                            if (oldProIns > 0) {
-                                businessTripMapper.delete(queryWrapper);
-                            }
-                            int cnt = businessTripMapper.selectCount(new QueryWrapper<BusinessTrip>().eq("owner_id", user.getId())
-                                    .eq("start_date", trip.getStartDate())
-                                    .eq("end_date", trip.getEndDate()));
-                            if (cnt == 0) {
-                                businessTripMapper.insert(trip);
-                            }
-                        } else if ("请假".equals(tagName)) {
-                            LeaveSheet sheet = new LeaveSheet();
-                            sheet.setOwnerId(user.getId());
-                            sheet.setOwnerName(user.getName());
-                            sheet.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
-                            sheet.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
-                            sheet.setGmtFinished(item.getString("gmt_finished"));
-                            Long cha = sheet.getEndDate().toEpochDay() - sheet.getStartDate().toEpochDay() + 1;
-                            sheet.setTimeDays((float)cha);
-                            TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", user.getCompanyId()));
-                            sheet.setTimeHours(sheet.getTimeDays()*allDay.getAllday());
-                            sheet.setCompanyId(dingding.getCompanyId());
-                            sheet.setStatus(0);
-                            sheet.setProcinstId(item.getString("procInst_id"));
-                            String dLeaveType = item.getString("sub_type");
-                            if (!dLeaveType.endsWith("假")) dLeaveType = dLeaveType + "假";
-                            int leaveTypeIndex = -1;
-                            for (int t=0;t<Constant.LEAVE_TYPES.length; t++) {
-                                if (Constant.LEAVE_TYPES[t].equals(dLeaveType)) {
-                                    leaveTypeIndex = t;
-                                    break;
+                    if (!onlySyncAttendance) {
+                        JSONArray approveList = result.getJSONArray("approve_list");
+                        for (int i=0;i<approveList.size(); i++) {
+                            JSONObject item = approveList.getJSONObject(i);
+                            String tagName = item.getString("tag_name");
+                            if ("出差".equals(tagName)) {
+                                BusinessTrip trip = new BusinessTrip();
+                                trip.setWay(4);//获取不到钉钉出差的方式,默认为其他方式
+                                trip.setOwnerId(user.getId());
+                                trip.setOwnerName(user.getName());
+                                trip.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
+                                trip.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
+                                trip.setCompanyId(dingding.getCompanyId());
+                                Long cha = trip.getEndDate().toEpochDay() - trip.getStartDate().toEpochDay() + 1;
+                                trip.setDayCount(Integer.parseInt(cha.toString()));
+                                trip.setStatus(0);
+                                trip.setProcinstId(item.getString("procInst_id"));
+                                trip.setGmtFinished(item.getString("gmt_finished"));
+                                //检查是否已经存在老的同一个审批单,如果有的话,需要删除
+                                QueryWrapper<BusinessTrip> queryWrapper = new QueryWrapper<BusinessTrip>().eq("company_id", trip.getCompanyId()).eq("procinst_id", trip.getProcinstId()).ne("gmt_finished", trip.getGmtFinished());
+                                int oldProIns = businessTripMapper.selectCount(queryWrapper);
+                                if (oldProIns > 0) {
+                                    businessTripMapper.delete(queryWrapper);
+                                }
+                                int cnt = businessTripMapper.selectCount(new QueryWrapper<BusinessTrip>().eq("owner_id", user.getId())
+                                        .eq("start_date", trip.getStartDate())
+                                        .eq("end_date", trip.getEndDate()));
+                                if (cnt == 0) {
+                                    businessTripMapper.insert(trip);
+                                }
+                            } else if ("请假".equals(tagName)) {
+                                LeaveSheet sheet = new LeaveSheet();
+                                sheet.setOwnerId(user.getId());
+                                sheet.setOwnerName(user.getName());
+                                sheet.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
+                                sheet.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
+                                sheet.setGmtFinished(item.getString("gmt_finished"));
+                                Long cha = sheet.getEndDate().toEpochDay() - sheet.getStartDate().toEpochDay() + 1;
+                                sheet.setTimeDays((float)cha);
+                                TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", user.getCompanyId()));
+                                sheet.setTimeHours(sheet.getTimeDays()*allDay.getAllday());
+                                sheet.setCompanyId(dingding.getCompanyId());
+                                sheet.setStatus(0);
+                                sheet.setProcinstId(item.getString("procInst_id"));
+                                String dLeaveType = item.getString("sub_type");
+                                if (!dLeaveType.endsWith("假")) dLeaveType = dLeaveType + "假";
+                                int leaveTypeIndex = -1;
+                                for (int t=0;t<Constant.LEAVE_TYPES.length; t++) {
+                                    if (Constant.LEAVE_TYPES[t].equals(dLeaveType)) {
+                                        leaveTypeIndex = t;
+                                        break;
+                                    }
+                                }
+                                if (leaveTypeIndex == -1) {
+                                    leaveTypeIndex = Constant.LEAVE_TYPES.length-1;
+                                }
+                                sheet.setLeaveType(leaveTypeIndex);
+                                //检查是否已经有同一个请假申请,有的话就是更新
+                                QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>().eq("company_id", sheet.getCompanyId()).eq("procinst_id", sheet.getProcinstId()).ne("gmt_finished", sheet.getGmtFinished());
+                                int oldProIns = leaveSheetMapper.selectCount(queryWrapper);
+                                if (oldProIns > 0) {
+                                    leaveSheetMapper.delete(queryWrapper);
+                                }
+                                int cnt = leaveSheetMapper.selectCount(new QueryWrapper<LeaveSheet>().eq("owner_id", user.getId())
+                                        .eq("start_date", sheet.getStartDate())
+                                        .eq("end_date", sheet.getEndDate()));
+                                if (cnt == 0) {
+                                    leaveSheetMapper.insert(sheet);
                                 }
-                            }
-                            if (leaveTypeIndex == -1) {
-                                leaveTypeIndex = Constant.LEAVE_TYPES.length-1;
-                            }
-                            sheet.setLeaveType(leaveTypeIndex);
-                            //检查是否已经有同一个请假申请,有的话就是更新
-                            QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>().eq("company_id", sheet.getCompanyId()).eq("procinst_id", sheet.getProcinstId()).ne("gmt_finished", sheet.getGmtFinished());
-                            int oldProIns = leaveSheetMapper.selectCount(queryWrapper);
-                            if (oldProIns > 0) {
-                                leaveSheetMapper.delete(queryWrapper);
-                            }
-                            int cnt = leaveSheetMapper.selectCount(new QueryWrapper<LeaveSheet>().eq("owner_id", user.getId())
-                                    .eq("start_date", sheet.getStartDate())
-                                    .eq("end_date", sheet.getEndDate()));
-                            if (cnt == 0) {
-                                leaveSheetMapper.insert(sheet);
                             }
                         }
                     }

+ 28 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -1325,7 +1325,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     //导出查询者所在公司每个项目的工时成本,包括项目人员明细统计
     @Override
-    public HttpRespMsg exportTimeCost(String exportContent,String startDate, String endDate,Integer projectId, String userIds, Boolean projectSum,Integer type,Integer deptId, Integer stateKey,HttpServletRequest request) {
+    public HttpRespMsg exportTimeCost(String exportContent,String startDate, String endDate,Integer projectId, String userIds,
+                                        Boolean projectSum,Integer type,Integer deptId, Integer stateKey, Integer withPercent, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             User targetUser = userMapper.selectById(request.getHeader("Token"));
@@ -1583,6 +1584,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 headListOne.add("项目编号");
                 projectCodes.forEach(pn->{
                     headListOne.add(String.valueOf(pn));
+                    if ("hoursAndCost".equals(exportContent)) {
+                        //两个
+                        headListOne.add(String.valueOf(pn));
+                    }
+                    if (withPercent == 1) {
+                        //工时占比,多一个编码
+                        headListOne.add(String.valueOf(pn));
+                    }
                 });
                 List<String> headListTwo = new ArrayList<String>();
                 //headList.add("人员");
@@ -1605,6 +1614,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             headListTwo.add(String.valueOf(pn)+"/"+MessageUtils.message("entry.cost"));
                         }
                     }
+                    if (withPercent == 1) {
+                        //工时占比
+                        headListTwo.add(String.valueOf(pn)+"/工时占比");
+                    }
                 });
                 if ("hours".equals(exportContent) && functionTimeList.size()>0){
                     //headList.add("合计/工时");
@@ -1649,6 +1662,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             membRowData.add("");
                         }
                     }
+                    //计算当前这个员工的总工时
+                    double curUserTotalTime = 0;
+                    for (Map<String, Object> map : mapList) {
+                        curUserTotalTime += (Double)map.get("cost");
+                    }
                     for(Object i:projectIds){
                         List<Map<String, Object>> resultList = mapList.stream().filter(mp -> mp.get("projectId").equals(i)).collect(Collectors.toList());
                         if(resultList.size()>0){
@@ -1664,7 +1682,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     membRowData.add(String.valueOf(resultList.get(0).get("costMoney")));
                                 }
                             }
-
+                            if (withPercent == 1) {
+                                //工时占比
+                                membRowData.add(String.valueOf(new BigDecimal((Double)resultList.get(0).get("cost")/curUserTotalTime*100).setScale(1, BigDecimal.ROUND_HALF_UP))+"%");
+                            }
                             costTime += (Double)resultList.get(0).get("cost");
                             moneyCost = moneyCost.add((BigDecimal)resultList.get(0).get("costMoney"));
                         }else{
@@ -1680,9 +1701,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     membRowData.add("");
                                 }
                             }
-
+                            if (withPercent == 1) {
+                                //工时占比
+                                membRowData.add("");
+                            }
                         }
                     }
+
                     if ("hours".equals(exportContent) && functionTimeList.size()>0){
                         membRowData.add(""+new BigDecimal(costTime).setScale(1, BigDecimal.ROUND_HALF_UP));
                     }else if ("cost".equals(exportContent) && functionCostList.size()>0){

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -235,7 +235,7 @@ public class TimingTask {
                 for (int i=0;i<dingdingList.size(); i++) {
                     System.out.println("钉钉公司:"+dingdingList.get(i).getCorpName());
                     long t1 = System.currentTimeMillis();
-                    dingDingService.syncUserWorkData(dingdingList.get(i), null, startDate, endDate, false);
+                    dingDingService.syncUserWorkData(dingdingList.get(i), null, startDate, endDate, false, false);
                     long t2 = System.currentTimeMillis();
                     System.out.println("同步 "+dingdingList.get(i).getCorpName()+", 总共耗时:"+(t2-t1)+"ms");
                 }

+ 3 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application-privatelew.yml

@@ -53,7 +53,7 @@ logging:
     org.springframework.web: error
     #打印sql语句
     com.management.platform.mapper: error
-  path: /log/
+  path: D://www/webapps/workshop-lew/
   file: workshop.log
 ##########
 mybatis-plus:
@@ -80,7 +80,7 @@ mybatis:
   mapper-locations: mappers/*Mapper.xml
 #####配置图片上传路径####
 upload:
-  path: /www/staticproject/workshop_pc/upload/
+  path: D://www/staticproject/workshop_pc/upload/
 
 #私有化的企业微信corpId
 corpId: wwf295c4f04cba0076
@@ -104,6 +104,7 @@ referer:
     - localhost
     - 192.168.1.218
     - 101.132.166.205
+    - 180.101.231.202
     - workshop.njlew.com.cn
     - mobworkshop.njlew.com.cn
     - workshop.njlew.com.cn:16080

+ 9 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -109,7 +109,6 @@
                         <el-option label="仅成本" value="cost"></el-option>
                     </el-select>
                 </el-form-item>
-
                 <el-form-item :label="$t('departmentchoice')" v-if="radio == $t('other.project')">
                     <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="exportParam.deptId" :options="departmentList" :placeholder="$t('defaultText.pleaseChoose')"
                         :props="{ checkStrictly: true, expandTrigger: 'hover' }" clearable filterable style="width:350px;"
@@ -181,10 +180,13 @@
                         </el-popover>
                     </div>
                 </el-form-item>
+                <el-form-item v-if="exportParam.type == 1 && permissions.countHours && (radio == $t('other.project'))">
+                    <el-checkbox v-model="exportParam.withPercent" >含项目工时占比</el-checkbox>
+                </el-form-item>
                 <el-form-item v-if="(radio == $t('other.project') || radio == $t('projectclassification')) && exportParam.type == '0'">
                     <el-checkbox v-model="exportParam.projectSum" >{{ $t('individualprojectdata') }}</el-checkbox>
                 </el-form-item>
-
+                
             </el-form>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" @click="exportProjectData" style="width:100%;" >{{ $t('export.export') }}</el-button>
@@ -221,7 +223,7 @@
                 hasReportUserList:[],
                 projectList:[],
                 categoryList: [],
-                exportParam:{projectId:null,dateRange:[],userId: null,type: '0'},
+                exportParam:{projectId:null,dateRange:[],userId: null,type: '0', withPercent: false},
                 exportDialog:false,
                 dateRange:[],
                 user: JSON.parse(sessionStorage.getItem("user")),
@@ -366,6 +368,10 @@
                         })
                         param.userIds = ids.substring(0,ids.length-1);
                      }
+                     //是否含工时占比显示
+                     if (this.exportParam.withPercent) {
+                        param.withPercent = 1;
+                     }
                  }
                  if (this.radio == this.$t('ren-yuan') ) {
                     //  console.log(this.exportParam.userIds);