Ver código fonte

增加工时填报页面的组织结构删选,增加批量审核功能

seyason 4 anos atrás
pai
commit
e7230e33a9
34 arquivos alterados com 1332 adições e 219 exclusões
  1. 12 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 22 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  3. 45 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TimeTypeController.java
  4. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  5. 14 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  6. 15 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  7. 56 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  8. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  9. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/DepartmentVO.java
  10. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProjectVO.java
  11. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TimeTypeMapper.java
  13. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  14. 6 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TimeTypeService.java
  16. 88 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  17. 156 46
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  18. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TimeTypeServiceImpl.java
  19. 21 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  20. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java
  21. 17 17
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java
  22. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-prod.yml
  23. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  24. 6 5
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  25. 54 13
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  26. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  27. 2 0
      fhKeeper/formulahousekeeper/mywork/mainwindow.cpp
  28. 20 7
      fhKeeper/formulahousekeeper/mywork/mainwindow.ui
  29. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/port.js
  30. 29 13
      fhKeeper/formulahousekeeper/timesheet/src/routes.js
  31. 1 5
      fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue
  32. 35 7
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  33. 99 7
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  34. 535 60
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

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

@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 
 /**
@@ -23,7 +24,7 @@ import javax.servlet.http.HttpServletRequest;
 public class ProjectController {
     @Autowired
     private ProjectService projectService;
-    @Autowired
+    @Resource
     private HttpServletRequest request;
 
     /**
@@ -51,8 +52,8 @@ public class ProjectController {
      * userId 用户id数组
      */
     @RequestMapping("/editProject")
