Переглянути джерело

日报提交增加审核人
财务成本薪资项支持自定义工资,奖金,津贴等

seyason 3 роки тому
батько
коміт
b3436ab135
43 змінених файлів з 1053 додано та 251 видалено
  1. 6 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CommonUploadController.java
  2. 24 23
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java
  3. 23 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceFixedcolnameController.java
  4. 16 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceTblcuscolController.java
  5. 40 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAuditorController.java
  6. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  7. 31 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  8. 10 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  9. 83 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/FinanceFixedcolname.java
  10. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  11. 54 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectAuditor.java
  12. 12 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  13. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserDailyWorkItem.java
  14. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/DepartmentMapper.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/FinanceFixedcolnameMapper.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectAuditorMapper.java
  17. 3 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  18. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceFixedcolnameService.java
  19. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectAuditorService.java
  20. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  21. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  22. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  23. 9 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  24. 38 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceFixedcolnameServiceImpl.java
  25. 20 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  26. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAuditorServiceImpl.java
  27. 97 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  28. 200 71
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  29. 12 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  30. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java
  31. 23 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/FinanceFixedcolnameMapper.xml
  32. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAuditorMapper.xml
  33. 32 24
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  34. 0 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  35. 6 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  36. 33 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  37. 4 8
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  38. 67 10
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  39. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  40. 9 19
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/audit/audit.vue
  41. 60 11
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  42. 2 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue
  43. 2 5
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

+ 6 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CommonUploadController.java

