Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/TaskService.java
yusm 2 days ago
parent
commit
0f3342d29f
27 changed files with 327 additions and 347 deletions
  1. 2 2
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java
  2. 17 6
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/TaskController.java
  3. 1 1
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/TaskGroupController.java
  4. 1 1
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  5. 1 1
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/entity/Task.java
  6. 1 1
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/entity/TaskExecutor.java
  7. 1 1
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/entity/vo/GanttDataItem.java
  8. 2 0
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/TaskService.java
  9. 2 2
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  10. 19 20
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  11. 17 1
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  12. 1 1
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  13. 5 5
      fhKeeper/formulahousekeeper/management-platform-mld/src/main/resources/mapper/TaskMapper.xml
  14. 0 114
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  15. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskExecutorMapper.java
  16. 23 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExcelParserService.java
  17. 15 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  18. 21 118
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  19. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties
  20. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties
  21. 37 3
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  22. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  23. 1 1
      fhKeeper/formulahousekeeper/timesheet_mld/src/components/taskComponent.vue
  24. 14 7
      fhKeeper/formulahousekeeper/timesheet_mld/src/views/Home.vue
  25. 128 49
      fhKeeper/formulahousekeeper/timesheet_mld/src/views/project/gantt.vue
  26. 2 0
      fhKeeper/formulahousekeeper/timesheet_mld/src/views/project/project_gantt.vue
  27. 7 10
      fhKeeper/formulahousekeeper/timesheet_mld/src/views/task/list.vue

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

