Browse Source

Merge branch 'master' of http://47.100.37.243:10080/wutt/manHourHousekeeper

ggooalice 2 years ago
parent
commit
99a93ad597
32 changed files with 1253 additions and 145 deletions
  1. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupTemplateController.java
  2. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportAuditorSettingController.java
  3. 94 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  4. 79 52
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  5. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/GroupTemplate.java
  6. 13 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  7. 62 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportAuditorSetting.java
  8. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Stages.java
  9. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/StageCost.java
  10. 23 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/setTemplate.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportAuditorSettingMapper.java
  12. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/GroupTemplateService.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportAuditorSettingService.java
  14. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskGroupService.java
  15. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/GroupTemplateServiceImpl.java
  16. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectMainServiceImpl.java
  17. 64 24
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  18. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportAuditorSettingServiceImpl.java
  19. 98 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  20. 73 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskGroupServiceImpl.java
  21. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  22. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/GroupTemplateMapper.xml
  23. 6 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  24. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportAuditorSettingMapper.xml
  25. 394 0
      fhKeeper/formulahousekeeper/timesheet/src/components/cascader.vue
  26. 175 0
      fhKeeper/formulahousekeeper/timesheet/src/components/cascaderOption.vue
  27. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/components/select.vue
  28. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  29. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  30. 7 1
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  31. 4 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  32. 27 11
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

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

@@ -97,9 +97,9 @@ public class GroupTemplateController {
     }
 
     @RequestMapping("/addTemplate")
-    public HttpRespMsg addTemplate(Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk) {
+    public HttpRespMsg addTemplate(Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk,Boolean automatically) {
         String uid = request.getHeader("Token");
-        return groupTemplateService.addTemplate(uid, groupId, name, saveTask, saveMileStone, saveRisk);
+        return groupTemplateService.addTemplate(uid, groupId, name, saveTask, saveMileStone, saveRisk,automatically);
     }
 
     @RequestMapping("/deleteTemplate")

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportAuditorSettingController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-28
+ */
+@RestController
+@RequestMapping("/report-auditor-setting")
+public class ReportAuditorSettingController {
+
+}
+

+ 94 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -1,29 +1,24 @@
 package com.management.platform.controller;
 
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
-import com.management.platform.mapper.GroupParticipatorMapper;
-import com.management.platform.mapper.ProjectMapper;
-import com.management.platform.mapper.TimeTypeMapper;
-import com.management.platform.mapper.UserMapper;
-import com.management.platform.service.GroupTmpstagesService;
-import com.management.platform.service.StagesService;
-import com.management.platform.service.TaskGroupService;
-import com.management.platform.service.TaskService;
+import com.management.platform.entity.vo.setTemplate;
+import com.management.platform.mapper.*;
+import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -56,6 +51,14 @@ public class TaskGroupController {
     private UserMapper userMapper;
     @Resource
     private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private GroupTemplateMapper GroupTemplateMapper;
+    @Resource
+    private GroupTmpstagesMapper groupTmpstagesMapper;
+    @Resource
+    private GtemplateTaskMapper gtemplateTaskMapper;
+    @Resource
+    private TaskExecutorService taskExecutorService;
     /**
      * 保存任务分组
      */
@@ -136,12 +139,80 @@ public class TaskGroupController {
         QueryWrapper<TaskGroup> queryWrapper = new QueryWrapper<TaskGroup>();
         queryWrapper.eq("project_id", item.getProjectId());
         if (taskGroupService.count(queryWrapper) == 0) {
-            //创建默认分组
-            TaskGroup group = new TaskGroup();
-            group.setProjectId(item.getProjectId());
-            //group.setName("项目阶段");
-            group.setName(MessageUtils.message("entry.projectStage"));
-            taskGroupService.save(group);
+            //创建随项目创建而创建的模板
+            QueryWrapper<User> eq = new QueryWrapper<User>().eq("id", request.getHeader("token"));
+            User user = userMapper.selectOne(eq);
+            List<GroupTemplate> groupTemplates = GroupTemplateMapper.selectList(new QueryWrapper<GroupTemplate>().eq("company_id", user.getCompanyId()).eq("cre_with_pro", true));
+            if (groupTemplates.size()==0){
+                //创建默认分组
+                TaskGroup group = new TaskGroup();
+                group.setProjectId(item.getProjectId());
+                //group.setName("项目阶段");
+                group.setName(MessageUtils.message("entry.projectStage"));
+                taskGroupService.save(group);
+            }else{
+                for (GroupTemplate groupTemplate : groupTemplates) {
+                    TaskGroup group = new TaskGroup();
+                    group.setProjectId(item.getProjectId());
+                    group.setName(groupTemplate.getName());
+                    taskGroupService.save(group);
+                    //从模板创建任务列表
+                    Project project = projectMapper.selectById(item.getProjectId());
+                    String inchargerId = project.getInchargerId();
+                    User inchargerUser = userMapper.selectById(inchargerId);
+                    List<GroupTmpstages> stages = groupTmpstagesMapper.selectList(new QueryWrapper<GroupTmpstages>().eq("template_id", groupTemplate.getId()));
+                    List<Stages> batchList = new ArrayList<>();
+                    stages.forEach(s->{
+                        Stages stageItem = new Stages();
+                        stageItem.setGroupId(group.getId());
+                        stageItem.setStagesName(s.getStagesName());
+                        stageItem.setSequence(s.getSequence());
+                        stageItem.setProjectId(item.getProjectId());
+                        batchList.add(stageItem);
+                    });
+                    stagesService.saveBatch(batchList);
+                    //阶段的任务,里程碑,风险
+                    List<GtemplateTask> gtemplateTaskList = gtemplateTaskMapper.selectList(
+                            new QueryWrapper<GtemplateTask>().eq("gtemplate_id", groupTemplate.getId())
+                                    .orderByAsc("seq"));
+                    if (gtemplateTaskList.size() > 0) {
+                        List<Task> taskList = new ArrayList<>();
+                        List<TaskExecutor> taskExecutorList = new ArrayList<>();
+                        gtemplateTaskList.forEach(gt->{
+                            Task task = gt.toTask();
+                            task.setProjectId(item.getProjectId());
+                            task.setGroupId(group.getId());
+                            String sName = stages.stream().filter(s->s.getId().equals(gt.getTstagesId())).findFirst().get().getStagesName();
+                            Integer realStageId = batchList.stream().filter(bat->bat.getStagesName().equals(sName)).findFirst().get().getId();
+                            task.setStagesId(realStageId);
+                            task.setCreaterId(user.getId());
+                            task.setCreaterName(user.getName());
+                            task.setCreatorColor(user.getColor());
+                            if(task.getTaskType()==1 && inchargerUser != null){
+                                task.setExecutorId(inchargerUser.getId());
+                                task.setExecutorName(inchargerUser.getName());
+                                task.setExecutorColor(inchargerUser.getColor());
+                            }
+
+                            taskList.add(task);
+                        });
+                        taskService.saveBatch(taskList);
+                        taskList.forEach(tl->{
+                            TaskExecutor taskExecutor=new TaskExecutor();
+                            //当为里程碑任务时
+                            if(tl.getTaskType()==1 && inchargerUser != null){
+                                taskExecutor.setTaskId(tl.getId());
+                                taskExecutor.setExecutorId(inchargerUser.getId());
+                                taskExecutor.setExecutorName(inchargerUser.getName());
+                                taskExecutor.setExecutorColor(inchargerUser.getColor());
+                                taskExecutor.setProjectId(item.getProjectId());
+                                taskExecutorList.add(taskExecutor);
+                            }
+                        });
+                        taskExecutorService.saveBatch(taskExecutorList);
+                    }
+                }
+            }
         }
         msg.data = taskGroupService.list(queryWrapper);
         return msg;
@@ -275,5 +346,10 @@ public class TaskGroupController {
         return httpRespMsg;
     }
 
+    @RequestMapping("/setTemplate")
+    public HttpRespMsg setTemplate(setTemplate setTemplate){
+        User user = userMapper.selectById(request.getHeader("token"));
+        return taskGroupService.setTemplate(user,setTemplate);
+    }
 }
 

+ 79 - 52
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -1415,13 +1415,14 @@ public class WeiXinCorpController {
         //默认普通员工的角色
         //获取公司根部门人员,也就是没有分配部门的人员
         int companyRootDeptId = 1;
-        JSONArray allCorpWxUserJsonArray = getDeptUserInfo(curCorpAccessToken, companyRootDeptId);
-        System.out.println("获取到公司下的员工数量="+allCorpWxUserJsonArray.size());
+        JSONArray usersUnderRootArray = getDeptUserInfo(curCorpAccessToken, companyRootDeptId);
+        System.out.println("获取到公司下的员工数量="+usersUnderRootArray.size());
         SysRole defaultRole = sysRoleMapper.selectOne(
                 new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
         List<User> allCorpWxUserList = new ArrayList<>();
-        for (int m=0;m<allCorpWxUserJsonArray.size(); m++) {
-            JSONObject userJson = allCorpWxUserJsonArray.getJSONObject(m);
+        for (int m=0;m<usersUnderRootArray.size(); m++) {
+            JSONObject userJson = usersUnderRootArray.getJSONObject(m);
+            System.out.println(userJson.toString());
             String curUserid = userJson.getString("userid");
             //跳过非激活状态的员工
             if (userJson.getInteger("status") != 1) continue;
@@ -1444,7 +1445,6 @@ public class WeiXinCorpController {
                     .setColor(ColorUtil.randomColor())
                     .setJobNumber(curUserid)
                     .setCorpwxDeptid(maxDeptId);
-            System.out.println("姓名=="+user.getName());
             allCorpWxUserList.add(user);
         }
 
@@ -1474,7 +1474,31 @@ public class WeiXinCorpController {
                         //有父部门需要更新
                         curDept.setCorpwxDeptpid(parentId);
                         departmentMapper.updateById(curDept);
-
+                    }
+                }
+                //获取部门下的人员
+                JSONArray userList = getDeptUserSimple(curCorpAccessToken, deptId);
+                for (int m=0;m<userList.size(); m++) {
+                    JSONObject userJson = userList.getJSONObject(m);
+                    String curUserid = userJson.getString("userid");
+                    System.out.println("人员信息:"+userJson.toString());
+                    //不存在的人员, 进行插入
+                    User user = new User();
+                    Optional<User> first = allCorpWxUserList.stream().filter(all -> all.getCorpwxUserid().equals(curUserid)).findFirst();
+                    if (first.isPresent()) {
+                        user = first.get();
+                        user.setCorpwxDeptid(deptId);
+                    } else {
+                        //在当前部门下的员工
+                        user.setId(SnowFlake.nextId()+"")
+                                .setRoleId(defaultRole.getId())//默认普通员工
+                                .setRoleName(defaultRole.getRolename())
+                                .setCompanyId(companyId)
+                                .setName(userJson.getString("name"))
+                                .setCorpwxUserid(curUserid)
+                                .setColor(ColorUtil.randomColor())
+                                .setJobNumber(curUserid);
+                        allCorpWxUserList.add(user);
                     }
                 }
             }
@@ -1493,13 +1517,14 @@ public class WeiXinCorpController {
                 newItem.setDepartmentCascade(convertDepartmentIdToCascade(deptId, allDeptList));
             }
         });
-        userService.saveBatch(newUserList);
+        if (newUserList.size() > 0) {
+            userService.saveBatch(newUserList);
+        }
         List<User> updateUserList = allCorpWxUserList.stream().filter(newItem->existingUsers.stream().anyMatch(existingItem->newItem.getCorpwxUserid().equals(existingItem.getCorpwxUserid())
                                             && (!newItem.getName().equals(existingItem.getName()) || (newItem.getCorpwxDeptid() != null && !newItem.getCorpwxDeptid().equals(existingItem.getCorpwxDeptid()))))).collect(Collectors.toList());
         List<Integer> corpWxDeptIds = updateUserList.stream().map(User::getCorpwxDeptid).collect(Collectors.toList());
         List<Department> departmentList = null;
         if (corpWxDeptIds.size() > 0) {
-            //
             departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId).in("corpwx_deptid", corpWxDeptIds));
         }
         final  List<Department> fDeptList = departmentList;