@@ -31,7 +31,12 @@ public class CommonUploadController {
         String[] split = fileName.split("\\.");
         String serverName = UUID.randomUUID().toString().replaceAll("-", "") + "."+split[split.length-1];
 
-        File file = new File(path, serverName);
+        //检查目录
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdir();
+        }
+        File file = new File(dir, serverName);
         InputStream inputStream = null;
         OutputStream outputStream = null;
         try {

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

@@ -3,9 +3,11 @@ package com.management.platform.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Company;
+import com.management.platform.entity.FinanceFixedcolname;
 import com.management.platform.entity.FinanceTblcuscol;
 import com.management.platform.mapper.CompanyMapper;
 import com.management.platform.mapper.FinanceTblcuscolMapper;
+import com.management.platform.service.FinanceFixedcolnameService;
 import com.management.platform.service.FinanceService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
@@ -40,6 +42,8 @@ public class FinanceController {
     private FinanceTblcuscolMapper financeTblcuscolMapper;
     @Resource
     private CompanyMapper companyMapper;
+    @Resource
+    private FinanceFixedcolnameService financeFixedcolnameService;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -87,31 +91,28 @@ public class FinanceController {
     public HttpRespMsg getTemplate(Integer companyId) {
         List<FinanceTblcuscol> list = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
         HttpRespMsg msg = new HttpRespMsg();
-        if (list.size() == 0) {
-            //没有自定义的薪资项
-            msg.data = "/upload/财务人员成本模板.xlsx";
-        } else {
-            List<String> heads = new ArrayList<>();
-            Company company = companyMapper.selectById(companyId);
-            heads.add("姓名");
-            heads.add("工资");
-            heads.add("奖金");
-            heads.add("津贴");
-            heads.add("养老保险");
-            heads.add("医疗保险");
-            heads.add("失业保险");
-            heads.add("工伤保险");
-            heads.add("住房公积金");
+        FinanceFixedcolname item = financeFixedcolnameService.getById(companyId);
+
+        List<String> heads = new ArrayList<>();
+        Company company = companyMapper.selectById(companyId);
+        heads.add("姓名");
+        heads.add(item.getMonthCost());//heads.add("工资");
+        heads.add(item.getBonus());//heads.add("奖金");
+        heads.add(item.getAllowance());//heads.add("津贴");
+        heads.add(item.getInsuranceOld());//heads.add("养老保险");
+        heads.add(item.getInsuranceMedical());//heads.add("医疗保险");
+        heads.add(item.getInsuranceLosejob());//heads.add("失业保险");
+        heads.add(item.getInsuranceInjury());//heads.add("工伤保险");
+        heads.add(item.getHouseFund());//heads.add("住房公积金");
 //            heads.add("其他");
-            if (list.size() > 0) {
-                List<String> collect = list.stream().map(FinanceTblcuscol::getFieldName).collect(Collectors.toList());
-                heads.addAll(collect);
-            }
-            List<List<String>> allList = new ArrayList<>();
-            allList.add(heads);
-            String fileName = company.getCompanyName()+"_财务人员成本模板";
-            msg.data = ExcelUtil.exportGeneralExcelByTitleAndList(fileName, allList, path);
+        if (list.size() > 0) {
+            List<String> collect = list.stream().map(FinanceTblcuscol::getFieldName).collect(Collectors.toList());
+            heads.addAll(collect);
         }
+        List<List<String>> allList = new ArrayList<>();
+        allList.add(heads);
+        String fileName = company.getCompanyName()+"_财务人员成本模板";
+        msg.data = ExcelUtil.exportGeneralExcelByTitleAndList(fileName, allList, path);
 
         return msg;
     }

+ 23 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceFixedcolnameController.java

@@ -0,0 +1,23 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-15
+ */
+@RestController
+@RequestMapping("/finance-fixedcolname")
+public class FinanceFixedcolnameController {
+
+}
+

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

@@ -3,9 +3,12 @@ package com.management.platform.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Finance;
+import com.management.platform.entity.FinanceFixedcolname;
 import com.management.platform.entity.FinanceTblcuscol;
+import com.management.platform.mapper.FinanceFixedcolnameMapper;
 import com.management.platform.mapper.FinanceTblcuscolMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.FinanceFixedcolnameService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -34,18 +37,26 @@ public class FinanceTblcuscolController {
     private FinanceTblcuscolMapper financeTblcuscolMapper;
     @Resource
     private UserMapper userMapper;
+    @Resource
+    private FinanceFixedcolnameService financeFixedcolnameService;
 
     @RequestMapping("/get")
     public HttpRespMsg get(Integer companyId) {
-
         List<FinanceTblcuscol> list = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
         HttpRespMsg msg = new HttpRespMsg();
         msg.data = list;
         return msg;
     }
 
+    @RequestMapping("/getFixed")
+    public HttpRespMsg getFixed(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = financeFixedcolnameService.getFixed(companyId);
+        return msg;
+    }
+
     @RequestMapping("/save")
-    public HttpRespMsg addOrMod(String field1, String field2, String field3) {
+    public HttpRespMsg addOrMod(FinanceFixedcolname item, String field1, String field2, String field3) {
         String token = request.getHeader("TOKEN");
         int companyId = userMapper.selectById(token).getCompanyId();
         financeTblcuscolMapper.delete(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
@@ -70,6 +81,9 @@ public class FinanceTblcuscolController {
             financeTblcuscolMapper.insert(col);
         }
 
+        //存储自定义的固定字段
+        item.setCompanyId(companyId);
+        financeFixedcolnameService.saveOrUpdate(item);
 
         return new HttpRespMsg();
     }

+ 40 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAuditorController.java

@@ -0,0 +1,40 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectAuditor;
+import com.management.platform.mapper.ProjectAuditorMapper;
+import com.management.platform.service.ProjectAuditorService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-13
+ */
+@RestController
+@RequestMapping("/project-auditor")
+public class ProjectAuditorController {
+
+    @Resource
+    private ProjectAuditorMapper projectAuditorMapper;
+
+    @RequestMapping("/getList")
+    private HttpRespMsg getList(Integer projectId) {
+        List<ProjectAuditor> auditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", projectId));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = auditorList;
+        return msg;
+    }
+}
+

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

@@ -75,11 +75,12 @@ public class ProjectController {
                                    String chosenLeaders,
                                    String associateDegrees,
                                    String associateDegreeNames,
-                                   Integer taskGpIncharge
+                                   Integer taskGpIncharge,
+                                   String auditUserIds
                                    ) {
         return projectService.editProject(id, name, code, userId, inchargerId, isPublic, planStartDate, planEndDate, level, contractAmount,
                 projectBaseCostData,
-                 budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames, taskGpIncharge, request);
+                 budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames, taskGpIncharge,auditUserIds, request);
     }
 
     @RequestMapping("/adjustBase")

+ 31 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -148,7 +148,8 @@ public class ReportController {
                                   Integer[] degreeId,
                                   @RequestParam(required = false, defaultValue = "0") Integer draft,
                                   Integer[] groupId,//任务分组id
-                                  Double[] customData//自定义的数值
+                                  Double[] customData,//自定义的数值
+                                  String[] projectAuditorId
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
@@ -191,6 +192,12 @@ public class ReportController {
                 customData[i] = 0.0;
             }
         }
+        if (projectAuditorId == null) {
+            projectAuditorId = new String[projectId.length];
+            for(int i=0;i<projectAuditorId.length; i++) {
+                projectAuditorId[i] = null;
+            }
+        }
 
         //检查项目是否截止
         List<Integer> integers = Arrays.asList(projectId);
@@ -241,6 +248,14 @@ public class ReportController {
             }
         }
 
+        //自动填充项目审核人
+        for (int i=0;i<projectAuditorId.length; i++) {
+            if (projectAuditorId[i] == null) {
+                final int index = i;
+                projectAuditorId[i] = projectList.stream().filter(p->p.getId().equals(projectId[index])).findFirst().get().getInchargerId();
+            }
+        }
+
         //代填
         if (targetUids != null && targetUids.length > 0) {
             String val = targetUids[0];
@@ -406,6 +421,7 @@ public class ReportController {
                             report.setCreateDate(localStartDate);
                             report.setCreatorId(token);
                             report.setProjectAuditState(0);
+                            report.setProjectAuditorId(projectAuditorId[i]);
                             if (auditWorkflowList.size() == 0) {
                                 //没有自定义审核流,默认的直接是项目负责人审核
                                 report.setIsDeptAudit(0);
@@ -455,7 +471,8 @@ public class ReportController {
                                         .setCompanyId(user.getCompanyId())
                                         .setPicAdd(pics!=null?pics[i]:null)
                                         .setCreateDate(localStartDate)
-                                        .setCreatorId(subsUser.getId());
+                                        .setCreatorId(subsUser.getId())
+                                        .setProjectAuditorId(projectAuditorId[i]);;
                                 report.setProjectAuditState(0);
                                 if (auditWorkflowList.size() == 0) {
                                     //没有自定义审核流,默认的直接是项目负责人审核
@@ -509,6 +526,7 @@ public class ReportController {
                         report.setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                         report.setCreatorId(token);
                         report.setProjectAuditState(0);
+                        report.setProjectAuditorId(projectAuditorId[i]);
                         if (auditWorkflowList.size() == 0) {
                             //没有自定义审核流,默认的直接是项目负责人审核
                             report.setIsDeptAudit(0);
@@ -564,6 +582,7 @@ public class ReportController {
                                     .setPicAdd(pics!=null?pics[i]:null)
                                     .setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                                     .setCreatorId(subsUser.getId())
+                                    .setProjectAuditorId(projectAuditorId[i])
                                     .setFillUserid(token);
                             report.setProjectAuditState(1);
                             if (auditWorkflowList.size() == 0 || user.getRole() == 1 || user.getRole() == 2) {
@@ -801,8 +820,8 @@ public class ReportController {
     }
 
     @RequestMapping("/getUserDailyWorkTime")
-    public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String month) {
-        return reportService.getUserDailyWorkTime(request, month);
+    public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
+        return reportService.getUserDailyWorkTime(request, startDate, endDate);
     }
 
     @RequestMapping("/getNoReportUserList")
@@ -810,9 +829,14 @@ public class ReportController {
         return reportService.getNoReportUserList(request, startDate, endDate);
     }
 
+    @RequestMapping("/exportNoReportUserList")
+    public HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate) {
+        return reportService.exportNoReportUserList(request, startDate, endDate);
+    }
+
     @RequestMapping("/exportUserDailyWorkTime")
-    public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String month) {
-        return reportService.exportUserDailyWorkTime(request, month);
+    public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
+        return reportService.exportUserDailyWorkTime(request, startDate, endDate);
     }
 
     /**
@@ -838,7 +862,7 @@ public class ReportController {
     @RequestMapping("/listImportByState")
     public HttpRespMsg listDeptImportByState(
                                       Integer projectId,
-                                      Integer dateType,
+                                      @RequestParam(required = false, defaultValue = "0") Integer dateType,
                                       String date,
                                       Integer departmentId,
                                       HttpServletRequest request) {

+ 10 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -69,12 +69,13 @@ public class WeiXinCorpController {
 
     @Autowired
     RestTemplate restTemplate;
-
     @Resource
     CompanyMapper companyMapper;
     @Resource
     ProjectMapper projectMapper;
     @Resource
+    ProjectAuditorMapper projectAuditorMapper;
+    @Resource
     WxCorpInfoService wxCorpInfoService;
     @Resource
     ProjectBasecostSettingMapper projectBasecostSettingMapper;
@@ -714,10 +715,7 @@ public class WeiXinCorpController {
             userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
                     LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
             //检测是否是项目经理,项目经理有审核功能权限
-            int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", userVO.getId()));
-            if (cnt > 0) {
-                userVO.setLeader(true);
-            }
+            userVO.setLeader(judgeIsLeader(userVO.getId()));
             msg.data = userVO;
 
         }
@@ -753,10 +751,7 @@ public class WeiXinCorpController {
             userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
                     LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
             //检测是否是项目经理,项目经理有审核功能权限
-            int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", userVO.getId()));
-            if (cnt > 0) {
-                userVO.setLeader(true);
-            }
+            userVO.setLeader(judgeIsLeader(userVO.getId()));
             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());
@@ -952,4 +947,10 @@ public class WeiXinCorpController {
 
         return new HttpRespMsg();
     }
+
+
+    private boolean judgeIsLeader(String userId) {
+        int cnt = projectAuditorMapper.selectCount(new QueryWrapper<ProjectAuditor>().eq("auditor_id", userId));
+        return cnt>0;
+    }
 }

+ 83 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/FinanceFixedcolname.java

@@ -0,0 +1,83 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class FinanceFixedcolname extends Model<FinanceFixedcolname> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId("company_id")
+    private Integer companyId;
+
+    /**
+     * 工资字段
+     */
+    @TableField("month_cost")
+    private String monthCost;
+
+    /**
+     * 奖金字段
+     */
+    @TableField("bonus")
+    private String bonus;
+
+    /**
+     * 津贴字段
+     */
+    @TableField("allowance")
+    private String allowance;
+
+    /**
+     * 养老保险字段
+     */
+    @TableField("insurance_old")
+    private String insuranceOld;
+
+    /**
+     * 医疗保险字段
+     */
+    @TableField("insurance_medical")
+    private String insuranceMedical;
+
+    /**
+     * 失业保险字段
+     */
+    @TableField("insurance_losejob")
+    private String insuranceLosejob;
+
+    /**
+     * 工伤保险字段
+     */
+    @TableField("insurance_injury")
+    private String insuranceInjury;
+
+    /**
+     * 住房公积金字段
+     */
+    @TableField("house_fund")
+    private String houseFund;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.companyId;
+    }
+
+}

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

@@ -233,6 +233,12 @@ public class Project extends Model<Project> {
     @TableField("task_gp_incharge")
     private Integer taskGpIncharge;
 
+    @TableField(exist = false)
+    private List<String> auditUserIds;
+
+    @TableField(exist = false)
+    private List<ProjectAuditor> auditorList;
+
 
     @Override
     protected Serializable pkVal() {

+ 54 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectAuditor.java

@@ -0,0 +1,54 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectAuditor extends Model<ProjectAuditor> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目id
+     */
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 审核人id
+     */
+    @TableField("auditor_id")
+    private String auditorId;
+
+    /**
+     * 审核人姓名
+     */
+    @TableField("auditor_name")
+    private String auditorName;
+
+
+    @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-03-09
+ * @since 2022-03-13
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -271,6 +271,17 @@ public class Report extends Model<Report> {
     @TableField("custom_data")
     private Double customData;
 
+    /**
+     * 项目审核人id
+     */
+    @TableField("project_auditor_id")
+    private String projectAuditorId;
+
+    @TableField(exist = false)
+    private List<ProjectAuditor> auditUserList;
+
+    @TableField(exist = false)
+    private String projectAuditorName;
 
     @Override
     protected Serializable pkVal() {

+ 4 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserDailyWorkItem.java

@@ -1,8 +1,8 @@
 package com.management.platform.entity.vo;
 
 public class UserDailyWorkItem {
-    String userId;
-    String createDate;
-    String department;
-    String name;
+    public String userId;
+    public String createDate;
+    public String department;
+    public String name;
 }

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/DepartmentMapper.java

@@ -3,6 +3,7 @@ package com.management.platform.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.management.platform.entity.Department;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
 import java.util.Map;
@@ -21,4 +22,8 @@ public interface DepartmentMapper extends BaseMapper<Department> {
     List<Map<String, Object>> getCostByUser(@Param("departmentIds") List departmentIds, String startDate, String endDate, Integer companyId, List<String> userIds);
 
     List<Map<String, Object>> getCustomDataByUser(@Param("departmentIds") List departmentIds, String startDate, String endDate, Integer companyId, List<String> userIds);
+    @Update("update department set manager_id = null where department_id = #{departmentId}")
+    void updateNullManager(Integer departmentId);
+    @Update("update department set report_audit_userid = null where department_id = #{departmentId}")
+    void updateNullLeader(Integer departmentId);
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/FinanceFixedcolnameMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.FinanceFixedcolname;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-15
+ */
+public interface FinanceFixedcolnameMapper extends BaseMapper<FinanceFixedcolname> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectAuditorMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProjectAuditor;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-13
+ */
+public interface ProjectAuditorMapper extends BaseMapper<ProjectAuditor> {
+
+}

+ 3 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -46,7 +46,7 @@ public interface ReportMapper extends BaseMapper<Report> {
     List<Map<String, Object>> getAuditReportList(@Param("date") String date, @Param("companyId") Integer companyId,
                                                  @Param("departmentId") Integer departmentId,
                                                  @Param("projectId") Integer projectId,
-                                                 @Param("inchargerId") String inchargerId,
+                                                 @Param("auditorId") String auditorId,
                                                  @Param("isEngeering") Integer isEngeering,
                                                  @Param("startDate") String startDate,
                                                  @Param("endDate") String endDate,
@@ -67,13 +67,6 @@ public interface ReportMapper extends BaseMapper<Report> {
                                                          @Param("deptIds") List<Integer> deptIds,
                                                          @Param("userId") String userId,
                                                          @Param("companyId") Integer company);
-
-    List<Map<String, Object>> getDetailByState(@Param("state") Integer state,
-                                               @Param("companyId") Integer companyId,
-                                                @Param("leaderId") String leaderId,
-                                               @Param("isEngeering") Integer isEngeering
-                                                );
-
     List<Map<String, Object>> getDetailByStateInMyProfession(@Param("state") Integer state,
                                                @Param("companyId") Integer companyId,
                                                @Param("leaderId") String leaderId);
@@ -101,4 +94,6 @@ public interface ReportMapper extends BaseMapper<Report> {
     List<Map<String, Object>> selectFillReportUserList(Integer companyId, String startDate, String endDate);
 
     List<Map<String, Object>> getMonthReportProjectList(Integer companyId, String startDate, String endDate);
+
+    void deleteUserSameDayReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList);
 }

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

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.FinanceFixedcolname;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-15
+ */
+public interface FinanceFixedcolnameService extends IService<FinanceFixedcolname> {
+    public FinanceFixedcolname getFixed(Integer companyId);
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectAuditor;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-13
+ */
+public interface ProjectAuditorService extends IService<ProjectAuditor> {
+
+}

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

@@ -34,6 +34,7 @@ public interface ProjectService extends IService<Project> {
                             String associateDegrees,
                             String associateDegreeNames,
                             Integer taskGpIncharge,
+                            String auditUserIds,
                             HttpServletRequest request);
 
     HttpRespMsg deleteProject(Integer id, Integer force);

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

@@ -60,9 +60,9 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg listByStateDepartment(Integer state, Integer projectId, String date, HttpServletRequest request);
 
-    HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String month);
+    HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate);
 
-    HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String month);
+    HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate);
 
     HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile file, HttpServletRequest request);
 
@@ -77,4 +77,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getlastWeekFillTime(String userId);
 
     HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate);
+
+    HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate);
 }

+ 8 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -109,6 +109,11 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                         setting.setAuditDeptName(departmentName);
                         auditWorkflowTimeSettingMapper.update(setting, new QueryWrapper<AuditWorkflowTimeSetting>().eq("audit_dept_id", departmentId));
                     }
+                    if (reportAuditUserid == null) {
+                        //设置部门领导为null
+                        departmentMapper.updateNullLeader(departmentId);
+                    }
+
                     //修改负责人的部门
                     if (managerId != null) {
                         User manager = userMapper.selectById(managerId);
@@ -126,6 +131,8 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                         }
                     } else {
                         //取消了部门管理员
+                        departmentMapper.updateNullManager(departmentId);
+
                         User manageDeptOldUser= userMapper.selectOne(new QueryWrapper<User>().eq("manage_dept_id", departmentId));
                         if (manageDeptOldUser != null) {
                             manageDeptOldUser.setManageDeptId(0);
@@ -135,6 +142,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 }
             }
         } catch (NullPointerException e) {
+            e.printStackTrace();
             httpRespMsg.setError("验证失败");
             return httpRespMsg;
         }

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

@@ -60,6 +60,8 @@ public class DingDingServiceImpl implements DingDingService {
     @Resource
     private SysConfigMapper sysConfigMapper;
     @Resource
+    private ProjectAuditorMapper projectAuditorMapper;
+    @Resource
     private CompanyMapper companyMapper;
     @Resource
     private TimeTypeMapper timeTypeMapper;
@@ -370,10 +372,7 @@ public class DingDingServiceImpl implements DingDingService {
                     userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
                             LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
                     //检测是否是项目经理,项目经理有审核功能权限
-                    int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", userVO.getId()));
-                    if (cnt > 0) {
-                        userVO.setLeader(true);
-                    }
+                    userVO.setLeader(judgeIsLeader(userVO.getId()));
                     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());
@@ -885,4 +884,10 @@ public class DingDingServiceImpl implements DingDingService {
         }
         return SUITE_ACCESS_TOKEN;
     }
+
+
+    private boolean judgeIsLeader(String userId) {
+        int cnt = projectAuditorMapper.selectCount(new QueryWrapper<ProjectAuditor>().eq("auditor_id", userId));
+        return cnt>0;
+    }
 }

+ 38 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceFixedcolnameServiceImpl.java

@@ -0,0 +1,38 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.FinanceFixedcolname;
+import com.management.platform.mapper.FinanceFixedcolnameMapper;
+import com.management.platform.service.FinanceFixedcolnameService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-15
+ */
+@Service
+public class FinanceFixedcolnameServiceImpl extends ServiceImpl<FinanceFixedcolnameMapper, FinanceFixedcolname> implements FinanceFixedcolnameService {
+
+    public FinanceFixedcolname getFixed(Integer companyId) {
+        FinanceFixedcolname item = getById(companyId);
+        if (item == null) {
+            //自动生成默认值
+            item = new FinanceFixedcolname();
+            item.setMonthCost("工资");
+            item.setBonus("奖金");
+            item.setAllowance("津贴");
+            item.setInsuranceOld("养老保险");
+            item.setInsuranceMedical("医疗保险");
+            item.setInsuranceLosejob("失业保险");
+            item.setInsuranceInjury("工伤保险");
+            item.setHouseFund("住房公积金");
+            item.setCompanyId(companyId);
+            save(item);
+        }
+        return item;
+    }
+}

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

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
+import com.management.platform.service.FinanceFixedcolnameService;
 import com.management.platform.service.FinanceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.service.ReportService;
@@ -70,6 +71,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     private FinanceProjectsMapper financeProjectsMapper;
     @Resource
     private ProjectPercentageMapper projectPercentageMapper;
+    @Resource
+    private FinanceFixedcolnameService financeFixedcolnameService;
 
     @Resource
     private ProjectMapper projectMapper;
@@ -190,12 +193,6 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 Finance finance = new Finance();
 
                 if (name.equals("姓名") && rowIndex == 0) {
-                    //跳过第一行标题
-                    if (!"工伤保险".equals(injuryCell.getStringCellValue())) {
-                        //缺少工伤保险,需要新的财务报表模板
-                        msg.setError("缺少工伤保险栏,请重新下载财务模板填写上传");
-                        return msg;
-                    }
                     continue;
                 }
                 Cell houseFundCell = row.getCell(8);
@@ -443,14 +440,23 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             headList.add("项目名称");
             headList.add("人员");
             headList.add("工时(h)");
-            headList.add("工资(元)");
-            headList.add("奖金(元)");
-            headList.add("津贴(元)");
-            headList.add("养老保险(元)");
-            headList.add("医疗保险(元)");
-            headList.add("失业保险(元)");
-            headList.add("工伤保险(元)");
-            headList.add("住房公积金(元)");
+//            headList.add("工资(元)");
+//            headList.add("奖金(元)");
+//            headList.add("津贴(元)");
+//            headList.add("养老保险(元)");
+//            headList.add("医疗保险(元)");
+//            headList.add("失业保险(元)");
+//            headList.add("工伤保险(元)");
+//            headList.add("住房公积金(元)");
+            FinanceFixedcolname fixedItem = financeFixedcolnameService.getById(companyId);
+            headList.add(fixedItem.getMonthCost()+"(元)");
+            headList.add(fixedItem.getBonus()+"(元)");
+            headList.add(fixedItem.getAllowance()+"(元)");
+            headList.add(fixedItem.getInsuranceOld()+"(元)");
+            headList.add(fixedItem.getInsuranceMedical()+"(元)");
+            headList.add(fixedItem.getInsuranceLosejob()+"(元)");
+            headList.add(fixedItem.getInsuranceInjury()+"(元)");
+            headList.add(fixedItem.getHouseFund()+"(元)");
 //            headList.add("其他(元)");
             for (FinanceTblcuscol col : cusColList) {
                 headList.add(col.getFieldName());

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAuditorServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectAuditor;
+import com.management.platform.mapper.ProjectAuditorMapper;
+import com.management.platform.service.ProjectAuditorService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-13
+ */
+@Service
+public class ProjectAuditorServiceImpl extends ServiceImpl<ProjectAuditorMapper, ProjectAuditor> implements ProjectAuditorService {
+
+}

+ 97 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.*;
 import com.management.platform.mapper.*;
+import com.management.platform.service.ProjectAuditorService;
 import com.management.platform.service.ProjectNotifyUserService;
 import com.management.platform.service.ProjectService;
 import com.management.platform.util.HttpRespMsg;
@@ -93,6 +94,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     TaskGroupMapper taskGroupMapper;
     @Resource
     ProjectProfessionMapper projectProfessionMapper;
+    @Resource
+    ProjectAuditorMapper projectAuditorMapper;
+    @Resource
+    ProjectAuditorService projectAuditorService;
 
     @Resource
     private HttpServletResponse response;
@@ -200,11 +205,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                    String associateDegrees,
                                    String associateDegreeNames,
                                    Integer taskGpIncharge,
+                                   String auditUserIds,
                                    HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
 
+        boolean isNew = true;
         //检查负责人要在参与人中
         if (inchargerId != null) {
             if (userIds == null || userIds.length == 0) {
@@ -293,6 +300,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
             }
         } else {
+            isNew = false;
             //修改项目
             //检查项目编号不能重复
             Integer count = 0;
@@ -417,6 +425,90 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 projectNotifyUserService.saveBatch(notifyUsers);
             }
             httpRespMsg.data = id;
+
+            //日报审核人表
+            List<String> auditorIds = new ArrayList<>();
+            if (StringUtils.isEmpty(auditUserIds) || "[]".equals(auditUserIds)) {
+                if (inchargerId != null) {
+                    auditorIds.add(inchargerId);
+                }
+            } else {
+                auditorIds = JSONArray.parseArray(auditUserIds, String.class);
+            }
+
+            if (isNew) {
+                if (auditorIds.size() > 0) {
+                    List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", auditorIds));
+                    List<ProjectAuditor> batchList = new ArrayList<>();
+                    for (User user1 : userList) {
+                        ProjectAuditor projectAuditor = new ProjectAuditor();
+                        projectAuditor.setProjectId(id);
+                        projectAuditor.setAuditorId(user1.getId());
+                        projectAuditor.setAuditorName(user1.getName());
+                        batchList.add(projectAuditor);
+                    }
+                    if (batchList.size() > 0) {
+                        //批量保存审核人
+                        projectAuditorService.saveBatch(batchList);
+                    }
+                }
+            } else {
+                //提取变化的部分
+                List<ProjectAuditor> oldAuditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", id));
+                List<ProjectAuditor> newList = new ArrayList<>();
+                String firstAuditorId = null;
+                if (auditorIds.size() > 0) {
+                    firstAuditorId = auditorIds.get(0);
+                    List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", auditorIds));
+                    System.out.println("有auditor===");
+                    List<User> newUserList = userList.stream()
+                                .filter(u->!oldAuditorList.stream().anyMatch(old->old.getAuditorId().equals(u.getId())))
+                                .collect(Collectors.toList());
+                    if (newUserList.size() > 0) {
+                        for (User u : newUserList) {
+                            ProjectAuditor a = new ProjectAuditor();
+                            a.setProjectId(id);
+                            a.setAuditorId(u.getId());
+                            a.setAuditorName(u.getName());
+                            newList.add(a);
+                        }
+                        projectAuditorService.saveBatch(newList);
+                    }
+                    //检查有没有需要删除的
+                    List<ProjectAuditor> deleteList = oldAuditorList.stream()
+                            .filter(old->!userList.stream().anyMatch(u->u.getId().equals(old.getAuditorId())))
+                            .collect(Collectors.toList());
+
+                    if (deleteList.size() > 0) {
+                        projectAuditorService.removeByIds(deleteList.stream().map(ProjectAuditor::getId).collect(Collectors.toList()));
+                    }
+                    if (newList.size() == 0 && deleteList.size() == oldAuditorList.size()) {
+                        //全部被删除了的情况,保留项目负责人
+                        if (inchargerId != null) {
+                            ProjectAuditor auditor = new ProjectAuditor();
+                            auditor.setProjectId(id);
+                            auditor.setAuditorId(inchargerId);
+                            auditor.setAuditorName(userMapper.selectById(inchargerId).getName());
+                            projectAuditorMapper.insert(auditor);
+                            //将日报的审核人换成
+                        }
+                    }
+                    //检查日报,如果有删除的审核人的正在审核的日报,要更新审核人为当前的第一个人
+                    Report updateItem = new Report();
+                    if (deleteList.size() > 0 && firstAuditorId != null) {
+                        updateItem.setProjectAuditorId(firstAuditorId);
+                        List<String> collect = deleteList.stream().map(ProjectAuditor::getAuditorId).collect(Collectors.toList());
+                        reportMapper.update(updateItem, new QueryWrapper<Report>()
+                                .eq("company_id", companyId)
+                                .in("project_auditor_id", collect)
+                                .eq("state", 0)
+                                .eq("project_id", id));
+                    }
+                } else {
+                    //清空
+                    projectAuditorMapper.delete(new QueryWrapper<ProjectAuditor>().eq("project_id", id));
+                }
+            }
         }
         return httpRespMsg;
     }
@@ -710,6 +802,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //项目参与人
         List<Map<String, Object>> participator = participationMapper.getParticipator(id);
         project.setParticipationList(participator);
+        //项目日报审核人
+        List<ProjectAuditor> auditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", id));
+        project.setAuditorList(auditorList);
+        project.setAuditUserIds(auditorList.stream().map(ProjectAuditor::getAuditorId).collect(Collectors.toList()));
+
         HttpRespMsg msg = new HttpRespMsg();
         msg.data = project;
 

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

@@ -52,6 +52,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -81,6 +82,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private TaskGroupMapper taskGroupMapper;
     @Resource
+    private ProjectAuditorMapper projectAuditorMapper;
+    @Resource
     private ReportService reportService;
     @Resource
     ReportExtraDegreeMapper reportExtraDegreeMapper;
@@ -233,11 +236,26 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 memb.put("cost", total);
                                 double reportTime = 0;
                                 if (rList.size() > 0) {
+                                    int state = 1;
                                     for (Map<String, Object> m : rList) {
                                         double t = (double) m.get("time");
                                         reportTime += t;
+
+                                        //取最低的状态
+                                        if (state == 2) {
+                                            continue;
+                                        }
+                                        if (state == 0) {
+                                            if ((int)m.get("state") == 2) {
+                                                state = 2;
+                                            } else {
+                                                continue;
+                                            }
+                                        } else {
+                                            state = (int)m.get("state");
+                                        }
                                     }
-                                    memb.put("state", rList.get(0).get("state"));
+                                    memb.put("state", state);
                                 }
                                 DecimalFormat df = new DecimalFormat("0.00");
                                 memb.put("reportTime", df.format(reportTime));
@@ -268,15 +286,29 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
                             double reportTime = 0;
                             BigDecimal total = new BigDecimal(0);
+                            int state = 1;
                             for (Map<String, Object> m : list2) {
                                 double t = (double) m.get("time");
                                 reportTime += t;
                                 total = total.add((BigDecimal)m.get("cost"));
+                                //取最低的状态
+                                if (state == 2) {
+                                    continue;
+                                }
+                                if (state == 0) {
+                                    if ((int)m.get("state") == 2) {
+                                        state = 2;
+                                    } else {
+                                        continue;
+                                    }
+                                } else {
+                                    state = (int)m.get("state");
+                                }
                             }
                             DecimalFormat df = new DecimalFormat("0.00");
                             map2.put("reportTime", df.format(reportTime));
                             map2.put("cost", total);
-                            map2.put("state", list2.get(0).get("state"));
+                            map2.put("state", state);
                         }
                     }
                 }