-    public HttpRespMsg editProject(Integer id, @RequestParam String name, String[] userId) {
-        return projectService.editProject(id, name, userId, request);
+    public HttpRespMsg editProject(Integer id, @RequestParam String name, String code,  String[] userId, String inchargerId) {
+        return projectService.editProject(id, name, code, userId, inchargerId, request);
     }
 
     /**
@@ -72,6 +73,14 @@ public class ProjectController {
         return projectService.getTimeCost(request);
     }
 
+    /**
+     * 导出查询者所在公司每个项目的工时成本
+     */
+    @RequestMapping("/exportTimeCost")
+    public HttpRespMsg exportTimeCost() {
+        return projectService.exportTimeCost(request);
+    }
+
     /**
      * 获取某个项目每个人分别需要的工时
      * id 项目id

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

@@ -9,10 +9,13 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -28,7 +31,7 @@ import java.util.List;
 public class ReportController {
     @Autowired
     private ReportService reportService;
-    @Autowired
+    @Resource
     private HttpServletRequest request;
 
     /**
@@ -36,8 +39,8 @@ public class ReportController {
      * date 日期 格式yyyy-mm-dd
      */
     @RequestMapping("/getReportList")
-    public HttpRespMsg getReportList(@RequestParam String date) {
-        return reportService.getReportList(date, request);
+    public HttpRespMsg getReportList(@RequestParam String date, @RequestParam(required = false) Integer deptId, @RequestParam(required = false) String userId) {
+        return reportService.getReportList(date, deptId, userId, request);
     }
 
     /**
@@ -69,6 +72,7 @@ public class ReportController {
      */
     @RequestMapping("/editReport")
     public HttpRespMsg editReport(Integer[] id, Integer[] projectId, Double[] workingTime, String[] content,
+                                  Integer[] timeType,
                                   String[] createDate) {
         List<Report> reportList = new ArrayList<>();
         try {
@@ -77,6 +81,7 @@ public class ReportController {
                         .setId(id[i] == -1 ? null : id[i])
                         .setProjectId(projectId[i])
                         .setWorkingTime(workingTime[i])
+                        .setTimeType(timeType[i])
                         .setContent(content[i])
                         .setState(0)
                         .setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")))
@@ -151,5 +156,19 @@ public class ReportController {
     public HttpRespMsg singleDenyReport(@RequestParam Integer id, HttpServletRequest request) {
         return reportService.singleDenyReport(id, request);
     }
+
+    @RequestMapping("/getMembList")
+    public HttpRespMsg getMembList(@RequestParam(required=false) String date,  HttpServletRequest request) {
+        if (date == null) {
+            //默认获取今天的
+            date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+        }
+        return reportService.getMembList(date, request);
+    }
+
+    @RequestMapping("/batchApproveReport")
+    public HttpRespMsg batchApproveReport(@RequestParam String ids, @RequestParam String date, HttpServletRequest request) {
+        return reportService.batchApproveReport(ids, date, request);
+    }
 }
 

+ 45 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TimeTypeController.java

@@ -0,0 +1,45 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.TimeType;
+import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.service.TimeTypeService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-02-07
+ */
+@RestController
+@RequestMapping("/time-type")
+public class TimeTypeController {
+    @Resource
+    TimeTypeService timeTypeService;
+
+    @RequestMapping("/getCompanyTimeSetting")
+    public HttpRespMsg get(Integer companyId) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        httpRespMsg.data = timeTypeService.getById(companyId);
+        return httpRespMsg;
+    }
+
+    @RequestMapping("save")
+    public HttpRespMsg save(TimeType record) {
+        Boolean success = timeTypeService.updateById(record);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        if (!success) {
+            httpRespMsg.setError("保存失败");
+        }
+        return httpRespMsg;
+    }
+}
+

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

@@ -134,5 +134,7 @@ public class UserController {
     public HttpRespMsg switchPermission(@RequestParam String id) {
         return userService.switchPermission(id, request);
     }
+
+
 }
 

+ 14 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -14,8 +14,8 @@ import lombok.experimental.Accessors;
  * 
  * </p>
  *
- * @author 吴涛涛
- * @since 2020-01-13
+ * @author Seyason
+ * @since 2021-02-05
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -42,6 +42,18 @@ public class Project extends Model<Project> {
     @TableField("company_id")
     private Integer companyId;
 
+    /**
+     * 项目编码
+     */
+    @TableField("project_code")
+    private String projectCode;
+
+    /**
+     * 负责人id
+     */
+    @TableField("incharger_id")
+    private String inchargerId;
+
 
     @Override
     protected Serializable pkVal() {

+ 15 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java

@@ -1,31 +1,30 @@
 package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
-import java.io.Serializable;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-
 /**
  * <p>
- *
+ * 
  * </p>
  *
- * @author 吴涛涛
- * @since 2020-02-17
+ * @author Seyason
+ * @since 2021-02-07
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 public class Report extends Model<Report> {
 
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID=1L;
 
     /**
      * 主键
@@ -75,6 +74,12 @@ public class Report extends Model<Report> {
     @TableField("create_time")
     private LocalDateTime createTime;
 
+    /**
+     * 0-全天, 1-上午,2-下午
+     */
+    @TableField("time_type")
+    private Integer timeType;
+
 
     @Override
     protected Serializable pkVal() {

+ 56 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -0,0 +1,56 @@
+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 2021-02-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class TimeType extends Model<TimeType> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 公司id
+     */
+    @TableId("company_id")
+    private Integer companyId;
+
+    /**
+     * 全天时长
+     */
+    @TableField("allday")
+    private Integer allday;
+
+    /**
+     * 上午时长
+     */
+    @TableField("am")
+    private Integer am;
+
+    /**
+     * 下午时长
+     */
+    @TableField("pm")
+    private Integer pm;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.companyId;
+    }
+
+}

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

@@ -99,4 +99,7 @@ public class User extends Model<User> {
         return this.id;
     }
 
+    @TableField(exist = false)
+    private String departmentName;
+
 }

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

@@ -1,9 +1,11 @@
 package com.management.platform.entity.vo;
 
+import com.management.platform.entity.User;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.util.HashMap;
 import java.util.List;
 
 @Data
@@ -14,4 +16,5 @@ public class DepartmentVO {
     private String label;
     private Integer parentId;
     private List<DepartmentVO> children;
+    private List<HashMap> userList;
 }

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

@@ -13,4 +13,6 @@ import java.util.Map;
 @Accessors(chain = true)
 public class ProjectVO extends Project {
     List<Map<String, Object>> participator;
+    String inchargerName;
+    String inchargerPhone;
 }

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

@@ -16,12 +16,16 @@ import java.util.Map;
  * @since 2019-12-31
  */
 public interface ReportMapper extends BaseMapper<Report> {
-    List<Map<String, Object>> getAllReportByDate(@Param("date") String date);
+    List<Map<String, Object>> getAllReportByDate(@Param("date") String date, @Param("companyId") Integer companyId, @Param("userId") String userId);
 
     List<Map<String, Object>> getReportByDate(@Param("date") String date, @Param("id") String id);
 
+    List<Map<String, Object>> getUserReportByDate(@Param("date") String date, @Param("userIds") List<String> userIds);
+
     List<Map<String, Object>> getReportNameByDate(@Param("date") String date, @Param("companyId") Integer companyId);
 
+    List<Map<String, Object>> getReportNameByDateAndDept(@Param("date") String date, @Param("deptIds") List<Integer> deptIds, @Param("userId") String userId);
+
     List<Map<String, Object>> getDetailByState(@Param("state") Integer state,
                                                @Param("companyId") Integer companyId);
 }

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.TimeType;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-02-07
+ */
+public interface TimeTypeMapper extends BaseMapper<TimeType> {
+
+}

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

@@ -19,11 +19,13 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg getProjectPage(Integer pageIndex, Integer pageSize, HttpServletRequest request);
 
-    HttpRespMsg editProject(Integer id, String name, String[] userIds, HttpServletRequest request);
+    HttpRespMsg editProject(Integer id, String name, String code, String[] userIds, String inchargerId, HttpServletRequest request);
 
     HttpRespMsg deleteProject(Integer id);
 
     HttpRespMsg getTimeCost(HttpServletRequest request);
 
     HttpRespMsg getProjectCost(Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg exportTimeCost(HttpServletRequest request);
 }

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

@@ -3,6 +3,7 @@ package com.management.platform.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.Report;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
@@ -16,7 +17,7 @@ import java.util.List;
  * @since 2019-12-31
  */
 public interface ReportService extends IService<Report> {
-    HttpRespMsg getReportList(String date, HttpServletRequest request);
+    HttpRespMsg getReportList(String date, Integer deptId, String userId, HttpServletRequest request);
 
     HttpRespMsg exportReport(String date, HttpServletRequest request);
 
@@ -35,4 +36,8 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg singleApproveReport(Integer id, HttpServletRequest request);
 
     HttpRespMsg singleDenyReport(Integer id, HttpServletRequest request);
+
+    HttpRespMsg getMembList(String date, HttpServletRequest request);
+
+    HttpRespMsg batchApproveReport(String ids, String date, HttpServletRequest request);
 }

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

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.TimeType;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-02-07
+ */
+public interface TimeTypeService extends IService<TimeType> {
+
+}

+ 88 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.Participation;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.Report;
+import com.management.platform.entity.User;
 import com.management.platform.entity.vo.ProjectVO;
 import com.management.platform.mapper.ParticipationMapper;
 import com.management.platform.mapper.ProjectMapper;
@@ -14,16 +15,18 @@ import com.management.platform.mapper.ReportMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProjectService;
 import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ExcelUtil;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+
 
 /**
  * <p>
@@ -43,7 +46,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     private ReportMapper reportMapper;
     @Resource
     private ParticipationMapper participationMapper;
+    @Resource
+    private HttpServletResponse response;
 
+    @Value(value = "${upload.path}")
+    private String path;
     //获取项目列表
     @Override
     public HttpRespMsg getProjectList(HttpServletRequest request) {
@@ -71,11 +78,19 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             IPage<Project> projectIPage = projectMapper.selectPage(new Page<>(pageIndex, pageSize),
                     new QueryWrapper<Project>().eq("company_id", companyId));
             List<Project> projectList = projectIPage.getRecords();
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             List<ProjectVO> list = new ArrayList<>();
             for (Project project : projectList) {
                 ProjectVO projectVO = new ProjectVO();
                 BeanUtils.copyProperties(project, projectVO);
                 projectVO.setParticipator(participationMapper.getParticipator(projectVO.getId()));
+                Optional<User> first = userList.stream().filter(u -> u.getId().equals(project.getInchargerId())).findFirst();
+                if (first.isPresent()) {
+                    User incharger = first.get();
+                    projectVO.setInchargerName(incharger.getName());
+                    projectVO.setInchargerPhone(incharger.getPhone());
+                }
+
                 list.add(projectVO);
             }
             Long total = projectIPage.getTotal();
@@ -92,7 +107,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     //添加或编辑项目
     @Override
-    public HttpRespMsg editProject(Integer id, String name, String[] userIds, HttpServletRequest request) {
+    public HttpRespMsg editProject(Integer id, String name, String code, String[] userIds, String inchargerId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
@@ -101,7 +116,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (name == null) {
                     httpRespMsg.setError("请填写项目名称");
                 } else {
-                    Project project = new Project().setProjectName(name).setCompanyId(companyId);
+                    Project project = new Project().setProjectName(name).setCompanyId(companyId).setProjectCode(code).setInchargerId(inchargerId);
                     if (projectMapper.insert(project) == 0) {
                         httpRespMsg.setError("操作失败");
                     }
@@ -109,7 +124,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
             } else {
                 //修改项目
-                if (projectMapper.updateById(new Project().setProjectName(name).setId(id).setCompanyId(companyId)) == 0) {
+                if (projectMapper.updateById(new Project().setProjectName(name).setId(id).setCompanyId(companyId).setProjectCode(code).setInchargerId(inchargerId)) == 0) {
                     httpRespMsg.setError("操作失败");
                 }
             }
@@ -168,6 +183,72 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    //导出查询者所在公司每个项目的工时成本,包括项目人员明细统计
+    @Override
+    public HttpRespMsg exportTimeCost(HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        try {
+            Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+            Map<String, Object> resultMap = new HashMap<>();
+            List<Map<String, Object>> list = projectMapper.getTimeCost(companyId);
+            BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+            List<String> headList = new ArrayList<String>();
+            headList.add("项目");
+            headList.add("人员");
+            headList.add("时间(h)");
+            headList.add("成本(元)");
+            List<List<String>> allList = new ArrayList<List<String>>();
+            allList.add(headList);
+            double totalCostTime = 0;
+            for (Map<String, Object> map : list) {
+                if (!map.containsKey("cost")) {
+                    map.put("cost", 0);
+                }
+                if (!map.containsKey("costMoney")) {
+                    map.put("costMoney", 0);
+                } else {
+                    totalMoneyCost = totalMoneyCost.add(BigDecimal.valueOf((Double) map.get("costMoney")));
+                }
+                totalCostTime += (Double)map.get("cost");
+                List<String> rowData = new ArrayList<String>();
+                rowData.add((String)map.get("project"));
+                rowData.add("");
+                rowData.add(((Double)map.get("cost")).toString());
+                rowData.add(((Double)map.get("costMoney")).toString());
+                allList.add(rowData);
+                //统计每个项目中的人员时间成本投入
+                int projectId = (Integer)map.get("id");
+                List<Map<String, Object>> membList = projectMapper.getProjectCost(projectId);
+                map.put("membList", membList);
+                for (Map<String, Object> membMap : membList) {
+                    List<String> membRowData = new ArrayList<String>();
+                    membRowData.add("");
+                    membRowData.add((String)membMap.get("name"));
+                    membRowData.add(((Double)membMap.get("cost")).toString());
+                    membRowData.add(((Double)membMap.get("costMoney")).toString());
+                    allList.add(membRowData);
+                }
+            }
+            String total = totalMoneyCost.toString();
+            //合计
+            List<String> sumRow = new ArrayList<String>();
+            sumRow.add("合计");
+            sumRow.add("");
+            sumRow.add(""+totalCostTime);
+            sumRow.add(totalMoneyCost.toString());
+            allList.add(sumRow);
+            //生成excel文件导出
+            String fileName = "项目成本统计_"+System.currentTimeMillis();
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+
+            httpRespMsg.data = resp;
+        } catch (NullPointerException e) {
+            httpRespMsg.setError("验证失败");
+            return httpRespMsg;
+        }
+        return httpRespMsg;
+    }
+
     //获取某个项目每个人分别需要的工时
     @Override
     public HttpRespMsg getProjectCost(Integer projectId, HttpServletRequest request) {

+ 156 - 46
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -3,9 +3,12 @@ package com.management.platform.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
+import com.management.platform.entity.vo.DepartmentVO;
 import com.management.platform.mapper.*;
+import com.management.platform.service.DepartmentService;
 import com.management.platform.service.ReportService;
 import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
 import org.apache.poi.hssf.usermodel.*;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -21,6 +24,7 @@ import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -44,12 +48,17 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private InformationMapper informationMapper;
 
+    @Resource
+    private DepartmentService departmentService;
+    @Resource
+    private DepartmentMapper departmentMapper;
+
     @Value(value = "${upload.path}")
     private String path;
 
     //获取报告列表
     @Override
-    public HttpRespMsg getReportList(String date, HttpServletRequest request) {
+    public HttpRespMsg getReportList(String date,  Integer deptId, String targetUid, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             //首先根据日期获取当天所有提交过日志的人
@@ -73,56 +82,83 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     DecimalFormat df = new DecimalFormat("0.00");
                     map.put("reportTime", df.format(reportTime));
                     //顺便再获取一下可分配时间
-                    Integer calculateTime = 0;
-                    //以下区间被认为是工作时间
-                    Integer[] workType = {-1, 0, 1, 2, 3, 4, 5};
-                    //工作时间筛选
-                    List<TimeCalculation> timeCalculations = timeCalculationMapper.selectList(new QueryWrapper<TimeCalculation>()
-                            .eq("date", LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")))
-                            .eq("user_id", userId)
-                            .in("action_type", workType));
-                    if (timeCalculations != null) {
-                        for (TimeCalculation timeCalculation : timeCalculations) {
-                            calculateTime += timeCalculation.getDuration();
-                        }
-                    }
-                    //把总秒数转为double后换算为小时并保留两位小数
-                    map.put("calculateTime", df.format((double) calculateTime / 3600));
+//                    Integer calculateTime = 0;
+//                    //以下区间被认为是工作时间
+//                    Integer[] workType = {-1, 0, 1, 2, 3, 4, 5};
+//                    //工作时间筛选
+//                    List<TimeCalculation> timeCalculations = timeCalculationMapper.selectList(new QueryWrapper<TimeCalculation>()
+//                            .eq("date", LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")))
+//                            .eq("user_id", userId)
+//                            .in("action_type", workType));
+//                    if (timeCalculations != null) {
+//                        for (TimeCalculation timeCalculation : timeCalculations) {
+//                            calculateTime += timeCalculation.getDuration();
+//                        }
+//                    }
+//                    //把总秒数转为double后换算为小时并保留两位小数
+//                    map.put("calculateTime", df.format((double) calculateTime / 3600));
                     map.put("state", list.get(0).get("state"));
                 }
             } else {
-                nameList = reportMapper.getReportNameByDate(date,
-                        userMapper.selectById(request.getHeader("Token")).getCompanyId());
-                for (Map<String, Object> map : nameList) {
-                    //再根据人分别获取当天的报告
-                    List<Map<String, Object>> list = reportMapper.getReportByDate(date, (String) map.get("id"));
-                    map.put("data", list);
-                    double reportTime = 0;
-                    if (list.size() > 0) {
-                        for (Map<String, Object> m : list) {
-                            double t = (double) m.get("time");
-                            reportTime += t;
-                        }
-                        map.put("state", list.get(0).get("state"));
+                Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+                List<Integer> ids = null;
+                if (deptId != null) {
+                    //找到该部门的所有子部门
+                    List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                    Optional<Department> first = allDepts.stream().filter(d -> d.getDepartmentId().equals(deptId)).findFirst();
+                    if (first.isPresent()) {
+                        Department department = first.get();
+                        //递归获取全部子部门
+                        List<Department> deptList = getSubDepts(department, allDepts);
+                        deptList.add(department);
+                        ids = deptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
                     }
-                    DecimalFormat df = new DecimalFormat("0.00");
-                    map.put("reportTime", df.format(reportTime));
-                    //顺便再获取一下可分配时间
-                    Integer calculateTime = 0;
-                    //以下区间被认为是工作时间
-                    Integer[] workType = {-1, 0, 1, 2, 3, 4, 5};
-                    //工作时间筛选
-                    List<TimeCalculation> timeCalculations = timeCalculationMapper.selectList(new QueryWrapper<TimeCalculation>()
-                            .eq("date", LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")))
-                            .eq("user_id", map.get("id"))
-                            .in("action_type", workType));
-                    if (timeCalculations != null) {
-                        for (TimeCalculation timeCalculation : timeCalculations) {
-                            calculateTime += timeCalculation.getDuration();
+                }
+                nameList = reportMapper.getReportNameByDateAndDept(date,
+                        ids, targetUid);
+                if (nameList.size() > 0) {
+                    List<String> userIds = new ArrayList<>();
+                    nameList.forEach(n->{
+                        String id = (String) n.get("id");
+                        userIds.add(id);
+                    });
+                    List<Map<String, Object>> reportList = reportMapper.getUserReportByDate(date, userIds);
+                    for (Map<String, Object> map : nameList) {
+                        //再根据人分别获取当天的报告
+                        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+                        for (Map<String, Object> report : reportList) {
+                            if (((String)report.get("creatorId")).equals((String)map.get("id"))) {
+                                list.add(report);
+                            }
+                        }
+                        map.put("data", list);
+                        double reportTime = 0;
+                        if (list.size() > 0) {
+                            for (Map<String, Object> m : list) {
+                                double t = (double) m.get("time");
+                                reportTime += t;
+                            }
+                            map.put("state", list.get(0).get("state"));
                         }
+                        DecimalFormat df = new DecimalFormat("0.00");
+                        map.put("reportTime", df.format(reportTime));
+                        //顺便再获取一下可分配时间
+                        //                    Integer calculateTime = 0;
+                        //                    //以下区间被认为是工作时间
+                        //                    Integer[] workType = {-1, 0, 1, 2, 3, 4, 5};
+                        //                    //工作时间筛选
+                        //                    List<TimeCalculation> timeCalculations = timeCalculationMapper.selectList(new QueryWrapper<TimeCalculation>()
+                        //                            .eq("date", LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")))
+                        //                            .eq("user_id", map.get("id"))
+                        //                            .in("action_type", workType));
+                        //                    if (timeCalculations != null) {
+                        //                        for (TimeCalculation timeCalculation : timeCalculations) {
+                        //                            calculateTime += timeCalculation.getDuration();
+                        //                        }
+                        //                    }
+                        //                    //把总秒数转为double后换算为小时并保留两位小数
+                        //                    map.put("calculateTime", df.format((double) calculateTime / 3600));
                     }
-                    //把总秒数转为double后换算为小时并保留两位小数
-                    map.put("calculateTime", df.format((double) calculateTime / 3600));
                 }
             }
             httpRespMsg.data = nameList;
@@ -134,6 +170,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return httpRespMsg;
     }
 
+    private List<Department> getSubDepts(Department dp, List<Department> list) {
+        List<Department> collect = list.stream().filter(l -> dp.getDepartmentId().equals(l.getSuperiorId())).collect(Collectors.toList());;
+        List<Department> allList = new ArrayList<>();
+        allList.addAll(collect);
+        if (collect.size() > 0) {
+            collect.forEach(c->{
+                allList.addAll(getSubDepts(c, list));
+            });
+        }
+        return allList;
+    }
+
     //获取本人某天工作时间和已提交的报告
     @Override
     public HttpRespMsg getReport(String date, HttpServletRequest request) {
@@ -341,11 +389,65 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg getMembList(String date, HttpServletRequest request) {
+        Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+        //获取当日已填写的人员报告
+        List<Map<String, Object>> reportNameByDate = reportMapper.getReportNameByDate(date, companyId);
+
+        HttpRespMsg departmentList = departmentService.getDepartmentList(request);
+        List<DepartmentVO> list = (List<DepartmentVO>) departmentList.data;
+        //获取公司全部人员
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        List<HashMap> userMapList = new ArrayList<>();
+        for (User u : userList) {
+            HashMap<String, Object> user = new HashMap<String, Object>();
+            user.put("id", u.getId());
+            user.put("name", u.getName());
+            user.put("departmentId", u.getDepartmentId());
+            Optional<Map<String, Object>> first = reportNameByDate.stream().filter(r -> r.get("id").equals(u.getId())).findFirst();
+            
+            if (first.isPresent()) {
+                user.put("state", first.get().get("state"));
+            }
+            userMapList.add(user);
+        }
+        fillDeptUser(list, userMapList);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = list;
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg batchApproveReport(String ids, String date, HttpServletRequest request) {
+        Report report = new Report();
+        report.setState(1);
+        int num = reportMapper.update(report, new QueryWrapper<Report>().in("creator_id", ListUtil.convertIdsArrayToList(ids)).eq("create_date", date));
+        HttpRespMsg msg = new HttpRespMsg();
+        if (num <= 0) {
+            msg.setError("无数据更新");
+        }
+        return msg;
+    }
+
+    private void fillDeptUser(List<DepartmentVO> list, List<HashMap> userList) {
+        list.forEach(l->{
+            List<HashMap> collect = userList.stream().filter(u -> u.get("departmentId").equals(l.getId())).collect(Collectors.toList());
+            l.setUserList(collect);
+            if (l.getChildren() != null) {
+                fillDeptUser(l.getChildren(), userList);
+            }
+        });
+    }
+
     //导出报告
     @Override
     public HttpRespMsg exportReport(String date, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
+            String userId = request.getHeader("Token");
+            User user = userMapper.selectById(userId);
+
             //准备导出
             HSSFWorkbook workbook = new HSSFWorkbook();
             HSSFSheet sheet = workbook.createSheet(date + "日报");
@@ -388,7 +490,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             style.setDataFormat(HSSFDataFormat.getBuiltinFormat("yy/mm/dd hh:mm"));
             //新增数据行 并且装填数据
             int rowNum = 1;
-            List<Map<String, Object>> allReportByDate = reportMapper.getAllReportByDate(date);
+            List<Map<String, Object>> allReportByDate = null;
+            if (user.getRole() == 0) {
+                //普通员工只能看自己的
+                allReportByDate = reportMapper.getAllReportByDate(date, null, user.getId());
+            } else {
+                //管理员看公司所有人的
+                allReportByDate = reportMapper.getAllReportByDate(date, user.getCompanyId(), null);
+            }
+
             for (Map<String, Object> map : allReportByDate) {
                 HSSFRow row = sheet.createRow(rowNum);
                 row.createCell(0).setCellValue(rowNum);

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.TimeType;
+import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.service.TimeTypeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-02-07
+ */
+@Service
+public class TimeTypeServiceImpl extends ServiceImpl<TimeTypeMapper, TimeType> implements TimeTypeService {
+
+}

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

@@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.Company;
 import com.management.platform.entity.Department;
+import com.management.platform.entity.TimeType;
 import com.management.platform.entity.User;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.CompanyMapper;
 import com.management.platform.mapper.DepartmentMapper;
+import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.UserService;
 import com.management.platform.util.HttpRespMsg;
@@ -50,6 +52,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private CompanyMapper companyMapper;
     @Resource
     private DepartmentMapper departmentMapper;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
 
     //登录网页端
     @Override
@@ -149,6 +153,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         if (user == null) {
             httpRespMsg.setError("未查询到用户信息");
         } else {
+            Department dp = departmentMapper.selectById(user.getDepartmentId());
+            if (dp != null) {
+                user.setDepartmentName(dp.getDepartmentName());
+            }
             httpRespMsg.data = user;
         }
         return httpRespMsg;
@@ -268,6 +276,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             Company company = new Company().setCompanyName(companyName)
                     .setExpirationDate(LocalDateTime.now().plusMonths(1));
             companyMapper.insert(company);
+            //生成工作时长
+            TimeType timeType = new TimeType();
+            timeType.setCompanyId(company.getId());
+            timeTypeMapper.insert(timeType);
             if (userMapper.selectCount(new QueryWrapper<User>().eq("company_id", company.getId())) >=
                     (companyMapper.selectById(company.getId()).getStaffCountMax())) {
                 httpRespMsg.setError("公司人员已达上限");
@@ -413,14 +425,20 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 XSSFCell costCell = row.getCell(2);
                 nameCell.setCellType(CellType.STRING);
                 phoneCell.setCellType(CellType.STRING);
-                costCell.setCellType(CellType.STRING);
+
                 String name = nameCell.getStringCellValue();
                 String phone = phoneCell.getStringCellValue();
                 if (name.equals("姓名") && phone.equals("手机号") && rowIndex == 0) {
                     continue;
                 }
-                String costString = costCell.getStringCellValue();
-                BigDecimal cost = costString != null ? new BigDecimal(costString) : BigDecimal.valueOf(0);
+
+                BigDecimal cost = new BigDecimal(0);
+                if (costCell != null) {
+                    costCell.setCellType(CellType.STRING);
+                    String costString = costCell.getStringCellValue();
+                    cost = costString != null ? new BigDecimal(costString) : BigDecimal.valueOf(0);
+                }
+
                 phoneList.add(phone);
                 userList.add(new User()
                         .setId(id.toString())

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

@@ -74,7 +74,7 @@ public class CodeGenerator {
         //生成的代码位置为当前项目
         String projectPath = System.getProperty("user.dir");
         gc.setOutputDir(projectPath + "/src/main/java");
-        gc.setAuthor("吴涛涛");
+        gc.setAuthor("Seyason");
         gc.setOpen(false);
         gc.setFileOverride(true);
         gc.setActiveRecord(true);
@@ -92,11 +92,11 @@ public class CodeGenerator {
 
         // 数据源配置
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://118.190.47.230:3306/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8");
+        dsc.setUrl("jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8");
 //        dsc.setSchemaName("public");
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
-        dsc.setPassword("p011430seya1026");
+        dsc.setPassword("Ziyu1026!@");
         mpg.setDataSource(dsc);
 
         // 包配置
@@ -204,7 +204,7 @@ public class CodeGenerator {
         //若想要生成的实体类继承某个Controller,则可打开下面注释。写上需要继承的Controller的位置即可
 //        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
         //此处user是表名,多个英文逗号分割
-        strategy.setInclude("information");
+        strategy.setInclude("report");
 //        strategy.setExclude();//数据库表全生成
 //        strategy.setInclude(scanner("user").split(","));//表名,多个英文逗号分割
         strategy.setControllerMappingHyphenStyle(true);

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

@@ -8,6 +8,7 @@ import org.apache.poi.ss.usermodel.HorizontalAlignment;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.OutputStream;
 import java.net.URLEncoder;
 import java.util.List;
@@ -15,22 +16,21 @@ import java.util.List;
 public class ExcelUtil {
     /**
      * 简单Excel导出
-     * @param response
      * @param title     标题
      * @param list      数据
      * @return
      */
-    public static String exportGeneralExcelByTitleAndList(HttpServletResponse response, String title, List<List<String>> list, String downloadPath) {
+    public static String exportGeneralExcelByTitleAndList(String title, List<List<String>> list, String downloadPath) {
         String result="系统提示:Excel文件导出成功!";
         String fileName= title+".xls";
         try {
-            response.reset();
-            response.setHeader("Content-disposition",
-                "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
-            //设置文件头编码格式
-            response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");//设置类型
-            response.setHeader("Cache-Control","no-cache");//设置头
-            response.setDateHeader("Expires", 0);//设置日期头
+//            response.reset();
+//            response.setHeader("Content-disposition",
+//                "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
+//            //设置文件头编码格式
+//            response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");//设置类型
+//            response.setHeader("Cache-Control","no-cache");//设置头
+//            response.setDateHeader("Expires", 0);//设置日期头
             // 创建工作簿
             HSSFWorkbook workBook = new HSSFWorkbook();
             // 创建工作类
@@ -130,18 +130,18 @@ public class ExcelUtil {
                 }
             }
             //用于非传统ajax;
-            String headStr = "attachment; filename=\"" + fileName + "\"";
-            response.setContentType("APPLICATION/OCTET-STREAM");//返回格式为流
-            response.setHeader("Content-Disposition", headStr);
-            //普通下载不需要以上三行,注掉即可
-            OutputStream os = response.getOutputStream();//在线下载
+//            String headStr = "attachment; filename=\"" + fileName + "\"";
+//            response.setContentType("APPLICATION/OCTET-STREAM");//返回格式为流
+//            response.setHeader("Content-Disposition", headStr);
+//            //普通下载不需要以上三行,注掉即可
+//            OutputStream os = response.getOutputStream();//在线下载
             File dir = null;
             dir = new File(downloadPath);
             // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
             if (!dir.exists()) {
                 dir.mkdirs();
             }
-//            FileOutputStream os = new FileOutputStream(downloadPath+fileName);//保存到本地
+            FileOutputStream os = new FileOutputStream(downloadPath+fileName);//保存到本地
             workBook.write(os);
             os.flush();
             os.close();
@@ -149,7 +149,7 @@ public class ExcelUtil {
             System.out.println(result);
             e.printStackTrace();
         }
-//        return "/upload/"+fileName;
-        return "";
+        return "/upload/"+fileName;
+//        return "";
     }
 }

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

@@ -15,7 +15,7 @@ spring:
     driver-class-name: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
     username: root
-    password: Hssx2018.!
+    password: Ziyu1026!@
     hikari:
       maximum-pool-size: 10
       minimum-idle: 3

+ 5 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -14,9 +14,12 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://118.190.47.230:3306/man2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+#    url: jdbc:mysql://localhost:3306/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+#    username: root
+#    password: p011430seya1026
+    url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
     username: root
-    password: p011430seya1026
+    password: Ziyu1026!@
     hikari:
       maximum-pool-size: 10
       minimum-idle: 3

+ 6 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -4,16 +4,17 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.management.platform.entity.Project">
-        <id column="id" property="id"/>
-        <result column="project_name" property="projectName"/>
-        <result column="company_id" property="companyId"/>
+        <id column="id" property="id" />
+        <result column="project_name" property="projectName" />
+        <result column="company_id" property="companyId" />
+        <result column="project_code" property="projectCode" />
+        <result column="incharger_id" property="inchargerId" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, project_name, company_id
+        id, project_name, company_id, project_code, incharger_id
     </sql>
-
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getParticipatedProject" resultType="java.util.Map">
         SELECT id, project_name AS projectName

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

@@ -4,24 +4,25 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.management.platform.entity.Report">
-        <id column="id" property="id"/>
-        <result column="creator_id" property="creatorId"/>
-        <result column="project_id" property="projectId"/>
-        <result column="create_date" property="createDate"/>
-        <result column="working_time" property="workingTime"/>
-        <result column="content" property="content"/>
-        <result column="state" property="state"/>
-        <result column="create_time" property="createTime"/>
+        <id column="id" property="id" />
+        <result column="creator_id" property="creatorId" />
+        <result column="project_id" property="projectId" />
+        <result column="create_date" property="createDate" />
+        <result column="working_time" property="workingTime" />
+        <result column="content" property="content" />
+        <result column="state" property="state" />
+        <result column="create_time" property="createTime" />
+        <result column="time_type" property="timeType" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, creator_id, project_id, create_date, working_time, content, state, create_time
+        id, creator_id, project_id, create_date, working_time, content, state, create_time, time_type
     </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.state
+        SELECT c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.state, a.time_type as timeType
         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
@@ -29,12 +30,18 @@
         <if test="date != null and date != ''">
             AND a.create_date = #{date}
         </if>
+        <if test="companyId != null">
+            AND c.company_id = #{companyId}
+        </if>
+        <if test="userId != null">
+            AND a.creator_id = #{userId}
+        </if>
         ORDER BY a.creator_id ASC
     </select>
 
     <!--根据日期获取报告信息-->
     <select id="getReportByDate" resultType="java.util.Map">
-        SELECT b.project_name AS project, a.working_time AS time, a.content, a.state
+        SELECT b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         WHERE 1=1
@@ -44,10 +51,25 @@
         AND a.creator_id=#{id}
         ORDER BY a.creator_id ASC
     </select>
+    <!-- 批量获取员工某天的报告 -->
+    <select id="getUserReportByDate" resultType="java.util.Map">
+        SELECT b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType, a.creator_id as creatorId
+        FROM report AS a
+        JOIN project AS b ON a.project_id=b.id
+        WHERE 1=1
+        <if test="date != null and date != ''">
+            AND a.create_date=#{date}
+        </if>
+        AND a.creator_id in
+        <foreach item="item" collection="userIds" separator="," open="(" close=")" index="">
+            #{item, jdbcType=VARCHAR}
+        </foreach>
+        ORDER BY a.creator_id ASC
+    </select>
 
     <!--根据日期获取报告上传人-->
     <select id="getReportNameByDate" resultType="java.util.Map">
-        SELECT DISTINCT b.id, b.name
+        SELECT DISTINCT b.id, b.name, a.state
         FROM report AS a
         JOIN user AS b ON a.creator_id=b.id
         WHERE 1=1
@@ -59,6 +81,26 @@
         </if>
     </select>
 
+    <!--根据日期,部门,指定人员获取报告上传人-->
+    <select id="getReportNameByDateAndDept" resultType="java.util.Map">
+        SELECT DISTINCT b.id, b.name, a.state
+        FROM report AS a
+        JOIN user AS b ON a.creator_id=b.id
+        WHERE 1=1
+        <if test="date != null and date != ''">
+            AND a.create_date=#{date}
+        </if>
+        <if test="deptIds != null">
+            AND b.department_id in
+            <foreach item="item" collection="deptIds" separator="," open="(" close=")" index="">
+                #{item, jdbcType=INTEGER}
+            </foreach>
+        </if>
+        <if test="userId != null">
+            AND b.id=#{userId}
+        </if>
+    </select>
+
     <!--报告列表-->
     <select id="getDetailByState" resultType="java.util.Map">
         SELECT DISTINCT b.id, b.name, a.create_date AS date
@@ -67,5 +109,4 @@
         WHERE a.state = #{state} AND b.company_id=#{companyId}
         ORDER BY a.create_date DESC
     </select>
-
 </mapper>

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.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.TimeTypeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.TimeType">
+        <id column="company_id" property="companyId" />
+        <result column="allday" property="allday" />
+        <result column="am" property="am" />
+        <result column="pm" property="pm" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, allday, am, pm
+    </sql>
+
+</mapper>

+ 2 - 0
fhKeeper/formulahousekeeper/mywork/mainwindow.cpp

@@ -18,6 +18,8 @@ MainWindow::MainWindow(QWidget *parent)
     connect(ui->loginBtn,SIGNAL(clicked()),this,SLOT(login_in()));
     ui->reg->setOpenExternalLinks(true);
     ui->reg->setText("<a href=\"http://worktime.ttkuaiban.com\">暂无账号?快来点击注册企业账号");
+    ui->manager->setOpenExternalLinks(true);
+    ui->manager->setText("<a href=\"http://worktime.ttkuaiban.com/#/login\">我是管理员->登录后台");
 
 //    connect(ui->loginBtn, &QAction::triggered, this, &MainWindow::login_in);
     // 设置窗体标题

+ 20 - 7
fhKeeper/formulahousekeeper/mywork/mainwindow.ui

@@ -18,26 +18,26 @@
     <property name="geometry">
      <rect>
       <x>340</x>
-      <y>450</y>
+      <y>400</y>
       <width>93</width>
       <height>28</height>
      </rect>
     </property>
     <property name="text">
-     <string>登录</string>
+     <string>员工登录</string>
     </property>
    </widget>
    <widget class="QLabel" name="label">
     <property name="geometry">
      <rect>
-      <x>310</x>
+      <x>280</x>
       <y>110</y>
-      <width>151</width>
+      <width>211</width>
       <height>61</height>
      </rect>
     </property>
     <property name="text">
-     <string>欢迎使用智能工时管家</string>
+     <string>欢迎使用智能工时管家-员工端</string>
     </property>
    </widget>
    <widget class="QLineEdit" name="account">
@@ -98,8 +98,8 @@
    <widget class="QLabel" name="reg">
     <property name="geometry">
      <rect>
-      <x>390</x>
-      <y>510</y>
+      <x>360</x>
+      <y>490</y>
       <width>231</width>
       <height>16</height>
      </rect>
@@ -108,6 +108,19 @@
      <string>暂无账号?快来点击注册企业账号</string>
     </property>
    </widget>
+   <widget class="QLabel" name="manager">
+    <property name="geometry">
+     <rect>
+      <x>360</x>
+      <y>450</y>
+      <width>151</width>
+      <height>16</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>我是管理员-&gt;登录后台</string>
+    </property>
+   </widget>
   </widget>
   <widget class="QMenuBar" name="menubar">
    <property name="geometry">

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/port.js

@@ -3,7 +3,7 @@ export default {
         login: '/user/loginAdmin',                              // 登录
         register: '/user/insertCompany',                        // 注册
         editPassword: '/user/editPassword',                     // 修改密码
-        
+        userDetail: '/user/getUserInfo',
         depList: '/department/list',                            // 部门列表
         add: '/department/add',                                 // 添加部门
         edit: '/department/edit',                               // 编辑部门

+ 29 - 13
fhKeeper/formulahousekeeper/timesheet/src/routes.js

@@ -26,6 +26,9 @@ import depDetail from './views/project/detailDep.vue'
 // 团队管理
 import team from './views/team/index.vue'
 
+// 系统设置
+import timetype from './views/settings/timetype.vue';
+
 Vue.use(Router)
 
 export const fixedRouter = [
@@ -44,19 +47,7 @@ export const fixedRouter = [
 ]
 
 export const manageRouter = [
-    //智能监控
-    {
-        path: '/',
-        component: Home,
-        name: '智能监控',
-        iconCls: 'fa fa-desktop',
-        children: [
-            { path: '/desktop', component: desktop, name: '员工桌面' },
-            { path: '/desktop/:id/:date', component: desktopDetail, name: '员工桌面详情', hidden: true },
-            { path: '/unusual', component: unusual, name: '异常统计' },
-            { path: '/statistics', component: statistics, name: '智能分析' },
-        ]
-    },
+    
     //工时报告
     {
         path: '/',
@@ -114,6 +105,31 @@ export const manageRouter = [
             { path: '/team', component: team, name: '组织架构' },
         ]
     },
+    //设置时间类型
+    {
+        
+        path: '/',
+        component: Home,
+        name: '',
+        iconCls: 'fa fa-clock-o',
+        leaf: true,//只有一个节点
+        children: [
+            { path: '/timetype', component: timetype, name: '工作时长设置' },
+        ]
+    },
+    //智能监控
+    {
+        path: '/',
+        component: Home,
+        name: '智能监控',
+        iconCls: 'fa fa-desktop',
+        children: [
+            { path: '/desktop', component: desktop, name: '员工桌面' },
+            { path: '/desktop/:id/:date', component: desktopDetail, name: '员工桌面详情', hidden: true },
+            { path: '/unusual', component: unusual, name: '异常统计' },
+            { path: '/statistics', component: statistics, name: '智能分析' },
+        ]
+    },
     {
         path: '/404',
         component: NotFound,

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

@@ -65,11 +65,7 @@
                             this.logining = false;
                             if (res.code == "ok") {
                                 sessionStorage.setItem('user', JSON.stringify(res.data));
-                                if(res.data.role == 0) {
-                                    this.$router.push({ path: '/daily' });
-                                } else {
-                                    this.$router.push({ path: '/desktop' });
-                                }
+                                this.$router.push({ path: '/daily' });
                             } else {
                                 this.$message({
                                     message: res.msg,

+ 35 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -1,12 +1,14 @@
 <template>
     <section>
         <el-col :span="24" style="padding-bottom: 0px;text-align:center;">
+
             <el-radio-group v-model="radio" @change="getEchart">
                 <el-radio-button label="项目"></el-radio-button>
                 <el-radio-button label="部门"></el-radio-button>
             </el-radio-group>
         </el-col>
         <div id="container" :style="'height:'+containerHeight+'px'"></div>
+        <div style="position:fixed;top:120px;right:150px;"><el-button @click="exportProjectData()">导出数据</el-button></div>
     </section>
 </template>
 
@@ -23,6 +25,30 @@
             };
         },
         methods: {
+            exportProjectData() {
+                this.http.post("/project/exportTimeCost", {},
+                    res => {
+                        this.listLoading = false;
+                        if (res.code == "ok") {
+                            var aTag = document.createElement('a');
+                            aTag.download = "项目成本统计.xls";
+                            aTag.href = res.data;
+                            aTag.click();
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.listLoading = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+            },
             getEchart(){
                 sessionStorage.radio = this.radio;
                 var _this = this;
@@ -60,21 +86,23 @@
                             toolbox: {
                                 show: true,
                                 feature:{
+                                   
                                     saveAsImage:{
                                         show:true
                                     },
                                     restore:{
                                         show:true
                                     },
-                                    dataView:{
-                                        show:true
-                                    },
-                                    dataZoom:{
-                                        show:true
-                                    },
+                                    // dataView:{
+                                    //     show:true
+                                    // },
+                                    // dataZoom:{
+                                    //     show:true
+                                    // },
                                     magicType:{
                                         type:['line','bar']
-                                    }
+                                    },
+                                     
                                 }
                             },
                             tooltip:{

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

@@ -12,8 +12,21 @@
         <!--列表-->
         <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
             <el-table-column type="index" width="60"></el-table-column>
+            <el-table-column prop="projectCode" label="项目编码" sortable width="150"></el-table-column>
             <el-table-column prop="projectName" label="项目名称" sortable></el-table-column>
-            <el-table-column prop="userNames" label="参与者" sortable></el-table-column>
+            <el-table-column prop="inchargerName" label="负责人" sortable width="150">
+                <template slot-scope="scope">
+                    <el-link type="primary" @click="showUser(scope.row.inchargerId)">{{scope.row.inchargerName}}</el-link>
+                </template>
+            </el-table-column>
+            <el-table-column prop="participator" label="参与者" sortable>
+                
+                <template slot-scope="scope">
+                    <v-for v-for="par in scope.row.participator" :key="par.id" >
+                        <el-link style="margin-right:10px;" type="primary" @click="showUser(par.id)">{{par.name}}</el-link>
+                    </v-for>
+                </template>
+            </el-table-column>
             <el-table-column label="操作" width="220">
                 <template slot-scope="scope">
                     <!-- <el-button size="small" type="primary" @click="detail(scope.$index)">详情</el-button> -->
@@ -39,23 +52,53 @@
         <!--新增界面-->
         <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="form1" :model="addForm" :rules="rules" label-width="100px">
+                <el-form-item label="项目编号" >
+                    <el-input v-model="addForm.code" placeholder="请输入项目编号" clearable></el-input>
+                </el-form-item>
                 <el-form-item label="项目名称" prop="name">
                     <el-input v-model="addForm.name" placeholder="请输入项目名称" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="参与者">
-                    <el-select v-model="addForm.userId" multiple filterable placeholder="请选择参与者" style="width:100%;">
+                <el-form-item label="全部参与者">
+                    <el-select v-model="addForm.userId" multiple filterable placeholder="请选择参与者" style="width:100%;" @change="changeParticipator">
                         <el-option v-for="item in users" :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.inchargerId" :disabled="addForm.userId.length==0" filterable placeholder="请选择负责人" style="width:100%;" @change="changeIncharger">
+                        <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>
             <div slot="footer" class="dialog-footer">
                 <el-button @click.native="addFormVisible = false">取消</el-button>
                 <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
             </div>
         </el-dialog>
+
+        <!--用户详细信息弹出框-->
+        <el-dialog title="查看详情" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
+            <div class="line"><span>姓名</span><span>{{userDetail.name}}</span></div>
+            <div class="line"><span>手机号码</span><span>{{userDetail.phone}}</span></div>
+            <div class="line"><span>部门</span><span>{{userDetail.departmentName}}</span></div>
+            <div class="line"><span>成本</span><span>{{userDetail.cost}}元/小时</span></div>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="userDetailVisible = false" >确定</el-button>
+            </div>
+        </el-dialog>
     </section>
 </template>
-
+<style scoped>
+.line {
+    padding:10px;
+}
+.line span{
+    font-size:18px;
+}
+.line span:nth-child(even){
+    float:right;
+}
+</style>
 <script>
     import util from "../../common/js/util";
 
@@ -63,10 +106,11 @@
         data() {
             return {
                 user: JSON.parse(sessionStorage.getItem("user")),
-
+                userDetailVisible: false,
+                userDetail:{},
                 date: new Date(),
                 users: [],
-
+                participator:[],
                 tableHeight: 0,
                 listLoading: false,
                 total: 0,
@@ -87,6 +131,41 @@
             };
         },
         methods: {
+            //显示用户详情
+            showUser(userId) {
+                this.userDetailVisible = true;
+                this.http.post(this.port.manage.userDetail, {
+                    userId: userId
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.userDetail = res.data;
+                    } else {
+                        this.$message({
+                        message: res.msg,
+                        type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
+            //选择参与人
+            changeParticipator() {
+                //检查是否在参与人中,如果没有需要加入到参与人中
+                console.log(this.addForm.userId);
+                var find = false;
+                this.participator = [];
+                this.addForm.userId.forEach(u=>{
+                    var findUser = this.users.filter(au=>au.id == u)[0];
+                    this.participator.push(findUser);
+                })
+                
+            },
             getUsers() {
                 this.http.post(this.port.manage.list, {
                     departmentId: -1,
@@ -169,6 +248,8 @@
                     this.addForm = {
                         name: '',
                         userId: [],
+                        code:'',
+                        inchargerId:null,
                     }
                 } else {
                     this.title = "修改项目";
@@ -176,11 +257,15 @@
                     for(var j in list) {
                         arr.push(list[j].id)
                     }
+                    
                     this.addForm = {
                         id: this.list[i].id,
                         name: this.list[i].projectName,
-                        userId: arr
+                        userId: arr,
+                        code:this.list[i].projectCode,
+                        inchargerId: this.list[i].inchargerId
                     }
+                    this.changeParticipator();
                 }
                 this.addFormVisible = true;
             },
@@ -199,6 +284,13 @@
                                 formData.append("userId", this.addForm.userId[j]);
                             }
                         }
+                        if(this.addForm.inchargerId != null) {
+                            formData.append("inchargerId", this.addForm.inchargerId);
+                        }
+                        if(this.addForm.code != null) {
+                            formData.append("code", this.addForm.code);
+                        }
+                        
                         this.http.uploadFile(this.port.project.add,formData,
                         res => {
                             this.addLoading = false;

+ 535 - 60
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -1,79 +1,139 @@
 <template>
     <section>
         <!--工具条-->
-        <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
+        <!-- <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
                 <el-form-item>
                     <el-date-picker v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM" @change="changeMonthOut" :clearable="false" type="month" placeholder="选择月份"></el-date-picker>
                 </el-form-item>
-                <el-form-item style="float:right;">
-                    <el-link type="primary" :underline="false" v-if="user.role != 0" @click="exportReport">导出日报</el-link>
-                </el-form-item>
-                <el-form-item style="float:right;">
-                    <el-link type="primary" :underline="false" @click="fillInReport(-1)">填写日报</el-link>
-                </el-form-item>
             </el-form>
-        </el-col>
+        </el-col> -->
 
         <!--列表-->
         <div>
-            <el-card class="box-card daily" shadow="never" :style="'height:'+tableHeight +'px'">
+            <el-card class="box-card daily" shadow="never" >
                 <div slot="header" class="clearfix">
+                    <el-date-picker v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM" @change="changeMonthOut" :clearable="false" type="month" placeholder="选择月份"></el-date-picker>
+                    <span >
                     <span>日期:</span>
                     <span v-for="(item,index) in allDate" :id="'day'+index" :class="index==choseDay?'chooseDate date_item':'date_item'" 
                     @click="choseDate(index)" :key="index">{{item}}</span>
+                    </span>
                 </div>
-                <div class="allDaily">
-                    <div class="one_daily" v-for="(item1,index1) in reportList" :key="index1">
-                        <i class="fa fa-circle"></i>{{item1.name}}
-                        <span style="margin-left:30px;">
-                            <span style="margin-right:20px;">
-                                <i v-if="parseFloat(item1.reportTime)>parseFloat(item1.calculateTime)+0.5" style="color:red;margin-right:8px;" class="fa fa-exclamation-triangle"></i>
-                                总填报:
-                                <span :style="parseFloat(item1.reportTime)>parseFloat(item1.calculateTime)+0.5?'color:red':''">{{item1.reportTime}}h</span>
+                <div>
+                <div style="float:left;width:200px;" v-if="user.role == 1">
+                    <div>
+                        <el-select v-model="selectState" size="small" @change="stateChange">
+                        <el-option value="-1" label="全部状态" >全部状态</el-option>
+                        <el-option value="-2" label="未填报">未填报</el-option>
+                        <el-option value="1" label="已通过">已通过</el-option>
+                        <el-option value="0" label="待审核">待审核</el-option>
+                        <el-option value="2" label="不通过">不通过</el-option>
+                        </el-select></div>
+                    <div>
+                        <el-tree :data="data"  @node-click="handleNodeClick" >
+                            <span class="custom-tree-node" slot-scope="{ node, data}">
+                            <span>{{ node.label }}</span>
+                            <span v-if="data.membCount != null && data.isUser == null">({{data.membCount}})</span>
+                            <div style="width:0%;float:right;">
+                            <span v-if="data.isUser == 1 && data.state == null" style="color:red;">
+                            未填报
+                            </span>
+                            <span v-if="data.isUser == 1 && data.state == 0" style="color:orange;">
+                            待审核
+                            </span>
+                            <span v-if="data.isUser == 1 && data.state == 1" style="color:green;">
+                            已通过
+                            </span>
+                            <span v-if="data.isUser == 1 && data.state == 2" style="color:red;">
+                            未通过
                             </span>
-                            <el-link v-if="user.role != 0" type="primary" :underline="false" @click="junpToDeskTop(item1.id)">系统智能统计:{{item1.calculateTime}}h</el-link>
-                            <span v-else>系统智能统计:{{item1.calculateTime}}h</span>
-                            <span style="margin-left:15px;color:#DAA520;" v-if="item1.state == 0">[ 待审核 ]</span>
-                            <span style="margin-left:15px;color:#32CD32;" v-else-if="item1.state == 1">[ 已通过 ]</span>
-                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item1.state == 2">[ 已驳回 ]</span>
+                            </div>
                         </span>
-                        <div class="checkbtn">
-                            <el-button v-if="user.role != 0 && item1.state == 0" type="primary" :loading="logining" size="small" @click="approve(item1.id)">通过</el-button>
-                            <el-button v-if="user.role != 0 && item1.state == 0" type="danger" :loading="logining" size="small" @click="deny(item1.id,0)">驳回</el-button>
-                            <el-button v-if="user.role != 0 && item1.state == 1" type="danger" :loading="logining" size="small" @click="deny(item1.id,1)">撤销</el-button>
-                            <el-button v-if="item1.state == 2 && user.id == item1.id" type="primary" size="small" @click="fillInReport(index1)">编辑日报</el-button>
-                        </div>
-                        <div class="one_daily_body">
-                            <el-timeline>
-                                <el-timeline-item v-for="(item2,index2) in item1.data" :key="index2">
-                                    <el-card shadow="never">
-                                        <p>项目:<b>{{item2.project}}</b></p>
-                                        <p>时长:{{item2.time}}h</p>
-                                        <p>事项:<span v-html="item2.content"></span></p>
-                                    </el-card>
-                                </el-timeline-item>
-                            </el-timeline>
+                        </el-tree>
+                    </div>
+                </div>
+                
+                <div :style="'height:'+tableHeight+'px;width:0.5px;background:#eee;margin-right:10px;float:left;'" ></div>
+                <div class="allDaily" style="float:left;">
+                    <div class="report_title"><span>工作日报 | {{depData.label}}</span> - 已填写<span style="margin-left:5px;margin-right:5px;color:red;">{{reportList.length}}</span>人,
+                    未填写<span style="margin-left:5px;margin-right:5px;color:red;">{{(depData == null?data[0].membCount:(depData.isUser == 1?1:depData.membCount))-reportList.length}}</span>人
+                        <span style="float:right;">
+                            <el-link type="primary" style="margin-right:10px;" :underline="false" @click="fillInReport(-1)">填写日报</el-link>
+                            <el-link type="primary" style="margin-right:10px;" :underline="false" v-if="user.role != 0" @click="exportReport">导出日报</el-link>
+                            <el-link type="primary" style="margin-right:10px;" :underline="false" v-if="user.role != 0" @click="batchApprove">批量审核</el-link>
+                        </span>
+                    </div>
+                    <div style="height:490px;overflow:scroll;padding-top:10px;">
+                        <div class="one_daily" v-for="(item1,index1) in reportList" :key="index1">
+                            <i class="fa fa-circle"></i>{{item1.name}}
+                            <span style="margin-left:30px;">
+                                <span style="margin-right:20px;">
+                                    <!-- <i v-if="parseFloat(item1.reportTime)>parseFloat(item1.calculateTime)+0.5" style="color:red;margin-right:8px;" class="fa fa-exclamation-triangle"></i> -->
+                                    工作总时长:
+                                    <!-- <span :style="parseFloat(item1.reportTime)>parseFloat(item1.calculateTime)+0.5?'color:red':''">{{item1.reportTime}}h</span> -->
+                                    <span style="color:red;">{{item1.reportTime}}h</span>
+                                </span>
+                                <!-- <el-link v-if="user.role != 0" type="primary" :underline="false" @click="junpToDeskTop(item1.id)">系统智能统计:{{item1.calculateTime}}h</el-link>
+                                <span v-else>系统智能统计:{{item1.calculateTime}}h</span> -->
+                                <span style="margin-left:15px;color:#DAA520;" v-if="item1.state == 0">[ 待审核 ]</span>
+                                <span style="margin-left:15px;color:#32CD32;" v-else-if="item1.state == 1">[ 已通过 ]</span>
+                                <span style="margin-left:15px;color:#FF0000;" v-else-if="item1.state == 2">[ 已驳回 ]</span>
+                            </span>
+                            <div class="checkbtn">
+                                <el-button v-if="user.role != 0 && item1.state == 0" type="primary" :loading="logining" size="small" @click="approve(item1.id)">通过</el-button>
+                                <el-button v-if="user.role != 0 && item1.state == 0" type="danger" :loading="logining" size="small" @click="deny(item1.id,0)">驳回</el-button>
+                                <el-button v-if="user.role != 0 && item1.state == 1" type="danger" :loading="logining" size="small" @click="deny(item1.id,1)">撤销</el-button>
+                                <el-button v-if="item1.state == 2 && user.id == item1.id" type="primary" size="small" @click="fillInReport(index1)">编辑日报</el-button>
+                            </div>
+                            <div class="one_daily_body">
+                                <el-timeline>
+                                    <el-timeline-item v-for="(item2,index2) in item1.data" :key="index2">
+                                        <el-card shadow="never">
+                                            <p>项目:<b>{{item2.project}}</b></p>
+                                            <p>时长:{{item2.time}}h  ({{typeList[item2.timeType]}})</p>
+                                            <p>事项:<span v-html="item2.content"></span></p>
+                                        </el-card>
+                                    </el-timeline-item>
+                                </el-timeline>
+                            </div>
                         </div>
+                        <!-- 简陋的无报告提示 -->
+                        <div v-if="reportList.length==0" style="width:800px;font-size:17px;text-align:center;color:#aaa;">今日暂无报告</div>
                     </div>
-                    <!-- 简陋的无报告提示 -->
-                    <div v-if="reportList.length==0" style="font-size:17px;text-align:center;margin-top:175px;color:#aaa;">本日暂无报告</div>
+                </div>
                 </div>
             </el-card>
         </div>
 
-        <!-- 项目管理的dialog -->
+        <!-- 填写日报的dialog -->
         <el-dialog title="填写日报" :visible.sync="dialogVisible" width="60%">
             <el-form ref="workForm" :model="workForm" :rules="workRules" label-width="100px">
                 <el-form-item label="工作日期" prop="createDate">
                     <el-date-picker v-model="workForm.createDate" :editable="false" format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
                     @change="changeMonth()" :clearable="false" type="date" placeholder="选择工作日期" :disabled="isDisable"></el-date-picker>
                 </el-form-item>
-                <el-form-item label="待分配时长" prop="name">
+                <!-- <el-form-item label="待分配时长" prop="name">
                     <span>{{report.time}}h</span>
                     <el-link type="primary" :underline="false" @click="addDomain" style="margin-left:40px">添加项目</el-link>
-                </el-form-item>
+                </el-form-item> -->
+                
                 <div v-for="(domain, index) in workForm.domains" :key="domain.id">
+                    <el-form-item label="工作时间" :prop="'domains.' + index + '.timeType'"
+                        :rules="{ required: true, message: '请选择工作时间', trigger: 'blur' }">
+                        <!-- <el-input v-model.number="domain.workingTime" placeholder="请输入投入时长" type='number' clearable style="width:200px;"
+                         :disabled="workForm.domains.length==0?true:(workForm.domains[0].state==2?false:true)"></el-input> -->
+                        <el-select v-model="domain.timeType" placeholder="请选择工作时间" 
+                        :disabled="workForm.domains.length==0?true:(workForm.domains[0].state==2?false:true)"
+                        @change="onTimeTypeChange(domain.timeType)">
+                        <el-option
+                            v-for="item in timeType"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                            </el-option>
+                         </el-select>
+                    </el-form-item>
                     <el-form-item label="投入项目" :prop="'domains.' + index + '.projectId'"
                         :rules="{ required: true, message: '请选择投入项目', trigger: ['change','blur'] }">
                         <el-select v-model="domain.projectId" placeholder="请选择" style="width:200px;"
@@ -85,19 +145,13 @@
                             <i class="fa fa-trash" style="color: red;;font-size:18px;"></i>
                         </el-link>
                     </el-form-item>
-
-                    <el-form-item label="投入时长" :prop="'domains.' + index + '.workingTime'"
-                        :rules="{ required: true, message: '请输入投入时长', trigger: 'blur' }">
-                        <el-input v-model.number="domain.workingTime" placeholder="请输入投入时长" type='number' clearable style="width:200px;"
-                         :disabled="workForm.domains.length==0?true:(workForm.domains[0].state==2?false:true)"></el-input>
-                    </el-form-item>
-
-                    <el-form-item label="工作事项" :prop="'domains.' + index + '.content'" :rules="{ required: true, message: '请输入工作事项', trigger: 'blur' }">
+                    <el-form-item label="工作事项" :prop="'domains.' + index + '.content'" >
                         <el-input v-model="domain.content" type="textarea" :rows="4" placeholder="请输入投入时长" clearable
                          :disabled="workForm.domains.length==0?true:(workForm.domains[0].state==2?false:true)"></el-input>
                     </el-form-item>
                     <el-divider v-if="workForm.domains.length>1"></el-divider>
                 </div>
+                <el-link v-if="showAddMore" type="primary" :underline="false" @click="addDomain" style="margin-left:40px">添加更多</el-link>
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="dialogVisible = false">取消</el-button>
@@ -105,6 +159,18 @@
                 :disabled="workForm.domains.length==0?true:(workForm.domains[0].state==2?false:true)" >提交</el-button>
             </span>
         </el-dialog>
+
+        <!-- 批量日报审核 -->
+        <el-dialog title="批量日报审核" :visible.sync="approveDialogVisible" width="500px">
+            <el-checkbox v-model="isAllSelect" label="全选" style="margin-left:24px;" @change="selectAll" v-if="batchShowData.length > 0"></el-checkbox>
+            <el-tree ref="approveTree" node-key="id" :data="batchShowData" show-checkbox="true" @check-change="handleCheckChange" >
+            </el-tree>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="approveDialogVisible = false">取消</el-button>
+                <el-button type="primary" @click="submitBatchApprove" :disabled="batchShowData.length == 0">审核通过</el-button>
+            </span>
+        </el-dialog>
+
     </section>
 </template>
 
@@ -114,9 +180,16 @@
     export default {
         data() {
             return {
+                isAllSelect: false,
+                approveDialogVisible:false,
+                deptId:null,
+                targetUid: null,
+                membCount:0,
+                selectState:"-1",
                 user: JSON.parse(sessionStorage.getItem("user")),
-
+                showAddMore:false,
                 allDate: [],
+                typeList:['全天','上午','下午'],
                 date: sessionStorage.msg?sessionStorage.msg.split('-')[0]+"-"+sessionStorage.msg.split('-')[1]:util.formatDate.format(new Date(new Date()), "yyyy-MM"),
                 choseDay: 0,
 
@@ -134,6 +207,7 @@
                         id: null,
                         projectId: "",
                         workingTime: "",
+                        timeType:0,
                         content: "",
                         state: 2,
                     }],
@@ -144,14 +218,331 @@
 
                 logining: false,
                 isDisable: false,
+                timeType:[],
+                //部门人员树状结构
+                data: [
+                    {
+                        id: -1,
+                        label: '全部人员',
+                        membCount:0
+                    },
+                    {
+                        id: 0,
+                        label: '未分配',
+                    }
+                ],
+                allData:{},
+                batchShowData:{},
+                option: [],
+                depData: {
+                    id: -1,
+                    label: '全部人员',
+                },
+                defaultProps: {
+                    children: 'children',
+                    label: 'label'
+                },
             };
         },
         methods: {
+            //提交批量审核数据
+            submitBatchApprove() {
+                console.log(this.$refs.approveTree.getCheckedNodes());
+                var data = this.$refs.approveTree.getCheckedNodes();
+                var ids = '';
+                if (data.length == 0) {
+                    this.$message({
+                            message: '请选择要审核的人员',
+                            type: "error"
+                        });
+                    return;
+                }
+                for (var i=0;i<data.length; i++) {
+                    ids += data[i].id;
+                    if (i < data.length-1) {
+                        ids += ',';
+                    }
+                }
+                let day = this.choseDay > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
+                this.http.post("/report/batchApproveReport", {ids:ids, date:this.date + day},
+                res => {
+                    if (res.code == "ok") {
+                        this.$message({
+                            message: '审核成功',
+                            type: "success"
+                        });
+                        this.getReportList();
+                        this.getDepartment();
+                        this.approveDialogVisible = false;
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
+            selectAll() {
+                if (this.isAllSelect) {
+                    var keys = [];
+                    this.batchShowData.forEach(b=>{
+                        keys.push(b.id);
+                    })
+                    this.$refs.approveTree.setCheckedKeys(keys);
+                } else {
+                    this.$refs.approveTree.setCheckedKeys([]);
+                }
+            },
+            //批量审核
+            batchApprove() {
+                this.approveDialogVisible = true;
+                console.log(this.allData);
+                this.batchShowData = JSON.parse(JSON.stringify(this.allData));
+                //去掉全部人员
+                this.batchShowData.splice(0,1);
+                //过滤。只显示待审核的
+                this.filterState(0, this.batchShowData);
+                this.calculateMembCount(this.batchShowData);
+                //去掉空的部门
+                this.removeEmptyNode(this.batchShowData);
+            },
+            removeEmptyNode(list) {
+                for (var i=0;i<list.length;i++) {
+                    var cnt = 0;
+                    if (list[i].membCount == 0) {
+                        list.splice(i, 1);
+                        i--;
+                    } else if (list[i].children != null) {
+                        this.removeEmptyNode(list[i].children);
+                    }
+                }
+            },
+            calculateMembCount(list) {
+                for (var i in list) {
+                    var cnt = 0;
+                    if (list[i].children != null) {
+                        this.calculateMembCount(list[i].children);
+                        for (var m in list[i].children) {
+                            cnt += list[i].children[m].membCount;
+                        }
+                    }
+                    
+                    if (list[i].isUser == 1) {
+                        cnt++;
+                        this.membCount++;
+                    } 
+                    list[i].membCount = cnt;
+                }
+            },
+            stateChange() {
+                this.membCount = 0;
+                if (this.selectState == -1) {
+                    //全部状态
+                    this.data = this.allData;
+                } else {
+                    //未填报
+                    var newData = JSON.parse(JSON.stringify(this.allData));
+                    this.filterState(this.selectState, newData);
+                    this.data = newData;
+                }
+                this.calculateMembCount(this.data);
+                this.data[0].membCount = this.membCount;//总人数
+            },
+            //按状态过滤部门人员
+            filterState(state, list) {
+                for (var i =0;i<list.length; i++) {
+                    var obj = list[i];
+                    if (obj.isUser == 1) {
+                        var match = false;
+                        if (state == -2) {
+                            if (obj.state == null) {
+                                match = true;
+                            }
+                        } else {
+                            if (obj.state == state) {
+                                match = true;
+                            }
+                        }
+                        if (!match) {
+                            console.log("不匹配,删除="+obj.label+', state='+obj.state);
+                            list.splice(i, 1);
+                            i--;
+                        } else {
+                            console.log("匹配"+obj.label);
+                        }
+                    } else {
+                        if (obj.children != null) {
+                            this.filterState(state, obj.children);
+                        }
+                    }
+                }
+            },
+            // 部门列表点击
+            handleNodeClick(data) {
+                console.log(data);
+                // if(this.depData == null || data.id != this.depData.id) {
+                //     this.depData = data;
+                //     //this.getUser();
+                    
+                // }
+                this.depData = data;
+                if (data.id == -1) {
+                    this.deptId = null;
+                    this.targetUid = null;
+                } else if (data.isUser == 1) {
+                    this.deptId = null;
+                    this.targetUid = data.id;
+                } else {
+                    this.deptId = data.id;
+                    this.targetUid = null;
+                }
+                this.getReportList();
+            },
+            
+            // 获取部门列表
+            getDepartment() {
+                let day = this.choseDay > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
+                this.http.post("/report/getMembList", {date:this.date + day},
+                res => {
+                    if (res.code == "ok") {
+                        var list = res.data , list1 = JSON.parse(JSON.stringify(res.data));
+                        list.splice(0,0,{
+                            id: -1,
+                            label: '全部人员',
+                        })
+                        list.push({
+                            id: 0,
+                            label: '未分配',
+                        })
+                        this.membCount = 0;
+                        //设置员工到部门下面
+                        this.setUserToDept(list);
+                        this.data = list;
+                        this.allData = list;
+                        this.option = this.changeArr(list1);
+                        list[0].membCount = this.membCount;
+                        if (this.depData.id == -1) {
+                            this.depData.membCount = this.membCount;
+                        }
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
+
+            setUserToDept(list) {
+                for (var i in list) {
+                    var cnt = 0;
+                    if (list[i].children != null) {
+                        this.setUserToDept(list[i].children);
+                        for (var m in list[i].children) {
+                            cnt += list[i].children[m].membCount;
+                        }
+                    }
+                    
+                    if (list[i].userList != null) {
+                        if (list[i].children == null) {
+                            list[i].children = [];
+                        }
+                        list[i].userList.forEach(element => {
+                            var obj = {id: element.id, label:element.name, state:element.state, parentId:element.departmentId, isUser:1};
+                            list[i].children.push(obj);
+                            this.membCount++;
+                            cnt++;
+                        });
+                    }
+                    list[i].membCount = cnt;
+                }
+            },
+
+            // 修改数组
+            changeArr(arr) {
+                for (var i = 0; i < arr.length; i++) {
+                    if(arr[i].id != -1 && arr[i].id != 0) {
+                        if (arr[i].children != null && arr[i].children.length>0) {
+                            arr[i].children = this.changeArr(arr[i].children);
+                        }
+                        arr[i].id && (arr[i].value = arr[i].id);
+                        delete arr[i].id;
+                    }
+                }
+                for(var i in arr) {
+                    if(arr[i].id == -1 || arr[i].id == 0) {
+                        arr.splice(i,1)
+                    }    
+                }
+                return arr;
+            },
+            //时间段范围设置改动,监听
+            onTimeTypeChange(timeType) {
+                this.showAddMore = true;
+                console.log("======" + timeType);
+                for(var i in this.workForm.domains) {
+                    if (this.workForm.domains[i].timeType == 0) {
+                        this.showAddMore = false;
+                        break;
+                    }
+                }
+                if (this.showAddMore) {
+                    //检测数量
+                    if (this.workForm.domains.length == 2) {
+                        this.showAddMore = false;
+                    } else {
+                        this.showAddMore = true;
+                    }
+                }
+            },
+            getTimeType() {
+                this.http.post('/time-type/getCompanyTimeSetting', { companyId: this.user.companyId},
+                    res => {
+                        if (res.code == "ok") {
+                            var t = res.data;
+                            //转化时间格式
+                            if (t.allday != null) {
+                                this.timeType.push({value:0, label:'全天 - '+t.allday+'小时', hours:t.allday});
+                            }
+                            if (t.am != null) {
+                                this.timeType.push({value:1, label:'上午 - '+t.am+'小时', hours: t.am});
+                            }
+                            if (t.pm != null) {
+                                this.timeType.push({value:2, label:'上午 - '+t.pm+'小时', hours: t.pm});
+                            }
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.listLoading = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+            },
             // 改变月份
             changeMonthOut() {
                 console.log(sessionStorage.msg)
                 this.getAllDate();
                 this.getReportList();
+                this.getDepartment();
             },
 
             // 选择日期
@@ -160,6 +551,7 @@
                 let day = this.choseDay > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
                 sessionStorage.msg = this.date + day,
                 this.getReportList();
+                this.getDepartment();
             },
 
             // 获取日期列表
@@ -200,7 +592,14 @@
             getReportList() {
                 this.listLoading = true;
                 let day = this.choseDay > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
-                this.http.post( this.port.report.list, { date: this.date + day },
+                let param = {date: this.date + day};
+                if (this.deptId != null) {
+                    param.deptId = this.deptId;
+                }
+                if (this.targetUid != null) {
+                    param.userId = this.targetUid;
+                }
+                this.http.post( this.port.report.list, param,
                 res => {
                     this.listLoading = false;
                     if (res.code == "ok") {
@@ -296,7 +695,8 @@
                                     projectId: list.report[i].projectId,
                                     workingTime: list.report[i].workingTime,
                                     content: list.report[i].content,
-                                    state: list.report[i].state
+                                    state: list.report[i].state,
+                                    timeType: list.report[i].timeType
                                 })
                             }
                             this.workForm = {
@@ -312,6 +712,7 @@
                                     workingTime: "",
                                     content: "",
                                     state: 2,
+                                    timeType:0,
                                 }],
                             }
                         }
@@ -346,16 +747,28 @@
 
             // 添加模块
             addDomain() {
+                
                 this.workForm.domains.push({
                         projectId: "",
                         workingTime: "",
-                        content: ""
+                        content: "",
                 });
+                //检测时间段数量,达到2个,不能再加了
+                var length = this.workForm.domains.length;
+                if (length == 2) {
+                    this.showAddMore = false;
+                }
             },
 
             // 移除模块
             delDomain(i) {
                 this.workForm.domains.splice(i,1)
+                //检测当前剩下的一个,时间类型是否是全天
+                if (this.workForm.domains[0].timeType == 0) {
+                    this.showAddMore = false;
+                } else {
+                    this.showAddMore = true;
+                }
             },
 
             // 改变月份
@@ -367,6 +780,48 @@
             submitDepartment() {
                 this.$refs.workForm.validate(valid => {
                     if (valid) {
+                        //检查时间,全天和上下午不能同时存在
+                        var alldayNum = 0;
+                        var amNum = 0;
+                        var pmNum = 0;
+                        for(var i in this.workForm.domains) {
+                            if (this.workForm.domains[i].timeType == 0) {
+                                alldayNum ++;
+                            } else if (this.workForm.domains[i].timeType == 1) {
+                                amNum++;
+                            } else if (this.workForm.domains[i].timeType == 2) {
+                                pmNum++;
+                            }
+                        }
+                        if (alldayNum > 1) {
+                            this.$message({
+                                    message: "工作时间-全天,只能选择一次",
+                                    type: "error"
+                                });
+                            return;
+                        }
+                        if (amNum > 1) {
+                            this.$message({
+                                    message: "工作时间-上午,只能选择一次",
+                                    type: "error"
+                                });
+                            return;
+                        }
+                        if (pmNum > 1) {
+                            this.$message({
+                                    message: "工作时间-下午,只能选择一次",
+                                    type: "error"
+                                });
+                            return;
+                        }
+                        if (alldayNum == 1 && (amNum > 0 || pmNum > 0)) {
+                            this.$message({
+                                    message: "工作时间-全天,不能和上下午同时存在",
+                                    type: "error"
+                                });
+                            return;
+                        }
+
                         this.listLoading = true;
                         let formData = new FormData();
                         for(var i in this.workForm.domains) {
@@ -376,8 +831,15 @@
                                 formData.append("id", -1);
                             }
                             formData.append("projectId", this.workForm.domains[i].projectId);
-                            formData.append("workingTime", this.workForm.domains[i].workingTime);
-                            formData.append("content", this.workForm.domains[i].content);
+                            formData.append("timeType", this.workForm.domains[i].timeType);
+                            var workingTime = this.timeType.filter(t=>t.value == this.workForm.domains[i].timeType)[0].hours;
+                            formData.append("workingTime", workingTime);
+                            if (this.workForm.domains[i].content == null || this.workForm.domains[i].content == '') {
+                                formData.append("content", '-');
+                            } else {
+                                formData.append("content", this.workForm.domains[i].content);
+                            }
+                            
                             formData.append("createDate", this.workForm.createDate);
                         }
                         this.http.uploadFile( this.port.report.editPort, formData,
@@ -390,6 +852,7 @@
                                 });
                                 this.dialogVisible = false;
                                 this.getReportList();
+                                this.getDepartment();
                             } else {
                                 this.$message({
                                     message: res.msg,
@@ -427,6 +890,7 @@
                             type: "success"
                         });
                         this.getReportList();
+                        this.getDepartment();
                     } else {
                         this.$message({
                             message: res.msg,
@@ -456,6 +920,7 @@
                             type: "success"
                         });
                         this.getReportList();
+                        this.getDepartment();
                     } else {
                         this.$message({
                             message: res.msg,
@@ -475,21 +940,29 @@
         },
         created() {
             let height = window.innerHeight;
-            this.tableHeight = height - 150;
+            this.tableHeight = height - 233;
             const that = this;
             window.onresize = function temp() {
-                that.tableHeight = window.innerHeight - 150;
+                that.tableHeight = window.innerHeight - 233;
             };
         },
         mounted() {
             this.getAllDate();
             this.getReportList();
             this.getProjectList();
+            this.getTimeType();
+            this.getDepartment();
         }
     };
 </script>
 
 <style lang="scss" scoped>
+    .allDaily {
+        width:82%;
+    }
+    .report_title {
+        padding:10px 0;
+    }
     .clearfix {
         overflow-x: auto;
         white-space: nowrap;
@@ -529,14 +1002,16 @@
 <style lang="scss">
     .daily {
         .el-card__body {
-            height: 82%;
+            height: 80%;
             overflow-y: auto;
         }
 
         .el-card__header {
             padding: 0 20px;
         }
+        
     }
+    
 </style>
 
 <style scoped>