@@ -1514,9 +1539,10 @@ public class WeiXinCorpController {
                 u.setDepartmentId(0);
                 u.setDepartmentCascade("0");
             }
-
         });
-
+        if (updateUserList.size() > 0) {
+            userService.updateBatchById(updateUserList);
+        }
         return new HttpRespMsg();
     }
 
@@ -1554,16 +1580,16 @@ public class WeiXinCorpController {
         }
         int companyId = company.getId();
         //获取公司根部门人员,也就是没有分配部门的人员
-        List<JSONObject> hasDirectLdMembs = new ArrayList<>();
+//        List<JSONObject> hasDirectLdMembs = new ArrayList<>();
         SysRole defaultRole = sysRoleMapper.selectOne(
                 new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
 
         int companyRootDeptId = 1;
         if (syncMembs == 1) {
-            JSONArray unAssignedUserList = getDeptUserInfo(curCorpAccessToken, companyRootDeptId);
+            JSONArray allCorpWxUserJsonArray = getDeptUserInfo(curCorpAccessToken, companyRootDeptId);
             //获取远程的带姓名的详情,通过企业通讯录的token获取
             JSONArray remoteUnAUserList = null;
-            if (unAssignedUserList.size() > 0) {
+            if (allCorpWxUserJsonArray.size() > 0) {
                 remoteUnAUserList = remoteGetDeptUserDetail(wxCorpInfo, corpContactAccessToken, companyRootDeptId);
                 //做id转化
                 List<String> corpUserIds = new ArrayList<>();
@@ -1594,15 +1620,16 @@ public class WeiXinCorpController {
             }
 
             List<User> updateUserList = new ArrayList<>();
-            for (int m=0;m<unAssignedUserList.size(); m++) {
-                JSONObject userJson = unAssignedUserList.getJSONObject(m);
+
+            for (int m=0;m<allCorpWxUserJsonArray.size(); m++) {
+                JSONObject userJson = allCorpWxUserJsonArray.getJSONObject(m);
                 String curUserid = userJson.getString("userid");
                 //跳过非激活状态的员工
                 if (userJson.getInteger("status") != 1) continue;
                 System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", department="+userJson.getJSONArray("department"));
-                if (userJson.getJSONArray("direct_leader").size() > 0) {
-                    hasDirectLdMembs.add(userJson);
-                }
+//                if (userJson.getJSONArray("direct_leader").size() > 0) {
+//                    hasDirectLdMembs.add(userJson);
+//                }
                 //不存在的人员, 进行插入
                 User user = new User();
 
@@ -1753,9 +1780,9 @@ public class WeiXinCorpController {
                     String curUserid = userJson.getString("userid");
                     if (userJson.getInteger("status") != 1) continue;
                     log.info("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
-                    if (userJson.getJSONArray("direct_leader").size() > 0) {
-                        hasDirectLdMembs.add(userJson);
-                    }
+//                    if (userJson.getJSONArray("direct_leader").size() > 0) {
+//                        hasDirectLdMembs.add(userJson);
+//                    }
                     //不存在的人员, 进行插入
                     User user = new User();
 
@@ -1843,37 +1870,37 @@ public class WeiXinCorpController {
             departmentService.updateBatchById(needUpdateDepts);
         }
         //更新人员的直属上级
-        if (hasDirectLdMembs.size() > 0) {
-            List<String> corpwxUids = new ArrayList<>();
-            for (JSONObject userJson : hasDirectLdMembs) {
-                String curUserid = userJson.getString("userid");
-                //取第一个leaderId
-                JSONArray directLeader = userJson.getJSONArray("direct_leader");
-                String string = directLeader.getString(0);
-                corpwxUids.add(curUserid);
-                if (!corpwxUids.contains(string)) {
-                    corpwxUids.add(string);
-                }
-            }
-            List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id, corpwx_userid, superior_id").in("corpwx_userid", corpwxUids));
-            List<User> updateUserList = new ArrayList<>();
-            for (JSONObject userJson : hasDirectLdMembs) {
-                String curUserid = userJson.getString("userid");
-                User user = userList.stream().filter(u -> u.getCorpwxUserid().equals(curUserid)).findFirst().get();
-                JSONArray directLeader = userJson.getJSONArray("direct_leader");
-                String leaderCorpWxuid = directLeader.getString(0);
-                //查找leader
-                User leader = userList.stream().filter(u -> u.getCorpwxUserid().equals(leaderCorpWxuid)).findFirst().get();
-                if (!leader.getId().equals(user.getSuperiorId())) {
-                    user.setSuperiorId(leader.getId());
-                    updateUserList.add(user);
-                }
-            }
-            if (updateUserList.size() > 0) {
-                //批量更新上级领导
-                userService.updateBatchById(updateUserList);
-            }
-        }
+//        if (hasDirectLdMembs.size() > 0) {
+//            List<String> corpwxUids = new ArrayList<>();
+//            for (JSONObject userJson : hasDirectLdMembs) {
+//                String curUserid = userJson.getString("userid");
+//                //取第一个leaderId
+//                JSONArray directLeader = userJson.getJSONArray("direct_leader");
+//                String string = directLeader.getString(0);
+//                corpwxUids.add(curUserid);
+//                if (!corpwxUids.contains(string)) {
+//                    corpwxUids.add(string);
+//                }
+//            }
+//            List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id, corpwx_userid, superior_id").in("corpwx_userid", corpwxUids));
+//            List<User> updateUserList = new ArrayList<>();
+//            for (JSONObject userJson : hasDirectLdMembs) {
+//                String curUserid = userJson.getString("userid");
+//                User user = userList.stream().filter(u -> u.getCorpwxUserid().equals(curUserid)).findFirst().get();
+//                JSONArray directLeader = userJson.getJSONArray("direct_leader");
+//                String leaderCorpWxuid = directLeader.getString(0);
+//                //查找leader
+//                User leader = userList.stream().filter(u -> u.getCorpwxUserid().equals(leaderCorpWxuid)).findFirst().get();
+//                if (!leader.getId().equals(user.getSuperiorId())) {
+//                    user.setSuperiorId(leader.getId());
+//                    updateUserList.add(user);
+//                }
+//            }
+//            if (updateUserList.size() > 0) {
+//                //批量更新上级领导
+//                userService.updateBatchById(updateUserList);
+//            }
+//        }
 
         //更新人员的deptcascade
         updateUserDeptCascade(companyId);

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

@@ -35,6 +35,9 @@ public class GroupTemplate extends Model<GroupTemplate> {
     @TableField("is_system")
     private Integer isSystem;
 
+    @TableField("cre_with_pro")
+    private Boolean creWithPro;
+
     /**
      * 公司id
      */

+ 13 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -1,9 +1,14 @@
 package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.management.platform.config.PropertyMsg;
 import lombok.Data;
@@ -11,18 +16,13 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import java.io.Serializable;
-import java.time.LocalDate;
-import java.util.List;
-import java.util.Map;
-
 /**
  * <p>
  * 
  * </p>
  *
  * @author Seyason
- * @since 2022-08-08
+ * @since 2022-09-30
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -290,6 +290,11 @@ public class Project extends Model<Project> {
     @TableField("project_main_id")
     private Integer projectMainId;
 
+    /**
+     * 主项目名称
+     */
+    @TableField("project_main_name")
+    private String projectMainName;
 
     /**
      * 供应商id

+ 62 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportAuditorSetting.java

@@ -0,0 +1,62 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportAuditorSetting extends Model<ReportAuditorSetting> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键: 日报id
+     */
+    @TableId("report_id")
+    private Integer reportId;
+
+    /**
+     * 第一审核人
+     */
+    @TableField("auditor_first")
+    private String auditorFirst;
+
+    /**
+     * 第二审核人
+     */
+    @TableField("auditor_sec")
+    private String auditorSec;
+
+    /**
+     * 第三审核人
+     */
+    @TableField("auditor_third")
+    private String auditorThird;
+
+    /**
+     * 抄送人
+     */
+    @TableField("cc_userid")
+    private String ccUserid;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.reportId;
+    }
+
+}

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

@@ -53,6 +53,12 @@ public class Stages extends Model<Stages> {
     @TableField("group_id")
     private Integer groupId;
 
+    /**
+     * 预估工时
+     */
+    @TableField("stages_time")
+    private float stagesTime;
+
     @TableField(exist = false)
     private List<Task> taskList;
 

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

@@ -1,7 +1,11 @@
 package com.management.platform.entity.vo;
 
+import lombok.Data;
+
+@Data
 public class StageCost {
     public String stageName;
     public Double cost;
     public Double workingTime;
+    public float stagesTime;
 }

+ 23 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/setTemplate.java

@@ -0,0 +1,23 @@
+package com.management.platform.entity.vo;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author cs
+ * @version 1.0
+ * @ClassName setTemplate
+ * @Description
+ * @date 2022-09-28 15:36
+ */
+@Data
+public class setTemplate {
+    private int id;
+    private String name;
+    private Boolean creWithPro;
+    private int companyId;
+    private List<Map<String,String>> stagesList;
+    private List<String> needDelete;
+}

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

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

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

@@ -13,5 +13,5 @@ import com.management.platform.util.HttpRespMsg;
  * @since 2021-05-05
  */
 public interface GroupTemplateService extends IService<GroupTemplate> {
-    public HttpRespMsg addTemplate(String token, Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk);
+    public HttpRespMsg addTemplate(String token, Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk, Boolean automatically);
 }

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

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

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskGroupService.java

@@ -1,8 +1,10 @@
 package com.management.platform.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.GroupTemplate;
 import com.management.platform.entity.TaskGroup;
 import com.management.platform.entity.User;
+import com.management.platform.entity.vo.setTemplate;
 import com.management.platform.util.HttpRespMsg;
 
 /**
@@ -15,6 +17,8 @@ import com.management.platform.util.HttpRespMsg;
  */
 public interface TaskGroupService extends IService<TaskGroup> {
 
+    HttpRespMsg setTemplate(User user, setTemplate setTemplate);
+
     void saveGroupIncharger(TaskGroup taskGroup, User user);
 
     HttpRespMsg createFromTemplate(String templateJson, Integer projectId);

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

@@ -45,7 +45,7 @@ public class GroupTemplateServiceImpl extends ServiceImpl<GroupTemplateMapper, G
     TaskMapper taskMapper;
 
     @Override
-    public HttpRespMsg addTemplate(String token, Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk) {
+    public HttpRespMsg addTemplate(String token, Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk,Boolean automatically) {
         User user = userMapper.selectById(token);
         HttpRespMsg msg = new HttpRespMsg();
         QueryWrapper<GroupTemplate> templateQueryWrapper = new QueryWrapper<>();
@@ -64,6 +64,7 @@ public class GroupTemplateServiceImpl extends ServiceImpl<GroupTemplateMapper, G
                 template.setIsSystem(0);
                 template.setCompanyId(user.getCompanyId());
                 template.setName(name);
+                template.setCreWithPro(automatically);
                 groupTemplateMapper.insert(template);
 
                 //保存相关的任务列表名称

+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectMainServiceImpl.java

@@ -2,12 +2,16 @@ package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.entity.Project;
 import com.management.platform.entity.ProjectCategory;
 import com.management.platform.entity.ProjectMain;
+import com.management.platform.entity.ProjectSeparate;
 import com.management.platform.mapper.ProjectCategoryMapper;
 import com.management.platform.mapper.ProjectMainMapper;
+import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProjectMainService;
+import com.management.platform.service.ProjectService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import org.springframework.stereotype.Service;
@@ -33,6 +37,10 @@ public class ProjectMainServiceImpl extends ServiceImpl<ProjectMainMapper, Proje
     private UserMapper userMapper;
     @Resource
     private ProjectCategoryMapper projectCategoryMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private ProjectService projectService;
     @Override
     public HttpRespMsg addOrMod(HttpServletRequest request,ProjectMain projectMain) {
         HttpRespMsg httpRespMsg=new HttpRespMsg();
@@ -56,6 +64,10 @@ public class ProjectMainServiceImpl extends ServiceImpl<ProjectMainMapper, Proje
                 return httpRespMsg;
             }
             projectMainMapper.updateById(projectMain);
+            //修改主项目名称  更新项目表
+            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("project_main_id", projectMain.getId()));
+            projectList.forEach(pl->pl.setProjectMainName(projectMain.getName()));
+            projectService.updateBatchById(projectList);
         }else {
             Integer count2 = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("company_id", projectMain.getCompanyId())
                     .eq("code", projectMain.getCode()));

+ 64 - 24
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -183,7 +183,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     ProjectSeparateService projectSeparateService;
     @Resource
     TaskGroupService taskGroupService;
-
+    @Resource
+    GroupTemplateMapper GroupTemplateMapper;
 
     @Resource
     private HttpServletResponse response;
@@ -4942,6 +4943,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     @Override
     public HttpRespMsg batchAddMembToGroup(String membIdArray, String groupIds) {
+        User user = userMapper.selectById(request.getHeader("token"));
         List<String> membArray = JSONArray.parseArray(membIdArray, String.class);
         List<Integer> groupArray = JSONArray.parseArray(groupIds, Integer.class);
         List<GroupParticipator> gpList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>().in("group_id", groupArray));
@@ -4964,6 +4966,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<Integer> collect = addToGpList.stream().map(GroupParticipator::getGroupId).collect(Collectors.toList());
             List<TaskGroup> taskGroups = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().in("id", collect));
             List<Integer> projectIds = taskGroups.stream().map(TaskGroup::getProjectId).collect(Collectors.toList());
+            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", projectIds));
             List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", projectIds));
             List<Participation> addPartiToProject = new ArrayList<>();
             for (Integer proId : projectIds) {
@@ -4975,6 +4978,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         addPartiToProject.add(p);
                     }
                 }
+                Optional<Project> first = projectList.stream().filter(pl -> pl.getId().equals(proId)).findFirst();
+                if(first.isPresent()){
+                    OperationRecord operationRecord=new OperationRecord();
+                    operationRecord.setModuleName("项目管理")
+                            .setContent("批量添加分组参与人")
+                            .setCompanyId(first.get().getCompanyId())
+                            .setOperationTime(LocalDateTime.now())
+                            .setProjectName(first.get().getProjectName())
+                            .setOperatorName(user.getName());
+                    operationRecordService.save(operationRecord);
+                }
             }
             if (addPartiToProject.size() > 0) {
                 participationService.saveBatch(addPartiToProject);
@@ -5724,10 +5738,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Override
     public HttpRespMsg batchSetParticipation(HttpServletRequest request,String  projectIdArray,String userIds) {
         HttpRespMsg msg=new HttpRespMsg();
-        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        User user = userMapper.selectById(request.getHeader("token"));
         List<Integer> array = JSONArray.parseArray(projectIdArray, Integer.class);
         List<String> userIdList = JSONArray.parseArray(userIds, String.class);
-        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId).in("id",array));
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()).in("id",array));
         List<Participation> list=new ArrayList<>();
         for (Project project : projectList) {
             List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().eq("project_id", project.getId()));
@@ -5741,6 +5755,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 participation.setUserId(s);
                 list.add(participation);
             }
+            OperationRecord operationRecord=new OperationRecord();
+            operationRecord.setModuleName("项目管理")
+                           .setOperatorName(user.getName())
+                           .setProjectName(project.getProjectName())
+                           .setCompanyId(user.getCompanyId())
+                           .setOperationTime(LocalDateTime.now())
+                           .setContent("批量添加项目参与人");
+            operationRecordService.save(operationRecord);
         }
         participationService.saveBatch(list);
         return msg;
@@ -6631,6 +6653,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 participation.setUserId(inchargerId);
                 participationMapper.insert(participation);
             }
