浏览代码

修复月度工时的补足功能

seyason 2 年之前
父节点
当前提交
1ca47ec7b6

+ 5 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -1053,7 +1053,11 @@ public class WeiXinCorpController {
                                 //成功获取到通讯录的个人详情
                                 JSONArray department = userObj.getJSONArray("department");
                                 curUserWXDeptid = getMaxDeptIdFromArray(department);
-                                Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
+                                List<Department> departments = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
+                                Department sysDept = null;
+                                if (departments.size() > 0) {
+                                    sysDept = departments.get(0);
+                                }
 
                                 User user = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", openUserId));
                                 if (user != null) {

+ 0 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -238,10 +238,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             } else {
                 if (!sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部项目")) {
                     //只能看本人相关的项目
-                    System.out.println("只看本人相关的项目");
                     httpRespMsg.data = projectMapper.getParticipatedProject(user.getId(), user.getCompanyId());
                 } else {
-                    System.out.println("查看全部项目");
                     //有权限的看全部的
                     httpRespMsg.data = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()).orderByDesc("is_public").orderByAsc("id"));
                 }

+ 119 - 88
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -5755,122 +5755,153 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Override
     public HttpRespMsg fillWorkingHours(String yearMonth, MonthWorkingTimeVO monthVO, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
+
         //需要补的时间
-        double fillTime = monthVO.getStandardHours() - monthVO.getWorkingTime() - monthVO.getLeaveTime();
         User user = userMapper.selectById(monthVO.getUserId());
         TimeType timeType = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", user.getCompanyId()));
-        yearMonth = yearMonth;
         LocalDate time = LocalDate.parse(yearMonth, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDate now = LocalDate.now();
         LocalDate startDate = time.with(TemporalAdjusters.firstDayOfMonth());
         LocalDate endDate = time.with(TemporalAdjusters.lastDayOfMonth());
+        if (endDate.isAfter(now)) {
+            endDate = now;
+        }
         if (monthVO.getWhether()!=0){
             return msg;
         }
         //查询该员工所有日报
-        List<HashMap<String, Object>> reportList = reportMapper.selectFill(monthVO.getUserId(), startDate, endDate);
-        List<String> projectId = reportList.stream().map(r -> r.get("projectId").toString()).distinct().collect(Collectors.toList());
-        if (projectId.size() == 0){
+        List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", user.getId()).between("create_date", startDate, endDate));
+        List<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
+        if (projectIds.size() == 0){
             return msg;
         }
         //获取该公司上班和下班时间
-        List<Map<String, Object>> startAndEndTime = reportMapper.selectMaps(new QueryWrapper<Report>().select("min(start_time) startTime", "max(end_time) endTime").eq("company_id", user.getCompanyId()));
-        String workStartTime = "";
-        String workEndTime = "";
-        if (startAndEndTime.size() != 0){
-            Map<String, Object> startAndEndTimeMap = startAndEndTime.get(0);
-            workStartTime = startAndEndTimeMap.get("startTime")==null?"":startAndEndTimeMap.get("startTime").toString();
-            workEndTime = startAndEndTimeMap.get("endTime")==null?"":startAndEndTimeMap.get("endTime").toString();
-        }
-        List<TimeAutoExclude> timeAutoExclude = timeAutoExcludeMapper.selectList(new QueryWrapper<TimeAutoExclude>().eq("company_id", user.getCompanyId()));
+//        List<Map<String, Object>> startAndEndTime = reportMapper.selectMaps(new QueryWrapper<Report>().select("min(start_time) startTime", "max(end_time) endTime").eq("company_id", user.getCompanyId()));
+//        String workStartTime = "";
+//        String workEndTime = "";
+//        if (startAndEndTime.size() != 0){
+//            Map<String, Object> startAndEndTimeMap = startAndEndTime.get(0);
+//            workStartTime = startAndEndTimeMap.get("startTime")==null?"":startAndEndTimeMap.get("startTime").toString();
+//            workEndTime = startAndEndTimeMap.get("endTime")==null?"":startAndEndTimeMap.get("endTime").toString();
+//        }
+//        List<TimeAutoExclude> timeAutoExclude = timeAutoExcludeMapper.selectList(new QueryWrapper<TimeAutoExclude>().eq("company_id", user.getCompanyId()));
         //遍历工作日
         ArrayList<Report> reports = new ArrayList<>();
-        for (LocalDate i = startDate; i.isEqual(endDate) || i.isBefore(endDate); i = i.plusDays(1)) {
+        for (LocalDate i = startDate; !i.isAfter(endDate); i = i.plusDays(1)) {
+            //跳过离职日期以后的日期
+            if (user.getIsActive() == 0 && i.isAfter(user.getInactiveDate())){
+                continue;
+            }
             Boolean workDay = timeTypeService.isWorkDay(user.getCompanyId(), i);
             if (workDay){
                 Double workTime = 0.0;
                 //添加该日日报进入集合
-                ArrayList<HashMap<String, Object>> report = new ArrayList<>();
-                for (HashMap<String, Object> map : reportList) {
-                    if(map.get("createDate").toString().equals(i.toString())){
+                ArrayList<Report> report = new ArrayList<>();
+                for (Report map : reportList) {
+                    if(map.getCreateDate().toString().equals(i.toString())){
                         report.add(map);
-                        workTime += Double.parseDouble(map.get("workingTime").toString());
+                        workTime += map.getWorkingTime();
                     }
                 }
-                //如果该日工作时长没有填满
-                if (workTime < monthVO.getAllday()){
+                //如果该日工作时长没有填满,考虑误差,workTime值为7.99, 和8.0相比,差值为0.01,所以用0.01来判断
+                if (workTime < monthVO.getAllday() - 0.01){
                     //改日可补时长
                     Double fillHour = monthVO.getAllday() - workTime;
-                    Report reportItem = new Report();
-                    reportItem.setCreatorId(user.getId());
-                    reportItem.setProjectId(Integer.valueOf(projectId.get(0)));
-                    reportItem.setCreateDate(i);
-                    reportItem.setCreateTime(LocalDateTime.now());
-                    reportItem.setContent("该工时为自动补全的工时");
-                    reportItem.setState(1);
-                    reportItem.setTimeType(0);
-                    reportItem.setIsOvertime(0);
-                    reportItem.setDepartmentAuditState(-1);
-                    reportItem.setDegreeId(-1);
-                    reportItem.setCompanyId(user.getCompanyId());
-                    reportItem.setProjectAuditorId(request.getHeader("token"));
-                    reportItem.setDeptId(user.getDepartmentId());
-                    reportItem.setReportTimeType(timeType.getType());
-                    if (workTime == 0){
-                        reportItem.setWorkingTime(monthVO.getAllday());
-                        if (reportItem.getReportTimeType().equals(2)){
-                            reportItem.setStartTime(workStartTime);
-                            reportItem.setEndTime(workEndTime);
-                        }
-                    }else {
-                        if (reportItem.getReportTimeType().equals(2)){
-                            //获取日报的最小开始时间和最大结束时间
-                            List<String> endTime = report.stream().map(m -> m.get("endTime")==null?"12:00":m.get("endTime").toString()).collect(Collectors.toList());
-                            String eTime = endTime.get(0);
-                            for (String s : endTime) {
-                                if (s.compareTo(eTime) < 0){
-                                    eTime = s;
-                                }
-                            }
-                            reportItem.setStartTime(eTime);
-                            reportItem.setEndTime("23:50");
-                        }else {
-                            reportItem.setWorkingTime(fillHour);
+                    //将fillHour平均分配到每个项目
+                    Double fillHourPerProject = fillHour / projectIds.size();
+                    //遍历项目
+                    double sumHours = 0;
+                    for (int pIndex = 0; pIndex<projectIds.size(); pIndex++) {
+                        //最后一个了,就把剩下的时长给他
+                        if (pIndex == projectIds.size() - 1) {
+                            fillHourPerProject = fillHour - sumHours;
+                        } else {
+                            sumHours += fillHourPerProject;
                         }
 
-                        if (reportItem.getReportTimeType() == 2){
-                            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
-                            try {
-                                long t = sdf.parse(reportItem.getEndTime()).getTime() - sdf.parse(reportItem.getStartTime()).getTime();
-                                int excludeTime = 0;
-                                if (timeAutoExclude.size() > 0) {
-                                    for (TimeAutoExclude exclude : timeAutoExclude) {
-                                        if (!(exclude.getEndTime().compareTo(reportItem.getStartTime()) < 0 || exclude.getStartTime().compareTo(reportItem.getEndTime()) > 0)) {
-                                            //有交叉的情况,结束时间取较早的,开始时间取较晚的
-                                            String mEndTime = exclude.getEndTime().compareTo(reportItem.getEndTime()) <0 ? exclude.getEndTime() : reportItem.getEndTime();
-                                            String mStartTime = exclude.getStartTime().compareTo(reportItem.getStartTime()) > 0 ? exclude.getStartTime() : reportItem.getStartTime();
-                                            //落在休息时间范围内,需要计算去掉的时间
-                                            long subtractTime = sdf.parse(mEndTime).getTime() - sdf.parse(mStartTime).getTime();
-                                            excludeTime += subtractTime;
-                                        }
-                                    }
-                                }
-                                if (excludeTime > 0) {
-                                    t -= excludeTime;//去掉休息时间
-                                }
-
-                                int minutes = (int)t/1000/60;
-                                double hours = minutes*1.0f/60;
-                                reportItem.setWorkingTime(hours);
-                            }catch (ParseException e) {
-                                e.printStackTrace();
-                            }
+                        Report reportItem = new Report();
+                        reportItem.setWorkingTime(fillHourPerProject);
+                        reportItem.setCost(user.getCost().multiply(new BigDecimal(fillHourPerProject)));
+                        reportItem.setCreatorId(user.getId());
+                        reportItem.setProjectId(projectIds.get(pIndex));
+                        reportItem.setCreateDate(i);
+                        reportItem.setCreateTime(LocalDateTime.now());
+                        if (timeType.getType() == 2 && timeType.getMultiWorktime() == 1) {
+                            //一个项目下填报多个时间段的模式,content里面是Json数组
+                            reportItem.setContent("[]");
+                        } else {
+                            reportItem.setContent("该工时为自动补全的工时");
                         }
+
+                        reportItem.setState(1);
+                        reportItem.setTimeType(0);
+                        reportItem.setIsOvertime(0);
+                        reportItem.setDepartmentAuditState(-1);
+                        reportItem.setDegreeId(-1);
+                        reportItem.setCompanyId(user.getCompanyId());
+                        reportItem.setProjectAuditorId(request.getHeader("token"));
+                        reportItem.setDeptId(user.getDepartmentId());
+                        reportItem.setReportTimeType(timeType.getType());
+                        reports.add(reportItem);
                     }
-                    reports.add(reportItem);
-                    fillTime -= reportItem.getWorkingTime();
-                    if(fillTime < 0){
-                        break;
-                    }
+
+
+//                    if (workTime == 0){
+//                        reportItem.setWorkingTime(monthVO.getAllday());
+//                        if (reportItem.getReportTimeType().equals(2)){
+//                            reportItem.setStartTime(workStartTime);
+//                            reportItem.setEndTime(workEndTime);
+//                        }
+//                    }else {
+//                        if (reportItem.getReportTimeType().equals(2)){
+//                            //获取日报的最小开始时间和最大结束时间
+//                            List<String> endTime = report.stream().map(m -> m.get("endTime")==null?"12:00":m.get("endTime").toString()).collect(Collectors.toList());
+//                            String eTime = endTime.get(0);
+//                            for (String s : endTime) {
+//                                if (s.compareTo(eTime) < 0){
+//                                    eTime = s;
+//                                }
+//                            }
+//                            reportItem.setStartTime(eTime);
+//                            reportItem.setEndTime("23:50");
+//                        }else {
+//                            reportItem.setWorkingTime(fillHour);
+//                        }
+//
+//                        if (reportItem.getReportTimeType() == 2){
+//                            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+//                            try {
+//                                long t = sdf.parse(reportItem.getEndTime()).getTime() - sdf.parse(reportItem.getStartTime()).getTime();
+//                                int excludeTime = 0;
+//                                if (timeAutoExclude.size() > 0) {
+//                                    for (TimeAutoExclude exclude : timeAutoExclude) {
+//                                        if (!(exclude.getEndTime().compareTo(reportItem.getStartTime()) < 0 || exclude.getStartTime().compareTo(reportItem.getEndTime()) > 0)) {
+//                                            //有交叉的情况,结束时间取较早的,开始时间取较晚的
+//                                            String mEndTime = exclude.getEndTime().compareTo(reportItem.getEndTime()) <0 ? exclude.getEndTime() : reportItem.getEndTime();
+//                                            String mStartTime = exclude.getStartTime().compareTo(reportItem.getStartTime()) > 0 ? exclude.getStartTime() : reportItem.getStartTime();
+//                                            //落在休息时间范围内,需要计算去掉的时间
+//                                            long subtractTime = sdf.parse(mEndTime).getTime() - sdf.parse(mStartTime).getTime();
+//                                            excludeTime += subtractTime;
+//                                        }
+//                                    }
+//                                }
+//                                if (excludeTime > 0) {
+//                                    t -= excludeTime;//去掉休息时间
+//                                }
+//
+//                                int minutes = (int)t/1000/60;
+//                                double hours = minutes*1.0f/60;
+//                                reportItem.setWorkingTime(hours);
+//                            }catch (ParseException e) {
+//                                e.printStackTrace();
+//                            }
+//                        }
+//                    }
+//                    reports.add(reportItem);
+//                    fillTime -= reportItem.getWorkingTime();
+//                    if(fillTime < 0){
+//                        break;
+//                    }
                 }
             }
         }

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -212,6 +212,8 @@ const StringUtil = {
         arr[i] == '日报导出' ? obj.reportExport = true : ''
         arr[i] == '手动推送工时' ? obj.reportPush = true : ''
         arr[i] == '查看全公司数值' ? obj.customDataAll = true : ''
+        arr[i] == '查看全公司' ? obj.viewAllSummary = true : ''
+        arr[i] == '查看负责部门' ? obj.viewMagDeptSummary = true : ''
         arr[i] == '删除出差' ? obj.awayOfficeDelete = true : ''
         arr[i] == '全部人员月度工时表' ? obj.reportMonthlyPersonnel = true : ''
         arr[i] == '负责部门月度工时表' ? obj.reportResponsiblePersonnel = true : ''

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

@@ -774,7 +774,7 @@
                     <div>
                       <el-button
                       type="primary" 
-                      v-if="scope.row.whether == 0"
+                      v-if="scope.row.whether == 0 && scope.row.workingTime > 0"
                       size="mini"
                       @click="fillWorkingHours(scope.row)">补足工时</el-button>
                     </div>