Browse Source

权限修改

seyason 3 years ago
parent
commit
2e0b78bcbb
72 changed files with 2651 additions and 1174 deletions
  1. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java
  2. 8 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/EarningSnapshotController.java
  3. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java
  4. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveSheetController.java
  5. 96 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/PermissionController.java
  6. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java
  7. 6 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportAuditLogController.java
  8. 8 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  9. 8 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java
  10. 9 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SysRoleController.java
  11. 7 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  12. 6 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  13. 6 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java
  14. 148 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  15. 8 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java
  16. 54 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Permission.java
  17. 61 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysFunction.java
  18. 69 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java
  19. 20 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysRole.java
  20. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysRoleFunction.java
  21. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysRoleModule.java
  22. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/SysRichFunction.java
  23. 25 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/PermissionMapper.java
  24. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/SysFunctionMapper.java
  25. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/SysRoleFunctionMapper.java
  26. 2 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserMapper.java
  27. 37 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/PermissionService.java
  28. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/SysRoleService.java
  29. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  30. 13 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  31. 167 32
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  32. 11 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceImportServiceImpl.java
  33. 12 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  34. 357 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/PermissionServiceImpl.java
  35. 7 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  36. 248 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SysRoleServiceImpl.java
  37. 211 69
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  38. 351 351
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  39. 0 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/Constant.java
  40. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  41. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml
  42. 33 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/PermissionMapper.xml
  43. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  44. 29 4
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysFunctionMapper.xml
  45. 11 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysModuleMapper.xml
  46. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysRoleFunctionMapper.xml
  47. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysRoleMapper.xml
  48. 6 44
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  49. 1 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  50. 0 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  51. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  52. 0 461
      fhKeeper/formulahousekeeper/timesheet/src/views/research/list.vue
  53. 9 26
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  54. 23 19
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  55. 10 2
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/PermissionController.java
  56. 21 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/TimeTypeController.java
  57. 8 2
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/Company.java
  58. 52 4
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysFunction.java
  59. 56 7
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysModule.java
  60. 7 1
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysRole.java
  61. 161 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/TimeType.java
  62. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/mapper/TimeTypeMapper.java
  63. 2 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/PermissionService.java
  64. 16 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/TimeTypeService.java
  65. 89 6
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/impl/PermissionServiceImpl.java
  66. 20 0
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/service/impl/TimeTypeServiceImpl.java
  67. 1 1
      fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/utils/CodeGenerator.java
  68. 2 1
      fhKeeper/formulahousekeeper/user/src/main/resources/mapper/CompanyMapper.xml
  69. 10 2
      fhKeeper/formulahousekeeper/user/src/main/resources/mapper/SysFunctionMapper.xml
  70. 11 3
      fhKeeper/formulahousekeeper/user/src/main/resources/mapper/SysModuleMapper.xml
  71. 2 1
      fhKeeper/formulahousekeeper/user/src/main/resources/mapper/SysRoleMapper.xml
  72. 35 0
      fhKeeper/formulahousekeeper/user/src/main/resources/mapper/TimeTypeMapper.xml

+ 5 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java

@@ -30,5 +30,9 @@ public class Constant {
 //    public static final String ACCESS_KEY = "280d6f0e4a774117905ba789a9f0b978";//百度图像识别accessKey
 //    public static final String SECRET_KEY = "43b460e124eb474c8cdb7441dc30d66d";//百度图像识别secretKey
     //角色定义
-    public static final String[] ROLE_NAMES = {"普通员工","超级管理员", "系统管理员", "无","财务管理员","项目管理员","公司领导"};
+    public static final String[] ROLE_NAMES = {"普通员工","超级管理员", "系统管理员", "无","财务管理员","项目管理员","公司领导","项目经理"};
+
+    public static final String ROLE_SUPER_MANAGER = "超级管理员";
+
+    public static String[] DEFAULT_BASE_COST_ITEMS = {"人工成本","一般费用","外包费用","其他"};
 }

+ 8 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/EarningSnapshotController.java

@@ -8,7 +8,9 @@ import com.management.platform.entity.EarningSnapshot;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.ProjectBasecost;
 import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.SysFunctionMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.EarningSnapshotService;
 import com.management.platform.service.FinanceService;