+            OperationRecord operationRecord=new OperationRecord();
+            operationRecord.setOperatorName(user.getName());
+            operationRecord.setProjectName(project.getProjectName());
+            operationRecord.setCompanyId(project.getCompanyId());
+            operationRecord.setOperationTime(LocalDateTime.now());
+            operationRecord.setContent("批量操作:[设置项目负责人为:"+inchargerId+"]");
+            operationRecord.setModuleName("项目管理");
+            operationRecordService.save(operationRecord);
         }
         return httpRespMsg;
     }
@@ -6708,7 +6738,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         String token = String.valueOf(header.get("token"));
         String changeType = String.valueOf(header.get("changeType"));
         List<Project> projectList = JSON.parseArray(String.valueOf(jsonObject.get("projectArrays")), Project.class);
-        List<ProjectSeparate> projectSeparateList = JSON.parseArray(String.valueOf(jsonObject.get("projectSeparateArrays")), ProjectSeparate.class);
         HttpRespMsg msg=new HttpRespMsg();
         List<ThirdPartyInterface> thirdPartyInterfaceList = thirdPartyInterfaceService.list(new QueryWrapper<ThirdPartyInterface>().eq("token", token));
         if(thirdPartyInterfaceList.size()==0){
@@ -6743,11 +6772,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
                 for (Project project : inertProjectList) {
                     List<TaskGroup> taskGroupList = project.getTaskGroupList();
-                    if(taskGroupList==null){
-                        continue;
+                    if(taskGroupList!=null){
+                        taskGroupList.forEach(tl->tl.setProjectId(project.getId()));
+                        taskGroupService.saveBatch(taskGroupList);
+                    }
+                    ProjectSeparate projectSeparate = project.getProjectSeparate();
+                    if(projectSeparate!=null){
+                        projectSeparate.setId(project.getId());
+                        projectSeparateService.save(projectSeparate);
                     }
-                    taskGroupList.forEach(tl->tl.setProjectId(project.getId()));
-                    taskGroupService.saveBatch(taskGroupList);
                 }
             }
         }else if(changeType.equals("update_project")){
@@ -6767,21 +6800,27 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 List<Integer> idList = changeProjectList.stream().map(Project::getId).collect(Collectors.toList());
                 idList.add(-1);
                 List<TaskGroup> groupList = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().in("project_id", idList));
