Kaynağa Gözat

泓浒月度工时表修改,美莱德甘特图计划日期范围问题修复

QuYueTing 3 hafta önce
ebeveyn
işleme
9823938f3c

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform-mld/src/main/resources/mapper/ProjectMapper.xml

@@ -754,7 +754,7 @@
         <foreach collection="userIds" close=")" open="(" separator="," index="" item="item">
             #{item}
         </foreach>
-        and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
+        and ((IFNULL(task.start_date , task.end_date) &lt;= #{endDate}) and (task.end_date &gt;= #{startDate}))
         and task.end_date is not null
         AND (project.`status` = 1 or project.`status` is null)
         <if test="deptId !=null">
@@ -805,7 +805,7 @@
             and exists(select 1 from task_executor where task.id=task_executor.task_id
                          and task_executor.executor_id in <foreach collection="userIds" close=")" open="(" separator="," index="" item="item">#{item}</foreach>)
         </if>
-        and ((IFNULL(task.start_date , task.end_date) between #{startDate} and #{endDate}) or (task.end_date between #{startDate} and #{endDate}))
+        and ((IFNULL(task.start_date , task.end_date) &lt;= #{endDate}) and (task.end_date &gt;= #{startDate}))
         and task.end_date is not null
         AND project.`status` = 1
         ORDER BY project.id, task.start_date

+ 107 - 50
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceMonthlyWorktimeServiceImpl.java

@@ -223,6 +223,7 @@ public class FinanceMonthlyWorktimeServiceImpl extends ServiceImpl<FinanceMonthl
                     fmwDetail.setAssistTime(0.00);
                     fmwDetail.setBustripTime(0.00);
                     fmwDetail.setCleanTime(0.00);
+                    fmwDetail.setPublicTime(0.00);
 
                     fmwDetail.setFmwId(financeMonthlyWorktime.getId());
                     fmwDetail.setProjectId(report.getProjectId());
@@ -231,6 +232,8 @@ public class FinanceMonthlyWorktimeServiceImpl extends ServiceImpl<FinanceMonthl
                     });
                     fmwDetail.setExtraField4(report.getExtraField4());
                     fmwDetail.setExtraField5(report.getExtraField5());
+                    System.out.println("fmwDetail.setDeptId部门Id="+report.getDeptId());
+                    //注意: 仅为工单工时的时候,该部门准确
                     fmwDetail.setDeptId(report.getDeptId());
                     departmentList.stream().filter(d->d.getDepartmentId().equals(report.getDeptId())).findFirst().ifPresent(d->{
                         fmwDetail.setDeptCode(d.getDeptCode());
@@ -255,8 +258,11 @@ public class FinanceMonthlyWorktimeServiceImpl extends ServiceImpl<FinanceMonthl
             if (!publicProjectIds.isEmpty()) {
                 // 查询公共项目工时
                 //TODO: 需确认,员工填报公共项目工时的时候,会选择到工单吗?
+                //研发中心的公共工时不参与分摊; deptId=9508
+                int reserveDeptId = 9508;
                 List<Report> publicReportList = reportMapper.selectList(
                         new LambdaQueryWrapper<Report>().select(Report::getCreatorId, Report::getDeptId, Report::getWorkingTime).eq(Report::getState, 1)
+                                .ne(Report::getDeptId, reserveDeptId)
                                 .in(Report::getProjectId, publicProjectIds).between(Report::getCreateDate, firstDayOfMonth, lastDayOfMonth));
                 //按照人员所在的部门进行分组,汇总,如果公共项目没有工单,此步骤可以省略
                 publicReportList.forEach(report -> {
@@ -278,64 +284,115 @@ public class FinanceMonthlyWorktimeServiceImpl extends ServiceImpl<FinanceMonthl
                         .collect(Collectors.toList());
                 if (!publicReportList.isEmpty()) {
                     //处理每个部门的公共项目工时分摊
+                    //三大中心:北京,上海,武汉需按照本部门人填报的全部工时(不区分是否是协作工时),按部门分组
+                    List<Integer> threeCenterIds = new ArrayList<>(Arrays.asList(9508, 9509, 9510));
                     for (Report publicReportDeptItem : publicReportList) {
                         Integer deptId = publicReportDeptItem.getDeptId();
-                        List<FmwDetail> deptAllReportList = insertDataList.stream().filter(r -> r.getDeptId().equals(deptId)).collect(Collectors.toList());
-                        double totalDeptTime = deptAllReportList.stream().reduce(0.0, (a, b) -> a + b.getComposeTime() + b.getRepairTime() + b.getDebugTime() + b.getWaitingTime(), Double::sum);
-                        System.out.println("处理公共工时分摊,总工时=="+totalDeptTime);
-                        if (totalDeptTime > 0) {
-                            //计算总工时: 用维修组装工时,调试工时和等料工时相加
-                            insertDataList.forEach(fmwDetail -> {
-                                //计算每一个项目的部门内部工时占比,按比例分摊公共工时
-                                if (fmwDetail.getDeptId().equals(deptId)) {
-                                    double curProjectTime = fmwDetail.getComposeTime() + fmwDetail.getRepairTime() + fmwDetail.getDebugTime() + fmwDetail.getWaitingTime();
-                                    double assignTime = curProjectTime / totalDeptTime * publicReportDeptItem.getWorkingTime();
-                                    //理论上不会出现fmwDetail.getPublicTime()有值的情况,但是为了保险起见做个叠加计算吧
-                                    fmwDetail.setPublicTime(fmwDetail.getPublicTime() == null ? assignTime : fmwDetail.getPublicTime() + assignTime);
-                                }
-                            });
-                        } else {
-                            //该部门没有部门内部工时,按照填报部门找协作工时
-                            // 查找该部门的员工都协作了哪些部门
+                        System.out.println("处理公共工时分摊,待分配部门=="+deptId);
+                        if (threeCenterIds.contains(deptId)) {
+                            //处理三大中心的公共工时分摊
                             List<User> deptUserList = userList.stream().filter(u -> u.getDepartmentId().equals(deptId)).collect(Collectors.toList());
                             List<String> deptUserIds = deptUserList.stream().map(User::getId).collect(Collectors.toList());
-                            List<Report> assistDeptListByUser = reportMapper.selectList(new QueryWrapper<Report>().select("dept_id, sum(working_time) working_time").eq("is_assist", 1)
-                                    .in("creator_id", deptUserIds).between("create_date", firstDayOfMonth, lastDayOfMonth).groupBy("dept_id"));
-                            //按协作的工时占比来分配
-                            if (!assistDeptListByUser.isEmpty()) {
-                                double totalAssistTime = assistDeptListByUser.stream().mapToDouble(Report::getWorkingTime).sum();
-                                if (totalAssistTime > 0) {
-                                    for (Report assistDeptItem : assistDeptListByUser) {
-                                        //处理部门公共工时的分摊,先按协作的其他部门的占比,分到其他部门
-                                        double curAssistTime = assistDeptItem.getWorkingTime();
-                                        double assignToDeptTime = curAssistTime / totalAssistTime * publicReportDeptItem.getWorkingTime();
-                                        //按目标部门的部门内部工时占比进行二次分配
-                                        Integer assignToDeptId = assistDeptItem.getDeptId();
-                                        List<FmwDetail> targetDeptReportList = insertDataList.stream().filter(r -> r.getDeptId().equals(assignToDeptId)).collect(Collectors.toList());
-                                        double totalTargetDeptTime = targetDeptReportList.stream().reduce(0.0, (a, b) -> a + b.getComposeTime() + b.getRepairTime() + b.getDebugTime() + b.getWaitingTime(), Double::sum);
-                                        if (totalTargetDeptTime > 0) {
-                                            //计算总工时: 用维修组装工时,调试工时和等料工时相加
-                                            insertDataList.forEach(fmwDetail -> {
-                                                //计算每一个项目的部门内部工时占比,按比例分摊公共工时
-                                                if (fmwDetail.getDeptId().equals(assignToDeptId)) {
-                                                    double curProjectTime = fmwDetail.getComposeTime() + fmwDetail.getRepairTime() + fmwDetail.getDebugTime() + fmwDetail.getWaitingTime();
-                                                    double assignTime = curProjectTime / totalTargetDeptTime * assignToDeptTime;
-                                                    //可能之前已经有其他部门的分摊过来了,需要叠加
-                                                    fmwDetail.setPublicTime(fmwDetail.getPublicTime() == null ? assignTime : fmwDetail.getPublicTime() +assignTime);
-                                                }
-                                            });
-                                        } else {
-                                            Department dept = departmentMapper.selectById(assignToDeptId);
-                                            throw new Exception("存在目标部门没有内部工时,导致公共工时无法分摊:部门=="+dept.getDepartmentName()+",deptId=="+assignToDeptId);
-                                        }
+                            List<Report> deptUserReportGroupList = reportMapper.selectList(new QueryWrapper<Report>().select("project_id,extra_field4,extra_field5,dept_id, sum(working_time) working_time")
+                                    .in("creator_id", deptUserIds).between("create_date", firstDayOfMonth, lastDayOfMonth).isNotNull("extra_field4").ne("extra_field4", "")
+                                    .groupBy("project_id,extra_field4,extra_field5"));
+                            double totalTime = deptUserReportGroupList.stream().mapToDouble(Report::getWorkingTime).sum();
+                            System.out.println("处理公共工时分摊,总工时=="+totalTime);
+                            if (totalTime > 0) {
+                                //处理部门公共工时的分摊,先按协作的其他部门的占比,分到其他部门
+                                for (Report assistDeptItem : deptUserReportGroupList) {
+                                    double curDeptTime = assistDeptItem.getWorkingTime();
+                                    double assignToDeptTime = curDeptTime / totalTime * publicReportDeptItem.getWorkingTime();
+                                    Optional<FmwDetail> fmwDetailOp = insertDataList.stream().filter(fmwDetail -> fmwDetail.getProjectId().equals(assistDeptItem.getProjectId())
+                                            && fmwDetail.getExtraField4().equals(assistDeptItem.getExtraField4()) && fmwDetail.getExtraField5().equals(assistDeptItem.getExtraField5())).findFirst();
+                                    if (fmwDetailOp.isPresent()) {
+                                        fmwDetailOp.get().setPublicTime(fmwDetailOp.get().getPublicTime() + assignToDeptTime);
+                                    } else {
+                                        throw new Exception("三大中心公共工时分摊失败: deptId="+deptId+", projectId="+assistDeptItem.getProjectId()+", extraField4="+assistDeptItem.getExtraField4()+", extraField5="+assistDeptItem.getExtraField5()+",未找到该项目工单统计数据");
+                                    }
+                                }
+                            }
+                        } else {
+                            //处理非三大中心的公共工时分摊,按本部门的工单工时来统计
+                            List<Report> deptUserReportGroupList = reportMapper.selectList(new QueryWrapper<Report>().select("project_id,extra_field4,extra_field5,dept_id, sum(working_time) working_time")
+                                    .eq("dept_id", deptId).between("create_date", firstDayOfMonth, lastDayOfMonth).isNotNull("extra_field4").ne("extra_field4", "")
+                                    .eq("is_assist", 0)
+                                    .groupBy("project_id,extra_field4,extra_field5"));
+                            double totalTime = deptUserReportGroupList.stream().mapToDouble(Report::getWorkingTime).sum();
+                            System.out.println("处理非三大中心公共工时分摊,总工时=="+totalTime);
+                            if (totalTime > 0) {
+                                //处理部门公共工时的分摊,先按协作的其他部门的占比,分到其他部门
+                                for (Report assistDeptItem : deptUserReportGroupList) {
+                                    double curDeptTime = assistDeptItem.getWorkingTime();
+                                    double assignToDeptTime = curDeptTime / totalTime * publicReportDeptItem.getWorkingTime();
+                                    Optional<FmwDetail> fmwDetailOp = insertDataList.stream().filter(fmwDetail -> fmwDetail.getProjectId().equals(assistDeptItem.getProjectId())
+                                            && fmwDetail.getExtraField4().equals(assistDeptItem.getExtraField4()) && fmwDetail.getExtraField5().equals(assistDeptItem.getExtraField5())).findFirst();
+                                    if (fmwDetailOp.isPresent()) {
+                                        fmwDetailOp.get().setPublicTime(fmwDetailOp.get().getPublicTime() + assignToDeptTime);
+                                    } else {
+                                        throw new Exception("部门公共工时分摊失败: deptId="+deptId+", projectId="+assistDeptItem.getProjectId()+", extraField4="+assistDeptItem.getExtraField4()+", extraField5="+assistDeptItem.getExtraField5()+",未找到该项目工单统计数据");
                                     }
                                 }
-                            } else {
-                                //本部门也没有协作其他部门产生工单工时
-                                Department dept = departmentMapper.selectById(deptId);
-                                throw new Exception("公共工时无法分配,因为本部门没有协作其他部门产生工单工时,部门=="+dept.getDepartmentName()+",deptId=="+deptId);
                             }
                         }
+
+//                        List<FmwDetail> deptAllReportList = insertDataList.stream().filter(r -> r.getDeptId().equals(deptId)).collect(Collectors.toList());
+//                        final double totalDeptTime = threeCenterIds.contains(deptId)?deptAllReportList.stream().reduce(0.0, (a, b) -> a + b.getComposeTime() + b.getRepairTime() + b.getDebugTime() + b.getWaitingTime() + b.getAssistTime(), Double::sum)
+//                                : deptAllReportList.stream().reduce(0.0, (a, b) -> a + b.getComposeTime() + b.getRepairTime() + b.getDebugTime() + b.getWaitingTime(), Double::sum);
+//                        System.out.println("处理公共工时分摊,总工时=="+totalDeptTime);
+//                        if (totalDeptTime > 0) {
+//                            //计算总工时: 用维修组装工时,调试工时和等料工时相加
+//                            insertDataList.forEach(fmwDetail -> {
+//                                //计算每一个项目的部门内部工时占比,按比例分摊公共工时
+//                                if (fmwDetail.getDeptId().equals(deptId)) {
+//                                    double curProjectTime = fmwDetail.getComposeTime() + fmwDetail.getRepairTime() + fmwDetail.getDebugTime() + fmwDetail.getWaitingTime();
+//                                    double assignTime = curProjectTime / totalDeptTime * publicReportDeptItem.getWorkingTime();
+//                                    //理论上不会出现fmwDetail.getPublicTime()有值的情况,但是为了保险起见做个叠加计算吧
+//                                    fmwDetail.setPublicTime(fmwDetail.getPublicTime() == null ? assignTime : fmwDetail.getPublicTime() + assignTime);
+//                                }
+//                            });
+//                        } else {
+//                            //该部门没有部门内部工时,按照填报部门找协作工时
+//                            // 查找该部门的员工都协作了哪些部门
+//                            List<User> deptUserList = userList.stream().filter(u -> u.getDepartmentId().equals(deptId)).collect(Collectors.toList());
+//                            List<String> deptUserIds = deptUserList.stream().map(User::getId).collect(Collectors.toList());
+//                            List<Report> assistDeptListByUser = reportMapper.selectList(new QueryWrapper<Report>().select("dept_id, sum(working_time) working_time").eq("is_assist", 1)
+//                                    .in("creator_id", deptUserIds).between("create_date", firstDayOfMonth, lastDayOfMonth).groupBy("dept_id"));
+//                            //按协作的工时占比来分配
+//                            if (!assistDeptListByUser.isEmpty()) {
+//                                double totalAssistTime = assistDeptListByUser.stream().mapToDouble(Report::getWorkingTime).sum();
+//                                if (totalAssistTime > 0) {
+//                                    for (Report assistDeptItem : assistDeptListByUser) {
+//                                        //处理部门公共工时的分摊,先按协作的其他部门的占比,分到其他部门
+//                                        double curAssistTime = assistDeptItem.getWorkingTime();
+//                                        double assignToDeptTime = curAssistTime / totalAssistTime * publicReportDeptItem.getWorkingTime();
+//                                        //按目标部门的部门内部工时占比进行二次分配
+//                                        Integer assignToDeptId = assistDeptItem.getDeptId();
+//                                        List<FmwDetail> targetDeptReportList = insertDataList.stream().filter(r -> r.getDeptId().equals(assignToDeptId)).collect(Collectors.toList());
+//                                        double totalTargetDeptTime = targetDeptReportList.stream().reduce(0.0, (a, b) -> a + b.getComposeTime() + b.getRepairTime() + b.getDebugTime() + b.getWaitingTime(), Double::sum);
+//                                        if (totalTargetDeptTime > 0) {
+//                                            //计算总工时: 用维修组装工时,调试工时和等料工时相加
+//                                            insertDataList.forEach(fmwDetail -> {
+//                                                //计算每一个项目的部门内部工时占比,按比例分摊公共工时
+//                                                if (fmwDetail.getDeptId().equals(assignToDeptId)) {
+//                                                    double curProjectTime = fmwDetail.getComposeTime() + fmwDetail.getRepairTime() + fmwDetail.getDebugTime() + fmwDetail.getWaitingTime();
+//                                                    double assignTime = curProjectTime / totalTargetDeptTime * assignToDeptTime;
+//                                                    //可能之前已经有其他部门的分摊过来了,需要叠加
+//                                                    fmwDetail.setPublicTime(fmwDetail.getPublicTime() == null ? assignTime : fmwDetail.getPublicTime() +assignTime);
+//                                                }
+//                                            });
+//                                        } else {
+//                                            Department dept = departmentMapper.selectById(assignToDeptId);
+//                                            throw new Exception("存在目标部门没有内部工时,导致公共工时无法分摊:部门=="+dept.getDepartmentName()+",deptId=="+assignToDeptId);
+//                                        }
+//                                    }
+//                                }
+//                            } else {
+//                                //本部门也没有协作其他部门产生工单工时
+//                                Department dept = departmentMapper.selectById(deptId);
+//                                throw new Exception("公共工时无法分配,因为本部门没有协作其他部门产生工单工时,部门=="+dept.getDepartmentName()+",deptId=="+deptId);
+//                            }
+//                        }
                     }
                 }
             }