@@ -43,6 +45,8 @@ public class EarningSnapshotController {
     private UserMapper userMapper;
     @Resource
     private ProjectMapper projectMapper;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
 
     @RequestMapping("/list")
     public HttpRespMsg list(Integer projectId) {
@@ -50,7 +54,8 @@ public class EarningSnapshotController {
         User user = userMapper.selectById(userId);
         HttpRespMsg msg = new HttpRespMsg();
         Project project = projectMapper.selectById(projectId);
-        if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId()) || user.getRole() > 0) {
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看成本基线");
+        if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId()) || functionList.size() > 0) {
             List<EarningSnapshot> list = earningSnapshotService.list(new QueryWrapper<EarningSnapshot>().eq("project_id", projectId).orderByDesc("id"));
             for (EarningSnapshot snapshot : list) {
                 if (snapshot.getCostData() != null) {
@@ -77,10 +82,10 @@ public class EarningSnapshotController {
         String userId = request.getHeader("Token");
         User user = userMapper.selectById(userId);
 
-
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "校正成本基线");
         HttpRespMsg msg = new HttpRespMsg();
         Project project = projectMapper.selectById(projectId);
-        if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId()) || user.getRole() > 0) {
+        if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId()) || functionList.size() > 0) {
             List<Integer> idArray = ListUtil.convertIntegerIdsArrayToList(ids);
             earningSnapshotService.removeByIds(idArray);
         } else {

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java

@@ -4,6 +4,8 @@ package com.management.platform.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.ExpenseSheet;
 import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.SysFunctionMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ExpenseSheetService;
 import com.management.platform.util.HttpRespMsg;
@@ -14,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * <p>
@@ -32,6 +35,8 @@ public class ExpenseSheetController {
     ExpenseSheetService expenseSheetService;
     @Resource
     private HttpServletRequest request;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
 
     @RequestMapping("/getNextCode")
     public HttpRespMsg getNextCode() {
@@ -56,7 +61,8 @@ public class ExpenseSheetController {
     public HttpRespMsg list(ExpenseSheet sheet,String startDate, String endDate, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
-        if (user.getRole() == 0) {
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部报销单");
+        if (functionList.size() == 0) {
             //普通员工只能看自己的
             sheet.setOwnerId(user.getId());
         }

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveSheetController.java

@@ -3,7 +3,10 @@ package com.management.platform.controller;
 
 import com.management.platform.entity.ExpenseSheet;
 import com.management.platform.entity.LeaveSheet;
+import com.management.platform.entity.SysFunction;
 import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.SysFunctionMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ExpenseSheetService;
 import com.management.platform.service.LeaveSheetService;
@@ -15,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * <p>
@@ -34,6 +38,8 @@ public class LeaveSheetController {
     LeaveSheetService leaveSheetService;
     @Resource
     private HttpServletRequest request;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
 
 
     @RequestMapping("/add")
@@ -53,7 +59,8 @@ public class LeaveSheetController {
     public HttpRespMsg list(LeaveSheet sheet, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
-        if (user.getRole() == 0) {
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部报销单");
+        if (functionList.size() == 0) {
             //普通员工只能看自己的
             sheet.setOwnerId(user.getId());
         }

+ 96 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/PermissionController.java

@@ -0,0 +1,96 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.SysRole;
+import com.management.platform.service.PermissionService;
+import com.management.platform.service.SysRoleService;
+import com.management.platform.util.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;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+@RestController
+@RequestMapping("/permission")
+public class PermissionController {
+    @Autowired
+    private PermissionService permissionService;
+    @Resource
+    private HttpServletRequest httpServletRequest;
+    @Resource
+    private SysRoleService sysRoleService;
+
+    @RequestMapping("/getFrontRoleList")
+    public HttpRespMsg getFrontRoleList(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<SysRole> list = sysRoleService.list(new QueryWrapper<SysRole>().eq("company_id", companyId));
+        msg.data = list.stream().filter(item->!item.getRolename().equals("超级管理员")).collect(Collectors.toList());
+        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, Integer companyId) {
+        return permissionService.editRole(id, name, description, companyId);
+    }
+
+    @RequestMapping("/setDefaultRole")
+    public HttpRespMsg setDefaultRole(Integer id, Integer companyId) {
+        return permissionService.setDefaultRole(id, companyId);
+    }
+
+    @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);
+    }
+}
+

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

@@ -2,6 +2,7 @@ package com.management.platform.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
 import com.management.platform.entity.ProjectBasecost;
 import com.management.platform.entity.ProjectBasecostSetting;
 import com.management.platform.mapper.ProjectBasecostMapper;
@@ -84,7 +85,7 @@ public class ProjectBasecostSettingController {
         List<ProjectBasecostSetting> list = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
         if (list.size() == 0) {
             //生成项目的成本基线默认条目
-            String[] array = com.management.platform.util.Constant.DEFAULT_BASE_COST_ITEMS;
+            String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
             for (String baseItem : array) {
                 ProjectBasecostSetting setting = new ProjectBasecostSetting();
                 setting.setName(baseItem);

+ 6 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportAuditLogController.java

@@ -8,8 +8,10 @@ import com.management.platform.entity.ReportAlogMembdate;
 import com.management.platform.entity.ReportAuditLog;
 import com.management.platform.entity.ReportImportLog;
 import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.ReportAlogMembdateMapper;
 import com.management.platform.mapper.ReportAuditLogMapper;
+import com.management.platform.mapper.SysFunctionMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -45,13 +47,16 @@ public class ReportAuditLogController {
     ReportAlogMembdateMapper reportAlogMembdateMapper;
     @Resource
     UserMapper userMapper;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
 
     @RequestMapping("getImportAuditLog")
     public HttpRespMsg getImportAuditLog(Integer companyId, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         HttpRespMsg msg = new HttpRespMsg();
-        if (user.getRole() == 1 || user.getRole() == 2) {
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "导入日报审核记录");
+        if (functionList.size() > 0) {
             QueryWrapper<ReportAuditLog> queryWrapper = new QueryWrapper<>();
             queryWrapper.eq("company_id", companyId).eq("audit_channel", 0).orderByDesc("indate");
             IPage<ReportAuditLog> iPage = reportAuditLogMapper.selectPage(new Page<>(pageIndex, pageSize),

+ 8 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -6,11 +6,9 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.pagehelper.util.StringUtil;
 import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.entity.vo.WorktimeItem;
-import com.management.platform.mapper.AuditWorkflowTimeSettingMapper;
-import com.management.platform.mapper.DepartmentMapper;
-import com.management.platform.mapper.ProjectMapper;
-import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.ReportService;
 import com.management.platform.service.UserSalaryService;
 import com.management.platform.service.UserService;
@@ -63,6 +61,8 @@ public class ReportController {
     private TimeTypeMapper timeTypeMapper;
     @Resource
     private ProjectMapper projectMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
 
 
 
@@ -325,7 +325,8 @@ public class ReportController {
 
         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
         //判断当前操作的人员,是不是系统管理员
-        if (user.getRole() != 1 && user.getRole() != 2) {
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "代填日报");
+        if (functionList.size() == 0) {
             //非系统管理员,检查填报时间
             TimeType compTimeType = timeTypeMapper.selectById(user.getCompanyId());
             Integer fillMonths = compTimeType.getFillMonths();
@@ -588,8 +589,8 @@ public class ReportController {
                                     .setProjectAuditorId(projectAuditorId[i])
                                     .setFillUserid(token);
                             report.setProjectAuditState(1);
-                            if (auditWorkflowList.size() == 0 || user.getRole() == 1 || user.getRole() == 2) {
-                                //没有自定义审核流,或者系统管理员直接代填的,就算审核通过
+                            if (auditWorkflowList.size() == 0) {
+                                //没有自定义审核流,直接代填的,就算审核通过
                                 report.setIsDeptAudit(0);
                                 report.setIsFinalAudit(1);
                                 report.setState(1);

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

@@ -4,7 +4,9 @@ package com.management.platform.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.api.R;
 import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.SysFunctionMapper;
 import com.management.platform.mapper.TaskGroupMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.StagesService;
@@ -48,6 +50,8 @@ public class StagesController {
     private TaskGroupMapper taskGroupMapper;
     @Resource
     private ProjectMapper projectMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
     /**
      * 保存任务列表
      */
@@ -189,15 +193,16 @@ public class StagesController {
             queryWrapper.orderByAsc(order);
         }
         List<Task> tasks = taskService.simpleList(queryWrapper);
-        //普通员工,并且非项目经理,只能看到自己创建的,负责的和待分配的任务
-        if (user.getRole() == 0 && !userId.equals(project.getInchargerId())) {
+        //没有权限只能看到自己创建的,负责的和待分配的任务
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部任务");
+        if (functionList.size() == 0 && !userId.equals(project.getInchargerId())) {
             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())) {
+            if (functionList.size() == 0 && !userId.equals(project.getInchargerId())) {
                 subLists = subLists.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().contains(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
             }
             subTasks.addAll(subLists);

+ 9 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SysRoleController.java

@@ -21,30 +21,25 @@ import javax.servlet.http.HttpServletRequest;
  * @since 2019-11-06
  */
 @RestController
-@RequestMapping("/permission")
+@RequestMapping("/role")
 public class SysRoleController {
     @Resource
     private HttpServletRequest request;
     @Resource
     private SysRoleService sysRoleService;
-    @Resource
-    private UserService userService;
 
-    @RequestMapping("/getFrontRoleList")
-    public HttpRespMsg getFrontRoleList() {
+    /**
+     * 为已经存在的企业生成默认的角色权限
+     * @param companyId 公司id
+     */
+    @RequestMapping("/genCorpDefaultRoles")
+    public HttpRespMsg genCorpDefaultRoles(Integer companyId) {
+        SysRole role = sysRoleService.generateDefaultRoles(companyId);
         HttpRespMsg msg = new HttpRespMsg();
-        msg.data = sysRoleService.list(new QueryWrapper<SysRole>());
+        msg.data = role;
         return msg;
     }
 
-    @RequestMapping("/getRoleList")
-    public HttpRespMsg getRoleList() {
-        HttpRespMsg msg = new HttpRespMsg();
-        String userId = request.getHeader("Token");
-        Integer companyId = userService.getById(userId).getCompanyId();
-        msg.data = sysRoleService.list(new QueryWrapper<SysRole>().eq("company_id", companyId));
-        return msg;
-    }
 
 }
 

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

@@ -6,10 +6,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.management.platform.entity.*;
-import com.management.platform.mapper.TaskCommentMapper;
-import com.management.platform.mapper.TaskExecutorMapper;
-import com.management.platform.mapper.TaskMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
 import org.opencv.features2d.SimpleBlobDetector;
@@ -69,6 +67,8 @@ public class TaskController {
     @Resource
     private TaskProgressService taskProgressService;
     @Resource
+    private SysFunctionMapper sysFunctionMapper;
+    @Resource
     private TprogressPaticipatorsService tprogressPaticipatorsService;
     @Resource
     private TaskCommentMapper taskCommentMapper;
@@ -362,8 +362,9 @@ public class TaskController {
         }
         List<Task> list = taskService.simpleList(queryWrapper);
 
-        //普通员工,并且非项目经理,只能看到自己创建的,负责的和待分配的任务
-        if (user.getRole() == 0 && !userId.equals(project.getInchargerId())) {
+        //没有权限只能看到自己创建的,负责的和待分配的任务
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部任务");
+        if (functionList.size() == 0 && !userId.equals(project.getInchargerId())) {
             list = list.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().contains(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
         }
         //设置列表名称

+ 6 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -45,16 +45,6 @@ public class UserController {
         return userService.loginByUserId(userId, request);
     }
 
-    /**
-     * 登录PC端
-     * username 用户名
-     * password 密码
-     */
-    @RequestMapping("/loginEmployee")
-    public HttpRespMsg loginEmployee(@RequestParam String username, @RequestParam String password) {
-        return userService.loginEmployee(username, password);
-    }
-
     /**
      * 根据id获取用户信息
      * userId 用户id
@@ -75,9 +65,9 @@ public class UserController {
      */
     @RequestMapping("/getEmployeeList")
     public HttpRespMsg getEmployeeList(@RequestParam Integer departmentId, String keyword,
-                                       Integer status, Integer role,
+                                       Integer status, Integer roleId,
                                        @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
-        return userService.getEmployeeList(departmentId, keyword, status, role, pageIndex, pageSize, request);
+        return userService.getEmployeeList(departmentId, keyword, status, roleId, pageIndex, pageSize, request);
     }
 
     /**
@@ -137,8 +127,8 @@ public class UserController {
      */
     @RequestMapping("/insertUser")
     public HttpRespMsg insertUser(String id, @RequestParam String name, String phone,
-                                  @RequestParam Integer role, Double monthCost, Double cost, Integer departmentId, Integer salaryType, String costApplyDate) {
-        return userService.insertUser(id, name, phone, role, monthCost, cost, departmentId, salaryType, costApplyDate, request);
+                                  @RequestParam Integer roleId, Double monthCost, Double cost, Integer departmentId, Integer salaryType, String costApplyDate) {
+        return userService.insertUser(id, name, phone, roleId, monthCost, cost, departmentId, salaryType, costApplyDate, request);
     }
 
     /**
@@ -199,6 +189,8 @@ public class UserController {
     @RequestMapping("/batchUpdateDept")
     public HttpRespMsg batchUpdateDept(String userIds, Integer deptId) {return userService.batchUpdateDept(userIds, deptId, request); }
 
+    @RequestMapping("/batchUpdateRole")
+    public HttpRespMsg batchUpdateRole(String userIds, Integer roleId) {return userService.batchUpdateRole(userIds, roleId, request); }
 
 }
 

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

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.*;
 import com.management.platform.service.ReportService;
 import com.management.platform.util.ExcelUtil;
@@ -58,6 +59,8 @@ public class UserCorpwxTimeController {
     DepartmentMapper departmentMapper;
     @Resource
     CompanyMapper companyMapper;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
 
     @RequestMapping("/getMyDeptMembsData")
     public HttpRespMsg getMyDeptMembsData(String startDate, String endDate) {
@@ -65,8 +68,9 @@ public class UserCorpwxTimeController {
         User user = userMapper.selectById(token);
         List<Map> list = new ArrayList<Map>();
         int onlyWorkDays = 1;//只要工作日
-        if (user.getRole() == 1 || user.getRole() == 2) {
-            //管理员查看全部人员的
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部企微考勤");
+        if (functionList.size() > 0) {
+            //查看全部人员的
             list = userCorpwxTimeMapper.getUserDataList(user.getCompanyId(), startDate, endDate, null);
         } else {
             Integer manageDeptId = user.getManageDeptId();

+ 148 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -3,12 +3,11 @@ package com.management.platform.controller;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
-import com.management.platform.service.DepartmentService;
-import com.management.platform.service.UserService;
-import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.*;
 import com.management.platform.util.*;
 import com.qq.weixin.mp.aes.AesException;
 import com.qq.weixin.mp.aes.WXBizMsgCrypt;
@@ -67,6 +66,18 @@ public class WeiXinCorpController {
     @Value("${corpId}")
     private String corpId;
 
+    @Resource
+    private SysRoleMapper sysRoleMapper;
+    @Resource
+    private SysModuleMapper sysModuleMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
+    @Resource
+    private SysRoleService sysRoleService;
+    @Resource
+    private SysRoleModuleService sysRoleModuleService;
+    @Resource
+    private SysRoleFunctionService sysRoleFunctionService;
     @Autowired
     RestTemplate restTemplate;
     @Resource
@@ -79,6 +90,10 @@ public class WeiXinCorpController {
     WxCorpInfoService wxCorpInfoService;
     @Resource
     ProjectBasecostSettingMapper projectBasecostSettingMapper;
+    @Resource
+    SysRoleModuleMapper sysRoleModuleMapper;
+    @Resource
+    SysRoleFunctionMapper sysRoleFunctionMapper;
 
     public static String SUITE_ACCESS_TOKEN = null;
     public static long suiteTokenExpireTime = 0L;
@@ -117,7 +132,6 @@ public class WeiXinCorpController {
             User user = userMapper.selectById(token);
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
 
-            Date now = new Date();
             Item item = corpTicketMap.get(wxCorpInfo.getCorpid());
             if (item == null || item.expireTime.isBefore(LocalDateTime.now())) {
                 //重新获取
@@ -407,8 +421,10 @@ public class WeiXinCorpController {
                     //检查公司名称是否存在
                     List<Company> cpList = companyMapper.selectList(new QueryWrapper<Company>().eq("company_name", corpName).or().eq("company_name", data.getCorpFullName()));
                     Company company = null;
+                    SysRole managerRole = null;
                     if (cpList.size() > 0) {
                         company = cpList.get(0);
+                        managerRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", company.getId()).eq("role_name", com.management.platform.constant.Constant.ROLE_SUPER_MANAGER));
                     } else {
                         //首先生成一个新公司,增加会员的试用一个月
                         company = new Company().setCompanyName(corpName)
@@ -419,7 +435,7 @@ public class WeiXinCorpController {
                         companyMapper.insert(company);
 
                         //生成项目的成本基线默认条目
-                        String[] array = com.management.platform.util.Constant.DEFAULT_BASE_COST_ITEMS;
+                        String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
                         for (String baseItem : array) {
                             ProjectBasecostSetting setting = new ProjectBasecostSetting();
                             setting.setName(baseItem);
@@ -428,11 +444,13 @@ public class WeiXinCorpController {
                         }
 
 
+
                         //生成工作时长
                         TimeType timeType = new TimeType();
                         timeType.setCompanyId(company.getId());
                         timeTypeMapper.insert(timeType);
 
+                        managerRole = sysRoleService.generateDefaultRoles(company.getId());
                     }
                     data.setCompanyId(company.getId());
                     wxCorpInfoMapper.insert(data);
@@ -444,10 +462,17 @@ public class WeiXinCorpController {
                         //创建企业负责人账号
                         log.info("===userDetail==" + userDetail.toJSONString());
                         Long id = SnowFlake.nextId();
+                        String name = data.getAuthUsername();
+                        if (name == null) {
+                            name = userId;
+                        }
+                        if (name.length() > 10) {
+                            name = name.substring(0,10);
+                        }
                         User user = new User()
                                 .setId(id.toString())
-                                .setRole(1)
-                                .setName(data.getAuthUsername()==null?userId:data.getAuthUsername())
+                                .setRole(managerRole.getId())
+                                .setName(name)
                                 .setPassword(MD5Util.getPassword("000000"))
                                 .setCorpwxUserid(userId)
                                 .setColor(ColorUtil.randomColor())
@@ -600,6 +625,7 @@ public class WeiXinCorpController {
         }
     }
 
+
     private JSONArray getDeptUserSimple(String accessToken, int deptId) {
         String url = GET_DEPARTMENT_USER_SIMPLE_URL.replace("ACCESS_TOKEN", accessToken).replace("DEPARTMENT_ID", ""+deptId);
         String result = restTemplate.getForObject(url, String.class);
@@ -716,6 +742,7 @@ public class WeiXinCorpController {
                     LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
             //检测是否是项目经理,项目经理有审核功能权限
             userVO.setLeader(judgeIsLeader(userVO.getId()));
+            getUserRoleMenu(userVO);
             msg.data = userVO;
 
         }
@@ -735,6 +762,7 @@ public class WeiXinCorpController {
         if (userList.size() > 0) {
             //该用户已存在
             User curUser = userList.get(0);
+
             //写死进行测试
 //            if (curUser.getName().equals("屈跃庭")) {
 //                curUser = userMapper.selectById("7913998191517310976");
@@ -745,6 +773,10 @@ public class WeiXinCorpController {
             UserVO userVO = new UserVO().setCompanyName(company.getCompanyName());
             userVO.setCompany(company);
             BeanUtils.copyProperties(curUser, userVO);
+            if (userVO.getRoleId() == null || userVO.getRoleId() == 0) {
+                msg.setError("请先联系管理员为您分配角色");
+                return msg;
+            }
             //还要多返回一个公司名字
             userVO.setPassword("");
             LocalDateTime remainingTime = company.getExpirationDate() == null ? LocalDateTime.now() : company.getExpirationDate();
@@ -760,7 +792,7 @@ public class WeiXinCorpController {
                 num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
             }
             userVO.setHasAuditDept(num>0);
-
+            getUserRoleMenu(userVO);
             msg.data = userVO;
         } else {
             msg.setError("该用户尚未绑定企业微信,需要通过账号密码登录");
@@ -768,6 +800,114 @@ public class WeiXinCorpController {
         return msg;
     }
 
+
+    public void getUserRoleMenu(UserVO user) {
+        Integer roleId = user.getRoleId();
+        //获取公司的套餐
+        Company company = companyMapper.selectById(user.getCompanyId());
+        TimeType timeType = timeTypeMapper.selectById(company.getId());
+        //按照公司开通的模块进行匹配
+        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<SysModule>().eq("package_time", 1);
+        if (company.getPackageProject() == 1) {
+            queryWrapper.or().eq("package_project", 1);
+        }
+        if (company.getPackageOa() == 1) {
+            queryWrapper.or().eq("package_oa", 1);
+        }
+        if (company.getPackageExpense() == 1) {
+            queryWrapper.or().eq("package_expense", 1);
+        }
+        if (company.getPackageCustomer() == 1) {
+            queryWrapper.or().eq("package_customer", 1);
+        }
+        if (company.getPackageEngineering() == 1) {
+            queryWrapper.or().eq("package_engineering", 1);
+        }
+        if (company.getPackageContract() == 1) {
+            queryWrapper.or().eq("package_contract", 1);
+        }
+        if (company.getPackageEtimecard()== 1) {
+            queryWrapper.or().eq("package_etimecard", 1);
+        }
+        if (company.getPackageFinance() == 1) {
+            queryWrapper.or().eq("package_finance", 1);
+        }
+        if (timeType.getReportWorkflow() == 1) {
+            queryWrapper.or().eq("report_workflow", 1);
+        }
+        queryWrapper.orderByAsc("orderitem");
+
+        //返回菜单
+        List<SysRoleModule> rModules = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", roleId));
+        List<Integer> ids = rModules.stream().map(SysRoleModule::getModuleId).collect(Collectors.toList());
+        //项目报告审核模块,如果参与日报的审核,需要自动加上
+        if (user.isLeader() || user.isHasAuditDept()) {
+            SysModule projectAuditModule = sysModuleMapper.selectOne(new QueryWrapper<SysModule>().eq("name", "项目报告审核"));
+            if (!ids.contains(projectAuditModule.getId())) {
+                ids.add(projectAuditModule.getId());
+            }
+        }
+        List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
+        //过滤一下,这个角色选中的模块
+        moduleList = moduleList.stream().filter(m->ids.contains(m.getId())).collect(Collectors.toList());
+        //组装层级关系,默认只有两级
+        List<SysModule> menuList = new ArrayList<>();
+        for (SysModule module : moduleList) {
+            if (module.getParentId() == null) {
+                menuList.add(module);
+            }
+        }
+        for (SysModule mainMenu : menuList) {
+            List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
+            mainMenu.setChildren(list);
+        }
+        user.setModuleList(menuList);
+        //此处返回权限集合
+        List<Integer> functionIdList = new ArrayList<>();
+        //获取角色所有的功能id
+        List<SysRoleFunction> funList = sysRoleFunctionMapper.selectList(new QueryWrapper<SysRoleFunction>()
+                .eq("role_id", roleId));
+        for (SysRoleFunction sysRoleFunction : funList) {
+            functionIdList.add(sysRoleFunction.getFunctionId());
+        }
+        if (functionIdList.size() > 0) {
+            //根据功能id获取可用的操作代码
+            QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
+            if (company.getPackageProject() == 1) {
+                functionQueryWrapper.or().eq("package_project", 1);
+            }
+            if (company.getPackageOa() == 1) {
+                functionQueryWrapper.or().eq("package_oa", 1);
+            }
+            if (company.getPackageExpense() == 1) {
+                functionQueryWrapper.or().eq("package_expense", 1);
+            }
+            if (company.getPackageCustomer() == 1) {
+                functionQueryWrapper.or().eq("package_customer", 1);
+            }
+            if (company.getPackageEngineering() == 1) {
+                functionQueryWrapper.or().eq("package_engineering", 1);
+            }
+            if (company.getPackageContract() == 1) {
+                functionQueryWrapper.or().eq("package_contract", 1);
+            }
+            if (company.getPackageEtimecard()== 1) {
+                functionQueryWrapper.or().eq("package_etimecard", 1);
+            }
+            if (company.getPackageFinance() == 1) {
+                functionQueryWrapper.or().eq("package_finance", 1);
+            }
+            functionQueryWrapper.orderByAsc("seq");
+
+            List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
+            functionList = functionList.stream().filter(f->functionIdList.contains(f.getId())).collect(Collectors.toList());
+            user.setFunctionList(functionList);
+        } else {
+            user.setFunctionList(new ArrayList<>());
+        }
+    }
+
+
     //获取企业微信考勤打卡统计数据
     @RequestMapping("/getUserCheckInDayData")
     public HttpRespMsg getUserCheckInDayData(int companyId, String userId, String startDate, String endDate) {

+ 8 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java

@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-10-22
+ * @since 2022-04-01
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -74,7 +74,7 @@ public class Company extends Model<Company> {
     private Integer packageContract;
 
     /**
-     * OA平台
+     * OA平台;请假,出差等
      */
     @TableField("package_oa")
     private Integer packageOa;
@@ -109,6 +109,12 @@ public class Company extends Model<Company> {
     @TableField("package_simple")
     private Integer packageSimple;
 
+    /**
+     * 财务核算成本
+     */
+    @TableField("package_finance")
+    private Integer packageFinance;
+
 
     @Override
     protected Serializable pkVal() {

+ 54 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Permission.java

@@ -0,0 +1,54 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.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;
+    }
+
+}

+ 61 - 4
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 2022-03-30
+ * @since 2022-04-01
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -64,11 +64,68 @@ public class SysFunction extends Model<SysFunction> {
     private Boolean useState;
 
     /**
-     * 所属版本,0-基础版,1-项目管理专业版
+     * 是否属于工时管理模块
      */
-    @TableField("package_type")
-    private Integer packageType;
+    @TableField("package_time")
+    private Integer packageTime;
 
+    /**
+     * 是否属于任务协同办公
+     */
+    @TableField("package_project")
+    private Integer packageProject;
+
+    /**
+     * 是否属于OA, 请假出差等
+     */
+    @TableField("package_oa")
+    private Integer packageOa;
+
+    /**
+     * 是否属于费用报销
+     */
+    @TableField("package_expense")
+    private Integer packageExpense;
+
+    /**
+     * 是否属于客户管理
+     */
+    @TableField("package_customer")
+    private Integer packageCustomer;
+
+    /**
+     * 是否属于专业工程管理
+     */
+    @TableField("package_engineering")
+    private Integer packageEngineering;
+
+    /**
+     * 是否属于合同管理
+     */
+    @TableField("package_contract")
+    private Integer packageContract;
+
+    /**
+     * 是否属于生产车间管理
+     */
+    @TableField("package_etimecard")
+    private Integer packageEtimecard;
+
+    /**
+     * 是否属于财务核算成本
+     */
+    @TableField("package_finance")
+    private Integer packageFinance;
+
+    /**
+     * 是否属于同步企业微信
+     */
+    @TableField("sync_corpwx_time")
+    private Integer syncCorpwxTime;
+
+
+    @TableField(exist = false)
+    private boolean checked;
 
     @Override
     protected Serializable pkVal() {

+ 69 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SysModule.java

@@ -5,6 +5,8 @@ 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;
@@ -15,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-03-30
+ * @since 2022-04-01
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -73,16 +75,76 @@ public class SysModule extends Model<SysModule> {
     private Boolean useState;
 
     /**
-     * 账套级别的系统配置-Lei
+     * 是否属于工时管理模块
+     */
+    @TableField("package_time")
+    private Integer packageTime;
+
+    /**
+     * 是否属于任务协同办公
+     */
+    @TableField("package_project")
+    private Integer packageProject;
+
+    /**
+     * 是否属于OA, 请假出差等
+     */
+    @TableField("package_oa")
+    private Integer packageOa;
+
+    /**
+     * 是否属于费用报销
+     */
+    @TableField("package_expense")
+    private Integer packageExpense;
+
+    /**
+     * 是否属于客户管理
+     */
+    @TableField("package_customer")
+    private Integer packageCustomer;
+
+    /**
+     * 是否属于专业工程管理
      */
-    @TableField("config")
-    private String config;
+    @TableField("package_engineering")
+    private Integer packageEngineering;
 
     /**
-     * 所属版本级别: 0-基础版,1-项目管理专业版
+     * 是否属于合同管理
      */
-    @TableField("package_type")
-    private Integer packageType;
+    @TableField("package_contract")
+    private Integer packageContract;
+
+    /**
+     * 是否属于生产车间管理
+     */
+    @TableField("package_etimecard")
+    private Integer packageEtimecard;
+
+    /**
+     * 是否属于自定义审批流
+     */
+    @TableField("report_workflow")
+    private Integer reportWorkflow;
+
+    /**
+     * 是否属于财务核算成本
+     */
+    @TableField("package_finance")
+    private Integer packageFinance;
+
+
+
+    @TableField(exist = false)
+    private List<SysModule> children;
+
+
+    @TableField(exist = false)
+    private boolean checked;
+
+    @TableField(exist = false)
+    private List<SysFunction> functionList;
 
 
     @Override

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

@@ -5,6 +5,8 @@ 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;
@@ -15,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-03-30
+ * @since 2022-03-31
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -48,6 +50,23 @@ public class SysRole extends Model<SysRole> {
     @TableField("role_describe")
     private String roleDescribe;
 
+    /**
+     * 父级角色
+     */
+    @TableField("parent_role")
+    private Integer parentRole;
+
+    /**
+     * 是否是新增员工时的默认的角色
+     */
+    @TableField("is_default")
+    private Integer isDefault;
+
+
+    @TableField(exist = false)
+    private List<SysModule> moduleList;
+    @TableField(exist = false)
+    private List<SysFunction> functionList;
 
     @Override
     protected Serializable pkVal() {

+ 3 - 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 2022-03-30
+ * @since 2022-03-31
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -35,6 +35,8 @@ public class SysRoleFunction extends Model<SysRoleFunction> {
     @TableField("function_id")
     private Integer functionId;
 
+    @TableField(exist = false)
+    private String functionName;
 
     @Override
     protected Serializable pkVal() {

+ 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 2022-03-30
+ * @since 2022-03-31
  */
 @Data
 @EqualsAndHashCode(callSuper = false)

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/SysRichFunction.java

@@ -0,0 +1,9 @@
+package com.management.platform.entity.vo;
+
+import com.management.platform.entity.SysFunction;
+import lombok.Data;
+
+@Data
+public class SysRichFunction extends SysFunction {
+    public String moduleName;
+}

+ 25 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/PermissionMapper.java

@@ -0,0 +1,25 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.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);
+}

+ 4 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/SysFunctionMapper.java

@@ -2,6 +2,9 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.SysFunction;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.vo.SysRichFunction;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2021-06-03
  */
 public interface SysFunctionMapper extends BaseMapper<SysFunction> {
-
+    public List<SysRichFunction> getRoleFunctions(Integer roleId, String functionName);
 }

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/SysRoleFunctionMapper.java

@@ -3,6 +3,8 @@ package com.management.platform.mapper;
 import com.management.platform.entity.SysRoleFunction;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
  * <p>
  * 角色菜单关联表 Mapper 接口
@@ -12,5 +14,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2021-06-03
  */
 public interface SysRoleFunctionMapper extends BaseMapper<SysRoleFunction> {
-
+    public List<SysRoleFunction> getRoleFunctionNames(Integer roleId);
 }

+ 2 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserMapper.java

@@ -19,17 +19,11 @@ import java.util.Map;
 public interface UserMapper extends BaseMapper<User> {
     List<Map<String, Object>> getUserByDepartment(Page page,
                                                   @Param("companyId") Integer companyId,
-                                                  @Param("departmentId") Integer departmentId, String keyword, Integer status, Integer role);
-
-    Integer countUserByDepartment(@Param("companyId") Integer companyId,
-                                  @Param("departmentId") Integer departmentId, String keyword, Integer status, Integer role);
+                                                  @Param("departmentId") Integer departmentId, String keyword, Integer status, @Param("roleId") Integer roleId);
 
     List<Map<String, Object>> getUserByDepartmentList(Page page,
                                                       @Param("companyId") Integer companyId,
-                                                      @Param("departmentIds") List departmentIds, String keyword, Integer status, Integer role);
-
-    Integer countUserByDepartmentList(@Param("companyId") Integer companyId,
-                                      @Param("departmentIds") List departmentIds, String keyword, Integer status, Integer role);
+                                                      @Param("departmentIds") List departmentIds, String keyword, Integer status, @Param("roleId") Integer roleId);
 
     List<Map<String, Object>> getPushUserList(@Param("companyId") Integer companyId);
 

+ 37 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/PermissionService.java

@@ -0,0 +1,37 @@
+package com.management.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.Permission;
+import com.management.platform.util.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, Integer companyId);
+
+    HttpRespMsg deleteRole(Integer id);
+
+    HttpRespMsg getAuthority(Integer role, Integer companyId);
+
+    HttpRespMsg switchAuthority(Integer role, Integer id);
+
+    HttpRespMsg savePermission(Integer role, String moduleList);
+
+    HttpRespMsg setDefaultRole(Integer id, Integer companyId);
+}

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

@@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface SysRoleService extends IService<SysRole> {
 
+    public SysRole generateDefaultRoles(Integer companyId);
 }

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

@@ -18,11 +18,9 @@ import javax.servlet.http.HttpServletRequest;
 public interface UserService extends IService<User> {
     HttpRespMsg loginAdmin(String username, String password);
 
-    HttpRespMsg loginEmployee(String username, String password);
-
     HttpRespMsg getUserInfo(String id);
 
-    HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer status, Integer role, Integer pageIndex, Integer pageSize, HttpServletRequest request);
+    HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer status, Integer roleId, Integer pageIndex, Integer pageSize, HttpServletRequest request);
 
     HttpRespMsg deleteUser(String userId, HttpServletRequest request);
 
@@ -30,7 +28,7 @@ public interface UserService extends IService<User> {
 
     HttpRespMsg insertCompany(String companyName, String name, String phone, String vcode, String pwd, Integer type);
 
-    HttpRespMsg insertUser(String id, String name, String phone, Integer role, Double monthCost, Double cost, Integer departmentId,
+    HttpRespMsg insertUser(String id, String name, String phone, Integer roleId, Double monthCost, Double cost, Integer departmentId,
                            Integer salaryType, String costApplyDate,
                            HttpServletRequest request);
 
@@ -63,4 +61,6 @@ public interface UserService extends IService<User> {
     HttpRespMsg loginByUserId(String userId, HttpServletRequest request);
 
     HttpRespMsg batchUpdateDept(String userIds, Integer deptId, HttpServletRequest request);
+
+    HttpRespMsg batchUpdateRole(String userIds, Integer roleId, HttpServletRequest request);
 }

+ 13 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -526,19 +526,20 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         unAssignedDept.setLabel("未分配");
         list.add(unAssignedDept);
 
-        //按照当前人员的权限,获取可管辖的人员列表
+        //
         List<User> userList = new ArrayList<>();
-        if (currentUser.getRole() == 0) {
-            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("incharger_id", currentUser.getId()));
-            if (projectList.size() > 0) {
-                List<Integer> collect = projectList.stream().map(Project::getId).collect(Collectors.toList());
-                List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", collect));
-                List<String> userIds = participationList.stream().map(Participation::getUserId).collect(Collectors.toList());
-                userList = userMapper.selectList(new QueryWrapper<User>().in("id", userIds));
-            }
-        } else if (currentUser.getRole() == 1 || currentUser.getRole() == 2) {
-            userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
-        }
+        userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+//        if (currentUser.getRole() == 0) {
+//            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("incharger_id", currentUser.getId()));
+//            if (projectList.size() > 0) {
+//                List<Integer> collect = projectList.stream().map(Project::getId).collect(Collectors.toList());
+//                List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", collect));
+//                List<String> userIds = participationList.stream().map(Participation::getUserId).collect(Collectors.toList());
+//                userList = userMapper.selectList(new QueryWrapper<User>().in("id", userIds));
+//            }
+//        } else if (currentUser.getRole() == 1 || currentUser.getRole() == 2) {
+//
+//        }
 
         List<HashMap> userMapList = new ArrayList<>();
         for (User u : userList) {

+ 167 - 32
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -11,14 +11,12 @@ import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.*;
 import com.dingtalk.api.response.*;
+import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
-import com.management.platform.service.DepartmentService;
-import com.management.platform.service.DingDingService;
-import com.management.platform.service.UserService;
+import com.management.platform.service.*;
 import com.management.platform.util.ColorUtil;
-import com.management.platform.util.Constant;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.SnowFlake;
 import com.taobao.api.ApiException;
@@ -32,9 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -55,7 +51,22 @@ public class DingDingServiceImpl implements DingDingService {
 
     private Object deptLock = new Object();
     private Object userLock = new Object();
-
+    @Resource
+    SysRoleModuleMapper sysRoleModuleMapper;
+    @Resource
+    SysRoleFunctionMapper sysRoleFunctionMapper;
+    @Resource
+    private SysRoleMapper sysRoleMapper;
+    @Resource
+    private SysModuleMapper sysModuleMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
+    @Resource
+    private SysRoleModuleService sysRoleModuleService;
+    @Resource
+    private SysRoleFunctionService sysRoleFunctionService;
+    @Resource
+    private SysRoleService sysRoleService;
     @Resource
     private SysConfigMapper sysConfigMapper;
     @Resource
@@ -97,11 +108,13 @@ public class DingDingServiceImpl implements DingDingService {
                 return;
             }
         }
+        SysRole smanager = null;
         if (company != null) {
             System.out.println("企业已经存在,更新企业名称");
             if (!company.getCompanyName().equals(corpName)) {
                 company.setCompanyName(corpName);
                 companyMapper.updateById(company);
+                smanager = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", company.getId()).eq("role_name", Constant.ROLE_SUPER_MANAGER));
             }
         } else {
             //首先生成一个新公司,增加会员的试用一个月
@@ -117,8 +130,10 @@ public class DingDingServiceImpl implements DingDingService {
             timeType.setCompanyId(company.getId());
             timeTypeMapper.insert(timeType);
 
+            smanager = sysRoleService.generateDefaultRoles(company.getId());
+
             //生成项目的成本基线默认条目
-            String[] array = com.management.platform.util.Constant.DEFAULT_BASE_COST_ITEMS;
+            String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
             for (String baseItem : array) {
                 ProjectBasecostSetting setting = new ProjectBasecostSetting();
                 setting.setName(baseItem);
@@ -154,7 +169,7 @@ public class DingDingServiceImpl implements DingDingService {
             Long id = SnowFlake.nextId();
             User user = new User()
                     .setId(id.toString())
-                    .setRole(1)
+                    .setRole(smanager.getId())
                     .setDingdingUserid(authUserId)
                     .setColor(ColorUtil.randomColor())
                     .setCompanyId(company.getId());
@@ -177,6 +192,7 @@ public class DingDingServiceImpl implements DingDingService {
 //        activateSuite(corpid);
     }
 
+
     @Override
     public String syncCorpMembs(String corpid) throws ApiException {
         CompanyDingding dingding = companyDingdingMapper.selectById(corpid);
@@ -223,6 +239,14 @@ public class DingDingServiceImpl implements DingDingService {
 
     private void getAuthedDeptsAndUsers(CompanyDingding dingding, String accessToken) {
         try {
+            //查找默认角色
+            //默认角色
+            int roleId = 0;
+            List<SysRole> droleList = sysRoleMapper.selectList(new QueryWrapper<SysRole>().eq("company_id", dingding.getCompanyId()).eq("is_default", 1));
+            if (droleList.size() > 0) {
+                roleId = droleList.get(0).getId();
+            }
+
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/auth/scopes");
             OapiAuthScopesRequest req = new OapiAuthScopesRequest();
             req.setHttpMethod("GET");
@@ -233,11 +257,11 @@ public class DingDingServiceImpl implements DingDingService {
                 JSONArray deptArray = json.getJSONObject("auth_org_scopes").getJSONArray("authed_dept");
                 //如果授权的是全部公司部门,则递归获取子部门和人员
                 if (deptArray.size() == 1 && deptArray.getLong(0) == 1L) {
-                    getDepartmentList(dingding.getCompanyId(), dingding.getCorpid(), accessToken, 1L, null);
+                    getDepartmentList(roleId, dingding.getCompanyId(), dingding.getCorpid(), accessToken, 1L, null);
                 } else {
                     for (int i=0;i<deptArray.size(); i++) {
                         long deptId = deptArray.getLongValue(i);
-                        getDepartmentDetailAndUserList(dingding.getCompanyId(), dingding.getCorpid(), accessToken, deptId);
+                        getDepartmentDetailAndUserList(roleId, dingding.getCompanyId(), dingding.getCorpid(), accessToken, deptId);
                     }
                 }
 
@@ -247,7 +271,7 @@ public class DingDingServiceImpl implements DingDingService {
                 for (int i=0;i<userArray.size(); i++) {
                     String userdingId = userArray.getString(i);
                     //获取人员详情
-                    getUserDetail(dingding.getCompanyId(), 0, userdingId, accessToken);
+                    getUserDetail(roleId, dingding.getCompanyId(), 0, userdingId, accessToken);
                 }
             } else {
                 System.err.println("获取通讯录范围出错:" + json.toJSONString());
@@ -379,7 +403,7 @@ public class DingDingServiceImpl implements DingDingService {
                         num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
                     }
                     userVO.setHasAuditDept(num>0);
-
+                    getUserRoleMenu(userVO);
                     httpRespMsg.data = userVO;
                 }
             }
@@ -389,6 +413,116 @@ public class DingDingServiceImpl implements DingDingService {
         return httpRespMsg;
     }
 
+
+
+
+    public void getUserRoleMenu(UserVO user) {
+        Integer roleId = user.getRoleId();
+        //获取公司的套餐
+        Company company = companyMapper.selectById(user.getCompanyId());
+        TimeType timeType = timeTypeMapper.selectById(company.getId());
+        //按照公司开通的模块进行匹配
+        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<SysModule>().eq("package_time", 1);
+        if (company.getPackageProject() == 1) {
+            queryWrapper.or().eq("package_project", 1);
+        }
+        if (company.getPackageOa() == 1) {
+            queryWrapper.or().eq("package_oa", 1);
+        }
+        if (company.getPackageExpense() == 1) {
+            queryWrapper.or().eq("package_expense", 1);
+        }
+        if (company.getPackageCustomer() == 1) {
+            queryWrapper.or().eq("package_customer", 1);
+        }
+        if (company.getPackageEngineering() == 1) {
+            queryWrapper.or().eq("package_engineering", 1);
+        }
+        if (company.getPackageContract() == 1) {
+            queryWrapper.or().eq("package_contract", 1);
+        }
+        if (company.getPackageEtimecard()== 1) {
+            queryWrapper.or().eq("package_etimecard", 1);
+        }
+        if (company.getPackageFinance() == 1) {
+            queryWrapper.or().eq("package_finance", 1);
+        }
+        if (timeType.getReportWorkflow() == 1) {
+            queryWrapper.or().eq("report_workflow", 1);
+        }
+        queryWrapper.orderByAsc("orderitem");
+
+        //返回菜单
+        List<SysRoleModule> rModules = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", roleId));
+        List<Integer> ids = rModules.stream().map(SysRoleModule::getModuleId).collect(Collectors.toList());
+        //项目报告审核模块,如果参与日报的审核,需要自动加上
+        if (user.isLeader() || user.isHasAuditDept()) {
+            SysModule projectAuditModule = sysModuleMapper.selectOne(new QueryWrapper<SysModule>().eq("name", "项目报告审核"));
+            if (!ids.contains(projectAuditModule.getId())) {
+                ids.add(projectAuditModule.getId());
+            }
+        }
+        List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
+        //过滤一下,这个角色选中的模块
+        moduleList = moduleList.stream().filter(m->ids.contains(m.getId())).collect(Collectors.toList());
+        //组装层级关系,默认只有两级
+        List<SysModule> menuList = new ArrayList<>();
+        for (SysModule module : moduleList) {
+            if (module.getParentId() == null) {
+                menuList.add(module);
+            }
+        }
+        for (SysModule mainMenu : menuList) {
+            List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
+            mainMenu.setChildren(list);
+        }
+        user.setModuleList(menuList);
+        //此处返回权限集合
+        List<Integer> functionIdList = new ArrayList<>();
+        //获取角色所有的功能id
+        List<SysRoleFunction> funList = sysRoleFunctionMapper.selectList(new QueryWrapper<SysRoleFunction>()
+                .eq("role_id", roleId));
+        for (SysRoleFunction sysRoleFunction : funList) {
+            functionIdList.add(sysRoleFunction.getFunctionId());
+        }
+        if (functionIdList.size() > 0) {
+            //根据功能id获取可用的操作代码
+            QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
+            if (company.getPackageProject() == 1) {
+                functionQueryWrapper.or().eq("package_project", 1);
+            }
+            if (company.getPackageOa() == 1) {
+                functionQueryWrapper.or().eq("package_oa", 1);
+            }
+            if (company.getPackageExpense() == 1) {
+                functionQueryWrapper.or().eq("package_expense", 1);
+            }
+            if (company.getPackageCustomer() == 1) {
+                functionQueryWrapper.or().eq("package_customer", 1);
+            }
+            if (company.getPackageEngineering() == 1) {
+                functionQueryWrapper.or().eq("package_engineering", 1);
+            }
+            if (company.getPackageContract() == 1) {
+                functionQueryWrapper.or().eq("package_contract", 1);
+            }
+            if (company.getPackageEtimecard()== 1) {
+                functionQueryWrapper.or().eq("package_etimecard", 1);
+            }
+            if (company.getPackageFinance() == 1) {
+                functionQueryWrapper.or().eq("package_finance", 1);
+            }
+            functionQueryWrapper.orderByAsc("seq");
+
+            List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
+            functionList = functionList.stream().filter(f->functionIdList.contains(f.getId())).collect(Collectors.toList());
+            user.setFunctionList(functionList);
+        } else {
+            user.setFunctionList(new ArrayList<>());
+        }
+    }
+
+
     @Override
     @Async
     public HttpRespMsg testAsync() {
@@ -519,7 +653,7 @@ public class DingDingServiceImpl implements DingDingService {
     }
 
     //获取部门详情和部门下的人员
-    public void getDepartmentDetailAndUserList(Integer companyId, String corpid, String accessToken, long deptId) {
+    public void getDepartmentDetailAndUserList(int roleId, Integer companyId, String corpid, String accessToken, long deptId) {
         try {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
             OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
@@ -569,9 +703,9 @@ public class DingDingServiceImpl implements DingDingService {
                 }
 
                 //获取该部门下的人员, 如果是根部门,不会创建,人员的部门id会使用数据库默认的0
-                getDeptUserIdList(companyId, deptId, department.getDepartmentId(), accessToken);
+                getDeptUserIdList(roleId, companyId, deptId, department.getDepartmentId(), accessToken);
                 //获取子部门
-                getDepartmentList(companyId, corpid, accessToken, departmentDingding.getDdDeptid(), department.getDepartmentId());
+                getDepartmentList(roleId, companyId, corpid, accessToken, departmentDingding.getDdDeptid(), department.getDepartmentId());
             }
         } catch (ApiException e) {
             e.printStackTrace();
@@ -579,7 +713,7 @@ public class DingDingServiceImpl implements DingDingService {
     }
 
     //获取该部门下的人员和子部门列表,递归下一级子部门
-    public  String getDepartmentList(Integer companyId, String corpid, String access_token, long parentDeptId, Integer parentSysDeptId) throws ApiException {
+    public  String getDepartmentList(int roleId, Integer companyId, String corpid, String access_token, long parentDeptId, Integer parentSysDeptId) throws ApiException {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
         OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
         req.setDeptId(parentDeptId);
@@ -614,10 +748,10 @@ public class DingDingServiceImpl implements DingDingService {
                     }
                 }
                 //获取子部门的数据
-                getDepartmentList(companyId, corpid, access_token, departmentDingding.getDdDeptid(), department.getDepartmentId());
+                getDepartmentList(roleId, companyId, corpid, access_token, departmentDingding.getDdDeptid(), department.getDepartmentId());
             }
             //获取部门下的人员列表
-            getDeptUserIdList(companyId, parentDeptId, parentSysDeptId, access_token);
+            getDeptUserIdList(roleId, companyId, parentDeptId, parentSysDeptId, access_token);
         } else {
             return json.toJSONString();
         }
@@ -625,7 +759,7 @@ public class DingDingServiceImpl implements DingDingService {
     }
 
     //获取部门下的人员ids
-    public void getDeptUserIdList(int companyId, long ddDeptId,Integer sysDeptId, String access_token) throws ApiException {
+    public void getDeptUserIdList(int roleId, int companyId, long ddDeptId,Integer sysDeptId, String access_token) throws ApiException {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid");
         OapiUserListidRequest req = new OapiUserListidRequest();
         req.setDeptId(ddDeptId);
@@ -636,13 +770,13 @@ public class DingDingServiceImpl implements DingDingService {
             JSONArray jsonArray = resp.getJSONObject("result").getJSONArray("userid_list");
             for (int i=0;i<jsonArray.size(); i++) {
                 String dduid = jsonArray.getString(i);
-                getUserDetail(companyId, sysDeptId, dduid, access_token);
+                getUserDetail(roleId, companyId, sysDeptId, dduid, access_token);
             }
         }
     }
 
     //获取人员详情
-    private void getUserDetail(Integer companyId, Integer departmentId, String dingdingUserid, String access_token) throws ApiException {
+    private void getUserDetail(int roleId, Integer companyId, Integer departmentId, String dingdingUserid, String access_token) throws ApiException {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
         OapiV2UserGetRequest req = new OapiV2UserGetRequest();
         req.setUserid(dingdingUserid);
@@ -653,16 +787,16 @@ public class DingDingServiceImpl implements DingDingService {
         if (resp.getInteger("errcode") == 0) {
             JSONObject userJson = resp.getJSONObject("result");
             User user = new User();
-            int role = 0;
-            if (userJson.getBooleanValue("boss")) {
-                role = Constant.ROLE_MASTER;
-            } else if (userJson.getBooleanValue("admin")) {
-                role = Constant.ROLE_MANAGER;
-            } else if (userJson.getBooleanValue("senior")) {
-                role = Constant.ROLE_LEADER;
-            }
+//            int roleId = 0;
+//            if (userJson.getBooleanValue("boss")) {
+//                role = Constant.ROLE_MASTER;
+//            } else if (userJson.getBooleanValue("admin")) {
+//                role = Constant.ROLE_MANAGER;
+//            } else if (userJson.getBooleanValue("senior")) {
+//                role = Constant.ROLE_LEADER;
+//            }
             user.setId(SnowFlake.nextId()+"")
-                    .setRole(role)
+                    .setRoleId(roleId)
                     .setCompanyId(companyId)
                     .setDepartmentId(departmentId)
                     .setName(userJson.getString("name"))
@@ -677,6 +811,7 @@ public class DingDingServiceImpl implements DingDingService {
             synchronized (userLock) {
                 User oldUser = userMapper.selectOne(new QueryWrapper<User>().eq("dingding_userid", dingdingUserid).eq("company_id", companyId));
                 if (oldUser == null) {
+                    System.out.println("新增钉钉用户==" + user.getName());
                     userMapper.insert(user);
                 } else {
 //                    System.out.println("该人员已存在:dingdingUserid==" + dingdingUserid);

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

@@ -463,7 +463,17 @@ public class FinanceImportServiceImpl extends ServiceImpl<FinanceImportMapper, F
                 //批量插入
                 financeService.saveOrUpdateBatch(financeList);
                 if (financeImport.getRecoverMonthcost()==1) {
-                    userService.updateBatchById(updateUserList);
+                    //重新计算时薪,保证按照标准工作时长下的时薪正确
+                    List<User> dbUpUserList = new ArrayList<>();
+                    BigDecimal db = timeType.getMonthDays().multiply(new BigDecimal(timeType.getAllday()));
+                    for (User upU : updateUserList) {
+                        User user1 = new User();
+                        user1.setId(upU.getId());
+                        user1.setMonthCost(upU.getMonthCost());
+                        user1.setCost(upU.getMonthCost().divide(db,2, BigDecimal.ROUND_HALF_UP));
+                        dbUpUserList.add(user1);
+                    }
+                    userService.updateBatchById(dbUpUserList);
                 }
                 //检查是否有删除的,需要删除掉
                 List<Integer> readyForDelete = new ArrayList<>();
@@ -481,7 +491,6 @@ public class FinanceImportServiceImpl extends ServiceImpl<FinanceImportMapper, F
                 }
                 //如果有必要,更新该月份的日报相关的成本
                 if (financeImport.getRecoverReport()==1) {
-
                     List<Report> reportList = reportMapper.selectSimpleTime(companyId, startStr, endStr);
                     if (reportList.size() > 0) {
                         for (Report r : reportList) {

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

@@ -305,7 +305,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
 
                     //如果需要更新员工成本
                     if (syncUserCost || syncHistoryReport) {
-                        //设置人员总成本,计算时薪
+                        //设置人员总成本,计算当月成本对应工时的临时时薪
                         User localUser = new User();
                         localUser.setId(finance.getUserId());
                         localUser.setMonthCost(total);
@@ -326,7 +326,6 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 }
                 finance.setYmonth(yearMonth);
                 financeList.add(finance);
-
             }
             if (financeList.size() == 0) {
                 msg.setError("请填写数据再上传");
@@ -335,7 +334,17 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             //批量插入
             financeService.saveOrUpdateBatch(financeList);
             if (syncUserCost) {
-                userService.updateBatchById(updateUserList);
+                //重新计算时薪,保证按照标准工作时长下的时薪正确
+                List<User> dbUpUserList = new ArrayList<>();
+                BigDecimal db = timeType.getMonthDays().multiply(new BigDecimal(timeType.getAllday()));
+                for (User upU : updateUserList) {
+                    User user1 = new User();
+                    user1.setId(upU.getId());
+                    user1.setMonthCost(upU.getMonthCost());
+                    user1.setCost(upU.getMonthCost().divide(db,2, BigDecimal.ROUND_HALF_UP));
+                    dbUpUserList.add(user1);
+                }
+                userService.updateBatchById(dbUpUserList);
             }
             //检查是否有删除的,需要删除掉
             List<Integer> readyForDelete = new ArrayList<>();
@@ -353,7 +362,6 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             }
             //如果有必要,更新该月份的日报相关的成本
             if (syncHistoryReport) {
-
                 List<Report> reportList = reportMapper.selectSimpleTime(companyId, startStr, endStr);
                 if (reportList.size() > 0) {
                     for (Report r : reportList) {

+ 357 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/PermissionServiceImpl.java

@@ -0,0 +1,357 @@
+package com.management.platform.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.PermissionService;
+import com.management.platform.service.SysRoleFunctionService;
+import com.management.platform.service.SysRoleModuleService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+@Service
+@Transactional
+public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements PermissionService {
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private PermissionMapper permissionMapper;
+    @Resource
+    private SysRoleMapper sysRoleMapper;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private SysRoleFunctionMapper sysRoleFunctionMapper;
+    @Resource
+    private SysModuleMapper sysModuleMapper;
+    @Resource
+    private SysRoleModuleMapper sysRoleModuleMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
+    @Resource
+    private SysRoleFunctionService sysRoleFunctionService;
+    @Resource
+    private SysRoleModuleService sysRoleModuleService;
+    @Resource
+    private CompanyMapper companyMapper;
+
+
+    //根据角色id获取角色列表
+    @Override
+    public HttpRespMsg getCrewByPage(Integer pageIndex, Integer pageSize) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("records", permissionMapper.getRoleList(new Page<>(pageIndex, pageSize)));
+        resultMap.put("roles", sysRoleMapper.selectList(new QueryWrapper<SysRole>().ne("id", 0)));
+        resultMap.put("total", userMapper.selectCount(new QueryWrapper<User>().ne("id", 1)));
+        httpRespMsg.data = resultMap;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg switchRole(Integer[] ids, Integer roleId, HttpServletRequest httpServletRequest) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg getSimpleUserList() {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        List<Map<String, Object>> resultList = new ArrayList<>();
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().ne("id", 1));
+        for (User user : userList) {
+            Map<String, Object> userMap = new HashMap<>();
+            userMap.put("id", user.getId());
+            userMap.put("name", user.getName());
+            resultList.add(userMap);
+        }
+        httpRespMsg.data = resultList;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg getRoleList(Integer companyId) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        httpRespMsg.data = sysRoleMapper.selectList(new QueryWrapper<SysRole>().eq("company_id", companyId));
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg editRole(Integer id, String name, String description, Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        SysRole sysRole = new SysRole().setId(id).setRolename(name).setRoleDescribe(description).setCompanyId(companyId);
+        if (id == null) {
+            long cnt = sysRoleMapper.selectCount(new QueryWrapper<SysRole>().eq("rolename", name).eq("company_id", companyId));
+            if (cnt > 0) {
+                msg.setError("角色名称不能重复");
+            } else {
+                sysRoleMapper.insert(sysRole);
+            }
+        } else {
+            long cnt = sysRoleMapper.selectCount(new QueryWrapper<SysRole>().eq("rolename", name).ne("id", id).eq("company_id", companyId));
+            if (cnt > 0) {
+                msg.setError("角色名称不能重复");
+            } else {
+                sysRoleMapper.updateById(sysRole);
+                //更新相关的用户的角色名称
+                User user = new User();
+                user.setRoleName(sysRole.getRolename());
+                userMapper.update(user, new QueryWrapper<User>().eq("role_id", sysRole.getId()));
+            }
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg deleteRole(Integer id) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        //检查有无正在使用的人
+        SysRole role = sysRoleMapper.selectById(id);
+        if (role == null) {
+            httpRespMsg.setError("该角色不存在");
+        } else if (role.getRolename().equals("超级管理员")) {
+            httpRespMsg.setError("不可删除超级管理员");
+        } else if (role.getIsDefault() == 1) {
+            httpRespMsg.setError("该角色为新增员工时的默认角色,请设置其他角色为默认后再尝试删除");
+        } else if (userMapper.selectCount(new QueryWrapper<User>().eq("role_id", id)) > 0) {
+            httpRespMsg.setError("该角色存在相关人员,请将他们修改为其他角色后再尝试删除");
+        } else {
+            sysRoleFunctionMapper.delete(new QueryWrapper<SysRoleFunction>().eq("role_id", id));
+            sysRoleModuleMapper.delete(new QueryWrapper<SysRoleModule>().eq("role_id", id));
+            sysRoleMapper.deleteById(id);
+        }
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg getAuthority(Integer role, Integer companyId) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+
+        //角色赋有的module
+        List<Integer> modelIds = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", role)).stream().map(sr -> sr.getModuleId()).collect(Collectors.toList());
+
+        //全部模块,
+        Company company = companyMapper.selectById(companyId);
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        //按照公司开通的模块进行匹配
+        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<SysModule>().eq("package_time", 1);
+        if (company.getPackageProject() == 1) {
+            queryWrapper.or().eq("package_project", 1);
+        }
+        if (company.getPackageOa() == 1) {
+            queryWrapper.or().eq("package_oa", 1);
+        }
+        if (company.getPackageExpense() == 1) {
+            queryWrapper.or().eq("package_expense", 1);
+        }
+        if (company.getPackageCustomer() == 1) {
+            queryWrapper.or().eq("package_customer", 1);
+        }
+        if (company.getPackageEngineering() == 1) {
+            queryWrapper.or().eq("package_engineering", 1);
+        }
+        if (company.getPackageContract() == 1) {
+            queryWrapper.or().eq("package_contract", 1);
+        }
+        if (company.getPackageEtimecard()== 1) {
+            queryWrapper.or().eq("package_etimecard", 1);
+        }
+        if (company.getPackageFinance() == 1) {
+            queryWrapper.or().eq("package_finance", 1);
+        }
+        if (timeType.getReportWorkflow() == 1) {
+            queryWrapper.or().eq("report_workflow", 1);
+        }
+        queryWrapper.orderByAsc("orderitem");
+
+        List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
+        //组装层级关系,默认只有两级
+        List<SysModule> menuList = new ArrayList<>();
+        QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
+        if (company.getPackageProject() == 1) {
+            functionQueryWrapper.or().eq("package_project", 1);
+        }
+        if (company.getPackageOa() == 1) {
+            functionQueryWrapper.or().eq("package_oa", 1);
+        }
+        if (company.getPackageExpense() == 1) {
+            functionQueryWrapper.or().eq("package_expense", 1);
+        }
+        if (company.getPackageCustomer() == 1) {
+            functionQueryWrapper.or().eq("package_customer", 1);
+        }
+        if (company.getPackageEngineering() == 1) {
+            functionQueryWrapper.or().eq("package_engineering", 1);
+        }
+        if (company.getPackageContract() == 1) {
+            functionQueryWrapper.or().eq("package_contract", 1);
+        }
+        if (company.getPackageEtimecard()== 1) {
+            functionQueryWrapper.or().eq("package_etimecard", 1);
+        }
+        if (company.getPackageFinance() == 1) {
+            functionQueryWrapper.or().eq("package_finance", 1);
+        }
+        if (timeType.getSyncCorpwxTime() == 1) {
+            functionQueryWrapper.or().eq("sync_corpwx_time", 1);
+        }
+        functionQueryWrapper.orderByAsc("seq");
+
+        List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
+        //勾选上角色选中的功能
+        List<SysRoleFunction> roleFunctionList = sysRoleFunctionMapper.selectList(new QueryWrapper<SysRoleFunction>().eq("role_id", role));
+        List<Integer> funIds = roleFunctionList.stream().map(fun -> fun.getFunctionId()).collect(Collectors.toList());
+        functionList.stream().forEach(fun -> {
+            if (funIds.contains(fun.getId())) {
+                fun.setChecked(true);
+            }
+        });
+
+        for (SysModule module : moduleList) {
+            if (module.getParentId() == null) {
+                menuList.add(module);
+            }
+            if (modelIds.contains(module.getId())) {
+                module.setChecked(true);
+            }
+            //赋予菜单对应功能列表
+            module.setFunctionList(functionList.stream().filter(item -> item.getModuleId().equals(module.getId())).collect(Collectors.toList()));
+        }
+        for (SysModule mainMenu : menuList) {
+            List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
+            mainMenu.setChildren(list);
+        }
+
+        httpRespMsg.data = menuList;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg switchAuthority(Integer role, Integer id) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        QueryWrapper<SysRoleFunction> queryWrapper = new QueryWrapper<SysRoleFunction>().eq("role_id", role)
+                .eq("function_id", id);
+        if (sysRoleFunctionMapper.selectCount(queryWrapper) > 0) {
+            sysRoleFunctionMapper.delete(queryWrapper);
+            httpRespMsg.data = "权限取消成功";
+        } else {
+            sysRoleFunctionMapper.insert(new SysRoleFunction().setRoleId(role).setFunctionId(id));
+            httpRespMsg.data = "权限加入成功";
+        }
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg savePermission(Integer role, String moduleList) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        JSONArray array = JSONArray.parseArray(moduleList);
+        List<Integer> selectedModuleIds = new ArrayList<>();
+        List<Integer> selectedFunctionIds = new ArrayList<>();
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject mainMennu = array.getJSONObject(i);
+            if (mainMennu.getBoolean("checked")) {
+                selectedModuleIds.add(mainMennu.getIntValue("id"));
+            }
+            selectedFunctionIds.addAll(getCheckedFunList(mainMennu));
+            JSONArray children = mainMennu.getJSONArray("children");
+            //处理子菜单的选中
+            if (children.size() > 0) {
+                for (int m = 0; m < children.size(); m++) {
+                    JSONObject subMenu = children.getJSONObject(m);
+                    if (subMenu.getBoolean("checked")) {
+                        selectedModuleIds.add(subMenu.getIntValue("id"));
+                    }
+                    selectedFunctionIds.addAll(getCheckedFunList(subMenu));
+                }
+            }
+        }
+
+        //保存菜单和功能
+        sysRoleModuleMapper.delete(new QueryWrapper<SysRoleModule>().eq("role_id", role));
+        List<SysRoleModule> sysRoleModules = new ArrayList<>();
+        for (Integer moduleId : selectedModuleIds) {
+            SysRoleModule module = new SysRoleModule();
+            module.setRoleId(role);
+            module.setModuleId(moduleId);
+            sysRoleModules.add(module);
+        }
+        sysRoleModuleService.saveBatch(sysRoleModules);
+
+        sysRoleFunctionMapper.delete(new QueryWrapper<SysRoleFunction>().eq("role_id", role));
+        List<SysRoleFunction> sysRoleFunctions = new ArrayList<>();
+        for (Integer functionId : selectedFunctionIds) {
+            SysRoleFunction fun = new SysRoleFunction();
+            fun.setRoleId(role);
+            fun.setFunctionId(functionId);
+            sysRoleFunctions.add(fun);
+        }
+        sysRoleFunctionService.saveBatch(sysRoleFunctions);
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg setDefaultRole(Integer id, Integer companyId) {
+        //查找当前默认的角色
+        List<SysRole> oldRoleList = sysRoleMapper.selectList(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+        if (oldRoleList.size() > 0) {
+            SysRole role = oldRoleList.get(0);
+            role.setIsDefault(0);
+            sysRoleMapper.updateById(role);
+        }
+        //设置当前的为默认的
+        SysRole role = new SysRole();
+        role.setId(id);
+        role.setIsDefault(1);
+        sysRoleMapper.updateById(role);
+        return new HttpRespMsg();
+    }
+
+    private List<Integer> getCheckedFunList(JSONObject menu) {
+        List<Integer> funIds = new ArrayList<>();
+        JSONArray funList = menu.getJSONArray("functionList");
+        if (funList != null && funList.size() > 0) {
+            for (int i = 0; i < funList.size(); i++) {
+                JSONObject fun = funList.getJSONObject(i);
+                if (fun.getBoolean("checked")) {
+                    funIds.add(fun.getIntValue("id"));
+                }
+            }
+        }
+        return funIds;
+    }
+
+    private String getUserNameById(Integer id) {
+        if (id == null) {
+            return "未知";
+        } else {
+            User user = userMapper.selectById(id);
+            if (user == null) {
+                return "未知";
+            } else {
+                return user.getName();
+            }
+        }
+    }
+}

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

@@ -61,6 +61,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     private ProjectMapper projectMapper;
     @Resource
+    private SysRoleFunctionMapper sysRoleFunctionMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
+    @Resource
     private UserMapper userMapper;
     @Resource
     private ReportMapper reportMapper;
@@ -1829,8 +1833,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         String userId = null;
-        if(user.getRole() != 1 && user.getRole() != 2) {
-            //非系统管理员只能导出自己相关的(创建或参与)
+        List<SysRoleFunction> functionList = sysRoleFunctionMapper.getRoleFunctionNames(user.getRoleId());
+        if(!functionList.stream().anyMatch(fun->fun.getFunctionName().equals("查看全部项目"))) {
+            //无全部项目权限,只能导出自己相关的(创建或参与)
             userId = user.getId();
         }
         List<HashMap<String, Object>> list = projectMapper.getExportData(user.getCompanyId(), userId);

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

@@ -1,10 +1,21 @@
 package com.management.platform.service.impl;
 
-import com.management.platform.entity.SysRole;
-import com.management.platform.mapper.SysRoleMapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
+import com.management.platform.entity.*;
+import com.management.platform.entity.vo.UserVO;
+import com.management.platform.mapper.*;
+import com.management.platform.service.SysRoleFunctionService;
+import com.management.platform.service.SysRoleModuleService;
 import com.management.platform.service.SysRoleService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.service.UserService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -15,6 +26,241 @@ import org.springframework.stereotype.Service;
  * @since 2021-06-03
  */
 @Service
+@Transactional
 public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
 
+    public static String[] employeeModules =  {"工时报告","项目报告审核", "专业审核","部门审核","费用报销","待办任务", "项目管理", "请假管理", "导入日报审核"};
+    public static String[] pmModules =  {"工时报告","项目报告审核", "专业审核","部门审核","费用报销","待办任务", "项目管理", "请假管理", "导入日报审核"};
+    public static String[] financeModules =  {"工时成本统计", "财务核算成本", "费用报销", "组织架构", "请假管理"};
+    public static String[] pmoModules =  {"工时报告","项目报告审核","查看全部任务", "费用报销", "待办任务", "项目管理", "客户管理", "工程专业管理","请假管理"};
+    public static String[] corpLeaderModules =  {"工时报告","查看全部任务","工时成本统计","自定义数值统计","财务核算成本","项目报表服务",
+            "费用报销","待办任务","项目管理","请假管理","查看全部报销单", "查看全部请假单"};
+
+    public static final HashMap<String, String[]> moduleMaps = new HashMap();
+    static {
+        moduleMaps.put("普通员工", employeeModules);
+        moduleMaps.put("项目经理", pmModules);
+        moduleMaps.put("财务管理员", financeModules);
+        moduleMaps.put("项目管理员", pmoModules);
+        moduleMaps.put("公司领导", corpLeaderModules);
+    }
+//
+    public static String[] employeeFunctions = {"查看相关人员工时","请假填报","费用填报"};
+    public static String[] pmFunctions = {"新增项目", "查看相关人员工时","请假填报","费用填报","代填日报"};
+    public static String[] financeFunctions = {"人员成本管理", "添加人员", "导出人员", "导入人员", "请假填报","费用填报", "查看全部请假单"};
+    public static String[] pmoFunctions = {"新增项目","查看全部项目","管理全部项目","分类管理","导入项目","代填日报", "请假填报","费用填报",
+            "导出项目","查看资源分配", "基线成本项管理","查看成本基线","校正成本基线","查看合同金额"};
+    public static String[] corpLeaderFunctions = {"查看全部项目","导出项目","查看资源分配", "查看成本基线","查看合同金额", "请假填报","费用填报", "查看全部请假单"};
+    public static final HashMap<String, String[]> functionMaps = new HashMap();
+    static {
+        functionMaps.put("普通员工", employeeFunctions);
+        functionMaps.put("项目经理", pmFunctions);
+        functionMaps.put("财务管理员", financeFunctions);
+        functionMaps.put("项目管理员", pmoFunctions);
+        functionMaps.put("公司领导", corpLeaderFunctions);
+    }
+
+    @Resource
+    CompanyMapper companyMapper;
+    @Resource
+    SysRoleModuleMapper sysRoleModuleMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    TimeTypeMapper timeTypeMapper;
+    @Resource
+    SysRoleMapper sysRoleMapper;
+    @Resource
+    SysModuleMapper sysModuleMapper;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+    @Resource
+    SysRoleFunctionMapper sysRoleFunctionMapper;
+    @Resource
+    SysRoleModuleService sysRoleModuleService;
+    @Resource
+    SysRoleFunctionService sysRoleFunctionService;
+    @Resource
+    UserService userService;
+
+
+    @Override
+    public SysRole generateDefaultRoles(Integer companyId) {
+        Company company = companyMapper.selectById(companyId);
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        String[] roles = Constant.ROLE_NAMES;
+        SysRole sManager = null;
+
+        //按照公司开通的模块进行匹配
+        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<SysModule>().eq("package_time", 1);
+        if (company.getPackageProject() == 1) {
+            queryWrapper.or().eq("package_project", 1);
+        }
+        if (company.getPackageOa() == 1) {
+            queryWrapper.or().eq("package_oa", 1);
+        }
+        if (company.getPackageExpense() == 1) {
+            queryWrapper.or().eq("package_expense", 1);
+        }
+        if (company.getPackageCustomer() == 1) {
+            queryWrapper.or().eq("package_customer", 1);
+        }
+        if (company.getPackageEngineering() == 1) {
+            queryWrapper.or().eq("package_engineering", 1);
+        }
+        if (company.getPackageContract() == 1) {
+            queryWrapper.or().eq("package_contract", 1);
+        }
+        if (company.getPackageEtimecard()== 1) {
+            queryWrapper.or().eq("package_etimecard", 1);
+        }
+        if (company.getPackageFinance() == 1) {
+            queryWrapper.or().eq("package_finance", 1);
+        }
+        if (timeType.getReportWorkflow() == 1) {
+            queryWrapper.or().eq("report_workflow", 1);
+        }
+        queryWrapper.orderByAsc("orderitem");
+
+        List<SysModule> modules = sysModuleMapper.selectList(queryWrapper);
+
+        QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
+        if (company.getPackageProject() == 1) {
+            functionQueryWrapper.or().eq("package_project", 1);
+        }
+        if (company.getPackageOa() == 1) {
+            functionQueryWrapper.or().eq("package_oa", 1);
+        }
+        if (company.getPackageExpense() == 1) {
+            functionQueryWrapper.or().eq("package_expense", 1);
+        }
+        if (company.getPackageCustomer() == 1) {
+            functionQueryWrapper.or().eq("package_customer", 1);
+        }
+        if (company.getPackageEngineering() == 1) {
+            functionQueryWrapper.or().eq("package_engineering", 1);
+        }
+        if (company.getPackageContract() == 1) {
+            functionQueryWrapper.or().eq("package_contract", 1);
+        }
+        if (company.getPackageEtimecard()== 1) {
+            functionQueryWrapper.or().eq("package_etimecard", 1);
+        }
+        if (company.getPackageFinance() == 1) {
+            functionQueryWrapper.or().eq("package_finance", 1);
+        }
+        functionQueryWrapper.orderByAsc("seq");
+
+        List<SysFunction> functions = sysFunctionMapper.selectList(functionQueryWrapper);
+        List<SysRole> companyRoles = sysRoleMapper.selectList(new QueryWrapper<SysRole>().eq("company_id", company.getId()));
+        for (String str : roles) {
+            if ("无".equals(str)) {
+                continue;
+            }
+            if (companyRoles.stream().anyMatch(r->r.getRolename().equals(str))) {
+                //已经创建的就跳过
+                continue;
+            }
+            if ("超级管理员".equals(str)) {
+                sManager = generateSuperManagerRole(company, modules, functions);
+            } else if ("系统管理员".equals(str)) {
+                generateRole(str, company, modules, functions);
+            } else {
+                //其他角色按照过滤的来生成
+                List<SysModule> filteredModules = modules.stream().filter(
+                        m->Arrays.stream(moduleMaps.get(str)).anyMatch(curModule->curModule.equals(m.getName()))
+                ).collect(Collectors.toList());
+                List<SysFunction> filteredFunctions = functions.stream().filter(
+                        m->Arrays.stream(functionMaps.get(str)).anyMatch(curModule->curModule.equals(m.getName()))
+                ).collect(Collectors.toList());
+
+                generateRole(str, company, filteredModules, filteredFunctions);
+            }
+        }
+        //查找之前的用户,赋予相关的roleId
+        updateOldUserRole(companyId);
+        return sManager;
+    }
+
+    private void updateOldUserRole(int companyId) {
+        String[] oldRoles = Constant.ROLE_NAMES;
+        List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        List<SysRole> allRoles = sysRoleMapper.selectList(new QueryWrapper<SysRole>().eq("company_id", companyId));
+        List<User> updateUserList = new ArrayList<>();
+        for (User old : allUsers) {
+            User newUser = new User();
+            newUser.setId(old.getId());
+            String roleName = oldRoles[old.getRole()];
+            Optional<SysRole> first = allRoles.stream().filter(role->role.getRolename().equals(roleName)).findFirst();
+            if (first.isPresent()) {
+                newUser.setRoleId(first.get().getId());
+                newUser.setRoleName(roleName);
+                updateUserList.add(newUser);
+            }
+        }
+        if (updateUserList.size() > 0) {
+            userService.updateBatchById(updateUserList);
+        }
+    }
+
+    //生成超级管理员的角色权限
+    private SysRole generateSuperManagerRole(Company company, List<SysModule> modules, List<SysFunction> functions) {
+        SysRole smanager = new SysRole();
+        smanager.setCompanyId(company.getId());
+        smanager.setRolename(Constant.ROLE_SUPER_MANAGER);
+        smanager.setRoleDescribe("超级管理员具备全部系统权限");
+        sysRoleMapper.insert(smanager);
+        //授予全部菜单和功能
+        List<SysRoleModule> rmList = new ArrayList<>();
+        for (SysModule module : modules) {
+            SysRoleModule rm = new SysRoleModule();
+            rm.setModuleId(module.getId());
+            rm.setRoleId(smanager.getId());
+            rmList.add(rm);
+        }
+        sysRoleModuleService.saveBatch(rmList);
+
+        List<SysRoleFunction> rfList = new ArrayList<>();
+        for (SysFunction function : functions) {
+            SysRoleFunction rf = new SysRoleFunction();
+            rf.setFunctionId(function.getId());
+            rf.setRoleId(smanager.getId());
+            rfList.add(rf);
+        }
+        sysRoleFunctionService.saveBatch(rfList);
+
+        return smanager;
+    }
+
+    private void generateRole(String roleName, Company company, List<SysModule> modules, List<SysFunction> functions) {
+        SysRole role = new SysRole();
+        role.setCompanyId(company.getId());
+        role.setRolename(roleName);
+        role.setRoleDescribe(roleName);
+        if ("普通员工".equals(roleName)) {
+            role.setIsDefault(1);
+        }
+        sysRoleMapper.insert(role);
+        //授予全部菜单和功能
+
+        List<SysRoleModule> rmList = new ArrayList<>();
+        for (SysModule module : modules) {
+            SysRoleModule rm = new SysRoleModule();
+            rm.setModuleId(module.getId());
+            rm.setRoleId(role.getId());
+            rmList.add(rm);
+        }
+        sysRoleModuleService.saveBatch(rmList);
+
+        List<SysRoleFunction> rfList = new ArrayList<>();
+        for (SysFunction function : functions) {
+            SysRoleFunction rf = new SysRoleFunction();
+            rf.setFunctionId(function.getId());
+            rf.setRoleId(role.getId());
+            rfList.add(rf);
+        }
+        sysRoleFunctionService.saveBatch(rfList);
+
+    }
+
 }

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

@@ -10,8 +10,7 @@ import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
-import com.management.platform.service.ReportService;
-import com.management.platform.service.UserService;
+import com.management.platform.service.*;
 import com.management.platform.util.*;
 import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
 import me.chanjar.weixin.mp.api.WxMpService;
@@ -76,7 +75,20 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
     @Autowired
     private RestTemplate restTemplate;
-
+    @Resource
+    private SysRoleModuleMapper sysRoleModuleMapper;
+    @Resource
+    private SysRoleService sysRoleService;
+    @Resource
+    private SysRoleFunctionMapper sysRoleFunctionMapper;
+    @Resource
+    private SysModuleMapper sysModuleMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
+    @Resource
+    private SysRoleModuleService sysRoleModuleService;
+    @Resource
+    private SysRoleFunctionService sysRoleFunctionService;
     @Resource
     private ParticipationMapper participationMapper;
     @Resource
@@ -107,6 +119,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private TaskMapper taskMapper;
     @Resource
     private ProjectAuditorMapper projectAuditorMapper;
+    @Resource
+    private SysRoleMapper sysRoleMapper;
     //登录网页端
     @Override
     public HttpRespMsg loginAdmin(String username, String password) {
@@ -143,6 +157,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             UserVO userVO = new UserVO().setCompanyName(company.getCompanyName());
             userVO.setCompany(company);
             BeanUtils.copyProperties(userList.get(0), userVO);
+            if (userVO.getRoleId() == null || userVO.getRoleId() == 0) {
+                httpRespMsg.setError("请先联系管理员为您分配角色");
+                return httpRespMsg;
+            }
             //还要多返回一个公司名字
             userVO.setPassword("");
             LocalDateTime remainingTime = company.getExpirationDate() == null ? LocalDateTime.now() : company.getExpirationDate();
@@ -159,6 +177,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
             }
             userVO.setHasAuditDept(num>0);
+            //获取当前角色的权限菜单
+            getUserRoleMenu(userVO);
+
             httpRespMsg.data = userVO;
         } else {
             httpRespMsg.setError("密码错误");
@@ -166,54 +187,136 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return httpRespMsg;
     }
 
-    private boolean judgeIsLeader(String userId) {
-        int cnt = projectAuditorMapper.selectCount(new QueryWrapper<ProjectAuditor>().eq("auditor_id", userId));
-        return cnt>0;
-    }
 
-    //登录PC端
-    @Override
-    public HttpRespMsg loginEmployee(String username, String password) {
-        HttpRespMsg httpRespMsg = new HttpRespMsg();
-        //根据电话号码获取账号信息
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("phone", username));
-        if (userList.size() == 0) {
-            //未检索到账号时
-            httpRespMsg.setError("账号未注册");
-        } else if (userList.size() > 1) {
-            //检索到两个及以上账号时
-            httpRespMsg.setError("账号重名");
-        } else if (MD5Util.getPassword(password).equals(userList.get(0).getPassword())) {
-            //查看该公司非会员公司,只能允许试用三天,超时不可登录
-            Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", userList.get(0).getCompanyId()));
-            //公司未办理会员
-            if (null != company.getExpirationDate()) {
-                if (0 == company.getSetMeal()) {
-                    //未办理会员
-                    if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
-                        httpRespMsg.setError("账号试用已到期,请联系客服。");
-                        return httpRespMsg;
-                    }
-                } else {
-                    if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
-                        httpRespMsg.setError("账号会员已到期,请联系客服。");
-                        return httpRespMsg;
-                    }
-                }
+    public void getUserRoleMenu(UserVO user) {
+        Integer roleId = user.getRoleId();
+        //获取公司的套餐
+        Company company = companyMapper.selectById(user.getCompanyId());
+        TimeType timeType = timeTypeMapper.selectById(company.getId());
+        //按照公司开通的模块进行匹配
+        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<SysModule>().eq("package_time", 1);
+        if (company.getPackageProject() == 1) {
+            queryWrapper.or().eq("package_project", 1);
+        }
+        if (company.getPackageOa() == 1) {
+            queryWrapper.or().eq("package_oa", 1);
+        }
+        if (company.getPackageExpense() == 1) {
+            queryWrapper.or().eq("package_expense", 1);
+        }
+        if (company.getPackageCustomer() == 1) {
+            queryWrapper.or().eq("package_customer", 1);
+        }
+        if (company.getPackageEngineering() == 1) {
+            queryWrapper.or().eq("package_engineering", 1);
+        }
+        if (company.getPackageContract() == 1) {
+            queryWrapper.or().eq("package_contract", 1);
+        }
+        if (company.getPackageEtimecard()== 1) {
+            queryWrapper.or().eq("package_etimecard", 1);
+        }
+        if (company.getPackageFinance() == 1) {
+            queryWrapper.or().eq("package_finance", 1);
+        }
+        if (timeType.getReportWorkflow() == 1) {
+            queryWrapper.or().eq("report_workflow", 1);
+        }
+        queryWrapper.orderByAsc("orderitem");
+
+        //返回菜单
+        List<SysRoleModule> rModules = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", roleId));
+        System.out.println("============角色选中的模块有========");
+        System.out.println(rModules);
+
+        List<Integer> ids = rModules.stream().map(SysRoleModule::getModuleId).collect(Collectors.toList());
+        //项目报告审核模块,如果参与日报的审核,需要自动加上
+        if (user.isLeader() || user.isHasAuditDept()) {
+            SysModule projectAuditModule = sysModuleMapper.selectOne(new QueryWrapper<SysModule>().eq("name", "项目报告审核"));
+            if (!ids.contains(projectAuditModule.getId())) {
+                ids.add(projectAuditModule.getId());
             }
-            //检测密码正确时
-            UserVO userVO = new UserVO().setCompanyName(company.getCompanyName());
-            BeanUtils.copyProperties(userList.get(0), userVO);
-            //还要多返回一个公司名字
-            LocalDateTime remainingTime = company.getExpirationDate() == null ? LocalDateTime.now() : company.getExpirationDate();
-            userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
-                    LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
-            userVO.setPassword("");
-            httpRespMsg.data = userVO;
+        }
+
+        System.out.println(ids);
+        List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
+
+        //过滤一下,这个角色选中的模块
+        moduleList = moduleList.stream().filter(m->ids.contains(m.getId())).collect(Collectors.toList());
+        if (company.getPackageEngineering() == 1) {
+            //生成虚拟的两个审核放进去
+            SysModule proModule = new SysModule();
+            proModule.setName("专业审核");
+            proModule.setPath("/reviewProfession");
+            proModule.setId(0);
+            moduleList.add(1,proModule);
+            SysModule deptModule = new SysModule();
+            deptModule.setName("部门审核");
+            deptModule.setPath("/reviewDepartment");
+            deptModule.setId(0);
+            moduleList.add(2,deptModule);
+        }
+        //组装层级关系,默认只有两级
+        List<SysModule> menuList = new ArrayList<>();
+        for (SysModule module : moduleList) {
+            if (module.getParentId() == null) {
+                menuList.add(module);
+            }
+        }
+        for (SysModule mainMenu : menuList) {
+            List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
+            mainMenu.setChildren(list);
+        }
+        user.setModuleList(menuList);
+        //此处返回权限集合
+        List<Integer> functionIdList = new ArrayList<>();
+        //获取角色所有的功能id
+        List<SysRoleFunction> funList = sysRoleFunctionMapper.selectList(new QueryWrapper<SysRoleFunction>()
+                .eq("role_id", roleId));
+        for (SysRoleFunction sysRoleFunction : funList) {
+            functionIdList.add(sysRoleFunction.getFunctionId());
+        }
+        if (functionIdList.size() > 0) {
+            //根据功能id获取可用的操作代码
+            QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
+            if (company.getPackageProject() == 1) {
+                functionQueryWrapper.or().eq("package_project", 1);
+            }
+            if (company.getPackageOa() == 1) {
+                functionQueryWrapper.or().eq("package_oa", 1);
+            }
+            if (company.getPackageExpense() == 1) {
+                functionQueryWrapper.or().eq("package_expense", 1);
+            }
+            if (company.getPackageCustomer() == 1) {
+                functionQueryWrapper.or().eq("package_customer", 1);
+            }
+            if (company.getPackageEngineering() == 1) {
+                functionQueryWrapper.or().eq("package_engineering", 1);
+            }
+            if (company.getPackageContract() == 1) {
+                functionQueryWrapper.or().eq("package_contract", 1);
+            }
+            if (company.getPackageEtimecard()== 1) {
+                functionQueryWrapper.or().eq("package_etimecard", 1);
+            }
+            if (company.getPackageFinance() == 1) {
+                functionQueryWrapper.or().eq("package_finance", 1);
+            }
+            functionQueryWrapper.orderByAsc("seq");
+
+            List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
+            functionList = functionList.stream().filter(f->functionIdList.contains(f.getId())).collect(Collectors.toList());
+            user.setFunctionList(functionList);
         } else {
-            httpRespMsg.setError("密码错误");
+            user.setFunctionList(new ArrayList<>());
         }
-        return httpRespMsg;
+    }
+
+
+    private boolean judgeIsLeader(String userId) {
+        int cnt = projectAuditorMapper.selectCount(new QueryWrapper<ProjectAuditor>().eq("auditor_id", userId));
+        return cnt>0;
     }
 
     //获取用户信息
@@ -256,25 +359,25 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
     //获取员工的列表
     @Override
-    public HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer status, Integer role, Integer pageIndex, Integer pageSize, HttpServletRequest request) {
+    public HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer status, Integer roleId, Integer pageIndex, Integer pageSize, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
-            Integer total;
+            long total;
             List<Map<String, Object>> list;
             Page<User> page = new Page<>(pageIndex, pageSize);
             if (departmentId == -1) {
                 //单独查找全部
-                list = userMapper.getUserByDepartment(page, companyId, null, keyword, status, role);
-                total = userMapper.countUserByDepartment(companyId, null, keyword, status, role);
+                list = userMapper.getUserByDepartment(page, companyId, null, keyword, status, roleId);
+                total = page.getTotal();
             } else if (departmentId == 0) {
                 //单独查找0, 未分配的
-                list = userMapper.getUserByDepartment(page, companyId, departmentId, keyword, status, role);
-                total = userMapper.countUserByDepartment(companyId, departmentId, keyword, status, role);
+                list = userMapper.getUserByDepartment(page, companyId, departmentId, keyword, status, roleId);
+                total = page.getTotal();
             } else {
                 //范围查找
-                list = userMapper.getUserByDepartmentList(page, companyId, getBranchDepartment(departmentId, companyId), keyword, status, role);
-                total = userMapper.countUserByDepartmentList(companyId, getBranchDepartment(departmentId, companyId), keyword, status, role);
+                list = userMapper.getUserByDepartmentList(page, companyId, getBranchDepartment(departmentId, companyId), keyword, status, roleId);
+                total = page.getTotal();
             }
             Map<String, Object> resultMap = new HashMap<>();
             resultMap.put("records", list);
@@ -403,27 +506,27 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 company.setPackageEngineering(1);
             }
             companyMapper.insert(company);
+
             //生成工作时长
             TimeType timeType = new TimeType();
             timeType.setCompanyId(company.getId());
             timeTypeMapper.insert(timeType);
-            if (userMapper.selectCount(new QueryWrapper<User>().eq("company_id", company.getId())) >=
-                    (companyMapper.selectById(company.getId()).getStaffCountMax())) {
-                httpRespMsg.setError("公司人员已达上限");
-                return httpRespMsg;
-            }
-            //然后生成一个负责人
+
+            //生成超级管理员角色
+            SysRole smanager = sysRoleService.generateDefaultRoles(company.getId());
+
+            //然后生成一个超级管理员
             Long id = SnowFlake.nextId();
             User user = new User()
                     .setId(id.toString())
                     .setName(name)
                     .setPassword(MD5Util.getPassword(password))
                     .setPhone(phone)
-                    .setRole(1)
+                    .setRole(smanager.getId())
                     .setColor(ColorUtil.randomColor())
                     .setCompanyId(company.getId());
             //生成项目的成本基线默认条目
-            String[] array = com.management.platform.util.Constant.DEFAULT_BASE_COST_ITEMS;
+            String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
             for (String baseItem : array) {
                 ProjectBasecostSetting setting = new ProjectBasecostSetting();
                 setting.setName(baseItem);
@@ -440,9 +543,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return httpRespMsg;
     }
 
+
     //新增或修改用户
     @Override
-    public HttpRespMsg insertUser(String targetId, String name, String phone, Integer role, Double monthCost, Double cost,
+    public HttpRespMsg insertUser(String targetId, String name, String phone, Integer roleId, Double monthCost, Double cost,
                                   Integer departmentId, Integer salaryType, String costApplyDate, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
@@ -452,7 +556,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             BigDecimal monthCostValue = (monthCost == null ? BigDecimal.valueOf(0) : BigDecimal.valueOf(monthCost));
             if (targetId == null) {
                 //新增
-                if (role == 1) {
+                if (roleId == 1) {
                     httpRespMsg.setError("不可新增负责人");
                 } else {
                     //电话号码列 检测重名
@@ -471,7 +575,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                                     .setName(name)
                                     .setPassword(MD5Util.getPassword("000000"))
                                     .setPhone(phone)
-                                    .setRole(role)
+                                    .setRoleId(roleId)
+                                    .setRoleName(sysRoleMapper.selectById(roleId).getRolename())
                                     .setCompanyId(creator.getCompanyId())
                                     .setMonthCost(monthCostValue)
                                     .setCost(costValue)
@@ -511,7 +616,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 userMapper.updateById(oldUser
                         .setName(name)
                         .setPhone(phone)
-                        .setRole(role)
+                        .setRoleId(roleId)
+                        .setRoleName(sysRoleMapper.selectById(roleId).getRolename())
                         .setMonthCost(monthCostValue)
                         .setCost(costValue)
                         .setCostApplyDate(costApplyDate)
@@ -626,6 +732,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         int canImportNum = (int)(maxCnt - cnt);
         //查询工作时长设置
         TimeType time = timeTypeMapper.selectById(companyId);
+        //默认角色
+        int roleId = 0;
+        List<SysRole> droleList = sysRoleMapper.selectList(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+        if (droleList.size() > 0) {
+            roleId = droleList.get(0).getId();
+        }
         BigDecimal monthHours = time.getMonthDays().multiply(new BigDecimal(time.getAllday()));
         //然后处理文件
         String fileName = multipartFile.getOriginalFilename();
@@ -736,7 +848,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         .setName(name)
                         .setPassword(MD5Util.getPassword("000000"))
                         .setPhone(phone)
-                        .setRole(0)
+                        .setRoleId(roleId)
                         .setDepartmentId(deptId)
                         .setDepartmentCascade(deptCascade)
                         .setColor(ColorUtil.randomColor())
@@ -959,6 +1071,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
                         LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
                 userVO.setLeader(judgeIsLeader(userVO.getId()));
+
+                getUserRoleMenu(userVO);
                 respMsg.data = userVO;
             } else {
                 respMsg.setError(OpenidJSONO.getString("errcode") + ":" + OpenidJSONO.getString("errmsg"));
@@ -1042,7 +1156,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 HSSFRow row = sheet.createRow(rowNum);
                 row.createCell(0).setCellValue(rowNum);
                 row.createCell(1).setCellValue(item.getName());
-                row.createCell(2).setCellValue(Constant.ROLE_NAMES[item.getRole()]);
+                row.createCell(2).setCellValue(item.getRoleName());
                 row.createCell(3).setCellValue(item.getPhone());
                 row.createCell(4).setCellValue(item.getDepartmentName());
                 row.createCell(5).setCellValue(item.getMonthCost()==null? 0 : item.getMonthCost().intValue());
@@ -1295,6 +1409,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
                 //检测是否是项目经理,项目经理有审核功能权限
                 userVO.setLeader(judgeIsLeader(userVO.getId()));
+                getUserRoleMenu(userVO);
                 respMsg.data = userVO;
             } else {
                 respMsg.setError(OpenidJSONO.getString("errcode") + ":" + OpenidJSONO.getString("errmsg"));
@@ -1344,6 +1459,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
         }
         userVO.setHasAuditDept(num>0);
+        //获取当前角色的权限菜单
+        getUserRoleMenu(userVO);
         httpRespMsg.data = userVO;
         return httpRespMsg;
     }
@@ -1373,6 +1490,31 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             msg.setError("人员不能为空");
         }
 
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg batchUpdateRole(String userIds, Integer roleId, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (!StringUtils.isEmpty(userIds)) {
+            List<String> array = JSONArray.parseArray(userIds, String.class);
+            if (array.size() > 0) {
+                List<User> userList = new ArrayList<User>();
+                SysRole role = sysRoleMapper.selectById(roleId);
+                for (String id : array) {
+                    User u = new User();
+                    u.setId(id);
+                    u.setRoleId(roleId);
+                    u.setRoleName(role.getRolename());
+                    userList.add(u);
+                }
+                updateBatchById(userList);
+            } else {
+                msg.setError("人员不能为空");
+            }
+        } else {
+            msg.setError("人员不能为空");
+        }
 
         return msg;
     }

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

@@ -1,351 +1,351 @@
-package com.management.platform.task;
-
-import java.time.LocalDate;
-import java.time.Period;
-import java.time.format.DateTimeFormatter;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.constant.Constant;
-import com.management.platform.entity.*;
-import com.management.platform.mapper.*;
-import com.management.platform.service.CompanyDingdingService;
-import com.management.platform.service.WxCorpInfoService;
-import com.management.platform.util.*;
-import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
-import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.format.annotation.DateTimeFormat;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * Author: 吴涛涛
- * Date : 2019 - 12 - 31 16:04
- * Description:<描述>
- * Version: 1.0
- */
-@EnableScheduling
-@Component
-public class TimingTask {
-
-    @Value("${wx.template_report_fill}")
-    public String TEMPLATE_REPORT_FILL;
-    @Value("${wx.template_project_deadline}")
-    public String TEMPLATE_PROJECT_DEADLINE;
-    @Value("${wx.app_id}")
-    public String appId;
-    @Value("${wx.app_secret}")
-    public String appSecret;
-    @Autowired
-    private RedisUtil redisUtil;
-
-    @Resource
-    private ScreenshotMapper screenshotMapper;
-    @Resource
-    private TimeTypeMapper timeTypeMapper;
-    @Resource
-    private UserMapper userMapper;
-    @Resource
-    private DepartmentMapper departmentMapper;
-    @Resource
-    private ReportMapper reportMapper;
-    @Resource
-    private WxCorpInfoService wxCorpInfoService;
-    @Resource
-    private WxCorpInfoMapper wxCorpInfoMapper;
-    @Value(value = "${upload.path}")
-    private String path;
-    @Resource
-    private ProjectMapper projectMapper;
-    @Resource
-    private CompanyDingdingService companyDingdingService;
-
-    //检查项目到期,距离到期时间3天内的,每天提醒
-    @Scheduled(cron = "0 0 10 ? * *")
-    private void projectDeadlineAlert() {
-        LocalDate start = LocalDate.now();
-        start = start.plusDays(1);
-        LocalDate end = LocalDate.now();
-        end = end.plusDays(3);
-        //获取未来3天内超期的项目
-        List<Project> list = projectMapper.selectList(new QueryWrapper<Project>().eq("status", 1).between("plan_end_date", start, end));
-        System.out.println("即将超期项目=="+list.size());
-
-        for (Project p : list) {
-
-            Period period = Period.between(start, p.getPlanEndDate());
-            int days = period.getDays();
-            List<Map<String, Object>> userList = userMapper.getProjectPushUserList(p.getId());
-            userList.forEach(u->{
-                if (u.get("corpwxUserid") != null) {
-                    //TODO: 推送到企业微信
-//                    String corpUid = (String) u.get("corpwxUserid");
-//                    wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, "请及时填写今日的工作报告哦");
-                } else {
-                    pushProjectNotify((String)u.get("wxOpenid"), p.getProjectName(), days, p.getPlanEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-                }
-            });
-        }
-    }
-
-    //每天7点同步昨天的企业微信考勤考勤打卡记录
-    @Scheduled(cron = "0 0 7 ? * *")
-    private void synCorpWXCardTime() {
-        LocalDateTime yestoday = LocalDateTime.now().minusDays(1);
-        yestoday = yestoday.withHour(0).withMinute(0).withSecond(0).withNano(0);
-
-        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, yestoday, yestoday);
-        }
-    }
-
-    //每周日晚上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() {
-        LocalDateTime lastMonth = LocalDateTime.now().minusMonths(1);
-        LocalDateTime start = lastMonth.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
-        LocalDateTime now = LocalDateTime.now().withDayOfMonth(1);
-        LocalDateTime end = now.minusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
-        System.out.println("开始同步上个月的考勤记录");
-        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);
-        }
-    }
-
-    //发送上周填写的工时统计
-    @Scheduled(cron = "0 0 8 ? * *")
-    private void lastWeekFillTimeAlert() {
-        //每日检查是否是周一,提醒上周工时汇总
-        LocalDate curDay = LocalDate.now();
-        if (curDay.getDayOfWeek().getValue() == 1) {
-            List<User> allUser = userMapper.selectList(new QueryWrapper<User>().isNotNull("wx_openid"));
-            for (User u : allUser) {
-                //取上周
-                LocalDate lastWeek = curDay.minusWeeks(1);
-
-                int weekDay = lastWeek.getDayOfWeek().getValue();
-                LocalDate monday = lastWeek.minusDays(weekDay-1);
-                LocalDate sunday = monday.plusDays(6);
-                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", u.getId()).between("create_date", monday, sunday));
-                List<Integer> pids = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
-                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", pids));
-                String collect = projectList.stream().map(Project::getProjectName).collect(Collectors.joining(","));
-                //计算总工时
-                double sum = reportList.stream().mapToDouble(Report::getWorkingTime).sum();
-                double waiting = reportList.stream().filter(r -> r.getState() == 0).mapToDouble(Report::getWorkingTime).sum();
-                double reject = reportList.stream().filter(r -> r.getState() == 2).mapToDouble(Report::getWorkingTime).sum();
-                double pass = reportList.stream().filter(r -> r.getState() == 1).mapToDouble(Report::getWorkingTime).sum();
-                String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + sum+"小时。其中审核通过"+pass
-                        +"小时, 待审核"+waiting+"小时,驳回"+reject+"小时。";
-                pushLastWeekReportFill(u, str);
-            }
-        }
-    }
-
-    //每分钟校验是否有需要提醒的填报
-    @Scheduled(fixedRate = 60 * 1000)
-    private void process() {
-        LocalDateTime now = LocalDateTime.now();
-        LocalDate localDate = LocalDate.now();
-
-        //判断是否是工作日,非工作日不提醒
-        if (!WorkDayCalculateUtils.isWorkDay(localDate)) {
-            return;
-        }
-        DateTimeFormatter dt = DateTimeFormatter.ofPattern("HH:mm");
-        String str = dt.format(now);
-        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().isNotNull("alert_time")
-                .ge("alert_time", str));
-
-        typeList.forEach(t->{
-            if (str.equals(t.getAlertTime())) {
-                //发送推送提醒
-                List<Map<String, Object>> userList = userMapper.getPushUserList(t.getCompanyId());
-                List<WxCorpInfo> cpList = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", t.getCompanyId()));
-                userList.forEach(u->{
-                    if (u.get("corpwxUserid") != null) {
-                        //推送到企业微信
-                        String corpUid = (String) u.get("corpwxUserid");
-                        wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, t.getAlertMsg());
-                    } else if (u.get("wxOpenid") != null) {
-                        push(u, t.getAlertMsg());
-                    }
-                });
-            }
-        });
-
-        List<Map<String, Object>> dingdingUserList = userMapper.getPushDingdingUserList(str);
-        System.out.println("=============查询钉钉推送未填提醒的人员列表=====, size=" + dingdingUserList.size());
-
-        //钉钉平台的用批量发送, 每分钟5000个
-        int minuteSize = 5000;
-        int minuteTimes = dingdingUserList.size()/minuteSize + (dingdingUserList.size()%minuteSize==0?0:1);
-        for (int m = 0; m < minuteTimes; m++) {
-            int startIndex = m*minuteSize;
-            int endIndex = (m+1)*minuteSize;
-            if (endIndex > dingdingUserList.size()) {
-                endIndex = dingdingUserList.size();
-            }
-            final List<Map<String, Object>> curUserList = dingdingUserList.subList(startIndex, endIndex);
-            final int curm = m;
-            //调用新的线程发送
-            new Thread(() -> {
-                if (curm > 0) {
-                    try {
-                        //每间隔60秒发送一次
-                        System.out.println("开始间隔了60秒===");
-                        Thread.currentThread().sleep(60000);
-                    } catch (InterruptedException e) {
-                        e.printStackTrace();
-                    }
-                }
-                System.out.println("发送钉钉漏填提醒:" + LocalDateTime.now().toString() + ", size=" + curUserList.size());
-                //按照company组装,同一个company批量发送,最大不超过1000
-                Integer companyId = null;
-                Long agentId = null;
-                String alertMsg = null;
-                List<String> dingUid = new ArrayList<>();
-                int count = 0;
-                for (int i=0;i<curUserList.size(); i++) {
-                    count++;
-                    Map<String, Object> item = curUserList.get(i);
-                    Integer curCompanyId = (Integer)item.get("companyId");
-                    dingUid.add((String)item.get("dingdingUserid"));
-                    if (companyId == null) {
-                        companyId = curCompanyId;
-                        agentId = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId)).getAgentId();
-                        alertMsg = timeTypeMapper.selectById(companyId).getAlertMsg();
-                    }
-
-                    if (i == curUserList.size() -1 || curCompanyId.intValue() != (int)curUserList.get(i+1).get("companyId")
-                                || count == 1000) {
-                        String idStr = dingUid.stream().collect(Collectors.joining(","));
-                        System.out.println("发送给==="+idStr);
-                        companyDingdingService.sendFillReportAlertMsg(companyId, agentId, alertMsg, idStr);
-                        count = 0;
-                        companyId = null;
-                        dingUid.clear();
-                    }
-                }
-            }).start();
-        }
-    }
-    //推送项目即将逾期通知
-    public void pushProjectNotify(String wxOpenid, String projectName, int days, String endDate) {
-        //1,配置
-        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
-        wxStorage.setAppId(appId);
-        wxStorage.setSecret(appSecret);
-        WxMpService wxMpService = new WxMpServiceImpl();
-        wxMpService.setWxMpConfigStorage(wxStorage);
-
-        //2,推送消息
-        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
-                .toUser(wxOpenid)//要推送的用户openid
-                .templateId(TEMPLATE_PROJECT_DEADLINE)//模版id
-                .build();
-        //3,如果是正式版发送模版消息,这里需要配置你的信息
-        templateMessage.addData(new WxMpTemplateData("first", "项目还有"+days+"天到期", "#FF00FF"));
-        templateMessage.addData(new WxMpTemplateData("keyword1", projectName, "#000000"));
-        templateMessage.addData(new WxMpTemplateData("keyword2", endDate, "#000000"));
-        templateMessage.addData(new WxMpTemplateData("remark", "如有您参与的任务,请按时完成,谢谢", "#000000"));
-        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
-        try {
-            System.out.println("======推送消息===");
-            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
-        } catch (Exception e) {
-            System.out.println("推送失败:" + e.getMessage());
-            e.printStackTrace();
-        }
-    }
-
-    //推送日报未填消息
-    public void push(Map<String, Object> user, String alertMsg) {
-        //1,配置
-        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
-        wxStorage.setAppId(appId);
-        wxStorage.setSecret(appSecret);
-        WxMpService wxMpService = new WxMpServiceImpl();
-        wxMpService.setWxMpConfigStorage(wxStorage);
-
-        //2,推送消息
-        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
-                .toUser((String)user.get("wxOpenid"))//要推送的用户openid
-                .templateId(TEMPLATE_REPORT_FILL)//模版id
-                .url("http://mobworktime.ttkuaiban.com/#/edit")//点击模版消息要访问的网址
-                .build();
-        //3,如果是正式版发送模版消息,这里需要配置你的信息
-        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
-        templateMessage.addData(new WxMpTemplateData("keyword1", (String)user.get("name"), "#000000"));
-        templateMessage.addData(new WxMpTemplateData("keyword2", (String)user.get("departmentName"), "#000000"));
-        templateMessage.addData(new WxMpTemplateData("remark", "请尽快填报", "#000000"));
-        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
-        try {
-            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
-        } catch (Exception e) {
-            System.out.println("推送失败:" + e.getMessage());
-            e.printStackTrace();
-        }
-
-    }
-
-
-    //推送上周填写的日报工时情况
-    public void pushLastWeekReportFill(User user, String alertMsg) {
-        //1,配置
-        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
-        wxStorage.setAppId(appId);
-        wxStorage.setSecret(appSecret);
-        WxMpService wxMpService = new WxMpServiceImpl();
-        wxMpService.setWxMpConfigStorage(wxStorage);
-
-        //2,推送消息
-        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
-                .toUser(user.getWxOpenid())//要推送的用户openid
-                .templateId(TEMPLATE_REPORT_FILL)//模版id
-                .url("http://mobworktime.ttkuaiban.com/")//点击模版消息要访问的网址
-                .build();
-        //3,如果是正式版发送模版消息,这里需要配置你的信息
-        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
-        templateMessage.addData(new WxMpTemplateData("keyword1", user.getName(), "#000000"));
-        templateMessage.addData(new WxMpTemplateData("keyword2", user.getDepartmentName(), "#000000"));
-        templateMessage.addData(new WxMpTemplateData("remark", "-", "#000000"));
-        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
-        try {
-            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
-        } catch (Exception e) {
-            System.out.println("推送失败:" + e.getMessage());
-            e.printStackTrace();
-        }
-
-    }
-}
+//package com.management.platform.task;
+//
+//import java.time.LocalDate;
+//import java.time.Period;
+//import java.time.format.DateTimeFormatter;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.management.platform.constant.Constant;
+//import com.management.platform.entity.*;
+//import com.management.platform.mapper.*;
+//import com.management.platform.service.CompanyDingdingService;
+//import com.management.platform.service.WxCorpInfoService;
+//import com.management.platform.util.*;
+//import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
+//import me.chanjar.weixin.mp.api.WxMpService;
+//import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+//import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
+//import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.format.annotation.DateTimeFormat;
+//import org.springframework.scheduling.annotation.EnableScheduling;
+//import org.springframework.scheduling.annotation.Scheduled;
+//import org.springframework.stereotype.Component;
+//
+//import javax.annotation.Resource;
+//import java.time.LocalDateTime;
+//import java.util.*;
+//import java.util.stream.Collectors;
+//
+///**
+// * Author: 吴涛涛
+// * Date : 2019 - 12 - 31 16:04
+// * Description:<描述>
+// * Version: 1.0
+// */
+//@EnableScheduling
+//@Component
+//public class TimingTask {
+//
+//    @Value("${wx.template_report_fill}")
+//    public String TEMPLATE_REPORT_FILL;
+//    @Value("${wx.template_project_deadline}")
+//    public String TEMPLATE_PROJECT_DEADLINE;
+//    @Value("${wx.app_id}")
+//    public String appId;
+//    @Value("${wx.app_secret}")
+//    public String appSecret;
+//    @Autowired
+//    private RedisUtil redisUtil;
+//
+//    @Resource
+//    private ScreenshotMapper screenshotMapper;
+//    @Resource
+//    private TimeTypeMapper timeTypeMapper;
+//    @Resource
+//    private UserMapper userMapper;
+//    @Resource
+//    private DepartmentMapper departmentMapper;
+//    @Resource
+//    private ReportMapper reportMapper;
+//    @Resource
+//    private WxCorpInfoService wxCorpInfoService;
+//    @Resource
+//    private WxCorpInfoMapper wxCorpInfoMapper;
+//    @Value(value = "${upload.path}")
+//    private String path;
+//    @Resource
+//    private ProjectMapper projectMapper;
+//    @Resource
+//    private CompanyDingdingService companyDingdingService;
+//
+//    //检查项目到期,距离到期时间3天内的,每天提醒
+//    @Scheduled(cron = "0 0 10 ? * *")
+//    private void projectDeadlineAlert() {
+//        LocalDate start = LocalDate.now();
+//        start = start.plusDays(1);
+//        LocalDate end = LocalDate.now();
+//        end = end.plusDays(3);
+//        //获取未来3天内超期的项目
+//        List<Project> list = projectMapper.selectList(new QueryWrapper<Project>().eq("status", 1).between("plan_end_date", start, end));
+//        System.out.println("即将超期项目=="+list.size());
+//
+//        for (Project p : list) {
+//
+//            Period period = Period.between(start, p.getPlanEndDate());
+//            int days = period.getDays();
+//            List<Map<String, Object>> userList = userMapper.getProjectPushUserList(p.getId());
+//            userList.forEach(u->{
+//                if (u.get("corpwxUserid") != null) {
+//                    //TODO: 推送到企业微信
+////                    String corpUid = (String) u.get("corpwxUserid");
+////                    wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, "请及时填写今日的工作报告哦");
+//                } else {
+//                    pushProjectNotify((String)u.get("wxOpenid"), p.getProjectName(), days, p.getPlanEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+//                }
+//            });
+//        }
+//    }
+//
+//    //每天7点同步昨天的企业微信考勤考勤打卡记录
+//    @Scheduled(cron = "0 0 7 ? * *")
+//    private void synCorpWXCardTime() {
+//        LocalDateTime yestoday = LocalDateTime.now().minusDays(1);
+//        yestoday = yestoday.withHour(0).withMinute(0).withSecond(0).withNano(0);
+//
+//        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, yestoday, yestoday);
+//        }
+//    }
+//
+//    //每周日晚上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() {
+//        LocalDateTime lastMonth = LocalDateTime.now().minusMonths(1);
+//        LocalDateTime start = lastMonth.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+//        LocalDateTime now = LocalDateTime.now().withDayOfMonth(1);
+//        LocalDateTime end = now.minusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+//        System.out.println("开始同步上个月的考勤记录");
+//        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);
+//        }
+//    }
+//
+//    //发送上周填写的工时统计
+//    @Scheduled(cron = "0 0 8 ? * *")
+//    private void lastWeekFillTimeAlert() {
+//        //每日检查是否是周一,提醒上周工时汇总
+//        LocalDate curDay = LocalDate.now();
+//        if (curDay.getDayOfWeek().getValue() == 1) {
+//            List<User> allUser = userMapper.selectList(new QueryWrapper<User>().isNotNull("wx_openid"));
+//            for (User u : allUser) {
+//                //取上周
+//                LocalDate lastWeek = curDay.minusWeeks(1);
+//
+//                int weekDay = lastWeek.getDayOfWeek().getValue();
+//                LocalDate monday = lastWeek.minusDays(weekDay-1);
+//                LocalDate sunday = monday.plusDays(6);
+//                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", u.getId()).between("create_date", monday, sunday));
+//                List<Integer> pids = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
+//                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", pids));
+//                String collect = projectList.stream().map(Project::getProjectName).collect(Collectors.joining(","));
+//                //计算总工时
+//                double sum = reportList.stream().mapToDouble(Report::getWorkingTime).sum();
+//                double waiting = reportList.stream().filter(r -> r.getState() == 0).mapToDouble(Report::getWorkingTime).sum();
+//                double reject = reportList.stream().filter(r -> r.getState() == 2).mapToDouble(Report::getWorkingTime).sum();
+//                double pass = reportList.stream().filter(r -> r.getState() == 1).mapToDouble(Report::getWorkingTime).sum();
+//                String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + sum+"小时。其中审核通过"+pass
+//                        +"小时, 待审核"+waiting+"小时,驳回"+reject+"小时。";
+//                pushLastWeekReportFill(u, str);
+//            }
+//        }
+//    }
+//
+//    //每分钟校验是否有需要提醒的填报
+//    @Scheduled(fixedRate = 60 * 1000)
+//    private void process() {
+//        LocalDateTime now = LocalDateTime.now();
+//        LocalDate localDate = LocalDate.now();
+//
+//        //判断是否是工作日,非工作日不提醒
+//        if (!WorkDayCalculateUtils.isWorkDay(localDate)) {
+//            return;
+//        }
+//        DateTimeFormatter dt = DateTimeFormatter.ofPattern("HH:mm");
+//        String str = dt.format(now);
+//        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().isNotNull("alert_time")
+//                .ge("alert_time", str));
+//
+//        typeList.forEach(t->{
+//            if (str.equals(t.getAlertTime())) {
+//                //发送推送提醒
+//                List<Map<String, Object>> userList = userMapper.getPushUserList(t.getCompanyId());
+//                List<WxCorpInfo> cpList = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", t.getCompanyId()));
+//                userList.forEach(u->{
+//                    if (u.get("corpwxUserid") != null) {
+//                        //推送到企业微信
+//                        String corpUid = (String) u.get("corpwxUserid");
+//                        wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, t.getAlertMsg());
+//                    } else if (u.get("wxOpenid") != null) {
+//                        push(u, t.getAlertMsg());
+//                    }
+//                });
+//            }
+//        });
+//
+//        List<Map<String, Object>> dingdingUserList = userMapper.getPushDingdingUserList(str);
+//        System.out.println("=============查询钉钉推送未填提醒的人员列表=====, size=" + dingdingUserList.size());
+//
+//        //钉钉平台的用批量发送, 每分钟5000个
+//        int minuteSize = 5000;
+//        int minuteTimes = dingdingUserList.size()/minuteSize + (dingdingUserList.size()%minuteSize==0?0:1);
+//        for (int m = 0; m < minuteTimes; m++) {
+//            int startIndex = m*minuteSize;
+//            int endIndex = (m+1)*minuteSize;
+//            if (endIndex > dingdingUserList.size()) {
+//                endIndex = dingdingUserList.size();
+//            }
+//            final List<Map<String, Object>> curUserList = dingdingUserList.subList(startIndex, endIndex);
+//            final int curm = m;
+//            //调用新的线程发送
+//            new Thread(() -> {
+//                if (curm > 0) {
+//                    try {
+//                        //每间隔60秒发送一次
+//                        System.out.println("开始间隔了60秒===");
+//                        Thread.currentThread().sleep(60000);
+//                    } catch (InterruptedException e) {
+//                        e.printStackTrace();
+//                    }
+//                }
+//                System.out.println("发送钉钉漏填提醒:" + LocalDateTime.now().toString() + ", size=" + curUserList.size());
+//                //按照company组装,同一个company批量发送,最大不超过1000
+//                Integer companyId = null;
+//                Long agentId = null;
+//                String alertMsg = null;
+//                List<String> dingUid = new ArrayList<>();
+//                int count = 0;
+//                for (int i=0;i<curUserList.size(); i++) {
+//                    count++;
+//                    Map<String, Object> item = curUserList.get(i);
+//                    Integer curCompanyId = (Integer)item.get("companyId");
+//                    dingUid.add((String)item.get("dingdingUserid"));
+//                    if (companyId == null) {
+//                        companyId = curCompanyId;
+//                        agentId = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId)).getAgentId();
+//                        alertMsg = timeTypeMapper.selectById(companyId).getAlertMsg();
+//                    }
+//
+//                    if (i == curUserList.size() -1 || curCompanyId.intValue() != (int)curUserList.get(i+1).get("companyId")
+//                                || count == 1000) {
+//                        String idStr = dingUid.stream().collect(Collectors.joining(","));
+//                        System.out.println("发送给==="+idStr);
+//                        companyDingdingService.sendFillReportAlertMsg(companyId, agentId, alertMsg, idStr);
+//                        count = 0;
+//                        companyId = null;
+//                        dingUid.clear();
+//                    }
+//                }
+//            }).start();
+//        }
+//    }
+//    //推送项目即将逾期通知
+//    public void pushProjectNotify(String wxOpenid, String projectName, int days, String endDate) {
+//        //1,配置
+//        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
+//        wxStorage.setAppId(appId);
+//        wxStorage.setSecret(appSecret);
+//        WxMpService wxMpService = new WxMpServiceImpl();
+//        wxMpService.setWxMpConfigStorage(wxStorage);
+//
+//        //2,推送消息
+//        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+//                .toUser(wxOpenid)//要推送的用户openid
+//                .templateId(TEMPLATE_PROJECT_DEADLINE)//模版id
+//                .build();
+//        //3,如果是正式版发送模版消息,这里需要配置你的信息
+//        templateMessage.addData(new WxMpTemplateData("first", "项目还有"+days+"天到期", "#FF00FF"));
+//        templateMessage.addData(new WxMpTemplateData("keyword1", projectName, "#000000"));
+//        templateMessage.addData(new WxMpTemplateData("keyword2", endDate, "#000000"));
+//        templateMessage.addData(new WxMpTemplateData("remark", "如有您参与的任务,请按时完成,谢谢", "#000000"));
+//        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
+//        try {
+//            System.out.println("======推送消息===");
+//            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+//        } catch (Exception e) {
+//            System.out.println("推送失败:" + e.getMessage());
+//            e.printStackTrace();
+//        }
+//    }
+//
+//    //推送日报未填消息
+//    public void push(Map<String, Object> user, String alertMsg) {
+//        //1,配置
+//        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
+//        wxStorage.setAppId(appId);
+//        wxStorage.setSecret(appSecret);
+//        WxMpService wxMpService = new WxMpServiceImpl();
+//        wxMpService.setWxMpConfigStorage(wxStorage);
+//
+//        //2,推送消息
+//        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+//                .toUser((String)user.get("wxOpenid"))//要推送的用户openid
+//                .templateId(TEMPLATE_REPORT_FILL)//模版id
+//                .url("http://mobworktime.ttkuaiban.com/#/edit")//点击模版消息要访问的网址
+//                .build();
+//        //3,如果是正式版发送模版消息,这里需要配置你的信息
+//        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
+//        templateMessage.addData(new WxMpTemplateData("keyword1", (String)user.get("name"), "#000000"));
+//        templateMessage.addData(new WxMpTemplateData("keyword2", (String)user.get("departmentName"), "#000000"));
+//        templateMessage.addData(new WxMpTemplateData("remark", "请尽快填报", "#000000"));
+//        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
+//        try {
+//            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+//        } catch (Exception e) {
+//            System.out.println("推送失败:" + e.getMessage());
+//            e.printStackTrace();
+//        }
+//
+//    }
+//
+//
+//    //推送上周填写的日报工时情况
+//    public void pushLastWeekReportFill(User user, String alertMsg) {
+//        //1,配置
+//        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
+//        wxStorage.setAppId(appId);
+//        wxStorage.setSecret(appSecret);
+//        WxMpService wxMpService = new WxMpServiceImpl();
+//        wxMpService.setWxMpConfigStorage(wxStorage);
+//
+//        //2,推送消息
+//        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+//                .toUser(user.getWxOpenid())//要推送的用户openid
+//                .templateId(TEMPLATE_REPORT_FILL)//模版id
+//                .url("http://mobworktime.ttkuaiban.com/")//点击模版消息要访问的网址
+//                .build();
+//        //3,如果是正式版发送模版消息,这里需要配置你的信息
+//        templateMessage.addData(new WxMpTemplateData("first", alertMsg, "#FF00FF"));
+//        templateMessage.addData(new WxMpTemplateData("keyword1", user.getName(), "#000000"));
+//        templateMessage.addData(new WxMpTemplateData("keyword2", user.getDepartmentName(), "#000000"));
+//        templateMessage.addData(new WxMpTemplateData("remark", "-", "#000000"));
+//        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
+//        try {
+//            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+//        } catch (Exception e) {
+//            System.out.println("推送失败:" + e.getMessage());
+//            e.printStackTrace();
+//        }
+//
+//    }
+//}

+ 0 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/Constant.java

@@ -1,13 +0,0 @@
-package com.management.platform.util;
-
-public class Constant {
-    public static final int ROLE_EMPLOYEE = 0;
-    public static final int ROLE_MASTER = 1;
-    public static final int ROLE_MANAGER = 2;
-//    public static final int ROLE_SENIOR = 3;
-    public static final int ROLE_HR = 4;
-    public static final int ROLE_PMP = 5;
-    public static final int ROLE_LEADER = 6;
-
-    public static String[] DEFAULT_BASE_COST_ITEMS = {"人工成本","一般费用","外包费用","其他"};
-}

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

@@ -118,7 +118,7 @@ referer:
     - www.ttkuaiban.com
     - mobworktime.ttkuaiban.com
     - worktime.ttkuaiban.com
-excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*,/clean/*
+excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*
 
 #企业微信相关参数
 suitId: ww4e237fd6abb635af

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

@@ -18,11 +18,12 @@
         <result column="package_customer" property="packageCustomer" />
         <result column="package_engineering" property="packageEngineering" />
         <result column="package_simple" property="packageSimple" />
+        <result column="package_finance" property="packageFinance" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple
+        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance
     </sql>
 
 </mapper>

+ 33 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/PermissionMapper.xml

@@ -0,0 +1,33 @@
+<?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.PermissionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.Permission">
+        <id column="id" property="id"/>
+        <result column="permission_name" property="permissionName"/>
+        <result column="describe" property="describe"/>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, permission_name, describe
+    </sql>
+
+    <!-- 分页查询统计 -->
+    <select id="getRoleList" resultType="java.util.Map">
+        SELECT a.id, a.head_url AS headUrl, a.name, a.phone, a.key_code AS keyCode, b.role_id AS role, c.rolename
+        FROM user AS a
+        LEFT JOIN user_role AS b ON a.id=b.user_id
+        LEFT JOIN sys_role AS c ON b.role_id=c.id
+        WHERE a.id != 1
+        ORDER BY a.id ASC
+    </select>
+
+    <select id="getRole" resultType="java.util.Map">
+        SELECT a.id, a.name, a.code, a.icon AS moduleName, !ISNULL(b.role_id) AS existence
+        FROM sys_function AS a
+        LEFT JOIN sys_role_function AS b ON a.id=b.function_id AND b.role_id = #{role}
+        ORDER BY a.id ASC
+    </select>
+</mapper>

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

@@ -383,7 +383,7 @@
         LEFT JOIN user d ON d.id = project.`incharger_id`
         WHERE project.`company_id` = #{companyId}
         <if test="userId != null" >
-            project.creator_id = #{userId} or c.user_id = #{userId}
+            and (project.creator_id = #{userId} or c.user_id = #{userId})
         </if>
         GROUP BY project.id
     </select>

+ 29 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysFunctionMapper.xml

@@ -11,12 +11,37 @@
         <result column="module_id" property="moduleId" />
         <result column="seq" property="seq" />
         <result column="use_state" property="useState" />
-        <result column="package_type" property="packageType" />
+        <result column="package_time" property="packageTime" />
+        <result column="package_project" property="packageProject" />
+        <result column="package_oa" property="packageOa" />
+        <result column="package_expense" property="packageExpense" />
+        <result column="package_customer" property="packageCustomer" />
+        <result column="package_engineering" property="packageEngineering" />
+        <result column="package_contract" property="packageContract" />
+        <result column="package_etimecard" property="packageEtimecard" />
+        <result column="package_finance" property="packageFinance" />
+        <result column="sync_corpwx_time" property="syncCorpwxTime" />
+    </resultMap>
+    <resultMap id="BaseResultMap1" type="com.management.platform.entity.vo.SysRichFunction">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="icon" property="icon" />
+        <result column="code" property="code" />
+        <result column="module_id" property="moduleId" />
+        <result column="seq" property="seq" />
+        <result column="module_name" property="moduleName" />
     </resultMap>
-
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, icon, code, module_id, seq, use_state, package_type
+        id, name, icon, code, module_id, seq, use_state, package_time, package_project, package_oa, package_expense, package_customer, package_engineering, package_contract, package_etimecard, package_finance, sync_corpwx_time
     </sql>
-
+    <select id="getRoleFunctions" resultMap="BaseResultMap1" >
+        select sys_function.id, sys_function.name, sys_function.icon, sys_function.code, sys_function.module_id, sys_function.seq, sys_module.name as module_name
+        from sys_role_function left join sys_function on sys_function.id = sys_role_function.function_id
+        left join sys_module on sys_module.id = sys_function.module_id
+        where sys_role_function.role_id = #{roleId}
+        <if test="functionName != null">
+            and sys_function.name = #{functionName}
+        </if>
+    </select>
 </mapper>

+ 11 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysModuleMapper.xml

@@ -12,13 +12,21 @@
         <result column="orderitem" property="orderitem" />
         <result column="is_menu" property="isMenu" />
         <result column="use_state" property="useState" />
-        <result column="config" property="config" />
-        <result column="package_type" property="packageType" />
+        <result column="package_time" property="packageTime" />
+        <result column="package_project" property="packageProject" />
+        <result column="package_oa" property="packageOa" />
+        <result column="package_expense" property="packageExpense" />
+        <result column="package_customer" property="packageCustomer" />
+        <result column="package_engineering" property="packageEngineering" />
+        <result column="package_contract" property="packageContract" />
+        <result column="package_etimecard" property="packageEtimecard" />
+        <result column="report_workflow" property="reportWorkflow" />
+        <result column="package_finance" property="packageFinance" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, path, parent_id, icon, orderitem, is_menu, use_state, config, package_type
+        id, name, path, parent_id, icon, orderitem, is_menu, use_state, package_time, package_project, package_oa, package_expense, package_customer, package_engineering, package_contract, package_etimecard, report_workflow, package_finance
     </sql>
 
 </mapper>

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysRoleFunctionMapper.xml

@@ -8,9 +8,19 @@
         <result column="function_id" property="functionId" />
     </resultMap>
 
+    <resultMap id="BaseResultMap1" type="com.management.platform.entity.SysRoleFunction">
+        <id column="role_id" property="roleId" />
+        <result column="function_id" property="functionId" />
+        <result column="function_name" property="functionName" />
+    </resultMap>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         role_id, function_id
     </sql>
 
+    <select id="getRoleFunctionNames" resultMap="BaseResultMap1">
+        select role_id, function_id, sys_function.name as function_name from sys_role_function
+        left join sys_function on sys_function.id = sys_role_function.function_id
+        where role_id = #{roleId}
+    </select>
 </mapper>

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SysRoleMapper.xml

@@ -8,11 +8,13 @@
         <result column="company_id" property="companyId" />
         <result column="rolename" property="rolename" />
         <result column="role_describe" property="roleDescribe" />
+        <result column="parent_role" property="parentRole" />
+        <result column="is_default" property="isDefault" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, rolename, role_describe
+        id, company_id, rolename, role_describe, parent_role, is_default
     </sql>
 
 </mapper>

+ 6 - 44
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml

@@ -36,7 +36,7 @@
     </sql>
     <!--单独分页获取人员-->
     <select id="getUserByDepartment" resultType="java.util.Map">
-        SELECT a.id, a.name, a.phone, a.portrait_url AS portraitUrl, a.role, a.company_id AS companyId, a.cost,
+        SELECT a.id, a.role_id as roleId, a.role_name as roleName, a.name, a.phone, a.portrait_url AS portraitUrl, a.role, a.company_id AS companyId, a.cost,
         a.department_id AS departmentId, b.department_name AS departmentName, a.department_cascade AS departmentCascade,
         a.month_cost as monthCost, a.salary_type as salaryType, a.is_active as isActive, a.cost_apply_date as costApplyDate
         FROM user AS a
@@ -51,33 +51,14 @@
         <if test="status != null">
             AND a.is_active = #{status}
         </if>
-        <if test="role != null">
-            AND a.role = #{role}
-        </if>
-    </select>
-
-    <!--单独分页获取人员数量-->
-    <select id="countUserByDepartment" resultType="java.lang.Integer">
-        SELECT COUNT(a.id) AS count
-        FROM user AS a
-        WHERE a.company_id = #{companyId}
-        <if test="departmentId != null and companyId != ''">
-            AND a.department_id = #{departmentId}
-        </if>
-        <if test="keyword != null and keyword != ''">
-            AND a.name like '%${keyword}%'
-        </if>
-        <if test="status != null">
-            AND a.is_active = #{status}
-        </if>
-        <if test="role != null">
-            AND a.role = #{role}
+        <if test="roleId != null">
+            AND a.role_id = #{roleId}
         </if>
     </select>
 
     <!--范围分页获取人员-->
     <select id="getUserByDepartmentList" resultType="java.util.Map">
-        SELECT a.id, a.name, a.phone, a.portrait_url AS portraitUrl, a.role, a.company_id AS companyId, a.cost,
+        SELECT a.id,  a.role_id as roleId, a.role_name as roleName,  a.name, a.phone, a.portrait_url AS portraitUrl, a.role, a.company_id AS companyId, a.cost,
         a.department_id AS departmentId, b.department_name AS departmentName, a.department_cascade AS departmentCascade,
         a.month_cost as monthCost, a.salary_type as salaryType, a.is_active as isActive, a.cost_apply_date as costApplyDate
         FROM user AS a
@@ -92,27 +73,8 @@
         <if test="status != null">
             AND a.is_active = #{status}
         </if>
-        <if test="role != null">
-            AND a.role = #{role}
-        </if>
-    </select>
-
-    <!--范围分页获取人员数量-->
-    <select id="countUserByDepartmentList" resultType="java.lang.Integer">
-        SELECT COUNT(a.id) AS count
-        FROM user AS a
-        WHERE a.company_id = #{companyId} AND a.department_id IN
-        <foreach collection="departmentIds" item="departmentId" index="index" open="(" close=")" separator=",">
-            #{departmentId}
-        </foreach>
-        <if test="keyword != null and keyword != ''">
-            AND a.name like '%${keyword}%'
-        </if>
-        <if test="status != null">
-            AND a.is_active = #{status}
-        </if>
-        <if test="role != null">
-            AND a.role = #{role}
+        <if test="roleId != null">
+            AND a.role_id = #{roleId}
         </if>
     </select>
 

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

@@ -17,7 +17,7 @@
                     <el-row :gutter="10">
                         <el-col :span="5" ><span class="gray_label">项目编号: </span></el-col><el-col :span="7" ><span >{{project.projectCode}}&nbsp;</span></el-col>
                         <el-col :span="5" v-if="permissions.projectContract"><span class="gray_label">合同金额:</span></el-col>
-                        <el-col :span="7" v-if="user.role>0 || user.id == project.creatorId || user.id == project.inchargerId">
+                        <el-col :span="7" >
                         <span v-if="permissions.projectContract">{{project.contractAmount == null?'-':project.contractAmount | numberToCurrency}} 元</span></el-col>
                     </el-row>
                     <el-row :gutter="10">
@@ -172,7 +172,6 @@
             <div class="line"><span>手机号码</span><span>{{userDetail.phone}}</span></div>
             <div class="line"><span>角色</span><span>{{roleArray[userDetail.role]}}</span></div>
             <div class="line"><span>部门</span><span>{{userDetail.departmentName}}</span></div>
-            <div class="line" v-if="user.role == 1 || user.role == 2 || user.role == 6"><span>成本</span><span>{{userDetail.cost}}元/小时</span></div>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" @click="userDetailVisible = false" >确定</el-button>
             </div>

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

@@ -358,7 +358,6 @@
             <div class="line"><span>手机号码</span><span>{{userDetail.phone}}</span></div>
             <div class="line"><span>角色</span><span>{{roleArray[userDetail.role]}}</span></div>
             <div class="line"><span>部门</span><span>{{userDetail.departmentName}}</span></div>
-            <div class="line" v-if="user.role == 1 || user.role == 2 || user.role == 6"><span>成本</span><span>{{userDetail.cost}}元/小时</span></div>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" @click="userDetailVisible = false" >确定</el-button>
             </div>

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

@@ -243,7 +243,7 @@
             <el-tab-pane label="文件中心" name="files"><FileCenter ref="fileCenter"></FileCenter></el-tab-pane>
             <el-tab-pane label="项目概览" name="info"><ProjectInfo ref="projectInfo" @basecost-change="changeBase"></ProjectInfo></el-tab-pane>
             <el-tab-pane label="数据统计" name="summary"><Summary ref="summary"></Summary></el-tab-pane>
-            <el-tab-pane label="挣值分析" name="earning" v-if="user.id == currentProject.creator || user.id == currentProject.incharger_id || user.role == 1 || user.role == 2 || user.role == 3 || user.role == 6"><Earning ref="earning"></Earning></el-tab-pane>
+            <el-tab-pane label="挣值分析" name="earning" v-if="user.id == currentProject.creator || user.id == currentProject.incharger_id ||permissions.projectBaseline"><Earning ref="earning"></Earning></el-tab-pane>
         </el-tabs>
         
         <!--新增任务界面-->

+ 0 - 461
fhKeeper/formulahousekeeper/timesheet/src/views/research/list.vue

@@ -1,461 +0,0 @@
-<template>
-    <section>
-        <!--工具条-->
-        <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
-            <el-form :inline="true">
-                <el-form-item label="研究中心">
-                    
-                </el-form-item>
-                <el-form-item >
-                    <div>
-                    <el-input style="float:left;" v-model="keyword" class="input-with-select" placeholder="请输入项目名称关键字" clearable="true">
-                        <el-button slot="append" @click="searchList" icon="el-icon-search"></el-button>
-                    </el-input>
-                    </div>
-                </el-form-item>
-                <el-form-item style="float:right;" v-if="user.role == 1||user.role == 2||user.role == 5">
-                    <el-link type="primary" :underline="false" @click="handleAdd(-1,null)">新增客户</el-link>
-                </el-form-item>
-            </el-form>
-        </el-col>
-
-        <!--列表-->
-        <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-            <el-table-column type="index" width="60">
-                <template slot-scope="scope" >
-                        {{scope.$index+1+(page-1)*size}}
-                    </template>
-            </el-table-column>
-            <el-table-column prop="customerCode" label="客户编码"  width="120"></el-table-column>
-            <el-table-column prop="customerName" label="客户名称" >
-            </el-table-column>
-            <el-table-column prop="contactName" label="联系人"  width="120">
-            </el-table-column>
-            <el-table-column prop="contactPhone" label="联系电话"  width="150">
-            </el-table-column>
-            <el-table-column prop="email" label="邮箱"  width="150">
-            </el-table-column>
-            <el-table-column prop="address" label="地址" >
-            </el-table-column>
-            
-            <el-table-column label="操作" width="150" v-if="user.role == 1||user.role == 2||user.role == 5 || user.leader">
-                <template slot-scope="scope">
-                    <el-button size="mini" v-if="user.role>0" type="primary" @click="handleAdd(scope.$index, scope.row)">编辑</el-button>
-                    <el-button v-if="user.role>0" size="mini"  @click="deletePro(scope.$index, scope.row)">删除</el-button>
-                </template>
-            </el-table-column>
-        </el-table>
-
-        <!--工具条-->
-        <el-col :span="24" class="toolbar">
-            <el-pagination
-                @size-change="handleSizeChange"
-                @current-change="handleCurrentChange"
-                :page-sizes="[20 , 50 , 80 , 100]"
-                :page-size="20"
-                layout="total, sizes, prev, pager, next"
-                :total="total"
-                style="float:right;"
-            ></el-pagination>
-        </el-col>
-
-        <!--新增界面-->
-        <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="800px">
-            <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
-                <el-form-item label="客户编号" >
-                    <el-input v-model="addForm.customerCode" :max="20" :disabled="user.role==0" placeholder="请输入客户编号" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="客户名称" prop="customerName">
-                    <el-input v-model="addForm.customerName" :max="20" :disabled="user.role==0" placeholder="请输入客户名称" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="联系人" prop="contactName">
-                    <el-input v-model="addForm.contactName" :max="20" :disabled="user.role==0" placeholder="请输入客户联系人" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="联系电话" prop="contactPhone">
-                    <el-input v-model="addForm.contactPhone" :max="20" :disabled="user.role==0" placeholder="请输入客户联系电话" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="邮箱" prop="email">
-                    <el-input v-model="addForm.email" :max="25" :disabled="user.role==0" placeholder="请输入客户邮箱" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="地址" prop="address">
-                    <el-input v-model="addForm.address" :max="50"  :disabled="user.role==0" placeholder="请输入客户联系地址" clearable></el-input>
-                </el-form-item>
-
-            </el-form>
-            <div slot="footer" class="dialog-footer;">
-                <el-button @click.native="addFormVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
-            </div>
-        </el-dialog>
-    </section>
-</template>
-<style scoped>
-.input-with-select .el-input-group__prepend {
-    background-color: #fff;
-  }
-.line {
-    padding:10px;
-}
-.line span{
-    font-size:15px;
-}
-.line span:nth-child(even){
-    float:right;
-}
-</style>
-<script>
-    import util from "../../common/js/util";
-    export default {
-        data() {
-            return {
-                roleArray:["普通员工","超级管理员", "系统管理员", "公司高层","财务管理员", "项目管理员"],
-                status:null,
-                statusTxt:["-","进行中","已完成","已撤销"],
-                importanceList:[{id:1,label:'正常'},{id:2,label:'紧急'},{id:3,label:'重要'},{id:4,label:'重要且紧急'}],
-                searchField:null,
-                keyword:null,
-                user: JSON.parse(sessionStorage.getItem("user")),
-                userDetailVisible: false,
-                userDetail:{},
-                date: new Date(),
-                users: [],
-                participator:[],
-                tableHeight: 0,
-                listLoading: false,
-                total: 0,
-                page: 1,
-                size: 20,
-                list: [],
-                subProjectVisible: false,
-                subProjectList: [],//子项目列表
-                currentProject:{},
-                addSubProject: false,
-                addFormVisible: false,
-                addLoading: false,
-                addUp: 0, // 合计
-                title: "",
-                addForm: {
-                    name: '',
-                    userId: [],
-                    level:1,
-                },
-                rules: {
-                    customerName: [{ required: true, message: "请输入客户名称", trigger: "blur" }],
-                }
-            };
-        },
-        // 过滤器
-        filters: {
-            numberToCurrency(value) {
-                if (!value) return '0.00'
-                // 将数值截取,保留两位小数
-                value = value.toFixed(2)
-                // 获取整数部分
-                const intPart = Math.trunc(value)
-                // 整数部分处理,增加,
-                const intPartFormat = intPart.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')
-                // 预定义小数部分
-                let floatPart = '.00'
-                // 将数值截取为小数部分和整数部分
-                const valueArray = value.toString().split('.')
-                if (valueArray.length === 2) { // 有小数部分
-                floatPart = valueArray[1].toString() // 取得小数部分
-                return intPartFormat + '.' + floatPart
-                }
-                return intPartFormat + floatPart
-            }
-        },
-        methods: {
-            importProject(item) {
-                //首先判断文件类型
-                let str = item.file.name.split(".");
-                let format = str[str.length - 1];
-                if (format != "xls" && format != "xlsx") {
-                    this.$message({
-                        message: "请选择.xls或.xlsx文件",
-                        type: "error"
-                    });
-                } else {
-                    this.listLoading = true;
-                    let formData = new FormData();
-                    formData.append("file", item.file);
-                    formData.append("userId", this.user.id);
-                    this.http.uploadFile('/project/importData', formData,
-                    res => {
-                        this.$refs.upload.clearFiles();
-                        this.listLoading = false;
-                        if (res.code == "ok") {
-                            this.$message({
-                                message: "导入成功",
-                                type: "success"
-                            });
-                            this.getList();
-                        } else {
-                            this.$message({
-                                message: res.msg,
-                                type: "error"
-                            });
-                        }
-                    },
-                    error => {
-                        this.$refs.upload.clearFiles();
-                        this.listLoading = false;
-                        this.$message({
-                            message: error,
-                            type: "error"
-                        });
-                    });
-                }
-            },
-            number(){  
-        //      this.addForm.budget = this.addForm.budget.replace(/[^\.\d]/g,'');
-        //         this.addForm.budget = this.addForm.budget.replace('.','');
-          },
-            deleteSubPro(subProject) {
-                this.$confirm("确定要删除子项目" + subProject.name + "吗?","删除子项目", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
-                    type: "warning"
-                })
-                .then(() => {
-                    this.listLoading = true;
-                    this.http.post('/sub-project/deleteProject',{ 
-                        id: subProject.id 
-                    },
-                    res => {
-                        this.listLoading = false;
-                        if (res.code == "ok") {
-                            this.$message({
-                                message: "删除成功",
-                                type: "success"
-                            });
-                            this.subProject(this.currentProject);
-                        } else {
-                            this.$message({
-                                message: res.msg,
-                                type: "error"
-                            });
-                        }
-                    },
-                    error => {
-                        this.listLoading = false;
-                        this.$message({
-                            message: error,
-                            type: "error"
-                        });
-                        }
-                    );
-                })
-                .catch(() => {});
-            },
-            searchList() {
-                this.page = 1;
-                this.getList();
-            },
-            addNewSubProject(subProject) {
-                console.log(123);
-                if (subProject == null) {
-                    this.addForm = {projectId: this.currentProject.id, level:1}
-                } else {
-                    this.addForm = subProject;
-                }
-                this.addSubProject = true;
-            },
-            //显示子项目
-            subProject(item) {
-                this.subProjectVisible = true;
-                this.currentProject = item;
-                this.http.post('/sub-project/list', {
-                    projectId: item.id
-                },
-                res => {
-                    if (res.code == "ok") {
-                        this.subProjectList = res.data;
-                    } else {
-                        this.$message({
-                        message: res.msg,
-                        type: "error"
-                        });
-                    }
-                },
-                error => {
-                    this.$message({
-                        message: error,
-                        type: "error"
-                    });
-                });
-            },
-            //显示用户详情
-            showUser(userId) {
-                this.userDetailVisible = true;
-                this.http.post(this.port.manage.userDetail, {
-                    userId: userId
-                },
-                res => {
-                    if (res.code == "ok") {
-                        this.userDetail = res.data;
-                    } else {
-                        this.$message({
-                        message: res.msg,
-                        type: "error"
-                        });
-                    }
-                },
-                error => {
-                    this.$message({
-                        message: error,
-                        type: "error"
-                    });
-                });
-            },
-            
-            
-            //分页
-            handleCurrentChange(val) {
-                this.page = val;
-                this.getList();
-            },
-
-            handleSizeChange(val) {
-                this.size = val;
-                this.getList();
-            },
-
-            //获取项目列表
-            getList() {
-                this.listLoading = true;
-                this.http.post('/customer-info/list', {
-                    pageIndex: this.page,
-                    pageSize: this.size,
-                    keyword:this.keyword
-                },
-                res => {
-                    this.listLoading = false;
-                    if (res.code == "ok") {
-                        var list = res.data.records;
-                        this.list = list;
-                        this.total = res.data.total;
-                    } else {
-                        this.$message({
-                            message: res.msg,
-                            type: "error"
-                        });
-                    }
-                },
-                error => {
-                    this.listLoading = false;
-                    this.$message({
-                        message: error,
-                        type: "error"
-                    });
-                });
-            },
-
-            //显示新增界面
-            handleAdd(i, item) {
-                if(i == -1) {
-                    this.title = "新增客户";
-                    this.addForm = {
-                    }
-                } else {
-                    this.title = "修改客户";
-                    this.addForm = JSON.parse(JSON.stringify(item));
-                }
-                this.addFormVisible = true;
-            },
-
-            submitInsert() {
-                this.$refs.form1.validate(valid => {
-                    if (valid) {
-                        this.addLoading = true;
-                        this.http.post('/customer-info/addOrMod', this.addForm,
-                        res => {
-                            this.addLoading = false;
-                            if (res.code == "ok") {
-                                this.addFormVisible = false;
-                                this.getList();
-                            } else {
-                                this.$message({
-                                    message: res.msg,
-                                    type: "error"
-                                });
-                            }
-                        },
-                        error => {
-                            this.addLoading = false;
-                            this.$message({
-                                message: error,
-                                type: "error"
-                            });
-                        });
-                        }
-                });
-            },
-
-            // 删除
-            deletePro(i, item) {
-                this.$confirm("确定要客户" + item.customerName + "吗?","删除客户", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
-                    type: "warning"
-                })
-                .then(() => {
-                    this.listLoading = true;
-                    this.http.post('/customer-info/delete',{ 
-                        id: item.id 
-                    },
-                    res => {
-                        this.listLoading = false;
-                        if (res.code == "ok") {
-                            this.$message({
-                                message: "删除成功",
-                                type: "success"
-                            });
-                            this.getList();
-                        } else {
-                            this.$message({
-                                message: res.msg,
-                                type: "error"
-                            });
-                        }
-                    },
-                    error => {
-                        this.listLoading = false;
-                        this.$message({
-                            message: error,
-                            type: "error"
-                        });
-                        }
-                    );
-                })
-                .catch(() => {});
-            },
-        },
-        created() {
-            let height = window.innerHeight;
-            this.tableHeight = height - 195;
-            const that = this;
-            window.onresize = function temp() {
-                that.tableHeight = window.innerHeight - 195;
-            };
-        },
-        mounted() {
-            this.getList();
-        }
-    };
-</script>
-
-<style lang="scss" scoped>
-.rg_span{
-    display: inline-block;
-}
-.rg_span span {
-    text-align: right;
-    box-sizing: border-box;
-    padding-right: 10px;
-}
-.el-dialog__title {
-    display: inline-table;
-    margin-top: 20px;
-}
-</style>

+ 9 - 26
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -125,7 +125,7 @@
                 <el-table-column prop="phone" label="手机" width="120"></el-table-column>
                 <el-table-column prop="departmentName" label="部门" sortable></el-table-column>
                 <el-table-column label="角色" width="100">
-                    <template slot-scope="scope">{{scope.row.roleId | acquireRoleName}}</template>
+                    <template slot-scope="scope">{{scope.row.roleName}}</template>
                 </el-table-column>
                 <el-table-column prop="monthCost" label="月成本" sortable v-if="permissions.structurePersonnel">
                     <template slot-scope="scope">{{scope.row.monthCost==null?0:scope.row.monthCost}} 元</template>
@@ -137,15 +137,13 @@
                 </el-table-column>
                 <el-table-column label="操作" width="330" v-if="permissions.structurePersonnel">
                     <template slot-scope="scope">
-                        <!-- <el-button size="small" v-if="scope.row.role == 0 && user.role == 1" @click="switchRole(scope.$index)">切换为管理员</el-button>
-                        <el-button size="small" v-if="scope.row.role == 2 && user.role == 1" @click="switchRole(scope.$index)">切换为员工</el-button> -->
-                        <el-button size="mini" type="default" v-if="scope.row.role == 1 && user.role == 1" @click="transferRole(scope.row)">转让</el-button>
-                        <el-button size="mini" type="default" v-if="scope.row.role != 1" @click="resetPwd(scope.row)">重置</el-button>
-                        <el-button size="mini" type="primary" v-if="scope.row.role != 1" @click="openInsertDialog(scope.$index)">编辑</el-button>
-                        <el-button size="mini" type="primary" v-if="scope.row.role == 1" @click="openInsertDialog1(scope.$index)">编辑</el-button>
-                        <el-button size="mini" type="danger"  v-if="scope.row.role != 1" @click="deleteUser(scope.row)">删除</el-button>
-                        <el-button size="mini" type="default" v-if="scope.row.role != 1 && scope.row.isActive==1" @click="showDeactiveDialog(scope.row)">停用</el-button>
-                        <el-button size="mini" type="success" v-if="scope.row.role != 1 && scope.row.isActive==0" @click="setActive(scope.row, 1)">启用</el-button>
+                        <el-button size="mini" type="default" v-if="scope.row.roleName == '超级管理员'" @click="transferRole(scope.row)">转让</el-button>
+                        <el-button size="mini" type="default" v-if="scope.row.roleName != '超级管理员'" @click="resetPwd(scope.row)">重置</el-button>
+                        <el-button size="mini" type="primary" v-if="scope.row.roleName != '超级管理员'" @click="openInsertDialog(scope.$index)">编辑</el-button>
+                        <el-button size="mini" type="primary" v-if="scope.row.roleName == '超级管理员'" @click="openInsertDialog1(scope.$index)">编辑</el-button>
+                        <el-button size="mini" type="danger"  v-if="scope.row.roleName != '超级管理员'" @click="deleteUser(scope.row)">删除</el-button>
+                        <el-button size="mini" type="default" v-if="scope.row.roleName != '超级管理员' && scope.row.isActive==1" @click="showDeactiveDialog(scope.row)">停用</el-button>
+                        <el-button size="mini" type="success" v-if="scope.row.roleName != '超级管理员' && scope.row.isActive==0" @click="setActive(scope.row, 1)">启用</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -265,22 +263,7 @@
                 </el-form-item>
                 <el-form-item label="角色" prop="roleId">
                     <el-select v-model="insertForm.roleId" placeholder="请选择角色" style="width: 100%">
-                        <!-- <el-option label="普通员工" :value="0">
-                            <span style="float: left">普通员工</span>
-                            <span style="float: right; color: #8492a6; font-size: 13px">具有填报日报,参与项目协作基础功能</span>
-                        </el-option>
-                        <el-option label="系统管理员" :value="2" :disabled="user.role != 1">
-                            <span style="float: left">普通员工</span>
-                            <span style="float: right; color: #8492a6; font-size: 13px">具有填报日报,参与项目协作基础功能</span>
-                        </el-option>
-                        <el-option label="公司高层" :value="3"></el-option>
-                        <el-option label="财务管理员" :value="4"></el-option>
-                        <el-option label="项目管理员" :value="5"></el-option> -->
-                        <!-- <el-option v-for="item in roleDescArray" :label="item.label" :disabled="item.value==2&&user.role != 1" :value="item.value" :key="item.name">
-                            <span style="float: left">{{item.label}}</span>
-                            <span style="float: right; color: #8492a6; font-size: 13px">{{item.desc}}</span>
-                        </el-option> -->
-                        <el-option v-for="item in acquireRoleList" :label="item.rolename" :disabled="item.value==2&&user.role != 1" :value="item.id" :key="item.name">
+                        <el-option v-for="item in acquireRoleList" :label="item.rolename" :value="item.id" :key="item.name">
                             <span style="float: left">{{item.rolename}}</span>
                             <span style="float: right; color: #8492a6; font-size: 13px">{{item.roleDescribe}}</span>
                         </el-option>

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

@@ -30,7 +30,7 @@
                 </div>
                 </div>
                 <div style="display:flex;">
-                <div v-if="user.role > 0 || user.manageDeptId != 0" >
+                <div v-if="permissions.reportsCompany || user.manageDeptId != 0" >
                     <div style="width:190px;">
                         <el-select v-model="selectState" size="small" @change="stateChange" >
                         <el-option value="-1" label="全部状态" >全部状态</el-option>
@@ -73,7 +73,7 @@
                     <div class="report_title" >
                         
                         <span>工作日报 </span>
-                        <span v-if="user.role==1||user.role==2||user.role==6||user.manageDeptId != 0">| {{depData != null ?depData.label:""}}
+                        <span v-if="permissions.reportsCompany||user.manageDeptId != 0">| {{depData != null ?depData.label:""}}
                         <span v-if="targetUid == null">
                          - 已填写
                         <el-link :underline="false" @click="showMembList(1)"><span style="margin-left:5px;margin-right:5px;color:green;">{{reportList.length}}</span></el-link>人,
@@ -83,7 +83,6 @@
                         <span style="float:right;">
                             <el-link type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReport(-1,0)">填写日报</el-link>
                             <el-link v-if="reportTimeType.type != 0" type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReportss()">按周填报</el-link>
-                            <!-- <el-link type="primary" v-if="user.role==1||user.role==2||user.leader==1||user.manageDeptId != 0" style="margin-right:10px;" :underline="false" @click="isSubstitude=true; fillInReport(-1,0)">代填日报</el-link> -->
                             <el-link type="primary" v-if="permissions.reportsFillOut" style="margin-right:10px;" :underline="false" @click="isSubstitude=true; fillInReport(-1,0)">代填日报</el-link>
                             <el-link type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReport(-1,1)">批量填报</el-link>
                             <el-link type="primary" v-if="user.manageDeptId != 0" style="margin-right:10px;" :underline="false" @click="imports()">工时导入</el-link>
@@ -110,14 +109,11 @@
                                     工作总时长:
                                     <!-- <span :style="parseFloat(item1.reportTime)>parseFloat(item1.calculateTime)+0.5?'color:red':''">{{item1.reportTime}}h</span> -->
                                     <span >{{item1.reportTime}}</span>h
-                                    <span v-if="user.role ==1 || user.role == 2 ||user.role == 6"><span  style="margin-left:10px;">成本:</span>
-                                    <span >{{item1.cost}}</span>元</span>
                                 </span>
                             </span>
                             <div class="checkbtn" style="padding-right:20px;">
                                 <el-button v-if="item1.state >= 2 && user.id == item1.id" type="primary" size="small" @click="isSubstitude=false; fillInReport(index1,0)">编辑日报</el-button>
-                                <!-- <el-button v-if="(user.role == 1 || user.role == 2 || user.manageDeptId != 0) && item1.state != 1" size="small" @click="guanli(item1)" style="float: right;">删除</el-button> -->
-                                <el-button v-if="(user.manageDeptId != 0) && item1.state != 1" size="small" @click="guanli(item1)" style="float: right;">删除</el-button>
+                                <el-button v-if="(permissions.reportsDeleteAll || user.manageDeptId != 0) && item1.state != 1" size="small" @click="guanli(item1)" style="float: right;">删除</el-button>
                             </div>
                             <div class="one_daily_body">
                                 <el-timeline>
@@ -158,13 +154,13 @@
                                             <!--每个项目上单独审核 -->
                                             <span style="float:right;">
                                                 <!-- <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item2.projectAuditorId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="primary" :loading="logining"  -->
-                                                <el-button v-if="(user.id == item2.projectAuditorId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="primary" :loading="logining" 
+                                                <el-button v-if="(permissions.projectReportReview || user.id == item2.projectAuditorId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="primary" :loading="logining" 
                                                 size="small" @click="approve(item1.id, item2)">通过</el-button>
                                                 <!-- <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item2.projectAuditorId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="danger" :loading="logining"  -->
-                                                <el-button v-if="(user.id == item2.projectAuditorId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="danger" :loading="logining" 
+                                                <el-button v-if="(permissions.projectReportReview ||user.id == item2.projectAuditorId) && item2.state == 0 && item2.isDeptAudit==0 && item2.projectAuditState==0" type="danger" :loading="logining" 
                                                 size="small" @click="showDenyDialog(item1.id,0, item2)">驳回</el-button>
                                                 <!-- <el-button v-if="(user.role == 1 || user.role == 2 || user.id == item2.projectAuditorId) && item2.state == 1" type="normal" :loading="logining" size="small"  -->
-                                                <el-button v-if="(user.id == item2.projectAuditorId) && item2.state == 1" type="normal" :loading="logining" size="small" 
+                                                <el-button v-if="(permissions.projectReportReview ||user.id == item2.projectAuditorId) && item2.state == 1" type="normal" :loading="logining" size="small" 
                                                 @click="showDenyDialog(item1.id,1, item2)">撤销</el-button>
                                                 <!--自己可以撤回待审核状态的报告 -->
                                                 <el-button v-if="user.id == item1.id && (item2.state == 0 || item2.state == -1)" type="normal" :loading="logining" size="small" @click="cancel(item1)">撤回</el-button>
@@ -2505,7 +2501,7 @@
                     for (var j=0;j<report.data.length; j++) {
                         if (report.data[j].state == 0 
                             && (this.user.company.packageEngineering==0 || (this.user.company.packageEngineering==1 && report.data[j].departmentAuditState == 1))
-                            && (this.user.role == 1 || this.user.role == 2 || report.data[j].projectAuditorId == this.user.id)) {
+                            && (permissions.projectReportReview || report.data[j].projectAuditorId == this.user.id)) {
                             hasUnChecked = true;
                             id += report.data[j].id+',';
                         }
@@ -2658,7 +2654,7 @@
             getDepartment() {
                 let day = (this.choseDay+1) > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
                 var param = {date:this.date + day};
-                if (this.user.manageDeptId != 0 && this.user.role < 2) {
+                if (this.user.manageDeptId != 0 && !this.permissions.reportsCompany) {
                     param.manageDeptId = this.user.manageDeptId;
                 }
                 this.http.post("/report/getMembList", param,
@@ -3323,13 +3319,21 @@
             },
             // 按周填报里内容的填写点击确定
             btnTianxiaes() {
-                this.tianxieDialogVisible = false
-                var zhong = this.zhoData
-                zhong[this.zhoBaoIdx][this.zhoBaoName] = this.zhoBao
-                this.zhoData = zhong
-                if(this.reportTimeType.type == 1) this.zhoXuan(this.zhoBao, this.zhoBaoIdx)
-                if(this.reportTimeType.type == 2) this.zhoTimes(this.zhoBao, this.zhoBaoIdx)
-                if(this.reportTimeType.type == 3) this.addBli(this.zhoBao, this.zhoBaoIdx)
+                if (this.zhoBao.projectAuditorId) {
+                    this.tianxieDialogVisible = false
+                    var zhong = this.zhoData
+                    zhong[this.zhoBaoIdx][this.zhoBaoName] = this.zhoBao
+                    this.zhoData = zhong
+                    if(this.reportTimeType.type == 1) this.zhoXuan(this.zhoBao, this.zhoBaoIdx)
+                    if(this.reportTimeType.type == 2) this.zhoTimes(this.zhoBao, this.zhoBaoIdx)
+                    if(this.reportTimeType.type == 3) this.addBli(this.zhoBao, this.zhoBaoIdx)
+                } else {
+                    this.$message({
+                        message: '请选择审核人',
+                        type: "error"
+                    });
+                }
+                
             },
             // 获取本周
             getCurrentWeek() {

+ 10 - 2
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/PermissionController.java

@@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -34,9 +36,10 @@ public class PermissionController {
     private SysRoleService sysRoleService;
 
     @RequestMapping("/getFrontRoleList")
-    public HttpRespMsg getFrontRoleList() {
+    public HttpRespMsg getFrontRoleList(Integer companyId) {
         HttpRespMsg msg = new HttpRespMsg();
-        msg.data = sysRoleService.list(new QueryWrapper<SysRole>());
+        List<SysRole> list = sysRoleService.list(new QueryWrapper<SysRole>().eq("company_id", companyId));
+        msg.data = list.stream().filter(item->!item.getRolename().equals("超级管理员")).collect(Collectors.toList());
         return msg;
     }
 
@@ -65,6 +68,11 @@ public class PermissionController {
         return permissionService.editRole(id, name, description, companyId);
     }
 
+    @RequestMapping("/setDefaultRole")
+    public HttpRespMsg setDefaultRole(Integer id, Integer companyId) {
+        return permissionService.setDefaultRole(id, companyId);
+    }
+
     @RequestMapping("/deleteRole")
     public HttpRespMsg deleteRole(@RequestParam Integer id) {
         return permissionService.deleteRole(id);

+ 21 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/controller/TimeTypeController.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-04-01
+ */
+@RestController
+@RequestMapping("/time-type")
+public class TimeTypeController {
+
+}
+

+ 8 - 2
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/Company.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author QuYueTing
- * @since 2022-03-30
+ * @since 2022-04-01
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -76,7 +76,7 @@ public class Company extends Model<Company> {
     private Integer packageContract;
 
     /**
-     * OA平台
+     * OA平台;请假,出差等
      */
     @TableField("package_oa")
     private Integer packageOa;
@@ -111,6 +111,12 @@ public class Company extends Model<Company> {
     @TableField("package_simple")
     private Integer packageSimple;
 
+    /**
+     * 财务核算成本
+     */
+    @TableField("package_finance")
+    private Integer packageFinance;
+
 
     @Override
     protected Serializable pkVal() {

+ 52 - 4
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysFunction.java

@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author QuYueTing
- * @since 2022-03-30
+ * @since 2022-04-01
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -66,10 +66,58 @@ public class SysFunction extends Model<SysFunction> {
     private Boolean useState;
 
     /**
-     * 所属版本,0-基础版,1-项目管理专业版
+     * 是否属于工时管理模块
      */
-    @TableField("package_type")
-    private Integer packageType;
+    @TableField("package_time")
+    private Integer packageTime;
+
+    /**
+     * 是否属于任务协同办公
+     */
+    @TableField("package_project")
+    private Integer packageProject;
+
+    /**
+     * 是否属于OA, 请假出差等
+     */
+    @TableField("package_oa")
+    private Integer packageOa;
+
+    /**
+     * 是否属于费用报销
+     */
+    @TableField("package_expense")
+    private Integer packageExpense;
+
+    /**
+     * 是否属于客户管理
+     */
+    @TableField("package_customer")
+    private Integer packageCustomer;
+
+    /**
+     * 是否属于专业工程管理
+     */
+    @TableField("package_engineering")
+    private Integer packageEngineering;
+
+    /**
+     * 是否属于合同管理
+     */
+    @TableField("package_contract")
+    private Integer packageContract;
+
+    /**
+     * 是否属于生产车间管理
+     */
+    @TableField("package_etimecard")
+    private Integer packageEtimecard;
+
+    /**
+     * 是否属于财务核算成本
+     */
+    @TableField("package_finance")
+    private Integer packageFinance;
 
 
     @TableField(exist = false)

+ 56 - 7
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysModule.java

@@ -18,7 +18,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author QuYueTing
- * @since 2022-03-30
+ * @since 2022-04-01
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -77,16 +77,64 @@ public class SysModule extends Model<SysModule> {
     private Boolean useState;
 
     /**
-     * 账套级别的系统配置-Lei
+     * 是否属于工时管理模块
      */
-    @TableField("config")
-    private String config;
+    @TableField("package_time")
+    private Integer packageTime;
 
     /**
-     * 所属版本级别: 0-基础版,1-项目管理专业版
+     * 是否属于任务协同办公
      */
-    @TableField("package_type")
-    private Integer packageType;
+    @TableField("package_project")
+    private Integer packageProject;
+
+    /**
+     * 是否属于OA, 请假出差等
+     */
+    @TableField("package_oa")
+    private Integer packageOa;
+
+    /**
+     * 是否属于费用报销
+     */
+    @TableField("package_expense")
+    private Integer packageExpense;
+
+    /**
+     * 是否属于客户管理
+     */
+    @TableField("package_customer")
+    private Integer packageCustomer;
+
+    /**
+     * 是否属于专业工程管理
+     */
+    @TableField("package_engineering")
+    private Integer packageEngineering;
+
+    /**
+     * 是否属于合同管理
+     */
+    @TableField("package_contract")
+    private Integer packageContract;
+
+    /**
+     * 是否属于生产车间管理
+     */
+    @TableField("package_etimecard")
+    private Integer packageEtimecard;
+
+    /**
+     * 是否属于自定义审批流
+     */
+    @TableField("report_workflow")
+    private Integer reportWorkflow;
+
+    /**
+     * 是否属于财务核算成本
+     */
+    @TableField("package_finance")
+    private Integer packageFinance;
 
 
     @TableField(exist = false)
@@ -100,6 +148,7 @@ public class SysModule extends Model<SysModule> {
     private List<SysFunction> functionList;
 
 
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 7 - 1
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/SysRole.java

@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author QuYueTing
- * @since 2022-03-30
+ * @since 2022-03-31
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -56,6 +56,12 @@ public class SysRole extends Model<SysRole> {
     @TableField("parent_role")
     private Integer parentRole;
 
+    /**
+     * 是否是新增员工时的默认的角色
+     */
+    @TableField("is_default")
+    private Integer isDefault;
+
 
     @Override
     protected Serializable pkVal() {

+ 161 - 0
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/entity/TimeType.java

@@ -0,0 +1,161 @@
+package com.hssx.user.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+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-04-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("time_type")
+public class TimeType extends Model<TimeType> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 公司id
+     */
+    @TableId("company_id")
+    private Integer companyId;
+
+    /**
+     * 全天时长
+     */
+    @TableField("allday")
+    private Float allday;
+
+    /**
+     * 上午时长
+     */
+    @TableField("am")
+    private Float am;
+
+    /**
+     * 下午时长
+     */
+    @TableField("pm")
+    private Float pm;
+
+    /**
+     * 每月工作天数
+     */
+    @TableField("month_days")
+    private BigDecimal monthDays;
+
+    /**
+     * 时薪录入方式:0-按月薪计算,1-直接输入时薪
+     */
+    @TableField("hour_cost_input_type")
+    private Integer hourCostInputType;
+
+    /**
+     * 时长上报方式
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 是否计算加班工时工资
+     */
+    @TableField("pay_overtime")
+    private Boolean payOvertime;
+
+    /**
+     * 提醒时间
+     */
+    @TableField("alert_time")
+    private String alertTime;
+
+    /**
+     * 支持同个项目多个时间事项录入
+     */
+    @TableField("multi_worktime")
+    private Integer multiWorktime;
+
+    /**
+     * 强制固定月薪
+     */
+    @TableField("fix_monthcost")
+    private Integer fixMonthcost;
+
+    /**
+     * 可补填几个月的, 0-不限制,1-本月,2-上个月,3-上上月,4- 7天内 ,5- 前一天
+     */
+    @TableField("fill_months")
+    private Integer fillMonths;
+
+    /**
+     * 工时填报自定义维度是否启用
+     */
+    @TableField("custom_degree_active")
+    private Integer customDegreeActive;
+
+    /**
+     * 工时填报自定义维度名称
+     */
+    @TableField("custom_degree_name")
+    private String customDegreeName;
+
+    /**
+     * 提醒内容
+     */
+    @TableField("alert_msg")
+    private String alertMsg;
+
+    /**
+     * 同步企业微信的考勤记录
+     */
+    @TableField("sync_corpwx_time")
+    private Integer syncCorpwxTime;
+
+    /**
+     * 是否需要部门上级审核日报
+     */
+    @TableField("need_dept_audit")
+    private Integer needDeptAudit;
+
+    /**
+     * 是否开启自定义审批流
+     */
+    @TableField("report_workflow")
+    private Integer reportWorkflow;
+
+    /**
+     * 工时填报数值收集开关
+     */
+    @TableField("custom_data_active")
+    private Integer customDataActive;
+
+    /**
+     * 工时填报数值收集字段名称
+     */
+    @TableField("custom_data_name")
+    private String customDataName;
+
+    /**
+     * 财务成本导入是否需要审核
+     */
+    @TableField("finance_audit")
+    private Integer financeAudit;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.companyId;
+    }
+
+}

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

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

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

@@ -32,4 +32,6 @@ public interface PermissionService extends IService<Permission> {
     HttpRespMsg switchAuthority(Integer role, Integer id);
 
     HttpRespMsg savePermission(Integer role, String moduleList);
+
+    HttpRespMsg setDefaultRole(Integer id, Integer companyId);
 }

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

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

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

@@ -40,6 +40,8 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
     @Resource
     private SysRoleMapper sysRoleMapper;
     @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
     private SysRoleFunctionMapper sysRoleFunctionMapper;
     @Resource
     private SysModuleMapper sysModuleMapper;
@@ -126,12 +128,18 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
     public HttpRespMsg deleteRole(Integer id) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         //检查有无正在使用的人
-        if (id == 0) {
-            httpRespMsg.setError("不可删除系统管理员");
+        SysRole role = sysRoleMapper.selectById(id);
+        if (role == null) {
+            httpRespMsg.setError("该角色不存在");
+        } else if (role.getRolename().equals("超级管理员")) {
+            httpRespMsg.setError("不可删除超级管理员");
+        } else if (role.getIsDefault() == 1) {
+            httpRespMsg.setError("该角色为新增员工时的默认角色,请设置其他角色为默认后再尝试删除");
         } else if (userMapper.selectCount(new QueryWrapper<User>().eq("role_id", id)) > 0) {
-            httpRespMsg.setError("目前有人为该角色 无法删除");
+            httpRespMsg.setError("该角色存在相关人员,请将他们修改为其他角色后再尝试删除");
         } else {
             sysRoleFunctionMapper.delete(new QueryWrapper<SysRoleFunction>().eq("role_id", id));
+            sysRoleModuleMapper.delete(new QueryWrapper<SysRoleModule>().eq("role_id", id));
             sysRoleMapper.deleteById(id);
         }
         return httpRespMsg;
@@ -146,11 +154,69 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
 
         //全部模块,
         Company company = companyMapper.selectById(companyId);
-        //根据公司所开通的套餐匹配模块
-        List<SysModule> moduleList = sysModuleMapper.selectList(new QueryWrapper<SysModule>().le("package_type", company.getPackageProject()).orderByAsc("orderitem"));
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        //按照公司开通的模块进行匹配
+        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<SysModule>().eq("package_time", 1);
+        if (company.getPackageProject() == 1) {
+            queryWrapper.or().eq("package_project", 1);
+        }
+        if (company.getPackageOa() == 1) {
+            queryWrapper.or().eq("package_oa", 1);
+        }
+        if (company.getPackageExpense() == 1) {
+            queryWrapper.or().eq("package_expense", 1);
+        }
+        if (company.getPackageCustomer() == 1) {
+            queryWrapper.or().eq("package_customer", 1);
+        }
+        if (company.getPackageEngineering() == 1) {
+            queryWrapper.or().eq("package_engineering", 1);
+        }
+        if (company.getPackageContract() == 1) {
+            queryWrapper.or().eq("package_contract", 1);
+        }
+        if (company.getPackageEtimecard()== 1) {
+            queryWrapper.or().eq("package_etimecard", 1);
+        }
+        if (company.getPackageFinance() == 1) {
+            queryWrapper.or().eq("package_finance", 1);
+        }
+        if (timeType.getReportWorkflow() == 1) {
+            queryWrapper.or().eq("report_workflow", 1);
+        }
+        queryWrapper.orderByAsc("orderitem");
+
+        List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
         //组装层级关系,默认只有两级
         List<SysModule> menuList = new ArrayList<>();
-        List<SysFunction> functionList = sysFunctionMapper.selectList(new QueryWrapper<SysFunction>().le("package_type", company.getPackageProject()).orderByAsc("seq"));
+        QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
+        if (company.getPackageProject() == 1) {
+            functionQueryWrapper.or().eq("package_project", 1);
+        }
+        if (company.getPackageOa() == 1) {
+            functionQueryWrapper.or().eq("package_oa", 1);
+        }
+        if (company.getPackageExpense() == 1) {
+            functionQueryWrapper.or().eq("package_expense", 1);
+        }
+        if (company.getPackageCustomer() == 1) {
+            functionQueryWrapper.or().eq("package_customer", 1);
+        }
+        if (company.getPackageEngineering() == 1) {
+            functionQueryWrapper.or().eq("package_engineering", 1);
+        }
+        if (company.getPackageContract() == 1) {
+            functionQueryWrapper.or().eq("package_contract", 1);
+        }
+        if (company.getPackageEtimecard()== 1) {
+            functionQueryWrapper.or().eq("package_etimecard", 1);
+        }
+        if (company.getPackageFinance() == 1) {
+            functionQueryWrapper.or().eq("package_finance", 1);
+        }
+        functionQueryWrapper.orderByAsc("seq");
+
+        List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
         //勾选上角色选中的功能
         List<SysRoleFunction> roleFunctionList = sysRoleFunctionMapper.selectList(new QueryWrapper<SysRoleFunction>().eq("role_id", role));
         List<Integer> funIds = roleFunctionList.stream().map(fun -> fun.getFunctionId()).collect(Collectors.toList());
@@ -242,6 +308,23 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg setDefaultRole(Integer id, Integer companyId) {
+        //查找当前默认的角色
+        List<SysRole> oldRoleList = sysRoleMapper.selectList(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+        if (oldRoleList.size() > 0) {
+            SysRole role = oldRoleList.get(0);
+            role.setIsDefault(0);
+            sysRoleMapper.updateById(role);
+        }
+        //设置当前的为默认的
+        SysRole role = new SysRole();
+        role.setId(id);
+        role.setIsDefault(1);
+        sysRoleMapper.updateById(role);
+        return new HttpRespMsg();
+    }
+
     private List<Integer> getCheckedFunList(JSONObject menu) {
         List<Integer> funIds = new ArrayList<>();
         JSONArray funList = menu.getJSONArray("functionList");

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

@@ -0,0 +1,20 @@
+package com.hssx.user.service.impl;
+
+import com.hssx.user.entity.TimeType;
+import com.hssx.user.mapper.TimeTypeMapper;
+import com.hssx.user.service.TimeTypeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author QuYueTing
+ * @since 2022-04-01
+ */
+@Service
+public class TimeTypeServiceImpl extends ServiceImpl<TimeTypeMapper, TimeType> implements TimeTypeService {
+
+}

+ 1 - 1
fhKeeper/formulahousekeeper/user/src/main/java/com/hssx/user/utils/CodeGenerator.java

@@ -172,7 +172,7 @@ public class CodeGenerator {
         //若想要生成的实体类继承某个Controller,则可打开下面注释。写上需要继承的Controller的位置即可
 //        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
         //单独生成逗号隔开
-        strategy.setInclude("sys_role");
+        strategy.setInclude("time_type", "company");
 
         //全生成
 //        strategy.setExclude();

+ 2 - 1
fhKeeper/formulahousekeeper/user/src/main/resources/mapper/CompanyMapper.xml

@@ -18,11 +18,12 @@
         <result column="package_customer" property="packageCustomer" />
         <result column="package_engineering" property="packageEngineering" />
         <result column="package_simple" property="packageSimple" />
+        <result column="package_finance" property="packageFinance" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple
+        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance
     </sql>
 
 </mapper>

+ 10 - 2
fhKeeper/formulahousekeeper/user/src/main/resources/mapper/SysFunctionMapper.xml

@@ -11,12 +11,20 @@
         <result column="module_id" property="moduleId" />
         <result column="seq" property="seq" />
         <result column="use_state" property="useState" />
-        <result column="package_type" property="packageType" />
+        <result column="package_time" property="packageTime" />
+        <result column="package_project" property="packageProject" />
+        <result column="package_oa" property="packageOa" />
+        <result column="package_expense" property="packageExpense" />
+        <result column="package_customer" property="packageCustomer" />
+        <result column="package_engineering" property="packageEngineering" />
+        <result column="package_contract" property="packageContract" />
+        <result column="package_etimecard" property="packageEtimecard" />
+        <result column="package_finance" property="packageFinance" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, icon, code, module_id, seq, use_state, package_type
+        id, name, icon, code, module_id, seq, use_state, package_time, package_project, package_oa, package_expense, package_customer, package_engineering, package_contract, package_etimecard, package_finance
     </sql>
 
 </mapper>

+ 11 - 3
fhKeeper/formulahousekeeper/user/src/main/resources/mapper/SysModuleMapper.xml

@@ -12,13 +12,21 @@
         <result column="orderitem" property="orderitem" />
         <result column="is_menu" property="isMenu" />
         <result column="use_state" property="useState" />
-        <result column="config" property="config" />
-        <result column="package_type" property="packageType" />
+        <result column="package_time" property="packageTime" />
+        <result column="package_project" property="packageProject" />
+        <result column="package_oa" property="packageOa" />
+        <result column="package_expense" property="packageExpense" />
+        <result column="package_customer" property="packageCustomer" />
+        <result column="package_engineering" property="packageEngineering" />
+        <result column="package_contract" property="packageContract" />
+        <result column="package_etimecard" property="packageEtimecard" />
+        <result column="report_workflow" property="reportWorkflow" />
+        <result column="package_finance" property="packageFinance" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, path, parent_id, icon, orderitem, is_menu, use_state, config, package_type
+        id, name, path, parent_id, icon, orderitem, is_menu, use_state, package_time, package_project, package_oa, package_expense, package_customer, package_engineering, package_contract, package_etimecard, report_workflow, package_finance
     </sql>
 
 </mapper>

+ 2 - 1
fhKeeper/formulahousekeeper/user/src/main/resources/mapper/SysRoleMapper.xml

@@ -9,11 +9,12 @@
         <result column="rolename" property="rolename" />
         <result column="role_describe" property="roleDescribe" />
         <result column="parent_role" property="parentRole" />
+        <result column="is_default" property="isDefault" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, rolename, role_describe, parent_role
+        id, company_id, rolename, role_describe, parent_role, is_default
     </sql>
 
 </mapper>

+ 35 - 0
fhKeeper/formulahousekeeper/user/src/main/resources/mapper/TimeTypeMapper.xml

@@ -0,0 +1,35 @@
+<?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.hssx.user.mapper.TimeTypeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.hssx.user.entity.TimeType">
+        <id column="company_id" property="companyId" />
+        <result column="allday" property="allday" />
+        <result column="am" property="am" />
+        <result column="pm" property="pm" />
+        <result column="month_days" property="monthDays" />
+        <result column="hour_cost_input_type" property="hourCostInputType" />
+        <result column="type" property="type" />
+        <result column="pay_overtime" property="payOvertime" />
+        <result column="alert_time" property="alertTime" />
+        <result column="multi_worktime" property="multiWorktime" />
+        <result column="fix_monthcost" property="fixMonthcost" />
+        <result column="fill_months" property="fillMonths" />
+        <result column="custom_degree_active" property="customDegreeActive" />
+        <result column="custom_degree_name" property="customDegreeName" />
+        <result column="alert_msg" property="alertMsg" />
+        <result column="sync_corpwx_time" property="syncCorpwxTime" />
+        <result column="need_dept_audit" property="needDeptAudit" />
+        <result column="report_workflow" property="reportWorkflow" />
+        <result column="custom_data_active" property="customDataActive" />
+        <result column="custom_data_name" property="customDataName" />
+        <result column="finance_audit" property="financeAudit" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time, need_dept_audit, report_workflow, custom_data_active, custom_data_name, finance_audit
+    </sql>
+
+</mapper>