山水共长天一色 3 лет назад
Родитель
Сommit
838a4caf1b
41 измененных файлов с 1096 добавлено и 390 удалено
  1. 22 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CustomerInfoController.java
  2. 3 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  3. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java
  4. 30 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportAuditLogController.java
  5. 103 39
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  6. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserYearleaveSettingController.java
  7. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectCurrentcost.java
  8. 12 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  9. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  10. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/LeaveQuotaNum.java
  11. 14 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  12. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java
  13. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  14. 115 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  15. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAddcostRecordServiceImpl.java
  16. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  17. 200 138
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  18. 33 29
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  19. 26 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  20. 13 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  21. 0 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  22. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CustomerInfoMapper.xml
  23. 45 5
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  24. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  25. BIN
      fhKeeper/formulahousekeeper/management-platform/人员导入模板.xlsx
  26. BIN
      fhKeeper/formulahousekeeper/management-platform/南京火石闪信网络科技有限公司_财务人员成本模板.xls
  27. BIN
      fhKeeper/formulahousekeeper/management-platform/新增客户导入模板.xlsx
  28. BIN
      fhKeeper/formulahousekeeper/management-platform/研究中心导入模板.xlsx
  29. 10 10
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  30. 31 1
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  31. 68 11
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  32. 9 4
      fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue
  33. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/gantt.vue
  34. 32 11
      fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue
  35. 94 56
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  36. 96 2
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  37. 49 10
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_import.vue
  38. 11 5
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  39. 3 3
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue
  40. 3 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue
  41. 1 2
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

+ 22 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CustomerInfoController.java

@@ -57,20 +57,33 @@ public class CustomerInfoController {
         List<String> codeList=new ArrayList<>();
         customerInfoMapperAll.forEach(cu->{
             nameList.add(cu.getCustomerName());
-            codeList.add(cu.getCustomerCode());
+            if(cu.getCustomerCode()!=null){
+                codeList.add(cu.getCustomerCode());
+            }
         });
-        if(nameList.contains(info.getCustomerName())){
-            msg.setError("客户名称已存在");
-            return msg;
-        }
-        if(codeList.contains(info.getCustomerCode())){
-            msg.setError("客户编号已存在");
-            return msg;
-        }
         if (info.getId() == null) {
+            if(nameList.contains(info.getCustomerName())){
+                msg.setError("客户名称已存在");
+                return msg;
+            }
+            if(codeList.contains(info.getCustomerCode())){
+                msg.setError("客户编号已存在");
+                return msg;
+            }
             info.setCompanyId(user.getCompanyId());
             customerInfoMapper.insert(info);
         } else {
+            CustomerInfo customerInfo = customerInfoMapper.selectById(info.getId());
+            nameList.remove(customerInfo.getCustomerName());
+            codeList.remove(customerInfo.getCustomerCode());
+            if(nameList.contains(info.getCustomerName())){
+                msg.setError("客户名称已存在");
+                return msg;
+            }
+            if(codeList.contains(info.getCustomerCode())){
+                msg.setError("客户编号已存在");
+                return msg;
+            }
             info.setCompanyId(user.getCompanyId());
             customerInfoMapper.updateById(info);
             //更新项目表中的客户名称

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

@@ -360,12 +360,10 @@ public class DingDingController {
         return new HttpRespMsg();
     }
 //
-    @RequestMapping("/testCorpLeaveType")
-    public HttpRespMsg testCorpLeaveType(String leaveCode, Integer companyId, String userIds, long offset) {
+    @RequestMapping("/getCorpLeaveQuata")
+    public HttpRespMsg getCorpLeaveQuata(String leaveCode, Integer companyId, Integer departmentId, String userId, @RequestParam(required = false, defaultValue = "1") Integer pageIndex) {
         CompanyDingding companyDingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-
-        dingDingService.getLeaveTypeList(leaveCode, companyId, userIds, offset);
-        return new HttpRespMsg();
+        return dingDingService.getLeaveTypeList(leaveCode, companyId, departmentId, userId, pageIndex);
     }
 
     @RequestMapping("/testSendBusTripLink")

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java

@@ -127,7 +127,14 @@ public class ProjectBasecostSettingController {
     }
 
 
-
+    @RequestMapping("/getReportBasecostList")
+    public HttpRespMsg getReportBasecostList(Integer companyId) {
+        //返回公司的项目工时预警的成本项列表
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectBasecostSetting> timeBasecostList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+        msg.data = timeBasecostList;
+        return msg;
+    }
 
 }
 

+ 30 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportAuditLogController.java

@@ -85,5 +85,35 @@ public class ReportAuditLogController {
         }
         return msg;
     }
+
+
+    @RequestMapping("getProjectReportAuditLog")
+    public HttpRespMsg getProjectReportAuditLog(Integer companyId, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        HttpRespMsg msg = new HttpRespMsg();
+        QueryWrapper<ReportAuditLog> queryWrapper = new QueryWrapper<>();
+        //每个人看自己的
+        queryWrapper.eq("company_id", companyId).eq("audit_channel", 1).eq("user_id", user.getId()).orderByDesc("indate");
+        IPage<ReportAuditLog> iPage = reportAuditLogMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<ReportAuditLog> list = iPage.getRecords();
+        if (list.size() > 0) {
+            //还有获取各项的人员日期名单
+            List<Integer> ids = list.stream().map(ReportAuditLog::getId).collect(Collectors.toList());
+
+            List<ReportAlogMembdate> membList = reportAlogMembdateMapper.selectList(new QueryWrapper<ReportAlogMembdate>().in("rlog_id", ids));
+            list.forEach(l->{
+                l.setMembdateList(membList.stream().filter(m->m.getRlogId().equals(l.getId())).collect(Collectors.toList()));
+            });
+        }
+
+        Long total = iPage.getTotal();
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", list);
+        map.put("total", total);
+        msg.data = map;
+        return msg;
+    }
 }
 

+ 103 - 39
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -9,6 +9,7 @@ import com.management.platform.entity.*;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.entity.vo.WorktimeItem;
 import com.management.platform.mapper.*;
+import com.management.platform.service.CompanyService;
 import com.management.platform.service.ReportService;
 import com.management.platform.service.UserSalaryService;
 import com.management.platform.service.UserService;
@@ -50,12 +51,16 @@ public class ReportController {
     @Resource
     private ProjectBasecostSettingMapper projectBasecostSettingMapper;
     @Resource
+    private TimeAutoExcludeMapper timeAutoExcludeMapper;
+    @Resource
     private HttpServletRequest request;
     @Resource
     private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
     @Resource
     private UserService userService;
     @Resource
+    private CompanyService companyService;
+    @Resource
     private DepartmentMapper departmentMapper;
     @Resource
     private ProjectCurrentcostMapper projectCurrentcostMapper;
@@ -164,6 +169,7 @@ public class ReportController {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
         User user = userService.getById(token);
+        Company company = companyService.getById(user.getCompanyId());
         //检查当前人员账号是否停用
         if (user.getIsActive() == 0) {
             HttpRespMsg msg = new HttpRespMsg();
@@ -422,6 +428,13 @@ public class ReportController {
                     new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", user.getDepartmentId()).orderByAsc("seq"));
             List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
 
+            //准备全局的校验数据
+            List<TimeAutoExclude> excludeTimeList = new ArrayList<>();
+            //按照时间段填报的模式下,检查是否设置了休息时间段,要自动剔除
+            if (comTimeType.getType() == 2) {
+                excludeTimeList = timeAutoExcludeMapper.selectList(new QueryWrapper<TimeAutoExclude>().eq("company_id", company.getId()));
+            }
+
             for (int i = 0; i < id.length; i++) {
                 if (createDate[i].contains("@")) {
                     DateTimeFormatter mdFormatter = DateTimeFormatter.ofPattern("MM-dd");
@@ -502,9 +515,9 @@ public class ReportController {
                             }
                             //计算工时和成本
                             if (report.getMultiWorktime() == 0) {
-                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i],  sdf, comTimeType);
+                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i],  sdf, comTimeType, excludeTimeList);
                             } else {
-                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf, comTimeType);
+                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf, comTimeType, excludeTimeList);
                             }
 
                             //项目专业的进展
@@ -560,9 +573,9 @@ public class ReportController {
                                 }
                                 //计算工时和成本
                                 if (report.getMultiWorktime() == 0) {
-                                    fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i],  sdf, comTimeType);
+                                    fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i],  sdf, comTimeType, excludeTimeList);
                                 } else {
-                                    fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf, comTimeType);
+                                    fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf, comTimeType, excludeTimeList);
                                 }
 
                                 fillReportProgress(report, professionProgress[i]);
@@ -618,9 +631,9 @@ public class ReportController {
                         }
                         //计算工时和成本
                         if (report.getMultiWorktime() == 0) {
-                            fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i], sdf, comTimeType);
+                            fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i], sdf, comTimeType, excludeTimeList);
                         } else {
-                            fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf, comTimeType);
+                            fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf, comTimeType, excludeTimeList);
                         }
 
                         fillReportProgress(report, professionProgress[i]);
@@ -699,9 +712,9 @@ public class ReportController {
                             hourCost = subsUser.getCost();
                             //计算工时和成本
                             if (report.getMultiWorktime() == 0) {
-                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i],  sdf, comTimeType);
+                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i],  sdf, comTimeType, excludeTimeList);
                             } else {
-                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf, comTimeType);
+                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf, comTimeType, excludeTimeList);
                             }
 
                             fillReportProgress(report, professionProgress[i]);
@@ -751,40 +764,63 @@ public class ReportController {
             }
         }
 
