Prechádzať zdrojové kódy

修复删除日报bug, 增加审批流程设置。

seyason 3 rokov pred
rodič
commit
d4f6af14f5
21 zmenil súbory, kde vykonal 511 pridanie a 62 odobranie
  1. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuditWorkflowTimeSettingController.java
  2. 84 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  3. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  4. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/AuditWorkflowTimeSetting.java
  5. 30 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  6. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserVO.java
  7. 11 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  9. 225 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  10. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  11. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java
  12. 6 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ListUtil.java
  13. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/AuditWorkflowTimeSettingMapper.xml
  14. 20 7
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  15. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/main.js
  16. 5 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  17. 21 8
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  18. 25 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  19. 4 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue
  20. 16 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue
  21. 20 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

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

@@ -47,7 +47,7 @@ public class AuditWorkflowTimeSettingController {
         auditWorkflowTimeSettingMapper.delete(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", deptId));
         JSONArray array = JSONArray.parseArray(json);
 
-        if (array.size() == 1 && array.getJSONObject(0).getInteger("type") == 1) {
+        if (array.size() == 1 && array.getJSONObject(0).getInteger("isDeptAudit") == 0) {
             //只有一个项目负责人审核,不保存
         } else {
             //检查是否有重复的部门
@@ -97,7 +97,7 @@ public class AuditWorkflowTimeSettingController {
             setting.setCompanyId(companyId);
             setting.setDeptId(dept.getDepartmentId());
             setting.setIsFinal(1);
-            setting.setType(1);
+            setting.setIsDeptAudit(0);
             auditWorkflowTimeSettings.add(setting);
 //            while (dept.getSuperiorId() != null && dept.getSuperiorId() > 0) {
 //                seq++;

+ 84 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.pagehelper.util.StringUtil;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.WorktimeItem;
+import com.management.platform.mapper.AuditWorkflowTimeSettingMapper;
+import com.management.platform.mapper.DepartmentMapper;
 import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.service.ReportService;
 import com.management.platform.service.UserSalaryService;
@@ -51,8 +53,12 @@ public class ReportController {
     @Resource
     private HttpServletRequest request;
     @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+    @Resource
     private UserService userService;
     @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
     private UserSalaryService userSalaryService;
     @Resource
     private TimeTypeMapper timeTypeMapper;
@@ -283,6 +289,11 @@ public class ReportController {
             }
         }
         try {
+            List<AuditWorkflowTimeSetting> auditWorkflowList
+                    = auditWorkflowTimeSettingMapper.selectList(
+                    new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", user.getDepartmentId()).orderByAsc("seq"));
+            List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
+
             for (int i = 0; i < id.length; i++) {
                 System.out.println("==@@"+createDate[i]+", "+createDate[i].contains("@"));
                 if (createDate[i].contains("@")) {
@@ -311,6 +322,7 @@ public class ReportController {
 //                    LocalDate localStartDate = LocalDate.parse(startDate, ddtf);
 //                    LocalDate localEndDate = LocalDate.parse(endDate, ddtf);
                     List<LocalDate> workDaysListInRange = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate);
+                    //获取当前填报人所在部门的自定义审核流程
                     for (LocalDate localStartDate : workDaysListInRange) {
                         if (targetUserList == null) {
                             Report report = new Report()
@@ -327,6 +339,19 @@ public class ReportController {
                                     .setStage(stage != null && stage.length > 0 && !StringUtil.isEmpty(stage[i])?stage[i]:null)
                                     .setCreateDate(localStartDate)
                                     .setCreatorId(token);
+                            report.setProjectAuditState(0);
+                            if (auditWorkflowList.size() == 0) {
+                                //没有自定义审核流,默认的直接是项目负责人审核
+                                report.setIsDeptAudit(0);
+                                report.setIsFinalAudit(1);
+                            } else {
+                                //取第一个审核节点
+                                AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
+                                report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
+                                report.setIsDeptAudit(firstNode.getIsDeptAudit());
+                                report.setAuditDeptid(firstNode.getAuditDeptId());
+                                report.setAuditDeptManagerid(firstNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
+                            }
                             if (taskId != null && taskId[i] != null && taskId[i] != 0) {
                                 report.setTaskId(taskId[i]);
                             }
@@ -364,6 +389,19 @@ public class ReportController {
                                         .setPicAdd(pics!=null?pics[i]:null)
                                         .setCreateDate(localStartDate)
                                         .setCreatorId(subsUser.getId());
+                                report.setProjectAuditState(0);
+                                if (auditWorkflowList.size() == 0) {
+                                    //没有自定义审核流,默认的直接是项目负责人审核
+                                    report.setIsDeptAudit(0);
+                                    report.setIsFinalAudit(1);
+                                } else {
+                                    //取第一个审核节点
+                                    AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
+                                    report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
+                                    report.setIsDeptAudit(firstNode.getIsDeptAudit());
+                                    report.setAuditDeptid(firstNode.getAuditDeptId());
+                                    report.setAuditDeptManagerid(firstNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
+                                }
                                 if (taskId != null && taskId[i] != null && taskId[i] != 0) {
                                     report.setTaskId(taskId[i]);
                                 }
@@ -401,6 +439,19 @@ public class ReportController {
                                 .setPicAdd(pics!=null?pics[i]:null)
                                 .setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                                 .setCreatorId(token);
+                        report.setProjectAuditState(0);
+                        if (auditWorkflowList.size() == 0) {
+                            //没有自定义审核流,默认的直接是项目负责人审核
+                            report.setIsDeptAudit(0);
+                            report.setIsFinalAudit(1);
+                        } else {
+                            //取第一个审核节点
+                            AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
+                            report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
+                            report.setIsDeptAudit(firstNode.getIsDeptAudit());
+                            report.setAuditDeptid(firstNode.getAuditDeptId());
+                            report.setAuditDeptManagerid(firstNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
+                        }
                         if (taskId != null && taskId[i] != null && taskId[i] != 0) {
                             report.setTaskId(taskId[i]);
                         }
@@ -438,11 +489,42 @@ public class ReportController {
                                     .setContent(content[i])
                                     .setDegreeId(degreeId.length > 0?degreeId[i]:null)
                                     .setStage(stage!=null && stage.length > 0  && !StringUtil.isEmpty(stage[i])?stage[i]:null)
-                                    .setState(1)//代填的就直接审核通过了
+//                                    .setState(auditWorkflowList.size() == 0?1:0)//代填的如果没有自定义审核流程就直接审核通过了
                                     .setCompanyId(user.getCompanyId())
                                     .setPicAdd(pics!=null?pics[i]:null)
                                     .setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")))
-                                    .setCreatorId(subsUser.getId());
+                                    .setCreatorId(subsUser.getId())
+                                    .setFillUserid(token);
+                            report.setProjectAuditState(1);
+                            if (auditWorkflowList.size() == 0 || user.getRole() == 1 || user.getRole() == 2) {
+                                //没有自定义审核流,或者系统管理员直接代填的,就算审核通过
+                                report.setIsDeptAudit(0);
+                                report.setIsFinalAudit(1);
+                                report.setState(1);
+                            } else {
+                                //有审核流程的,取项目经理后面的流程节点
+                                int projectLeaderNodeIndex = 0;
+                                for (int t=0;t<auditWorkflowList.size(); t++) {
+                                    if (auditWorkflowList.get(t).getIsDeptAudit() == 0) {
+                                        projectLeaderNodeIndex = t;
+                                        break;
+                                    }
+                                }
+                                if (projectLeaderNodeIndex == auditWorkflowList.size() -1) {
+                                    //最后一个节点就是项目经理,那就不用审核了,直接通过
+                                    report.setState(1);
+                                } else {
+                                    //否则取下一个节点,待审核
+                                    report.setState(0);
+                                    int nextIndex = projectLeaderNodeIndex + 1;
+                                    AuditWorkflowTimeSetting nextNode = auditWorkflowList.get(nextIndex);
+                                    report.setIsFinalAudit((nextIndex == auditWorkflowList.size()-1)?1:0);
+                                    report.setIsDeptAudit(nextNode.getIsDeptAudit());
+                                    report.setAuditDeptid(nextNode.getAuditDeptId());
+                                    report.setAuditDeptManagerid(nextNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
+                                }
+                            }
+
                             if (taskId != null && taskId[i] != null && taskId[i] != 0) {
                                 report.setTaskId(taskId[i]);
                             }
@@ -676,7 +758,6 @@ public class ReportController {
                                       HttpServletRequest request) {
         String token = request.getHeader("TOKEN");
         User user = userService.getById(token);
-
         return reportService.listDeptImportByState(user.getId(),
                 projectId,dateType,
                 date, departmentId, request);

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

@@ -26,6 +26,7 @@ import java.net.URLEncoder;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/wxcorp")
@@ -104,6 +105,8 @@ public class WeiXinCorpController {
     DepartmentService departmentService;
     @Resource
     UserService userService;
+    @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
 
     //"获取企业微信jssdk初始化配置参数"
     @RequestMapping("/getCorpWXConfig")
@@ -754,6 +757,15 @@ public class WeiXinCorpController {
             if (cnt > 0) {
                 userVO.setLeader(true);
             }
+            userVO.setTimeType(timeTypeMapper.selectById(company.getId()));
+            List<Department> manageDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", userVO.getId()));
+            List<Integer> deptIds = manageDeptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
+            int num = 0;
+            if (deptIds.size() > 0) {
+                num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
+            }
+            userVO.setHasAuditDept(num>0);
+
             msg.data = userVO;
         } else {
             msg.setError("该用户尚未绑定企业微信,需要通过账号密码登录");

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

@@ -67,10 +67,10 @@ public class AuditWorkflowTimeSetting extends Model<AuditWorkflowTimeSetting> {
     private String auditDeptName;
 
     /**
-     * 0-部门审核,1-项目负责人审核
+     * 1-部门审核,0-项目负责人审核
      */
-    @TableField("type")
-    private Integer type;
+    @TableField("is_dept_audit")
+    private Integer isDeptAudit;
 
     /**
      * 是否是最终审核

+ 30 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java

@@ -22,13 +22,12 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-01-26
+ * @since 2022-02-21
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 public class Report extends Model<Report> {
-
     private static final long serialVersionUID=1L;
 
     /**
@@ -221,6 +220,35 @@ public class Report extends Model<Report> {
     @TableField("fill_userid")
     private String fillUserid;
 
+    /**
+     * 审核流程:当前审核的部门id
+     */
+    @TableField("audit_deptid")
+    private Integer auditDeptid;
+
+    /**
+     * 审核流程: 是否是部门审核
+     */
+    @TableField("is_dept_audit")
+    private Integer isDeptAudit;
+
+    /**
+     * 审核流程:当前审核的部门负责人id
+     */
+    @TableField("audit_dept_managerid")
+    private String auditDeptManagerid;
+
+    /**
+     * 是否是最后一步审核
+     */
+    @TableField("is_final_audit")
+    private Integer isFinalAudit;
+    /**
+     * 审核流程:审核过程中,项目的审核状态; 0-待审核,1-审核通过
+     */
+    @TableField("project_audit_state")
+    private Integer projectAuditState;
+
 
     @Override
     protected Serializable pkVal() {

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserVO.java

@@ -24,4 +24,6 @@ public class UserVO extends User {
 
     private TimeType timeType;
 
+    private boolean hasAuditDept;
+
 }

+ 11 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -35,6 +35,7 @@ import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 @Transactional
@@ -69,6 +70,8 @@ public class DingDingServiceImpl implements DingDingService {
     @Resource
     private DepartmentMapper departmentMapper;
     @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+    @Resource
     private DepartmentDingdingMapper departmentDingdingMapper;
     @Resource
     private DepartmentService departmentService;
@@ -372,6 +375,14 @@ public class DingDingServiceImpl implements DingDingService {
                         userVO.setLeader(true);
                     }
                     userVO.setTimeType(timeTypeMapper.selectById(company.getId()));
+                    List<Department> manageDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", userVO.getId()));
+                    List<Integer> deptIds = manageDeptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
+                    int num = 0;
+                    if (deptIds.size() > 0) {
+                        num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
+                    }
+                    userVO.setHasAuditDept(num>0);
+
                     httpRespMsg.data = userVO;
                 }
             }

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

@@ -416,7 +416,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             List<String> headList = new ArrayList<String>();
             headList.add("项目");
             headList.add("人员");
-            headList.add("时(h)");
+            headList.add("时(h)");
             headList.add("工资(元)");
             headList.add("奖金(元)");
             headList.add("津贴(元)");

+ 225 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -183,15 +183,26 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
                 //部门经理需要看本部门的所有人员的日报
                 if (user.getManageDeptId() != null &&  user.getManageDeptId() > 0) {
-                    int manageDeptId = user.getManageDeptId();
                     //找到该部门的所有子部门
                     List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
-                    Optional<Department> first = allDepts.stream().filter(d -> d.getDepartmentId().equals(manageDeptId)).findFirst();
-                    if (first.isPresent()) {
-                        Department department = first.get();
+                    //查找当前部门经理负责的部门
+                    List<Department> queryDeptList = null;
+                    if (deptId != null) {
+                        queryDeptList = allDepts.stream().filter(dp->dp.getDepartmentId().equals(deptId)).collect(Collectors.toList());
+                    } else {
+                        queryDeptList = allDepts.stream().filter(
+                                dp -> user.getId().equals(dp.getManagerId())).collect(Collectors.toList());
+                        System.out.println("查询到的部门id列表=="+queryDeptList.size());
+                    }
+
+                    if (queryDeptList.size() > 0) {
                         //递归获取全部子部门
-                        List<Department> deptList = getSubDepts(department, allDepts);
-                        deptList.add(department);
+                        List<Department> deptList = new ArrayList<>();
+                        for (Department dept : queryDeptList) {
+                            deptList.add(dept);
+                            deptList.addAll(getSubDepts(dept, allDepts));
+                        }
+
                         List ids = deptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
                         nameList = reportMapper.getReportNameByDateAndDept(date,
                                 ids, null, null);
@@ -532,7 +543,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 //只操作没有审核通过的
                 if (reportMapper.selectById(report.getId()).getState() != 1) {
                     //检查是否存在计算加班工资的情况
-                    if (!timeType.getPayOvertime()) {
+                        if (!timeType.getPayOvertime()) {
                         //不能超过最多时间,超过的话,等比例核算
                         if (totalWorkTime > timeType.getAllday()) {
                             BigDecimal cost;
@@ -737,6 +748,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 map2.put("reportTime", df.format(reportTime));
                 map2.put("cost", total);
                 map2.put("state", list2.get(0).get("state"));
+                map2.put("auditDeptName", list2.get(0).get("auditDeptName"));
+                map2.put("isDeptAudit", list2.get(0).get("isDeptAudit"));
             }
 
             //设置照片显示
@@ -851,20 +864,92 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             } else {
                 String creatorId = reportMapper.selectById(ids.get(0)).getCreatorId();
                 User auditTargetUser = userMapper.selectById(creatorId);
-                List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", auditTargetUser.getDepartmentId()));
+                List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
+                        new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", auditTargetUser.getDepartmentId())
+                                .orderByAsc("seq"));
+                System.out.println("======setting count==" + settings.size());
                 if (settings.size() == 0) {
                     //直接进行项目经理审核
-                    reportMapper.update(new Report().setState(1),
+                    reportMapper.update(new Report().setState(1).setProjectAuditState(1),
                             new QueryWrapper<Report>().in("id", ids));
                 } else {
                     //按流程走
-                    
+                    List<Report> allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+                    List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", company.getId()));
+                    Report item = allReports.get(0);
+                    if (item.getIsFinalAudit() == 1) {
+                        //最终审核了,审核通过
+                        if (item.getIsDeptAudit() == 1) {
+                            //如果最终是部门审核,直接通过
+                            //如果最终是项目审核
+                            reportMapper.update(new Report().setState(1),
+                                    new QueryWrapper<Report>().in("id", ids));
+                        } else {
+                            //如果最终是项目审核,流程中的项目审核字段也要更新: state为最终审核状态,projectAuditState为阶段性的项目审核状态
+                            reportMapper.update(new Report().setState(1).setProjectAuditState(1),
+                                    new QueryWrapper<Report>().in("id", ids));
+                        }
+                    } else {
+                        if (item.getIsDeptAudit() == 1) {
+                            //当前是部门审核,获取审核部门id
+                            Report upR = new Report();
+                            Integer auditDeptid = item.getAuditDeptid();
+                            for (int m=0;m<settings.size(); m++) {
+                                if (auditDeptid.equals(settings.get(m).getAuditDeptId()) && m < settings.size() -1) {
+                                    AuditWorkflowTimeSetting nextNode = settings.get(m + 1);
+                                    upR.setIsDeptAudit(nextNode.getIsDeptAudit());
+                                    if (upR.getIsDeptAudit() == 1) {
+                                        upR.setAuditDeptid(nextNode.getAuditDeptId());
+                                        upR.setAuditDeptManagerid(allDepts.stream()
+                                                .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                    }
+                                    upR.setIsFinalAudit(nextNode.getIsFinal());
+                                    break;
+                                }
+                            }
+                            reportMapper.update(upR,
+                                    new QueryWrapper<Report>().in("id", ids));
+                        } else {
+                            //当前的先审核通过
+                            System.out.println("===========更新项目审核状态======"+ids.size());
+                            reportMapper.update(new Report().setProjectAuditState(1),
+                                    new QueryWrapper<Report>().in("id", ids));
+                            //项目审核的情况下,需要判断是否该员工当天所有项目是否都是项目经理审核通过了
+                            List<Report> sameUserSameDayOtherReports = reportMapper.selectList(new QueryWrapper<Report>()
+                                    .eq("create_date", item.getCreateDate())
+                                    .eq("creator_id", item.getCreatorId())
+                                    .notIn("id", ids));
+                            long pendingNum = sameUserSameDayOtherReports.stream().filter(s->s.getProjectAuditState() == 0).count();
+                            if (pendingNum == 0) {
+                                //没有其他待审核的项目了,流程往下走
+                                Report upR = new Report();
+                                for (int m=0;m<settings.size(); m++) {
+                                    if (settings.get(m).getIsDeptAudit()== 0) {//找到项目审核的那个节点
+                                        AuditWorkflowTimeSetting nextNode = settings.get(m + 1);
+                                        upR.setIsDeptAudit(nextNode.getIsDeptAudit());
+                                        if (upR.getIsDeptAudit() == 1) {
+                                            upR.setAuditDeptid(nextNode.getAuditDeptId());
+                                            upR.setAuditDeptManagerid(allDepts.stream()
+                                                    .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                        }
+                                        upR.setIsFinalAudit(nextNode.getIsFinal());
+                                        break;
+                                    }
+                                }
+                                //全部更新到下一个审核阶段
+                                List<Integer> allRids = sameUserSameDayOtherReports.stream().map(Report::getId).collect(Collectors.toList());
+                                allRids.addAll(ids);
+                                reportMapper.update(upR,
+                                        new QueryWrapper<Report>().in("id", allRids));
+                            }
+                        }
+                    }
                 }
-
             }
             
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");
+            e.printStackTrace();
             return httpRespMsg;
         }
         return httpRespMsg;
@@ -1194,7 +1279,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         User user = userMapper.selectById(request.getHeader("Token"));
         Company company = companyMapper.selectById(user.getCompanyId());
         HttpRespMsg httpRespMsg = new HttpRespMsg();
-        final List<Long> ids = ListUtil.convertIdsArrayToList(reportIds);
+        final List<Integer> ids = ListUtil.convertIntegerIdsArrayToList(reportIds);
         if (company.getPackageEngineering() == 1) {
             //检查是否有专业进度待审核
             List<ReportProfessionProgress> list = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().in("report_id", ids).eq("audit_state", 0));
@@ -1253,9 +1338,126 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
 
         } else {
-            //直接进行项目经理审核
-            reportMapper.update(new Report().setState(1),
-                    new QueryWrapper<Report>().in("id", ids));
+            List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
+                    new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", company.getId())
+                            .orderByAsc("seq"));
+
+            if (settings.size() == 0) {
+                //公司没有自定义流程,直接进行项目经理审核
+                reportMapper.update(new Report().setState(1),
+                        new QueryWrapper<Report>().in("id", ids));
+            } else {
+                List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
+                List<Report> allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+                List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", company.getId()));
+                //ids是来自不同人不同日期的报告id
+                List<Report> updateReportList = new ArrayList<Report>();
+                for (Integer rid : ids) {
+                    String creatorId = allReports.stream().filter(a->a.getId().equals(rid)).findFirst().get().getCreatorId();
+                    User auditTargetUser = allUsers.stream().filter(a->a.getId().equals(creatorId)).findFirst().get();
+                    System.out.println("======setting count==" + settings.size());
+                    List<AuditWorkflowTimeSetting> deptSettings = settings.stream().filter(s->s.getDeptId().equals(auditTargetUser.getDepartmentId())).collect(Collectors.toList());
+                    Report curReport = new Report().setId(rid);
+                    if (deptSettings.size() == 0) {
+                        //直接进行项目经理审核
+                        curReport.setState(1);
+                    } else {
+                        //按流程走, 取到当前报告的数据
+                        Report item = allReports.stream().filter(a->a.getId().equals(rid)).findFirst().get();
+                        if (item.getIsFinalAudit() == 1) {
+                            //最终审核了,审核通过
+                            if (item.getIsDeptAudit() == 1) {
+                                //如果最终是部门审核,直接通过
+                                //如果最终是项目审核
+                                curReport.setState(1);
+                            } else {
+                                //如果最终是项目审核,流程中的项目审核字段也要更新: state为最终审核状态,projectAuditState为阶段性的项目审核状态
+                                curReport.setState(1).setProjectAuditState(1);
+                            }
+                        } else {
+                            if (item.getIsDeptAudit() == 1) {
+                                //当前是部门审核,获取审核部门id
+                                Integer auditDeptid = item.getAuditDeptid();
+                                for (int m=0;m<deptSettings.size(); m++) {
+                                    if (auditDeptid.equals(deptSettings.get(m).getAuditDeptId()) && m < deptSettings.size() -1) {
+                                        AuditWorkflowTimeSetting nextNode = deptSettings.get(m + 1);
+                                        curReport.setIsDeptAudit(nextNode.getIsDeptAudit());
+                                        if (curReport.getIsDeptAudit() == 1) {
+                                            curReport.setAuditDeptid(nextNode.getAuditDeptId());
+                                            curReport.setAuditDeptManagerid(allDepts.stream()
+                                                    .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                        }
+                                        curReport.setIsFinalAudit(nextNode.getIsFinal());
+                                        break;
+                                    }
+                                }
+                            } else {
+                                //当前的先审核通过
+                                curReport.setProjectAuditState(1);
+//                                reportMapper.update(new Report().setProjectAuditState(1),
+//                                        new QueryWrapper<Report>().in("id", ids));
+                                //项目审核的情况下,需要判断是否该员工的所有项目都审核通过了
+                                //只看同一天的
+                                Report reportItem = allReports.stream().filter(a->a.getId().equals(rid)).findFirst().get();
+                                List<Report> sameUserSameDayOtherReports = reportMapper.selectList(new QueryWrapper<Report>()
+                                                    .eq("create_date", reportItem.getCreateDate())
+                                                    .eq("creator_id", reportItem.getCreatorId())
+                                                    .notIn("id", ids));
+                                long pendingNum = sameUserSameDayOtherReports.stream().filter(s->s.getProjectAuditState() == 0).count();
+                                if (pendingNum == 0) {
+                                    System.out.println("没有其他等待的项目了,继续更新到下个流程");
+                                    //没有其他待审核的项目了,流程往下走
+                                    Report upR = new Report();
+                                    for (int m=0;m<settings.size(); m++) {
+                                        if (settings.get(m).getIsDeptAudit()== 0) {//找到项目审核的那个节点
+                                            AuditWorkflowTimeSetting nextNode = settings.get(m + 1);
+                                            curReport.setIsDeptAudit(nextNode.getIsDeptAudit());
+                                            if (curReport.getIsDeptAudit() == 1) {
+                                                curReport.setAuditDeptid(nextNode.getAuditDeptId());
+                                                curReport.setAuditDeptManagerid(allDepts.stream()
+                                                        .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                            }
+                                            curReport.setIsFinalAudit(nextNode.getIsFinal());
+                                            System.out.println("设置下个流程节点:部门审核=" + nextNode.getIsDeptAudit());
+                                            upR = curReport;
+                                            break;
+                                        }
+                                    }
+                                    //可能存在当天的其他已经通过项目负责人审核的数据,也一起更新到下个流程节点
+                                    for (Report r : sameUserSameDayOtherReports) {
+                                        Integer oid = r.getId();
+                                        //检查是否已经添加过了
+                                        boolean hasAdded = false;
+                                        for (int m = 0; m<updateReportList.size(); m++) {
+                                            if (updateReportList.get(m).getId().equals(oid)) {
+                                                hasAdded = true;
+                                                break;
+                                            }
+                                        }
+                                        if (!hasAdded) {
+                                            Report addReport = new Report();
+                                            addReport.setId(oid);
+                                            addReport.setIsDeptAudit(upR.getIsDeptAudit());
+                                            addReport.setAuditDeptid(upR.getAuditDeptid());
+                                            addReport.setAuditDeptManagerid(upR.getAuditDeptManagerid());
+                                            addReport.setIsFinalAudit(upR.getIsFinalAudit());
+                                            updateReportList.add(addReport);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    updateReportList.add(curReport);
+                }
+                if (updateReportList.size() > 0) {
+                    reportService.updateBatchById(updateReportList);
+                }
+            }
+
+//            //直接进行项目经理审核
+//            reportMapper.update(new Report().setState(1),
+//                    new QueryWrapper<Report>().in("id", ids));
         }
         return httpRespMsg;
     }
@@ -1580,9 +1782,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //检查是不是部门负责人
             if (user.getManageDeptId() != null && user.getManageDeptId() != 0) {
                 List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                Department dp = allDepts.stream().filter(d->d.getDepartmentId().equals(user.getManageDeptId())).findFirst().get();
-                List<Department> subDepts = getSubDepts(dp, allDepts);
-                subDepts.add(dp);
+                List<Department> myDeptList = allDepts.stream().filter(d->user.getId().equals(d.getManagerId())).collect(Collectors.toList());
+                List<Department> subDepts = new ArrayList<>();
+                for (Department dp : myDeptList) {
+                    subDepts.addAll(getSubDepts(dp, allDepts));
+                    subDepts.add(dp);
+                }
+                System.out.println("部门=="+subDepts.size());
                 List<Integer> collect = subDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList());
                 list = reportMapper.getUserDailyWorkTime(companyId, startDate, endDate, collect, null);
             } else {
@@ -1865,6 +2071,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //准备导出
             HSSFWorkbook workbook = new HSSFWorkbook();
             HSSFSheet sheet = workbook.createSheet("工作日报");
+            sheet.createFreezePane(0,1);
             List<String> titles = new ArrayList<String>();
             titles.addAll(Arrays.asList(new String[]{
                     "序号","上传者","项目名称","子项目名称"

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -85,6 +85,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Resource
     private UserMapper userMapper;
     @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+    @Resource
     private ReportMapper reportMapper;
     @Resource
     private CompanyMapper companyMapper;
@@ -150,6 +152,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             }
 
             userVO.setTimeType(timeTypeMapper.selectById(company.getId()));
+            List<Department> manageDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", userVO.getId()));
+            List<Integer> deptIds = manageDeptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
+            int num = 0;
+            if (deptIds.size() > 0) {
+                num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
+            }
+            userVO.setHasAuditDept(num>0);
             httpRespMsg.data = userVO;
         } else {
             httpRespMsg.setError("密码错误");
@@ -1321,6 +1330,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             userVO.setLeader(true);
         }
         userVO.setTimeType(timeTypeMapper.selectById(company.getId()));
+        List<Department> manageDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", userVO.getId()));
+        List<Integer> deptIds = manageDeptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
+        int num = 0;
+        if (deptIds.size() > 0) {
+            num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
+        }
+        userVO.setHasAuditDept(num>0);
         httpRespMsg.data = userVO;
         return httpRespMsg;
     }

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java

@@ -33,6 +33,8 @@ public class ExcelUtil {
             HSSFWorkbook workBook = new HSSFWorkbook();
             // 创建工作类
             HSSFSheet sheet = workBook.createSheet();
+            //设置首行冻结
+            sheet.createFreezePane(0, 1);
             sheet.setDefaultColumnWidth(16);
             //设置字体样式
             HSSFFont headFont = workBook.createFont();
@@ -115,6 +117,7 @@ public class ExcelUtil {
                 for(List<String> rowList : list) {
                     HSSFRow row = sheet.createRow(start);
                     row.setHeightInPoints(24);
+
                     for(int i = 0; i < rowList.size(); i++) {
                         HSSFCell cell = row.createCell(i);
                         if(start == 0) {

+ 6 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ListUtil.java

@@ -141,8 +141,12 @@ public class ListUtil {
 	}
 	
 	public static void main(String[] args) {
-		String str = "123|456";
-		System.out.println(str.contains("|"));
+		Integer a = new Integer(1);
+		Integer b = new Integer(1);
+		List<Integer> list = new ArrayList<>();
+		list.add(a);
+
+		System.out.println(list.contains(b));
 	}
 
 	public static List<Integer> fromIntegers(int[] data) {

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

@@ -12,13 +12,13 @@
         <result column="seq" property="seq" />
         <result column="audit_dept_id" property="auditDeptId" />
         <result column="audit_dept_name" property="auditDeptName" />
-        <result column="type" property="type" />
+        <result column="is_dept_audit" property="isDeptAudit" />
         <result column="is_final" property="isFinal" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, dept_id, user_id, user_name, seq, audit_dept_id, audit_dept_name, type, is_final
+        id, company_id, dept_id, user_id, user_name, seq, audit_dept_id, audit_dept_name, is_dept_audit, is_final
     </sql>
 
 </mapper>

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

@@ -31,15 +31,19 @@
         <result column="degree_id" property="degreeId" />
         <result column="company_id" property="companyId" />
         <result column="fill_userid" property="fillUserid" />
+        <result column="audit_deptid" property="auditDeptid" />
+        <result column="is_dept_audit" property="isDeptAudit" />
+        <result column="audit_dept_managerid" property="auditDeptManagerid" />
+        <result column="is_final_audit" property="isFinalAudit" />
+        <result column="project_audit_state" property="projectAuditState" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, creator_id, project_id, create_date, working_time, content, state, create_time, time_type, cost, start_time, end_time, report_time_type, sub_project_id, task_id, is_overtime, progress, department_audit_state, stage, pic_str, multi_worktime, reject_reason, reject_username, reject_userid, degree_id, company_id, fill_userid
+        id, creator_id, project_id, create_date, working_time, content, state, create_time, time_type, cost, start_time, end_time, report_time_type, sub_project_id, task_id, is_overtime, progress, department_audit_state, stage, pic_str, multi_worktime, reject_reason, reject_username, reject_userid, degree_id, company_id, fill_userid, audit_deptid, is_dept_audit, audit_dept_managerid, is_final_audit, project_audit_state
     </sql>
 
 
-
     <!--根据日期获取全部报告信息-->
     <select id="getAllReportByDate" resultType="java.util.Map">
         SELECT c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
@@ -75,12 +79,14 @@
         a.end_time as endTime, b.incharger_id as inchargerId,
         a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
-        , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName
+        , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
+        department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
+        left join department on department.department_id = a.audit_deptid
         WHERE 1=1
         <if test="date != null and date != ''">
             AND a.create_date=#{date}
@@ -96,12 +102,14 @@
         a.end_time as endTime, b.incharger_id as inchargerId,
         a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
-        , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName
+        , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
+        department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
+        left join department on department.department_id = a.audit_deptid
         WHERE 1=1
         <if test="date != null and date != ''">
             AND a.create_date=#{date}
@@ -120,13 +128,15 @@
         a.end_time as endTime, b.incharger_id as inchargerId,
         a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
-        , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName
+        , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
+        department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState
         FROM report AS a
         left join user on user.id = a.creator_id
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
+        left join department on department.department_id = a.audit_deptid
         WHERE a.company_id = #{companyId}
         and a.state = 0
         <if test="date != null and date != ''">
@@ -139,7 +149,8 @@
             AND a.project_id=#{projectId}
         </if>
         <if test="inchargerId != null">
-            AND b.incharger_id = #{inchargerId}
+            AND ((a.is_dept_audit = 0 and b.incharger_id = #{inchargerId} and a.project_audit_state = 0)
+                or (a.is_dept_audit = 1 and a.audit_dept_managerid = #{inchargerId}))
         </if>
         <if test="isEngeering == 1">
             AND a.department_audit_state = 1
@@ -178,12 +189,14 @@
         b.incharger_id as inchargerId,
         a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
-        , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName
+        , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
+        department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
+        left join department on department.department_id = a.audit_deptid
         WHERE 1=1
         <if test="date != null and date != ''">
             AND a.create_date=#{date}

+ 3 - 3
fhKeeper/formulahousekeeper/timesheet/src/main.js

@@ -118,10 +118,10 @@ router.beforeEach((to, from, next) => {
                         getRoutes = filterRouter;
                     } else {
                         var modules = userModules.filter(u=>u.role == user.role)[0].modules;
-                        if ((user.role == 0 || user.role == 5) && user.leader) {
-                            // if (user.role == 5 && user.leader) {
+                        if (user.leader) {
+                            modules.push(2, "项目报告审核");
+                        } else if (user.hasAuditDept) {
                             modules.push(2, "项目报告审核");
-                            
                         }
                         if (user.role == 6 && user.timeType.needDeptAudit == 1) {
                             //公司领导可以进行导入日报的审核

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

@@ -119,6 +119,10 @@
                     {{scope.row.status == null?"-":statusTxt[scope.row.status]}}
                 </template>
             </el-table-column>
+            <el-table-column prop="planStartDate" label="开始日期" width="96" >
+            </el-table-column>
+            <el-table-column prop="planEndDate" label="截止日期" width="96" >
+            </el-table-column>
             <el-table-column prop="progress" label="完成度" width="100"  v-if="user.company.packageProject == 1">
                 <template slot-scope="scope">
                     {{scope.row.progress==null?"-":scope.row.progress}}%
@@ -201,7 +205,7 @@
                         placeholder="整数" clearable  @keyup.native="restrictNumber('contractAmount')" ></el-input><span style="margin-left:10px;">元</span>
                 <!-- 增加合同金额字段 -->
                 </el-form-item>
-                <el-form-item label="开始日期" prop="planStartDate" v-if="user.company.packageProject==1"  >
+                <el-form-item label="开始日期" prop="planStartDate"  >
                     <el-date-picker v-model="addForm.planStartDate" 
                      :editable="false" style="width:32%;" 
                      format="yyyy-MM-dd" 

+ 21 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -111,7 +111,7 @@
                                 <el-button v-if="user.id == item1.id && (item1.state == 0 || item1.state == -1)" type="normal" :loading="logining" size="small" @click="cancel(item1)">撤回</el-button>
                                 <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item1.data[0].inchargerId) && item1.state == 1" type="normal" :loading="logining" size="small" @click="showDenyDialog(item1.id,1, item1)">撤销</el-button>
                                 <el-button v-if="item1.state >= 2 && user.id == item1.id" type="primary" size="small" @click="isSubstitude=false; fillInReport(index1,0)">编辑日报</el-button>
-                                <el-button v-if="(user.role == 1 || user.role == 2 || user.manageDeptId != 0) && item1.state != 1" size="small" @click="guanli(item1, item1)" style="float: right;">删除</el-button>
+                                <el-button v-if="(user.role == 1 || user.role == 2 || user.manageDeptId != 0) && item1.state != 1" size="small" @click="guanli(item1)" style="float: right;">删除</el-button>
                                 
                             </div>
                             <div class="one_daily_body">
@@ -121,7 +121,20 @@
                                             <p>项目:<b>{{item2.project}}</b><span v-if="item2.subProjectName != null"> / {{item2.subProjectName}}</span>
                                             
                                             <span v-if="user.company.packageEngineering == 0">
-                                            <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 || item2.state == -1">[ 待审核 ]</span>
+                                            <span style="margin-left:15px;color:#DAA520;"  v-if="item2.state == 0 || item2.state == -1">[ 
+                                                <span v-if="item2.isDeptAudit==0">
+                                                    <span v-if="item2.projectAuditState==0">
+                                                        待项目负责人审核
+                                                    </span>
+                                                    <span style="color:#32CD32;" v-else-if="item2.projectAuditState==1">
+                                                        项目负责人审核通过
+                                                    </span>
+                                                <!-- {{item2.isDeptAudit==0?(item2.projectAuditState==0?'待项目负责人审核':'项目负责人审核通过'):('待'+item2.auditDeptName+'审核')}} -->
+                                                </span>
+                                                <span v-else-if="item2.isDeptAudit==1">
+                                                    {{('待'+item2.auditDeptName+'审核')}}
+                                                </span>
+                                                 ]</span>
                                             <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">[ 已通过 ]</span>
                                             <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">[ 已驳回 ] 原因:{{item2.rejectReason}}</span>
                                             <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">[ 待提交 ]</span>
@@ -1745,8 +1758,11 @@
                 
            },
             // 管理员删除日报
-            guanli(item, items) {
-                console.log(item, items)
+            guanli(item) {
+                
+                let day = (this.choseDay + 1) > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
+                let param = {date: this.date + day, userId: item.id};
+                
                 this.$confirm("确定要删除该日报吗?","提示", {
                     confirmButtonText: "确定",
                     cancelButtonText: "取消",
@@ -1754,10 +1770,7 @@
                 })
                 .then(() => {
                     this.listLoading = true;
-                    this.http.post('/report/delete',{ 
-                        userId: item.id,
-                        date: this.workForm.createDate
-                    },
+                    this.http.post('/report/delete',param,
                     res => {
                         this.listLoading = false;
                         if (res.code == "ok") {

+ 25 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -19,8 +19,8 @@
                     @change="getList()" :clearable="true" type="date" placeholder="选择工作日期"></el-date-picker>
                 </el-form-item>
                 <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="batchApprove(true)" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0">批量通过</el-button>
+                <el-button @click="batchApprove(false)"  :loading="batchDenyLoading"  :disabled="multipleSelection.length==0">批量驳回</el-button>
                 </el-form-item>
                 
             </el-form>
@@ -34,7 +34,22 @@
                     <el-timeline>
                         <el-timeline-item v-for="(item,index) in props.row.data" :key="index">
                             <el-card shadow="never">
-                                <p>项目:<b>{{item.project}}<span v-if="item.subProjectName != null"> / {{item.subProjectName}}</span></b></p>
+                                <p>项目:<b>{{item.project}}<span v-if="item.subProjectName != null"> / {{item.subProjectName}}</span>
+                                <span style="margin-left:15px;color:#DAA520;" >[ 
+                                                <span v-if="item.isDeptAudit==0">
+                                                    <span v-if="item.projectAuditState==0">
+                                                        待项目负责人审核
+                                                    </span>
+                                                    <span style="color:#32CD32;" v-else-if="item.projectAuditState==1">
+                                                        项目负责人审核通过
+                                                    </span>
+                                                </span>
+                                                <span v-else-if="item.isDeptAudit==1">
+                                                    {{('待'+item.auditDeptName+'审核')}}
+                                                </span>
+                                                 ]
+                                </span>
+                                </b></p>
                                 <p v-if="user.timeType.customDegreeActive==1 && item.degree_id != null">{{user.timeType.customDegreeName}}:{{item.degreeName}}</p>
                                 <p v-if="user.company.packageEngineering == 1">
                                     专业进度:
@@ -96,7 +111,7 @@
             </el-table-column>
             <el-table-column prop="state" label="状态" sortable>
                 <template slot-scope="scope">
-                    <span v-if="scope.row.state == 0" style="color:#DAA520;">待审核</span>
+                    <span v-if="scope.row.state == 0" style="color:#DAA520;">{{scope.row.isDeptAudit==0?'项目负责人审核':('待'+scope.row.auditDeptName+'审核')}}</span>
                     <span v-else-if="scope.row.state == 1" style="color:#32CD32;">已通过</span>
                     <span v-else-if="scope.row.state == 2" style="color:#FF0000;">已驳回</span>
                 </template>
@@ -140,6 +155,8 @@
     export default {
         data() {
             return {
+                batchDenyLoading: false,
+                batchApproveLoading: false,
                 denyForm:null,
                 denyReasonDialog:false,
                 isAllSelect:false,
@@ -212,8 +229,12 @@
                 if (ids.length > 0) {
                     ids = ids.substring(0, ids.length-1);
                 }
+                //等待
+                isPass?this.batchApproveLoading = true:this.batchDenyLoading = true;
+                this.listLoading = true;
                 this.http.post(isPass?'/report/batchApproveReport':'/report/batchDenyReport', {ids: ids},
                 res => {
+                    isPass?this.batchApproveLoading = false:this.batchDenyLoading = false;
                     this.listLoading = false;
                     if (res.code == "ok") {
                         this.getList();

+ 4 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue

@@ -27,8 +27,8 @@
                     <icon class="iconfont firerock-iconright"></icon>
                     <span v-for="(item, index) in dataArray" :key="item.seq" >
                         
-                        <el-button type="primary" v-if="item.type == 0" @click="editNodeDialog(index, item)">{{item.auditDeptName}}</el-button>
-                        <el-button type="primary" v-if="item.type == 1" @click="editNodeDialog(index, item)">项目负责人</el-button>
+                        <el-button type="primary" v-if="item.isDeptAudit == 1" @click="editNodeDialog(index, item)">{{item.auditDeptName}}</el-button>
+                        <el-button type="primary" v-if="item.isDeptAudit == 0" >项目负责人</el-button>
                         <icon class="iconfont firerock-iconright"></icon>
                         <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(index+1)"></icon>
                         <icon class="iconfont firerock-iconright"></icon>
@@ -229,7 +229,7 @@
               var node = this.$refs.deptCascader.getCheckedNodes()[0];
               
               if (this.isAdd) {
-                var node = {auditDeptId: node.value, auditDeptName: node.label, type:0};
+                var node = {auditDeptId: node.value, auditDeptName: node.label, isDeptAudit:1};
                 this.dataArray.splice(this.index, 0, node);
                 console.log(this.dataArray);
               } else {
@@ -243,7 +243,7 @@
                 this.index = index;
                 this.curUserId = item.userId;
                 this.dialogVisible = true;
-                this.curDeptId = item.deptId;
+                this.curDeptId = item.auditDeptId;
             },
             showNodeDialog(index) {
               this.isAdd = true;

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

@@ -20,7 +20,22 @@
                         <!-- <span>系统智能统计:{{item.calculateTime}}h</span> -->
                     </div>
                     <div v-for="(item1,index1) in item.data" :key="index1" class="one_report_data">
-                        <div class="project_title">项目:{{item1.project}}</div>
+                        <div class="project_title">项目:{{item1.project}}
+                            [
+                            <span v-if="item1.isDeptAudit==0">
+                                <span v-if="item1.projectAuditState==0">
+                                    待项目负责人审核
+                                </span>
+                                <span style="color:#32CD32;" v-else-if="item1.projectAuditState==1">
+                                    项目负责人审核通过
+                                </span>
+                            </span>
+                            <span v-else-if="item1.isDeptAudit==1">
+                                {{('待'+item1.auditDeptName+'审核')}}
+                            </span>
+                            ]
+
+                        </div>
                         <div class="project_title" v-if="user.company.packageEngineering == 1">
                             专业进度:
                             <span style="margin-right:10px;" v-for="progressItem in item1.professionProgressList" :key="progressItem.id">{{progressItem.professionName}}({{progressItem.progress}}%) 

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

@@ -21,7 +21,26 @@
                         <!-- <span>系统智能统计:{{item.calculateTime}}h</span> -->
                     </div>
                     <div v-for="(item1,index1) in item.data" class="one_report_data" :key="index1">
-                        <div class="project_title">项目:{{item1.project}} <span :style="'color:'+statusColor[item1.state]">[{{statusTxt[item1.state]}}] </span></div>
+                        <div class="project_title">项目:{{item1.project}} <span :style="'color:'+statusColor[item1.state]">[
+                            <span v-if="item1.state==0">
+                            <span v-if="item1.isDeptAudit==0">
+                                <span v-if="item1.projectAuditState==0">
+                                    待项目负责人审核
+                                </span>
+                                <span style="color:#32CD32;" v-else-if="item1.projectAuditState==1">
+                                    项目负责人审核通过
+                                </span>
+                            </span>
+                            <span v-else-if="item1.isDeptAudit==1">
+                                {{('待'+item1.auditDeptName+'审核')}}
+                            </span>
+                            </span>
+                            <span v-else>
+                                {{statusTxt[item1.state]}}
+                            </span>
+                            <!-- {{statusTxt[item1.state]}} -->
+
+                            ] </span></div>
                         <div style="color:red;" v-if="item1.state ==2&&item1.rejectReason!=null">原因:{{item1.rejectReason}}</div>
                         <div class="project_title" v-if="user.company.packageEngineering == 1">
                             专业进度: