Browse Source

待办任务模块接口和项目任务的权限:普通员工只能看自己的和待领取的,自己创建的。

seyason 3 years ago
parent
commit
4f6508ac11
15 changed files with 364 additions and 74 deletions
  1. 26 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java
  2. 63 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  3. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java
  4. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  5. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  6. 3 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserVO.java
  7. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  8. 2 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  9. 153 27
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  10. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  11. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  12. 31 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  13. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  14. 56 18
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  15. 6 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

+ 26 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java

@@ -3,9 +3,10 @@ package com.management.platform.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.api.R;
-import com.management.platform.entity.Stages;
-import com.management.platform.entity.Task;
-import com.management.platform.entity.TaskGroup;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.TaskGroupMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.StagesService;
 import com.management.platform.service.TaskGroupService;
 import com.management.platform.service.TaskService;
@@ -41,6 +42,12 @@ public class StagesController {
     private StagesService stagesService;
     @Resource
     private TaskService taskService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private TaskGroupMapper taskGroupMapper;
+    @Resource
+    private ProjectMapper projectMapper;
     /**
      * 保存任务列表
      */
@@ -139,6 +146,8 @@ public class StagesController {
         QueryWrapper<Stages> stagesQueryWrapper = new QueryWrapper<Stages>();
         stagesQueryWrapper.eq("group_id", item.getGroupId());
         String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+
         stagesQueryWrapper.orderByAsc("sequence");
         if (stagesService.count(stagesQueryWrapper) == 0) {
             //创建默认列表
@@ -150,7 +159,8 @@ public class StagesController {
             stagesService.save(stage);
         }
         List<Stages> list = stagesService.list(stagesQueryWrapper);
-
+        Integer projectId = taskGroupMapper.selectById(item.getGroupId()).getProjectId();
+        Project project = projectMapper.selectById(projectId);
         QueryWrapper<Task> queryWrapper = new QueryWrapper<Task>();
         //按任务分组查看
         queryWrapper.eq("group_id", item.getGroupId());
@@ -162,13 +172,21 @@ public class StagesController {
             queryWrapper.orderByAsc(order);
         }
         List<Task> tasks = taskService.simpleList(queryWrapper);
+        //普通员工,并且非项目经理,只能看到自己创建的,负责的和待分配的任务
+        if (user.getRole() == 0 && !project.getInchargerId().equals(userId)) {
+            tasks = tasks.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().equals(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
+        }
         List<Task> subTasks = new ArrayList<>();
         if (tasks.size() > 0) {
             List<Integer> collect = tasks.stream().map(Task::getId).collect(Collectors.toList());
-            subTasks.addAll(taskService.simpleList(new QueryWrapper<Task>().in("parent_tid", collect)));
+            List<Task> subLists = taskService.simpleList(new QueryWrapper<Task>().in("parent_tid", collect));
+            if (user.getRole() == 0 && !project.getInchargerId().equals(userId)) {
+                subLists = subLists.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().equals(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
+            }
+            subTasks.addAll(subLists);
         }
-
-        list.forEach(stages -> {
+        for (int i = 0; i < list.size(); i++) {
+            Stages stages = list.get(i);
             List<Task> taskList = tasks.stream().filter(t -> t.getStagesId().equals(stages.getId())).collect(Collectors.toList());
             stages.setTaskList(taskList);
             if (taskList.size() > 0) {
@@ -180,7 +198,7 @@ public class StagesController {
                     t.setSubTaskFinishNum((int)count);
                 });
             }
-        });
+        }
 
         msg.data = list;
         return msg;

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

@@ -3,8 +3,11 @@ package com.management.platform.controller;
 
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.TaskCommentMapper;
+import com.management.platform.mapper.TaskMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
@@ -29,9 +32,8 @@ import java.sql.Blob;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
+import java.util.*;
 import java.util.List;
-import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -70,6 +72,8 @@ public class TaskController {
     private TprogressPaticipatorsService tprogressPaticipatorsService;
     @Resource
     private TaskCommentMapper taskCommentMapper;
+    @Resource
+    private TaskMapper taskMapper;
 
     @RequestMapping("/save")
     public HttpRespMsg save(Task task) {
@@ -288,6 +292,8 @@ public class TaskController {
     public HttpRespMsg list(Task task, Integer viewId, String order, boolean isDesc) {
         HttpRespMsg msg = new HttpRespMsg();
         String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+        Project project = projectService.getById(task.getProjectId());
         QueryWrapper<Task> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("project_id", task.getProjectId());
         List<Stages> stagesList = stagesService.list(new QueryWrapper<Stages>().eq("project_id", task.getProjectId()));
@@ -323,6 +329,11 @@ public class TaskController {
             queryWrapper.lt("end_date", LocalDate.now()).eq("task_status", 0);
         }
         List<Task> list = taskService.simpleList(queryWrapper);
+
+        //普通员工,并且非项目经理,只能看到自己创建的,负责的和待分配的任务
+        if (user.getRole() == 0 && !project.getInchargerId().equals(userId)) {
+            list = list.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().equals(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
+        }
         //设置列表名称
         list.forEach(item->{
             Optional<Stages> first = stagesList.stream().filter(s -> s.getId().equals(item.getStagesId())).findFirst();
@@ -336,6 +347,8 @@ public class TaskController {
     }
 
 
+
+
     /**
      * 认领任务
      * @param id
@@ -532,5 +545,53 @@ public class TaskController {
     public HttpRespMsg importUser(Integer projectId, Integer groupId, Integer stagesId, @RequestParam MultipartFile file) {
         return taskService.importTask(projectId, groupId, stagesId, file, request);
     }
+
+
+    /**
+     * task/listByPage获取待办任务列表
+     * @param status 0-进行中,1-已完成
+     * @param viewId 1-我执行的任务, 2-我创建的任务
+     * @param pageIndex
+     * @param pageSize
+     * @return
+     */
+    @RequestMapping("/listByPage")
+    public HttpRespMsg listByPage(Integer status, Integer viewId, Integer pageIndex, Integer pageSize) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String userId = request.getHeader("Token");
+        QueryWrapper<Task> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByDesc("indate");
+
+        //任务状态
+        queryWrapper.eq("task_status", status);
+        if (viewId == 1) {
+            //我执行的任务
+            queryWrapper.eq("executor_id", userId);
+        } else if (viewId == 2) {
+            //我创建的任务
+            queryWrapper.eq("creater_id", userId);
+        }
+//        else if (viewId == 3) {
+//            //今天的任务
+//            queryWrapper.eq("end_date", LocalDate.now());
+//        } else if (viewId == 4) {
+//            //已超期的任务,未完成的任务
+//            queryWrapper.lt("end_date", LocalDate.now()).eq("task_status", 0);
+//        }
+        IPage<Task> taskIPage = taskMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<Task> list = taskIPage.getRecords();
+        List<Integer> collect = list.stream().map(Task::getProjectId).collect(Collectors.toList());
+        List<Project> projectList = projectService.list(new QueryWrapper<Project>().in("id", collect));
+        list.forEach(l->{
+            l.setProjectName(projectList.stream().filter(p->p.getId().equals(l.getProjectId())).findFirst().get().getProjectName());
+        });
+        Long total = taskIPage.getTotal();
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", list);
+        map.put("total", total);
+        msg.data = map;
+        return msg;
+    }
 }
 

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

@@ -184,6 +184,8 @@ public class Task extends Model<Task> {
     @TableField(exist = false)
     private TaskProgress progress;
 
+    @TableField(exist = false)
+    private String projectName;
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-11-06
+ * @since 2021-11-24
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -84,6 +84,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("multi_worktime")
     private Integer multiWorktime;
 
+    /**
+     * 强制固定月薪
+     */
+    @TableField("fix_monthcost")
+    private Integer fixMonthcost;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -178,6 +178,9 @@ public class User extends Model<User> {
     private LocalDate inactiveDate;
 
 
+    @TableField(exist = false)
+    private double totalHours;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -1,9 +1,6 @@
 package com.management.platform.entity.vo;
 
-import com.management.platform.entity.Company;
-import com.management.platform.entity.SysFunction;
-import com.management.platform.entity.SysModule;
-import com.management.platform.entity.User;
+import com.management.platform.entity.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -25,4 +22,6 @@ public class UserVO extends User {
     //功能按钮的访问权限
     private List<SysFunction> functionList;
 
+    private TimeType timeType;
+
 }

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

@@ -45,7 +45,13 @@ public interface ProjectMapper extends BaseMapper<Project> {
 
     List<CustomerProject> getProjectInAndOutByRange(Integer companyId, List<Integer> ids);
 
-    List<Map> getGanttData(@Param("userIds") List<String> userIds);
+    List<Map> getGanttData(@Param("userIds") List<String> userIds, @Param("companyId") Integer companyId);
 
     List<ProjectWithStage> selectWithStage(Integer companyId, Integer startIndex, Integer endIndex);
+
+    List<Map<String, Object>> getTimeCostReport(@Param("companyId") Integer companyId, @Param("startDate") String startDate, @Param("endDate") String endDate,
+                                          @Param("projectId") Integer projectId);
+
+    List<Map<String, Object>> getUserMonthTimeCost(@Param("companyId") Integer companyId, @Param("startDate") String startDate, @Param("endDate") String endDate);
+
 }

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

@@ -246,9 +246,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                             Map<String, Object> map = userTimeList.get(i);
                             if (map.get("creatorId").equals(finance.getUserId())) {
                                 double time = (Double)map.get("workingTime");
-                                System.out.println(finance.getUserId()+", "+finance.getName()+" time====="+time+", total=" + total);
-
-                                localUser.setCost(total.divide(new BigDecimal(time), 2, BigDecimal.ROUND_HALF_UP));
+                                localUser.setCost(total.divide(new BigDecimal(time), 6, BigDecimal.ROUND_HALF_UP));
                                 System.out.println("cost=="+localUser.getCost());
                                 break;
                             }
@@ -628,7 +626,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                     //该员工无工时填报,不计入项目
                     f.setHourCost(new BigDecimal(0));
                 } else {
-                    BigDecimal avgHourCost = f.getTotalCost().divide(b,4, BigDecimal.ROUND_HALF_UP);
+                    BigDecimal avgHourCost = f.getTotalCost().divide(b,6, BigDecimal.ROUND_HALF_UP);
                     f.setHourCost(avgHourCost);
                 }
             });

+ 153 - 27
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -81,6 +81,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     StagesMapper stagesMapper;
     @Resource
+    FinanceMapper financeMapper;
+    @Resource
     private HttpServletResponse response;
 
     @Value(value = "${upload.path}")
@@ -226,7 +228,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         httpRespMsg.setError("操作失败");
                     } else {
                         if (projectBaseCostData != null) {
-                            System.out.println("projectBaseCostData===="+projectBaseCostData);
                             updateProjectBaseCostData(projectBaseCostData, project.getId());
 
                             //创建项目涉及到基线成本数据,要填写到快照表中
@@ -422,22 +423,90 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //根据系统配置的员工成本计算方式,按固定时薪还是固定月薪,分情况计算。
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
             Map<String, Object> resultMap = new HashMap<>();
-            //时薪固定计算
-            List<Map<String, Object>> list = projectMapper.getTimeCost(companyId, startDate, endDate, null);
-            BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
-            for (Map<String, Object> map : list) {
-                if (!map.containsKey("cost")) {
-                    map.put("cost", 0);
+
+            TimeType timeType = timeTypeMapper.selectById(companyId);
+            if (timeType.getFixMonthcost() == 1) {
+                //每月固定月薪的方式计算,平摊到各个项目中
+                List<Map<String, Object>> list = projectMapper.getTimeCostReport(companyId, startDate+"-01", endDate+"-31", null);
+                //检查财务表中是否已经导入成本
+                List<Finance> financeList = financeMapper.selectList(new QueryWrapper<Finance>().eq("ymonth", startDate).eq("company_id", companyId));
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+                //计算人员总工时
+                for (Map<String, Object> map : list) {
+                    String creatorId = (String)map.get("creatorId");
+                    double cost = (double)map.get("cost");
+                    User user = userList.stream().filter(u -> u.getId().equals(creatorId)).findFirst().get();
+                    user.setTotalHours(user.getTotalHours() + cost);
                 }
-                if (!map.containsKey("costMoney")) {
-                    map.put("costMoney", 0);
-                } else {
-                    totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
+                //计算实际时薪
+                for (User user : userList) {
+                    if (user.getTotalHours() != 0) {
+                        Optional<Finance> first = financeList.stream().filter(f -> f.getUserId().equals(user.getId())).findFirst();
+                        BigDecimal monthCost = null;
+                        if (first.isPresent()) {
+                            monthCost = first.get().getTotalCost();
+                        } else {
+                            monthCost = user.getMonthCost();
+                        }
+                        user.setCost(monthCost.divide(new BigDecimal(user.getTotalHours()), 6, BigDecimal.ROUND_HALF_UP));
+                    } else {
+                        user.setCost(new BigDecimal(0));
+                    }
+                }
+
+                BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+                List<Map<String, Object>> retList = new ArrayList<>();
+                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId).orderByAsc("id"));
+                for (Project p : projectList) {
+                    Map<String, Object> projectMap = new HashMap<>();
+                    projectMap.put("id", p.getId());
+                    projectMap.put("name", p.getProjectName());
+                    //按照项目汇总
+                    double pTotalTime = 0;
+                    BigDecimal pTotalMoney = new BigDecimal(0);
+                    for (Map<String, Object> map : list) {
+                        String creatorId = (String)map.get("creatorId");
+                        int projectId = (int)map.get("projectId");
+                        if (projectId == p.getId()) {
+                            double costTime = (double)map.get("cost");
+                            pTotalTime += costTime;
+                            User curUser = userList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get();
+                            //该人员的成本
+                            pTotalMoney = pTotalMoney.add(curUser.getCost().multiply(new BigDecimal(costTime)));
+                        }
+                    }
+                    if (pTotalTime > 0) {
+                        projectMap.put("cost", pTotalTime);
+                        projectMap.put("costMoney", pTotalMoney);
+                        retList.add(projectMap);
+                        totalMoneyCost = totalMoneyCost.add(pTotalMoney);
+                    }
+                }
+
+                resultMap.put("costList", retList);
+                resultMap.put("totalMoneyCost", totalMoneyCost);
+                httpRespMsg.data = resultMap;
+
+            } else {
+                List<Map<String, Object>> list = projectMapper.getTimeCost(companyId, startDate, endDate, null);
+                BigDecimal totalMoneyCost = BigDecimal.valueOf(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)map.get("costMoney"));
+                    }
                 }
+
+                resultMap.put("costList", list);
+                resultMap.put("totalMoneyCost", totalMoneyCost);
+                httpRespMsg.data = resultMap;
             }
-            resultMap.put("costList", list);
-            resultMap.put("totalMoneyCost", totalMoneyCost);
-            httpRespMsg.data = resultMap;
+
+
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");
             return httpRespMsg;
@@ -655,19 +724,72 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if (!projectMapper.selectById(projectId).getCompanyId().equals(companyId)) {
                 httpRespMsg.setError("无权查看其他公司的项目详情");
             } else {
-                Map<String, Object> resultMap = new HashMap<>();
-                List<Map<String, Object>> list = projectMapper.getProjectCost(startDate, endDate, projectId);
-                BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
-                for (Map<String, Object> map : list) {
-                    if (!map.containsKey("costMoney")) {
-                        map.put("costMoney", 0);
-                    } else {
-                        totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
+                TimeType timeType = timeTypeMapper.selectById(companyId);
+                if (timeType.getFixMonthcost() == 0) {
+                    Map<String, Object> resultMap = new HashMap<>();
+                    List<Map<String, Object>> list = projectMapper.getProjectCost(startDate, endDate, projectId);
+                    BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+                    for (Map<String, Object> map : list) {
+                        if (!map.containsKey("costMoney")) {
+                            map.put("costMoney", 0);
+                        } else {
+                            totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
+                        }
+                    }
+                    resultMap.put("costList", list);
+                    resultMap.put("totalMoneyCost", totalMoneyCost);
+                    httpRespMsg.data = resultMap;
+                } else {
+                    startDate = startDate + "-01";
+                    endDate = endDate + "-31";
+                    List<Map<String, Object>> userMonthTimeCostList = projectMapper.getUserMonthTimeCost(companyId, startDate+"-01", endDate+"-31");
+
+                    List<Map<String, Object>> list = projectMapper.getProjectCost(startDate, endDate, projectId);
+
+                    //检查财务表中是否已经导入成本
+                    List<Finance> financeList = financeMapper.selectList(new QueryWrapper<Finance>().eq("ymonth", startDate).eq("company_id", companyId));
+                    List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+
+                    //计算实际时薪
+                    for (User user : userList) {
+                        double userTotalTime = 0;
+                        for (int i=0;i<userMonthTimeCostList.size(); i++) {
+                            Map map = userMonthTimeCostList.get(i);
+                            if (map.get("creatorId").equals(user.getId())) {
+                                userTotalTime = (double)map.get("cost");
+                                break;
+                            }
+                        }
+                        if (userTotalTime != 0) {
+                            Optional<Finance> first = financeList.stream().filter(f -> f.getUserId().equals(user.getId())).findFirst();
+                            BigDecimal monthCost = null;
+                            if (first.isPresent()) {
+                                monthCost = first.get().getTotalCost();
+                            } else {
+                                monthCost = user.getMonthCost();
+                            }
+                            user.setCost(monthCost.divide(new BigDecimal(userTotalTime), 6, BigDecimal.ROUND_HALF_UP));
+                        } else {
+                            user.setCost(new BigDecimal(0));
+                        }
+                    }
+
+                    Map<String, Object> resultMap = new HashMap<>();
+                    BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+
+                    //计算人员在项目上的投入工时
+                    for (Map<String, Object> map : list) {
+                        String creatorId = (String)map.get("creatorId");
+                        double cost = (double)map.get("cost");
+                        User user = userList.stream().filter(u -> u.getId().equals(creatorId)).findFirst().get();
+                        BigDecimal costMoney = user.getCost().multiply(new BigDecimal(cost));
+                        map.put("costMoney", costMoney);
+                        totalMoneyCost = totalMoneyCost.add(costMoney);
                     }
+                    resultMap.put("costList", list);
+                    resultMap.put("totalMoneyCost", totalMoneyCost);
+                    httpRespMsg.data = resultMap;
                 }
-                resultMap.put("costList", list);
-                resultMap.put("totalMoneyCost", totalMoneyCost);
-                httpRespMsg.data = resultMap;
             }
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");
@@ -1042,7 +1164,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<String> userIds = new ArrayList<>();
         if (user.getRole() == 0) {
             //看看是部门经理还是项目负责人
-            if (user.getManageDeptId() != null) {
+            if (user.getManageDeptId() != null && user.getManageDeptId() != 0) {
                 List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("department_id", user.getManageDeptId()));
                 userIds = userList.stream().map(User::getId).collect(Collectors.toList());
             } else {
@@ -1053,6 +1175,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", collect));
                     userIds = participationList.stream().map(Participation::getUserId).collect(Collectors.toList());
                 }
+                //把自己加进去
+                if (!userIds.contains(user.getId())) {
+                    userIds.add(user.getId());
+                }
             }
         } else {
             //查看全部
@@ -1062,7 +1188,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg msg = new HttpRespMsg();
         List<GanttDataItem> itemList = new ArrayList<>();
         if (userIds.size() > 0) {
-            List<Map> ganttData = projectMapper.getGanttData(userIds);
+            List<Map> ganttData = projectMapper.getGanttData(userIds, user.getCompanyId());
             String lastUserId = null;
 
             GanttDataItem lastUserItem = null;

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

@@ -143,6 +143,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             if (cnt > 0) {
                 userVO.setLeader(true);
             }
+            userVO.setTimeType(timeTypeMapper.selectById(company.getId()));
             httpRespMsg.data = userVO;
         } else {
             httpRespMsg.setError("密码错误");
@@ -1232,6 +1233,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         if (cnt > 0) {
             userVO.setLeader(true);
         }
+        userVO.setTimeType(timeTypeMapper.selectById(company.getId()));
         httpRespMsg.data = userVO;
         return httpRespMsg;
     }

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

@@ -90,7 +90,7 @@ public class TimingTask {
 //                    String corpUid = (String) u.get("corpwxUserid");
 //                    wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, "请及时填写今日的工作报告哦");
                 } else {
-                    pushProjectNotify((String)u.get("wxOpenid"), p.getProjectName(), days, p.getPlanEndDate().format(DateTimeFormatter.ofPattern("")));
+                    pushProjectNotify((String)u.get("wxOpenid"), p.getProjectName(), days, p.getPlanEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                 }
             });
 

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

@@ -103,9 +103,37 @@
         ORDER BY a.id ASC
     </select>
 
+    <!--获取日报的人员月度工时 -->
+    <select id="getTimeCostReport" resultType="java.util.Map">
+        SELECT a.working_time as cost, b.id as projectId, b.project_name AS project, a.creator_id as creatorId
+        FROM report AS a
+        LEFT JOIN project AS b ON a.project_id = b.id
+        LEFT JOIN user AS c ON a.creator_id = c.id
+        WHERE b.company_id = #{companyId}
+        <if test="projectId != null">
+            AND b.id = #{projectId}
+        </if>
+        <if test="startDate != null and endDate != null">
+            AND a.create_date between #{startDate} and #{endDate}
+        </if>
+        AND a.state = 1
+    </select>
+    <!--获取人员的月度总工时 -->
+    <select id="getUserMonthTimeCost" resultType="java.util.Map">
+        SELECT a.creator_id as creatorId, sum(a.working_time) as cost
+        FROM report AS a, user as b
+        WHERE a.creator_id = b.id
+        and b.company_id = #{companyId}
+        <if test="startDate != null and endDate != null">
+            AND a.create_date between #{startDate} and #{endDate}
+        </if>
+        AND a.state = 1
+        group by a.creator_id
+    </select>
+
     <!--获取某个项目每个人分别需要的工时-->
     <select id="getProjectCost" resultType="java.util.Map">
-        SELECT b.name, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
+        SELECT b.id as creatorId, b.name, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         WHERE a.project_id = #{projectId}
@@ -215,7 +243,8 @@
         WHERE participation.`user_id` IN
         <foreach collection="userIds" close=")" open="(" separator="," index="" item="item">
             #{item}
-        </foreach> AND project.`status` = 1 and project.plan_start_date is not null and project.plan_end_date is not null
+        </foreach>
+         AND project.`status` = 1 and project.plan_start_date is not null and project.plan_end_date is not null
         ORDER BY participation.user_id, project.`plan_start_date`
     </select>
 </mapper>

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

@@ -14,11 +14,12 @@
         <result column="pay_overtime" property="payOvertime" />
         <result column="alert_time" property="alertTime" />
         <result column="multi_worktime" property="multiWorktime" />
+        <result column="fix_monthcost" property="fixMonthcost" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime
+        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost
     </sql>
 
 </mapper>

+ 56 - 18
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -1,7 +1,7 @@
 <template>
     <section>
         <el-col :span="24" style="padding-bottom: 0px;text-align:center;margin-top:10px;">
-            <el-date-picker
+            <el-date-picker v-show="user.timeType.fixMonthcost==0"
             v-model="dateRange" :editable="false" 
             format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
             @change="getEchart" 
@@ -12,6 +12,14 @@
             end-placeholder="结束日期"
             ></el-date-picker>
 
+            <el-date-picker v-show="user.timeType.fixMonthcost==1"
+            v-model="dateRange" :editable="false" 
+            format="yyyy-MM" value-format="yyyy-MM" 
+            @change="getEchart" 
+            :clearable="false" 
+            type="month" 
+            ></el-date-picker>
+
             <el-radio-group v-model="radio" @change="getEchart" style="margin-left:10px;">
                 <el-radio-button label="项目"></el-radio-button>
                 <el-radio-button label="部门"></el-radio-button>
@@ -34,16 +42,26 @@
                         <el-option v-for="item in hasReportUserList"  :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item prop="projectId" label="日期范围">
-                    <el-date-picker
+                <el-form-item prop="projectId" :label="user.timeType.fixMonthcost==0?'日期范围':'选择月份'">
+                    <el-date-picker v-show="user.timeType.fixMonthcost==0"
                         v-model="exportParam.dateRange" :editable="false" 
                         format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
-                        :clearable="true" 
+                        :clearable="false" 
                         range-separator="至"
                         type="daterange" 
                         start-placeholder="开始日期"
                         end-placeholder="结束日期"
                     ></el-date-picker>
+
+                    
+                    <el-date-picker v-show="user.timeType.fixMonthcost==1"
+                    v-model="dateRange" :editable="false" 
+                    format="yyyy-MM" value-format="yyyy-MM" 
+                    @change="getEchart" 
+                    :clearable="true" 
+                    type="month" 
+                    ></el-date-picker>
+                    
                 </el-form-item>
                 
             </el-form>
@@ -72,6 +90,7 @@
             };
         },
         methods: {
+            
             showExportDialog() {
                 this.exportDialog = true;
                 this.exportParam.dateRange = this.dateRange;
@@ -152,7 +171,8 @@
             getUserCostList() {
                 this.listLoading = true;
                 this.http.post(this.port.project.userCost, {
-                    startDate:this.dateRange[0], endDate: this.dateRange[1]
+                    startDate:this.user.timeType.fixMonthcost==0?this.dateRange[0]:this.dateRange, 
+                    endDate: this.user.timeType.fixMonthcost==0?this.dateRange[1]:this.dateRange
                 },
                 res => {
                     this.listLoading = false;
@@ -310,7 +330,9 @@
                 var _this = this;
                 var param = {};
                 if (this.dateRange != null) {
-                    param = {startDate:this.dateRange[0], endDate: this.dateRange[1]};
+                    param = {startDate:this.user.timeType.fixMonthcost==0?this.dateRange[0]:this.dateRange, 
+                    endDate: this.user.timeType.fixMonthcost==0?this.dateRange[1]:this.dateRange};
+                    console.log(param);
                 }
                 var url = '';
                 if (this.radio=='项目') {
@@ -330,14 +352,14 @@
                             if(this.radio=='项目' || this.radio == '人员') {
                                 xList.push(this.radio=='项目'?list[i].project:list[i].name);
                                 yList.push({
-                                    "value": list[i].costMoney,
+                                    "value": list[i].costMoney.toFixed(2),
                                     "id": list[i].id,
                                     "cost": list[i].cost
                                 });
                             } else {
                                 xList.push(list[i].departmentName);
                                 yList.push({
-                                    "value": list[i].costMoney,
+                                    "value": list[i].costMoney.toFixed(2),
                                     "id": list[i].departmentId,
                                     "cost": list[i].costTime
                                 });
@@ -409,8 +431,13 @@
                                 console.log(_this.params)
                                 if(_this.radio=='项目') {
                                     if (_this.dateRange != null) {
-                                        _this.$router.push("/cost/" + _this.params[0].data.id + "/" + _this.params[0].name
+                                        if (this.user.timeType.fixMonthcost == 0) {
+                                            _this.$router.push("/cost/" + _this.params[0].data.id + "/" + _this.params[0].name
                                             +"?startDate="+_this.dateRange[0]+"&endDate="+_this.dateRange[1]);
+                                        } else {
+                                            _this.$router.push("/cost/" + _this.params[0].data.id + "/" + _this.params[0].name
+                                            +"?startDate="+_this.dateRange+"&endDate="+_this.dateRange);
+                                        }
                                     } else {
                                         _this.$router.push("/cost/" + _this.params[0].data.id + "/" + _this.params[0].name);
                                     }
@@ -448,16 +475,27 @@
             window.onresize = function temp() {
                 this.containerHeight = window.innerHeight - 100
             };
-            if (this.$route.query.startDate != null) {
-                this.dateRange = [this.$route.query.startDate, this.$route.query.endDate];
-            } else {
-                //默认查看本月
-                var now = new Date();
-                var t = util.formatDate.format(now, 'yyyy-MM-dd');
-                var startStr = util.formatDate.format(new Date(), 'yyyy-MM') + "-01";
-                this.dateRange = [startStr,t];
+            if (this.user.timeType.fixMonthcost == 0) {
+                if (this.$route.query.startDate != null) {
+                    this.dateRange = [this.$route.query.startDate, this.$route.query.endDate];
+                } else {
+                    //默认查看本月
+                    var now = new Date();
+                    var t = util.formatDate.format(now, 'yyyy-MM-dd');
+                    var startStr = util.formatDate.format(new Date(), 'yyyy-MM') + "-01";
+                    this.dateRange = [startStr,t];
+                }
+                this.exportParam.dateRange = this.dateRange;
+            } else if (this.user.timeType.fixMonthcost == 1) {
+                if (this.$route.query.startDate != null) {
+                    this.dateRange = this.$route.query.startDate;
+                } else {
+                    //默认查看本月
+                    var startStr = util.formatDate.format(new Date(), 'yyyy-MM');
+                    this.dateRange = startStr;
+                }
+                this.exportParam.dateRange = this.dateRange;
             }
-            this.exportParam.dateRange = this.dateRange;
             
             this.getEchart();
             var _this = this;

+ 6 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -243,7 +243,7 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="类型">
-                    <el-select v-model="addForm.taskType" style="width:100%;" >
+                    <el-select v-model="addForm.taskType" style="width:100%;" :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id">
                         <el-option v-for="item in taskTypeList" :key="item.id" :label="item.name" :value="item.id">
                             <i :class="item.icon" ></i>
                             <span>{{item.name}}</span>
@@ -251,7 +251,7 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="任务内容" prop="name">
-                    <el-input v-model="addForm.name"  placeholder="请输入任务内容" clearable></el-input>
+                    <el-input v-model="addForm.name" :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id" placeholder="请输入任务内容" clearable></el-input>
                 </el-form-item>
                 
                 <el-form-item label="执行人">
@@ -260,8 +260,9 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="截止时间" prop="endDate">
-                    <el-date-picker v-model="addForm.endDate" type="date" style="width:40%;" value-format="yyyy-MM-dd"  placeholder="请选择日期" ></el-date-picker>
-                    <span style="margin-left:30px;margin-right:10px;">计划工时</span><el-input-number  v-model="addForm.planHours" style="width:30%;" :min="1" :max="100"  placeholder="请输入计划工作时长,单位小时" ></el-input-number ><span style="margin-left:10px;">小时</span>
+                    <el-date-picker v-model="addForm.endDate" type="date" style="width:40%;" value-format="yyyy-MM-dd"  
+                    placeholder="请选择日期" :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id"></el-date-picker>
+                    <span style="margin-left:30px;margin-right:10px;">计划工时</span><el-input-number :disabled="this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id" v-model="addForm.planHours" style="width:30%;" :min="1" :max="100"  placeholder="请输入计划工作时长,单位小时" ></el-input-number ><span style="margin-left:10px;">小时</span>
                 </el-form-item>
                 
                 <el-form-item label="优先级">
@@ -445,7 +446,7 @@
                     </div>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="deleteTask" style="float:left;">删除</el-button>
+                <el-button v-if="user.id == this.addForm.createrId || currentProject.inchargerId == user.id" @click.native="deleteTask" style="float:left;">删除</el-button>
                 <el-button @click.native="addFormVisible = false">取消</el-button>
                 <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
             </div>