Bläddra i källkod

添加用户权限相关的接口

seyason 3 år sedan
förälder
incheckning
6d2546a5f6
100 ändrade filer med 3405 tillägg och 212 borttagningar
  1. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  2. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java
  3. 8 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupTemplateController.java
  4. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java
  5. 74 57
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  6. 24 30
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  7. 58 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserYearleaveSettingController.java
  8. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysFunction.java
  9. 9 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java
  10. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysRole.java
  11. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysRoleFunction.java
  12. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysRoleModule.java
  13. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java
  14. 53 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserYearleaveSetting.java
  15. 5 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/GanttDataItem.java
  16. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/RichUserYearLeave.java
  17. 8 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  18. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  19. 22 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserYearleaveSettingMapper.java
  20. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyDingdingService.java
  21. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceService.java
  22. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/GroupTemplateService.java
  23. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskGroupService.java
  24. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserYearleaveSettingService.java
  25. 28 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java
  26. 9 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  27. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceImportServiceImpl.java
  28. 189 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  29. 37 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/GroupTemplateServiceImpl.java
  30. 15 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  31. 119 34
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  32. 71 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskGroupServiceImpl.java
  33. 18 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  34. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  35. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserYearleaveSettingServiceImpl.java
  36. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  37. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  38. 5 6
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  39. 30 4
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  40. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysFunctionMapper.xml
  41. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysModuleMapper.xml
  42. 9 4
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  43. 36 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserYearleaveSettingMapper.xml
  44. 45 8
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  45. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  46. 9 4
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/exaLeave/exaLeave.vue
  47. 6 3
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue
  48. 10 10
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js
  49. 31 0
      fhKeeper/formulahousekeeper/user/.gitignore
  50. 118 0
      fhKeeper/formulahousekeeper/user/.mvn/wrapper/MavenWrapperDownloader.java
  51. BIN
      fhKeeper/formulahousekeeper/user/.mvn/wrapper/maven-wrapper.jar
  52. 2 0
      fhKeeper/formulahousekeeper/user/.mvn/wrapper/maven-wrapper.properties
  53. 1 0
      fhKeeper/formulahousekeeper/user/dabao.cmd
  54. 310 0
      fhKeeper/formulahousekeeper/user/mvnw
  55. 182 0
      fhKeeper/formulahousekeeper/user/mvnw.cmd
  56. 156 0
      fhKeeper/formulahousekeeper/user/pom.xml
  57. 13 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/UserApplication.java
  58. 21 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/CompanyController.java
  59. 21 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/DepartmentController.java
  60. 88 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/PermissionController.java
  61. 20 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysFunctionController.java
  62. 20 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysModuleController.java
  63. 35 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysRoleController.java
  64. 20 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysRoleFunctionController.java
  65. 20 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysRoleModuleController.java
  66. 158 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/UserController.java
  67. 20 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/UserPermissionController.java
  68. 120 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/Company.java
  69. 61 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/Department.java
  70. 54 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/Permission.java
  71. 83 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysFunction.java
  72. 108 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysModule.java
  73. 60 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysRole.java
  74. 47 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysRoleFunction.java
  75. 47 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysRoleModule.java
  76. 106 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/User.java
  77. 54 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/UserPermission.java
  78. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/CompanyMapper.java
  79. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/DepartmentMapper.java
  80. 25 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/PermissionMapper.java
  81. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysFunctionMapper.java
  82. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysModuleMapper.java
  83. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysRoleFunctionMapper.java
  84. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysRoleMapper.java
  85. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysRoleModuleMapper.java
  86. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/UserMapper.java
  87. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/UserPermissionMapper.java
  88. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/CompanyService.java
  89. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/DepartmentService.java
  90. 35 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/PermissionService.java
  91. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysFunctionService.java
  92. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysModuleService.java
  93. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysRoleFunctionService.java
  94. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysRoleModuleService.java
  95. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysRoleService.java
  96. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/UserPermissionService.java
  97. 37 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/UserService.java
  98. 20 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/impl/CompanyServiceImpl.java
  99. 20 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/impl/DepartmentServiceImpl.java
  100. 0 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/impl/PermissionServiceImpl.java

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -10,7 +10,11 @@ import com.dingtalk.api.request.OapiServiceGetSuiteTokenRequest;
 import com.dingtalk.api.request.OapiServiceGetUnactiveCorpRequest;
 import com.dingtalk.api.response.OapiServiceGetSuiteTokenResponse;
 import com.dingtalk.api.response.OapiServiceGetUnactiveCorpResponse;
+import com.management.platform.entity.CompanyDingding;
 import com.management.platform.entity.SysConfig;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.DingDingService;
 import com.management.platform.util.*;
 import com.taobao.api.ApiException;