-
-        //检查成本是否超过预算
-        List<ProjectBasecostSetting> projectBasecostSettings = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", user.getCompanyId()).eq("alarm_type", 1));
-        if (projectBasecostSettings.size() > 0) {
-            List<Integer> collect = projectBasecostSettings.stream().map(ProjectBasecostSetting::getId).collect(Collectors.toList());
-            List<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
+        //只有项目管理专业版才要检查成本预算
+        if (company.getPackageProject() == 1) {
+            //检查成本是否超过预算
+            List<ProjectBasecostSetting> projectBasecostSettings = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", user.getCompanyId()).eq("alarm_type", 1));
+            if (projectBasecostSettings.size() > 0) {
+                List<Integer> collect = projectBasecostSettings.stream().map(ProjectBasecostSetting::getId).collect(Collectors.toList());
+                List<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
 //            //获取当前项目的当前成本基线值
-            List<ProjectCurrentcost> projectCurrentcosts = projectCurrentcostMapper.selectList(new QueryWrapper<ProjectCurrentcost>().in("base_id", collect).in("project_id", projectIds));
+                List<ProjectCurrentcost> projectCurrentcosts = projectCurrentcostMapper.selectList(new QueryWrapper<ProjectCurrentcost>().in("base_id", collect).in("project_id", projectIds));
 
-            List<Map<String, Object>> costList = reportMapper.getProjectCost(user.getCompanyId(), projectIds);
-            for (Report report : reportList) {
-                if (report.getBasecostId() != null && report.getBasecostId() != 0) {
-                    Optional<ProjectCurrentcost> first = projectCurrentcosts.stream().filter(cur -> cur.getProjectId().equals(report.getProjectId()) && cur.getBaseId().equals(report.getBasecostId())).findFirst();
+                List<Map<String, Object>> costList = reportMapper.getProjectFillCost(user.getCompanyId(), projectIds);
+                //计算本次填报的每个项目每个成本项合计的成本总额
+                for (Report report : reportList) {
+                    //匹配当前项目的当前成本项已填的成本金额
+                    System.out.println("本次reportCost=="+report.getCost());
+                    Optional<ProjectCurrentcost> first = projectCurrentcosts.stream().filter(p -> p.getProjectId().equals(report.getProjectId()) && p.getBaseId().equals(report.getBasecostId())).findFirst();
                     if (first.isPresent()) {
-                        //匹配上了当前成本基线项的设置
-                        double max = first.get().getBaseAmount();
-                        double realCost = 0;
-                        //匹配当前项目的当前成本项已填的成本金额
-                        for (Map<String, Object> mapItem : costList) {
-                            int pid = (int)mapItem.get("projectId");
-                            int baseId = (int) mapItem.get("basecostId");
-                            if (pid == report.getProjectId() && baseId == report.getBasecostId()) {
-                                realCost = ((BigDecimal)mapItem.get("cost")).doubleValue();
-                                break;
-                            }
+                        ProjectCurrentcost currentcost = first.get();
+                        BigDecimal curFillCost = currentcost.getCurFillCost();
+                        if (curFillCost == null) {
+                            currentcost.setCurFillCost(report.getCost());
+                        } else {
+                            //累加
+                            currentcost.setCurFillCost(curFillCost.add(report.getCost()));
                         }
-                        if (max > 0 && realCost > max) {
-                            //超支了,不能提交
-                            String name = projectList.stream().filter(p->p.getId().equals(report.getProjectId())).findFirst().get().getProjectName();
-                            HttpRespMsg msg = new HttpRespMsg();
-                            msg.setError("项目["+name+"]的["+first.get().getBaseName()+"]预算不足,请联系管理人员下拨预算");
-                            return msg;
+                    }
+                }
+                //计算本次项目和成本项的金额是否超支
+                for (ProjectCurrentcost item : projectCurrentcosts) {
+                    Map<String, Object> findOldCost = null;
+                    for (Map<String, Object> mapItem : costList) {
+                        int pid = (int)mapItem.get("projectId");
+                        int baseId = (int) mapItem.get("basecostId");
+                        if (pid == item.getProjectId() && baseId == item.getBaseId()) {
+                            findOldCost = mapItem;
+                            break;
                         }
                     }
+                    BigDecimal baseAmount = new BigDecimal(item.getBaseAmount());
+                    BigDecimal leftCost = new BigDecimal(0);
+                    //减去已经发生的记录
+                    if (findOldCost != null) {
+                        leftCost = baseAmount.subtract((BigDecimal)findOldCost.get("cost"));
+                    } else {
+                        leftCost = baseAmount;
+                    }
+                    String name = projectList.stream().filter(p->p.getId().equals(item.getProjectId())).findFirst().get().getProjectName();
+                    System.out.println("项目["+name+"]的["+item.getBaseName()+"]总预算="+baseAmount+",剩余="+leftCost);
+                    System.out.println("本次项目预算填报的="+item.getCurFillCost());
+                    //移动端可能没有选择预算来源的地方
+                    if (item.getCurFillCost() != null && item.getCurFillCost().compareTo(leftCost) > 0) {
+                        //超支了,不能填报
+//                    String name = projectList.stream().filter(p->p.getId().equals(item.getProjectId())).findFirst().get().getProjectName();
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("项目["+name+"]的["+item.getBaseName()+"]预算不足,请联系管理人员下拨预算");
+                        return msg;
+                    }
                 }
             }
         }
@@ -792,7 +828,7 @@ public class ReportController {
         return reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId());
     }
 
-    private void fillReportHours(Report report, BigDecimal hourCost, Double workingTime, Integer timeType, String startTime, String endTime, SimpleDateFormat sdf, TimeType comTimeType) {
+    private void fillReportHours(Report report, BigDecimal hourCost, Double workingTime, Integer timeType, String startTime, String endTime, SimpleDateFormat sdf, TimeType comTimeType, List<TimeAutoExclude> excludeTimeList) {
         if (report.getMultiWorktime() == 0) {
             //普通工时成本计算
             if (report.getReportTimeType() == 0) {
@@ -806,7 +842,17 @@ public class ReportController {
                 //时间范围填报, 计算一下时长
                 try {
                     report.setStartTime(startTime).setEndTime(endTime);
+                    int excludeTime = 0;
+                    if (excludeTimeList.size() > 0) {
+                        for (TimeAutoExclude exclude : excludeTimeList) {
+                            if (exclude.getStartTime().compareTo(startTime) >= 0 && exclude.getEndTime().compareTo(endTime) <= 0) {
+                                //落在休息时间范围内,需要计算去掉的时间
+                                excludeTime += sdf.parse(exclude.getEndTime()).getTime() - sdf.parse(exclude.getStartTime()).getTime();
+                            }
+                        }
+                    }
                     long time = sdf.parse(report.getEndTime()).getTime() - sdf.parse(report.getStartTime()).getTime();
+                    time -= excludeTime;//去掉休息时间
                     int minutes = (int)time/1000/60;
                     double hours = minutes*1.0f/60;
                     report.setWorkingTime(hours);
@@ -824,7 +870,18 @@ public class ReportController {
                 for (int t=0;t<array.size(); t++) {
                     JSONObject jsonObject = array.getJSONObject(t);
                     WorktimeItem item = JSONObject.toJavaObject(jsonObject, WorktimeItem.class);
+                    int excludeTime = 0;
+                    if (excludeTimeList.size() > 0) {
+                        for (TimeAutoExclude exclude : excludeTimeList) {
+                            if (exclude.getStartTime().compareTo(item.getStartTime()) >= 0 && exclude.getEndTime().compareTo(item.getEndTime()) <= 0) {
+                                //落在休息时间范围内,需要计算去掉的时间
+                                excludeTime += sdf.parse(exclude.getEndTime()).getTime() - sdf.parse(exclude.getStartTime()).getTime();
+                            }
+                        }
+                    }
+
                     long time = sdf.parse(item.getEndTime()).getTime() - sdf.parse(item.getStartTime()).getTime();
+                    time -= excludeTime;
                     int minutes = (int)time/1000/60;
                     double hours = minutes*1.0f/60;
                     item.setTime(hours);
@@ -949,6 +1006,11 @@ public class ReportController {
         return reportService.getMembList(date, manageDeptId, request);
     }
 
+    @RequestMapping("/approveAllImport")
+    public HttpRespMsg approveAllImport(HttpServletRequest request) {
+        return reportService.approveAllImport(request);
+    }
+
     @RequestMapping("/batchApproveReport")
     public HttpRespMsg batchApproveReport(@RequestParam String ids, Integer isDepartment, HttpServletRequest request) {
         return reportService.batchApproveReport(ids, isDepartment, request);
@@ -1004,13 +1066,15 @@ public class ReportController {
                                       Integer projectId,
                                       @RequestParam(required = false, defaultValue = "0") Integer dateType,
                                       String date,
-                                      Integer departmentId,
+                                      @RequestParam(required = false, defaultValue = "0") Integer pageIndex,
+                                      @RequestParam(required = false, defaultValue = "1000") Integer pageSize,
+                                              Integer departmentId,
                                       HttpServletRequest request) {
         String token = request.getHeader("TOKEN");
         User user = userService.getById(token);
         return reportService.listDeptImportByState(user.getId(),
                 projectId,dateType,
-                date, departmentId, request);
+                date, pageIndex, pageSize, departmentId, request);
     }
 
     @RequestMapping("/getlastWeekFillTime")

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserYearleaveSettingController.java

@@ -1,14 +1,17 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.OapiAttendanceVacationTypeListRequest;
 import com.dingtalk.api.response.OapiAttendanceVacationTypeListResponse;
+import com.management.platform.entity.CompanyDingding;
 import com.management.platform.entity.User;
 import com.management.platform.entity.UserYearleaveSetting;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.UserYearleaveSettingMapper;
+import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.DingDingService;
 import com.management.platform.service.UserYearleaveSettingService;
 import com.management.platform.util.HttpRespMsg;
@@ -16,6 +19,7 @@ import com.management.platform.util.ListUtil;
 import org.springframework.util.StringUtils;
 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;
@@ -40,6 +44,8 @@ public class UserYearleaveSettingController {
     private UserYearleaveSettingMapper userYearleaveSettingMapper;
     @Resource
     private DingDingService dingDingService;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
     @Resource
     private HttpServletRequest request;
@@ -87,5 +93,19 @@ public class UserYearleaveSettingController {
 //    public HttpRespMsg getDingDingList(Integer companyId) {
 //        return dingDingService.getLeaveTypeList(companyId);
 //    }
+
+    /**
+     *
+     * @param leaveCode 请假类型代码
+     * @param companyId 公司id (必传
+     * @param departmentId 部门id
+     * @param userId 员工id
+     * @param pageIndex 页码
+     * @return
+     */
+    @RequestMapping("/getDingDingLeaveQt")
+    public HttpRespMsg getDingDingLeaveQt(String leaveCode, Integer companyId, Integer departmentId, String userId,@RequestParam(required = false, defaultValue = "1") Integer pageIndex) {
+        return dingDingService.getLeaveTypeList(leaveCode, companyId, departmentId, userId, pageIndex);
+    }
 }
 

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectCurrentcost.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.math.BigDecimal;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -57,6 +59,9 @@ public class ProjectCurrentcost extends Model<ProjectCurrentcost> {
     @TableField(exist = false)
     private Double realCost;
 
+    @TableField(exist = false)
+    private BigDecimal curFillCost;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -24,7 +24,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2022-05-09
+ * @since 2022-05-21
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -81,6 +81,8 @@ public class Report extends Model<Report> {
      * 创建时间
      */
     @TableField("create_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime createTime;
 
     /**
@@ -321,6 +323,15 @@ public class Report extends Model<Report> {
     private Integer basecostId;
 
 
+    /**
+     * 项目日报审核时间
+     */
+    @TableField("project_audit_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime projectAuditTime;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-05-17
+ * @since 2022-05-21
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -210,6 +210,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("fill_overtime")
     private Integer fillOvertime;
 
+    /**
+     * 是否显示填报和审核的时间
+     */
+    @TableField("show_fillaudit_time")
+    private Integer showFillauditTime;
+
 
     @Override
     protected Serializable pkVal() {

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/LeaveQuotaNum.java

@@ -0,0 +1,17 @@
+package com.management.platform.entity.vo;
+
+public class LeaveQuotaNum {
+    public String userDingdingId;
+    public String name;//员工姓名
+    public String userId;
+    public String leaveCode;//假期编码
+    public String startTime; //假期有效开始时间
+    public String endTime;//假期有效截止时间
+    public String quotaInHours;//以小时计算的总额度
+    public String quotaInDays; //以天计算的总额度;
+    public String usedInHours;//已使用小时
+    public String usedInDays;//已使用天数
+    public String leftInHours; //剩余额度
+    public String leftInDays;//剩余额度
+
+}

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

@@ -90,8 +90,18 @@ public interface ReportMapper extends BaseMapper<Report> {
                                                      @Param("startDate") String startDate,
                                                      @Param("endDate") String endDate,
                                                      @Param("departmentIdList") List<Integer> departmentIdList,
-                                                     @Param("projectId") Integer projectId
+                                                     @Param("projectId") Integer projectId,
+                                                     @Param("startIndex") Integer startIndex,
+                                                     @Param("pageSize") Integer pageSize
                                                      );
+    void approveAllDeptImportList(@Param("companyId") Integer companyId,
+                                  @Param("leaderId") String leaderId);
+    Long getDeptImportAuditListCount(@Param("companyId") Integer companyId,
+                                                          @Param("leaderId") String leaderId,
+                                                          @Param("startDate") String startDate,
+                                                          @Param("endDate") String endDate,
+                                                          @Param("departmentIdList") List<Integer> departmentIdList,
+                                                          @Param("projectId") Integer projectId);
     List<Map<String, Object>> selectFillReportUserList(Integer companyId, String startDate, String endDate);
 
     List<Map<String, Object>> getMonthReportProjectList(Integer companyId, String startDate, String endDate);
@@ -108,5 +118,8 @@ public interface ReportMapper extends BaseMapper<Report> {
 
     List<Map<String, Object>> getProjectCost(Integer companyId, List<Integer> projectIds);
 
+    //获取项目填报的成本,包括已审核和待审核的
+    List<Map<String, Object>> getProjectFillCost(Integer companyId, List<Integer> projectIds);
+
     List<Map<String, Object>> getOneProjectBaseCost(Integer projectId);
 }

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

@@ -32,5 +32,5 @@ public interface DingDingService {
 
     void getCorpSelfDefSmartReport(CompanyDingding dingding);
 
-    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, String userIds, long offset);
+    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex);
 }

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

@@ -72,6 +72,7 @@ public interface ReportService extends IService<Report> {
                                Integer projectId,
                                Integer dateType,
                                String date,
+                                      Integer pageIndex, Integer pageSize,
                                       Integer deprarmtentId, HttpServletRequest request);
 
     HttpRespMsg getlastWeekFillTime(String userId);
@@ -79,4 +80,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate);
 
     HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate);
+
+    HttpRespMsg approveAllImport(HttpServletRequest request);
 }

+ 115 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -12,16 +12,15 @@ import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.*;
 import com.dingtalk.api.response.*;
+import com.google.gson.JsonObject;
 import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
+import com.management.platform.entity.vo.LeaveQuotaNum;
 import com.management.platform.entity.vo.LeaveTypeVO;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
-import com.management.platform.util.ColorUtil;
-import com.management.platform.util.DateTimeUtil;
-import com.management.platform.util.HttpRespMsg;
-import com.management.platform.util.SnowFlake;
+import com.management.platform.util.*;
 import com.taobao.api.ApiException;
 import com.taobao.api.internal.util.StringUtils;
 import org.slf4j.Logger;
@@ -33,6 +32,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
@@ -1345,14 +1346,15 @@ public class DingDingServiceImpl implements DingDingService {
         }
     }
 
-    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, String userIds, long offset) {
+    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex) {
         CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         HttpRespMsg msg = new HttpRespMsg();
         HashMap resultMap = new HashMap();
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/type/list");
         OapiAttendanceVacationTypeListRequest req = new OapiAttendanceVacationTypeListRequest();
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("role_name", "超级管理员"));
-        String oaManagerDid =userList.get(0).getDingdingUserid();
+//        String oaManagerDid = "2221645448842951";
+        String oaManagerDid = userList.get(0).getDingdingUserid();
         if (leaveCode == null) {
             req.setOpUserid(oaManagerDid);
             req.setVacationSource("all");
@@ -1369,30 +1371,96 @@ public class DingDingServiceImpl implements DingDingService {
                     LeaveTypeVO vo = new LeaveTypeVO();
                     vo.leaveCode = obj.getString("leave_code");
                     vo.leaveName = obj.getString("leave_name");
+                    if (vo.leaveName.equals("调休")) {
+                        defaultType = vo;
+                    }
                     typeList.add(vo);
                 }
                 resultMap.put("leaveTypeList", typeList);
-                leaveCode = typeList.get(0).leaveCode;
+                if (defaultType == null) defaultType = typeList.get(0);
+                leaveCode = defaultType.leaveCode;
+                resultMap.put("defaultLeaveType", defaultType);
+                System.out.println("本次请求的LeaveCode: "+leaveCode);
+                reqQuotaList(companyId, dingding, leaveCode, oaManagerDid, departmentId, userId, pageIndex, resultMap);
             } catch (ApiException e) {
                 e.printStackTrace();
             }
+        } else {
+            reqQuotaList(companyId, dingding, leaveCode, oaManagerDid, departmentId, userId, pageIndex, resultMap);
         }
+        msg.data = resultMap;
+        return msg;
+    }
 
+    //递归获取子部门
+    private List<Department> getSubDeptList(List<Department> allDeptList, Department department) {
+        List<Department> deptList = new ArrayList<>();
+        deptList.add(department);
+        //查找子部门的数据
+        List<Department> collect = allDeptList.stream().filter(sub -> sub.getSuperiorId() != null && sub.getSuperiorId().equals(department.getDepartmentId())).collect(Collectors.toList());
+        for (Department subItem : collect) {
+            deptList.addAll(getSubDeptList(allDeptList, subItem));
+        }
+        return deptList;
+    }
+
+    private void reqQuotaList(Integer companyId, CompanyDingding dingding,
+                                             String leaveCode, String oaManagerDid, Integer departmentId, String userId, Integer pageIndex, HashMap resultMap) {
         //再调用查看假期余额的接口
-        client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/quota/list");
+        long pageSize = 50L;
+        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/quota/list");
         OapiAttendanceVacationQuotaListRequest quoataReq = new OapiAttendanceVacationQuotaListRequest();
         quoataReq.setLeaveCode(leaveCode);
         quoataReq.setOpUserid(oaManagerDid);
-        if (StringUtils.isEmpty(userIds)) {
-            //获取全部员工,离职的不看
-            userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active", 1));
+        List<User> userList = null;
+        String userIds = null;
+        if (StringUtils.isEmpty(userId)) {
+            int total = 0;
+            if (departmentId == null) {
+                //全部员工,包括离职的
+                userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).orderByAsc("id").last("limit " + (pageIndex-1)*pageSize+", "+pageSize));
+                total = userMapper.selectCount(new QueryWrapper<User>().eq("company_id", companyId));
+            } else {
+                //指定部门
+                Department dept = departmentMapper.selectById(departmentId);
+                List<Department> allDept = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                List<Department> allSubDepts = getSubDeptList(allDept, dept);
+                userList = userMapper.selectList(
+                        new QueryWrapper<User>()
+                                .in("department_id", allSubDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList()))
+                                .orderByAsc("id").last("limit " + (pageIndex-1)*pageSize+", "+pageSize));
+                total = userMapper.selectCount(new QueryWrapper<User>()
+                        .in("department_id", allSubDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList())));
+            }
             String collect = userList.stream().map(User::getDingdingUserid).collect(Collectors.joining(","));
             userIds = collect;
+            resultMap.put("total", total);
+        } else {
+            userList = new ArrayList<>();
+            userList.add(userMapper.selectById(userId));
+            userIds = userList.get(0).getDingdingUserid();
+            resultMap.put("total", 1);
         }
-        quoataReq.setUserids(userIds);
 
-        quoataReq.setOffset(offset);
-        quoataReq.setSize(50L);
+        System.out.println("请求的userIds: "+userIds);
+        System.out.println("长度=="+userIds.length());
+        List<LeaveQuotaNum> quotaNumList = new ArrayList<>();
+        for (User user : userList) {
+            LeaveQuotaNum quotaNum = new LeaveQuotaNum();
+            quotaNum.userId = user.getId();
+            quotaNum.userDingdingId = user.getDingdingUserid();
+            quotaNum.name = user.getName();
+            quotaNum.leaveCode = leaveCode;
+            quotaNumList.add(quotaNum);
+        }
+        resultMap.put("records", quotaNumList);
+        if (quotaNumList.size() == 0) {
+            //无员工数据了
+            return;
+        }
+        quoataReq.setUserids(userIds);
+        quoataReq.setOffset(0L);
+        quoataReq.setSize(pageSize);
         OapiAttendanceVacationQuotaListResponse quotaListResponse = null;
         try {
             quotaListResponse = client.execute(quoataReq, getInnerCorpToken(dingding));
@@ -1400,14 +1468,43 @@ public class DingDingServiceImpl implements DingDingService {
             e.printStackTrace();
         }
         System.out.println(quotaListResponse.getBody());
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         JSONObject json = JSONObject.parseObject(quotaListResponse.getBody());
+        DecimalFormat df = new DecimalFormat("#0.0");
         if (json.getInteger("errcode") == 0) {
+            JSONObject result = json.getJSONObject("result");
+            JSONArray leaveQuotas = result.getJSONArray("leave_quotas");
+            if (leaveQuotas != null) {
+                for (int i=0;i<leaveQuotas.size(); i++) {
+                    JSONObject jsonObject = leaveQuotas.getJSONObject(i);
+                    String userDDid = jsonObject.getString("userid");
+                    LeaveQuotaNum quotaNum = quotaNumList.stream().filter(qu->qu.userDingdingId.equals(userDDid)).findFirst().get();
+                    Date startDate = new Date(jsonObject.getLongValue("start_time"));
+                    quotaNum.startTime = sdf.format(startDate);
+                    Date endDate = new Date(jsonObject.getLongValue("end_time"));
+                    quotaNum.endTime = sdf.format(endDate);
+                    Integer quota_num_per_hour = jsonObject.getInteger("quota_num_per_hour");
+                    if (quota_num_per_hour != null) {
+                        //按小时为单位的情况
+                        quotaNum.quotaInHours = df.format(quota_num_per_hour*1.0/100);
+                        Integer used_num_per_hour = jsonObject.getInteger("used_num_per_hour");
+                        quotaNum.usedInHours = df.format(used_num_per_hour*1.0/100);
+                        //计算剩余
+                        quotaNum.leftInHours = df.format((quota_num_per_hour - used_num_per_hour)*1.0/100);
+                    } else {
+                        //按天单位的情况
+                        Integer quota_num_per_day = jsonObject.getInteger("quota_num_per_day");
+                        quotaNum.quotaInDays = df.format(quota_num_per_day*1.0/100);
+                        Integer used_num_per_day = jsonObject.getInteger("used_num_per_day");
+                        quotaNum.usedInDays = df.format(used_num_per_day*1.0/100);
+                        //计算剩余
+                        quotaNum.leftInDays = df.format((quota_num_per_day - used_num_per_day)*1.0/100);
+                    }
+                    quotaNumList.add(quotaNum);
+                }
+            }
 
-        } else {
-            msg.setError(json.getString("errmsg"));
         }
-
-        return msg;
     }
 
     public void activateSuite(String authCorpid, String tmpAuthCode) throws ApiException {

+ 4 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAddcostRecordServiceImpl.java

@@ -136,10 +136,10 @@ public class ProjectAddcostRecordServiceImpl extends ServiceImpl<ProjectAddcostR
                         System.out.println("添加记录的明细里匹配不上cur baseId=="+cur.getBaseId()+", curBaseName=="+cur.getBaseName());
                     }
                 });
-//                projectCurrentcostService.updateBatchById(curList);
-//                //删除添加的这条记录
-//                projectAddcostItemMapper.delete(new QueryWrapper<ProjectAddcostItem>().eq("record_id", id));
-//                projectAddcostRecordMapper.deleteById(id);
+                projectCurrentcostService.updateBatchById(curList);
+                //删除添加的这条记录
+                projectAddcostItemMapper.delete(new QueryWrapper<ProjectAddcostItem>().eq("record_id", id));
+                projectAddcostRecordMapper.deleteById(id);
             } else {
                 msg.setError("只有最新的一次下拨可以撤销");
             }

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

@@ -907,8 +907,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Override
     public HttpRespMsg adjustBase(String baseCostData, Project project, String remark, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
-        if (project.getContractAmount() == 0) {
-            msg.setError("项目金额不能为0");
+        Integer id = project.getId();
+        Double contractAmount = projectMapper.selectById(id).getContractAmount();
+        if (contractAmount == 0) {
+            msg.setError("请先设置项目合同金额");
             return msg;
         }
         //计算项目总成本

+ 200 - 138
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -77,6 +77,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private UserDingdingTimeMapper userDingdingTimeMapper;
     @Resource
+    private ProjectPercentageMapper projectPercentageMapper;
+    @Resource
     private ReportService reportService;
     @Resource
     ReportExtraDegreeMapper reportExtraDegreeMapper;
@@ -879,7 +881,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 //增加填报人所属部门
                 map2.put("departmentName", list2.get(0).get("departmentName"));
             }
-
             //设置照片显示
             for (Map map : nameList) {
                 List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
@@ -907,41 +908,45 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (timeType.getShowCorpwxCardtime() == 1) {
                 //企业微信的情况
                 QueryWrapper<UserCorpwxTime> userCorpwxTimeQueryWrapper = new QueryWrapper<>();
-                for (Map map : nameList) {
-                    String name = (String)map.get("name");
-                    String dateStr = (String)map.get("dateStr");
-                    userCorpwxTimeQueryWrapper.or(wrapper->wrapper.eq("name", name).eq("create_date", dateStr));
-                }
-                List<UserCorpwxTime> timeList = userCorpwxTimeMapper.selectList(userCorpwxTimeQueryWrapper);
-                //过滤匹配当前的数据
-                for (Map map : nameList) {
-                    String name = (String)map.get("name");
-                    String dateStr = (String)map.get("dateStr");
-                    Optional<UserCorpwxTime> first = timeList.stream().filter(time -> time.getName().equals(name) && dtf.format(time.getCreateDate()).equals(dateStr)).findFirst();
-                    if (first.isPresent()) {
-                        double wh = first.get().getWorkHours();
-                        //赋值打卡时长
-                        map.put("cardHours", wh);
+                if (nameList.size() > 0) {
+                    for (Map map : nameList) {
+                        String name = (String)map.get("name");
+                        String dateStr = (String)map.get("dateStr");
+                        userCorpwxTimeQueryWrapper.or(wrapper->wrapper.eq("name", name).eq("create_date", dateStr));
+                    }
+                    List<UserCorpwxTime> timeList = userCorpwxTimeMapper.selectList(userCorpwxTimeQueryWrapper);
+                    //过滤匹配当前的数据
+                    for (Map map : nameList) {
+                        String name = (String)map.get("name");
+                        String dateStr = (String)map.get("dateStr");
+                        Optional<UserCorpwxTime> first = timeList.stream().filter(time -> time.getName().equals(name) && dtf.format(time.getCreateDate()).equals(dateStr)).findFirst();
+                        if (first.isPresent()) {
+                            double wh = first.get().getWorkHours();
+                            //赋值打卡时长
+                            map.put("cardHours", wh);
+                        }
                     }
                 }
             } else if (timeType.getShowDdCardtime() == 1) {
                 //钉钉的情况
                 QueryWrapper<UserDingdingTime> userDingdingTimeQueryWrapper = new QueryWrapper<>();
-                for (Map map : nameList) {
-                    String itemUid = (String)map.get("userId");
-                    String dateStr = (String)map.get("dateStr");
-                    userDingdingTimeQueryWrapper.or(wrapper->wrapper.eq("user_id", itemUid).eq("work_date", dateStr));
-                }
-                List<UserDingdingTime> timeList = userDingdingTimeMapper.selectList(userDingdingTimeQueryWrapper);
-                //过滤匹配当前的数据
-                for (Map map : nameList) {
-                    String itemUid = (String)map.get("userId");
-                    String dateStr = (String)map.get("dateStr");
-                    Optional<UserDingdingTime> first = timeList.stream().filter(time -> time.getUserId().equals(itemUid) && dtf.format(time.getWorkDate()).equals(dateStr)).findFirst();
-                    if (first.isPresent()) {
-                        double wh = first.get().getWorkHours();
-                        //赋值打卡时长
-                        map.put("cardHours", wh);
+                if (nameList.size() > 0) {
+                    for (Map map : nameList) {
+                        String itemUid = (String)map.get("userId");
+                        String dateStr = (String)map.get("dateStr");
+                        userDingdingTimeQueryWrapper.or(wrapper->wrapper.eq("user_id", itemUid).eq("work_date", dateStr));
+                    }
+                    List<UserDingdingTime> timeList = userDingdingTimeMapper.selectList(userDingdingTimeQueryWrapper);
+                    //过滤匹配当前的数据
+                    for (Map map : nameList) {
+                        String itemUid = (String)map.get("userId");
+                        String dateStr = (String)map.get("dateStr");
+                        Optional<UserDingdingTime> first = timeList.stream().filter(time -> time.getUserId().equals(itemUid) && dtf.format(time.getWorkDate()).equals(dateStr)).findFirst();
+                        if (first.isPresent()) {
+                            double wh = first.get().getWorkHours();
+                            //赋值打卡时长
+                            map.put("cardHours", wh);
+                        }
                     }
                 }
             }
@@ -1012,7 +1017,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             reportMapper.update(report, new QueryWrapper<Report>().in("id", ids));
                         } else {
                             //最终进行项目经理审核
-                            reportMapper.update(new Report().setState(1),
+                            reportMapper.update(new Report().setState(1).setProjectAuditTime(LocalDateTime.now()),
                                     new QueryWrapper<Report>().in("id", ids));
                             List<Report> finalReportList = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
                             List<ReportProfessionProgress> professionProgressList = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().in("report_id", ids));
@@ -1041,7 +1046,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 .orderByAsc("seq"));
                 if (settings.size() == 0) {
                     //直接进行项目经理审核
-                    reportMapper.update(new Report().setState(1).setProjectAuditState(1),
+                    reportMapper.update(new Report().setState(1).setProjectAuditState(1).setProjectAuditTime(LocalDateTime.now()),
                             new QueryWrapper<Report>().in("id", ids));
                 } else {
                     //按流程走
@@ -1052,12 +1057,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         //最终审核了,审核通过
                         if (item.getIsDeptAudit() == 1) {
                             //如果最终是部门审核,直接通过
-                            //如果最终是项目审核
-                            reportMapper.update(new Report().setState(1),
+                            reportMapper.update(new Report().setState(1).setProjectAuditTime(LocalDateTime.now()),
                                     new QueryWrapper<Report>().in("id", ids));
                         } else {
                             //如果最终是项目审核,流程中的项目审核字段也要更新: state为最终审核状态,projectAuditState为阶段性的项目审核状态
-                            reportMapper.update(new Report().setState(1).setProjectAuditState(1),
+                            reportMapper.update(new Report().setState(1).setProjectAuditState(1).setProjectAuditTime(LocalDateTime.now()),
                                     new QueryWrapper<Report>().in("id", ids));
                         }
                     } else {
@@ -1117,22 +1121,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
 
                 //对导入审核,添加记录
-                if (oldState == -1) {
-                    ReportAuditLog log = new ReportAuditLog();
-                    log.setAuditChannel(0);//导入审核
-                    log.setCompanyId(company.getId());
-                    log.setResult("通过");
-                    log.setUserId(user.getId());
-                    log.setUserName(user.getName());
-                    reportAuditLogMapper.insert(log);
-                    //员工的日期
-                    ReportAlogMembdate membdate = new ReportAlogMembdate();
-                    membdate.setRlogId(log.getId());
-                    membdate.setCreateDate(oneReport.getCreateDate());
-                    membdate.setUserId(oneReport.getCreatorId());
-                    membdate.setUserName(userMapper.selectById(oneReport.getCreatorId()).getName());
-                    reportAlogMembdateMapper.insert(membdate);
-                }
+                int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
+                ReportAuditLog log = new ReportAuditLog();
+                log.setAuditChannel(channel);
+                log.setCompanyId(company.getId());
+                log.setResult("通过");
+                log.setUserId(user.getId());
+                log.setUserName(user.getName());
+                reportAuditLogMapper.insert(log);
+                //员工的日期
+                ReportAlogMembdate membdate = new ReportAlogMembdate();
+                membdate.setRlogId(log.getId());
+                membdate.setCreateDate(oneReport.getCreateDate());
+                membdate.setUserId(oneReport.getCreatorId());
+                membdate.setUserName(userMapper.selectById(oneReport.getCreatorId()).getName());
+                reportAlogMembdateMapper.insert(membdate);
             }
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");
@@ -1333,22 +1336,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             informationMapper.insert(new Information().setType(0).setContent(date).setUserId(fillUserId).setMsg(str));
 
             //对导入审核,添加记录
-            if (oldState == -1) {
-                ReportAuditLog log = new ReportAuditLog();
-                log.setAuditChannel(0);//导入审核
-                log.setCompanyId(company.getId());
-                log.setResult("驳回"+(StringUtils.isEmpty(reason)?"":"("+reason+")"));
-                log.setUserId(user.getId());
-                log.setUserName(user.getName());
-                reportAuditLogMapper.insert(log);
-                //员工的日期
-                ReportAlogMembdate membdate = new ReportAlogMembdate();
-                membdate.setRlogId(log.getId());
-                membdate.setCreateDate(oneReport.getCreateDate());
-                membdate.setUserId(oneReport.getCreatorId());
-                membdate.setUserName(userMapper.selectById(oneReport.getCreatorId()).getName());
-                reportAlogMembdateMapper.insert(membdate);
-            }
+            int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
+            ReportAuditLog log = new ReportAuditLog();
+            log.setAuditChannel(channel);//导入审核
+            log.setCompanyId(company.getId());
+            log.setResult("驳回"+(StringUtils.isEmpty(reason)?"":"("+reason+")"));
+            log.setUserId(user.getId());
+            log.setUserName(user.getName());
+            reportAuditLogMapper.insert(log);
+            //员工的日期
+            ReportAlogMembdate membdate = new ReportAlogMembdate();
+            membdate.setRlogId(log.getId());
+            membdate.setCreateDate(oneReport.getCreateDate());
+            membdate.setUserId(oneReport.getCreatorId());
+            membdate.setUserName(userMapper.selectById(oneReport.getCreatorId()).getName());
+            reportAlogMembdateMapper.insert(membdate);
 
             //发送企业微信通知消息
             User reporter = userMapper.selectById(fillUserId);
@@ -1536,7 +1538,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         reportMapper.update(report, new QueryWrapper<Report>().in("id", ids));
                     } else {
                         //直接进行项目经理审核
-                        reportMapper.update(new Report().setState(1),
+                        reportMapper.update(new Report().setState(1).setProjectAuditTime(LocalDateTime.now()),
                                 new QueryWrapper<Report>().in("id", ids));
                         List<Report> finalReportList = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
                         notifyLeaders(finalReportList);
@@ -1545,6 +1547,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
 
         } else {
+            LocalDateTime now = LocalDateTime.now();
             List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                     new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", company.getId())
                             .orderByAsc("seq"));
@@ -1554,7 +1557,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<Report> allReports = null;
             if (settings.size() == 0) {
                 //公司没有自定义流程,直接进行项目经理审核
-                reportMapper.update(new Report().setState(1),
+                reportMapper.update(new Report().setState(1).setProjectAuditTime(now),
                         new QueryWrapper<Report>().in("id", ids));
                 if (oldState == -1) {
                     allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
@@ -1573,7 +1576,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     Report curReport = new Report().setId(rid);
                     if (deptSettings.size() == 0) {
                         //直接进行项目经理审核
-                        curReport.setState(1);
+                        curReport.setState(1).setProjectAuditTime(now);
                     } else {
                         //按流程走, 取到当前报告的数据
                         Report item = allReports.stream().filter(a->a.getId().equals(rid)).findFirst().get();
@@ -1582,10 +1585,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             if (item.getIsDeptAudit() == 1) {
                                 //如果最终是部门审核,直接通过
                                 //如果最终是项目审核
-                                curReport.setState(1);
+                                curReport.setState(1).setProjectAuditTime(now);
                             } else {
                                 //如果最终是项目审核,流程中的项目审核字段也要更新: state为最终审核状态,projectAuditState为阶段性的项目审核状态
-                                curReport.setState(1).setProjectAuditState(1);
+                                curReport.setState(1).setProjectAuditState(1).setProjectAuditTime(now);
                             }
                         } else {
                             if (item.getIsDeptAudit() == 1) {
@@ -1668,37 +1671,35 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
             }
 
-            if (oldState == -1) {
-                //需要进行审核记录保存
-                ReportAuditLog log = new ReportAuditLog();
-                log.setAuditChannel(0);//导入审核
-                log.setCompanyId(company.getId());
-                log.setResult("批量通过");
-                log.setUserId(user.getId());
-                log.setUserName(user.getName());
-                reportAuditLogMapper.insert(log);
-                //当前所有员工的日期
-                List<ReportAlogMembdate> membList = new ArrayList<>();
-                for (Report r : allReports) {
-                    LocalDate date = r.getCreateDate();
-                    String creatorId = r.getCreatorId();
-                    if (!membList.stream().anyMatch(m->m.getCreateDate().isEqual(date) && m.getUserId().equals(creatorId))) {
-                        //没有的话,存进去
-                        ReportAlogMembdate membdate = new ReportAlogMembdate();
-                        membdate.setRlogId(log.getId());
-                        membdate.setCreateDate(date);
-                        membdate.setUserId(creatorId);
-                        Optional<User> oneUser = allUsers.stream().filter(a->a.getId().equals(creatorId)).findFirst();
-                        if (oneUser.isPresent()) {
-                            membdate.setUserName(oneUser.get().getName());
-                        }
-                        membList.add(membdate);
-
+            int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
+            //需要进行审核记录保存
+            ReportAuditLog log = new ReportAuditLog();
+            log.setAuditChannel(channel);
+            log.setCompanyId(company.getId());
+            log.setResult("批量通过");
+            log.setUserId(user.getId());
+            log.setUserName(user.getName());
+            reportAuditLogMapper.insert(log);
+            //当前所有员工的日期
+            List<ReportAlogMembdate> membList = new ArrayList<>();
+            for (Report r : allReports) {
+                LocalDate date = r.getCreateDate();
+                String creatorId = r.getCreatorId();
+                if (!membList.stream().anyMatch(m->m.getCreateDate().isEqual(date) && m.getUserId().equals(creatorId))) {
+                    //没有的话,存进去
+                    ReportAlogMembdate membdate = new ReportAlogMembdate();
+                    membdate.setRlogId(log.getId());
+                    membdate.setCreateDate(date);
+                    membdate.setUserId(creatorId);
+                    Optional<User> oneUser = allUsers.stream().filter(a->a.getId().equals(creatorId)).findFirst();
+                    if (oneUser.isPresent()) {
+                        membdate.setUserName(oneUser.get().getName());
                     }
+                    membList.add(membdate);
                 }
-                if (membList.size() > 0) {
-                    reportAlogMembdateService.saveBatch(membList);
-                }
+            }
+            if (membList.size() > 0) {
+                reportAlogMembdateService.saveBatch(membList);
             }
 //            //直接进行项目经理审核
 //            reportMapper.update(new Report().setState(1),
@@ -1760,38 +1761,37 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         Report oneReport = reportMapper.selectById(ids.get(0));
         int oldState = oneReport.getState();
-        if (oldState == -1) {
-            //需要进行审核记录保存
-            ReportAuditLog log = new ReportAuditLog();
-            log.setAuditChannel(0);//导入审核
-            log.setCompanyId(company.getId());
-            log.setResult("批量驳回");
-            log.setUserId(user.getId());
-            log.setUserName(user.getName());
-            reportAuditLogMapper.insert(log);
-            List<Report> allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
-            List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
-            //当前所有员工的日期
-            List<ReportAlogMembdate> membList = new ArrayList<>();
-            for (Report r : allReports) {
-                LocalDate date = r.getCreateDate();
-                String creatorId = r.getCreatorId();
-                if (!membList.stream().anyMatch(m->m.getCreateDate().isEqual(date) && m.getUserId().equals(creatorId))) {
-                    //没有的话,存进去
-                    ReportAlogMembdate membdate = new ReportAlogMembdate();
-                    membdate.setRlogId(log.getId());
-                    membdate.setCreateDate(date);
-                    membdate.setUserId(creatorId);
-                    Optional<User> oneUser = allUsers.stream().filter(a->a.getId().equals(creatorId)).findFirst();
-                    if (oneUser.isPresent()) {
-                        membdate.setUserName(oneUser.get().getName());
-                    }
-                    membList.add(membdate);
+        int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
+        //需要进行审核记录保存
+        ReportAuditLog log = new ReportAuditLog();
+        log.setAuditChannel(channel);//导入审核
+        log.setCompanyId(company.getId());
+        log.setResult("批量驳回");
+        log.setUserId(user.getId());
+        log.setUserName(user.getName());
+        reportAuditLogMapper.insert(log);
+        List<Report> allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+        List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
+        //当前所有员工的日期
+        List<ReportAlogMembdate> membList = new ArrayList<>();
+        for (Report r : allReports) {
+            LocalDate date = r.getCreateDate();
+            String creatorId = r.getCreatorId();
+            if (!membList.stream().anyMatch(m->m.getCreateDate().isEqual(date) && m.getUserId().equals(creatorId))) {
+                //没有的话,存进去
+                ReportAlogMembdate membdate = new ReportAlogMembdate();
+                membdate.setRlogId(log.getId());
+                membdate.setCreateDate(date);
+                membdate.setUserId(creatorId);
+                Optional<User> oneUser = allUsers.stream().filter(a->a.getId().equals(creatorId)).findFirst();
+                if (oneUser.isPresent()) {
+                    membdate.setUserName(oneUser.get().getName());
                 }
+                membList.add(membdate);
             }
-            if (membList.size() > 0) {
-                reportAlogMembdateService.saveBatch(membList);
-            }
+        }
+        if (membList.size() > 0) {
+            reportAlogMembdateService.saveBatch(membList);
         }
         //直接进行项目经理审核驳回
         reportMapper.update(new Report().setState(2),
@@ -2501,6 +2501,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             TimeType timeType = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", user.getCompanyId()));
             Company company = companyMapper.selectById(user.getCompanyId());
 
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
             //准备导出
             HSSFWorkbook workbook = new HSSFWorkbook();
             HSSFSheet sheet = workbook.createSheet("工作日报");
@@ -2524,7 +2525,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (timeType.getCustomDegreeActive() == 1) {
                 titles.add(timeType.getCustomDegreeName());
             }
-
+            if (timeType.getShowFillauditTime() == 1) {
+                titles.add("填写时间");
+                titles.add("审核人");
+                titles.add("审核时间");
+            }
             titles.add("工作事项");
 
             //创建表头
@@ -2704,8 +2709,24 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     row.createCell(index).setCellValue(map.get("degreeName") != null?map.get("degreeName").toString():"");
                     index++;
                 }
+                //
+                if (timeType.getShowFillauditTime() == 1) {
+                    row.createCell(index).setCellValue(sdf.format((Date)map.get("time")));
+                    index++;
+                    row.createCell(index).setCellValue((String)map.get("projectAuditorName"));
+                    index++;
+                    if (map.get("projectAuditTime") == null) {
+                        row.createCell(index).setCellValue("");
+                    } else {
+                        row.createCell(index).setCellValue(sdf.format((Date)map.get("projectAuditTime")));
+                    }
+
+                    index++;
+//                    titles.add("填写时间");
+//                    titles.add("审核人");
+//                    titles.add("审核时间");
+                }
                 row.createCell(index).setCellValue((String) map.get("content"));
-                index++;
                 rowNum++;
             }
             //生成Excel文件
@@ -2821,7 +2842,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg listDeptImportByState(String leaderId, Integer projectId, Integer dateType, String date, Integer departmentId, HttpServletRequest request) {
+    public HttpRespMsg listDeptImportByState(String leaderId, Integer projectId, Integer dateType, String date, Integer pageIndex, Integer pageSize, Integer departmentId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@@ -2848,9 +2869,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 startDate = date + "-01";
                 endDate = date + "-31";
             }
-            List<Map<String, Object>> auditReportList = reportMapper.getDeptImportAuditList(companyId, leaderId, startDate, endDate, filterDeptIds, projectId);
-
-            httpRespMsg.data = auditReportList;
+            //pageIndex从1开始
+            Integer startIndex = (pageIndex -1) * pageSize;
+            List<Map<String, Object>> auditReportList = reportMapper.getDeptImportAuditList(companyId, leaderId, startDate, endDate, filterDeptIds, projectId, startIndex, pageSize);
+            long total = reportMapper.getDeptImportAuditListCount(companyId, leaderId, startDate, endDate, filterDeptIds, projectId);
+            HashMap result = new HashMap();
+            result.put("total", total);
+            result.put("record", auditReportList);
+            httpRespMsg.data = result;
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");
             return httpRespMsg;
@@ -2930,12 +2956,28 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         //获取企业微信同步数据
         List<Map> userCorpwxTimeMapList = userCorpwxTimeMapper.selectByAsk(companyId,startDate,endDate);
+
         String lastUserId = null;
         UserMonthWork lastUserData = null;
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         LocalDate localStart = LocalDate.parse(startDate, dtf);
         LocalDate localEnd = LocalDate.parse(endDate, dtf);
+
+        //按比例分摊的人员不需要出现在未填人员名单中
+        String[] split = startDate.split("-");
+        String ymonth = split[0]+"-"+split[1];
+        List<String> setPercentUserIdList = new ArrayList<>();
+        ProjectPercentage percentage = projectPercentageMapper.selectOne(new QueryWrapper<ProjectPercentage>().eq("company_id", companyId).eq("ymonth", ymonth));
+        if (percentage != null) {
+            String data = percentage.getData();
+            JSONArray array = JSONArray.parseArray(data);
+            for (int i=0;i<array.size(); i++) {
+                String userId = array.getJSONObject(i).getString("id");
+                setPercentUserIdList.add(userId);
+            }
+        }
+
         long cnt = localStart.until(localEnd, ChronoUnit.DAYS);
         //按人员过滤
         for (User curUser: allRangeUserList){
@@ -2953,6 +2995,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if (!WorkDayCalculateUtils.isWorkDay(date)) {
                         continue;
                     }
+                    //去掉设置了分摊比例的人员
+                    if (setPercentUserIdList.contains(curUser.getId())) {
+                        continue;
+                    }
                     final String dateStr = dtf.format(date);
                     if (!list.stream().anyMatch(item->item.get("id").equals(curUser.getId())&&sdf.format((java.sql.Date)item.get("createDate")).equals(dateStr))) {
                         UserDailyWorkItem noRecord = new UserDailyWorkItem();
@@ -3030,4 +3076,20 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg approveAllImport(HttpServletRequest request) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        reportMapper.approveAllDeptImportList(user.getCompanyId(), token);
+        //需要进行审核记录保存
+        ReportAuditLog log = new ReportAuditLog();
+        log.setAuditChannel(0);//导入审核
+        log.setCompanyId(user.getCompanyId());
+        log.setResult("一键全部通过");
+        log.setUserId(user.getId());
+        log.setUserName(user.getName());
+        reportAuditLogMapper.insert(log);
+        return new HttpRespMsg();
+    }
+
 }

+ 33 - 29
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -122,6 +122,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private UserCertMapper userCertMapper;
     @Resource
     private UserCertService userCertService;
+    @Resource
+    private TaskGroupMapper taskGroupMapper;
     //登录网页端
     @Override
     public HttpRespMsg loginAdmin(String username, String password) {
@@ -232,8 +234,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         //返回菜单
         List<SysRoleModule> rModules = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", roleId));
         List<Integer> ids = rModules.stream().map(SysRoleModule::getModuleId).collect(Collectors.toList());
-        //项目报告审核模块,如果参与日报的审核,需要自动加上
-        if (user.isLeader() || user.isHasAuditDept()) {
+        //项目报告审核模块,如果参与日报的审核,需要自动加上, 或者担任任务分组负责人
+        if (user.isLeader() || user.isHasAuditDept() || (company.getPackageProject() == 1 && taskGroupMapper.selectCount(new QueryWrapper<TaskGroup>().eq("incharger_id", user.getId())) > 0)) {
             SysModule projectAuditModule = sysModuleMapper.selectOne(new QueryWrapper<SysModule>().eq("name", "项目报告审核"));
             if (!ids.contains(projectAuditModule.getId())) {
                 ids.add(projectAuditModule.getId());
@@ -799,12 +801,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         //查询工作时长设置
         TimeType time = timeTypeMapper.selectById(companyId);
         //默认角色
-        int roleId = 0;
+        SysRole defaultRole = null;
         List<SysRole> droleList = sysRoleMapper.selectList(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
         if (droleList.size() > 0) {
-            roleId = droleList.get(0).getId();
+            defaultRole = droleList.get(0);
         }
-        BigDecimal monthHours = time.getMonthDays().multiply(new BigDecimal(time.getAllday()));
+//        BigDecimal monthHours = time.getMonthDays().multiply(new BigDecimal(time.getAllday()));
         //然后处理文件
         String fileName = multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
@@ -841,8 +843,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 XSSFCell nameCell = row.getCell(0);
                 XSSFCell phoneCell = row.getCell(1);
                 XSSFCell deptCell = row.getCell(2);
-                XSSFCell monthCostCell = row.getCell(3);
-                XSSFCell costCell = row.getCell(4);
+//                XSSFCell monthCostCell = row.getCell(3);
+//                XSSFCell costCell = row.getCell(4);
                 nameCell.setCellType(CellType.STRING);
                 phoneCell.setCellType(CellType.STRING);
 
@@ -881,30 +883,31 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     }
                 }
 
+                //改成导入时没有成本的方式,默认都是0
                 int salaryType = 0;
                 BigDecimal monthCost = new BigDecimal(0);
                 BigDecimal cost = new BigDecimal(0);
-                if (monthCostCell != null) {
-                    monthCostCell.setCellType(CellType.STRING);
-                    String monthCostString = monthCostCell.getStringCellValue();
-
-                    monthCost = MathUtil.isIntegerOrDigital(monthCostString)? new BigDecimal(monthCostString) : BigDecimal.valueOf(0);
-                    //计算时薪
-                    cost = monthCost.divide(monthHours, 2, RoundingMode.HALF_UP);
-                    if (MathUtil.isIntegerOrDigital(monthCostString)) {
-                        salaryType = 0;
-                    } else {
-                        salaryType = 1;
-                    }
-                } else {
-                    salaryType = 1;
-                }
-                if (costCell != null) {
-                    costCell.setCellType(CellType.STRING);
-                    String costString = costCell.getStringCellValue();
-                    cost = MathUtil.isIntegerOrDigital(costString) ? new BigDecimal(costString) : BigDecimal.valueOf(0);
-                }
-
+//                if (monthCostCell != null) {
+//                    monthCostCell.setCellType(CellType.STRING);
+//                    String monthCostString = monthCostCell.getStringCellValue();
+//
+//                    monthCost = MathUtil.isIntegerOrDigital(monthCostString)? new BigDecimal(monthCostString) : BigDecimal.valueOf(0);
+//                    //计算时薪
+//                    cost = monthCost.divide(monthHours, 2, RoundingMode.HALF_UP);
+//                    if (MathUtil.isIntegerOrDigital(monthCostString)) {
+//                        salaryType = 0;
+//                    } else {
+//                        salaryType = 1;
+//                    }
+//                } else {
+//                    salaryType = 1;
+//                }
+//                if (costCell != null) {
+//                    costCell.setCellType(CellType.STRING);
+//                    String costString = costCell.getStringCellValue();
+//                    cost = MathUtil.isIntegerOrDigital(costString) ? new BigDecimal(costString) : BigDecimal.valueOf(0);
+//                }
+//                salaryType = 1;
                 if (!StringUtils.isEmpty(phone)) {
                     phoneList.add(phone);
                 }
@@ -914,7 +917,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         .setName(name)
                         .setPassword(MD5Util.getPassword("000000"))
                         .setPhone(phone)
-                        .setRoleId(roleId)
+                        .setRoleId(defaultRole.getId())
+                        .setRoleName(defaultRole.getRolename())
                         .setDepartmentId(deptId)
                         .setDepartmentCascade(deptCascade)
                         .setColor(ColorUtil.randomColor())

+ 26 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -349,11 +349,32 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     Long time = base_info.getLong("date");
                     JSONArray workRules = base_info.getJSONObject("rule_info").getJSONArray("checkintime");
                     //获取上下午的考勤打卡规则
-                    String baseMorningStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("work_sec"));
-                    String baseMorningEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("off_work_sec"));
-                    String baseAfternoonStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(1).getIntValue("work_sec"));
-                    String baseAfternoonEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(1).getIntValue("off_work_sec"));
-                    int restTime = workRules.getJSONObject(1).getIntValue("work_sec") - workRules.getJSONObject(0).getIntValue("off_work_sec");
+                    String baseMorningStart = workRules.size()<=1?"09:00":DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("work_sec"));
+                    String baseMorningEnd = workRules.size()<=1?"12:00":DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("off_work_sec"));
+                    String baseAfternoonStart = workRules.size()<=1?"13:00":DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(1).getIntValue("work_sec"));
+                    String baseAfternoonEnd = workRules.size()<=1?"18:00":DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(1).getIntValue("off_work_sec"));
+                    if (workRules.size() == 0) {
+                        baseMorningStart = "09:00";
+                        baseMorningEnd = "12:00";
+                        baseAfternoonStart = "13:00";
+                        baseAfternoonEnd = "18:00";
+                    } else if (workRules.size() == 1) {
+                        baseMorningStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("work_sec"));
+                        baseMorningEnd = "12:00";
+                        baseAfternoonStart = "13:00";
+                        baseAfternoonEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("off_work_sec"));
+                    } else {
+                        baseMorningStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("work_sec"));
+                        baseMorningEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("off_work_sec"));
+                        baseAfternoonStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(1).getIntValue("work_sec"));
+                        baseAfternoonEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(1).getIntValue("off_work_sec"));
+                    }
+                    int restTime = 0;
+                    if (workRules.size() <= 1) {
+                        restTime = 3600;//一个小时午休
+                    } else {
+                        restTime = workRules.getJSONObject(1).getIntValue("work_sec") - workRules.getJSONObject(0).getIntValue("off_work_sec");
+                    }
 
                     LocalDate localDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(time), ZoneId.systemDefault()).toLocalDate();
                     UserCorpwxTime ct = new UserCorpwxTime();

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

@@ -242,18 +242,19 @@ public class TimingTask {
                 LocalDate monday = lastWeek.minusDays(weekDay-1);
                 LocalDate sunday = monday.plusDays(6);
                 List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", u.getId()).between("create_date", monday, sunday));
-                List<Integer> pids = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
-                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", pids));
-                String collect = projectList.stream().map(Project::getProjectName).collect(Collectors.joining(","));
-                //计算总工时
-                double sum = reportList.stream().mapToDouble(Report::getWorkingTime).sum();
-                double waiting = reportList.stream().filter(r -> r.getState() == 0).mapToDouble(Report::getWorkingTime).sum();
-                double reject = reportList.stream().filter(r -> r.getState() == 2).mapToDouble(Report::getWorkingTime).sum();
-                double pass = reportList.stream().filter(r -> r.getState() == 1).mapToDouble(Report::getWorkingTime).sum();
-                DecimalFormat df = new DecimalFormat("#0.0");
-                String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + df.format(sum)+"小时。其中审核通过"+df.format(pass)
-                        +"小时, 待审核"+df.format(waiting)+"小时,驳回"+df.format(reject)+"小时。";
-                pushLastWeekReportFill(u, str);
+                if (reportList.size() > 0) {
+                    List<Integer> pids = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
+                    List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", pids));
+                    //计算总工时
+                    double sum = reportList.stream().mapToDouble(Report::getWorkingTime).sum();
+                    double waiting = reportList.stream().filter(r -> r.getState() == 0).mapToDouble(Report::getWorkingTime).sum();
+                    double reject = reportList.stream().filter(r -> r.getState() == 2).mapToDouble(Report::getWorkingTime).sum();
+                    double pass = reportList.stream().filter(r -> r.getState() == 1).mapToDouble(Report::getWorkingTime).sum();
+                    DecimalFormat df = new DecimalFormat("#0.0");
+                    String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + df.format(sum)+"小时。其中审核通过"+df.format(pass)
+                            +"小时, 待审核"+df.format(waiting)+"小时,驳回"+df.format(reject)+"小时。";
+                    pushLastWeekReportFill(u, str);
+                }
             }
         }
     }

+ 0 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -17,7 +17,6 @@ spring:
     url: jdbc:mysql://47.101.180.183:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
     password: HuoshiDB@2022
-
     hikari:
       maximum-pool-size: 10
       minimum-idle: 3

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

@@ -19,7 +19,7 @@
         id, customer_code, customer_name, contact_name, contact_phone, email, address, company_id
     </sql>
     <select id="getAll" resultMap="BaseResultMap">
-        select id, customer_name from customer_info where company_id = #{companyId}
+        select id, customer_name,customer_code from customer_info where company_id = #{companyId}
         ORDER BY id DESC
     </select>
 

Разница между файлами не показана из-за своего большого размера
+ 45 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml


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

@@ -35,11 +35,12 @@
         <result column="custom_text_name" property="customTextName" />
         <result column="lock_worktime" property="lockWorktime" />
         <result column="fill_overtime" property="fillOvertime" />
+        <result column="show_fillaudit_time" property="showFillauditTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time, need_dept_audit, report_workflow, custom_data_active, custom_data_name, finance_audit, overtime_ratio, sync_dingding, is_cro, only_importreport, show_dd_cardtime, show_corpwx_cardtime, custom_text_active, custom_text_name, lock_worktime, fill_overtime
+        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time, need_dept_audit, report_workflow, custom_data_active, custom_data_name, finance_audit, overtime_ratio, sync_dingding, is_cro, only_importreport, show_dd_cardtime, show_corpwx_cardtime, custom_text_active, custom_text_name, lock_worktime, fill_overtime, show_fillaudit_time
     </sql>
 
 </mapper>

BIN
fhKeeper/formulahousekeeper/management-platform/人员导入模板.xlsx


BIN
fhKeeper/formulahousekeeper/management-platform/南京火石闪信网络科技有限公司_财务人员成本模板.xls


BIN
fhKeeper/formulahousekeeper/management-platform/新增客户导入模板.xlsx


BIN
fhKeeper/formulahousekeeper/management-platform/研究中心导入模板.xlsx


+ 10 - 10
fhKeeper/formulahousekeeper/timesheet/config/index.js

@@ -1,18 +1,18 @@
 var path = require('path')
 
 //  var ip = '127.0.0.1'
-var ip = '192.168.2.4'
+// var ip = '192.168.2.39'
 // var ip = '192.168.2.12'// var ip = '47.100.37.243' 
 
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 
 module.exports = {
   build: {

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

@@ -283,8 +283,11 @@
             <div v-if="ins == 6" style="padding: 0 20px">
               <div class="flsx">
                 <div>
-                  <el-select v-model="proJuctId" placeholder="请选择项目" @change="selcts()" clearable filterable>
+                  <!-- <el-select v-model="proJuctId" placeholder="请选择项目" @change="selcts()" clearable filterable>
                     <el-option v-for="(item, index) in proList" :key="index" :label="item.projectName" :value="item.id" @change="selscts(item)"></el-option>
+                  </el-select> -->
+                  <el-select v-model="proJuctId" placeholder="请选择项目" @change="selcts()" clearable filterable>
+                    <el-option v-for="(item, index) in proListOvertime" :key="index" :label="item.projectName" :value="item.id" @change="selscts(item)"></el-option>
                   </el-select>
                 </div>
                 <div class="bianju">
@@ -535,6 +538,7 @@ export default {
       detailsList: [],
       baseCostList: [],
       baseCostColumns: [],
+      proListOvertime: [], // 加班情况项目筛选
     };
   },
   computed: {},
@@ -549,6 +553,7 @@ export default {
   },
 
   mounted() {
+    this.getProjectListOvertime()
     this.getProjectList();
     this.getUserList()
   },
@@ -992,6 +997,31 @@ export default {
             });
         });
     },
+    // 加班情况获取项目
+    getProjectListOvertime() {
+        this.listLoading = true;
+        this.http.post('/project/getProjectPage', {
+                    pageIndex: 1,
+                    pageSize: 9999,
+        },
+        res => {
+            if (res.code == "ok") {
+                this.proListOvertime = res.data.records
+                this.listLoading = false; 
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
     // 点击侧边栏事件
     side() {
       if(this.$refs.side.style.left < '0px') {

+ 68 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue

@@ -499,6 +499,7 @@
         <div class="ctons">
           <div class="flex">
             <div>
+              <span>请假类型</span>
               <el-select v-model="leaveTypeItem" placeholder="请选择请假类型" @change="leaveTypeChange()" style="width: 180px" size="small" v-show="permissions.leaveAll" filterable="true">
                   <span v-for="item in leaveTypeList" :key="item.leaveCode">
                   <el-option :label="item.leaveName" :value="item.leaveCode"></el-option>
@@ -506,33 +507,45 @@
               </el-select>
             </div>
             <div>
-              <el-select v-model="ownerIds" placeholder="请选择请假人" clearable @change="chufas()" style="width: 180px" size="small" v-show="permissions.leaveAll" filterable="true">
+              <span>人员筛选</span>
+              <el-select v-model="userSelId" placeholder="请选择请假人" clearable @change="userChg()" style="width: 180px" size="small" v-show="permissions.leaveAll" filterable="true">
                   <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
               </el-select>
             </div>
+            <div>
+              <span>部门筛选</span>
+              <el-cascader
+              size="small"
+              @change="departmentOptionsChg"
+              v-model="departmentSel"
+              :options="departmentOptions"
+              :show-all-levels="false"
+              :props="{ checkStrictly: true }"
+              clearable></el-cascader>
+            </div>
           </div>
             <el-table key="apk2is8" v-loading="loading" :data="vacationList" style="width: 100%" height="90%">
                 <el-table-column prop="name" label="员工姓名" min-width="120" fixed="left"></el-table-column>
                 <el-table-column label="有效期" min-width="250" align="center">
                   <template slot-scope="scope">
-                    <span>{{scope.row.startTime + '\u3000~\u3000' + scope.row.endTime}}</span>
+                    <span>{{scope.row.startTime == null && scope.row.endTime == null ? '~ ~' : (scope.row.startTime + '\u3000~\u3000' + scope.row.endTime)}}</span>
                   </template>
                 </el-table-column>
                 <el-table-column label="总额度" min-width="100" align="center">
                   <template slot-scope="scope">
-                    <span>{{scope.row.quotaInDays == null ? scope.row.quotaInHours + '小时' : scope.row.quotaInDays + '天'}}</span>
+                    <span>{{scope.row.quotaInDays == null && scope.row.quotaInHours == null ? '-' : (scope.row.quotaInDays == null ? scope.row.quotaInHours + '小时' : scope.row.quotaInDays + '天')}}</span>
                   </template>
                 </el-table-column>
                 <el-table-column label="已使用" min-width="100" align="center">
                   <template slot-scope="scope">
-                    <span>{{scope.row.usedInDays == null ? scope.row.usedInHours + '小时' : scope.row.usedInDays + '天'}}</span>
+                    <span>{{scope.row.usedInDays == null && scope.row.usedInHours == null ? '-' : (scope.row.usedInDays == null ? scope.row.usedInHours + '小时' : scope.row.usedInDays + '天')}}</span>
                   </template>
                 </el-table-column>
                 <el-table-column label="剩余额度" min-width="100" align="center">
                   <template slot-scope="scope">
-                    <span>{{scope.row.leftInDays == null ? scope.row.leftInHours + '小时' : scope.row.leftInDays + '天'}}</span>
+                    <span>{{scope.row.leftInDays == null && scope.row.leftInHours == null ? '-' : (scope.row.leftInDays == null ? scope.row.leftInHours + '小时' : scope.row.leftInDays + '天')}}</span>
                   </template>
                 </el-table-column>
             </el-table>
@@ -541,8 +554,8 @@
                   @size-change="vacationSizeChange"
                   @current-change="vacationCurrentChange"
                   :current-page="currentPage4"
-                  :page-sizes="[20, 50, 100, 200]"
-                  :page-size="20"
+                  :page-sizes="[50]"
+                  :page-size="50"
                   layout="total, sizes, prev, pager, next"
                   :total="total">
                 </el-pagination>
@@ -800,6 +813,9 @@ export default {
       vacationList: [],
       leaveTypeList: [],
       leaveTypeItem: '',
+      departmentOptions: [],
+      departmentSel: [],
+      userSelId: ''
     };
   },
   computed: {},
@@ -829,6 +845,36 @@ export default {
   },
   filters: {},
   methods: {
+
+    getDepartmentOptions(){
+      this.http.post(this.port.manage.depList,{
+      },res =>{
+        if(res.code == 'ok'){
+          console.log('getDepartment',res.data);
+          this.departmentOptions = this.changeArr(res.data)
+        }else {
+          this.$message({
+            message: res.msg,
+            type: 'error'
+          })
+        }
+      },err => {
+        this.$message({
+          message: err,
+          type: 'error'
+        })
+      })
+    },
+    departmentOptionsChg(){
+      console.log(this.departmentSel);
+      this.getVacationList(1)
+    },
+    userChg(){
+      console.log(this.userSelId);
+      this.getVacationList(1)
+    },
+
+
     // 获取剩余假期信息列表
     getVacationList(e){
       this.loading = true
@@ -836,16 +882,22 @@ export default {
       if(e){
         item = {
           companyId: this.user.companyId,
-          offset: 0,
-          leaveCode: this.leaveTypeItem,
-          userIds: '2221645448842951,1626196355494406127,4846011135382072,32394905661239307'
+          pageIndex: this.page,
+          leaveCode: this.leaveTypeItem
+        }
+        if(this.departmentSel.length != 0){
+          item.departmentId = this.departmentSel[this.departmentSel.length - 1]
+        }
+        if(this.userSelId != ''){
+          item.userId = this.userSelId
         }
+        // if()
       }else{
         item = {
           companyId: this.user.companyId,
           // leaveCode: '',
           // userId: '',
-          pageIndex: 1,
+          pageIndex: this.page,
           // departmentId: ''
         }
       }
@@ -877,6 +929,7 @@ export default {
       })
     },
     leaveTypeChange(){
+      console.log(this.leaveTypeItem);
       this.getVacationList(1)
     },
 
@@ -1281,6 +1334,9 @@ export default {
         this.displayTable = true
         this.apk = true
         this.getVacationList()
+        this.getDepartmentOptions()
+        this.userSelId = ''
+        this.departmentSel = []
       }
     },
     bills(audit, tr){
@@ -1949,6 +2005,7 @@ export default {
   border-bottom: 1px solid #f2f2f2;
 }
 .flex span {
+  color: #606266;
   display: inline-block;
   margin: 0 10px 0 20px;
 }

+ 9 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue

@@ -3,7 +3,7 @@
         <div style="margin: 0 auto;width:1000px;">
             <el-row :gutter="24">
                 <el-col :span="12">
-                    <div class="box" style="min-height:180px" id="allBox">
+                    <div class="box" ref="allBox">
                         <div >
                             <!-- <div class="lableTxt">总成本基线</div> -->
                             <label class="lableTxt">总成本基线<el-link v-if="permissions.projectCorrection" @click="correctBase" style="float:right;"><i class="el-icon-edit"  ></i></el-link></label>
@@ -21,7 +21,7 @@
                     </div>
                 </el-col>
                 <el-col :span="12">
-                    <div class="box" style="min-height:180px;">
+                    <div class="box" :style="nowBaseHeight">
                         <label class="lableTxt">当前成本基线</label>
                             <div class="lableCon" v-for="item in nowBaseList" :key="item.id">
                                 <div><span class="gray_label">{{item.baseName}}:</span></div>
@@ -114,7 +114,8 @@
                 ListLoading: false,
                 nowBaseList: [],
                 correctBaseDialog: false,
-                projectContractAmount: null
+                projectContractAmount: null,
+                nowBaseHeight: ''
             };
         },
         filters: {
@@ -340,7 +341,11 @@
                 },res => {
                     if(res.code == 'ok'){
                         this.nowBaseList = res.data
-                        
+                        // if(res.data.length == 0){
+                            let allboxh = this.$refs.allBox.scrollHeight - 20
+                            console.log('getnowbase',allboxh);
+                            this.nowBaseHeight = 'height:' + allboxh + 'px;'
+                        // }
                     }else {
                         this.$message({
                             message: res.msg,

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

@@ -99,6 +99,7 @@ export default {
 	  gantt.config.date_scale = "%F, %Y";		//设置时间刻度的格式(X轴) 多个尺度
 
 	  gantt.config.scale_height = 50; //设置时间刻度的高度和网格的标题
+    gantt.config.open_tree_initially = true;
 // gantt.config.layout = {
 //     css: "gantt_container",
 //     rows:[

+ 32 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue

@@ -221,21 +221,42 @@ export default {
                                 //   render: null
                                 // }
                                 for(let i in this.tasks.data){
-                                  if(this.tasks.data[i].parent == null){
+                                  // delete this.tasks.data[i].type
+                                  if(this.tasks.data[i].time == 0){
                                     // delete this.tasks.data[i].userId
-                                    // delete this.tasks.data[i].start_date
-                                    // delete this.tasks.data[i].end_date
-                                    // this.tasks.data[i].projectId = 0
-                                    // delete this.tasks.data[i].time
+                                    delete this.tasks.data[i].start_date
+                                    delete this.tasks.data[i].end_date
+                                    // delete this.tasks.data[i].projectId
+                                    // delete this.tasks.data[i].duration
+                                    this.tasks.data[i].type = 'milestone'
+                                    // this.tasks.data[i].type = 'project'
                                   }
+                                  // if(this.tasks.data[i].start_date != null){
+                                  //   this.tasks.data[i].start_date = new Date(this.tasks.data[i].start_date)
+                                  //   this.tasks.data[i].end_date = new Date(this.tasks.data[i].end_date)
+                                  // }
                                 }
+                                // let date1 = new Date(2022,4,23)
+                                // let date2 = new Date(date1.getFullYear(),date1.getMonth(),date1.getDate() + 3)
+                                // let ttt = [
+                                //   {text: '1',id: '100',parent: null,render: null},
+                                //   {text: '1-1',id: '1001',parent: '100',render: null,type: 'milestone'},
+                                //   {text: '1-2',id: '1002',parent: '100',render: null,type: 'milestone'},
+                                //   {text: '1-3',id: '1003',parent: '100',render: null,type: 'milestone'},
+                                //   {text: '1-1-1',id: '10011',parent: '1001',render: 'split'},
+                                //   {text: '1-1-2',id: '10012',parent: '1001',render: 'split'},
+                                //   {text: '2',id: '200',parent: null,render: null},
+                                //   {text: '2-1',id: '2001',parent: '200',render: null},
+                                //   {text: '2-2',id: '2002',parent: '200',render: null},
+                                //   {text: '2-2-1',id: '20021',parent: '2002',render: 'split'},
+                                //   {text: '2-2-2',id: '20022',parent: '2002',render: 'split'},
+                                //   {text: '3',id: '300',parent: null,render: null},
+                                //   {text: '1-1-1 in',id: 'in1',parent: '10011',render: null,start_date:'2022-5-25',end_date:'2022-5-27'},
+                                //   {text: '1-1-2 in',id: 'in2',parent: '10012',render: null,start_date:date1,end_date:date2},
+                                //   {text: '2-2-1 in',id: 'in3',parent: '20021',render: null,start_date:date1,end_date:date2},
+                                // ]
+                                // this.tasks.data = ttt
                                 console.log('tasks---',this.tasks.data);
-                                // this.tasks = JSON.parse(JSON.stringify(this.tasks))
-                                    // delete this.tasks.data[1].userId
-                                    // delete this.tasks.data[1].start_date
-                                    // delete this.tasks.data[1].end_date
-                                    // delete this.tasks.data[1].projectId
-                                    // delete this.tasks.data[1].time
                                 // this.tasks.data.push(item)
                                 // let item2 = {
                                 //   id:'parent2',

+ 94 - 56
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -309,7 +309,7 @@
                         </el-time-picker>
                         </span>
                         <div class="overtime" v-if="user.timeType.fillOvertime">
-                            <el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox>
+                            <el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox>
                             <el-input :disabled="!canEdit || domain.isOvertime==null || domain.isOvertime==0" v-model="domain.overtimeHours" @blur="triggerCalculateOT(index)" @input="domain.overtimeHours=domain.overtimeHours.replace(/[^\d.]/g,'')" style="width: 100px;"></el-input><span style="margin-left:5px">小时</span>
                         </div>
                     </el-form-item>
@@ -331,11 +331,11 @@
                             <el-option v-for="item in domain.subProjectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
                         </el-select>
                         
-                        <el-link v-if="index >= 1" type="primary" :underline="false" @click="delDomain(index)" style="float:right;margin-right:10px;"
+                        <el-link v-if="index >= 1&&canEdit" type="primary" :underline="false" @click="delDomain(index)" style="float:right;margin-right:10px;"
                             :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
                             <i class="fa fa-trash" style="color: red;;font-size:18px;"></i>
                         </el-link>
-                        <el-link type="primary" v-if="workForm.domains[index].state == 0 || workForm.domains[index].state == 2"
+                        <el-link type="primary" v-if="canEdit"
                             :underline="false" style="margin-left:10px;" @click="copyProject(index)">复制</el-link>
                     </el-form-item>
                     <el-form-item :label="user.companyId==781?'描述':'项目描述'" v-if="user.company.packageProject==0&&domain.projectId&&projectList.filter(p=>p.id == domain.projectId)[0].projectDesc">
@@ -422,7 +422,7 @@
                             <el-select v-model="domain.projectId" placeholder="请选择项目" style="width:200px;" clearable="true"  filterable="true"
                             @change="selectProject(domain, index)"
                             :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
-                                <el-option v-for="item in projectList" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
+                                <el-option v-for="item in projectList" :disabled="item.status>=2" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
                             </el-select>
                             <span  v-if="domain.subProjectList != null && domain.subProjectList.length> 0 && domain.projectId != ''"
                                 style="margin-left:45px;">子项目</span>
@@ -433,16 +433,16 @@
                                 <el-option v-for="item in domain.subProjectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
                             </el-select>
 
-                            <el-link v-if="index >= 1" type="primary" :underline="false" @click="delDomain(index)" style="float:right;margin-right:10px;"
+                            <el-link v-if="index >= 1&&canEdit" type="primary" :underline="false" @click="delDomain(index)" style="float:right;margin-right:10px;"
                                 :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
                                 <i class="fa fa-trash" style="color: red;;font-size:18px;"></i>
                             </el-link>
 
-                            <div class="overtime" v-if="user.timeType.fillOvertime"><el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox>
+                            <div class="overtime" v-if="user.timeType.fillOvertime"><el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox>
                             <el-input :disabled="!canEdit || domain.isOvertime==null || domain.isOvertime==0" v-model="domain.overtimeHours" @blur="triggerCalculateOT(index)" @input="domain.overtimeHours=domain.overtimeHours.replace(/[^\d.]/g,'')" style="width: 100px;"></el-input><span style="margin-left:5px">小时</span>
                             </div>
                             
-                            <el-link type="primary" v-if="workForm.domains[index].state == 0 || workForm.domains[index].state == 2"
+                            <el-link type="primary" v-if="canEdit"
                                 :underline="false" style="margin-left:10px;" @click="copyProject(index)">复制</el-link>
                         </el-form-item>
                         <el-form-item :label="user.companyId==781?'描述':'项目描述'" v-if="user.company.packageProject==0&&domain.projectId&&projectList.filter(p=>p.id == domain.projectId)[0].projectDesc">
@@ -567,7 +567,8 @@
                 <el-link v-if="showAddMore"  :disabled="!canEdit" type="primary" :underline="false" @click="addDomain(reportTimeType.type)" style="margin-left:40px">添加更多</el-link>
             </el-form>
             <span slot="footer" class="dialog-footer">
-                <el-button @click="deleteReport" v-if="workForm.domains[0].id != null">删除</el-button>
+                <!-- <el-button @click="cancelReport"  v-if="workForm.domains[0].id != null && workForm.domains[0].state == 0">撤回</el-button> -->
+                <el-button @click="deleteReport"  v-if="workForm.domains[0].id != null && canEdit">删除</el-button>
                 <el-button @click="dialogVisible = false">取消</el-button>
                 <el-button v-if="!isSubstitude" @click="submitReport(1)" :loading="submitingReport" :disabled="workForm.domains.length==0?true:(canEdit?false:true)">暂存</el-button>
                 <el-button type="primary" @click="submitReport(0)" :loading="submitingReport"
@@ -624,6 +625,7 @@
                 <el-select v-model="selCon" multiple placeholder="请选择" filterable>
                     <el-option
                     v-for="item in projectList"
+                    :disabled="item.status>=2"
                     :key="item.id"
                     :label="item.projectName"
                     :value="item.id">
@@ -662,6 +664,13 @@
                         <el-option v-for="item in zhoBao.subProjectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </div>
+                <!--如果设置了工时成本预警的预算成本项-->
+                <div class="zhoFel" v-if="timeBasecostList &&timeBasecostList.length>0">
+                    <p>预算来源</p>
+                    <el-select v-model="zhoBao.basecostId" style="width: 355px">
+                        <el-option v-for="item in timeBasecostList" :label="item.name" :value="item.id" :key="item.id"></el-option>
+                    </el-select>
+                </div>
                 <!-- 任务分组 -->
                 <div class="zhoFel" v-if="user.company.packageProject == 1">
                     <p>任务分组</p>
@@ -741,7 +750,12 @@
                         end-placeholder="结束日期"
                     ></el-date-picker>
                 </el-form-item>
-                
+                <el-form-item prop="stateKey" label="是否包含">
+                    <el-select v-model="stateKey" placeholder="请选择" filterable style="width:350px;">
+                        <el-option label="不包含未审核" value="0"></el-option>
+                        <el-option label="包含未审核" value="1"></el-option>
+                    </el-select>
+                </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" @click="exportReport" style="width:100%;" >导出</el-button>
@@ -1407,7 +1421,9 @@
                 deptMembDataText: '',
 
                 isFlag: false,
-                isMore: false
+                isMore: false,
+
+                stateKey: '0'
             };
         },
         watch: {
@@ -3362,7 +3378,7 @@
                     this.$message({
                         message: error,
                         type: "error"
-                    });
+                    }); 
                 });
             },
             //导出日报
@@ -3375,6 +3391,7 @@
                 if (this.exportParam.projectId != null) {
                     param.projectId = this.exportParam.projectId;
                 }
+                param.stateKey = this.stateKey
                 this.http.post( this.port.report.export, param,
                 res => {
                     this.listLoading = false;
@@ -3421,7 +3438,17 @@
                     });
                 });
             },
-
+            getBasecostItemList() {
+                this.http.post('/project-basecost-setting/getReportBasecostList', {
+                    companyId: this.user.companyId
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.timeBasecostList = res.data;
+                    }
+                    });
+                
+            },
             // 获取个人某天的日报
             getReport() {
                 this.http.post( this.port.report.getPort, {
@@ -3441,7 +3468,7 @@
                         this.jsTime = quanbu
                         var list = res.data;
                         this.report = list;
-                        this.timeBasecostList = res.data.timeBasecostList;
+                        
                         if(list.report.length != 0) {
                             var arr = [];
                             this.canEdit = false;
@@ -3590,6 +3617,9 @@
                                     worktimeList:[{}],
                                 }],
                             }
+                    if (this.timeBasecostList&&this.timeBasecostList.length>0) {
+                        this.workForm.domains[0].basecostId = this.timeBasecostList[0].id;
+                    }        
                     this.canEdit = true;
                 }
                 
@@ -3616,6 +3646,10 @@
                 sss.time = item.time
                 sss.workingTime = item.workingTime
                 sss.projectAuditorId = item.projectAuditorId;
+                if (this.timeBasecostList && this.timeBasecostList.length > 0) {
+                    //默认选中第一个
+                    sss.basecostId = this.timeBasecostList[0].id;
+                }
                 var that = this
                 setTimeout(() =>{
                     if(Object.keys(item).length < 5) {
@@ -3827,6 +3861,18 @@
                     this.selProjectList = this.projectList
                     this.selConShow = false
                 }
+                if (!this.timeBasecostList || this.timeBasecostList.length == 0) {
+                    //重新获取工时预警类型的预算项
+                    this.http.post('/project-basecost-setting/getReportBasecostList', {
+                        companyId: this.user.companyId
+                    },
+                    res => {
+                        if (res.code == "ok") {
+                            this.timeBasecostList = res.data;
+                            console.log(this.timeBasecostList);
+                        }
+                    });
+                }
             },
             // 按周填报的项目筛选
             selListFun(){
@@ -4013,6 +4059,7 @@
                         return false
                     }
                 }
+                
                     var submits = []
                     let formData = new FormData();
                     if(this.reportTimeType.multiWorktime == 1){
@@ -4054,6 +4101,11 @@
                                     if (zhoD[j].projectAuditorId) {
                                         formData.append("projectAuditorId",zhoD[j].projectAuditorId)
                                     }
+                                    if(zhoD[j].basecostId) {
+                                        formData.append("basecostId", zhoD[j].basecostId);
+                                    } else {
+                                        formData.append("basecostId", 0);
+                                    }
                                 }
                             }
                         }
@@ -4086,6 +4138,11 @@
                                         if (zhoD[j].projectAuditorId) {
                                             formData.append("projectAuditorId",zhoD[j].projectAuditorId)
                                         }
+                                        if(zhoD[j].basecostId) {
+                                            formData.append("basecostId", zhoD[j].basecostId);
+                                        } else {
+                                            formData.append("basecostId", 0);
+                                        }
                                     }
                                 }
                             } else {
@@ -4121,44 +4178,20 @@
                                         if (zhoD[j].projectAuditorId) {
                                             formData.append("projectAuditorId",zhoD[j].projectAuditorId)
                                         }
+                                        if(zhoD[j].basecostId) {
+                                            formData.append("basecostId", zhoD[j].basecostId);
+                                        } else {
+                                            formData.append("basecostId", 0);
+                                        }
                                     }
                                 }
                             }
                         }
                     } 