@@ -325,11 +357,25 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         map.put("cost", total);
                         double reportTime = 0;
                         if (list.size() > 0) {
+                            int state = 1;
                             for (Map<String, Object> m : list) {
                                 double t = (double) m.get("time");
                                 reportTime += t;
+                                //取最低的状态
+                                if (state == 2) {
+                                    continue;
+                                }
+                                if (state == 0) {
+                                    if ((int)m.get("state") == 2) {
+                                        state = 2;
+                                    } else {
+                                        continue;
+                                    }
+                                } else {
+                                    state = (int)m.get("state");
+                                }
                             }
-                            map.put("state", list.get(0).get("state"));
+                            map.put("state", state);
                         }
                         DecimalFormat df = new DecimalFormat("0.00");
                         map.put("reportTime", df.format(reportTime));
@@ -417,6 +463,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<Project> allProjectList = projectMapper.selectList(new QueryWrapper<Project>()
                     .eq("company_id", userMapper.selectById(userId).getCompanyId()));
             List<SubProject> subProjectList = integerList.size() > 0?subProjectMapper.selectList(new QueryWrapper<SubProject>().in("project_id",integerList)):new ArrayList<>();
+            List<ProjectAuditor> auditorList = integerList.size() > 0?projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().in("project_id", integerList)): new ArrayList<>();
 
             List<UserRecentTask> taskList = integerList.size() > 0?userRecentTaskMapper.selectList(new QueryWrapper<UserRecentTask>().in("project_id", integerList).orderByDesc("id")):new ArrayList<>();
             List<Profession> professions = professionMapper.selectList(new QueryWrapper<Profession>().eq("company_id", companyId));