@@ -40,6 +44,10 @@ public class DingDingController {
     @Resource
     private DingDingService dingDingService;
     static ExecutorService executorService = Executors.newCachedThreadPool();
+    @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
+    private UserMapper userMapper;
 
     @RequestMapping("/callback")
     public Map<String, String> dingCallback(
@@ -261,4 +269,15 @@ public class DingDingController {
         return dingDingService.reAuthCorp(corpid);
     }
 
+    @RequestMapping("/pushLeaveAuditAlert")
+    public HttpRespMsg pushLeaveAuditAlert(String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(userId);
+        System.out.println("测试发送审批给=="+user.getName());
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+
+        companyDingdingService.sendLeaveApplyAlertMsg(dingding.getCompanyId(), dingding.getAgentId(), "", user.getDingdingUserid());
+
+        return msg;
+    }
 }

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java

@@ -70,6 +70,11 @@ public class FinanceController {
         return financeService.exportData(date, assignNoProUser, request);
     }
 
+    @RequestMapping("/exportFinance")
+    public HttpRespMsg exportFinance(@RequestParam String date, HttpServletRequest request) {
+        return financeService.exportFinance(date, request);
+    }
+
     //按照项目分配财务成本
     @RequestMapping("/getTimeCost")
     public HttpRespMsg getTimeCost(String yearMonth, Boolean assignNoProUser,HttpServletRequest request) {

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

@@ -78,9 +78,12 @@ public class GroupTemplateController {
         templateQueryWrapper.eq("company_id", user.getCompanyId()).or().eq("is_system",1).orderByDesc("id");
         List<GroupTemplate> list = groupTemplateService.list(templateQueryWrapper);
         //查找任务列表名称
-        for (GroupTemplate template:list
-             ) {
-            template.setStagesList(groupTmpstagesService.list(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId())));
+        for (GroupTemplate template:list) {
+            List<GroupTmpstages> groupTmpstages = groupTmpstagesService.list(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
+            template.setStagesList(groupTmpstages);
+
+            //TODO: 查找每个阶段模板任务/里程碑/风险
+
         }
         HttpRespMsg msg = new HttpRespMsg();
         msg.data = list;
@@ -88,9 +91,9 @@ public class GroupTemplateController {
     }
 
     @RequestMapping("/addTemplate")
-    public HttpRespMsg addTemplate(Integer groupId, String name) {
+    public HttpRespMsg addTemplate(Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk) {
         String uid = request.getHeader("Token");
-        return groupTemplateService.addTemplate(uid, groupId, name);
+        return groupTemplateService.addTemplate(uid, groupId, name, saveTask, saveMileStone, saveRisk);
     }
 
     @RequestMapping("/deleteTemplate")

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

@@ -191,14 +191,14 @@ public class StagesController {
         List<Task> tasks = taskService.simpleList(queryWrapper);
         //普通员工,并且非项目经理,只能看到自己创建的,负责的和待分配的任务
         if (user.getRole() == 0 && !userId.equals(project.getInchargerId())) {
-            tasks = tasks.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().equals(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
+            tasks = tasks.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().contains(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
         }
         List<Task> subTasks = new ArrayList<>();
         if (tasks.size() > 0) {
             List<Integer> collect = tasks.stream().map(Task::getId).collect(Collectors.toList());
             List<Task> subLists = taskService.simpleList(new QueryWrapper<Task>().in("parent_tid", collect));
             if (user.getRole() == 0 && !userId.equals(project.getInchargerId())) {
-                subLists = subLists.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().equals(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
+                subLists = subLists.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().contains(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
             }
             subTasks.addAll(subLists);
         }

+ 74 - 57
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -7,12 +7,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.TaskCommentMapper;
+import com.management.platform.mapper.TaskExecutorMapper;
 import com.management.platform.mapper.TaskMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
 import org.opencv.features2d.SimpleBlobDetector;
 import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.WebDataBinder;
 import org.springframework.web.bind.annotation.InitBinder;
@@ -57,8 +59,6 @@ public class TaskController {
     @Resource
     private ProjectService projectService;
     @Resource
-    private UserRecentTaskService userRecentTaskService;
-    @Resource
     private UserMapper userMapper;
     @Resource
     private TaskLogService taskLogService;
@@ -74,10 +74,17 @@ public class TaskController {
     private TaskCommentMapper taskCommentMapper;
     @Resource
     private TaskMapper taskMapper;
+    @Resource
+    private TaskExecutorMapper taskExecutorMapper;
+    @Resource
+    private TaskExecutorService taskExecutorService;
 
     @RequestMapping("/save")
+    @Transactional
     public HttpRespMsg save(Task task) {
         String userId = request.getHeader("Token");
+        String executorListStr = task.getExecutorListStr();
+
         //当前用户
         User user = userMapper.selectById(userId);
         HttpRespMsg msg = new HttpRespMsg();
@@ -91,19 +98,31 @@ public class TaskController {
             task.setCompanyId(user.getCompanyId());
         }
 
-
-        if (!StringUtils.isEmpty(task.getExecutorId())) {
-            User executor = userMapper.selectById(task.getExecutorId());
-
-            task.setExecutorName(executor.getName());
-            task.setExecutorColor(executor.getColor());
+        if (!StringUtils.isEmpty(executorListStr)) {
+            List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()));
+            List<TaskExecutor> executorList = JSONArray.parseArray(executorListStr, TaskExecutor.class);
+            task.setExecutorList(executorList);
+            executorList.stream().filter(ex->!StringUtils.isEmpty(ex.getExecutorId())).forEach(ex->{
+                User exeUser = allUsers.stream().filter(al->al.getId().equals(ex.getExecutorId())).findFirst().get();
+                ex.setExecutorName(exeUser.getName());
+                ex.setExecutorColor(exeUser.getColor());
+                ex.setProjectId(task.getProjectId());
+            });
+            String ids = executorList.stream().filter(f->!StringUtils.isEmpty(f.getExecutorId())).map(TaskExecutor::getExecutorId).collect(Collectors.joining(","));
+            task.setExecutorId(StringUtils.isEmpty(ids)?null:ids);
+            String names = executorList.stream().filter(f->!StringUtils.isEmpty(f.getExecutorId())).map(TaskExecutor::getExecutorName).collect(Collectors.joining(","));
+            task.setExecutorName(StringUtils.isEmpty(names)?null:names);
+            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().mapToInt(TaskExecutor::getPlanHours).sum());
         }
         //有父任务,需要设置名称
         if (task.getParentTid() != null && task.getParentTname() == null) {
             task.setParentTname(taskService.getById(task.getParentTid()).getName());
         }
         boolean isNew = false;
-        String msgRecepient = null;
+        List<String> msgRecepientList = new ArrayList<>();
         //新建的任务需要计算排序
         if (task.getId() == null) {
             isNew = true;
@@ -116,9 +135,8 @@ public class TaskController {
                 task.setSeq(taskList.get(0).getSeq() + 1);
             }
             if (task.getExecutorId() != null) {
-                msgRecepient = task.getExecutorId();
+                msgRecepientList = task.getExecutorList().stream().filter(exe->exe.getExecutorId() != null).map(TaskExecutor::getExecutorId).collect(Collectors.toList());
             }
-
         } else {
             //更新的情况,需要对比是否修改了任务标题,更新子任务的parentTname
             Task oldTask = taskService.getById(task.getId());
@@ -126,17 +144,28 @@ public class TaskController {
                 Task sample = new Task();
                 sample.setParentTname(task.getName());
                 taskService.update(sample, new QueryWrapper<Task>().eq("parent_tid", task.getId()));
-
-                UserRecentTask userRecentTask = new UserRecentTask();
-                userRecentTask.setTaskName(task.getName());
-                userRecentTaskService.update(userRecentTask, new QueryWrapper<UserRecentTask>().eq("task_id", task.getId()));
             }
-            if (task.getExecutorId() != null && !task.getExecutorId().equals(oldTask.getExecutorId())) {
-                //执行人发生变化
-                msgRecepient = task.getExecutorId();
+            List<TaskExecutor> oldExeList = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", task.getId()));
+            //计算需要移除的执行人
+            List<Integer> ids = oldExeList.stream().filter(old->!task.getExecutorList().stream().anyMatch(newT->newT.getExecutorId().equals(old.getExecutorId())))
+                        .map(TaskExecutor::getId).collect(Collectors.toList());
+            if (ids.size() > 0) {
+                taskExecutorService.removeByIds(ids);
             }
+
+            task.getExecutorList().forEach(exe->exe.setTaskId(task.getId()));
+            taskExecutorService.saveOrUpdateBatch(task.getExecutorList());
+
+            //新增的执行人
+            msgRecepientList = task.getExecutorList().stream().filter(newT->newT.getExecutorId() != null && !oldExeList.stream().anyMatch(old->newT.getExecutorId().equals(old.getExecutorId())))
+                    .map(TaskExecutor::getExecutorId).collect(Collectors.toList());
         }
         taskService.saveOrUpdate(task);
+        if (isNew) {
+            //保存任务执行人
+            task.getExecutorList().forEach(exe->exe.setTaskId(task.getId()));
+            taskExecutorService.saveBatch(task.getExecutorList());
+        }
 
 
         TaskComment comment = new TaskComment();
@@ -147,18 +176,15 @@ public class TaskController {
         comment.setContent(user.getName()+(isNew?"创建":"编辑")+"了任务");
         taskCommentMapper.insert(comment);
 
-        //更新执行人近期任务
-        if (!StringUtils.isEmpty(task.getExecutorId())) {
-            saveOrUpdateRecentTask(task, task.getExecutorId());
-        }
-
         //新增任务,需要重新计算项目进度
         if (isNew) {
             updateProjectProgress(task.getProjectId());
         }
-        if (msgRecepient != null) {
-            //发消息通知执行人, 待项目id
-            informationService.save(new Information().setType(1).setContent(String.valueOf(task.getProjectId())).setUserId(msgRecepient));
+        if (msgRecepientList.size() > 0) {
+            //发消息通知执行人, 带项目id
+            msgRecepientList.forEach(msgRecepient->{
+                informationService.save(new Information().setType(1).setContent(String.valueOf(task.getProjectId())).setUserId(msgRecepient));
+            });
         }
         return msg;
     }
@@ -166,7 +192,7 @@ public class TaskController {
     private void updateProjectProgress(Integer projectId) {
         //更新项目完成度
         //只有第一级任务才更新项目进度, 非已撤销状态的
-        List<Task> all = taskService.list(new QueryWrapper<Task>().eq("project_id", projectId).isNull("parent_tid").ne("task_status", 2));
+        List<Task> all = taskMapper.simpleList(new QueryWrapper<Task>().eq("project_id", projectId).isNull("parent_tid").ne("task_status", 2));
 
         if (all.size() > 0) {
             long running = all.stream().filter(a -> a.getTaskStatus() == 1).count();
@@ -326,7 +352,7 @@ public class TaskController {
             queryWrapper.eq("creater_id", userId);
         } else if (viewId == 6) {
             //我执行的任务
-            queryWrapper.eq("executor_id", userId);
+            queryWrapper.like("executor_id", userId);
         } else if (viewId == 7) {
             //今天的任务
             queryWrapper.eq("end_date", LocalDate.now());
@@ -338,7 +364,7 @@ public class TaskController {
 
         //普通员工,并且非项目经理,只能看到自己创建的,负责的和待分配的任务
         if (user.getRole() == 0 && !userId.equals(project.getInchargerId())) {
-            list = list.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().equals(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
+            list = list.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().contains(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
         }
         //设置列表名称
         list.forEach(item->{
@@ -368,7 +394,7 @@ public class TaskController {
         //检查是否已经被认领
         Task t = taskService.getById(id);
         if (t.getExecutorId() != null) {
-            if (t.getExecutorId().equals(userId)) {
+            if (t.getExecutorId().contains(userId)) {
                 msg.setError("您已认领过该任务,请勿重复操作");
             } else {
                 msg.setError("该任务已被其他人认领");
@@ -380,29 +406,19 @@ public class TaskController {
             task.setExecutorName(user.getName());
             task.setExecutorColor(user.getColor());
             taskService.updateById(task);
-
-            //更新用户近期任务
-            saveOrUpdateRecentTask(task, userId);
-        }
-        return msg;
-    }
-
-    private void saveOrUpdateRecentTask(Task task, String userId) {
-        //更新用户近期任务
-        List<UserRecentTask> recentTaskList = userRecentTaskService.list(new QueryWrapper<UserRecentTask>().eq("task_id", task.getId()).eq("user_id", userId));
-        UserRecentTask recentTask = null;
-        if (recentTaskList.size() > 0) {
-            recentTask = recentTaskList.get(0);
-            if (recentTask != null) {
-                userRecentTaskService.removeById(recentTask.getId());
+            //加入执行人表
+            List<TaskExecutor> executorList = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", id));
+            if (executorList.size() > 0) {
+                TaskExecutor oldExe = executorList.get(0);
+                TaskExecutor.fromTask(task, oldExe);
+                taskExecutorMapper.updateById(oldExe);
+            } else {
+                //不存在,新增一条
+                TaskExecutor executor = TaskExecutor.fromTask(t);
+                taskExecutorMapper.insert(executor);
             }
         }
-        recentTask = new UserRecentTask();
-        recentTask.setTaskId(task.getId());
-        recentTask.setTaskName(task.getName());
-        recentTask.setProjectId(task.getProjectId());
-        recentTask.setUserId(userId);
-        userRecentTaskService.save(recentTask);
+        return msg;
     }
 
     /**
@@ -414,8 +430,11 @@ public class TaskController {
     public HttpRespMsg getTask(Integer id) {
         HttpRespMsg msg = new HttpRespMsg();
         String userId = request.getHeader("Token");
-        Task task = new Task();
         Task t = taskService.getById(id);
+        if (t == null) {
+            msg.setError("该任务已不存在");
+            return msg;
+        }
         //查询直接子任务
         QueryWrapper<Task> subQuery = new QueryWrapper<Task>().eq("parent_tid", id);
         t.setSubTaskList(taskService.list(subQuery));
@@ -428,6 +447,8 @@ public class TaskController {
             String name = userMapper.selectById(list.get(0).getCreatorId()).getName();
             list.get(0).setCreatorName(name);
         }
+        //查询任务的执行人
+        t.setExecutorList(taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", t.getId())));
         msg.data = t;
         return msg;
     }
@@ -507,8 +528,6 @@ public class TaskController {
         taskLogService.remove(new QueryWrapper<TaskLog>().eq("task_id",  id));
         //删除留言
         taskCommentService.remove(new QueryWrapper<TaskComment>().eq("task_id", id));
-        //删除近期任务
-        userRecentTaskService.remove(new QueryWrapper<UserRecentTask>().eq("task_id", id));
         deleteSubTask(task);
 
         //删除根任务,需要重新计算项目进度
@@ -527,8 +546,6 @@ public class TaskController {
             taskLogService.remove(new QueryWrapper<TaskLog>().in("task_id",  collect));
             //删除留言
             taskCommentService.remove(new QueryWrapper<TaskComment>().in("task_id", collect));
-            //删除近期任务
-            userRecentTaskService.remove(new QueryWrapper<UserRecentTask>().in("task_id", collect));
             subTasks.forEach(s->{
                 deleteSubTask(s);
             });
@@ -574,7 +591,7 @@ public class TaskController {
         queryWrapper.eq("task_status", status);
         if (viewId == 1) {
             //我执行的任务
-            queryWrapper.eq("executor_id", userId);
+            queryWrapper.like("executor_id", userId);
         } else if (viewId == 2) {
             //我创建的任务
             queryWrapper.eq("creater_id", userId);

+ 24 - 30
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -43,19 +43,32 @@ public class TaskGroupController {
     @RequestMapping("/save")
     public HttpRespMsg save(TaskGroup item) {
         HttpRespMsg msg = new HttpRespMsg();
+        boolean hasSameName = false;
         if (item.getId() == null) {
             item.setNew(true);
+            int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>().eq("project_id", item.getProjectId()).eq("name", item.getName()));
+            hasSameName = cnt>0;
+        } else {
+            int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>()
+                    .eq("project_id", item.getProjectId()).eq("name", item.getName())
+                    .ne("id", item.getId()));
+            hasSameName = cnt>0;
+        }
+        //检查是否有同名的分组
+        if (hasSameName) {
+            msg.setError("分组存在重名");
+        } else {
+            taskGroupService.saveOrUpdate(item);
+            QueryWrapper<TaskGroup> queryWrapper = new QueryWrapper<TaskGroup>();
+            queryWrapper.eq("project_id", item.getProjectId());
+            List<TaskGroup> groupList = taskGroupService.list(queryWrapper);
+            groupList.stream().forEach(g->{
+                if (g.getId().equals(item.getId())) {
+                    g.setNew(item.isNew());
+                }
+            });
+            msg.data = groupList;
         }
-        taskGroupService.saveOrUpdate(item);
-        QueryWrapper<TaskGroup> queryWrapper = new QueryWrapper<TaskGroup>();
-        queryWrapper.eq("project_id", item.getProjectId());
-        List<TaskGroup> groupList = taskGroupService.list(queryWrapper);
-        groupList.stream().forEach(g->{
-            if (g.getId().equals(item.getId())) {
-                g.setNew(item.isNew());
-            }
-        });
-        msg.data = groupList;
         return msg;
     }
 
@@ -132,26 +145,7 @@ public class TaskGroupController {
 
     @RequestMapping("/createFromTemplate")
     public HttpRespMsg createFromTemplate(GroupTemplate template, Integer projectId) {
-        TaskGroup taskGroup = new TaskGroup();
-        taskGroup.setName(template.getName());
-        taskGroup.setProjectId(projectId);
-        taskGroupService.save(taskGroup);
-
-        //从模板创建任务列表
-        List<GroupTmpstages> stages = groupTmpstagesService.list(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
-        List<Stages> batchList = new ArrayList<>();
-        stages.forEach(s->{
-            Stages item = new Stages();
-            item.setGroupId(taskGroup.getId());
-            item.setStagesName(s.getStagesName());
-            item.setSequence(s.getSequence());
-            item.setProjectId(projectId);
-            batchList.add(item);
-        });
-        stagesService.saveBatch(batchList);
-        HttpRespMsg msg = new HttpRespMsg();
-        msg.data = taskGroup;
-        return msg;
+        return taskGroupService.createFromTemplate(template, projectId);
     }
 
 

+ 58 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserYearleaveSettingController.java

@@ -0,0 +1,58 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.User;
+import com.management.platform.entity.UserYearleaveSetting;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.UserYearleaveSettingMapper;
+import com.management.platform.service.UserYearleaveSettingService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-29
+ */
+@RestController
+@RequestMapping("/user-yearleave-setting")
+public class UserYearleaveSettingController {
+    @Resource
+    private UserYearleaveSettingService userYearleaveSettingService;
+    @Resource
+    private UserYearleaveSettingMapper userYearleaveSettingMapper;
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+
+    @RequestMapping("/save")
+    public HttpRespMsg save(String userId, Integer companyId, Integer yearDays) {
+        UserYearleaveSetting item = new UserYearleaveSetting();
+        item.setCompanyId(companyId);
+        item.setUserId(userId);
+        item.setYearDays(yearDays);
+        userYearleaveSettingService.saveOrUpdate(item);
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list() {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        //查找人员的年假设置
+        msg.data = userYearleaveSettingMapper.getRichList(user.getCompanyId());
+        return msg;
+    }
+}
+

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-06-03
+ * @since 2022-03-30
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -63,6 +63,12 @@ public class SysFunction extends Model<SysFunction> {
     @TableField("use_state")
     private Boolean useState;
 
+    /**
+     * 所属版本,0-基础版,1-项目管理专业版
+     */
+    @TableField("package_type")
+    private Integer packageType;
+
 
     @Override
     protected Serializable pkVal() {

+ 9 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java

@@ -1,5 +1,6 @@
 package com.management.platform.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -14,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-06-03
+ * @since 2022-03-30
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -26,7 +27,7 @@ public class SysModule extends Model<SysModule> {
     /**
      * 主键CODE
      */
-    @TableId("id")
+    @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
     /**
@@ -77,6 +78,12 @@ public class SysModule extends Model<SysModule> {
     @TableField("config")
     private String config;
 
+    /**
+     * 所属版本级别: 0-基础版,1-项目管理专业版
+     */
+    @TableField("package_type")
+    private Integer packageType;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-06-03
+ * @since 2022-03-30
  */
 @Data
 @EqualsAndHashCode(callSuper = false)

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

@@ -14,7 +14,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-06-03
+ * @since 2022-03-30
  */
 @Data
 @EqualsAndHashCode(callSuper = false)

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

@@ -14,7 +14,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-06-03
+ * @since 2022-03-30
  */
 @Data
 @EqualsAndHashCode(callSuper = false)

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

@@ -193,6 +193,11 @@ public class Task extends Model<Task> {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate startDate;
 
+    @TableField(exist = false)
+    private List<TaskExecutor> executorList;
+
+    @TableField(exist = false)
+    private String executorListStr;
 
     @Override
     protected Serializable pkVal() {

+ 53 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserYearleaveSetting.java

@@ -0,0 +1,53 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class UserYearleaveSetting extends Model<UserYearleaveSetting> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId("user_id")
+    private String userId;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("year_days")
+    private Integer yearDays;
+
+    /**
+     * 已请年假数
+     */
+    @TableField("already_days")
+    private Integer alreadyDays;
+
+    /**
+     * 当前剩余年假数
+     */
+    @TableField("left_days")
+    private Integer leftDays;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.userId;
+    }
+
+}

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

@@ -3,6 +3,7 @@ package com.management.platform.entity.vo;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
 
@@ -12,10 +13,10 @@ public class GanttDataItem {
     public String userId;
     public String text;
     public Integer duration;
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    public Date start_date;
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    public Date end_date;
+//    @JsonFormat(pattern = "yyyy-MM-dd")
+    public String start_date;
+//    @JsonFormat(pattern = "yyyy-MM-dd")
+    public String end_date;
     public String parent;
     public Integer projectId;
     public String render;

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/RichUserYearLeave.java

@@ -0,0 +1,10 @@
+package com.management.platform.entity.vo;
+
+import com.management.platform.entity.UserYearleaveSetting;
+import lombok.Data;
+
+@Data
+public class RichUserYearLeave extends UserYearleaveSetting {
+    public String userName;
+    public String department;
+}

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

@@ -29,13 +29,14 @@ public interface ReportMapper extends BaseMapper<Report> {
     List<HashMap<String, Object>> getProjectMembReportByDate(@Param("startDate") String startDate,
                                                      @Param("companyId") Integer companyId,
                                                      @Param("leaderId") String leaderId,
-                                                     @Param("endDate") String endDate);
+                                                     @Param("endDate") String endDate,
+                                                     @Param("projectId") Integer projectId);
 
     //获取部门下的人员的日报
     List<HashMap<String, Object>> getDeptMembReportByDate(@Param("startDate") String startDate,
                                                              @Param("companyId") Integer companyId,
                                                              @Param("deptIds") List<Integer> deptIds,
-                                                             @Param("endDate") String endDate);
+                                                             @Param("endDate") String endDate, @Param("projectId") Integer projectId);
 
     //按当前人员获取本人报告
     List<Map<String, Object>> getReportByDate(@Param("date") String date, @Param("id") String id);
@@ -95,5 +96,9 @@ public interface ReportMapper extends BaseMapper<Report> {
 
     List<Map<String, Object>> getMonthReportProjectList(Integer companyId, String startDate, String endDate);
 
-    void deleteUserSameDayReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList);
+    void deleteUserSameDayReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList, Integer needDeptAudit);
+
+    List<Map<String, Object>> getDuplicate(Integer companyId);
+
+    List<Map> getSameDayPassReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java

@@ -26,6 +26,8 @@ public interface TaskMapper extends BaseMapper<Task> {
 
     List<Task> simpleList(@Param(Constants.WRAPPER) Wrapper wrapper);
 
+    List<Task> nameList(@Param(Constants.WRAPPER) Wrapper wrapper);
+
     List getTaskTimeCompare(Integer projectId);
 
     List<TimeTask> getTaskWithWorktime(Integer projectId, Integer taskType);

+ 22 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserYearleaveSettingMapper.java

@@ -0,0 +1,22 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.UserYearleaveSetting;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.vo.RichUserYearLeave;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-29
+ */
+public interface UserYearleaveSettingMapper extends BaseMapper<UserYearleaveSetting> {
+
+    List<RichUserYearLeave> getRichList(Integer companyId);
+
+}

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

@@ -17,4 +17,6 @@ public interface CompanyDingdingService extends IService<CompanyDingding> {
     public void sendFillReportAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
 
     public void sendRejectReportMsg(Integer companyId, String date, String projectNames, String reason, String auditorName, String useridList);
+
+    public void sendLeaveApplyAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
 }

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

@@ -28,4 +28,6 @@ public interface FinanceService extends IService<Finance> {
     HttpRespMsg getNoProjectUsers(String yearMonth, HttpServletRequest request);
 
     HttpRespMsg getProjects(Integer companyId, String yearMonth);
+
+    HttpRespMsg exportFinance(String date, HttpServletRequest request);
 }

+ 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);
+    public HttpRespMsg addTemplate(String token, Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk);
 }

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

@@ -1,7 +1,9 @@
 package com.management.platform.service;
 
+import com.management.platform.entity.GroupTemplate;
 import com.management.platform.entity.TaskGroup;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
 
 /**
  * <p>
@@ -14,4 +16,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface TaskGroupService extends IService<TaskGroup> {
 
     void saveGroupIncharger(TaskGroup taskGroup);
+
+    HttpRespMsg createFromTemplate(GroupTemplate template, Integer projectId);
 }

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

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

+ 28 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java

@@ -41,6 +41,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
     public static final String TEMPLATE_ALERT_REPORT = "1be1d93884c84beab4744f323e85bcd8";
     //驳回消息提醒模板
     public static final String TEMPLATE_REJECT_REPORT = "62a3cb7230734fe0824f776f5cee5a7a";
+    //请假申请提交提醒到审核人
+    public static final String TEMPLATE_LEAVE_APPLY = "8e2f89e03f1a43b58b3e83dc7c9ac5ba";
 
 
     @Resource
@@ -93,6 +95,32 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         System.out.println(rsp.getBody());
     }
 
+    @Override
+    public void sendLeaveApplyAlertMsg(Integer companyId, Long agentId, String msg, String useridList) {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
+        OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
+        System.out.println("发送 请假提交审批 =="+msg+", agentId="+agentId);
+        CompanyDingding dingding = getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+        req.setAgentId(agentId);
+//        req.setDeptIdList("421897262");
+        req.setUseridList(useridList);
+        req.setTemplateId(TEMPLATE_LEAVE_APPLY);
+        JSONObject json = new JSONObject();
+        json.put("employeeName", "张辉");
+        json.put("deptName", "质量部");
+        json.put("date", "2022-03-29");
+        req.setData(json.toJSONString());
+        OapiMessageCorpconversationSendbytemplateResponse rsp = null;
+        try {
+            rsp = client.execute(req, getCorpAccessToken(dingding));
+        } catch (ApiException e) {
+            e.printStackTrace();
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        System.out.println(rsp.getBody());
+    }
+
     private String getDDSuiteAccessToken() throws ApiException {
         if (DingDingServiceImpl.SUITE_ACCESS_TOKEN == null || DingDingServiceImpl.suiteTokenExpireTime < System.currentTimeMillis()) {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_suite_token");

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

@@ -551,7 +551,15 @@ public class DingDingServiceImpl implements DingDingService {
                                     .eq("dd_deptid", departmentDingding.getDdDeptid()));
                             DepartmentDingding ddd = departmentDingdings.get(0);
                             Integer sysDeptid = ddd.getSysDeptid();
-                            department = departmentMapper.selectById(sysDeptid);
+                            Department oldDept = departmentMapper.selectById(sysDeptid);
+                            //已经被删除了,忽略
+                            if (oldDept != null) {
+                                department = oldDept;
+//                                departmentMapper.insert(department);
+//                                //更新一下之前的记录,设置刚生成的这个部门id
+//                                ddd.setSysDeptid(department.getDepartmentId());
+//                                departmentDingdingMapper.updateById(ddd);
+                            }
                         } else {
                             departmentMapper.insert(department);
                             departmentDingding.setSysDeptid(department.getDepartmentId());
@@ -565,7 +573,6 @@ public class DingDingServiceImpl implements DingDingService {
                 //获取子部门
                 getDepartmentList(companyId, corpid, accessToken, departmentDingding.getDdDeptid(), department.getDepartmentId());
             }
-
         } catch (ApiException e) {
             e.printStackTrace();
         }

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

@@ -206,8 +206,8 @@ public class FinanceImportServiceImpl extends ServiceImpl<FinanceImportMapper, F
         }
         File destFile = new File(dir, destFileName);
         try {
-            multipartFile.transferTo(destFile);
-//            FileUtils.copyFile(new File(multipartFile.getOriginalFilename()), destFile);
+//            multipartFile.transferTo(destFile);
+            FileUtils.copyFile(file, destFile);
             FinanceImport log = new FinanceImport();
             log.setCompanyId(companyId);
             log.setFileName(originName);

+ 189 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -12,6 +12,7 @@ import com.management.platform.service.ReportService;
 import com.management.platform.service.UserService;
 import com.management.platform.util.*;
 import lombok.extern.log4j.Log4j;
+import org.apache.commons.io.FileUtils;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.poi.hssf.usermodel.*;
@@ -52,6 +53,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     @Resource
     private FinanceMapper financeMapper;
     @Resource
+    private CompanyMapper companyMapper;
+    @Resource
     private ReportMapper reportMapper;
     @Resource
     private UserMapper userMapper;
@@ -73,6 +76,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     private ProjectPercentageMapper projectPercentageMapper;
     @Resource
     private FinanceFixedcolnameService financeFixedcolnameService;
+    @Resource
+    private FinanceImportMapper financeImportMapper;
 
     @Resource
     private ProjectMapper projectMapper;
@@ -112,7 +117,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     @Override
     public HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, MultipartFile multipartFile, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
-
+        User user = userMapper.selectById(request.getHeader("TOKEN"));
         //然后处理文件
         String fileName = multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
@@ -367,6 +372,38 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                     reportService.updateBatchById(reportList);
                 }
             }
+
+            //保存导入记录
+            String originName = fileName;
+            System.out.println("fileName=="+originName);
+            String[] names = originName.split("\\.");
+            String destFileName = names[0] + "_"+System.currentTimeMillis()+"."+names[1];
+            String financeFolder = "finance";
+            File dir = new File(path, financeFolder);
+            if (!dir.exists()) {
+                dir.mkdir();
+            }
+            File destFile = new File(dir, destFileName);
+            try {
+//            multipartFile.transferTo(destFile);
+                FileUtils.copyFile(file, destFile);
+                FinanceImport log = new FinanceImport();
+                log.setCompanyId(companyId);
+                log.setFileName(originName);
+                log.setServerName(financeFolder+"/"+destFileName);
+                log.setUserId(user.getId());
+                log.setUserName(user.getName());
+                log.setYmonth(yearMonth);
+                log.setRecoverMonthcost(syncUserCost?1:0);
+                log.setRecoverReport(syncHistoryReport?1:0);
+                log.setState(1);//默认审核通过
+                financeImportMapper.insert(log);
+            } catch (IOException e) {
+                e.printStackTrace();
+                msg.setError(e.getMessage());
+            } finally {
+                System.out.println("删除临时文件:"+file.delete());
+            }
         } catch (IOException e) {
             e.printStackTrace();
             msg.setError("文件处理出错");
@@ -1223,4 +1260,155 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
         msg.data = map;
         return msg;
     }
+
+    @Override
+    public HttpRespMsg exportFinance(String yearMonth, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        try {
+            Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+            final List<FinanceTblcuscol> cusColList = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+            Company company = companyMapper.selectById(companyId);
+            BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+            BigDecimal totalSalary = BigDecimal.valueOf(0);
+            BigDecimal totalBonus = BigDecimal.valueOf(0);
+            BigDecimal totalAllowance = BigDecimal.valueOf(0);
+            BigDecimal totalOld = BigDecimal.valueOf(0);
+            BigDecimal totalMedical = BigDecimal.valueOf(0);
+            BigDecimal totalLoseJob = BigDecimal.valueOf(0);
+            BigDecimal totalInjury = BigDecimal.valueOf(0);
+            BigDecimal totalHouse = BigDecimal.valueOf(0);
+            BigDecimal totalField1 = cusColList.size() > 0?BigDecimal.valueOf(0):null;
+            BigDecimal totalField2 = cusColList.size() > 1?BigDecimal.valueOf(0):null;
+            BigDecimal totalField3 = cusColList.size() > 2?BigDecimal.valueOf(0):null;
+
+            List<String> headList = new ArrayList<String>();
+            headList.add("姓名");
+            FinanceFixedcolname fixedItem = financeFixedcolnameService.getFixed(companyId);
+            headList.add(fixedItem.getMonthCost()+"(元)");
+            headList.add(fixedItem.getBonus()+"(元)");
+            headList.add(fixedItem.getAllowance()+"(元)");
+            headList.add(fixedItem.getInsuranceOld()+"(元)");
+            headList.add(fixedItem.getInsuranceMedical()+"(元)");
+            headList.add(fixedItem.getInsuranceLosejob()+"(元)");
+            headList.add(fixedItem.getInsuranceInjury()+"(元)");
+            headList.add(fixedItem.getHouseFund()+"(元)");
+            for (FinanceTblcuscol col : cusColList) {
+                headList.add(col.getFieldName());
+            }
+            headList.add("总成本(元)");
+            List<List<String>> allList = new ArrayList<List<String>>();
+            allList.add(headList);
+
+
+            //获取月成本列表
+            List<Finance> finances = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
+            for (Finance f : finances) {
+                BigDecimal cost = f.getTotalCost();
+                BigDecimal salary = f.getMonthCost();
+                BigDecimal bonus = f.getBonus();
+                BigDecimal allowance = f.getAllowance();
+                BigDecimal old = f.getInsuranceOld();
+                BigDecimal medical = f.getInsuranceMedical();
+                BigDecimal loseJob = f.getInsuranceLosejob();
+                BigDecimal injury = f.getInsuranceInjury();
+                BigDecimal house = f.getHouseFund();
+                BigDecimal field1Item = new BigDecimal(0);
+                BigDecimal field2Item = new BigDecimal(0);
+                BigDecimal field3Item = new BigDecimal(0);
+                if (f.getCustomField1() != null) {
+                    field1Item = f.getCustomField1();
+                }
+                if (f.getCustomField2() != null) {
+                    field2Item = f.getCustomField2();
+                }
+                if (f.getCustomField3() != null) {
+                    field3Item = f.getCustomField3();
+                }
+
+                totalMoneyCost = totalMoneyCost.add(cost);
+                totalSalary = totalSalary.add(salary);
+                totalBonus = totalBonus.add(bonus);
+                totalAllowance = totalAllowance.add(allowance);
+                totalOld = totalOld.add(old);
+                totalMedical = totalMedical.add(medical);
+                totalLoseJob = totalLoseJob.add(loseJob);
+                totalInjury = totalInjury.add(injury);
+                totalHouse = totalHouse.add(house);
+                if (totalField1 != null) {
+                    totalField1 = totalField1.add(field1Item);
+                }
+                if (totalField2 != null) {
+                    totalField2 = totalField2.add(field2Item);
+                }
+                if (totalField3 != null) {
+                    totalField3 = totalField3.add(field3Item);
+                }
+                List<String> rowData = new ArrayList<String>();
+                rowData.add(f.getName());
+                rowData.add(salary == null?"0":salary.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                rowData.add(bonus == null?"0":bonus.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                rowData.add(allowance == null?"0":allowance.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                rowData.add(old == null?"0":old.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                rowData.add(medical == null?"0":medical.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                rowData.add(loseJob == null?"0":loseJob.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                rowData.add(injury == null?"0":injury.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                rowData.add(house == null?"0":house.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                if (totalField1 != null) {
+                    rowData.add(field1Item.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                }
+                if (totalField2 != null) {
+                    rowData.add(field2Item.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                }
+                if (totalField3 != null) {
+                    rowData.add(field3Item.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                }
+                rowData.add(cost == null?"0":cost.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                allList.add(rowData);
+            }
+            //整体四舍五入处理
+            totalMoneyCost = totalMoneyCost.setScale(2, BigDecimal.ROUND_HALF_UP);
+            totalSalary = totalSalary.setScale(2, BigDecimal.ROUND_HALF_UP);
+            totalBonus = totalBonus.setScale(2, BigDecimal.ROUND_HALF_UP);
+            totalAllowance = totalAllowance.setScale(2, BigDecimal.ROUND_HALF_UP);
+            totalOld = totalOld.setScale(2, BigDecimal.ROUND_HALF_UP);
+            totalMedical = totalMedical.setScale(2, BigDecimal.ROUND_HALF_UP);
+            totalLoseJob = totalLoseJob.setScale(2, BigDecimal.ROUND_HALF_UP);
+            totalInjury = totalInjury.setScale(2, BigDecimal.ROUND_HALF_UP);
+            totalHouse = totalHouse.setScale(2, BigDecimal.ROUND_HALF_UP);
+            if (totalField1 != null) {
+                totalField1 = totalField1.setScale(2, BigDecimal.ROUND_HALF_UP);
+            }
+            if (totalField2 != null) {
+                totalField2 = totalField2.setScale(2, BigDecimal.ROUND_HALF_UP);
+            }
+            if (totalField3 != null) {
+                totalField3 = totalField3.setScale(2, BigDecimal.ROUND_HALF_UP);
+            }
+            //合计
+            List<String> sumRow = new ArrayList<String>();
+            sumRow.add("合计");;
+            sumRow.add(totalSalary.toString());
+            sumRow.add(totalBonus.toString());
+            sumRow.add(totalAllowance.toString());
+            sumRow.add(totalOld.toString());
+            sumRow.add(totalMedical.toString());
+            sumRow.add(totalLoseJob.toString());
+            sumRow.add(totalInjury.toString());
+            sumRow.add(totalHouse.toString());
+            if (cusColList.size() > 0) sumRow.add(totalField1.toString());
+            if (cusColList.size() > 1) sumRow.add(totalField2.toString());
+            if (cusColList.size() > 2) sumRow.add(totalField3.toString());
+            sumRow.add(totalMoneyCost.toString());
+            allList.add(sumRow);
+            //生成excel文件导出
+            String fileName = "人员薪资_"+company.getCompanyName()+yearMonth+"_"+System.currentTimeMillis();
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+            httpRespMsg.data = resp;
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            httpRespMsg.setError("验证失败");
+            return httpRespMsg;
+        }
+        return httpRespMsg;
+    }
 }

+ 37 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/GroupTemplateServiceImpl.java

@@ -1,16 +1,12 @@
 package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.entity.GroupTemplate;
-import com.management.platform.entity.GroupTmpstages;
-import com.management.platform.entity.Stages;
-import com.management.platform.entity.User;
-import com.management.platform.mapper.GroupTemplateMapper;
-import com.management.platform.mapper.StagesMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
 import com.management.platform.service.GroupTemplateService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.service.GroupTmpstagesService;
+import com.management.platform.service.GtemplateTaskService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -18,6 +14,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -38,8 +35,15 @@ public class GroupTemplateServiceImpl extends ServiceImpl<GroupTemplateMapper, G
     StagesMapper stagesMapper;
     @Resource
     GroupTmpstagesService groupTmpstagesService;
+    @Resource
+    GtemplateTaskMapper gtemplateTaskMapper;
+    @Resource
+    GtemplateTaskService gtemplateTaskService;
+    @Resource
+    TaskMapper taskMapper;
+
     @Override
-    public HttpRespMsg addTemplate(String token, Integer groupId, String name) {
+    public HttpRespMsg addTemplate(String token, Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk) {
         User user = userMapper.selectById(token);
         HttpRespMsg msg = new HttpRespMsg();
         QueryWrapper<GroupTemplate> templateQueryWrapper = new QueryWrapper<>();
@@ -68,6 +72,31 @@ public class GroupTemplateServiceImpl extends ServiceImpl<GroupTemplateMapper, G
                     tmpstagesList.add(tmp);
                 }
                 groupTmpstagesService.saveBatch(tmpstagesList);
+
+                //需要的话,保存任务,里程碑,风险
+                if (saveTask || saveMileStone || saveRisk) {
+                    long t1 = System.currentTimeMillis();
+                    List<Task> taskList = taskMapper.nameList(new QueryWrapper<Task>().eq("group_id", groupId));
+                    long t2 = System.currentTimeMillis();
+                    System.out.println("耗时==="+(t2-t1));
+                    List<Task> filterTaskList = taskList.stream().filter(t->(saveTask && t.getTaskType() == 0) || (saveMileStone && t.getTaskType() == 1)
+                            || (saveRisk && t.getTaskType() == 2)).collect(Collectors.toList());
+                    List<GtemplateTask> gtemplateTaskList = new ArrayList<>();
+                    if (filterTaskList.size() > 0) {
+                        filterTaskList.forEach(f->{
+                            GtemplateTask item = GtemplateTask.fromTask(f);
+                            item.setGtemplateId(template.getId());
+                            String stagesName = stagesList.stream().filter(s->s.getId().equals(f.getStagesId())).findFirst().get().getStagesName();
+
+                            Integer tmpSid = tmpstagesList.stream().filter(tmp->tmp.getStagesName().equals(stagesName)).findFirst().get().getId();
+                            item.setTstagesId(tmpSid);
+                            gtemplateTaskList.add(item);
+                        });
+                    }
+
+                    gtemplateTaskService.saveBatch(gtemplateTaskList);
+
+                }
             }
         }
 

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

@@ -836,7 +836,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     @Override
     public HttpRespMsg taskSum(Integer id, HttpServletRequest request) {
-        List<Task> allTask = taskMapper.selectList(new QueryWrapper<Task>().eq("project_id", id));
+        List<Task> allTask = taskMapper.simpleList(new QueryWrapper<Task>().eq("project_id", id));
         long finishCount = allTask.stream().filter(t -> t.getTaskStatus() == 1).count();
         long unfinishCount = allTask.stream().filter(t -> t.getTaskStatus() == 0).count();
         long timeupCount = allTask.stream().filter(t -> t.getTaskStatus() == 0 && t.getEndDate() != null && t.getEndDate().isBefore(LocalDate.now())).count();
@@ -1418,14 +1418,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             String lastItemId = null;
 
             GanttDataItem lastParentItem = null;
-
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             for (int i=0;i<ganttData.size(); i++) {
                 Map map = ganttData.get(i);
                 String userId = (String) map.get("user_id");
-                Date start_date = (Date) map.get("start_date");
-                Date end_date = (Date) map.get("end_date");
+                String start_date = sdf.format((Date) map.get("start_date"));
+                String end_date = sdf.format((Date) map.get("end_date"));
                 String projectId = ""+ (Integer) map.get("id");
+                String exeId = ""+ (Integer) map.get("exe_id");
                 String taskId = ""+ (Integer) map.get("task_id");
+                System.out.println(map.get("task_name")+", "+start_date+", "+end_date);
 
                 GanttDataItem curItem = new GanttDataItem();;
                 if (type == 0) {
@@ -1444,10 +1446,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         lastParentItem = parent;
                     }
 
-                    curItem.id = taskId;
+                    curItem.id = exeId;
                     curItem.userId = (String) map.get("user_id");
                     curItem.text = (String) map.get("project_name")+"/"+(String)map.get("task_name");
                     curItem.start_date = start_date;
+
                     curItem.end_date = end_date;
                     curItem.duration = (Integer)map.get("duration");
                     curItem.parent = lastItemId;
@@ -1468,7 +1471,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         lastItemId = projectId;
                         lastParentItem = parent;
                     }
-                    curItem.id = projectId+"_"+taskId;
+                    curItem.id = projectId+"_"+exeId;
                     curItem.userId = (String) map.get("user_id");
                     curItem.text = (String) map.get("name")+"/"+(String)map.get("task_name");
                     curItem.start_date = start_date;
@@ -2008,7 +2011,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 userIds = pList.stream().map(Participation::getUserId).collect(Collectors.toList());
             }
             QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
-            queryWrapper.in("department_id", deptIds).or().in("id", userIds);
+            if (deptIds.size() > 0) {
+                queryWrapper.in("department_id", deptIds).or().in("id", userIds);
+            } else {
+                queryWrapper.in("id", userIds);
+            }
+
             userList = userMapper.selectList(queryWrapper);
         }
         List<User> finalUserList = new ArrayList<>();

+ 119 - 34
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -1934,6 +1934,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         Integer companyId = user.getCompanyId();
         String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
         HttpRespMsg msg = new HttpRespMsg();
+        List<User> allRangeUserList = new ArrayList<>();
         List<Map<String, Object>> list = null;
         //分角色权限:管理员看全部的,部门负责人看自己部门的,个人只能看自己的。
         if (user.getRole() == 0) {
@@ -1948,17 +1949,33 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 List<Integer> collect = subDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList());
                 list = reportMapper.getUserDailyWorkTime(companyId, startDate, endDate, collect, null);
+                //部门负责人看自己部门相关的
+                allRangeUserList = userMapper.selectList(new QueryWrapper<User>().in("department_id", collect));
             } else {
                 //看自己的所负责的项目相关人员的
                 list = reportMapper.getUserDailyWorkTime(companyId, startDate, endDate, null, user.getId());
+                //项目相关的人员列表
+                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("incharger_id", user.getId()));
+                List<Project> collect = projectList.stream().collect(Collectors.toList());
+                if (collect.size() > 0) {
+                    List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", collect));
+                    List<String> collect1 = participationList.stream().map(Participation::getUserId).collect(Collectors.toList());
+                    allRangeUserList = userMapper.selectList(new QueryWrapper<User>().in("id", collect1));
+                }
             }
         } else {
             list = reportMapper.getUserDailyWorkTime(companyId, startDate, endDate, null, null);
+            //管理员看全公司所有人
+            allRangeUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
         }
         List<UserMonthWork> userMonthWorks = new ArrayList<UserMonthWork>();
+        List<UserDailyWorkItem> noReportDataList = new ArrayList<UserDailyWorkItem>();
+        //准备部门数据
+        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
 
         String lastUserId = null;
         UserMonthWork lastUserData = null;
+        List<String> fillReportUserIds = new ArrayList<>();
         for (Map<String, Object> data : list) {
             String id = (String)data.get("id");
             String name = (String)data.get("name");
@@ -1983,6 +2000,25 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             lastUserId = id;
         }
+        //计算未填的人员
+        List<User> noReportUserList = allRangeUserList.stream()
+                .filter(au->!userMonthWorks.stream().anyMatch(mon->mon.userId.equals(au.getId())))
+                .collect(Collectors.toList());
+
+        noReportUserList.forEach(noR-> {
+            UserMonthWork mon = new UserMonthWork();
+            mon.userId = noR.getId();
+            mon.name = noR.getName();
+            Optional<Department> find = departmentList.stream().filter(dept->dept.getDepartmentId().equals(noR.getDepartmentId())).findFirst();
+            if (find.isPresent()) {
+                mon.departmentName = find.get().getDepartmentName();
+            } else {
+                mon.departmentName = "";
+            }
+            mon.worktimeList = new ArrayList<>();
+            userMonthWorks.add(mon);
+        });
+
         HashMap map = new HashMap();
         List<HashMap> days = new ArrayList<HashMap>();
         DateTimeFormatter standFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -2015,6 +2051,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<String> titleList = new ArrayList<>();
         titleList.add("序号");
         titleList.add("姓名");
+        titleList.add("部门");
         days.forEach(d->{
 //            String dateStr = (String)d.get("date");
 //            LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
@@ -2027,9 +2064,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             UserMonthWork userMonthWork = userMonthWorks.get(i);
             List<String> dataItem = new ArrayList<>();
             dataItem.add(""+(i+1));
-            dataItem.add(userMonthWork.name);
-            //找到那一天的工作时间
+
             List<Map<String, Object>> worktimeList = userMonthWork.worktimeList;
+            dataItem.add(userMonthWork.name+(worktimeList.size()==0?"(未填)":""));
+            dataItem.add(userMonthWork.departmentName);
+            //找到那一天的工作时间
             days.forEach(d->{
 //                String dateStr = startDate;
 //                LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
@@ -2220,31 +2259,65 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
 
             if (reportList.size() > 0) {
-                reportMapper.deleteUserSameDayReport(companyId, reportList);
+                //依赖于对是否需要部门审核的判断,如果不需要则认为导入的就是审核通过的,重新导入就直接覆盖之前的。
+                reportMapper.deleteUserSameDayReport(companyId, reportList, timeType.getNeedDeptAudit());
+                if (timeType.getNeedDeptAudit() == 1) {
+                    //如果需要导入审核,则对审核通过的进行排除
+                    List<Map> passReports = reportMapper.getSameDayPassReport(companyId, reportList);
+                    StringBuilder sb = new StringBuilder();
+                    if (passReports.size() > 0) {
+                        //统计成功条数,需要去掉没有覆盖的
+                        dataCount -= passReports.size();
+                        passReports.forEach(map->{
+                            String creatorId = (String)map.get("creator_id");
+                            String createDate = sdf.format(map.get("create_date"));//yyyy/M/d格式
+                            String userName = allUserList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get().getName();
+                            sb.append(createDate).append("-").append(userName).append(",");
+                            for (int i=0;i<reportList.size(); i++) {
+                                Report one = reportList.get(i);
+                                if (LocalDate.parse(createDate, dtf).isEqual(one.getCreateDate())
+                                        &&creatorId.equals(one.getCreatorId())) {
+                                    reportList.remove(i);
+                                    i--;
+                                }
+                            }
+                        });
+                        String str = sb.toString();
+                        str = str.substring(0, str.length()-1);
+                        msg.msg = "跳过以下已审核数据:"+str+"。";
+                    }
+                }
+
                 //存储
-                reportService.saveBatch(reportList);
-                msg.data = dataCount;
-                //保存导入记录
-                String originName = fileName;
-                //定义一个独立的文件夹
-                String importFolder = "report_import";
-                File dir = new File(path, importFolder);
-                if (!dir.exists()) {
-                    dir.mkdir();
-                }
-
-                System.out.println("fileName=="+originName);
-                String[] names = originName.split("\\.");
-                String destFileName = names[0] + "_"+System.currentTimeMillis()+"."+names[1];
-                File destFile = new File(dir, destFileName);
-                FileUtils.copyFile(file, destFile);
-                ReportImportLog log = new ReportImportLog();
-                log.setCompanyId(user.getCompanyId());
-                log.setFileName(originName);
-                log.setServerName(importFolder+"/"+destFileName);
-                log.setUserId(user.getId());
-                log.setUserName(user.getName());
-                reportImportLogMapper.insert(log);
+                if (reportList.size() == 0) {
+                    //全部是重复的,本次没有需要导入的
+                    msg.setError("本次数据全部已审核通过,无法导入。");
+                    return msg;
+                } else {
+                    reportService.saveBatch(reportList);
+                    msg.data = dataCount;
+                    String originName = fileName;
+                    //定义一个独立的文件夹
+                    String importFolder = "report_import";
+                    File dir = new File(path, importFolder);
+                    if (!dir.exists()) {
+                        dir.mkdir();
+                    }
+
+                    System.out.println("fileName=="+originName);
+                    String[] names = originName.split("\\.");
+                    String destFileName = names[0] + "_"+System.currentTimeMillis()+"."+names[1];
+                    File destFile = new File(dir, destFileName);
+                    FileUtils.copyFile(file, destFile);
+                    ReportImportLog log = new ReportImportLog();
+                    log.setCompanyId(user.getCompanyId());
+                    log.setFileName(originName);
+                    log.setServerName(importFolder+"/"+destFileName);
+                    log.setUserId(user.getId());
+                    log.setUserName(user.getName());
+                    reportImportLogMapper.insert(log);
+                }
+
             } else {
                 msg.setError("工时数据不能为空");
             }
@@ -2384,15 +2457,27 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         allSubDepts.addAll(getSubDepts(dept, allDeptList));
                     }
                     List<Integer> collect = allSubDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList());
-                    allReportByDate = reportMapper.getDeptMembReportByDate(startDate, null, collect, endDate);
+                    allReportByDate = reportMapper.getDeptMembReportByDate(startDate, null, collect, endDate, projectId);
+                }
+
+                List<HashMap<String, Object>> reportsFromProjects = null;
+                //检查是否是项目负责人
+                int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", user.getId()));
+                if (cnt > 0) {
+                    reportsFromProjects = reportMapper.getProjectMembReportByDate(startDate, null, user.getId(), endDate, projectId);
                 } else {
-                    //检查是否是项目负责人
-                    int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", user.getId()));
-                    if (cnt > 0) {
-                        allReportByDate = reportMapper.getProjectMembReportByDate(startDate, null, user.getId(), endDate);
-                    } else {
-                        //普通员工只能看自己的
-                        allReportByDate = reportMapper.getAllReportByDate(startDate, null, user.getId(), endDate, projectId);
+                    //普通员工只能看自己的
+                    reportsFromProjects = reportMapper.getAllReportByDate(startDate, null, user.getId(), endDate, projectId);
+                }
+                if (allReportByDate == null) {
+                    allReportByDate = reportsFromProjects;
+                } else if (reportsFromProjects != null && reportsFromProjects.size() > 0){
+                    //有负责的项目的报告,进行排重
+                    final List<HashMap<String, Object>> tempList = allReportByDate;
+                    List<HashMap<String, Object>> filteredReports = reportsFromProjects.stream().filter(r->!tempList.stream().anyMatch(all->(int)all.get("id") == (int)r.get("id"))).collect(Collectors.toList());
+                    if (filteredReports.size() > 0) {
+                        //加上项目非重复的部分
+                        allReportByDate.addAll(filteredReports);
                     }
                 }
             }

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

@@ -1,13 +1,21 @@
 package com.management.platform.service.impl;
 
-import com.management.platform.entity.TaskGroup;
-import com.management.platform.mapper.TaskGroupMapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.StagesService;
 import com.management.platform.service.TaskGroupService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.service.TaskService;
+import com.management.platform.util.HttpRespMsg;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -19,8 +27,22 @@ import javax.annotation.Resource;
  */
 @Service
 public class TaskGroupServiceImpl extends ServiceImpl<TaskGroupMapper, TaskGroup> implements TaskGroupService {
+    @Resource
+    private HttpServletRequest request;
     @Resource
     private TaskGroupMapper taskGroupMapper;
+    @Resource
+    private GroupTemplateMapper groupTemplateMapper;
+    @Resource
+    private GroupTmpstagesMapper groupTmpstagesMapper;
+    @Resource
+    private StagesService stagesService;
+    @Resource
+    private GtemplateTaskMapper gtemplateTaskMapper;
+    @Resource
+    private TaskService taskService;
+    @Resource
+    private UserMapper userMapper;
 
     @Override
     public void saveGroupIncharger(TaskGroup taskGroup) {
@@ -31,4 +53,51 @@ public class TaskGroupServiceImpl extends ServiceImpl<TaskGroupMapper, TaskGroup
             taskGroupMapper.updateById(taskGroup);
         }
     }
+
+    @Override
+    @Transactional
+    public HttpRespMsg createFromTemplate(GroupTemplate template, Integer projectId) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        TaskGroup taskGroup = new TaskGroup();
+        taskGroup.setName(template.getName());
+        taskGroup.setProjectId(projectId);
+        save(taskGroup);
+
+        //从模板创建任务列表
+        List<GroupTmpstages> stages = groupTmpstagesMapper.selectList(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
+        List<Stages> batchList = new ArrayList<>();
+        stages.forEach(s->{
+            Stages item = new Stages();
+            item.setGroupId(taskGroup.getId());
+            item.setStagesName(s.getStagesName());
+            item.setSequence(s.getSequence());
+            item.setProjectId(projectId);
+            batchList.add(item);
+        });
+        stagesService.saveBatch(batchList);
+        //阶段的任务,里程碑,风险
+        List<GtemplateTask> gtemplateTaskList = gtemplateTaskMapper.selectList(
+                new QueryWrapper<GtemplateTask>().eq("gtemplate_id", template.getId())
+                        .orderByAsc("seq"));
+        if (gtemplateTaskList.size() > 0) {
+            List<Task> taskList = new ArrayList<>();
+            gtemplateTaskList.forEach(gt->{
+                Task task = gt.toTask();
+                task.setProjectId(projectId);
+                task.setGroupId(taskGroup.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());
+                taskList.add(task);
+            });
+            taskService.saveBatch(taskList);
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = taskGroup;
+        return msg;
+    }
 }

+ 18 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -2,11 +2,13 @@ package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.pagehelper.util.StringUtil;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.StagesMapper;
 import com.management.platform.mapper.TaskMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.TaskExecutorService;
 import com.management.platform.service.TaskService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.*;
@@ -28,6 +30,7 @@ import java.io.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.sql.Timestamp;
+import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -54,6 +57,8 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     private UserMapper userMapper;
     @Resource
     private StagesMapper stagesMapper;
+    @Resource
+    private TaskExecutorService taskExecutorService;
     @Override
     public HttpRespMsg getExecutorPanel(Integer projectId) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -139,16 +144,14 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 row.createCell(3).setCellValue((Integer) map.get("planHours"));
                 HSSFCell percentCell = row.createCell(4);
                 if ((Integer) map.get("planHours") != null) {
-                    double percent = (Double) map.get("workHours")*100/(Integer) map.get("planHours");
+                    int percent = (int)(double) map.get("workHours")*100/(Integer) map.get("planHours");
                     percent = (percent - 100);
                     String sign = "";
                     if (percent > 0) {
                         percentCell.setCellStyle(redStyle);
                         sign = "+";
-                    } else if (percent < 0) {
-                        sign = "-";
                     }
-                    percentCell.setCellValue(sign+percent+"%");
+                    percentCell.setCellValue(sign+ percent +"%");
                 } else {
                     percentCell.setCellValue(" ");
                 }
@@ -376,6 +379,17 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 taskList.add(task);
             }
             saveBatch(taskList);
+            //保存到执行人表
+            List<TaskExecutor> executorList = new ArrayList<>();
+            for (Task t : taskList) {
+                if (!StringUtil.isEmpty(t.getExecutorId())) {
+                    TaskExecutor executor = TaskExecutor.fromTask(t);
+                    executorList.add(executor);
+                }
+            }
+            if (executorList.size() > 0) {
+                taskExecutorService.saveBatch(executorList);
+            }
             //最后删掉这个文件
 //            if (!file.delete()) {
 //                System.out.println("临时文件" + file.getName() + "删除失败");

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

@@ -312,7 +312,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         httpRespMsg.setError("该员工存在填写的日报,无法删除。");
                     } else {
                         //检测是否有已参与的任务
-                        Integer taskNum = taskMapper.selectCount(new QueryWrapper<Task>().eq("executor_id", userId));
+                        Integer taskNum = taskMapper.selectCount(new QueryWrapper<Task>().like("executor_id", userId));
                         if (taskNum > 0) {
                             httpRespMsg.setError("该员工存在参与的任务,无法删除");
                         } else {

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

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

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

@@ -111,6 +111,21 @@ public class TimingTask {
         }
     }
 
+    //每周日晚上11点 同步一次本月的考勤打卡记录
+    @Scheduled(cron = "0 0 23 ? * 7")
+    private void weeklySyncCorpWXCardTime() {
+        LocalDateTime current = LocalDateTime.now();
+        LocalDateTime start = current.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime end = now.minusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        System.out.println("每周同步,开始同步本月的考勤记录="+start+" 至 "+end);
+        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
+        for (TimeType type : typeList) {
+            Integer companyId = type.getCompanyId();
+            wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end);
+        }
+    }
+
     //每个月6号早上6点同步上个月的企业微信考勤考勤打卡记录
     @Scheduled(cron = "0 0 6 6 * ?")
     private void synMonthCorpWXCardTime() {

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

@@ -17,6 +17,7 @@ spring:
     url: jdbc:mysql://47.101.180.183:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
     password: HuoshiDB@2022
+
     hikari:
       maximum-pool-size: 10
       minimum-idle: 3
@@ -117,7 +118,7 @@ referer:
     - www.ttkuaiban.com
     - mobworktime.ttkuaiban.com
     - worktime.ttkuaiban.com
-excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*
+excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*,/clean/*
 
 #企业微信相关参数
 suitId: ww4e237fd6abb635af

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

@@ -308,9 +308,10 @@
     </select>
 
     <select id="getTaskPlanByMemb" resultType="java.util.Map">
-        SELECT user.`id` as user_id, user.`name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,
-        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task.plan_hours as duration FROM user
-        LEFT JOIN task ON user.id = task.`executor_id`
+        SELECT user.`id` as user_id, user.`name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,task_executor.id as exe_id,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task_executor.plan_hours as duration FROM user
+        LEFT JOIN task_executor ON user.id = task_executor.`executor_id`
+        left join task on task.id = task_executor.task_id
         LEFT JOIN project ON project.`id` = task.`project_id`
         WHERE user.`id` IN
         <foreach collection="userIds" close=")" open="(" separator="," index="" item="item">
@@ -322,12 +323,10 @@
         ORDER BY user.id, task.start_date
     </select>
 
-
     <select id="getTaskPlanByProject" resultType="java.util.Map">
-        SELECT user.id as user_id, user.`name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,
+        SELECT task.executor_id as user_id, task.executor_name as `name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,
         IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task.plan_hours as duration FROM project
         LEFT JOIN task ON task.project_id = project.id
-        LEFT JOIN user ON user.`id` = task.`executor_id`
         WHERE project.company_id = #{companyId}
         <if test="projectIds != null">
             and project.`id` IN

+ 30 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -48,7 +48,7 @@
 
     <!--根据日期获取全部报告信息-->
     <select id="getAllReportByDate" resultType="java.util.Map">
-        SELECT c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
+        SELECT a.id, c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.pic_str as picStr, multi_worktime as multiWorktime
@@ -107,7 +107,7 @@
     </select>
 
     <select id="getProjectMembReportByDate" resultType="java.util.Map">
-        SELECT c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
+        SELECT a.id, c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.pic_str as picStr, multi_worktime as multiWorktime
@@ -128,6 +128,9 @@
         <if test="companyId != null">
             AND c.company_id = #{companyId}
         </if>
+        <if test="projectId != null">
+            AND a.project_id = #{projectId}
+        </if>
         <if test="leaderId != null">
             AND b.incharger_id = #{leaderId}
         </if>
@@ -135,7 +138,7 @@
     </select>
 
     <select id="getDeptMembReportByDate" resultType="java.util.Map">
-        SELECT c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
+        SELECT a.id, c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.pic_str as picStr, multi_worktime as multiWorktime
@@ -156,6 +159,9 @@
         <if test="companyId != null">
             AND c.company_id = #{companyId}
         </if>
+        <if test="projectId != null">
+            AND a.project_id = #{projectId}
+        </if>
         <if test="deptIds != null">
             AND c.department_id in
             <foreach collection="deptIds" item="deptId" separator="," close=")" open="(" index="index">
@@ -490,10 +496,30 @@
 
     <delete id="deleteUserSameDayReport" >
         delete from report where company_id = #{companyId}
-        and state &lt;&gt; 1 and (
+        <if test="needDeptAudit==1">
+            and state &lt;&gt; 1
+        </if>
+        and (
         <foreach collection="dateReportList" index="index" open="(" close=")" separator=" ) or (" item="item">
             create_date = #{item.createDate} and creator_id = #{item.creatorId}
         </foreach>
         )
     </delete>
+
+    <select id="getDuplicate" resultType="java.util.HashMap">
+        SELECT group_concat(report.id) as reportIds,user.name as username, create_date as createDate
+        FROM report LEFT JOIN `user` ON user.id = report.creator_id
+        WHERE report.`company_id`=#{companyId}
+        GROUP BY creator_id, create_date, report.project_id, working_time, content
+        HAVING COUNT(1) > 1
+    </select>
+
+    <select id="getSameDayPassReport" resultType="java.util.HashMap">
+        select distinct creator_id, create_date from report where state = 1 and (
+        <foreach collection="dateReportList" index="index" open="(" close=")" separator=" ) or (" item="item">
+            create_date = #{item.createDate} and creator_id = #{item.creatorId}
+        </foreach>
+        )
+    </select>
+
 </mapper>

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

@@ -11,11 +11,12 @@
         <result column="module_id" property="moduleId" />
         <result column="seq" property="seq" />
         <result column="use_state" property="useState" />
+        <result column="package_type" property="packageType" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, icon, code, module_id, seq, use_state
+        id, name, icon, code, module_id, seq, use_state, package_type
     </sql>
 
 </mapper>

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

@@ -13,11 +13,12 @@
         <result column="is_menu" property="isMenu" />
         <result column="use_state" property="useState" />
         <result column="config" property="config" />
+        <result column="package_type" property="packageType" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, path, parent_id, icon, orderitem, is_menu, use_state, config
+        id, name, path, parent_id, icon, orderitem, is_menu, use_state, config, package_type
     </sql>
 
 </mapper>

+ 9 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml

@@ -98,13 +98,18 @@
         from task
         ${ew.customSqlSegment}
     </select>
+    <select id="nameList" resultMap="BaseResultMap">
+        select id, name, task_level, stages_id, company_id, indate,  group_id, seq,task_type
+        from task
+        ${ew.customSqlSegment}
+    </select>
 
     <!--计算执行人任务分布-->
     <select id="getExecutorPanel" resultType="java.util.Map">
-        SELECT IFNULL(a.executor_id,0) as executorId,IFNULL( a.executor_name,'待认领') as executorName,  count(1) AS taskCount
-        FROM task a
+        SELECT IFNULL(b.executor_id,0) as executorId,IFNULL( b.executor_name,'待认领') as executorName,  count(1) AS taskCount
+        FROM task a left join task_executor b on b.task_id = a.id
         WHERE a.project_id = #{projectId}
-        GROUP BY a.executor_id
+        GROUP BY b.executor_id
     </select>
     <!--计算任务列表的任务分布-->
     <select id="getStagesPanel" resultType="java.util.Map">
@@ -174,7 +179,7 @@
         from task left join stages on stages.id = task.stages_id
         where task.project_id = #{projectId}
         <if test="userId != null">
-            and executor_id = #{userId}
+            and executor_id like '%${userId}%'
         </if>
         and task_status = 0 order by task.id desc limit 50
     </select>

+ 36 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserYearleaveSettingMapper.xml

@@ -0,0 +1,36 @@
+<?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.UserYearleaveSettingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.UserYearleaveSetting">
+        <id column="user_id" property="userId" />
+        <result column="company_id" property="companyId" />
+        <result column="year_days" property="yearDays" />
+        <result column="already_days" property="alreadyDays" />
+        <result column="left_days" property="leftDays" />
+    </resultMap>
+
+    <resultMap id="RichResultMap" type="com.management.platform.entity.vo.RichUserYearLeave">
+        <id column="user_id" property="userId" />
+        <result column="company_id" property="companyId" />
+        <result column="year_days" property="yearDays" />
+        <result column="already_days" property="alreadyDays" />
+        <result column="left_days" property="leftDays" />
+        <result column="user_name" property="userName" />
+        <result column="department" property="department" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        user_id, company_id, year_days, already_days, left_days
+    </sql>
+
+    <select id="getRichList" resultMap="RichResultMap" >
+        select user_id,user.name as user_name, department.department_name as department, user_yearleave_setting.company_id,
+            year_days, already_days, (year_days - already_days) as left_days
+        from user left join user_yearleave_setting on user.id = user_yearleave_setting.user_id
+        left join department on department.department_id = user.department_id
+        where user_yearleave_setting.company_id = #{companyId}
+    </select>
+</mapper>

+ 45 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -4,21 +4,21 @@
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
                 <!-- <el-form-item label="财务核算成本 | 月份选择" style="margin-top:5px;"> -->
-                <el-form-item label="月份选择" style="margin-top:5px;">
+                <el-form-item label="月份选择" >
                 <el-date-picker size="small" v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM" @change="changeMonth" :clearable="false" type="month" placeholder="选择月份" style="margin-right: 20px"></el-date-picker>
                 <el-link type="primary" :underline="false" @click="audits()" v-if="user.timeType.financeAudit == '1'">{{revaelse}}</el-link>
             </el-form-item>
             <!-- <el-radio-group v-model="radio" @change="switchList" style="margin-left:160px;margin-top:5px;"> -->
-            <el-radio-group v-model="radio" @change="switchList" style="margin-left:80px;margin-top:5px;">
+            <el-radio-group size="small" v-model="radio" @change="switchList" style="margin-left:150px;margin-top:5px;">
                 <el-radio-button label="全部人员" >全部人员({{allFinanceList.length}})</el-radio-button>
                 <el-radio-button label="无项目工时人员">无项目工时人员({{noReportUserList.length}})</el-radio-button>
             </el-radio-group>
-            <el-form-item v-if="user.role == 1 || user.role == 2 || user.role == 4" style="margin-left:5px;margin-top:5px;">
+            <el-form-item v-if="user.role == 1 || user.role == 2 || user.role == 4" style="margin-left:5px;">
                 <el-link type="primary" :underline="false" @click="showSettingDialog()" >分摊比例设置</el-link>
             </el-form-item>
 
             <el-form-item style="float:right;" v-if="user.role == 1 || user.role == 2 || user.role == 4">
-                <el-link type="primary" :underline="false" @click="getTemplate()" >财务模板下载</el-link>
+                <el-link type="primary" :underline="false" @click="getTemplate()" >模板下载</el-link>
             </el-form-item>
             <!-- <el-form-item style="float:right;">
                 <el-upload ref="upload" action="#" :limit="1" :http-request="importFinance" :show-file-list="false">
@@ -26,7 +26,10 @@
                     </el-upload>
             </el-form-item> -->
             <el-form-item style="float:right;" v-if="user.role == 1 || user.role == 2 || user.role == 4">
-                <el-link type="primary" :underline="false" @click="importDialog = true;isUploading=false;">财务数据上传</el-link>
+                <el-link type="primary" :underline="false" @click="importDialog = true;isUploading=false;">数据上传</el-link>
+            </el-form-item>
+            <el-form-item style="float:right;" v-if="(user.role == 1 || user.role == 2 || user.role == 4)">
+                <el-link type="primary" :underline="false" @click="exportDialog = true;exportMonth = date;">数据导出</el-link>
             </el-form-item>
             <el-form-item style="float:right;" v-if="user.role == 1 || user.role == 2 || user.role == 4">
                 <el-link type="primary" :underline="false" @click="showItemDialog">自定义薪资项</el-link>
@@ -34,9 +37,7 @@
             <el-form-item style="float:right;" v-if="(user.role == 1 || user.role == 2 || user.role == 4) && user.timeType.financeAudit == '1'">
                 <el-link type="primary" :underline="false" @click="reviewerVisible = true">设置审核人</el-link>
             </el-form-item>
-            <el-form-item style="float:right;" v-if="(user.role == 1 || user.role == 2 || user.role == 4) && user.timeType.financeAudit == '1'">
-                <el-link type="primary" :underline="false" @click="xzjl(),xzImportVisible = true">上传记录</el-link>
-            </el-form-item>
+            
             </el-form>
         </el-col>
         <!-- 上传记录 -->
@@ -141,6 +142,20 @@
             </el-form>
         </el-dialog>
 
+
+        <el-dialog title="财务数据导出" v-if="exportDialog" :visible.sync="exportDialog" :close-on-click-modal="false" customClass="customWidth" width="400px">
+            <el-form ref="form3" >
+                <el-form-item label="导出月份" >
+                    <!-- <div style="color:orange;">{{date}}</div> -->
+                    <el-date-picker v-model="exportMonth" type="month" placeholder="选择月份" format="yyyy-MM" value-format="yyyy-MM" style="width:280px;"></el-date-picker>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" style="width:100%;" :loading="isUploading" @click="exportFinance">导出</el-button>
+            </div>
+        </el-dialog>
+
+
         
         <!--列表-->
         <!-- 222 -->
@@ -259,6 +274,10 @@
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
+                <el-link v-if="(user.role == 1 || user.role == 2 || user.role == 4) && user.timeType.financeAudit == '0'"
+                style="float:left;"
+                    type="primary" :underline="false" @click="xzjl(),xzImportVisible = true">查看导入历史记录</el-link>
+            
                 <el-upload ref="upload" action="#" :limit="1" :http-request="importFinance" :show-file-list="false" >
                         <el-button type="primary" style="width:100%;" :loading="isUploading" >选择文件并开始导入</el-button>
                     </el-upload>
@@ -406,6 +425,8 @@ import { error } from 'dingtalk-jsapi';
     export default {
         data() {
             return {
+                exportMonth:null,
+                exportDialog:false,
                 headerCols:['monthCost','bonus', 'allowance', 'insuranceOld', 'insuranceMedical', 'insuranceLosejob', 'insuranceInjury', 'houseFund', 'customField1','customField2','customField3'],
                 tblCols:[],
                 costListRadio: 0,
@@ -462,6 +483,22 @@ import { error } from 'dingtalk-jsapi';
             };
         },
         methods: {
+            exportFinance() {
+                this.isUploading = true;
+                this.http.post('/finance/exportFinance', {
+                    date: this.exportMonth
+                },res =>{
+                    this.isUploading = false;
+                    if(res.code == 'ok') {
+                        this.downloadByA({name:this.exportMonth+'财务数据.xls', url: res.data});
+                    }
+                },error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                })
+            },
             arrter() {
                 this.http.post('/user/getEmployeeList', {
                     departmentId: '-1',

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

@@ -35,7 +35,7 @@
                     </el-select>
                 </el-form-item>
                 <!-- 分类条目 -->
-                <el-form-item style="float:right;"  v-if="user.company.packageProject == 1 && (user.role == 1||user.role == 2||user.role == 5)">
+                <el-form-item style="float:right;"  v-if="(user.role == 1||user.role == 2||user.role == 5)">
                     <el-link type="primary" :underline="false" @click="showClfDialog = true">分类管理</el-link>
                 </el-form-item>
                 <!-- 项目成本基线条目 -->

+ 9 - 4
fhKeeper/formulahousekeeper/timesheet_h5/src/views/exaLeave/exaLeave.vue

@@ -14,6 +14,14 @@
                     <div class="text_left">申请人</div>
                     <div class="text_right">{{item.name}}</div>
                 </div>
+                <div class="text_list">
+                    <div class="text_left">所在部门</div>
+                    <div class="text_right">{{item.dept}}</div>
+                </div>
+                <div class="text_list">
+                    <div class="text_left">请假类型</div>
+                    <div class="text_right">{{item.type}}</div>
+                </div>
                 <div class="text_list">
                     <div class="text_left">请假时间</div>
                     <div class="text_right">{{item.date}}</div>
@@ -40,10 +48,7 @@ export default {
     data() {
         return {
             list:[
-                { name:"张三", date:"2022-3-25", time:"1", id:0, result:null },
-                { name:"赵四", date:"2022-3-28", time:"2", id:1, result:1 },
-                { name:"刘能", date:"2022-3-29", time:"4", id:2, result:0 },
-                { name:"李", date:"2022-3-27", time:"1", id:3, result:null }
+                { name:"张辉",dept:'质量部', date:"2022-3-25", time:"1", id:0, result:null, type:'事假' },
             ]
         }
     },

+ 6 - 3
fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

@@ -7,7 +7,7 @@
         </van-swipe>
         <van-grid :column-num="3">
             <van-grid-item v-for="(item,index) in routers" :key="index" :icon="item.icon" :text="item.name" 
-            :info="item.name=='消息记录'&&unreadNum>0?unreadNum:''"
+            :info="(item.name=='消息记录'&&unreadNum>0|| item.name == '请假审批')?(item.name == '请假审批'?1:unreadNum):''"
             :to="item.url">
             </van-grid-item>
         </van-grid>
@@ -175,12 +175,15 @@
             //                     icon: 'clock-o',
             //                     info: this.unreadNum
             //                 });
-            this.routers.push({
+            if (this.user.companyId==634 || this.user.companyId==7 || this.user.companyId==431) {
+                this.routers.push({
                                 name: '请假审批',
                                 url: '/exaLeave',
                                 icon: 'todo-list-o',
-                                info: this.unreadNum
+                                info: 1
                             });
+            }
+            
             this.getMessage();
             this.bindIfNessary();
             if (localStorage.userInfo != null) {

+ 10 - 10
fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

@@ -5,16 +5,16 @@ const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 
 // var ip = '127.0.0.1'
 // var ip = '192.168.2.159'
-var ip = '47.100.37.243'
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+// var ip = '47.100.37.243'
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 
 module.exports = {
     // 关闭eslint检查

+ 31 - 0
fhKeeper/formulahousekeeper/user/.gitignore

@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/

+ 118 - 0
fhKeeper/formulahousekeeper/user/.mvn/wrapper/MavenWrapperDownloader.java

@@ -0,0 +1,118 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.6";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+            + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if (mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if (mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if (!outputFile.getParentFile().exists()) {
+            if (!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}

BIN
fhKeeper/formulahousekeeper/user/.mvn/wrapper/maven-wrapper.jar


+ 2 - 0
fhKeeper/formulahousekeeper/user/.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

+ 1 - 0
fhKeeper/formulahousekeeper/user/dabao.cmd

@@ -0,0 +1 @@
+mvn clean package -Dmaven.test.skip=true

+ 310 - 0
fhKeeper/formulahousekeeper/user/mvnw

@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 182 - 0
fhKeeper/formulahousekeeper/user/mvnw.cmd

@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%

+ 156 - 0
fhKeeper/formulahousekeeper/user/pom.xml

@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.0.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.hssx</groupId>
+    <artifactId>user</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>user</name>
+    <description>common user project</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.1.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.1.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+            <version>2.3.23</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.1</version>
+        </dependency>
+
+        <!--swagger图形化接口-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+            <version>1.8.7</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+    <!--配置阿里云仓库-->
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+</project>

+ 13 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/UserApplication.java

@@ -0,0 +1,13 @@
+package com.hssx.user;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class UserApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(UserApplication.class, args);
+    }
+
+}

+ 21 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/CompanyController.java

@@ -0,0 +1,21 @@
+package com.hssx.user.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2022-03-30
+ */
+@RestController
+@RequestMapping("/company")
+public class CompanyController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/DepartmentController.java

@@ -0,0 +1,21 @@
+package com.hssx.user.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 部门 前端控制器
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2020-06-05
+ */
+@RestController
+@RequestMapping("/department")
+public class DepartmentController {
+
+}
+

+ 88 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/PermissionController.java

@@ -0,0 +1,88 @@
+package com.hssx.user.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.hssx.user.entity.SysRole;
+import com.hssx.user.service.PermissionService;
+import com.hssx.user.service.SysRoleService;
+import com.hssx.user.utils.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+@RestController
+@RequestMapping("/permission")
+public class PermissionController {
+    @Autowired
+    private PermissionService permissionService;
+    @Autowired
+    private HttpServletRequest httpServletRequest;
+    @Resource
+    private SysRoleService sysRoleService;
+
+    @RequestMapping("/getFrontRoleList")
+    public HttpRespMsg getFrontRoleList() {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = sysRoleService.list(new QueryWrapper<SysRole>());
+        return msg;
+    }
+
+    @RequestMapping("/getCrewByPage")
+    public HttpRespMsg getCrewByPage(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return permissionService.getCrewByPage(pageIndex, pageSize);
+    }
+
+    @RequestMapping("/switchRole")
+    public HttpRespMsg switchRole(@RequestParam Integer[] ids, @RequestParam Integer roleId) {
+        return permissionService.switchRole(ids, roleId, httpServletRequest);
+    }
+
+    @RequestMapping("/getSimpleUserList")
+    public HttpRespMsg getSimpleUserList() {
+        return permissionService.getSimpleUserList();
+    }
+
+    @RequestMapping("/getRoleList")
+    public HttpRespMsg getRoleList(Integer companyId) {
+        return permissionService.getRoleList(companyId);
+    }
+
+    @RequestMapping("/editRole")
+    public HttpRespMsg editRole(Integer id, @RequestParam String name, @RequestParam String description) {
+        return permissionService.editRole(id, name, description);
+    }
+
+    @RequestMapping("/deleteRole")
+    public HttpRespMsg deleteRole(@RequestParam Integer id) {
+        return permissionService.deleteRole(id);
+    }
+
+    @RequestMapping("/getAuthority")
+    public HttpRespMsg getAuthority(@RequestParam Integer role, @RequestParam Integer companyId) {
+        return permissionService.getAuthority(role, companyId);
+    }
+
+    @RequestMapping("/switchAuthority")
+    public HttpRespMsg switchAuthority(@RequestParam Integer role, @RequestParam Integer id) {
+        return permissionService.switchAuthority(role, id);
+    }
+
+    @RequestMapping(value = "/savePermission", method = RequestMethod.POST)
+    public HttpRespMsg savePermission(@RequestParam Integer role, @RequestParam String moduleList) {
+        return permissionService.savePermission(role, moduleList);
+    }
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysFunctionController.java

@@ -0,0 +1,20 @@
+package com.hssx.user.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 菜单功能权限关联表 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+@RestController
+@RequestMapping("/sys-function")
+public class SysFunctionController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysModuleController.java

@@ -0,0 +1,20 @@
+package com.hssx.user.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 菜单表 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+@RestController
+@RequestMapping("/sys-module")
+public class SysModuleController {
+
+}
+

+ 35 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysRoleController.java

@@ -0,0 +1,35 @@
+package com.hssx.user.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.hssx.user.entity.SysRole;
+import com.hssx.user.service.SysRoleService;
+import com.hssx.user.utils.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 角色表(职务) 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+@RestController
+@RequestMapping("/sys-role")
+public class SysRoleController {
+
+    @Resource
+    private SysRoleService sysRoleService;
+
+    @RequestMapping("/getFrontRoleList")
+    public HttpRespMsg getRoleList() {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = sysRoleService.list(new QueryWrapper<SysRole>());
+        return msg;
+    }
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysRoleFunctionController.java

@@ -0,0 +1,20 @@
+package com.hssx.user.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 角色菜单关联表 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+@RestController
+@RequestMapping("/sys-role-function")
+public class SysRoleFunctionController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/SysRoleModuleController.java

@@ -0,0 +1,20 @@
+package com.hssx.user.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 角色操作功能权限关联表 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+@RestController
+@RequestMapping("/sys-role-module")
+public class SysRoleModuleController {
+
+}
+

+ 158 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/UserController.java

@@ -0,0 +1,158 @@
+package com.hssx.user.controller;
+
+import com.hssx.user.entity.User;
+import com.hssx.user.service.UserService;
+import com.hssx.user.utils.HttpRespMsg;
+import com.hssx.user.utils.MD5Util;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+@RestController
+@RequestMapping("/user")
+public class UserController {
+    @Value("${upload.path}")
+    private String uploadPath;
+
+    @Value("${default.pwd}")
+    private String defaultPwd;
+
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private HttpServletRequest httpServletRequest;
+
+    //登录
+    @RequestMapping("/login")
+    public HttpRespMsg login(String phone, String name, @RequestParam String password) {
+        return userService.login(phone, name, password);
+    }
+
+    //获取用户列表
+    @RequestMapping("/getUserList")
+    public HttpRespMsg getUserList(Integer pageIndex, Integer pageSize, Integer roleId, String name, String workNumber, Integer isActive) {
+        return userService.getUserByPage(pageIndex, pageSize, roleId, name, workNumber, isActive);
+    }
+
+    //获取用户
+    @RequestMapping("/getUser")
+    public HttpRespMsg getUser() {
+        return userService.getUser();
+    }
+
+    //获取其他用户
+    @RequestMapping("/getOtherUser")
+    public HttpRespMsg getUser(@RequestParam Integer userId) {
+        return userService.getOtherUser(userId);
+    }
+
+
+    //根据ID获取用户
+    @RequestMapping("/getUserById")
+    public HttpRespMsg getUserById(@RequestParam Integer id) {
+        return userService.getUserById(id);
+    }
+
+
+    //根据id获取route
+    @RequestMapping("/getMenuById")
+    public HttpRespMsg getMenuById(@RequestParam Integer id) {
+        return userService.getMenuById(id);
+    }
+
+    @RequestMapping("/insertUser")
+    public HttpRespMsg insertUser(User user) {
+        return userService.insertUser(user, httpServletRequest);
+    }
+
+    //删除人员
+    @RequestMapping("/deleteUser")
+    public HttpRespMsg deleteUser(@RequestParam Integer id) {
+        return userService.deleteUser(id, httpServletRequest);
+    }
+
+    //设置新密码
+    @RequestMapping("/setPassword")
+    public HttpRespMsg setPassword(@RequestParam Integer id, @RequestParam String oldPassword,
+                                   @RequestParam String newPassword) {
+        return userService.setPassword(id, oldPassword, newPassword);
+    }
+
+    //修改停启用状态
+    @RequestMapping("/changeActive")
+    public HttpRespMsg changeActive(String ids, Integer isActive) {
+        List<User> userList = new ArrayList<User>();
+        String[] array = ids.split(",");
+        for (String id : array) {
+            User user = new User();
+            user.setId(Integer.parseInt(id));
+            user.setIsActive(isActive);
+            userList.add(user);
+        }
+        userService.updateBatchById(userList);
+        return new HttpRespMsg();
+    }
+
+    //重置密码
+    @RequestMapping("/resetPwd")
+    public HttpRespMsg resetPwd(String ids) {
+        List<User> userList = new ArrayList<User>();
+        String[] array = ids.split(",");
+        for (String id : array) {
+            User user = new User();
+            user.setId(Integer.parseInt(id));
+            user.setPassword(MD5Util.StringInMd5(defaultPwd));
+            userList.add(user);
+        }
+        userService.updateBatchById(userList);
+        return new HttpRespMsg();
+    }
+
+    //通用上传图片
+    @RequestMapping("/uploadFile")
+    public HttpRespMsg uploadFile(MultipartFile file) {
+        HttpRespMsg msg = new HttpRespMsg();
+        //先处理头像
+        if (file != null) {
+            String fileName = file.getOriginalFilename();
+            File direction = new File(uploadPath);
+            String rand = UUID.randomUUID().toString().replaceAll("-", "");
+            String suffix = fileName.substring(fileName.lastIndexOf("."));
+            String storedFileName = rand + suffix;
+            try {
+                System.out.println("direction=" + direction);
+                System.out.println("storedFileName=" + storedFileName);
+                File savedFile = new File(direction, storedFileName);
+                savedFile.createNewFile();
+                file.transferTo(savedFile);
+                System.out.println("文件保存至" + savedFile.getAbsolutePath());
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println(e.getMessage());
+            }
+            //上传文件的地址赋值
+            msg.data = "/upload/" + storedFileName;
+        }
+        return msg;
+    }
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/UserPermissionController.java

@@ -0,0 +1,20 @@
+package com.hssx.user.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+@RestController
+@RequestMapping("/user-permission")
+public class UserPermissionController {
+
+}
+

+ 120 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/Company.java

@@ -0,0 +1,120 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2022-03-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("company")
+public class Company extends Model<Company> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 公司表主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 公司名
+     */
+    @TableField("company_name")
+    private String companyName;
+
+    /**
+     * 公司规模
+     */
+    @TableField("staff_count_max")
+    private Integer staffCountMax;
+
+    /**
+     * 会员到期时间
+     */
+    @TableField("expiration_date")
+    private LocalDateTime expirationDate;
+
+    /**
+     * 选择的套餐(单位:/年)
+     */
+    @TableField("set_meal")
+    private Integer setMeal;
+
+    /**
+     * 工时平台
+     */
+    @TableField("package_worktime")
+    private Integer packageWorktime;
+
+    /**
+     * 项目协作平台
+     */
+    @TableField("package_project")
+    private Integer packageProject;
+
+    /**
+     * 合同平台
+     */
+    @TableField("package_contract")
+    private Integer packageContract;
+
+    /**
+     * OA平台
+     */
+    @TableField("package_oa")
+    private Integer packageOa;
+
+    /**
+     * 生产车间平台
+     */
+    @TableField("package_etimecard")
+    private Integer packageEtimecard;
+
+    /**
+     * 费用报销
+     */
+    @TableField("package_expense")
+    private Integer packageExpense;
+
+    /**
+     * 客户管理
+     */
+    @TableField("package_customer")
+    private Integer packageCustomer;
+
+    /**
+     * 工程专业
+     */
+    @TableField("package_engineering")
+    private Integer packageEngineering;
+
+    /**
+     * 简单表格版本
+     */
+    @TableField("package_simple")
+    private Integer packageSimple;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 61 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/Department.java

@@ -0,0 +1,61 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 部门
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2020-06-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("department")
+public class Department extends Model<Department> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "department_id", type = IdType.AUTO)
+    private Integer departmentId;
+
+    /**
+     * 部门名称
+     */
+    @TableField("department_name")
+    private String departmentName;
+
+    /**
+     * 上级部门id
+     */
+    @TableField("superior_id")
+    private Integer superiorId;
+
+    /**
+     * 所属公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.departmentId;
+    }
+
+}

+ 54 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/Permission.java

@@ -0,0 +1,54 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("permission")
+public class Permission extends Model<Permission> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 权限表主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 权限名称
+     */
+    @TableField("permission_name")
+    private String permissionName;
+
+    /**
+     * 权限描述
+     */
+    @TableField("describe")
+    private String describe;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 83 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysFunction.java

@@ -0,0 +1,83 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 菜单功能权限关联表
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2022-03-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_function")
+public class SysFunction extends Model<SysFunction> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 功能名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 图标
+     */
+    @TableField("icon")
+    private String icon;
+
+    /**
+     * 功能字符KEY
+     */
+    @TableField("code")
+    private String code;
+
+    /**
+     * 对应模块ID
+     */
+    @TableField("module_id")
+    private Integer moduleId;
+
+    /**
+     * 功能排序
+     */
+    @TableField("seq")
+    private Integer seq;
+
+    /**
+     * 0:启用,1.未启用
+     */
+    @TableField("use_state")
+    private Boolean useState;
+
+    /**
+     * 所属版本,0-基础版,1-项目管理专业版
+     */
+    @TableField("package_type")
+    private Integer packageType;
+
+
+    @TableField(exist = false)
+    private boolean checked;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 108 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysModule.java

@@ -0,0 +1,108 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 菜单表
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2022-03-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_module")
+public class SysModule extends Model<SysModule> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键CODE
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 模块名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 模块路径
+     */
+    @TableField("path")
+    private String path;
+
+    /**
+     * 模块父级ID
+     */
+    @TableField("parent_id")
+    private Integer parentId;
+
+    /**
+     * 模块图标
+     */
+    @TableField("icon")
+    private String icon;
+
+    /**
+     * 排序
+     */
+    @TableField("orderitem")
+    private Integer orderitem;
+
+    /**
+     * 是否菜单
+     */
+    @TableField("is_menu")
+    private Boolean isMenu;
+
+    /**
+     * 0:启用,1.未启用
+     */
+    @TableField("use_state")
+    private Boolean useState;
+
+    /**
+     * 账套级别的系统配置-Lei
+     */
+    @TableField("config")
+    private String config;
+
+    /**
+     * 所属版本级别: 0-基础版,1-项目管理专业版
+     */
+    @TableField("package_type")
+    private Integer packageType;
+
+
+    @TableField(exist = false)
+    private List<SysModule> children;
+
+
+    @TableField(exist = false)
+    private boolean checked;
+
+    @TableField(exist = false)
+    private List<SysFunction> functionList;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 60 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysRole.java

@@ -0,0 +1,60 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 角色表(职务)
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_role")
+public class SysRole extends Model<SysRole> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 父级角色
+     */
+    @TableField("parent_role")
+    private Integer parentRole;
+
+    /**
+     * 角色名称
+     */
+    @TableField("rolename")
+    private String rolename;
+
+    /**
+     * 角色描述
+     */
+    @TableField("role_describe")
+    private String roleDescribe;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 47 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysRoleFunction.java

@@ -0,0 +1,47 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 角色菜单关联表
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_role_function")
+public class SysRoleFunction extends Model<SysRoleFunction> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 角色编号
+     */
+    @TableId("role_id")
+    private Integer roleId;
+
+    /**
+     * 模块对应操作ID
+     */
+    @TableField("function_id")
+    private Integer functionId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.roleId;
+    }
+
+}

+ 47 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysRoleModule.java

@@ -0,0 +1,47 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 角色操作功能权限关联表
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_role_module")
+public class SysRoleModule extends Model<SysRoleModule> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 角色编号
+     */
+    @TableId("role_id")
+    private Integer roleId;
+
+    /**
+     * 模块ID
+     */
+    @TableField("module_id")
+    private Integer moduleId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.roleId;
+    }
+
+}

+ 106 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/User.java

@@ -0,0 +1,106 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2020-06-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("user")
+public class User extends Model<User> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户表主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 工号
+     */
+    @TableField("work_number")
+    private String workNumber;
+
+    /**
+     * 姓名
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 手机号
+     */
+    @TableField("phone")
+    private String phone;
+
+    /**
+     * 部门id外键
+     */
+    @TableField("dept_id")
+    private Integer deptId;
+
+    /**
+     * 部门名称
+     */
+    @TableField("department_name")
+    private String departmentName;
+
+    /**
+     * 是否可以登录Web端
+     */
+    @TableField("is_active")
+    private Integer isActive;
+
+    /**
+     * 创建时间
+     */
+    @TableField("indate")
+    private LocalDateTime indate;
+
+    /**
+     * 密码
+     */
+    @TableField("password")
+    private String password;
+
+    /**
+     * 角色Id
+     */
+    @TableField("role_id")
+    private Integer roleId;
+
+    /**
+     * 角色名称
+     */
+    @TableField("role_name")
+    private String roleName;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 54 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/UserPermission.java

@@ -0,0 +1,54 @@
+package com.hssx.user.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("user_permission")
+public class UserPermission extends Model<UserPermission> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 角色权限关联表主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    @TableField("user_id")
+    private Integer userId;
+
+    /**
+     * 权限id
+     */
+    @TableField("permission_id")
+    private Integer permissionId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/CompanyMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.user.mapper;
+
+import com.hssx.user.entity.Company;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2022-03-30
+ */
+public interface CompanyMapper extends BaseMapper<Company> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/DepartmentMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hssx.user.entity.Department;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-04
+ */
+public interface DepartmentMapper extends BaseMapper<Department> {
+
+}

+ 25 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/PermissionMapper.java

@@ -0,0 +1,25 @@
+package com.hssx.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hssx.user.entity.Permission;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+public interface PermissionMapper extends BaseMapper<Permission> {
+    //分页查询
+    List<Map<String, Object>> getRoleList(Page page);
+
+    //权限
+    List<Map<String, Object>> getRole(@Param("role") Integer role);
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysFunctionMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hssx.user.entity.SysFunction;
+
+/**
+ * <p>
+ * 菜单功能权限关联表 Mapper 接口
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysFunctionMapper extends BaseMapper<SysFunction> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysModuleMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hssx.user.entity.SysModule;
+
+/**
+ * <p>
+ * 菜单表 Mapper 接口
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysModuleMapper extends BaseMapper<SysModule> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysRoleFunctionMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hssx.user.entity.SysRoleFunction;
+
+/**
+ * <p>
+ * 角色菜单关联表 Mapper 接口
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysRoleFunctionMapper extends BaseMapper<SysRoleFunction> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysRoleMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hssx.user.entity.SysRole;
+
+/**
+ * <p>
+ * 角色表(职务) Mapper 接口
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysRoleMapper extends BaseMapper<SysRole> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/SysRoleModuleMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hssx.user.entity.SysRoleModule;
+
+/**
+ * <p>
+ * 角色操作功能权限关联表 Mapper 接口
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysRoleModuleMapper extends BaseMapper<SysRoleModule> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/UserMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.user.mapper;
+
+import com.hssx.user.entity.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2020-06-01
+ */
+public interface UserMapper extends BaseMapper<User> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/UserPermissionMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hssx.user.entity.UserPermission;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+public interface UserPermissionMapper extends BaseMapper<UserPermission> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/CompanyService.java

@@ -0,0 +1,16 @@
+package com.hssx.user.service;
+
+import com.hssx.user.entity.Company;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2022-03-30
+ */
+public interface CompanyService extends IService<Company> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/DepartmentService.java

@@ -0,0 +1,16 @@
+package com.hssx.user.service;
+
+import com.hssx.user.entity.Department;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 部门 服务类
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2020-06-05
+ */
+public interface DepartmentService extends IService<Department> {
+
+}

+ 35 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/PermissionService.java

@@ -0,0 +1,35 @@
+package com.hssx.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hssx.user.entity.Permission;
+import com.hssx.user.utils.HttpRespMsg;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+public interface PermissionService extends IService<Permission> {
+    HttpRespMsg getCrewByPage(Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg switchRole(Integer[] ids, Integer roleId, HttpServletRequest httpServletRequest);
+
+    HttpRespMsg getSimpleUserList();
+
+    HttpRespMsg getRoleList(Integer companyId);
+
+    HttpRespMsg editRole(Integer id, String name, String description);
+
+    HttpRespMsg deleteRole(Integer id);
+
+    HttpRespMsg getAuthority(Integer role, Integer companyId);
+
+    HttpRespMsg switchAuthority(Integer role, Integer id);
+
+    HttpRespMsg savePermission(Integer role, String moduleList);
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysFunctionService.java

@@ -0,0 +1,16 @@
+package com.hssx.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hssx.user.entity.SysFunction;
+
+/**
+ * <p>
+ * 菜单功能权限关联表 服务类
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysFunctionService extends IService<SysFunction> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysModuleService.java

@@ -0,0 +1,16 @@
+package com.hssx.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hssx.user.entity.SysModule;
+
+/**
+ * <p>
+ * 菜单表 服务类
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysModuleService extends IService<SysModule> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysRoleFunctionService.java

@@ -0,0 +1,16 @@
+package com.hssx.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hssx.user.entity.SysRoleFunction;
+
+/**
+ * <p>
+ * 角色菜单关联表 服务类
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysRoleFunctionService extends IService<SysRoleFunction> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysRoleModuleService.java

@@ -0,0 +1,16 @@
+package com.hssx.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hssx.user.entity.SysRoleModule;
+
+/**
+ * <p>
+ * 角色操作功能权限关联表 服务类
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysRoleModuleService extends IService<SysRoleModule> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/SysRoleService.java

@@ -0,0 +1,16 @@
+package com.hssx.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hssx.user.entity.SysRole;
+
+/**
+ * <p>
+ * 角色表(职务) 服务类
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-11-06
+ */
+public interface SysRoleService extends IService<SysRole> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/UserPermissionService.java

@@ -0,0 +1,16 @@
+package com.hssx.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hssx.user.entity.UserPermission;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+public interface UserPermissionService extends IService<UserPermission> {
+
+}

+ 37 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/UserService.java

@@ -0,0 +1,37 @@
+package com.hssx.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hssx.user.entity.User;
+import com.hssx.user.utils.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+public interface UserService extends IService<User> {
+    HttpRespMsg login(String phone, String name, String password);
+
+    HttpRespMsg getUser();
+
+    HttpRespMsg getOtherUser(Integer userId);
+
+    HttpRespMsg getUserByPage(Integer pageIndex, Integer pageSize, Integer roleId, String name, String workNumber, Integer isActive);
+
+    HttpRespMsg getUserById(Integer id);
+
+    HttpRespMsg getMenuById(Integer id);
+
+    HttpRespMsg insertUser(User user, HttpServletRequest httpServletRequest);
+
+    HttpRespMsg deleteUser(Integer id, HttpServletRequest httpServletRequest);
+
+    HttpRespMsg setPassword(Integer id, String oldPassword, String newPassword);
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/impl/CompanyServiceImpl.java

@@ -0,0 +1,20 @@
+package com.hssx.user.service.impl;
+
+import com.hssx.user.entity.Company;
+import com.hssx.user.mapper.CompanyMapper;
+import com.hssx.user.service.CompanyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2022-03-30
+ */
+@Service
+public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> implements CompanyService {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/impl/DepartmentServiceImpl.java

@@ -0,0 +1,20 @@
+package com.hssx.user.service.impl;
+
+import com.hssx.user.entity.Department;
+import com.hssx.user.mapper.DepartmentMapper;
+import com.hssx.user.service.DepartmentService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 部门 服务实现类
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2020-06-05
+ */
+@Service
+public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Department> implements DepartmentService {
+
+}

+ 0 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/impl/PermissionServiceImpl.java


Vissa filer visades inte eftersom för många filer har ändrats