Ver código fonte

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

Min 1 ano atrás
pai
commit
9dbda510b3
14 arquivos alterados com 259 adições e 120 exclusões
  1. 6 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java
  2. 3 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/TaskLog.java
  3. 2 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/TasKVo.java
  4. 53 47
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  5. 5 5
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml
  6. 44 38
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  7. 12 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  9. 8 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  10. 117 16
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  11. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  12. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  13. 2 0
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  14. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

+ 6 - 5
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java

@@ -6,6 +6,7 @@ import java.time.LocalDate;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 
 import lombok.Data;
@@ -130,7 +131,7 @@ public class Task extends Model<Task> {
      * 重复结束 在  ? 日期YYYY-MM-DD之后
      */
     @TableField("repeat_end_date")
-    private LocalDate repeatEndDate;
+    private Date repeatEndDate;
 
     /**
      * 自定义周期: 每 ? 天一次,保存为 x1,x2,x3,x4
@@ -166,25 +167,25 @@ public class Task extends Model<Task> {
      * 创建时间
      */
     @TableField("create_date")
-    private LocalDate createDate;
+    private Date createDate;
 
     /**
      * 截止时间
      */
     @TableField("end_date")
-    private LocalDate endDate;
+    private Date endDate;
 
     /**
      * 开始日期
      */
     @TableField("start_date")
-    private LocalDate startDate;
+    private Date startDate;
 
     /**
      * 完成日期
      */
     @TableField("finish_date")
-    private LocalDate finishDate;
+    private Date finishDate;
 
     /**
      * 是否被删除: 0否,1是

+ 3 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/TaskLog.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+import java.util.Date;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -41,7 +43,7 @@ public class TaskLog extends Model<TaskLog> {
      * 修改时间
      */
     @TableField("mod_time")
-    private LocalDateTime modTime;
+    private Date modTime;
 
     /**
      * 修改人

+ 2 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/TasKVo.java

@@ -28,7 +28,8 @@ public class TasKVo extends Task {
     private String contactsName;
     private String contactsPhone;
 
-    private List taskExecutors;
+
+    private List<String> taskExecutors;
 
 
 }

+ 53 - 47
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -121,9 +121,9 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         }
         Task task = new Task();
         BeanUtils.copyProperties(taskDto,task);
-        task.setCreateDate(LocalDate.now());//任务的创建时间
+        task.setCreateDate(new Date());//任务的创建时间
         //根据任务的开始时间与当下时间判断任务的状态
-        if (taskDto.getStartDate()==null||taskDto.getStartDate().isAfter(LocalDate.now())){
+        if (taskDto.getStartDate()==null||taskDto.getStartDate().after(new Date())){
             task.setStatus(0);
         }else {
             task.setStatus(1);
@@ -163,7 +163,6 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         taskLog.setContent("创建了任务");
         taskLog.setUserId(userId);
         taskLog.setUserName(user.getName());
-        taskLog.setModTime(LocalDateTime.now());
         taskLog.setCompanyId(user.getCompanyId());
         taskLogMapper.insert(taskLog);
 
@@ -181,18 +180,14 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         List<TaskLog> taskLogList = taskLogMapper.selectList(new LambdaQueryWrapper<TaskLog>().eq(TaskLog::getCompanyId,user.getCompanyId()));
         List<TasKVo> taskVoList =taskMapper.getPageListTask(taskDto);
         for (TasKVo tasKVo : taskVoList) {
-            System.out.println(tasKVo.getStartDate());
-            System.out.println(tasKVo.getEndDate());
-            System.out.println(tasKVo.getCreateDate());
             if (!taskExecutorList.isEmpty()){
                 List<TaskExecutor> collect = taskExecutorList.stream().
                         filter(taskExecutor -> taskExecutor.getTaskId().equals(tasKVo.getId())).
                         filter(taskExecutor -> taskExecutor.getCompanyId().equals(user.getCompanyId()))
                         .collect(Collectors.toList());
                 if (!collect.isEmpty()){
-                    List<String> collect1 = collect.stream().map(TaskExecutor::getExecutorId).collect(Collectors.toList());
-                    ArrayList<String> taskExecutorIds = new ArrayList<>(collect1);
-                    tasKVo.setTaskExecutors(taskExecutorIds);
+                    List<String> collect1 = collect.stream().map(TaskExecutor::getExecutorName).collect(Collectors.toList());
+                    tasKVo.setTaskExecutors(collect1);
                 }
             }
             if (!taskLogList.isEmpty()){
@@ -204,17 +199,6 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             }
 
         }
-        if (!taskVoList.isEmpty()){
-            taskVoList.forEach(tasKVo -> {
-                if (!tasKVo.getTaskExecutors().isEmpty()){
-                    Integer taskId = tasKVo.getId();
-                    LambdaQueryWrapper<TaskExecutor> lqw = new LambdaQueryWrapper<>();
-                    lqw.eq(TaskExecutor::getTaskId,taskId);
-                    List<TaskExecutor> taskExecutors = taskExecutorMapper.selectList(lqw);
-                    tasKVo.setTaskExecutors(taskExecutors);
-                }
-            });
-        }
         List<TasKVo> taskVoTotalList= taskMapper.getPageListTotalTask(taskDto);
         HttpRespMsg msg = new HttpRespMsg();
         HashMap<String, Object> map = new HashMap<>();
@@ -272,7 +256,6 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         taskLog.setContent("修改了任务");
         taskLog.setUserId(user.getId());
         taskLog.setUserName(user.getName());
-        taskLog.setModTime(LocalDateTime.now());
         taskLogMapper.insert(taskLog);
 
         return msg;
@@ -414,7 +397,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 Task task=new Task();
                 task.setCompanyId(companyId);
                 task.setCreaterId(user.getId());
-                task.setCreateDate(LocalDate.now());
+                task.setCreateDate(new Date());
                 for (int i = 0; i < cellNum; i++) {
                     JSONObject item = configObJSONArray.getJSONObject(i);
                     String modelName = item.getString("model");
@@ -518,7 +501,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                             if (cell.getCellTypeEnum() == CellType.NUMERIC){
                                 double numericCellValue = cell.getNumericCellValue();
                                 long daysSince1900 = (long) numericCellValue - 2;
-                                task.setStartDate(LocalDate.of(1900, 1, 1).plusDays(daysSince1900));
+                                task.setStartDate(new Date(daysSince1900));
                             }
                         }
                     }
@@ -527,7 +510,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                             if (cell.getCellTypeEnum() == CellType.NUMERIC){
                                 double numericCellValue = cell.getNumericCellValue();
                                 long daysSince1900 = (long) numericCellValue - 2;
-                                task.setEndDate(LocalDate.of(1900, 1, 1).plusDays(daysSince1900));
+                                task.setEndDate(new Date(daysSince1900));
                             }
                         }
                     }
@@ -687,7 +670,6 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                         TaskLog taskLog = new TaskLog();
                         taskLog.setTaskId(task.getId());
                         taskLog.setContent("通过文件导入任务");
-                        taskLog.setModTime(LocalDateTime.now());
                         taskLog.setUserName(user.getName());
                         taskLog.setUserId(user.getId());
                         taskLog.setCompanyId(user.getCompanyId());
@@ -721,6 +703,8 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         User user = userMapper.selectById(request.getHeader("token"));
         SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Task").eq(SysForm::getIsCurrent, 1));
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new LambdaQueryWrapper<TaskExecutor>().eq(TaskExecutor::getCompanyId,user.getCompanyId()));
+        List<TaskLog> taskLogList = taskLogMapper.selectList(new LambdaQueryWrapper<TaskLog>().eq(TaskLog::getCompanyId,user.getCompanyId()));
         String config = sysForm.getConfig();
         JSONObject configOb = JSON.parseObject(config);
         JSONArray configObJSONArray = configOb.getJSONArray("list");
@@ -736,16 +720,20 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         taskDto.setPageIndex(null).setPageSize(null);//暂时部不分页
         List<TasKVo> taskVoList =taskMapper.getPageListTask(taskDto);
         if (!taskVoList.isEmpty()){
-            taskVoList.forEach(tasKVo -> {
-                if (!tasKVo.getTaskExecutors().isEmpty()){
-                    Integer taskId = tasKVo.getId();
-                    LambdaQueryWrapper<TaskExecutor> lqw = new LambdaQueryWrapper<>();
-                    lqw.eq(TaskExecutor::getTaskId,taskId);
-                    List<TaskExecutor> taskExecutors = taskExecutorMapper.selectList(lqw);
-                    tasKVo.setTaskExecutors(taskExecutors);
+            for (TasKVo tasKVo : taskVoList) {
+                if (!taskExecutorList.isEmpty()){
+                    List<TaskExecutor> collect = taskExecutorList.stream().
+                            filter(taskExecutor -> taskExecutor.getTaskId().equals(tasKVo.getId())).
+                            filter(taskExecutor -> taskExecutor.getCompanyId().equals(user.getCompanyId()))
+                            .collect(Collectors.toList());
+                    if (!collect.isEmpty()){
+                        List<String> collect1 = collect.stream().map(TaskExecutor::getExecutorName).collect(Collectors.toList());
+                        tasKVo.setTaskExecutors(collect1);
+                    }
                 }
-            });
+            }
         }
+
         for (TasKVo tasKVo : taskVoList) {
             List<String> item=new ArrayList<>();
             for (int i = 0; i < configObJSONArray.size(); i++) {
@@ -768,33 +756,51 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 if(model.equals("taskName")){
                     value = String.valueOf(aClass.getMethod("getTaskName").invoke(tasKVo)).equals("null")?"":String.valueOf(aClass.getMethod("getTaskName").invoke(tasKVo));
                 }
-                if(model.equals("priority")){
+                else if(model.equals("priority")){
                     value = String.valueOf(aClass.getMethod("getPriority").invoke(tasKVo)).equals("null")?"":String.valueOf(aClass.getMethod("getPriority").invoke(tasKVo));
                 }
-                if(model.equals("executorId")){
+                else if(model.equals("executorId")){
                     StringJoiner stringJoiner = new StringJoiner(",");
-                    List<TaskExecutor> taskExecutors = tasKVo.getTaskExecutors();
+                    List<String> taskExecutors = tasKVo.getTaskExecutors();
                     if (taskExecutors!=null&&!taskExecutors.isEmpty()){
-                        for (TaskExecutor taskExecutor : taskExecutors) {
-                            stringJoiner.add(taskExecutor.getExecutorName());
+                        for (String taskExecutor : taskExecutors) {
+                            stringJoiner.add(taskExecutor);
                         }
                     }
                     value =stringJoiner.length()==0?"":stringJoiner.toString();
                 }
-                if(model.equals("startDate")){
+                else if(model.equals("startDate")){
                     if (tasKVo.getStartDate()!=null){
-                        LocalDate startDate = tasKVo.getStartDate();
-                        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-                        value=startDate.format(dateTimeFormatter);
+                        Date startDate = tasKVo.getStartDate();
+                        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+                        value=format.format(startDate);
                     }
                 }
-                if(model.equals("endDate")){
+                else if(model.equals("endDate")){
                     if (tasKVo.getEndDate()!=null){
-                        LocalDate endDate = tasKVo.getEndDate();
-                        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-                        value=endDate.format(dateTimeFormatter);
+                        Date endDate = tasKVo.getEndDate();
+                        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+                        value=format.format(endDate);
                     }
                 }
+                else if(model.equals("customId")){
+                    value = String.valueOf(aClass.getMethod("getCustomName").invoke(tasKVo)).equals("null")?"":String.valueOf(aClass.getMethod("getCustomName").invoke(tasKVo));
+                }
+                else if(model.equals("businessOpportunityId")){
+                    value = String.valueOf(aClass.getMethod("getBusinessName").invoke(tasKVo)).equals("null")?"":String.valueOf(aClass.getMethod("getBusinessName").invoke(tasKVo));
+                }
+                else if(model.equals("orderId")){
+                    value = String.valueOf(aClass.getMethod("getOrderName").invoke(tasKVo)).equals("null")?"":String.valueOf(aClass.getMethod("getOrderName").invoke(tasKVo));
+                }
+                else if(model.equals("clueId")){
+                    value = String.valueOf(aClass.getMethod("getClueName").invoke(tasKVo)).equals("null")?"":String.valueOf(aClass.getMethod("getClueName").invoke(tasKVo));
+                }
+                else if(model.equals("contactsId")){
+                    value = String.valueOf(aClass.getMethod("getContactsName").invoke(tasKVo)).equals("null")?"":String.valueOf(aClass.getMethod("getContactsName").invoke(tasKVo));
+                }
+                else if(model.equals("phone")){
+                    value = String.valueOf(aClass.getMethod("getContactsPhone").invoke(tasKVo)).equals("null")?"":String.valueOf(aClass.getMethod("getContactsPhone").invoke(tasKVo));
+                }
                 item.add(value);
             }
             dataList.add(item);
@@ -816,7 +822,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         taskMapper.update(null,luw);
         TaskLog taskLog = new TaskLog();
         taskLog.setUserId(user.getId()).setTaskId(taskDto.getId()).setUserName(user.getName())
-                .setContent("修改任务状态").setModTime(LocalDateTime.now());
+                .setContent("修改任务状态");
         taskLogMapper.insert(taskLog);
         return msg;
     }

+ 5 - 5
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml

@@ -62,16 +62,16 @@
         <result column="repeat_type" property="repeatType" />
         <result column="repeat_end_never" property="repeatEndNever" />
         <result column="repeat_end_count" property="repeatEndCount" />
-        <result column="repeat_end_date" property="repeatEndDate" jdbcType="DATE" javaType="java.time.LocalDate" />
+        <result column="repeat_end_date" property="repeatEndDate"  />
         <result column="repeat_design_day" property="repeatDesignDay" />
         <result column="repeat_design_sameday" property="repeatDesignSameday" />
         <result column="task_desc" property="taskDesc" />
         <result column="creater_id" property="createrId" />
         <result column="creater_name" property="createrName" />
-        <result column="create_date" property="createDate" jdbcType="DATE" javaType="java.time.LocalDate" />
-        <result column="end_date" property="endDate" jdbcType="DATE" javaType="java.time.LocalDate" />
-        <result column="start_date" property="startDate" jdbcType="DATE" javaType="java.time.LocalDate" />
-        <result column="finish_date" property="finishDate" jdbcType="DATE" javaType="java.time.LocalDate" />
+        <result column="create_date" property="createDate"  />
+        <result column="end_date" property="endDate" />
+        <result column="start_date" property="startDate" />
+        <result column="finish_date" property="finishDate" />
         <result column="is_delete" property="isDelete" />
         <result column="plate1" property="plate1" />
         <result column="plate2" property="plate2" />

+ 44 - 38
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -899,18 +899,7 @@ public class ReportController {
                             if (comTimeType.getReportAuditType() == 3) {
                                 report.setAuditorSetting(auditorSettingList.get(i));
                             }
-                            if (auditWorkflowList.size() == 0) {
-                                //没有自定义审核流,默认的直接是项目负责人审核
-                                report.setIsDeptAudit(0);
-                                report.setIsFinalAudit(1);
-                            } else {
-                                //取第一个审核节点
-                                AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
-                                report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
-                                report.setIsDeptAudit(firstNode.getIsDeptAudit());
-                                report.setAuditDeptid(firstNode.getAuditDeptId());
-                                report.setAuditDeptManagerid(firstNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
-                            }
+                            setReportWorkflowAuditor(auditWorkflowList, allDeptList, report,comTimeType);
                             if (taskId != null && taskId[i] != null && taskId[i] != 0) {
                                 report.setTaskId(taskId[i]);
                             }
@@ -966,18 +955,7 @@ public class ReportController {
                                 if (comTimeType.getReportAuditType() == 3) {
                                     report.setAuditorSetting(auditorSettingList.get(i));
                                 }
-                                if (auditWorkflowList.size() == 0) {
-                                    //没有自定义审核流,默认的直接是项目负责人审核
-                                    report.setIsDeptAudit(0);
-                                    report.setIsFinalAudit(1);
-                                } else {
-                                    //取第一个审核节点
-                                    AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
-                                    report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
-                                    report.setIsDeptAudit(firstNode.getIsDeptAudit());
-                                    report.setAuditDeptid(firstNode.getAuditDeptId());
-                                    report.setAuditDeptManagerid(firstNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
-                                }
+                                setReportWorkflowAuditor(auditWorkflowList, allDeptList, report,comTimeType);
                                 if (taskId != null && taskId[i] != null && taskId[i] != 0) {
                                     report.setTaskId(taskId[i]);
                                 }
@@ -995,7 +973,6 @@ public class ReportController {
                                 } else {
                                     fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf, comTimeType, excludeTimeList);
                                 }
-
                                 fillReportProgress(report, professionProgress[i]);
                                 reportList.add(report);
                             }
@@ -1035,18 +1012,7 @@ public class ReportController {
                         if (comTimeType.getReportAuditType() == 3) {
                             report.setAuditorSetting(auditorSettingList.get(i));
                         }
-                        if (auditWorkflowList.size() == 0) {
-                            //没有自定义审核流,默认的直接是项目负责人审核
-                            report.setIsDeptAudit(0);
-                            report.setIsFinalAudit(1);
-                        } else {
-                            //取第一个审核节点
-                            AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
-                            report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
-                            report.setIsDeptAudit(firstNode.getIsDeptAudit());
-                            report.setAuditDeptid(firstNode.getAuditDeptId());
-                            report.setAuditDeptManagerid(firstNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
-                        }
+                        setReportWorkflowAuditor(auditWorkflowList, allDeptList, report,comTimeType);
                         if (taskId != null && taskId[i] != null && taskId[i] != 0) {
                             report.setTaskId(taskId[i]);
                         }
@@ -1821,6 +1787,40 @@ public class ReportController {
         }
     }
 
+    private void setReportWorkflowAuditor(List<AuditWorkflowTimeSetting> auditWorkflowList, List<Department> allDeptList, Report report, TimeType comTimeType) {
+        if (auditWorkflowList.size() == 0) {
+            //没有自定义审核流,默认的直接是项目负责人审核
+            report.setIsDeptAudit(0);
+            report.setIsFinalAudit(1);
+        } else {
+            //取第一个审核节点
+            AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
+            report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
+            report.setIsDeptAudit(firstNode.getIsDeptAudit());
+            report.setAuditDeptid(firstNode.getAuditDeptId());
+            if (firstNode.getIsDeptAudit() == 1) {
+                Department curDept = allDeptList.stream()
+                        .filter(ad->ad.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get();
+                String curDeptManagerId = curDept.getManagerId();
+                //启用了本部门负责人的日报由上级部门主要负责人审核
+                if (comTimeType.getReportAuditFlowEnableSuperDeptAduit() == 1 && curDeptManagerId.equals(report.getCreatorId())) {
+                    //当前提交的人是这个部门的主要负责人,那么要取该部门的上一级部门的主要负责人来审核
+                    Integer parentDeptId = curDept.getSuperiorId();
+                    if (parentDeptId == null) {
+                        //没有上级部门,直接取当前部门的负责人
+                        report.setAuditDeptManagerid(curDeptManagerId);
+                    } else {
+//                        report.setAuditDeptid(parentDeptId);
+                        report.setAuditDeptManagerid(allDeptList.stream()
+                                .filter(ad->ad.getDepartmentId().equals(parentDeptId)).findFirst().get().getManagerId());
+                    }
+                } else {
+                    report.setAuditDeptManagerid(curDeptManagerId);
+                }
+            }
+        }
+    }
+
     /**
      * 删除报告
      * id 要删除的报告的id
@@ -1932,7 +1932,13 @@ public class ReportController {
 
     @RequestMapping("/batchApproveReport")
     public HttpRespMsg batchApproveReport(@RequestParam String ids, Integer isDepartment, HttpServletRequest request,String evaluate) {
-        return reportService.batchApproveReport(ids, isDepartment, request,evaluate);
+        HttpRespMsg msg = new HttpRespMsg();
+        try {
+            msg = reportService.batchApproveReport(ids, isDepartment, request,evaluate);
+        } catch (Exception e) {
+            msg.setError("批量审核失败:"+e.getMessage());
+        }
+        return msg;
     }
 
     @RequestMapping("/batchApproveByDate")

+ 12 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-03-23
+ * @since 2024-03-24
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -548,6 +548,17 @@ public class TimeType extends Model<TimeType> {
     @TableField("hide_task")
     private Integer hideTask;
 
+    /**
+     * 项目隐藏子项目功能按钮
+     */
+    @TableField("hide_subproject")
+    private Integer hideSubproject;
+
+    /**
+     * 开启日报审批流的本部门负责人由上级部门负责人审核
+     */
+    @TableField("report_audit_flow_enable_super_dept_aduit")
+    private Integer reportAuditFlowEnableSuperDeptAduit;
 
     @TableField(exist = false)
     private List<User> userList;

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

@@ -51,7 +51,7 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg getMembList(String date, HttpServletRequest request);
 
-    HttpRespMsg batchApproveReport(String ids, Integer isDepartment, HttpServletRequest request,String evaluate);
+    HttpRespMsg batchApproveReport(String ids, Integer isDepartment, HttpServletRequest request,String evaluate) throws Exception;
     HttpRespMsg batchDenyReport(String ids, Integer isDepartment, String reason, HttpServletRequest request);
 
     HttpRespMsg cancelReport(String userId, String reportIds, HttpServletRequest request);

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

@@ -7883,6 +7883,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             double workTimeDouble = Double.parseDouble(map.get("workingTime").toString()) + leaveSum;
             BigDecimal workTimeBig = new BigDecimal(workTimeDouble);
             map.put("workingTime",workTimeBig.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+            double overtimeHours = Double.parseDouble(map.get("overtimeHours").toString());
+            map.put("overtimeHours",overtimeHours + "h");
         }
         list.forEach(li->{
             double isPublic = (double) li.get("isPublic");
@@ -8037,8 +8039,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
         }
         List<Map<String, Object>> list = projectMapper.getUserWorkingTimeList(userId, user.getCompanyId(), startDate, endDate, projectId,null,null,null,deptIds);
-        //String[] string={"人员","部门","工号","普通项目工时","公共项目工时","请假时长","总工时","公共项目工时占比"};
-        String[] string={MessageUtils.message("entry.personnel"),MessageUtils.message("excel.department"),MessageUtils.message("entry.No"),MessageUtils.message("entry.GenProHours"),MessageUtils.message("entry.PubProHours"),MessageUtils.message("leave.duration"),MessageUtils.message("entry.totalManHours"),MessageUtils.message("entry.PubProHoursProp")};
+        //String[] string={"人员","部门","工号","普通项目工时","公共项目工时","请假时长","加班时长",总工时","公共项目工时占比"};
+        String[] string={MessageUtils.message("entry.personnel"),MessageUtils.message("excel.department"),
+                MessageUtils.message("entry.No"),MessageUtils.message("entry.GenProHours"),
+                MessageUtils.message("entry.PubProHours"),MessageUtils.message("leave.duration"),MessageUtils.message("excel.workOvertime"),
+                MessageUtils.message("entry.totalManHours"),MessageUtils.message("entry.PubProHoursProp")};
         List<List<String>> dataList=new ArrayList<>();
         dataList.add(Arrays.asList(string));
         Integer companyId = user.getCompanyId();
@@ -8069,6 +8074,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             subList.add(String.valueOf(item.get("unPublic")));
             subList.add(String.valueOf(item.get("isPublic")));
             subList.add(String.valueOf(item.get("leaveSum")));
+            subList.add(String.valueOf(item.get("overtimeHours")));
             subList.add(String.valueOf(item.get("workingTime")));
             subList.add(String.valueOf(item.get("proportion")));
             dataList.add(subList);

+ 117 - 16
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -2346,7 +2346,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     updateBatchById(updateReportList);
                 }
             } else {
-                //之前的流程逻辑,综合了一层项目审核,或者一层任务分组审核。 可叠加部门审批流
+                //之前的流程逻辑,综合了一层项目审核,或者一层任务分组审核。 可叠加部门审批流(部门审批时,本部门的负责人是否由上级部门负责人审核,可配置)
                 List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                         new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", auditTargetUser.getDepartmentId())
                                 .orderByAsc("seq"));