@@ -491,6 +538,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         }
                     }
                 }
+                //项目的审核人
+                r.setAuditUserList(auditorList.stream().filter(au->au.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
+                if (r.getProjectAuditorId() != null) {
+                    Optional<ProjectAuditor> auItem = auditorList.stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
+                    if (auItem.isPresent()) {
+                        r.setProjectAuditorName(auItem.get().getAuditorName());
+                    }
+                }
             });
             resultMap.put("report", reports);
             //顺便再获取一下可分配时间
@@ -1743,34 +1798,34 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String month) {
+    public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         Integer companyId = user.getCompanyId();
 
-        String startDate = month + "-01";
-        LocalDate ld = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        int year = ld.getYear();
-        boolean isLerpYear = false;
-        if (year%4==0&&year%100!=0) {
-            isLerpYear = true;
-        } else if (year%400==0) {
-            isLerpYear = true;
-        }
-
-        int dm = ld.getMonthValue();
-        int maxDaysOfMonth = 28;
-        if (dm == 1 || dm == 3 || dm == 5 || dm == 7 || dm == 8 || dm == 10 || dm == 12) {
-            maxDaysOfMonth = 31;
-        } else if (dm == 2) {
-            if (isLerpYear) {
-                maxDaysOfMonth = 29;
-            }
-        } else {
-            maxDaysOfMonth = 30;
-        }
+//        String startDate = month + "-01";
+//        LocalDate ld = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+//        int year = ld.getYear();
+//        boolean isLerpYear = false;
+//        if (year%4==0&&year%100!=0) {
+//            isLerpYear = true;
+//        } else if (year%400==0) {
+//            isLerpYear = true;
+//        }
+//
+//        int dm = ld.getMonthValue();
+//        int maxDaysOfMonth = 28;
+//        if (dm == 1 || dm == 3 || dm == 5 || dm == 7 || dm == 8 || dm == 10 || dm == 12) {
+//            maxDaysOfMonth = 31;
+//        } else if (dm == 2) {
+//            if (isLerpYear) {
+//                maxDaysOfMonth = 29;
+//            }
+//        } else {
+//            maxDaysOfMonth = 30;
+//        }
 
-        String endDate = month + "-"+maxDaysOfMonth;
+//        String endDate = month + "-"+maxDaysOfMonth;
         HttpRespMsg msg = new HttpRespMsg();
         List<Map<String, Object>> list = null;
         //分角色权限:管理员看全部的,部门负责人看自己部门的,个人只能看自己的。
@@ -1823,7 +1878,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         HashMap map = new HashMap();
         List<Integer> days = new ArrayList<>();
-        for (int i=1;i<=maxDaysOfMonth;i++) {
+        LocalDate localStartDate = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDate localEndDate = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        long count = localStartDate.until(localEndDate, ChronoUnit.DAYS);
+        for (int i=1;i<=count;i++) {
             days.add(i);
         }
         map.put("days", days);
@@ -1833,8 +1891,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String month) {
-        HttpRespMsg msg = getUserDailyWorkTime(request, month);
+    public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
+        HttpRespMsg msg = getUserDailyWorkTime(request, startDate, endDate);
         String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
         HashMap map = (HashMap) msg.data;
         List<Integer> days = (List<Integer>)map.get("days");
@@ -1844,13 +1902,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         titleList.add("序号");
         titleList.add("姓名");
         days.forEach(d->{
-            String dateStr = month + "-" + (d<10?"0"+d:d);
+            String dateStr = startDate;
             LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            date = date.plusDays(d-1);
             String chn = weekDayCHN[date.getDayOfWeek().getValue()-1];
-            String m = month.split("-")[1];
-            if (m.startsWith("0")) {
-                m = m.substring(1);
-            }
+            String m = ""+date.getMonthValue();
             titleList.add(m+"."+d+"/"+chn);
         });
         dataList.add(titleList);
@@ -1862,8 +1918,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //找到那一天的工作时间
             List<Map<String, Object>> worktimeList = userMonthWork.worktimeList;
             days.forEach(d->{
-                String dateStr = month + "-" + (d<10?"0"+d:d);
-                Optional<Map<String, Object>> op = worktimeList.stream().filter(m -> ((String) m.get("createDate")).equals(dateStr)).findFirst();
+                String dateStr = startDate;
+                LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                //计算当前遍历到的那一天
+                date = date.plusDays(d-1);
+                final String fDateStr = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(date);
+                Optional<Map<String, Object>> op = worktimeList.stream().filter(m -> ((String) m.get("createDate")).equals(fDateStr)).findFirst();
                 if (op.isPresent()) {
                     Map<String, Object> createDateHour = op.get();
                     dataItem.add(""+createDateHour.get("workingTime"));
@@ -1874,7 +1934,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             dataList.add(dataItem);
         }
         //生成excel文件导出
-        String fileName = "人员每日工时统计_"+month.split("-")[1]+"月"+System.currentTimeMillis();
+        String fileName = "人员每日工时统计_"+startDate+"至"+endDate+"_"+System.currentTimeMillis();
         String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         httpRespMsg.data = resp;
@@ -2045,39 +2105,36 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             }
-            if (reportList.size() == 0) {
-                msg.setError("缺少工时数据");
-                return msg;
-            }
-            
+
             //先删除老数据, 修改为批处理
             long t1 = System.currentTimeMillis();
 
-            DateTimeFormatter standFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            HashMap<String, Object> dataMap = new HashMap<>();
-            for (Report r : reportList) {
-                //组合一下人员
-                String date = standFormat.format(r.getCreateDate());
-                if (dataMap.containsKey(date)) {
-                    List<String> userList = (List)dataMap.get(date);
-                    userList.add(r.getCreatorId());
-                } else {
-                    List<String> newList = new ArrayList<>();
-                    newList.add(r.getCreatorId());
-                    dataMap.put(date, newList);
-                }
-            }
-            LambdaQueryWrapper<Report> queryWrapper = new QueryWrapper<Report>().lambda();
-            Iterator<String> it = dataMap.keySet().iterator();
-            
-            while (it.hasNext()) {
-                String key = it.next();
-                List<String> userList = (List)dataMap.get(key);
-                queryWrapper.or(wrapper->wrapper.eq(Report::getCompanyId, companyId).eq(Report::getCreateDate, key).in(Report::getCreatorId, userList));
-            }
-            System.out.println(queryWrapper.getSqlSegment()+", "+queryWrapper.getSqlSelect()+", " + queryWrapper.getCustomSqlSegment());
-            if (queryWrapper.getSqlSegment() != null) {
-                reportMapper.delete(queryWrapper);
+//            DateTimeFormatter standFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+//            HashMap<String, Object> dataMap = new HashMap<>();
+//            for (Report r : reportList) {
+//                //组合一下人员
+//                String date = standFormat.format(r.getCreateDate());
+//                if (dataMap.containsKey(date)) {
+//                    List<String> userList = (List)dataMap.get(date);
+//                    userList.add(r.getCreatorId());
+//                } else {
+//                    List<String> newList = new ArrayList<>();
+//                    newList.add(r.getCreatorId());
+//                    dataMap.put(date, newList);
+//                }
+//            }
+//            LambdaQueryWrapper<Report> queryWrapper = new QueryWrapper<Report>().lambda();
+//            Iterator<String> it = dataMap.keySet().iterator();
+//
+//            while (it.hasNext()) {
+//                String key = it.next();
+//                List<String> userList = (List)dataMap.get(key);
+//                //非审核通过的才能删除
+//                queryWrapper.or(wrapper->wrapper.eq(Report::getCompanyId, companyId).eq(Report::getCreateDate, key).in(Report::getCreatorId, userList).ne(Report::getState, 1));
+//            }
+//            System.out.println(queryWrapper.getSqlSegment()+", "+queryWrapper.getSqlSelect()+", " + queryWrapper.getCustomSqlSegment());
+            if (reportList.size() > 0) {
+                reportMapper.deleteUserSameDayReport(companyId, reportList);
                 long t2 = System.currentTimeMillis();
                 System.out.println("删除耗时:" + (t2-t1));
                 //存储
@@ -2526,16 +2583,88 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //管理员看全公司所有人
             allRangeUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
         }
-        List<UserDailyWorkItem> userMonthWorks = new ArrayList<UserDailyWorkItem>();
-
+        List<UserDailyWorkItem> noReportDataList = new ArrayList<UserDailyWorkItem>();
+        //准备部门数据
+        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         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);
+        long cnt = localStart.until(localEnd, ChronoUnit.DAYS);
         //按人员过滤
         for (User curUser: allRangeUserList) {
-
+            for (int i=0;i<cnt; i++) {
+                LocalDate date = localStart.plusDays(i);
+                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();
+                    noRecord.userId = curUser.getId();
+                    noRecord.createDate = dtf.format(date);
+                    if (curUser.getDepartmentId() != null && curUser.getDepartmentId() != 0) {
+                        noRecord.department = departmentList.stream().filter(d->d.getDepartmentId().equals(curUser.getDepartmentId())).findFirst().get().getDepartmentName();
+                    } else {
+                        noRecord.department = "无";
+                    }
+                    noRecord.name = curUser.getName();
+                    noReportDataList.add(noRecord);
+                }
+            }
         }
-
+        //排序
+        noReportDataList.sort(new Comparator<UserDailyWorkItem>() {
+            @Override
+            public int compare(UserDailyWorkItem o1, UserDailyWorkItem o2) {
+                if (o1.department.compareTo(o2.department) > 0) {
+                    return -1;
+                } else if (o1.department.compareTo(o2.department) < 0) {
+                    return 1;
+                } else {
+                    if (o1.name.compareTo(o2.name) > 0) {
+                        return 1;
+                    } else if (o1.name.compareTo(o2.name) < 0) {
+                        return -1;
+                    } else {
+                        if (o1.createDate.compareTo(o2.createDate) > 0) {
+                            return 1;
+                        } else {
+                            return -1;
+                        }
+                    }
+                }
+            }
+        });
+        msg.data = noReportDataList;
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate) {
+        HttpRespMsg msg = getNoReportUserList(request, startDate, endDate);
+        String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
+        HashMap map = (HashMap) msg.data;
+        List<Integer> days = (List<Integer>)map.get("days");
+        List<UserDailyWorkItem> dailyWorkItems = (List<UserDailyWorkItem>) map.get("list");
+        List<List<String>> dataList = new ArrayList<>();
+        List<String> titleList = new ArrayList<>();
+        titleList.add("部门");
+        titleList.add("姓名");
+        titleList.add("未填日期");
+        for (int i=0;i<dailyWorkItems.size(); i++) {
+            UserDailyWorkItem dataItem = dailyWorkItems.get(i);
+            List<String> line = new ArrayList<>();
+            line.add(dataItem.department);
+            line.add(dataItem.name);
+            line.add(dataItem.createDate);
+            dataList.add(line);
+        }
+        //生成excel文件导出
+        String fileName = "人员每日工时统计_"+startDate+"至"+endDate+"_"+System.currentTimeMillis();
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        httpRespMsg.data = resp;
+        return httpRespMsg;
+    }
+
 }