+                List<ProjectSeparate> projectSeparateList = projectSeparateMapper.selectList(new QueryWrapper<ProjectSeparate>().in("project_id", idList));
                 for (Project project : changeProjectList) {
                     List<TaskGroup> taskGroupList = project.getTaskGroupList();
-                    if(taskGroupList==null){
-                        continue;
-                    }
-                    for (TaskGroup taskGroup : taskGroupList) {
-                        taskGroup.setProjectId(project.getId());
-                        if(groupList!=null){
-                            Optional<TaskGroup> first = groupList.stream().filter(gl -> gl.getTaskGroupCode() != null && gl.getTaskGroupCode().equals(taskGroup.getTaskGroupCode())).findFirst();
-                            if(first.isPresent()){
-                                taskGroup.setId(first.get().getId());
+                    if(taskGroupList!=null){
+                        for (TaskGroup taskGroup : taskGroupList) {
+                            taskGroup.setProjectId(project.getId());
+                            if(groupList!=null){
+                                Optional<TaskGroup> first = groupList.stream().filter(gl -> gl.getTaskGroupCode() != null && gl.getTaskGroupCode().equals(taskGroup.getTaskGroupCode())).findFirst();
+                                if(first.isPresent()){
+                                    taskGroup.setId(first.get().getId());
+                                }
                             }
                         }
+                        taskGroupService.saveOrUpdateBatch(taskGroupList);
+                    }
+                    ProjectSeparate projectSeparate = project.getProjectSeparate();
+                    Optional<ProjectSeparate> first = projectSeparateList.stream().filter(pl -> pl.getId().equals(project.getId())).findFirst();
+                    if(first.isPresent()) {
+                        projectSeparate.setId(first.get().getId());
                     }
-                    taskGroupService.saveOrUpdateBatch(taskGroupList);
+                    projectSeparateService.saveOrUpdate(projectSeparate);
                 }
             }
         }else if(changeType.equals("delete_project")){
@@ -6791,13 +6830,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     project.setId(first.get().getId());
                     deleteProjectList.add(project);
                 }else continue;
-                List<Integer> idList = deleteProjectList.stream().map(Project::getId).collect(Collectors.toList());
-                if(deleteProjectList.size()>0&&removeByIds(idList)){
-                    //message+="成功删除"+idList.size()+"条项目数据";
-                    message+=MessageUtils.message("project.deleteDate",idList.size());
-                }
-                taskGroupMapper.delete(new QueryWrapper<TaskGroup>().in("project_id",idList));
             }
+            List<Integer> idList = deleteProjectList.stream().map(Project::getId).collect(Collectors.toList());
+            if(deleteProjectList.size()>0&&removeByIds(idList)){
+                //message+="成功删除"+idList.size()+"条项目数据";
+                message+=MessageUtils.message("project.deleteDate",idList.size());
+            }
+            taskGroupMapper.delete(new QueryWrapper<TaskGroup>().in("project_id",idList));
+            projectSeparateMapper.delete(new QueryWrapper<ProjectSeparate>().in("id",idList));
         }
         msg.data=message;
         return msg;

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ReportAuditorSetting;
+import com.management.platform.mapper.ReportAuditorSettingMapper;
+import com.management.platform.service.ReportAuditorSettingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-28
+ */
+@Service
+public class ReportAuditorSettingServiceImpl extends ServiceImpl<ReportAuditorSettingMapper, ReportAuditorSetting> implements ReportAuditorSettingService {
+
+}

+ 98 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -617,7 +617,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         }
                     }
                 } else if (reportAuditType == 3) {
-
+                    //获取日报对应已经设置好的审核人和抄送人
+                    r.setAuditorSetting(reportAuditorSettingMapper.selectById(r.getId()));
                 }
 
             });
@@ -1350,7 +1351,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 //员工自由选择的审批人
                 String auditorId = user.getId();
                 List<ReportAuditorSetting> auditorSettingList = reportAuditorSettingMapper.selectList(new QueryWrapper<ReportAuditorSetting>().in("report_id", ids));
-
+                List<Report> updateReportList = new ArrayList<>();
                 for (Integer rid : ids) {
                     Report r = new Report();
                     r.setId(rid);
@@ -1364,6 +1365,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             r.setProjectAuditTime(LocalDateTime.now());
                             r.setState(1);
                         }
+                        updateReportList.add(r);
                     } else if (auditorId.equals(auditorItem.getAuditorSec())) {
                         if (auditorItem.getAuditorThird() != null) {
                             //进入到第三审批人
@@ -1373,13 +1375,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             r.setProjectAuditTime(LocalDateTime.now());
                             r.setState(1);
                         }
+                        updateReportList.add(r);
                     } else if (auditorId.equals(auditorItem.getAuditorThird())) {
                         //目前最多三层,第三个审批人审批后结束
                         r.setProjectAuditState(1);
                         r.setProjectAuditTime(LocalDateTime.now());
                         r.setState(1);
+                        updateReportList.add(r);
                     }
                 }
+                if (updateReportList.size() > 0) {
+                    updateBatchById(updateReportList);
+                }
             } else {
                 //之前的流程逻辑,综合了一层项目审核,或者一层任务分组审核。 可叠加部门审批流
                 List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
@@ -1553,6 +1560,45 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             }
+            if (timeType.getReportAuditType() == 3) {
+                //审核通过的话,给抄送人发送审核通过提醒
+                for (Report report : reportList) {
+                    if(report.getState()==1){
+                        ReportAuditorSetting reportAuditorSetting = reportAuditorSettingMapper.selectById(report.getId());
+                        if(reportAuditorSetting.getCcUserid() != null){
+                            Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(reportAuditorSetting.getCcUserid())).findFirst();
+                            //取到抄送人
+                            User u = first.get();
+                            if(u.getCorpwxUserid()!=null){
+                                if(wxCorpInfoList.size()>0){
+                                    JSONObject json=new JSONObject();
+                                    JSONArray dataJson=new JSONArray();
+                                    JSONObject item=new JSONObject();
+                                    item.put("key","审核结果");
+                                    item.put("value","通过");
+                                    dataJson.add(item);
+                                    JSONObject item1=new JSONObject();
+                                    item1.put("key","项目名称");
+                                    item1.put("value",projectList.stream().filter(pro->pro.getId().equals(report.getProjectId())).findFirst().get().getProjectName());
+                                    dataJson.add(item1);
+                                    JSONObject item2=new JSONObject();
+                                    item2.put("key","填报人员");
+                                    item2.put("value",userList.stream().filter(curU->curU.getId().equals(report.getCreatorId())).findFirst().get().getName());
+                                    dataJson.add(item2);
+                                    JSONObject item3=new JSONObject();
+                                    item3.put("key","工作日期");
+                                    item3.put("value",report.getCreateDate());
+                                    dataJson.add(item3);
+                                    json.put("template_id","tty9TkCAAAwOgmzwS2uFogWgOmPDdIRQ");
+                                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                                    json.put("content_item",dataJson);
+                                    wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfoList.get(0),u.getCorpwxUserid(),json);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
             //对导入审核,添加记录
             int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
             ReportAuditLog log = new ReportAuditLog();
@@ -2157,6 +2203,46 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 //批量更新
                 updateBatchById(reportList);
+            } else if (timeType.getReportAuditType() == 3) {
+                //员工自由选择的审批人
+                String auditorId = user.getId();
+                List<ReportAuditorSetting> auditorSettingList = reportAuditorSettingMapper.selectList(new QueryWrapper<ReportAuditorSetting>().in("report_id", ids));
+                List<Report> updateReportList = new ArrayList<>();
+                for (Integer rid : ids) {
+                    Report r = new Report();
+                    r.setId(rid);
+                    ReportAuditorSetting auditorItem = auditorSettingList.stream().filter(a -> a.getReportId().equals(rid)).findFirst().get();
+                    if (auditorId.equals(auditorItem.getAuditorFirst())) {
+                        if (auditorItem.getAuditorSec() != null) {
+                            //进入到第二审批人
+                            r.setProjectAuditorId(auditorItem.getAuditorSec());
+                        } else {
+                            r.setProjectAuditState(1);
+                            r.setProjectAuditTime(LocalDateTime.now());
+                            r.setState(1);
+                        }
+                        updateReportList.add(r);
+                    } else if (auditorId.equals(auditorItem.getAuditorSec())) {
+                        if (auditorItem.getAuditorThird() != null) {
+                            //进入到第三审批人
+                            r.setProjectAuditorId(auditorItem.getAuditorThird());
+                        } else {
+                            r.setProjectAuditState(1);
+                            r.setProjectAuditTime(LocalDateTime.now());
+                            r.setState(1);
+                        }
+                        updateReportList.add(r);
+                    } else if (auditorId.equals(auditorItem.getAuditorThird())) {
+                        //目前最多三层,第三个审批人审批后结束
+                        r.setProjectAuditState(1);
+                        r.setProjectAuditTime(LocalDateTime.now());
+                        r.setState(1);
+                        updateReportList.add(r);
+                    }
+                }
+                if (updateReportList.size() > 0) {
+                    updateBatchById(updateReportList);
+                }
             } else {
                 List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                         new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", company.getId())
@@ -3954,6 +4040,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         //获取企业微信同步数据
         List<Map> userCorpwxTimeMapList = userCorpwxTimeMapper.selectByAsk(companyId,startDate,endDate);
+
         //请假人员名单
 
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -3978,7 +4065,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         long cnt = localStart.until(localEnd, ChronoUnit.DAYS);
         List<String> cpwxIds = new ArrayList<>();
         //获取请假数据
-        List<LeaveSheet> leaveSheetList = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>().eq("company_id", user.getCompanyId()));
+        List<LeaveSheet> leaveSheetList = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>().eq("company_id", user.getCompanyId())
+                .le("start_date", endDate)
+                .ge("end_date", startDate));
         //已驳回的数据
         List<Report> deniedReportList = reportMapper.selectList(new QueryWrapper<Report>().eq("company_id", companyId).eq("state", 2).between("create_date", startDate, endDate));
         List<Report> waitingSubmitReportList = reportMapper.selectList(new QueryWrapper<Report>().eq("company_id", companyId).eq("state", 3).between("create_date", startDate, endDate));
@@ -4036,15 +4125,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         }
                         noRecord.name = curUser.getName();
                         //请假的
-                        List<LeaveSheet> leaveSheets = leaveSheetList.stream().filter(ls -> ls.getOwnerId().equals(curUser.getId())
-                                &&(ls.getStartDate().isAfter(LocalDate.parse(startDate))||ls.getStartDate().isEqual(LocalDate.parse(startDate)))
-                                &&(ls.getEndDate().isBefore(LocalDate.parse(endDate))||ls.getEndDate().isEqual(LocalDate.parse(endDate)))).collect(Collectors.toList());
-                        noReportDataList.add(noRecord);
-                        for (LeaveSheet leaveSheet : leaveSheets) {
-                            if(!(date.isBefore(leaveSheet.getStartDate())||date.isAfter(leaveSheet.getEndDate()))){
-                                noReportDataList.remove(noRecord);
+                        for (LeaveSheet leaveSheet : leaveSheetList) {
+                            if (leaveSheet.getOwnerId().equals(curUser.getId()) &&
+                                    (leaveSheet.getStartDate().isEqual(date) || leaveSheet.getEndDate().isEqual(date)
+                                        || (leaveSheet.getStartDate().isBefore(date) && leaveSheet.getEndDate().isAfter(date)))) {
+                                noRecord.status = MessageUtils.message("leave.leave");
                             }
                         }
+                        noReportDataList.add(noRecord);
                     }
                 }
         }

+ 73 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskGroupServiceImpl.java

@@ -3,12 +3,10 @@ package com.management.platform.service.impl;
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
+import com.management.platform.entity.vo.setTemplate;
 import com.management.platform.mapper.*;
-import com.management.platform.service.StagesService;
-import com.management.platform.service.TaskExecutorService;
-import com.management.platform.service.TaskGroupService;
+import com.management.platform.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.service.TaskService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import org.springframework.stereotype.Service;
@@ -20,6 +18,8 @@ import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -150,4 +150,73 @@ public class TaskGroupServiceImpl extends ServiceImpl<TaskGroupMapper, TaskGroup
         msg.data = list;
         return msg;
     }
