QuYueTing 1 день назад
Родитель
Сommit
727ac68c2f
25 измененных файлов с 992 добавлено и 240 удалено
  1. 21 11
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuditWorkflowTimeSettingController.java
  2. 12 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java
  3. 58 32
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAuditorController.java
  4. 20 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  5. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  6. 116 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WxCorpInfoController.java
  7. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/AuditWorkflowTimeSetting.java
  8. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Finance.java
  9. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/FinanceImport.java
  10. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  11. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserWorkDayVO.java
  12. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/FinanceMapper.java
  13. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/AuditWorkflowSettingService.java
  14. 6 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/AuditWorkflowTimeSettingService.java
  15. 6 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceService.java
  16. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  17. 6 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/AuditWorkflowSettingServiceImpl.java
  18. 104 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/AuditWorkflowTimeSettingServiceImpl.java
  19. 19 16
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  20. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  21. 313 107
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  22. 146 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  23. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/FinanceMapper.xml
  24. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  25. 125 20
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

+ 21 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuditWorkflowTimeSettingController.java

@@ -130,18 +130,28 @@ public class AuditWorkflowTimeSettingController {
             setting.setIsFinal(1);
             setting.setIsDeptAudit(0);
             auditWorkflowTimeSettings.add(setting);
-//            while (dept.getSuperiorId() != null && dept.getSuperiorId() > 0) {
-//                seq++;
-//                dept = departmentMapper.selectById(dept.getSuperiorId());
-//                setting = new AuditWorkflowTimeSetting();
-//                setting.setCompanyId(companyId);
-//                setting.setDeptId(dept.getDepartmentId());
-//                setting.setSeq(seq);
-//                setting.setAuditDeptId(dept.getDepartmentId());
-//                setting.setAuditDeptName(dept.getDepartmentName());
-//                auditWorkflowTimeSettings.add(setting);
-//            }
+        }
+        msg.data = auditWorkflowTimeSettings;
+        return msg;
+    }
 