+ 12 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -104,6 +104,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private ProjectBasecostSettingMapper projectBasecostSettingMapper;
     @Resource
     private TaskMapper taskMapper;
+    @Resource
+    private ProjectAuditorMapper projectAuditorMapper;
     //登录网页端
     @Override
     public HttpRespMsg loginAdmin(String username, String password) {
@@ -145,11 +147,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             LocalDateTime remainingTime = company.getExpirationDate() == null ? LocalDateTime.now() : company.getExpirationDate();
             userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
                     LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
-            //检测是否是项目经理,项目经理有审核功能权限
-            int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", userVO.getId()));
-            if (cnt > 0) {
-                userVO.setLeader(true);
-            }
+            //检测是否是项目审核人,有没有权限进行审核
+            userVO.setLeader(judgeIsLeader(userVO.getId()));
 
             userVO.setTimeType(timeTypeMapper.selectById(company.getId()));
             List<Department> manageDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", userVO.getId()));
@@ -166,6 +165,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return httpRespMsg;
     }
 
+    private boolean judgeIsLeader(String userId) {
+        int cnt = projectAuditorMapper.selectCount(new QueryWrapper<ProjectAuditor>().eq("auditor_id", userId));
+        return cnt>0;
+    }
+
     //登录PC端
     @Override
     public HttpRespMsg loginEmployee(String username, String password) {
@@ -953,11 +957,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 LocalDateTime remainingTime = company.getExpirationDate() == null ? LocalDateTime.now() : company.getExpirationDate();
                 userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
                         LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
-                //检测是否是项目经理,项目经理有审核功能权限
-                int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", userVO.getId()));
-                if (cnt > 0) {
-                    userVO.setLeader(true);
-                }
+                userVO.setLeader(judgeIsLeader(userVO.getId()));
                 respMsg.data = userVO;
             } else {
                 respMsg.setError(OpenidJSONO.getString("errcode") + ":" + OpenidJSONO.getString("errmsg"));
@@ -1288,10 +1288,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
                         LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
                 //检测是否是项目经理,项目经理有审核功能权限
-                int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", userVO.getId()));
-                if (cnt > 0) {
-                    userVO.setLeader(true);
-                }
+                userVO.setLeader(judgeIsLeader(userVO.getId()));
                 respMsg.data = userVO;
             } else {
                 respMsg.setError(OpenidJSONO.getString("errcode") + ":" + OpenidJSONO.getString("errmsg"));
@@ -1332,10 +1329,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
                 LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
         //检测是否是项目经理,项目经理有审核功能权限
-        int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", userVO.getId()));
-        if (cnt > 0) {
-            userVO.setLeader(true);
-        }
+        userVO.setLeader(judgeIsLeader(userVO.getId()));
         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());

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java