+
+    @Override
+    @Transactional
+    public HttpRespMsg setTemplate(User user,setTemplate setTemplate){
+        HttpRespMsg msg = new HttpRespMsg();
+        List<Map<String, String>> stagesList = setTemplate.getStagesList();
+        List<String> needDelete = setTemplate.getNeedDelete();
+        GroupTemplate groupTemplate = new GroupTemplate();
+        groupTemplate.setId(setTemplate.getId());
+        groupTemplate.setName(setTemplate.getName());
+        groupTemplate.setCreWithPro(setTemplate.getCreWithPro());
+        groupTemplateMapper.updateById(groupTemplate);
+        //新增或修改模板任务列表
+        for (Map<String, String> stringStringMap : stagesList) {
+            GroupTmpstages groupTmpstages = new GroupTmpstages();
+            groupTmpstages.setStagesName(stringStringMap.get("stagesName"));
+            Integer templateId = Integer.parseInt(stringStringMap.get("templateId"));
+            boolean findSameName = false;
+            if (stringStringMap.containsKey("id")){
+                //检查是否重名
+                groupTmpstages.setId(Integer.parseInt(stringStringMap.get("id")));
+                QueryWrapper<GroupTmpstages> queryWrapper = new QueryWrapper<GroupTmpstages>();
+                queryWrapper.eq("template_id", templateId).eq("stages_name", groupTmpstages.getStagesName()).ne("id", groupTmpstages.getId());
+                int cnt = groupTmpstagesMapper.selectCount(queryWrapper);
+                findSameName = cnt>0?true: false;
+                if (findSameName) {
+                    //msg.setError("当前分组中已存在该任务列表,无法重复添加");
+                    msg.setError(MessageUtils.message("Stages.RepeatInGroup"));
+                    return msg;
+                }
+                groupTmpstagesMapper.updateById(groupTmpstages);
+            }else{
+                QueryWrapper<GroupTmpstages> qw = new QueryWrapper<GroupTmpstages>();
+                qw.eq("template_id", templateId).eq("stages_name", groupTmpstages.getStagesName());
+                int cnt = groupTmpstagesMapper.selectCount(qw);
+                findSameName = cnt>0?true: false;
+                if (findSameName) {
+                    //msg.setError("当前分组中已存在该任务列表,无法重复添加");
+                    msg.setError(MessageUtils.message("Stages.RepeatInGroup"));
+                    return msg;
+                }
+                groupTmpstages.setTemplateId(templateId);
+                //给seq排序
+                QueryWrapper<GroupTmpstages> queryWrapper = new QueryWrapper<GroupTmpstages>();
+                queryWrapper.eq("template_id", templateId);
+                queryWrapper.orderByDesc("sequence");
+                queryWrapper.last("limit 1");
+                List<GroupTmpstages> one = groupTmpstagesMapper.selectList(queryWrapper);
+                if (one.size() == 0) {
+                    groupTmpstages.setSequence(1);
+                } else {
+                    groupTmpstages.setSequence(one.get(0).getSequence() + 1);
+                }
+                groupTmpstagesMapper.insert(groupTmpstages);
+            }
+        }
+        //删除模板阶段及相关任务
+        Integer companyId = user.getCompanyId();
+        if (needDelete!=null){
+            for (String s : needDelete) {
+                groupTmpstagesMapper.deleteById(s);
+                gtemplateTaskMapper.delete(new QueryWrapper<GtemplateTask>().eq("company_id",companyId)
+                        .eq("gtemplate_id",setTemplate.getId())
+                        .eq("tstages_id",s)
+                );
+            }
+        }
+        return msg;
+    }
 }

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

@@ -1468,14 +1468,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 HSSFRow row = sheet.createRow(rowNum);
                 row.createCell(0).setCellValue(rowNum);
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    row.createCell(1).setCellValue("$userName="+item.getCorpwxUserid()==null?"":item.getCorpwxUserid()+"$");
+                    row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?" ":item.getCorpwxUserid())+"$");
                 }else {
                     row.createCell(1).setCellValue(item.getName());
                 }
                 row.createCell(2).setCellValue(item.getRoleName());
                 row.createCell(3).setCellValue(item.getPhone());
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    row.createCell(4).setCellValue("$departmentName="+item.getCorpwxDeptid()==null?"":item.getCorpwxDeptid()+"$");
+                    row.createCell(4).setCellValue("$departmentName="+(item.getCorpwxDeptid()==null?" ":item.getCorpwxDeptid())+"$");
                 }else {
                     row.createCell(4).setCellValue(item.getDepartmentName());
                 }

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

@@ -8,11 +8,11 @@
         <result column="name" property="name" />
         <result column="is_system" property="isSystem" />
         <result column="company_id" property="companyId" />
+        <result column="cre_with_pro" property="creWithPro" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, is_system, company_id
+        id, name, is_system, company_id,cre_with_pro
     </sql>
-
 </mapper>

File diff suppressed because it is too large
+ 6 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml


+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportAuditorSettingMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ReportAuditorSettingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ReportAuditorSetting">
+        <id column="report_id" property="reportId" />
+        <result column="auditor_first" property="auditorFirst" />
+        <result column="auditor_sec" property="auditorSec" />
+        <result column="auditor_third" property="auditorThird" />
+        <result column="cc_userid" property="ccUserid" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        report_id, auditor_first, auditor_sec, auditor_third, cc_userid
+    </sql>
+
+</mapper>

+ 394 - 0
fhKeeper/formulahousekeeper/timesheet/src/components/cascader.vue