@@ -81,8 +81,8 @@ public class GroupBudgetReviewController {
         Project project = projectMapper.selectById(taskGroup.getProjectId());
         if(project.getCategory()!=null&&project.getCategory()==696){
             List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().select(Task::getPlanHours,Task::getGroupId).isNotNull(Task::getPlanHours).eq(Task::getGroupId, groupId));
-            int sum = taskList.stream().mapToInt(Task::getPlanHours).sum();
-            if(sum>((nowManDay==null?0:nowManDay)*8)){
+            double sum = taskList.stream().mapToDouble(Task::getPlanHours).sum();
+            if(sum>((nowManDay==null?0:nowManDay)*7.5)){
                 httpRespMsg.setError("任务分组["+taskGroup.getName()+"]的预估工时需大于等于已分配任务的总计划工时["+sum+"]小时");
                 return httpRespMsg;
             }

+ 17 - 6
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/TaskController.java

@@ -238,6 +238,7 @@ public class TaskController {
             List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()));
             List<TaskExecutor> executorList = JSONArray.parseArray(executorListStr, TaskExecutor.class);
             task.setExecutorList(executorList);
+            StringBuilder conflictExecutor = new StringBuilder();
             executorList.stream().forEach(ex->{
                 //执行人必填
                 if (StringUtils.isEmpty(ex.getExecutorId())) {
@@ -264,9 +265,13 @@ public class TaskController {
                 //检查人员在其他任务上是否有时间冲突
                 Integer count = taskMapper.getUserConflitTaskCount(ex.getExecutorId(), task.getId(), task.getStartDate(), task.getEndDate());
                 if (count > 0) {
-                    msg.setError(ex.getExecutorName()+"在其他任务上有时间冲突");
+                    conflictExecutor.append(ex.getExecutorName()).append(",");
                 }
             });
+            if (conflictExecutor.length() > 0) {
+                conflictExecutor.deleteCharAt(conflictExecutor.length() - 1);
+                msg.setError("执行人[" + conflictExecutor.toString() + "]在其他任务上有时间冲突");
+            }
             if (msg.code.equals("error")) {
                 return msg;
             }
@@ -280,7 +285,7 @@ public class TaskController {
             String colors = executorList.stream().filter(f->!StringUtils.isEmpty(f.getExecutorId())).map(TaskExecutor::getExecutorColor).collect(Collectors.joining(","));
             task.setExecutorColor(StringUtils.isEmpty(colors)?null:colors);
             //总时长
-            task.setPlanHours(executorList.stream().filter(f->f.getPlanHours() != null).mapToInt(TaskExecutor::getPlanHours).sum());
+            task.setPlanHours(executorList.stream().filter(f->f.getPlanHours() != null).mapToDouble(TaskExecutor::getPlanHours).sum());
             //校验总计划工时不得超过父任务的计划工时
             if (task.getParentTid() != null) {
                 Task pTask = taskService.getById(task.getParentTid());
@@ -290,7 +295,7 @@ public class TaskController {
                         //过滤掉当前任务
                         subTaskList = subTaskList.stream().filter(sub->!sub.getId().equals(task.getId())).collect(Collectors.toList());
                     }
-                    Integer leftHours = pTask.getPlanHours() - subTaskList.stream().mapToInt(Task::getPlanHours).sum();
+                    double leftHours = pTask.getPlanHours() - subTaskList.stream().mapToDouble(Task::getPlanHours).sum();
                     if (leftHours == 0) {
                         msg.setError("父任务计划工时已分配完,请调整。");
                         return msg;
@@ -305,7 +310,7 @@ public class TaskController {
                 if (task.getPlanHours() != null) {
                     List<Task> allSubTasks = taskMapper.selectList(new QueryWrapper<Task>().select("id, plan_hours").eq("parent_tid", task.getId()));
                     if (allSubTasks.size() > 0) {
-                        int sum = allSubTasks.stream().mapToInt(Task::getPlanHours).sum();
+                        double sum = allSubTasks.stream().mapToDouble(Task::getPlanHours).sum();
                         if (task.getPlanHours() < sum) {
                             msg.setError("计划工时不得少于全部子任务计划工时总和("+sum+"小时),请调整。");
                             return msg;
@@ -1516,12 +1521,12 @@ public class TaskController {
             switch (dateType){
                 case 0:
                     if(null != startDate && null != endDate){
-                        queryWrapper.ge("start_date",startDate).le("start_date",endDate);
+                        queryWrapper.ge("start_date",startDate + " 00:00:00").le("start_date",endDate + " 23:59:59");
                     }
                     break;
                 case 1:
                     if(null != startDate && null != endDate){
-                        queryWrapper.ge("task.end_date",startDate).le("task.end_date",endDate);
+                        queryWrapper.ge("task.end_date",startDate + " 00:00:00" ).le("task.end_date",endDate + " 23:59:59");
                     }
                     break;
             }
@@ -1850,6 +1855,12 @@ public class TaskController {
         return taskService.cancelByManager(id,request);
     }
 
+    @RequestMapping("/cancelByCreator")
+    public HttpRespMsg cancelByCreator(Integer id){
+        return taskService.cancelByCreator(id,request);
+    }
+
+
     @RequestMapping("/viewUserTaskSchedule")
     public HttpRespMsg viewUserTaskSchedule(Integer taskId, String userId, String startDate, String endDate){
         return taskService.viewUserTaskSchedule(taskId, userId, startDate, endDate, request);

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -191,7 +191,7 @@ public class TaskGroupController {
             if(taskGroup.getProjectId()!=null){
                 Optional<Project> first = projectList.stream().filter(p -> p.getId().equals(taskGroup.getProjectId())).findFirst();
                 if(first.isPresent()&&first.get().getCategory()==696){
-                    int sum = targetTaskList.stream().mapToInt(Task::getPlanHours).sum();
+                    double sum = targetTaskList.stream().mapToDouble(Task::getPlanHours).sum();
                     if(sum>((taskGroup.getManDay()==null?0:taskGroup.getManDay())*8)){
                         msg.setError("任务分组["+taskGroup.getName()+"]的预估工时需大于等于已分配任务的总计划工时["+sum+"]小时");
                         return msg;

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -1699,7 +1699,7 @@ public class WeiXinCorpController {
                         stagesMapper.insert(stage);
                         Task task=new Task();
                         TimeType timeType = timeTypeMapper.selectById(company.getId());
-                        Integer oneDayHours = 8;
+                        double oneDayHours = 7.5;
                         task.setCreateDate(LocalDate.now());
                         task.setProjectId(project.getId());
                         task.setCompanyId(company.getId());

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/entity/Task.java

@@ -155,7 +155,7 @@ public class Task extends Model<Task> {
      * 计划工时
      */
     @TableField("plan_hours")
-    private Integer planHours;
+    private Double planHours;
 
     /**
      * 0-任务,1-里程碑,2-风险

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/entity/TaskExecutor.java

@@ -55,7 +55,7 @@ public class TaskExecutor extends Model<TaskExecutor> {
      * 计划工时
      */
     @TableField("plan_hours")
-    private Integer planHours;
+    private Double planHours;
 
     @TableField("project_id")
     private Integer projectId;

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/entity/vo/GanttDataItem.java

@@ -11,7 +11,7 @@ public class GanttDataItem {
     public String id;
     public String userId;
     public String text;
-    public Integer time;
+    public Double time;
 //    @JsonFormat(pattern = "yyyy-MM-dd")
     public String start_date;
 //    @JsonFormat(pattern = "yyyy-MM-dd")

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/TaskService.java

@@ -72,4 +72,6 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg viewUserTaskSchedule(Integer taskId, String userId, String startDate, String endDate, HttpServletRequest request);
 
     HttpRespMsg importTaskNew(Integer isMultiProject, Integer projectId, Integer groupId, MultipartFile file, HttpServletRequest request) throws Exception;
+
+    HttpRespMsg cancelByCreator(Integer id, HttpServletRequest request);
 }

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -337,7 +337,7 @@ public class DingDingServiceImpl implements DingDingService {
                 stage.setStagesName("工作开展");
                 stagesMapper.insert(stage);
                 Task task=new Task();
-                Integer oneDayHours = 8;
+                double oneDayHours = 7.5;
                 task.setCreateDate(LocalDate.now());
                 task.setProjectId(project.getId());
                 task.setCompanyId(company.getId());
@@ -578,7 +578,7 @@ public class DingDingServiceImpl implements DingDingService {
                 stage.setStagesName("工作开展");
                 stagesMapper.insert(stage);
                 Task task=new Task();
-                Integer oneDayHours = 8;
+                double oneDayHours = 7.5;
                 task.setCreateDate(LocalDate.now());
                 task.setProjectId(project.getId());
                 task.setCompanyId(company.getId());

+ 19 - 20
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -4871,7 +4871,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 for(Department department:departmentList){
                     GanttDataItem parent = new GanttDataItem();
                     parent.id=department.getDepartmentId().toString();
-                    parent.time = 0;
+                    parent.time = 0.0;
                     parent.text=department.getDepartmentName();
                     parent.type="";
                     if(department.getSuperiorId()!=null){
@@ -4910,7 +4910,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         userGantt.render = "split";
                         userGantt.start_date = null;
                         userGantt.end_date = null;
-                        userGantt.time = 0;
+                        userGantt.time = 0.0;
                         userGantt.parent=String.valueOf(u.getDepartmentId());
                         userGantt.setObjType(0);
                         itemList.add(userGantt);
@@ -4934,7 +4934,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         parent.render = "split";
                         parent.start_date = businessTripList.get(i).getStartDate().toString();
                         parent.end_date = businessTripList.get(i).getEndDate().toString();
-                        parent.time = 0;
+                        parent.time = 0.0;
                         parent.parent=String.valueOf(departmentId);
                         parent.setObjType(0);
                         itemList.add(parent);
@@ -4983,7 +4983,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         }
                     }
                 }
-                System.out.println("按项目查看,项目size="+projectIds.size());
                 ganttData = projectMapper.getTaskPlanByProject(projectIds, startDate + " 00:00:00" ,endDate + " 23:59:59", user.getCompanyId(),groupName,taskType,userIds);
                 QueryWrapper<BusinessTrip> btQueryWrapper =new QueryWrapper<>();
                 QueryWrapper<BustripProject> bpQueryWrapper =new QueryWrapper<>();
@@ -5018,7 +5017,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 parent.render = "split";
                                 parent.start_date = bustripProject.getStartDate().toString();
                                 parent.end_date = bustripProject.getEndDate().toString();
-                                parent.time = 0;
+                                parent.time = 0.0;
                                 parent.setObjType(0);
                                 itemList.add(parent);
                                 btLastItemId = String.valueOf(bustripProject.getProjectId());
@@ -5041,7 +5040,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
             String lastItemId = null;
             GanttDataItem lastParentItem = null;
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             for (int i=0;i<ganttData.size(); i++) {
                 Map map = ganttData.get(i);
                 String userId = (String) map.get("user_id");
@@ -5070,7 +5069,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         parent.render = "split";
                         parent.start_date = start_date;
                         parent.end_date = end_date;
-                        parent.time = 0;
+                        parent.time = 0.0;
                         parent.parent=String.valueOf(departmentId);
                         parent.setObjType(0);
                         itemList.add(parent);
@@ -5096,7 +5095,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     curItem.setLeaderOrManager(map.get("leaderOrManager")==null?null:(Integer)map.get("leaderOrManager"));
                     curItem.setTaskPlan(map.get("taskPlan")==null?null:(Integer)map.get("taskPlan"));
                     curItem.end_date = end_date;
-                    curItem.time = (Integer)map.get("duration");
+                    curItem.time = (Double)map.get("duration");
                     curItem.parent = lastItemId;
                     curItem.setObjType(2);
                     itemList.add(curItem);
@@ -5112,7 +5111,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         parent.render = "split";
                         parent.start_date = start_date;
                         parent.end_date = end_date;
-                        parent.time = 0;
+                        parent.time = 0.0;
                         parent.setObjType(2);
                         itemList.add(parent);
                         lastItemId = projectId;
@@ -5136,7 +5135,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     curItem.setTaskPlan(map.get("taskPlan")==null?null:(Integer)map.get("taskPlan"));
                     curItem.start_date = start_date;
                     curItem.end_date = end_date;
-                    curItem.time = (Integer)map.get("duration");
+                    curItem.time = (Double)map.get("duration");
                     curItem.parent = lastItemId;
                     curItem.setObjType(2);
                     itemList.add(curItem);
@@ -12649,7 +12648,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 for(Department department:departmentList){
                     GanttDataItem parent = new GanttDataItem();
                     parent.id=department.getDepartmentId().toString();
-                    parent.time = 0;
+                    parent.time = 0.0;
                     parent.text=department.getDepartmentName();
                     parent.translationType="department";
                     if(department.getSuperiorId()!=null){
@@ -12687,7 +12686,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         userGantt.render = "split";
                         userGantt.start_date = null;
                         userGantt.end_date = null;
-                        userGantt.time = 0;
+                        userGantt.time = 0.0;
                         userGantt.color=u.getColor();
                         userGantt.parent=String.valueOf(u.getDepartmentId());
                         userGantt.children=new ArrayList<>();
@@ -12715,7 +12714,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         parent.render = "split";
                         parent.start_date = leaveSheetList.get(i).getStartDate().toString();
                         parent.end_date = leaveSheetList.get(i).getEndDate().toString();
-                        parent.time = 0;
+                        parent.time = 0.0;
                         parent.parent=String.valueOf(departmentId);
                         lsLastItemId =leaveSheetList.get(i).getOwnerId();
                     }
@@ -12774,7 +12773,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         parent.render = "split";
                         parent.start_date = businessTripList.get(i).getStartDate().toString();
                         parent.end_date = businessTripList.get(i).getEndDate().toString();
-                        parent.time = 0;
+                        parent.time = 0.0;
                         parent.parent=String.valueOf(departmentId);
                         btLastItemId =businessTripList.get(i).getOwnerId();
                     }
@@ -12854,7 +12853,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 parent.render = "split";
                                 parent.start_date = bustripProject.getStartDate().toString();
                                 parent.end_date = bustripProject.getEndDate().toString();
-                                parent.time = 0;
+                                parent.time = 0.0;
                                 parent.children=new ArrayList<>();
                                 itemList.add(parent);
                                 btLastItemId = String.valueOf(bustripProject.getProjectId());
@@ -12909,7 +12908,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         parent.render = "split";
                         parent.start_date = start_date;
                         parent.end_date = end_date;
-                        parent.time = 0;
+                        parent.time = 0.0;
                         parent.translationType="user";
                         parent.parent=String.valueOf(departmentId);
                         parent.children=new ArrayList<>();
@@ -12928,7 +12927,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     curItem.start_date = start_date;
 
                     curItem.end_date = end_date;
-                    curItem.time = (Integer)map.get("duration");
+                    curItem.time = (Double)map.get("duration");
                     curItem.parent = lastItemId;
                     curItem.level = level;
                     curItem.children=new ArrayList<>();
@@ -12944,7 +12943,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         parent.render = "split";
                         parent.start_date = start_date;
                         parent.end_date = end_date;
-                        parent.time = 0;
+                        parent.time = 0.0;
                         parent.children=new ArrayList<>();
                         lastItemId = projectId;
                         itemList.add(parent);
@@ -12955,7 +12954,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     curItem.text = (String) map.get("name")+"/"+(String)map.get("task_name");
                     curItem.start_date = start_date;
                     curItem.end_date = end_date;
-                    curItem.time = (Integer)map.get("duration");
+                    curItem.time = (Double)map.get("duration");
                     curItem.translationType="user";
                     curItem.parent = lastItemId;
                     curItem.level = level;
@@ -13393,7 +13392,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         for (Department dept : collect) {
             GanttDataItem subParent = new GanttDataItem();
             subParent.id=dept.getDepartmentId().toString();
-            subParent.time = 0;
+            subParent.time = 0.0;
             subParent.text=dept.getDepartmentName();
             subParent.translationType="department";
             if(dept.getSuperiorId()!=null){

+ 17 - 1
fhKeeper/formulahousekeeper/management-platform-mld/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -544,7 +544,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     task.setEndDate(endDate);
                 }
                 if(planHoursCell!=null){
-                    task.setPlanHours(Integer.parseInt(planHoursCell.getStringCellValue()));
+                    task.setPlanHours(Double.parseDouble(planHoursCell.getStringCellValue()));
                 }
                 if(descCell!=null){
                     task.setTaskDesc(descCell.getStringCellValue());
@@ -1545,6 +1545,22 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         return msg;
     }
 
+    @Override
+    public HttpRespMsg cancelByCreator(Integer id, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        Task task = taskMapper.selectById(id);
+        if (!token.equals(task.getCreaterId())) {
+            msg.setError("您没有权限");
+        } else if (task.getTaskStatus() != TaskController.STATUS_FIRST_CHECK) {
+            msg.setError("当前计划状态无法撤回");
+        } else {
+            task.setTaskStatus(TaskController.STATUS_CANCEL);
+            taskMapper.updateById(task);
+        }
+        return msg;
+    }
+
     private List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
         List<Integer> list = new ArrayList<>();
         list.add(departmentId);

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

@@ -3405,7 +3405,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         stage.setStagesName("工作开展");
         stagesMapper.insert(stage);
         Task task=new Task();
-        Integer oneDayHours = 8;
+        double oneDayHours = 7.5;
         task.setCreateDate(LocalDate.now());
         task.setProjectId(project.getId());
         task.setCompanyId(company.getId());

+ 5 - 5
fhKeeper/formulahousekeeper/management-platform-mld/src/main/resources/mapper/TaskMapper.xml

@@ -327,9 +327,9 @@
         task_executor.`first_auditor_id`, group_concat(task_executor.`second_auditor_id`) as second_auditor_id, u1.name AS first_auditor_name, group_concat(u2.`name`) AS second_auditor_name
         FROM task LEFT JOIN project ON project.id = task.`project_id`
         left join task_executor on task_executor.task_id=task.id
-        LEFT JOIN USER u1 ON u1.id = task_executor.`first_auditor_id`
-        LEFT JOIN USER u2 ON u2.id = task_executor.`second_auditor_id`
-        left join user on user.id = task.`reject_user_id`
+        LEFT JOIN `user` u1 ON u1.id = task_executor.`first_auditor_id`
+        LEFT JOIN `user` u2 ON u2.id = task_executor.`second_auditor_id`
+        left join  `user` on user.id = task.`reject_user_id`
         left join stages on stages.id = task.stages_id
         left join department on department.department_id=project.dept_id
         ${ew.customSqlSegment}
@@ -850,7 +850,7 @@
         SELECT task.*, task_executor.`first_auditor_id`, group_concat(task_executor.`second_auditor_id`) as second_auditor_id, u1.name AS first_auditor_name, group_concat(u2.`name`) AS second_auditor_name, project.`project_name`, stages.stages_name
         FROM task LEFT JOIN task_executor ON task.id = task_executor.`task_id`
         left join project on project.id = task.`project_id`
-        LEFT JOIN USER u1 ON u1.id = task_executor.`first_auditor_id` LEFT JOIN USER u2 ON u2.id = task_executor.`second_auditor_id`
+        LEFT JOIN `user` u1 ON u1.id = task_executor.`first_auditor_id` LEFT JOIN `user` u2 ON u2.id = task_executor.`second_auditor_id`
         left join stages on stages.id = task.stages_id
         ${ew.customSqlSegment}
         and (task_executor.`audit_status` = 3 AND task_executor.`first_auditor_id` = #{userId} ) or (task.task_status = 4 and task_executor.`audit_status` = 4 AND task_executor.`second_auditor_id` = #{userId} )
@@ -863,7 +863,7 @@
     <select id="getMyAuditTaskCount"
             resultType="java.lang.Integer">
         SELECT count(DISTINCT task.id) FROM task LEFT JOIN task_executor ON task.id = task_executor.`task_id`
-                                                 LEFT JOIN USER u1 ON u1.id = task_executor.`first_auditor_id` LEFT JOIN USER u2 ON u2.id = task_executor.`second_auditor_id`
+                                                 LEFT JOIN `user` u1 ON u1.id = task_executor.`first_auditor_id` LEFT JOIN `user` u2 ON u2.id = task_executor.`second_auditor_id`
             ${ew.customSqlSegment}
         and (task_executor.`audit_status` = 3 AND task_executor.`first_auditor_id` = #{userId} ) or (task.task_status = 4 and task_executor.`audit_status` = 4 AND task_executor.`second_auditor_id` = #{userId} )
     </select>

+ 0 - 114
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -1331,120 +1331,6 @@ public class ProjectController {
         return projectService.exportFTEData(monthStart,monthEnd,area,departmentId,request);
     }
 
-    @RequestMapping("/syncProjectWithFanwei")
-    public HttpRespMsg syncProjectWithFanwei(HttpServletRequest request){
-        User user = userMapper.selectById(request.getHeader("token"));
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
-        String url="http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getProejct";
-        JSONObject jsonObject=new JSONObject();
-        jsonObject.put("rybh","");
-        jsonObject.put("workDate","");
-        String jsonString = jsonObject.toJSONString();
-        HttpRespMsg result = DockWithMLD.getResult(url, null);
-        List<Map<String,Object>> dataList= (List<Map<String, Object>>) result.data;
-        List<Project> workTimeProjectList = projectService.list(new QueryWrapper<Project>().eq("company_id", 876).select("project_code","id"));
-//        List<Map<String, Object>> mapList = dataList.stream().filter(dl ->!dl.get("xmdm").equals("")&&
-//                !workTimeProjectList.stream().anyMatch(wl->wl.getProjectCode()!=null&&!wl.getProjectCode().equals("")&&wl.getProjectCode().equals(dl.get("xmdm")))).collect(Collectors.toList());
-        List<Map<String, Object>> mapList = dataList;
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", 876).select("job_number", "id","name"));
-        int insert=0;
-        int update=0;
-        StringBuilder sb=new StringBuilder();
-        sb.append("更新的项目:");
-        for (Map<String, Object> map : mapList) {
-            List<Participation> participationList=new ArrayList<>();
-            Optional<User> first = userList.stream().filter(ul ->ul.getJobNumber()!=null&&ul.getJobNumber().equals(map.get("xmfzrplxm"))).findFirst();
-            if(workTimeProjectList.stream().anyMatch(wl->wl.getProjectCode()!=null&&wl.getProjectCode().equals(map.get("xmdm")))){
-                Optional<Project> project = workTimeProjectList.stream().filter(wl -> wl.getProjectCode() != null && wl.getProjectCode().equals(map.get("xmdm"))).findFirst();
-                if(project.isPresent()){
-                    Project item = project.get();
-                    item.setFromOutside(1);
-                    item.setProjectName(String.valueOf(map.get("xmmc")));
-                    if(first.isPresent()){
-                        item.setInchargerId(first.get().getId())
-                                .setInchargerName(first.get().getName());
-                    }
-                    boolean isUpdate=false;
-                    if(!item.getInchargerId().equals(first.get().getId())){
-                        update++;
-                        isUpdate=true;
-                    }
-                    projectService.updateById(item);
-                    List<Participation> allParticipations = participationService.list(new QueryWrapper<Participation>().eq("project_id", item.getId()));
-                    if(map.get("xmcygs")!=null&&!map.get("xmcygs").equals("")){
-                        participationService.remove(new QueryWrapper<Participation>().eq("project_id",item.getId()));
-                        String participations = String.valueOf(map.get("xmcygs"));
-                        List<String> list = Arrays.asList(participations.split(","));
-                        for (String s : list) {
-                            Optional<User> participation = userList.stream().filter(ul ->ul.getJobNumber()!=null&&ul.getJobNumber().equals(s)).findFirst();
-                            if(participation.isPresent()){
-                                Participation p=new Participation();
-                                p.setUserId(participation.get().getId()).setProjectId(item.getId());
-                                participationList.add(p);
-                            }
-                        }
-                        List<String> collect = allParticipations.stream().map(al -> al.getUserId()).distinct().collect(Collectors.toList());
-                        List<String> collect1 = participationList.stream().map(pl -> pl.getUserId()).distinct().collect(Collectors.toList());
-                        System.out.println("之前的数据:"+collect);
-                        System.out.println("之后的数据:"+collect1);
-                        if(collect.size()!=collect1.size()){
-                            sb.append("["+item.getProjectName()+"/"+item.getProjectCode()+"]"+"\n");
-                            if(!isUpdate){
-                                update++;
-                            }
-                        }else if(!collect.containsAll(collect1)){
-                            sb.append("["+item.getProjectName()+"/"+item.getProjectCode()+"]"+"\n");
-                            if(!isUpdate){
-                                update++;
-                            }
-                        }
-                    }
-                    if(participationList.size()>0){
-                        participationService.saveBatch(participationList);
-                    }
-                }
-            }else {
-                Project project=new Project();
-                project.setProjectName(String.valueOf(map.get("xmmc")))
-                        .setProjectCode(String.valueOf(map.get("xmdm")))
-                        .setCompanyId(876)
-                        .setCreateDate(LocalDate.now())
-                        .setFromOutside(1);
-                if(first.isPresent()){
-                    project.setInchargerId(first.get().getId())
-                            .setInchargerName(first.get().getName());
-                }
-                projectService.save(project);
-                insert++;
-                if(map.get("xmcygs")!=null&&!map.get("xmcygs").equals("")){
-                    String participations = String.valueOf(map.get("xmcygs"));
-                    List<String> list = Arrays.asList(participations.split(","));
-                    for (String s : list) {
-                        Optional<User> participation = userList.stream().filter(ul ->ul.getJobNumber()!=null&&ul.getJobNumber().equals(s)).findFirst();
-                        if(participation.isPresent()){
-                            Participation p=new Participation();
-                            p.setUserId(participation.get().getId()).setProjectId(project.getId());
-                            participationList.add(p);
-                        }
-                    }
-                }
-                if(participationList.size()>0){
-                    participationService.saveBatch(participationList);
-                }
-            }
-        }
-        OperationRecord operationRecord=new OperationRecord();
-        operationRecord.setCompanyId(876)
-                       .setContent("同步新增来自泛微的项目数据,共"+insert+"条数据"+"\n"+"同步更新来自泛微的项目数据,共"+update+"条数据"+"\n"+sb.toString())
-                       .setModuleName("项目管理").setOperationTime(LocalDateTime.now())
-                       .setOperatorName(user.getName());
-        if(operationRecord.getContent().length()>1000){
-            operationRecord.setContent(operationRecord.getContent().substring(0,999));
-        }
-        operationRecordService.save(operationRecord);
-        httpRespMsg.setMsg("同步新增来自泛微的项目数据,共"+insert+"条数据"+"\n"+"同步更新来自泛微的项目数据,共"+update+"条数据");
-        return httpRespMsg;
-    }
 
     @LimitRequest(count = 60)
     @RequestMapping("/getProjectListByToken")

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskExecutorMapper.java

@@ -3,6 +3,7 @@ package com.management.platform.mapper;
 import com.management.platform.entity.TaskExecutor;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
@@ -17,4 +18,9 @@ import java.util.List;
 public interface TaskExecutorMapper extends BaseMapper<TaskExecutor> {
 
     List<TaskExecutor> getInfoWithFileCharge(@Param("taskId") Integer taskId);
+
+    @Select("SELECT task_executor.* FROM task_executor LEFT JOIN project ON project.`id` = task_executor.`project_id` LEFT JOIN `user` ON `user`.id = task_executor.`executor_id`\n" +
+            "         WHERE project.`company_id` = #{companyId}  AND executor_id IS NOT NULL AND project.`status` = 1 AND user.`is_active`=1\n" +
+            "AND NOT EXISTS (SELECT participation.`user_id` FROM participation WHERE participation.`project_id` = task_executor.`project_id` AND participation.`user_id` = task_executor.`executor_id`) ")
+    List<TaskExecutor> getMissedParticipation(Integer companyId);
 }

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

@@ -23,7 +23,7 @@ public class ExcelParserService {
 
             // 获取表头行
             Row headerRow = sheet.getRow(0);
-
+            List<String> ignoreDates = new ArrayList<>();
             // 从第二行开始解析数据(假设第一行是表头)
             for (int i = 2; i <= sheet.getLastRowNum(); i++) {
                 Row row = sheet.getRow(i);
@@ -42,6 +42,7 @@ public class ExcelParserService {
 
                     // 解析日期(格式如:03-01\n周六)
                     String dateStr = getCellValue(dateCell);
+                    if (ignoreDates.contains(dateStr)) continue;
                     String[] dateParts = dateStr.split("\n");
                     if (dateParts.length < 1) continue;
 
@@ -58,6 +59,27 @@ public class ExcelParserService {
 
                     // 分割时间记录(可能有多个打卡时间)
                     String[] times = timeRecord.split("\n");
+
+                    if (times.length == 1) {
+                        //当前只有一次打卡,可能是晚班,要获取次日最晚打卡作为下班打卡。
+                        if (times[0].compareTo("18:00") > 0) {
+                            String sTime = times[0];
+                            //次日最晚打卡
+                            Cell nextDateCell = headerRow.getCell(col + 1);
+                            String nextDateStr = getCellValue(nextDateCell);
+                            Cell nextDayTime = row.getCell(col + 1);
+                            String nextDayTimeStr = getCellValue(nextDayTime);
+                            String[] nextDayTimes = nextDayTimeStr.split("\n");
+                            if (nextDayTimes[nextDayTimes.length -1].compareTo("12:00") < 0) {
+                                //次日上午打卡结束
+                                String nextDayEndTime = "次日"+nextDayTimes[nextDayTimes.length -1];
+                                times = new String[2];
+                                times[0] = sTime;
+                                times[1] = nextDayEndTime;
+                                ignoreDates.add(nextDateStr);
+                            }
+                        }
+                    }
                     if (times.length < 2) continue;
 
                     // 取第一个和最后一个时间作为上班和下班时间

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

@@ -3847,16 +3847,30 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     @Override
     public HttpRespMsg addMemb(Integer id, String[] userId) {
-        List<String> userIdList = new ArrayList<>();
         List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().eq("project_id", id));
+        StringBuilder stringBuilder = new StringBuilder();
         for (String uid: userId) {
             if (participationList.stream().filter(p->p.getUserId().equals(uid)).count() == 0) {
                 Participation item = new Participation();
                 item.setProjectId(id);
                 item.setUserId(uid);
                 participationMapper.insert(item);
+                stringBuilder.append(userMapper.selectById(uid).getName()).append(",");
             }
         }
+        //生成操作记录
+        User user = userMapper.selectById(request.getHeader("token"));
+        Project project = getById(id);
+        OperationRecord operationRecord=new OperationRecord();
+        operationRecord.setProjectName(project.getProjectName());
+        operationRecord.setOperationTime(LocalDateTime.now());
+        //operationRecord.setContent("添加了项目成员");
+        operationRecord.setContent(MessageUtils.message("Template.addMember")+":"+stringBuilder.substring(0,stringBuilder.length()-1));
+        //operationRecord.setModuleName("项目管理");
+        operationRecord.setModuleName(MessageUtils.message("Template.projectManage"));
+        operationRecord.setOperatorName(user.getName());
+        operationRecord.setCompanyId(user.getCompanyId());
+        operationRecordService.save(operationRecord);
         return new HttpRespMsg();
     }
 

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

@@ -259,6 +259,27 @@ public class TimingTask {
         }
     }
 
+    //由于未知原因,任务加了参与人,但是项目会稍后丢失参与人,我们系统要自动修复一下
+    @Scheduled(cron = "0 20 1 ? * *")
+    private void autoFixProjectParticipation() {
+        if (isDev) return;
+        Integer companyId = 3092;
+        List<TaskExecutor> missedParticipation = taskExecutorMapper.getMissedParticipation(companyId);
+        List<Participation> addList = new ArrayList<>();
+        for (TaskExecutor executor : missedParticipation) {
+            Participation participation = new Participation();
+            participation.setProjectId(executor.getProjectId());
+            participation.setUserId(executor.getExecutorId());
+            if (addList.stream().noneMatch(p->p.getProjectId().equals(participation.getProjectId()) && p.getUserId().equals(participation.getUserId()))) {
+                addList.add(participation);
+            }
+        }
+        System.out.println("需要补参与人数据:"+addList.size());
+        if (addList.size() > 0) {
+            participationMapper.insertBatch(addList);
+        }
+    }
+
 
     //每天2:11 同步钉钉用户前2天到未来30天时间段的打卡,请假,出差数据
     @Scheduled(cron = "0 11 2 ? * *")
@@ -594,124 +615,6 @@ public class TimingTask {
             }
         }
     }
-    
-    @Scheduled(cron = "0 15 3 ? * *")
-    private void synFanWeiProjectDate() {
-        if (isDev) return;
-        if(!isPrivateDeploy) return;
-        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_fanwei", 1));
-        List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
-        if(compIds.isEmpty()){
-            return;
-        }
-        for (Integer compId : compIds) {
-            String url="http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getProejct";
-            JSONObject jsonObject=new JSONObject();
-            jsonObject.put("rybh","");
-            jsonObject.put("workDate","");
-            String jsonString = jsonObject.toJSONString();
-            HttpRespMsg result = DockWithMLD.getResult(url, null);
-            List<Map<String,Object>> dataList= (List<Map<String, Object>>) result.data;
-            List<Project> workTimeProjectList = projectService.list(new QueryWrapper<Project>().eq("company_id", compId).select("project_code","id"));
-//            List<Map<String, Object>> mapList = dataList.stream().filter(dl ->!dl.get("xmdm").equals("")&&
-//                    !workTimeProjectList.stream().anyMatch(wl->wl.getProjectCode()!=null&&!wl.getProjectCode().equals("")&&wl.getProjectCode().equals(dl.get("xmdm")))).collect(Collectors.toList());
-            List<Map<String, Object>> mapList = dataList;
-            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", compId).select("job_number", "id","name"));
-            int insert=0;
-            int update=0;
-            StringBuilder sb=new StringBuilder();
-            sb.append("更新的项目:");
-            for (Map<String, Object> map : mapList) {
-                List<Participation> participationList=new ArrayList<>();
-                Optional<User> first = userList.stream().filter(ul ->ul.getJobNumber()!=null&&ul.getJobNumber().equals(map.get("xmfzrplxm"))).findFirst();
-                if(workTimeProjectList.stream().anyMatch(wl->wl.getProjectCode()!=null&&wl.getProjectCode().equals(map.get("xmdm")))){
-                    Optional<Project> project = workTimeProjectList.stream().filter(wl -> wl.getProjectCode() != null && wl.getProjectCode().equals(map.get("xmdm"))).findFirst();
-                    if(project.isPresent()){
-                        Project item = project.get();
-                        item.setProjectName(String.valueOf(map.get("xmmc")));
-                        if(first.isPresent()){
-                            item.setInchargerId(first.get().getId())
-                                    .setInchargerName(first.get().getName());
-                        }
-                        boolean isUpdate=false;
-                        if(!item.getInchargerId().equals(first.get().getId())){
-                            update++;
-                            isUpdate=true;
-                        }
-                        projectService.updateById(item);
-                        List<Participation> allParticipations = participationService.list(new QueryWrapper<Participation>().eq("project_id", item.getId()));
-                        if(map.get("xmcygs")!=null&&!map.get("xmcygs").equals("")){
-                            participationService.remove(new QueryWrapper<Participation>().eq("project_id",item.getId()));
-                            String participations = String.valueOf(map.get("xmcygs"));
-                            List<String> list = Arrays.asList(participations.split(","));
-                            for (String s : list) {
-                                Optional<User> participation = userList.stream().filter(ul ->ul.getJobNumber()!=null&&ul.getJobNumber().equals(s)).findFirst();
-                                if(participation.isPresent()){
-                                    Participation p=new Participation();
-                                    p.setUserId(participation.get().getId()).setProjectId(item.getId());
-                                    participationList.add(p);
-                                }
-                            }
-                            List<String> collect = allParticipations.stream().map(al -> al.getUserId()).distinct().collect(Collectors.toList());
-                            List<String> collect1 = participationList.stream().map(pl -> pl.getUserId()).distinct().collect(Collectors.toList());
-                            System.out.println("之前的数据:"+collect);
-                            System.out.println("之后的数据:"+collect1);
-                            if(collect.size()!=collect1.size()){
-                                sb.append("["+item.getProjectName()+"/"+item.getProjectCode()+"]"+"\n");
-                                if(!isUpdate){
-                                    update++;
-                                }
-
-                            }else if(!collect.containsAll(collect1)){
-                                sb.append("["+item.getProjectName()+"/"+item.getProjectCode()+"]"+"\n");
-                                if(!isUpdate){
-                                    update++;
-                                }
-                            }
-                        }
-                        if(participationList.size()>0){
-                            participationService.saveBatch(participationList);
-                        }
-                    }
-                }else {
-                    Project project=new Project();
-                    project.setProjectName(String.valueOf(map.get("xmmc")))
-                            .setProjectCode(String.valueOf(map.get("xmdm")))
-                            .setCompanyId(876)
-                            .setCreateDate(LocalDate.now());
-                    if(first.isPresent()){
-                        project.setInchargerId(first.get().getId())
-                                .setInchargerName(first.get().getName());
-                    }
-                    projectService.save(project);
-                    insert++;
-                    if(map.get("xmcygs")!=null&&!map.get("xmcygs").equals("")){
-                        String participations = String.valueOf(map.get("xmcygs"));
-                        List<String> list = Arrays.asList(participations.split(","));
-                        for (String s : list) {
-                            Optional<User> participation = userList.stream().filter(ul ->ul.getJobNumber()!=null&&ul.getJobNumber().equals(s)).findFirst();
-                            if(participation.isPresent()){
-                                Participation p=new Participation();
-                                p.setUserId(participation.get().getId()).setProjectId(project.getId());
-                                participationList.add(p);
-                            }
-                        }
-                    }
-                    if(participationList.size()>0){
-                        participationService.saveBatch(participationList);
-                    }
-                }
-            }
-            OperationRecord operationRecord=new OperationRecord();
-            operationRecord.setCompanyId(compId)
-                    .setContent("同步来自泛微的项目数据,共"+insert+"条数据"+"\n"+"同步更新来自泛微的项目数据,共"+update+"条数据"+"\n"+sb.toString())
-                    .setModuleName("项目管理").setOperationTime(LocalDateTime.now());
-            if(operationRecord.getContent().length()>1000){
-                operationRecord.setContent(operationRecord.getContent().substring(0,999));
-            }
-            operationRecordService.save(operationRecord);
-        }
-    }
 
 
     //专门给明夷的定时任务

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties

@@ -348,6 +348,7 @@ Template.lackDepartment=缺少部门列,请下载最新模板进行导入
 Template.lackJobNumber=缺少工号列,请下载最新模板导入
 Template.creatProject=创建了项目
 Template.projectManage=项目管理
+Template.addMember=添加了参与人
 Template.finishProject=完成了项目
 Template.revokeProject=撤销了项目
 Template.restart=重启了项目

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties

@@ -348,6 +348,7 @@ Template.lackDepartment=The department column is missing. Please download the la
 Template.lackJobNumber=The job number column is missing. Please download the latest template to import.
 Template.creatProject=Created project
 Template.projectManage=project management
+Template.addMember=add participation
 Template.finishProject=completed the project
 Template.revokeProject=cancelled the project
 Template.restart=Restarted the project

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

@@ -1635,14 +1635,48 @@
               <el-table-column prop="taskName" align="center" label="任务"></el-table-column>
               <el-table-column prop="startDate" align="center" label="任务开始时间"></el-table-column>
               <el-table-column prop="endDate" align="center" label="任务截止时间"></el-table-column>
-              <el-table-column prop="userName" align="center" label="人员"></el-table-column>
+              <el-table-column prop="userName" align="center" label="人员">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.userName}}
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
               <el-table-column prop="jobNumber" align="center" label="工号"></el-table-column>
-              <el-table-column prop="departmentName" align="center" label="所属部门"></el-table-column>
+              <el-table-column prop="departmentName" align="center" label="所属部门">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.departmentName}}
+                    </span>
+                    <!-- {{ scope.row.departmentName }} -->
+                  </div>
+                </template>
+              </el-table-column>
               <el-table-column prop="timelinessRate" align="center" label="填报及时率"></el-table-column>
               <el-table-column prop="timelinessRateWithLeave" align="center" label="填报及时率(含请假)"></el-table-column>
             </el-table>
             <el-table v-if="timelyTaskHoursRadio == '按人员查看'"  key="321" border :data="timelyReportingOfTaskHoursList" highlight-current-row v-loading="timelyReportingOfTaskHoursLoading" :height="+tableHeight + 50" :span-method="timelyFormForFillingInTaskHoursSpanMethod" style="width: 100%;" :max-height="+tableHeight + 50">
-              <el-table-column prop="userName" align="center" label="人员"></el-table-column>
+              <el-table-column prop="userName" align="center" label="人员">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.userName}}
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
               <el-table-column prop="taskName" align="center" label="任务"></el-table-column>
               <el-table-column prop="startDate" align="center" label="任务开始时间"></el-table-column>
               <el-table-column prop="endDate" align="center" label="任务截止时间"></el-table-column>

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

@@ -2106,7 +2106,7 @@
                 <span style="font-size:16px;" @click="showHiddenFunction">{{$t('other.Batchimportofworkinghours')}}</span>
                 <el-link v-if="active==0"  style="float:right;margin-right:100px;" type="primary" @click="toView()">{{$t('other.viewLaborImportRecords')}}</el-link>
                 <el-link v-if="active==0"  style="float:right;margin-right:100px;" type="primary" @click="downloadProjectRatio">{{ $t('xiaZaiTianBaoGongShiZhanBiBiao') }}</el-link>
-                <el-link v-if="active==0 && ((showHidden && user.companyId == 469) || user.companyId == 7703) && user.roleName.indexOf('管理员') > 0"  style="float:right;margin-right:100px;" type="primary" @click="importCardTimeVisi = true">{{ $t('daoRuKaoQinShiChang') }}</el-link>
+                <el-link v-if="active==0 && ((showHidden && user.companyId == 469) || user.companyId == 7703 || user.companyId == 7544) && user.roleName.indexOf('管理员') > 0"  style="float:right;margin-right:100px;" type="primary" @click="importCardTimeVisi = true">{{ $t('daoRuKaoQinShiChang') }}</el-link>
                 <el-link v-if="active==0 && showHidden && user.companyId == 469 && user.roleName == '超级管理员'"  style="float:right;margin-right:50px;" type="primary" @click="showBatchDeleteReport = true; startDeleting = false;">{{ $t('piLiangShanChuRiBao') }}</el-link>
                 <el-link v-if="active==0 && showHidden && user.companyId == 469 && user.roleName == '超级管理员'"  style="float:right;margin-right:50px;" type="primary" @click="showBatchSimpleApproveReport = true; startDeleting = false;getDepartmentForApprove();">{{ $t('piLiangShenHeRiBao') }}</el-link>
             </div>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_mld/src/components/taskComponent.vue

@@ -378,7 +378,7 @@
         <el-button v-if="showMmeiLaiDeData.taskPlan && showMmeiLaiDeData.taskStatus == 2" @click.native="deleteTask()" style="float:left;">删除</el-button>
         <el-button @click.native="closeBounceds()">{{ $t('btn.cancel') }}</el-button>
 
-        <template v-if="(showMmeiLaiDeData.leaderIdList || []).includes(user.id) && showMmeiLaiDeData.taskStatus == 3">
+        <template v-if="addForm.taskStatus == 3 && addForm.createrId == user.id">
             <el-button @click.native="planToWithdraw()">撤回</el-button>
         </template>
 

+ 14 - 7
fhKeeper/formulahousekeeper/timesheet_mld/src/views/Home.vue

@@ -773,14 +773,21 @@
                             this.drawer = false;
                         } else if(type == 11) {
                             console.log(row, '<====== ganttData')
-                            const { taskId, ganttData } = row
+                            const { taskId, ganttData, msg } = row
+                            // if(msg.indexOf('取消') != -1 || msg.indexOf('驳回') != -1 || msg.indexOf('审核') != -1) {
                             this.$router.push({
-                                path: '/list',
-                                query: { 
-                                    messageTaskId: taskId,
-                                    ganttData: JSON.stringify(ganttData || {}) 
-                                }
-                            });
+                                path: '/task',
+                                query: { doICreateIt: msg.indexOf('审批') != -1 ? 3 : 2 }
+                            })
+                            // } else {
+                            //     this.$router.push({
+                            //         path: '/list',
+                            //         query: { 
+                            //             messageTaskId: taskId,
+                            //             ganttData: JSON.stringify(ganttData || {}) 
+                            //         }
+                            //     });
+                            // }
                             this.drawer = false;
                         }
                         

+ 128 - 49
fhKeeper/formulahousekeeper/timesheet_mld/src/views/project/gantt.vue

@@ -12,6 +12,18 @@
           :content="addForm.parentTname"></el-page-header>
       </div>
     </el-dialog>
+    <!-- tooltip -->
+    <div 
+      v-if="tooltip.visible"
+      :style="`top:${tooltip.y}px;left:${tooltip.x}px;`" 
+      class="custom-tooltip-customize"
+    >
+      <div><b>开始时间:</b> {{ tooltip.task.start_date }}</div>
+      <div><b>结束时间:</b> {{ tooltip.task.end_date }}</div>
+      <div><b>计划工时:</b> {{ tooltip.task.time }} 小时 ({{ tooltip.task.dayDifference }} 天 )</div>
+      <div><b>项目名称:</b> {{ tooltip.task.projectName }}</div>
+      <div><b>计划名称:</b> {{ tooltip.task.planName }}</div>
+    </div>
   </div>
 </template>
 
@@ -52,6 +64,12 @@ export default {
       integrationTask: {},
       user: JSON.parse(sessionStorage.getItem("user")),
       showMmeiLaiDeData: {},
+      tooltip: {
+        visible: false,
+        task: null,
+        x: 0,
+        y: 0,
+      }
     };
   },
   created: function () {
@@ -187,6 +205,93 @@ export default {
 
         gantt.scrollTo(gantt.posFromDate(midDate) - 200, gantt.getScrollState().y);
       }
+    },
+    observeTaskLines(gantt) {
+      console.log(gantt, '<==== gantt')
+      const taskContainer = gantt.$task_data;
+
+      this.observer = new MutationObserver(() => {
+        this.bindTooltipEvents();
+      });
+
+      this.observer.observe(taskContainer, {
+        childList: true,
+        subtree: true
+      });
+
+      this.bindTooltipEvents(); // 初次执行
+    },
+    bindTooltipEvents() {
+      console.log('开始执行')
+      const taskLines = this.$refs.ganttContainer.querySelectorAll(".gantt_task_line");
+
+      taskLines.forEach(line => {
+        const taskId = line.getAttribute("task_id");
+        if (!taskId || line.dataset.bound === "true") return;
+
+        line.dataset.bound = "true";
+
+        line.addEventListener("mouseenter", (e) => {
+          const rect = line.getBoundingClientRect();
+          const task = gantt.getTask(taskId);
+          if(!task.taskId) {
+            this.tooltip.visible = false;
+            return
+          }
+          console.log(task)
+          const list = task.text.split('/')
+          const d1 = this.dayjs(task.start_date);
+          const d2 = this.dayjs(task.end_date);
+          this.tooltip.task = {
+            ...task,
+            end_date: this.dayjs(task.endDateStr).format('YYYY-MM-DD HH:mm:ss'),
+            start_date: this.dayjs(task.startDateStr).format('YYYY-MM-DD HH:mm:ss'),
+            projectName: list[0],
+            planName: list[1],
+            dayDifference:  d2.diff(d1, 'day'),
+          };
+          this.tooltip.x = rect.left + window.scrollX;
+          this.tooltip.y = (rect.top - 180) - 10 + window.scrollY;
+          this.tooltip.visible = true;
+        });
+
+        line.addEventListener("mouseleave", () => {
+          this.tooltip.visible = false;
+        });
+      });
+    },
+    bindTaskLineEvents() {
+      console.log("bindTaskLineEvents", this.$refs.ganttContainer)
+      if(!this.$refs.ganttContainer) {
+        return
+      }
+      const taskLines = this.$refs.ganttContainer.querySelectorAll(".gantt_task_line");
+      taskLines.forEach(line => {
+        const taskId = line.getAttribute("task_id");
+        if (!taskId) return;
+
+        // 避免重复绑定
+        if (line.dataset.tooltipBound) return;
+        line.dataset.tooltipBound = "true";
+
+        line.addEventListener("mouseenter", (e) => {
+          const task = gantt.getTask(taskId);
+          this.tooltip.task = task;
+          this.tooltip.visible = true;
+
+          const updateMouse = (moveEvent) => {
+            this.tooltip.x = moveEvent.pageX;
+            this.tooltip.y = moveEvent.pageY;
+          };
+
+          document.addEventListener("mousemove", updateMouse);
+
+          line.addEventListener("mouseleave", () => {
+            this.tooltip.visible = false;
+            document.removeEventListener("mousemove", updateMouse);
+          }, { once: true });
+        });
+      });
     }
   },
   mounted: function () {
@@ -275,21 +380,6 @@ export default {
     gantt.config.start_date = new Date(this.valueDate[0]);
     gantt.config.end_date = new Date(this.valueDate[1]);
 
-    //设置任务条样式
-    // gantt.templates.task_class = function (start, end, item) {
-    //   const { taskPlan, taskStatus } = item
-    //   if(taskStatus == 5 || taskStatus == 6) {
-    //     return "reject_line"
-    //   }
-    //   if(taskPlan == 1 && taskStatus == 0) {
-    //     return "success_line"
-    //   }
-    //   if(taskPlan == 1 && taskStatus == 2) {
-    //     return "draft_line"
-    //   }
-    //   return item.taskPlanType == 3 ? "error_line" : "person_line"
-    // };
-
     const that = this
     // 设置任务条内容显示
     gantt.templates.task_text = function (start, end, task) {
@@ -321,38 +411,6 @@ export default {
           </div>`;
       }
 
-      // 小组长
-      // if (userInfo.projectLeaderType == 1) {
-      // if (leaderOrManager == 1) {
-      //   return `<div class="task_text">
-      //     ${task.taskStatus == 3 ? `<div class="circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div> <div class="circle"></div>` : ''}
-      //     ${task.taskStatus == 4 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="circle"></div>` : ''}
-      //     ${task.taskStatus == 5 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div> <div class="circle"></div>` : ''}
-      //     ${task.taskStatus == 6 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div>` : ''}
-      //     <div>${task.text}</div>
-      //   </div>`;
-      // }
-
-      // 审核人
-      // if (userInfo.projectLeaderType == 2) {
-      // if (leaderOrManager == 2) {
-      //   const oneRight = `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="circle"></div>`
-      //   const twoPairs = `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="circle exclamation-circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div>`
-      //   const toExamine = `<div class="task_text statuss">
-      //       ${task.taskStatus == 3 || task.taskStatus == 4 ? `<div class="circle">
-      //         <div class="pendingReviewOfCornerMarkers">!</div>
-      //       </div>` : ''}`
-      //   const twoEmptyCircles = `<div class="circle"></div><div class="circle"></div>`
-      //   return `<div class="task_text">
-      //     ${(userIds == checkFirstId && task.taskStatus == 3) ? toExamine : (userIds == checkFirstId && task.taskStatus == 4) ? oneRight : ''}
-      //     ${(userIds == checkSecondId && task.taskStatus == 4) ? toExamine : (userIds == checkSecondId && task.taskStatus == 3) ? twoEmptyCircles : ''}
-      //     ${task.taskStatus == 5 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div> <div class="circle"></div>` : ''}
-      //     ${task.taskStatus == 6 ? `<div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div> <div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">!</div>` : ''}
-      //     <div>${task.text}</div>
-      //     <div>${task.text}</div>
-      //   </div>`
-      // }
-
       // 正常人
       return `<div class="task_text">
           <div>${task.text}</div>
@@ -464,9 +522,12 @@ export default {
     this.containerRect = this.$refs.ganttContainer.getBoundingClientRect();
     gantt.parse(this.$props.tasks);
 
+    // 等渲染完成后绑定每个任务条事件
+    setTimeout(() => {
+      this.observeTaskLines(gantt); // 开始监听任务条变化
+    }, 2000)
+
     setTimeout(() => {
-      // gantt.showTask('任务_2636_2339');
-      // gantt.selectTask('任务_2636_2339');
       const list = JSON.parse(localStorage.getItem('ganttChartTaskId') || '[]')
       if(list[0]) {
         this.focusAndSelectTaskFull(list[0])
@@ -586,4 +647,22 @@ export default {
       word-break: break-all; */
   white-space: pre-wrap;
 }
+
+.custom-tooltip-customize {
+  position: fixed;
+  z-index: 9999;
+  background: rgba(0, 0, 0, 0.7);
+  color: #fff;
+  padding: 20px;
+  border-radius: 6px;
+}
+
+.custom-tooltip-customize div {
+  margin-bottom: 10px;
+  line-height: 20px;
+}
+
+.custom-tooltip-customize div:last-child {
+  margin-bottom: 0;
+}
 </style>

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet_mld/src/views/project/project_gantt.vue

@@ -565,6 +565,8 @@ export default {
                                   if(res.data[i].id.indexOf(this.$t('other.AskForLeave')) != '-1') {
                                     res.data[i].color = '#F56C6C'
                                   }
+                                  res.data[i].startDateStr = JSON.parse(JSON.stringify(res.data[i].start_date || []))
+                                  res.data[i].endDateStr = JSON.parse(JSON.stringify(res.data[i].end_date || []))
                                 }
                                 this.tasks = {data:res.data};
                                 if(this.user.userNameNeedTranslate != '1') {

+ 7 - 10
fhKeeper/formulahousekeeper/timesheet_mld/src/views/task/list.vue

@@ -15,16 +15,6 @@
                     </div>
                 </el-form-item>
 
-                <el-form-item :label="$t('lable.department')" >
-                    <div style="margin-left: 8px">
-                        <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="screenDeptId" :placeholder="$t('defaultText.pleaseChoose')" style="width: 125px"
-                        :options="departmentList" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable
-                        @change="getList()" size="mini"></el-cascader>
-
-                        <vueCascader :size="'mini'" :widthStr="'125'" :clearable="true" :subject="departmentList" :radios="true" :distinction="'1'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1"></vueCascader>
-                    </div>
-                </el-form-item>
-
                 <el-form-item :label="$t('types')">
                     <div style="margin-left: 8px">
                         <el-select v-model="typeField" style="width:120px;" size="small" slot="prepend" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="hiddens()">
@@ -2559,6 +2549,13 @@ import { getThemeColor } from '@/utils/commonMethod.js'
             // if(this.user.companyId == '428') {
             //     this.getSthForSb()
             // }
+            console.log(this.$route.query)
+            const query = this.$route.query
+            if(query.doICreateIt) {
+                setTimeout(() => {
+                    this.switchs(query.doICreateIt)
+                }, 500)
+            }
         },
     };
 </script>