-                    // else {
-                    //     for (var i in this.zhoData) {
-                    //         var zhoD = this.zhoData[i]
-                    //         var flgs = false
-                    //         for(var j in zhoD) {     
-                    //             if(j != 'zhoDataTime' && j != 'he' && zhoD[j].workingTime && zhoD[j].workingTime.length > 0 && zhoD[j].workingTime > 0 && zhoD[j].workingTime != null && zhoD[j].workingTime != 'null') {
-                    //                 flgs = true
-                    //                 formData.append("degreeId", "-1");
-                    //                 formData.append("id", '-1');
-                    //                 for(var s in this.projectList) {
-                    //                     if(j == this.projectList[s].projectName) {
-                    //                         formData.append("projectId", this.projectList[s].id);
-                    //                     }
-                    //                 }
-                    //                 formData.append("subProjectId", '0');
-                    //                 formData.append("taskId", 0);
-                    //                 formData.append("reportTimeType", this.reportTimeType.type);
-                    //                 formData.append("progress", zhoD[j].progress);
-                    //                 formData.append("workingTime", zhoD[j].workingTime);
-                    //                 formData.append("content", zhoD[j].con);
-                    //                 formData.append("multiWorktime", this.reportTimeType.multiWorktime);
-                    //                 formData.append("isOvertime", 0)
-                    //                 formData.append("professionProgress", "[]")
-                    //                 formData.append("stage", "");
-                    //                 formData.append("createDate",zhoD.zhoDataTime)
-
-                    //             }
-                    //         }
-                    //     }
-                    // }
+                    
                     this.http.uploadFile( this.port.report.editPort, formData,
                         res => {
-                            this.listLoading = false;
+                            // this.listLoading = false;
                             if (res.code == "ok") {
                                 this.$message({
                                     message: "填报成功",
@@ -4170,6 +4203,9 @@
                                 this.zhoRqi = ''
                                 this.getReportList();
                                 this.getDepartment();
+                                // 关闭弹窗 并 清空
+                                this.selProjectList = []
+                                this.selCon = []
                             } else {
                                 this.$message({
                                     message: res.msg,
@@ -4184,13 +4220,6 @@
                                 type: "error"
                             });
                         });
-                // 关闭弹窗 并 清空
-                // this.diasZho = false
-                // this.zhoData = []
-                // this.zhoRqi = ''
-                this.selProjectList = []
-                this.selCon = []
-                
             },
             ChangeHourMinutestr (str) {
                 if (str !== "0" && str !== "" && str !== null) {
@@ -4251,7 +4280,7 @@
                         worktimeList:[{}],
                         // degreeId: '',
                 };
-                if (this.timeBasecostList.length > 0) {
+                if (this.timeBasecostList && this.timeBasecostList.length > 0) {
                     //默认给第一个,必填字段
                     addItem.basecostId = this.timeBasecostList[0].id;
                 }
@@ -4612,10 +4641,18 @@
                             if (this.workForm.domains[i].projectAuditorId) {
                                 formData.append("projectAuditorId", this.workForm.domains[i].projectAuditorId);
                             } else {
-                                this.$message({
-                                    message: "请指定项目审核人",
-                                    type: "error"
-                                });
+                                if (this.workForm.domains[i].taskGpIncharge == 0) {
+                                    this.$message({
+                                        message: "请指定项目审核人",
+                                        type: "error"
+                                    });
+                                } else if (this.workForm.domains[i].taskGroups.length == 0) {
+                                    this.$message({
+                                        message: "您在["+this.workForm.domains[i].projectName+"]项目上尚无参与的任务分组",
+                                        type: "error"
+                                    });
+                                } 
+                                
                                 return;
                             }
                         }
@@ -4834,6 +4871,7 @@
             this.getDepartment();
             this.scrollFunction()
             this.userssHu();
+            this.getBasecostItemList();
             if(this.user.timeType.lockWorktime){
                 this.timeRange = this.timeRange.filter(item => {return item <= this.user.timeType.allday})
             }

+ 96 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -41,6 +41,9 @@
                         <el-button @click="batchApprove(true)" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0" size="mini">批量通过</el-button>
                         <el-button @click="batchApprove(false)"  :loading="batchDenyLoading"  :disabled="multipleSelection.length==0" size="mini">批量驳回</el-button>
                     </el-form-item>
+                    <el-form-item style="margin-left:20px;" v-if="permissions.importAudit">
+                    <el-link type="primary" @click="recordList(),recordDialogVisible = true,pageIndexList = 1,pageSizeList = 20">审核记录</el-link>
+                    </el-form-item>
                 <!-- </div> -->
             </el-form>
         </el-col>
@@ -175,6 +178,55 @@
                 style="float:right;"
             ></el-pagination>
         </el-col> -->
+
+        
+        <!-- 审核记录弹窗 -->
+        <el-dialog title="审核记录" :visible.sync="recordDialogVisible" width="800px" :before-close="handleClose">
+            <div style="height: 430px">
+                <el-table :data="recordLists" style="width: 100%" height="400">
+                    <el-table-column prop="userName" label="操作人" width="150"></el-table-column>
+                    <el-table-column prop="indate" label="审核时间"></el-table-column>
+                    <el-table-column prop="result" label="审核结果"></el-table-column>
+                    <el-table-column prop="date" label="员工/日期" width="200">
+                        <template slot-scope="scope">
+                            <div>
+                                <div v-if="scope.row.membdateList.length > 3">
+                                    <el-popover placement="top" width="400" trigger="hover">
+                                    <div>
+                                        <span v-for="(item, index) in scope.row.membdateList" :key="index">
+                                            {{item.userName}}/{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
+                                        </span>
+                                    </div>
+                                    <div slot="reference" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width: 180px;">
+                                        <span v-for="(item, index) in scope.row.membdateList" :key="index">
+                                            {{item.userName}}/{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
+                                        </span>
+                                    </div>
+                                    </el-popover>
+                                </div>
+                                <div style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width: 180px;" v-else>
+                                    <span v-for="(item, index) in scope.row.membdateList" :key="index">
+                                        {{item.userName}}/{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
+                                    </span>
+                                </div>
+                            </div>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <el-col v-if="search.value != -1" :span="24" class="toolbar">
+                    <el-pagination
+                        @size-change="handleSizeChangeList"
+                        @current-change="handleCurrentChangeList"
+                        :page-sizes="[20 , 50 , 80 , 100]"
+                        :page-size="20"
+                        layout="total, sizes, prev, pager, next"
+                        :total="totals"
+                        style="float:right;"
+                    ></el-pagination>
+                </el-col> 
+            </div>
+        </el-dialog>
+
     </section>
 </template>
 
@@ -213,7 +265,12 @@
                 logining: false,
                 multipleSelection: [],
                 usersList: [],
-                dataTime: []
+                dataTime: [],
+                recordDialogVisible: false,
+                recordLists: [],
+                totals: 0,
+                pageIndexList: 1,
+                pageSizeList: 20
             };
         },
         filters: {
@@ -224,7 +281,33 @@
             }
         },
         methods: {
-            
+            // 获取审核记录
+            recordList() {
+                // this.recordDialogVisible = true
+                // return
+                this.http.post( '/report-audit-log/getProjectReportAuditLog', {
+                    companyId: this.user.companyId,
+                    pageIndex: this.pageIndexList,
+                    pageSize: this.pageSizeList
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.recordLists = res.data.records
+                        this.totals = res.data.total
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             // 获取部门列表
             getDepartment() {
                 this.http.post( this.port.manage.depList, {},
@@ -298,6 +381,17 @@
                 this.getList();
             },
 
+            //分页
+            handleCurrentChangeList(val) {
+                this.pageIndexList = val;
+                this.recordList();
+            },
+
+            handleSizeChangeList(val) {
+                this.pageSizeList = val;
+                this.recordList();
+            },
+
             //获取待审核的数据列表
             getList() {
                 this.listLoading = true;

+ 49 - 10
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_import.vue

@@ -35,11 +35,11 @@
                 <el-form-item   style="margin-left:20px;">
                     <el-button @click="batchApprove(true)" style="margin-left:10px;" :disabled="multipleSelection.length==0">批量通过</el-button>
                     <el-button @click="batchApprove(false)"  :disabled="multipleSelection.length==0">批量驳回</el-button>
+                    <el-button @click="approveAll" style="margin-left:10px;" :disabled="list.length==0">一键全部通过</el-button>
                 </el-form-item>
                 <el-form-item style="margin-left:20px;" v-if="permissions.importAudit">
                    <el-link type="primary" @click="recordList(),recordDialogVisible = true,pageIndexList = 1,pageSizeList = 20">审核记录</el-link>
                 </el-form-item>
-                
             </el-form>
         </el-col>
         <!--列表-->
@@ -139,19 +139,19 @@
             </div>
         </el-dialog>
         <!--工具条-->
-        <!-- <el-col v-if="search.value != -1" :span="24" class="toolbar">
+        <el-col :span="24" class="toolbar">
             <el-pagination
                 @size-change="handleSizeChange"
                 @current-change="handleCurrentChange"
-                :page-sizes="[20 , 50 , 80 , 100]"
-                :page-size="20"
+                :page-sizes="[100,500,1000,2000]"
+                :page-size="1000"
                 layout="total, sizes, prev, pager, next"
                 :total="total"
                 style="float:right;"
             ></el-pagination>
-        </el-col> -->
+        </el-col>
 
-        <!-- 审核记录痰喘 -->
+        <!-- 审核记录弹窗 -->
         <el-dialog title="审核记录" :visible.sync="recordDialogVisible" width="800px" :before-close="handleClose">
             <div style="height: 430px">
                 <el-table :data="recordLists" style="width: 100%" height="400">
@@ -227,7 +227,7 @@
                 listLoading: false,
                 total: 0,
                 page: 1,
-                size: 20,
+                size: 1000,
                 list: [],
                 logining: false,
                 multipleSelection: [],
@@ -310,6 +310,41 @@
             handleSelectionChange(val) {
                 this.multipleSelection = val;
             },
+            //一键全部通过
+            approveAll() {
+                this.$confirm('是否确认通过全部部门和日期的待审核数据?','提示',{
+                    confirmButtonText: '确定',
+                    cancelButtonText: '取消',
+                    type: 'warning'
+                }).then(()=>{
+                    this.http.post('/report/approveAllImport',{},
+                    res => {
+                        this.listLoading = false;
+                        console.log('==res=='+res);
+                        if (res.code == "ok") {
+                            this.getList();
+                            this.$message({
+                            message: '审核成功',
+                            type: "success"
+                            });
+                        } else {
+                            this.$message({
+                            message: res.msg,
+                            type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.listLoading = false;
+                        console.log('==error=='+res);
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                });
+                
+            },
             batchApprove(isPass) {
                 var ids = '';
                 for (var i=0;i<this.multipleSelection.length; i++) {
@@ -343,6 +378,7 @@
                     });
                 });
             },
+            
             //分页
             handleCurrentChange(val) {
                 this.page = val;
@@ -378,6 +414,8 @@
                     this.search.endDate = null
                 }
                 var obj = {}
+                obj.pageIndex = this.page;
+                obj.pageSize = this.size;
                 obj.projectId = this.search.projectId
                 obj.startDate = this.search.startDate
                 obj.endDate = this.search.endDate
@@ -395,7 +433,8 @@
                 res => {
                     this.listLoading = false;
                     if (res.code == "ok") {
-                        this.list = res.data;
+                        this.list = res.data.record;
+                        this.total = res.data.total;
                     } else {
                         this.$message({
                         message: res.msg,
@@ -524,10 +563,10 @@
         },
         created() {
             let height = window.innerHeight;
-            this.tableHeight = height - 125;
+            this.tableHeight = height - 175;
             const that = this;
             window.onresize = function temp() {
-                that.tableHeight = window.innerHeight - 125;
+                that.tableHeight = window.innerHeight - 175;
             };
         },
         mounted() {

+ 11 - 5
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -44,7 +44,7 @@
                             @cancel="item.showPickerSubProject = false;$forceUpdate();" />
                     </van-popup>
                     <!--任务分组 -->
-                    <van-field  readonly  name="groupId" v-if="user.company.packageProject==1&&item.taskGroups != null && item.taskGroups.length > 0" clickable 
+                    <van-field  readonly  name="groupId" v-if="item.taskGpIncharge == 1 || (user.company.packageProject==1&&item.taskGroups != null && item.taskGroups.length > 0)" clickable 
                         :value="item.groupName" label="任务分组" placeholder="请选择任务分组" 
                     @click="clickPickTaskGroup(index, item)" />
                     <van-popup v-model="item.showPickerTaskGroup" position="bottom">
@@ -298,7 +298,7 @@
         <!-- 选择项目弹窗 -->
         <van-popup v-model="showPickerUserddp" position="bottom" style="height: 80%">
             <!-- <van-search v-model="userName" placeholder="输入项目名称搜索" @clear="sea()" @blur="sea()" @search="sea()"></van-search> -->
-            <van-search v-model="userName" placeholder="请输入项目名称" @clear="sea()" @blur="sea()" @search="sea()"/>
+            <van-search v-model="userName" placeholder="请输入项目名称" @clear="sea()" @blur="sea()" @search="sea()" @input="sea()"/>
             <div style="minHeight:300px;">
                 <div v-for="(item, index) in projectss" :key="item.id" class="ryuan" @click="fZr(item, index)">{{item.projectName}}</div>
             </div>
@@ -430,11 +430,11 @@
                     console.log(123)
                     let text = this.userName
                     let reg = new RegExp(text)
-                    let data = this.projectss.filter(item => reg.test(item.projectName)) //返回
+                    let data = this.proads.filter(item => reg.test(item.projectName)) //返回
                     this.projectss = data
                 } else {
                     console.log(456)
-                    this.project = this.proads
+                    this.projectss = this.proads
                 }
             },
             fZr(item,index) {
@@ -480,6 +480,7 @@
             //获取项目下的任务分组
             getTaskGroups(domainItem, index) {
                 domainItem.groupId=null;
+                domainItem.groupName=null;
                 this.$axios.post("/task-group/listMyJoinGroup", {projectId: domainItem.projectId})
                     .then(res => {
                         if(res.code == "ok") {
@@ -1402,7 +1403,12 @@
                     if (this.form.domains[i].projectAuditorId) {
                         formData.append("projectAuditorId", this.form.domains[i].projectAuditorId);
                     } else {
-                        this.$toast.fail("请指定["+this.form.domains[i].projectName+']项目的审核人');
+                        if (this.form.domains[i].taskGpIncharge == 0) {
+                            this.$toast.fail("请指定["+this.form.domains[i].projectName+']项目的审核人');
+                        } else if (this.form.domains[i].taskGroups.length == 0) {
+                            this.$toast.fail("您在["+this.form.domains[i].projectName+"]项目上尚无参与的任务分组");
+                        }
+                        
                         return;
                     }
                 }

+ 3 - 3
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue

@@ -320,7 +320,7 @@
         <!-- 选择项目弹窗 -->
         <van-popup v-model="showPickerUserddp" position="bottom" style="height: 80%">
             <!-- <van-search v-model="userName" placeholder="输入项目名称搜索" @clear="sea()" @blur="sea()" @search="sea()"></van-search> -->
-            <van-search v-model="userName" placeholder="请输入项目名称" @clear="sea()" @blur="sea()" @search="sea()"/>
+            <van-search v-model="userName" placeholder="请输入项目名称" @clear="sea()" @blur="sea()" @search="sea()" @input="sea()"/>
             <div style="minHeight:300px;">
                 <div v-for="(item, index) in projectss" :key="item.id" class="ryuan" @click="fZr(item, index)">{{item.projectName}}</div>
             </div>
@@ -522,11 +522,11 @@
                     console.log(123)
                     let text = this.userName
                     let reg = new RegExp(text)
-                    let data = this.projectss.filter(item => reg.test(item.projectName)) //返回
+                    let data = this.proads.filter(item => reg.test(item.projectName)) //返回
                     this.projectss = data
                 } else {
                     console.log(456)
-                    this.project = this.proads
+                    this.projectss = this.proads
                 }
             },
             fZr(item,index) {

+ 3 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

@@ -65,7 +65,9 @@
                 if(list[i].name == '工时报告') {
                     this.routers.push({name: '查看日报',url: '/calendar',icon: 'description'})
                     this.routers.push({name: '填写日报',url: '/edit',icon: 'edit'})
-                    this.routers.push({name: '按周填报',url: '/weekEdit',icon: 'edit'})
+                    if (this.user.companyId == 817 || this.user.companyId == 7 || this.user.companyId == 10) {
+                        this.routers.push({name: '按周填报',url: '/weekEdit',icon: 'edit'})
+                    }
                 }
                 if(list[i].name == '项目报告审核') {
                     this.routers.push({name: '项目报告审核',url: '/review',icon: 'todo-list-o'})

+ 1 - 2
fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

@@ -4,8 +4,7 @@ const path = require('path');
 const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 
 // var ip = '127.0.0.1'
-var ip = '192.168.2.36'
-// var ip = '47.100.37.243'
+// var ip = '192.168.2.4'
 // var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
 // for (var i in ifaces) {
 //     for (var j in ifaces[i]) {