+    @RequestMapping("/getByUserId")
+    public HttpRespMsg getByUserId(String userId) {
+        User user = userMapper.selectById(userId);
+        Integer companyId = user.getCompanyId();
+        List<AuditWorkflowTimeSetting> auditWorkflowTimeSettings = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", user.getDepartmentId()).orderByAsc("seq"));
+        HttpRespMsg msg = new HttpRespMsg();
+        if (auditWorkflowTimeSettings.size() == 0) {
+            int seq = 1;
+            //未独立设置,获取默认的设置,默认直接就是项目负责人审批
+            Department dept = departmentMapper.selectById(user.getDepartmentId());
+            AuditWorkflowTimeSetting setting = new AuditWorkflowTimeSetting();
+            setting.setSeq(seq);
+            setting.setCompanyId(companyId);
+            setting.setDeptId(dept.getDepartmentId());
+            setting.setIsFinal(1);
+            setting.setIsDeptAudit(0);
+            auditWorkflowTimeSettings.add(setting);
         }
         msg.data = auditWorkflowTimeSettings;
         return msg;

+ 12 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java

@@ -61,8 +61,8 @@ public class FinanceController {
     private String path;
 
     @RequestMapping("/getByMonth")
-    public HttpRespMsg getByMonth(Integer companyId, String yearMonth,Integer deptId) {
-        return financeService.getByMonth(companyId, yearMonth,deptId);
+    public HttpRespMsg getByMonth(Integer companyId, String yearMonth,Integer deptId, @RequestParam(required = false, defaultValue = "1") Integer salaryType) {
+        return financeService.getByMonth(companyId, yearMonth,deptId, salaryType);
     }
 
     @RequestMapping("/getProjects")
@@ -72,11 +72,11 @@ public class FinanceController {
 
     @RequestMapping("/importData")
     public HttpRespMsg importData(Integer companyId, String yearMonth,
-                                  Boolean syncUserCost, Boolean syncHistoryReport,
+                                  Boolean syncUserCost, Boolean syncHistoryReport, @RequestParam(required = false, defaultValue = "1") Integer salaryType,
                                   MultipartFile file, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         try {
-            return financeService.importData(companyId, yearMonth, syncUserCost, syncHistoryReport, file, request);
+            return financeService.importData(companyId, yearMonth, syncUserCost, syncHistoryReport,  salaryType, file, request);
         } catch (IOException e) {
             e.printStackTrace();
             //msg.setError("文件处理出错");
@@ -104,9 +104,9 @@ public class FinanceController {
     public HttpRespMsg exportData(@RequestParam(required = false, defaultValue = "0") Integer groupByCategory,
                                   @RequestParam(defaultValue = "0")Integer onlyTotal,
                                   @RequestParam String date, Boolean assignNoProUser,
-                                  Integer deptId,
+                                  Integer deptId, @RequestParam(required = false, defaultValue = "1") Integer salaryType,
                                   HttpServletRequest request) {
-        return financeService.exportData(groupByCategory,onlyTotal, date, assignNoProUser,deptId, request);
+        return financeService.exportData(groupByCategory,onlyTotal, date, assignNoProUser,deptId, salaryType, request);
     }
 
     /**
@@ -116,19 +116,19 @@ public class FinanceController {
      * @return
      */
     @RequestMapping("/exportFinance")
-    public HttpRespMsg exportFinance(@RequestParam String date,Integer deptId, HttpServletRequest request) {
-        return financeService.exportFinance(date,deptId, request);
+    public HttpRespMsg exportFinance(@RequestParam String date,Integer deptId, @RequestParam(required = false, defaultValue = "1") Integer salaryType, HttpServletRequest request) {
+        return financeService.exportFinance(date,deptId,salaryType, request);
     }
 
     //按照项目分配财务成本
     @RequestMapping("/getTimeCost")
-    public HttpRespMsg getTimeCost(String yearMonth,Integer deptId, Boolean assignNoProUser,HttpServletRequest request) {
-        return financeService.getTimeCost(yearMonth,deptId, assignNoProUser,request);
+    public HttpRespMsg getTimeCost(String yearMonth,Integer deptId, Boolean assignNoProUser,@RequestParam(required = false, defaultValue = "1") Integer salaryType, HttpServletRequest request) {
+        return financeService.getTimeCost(yearMonth,deptId, assignNoProUser,salaryType, request);
     }
 
     @RequestMapping("/getNoProjectUsers")
-    public HttpRespMsg getNoProjectUsers(String yearMonth, HttpServletRequest request) {
-        return financeService.getNoProjectUsers(yearMonth, request);
+    public HttpRespMsg getNoProjectUsers(String yearMonth, @RequestParam(required = false, defaultValue = "1") Integer salaryType, HttpServletRequest request) {
+        return financeService.getNoProjectUsers(yearMonth, salaryType,request);
     }
 
 

+ 58 - 32
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAuditorController.java

@@ -4,11 +4,14 @@ package com.management.platform.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
+import com.management.platform.service.AuditWorkflowSettingService;
+import com.management.platform.service.AuditWorkflowTimeSettingService;
 import com.management.platform.service.ProjectAuditorService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
@@ -42,56 +45,79 @@ public class ProjectAuditorController {
     private DepartmentMapper departmentMapper;
     @Resource
     HttpServletRequest request;
+    @Resource
+    private AuditWorkflowTimeSettingService auditWorkflowTimeSettingService;
+
     @Autowired
     private TimeTypeMapper timeTypeMapper;
 
+    @RequestMapping("/getWorkFlowList")
+    private HttpRespMsg getWorkFlowList(Integer projectId, String userId) {
+        String token = userId==null?request.getHeader("TOKEN"):userId;
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(token);
+        Company company = companyMapper.selectById(user.getCompanyId());
+        //日报填报时,获取审核人
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        msg.setData(auditWorkflowTimeSettingService.getWorkFlowListForReport(user, company, timeType, projectId));
+        return msg;
+    }
+
     @RequestMapping("/getList")
-    private HttpRespMsg getList(Integer projectId, String userId) {
+    private HttpRespMsg getList(Integer projectId, String userId, @RequestParam(required = false, defaultValue = "false") Boolean forReport) {
         String token = userId==null?request.getHeader("TOKEN"):userId;
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(token);
         Company company = companyMapper.selectById(user.getCompanyId());
-        int mode = 0;
-        if (company.getNonProjectSimple() == 1) {
-            //启用了简易模式
-            Project project = projectMapper.selectById(projectId);
-            List<ProjectAuditor> auditorList = new ArrayList<>();
-            if (project.getIsPublic() == 1) {
-                //非项目,该员工的部门主要负责人审核
-                mode = 1;
-                String superiorId = null;
-                TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
-                //优先取员工的上级领导
-                if (timeType.getReportAuditType() == 0) {
-                    superiorId = user.getSuperiorId();
-                }
-                //其次取员工的部门主要负责人
-                if (superiorId == null) {
-                    Integer departmentId = user.getDepartmentId();
-                    Department department = departmentMapper.selectById(departmentId);
-                    if (department != null) {
-                        superiorId = department.getManagerId();
+        if (forReport) {
+            //日报填报时,获取审核人
+            TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+            int mode = 0;
+            if (company.getNonProjectSimple() == 1) {
+                //启用了简易模式
+                Project project = projectMapper.selectById(projectId);
+                List<ProjectAuditor> auditorList = new ArrayList<>();
+                if (project.getIsPublic() == 1) {
+                    //非项目,该员工的部门主要负责人审核
+                    mode = 1;
+                    String superiorId = null;
+                    //优先取员工的上级领导
+                    if (timeType.getReportAuditType() == 0) {
+                        superiorId = user.getSuperiorId();
                     }
-                }
-                if (superiorId != null) {
-                    User superior = userMapper.selectById(superiorId);
-                    if (superior != null) {
-                        ProjectAuditor auditor = new ProjectAuditor();
-                        auditor.setAuditorId(superiorId);
-                        auditor.setAuditorName(superior.getName());
-                        auditorList.add(auditor);
+                    //其次取员工的部门主要负责人
+                    if (superiorId == null) {
+                        Integer departmentId = user.getDepartmentId();
+                        Department department = departmentMapper.selectById(departmentId);
+                        if (department != null) {
+                            superiorId = department.getManagerId();
+                        }
                     }
+                    if (superiorId != null) {
+                        User superior = userMapper.selectById(superiorId);
+                        if (superior != null) {
+                            ProjectAuditor auditor = new ProjectAuditor();
+                            auditor.setAuditorId(superiorId);
+                            auditor.setAuditorName(superior.getName());
+                            auditorList.add(auditor);
+                        }
+                    }
+                    msg.data = auditorList;
                 }
-
+            }
+            if (mode == 0) {
+                List<ProjectAuditor> auditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", projectId));
                 msg.data = auditorList;
             }
-        }
-        if (mode == 0) {
+        } else {
+            //编辑项目,获取日报审核人
             List<ProjectAuditor> auditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", projectId));
             msg.data = auditorList;
         }
 
         return msg;
     }
+
+
 }
 

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

@@ -1486,7 +1486,7 @@ public class ReportController {
                             BigDecimal multiply = new BigDecimal(first.get().getManDay()).multiply(new BigDecimal(comTimeType.getAllday()));
 
                             if(hasReport.doubleValue()>multiply.doubleValue()){
-                                if (estimateTimeSetting.getProjectExceedPercent() > 0) {
+                                if (estimateTimeSetting.getProjectExceedPercent() != null && estimateTimeSetting.getProjectExceedPercent() > 0) {
                                     //检查是否超过预设的提醒百分比;设置的数值是剩余的百分比
                                     if (hasReport.subtract(multiply).divide(multiply, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).compareTo(new BigDecimal(estimateTimeSetting.getProjectExceedPercent()))>0) {
                                         httpRespMsg.setError("不得超过当前项目["+first.get().getProjectName()+"]预估工时的"+estimateTimeSetting.getProjectExceedPercent()+"%,无法继续提交工时");
@@ -2527,7 +2527,8 @@ public class ReportController {
     }
 
     private void setReportWorkflowAuditor(List<AuditWorkflowTimeSetting> auditWorkflowList, List<Department> allDeptList, Report report, TimeType comTimeType) {
-        if (comTimeType.getReportAuditType() > 1 || auditWorkflowList.size() == 0) {
+        //增加没有开通审批流的判断
+        if (comTimeType.getReportWorkflow() == 0 || comTimeType.getReportAuditType() > 1 || auditWorkflowList.size() == 0) {
             //没有自定义审核流,默认的直接是项目负责人审核
             report.setIsDeptAudit(0);
             if (comTimeType.getReportAuditType() != 8) {
@@ -2934,6 +2935,11 @@ public class ReportController {
         return reportService.getAbnormalReportList(startDate, endDate, userId, pageIndex, pageSize);
     }
 
+    @RequestMapping("/exportAbnormalReportList")
+    public HttpRespMsg exportAbnormalReportList(String startDate, String endDate, String userId, HttpServletRequest request) {
+        return reportService.exportAbnormalReportList(startDate, endDate, userId, request);
+    }
+
     @GetMapping("/fixIssue")
     public HttpRespMsg fixIssue(Integer companyId, String startDate, String endDate){
         return reportService.fixIssue(companyId, startDate, endDate);
@@ -3542,4 +3548,16 @@ public class ReportController {
     public HttpRespMsg updateNoReportUserList(HttpServletRequest request, String leaveStartTime, String leaveEndTime,String createDate,Double leaveDuration, String corpwxUserId) {
         return reportService.updateNoReportUserList(request, leaveStartTime, leaveEndTime,createDate, leaveDuration,corpwxUserId);
     }
+
+    @RequestMapping("/getMissingCardTimeUserList")
+    public HttpRespMsg getMissingCardTimeUserList(String startDate, String endDate,Integer departmentId, HttpServletRequest request) {
+        return reportService.getMissingCardTimeUserList(startDate, endDate, departmentId, request);
+    }
+
+
+    @RequestMapping("/exportMissingCardTimeUserList")
+    public HttpRespMsg exportMissingCardTimeUserList(String startDate, String endDate, Integer departmentId, HttpServletRequest request) {
+        return reportService.exportMissingCardTimeUserList(startDate, endDate,departmentId,  request);
+    }
+
 }

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

@@ -4103,6 +4103,7 @@ public class WeiXinCorpController {
 //        jsonArrayFilter.add(filter1);
         filter1.put("key","template_id");
         filter1.put("value","C4ehNNZ2vtdaWtU3o1xfXybvDENKM6kUoFbucvMua");
+//        filter1.put("value","C4c9RwJebjNUwAEJZxYN1MzPtdDkhNfMQ4VV8sXMv");
         jsonArrayFilter.add(filter1);
         JSONObject filter2 = new JSONObject();
         filter2.put("key","sp_status");

+ 116 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WxCorpInfoController.java

@@ -4,9 +4,11 @@ package com.management.platform.controller;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Overtime;
 import com.management.platform.entity.User;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.OvertimeService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.task.TimingTask;
 import com.management.platform.util.HttpRespMsg;
@@ -45,6 +47,8 @@ public class WxCorpInfoController {
     UserMapper userMapper;
     @Resource
     private TimingTask timingTask;
+    @Resource
+    private OvertimeService overtimeService;
 
     @RequestMapping("/testDownload")
     public HttpRespMsg testDownload() {
@@ -257,9 +261,10 @@ public class WxCorpInfoController {
                         e.printStackTrace();
                     }
                 }
-                
+                saveOrUpdateOverTime(companyId, detailList);
                 msg.data = detailList;
                 msg.msg = "成功获取" + detailList.size() + "条加班审批详情";
+
             } else {
                 msg.data = new JSONArray();
                 msg.msg = "未查询到加班审批单号";
@@ -270,5 +275,115 @@ public class WxCorpInfoController {
         }
         return msg;
     }
+
+    /**
+     * 保存或更新加班数据
+     * @param array 加班审批详情数组
+     */
+    private void saveOrUpdateOverTime(Integer companyId, JSONArray array) {
+        if (array == null || array.isEmpty()) {
+            return;
+        }
+        
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject item = array.getJSONObject(i);
+            
+            try {
+                // 获取审批单号
+                String spNo = item.getString("sp_no");
+                if (StringUtils.isEmpty(spNo)) {
+                    System.err.println("审批单号为空,跳过该记录");
+                    continue;
+                }
+                
+                // 根据审批单号查询是否已存在
+                QueryWrapper<Overtime> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("sp_no", spNo).eq("company_id", companyId);
+                Overtime existingOvertime = overtimeService.getOne(queryWrapper);
+                
+                Overtime overtime;
+                if (existingOvertime != null) {
+                    // 更新已存在的记录
+                    overtime = existingOvertime;
+                } else {
+                    // 创建新记录
+                    overtime = new Overtime();
+                    overtime.setSpNo(spNo);
+                    overtime.setCompanyId(companyId);
+                }
+                
+                // 设置企微用户ID
+                String applyerWxUserid = item.getString("applyer_userid");
+                if (!StringUtils.isEmpty(applyerWxUserid)) {
+                    overtime.setApplyerWxUserid(applyerWxUserid);
+                    
+                    // 根据企微用户ID查询系统用户ID
+                    QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
+                    if (companyId == 7) {
+                        userQueryWrapper.eq("corpwx_real_userid", applyerWxUserid).eq("company_id", companyId);
+                    } else {
+                        userQueryWrapper.eq("corpwx_userid", applyerWxUserid).eq("company_id", companyId);
+                    }
+                    User user = userMapper.selectOne(userQueryWrapper);
+                    
+                    if (user != null) {
+                        overtime.setUserId(user.getId());
+                    } else {
+                        System.err.println("未找到企微用户ID对应的系统用户: " + applyerWxUserid);
+                    }
+                }
+                
+                // 设置加班开始时间
+                String startTimeStr = item.getString("start_time");
+                if (!StringUtils.isEmpty(startTimeStr)) {
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                    overtime.setStartTime(LocalDateTime.parse(startTimeStr, formatter));
+                }
+                
+                // 设置加班结束时间
+                String endTimeStr = item.getString("end_time");
+                if (!StringUtils.isEmpty(endTimeStr)) {
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                    overtime.setEndTime(LocalDateTime.parse(endTimeStr, formatter));
+                }
+                
+                // 设置加班时长(秒)
+                Long duration = item.getLong("duration");
+                if (duration != null) {
+                    overtime.setDuration(duration.intValue());
+                }
+                
+                // 设置时长类型
+                String durationType = item.getString("duration_type");
+                if (!StringUtils.isEmpty(durationType)) {
+                    overtime.setDurationType(durationType);
+                }
+                
+                // 设置考勤类型
+                Integer attendanceType = item.getInteger("attendance_type");
+                if (attendanceType != null) {
+                    overtime.setAttendanceType(attendanceType);
+                }
+                
+                // 设置是否夜班
+                Boolean isNightShift = item.getBoolean("is_night_shift");
+                if (isNightShift != null) {
+                    overtime.setIsNightShift(isNightShift);
+                }
+                
+                // 保存或更新
+                boolean success = overtimeService.saveOrUpdate(overtime);
+                if (success) {
+                    System.out.println("成功保存加班记录,审批单号: " + spNo);
+                } else {
+                    System.err.println("保存加班记录失败,审批单号: " + spNo);
+                }
+                
+            } catch (Exception e) {
+                System.err.println("处理加班记录时发生异常: " + e.getMessage());
+                e.printStackTrace();
+            }
+        }
+    }
 }
 

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/AuditWorkflowTimeSetting.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+import java.util.List;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -78,6 +80,13 @@ public class AuditWorkflowTimeSetting extends Model<AuditWorkflowTimeSetting> {
     @TableField("is_final")
     private Integer isFinal;
 
+    //项目日报审核人列表
+    @TableField(exist = false)
+    private List<ProjectAuditor> projectAuditors;
+
+    @TableField(exist = false)
+    private String auditDeptManagerName;
+
 
     @Override
     protected Serializable pkVal() {

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Finance.java

@@ -169,6 +169,12 @@ public class Finance extends Model<Finance> {
     @TableField("custom_field7")
     private BigDecimal customField7;
 
+    /**
+     * 工资类型:0-计提工资,1-实发工资
+     */
+    @TableField("salary_type")
+    private Integer salaryType;
+
     @TableField(exist = false)
     private Integer hasReport;
 

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/FinanceImport.java

@@ -100,6 +100,11 @@ public class FinanceImport extends Model<FinanceImport> {
     @TableField("is_verification")
     private Boolean isVerification;
 
+    /**
+     * 工资类型:0-计提工资,1-实发工资
+     */
+    @TableField("salary_type")
+    private Integer salaryType;
 
     @Override
     protected Serializable pkVal() {

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java

@@ -454,6 +454,9 @@ public class Report extends Model<Report> {
     @TableField("working_time_finance")
     private Double workingTimeFinance;
 
+    @TableField(exist = false)
+    private List<AuditWorkflowTimeSetting> auditWorkflow;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserWorkDayVO.java

@@ -9,4 +9,5 @@ public class UserWorkDayVO {
     private String userId;
     private String userName;
     private String workDate;
+    private String departmentName;
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/FinanceMapper.java

@@ -15,5 +15,5 @@ import java.util.List;
  */
 public interface FinanceMapper extends BaseMapper<Finance> {
 
-    List<Finance> selectListByDept(Integer companyId, String yearMonth, List<Integer> deptIds);
+    List<Finance> selectListByDept(Integer companyId, String yearMonth, List<Integer> deptIds, Integer salaryType);
 }

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

@@ -1,6 +1,6 @@
 package com.management.platform.service;
 
-import com.management.platform.entity.AuditWorkflowSetting;
+import com.management.platform.entity.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestParam;

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

@@ -2,6 +2,11 @@ package com.management.platform.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.AuditWorkflowTimeSetting;
+import com.management.platform.entity.Company;
+import com.management.platform.entity.TimeType;
+import com.management.platform.entity.User;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +17,5 @@ import com.management.platform.entity.AuditWorkflowTimeSetting;
  * @since 2021-07-25
  */
 public interface AuditWorkflowTimeSettingService extends IService<AuditWorkflowTimeSetting> {
-
+    List<AuditWorkflowTimeSetting> getWorkFlowListForReport(User user, Company company, TimeType timeType, Integer projectId);
 }

+ 6 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceService.java

@@ -17,17 +17,17 @@ import javax.servlet.http.HttpServletRequest;
  */
 public interface FinanceService extends IService<Finance> {
 
-    HttpRespMsg getByMonth(Integer companyId, String yearMonth,Integer deptId);
+    HttpRespMsg getByMonth(Integer companyId, String yearMonth,Integer deptId, Integer salaryType);
 
-    HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, MultipartFile multipartFile, HttpServletRequest request) throws Exception;
+    HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, Integer salaryType, MultipartFile multipartFile, HttpServletRequest request) throws Exception;
 
-    HttpRespMsg exportData(Integer groupByCategory,Integer onlyTotal, String date, Boolean assignNoProUser,Integer deptId, HttpServletRequest request);
+    HttpRespMsg exportData(Integer groupByCategory,Integer onlyTotal, String date, Boolean assignNoProUser,Integer deptId, Integer salaryType, HttpServletRequest request);
 
-    HttpRespMsg getTimeCost(String yearMonth,Integer deptId, Boolean assignNoProUser, HttpServletRequest request);
+    HttpRespMsg getTimeCost(String yearMonth,Integer deptId, Boolean assignNoProUser, Integer salaryType, HttpServletRequest request);
 
-    HttpRespMsg getNoProjectUsers(String yearMonth, HttpServletRequest request);
+    HttpRespMsg getNoProjectUsers(String yearMonth, Integer salaryType, HttpServletRequest request);
 
     HttpRespMsg getProjects(Integer companyId, String yearMonth);
 
-    HttpRespMsg exportFinance(String date,Integer deptId, HttpServletRequest request);
+    HttpRespMsg exportFinance(String date,Integer deptId, Integer salaryType, HttpServletRequest request);
 }

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

@@ -32,7 +32,7 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg getCardTime(String date, HttpServletRequest request);
 
-    HttpRespMsg getMissingCardTimeUserList(String startDate, String endDate, HttpServletRequest request);
+    HttpRespMsg getMissingCardTimeUserList(String startDate, String endDate, Integer departmentId, HttpServletRequest request);
 
     HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId, String summary, String weeklyAttachment);
 
@@ -206,4 +206,8 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg updateNoReportUserList(HttpServletRequest request, String startTime, String endTime,String createDate,Double leaveDuration, String corpwxUserId);
 
     HttpRespMsg getAbnormalReportList(String startDate, String endDate, String userId, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportAbnormalReportList(String startDate, String endDate, String userId, HttpServletRequest request);
+
+    HttpRespMsg exportMissingCardTimeUserList(String startDate, String endDate, Integer departmentId, HttpServletRequest request);
 }

+ 6 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/AuditWorkflowSettingServiceImpl.java

@@ -1,13 +1,8 @@
 package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.entity.AuditWorkflowSetting;
-import com.management.platform.entity.Department;
-import com.management.platform.entity.User;
-import com.management.platform.mapper.AuditWorkflowSettingMapper;
-import com.management.platform.mapper.DepartmentMapper;
-import com.management.platform.mapper.ReportMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
 import com.management.platform.service.AuditWorkflowSettingService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.HttpRespMsg;
@@ -17,6 +12,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -29,13 +25,13 @@ import java.util.List;
  */
 @Service
 public class AuditWorkflowSettingServiceImpl extends ServiceImpl<AuditWorkflowSettingMapper, AuditWorkflowSetting> implements AuditWorkflowSettingService {
-    @Resource
-    private HttpServletRequest request;
     @Resource
     AuditWorkflowSettingMapper auditWorkflowSettingMapper;
     @Resource
     DepartmentMapper departmentMapper;
 
+    @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
     @Override
     public List<AuditWorkflowSetting> get(Integer deptId, Integer type) {
         if (deptId != null && deptId > 0) {
@@ -63,4 +59,5 @@ public class AuditWorkflowSettingServiceImpl extends ServiceImpl<AuditWorkflowSe
             return new ArrayList<>();
         }
     }
+
 }

+ 104 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/AuditWorkflowTimeSettingServiceImpl.java

@@ -1,11 +1,17 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.entity.AuditWorkflowTimeSetting;
-import com.management.platform.mapper.AuditWorkflowTimeSettingMapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
 import com.management.platform.service.AuditWorkflowTimeSettingService;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * <p>
  *  服务实现类
@@ -16,5 +22,101 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class AuditWorkflowTimeSettingServiceImpl extends ServiceImpl<AuditWorkflowTimeSettingMapper, AuditWorkflowTimeSetting> implements AuditWorkflowTimeSettingService {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    AuditWorkflowSettingMapper auditWorkflowSettingMapper;
+    @Resource
+    DepartmentMapper departmentMapper;
+
+    @Resource
+    private ProjectAuditorMapper projectAuditorMapper;
+
+    @Resource
+    private CompanyMapper companyMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+    @Override
+    public List<AuditWorkflowTimeSetting> getWorkFlowListForReport(User user, Company company, TimeType timeType, Integer projectId) {
+        List<AuditWorkflowTimeSetting> workflowList = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>()
+                .eq("company_id", user.getCompanyId()).eq("dept_id", user.getDepartmentId()).orderByAsc("seq"));
+        if (workflowList.size() == 0) {
+            //默认是项目层审核
+            AuditWorkflowTimeSetting setting = new AuditWorkflowTimeSetting();
+            setting.setSeq(1);
+            setting.setCompanyId(user.getCompanyId());
+            setting.setDeptId(user.getDepartmentId());
+            setting.setIsFinal(1);
+            setting.setIsDeptAudit(0);
+            setting.setProjectAuditors(getProjectAuditorList(company, projectId, user, timeType));
+            workflowList.add(setting);
+        } else {
+            for (AuditWorkflowTimeSetting setting : workflowList) {
+                if (setting.getIsDeptAudit() == 0) {
+                    //项目审核节点,要增加项目日报审核人
+                    setting.setProjectAuditors(getProjectAuditorList(company, projectId, user, timeType));
+                } else {
+                    Department curDept = departmentMapper.selectById(setting.getAuditDeptId());
+                    String curDeptManagerId = curDept.getManagerId();
+                    //设置每个部门的审核人
+                    if (timeType.getReportAuditFlowEnableSuperDeptAduit() == 1 && curDeptManagerId.equals(user.getId())) {
+                        //当前提交的人是这个部门的主要负责人,那么要取该部门的上一级部门的主要负责人来审核
+                        Integer parentDeptId = curDept.getSuperiorId();
+                        if (parentDeptId == null) {
+                            //没有上级部门,直接取当前部门的负责人
+                        } else {
+                            curDeptManagerId = departmentMapper.selectById(parentDeptId).getManagerId();
+                        }
+                    }
+                    if (curDeptManagerId != null) {
+                        setting.setAuditDeptManagerName(userMapper.selectById(curDeptManagerId).getName());
+                    }
+                }
+            }
+        }
+        return workflowList;
+    }
 
+    private List<ProjectAuditor> getProjectAuditorList(Company company, Integer projectId, User user, TimeType timeType) {
+        int mode = 0;
+        List<ProjectAuditor> auditorList = new ArrayList<>();
+        if (company.getNonProjectSimple() == 1) {
+            //启用了简易模式
+            Project project = projectMapper.selectById(projectId);
+            if (project.getIsPublic() == 1) {
+                //非项目,该员工的部门主要负责人审核
+                mode = 1;
+                String superiorId = null;
+                //优先取员工的上级领导
+                if (timeType.getReportAuditType() == 0) {
+                    superiorId = user.getSuperiorId();
+                }
+                //其次取员工的部门主要负责人
+                if (superiorId == null) {
+                    Integer departmentId = user.getDepartmentId();
+                    Department department = departmentMapper.selectById(departmentId);
+                    if (department != null) {
+                        superiorId = department.getManagerId();
+                    }
+                }
+                if (superiorId != null) {
+                    User superior = userMapper.selectById(superiorId);
+                    if (superior != null) {
+                        ProjectAuditor auditor = new ProjectAuditor();
+                        auditor.setAuditorId(superiorId);
+                        auditor.setAuditorName(superior.getName());
+                        auditorList.add(auditor);
+                    }
+                }
+            }
+        }
+        if (mode == 0) {
+            auditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", projectId));
+        }
+        return auditorList;
+    }
 }

+ 19 - 16
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -104,7 +104,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     private String path;
 
     @Override
-    public HttpRespMsg getByMonth(Integer companyId, String yearMonth,Integer deptId) {
+    public HttpRespMsg getByMonth(Integer companyId, String yearMonth,Integer deptId, Integer salaryType) {
         HttpRespMsg msg = new HttpRespMsg();
 //        List<Finance> financeList = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
         //查看当前部门包括子部门的人员
@@ -114,7 +114,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
         if (deptId == -1) {
             deptIds=null;
         }
-        List<Finance> financeList = financeMapper.selectListByDept(companyId, yearMonth,deptIds);
+        List<Finance> financeList = financeMapper.selectListByDept(companyId, yearMonth,deptIds, salaryType);
         TimeType timeType = timeTypeMapper.selectById(companyId);
         //当前月是否有项目日报数据
         List<Map<String, Object>> userList = reportMapper.selectFillReportUserList(companyId, yearMonth+"-01", DateTimeUtil.getLastDayOfYearMonth(yearMonth));
@@ -159,7 +159,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     }
 
     @Override
-    public HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, MultipartFile multipartFile, HttpServletRequest request) throws Exception {
+    public HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, Integer salaryType, MultipartFile multipartFile, HttpServletRequest request) throws Exception {
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("TOKEN"));
         //然后处理文件
@@ -187,7 +187,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
             List<Finance> financeList = new ArrayList<Finance>();
-            List<Finance> oldFinanceList = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
+            List<Finance> oldFinanceList = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth).eq("salary_type", salaryType));
             //获取月成本列表
             TimeType timeType = timeTypeMapper.selectById(companyId);
             //需要更新成本的人员数据
@@ -377,6 +377,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
 
                 finance.setCompanyId(companyId);
                 finance.setName(name);
+                finance.setSalaryType(salaryType);
                 //工号模式下,工号也不是必填,有工号优先按工号匹配
                 if (includeJobNumber) {
                     finance.setJobNumber(jobNumberCell!=null?jobNumberCell.getStringCellValue():null);
@@ -643,6 +644,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             log.setRecoverMonthcost(syncUserCost?1:0);
             log.setRecoverReport(syncHistoryReport?1:0);
             log.setState(1);//默认审核通过
+            log.setSalaryType(salaryType);
             financeImportMapper.insert(log);
         }catch (IOException e){
             e.printStackTrace();
@@ -668,7 +670,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     }
 
     @Override
-    public HttpRespMsg exportData(Integer groupByCategory,Integer onlyTotal, String yearMonth, Boolean assignNoProUser, Integer deptId,HttpServletRequest request) {
+    public HttpRespMsg exportData(Integer groupByCategory,Integer onlyTotal, String yearMonth, Boolean assignNoProUser, Integer deptId, Integer salaryType, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
@@ -837,7 +839,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 }
             }
 //            List<Finance> finances = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
-            List<Finance> finances = financeMapper.selectListByDept(companyId, yearMonth,deptIds);
+            List<Finance> finances = financeMapper.selectListByDept(companyId, yearMonth,deptIds, salaryType);
+
             List<Finance> noProjectUser = new ArrayList<>();
             //计算无项目的人员
             for (Finance f : finances) {
@@ -990,10 +993,10 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                         item.field1 = item.field1.add(field1Item);
                         item.field2 = item.field2.add(field2Item);
                         item.field3 = item.field3.add(field3Item);
-                        item.field4 = item.field4.add(field3Item);
-                        item.field5 = item.field5.add(field3Item);
-                        item.field6 = item.field6.add(field3Item);
-                        item.field7 = item.field7.add(field3Item);
+                        item.field4 = item.field4.add(field4Item);
+                        item.field5 = item.field5.add(field5Item);
+                        item.field6 = item.field6.add(field6Item);
+                        item.field7 = item.field7.add(field7Item);
                     } else {
                         item = new ProjectSumItem();
                         pList.add(item);
@@ -2010,7 +2013,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     }
 
     @Override
-    public HttpRespMsg getTimeCost(String yearMonth,Integer deptId, Boolean assignNoProUser, HttpServletRequest request) {
+    public HttpRespMsg getTimeCost(String yearMonth,Integer deptId, Boolean assignNoProUser, Integer salaryType, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
@@ -2070,7 +2073,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 }
             }
 //            List<Finance> finances = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
-            List<Finance> finances = financeMapper.selectListByDept(companyId, yearMonth,deptIds);
+            List<Finance> finances = financeMapper.selectListByDept(companyId, yearMonth,deptIds, salaryType);
             //未投入项目的人员
             ProjectSumItem noProjectItem = new ProjectSumItem();
             List<Finance> noProjectUser = new ArrayList<>();
@@ -2259,7 +2262,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     }
 
     @Override
-    public HttpRespMsg getNoProjectUsers(String yearMonth, HttpServletRequest request) {
+    public HttpRespMsg getNoProjectUsers(String yearMonth, Integer salaryType, HttpServletRequest request) {
         Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
 
         //获取月成本列表
@@ -2270,7 +2273,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
         endDate = endDate.plusMonths(1);
         List<Map<String, Object>> projectTimeList = reportMapper.getRealProjectTime(startDate, endDate, companyId);
 
-        List<Finance> finances = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
+        List<Finance> finances = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth).eq("salary_type", salaryType));
         List<Finance> noProjectUsers = new ArrayList<>();
         finances.forEach(f->{
             boolean has = false;
@@ -2313,7 +2316,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     }
 
     @Override
-    public HttpRespMsg exportFinance(String yearMonth,Integer deptId, HttpServletRequest request) {
+    public HttpRespMsg exportFinance(String yearMonth,Integer deptId, Integer salaryType, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
@@ -2371,7 +2374,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             if (deptId==-1){
                 deptIds=null;
             }
-            List<Finance> finances = financeMapper.selectListByDept(companyId, yearMonth,deptIds);
+            List<Finance> finances = financeMapper.selectListByDept(companyId, yearMonth,deptIds, salaryType);
             for (Finance f : finances) {
                 User user = userList.stream().filter(ul -> ul.getId().equals(f.getUserId())).findFirst().get();
                 BigDecimal cost = f.getTotalCost();

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

@@ -1020,18 +1020,18 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
                                                 } else {
                                                     //跨天请假,判断是第几天
                                                     String beginTime = oneSheet.getBeginTime() == null?"09:00":oneSheet.getBeginTime();
-                                                    String endTime = oneSheet.getEndTime() == null?"18:00":oneSheet.getEndTime();
+                                                    String endTime = oneSheet.getEndTime() == null?"18:30":oneSheet.getEndTime();
                                                     System.out.println("beginTime="+beginTime+",endTime="+endTime);
                                                     if (oneSheet.getStartDate().isEqual(date)) {
                                                         //第一天,到下班截止
-                                                        endTime = "18:00";
+                                                        endTime = "18:30";
                                                     } else if (oneSheet.getEndDate().isEqual(date)) {
                                                         //最后一天,从上班开始
                                                         beginTime = "09:00";
                                                     } else {
                                                         //中间天,全天
                                                         beginTime = "09:00";
-                                                        endTime = "18:00";
+                                                        endTime = "18:30";
                                                     }
                                                     //重新计算请假时长
                                                     leaveHours += WorkDayCalculateUtils.calculateLeaveWorkHours(beginTime, endTime, "12:00", "13:00");

+ 313 - 107
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -107,6 +107,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private UserFvTimeMapper userFvTimeMapper;
 
+    @Resource
+    private AuditWorkflowTimeSettingService auditWorkflowTimeSettingService;
     @Resource
     private DepartmentService departmentService;
     @Resource
@@ -451,32 +453,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             }
-            //雷电公司,需要显示工时占比,临时计算一下
-            if (companyId == 7030) {
-                for (Map map : nameList) {
-                    List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
-                    double total = 0;
-                    for (Map<String, Object> report : reportList) {
-                        total += (double)report.get("time");
-                    }
-                    //计算占比
-                    int progressTotal = 0;
-                    for (int i = 0; i< reportList.size(); i++) {
-                        Map<String, Object> report = reportList.get(i);
-                        double progress = 100*(double)report.get("time")/total;
-                        int pInt = new BigDecimal(progress).setScale(0, RoundingMode.HALF_UP).intValue();
-                        if (i < reportList.size() -1) {
-                            progressTotal += pInt;
-                            //对progress四舍五入到整数位
-                            report.put("progress", pInt);
-                        } else {
-                            //最后一个,反算,避免四舍五入造成的误差导致总和不是100
-                            report.put("progress", 100 - progressTotal);
-                        }
-                    }
-                }
-            }
-
             //设置照片
             for (Map map : nameList) {
                 List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
@@ -649,7 +625,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             String userId = request.getHeader("Token");
-            Integer companyId = userMapper.selectById(userId).getCompanyId();
+            User user = userMapper.selectById(userId);
+            Integer companyId = user.getCompanyId();
             Company company = companyMapper.selectById(companyId);
             Map<String, Object> resultMap = new HashMap<>();
             //获取某日本人的所有日志
@@ -778,49 +755,67 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 //项目的审核人
                 if (reportAuditType == 0) {
-                    //对于简单模式的非项目,直接获取部门主管作为审核人
-                    if (company.getNonProjectSimple() == 1 && project.getIsPublic() == 1) {
-                        User user = userMapper.selectById(r.getCreatorId());
-                        //优先取个人的非项目审核人
-                        String superiorId = user.getSuperiorId();
-                        //其次取员工的部门主要负责人
-                        boolean isDirectSuperior = true;
-                        if (superiorId == null) {
-                            isDirectSuperior = false;
-                            Integer departmentId = user.getDepartmentId();
-                            Department department = departmentMapper.selectById(departmentId);
-                            if (department != null) {
-                                superiorId = department.getManagerId();
-                            }
-                        }
-                        if (superiorId != null) {
-                            User superior = userMapper.selectById(superiorId);
-                            if (superior != null) {
-                                List<ProjectAuditor> auditorList1 = new ArrayList<>();
-                                ProjectAuditor auditor = new ProjectAuditor();
-                                auditor.setAuditorId(superiorId);
-                                auditor.setAuditorName(superior.getName());
-                                if (isDirectSuperior) {
-                                    Integer deptId = user.getDepartmentId();
-                                    Department department = departmentMapper.selectById(deptId);
-                                    auditor.setAuditorDeptName(department != null? department.getDepartmentName(): null);
+                    if (timeType.getReportWorkflow() == 1) {
+                        //带审批流的模式
+                        List<AuditWorkflowTimeSetting> auditWorkflowTimeSettings = auditWorkflowTimeSettingService.getWorkFlowListForReport(user, company, timeType, project.getId());
+                        r.setAuditWorkflow(auditWorkflowTimeSettings);
+                        for (AuditWorkflowTimeSetting auditWorkflowTimeSetting : auditWorkflowTimeSettings) {
+                            if (auditWorkflowTimeSetting.getIsDeptAudit() == 0) {
+                                r.setAuditUserList(auditWorkflowTimeSetting.getProjectAuditors());
+                                if (r.getProjectAuditorId() != null) {
+                                    Optional<ProjectAuditor> auItem = auditWorkflowTimeSetting.getProjectAuditors().stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
+                                    if (auItem.isPresent()) {
+                                        r.setProjectAuditorName(auItem.get().getAuditorName());
+                                    }
                                 }
-                                auditorList1.add(auditor);
-                                r.setAuditUserList(auditorList1);
-                            }
-                        }
-                        if (r.getProjectAuditorId() != null) {
-                            Optional<ProjectAuditor> auItem = r.getAuditUserList().stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
-                            if (auItem.isPresent()) {
-                                r.setProjectAuditorName(auItem.get().getAuditorName());
+                                break;
                             }
                         }
                     } else {
-                        r.setAuditUserList(auditorList.stream().filter(au->au.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
-                        if (r.getProjectAuditorId() != null) {
-                            Optional<ProjectAuditor> auItem = auditorList.stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
-                            if (auItem.isPresent()) {
-                                r.setProjectAuditorName(auItem.get().getAuditorName());
+                        //不带审批流的模式
+                        //对于简单模式的非项目,直接获取部门主管作为审核人
+                        if (company.getNonProjectSimple() == 1 && project.getIsPublic() == 1) {
+                            //优先取个人的非项目审核人
+                            String superiorId = user.getSuperiorId();
+                            //其次取员工的部门主要负责人
+                            boolean isDirectSuperior = true;
+                            if (superiorId == null) {
+                                isDirectSuperior = false;
+                                Integer departmentId = user.getDepartmentId();
+                                Department department = departmentMapper.selectById(departmentId);
+                                if (department != null) {
+                                    superiorId = department.getManagerId();
+                                }
+                            }
+                            if (superiorId != null) {
+                                User superior = userMapper.selectById(superiorId);
+                                if (superior != null) {
+                                    List<ProjectAuditor> auditorList1 = new ArrayList<>();
+                                    ProjectAuditor auditor = new ProjectAuditor();
+                                    auditor.setAuditorId(superiorId);
+                                    auditor.setAuditorName(superior.getName());
+                                    if (isDirectSuperior) {
+                                        Integer deptId = user.getDepartmentId();
+                                        Department department = departmentMapper.selectById(deptId);
+                                        auditor.setAuditorDeptName(department != null? department.getDepartmentName(): null);
+                                    }
+                                    auditorList1.add(auditor);
+                                    r.setAuditUserList(auditorList1);
+                                }
+                            }
+                            if (r.getProjectAuditorId() != null) {
+                                Optional<ProjectAuditor> auItem = r.getAuditUserList().stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
+                                if (auItem.isPresent()) {
+                                    r.setProjectAuditorName(auItem.get().getAuditorName());
+                                }
+                            }
+                        } else {
+                            r.setAuditUserList(auditorList.stream().filter(au->au.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
+                            if (r.getProjectAuditorId() != null) {
+                                Optional<ProjectAuditor> auItem = auditorList.stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
+                                if (auItem.isPresent()) {
+                                    r.setProjectAuditorName(auItem.get().getAuditorName());
+                                }
                             }
                         }
                     }
@@ -831,15 +826,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         if (tgoup.isPresent()) {
                             TaskGroup curGroup = tgoup.get();
                             if (!StringUtils.isEmpty(curGroup.getInchargerId())) {
-                                User user = userMapper.selectById(curGroup.getInchargerId());
+                                User auditor = userMapper.selectById(curGroup.getInchargerId());
                                 HashMap map = new HashMap();
-                                map.put("auditorId", user.getId());
-                                map.put("auditorName", user.getName());
+                                map.put("auditorId", auditor.getId());
+                                map.put("auditorName", auditor.getName());
                                 List list = new ArrayList();
                                 list.add(map);
                                 r.setAuditUserList(list);
                                 if (r.getProjectAuditorId() != null) {
-                                    r.setProjectAuditorName(user.selectById(r.getProjectAuditorId()).getName());
+                                    r.setProjectAuditorName(userMapper.selectById(r.getProjectAuditorId()).getName());
                                 }
                             }
                         }
@@ -942,7 +937,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 showRefresh = true;
             } else if (timeType.getShowCorpwxCardtime() == 1) {
-                User user = userMapper.selectById(userId);
                 List<UserCorpwxTime> corpwxTimes = null;
                 if (user.getCorpwxUserid() != null) {
                     corpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
@@ -1250,7 +1244,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
      * @return
      */
     @Override
-    public HttpRespMsg getMissingCardTimeUserList(String startDate, String endDate, HttpServletRequest request) {
+    public HttpRespMsg getMissingCardTimeUserList(String startDate, String endDate, Integer departmentId, HttpServletRequest request) {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         int companyId = user.getCompanyId();
@@ -1258,17 +1252,31 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg msg = new HttpRespMsg();
         LocalDate start = LocalDate.parse(startDate);
         LocalDate end = LocalDate.parse(endDate);
+        if (end.isAfter(LocalDate.now())) {
+            end = LocalDate.now();//最大到今天
+        }
         //间隔不能超过31天
         if (start.until(end, ChronoUnit.DAYS) > 31) {
             msg.setError("日期间隔不能超过31天");
             return msg;
         }
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId)
+        //部门筛选
+        List<Integer> departmentIdList = null;
+        if (departmentId != null) {
+            List<Department> allDeptList = departmentService.list(new QueryWrapper<Department>().eq("company_id", companyId));
+            departmentIdList = departmentService.getDeptIncludeSubDeptIds(departmentId, allDeptList);
+        }
+        QueryWrapper<User> userWrapper = new QueryWrapper<User>().eq("company_id", companyId).eq("report_status", 0)
                 .and(wrapper->wrapper.eq("is_active", 1)
-                        .or(w2->w2.eq("is_active", 0).ge("inactive_date", startDate))));
+                        .or(w2->w2.eq("is_active", 0).ge("inactive_date", startDate)));
+        if (departmentIdList != null) {
+            userWrapper.in("department_id", departmentIdList);
+        }
+        List<User> userList = userMapper.selectList(userWrapper);
+        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         List<UserWorkDayVO> retDataList = new ArrayList<>();
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        if (timeType.getShowDdCardtime() == 1) {
+        if (timeType.getSyncDingding() == 1) {
             List<UserDingdingTime> dingdingTimeList = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().eq("company_id", companyId)
                     .between("work_date", startDate, endDate));
             while (!start.isAfter(end)) {
@@ -1281,6 +1289,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             userCorpwxTime.setUserId(curUser.getId());
                             userCorpwxTime.setUserName(curUser.getName());
                             userCorpwxTime.setWorkDate(startStr);
+                            Department department = departmentList.stream().filter(d -> d.getDepartmentId().equals(curUser.getDepartmentId())).findFirst().orElse(null);
+                            if (department != null) {
+                                userCorpwxTime.setDepartmentName(department.getDepartmentName());
+                            }
                             retDataList.add(userCorpwxTime);
                         }
                     }
@@ -1290,7 +1302,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }else if(timeType.getSyncFanwei()==1){
             List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>().eq("company_id", companyId)
                     .between("work_date", startDate, endDate));
-            while (start.isBefore(end)) {
+            while (!start.isAfter(end)) {
                 String startStr = df.format(start);
                 for (User curUser : userList) {
                     boolean find = userFvTimeList.stream().anyMatch(time->time.getUserId().equals(curUser.getId()) && df.format(time.getWorkDate()).equals(startStr));
@@ -1299,6 +1311,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         userCorpwxTime.setUserId(curUser.getId());
                         userCorpwxTime.setUserName(curUser.getName());
                         userCorpwxTime.setWorkDate(startStr);
+                        Department department = departmentList.stream().filter(d -> d.getDepartmentId().equals(curUser.getDepartmentId())).findFirst().orElse(null);
+                        if (department != null) {
+                            userCorpwxTime.setDepartmentName(department.getDepartmentName());
+                        }
                         retDataList.add(userCorpwxTime);
                     }
                 }
@@ -1307,7 +1323,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }else if (timeType.getSyncCorpwxTime() == 1) {
             List<UserCorpwxTime> corpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>().eq("company_id", companyId)
                     .between("create_date", startDate, endDate));
-            while (start.isBefore(end)) {
+            while (!start.isAfter(end)) {
                 String startStr = df.format(start);
                 for (User curUser : userList) {
                     boolean find = corpwxTimeList.stream().anyMatch(time -> time.getCorpwxUserid().equals(curUser.getCorpwxUserid()) && df.format(time.getCreateDate()).equals(startStr));
@@ -1316,6 +1332,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         userCorpwxTime.setUserId(curUser.getId());
                         userCorpwxTime.setUserName(curUser.getName());
                         userCorpwxTime.setWorkDate(startStr);
+                        Department department = departmentList.stream().filter(d -> d.getDepartmentId().equals(curUser.getDepartmentId())).findFirst().orElse(null);
+                        if (department != null) {
+                            userCorpwxTime.setDepartmentName(department.getDepartmentName());
+                        }
                         retDataList.add(userCorpwxTime);
                     }
                 }
@@ -6656,6 +6676,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             titles.add("部门主要负责人");
             titles.add(MessageUtils.message("entry.projectId"));
             titles.add(MessageUtils.message("entry.projectName"));
+            //景昱增加项目描述
+            List<Project> allProjectList = null;
+            if (companyId == 5978) {
+                titles.add("项目描述");
+                allProjectList = projectMapper.selectList(new QueryWrapper<Project>().select("project_code, project_desc").eq("company_id", companyId));
+            }
+
             if(companyId == 7536){
                 titles.add("工单号");
                 titles.add("行号");
@@ -7003,8 +7030,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     item.add(departmentService.getSupDepartment(dept,departments));
                     item.add(managerName != null?managerName:"");
                 }
-                item.add((String) map.get("projectCode"));
+                String projectCode = (String) map.get("projectCode");
+                item.add(projectCode);
                 item.add((String) map.get("project"));
+                //景昱增加项目描述
+                if (companyId == 5978 && allProjectList != null) {
+                    Project curProject = allProjectList.stream().filter(p->p.getProjectCode() != null && p.getProjectCode().equals(projectCode)).findFirst().orElse(null);
+                    if (curProject != null) {
+                        item.add(curProject.getProjectDesc());
+                    } else {
+                        item.add("");
+                    }
+                }
                 //泓浒,增加工单号和行号
                 if(companyId == 7536){
                     item.add((String) map.get("extraField4"));
@@ -9160,43 +9197,63 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 //项目的审核人
                 if (reportAuditType == 0) {
-                    int mode = 0;
-                    if (company.getNonProjectSimple() == 1) {
-                        //启用了简易模式
-                        Optional<Project> pOption = allProjectList.stream().filter(p->p.getId().equals(r.getProjectId())).findFirst();
-                        if (pOption.isPresent()) {
-                            Project project = pOption.get();
-                            List<ProjectAuditor> pAuditorList = new ArrayList<>();
-                            if (project.getIsPublic() == 1) {
-                                //非项目,该员工的部门主要负责人审核
-                                mode = 1;
-                                //优先取员工的上级领导
-                                String superiorId = user.getSuperiorId();
-                                if (superiorId == null) {
-                                    Integer departmentId = user.getDepartmentId();
-                                    Department department = departmentMapper.selectById(departmentId);
-                                    if (department != null) {
-                                        superiorId = department.getManagerId();
+                    if (timeType.getReportWorkflow() == 1) {
+                        //带审批流的模式
+                        List<AuditWorkflowTimeSetting> auditWorkflowTimeSettings = auditWorkflowTimeSettingService.getWorkFlowListForReport(user, company, timeType, r.getProjectId());
+                        r.setAuditWorkflow(auditWorkflowTimeSettings);
+                        for (AuditWorkflowTimeSetting auditWorkflowTimeSetting : auditWorkflowTimeSettings) {
+                            if (auditWorkflowTimeSetting.getIsDeptAudit() == 0) {
+                                r.setAuditUserList(auditWorkflowTimeSetting.getProjectAuditors());
+                                if (r.getProjectAuditorId() != null) {
+                                    Optional<ProjectAuditor> auItem = auditWorkflowTimeSetting.getProjectAuditors().stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
+                                    if (auItem.isPresent()) {
+                                        r.setProjectAuditorName(auItem.get().getAuditorName());
                                     }
                                 }
+                                break;
+                            }
+                        }
+                    } else {
+                        //不带审批流的模式
+                        int mode = 0;
+                        if (company.getNonProjectSimple() == 1) {
+                            //启用了简易模式
+                            Optional<Project> pOption = allProjectList.stream().filter(p->p.getId().equals(r.getProjectId())).findFirst();
+                            if (pOption.isPresent()) {
+                                Project project = pOption.get();
+                                List<ProjectAuditor> pAuditorList = new ArrayList<>();
+                                if (project.getIsPublic() == 1) {
+                                    //非项目,该员工的部门主要负责人审核
+                                    mode = 1;
+                                    //优先取员工的上级领导
+                                    String superiorId = user.getSuperiorId();
+                                    if (superiorId == null) {
+                                        Integer departmentId = user.getDepartmentId();
+                                        Department department = departmentMapper.selectById(departmentId);
+                                        if (department != null) {
+                                            superiorId = department.getManagerId();
+                                        }
+                                    }
 
-                                if (superiorId != null) {
-                                    User superior = userMapper.selectById(superiorId);
-                                    if (superior != null) {
-                                        ProjectAuditor auditor = new ProjectAuditor();
-                                        auditor.setAuditorId(superiorId);
-                                        auditor.setAuditorName(superior.getName());
-                                        pAuditorList.add(auditor);
+                                    if (superiorId != null) {
+                                        User superior = userMapper.selectById(superiorId);
+                                        if (superior != null) {
+                                            ProjectAuditor auditor = new ProjectAuditor();
+                                            auditor.setAuditorId(superiorId);
+                                            auditor.setAuditorName(superior.getName());
+                                            pAuditorList.add(auditor);
+                                        }
                                     }
+                                    r.setAuditUserList(pAuditorList);
                                 }
-                                r.setAuditUserList(pAuditorList);
                             }
                         }
+                        if (mode == 0) {
+                            List<ProjectAuditor> pAuditorList = auditorList.stream().filter(au->au.getProjectId().equals(r.getProjectId())).collect(Collectors.toList());
+                            r.setAuditUserList(pAuditorList);
+                        }
                     }
-                    if (mode == 0) {
-                        List<ProjectAuditor> pAuditorList = auditorList.stream().filter(au->au.getProjectId().equals(r.getProjectId())).collect(Collectors.toList());
-                        r.setAuditUserList(pAuditorList);
-                    }
+
 
                     if (r.getProjectAuditorId() != null) {
                         List<ProjectAuditor> auList = r.getAuditUserList();
@@ -13527,6 +13584,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 userDdTimeList = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>()
                         .eq("company_id", companyId)
                         .eq("dingding_userid", targetUser.getDingdingUserid())
+                        .gt("work_hours", 0)
                         .between("work_date", localStart, localEnd));
             }
             
@@ -13664,6 +13722,154 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportAbnormalReportList(String startDate, String endDate, String userId, HttpServletRequest request) {
+        // 调用getAbnormalReportList获取数据,不分页
+        HttpRespMsg msg = getAbnormalReportList(startDate, endDate, userId, null, null);
+        if (msg.data == null) {
+            return msg;
+        }
+        
+        Map<String, Object> dataMap = (Map<String, Object>) msg.data;
+        List<Map<String, Object>> reportMapList = (List<Map<String, Object>>) dataMap.get("result");
+        
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        Company company = companyMapper.selectById(user.getCompanyId());
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", company.getId()));
+        
+        // 准备导出数据
+        List<List<String>> dataList = new ArrayList<>();
+        // 添加表头
+        List<String> header = new ArrayList<>();
+        header.add("姓名");
+        header.add("部门");
+        header.add("日期");
+        header.add("项目名称");
+        header.add("工作内容");
+        header.add("工作时长(h)");
+        header.add("状态");
+        dataList.add(header);
+        
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        
+        // 填充数据
+        for (Map<String, Object> reportMap : reportMapList) {
+            List<String> dataItem = new ArrayList<>();
+            
+            // 姓名
+            dataItem.add(reportMap.get("userName") != null ? String.valueOf(reportMap.get("userName")) : "");
+            
+            // 部门
+            dataItem.add(reportMap.get("departmentName") != null ? String.valueOf(reportMap.get("departmentName")) : "");
+            
+            // 日期
+            if (reportMap.get("createDate") != null) {
+                if (reportMap.get("createDate") instanceof java.sql.Date) {
+                    dataItem.add(sdf.format((java.sql.Date)reportMap.get("createDate")));
+                } else {
+                    dataItem.add(String.valueOf(reportMap.get("createDate")));
+                }
+            } else {
+                dataItem.add("");
+            }
+            
+            // 项目名称
+            dataItem.add(reportMap.get("projectName") != null ? String.valueOf(reportMap.get("projectName")) : "");
+            
+            // 工作内容
+            String content = reportMap.get("content") != null ? String.valueOf(reportMap.get("content")) : "";
+            dataItem.add(content);
+            
+            // 工作时长
+            dataItem.add(reportMap.get("workingTime") != null ? String.valueOf(reportMap.get("workingTime")) : "0");
+            
+            // 状态
+            String state = "";
+            if (reportMap.get("state") != null) {
+                Integer stateValue = (Integer)reportMap.get("state");
+                switch (stateValue) {
+                    case 0:
+                        state = "待审核";
+                        break;
+                    case 1:
+                        state = "已通过";
+                        break;
+                    case 2:
+                        state = "已驳回";
+                        break;
+                    case 3:
+                        state = "草稿";
+                        break;
+                    default:
+                        state = "未知";
+                }
+            }
+            dataItem.add(state);
+            
+            dataList.add(dataItem);
+        }
+        
+        String fileName = "异常工时列表_" + System.currentTimeMillis();
+        String exportPath = company.getId() + "/exportFile/";
+        
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, dingding, fileName, dataList, exportPath);
+        } catch (Exception e) {
+            e.printStackTrace();
+            HttpRespMsg errorMsg = new HttpRespMsg();
+            errorMsg.setError("导出失败:" + e.getMessage());
+            return errorMsg;
+        }
+    }
+
+    public HttpRespMsg exportMissingCardTimeUserList(String startDate, String endDate, Integer departmentId, HttpServletRequest request) {
+        HttpRespMsg msg = getMissingCardTimeUserList(startDate, endDate, departmentId, request);
+        List<UserWorkDayVO> retDataList = (List<UserWorkDayVO>)msg.data;
+        //导出到Excel中
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+        
+        List<List<String>> dataList = new ArrayList<>();
+        List<String> titleList = new ArrayList<>();
+        titleList.add(MessageUtils.message("entry.serialNo"));//序号
+        titleList.add(MessageUtils.message("entry.name"));//姓名
+        titleList.add(MessageUtils.message("excel.department"));//部门
+        titleList.add("缺勤日期");//工作日期
+        dataList.add(titleList);
+        
+        for (int i = 0; i < retDataList.size(); i++) {
+            UserWorkDayVO userWorkDay = retDataList.get(i);
+            List<String> dataItem = new ArrayList<>();
+            dataItem.add("" + (i + 1));
+            
+            if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
+                dataItem.add("$userName=" + (userWorkDay.getUserId() == null ? "" : userWorkDay.getUserId()) + "$");
+                dataItem.add("$departmentName=" + (userWorkDay.getDepartmentName() == null ? "" : userWorkDay.getDepartmentName()) + "$");
+            } else if (dingding != null && dingding.getContactNeedTranslate() == 1) {
+                dataItem.add("$userName=" + (userWorkDay.getUserName() == null ? "" : userWorkDay.getUserName()) + "$");
+                dataItem.add("$departmentName=" + (userWorkDay.getDepartmentName() == null ? "" : userWorkDay.getDepartmentName()) + "$");
+            } else {
+                dataItem.add(userWorkDay.getUserName());
+                dataItem.add(userWorkDay.getDepartmentName());
+            }
+            dataItem.add(userWorkDay.getWorkDate());
+            dataList.add(dataItem);
+        }
+        
+        //生成excel文件导出
+        String fileName = "缺勤人员列表_" + startDate+"至" + endDate + "_" + System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, dingding, fileName, dataList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return msg;
+    }
+
     public String getWeek(DayOfWeek dayOfWeek){
         //获取中文形式的星期几
         String dayOfWeekChinese = "";

+ 146 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
+import com.management.platform.service.OvertimeAllowanceService;
 import com.management.platform.service.TimeTypeService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.service.WxCorpTemplateService;
@@ -187,6 +188,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
     @Resource
     private ParticipationMapper participationMapper;
+    @Autowired
+    private OvertimeAllowanceService overtimeAllowanceService;
 
 
     //获取服务商provider_access_token
@@ -1104,11 +1107,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                 baseMorningStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("work_sec"));
                                 baseMorningEnd = "12:00";
                                 //针对雷电,下午是12:30上班
-                                if (corpInfo.getCompanyId() == 7030) {
-                                    baseAfternoonStart = "12:30";
-                                } else {
-                                    baseAfternoonStart = "13:00";
-                                }
+                                baseAfternoonStart = "13:00";
                                 baseAfternoonEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("off_work_sec"));
                             } else {
                                 baseMorningStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("work_sec"));
@@ -1117,7 +1116,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                 baseAfternoonEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(1).getIntValue("off_work_sec"));
                             }
                             if (workRules.size() <= 1) {
-                                restTime = corpInfo.getCompanyId() == 7030?0.5:1.0;
+                                restTime = 1.0;
                             } else {
                                 restTime = 1.0 * (workRules.getJSONObject(1).getIntValue("work_sec") - workRules.getJSONObject(0).getIntValue("off_work_sec")) / 3600;
                             }
@@ -1188,9 +1187,140 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                             userCorpwxTimeMapper.insert(userCorpwxTime);
                         }
                     }
+                    //处理曦合超导的加班补贴
+                    if (corpInfo.getCompanyId() == 8555) {
+                        handleAllowance(userCorpwxTime, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, restTime);
+                    }
+                }
+            }
+        }
+    }
+
+    private void handleAllowance(UserCorpwxTime userCorpwxTime, String baseMorningStart, String baseMorningEnd, String baseAfternoonStart, String baseAfternoonEnd, double restTime) {
+        System.out.println("处理餐补");
+        OvertimeAllowance allowance = new OvertimeAllowance();
+        allowance.setCompmanyId(userCorpwxTime.getCompanyId());
+        allowance.setCorpwxUserid(userCorpwxTime.getCorpwxUserid());
+        allowance.setDate(userCorpwxTime.getCreateDate());
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm");
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDateTime startTime = LocalDateTime.parse(dateTimeFormatter.format(userCorpwxTime.getCreateDate()) + " " + userCorpwxTime.getStartTime(), df);
+        LocalDateTime endTime = LocalDateTime.parse(dateTimeFormatter.format(userCorpwxTime.getCreateDate()) + " " + userCorpwxTime.getEndTime(), df);
+        if (endTime.isBefore(startTime)) {
+            endTime = endTime.plusDays(1);
+        }
+        if (startTime.toLocalTime().isBefore(LocalTime.parse(baseMorningStart,df))) {
+            //上班时间校准为正常上班开始时间
+            startTime.withHour(Integer.parseInt(baseMorningStart.split(":")[0])).withMinute(Integer.parseInt(baseMorningStart.split(":")[1])).withSecond(0).withNano(0);
+        }
+        allowance.setStartTime(startTime);
+        allowance.setEndTime(endTime);
+        String startTimeTxt = userCorpwxTime.getStartTime();
+        String endTimeTxt = userCorpwxTime.getEndTime();
+        //判断是否是加班
+        BigDecimal bigDecimal = new BigDecimal(Duration.between(startTime,endTime).toMinutes());
+        bigDecimal = bigDecimal.divide(BigDecimal.valueOf(60),1,BigDecimal.ROUND_HALF_UP);//按小时为单位
+        double standWorkHours = 8.0;
+//        System.out.println("打卡时长(分钟):" + bigDecimal);
+        double onDutyTime = bigDecimal.doubleValue();
+        allowance.setOnDutyHours(onDutyTime);
+        double time = onDutyTime;
+        if (startTimeTxt.compareTo(baseMorningEnd) <= 0 && endTimeTxt.compareTo(baseAfternoonStart) >= 0) {
+            //重新计算实际工作工时时长,需要减去中间午休时间
+            time = time - restTime;
+//            System.out.println("午休时间:" + restTime + ", 减去后,工作时长=" + bigDecimal);
+        }
+        //按小时为单位计算
+        //超过8小时,进行加班补贴
+        if (time < 0) {
+            time = 0;
+        }
+        allowance.setWorkHours(time);//实际工作时长
+//        System.out.println("计算加班时长==" + (time - standWorkHours));
+        if (time - standWorkHours > 0) {
+            //是否是工作日加班
+            if (WorkDayCalculateUtils.isWorkDay(userCorpwxTime.getCreateDate())) {
+                if (startTimeTxt.compareTo(baseMorningEnd) < 0) {
+                    //白班,正常工作上午来上班的情况,计算晚上加班的时间
+                    if (time - standWorkHours >= 3.0) {
+                        //当天加班,补贴20
+                        if (endTime.toLocalDate().compareTo(startTime.toLocalDate()) == 0) {
+                            allowance.setType(0);
+                            allowance.setOvertimeDuration(time - standWorkHours);
+                            allowance.setAllowance(20);
+                        } else {
+                            //跨天,加班超过凌晨了,补贴30
+                            allowance.setType(1);
+                            allowance.setOvertimeDuration(time - standWorkHours);
+                            allowance.setAllowance(30);
+                        }
+                    } else {
+                        //不足3小时
+//                        System.out.println("工作日加班不足3小时:"+(time - standWorkHours));
+                    }
+                } else if (startTimeTxt.compareTo("16:00") >= 0) {
+                    //晚班,计算白班加班的时间
+                    if (time >= 12.0) {
+                        //大夜班,超过12小时了
+                        allowance.setType(3);
+                        allowance.setOvertimeDuration(time - standWorkHours);
+                        allowance.setAllowance(50);
+                    } else {
+                        //跨天,加班超过凌晨了,补贴30
+                        allowance.setType(2);
+                        allowance.setOvertimeDuration(time - standWorkHours);
+                        allowance.setAllowance(30);
+                    }
+                }
+            } else {
+                //非工作日,判断是否为全天加班
+                if (time - standWorkHours >= 0) {
+                    if (startTimeTxt.compareTo(baseMorningEnd) < 0) {
+                        if (endTime.toLocalDate().isEqual(startTime.toLocalDate())) {
+                            allowance.setType(4);
+                            allowance.setOvertimeDuration(time - standWorkHours);
+                            allowance.setAllowance(20);
+//                            System.out.println("非工作日,加班白班全天");
+                        } else {
+                            //TODO: 非工作日,加班超过凌晨了,怎么计算
+//                            allowance.setType(1);
+//                            allowance.setOvertimeDuration(time - standWorkHours);
+//                            allowance.setAllowance(30);
+                        }
+                    } else if (startTimeTxt.compareTo("16:00") >= 0) {
+                        //晚班,计算白班加班的时间
+                        if (time >= 12.0) {
+                            //大夜班,超过12小时了
+                            allowance.setType(3);
+                            allowance.setOvertimeDuration(time - standWorkHours);
+                            allowance.setAllowance(50);
+                        } else {
+                            //跨天,加班超过凌晨了,补贴30
+                            allowance.setType(2);
+                            allowance.setOvertimeDuration(time - standWorkHours);
+                            allowance.setAllowance(30);
+                        }
+                    }
                 }
             }
         }
+
+        //保存数据
+//        System.out.println("最终allowance==" + allowance.getAllowance());
+        if (allowance.getAllowance() != null) {
+            OvertimeAllowance oldAllowance = overtimeAllowanceService.getOne(new QueryWrapper<OvertimeAllowance>()
+                    .eq("corpwx_userid", userCorpwxTime.getCorpwxUserid()).eq("date", userCorpwxTime.getCreateDate()));
+            if (oldAllowance == null) {
+                //插入数据
+                overtimeAllowanceService.save(allowance);
+            } else {
+                //更新数据
+                oldAllowance.setAllowance(allowance.getAllowance());
+                oldAllowance.setOvertimeDuration(allowance.getOvertimeDuration());
+                oldAllowance.setType(allowance.getType());
+                overtimeAllowanceService.updateById(oldAllowance);
+            }
+        }
     }
 
     @Override
@@ -1350,12 +1480,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     } else if (workRules.size() == 1) {
                         baseMorningStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("work_sec"));
                         baseMorningEnd = "12:00";
-                        //针对雷电,下午是12:30上班
-                        if (corpInfo.getCompanyId() == 7030) {
-                            baseAfternoonStart = "12:30";
-                        } else {
-                            baseAfternoonStart = "13:00";
-                        }
+                        baseAfternoonStart = "13:00";
                         baseAfternoonEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("off_work_sec"));
                     } else {
                         baseMorningStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("work_sec"));
@@ -1365,7 +1490,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     }
                     double restTime = 0.0;//小时为单位
                     if (workRules.size() <= 1) {
-                        restTime = corpInfo.getCompanyId() == 7030?0.5:1.0;
+                        restTime = 1.0;
                     } else {
                         restTime = 1.0 * (workRules.getJSONObject(1).getIntValue("work_sec") - workRules.getJSONObject(0).getIntValue("off_work_sec")) / 3600;
                     }
@@ -1938,10 +2063,18 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                             if (showLog) System.out.println("更新考勤记录"+curUserid+", "+localDate);
                             userCorpwxTimeMapper.updateById(ct);
                         }
+                        if (corpInfo.getCompanyId() == 8555) {
+                            handleAllowance(item, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, restTime);
+                        }
+
                     } else {
                         if (hasTimeRecord) {
                             if (showLog) System.out.println("插入考勤记录"+curUserid+", "+localDate);
                             userCorpwxTimeMapper.insert(ct);
+                            if (corpInfo.getCompanyId() == 8555) {
+                                handleAllowance(ct, baseMorningStart, baseMorningEnd, baseAfternoonStart, baseAfternoonEnd, restTime);
+                            }
+
                         } else {
                             //调用打卡详情去获取,弥补外出打卡且时间不在自动同步范围内的情况; 仅对工作日有效
                             if (timeTypeService.isWorkDay(corpInfo.getCompanyId(), localDate, timeType, holidaySettings)) {

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/FinanceMapper.xml

@@ -51,6 +51,9 @@
             <if test="yearMonth !=null and yearMonth !='' ">
                 and f.ymonth=#{yearMonth}
             </if>
+            <if test="salaryType != null" >
+                and f.salary_type=#{salaryType}
+            </if>
         </where>
     </select>
 

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

@@ -1096,7 +1096,7 @@
         FROM user
         left join report on user.id = report.creator_id
         left join department on department.department_id = user.department_id
-        WHERE user.company_id = #{companyId} and (user.is_active=1 or(user.is_active=0 and user.inactive_date>=#{startDate}))
+        WHERE user.company_id = #{companyId} and (user.is_active=1 or(user.is_active=0 and user.inactive_date>=#{startDate})) AND user.`report_status` = 0
         <if test="deptIds != null">
             AND ((user.department_id in
             <foreach collection="deptIds" separator="," index="index" item="item" close=")" open="(">
@@ -1799,7 +1799,7 @@
 
     <select id="getAbnormalData" resultType="java.util.Map">
         SELECT a.id, a.creator_id as creatorId, c.name,c.job_number as jobNumber,c.corpwx_userid as corpwxUserId,c.corpwx_deptid as corpwxDeptId,
-        b.project_name AS project,b.project_code as projectCode, a.working_time AS duration, a.content, a.create_time  AS time,a.create_date as createDate,
+        b.project_name AS project,b.project_code as projectCode, a.working_time AS duration, a.content, a.create_time  AS time,date_format(a.create_date, '%Y-%m-%d') as createDate,
         a.state, a.time_type as timeType, a.cost, a.start_time as startTime,u.job_number as jobNumber,
         a.end_time  as endTime, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState,  a.pic_str as picStr, multi_worktime as multiWorktime,a.is_dept_audit as isDeptAudit,

+ 125 - 20
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -465,10 +465,9 @@
                             <span style="margin-left:70px;color:#666;">异常填报</span>
                             <el-switch v-model="workForm.abnormalTime" :disabled="!canEdit"></el-switch>
                         </template>
-                        
                     </el-form-item>
                     <!-- 000000 -->
-                    <div v-for="(domain, index) in workForm.domains" :key="domain.id" :style="index>0?'margin-top:10px;':''">
+                    <div v-for="(domain, index) in workForm.domains" :key="domain.id" :style="index>0?'padding-top:25px;':''" >
                         <div v-if="reportTimeType.multiWorktime==0">
                         <el-form-item v-if="reportTimeType.type != 3 && !(permissions.reportHideWorkingHours && workForm.domains[index].state == 1)" :label="reportTimeType.type ==2?$t('screening.workHours'):$t('screening.workTime')" :prop="'domains.' + index + '.'+timeFields[reportTimeType.type]"
                             :rules="{ required: true, message: $t('defaultText.pleaseSelectWorkingHours'), trigger: 'blur' }">
@@ -652,8 +651,8 @@
                             </el-select>
                         </el-form-item>
 
-                        <div v-if="user.timeType.reportAuditType != 1 && user.timeType.reportAuditType != 2 && user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && user.timeType.reportAuditType != 9 && user.timeType.reportAuditType != 10 && domain.auditUserList">
-                            <el-form-item v-if="user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && domain.auditUserList.length > 0">
+                        <div v-if="user.timeType.reportAuditType != 1 && user.timeType.reportAuditType != 2 && user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && user.timeType.reportAuditType != 9 && user.timeType.reportAuditType != 10 && (user.timeType.reportWorkflow || domain.auditUserList)">
+                            <el-form-item v-if="user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && (user.timeType.reportWorkflow || domain.auditUserList.length > 0)">
                                 <template slot="label">
                                     <span style="color:#FF0000;">*</span>
                                     <span>审核人</span>
@@ -1241,11 +1240,32 @@
 
                 <div class="zhoFel" v-if="user.timeType.reportAuditType == 0 || user.timeType.reportAuditType == 4">
                     <p>审核人</p>
-                    <el-select v-model="zhoBao.projectAuditorId" v-if="user.userNameNeedTranslate != 1" :placeholder="$t('defaultText.pleaseChoose')" clearable="true" style="width: 355px">
-                        <el-option v-for="item in zhoBao.auditUserList" :key="item.id" :label="item.auditorName" :value="item.auditorId"></el-option>
-                    </el-select>
+                    <!-- 按审批流显示审核人-->
+                    <template v-if="user.timeType.reportWorkflow">
+                        <span v-for="(nodeItem, nodeIndex) in zhoBao.auditWorkflow">
+                            <span v-if="nodeItem.isDeptAudit">
+                                <el-tag v-if="user.userNameNeedTranslate != '1'">{{ nodeItem.auditDeptManagerName }}</el-tag>
+                                <el-tag v-else><TranslationOpenDataText type='userName' :openid='nodeItem.auditDeptManagerName'></TranslationOpenDataText></el-tag>
+                            </span>
+                            <span v-else>
+                                <el-select v-model="zhoBao.projectAuditorId" @change="$forceUpdate()" v-if="user.userNameNeedTranslate != '1'" style="width:100px;">
+                                    <el-option v-for="item in zhoBao.auditUserList" :label="item.auditorName" :value="item.auditorId" :key="item.id">
+                                        <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.auditorName'></TranslationOpenDataText></span>
+                                        <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.auditorName}}</span>
+                                    </el-option>
+                                </el-select>
+                                <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :widthStr="'100'" :subject="zhoBao.auditUserList" :subjectId="zhoBao.projectAuditorId" :distinction="'1'" @selectCal="selectCal"></selectCat>
+                            </span>
+                            <i class="el-icon-right" v-if="nodeIndex < zhoBao.auditWorkflow.length-1" style="margin:0 10px;"></i>
+                        </span>
+                    </template>
+                    <template v-else>
+                        <el-select v-model="zhoBao.projectAuditorId" v-if="user.userNameNeedTranslate != 1" :placeholder="$t('defaultText.pleaseChoose')" clearable="true" style="width: 355px">
+                            <el-option v-for="item in zhoBao.auditUserList" :key="item.id" :label="item.auditorName" :value="item.auditorId"></el-option>
+                        </el-select>
 
-                    <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :widthStr="'355'" :subject="zhoBao.auditUserList" :subjectId="zhoBao.projectAuditorId" :distinction="'1'" @selectCal="selectCal"></selectCat>
+                        <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :widthStr="'355'" :subject="zhoBao.auditUserList" :subjectId="zhoBao.projectAuditorId" :distinction="'1'" @selectCal="selectCal"></selectCat>
+                    </template>
                 </div>
 
                 <template v-if="user.timeType.reportAuditType == 3">
@@ -2475,8 +2495,24 @@
                 <el-step title="员工提交"></el-step>
                 <el-step title="审核通过"></el-step>
                 </el-steps>
-                <el-divider v-if="user.companyId == 7544"></el-divider>
-                <p style="color:#aaaaaa;" v-if="user.companyId == 7544">审核记录</p>
+                <div v-else style="margin-bottom:10px;">
+                    <!--开启审批流设置的情况,多层审核-->
+                    <template v-if="user.timeType.reportWorkflow">
+                        <el-tag type="info">员工提交</el-tag><i class="el-icon-right" ></i>
+                        <span v-for="(nodeItem, nodeIndex) in currentAuditWorkflow">
+                            <span v-if="nodeItem.isDeptAudit">
+                                <el-tag v-if="user.userNameNeedTranslate != '1'">{{ nodeItem.auditDeptName }}</el-tag>
+                                <el-tag v-else><TranslationOpenDataText type='departmentName' :openid='nodeItem.auditDeptName'></TranslationOpenDataText></el-tag>
+                            </span>
+                            <span v-else>
+                                <el-tag type="success">项目审核人</el-tag>
+                            </span>
+                            <i class="el-icon-right" v-if="nodeIndex < currentAuditWorkflow.length-1" style="margin:0 10px;"></i>
+                        </span>
+                    </template>
+                </div>
+                <el-divider ></el-divider>
+                <p style="color:#aaaaaa;" >操作记录</p>
                 <el-timeline :reverse="false" style="margin-top:10px;">
                     <el-timeline-item v-for="item in approvalProcessData" :key="item.id" :timestamp="item.operateDate">
                         <!-- {{item.msg}} -->
@@ -2627,6 +2663,7 @@
                         
                     }
                 },
+                currentAuditWorkflow:[],
                 alalal: '8.0',
                 timeBasecostList:null,
                 tbload: false,
@@ -3848,6 +3885,25 @@
                             type: 'error'
                         })
                     })
+                } else if (this.user.timeType.reportWorkflow) {
+                    //开启审批流的情况下,显示审批流
+                    this.http.post('/audit-workflow-time-setting/getByUserId',{
+                        userId: item.id
+                    },res => {
+                        if(res.code == 'ok'){
+                            this.currentAuditWorkflow = res.data
+                        }else{
+                            this.$message({
+                                message: res.msg,
+                                type: 'error'
+                            })
+                        }
+                    },err => {
+                        this.$message({
+                            message: err,
+                            type: 'error'
+                        })
+                    })
                 }
             },
 
@@ -6957,7 +7013,8 @@
                                     auditorThird: aiReportData[i].auditorSetting && aiReportData[i].auditorSetting.auditorThird ? aiReportData[i].auditorSetting.auditorThird : '',
                                     ccUserid: aiReportData[i].auditorSetting && aiReportData[i].auditorSetting.ccUserid ? aiReportData[i].auditorSetting.ccUserid : '',
                                     canEdit: true,
-                                    content: aiReportData[i].content
+                                    content: aiReportData[i].content,
+                                    auditWorkflow: aiReportData[i].auditWorkflow
                                 })
                             }
                             this.workForm.domains = arr;
@@ -7073,7 +7130,8 @@
                                     filteredRespList: filteredRespList,
                                     serviceList: list.report[i].serviceList,
                                     sapServiceId: list.report[i].sapServiceId,
-                                    reportTargetDeptId: list.report[i].deptId
+                                    reportTargetDeptId: list.report[i].deptId,
+                                    auditWorkflow: list.report[i].auditWorkflow
                                 }
                                 if (this.user.timeType.reportAuditType != 1 && this.user.timeType.reportAuditType != 2 && this.user.timeType.reportAuditType != 9) {
                                     //分组负责人审核的情况下,前端不需要显示,无需设置
@@ -7477,6 +7535,7 @@
                             sss.stages = that.workForm.domains[0].stages
                             sss.taskGroups = that.workForm.domains[0].taskGroups;
                             sss.auditUserList = obj.auditUserList;
+                            sss.auditWorkflow = obj.auditWorkflow;
                             sss.degreeId = item.degreeId;
                             sss.customData = item.customData;
                             if (sss.auditUserList != null && sss.auditUserList.length==1) {
@@ -7566,12 +7625,14 @@
                     });
                     return;
                 }
-                if (!this.zhoBao.projectAuditorId &&(this.user.timeType.reportAuditType == 0 || this.user.timeType.reportAuditType == 4)) {
-                    this.$message({
-                        message: this.$t('message.Pleaseselectareviewer'),
-                        type: "error"
-                    });
-                    return
+                if (!this.zhoBao.projectAuditorId) {
+                    if ((this.user.timeType.reportAuditType == 0 && !this.user.timeType.reportWorkflow) || this.user.timeType.reportAuditType == 4) {
+                        this.$message({
+                            message: this.$t('message.Pleaseselectareviewer'),
+                            type: "error"
+                        });
+                        return
+                    }
                 }
                 if(this.user.timeType.reportAuditType == 3){
                     let auditTips = ''
@@ -9406,12 +9467,39 @@
                             if (this.workForm.domains[i].projectAuditorId) {
                                 formData.append("projectAuditorId", this.workForm.domains[i].projectAuditorId);
                             } else {
-                                if (this.user.timeType.reportAuditType == 0 || this.user.timeType.reportAuditType == 4) {
+                                if (this.user.timeType.reportAuditType == 4) {
                                     this.$message({
-                                        message: '审核人尚未设置',
+                                        message: '请选择审核人',
                                         type: "error"
                                     });
                                     return;
+                                } else if (this.user.timeType.reportAuditType == 0) {
+                                    if (this.user.timeType.reportWorkflow) {
+                                        if (this.workForm.domains[i].auditWorkflow.length == 0) {
+                                            this.$message({
+                                                message: '审批流尚未设置,无法提交',
+                                                type: "error"
+                                            });
+                                            return;
+                                        } else {
+                                            var projectNodeArray = this.workForm.domains[i].auditWorkflow.filter(a=>a.isDeptAudit==0);
+                                            if (projectNodeArray.length > 0) {
+                                                //有项目审核节点,但是没有选中项目审核人,需要提示
+                                                this.$message({
+                                                    message: '请选择审核人',
+                                                    type: "error"
+                                                });
+                                                return;
+                                            } 
+                                        }
+                                    } else {
+                                        //无审批流
+                                        this.$message({
+                                            message: '审核人尚未设置',
+                                            type: "error"
+                                        });
+                                        return;
+                                    }
                                 } else if(this.user.timeType.reportAuditType == 1 || this.user.timeType.reportAuditType == 2 || this.user.timeType.reportAuditType == 9){
                                     //分组负责人先审核, 确定是选择了任务分组
                                     if (this.workForm.domains[i].taskGroups.length == 0) {
@@ -9430,6 +9518,19 @@
                                     }
                                 }
                             }
+                            if (this.user.timeType.reportWorkflow) {
+                                //校验部门节点是否有审核人
+                                for (var t=0;t<this.workForm.domains[i].auditWorkflow.length; t++) {
+                                    var node = this.workForm.domains[i].auditWorkflow[t];
+                                    if (node.isDeptAudit && node.auditDeptManagerName == null) {
+                                        this.$message({
+                                            message: "您所在部门的审批流尚未设置完成,无法提交",
+                                            type: "error"
+                                        });
+                                        return;
+                                    }
+                                }   
+                            }
                             if (this.user.companyId == this.yuzhongCompId) {
                                 formData.append('extraField1', this.workForm.domains[i].extraField1);
                                 formData.append('extraField2', this.workForm.domains[i].extraField2);
@@ -10409,4 +10510,8 @@
     .daitianrbao .hover {
         color: #DCDFE6 !important;
     }
+    .project_time_card {
+        box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+        margin: 0 20px;
+    }
 </style>