@@ -96,7 +96,7 @@ public class CodeGenerator {
 //        dsc.setSchemaName("public");
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
-        dsc.setPassword("Ziyu20141026!@");
+        dsc.setPassword("Ziyu20141026!@@");
         mpg.setDataSource(dsc);
 
         // 包配置

+ 23 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/FinanceFixedcolnameMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.FinanceFixedcolnameMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.FinanceFixedcolname">
+        <id column="company_id" property="companyId" />
+        <result column="month_cost" property="monthCost" />
+        <result column="bonus" property="bonus" />
+        <result column="allowance" property="allowance" />
+        <result column="insurance_old" property="insuranceOld" />
+        <result column="insurance_medical" property="insuranceMedical" />
+        <result column="insurance_losejob" property="insuranceLosejob" />
+        <result column="insurance_injury" property="insuranceInjury" />
+        <result column="house_fund" property="houseFund" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, month_cost, bonus, allowance, insurance_old, insurance_medical, insurance_losejob, insurance_injury, house_fund
+    </sql>
+
+</mapper>

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAuditorMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ProjectAuditorMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectAuditor">
+        <id column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="auditor_id" property="auditorId" />
+        <result column="auditor_name" property="auditorName" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_id, auditor_id, auditor_name
+    </sql>
+
+</mapper>

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

@@ -38,15 +38,14 @@
         <result column="project_audit_state" property="projectAuditState" />
         <result column="group_id" property="groupId" />
         <result column="custom_data" property="customData" />
+        <result column="project_auditor_id" property="projectAuditorId" />
     </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, audit_deptid, is_dept_audit, audit_dept_managerid, is_final_audit, project_audit_state, group_id, custom_data
+        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, group_id, custom_data, project_auditor_id
     </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,
@@ -54,6 +53,7 @@
         a.end_time as endTime, 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.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,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -61,6 +61,7 @@
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
         WHERE a.state = 1
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
@@ -83,6 +84,7 @@
         a.end_time as endTime, 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.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,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -90,6 +92,7 @@
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
         WHERE a.state = 1
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
@@ -109,6 +112,7 @@
         a.end_time as endTime, 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.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,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -116,6 +120,7 @@
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
         WHERE a.state = 1
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
@@ -135,6 +140,7 @@
         a.end_time as endTime, 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.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,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -142,6 +148,7 @@
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
         WHERE a.state = 1
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
@@ -168,6 +175,7 @@
         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,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId
         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
@@ -175,6 +183,7 @@
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join department on department.department_id = a.audit_deptid
         left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
         WHERE 1=1
         <if test="date != null and date != ''">
             AND a.create_date=#{date}
@@ -192,6 +201,7 @@
         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,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId
         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
@@ -199,6 +209,7 @@
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join department on department.department_id = a.audit_deptid
         left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
         WHERE 1=1
         <if test="date != null and date != ''">
             AND a.create_date=#{date}
@@ -219,6 +230,7 @@
         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,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId
         FROM report AS a
         left join user on user.id = a.creator_id
         JOIN project AS b ON a.project_id=b.id
@@ -227,6 +239,7 @@
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join department on department.department_id = a.audit_deptid
         left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
         WHERE a.company_id = #{companyId}
         and a.state = 0
         <if test="date != null and date != ''">
@@ -244,9 +257,9 @@
         <if test="projectId != null">
             AND a.project_id=#{projectId}
         </if>
-        <if test="inchargerId != null">
-            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 test="auditorId != null">
+            AND ((a.is_dept_audit = 0 and a.project_auditor_id = #{auditorId} and a.project_audit_state = 0)
+            or (a.is_dept_audit = 1 and a.audit_dept_managerid = #{auditorId}))
         </if>
         <if test="isEngeering == 1">
             AND a.department_audit_state = 1
@@ -269,6 +282,7 @@
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
         WHERE 1=1
         <if test="date != null and date != ''">
             AND a.create_date=#{date}
@@ -289,6 +303,7 @@
         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,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId
         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
@@ -296,6 +311,7 @@
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join department on department.department_id = a.audit_deptid
         left join task_group on task_group.id = a.group_id
+        left join user u on u.id = a.project_auditor_id
         WHERE 1=1
         <if test="date != null and date != ''">
             AND a.create_date=#{date}
@@ -320,7 +336,7 @@
             AND b.company_id=#{companyId}
         </if>
         <if test="leaderId != null and leaderId != ''">
-            AND a.project_id in (select id from project where incharger_id = #{leaderId})
+            AND a.project_auditor_id = #{leaderId}
         </if>
     </select>
 
@@ -347,23 +363,6 @@
         </if>
     </select>
 
-    <!--报告列表-->
-    <select id="getDetailByState" resultType="java.util.Map">
-        SELECT DISTINCT b.id, b.name, cast(b.department_id as SIGNED) as departmentId,a.create_date AS date
-        FROM report AS a
-        JOIN user AS b ON a.creator_id=b.id
-        WHERE a.state = #{state} AND b.company_id=#{companyId}
-        <if test="leaderId != null">
-            AND a.creator_id in (select user_id from participation where project_id in(select id from project where incharger_id = #{leaderId}))
-            AND a.project_id in (select id from project where incharger_id = #{leaderId})
-        </if>
-        <if test="isEngeering == 1">
-            AND a.department_audit_state = 1
-        </if>
-
-        ORDER BY a.create_date DESC
-    </select>
-
     <!--专业待审核的报告列表-->
     <select id="getDetailByStateInMyProfession" resultType="java.util.Map">
         SELECT DISTINCT b.id, b.name, cast(b.department_id as SIGNED) as departmentId,a.create_date AS date
@@ -488,4 +487,13 @@
         left join project on project.id = report.project_id
             where report.company_id = #{companyId} and report.create_date between #{startDate} and #{endDate}
     </select>
+
+    <delete id="deleteUserSameDayReport" >
+        delete from report where company_id = #{companyId}
+        and state &lt;&gt; 1 and (
+        <foreach collection="dateReportList" index="index" open="(" close=")" separator=" ) or (" item="item">
+            create_date = #{item.createDate} and creator_id = #{item.creatorId}
+        </foreach>
+        )
+    </delete>
 </mapper>

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

@@ -540,7 +540,6 @@
                             } else {
                                 this.downloadByA({name:'财务成本报表.xls', url:res.data});
                             }
-                            
                         }});
                
             },

+ 6 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -44,6 +44,12 @@
                     </div>
                     <div style="margin-top:10px;color:#999;">负责人</div>
                     <div><el-link style="margin:10px" @click="showUser(project.inchargerId)">{{project.inchargerName}}</el-link></div>
+                    <div style="margin-top:10px;color:#999;">日报审核人</div>
+                    <div>
+                        <span v-if="project.auditorList.length == 0" style="margin:10px;">-</span>
+                        <el-link v-for="item in project.auditorList" :key="item.id" style="margin:10px;" @click="showUser(item.auditorId)">{{item.auditorName}}</el-link>
+                    </div>
+                   
                     <div v-show="project.isPublic == 0" style="color:#999;">参与人</div>
                     <div v-show="project.isPublic == 0" >
                         <el-link v-for="item in project.participationList" :key="item.id" style="margin:10px;" @click="showUser(item.id)">{{item.name}}</el-link>

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

@@ -198,7 +198,12 @@
                     <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
                 </el-form-item>
                 <el-form-item label="负责人" >
-                    <el-select v-model="addForm.inchargerId" :disabled="(addForm.userId.length==0 ||  user.role==0) && addForm.isPublic == 0" filterable placeholder="请选择负责人" style="width:100%;" >
+                    <el-select v-model="addForm.inchargerId"  :disabled="(addForm.userId.length==0 ||  user.role==0) && addForm.isPublic == 0" filterable placeholder="请选择负责人" style="width:32%;" >
+                        <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="日报审核人" >
+                    <el-select v-model="addForm.auditUserIds" multiple="true" :disabled="addForm.userId.length==0 || (user.role==0&&user.id != addForm.inchargerId)" filterable placeholder="默认为项目负责人" style="width:100%;" >
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
@@ -1562,6 +1567,7 @@ a {
                     }
                     //获取项目的相关领导
                     this.getProjectNotifyUserList(item.id);
+                    this.getProjectAutorList(item.id);
                 }
                 this.addFormVisible = true;
                 if (this.user.company.packageEngineering == 1) {
@@ -1571,6 +1577,30 @@ a {
                 }
 
             },
+            //获取项目审核人
+            getProjectAutorList(projectId) {
+                this.http.post('/project-auditor/getList',{projectId: projectId},
+                        res => {
+                            if (res.code == "ok") {
+                               this.addForm.auditUserIds = res.data.map(function(item) {
+                                   return item.auditorId;
+                               });
+                            } else {
+                                this.$message({
+                                    message: res.msg,
+                                    type: "error"
+                                });
+                            }
+                        },
+                        error => {
+                            this.listLoading = false;
+                            this.$message({
+                                message: error,
+                                type: "error"
+                            });
+                            }
+                        );
+            },
 
             getProjectBaseData(projectId) {
                 this.http.post('/project-basecost/get',{projectId: projectId},
@@ -1721,6 +1751,8 @@ a {
                         formData.append("associateDegrees", listId)
                         formData.append("associateDegreeNames", listName)
                         formData.append("taskGpIncharge", this.addForm.taskGpIncharge)
+                        //日报审核人
+                        formData.append("auditUserIds", JSON.stringify(this.addForm.auditUserIds));
                         
                         this.http.uploadFile(this.port.project.add,formData,
                         res => {

+ 4 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -1276,17 +1276,13 @@
                         if(this.depForm.parentId != null) {
                             form.parentId = this.depForm.parentId
                         }
-                        if (this.depForm.managerId != null) {
+                        if (this.depForm.managerId) {
                             form.managerId = this.depForm.managerId
-                        } else {
-                            form.managerId = "null"
-                        }
+                        } 
                         console.log(this.depForm)
-                        if (this.depForm.reportAuditUserid != null && this.depForm.reportAuditUserid != "") {
+                        if (this.depForm.reportAuditUserid) {
                             form.reportAuditUserid = this.depForm.reportAuditUserid
-                        } else {
-                            form.reportAuditUserid = "null"
-                        }
+                        } 
                         this.http.post( this.depForm.id==null?this.port.manage.add:this.port.manage.edit, form,
                         res => {
                             if (res.code == "ok") {

+ 67 - 10
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -116,12 +116,11 @@
                                             <span style="margin-left:15px;color:#DAA520;"  v-if="item2.state == 0">[ 
                                                 <span v-if="item2.isDeptAudit==0">
                                                     <span v-if="item2.projectAuditState==0">
-                                                        待项目负责人审核
+                                                        待项目审核人<span v-if="item2.projectAuditorName != null">({{item2.projectAuditorName}})</span>审核
                                                     </span>
                                                     <span style="color:#32CD32;" v-else-if="item2.projectAuditState==1">
-                                                        项目负责人审核通过
+                                                        项目审核人<span v-if="item2.projectAuditorName != null">({{item2.projectAuditorName}})</span>审核通过
                                                     </span>
-                                                <!-- {{item2.isDeptAudit==0?(item2.projectAuditState==0?'待项目负责人审核':'项目负责人审核通过'):('待'+item2.auditDeptName+'审核')}} -->
                                                 </span>
                                                 <span v-else-if="item2.isDeptAudit==1">
                                                     {{('待'+item2.auditDeptName+'审核')}}
@@ -145,11 +144,11 @@
 
                                             <!--每个项目上单独审核 -->
                                             <span style="float:right;">
-                                                <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item2.inchargerId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="primary" :loading="logining" 
+                                                <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item2.projectAuditorId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="primary" :loading="logining" 
                                                 size="small" @click="approve(item1.id, item2)">通过</el-button>
-                                                <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item2.inchargerId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="danger" :loading="logining" 
+                                                <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item2.projectAuditorId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="danger" :loading="logining" 
                                                 size="small" @click="showDenyDialog(item1.id,0, item2)">驳回</el-button>
-                                                <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item2.inchargerId) && item2.state == 1" type="normal" :loading="logining" size="small" 
+                                                <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item2.projectAuditorId) && item2.state == 1" type="normal" :loading="logining" size="small" 
                                                 @click="showDenyDialog(item1.id,1, item2)">撤销</el-button>
                                                 <!--自己可以撤回待审核状态的报告 -->
                                                 <el-button v-if="user.id == item1.id && (item2.state == 0 || item2.state == -1)" type="normal" :loading="logining" size="small" @click="cancel(item1)">撤回</el-button>
@@ -303,6 +302,7 @@
                         </el-select>
                         <span  v-if="domain.subProjectList != null && domain.subProjectList.length> 0"
                             style="margin-left:45px;">子项目</span>
+
                         <!--子项目 -->
                         <el-select v-model="domain.subProjectId" placeholder="请选择子项目" style="width:200px;margin-left:10px;" clearable="true"
                             v-if="domain.subProjectList != null && domain.subProjectList.length> 0"
@@ -317,6 +317,12 @@
                         <el-link type="primary" v-if="workForm.domains[index].state == 0 || workForm.domains[index].state == 2"
                             :underline="false" style="margin-left:10px;" @click="copyProject(index)">复制</el-link>
                     </el-form-item>
+                    
+                    <el-form-item label="项目审核人" >
+                        <el-select v-model="domain.projectAuditorId" :disabled="!canEdit" @change="$forceUpdate()">
+                            <el-option v-for="item in domain.auditUserList" :label="item.auditorName" :value="item.auditorId" :key="item.id"></el-option>
+                        </el-select>
+                    </el-form-item>
                     <el-form-item label="任务分组" v-if="user.company.packageProject == 1">
                         <!-- 任务分组 -->
                         <el-select v-model="domain.groupId" placeholder="请选择任务分组" style="width:200px;" clearable="true" 
@@ -335,14 +341,14 @@
                     </el-form-item>
                     <!-- 相关维度 -->
                     <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1">
-                        <el-select v-model="domain.degreeId" clearable placeholder="请选择">
+                        <el-select v-model="domain.degreeId" clearable placeholder="请选择" :disabled="!canEdit">
                             <el-option v-for="item in domain.wuduList" :key="item.value" :label="item.name" :value="item.id">
                             </el-option>
                         </el-select>
                     </el-form-item>
                     <!-- 相关数值 -->
                     <el-form-item :label="yonghuUser.customDataName" v-if="domain.projectId && yonghuUser.customDataActive == 1">
-                        <el-input-number :id="'numberData_'+index" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
+                        <el-input-number :id="'numberData_'+index" :disabled="!canEdit" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
                     </el-form-item>
 
                     <el-form-item v-if="reportTimeType.type == 3" label="用时占比" :prop="'domains.' + index + '.'+timeFields[reportTimeType.type]"
@@ -399,6 +405,11 @@
                             <el-link type="primary" v-if="workForm.domains[index].state == 0 || workForm.domains[index].state == 2"
                                 :underline="false" style="margin-left:10px;" @click="copyProject(index)">复制</el-link>
                         </el-form-item>
+                        <el-form-item label="项目审核人" >
+                            <el-select v-model="domain.projectAuditorId" :disabled="!canEdit" @change="$forceUpdate()">
+                                <el-option v-for="item in domain.auditUserList" :label="item.auditorName" :value="item.auditorId" :key="item.id"></el-option>
+                            </el-select>
+                        </el-form-item>
                         <el-form-item label="任务分组" v-if="user.company.packageProject == 1">
                             <!-- 任务分组 -->
                             <el-select v-model="domain.groupId" placeholder="请选择任务分组" style="width:200px;" clearable="true" 
@@ -1048,6 +1059,8 @@
                     inpu.value = parseFloat(inpu.value);
                 }
             },
+            
+            
             //获取项目下的任务分组
             getTaskGroups(domain, index) {
                 this.workForm.domains[index].groupId=null;
@@ -1720,6 +1733,38 @@
                 this.dimension(domain, index);
                 //获取项目下的任务分组
                 this.getTaskGroups(domain, index);
+                //获取项目审核人
+                this.getProjectAuditorList(domain, index);
+            },
+
+            //获取项目审核人
+            getProjectAuditorList(domainItem, index) {
+                if(domainItem.projectId == '') {
+                    return
+                }
+                domainItem.projectAuditorId = null;
+                domainItem.projectAuditorName = null;
+
+                this.http.post('/project-auditor/getList',{ 
+                    projectId: domainItem.projectId,
+                },
+                res => {
+                    if (res.code == "ok") {
+                        domainItem.auditUserList = res.data
+                        if (res.data.length==1) {
+                            domainItem.projectAuditorId = domainItem.auditUserList[0].auditorId;
+                            domainItem.projectAuditorName = domainItem.auditUserList[0].auditorName;
+                        }
+                        this.$forceUpdate();
+                    } 
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                    }
+                );
             },
             
             // 获取维度数据
@@ -1937,7 +1982,7 @@
                     for (var j=0;j<report.data.length; j++) {
                         if (report.data[j].state == 0 
                             && (this.user.company.packageEngineering==0 || (this.user.company.packageEngineering==1 && report.data[j].departmentAuditState == 1))
-                            && (this.user.role == 1 || this.user.role == 2 || report.data[j].inchargerId == this.user.id)) {
+                            && (this.user.role == 1 || this.user.role == 2 || report.data[j].projectAuditorId == this.user.id)) {
                             hasUnChecked = true;
                             id += report.data[j].id+',';
                         }
@@ -2551,6 +2596,9 @@
                                     wuduList: list.report[i].degreeList,
                                     taskGroups:list.report[i].taskGroups,
                                     customData: list.report[i].customData,//自定义的数值
+                                    auditUserList: list.report[i].auditUserList,
+                                    projectAuditorId: list.report[i].projectAuditorId,
+                                    projectAuditorName: list.report[i].projectAuditorName,
                                 })
                                 if (list.report[i].state >= 2) {
                                     this.canEdit = true;
@@ -3565,6 +3613,15 @@
                             } else {
                                 formData.append("stage", "-");
                             }
+                            if (this.workForm.domains[i].projectAuditorId) {
+                                formData.append("projectAuditorId", this.workForm.domains[i].projectAuditorId);
+                            } else {
+                                this.$message({
+                                    message: "请指定项目审核人",
+                                    type: "error"
+                                });
+                                return;
+                            }
                         }
                         this.submitingReport = true;
                         this.http.uploadFile( this.port.report.editPort, formData,
@@ -3748,7 +3805,7 @@
             this.getTimeType();
             this.getDepartment();
             this.scrollFunction()
-            this.userssHu()
+            this.userssHu();
         }
     };
 </script>

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

@@ -57,10 +57,10 @@
                                 <span style="margin-left:15px;color:#DAA520;" >[ 
                                                 <span v-if="item.isDeptAudit==0">
                                                     <span v-if="item.projectAuditState==0">
-                                                        待项目负责人审核
+                                                        待项目审核人<span v-if="item.projectAuditorName != null">({{item.projectAuditorName}})</span>审核
                                                     </span>
                                                     <span style="color:#32CD32;" v-else-if="item.projectAuditState==1">
-                                                        项目负责人审核通过
+                                                        项目审核人<span v-if="item.projectAuditorName != null">({{item.projectAuditorName}})</span>审核通过
                                                     </span>
                                                 </span>
                                                 <span v-else-if="item.isDeptAudit==1">
@@ -134,7 +134,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;">{{scope.row.isDeptAudit==0?'待项目负责人审核':('待'+scope.row.auditDeptName+'审核')}}</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>

+ 9 - 19
fhKeeper/formulahousekeeper/timesheet_h5/src/views/audit/audit.vue

@@ -4,14 +4,13 @@
         <div style="height: 46px"></div>
         <div class="lis" v-for="item in list" :key="item.id">
             <div class="lis_til">
-                <p>{{item.name}}</p>
+                <p>{{item.name}}<span style="margin-left:30px;">{{item.date}}</span></p>
                 <p style="color: #C03131">待审核</p>
             </div>
-            <div class="lis_con" v-for="items in item.data" :key="items.id">
-                <div>工作日期: {{item.dateStr}}</div>
-                <div>项目: {{items.project}}</div>
-                <div v-if="items.subProjectName">子项目: {{items.subProjectName}}</div>
-                <div>工作时长: {{items.time}}h</div>
+            <div class="lis_con">
+                <div>项目: {{item.project}}</div>
+                <div v-if="item.subProjectName">子项目: {{item.subProjectName}}</div>
+                <div>工作时长: {{item.time}}h</div>
             </div>
             <div class="lis_boot">
                 <div style="background: #1989FA" @click="approve(item, item.id)">通过</div>
@@ -77,11 +76,8 @@ export default {
                 forbidClick: true,
                 duration: 0
             });
-            var ids = '';
-            var data = item.data;
-            data.forEach(element => {
-                ids +=(element.id+',');
-            });
+            var ids = id;
+            
             this.$axios.get('/report/approve', {params:{id: id, reportIds: ids}})
             .then(res => {
                 this.obtain()
@@ -95,14 +91,8 @@ export default {
         // 驳回
         showDenyDialog(item) {
             this.denyReasonDialog = true
-            var ids = '';
-            var data = item.data;
-            data.forEach(element => {
-                if (element.id != null && element.id != '') {
-                    ids +=(element.id+',');
-                }
-            });
-            this.denyForm = {id: item.id ,i:0, date: item.dateStr, reportIds: ids, reason:null};
+            var ids = item.id;
+            this.denyForm = {id: item.id ,i:0, date: item.date, reportIds: ids, reason:null};
         },
         // 驳回提交
         deny() {

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

@@ -33,6 +33,14 @@
                     <van-field  readonly  name="projectId" clickable :value="item.projectName" label="投入项目" placeholder="请选择投入项目" @click="clickPicker(index, item)"
                     :rules="[{ required: true, message: '请选择项目' }]" />
 
+                    <van-field  readonly  name="projectAuditorId" v-if="item.auditUserList != null && item.auditUserList.length > 0" clickable
+                        :value="item.projectAuditorName" label="项目审核人" placeholder="请选择审核人" 
+                    @click="clickPickAuditor(index, item)" />
+                    <van-popup v-model="item.showPickerAuditor" position="bottom">
+                        <van-picker show-toolbar :columns="item.auditUserList" value-key="auditorName" @confirm="choseAuditor" 
+                            @cancel="item.showPickerAuditor = false;$forceUpdate();" />
+                    </van-popup>
+
                     <van-field  readonly  name="subProjectId" v-if="item.subProjectList != null && item.subProjectList.length > 0" clickable 
                         :value="item.subProjectName" label="子项目" placeholder="请选择子项目" 
                     @click="clickPickSubProject(index, item)" />
@@ -359,6 +367,23 @@
         },
 
         methods: {
+            //获取项目审核人
+            getProjectAuditorList(domainItem) {
+                this.$axios.post("/project-auditor/getList", {projectId: domainItem.projectId})
+                .then(res => {
+                    if(res.code == "ok") {
+                        domainItem.auditUserList = res.data;
+                        if (res.data.length==1) {
+                            domainItem.projectAuditorId = domainItem.auditUserList[0].auditorId;
+                            domainItem.projectAuditorName = domainItem.auditUserList[0].auditorName;
+                        }
+                        this.$forceUpdate();
+                    } else {
+                        this.$toast.fail('获取失败:'+res.msg);
+                    }
+                }).catch(err=> {toast.clear();});
+            },
+
             updateTxt() {
                 this.$forceUpdate();
             },
@@ -417,6 +442,11 @@
                 // 获取1相关维度
                 this.getTaskList(domainItem.projectId)
 
+                //获取相关日报提交选择人
+                domainItem.projectAuditorId = null;
+                domainItem.projectAuditorName = null;
+                domainItem.auditUserList = null;
+                this.getProjectAuditorList(domainItem);
             },
             //获取项目下的任务分组
             getTaskGroups(domainItem, index) {
@@ -827,6 +857,9 @@
                                     stages:list[i].stages,
                                     stage:list[i].stage == '-'?null:list[i].stage,
                                     customData: list[i].customData,
+                                    projectAuditorId: list[i].projectAuditorId,
+                                    projectAuditorName: list[i].projectAuditorName,
+                                    auditUserList: list[i].auditUserList,
                                 })
                                 if (list[i].state >= 2) {
                                     this.canEdit = true;
@@ -875,6 +908,22 @@
                 this.getReport();
             },
 
+            //点击选择审核人
+            clickPickAuditor(i, item) {
+                if (!this.canEdit) return;
+                if (item.auditUserList.length<=1) return;
+                this.clickIndex = i;
+                item.showPickerAuditor = true;
+                this.$forceUpdate();
+            },
+
+            choseAuditor(value, index) {
+                this.form.domains[this.clickIndex].projectAuditorId = value.auditorId;
+                this.form.domains[this.clickIndex].projectAuditorName = value.auditorName;
+                this.form.domains[this.clickIndex].showPickerAuditor = false;
+                this.$forceUpdate();
+            },
+
             //点击选择子项目
             clickPickSubProject(i, item) {
                 if (!this.canEdit) return;
@@ -948,14 +997,6 @@
                 this.form.domains[this.clickIndex].subProjectName = value.name;
                 this.form.domains[this.clickIndex].showPickerSubProject = false;
                 this.$forceUpdate();
-
-                // this.getTaskList(value.id);
-                // this.dimension(value.id) // 获取维度
-                
-                // //加载项目相关的工程进度
-                // if (this.user.company.packageEngineering == 1) {
-                //     this.getProjectProfessions(this.form.domains[this.clickIndex], index);
-                // }
             },
 
             choseTaskGroup(value, index) {
@@ -1294,15 +1335,23 @@
                             formData.append("content", '-');
                         }
                     }
+
+                    //审核人
+                    if (this.form.domains[i].projectAuditorId) {
+                        formData.append("projectAuditorId", this.form.domains[i].projectAuditorId);
+                    } else {
+                        this.$toast.fail("请指定["+this.form.domains[i].projectName+']项目的审核人');
+                        return;
+                    }
                 }
+                
+
                 this.$axios.post("/report/editReport", formData)
                 .then(res => {
                     if(res.code == "ok") {
                         toast.clear();
                         this.$toast.success(this.isDraft==0?'提交成功':'暂存成功');
-                        if (this.isDraft==0) {
-                            this.$router.push("/index");
-                        }
+                        this.$router.push("/index");
                     } else {
                         toast.clear();
                         this.$toast.fail((this.isDraft==0?'提交失败':'暂存失败')+':'+res.msg);

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

@@ -24,10 +24,10 @@
                             [
                             <span v-if="item1.isDeptAudit==0">
                                 <span v-if="item1.projectAuditState==0">
-                                    待项目负责人审核
+                                    待项目审核人<span v-if="item1.projectAuditorName != null">({{item1.projectAuditorName}})</span>审核
                                 </span>
                                 <span style="color:#32CD32;" v-else-if="item1.projectAuditState==1">
-                                    项目负责人审核通过
+                                    项目审核人<span v-if="item1.projectAuditorName != null">({{item1.projectAuditorName}})</span>审核通过
                                 </span>
                             </span>
                             <span v-else-if="item1.isDeptAudit==1">

+ 2 - 5
fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

@@ -13,22 +13,19 @@
                 <van-panel class="one_report" :title="item.name" :status="statusTxt[item.state]">
                     <div class="form_text">
                         <span style="margin-right:20px;margin-left:5px;font-size:14px;">
-                            <!-- <i v-if="parseFloat(item.reportTime)>parseFloat(item.calculateTime)+0.5" 
-                                style="color:red;margin-right:8px;" class="fa fa-exclamation-triangle"></i> -->
                             总填报:
                             <span>{{parseFloat(item.reportTime).toFixed(1)}}h</span>
                         </span>
-                        <!-- <span>系统智能统计:{{item.calculateTime}}h</span> -->
                     </div>
                     <div v-for="(item1,index1) in item.data" class="one_report_data" :key="index1">
                         <div class="project_title" style="font-weight:bold;">项目:{{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 v-if="item1.projectAuditorName != null">({{item1.projectAuditorName}})</span>审核
                                 </span>
                                 <span style="color:#32CD32;" v-else-if="item1.projectAuditState==1">
-                                    项目负责人审核通过
+                                    项目审核人<span v-if="item1.projectAuditorName != null">({{item1.projectAuditorName}})</span>审核通过
                                 </span>
                             </span>
                             <span v-else-if="item1.isDeptAudit==1">