@@ -2383,9 +2383,26 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     AuditWorkflowTimeSetting nextNode = settings.get(m + 1);
                                     upR.setIsDeptAudit(nextNode.getIsDeptAudit());
                                     if (upR.getIsDeptAudit() == 1) {
+                                        //下一个节点是部门审核
                                         upR.setAuditDeptid(nextNode.getAuditDeptId());
-                                        upR.setAuditDeptManagerid(allDepts.stream()
-                                                .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                        Department curDept = allDepts.stream()
+                                                .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get();
+                                        String curDeptManagerId = curDept.getManagerId();
+                                        //启用了本部门负责人的日报由上级部门主要负责人审核
+                                        if (timeType.getReportAuditFlowEnableSuperDeptAduit() == 1 && curDeptManagerId.equals(item.getCreatorId())) {
+                                            //当前提交的人是这个部门的主要负责人,那么要取该部门的上一级部门的主要负责人来审核
+                                            Integer parentDeptId = curDept.getSuperiorId();
+                                            if (parentDeptId == null) {
+                                                //没有上级部门,直接取当前部门的负责人
+                                                upR.setAuditDeptManagerid(curDeptManagerId);
+                                            } else {
+//                                                upR.setAuditDeptid(parentDeptId);
+                                                upR.setAuditDeptManagerid(allDepts.stream()
+                                                        .filter(ad->ad.getDepartmentId().equals(parentDeptId)).findFirst().get().getManagerId());
+                                            }
+                                        } else {
+                                            upR.setAuditDeptManagerid(curDeptManagerId);
+                                        }
                                     }
                                     upR.setIsFinalAudit(nextNode.getIsFinal());
                                     break;
@@ -2417,8 +2434,27 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                             upR.setIsDeptAudit(nextNode.getIsDeptAudit());
                                             if (upR.getIsDeptAudit() == 1) {
                                                 upR.setAuditDeptid(nextNode.getAuditDeptId());
-                                                upR.setAuditDeptManagerid(allDepts.stream()
-                                                        .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                                Department curDept = allDepts.stream()
+                                                        .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get();
+                                                String curDeptManagerId = curDept.getManagerId();
+                                                //启用了本部门负责人的日报由上级部门主要负责人审核
+                                                if (timeType.getReportAuditFlowEnableSuperDeptAduit() == 1 && curDeptManagerId.equals(item.getCreatorId())) {
+                                                    //当前提交的人是这个部门的主要负责人,那么要取该部门的上一级部门的主要负责人来审核
+                                                    Integer parentDeptId = curDept.getSuperiorId();
+                                                    if (parentDeptId == null) {
+                                                        //没有上级部门,直接取当前部门的负责人
+                                                        upR.setAuditDeptManagerid(curDeptManagerId);
+                                                    } else {
+//                                                        upR.setAuditDeptid(parentDeptId);
+                                                        upR.setAuditDeptManagerid(allDepts.stream()
+                                                                .filter(ad->ad.getDepartmentId().equals(parentDeptId)).findFirst().get().getManagerId());
+                                                    }
+                                                } else {
+                                                    upR.setAuditDeptManagerid(curDeptManagerId);
+                                                }
+
+//                                                upR.setAuditDeptManagerid(allDepts.stream()
+//                                                        .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
                                             }
                                             upR.setIsFinalAudit(nextNode.getIsFinal());
                                             break;
@@ -2447,8 +2483,27 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                                 upR.setIsDeptAudit(nextNode.getIsDeptAudit());
                                                 if (upR.getIsDeptAudit() == 1) {
                                                     upR.setAuditDeptid(nextNode.getAuditDeptId());
-                                                    upR.setAuditDeptManagerid(allDepts.stream()
-                                                            .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                                    Department curDept = allDepts.stream()
+                                                            .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get();
+                                                    String curDeptManagerId = curDept.getManagerId();
+                                                    //启用了本部门负责人的日报由上级部门主要负责人审核
+                                                    if (timeType.getReportAuditFlowEnableSuperDeptAduit() == 1 && curDeptManagerId.equals(item.getCreatorId())) {
+                                                        //当前提交的人是这个部门的主要负责人,那么要取该部门的上一级部门的主要负责人来审核
+                                                        Integer parentDeptId = curDept.getSuperiorId();
+                                                        if (parentDeptId == null) {
+                                                            //没有上级部门,直接取当前部门的负责人
+                                                            upR.setAuditDeptManagerid(curDeptManagerId);
+                                                        } else {
+//                                                            upR.setAuditDeptid(parentDeptId);
+                                                            upR.setAuditDeptManagerid(allDepts.stream()
+                                                                    .filter(ad->ad.getDepartmentId().equals(parentDeptId)).findFirst().get().getManagerId());
+                                                        }
+                                                    } else {
+                                                        upR.setAuditDeptManagerid(curDeptManagerId);
+                                                    }
+
+//                                                    upR.setAuditDeptManagerid(allDepts.stream()
+//                                                            .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
                                                 }
                                                 upR.setIsFinalAudit(nextNode.getIsFinal());
                                                 break;
@@ -3136,7 +3191,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg batchApproveReport(String reportIds, Integer isDepartment, HttpServletRequest request,String evaluate) {
+    public HttpRespMsg batchApproveReport(String reportIds, Integer isDepartment, HttpServletRequest request,String evaluate) throws Exception {
         String token = request.getHeader("Token");
         User user = userMapper.selectById(token);
         Company company = companyMapper.selectById(user.getCompanyId());
@@ -3559,12 +3614,26 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                                 Optional<Department> first = allDepts.stream()
                                                         .filter(ad -> ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst();
                                                 if (!first.isPresent()) {
-
                                                     System.out.println(item.getId()+"下个节点找不到: "+nextNode.getAuditDeptId()+", "+nextNode.getAuditDeptName());
-
+                                                    throw new Exception("找不到部门");
+                                                }
+                                                Department curDept = first.get();
+                                                String curDeptManagerId = curDept.getManagerId();
+                                                //启用了本部门负责人的日报由上级部门主要负责人审核
+                                                if (timeType.getReportAuditFlowEnableSuperDeptAduit() == 1 && curDeptManagerId.equals(creatorId)) {
+                                                    //当前提交的人是这个部门的主要负责人,那么要取该部门的上一级部门的主要负责人来审核
+                                                    Integer parentDeptId = curDept.getSuperiorId();
+                                                    if (parentDeptId == null) {
+                                                        //没有上级部门,直接取当前部门的负责人
+                                                        curReport.setAuditDeptManagerid(curDeptManagerId);
+                                                    } else {
+//                                                        curReport.setAuditDeptid(parentDeptId);
+                                                        curReport.setAuditDeptManagerid(allDepts.stream()
+                                                                .filter(ad->ad.getDepartmentId().equals(parentDeptId)).findFirst().get().getManagerId());
+                                                    }
+                                                } else {
+                                                    curReport.setAuditDeptManagerid(curDeptManagerId);
                                                 }
-                                                String managerId = first.get().getManagerId();
-                                                curReport.setAuditDeptManagerid(managerId);
                                             }
                                             curReport.setIsFinalAudit(nextNode.getIsFinal());
                                             break;
@@ -3594,8 +3663,24 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                                 curReport.setIsDeptAudit(nextNode.getIsDeptAudit());
                                                 if (curReport.getIsDeptAudit() == 1) {
                                                     curReport.setAuditDeptid(nextNode.getAuditDeptId());
-                                                    curReport.setAuditDeptManagerid(allDepts.stream()
-                                                            .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                                    Department curDept = allDepts.stream()
+                                                            .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get();
+                                                    String curDeptManagerId = curDept.getManagerId();
+                                                    //启用了本部门负责人的日报由上级部门主要负责人审核
+                                                    if (timeType.getReportAuditFlowEnableSuperDeptAduit() == 1 && curDeptManagerId.equals(creatorId)) {
+                                                        //当前提交的人是这个部门的主要负责人,那么要取该部门的上一级部门的主要负责人来审核
+                                                        Integer parentDeptId = curDept.getSuperiorId();
+                                                        if (parentDeptId == null) {
+                                                            //没有上级部门,直接取当前部门的负责人
+                                                            curReport.setAuditDeptManagerid(curDeptManagerId);
+                                                        } else {
+//                                                            curReport.setAuditDeptid(parentDeptId);
+                                                            curReport.setAuditDeptManagerid(allDepts.stream()
+                                                                    .filter(ad->ad.getDepartmentId().equals(parentDeptId)).findFirst().get().getManagerId());
+                                                        }
+                                                    } else {
+                                                        curReport.setAuditDeptManagerid(curDeptManagerId);
+                                                    }
                                                 }
                                                 curReport.setIsFinalAudit(nextNode.getIsFinal());
                                                 upR = curReport;
@@ -3639,8 +3724,24 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                                         upR.setIsDeptAudit(nextNode.getIsDeptAudit());
                                                         if (upR.getIsDeptAudit() == 1) {
                                                             upR.setAuditDeptid(nextNode.getAuditDeptId());
-                                                            upR.setAuditDeptManagerid(allDepts.stream()
-                                                                    .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                                            Department curDept = allDepts.stream()
+                                                                    .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get();
+                                                            String curDeptManagerId = curDept.getManagerId();
+                                                            //启用了本部门负责人的日报由上级部门主要负责人审核
+                                                            if (timeType.getReportAuditFlowEnableSuperDeptAduit() == 1 && curDeptManagerId.equals(creatorId)) {
+                                                                //当前提交的人是这个部门的主要负责人,那么要取该部门的上一级部门的主要负责人来审核
+                                                                Integer parentDeptId = curDept.getSuperiorId();
+                                                                if (parentDeptId == null) {
+                                                                    //没有上级部门,直接取当前部门的负责人
+                                                                    curReport.setAuditDeptManagerid(curDeptManagerId);
+                                                                } else {
+//                                                                    curReport.setAuditDeptid(parentDeptId);
+                                                                    curReport.setAuditDeptManagerid(allDepts.stream()
+                                                                            .filter(ad->ad.getDepartmentId().equals(parentDeptId)).findFirst().get().getManagerId());
+                                                                }
+                                                            } else {
+                                                                curReport.setAuditDeptManagerid(curDeptManagerId);
+                                                            }
                                                         }
                                                         upR.setIsFinalAudit(nextNode.getIsFinal());
                                                         break;

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

@@ -818,7 +818,8 @@
         user.department_id As deptId,
         ifnull(SUM(if(project.is_public=0,report.working_time,null)),0) as unPublic,
         ifnull(SUM(if(project.is_public=1,report.working_time,null)),0) as isPublic,
-        ifnull(SUM(report.`working_time`),0) AS workingTime
+        ifnull(SUM(report.`working_time`),0) AS workingTime,
+        ifnull(SUM(report.`overtime_hours`),0) AS overtimeHours
         FROM report LEFT JOIN user ON user.id = report.`creator_id`
         left join project on project.id = report.project_id
         WHERE

Diferenças do arquivo suprimidas por serem muito extensas
+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


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

@@ -630,6 +630,8 @@
               </el-table-column>
               <el-table-column prop="leaveSum" :label="$t('qing-jia-gong-shi')" min-width="160" align="right">
               </el-table-column>
+              <el-table-column prop="overtimeHours" :label="$t('jia-ban-shi-chang')" min-width="160" align="right">
+              </el-table-column>
               <el-table-column prop="workingTime" :label="$t('other.totalworkinghours')" min-width="160" align="right">
                 <template slot-scope="scope">
                   <span>{{scope.row.workingTime == null? 0 + 'h' : scope.row.workingTime.toFixed(1) + 'h'}}</span>

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

@@ -402,7 +402,7 @@
             </el-table-column>
             <el-table-column :label="$t('operation')" :width="showColumnWidth" align="left" fixed="right" v-if="showColumnWidth != '0' || permissions.projectManagement">
                 <template slot-scope="scope">
-                    <el-button v-if="(permissions.projectManagement || user.id==scope.row.creatorId) && user.timeType.mainProjectState != '1'" size="mini"  @click="subProject(scope.row)">{{ $t('lable.subproject') }}</el-button>
+                    <el-button v-if="(permissions.projectManagement || user.id==scope.row.creatorId) && user.timeType.mainProjectState != '1' && !user.timeType.hideSubproject" size="mini"  @click="subProject(scope.row)">{{ $t('lable.subproject') }}</el-button>
                     <el-button size="mini" v-if="permissions.projectParticipator || permissions.projectManagement || user.id==scope.row.inchargerId || user.id==scope.row.creatorId" type="primary" @click="handleAdd(scope.$index, scope.row)">{{ $t('bian-ji') }}</el-button>
                     <!-- <el-button v-if="permissions.projectManagement || user.id==scope.row.creatorId" size="mini"  @click="deletePro(scope.$index, scope.row)">删除</el-button> -->
                     <el-dropdown class="customdropdown" split-button size="mini" @click="finishPro(scope.row)" v-if="(permissions.projectManagement || user.id==scope.row.creatorId || user.id==scope.row.inchargerId) && scope.row.status == 1" placement="bottom-start">