@@ -0,0 +1,394 @@
+<template>
+  <div tabindex="0" @blur="selectClihide()" style="display: inline-block;position: relative;">  
+    <div :class="disabled ? 'disabledTrue' : 'disabledFalse'" @mouseenter="moveIonDiv" @mouseleave="outIonDiv">
+        <div :style="`width:${selectWidth}px;height:${selectHeight}px`" :class="classDiv ? 'select selectDiv' : 'select'" @click="selectCli" :ref="disabled ? '' : 'selectDiv'">
+            <div :style="'line-height: '+selectHeight+'px'" :class="selectName == $t('defaultText.pleaseChoose') ? 'selecttex selecttexXuan' : 'selecttex'">
+                <ww-open-data type='departmentName' :openid='selectName'></ww-open-data>
+                <!-- {{selectName}} -->
+            </div>
+            <i :class=" move ? 'el-icon-arrow-down iostu iostuHover' : 'el-icon-arrow-down iostu'" v-if="!moveIon"></i>
+            <i v-if="moveIon" class="el-icon-circle-close iostu" @click.stop="clearDelete"></i>
+        </div>
+    </div>
+    <transition name="el-zoom-in-top">
+      <div v-show="show" style="position: relative;z-index: 99;">
+        <div class="transitionBox">
+            <ul class="transitionBoxUl">
+                <li :class="transitionBoxLiIdx == index ? 'liHover' : ''" v-for="(item, index) in options" :key="index" @mouseover="liMouseOver(index, item)" @click.stop="liClist(item)"> 
+                    <span :class="item.children ? 'idxspan' : ''" v-if="!radios">
+                        <!-- {{item.label}} -->
+                        <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                    </span>
+                    <span v-if="radios" style="margin-left: -15px">
+                        <el-radio v-model="optionsOId" :label="item.value">
+                            <span class="idxspan" style="margin-left: -10px"> 
+                                <!-- {{item.label}}  -->
+                                <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                            </span>
+                        </el-radio>
+                    </span>
+                    <i class="el-icon-arrow-right" v-if="item.children"></i>
+                </li>
+            </ul>
+        </div>
+
+        <div v-for="(item, index) in options" :key="index">
+            <div v-if="item.children" style="position: absolute;left: 200px;top: 6px">
+                <cascaderOption :subject="item.children" :radios="radios" v-show="transitionBoxLiIdx == index" @cascaderOptionClick="cascaderOptionClick"></cascaderOption>
+            </div>
+        </div>
+
+      </div>
+    </transition>
+  </div>
+</template>
+
+<script>
+// 引入里面的
+import cascaderOption from "@/components/cascaderOption.vue"
+export default {
+    components: {
+        cascaderOption
+    },
+    props: {
+        subject:{
+            type: Array
+        },
+        size: {
+            type: String,
+        },
+        subjectId: {
+            type: [String, Number]
+        },
+        // 是否为单选
+        radios: {
+            type: Boolean,
+            default: false
+        },
+        // 当前页面用到的第几个
+        distinction: {
+            type: String,
+            default: '1',
+        },
+        // 真对填写日报单独处理
+        idx: {
+            type: String
+        },
+        flg: {
+            type: Boolean,
+            default: false, // 默认值,不是填写日报
+        },
+        // 剩下统一索引
+        index: {
+            type: String
+        },
+        // 是否禁用
+        disabled: {
+            type: Boolean,
+            default: false
+        },
+        // 是否可清空
+        clearable: {
+            type: Boolean,
+            default: false
+        },
+        // 是否可搜索
+        filterable: {
+            type: Boolean,
+            default: false
+        },
+        // 其他数据
+        other: {
+            type: [String, Number, Boolean],
+            default: false
+        },
+        // 宽度
+        widthStr: {
+            type: String,
+            default: false
+        }
+    },
+    data() {
+        return {
+            selectWidth: '150',
+            selectHeight: '28',
+            show: false, // 下拉框
+            options: [], // 列表数据
+            transitionBoxLiIdx: '-1', // hover 背景色
+            selectName: this.$t('defaultText.pleaseChoose'), // 显示的文字
+            classDiv: false, // 获得焦点样式
+            optionsOId: '', // 选中人的id
+            dailyListObj: null, // 填写日报的数据
+            dailyListIndex: null, // 日报点的索引
+            move: false,
+            moveIon: false,
+            hoverValIdx: '-1', // 鼠标移入的值 
+            hoverList: [],
+            radioVal: ''
+        };
+    },
+    computed: {},
+    watch: {
+        subject: {
+            handler(newValue, oldValue) {
+                console.log(newValue, '看看值')
+                this.options = newValue
+                if(newValue) {
+                    
+                }
+            },
+        },
+        // 日报点的索引, 真对填写的日报
+        idx: {
+            handler(newValue, oldValue) {
+                console.log(newValue, oldValue)
+                this.dailyListIndex = newValue
+            },
+        },
+        subjectId: {
+            handler(newValue, oldValue) {
+                console.log(newValue, oldValue)
+                this.optionsOId = newValue
+                if(this.optionsOId) {
+                    for(let i in this.options) {
+                        if(this.options[i].id == this.optionsOId || this.options[i].auditorId == this.optionsOId) {
+                            this.selectName = this.options[i].name || this.options[i].auditorName
+                        }
+                    }
+                }
+            },
+        },
+        widthStr: {
+            handler(newValue, oldValue) {
+                console.log('卧槽')
+                this.selectWidth = newValue
+            },
+        }
+    },
+    created() {},
+    mounted() {
+        if(this.size == 'mini') {
+            this.selectWidth = '150'
+            this.selectHeight = '28'
+        } else if(this.size == 'small') {
+            this.selectWidth = '191'
+            this.selectHeight = '32'
+        } 
+        if(this.widthStr) {
+            console.log('one')
+            this.selectWidth = this.widthStr
+        }
+        if(this.subject) {
+            this.options = JSON.parse(JSON.stringify(this.subject))
+        }
+        if(this.subjectId) {
+            this.optionsOId = JSON.parse(JSON.stringify(this.subjectId))
+            for(let i in this.options) {
+                if(this.options[i].id == this.optionsOId || this.options[i].auditorId == this.optionsOId) {
+                     this.selectName = this.options[i].name || this.options[i].auditorName
+                }
+            }
+        }
+        console.log(this.subjectId)
+        this.dailyListIndex = this.idx
+        // this.moveIon = JSON.parse(JSON.stringify(this.clearable))
+    },
+    methods: {
+        selectCli() {
+            console.log('我被你触发了')
+            if(!this.disabled) {
+                this.$refs.selectDiv.focus()
+                this.classDiv = !this.classDiv
+                this.show = !this.show
+                this.move = !this.move
+            }
+        },
+        selectClihide() {
+            if(this.classDiv) {
+                this.transitionBoxLiIdx = ''
+                this.show = !this.show
+                this.classDiv = false
+                this.move = false
+            }
+        },
+        liMouseOver(index, item) {
+            this.transitionBoxLiIdx = index
+            if(item.children) {
+                this.hoverList = []
+                this.hoverList = item.children
+                this.$forceUpdate()
+            } else {
+                this.hoverList = []
+            }
+        },
+        // 点击
+        liClist(item) {
+            if(!item.children) {
+                this.selectName = item.label
+                let obj = {
+                    id: item.value,
+                    distinction: this.distinction
+                }
+                this.$emit('vueCasader', obj)
+            }
+            if(this.radios) {
+                this.selectName = item.label
+                let obj = {
+                    id: item.value,
+                    distinction: this.distinction
+                }
+                this.$emit('vueCasader', obj)
+            }
+            this.transitionBoxLiIdx = ''
+            this.show = !this.show
+            this.classDiv = false
+            this.move = false
+        },
+        // 接受子组件传过来的值
+        cascaderOptionClick(item) {
+            this.liClist(item)
+        },
+        moveIonDiv() {
+            console.log(this.selectName)
+            if(this.clearable) {
+                if(this.selectName != this.$t('defaultText.pleaseChoose')) {
+                    this.moveIon = true
+                }
+            }
+        },
+        outIonDiv() {
+            if(this.clearable) {
+                this.moveIon = false
+            }
+        },
+        clearDelete() {
+            this.selectName = this.$t('defaultText.pleaseChoose')
+            let obj = {
+                label: this.$t('defaultText.pleaseChoose'),
+                value: ''
+            }
+            this.show = true
+            this.liClist(obj)
+        }
+    },
+    triggerOption(){
+
+    },
+    choose(item,value){
+      
+    },
+
+};
+</script>
+
+<style scoped lang="scss">
+    .selectDiv {
+        border-color: #409EFF !important;
+    }
+    .disabledTrue {
+        background: #F5F7FA !important;
+        border-radius: 4px;
+        cursor: not-allowed !important;
+        position: relative;
+    }
+    .disabledFalse .select {
+        background: #FFF;
+        border-radius: 4px;
+    }
+    .select {
+        -webkit-appearance: none;
+        // background-color: #FFF;
+        background-image: none;
+        border-radius: 4px;
+        border: 1px solid #DCDFE6;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+        color: #606266;
+        display: inline-block;
+        font-size: inherit;
+        height: 40px;
+        line-height: 40px;
+        outline: 0;
+        padding: 0 15px;
+        -webkit-transition: border-color .2s cubic-bezier(.645,.045,.355,1);
+        transition: border-color .2s cubic-bezier(.645,.045,.355,1);
+        width: 100%;
+        position: relative;
+        cursor: pointer;
+    }
+    .selecttex {
+        height: 28px;
+        line-height: 28px;
+        text-overflow: ellipsis;
+        font-size: 12px;
+    }
+    .iostu {
+        position: absolute;
+        top: 50%;
+        margin-top: -4px;
+        right: 8px;
+        color: #C0C4CC;
+        transition: All 0.2s ease-in-out;
+    }
+    .iostuHover {
+        transform: rotate(-180deg);
+    }
+    .transitionBox {
+        background: #FFF;
+        position: absolute; 
+        min-width: 200px;
+        border-radius: 2em;
+        border: 1px solid #E4E7ED;
+        border-radius: 4px;
+        background-color: #FFF;
+        box-sizing: border-box;
+        margin: 5px 0;
+        // box-shadow: 0 2px 12px #dfdfdf;
+        max-height: 274px;
+        overflow: auto;
+        z-index: 500 !important;
+    }
+    .transitionBoxUl {
+        list-style: none;
+        padding: 6px 0;
+        margin: 0;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+    }
+    .transitionBoxUl li {
+        font-size: 14px;
+        padding: 0 20px;
+        // position: relative;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        color: #606266;
+        height: 34px;
+        line-height: 34px;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+        cursor: pointer;
+        display: flex;
+        align-items: center;
+    }
+    .liHover {
+        background-color: #F5F7FA;
+        // color: #409eff !important;
+    }
+    .liHover .idxspan {
+        color: #409eff !important;
+        font-weight: 700;
+    }
+    .transitionBoxUl span {
+        flex: 1;
+        width: 110px;
+        width: 20px;
+        padding: 0 10px;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+    }
+    .selecttexXuan {
+        color: #C0C4CC;;
+    }
+</style>

+ 175 - 0
fhKeeper/formulahousekeeper/timesheet/src/components/cascaderOption.vue

@@ -0,0 +1,175 @@
+<template>
+  <div class="childComponents">
+    <div class="child">
+        <ul class="transitionBoxUl">
+            <li :class="transitionBoxLiIdx == index ? 'liHover' : ''" v-for="(item, index) in options" :key="index" @mouseover="liMouseOver(index, item)" @click="liClick(item)"> 
+                <span :class="item.children ? 'idxspan' : ''" v-if="!radios">{{item.label}}</span>
+                <span v-if="radios" style="margin-left: -15px">
+                    <el-radio v-model="departmentId" :label="item.value">
+                        <span class="idxspan" style="margin-left: -10px"> 
+                            <!-- {{item.label}}  -->
+                            <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                        </span>
+                    </el-radio>
+                </span>
+                <i class="el-icon-arrow-right" v-if="item.children"></i>
+            </li>
+        </ul>
+    </div>
+
+    <div v-for="(item, index) in options" :key="index">
+        <div v-if="item.children">
+            <cascaderOption :subject="item.children" :radios="radiosFlg" :subjectId="departmentId" v-show="transitionBoxLiIdx == index" @cascaderOptionClick="cascaderOptionClick"></cascaderOption>
+        </div>
+    </div>
+  </div>
+</template>
+
+<script>
+// 引入里面的
+import cascaderOption from "@/components/cascaderOption.vue"
+export default {
+  name: 'cascaderOption',
+  components: {
+    cascaderOption
+  },
+  props: {
+    subject:{
+        type: Array
+    },
+    subjectId: {
+        type: [String, Number]
+    },
+    // 是否为单选
+    radios: {
+        type: Boolean,
+        default: false
+    },
+  },
+  watch: {
+    subject: {
+        handler(newValue, oldValue) {
+            console.log(newValue, '子组件')
+            this.options = newValue
+            if(newValue) {
+                this.options = newValue
+            }
+        },
+        deep: true,
+    },
+
+  },
+  data() {
+    return {
+        options: [],
+        transitionBoxLiIdx: '0',
+        hoverList: [],
+        radiosFlg: false, // 是否为单选
+        departmentId: '',
+        radioVal: ''
+    };
+  },
+  computed: {},
+  watch: {
+    radios: {
+        handler(newValue, oldValue) {
+            this.radiosFlg = newValue
+        },
+    }
+  },
+  created() {},
+  mounted() {
+    if(this.subject) {
+        this.options = JSON.parse(JSON.stringify(this.subject))
+    }
+    this.radiosFlg = JSON.parse(JSON.stringify(this.radios))
+    if(this.subjectId) {
+        this.departmentId = JSON.parse(JSON.stringify(this.subjectId))
+    }
+  },
+  methods: {
+    liMouseOver(index, item) {
+        this.transitionBoxLiIdx = index
+        if(item.children) {
+            this.hoverList = item.children
+        } else {
+            this.hoverList = []
+        }
+    },
+    liClick(item) {
+        if(!item.children) {
+            this.$emit("cascaderOptionClick", item);
+        }
+        if(this.radios) {
+            this.$emit("cascaderOptionClick", item);
+        }
+    },
+    cascaderOptionClick(item) {
+        this.liClick(item)
+    }
+  },
+};
+</script>
+
+<style scoped lang="scss">
+    .childComponents {
+        width: 200px;
+        position: absolute;
+        top: -6px;
+        right: -200px;
+        height: 274px;
+        background: #fff;
+        border: 1px solid #E4E7ED;
+        border-radius: 4px;
+        border-top-left-radius: 0px;
+        border-bottom-left-radius: 0px;
+        box-sizing: border-box;
+        margin: 5px 0;
+        // box-shadow: 0 2px 12px #dfdfdf;
+    }
+    .child {
+        width: 100%;
+        max-height: 270px;
+        overflow: auto;
+    }
+    .transitionBoxUl {
+        list-style: none;
+        padding: 6px 0;
+        margin: 0;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+    }
+    .transitionBoxUl li {
+        font-size: 14px;
+        padding: 0 20px;
+        // position: relative;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        color: #606266;
+        height: 34px;
+        line-height: 34px;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+        cursor: pointer;
+        display: flex;
+        align-items: center;
+    }
+    .liHover {
+        background-color: #F5F7FA;
+        // color: #409eff !important;
+    }
+    .liHover .idxspan {
+        color: #409eff !important;
+        font-weight: 700;
+    }
+    .transitionBoxUl span {
+        flex: 1;
+        width: 110px;
+        width: 20px;
+        padding: 0 10px;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+    }
+</style>

+ 2 - 2
fhKeeper/formulahousekeeper/timesheet/src/components/select.vue

@@ -241,8 +241,8 @@ export default {
         cursor: not-allowed !important;
         position: relative;
     }
-    .disabledTrue {
-        background: #FFF;
+    .disabledFalse .select {
+        background: #FFF !important;
         border-radius: 4px;
     }
     .select {

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

@@ -42,6 +42,7 @@
     "approvedProject": "Approved project daily review",
     "allState": "All state",
     "DidNotFillIn": "Did not fill in",
+    "missFillReport":"Missing",
     "alreadyPassed": "already passed",
     "WaitingAudit": "Waiting audit",
     "notThrough": "Not through",

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -42,6 +42,7 @@
     "approvedProject": "项目日报审核通过",
     "allState": "全部状态",
     "DidNotFillIn": "未填报",
+    "missFillReport":"漏填",
     "alreadyPassed": "已通过",
     "WaitingAudit": "待审核",
     "notThrough": "不通过",

+ 7 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -1004,8 +1004,14 @@ export default {
                 return;
               }
               this.add();
-                  this.addForm = {code:null,ownerId:null,createDate: null,type:this.z, ticketNum:1,remark:null,totalAmount:0,}
+                  this.addForm = {
+                    code:null,
+                    ownerId:this.user.id,
+                    createDate: null,
+                    type:this.z, 
+                    ticketNum:1,remark:null,totalAmount:0,}
                   this.invoiceList = []
+                  this.getNextCode()
               
             }
       });

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

@@ -116,10 +116,10 @@
                                     <!-- 待提交 -->
                                     {{$t('state.waitingsubmit')}}
                                     <el-link :underline="false" @click="showMembList(2)"><span style="margin-left:5px;margin-right:5px;color:green;">{{fillList.filter(item => item.state == 3).length}}</span></el-link>{{$t('other.people')}},
-                                    <!-- 未填写 -->
-                                    {{$t('state.DidNotFillIn')}}
-                                    <el-link :underline="false" @click="showMembList(0)"><span style="margin-left:5px;margin-right:5px;color:red;">{{unFillList.length | numbers}}</span></el-link>{{$t('other.people')}}
-                                    <span v-if="leaveAllNum">{{'(全天请假' + leaveAllNum + '人)'}}</span>
+                                    <!-- 漏填 -->
+                                    {{$t('state.missFillReport')}}
+                                    <el-link :underline="false" @click="showMembList(0)"><span style="margin-left:5px;margin-right:5px;color:red;">{{(unFillList.length - leaveAllNum) | numbers}}</span>{{$t('other.people')}}
+                                    <span v-if="leaveAllNum">{{', 全天请假' + leaveAllNum + '人'}}</span></el-link>
                                     </span>
                                     </span>
                                 </span>

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

@@ -4,14 +4,11 @@
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
                 <el-form-item :label="$t('lable.department')" style="width: 165px">
-                    <el-cascader v-model="search.departmentIdArray" :placeholder="$t('defaultText.pleaseChoose')" style="width: 125px"
+                    <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="search.departmentIdArray" :placeholder="$t('defaultText.pleaseChoose')" style="width: 125px"
                     :options="option" :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable
-                    @change="getList(1)" size="mini">
-                        <template slot-scope="{ data }">
-                            <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='data.label'></ww-open-data></span>
-                            <span v-if="user.userNameNeedTranslate != '1'">{{data.label}}</span>
-                        </template>
-                    </el-cascader>
+                    @change="getList(1)" size="mini"></el-cascader>
+
+                    <vueCascader :size="'mini'" :widthStr="'125'" :clearable="true" :subject="option" :radios="false" :distinction="'1'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1"></vueCascader>
                 </el-form-item>
 
                 <el-form-item :label="$t('ren-yuan')" style="width: 210px">
@@ -59,9 +56,7 @@
                     </el-form-item>
 
                     <!-- 调试 -->
-                    <!-- <el-form-item :label="$t('ren-yuan')" style="width: 215px">
-                        <selectCat :size="'mini'" :subject="searchUsersList"/>
-                    </el-form-item> -->
+                    <!-- <cascaderOption></cascaderOption> -->
                 <!-- </div> -->
             </el-form>
         </el-col>
@@ -385,9 +380,15 @@
     // 引入自定义组件
     import selectCat from "@/components/select.vue"
 
+    // 引入自定义级联组件
+    import vueCascader from "@/components/cascader.vue"
+    import cascaderOption from "@/components/cascaderOption.vue"
+
     export default {
         components: {
-            selectCat
+            selectCat,
+            vueCascader,
+            cascaderOption
         },
         data() {
             return {
@@ -548,6 +549,7 @@
                         var list1 = JSON.parse(JSON.stringify(res.data));
                         
                         this.option = this.changeArr(list1);
+                        console.log(this.option, '部门')
                     } else {
                         this.$message({
                             message: res.msg,
@@ -897,6 +899,20 @@
                     this.search.endDate = null
                 }
                 this.getList()
+            },
+            // 自定义部门选择
+            vueCasader(obj) {
+                console.log(obj, '组件传过来的')
+                if(obj.distinction == '1') {
+                    if(obj.id != '') {
+                        let arr = []
+                        arr.push(obj.id)
+                        this.search.departmentIdArray = arr
+                    } else {
+                        this.search.departmentIdArray = []
+                    }
+                    this.getList(1)
+                }
             }
         },
         created() {