瀏覽代碼

请假接口,钉钉授权逻辑修改,项目加班报表接口

seyason 3 年之前
父節點
當前提交
88cfe6055c
共有 12 個文件被更改,包括 213 次插入35 次删除
  1. 12 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  2. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java
  3. 25 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  4. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  5. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceService.java
  6. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  7. 37 25
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  8. 57 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  9. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  10. 53 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  11. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveSheetMapper.xml
  12. 14 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

+ 12 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -75,6 +75,7 @@ public class DingDingController {
                  * }
                  */
                 if ("suite_ticket".equals(eventType)) {
+                    System.out.println("==推送SuiteTicket===");
                     dingDingService.updateSuiteTicket(eventJson.getString("SuiteTicket"));
                 } else if ("tmp_auth_code".equals(eventType)) {
                     //企业授权开通应用
@@ -87,6 +88,7 @@ public class DingDingController {
                      *    "SuiteKey":"xxxxxx"
                      *  }
                      */
+                    System.out.println("==企业授权开通应用===");
 
                 } else if ("SYNC_HTTP_PUSH_HIGH".equals(eventType)) {
                     /**
@@ -108,6 +110,7 @@ public class DingDingController {
                                 JSONObject biz_data = JSONObject.parseObject(bizItem.getString("biz_data"));
                                 String syncAction = biz_data.getString("syncAction");
                                 if ("suite_ticket".equals(syncAction)) {
+                                    System.out.println("==Push 推送事件 suite_ticket===");
                                     dingDingService.updateSuiteTicket(biz_data.getString("suiteTicket"));
                                 }
                             } else if (bizType == 4) {
@@ -116,6 +119,7 @@ public class DingDingController {
                                 String syncAction = biz_data.getString("syncAction");
                                 if ("org_suite_auth".equals(syncAction)) {
                                     //开通授权应用
+                                    System.out.println("==Push 推送事件 开通授权应用===");
                                     JSONObject authCorpInfo = biz_data.getJSONObject("auth_corp_info");
                                     String corp_name = authCorpInfo.getString("corp_name");
                                     String corpid = authCorpInfo.getString("corpid");
@@ -125,20 +129,21 @@ public class DingDingController {
                                     } catch (ApiException e) {
                                         e.printStackTrace();
                                     }
+                                } else if ("org_suite_change".equals(syncAction)) {
+                                    System.out.println("==Push 推送事件 org_suite_change===");
                                 }
                             } else if (bizType == 7) {
-
                                 JSONObject biz_data = JSONObject.parseObject(bizItem.getString("biz_data"));
                                 String syncAction = biz_data.getString("syncAction");
                                 if ("org_micro_app_scope_update".equals(syncAction)) {
                                     //授权范围变更,我们尝试重新获取组织结构
                                     String corpid = bizItem.getString("corp_id");
-
-//                                    try {
-//                                        dingDingService.scopeChange(corpid);
-//                                    } catch (ApiException e) {
-//                                        e.printStackTrace();
-//                                    }
+                                    System.out.println("==Push 推送事件 使用范围变更===");
+                                    try {
+                                        dingDingService.syncCorpMembs(corpid);
+                                    } catch (ApiException e) {
+                                        e.printStackTrace();
+                                    }
                                 }
                             }
                         }

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

@@ -50,6 +50,11 @@ public class FinanceController {
         return financeService.getTimeCost(yearMonth, request);
     }
 
+    @RequestMapping("/getNoProjectUsers")
+    public HttpRespMsg getNoProjectUsers(String yearMonth, HttpServletRequest request) {
+        return financeService.getNoProjectUsers(yearMonth, request);
+    }
+
 
 
 }

+ 25 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -287,6 +287,30 @@ public class ProjectController {
     public HttpRespMsg getGanttData(HttpServletRequest request) {
         return projectService.getGanttData(request);
     }
-    //
+
+    /**
+     *
+     * @param projectId 项目id, 非必传
+     * @param startDate 开始日期 必传
+     * @param endDate  结束日期 必传
+     * @return
+     */
+    @RequestMapping("/getOvertimeList")
+    public HttpRespMsg getOvertimeList(Integer projectId, String startDate, String endDate) {
+        return projectService.getOvertimeList(projectId, startDate, endDate, request);
+    }
+
+
+    /**
+     * 导出加班统计报表
+     * @param projectId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    @RequestMapping("/exportOvertimeList")
+    public HttpRespMsg exportOvertimeList(Integer projectId, String startDate, String endDate) {
+        return projectService.exportOvertimeList(projectId, startDate, endDate, request);
+    }
 }
 

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

@@ -54,4 +54,6 @@ public interface ProjectMapper extends BaseMapper<Project> {
 
     List<Map<String, Object>> getUserMonthTimeCost(@Param("companyId") Integer companyId, @Param("startDate") String startDate, @Param("endDate") String endDate);
 
+    List<Map<String, Object>> getOvertimeList(Integer companyId, String startDate, String endDate, Integer projectId);
+
 }

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

@@ -24,4 +24,6 @@ public interface FinanceService extends IService<Finance> {
     HttpRespMsg exportData(String date, HttpServletRequest request);
 
     HttpRespMsg getTimeCost(String yearMonth, HttpServletRequest request);
+
+    HttpRespMsg getNoProjectUsers(String yearMonth, HttpServletRequest request);
 }

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

@@ -86,4 +86,8 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg getProjectStagesCost(Integer pageIndex, Integer pageSize, HttpServletRequest request);
 
     HttpRespMsg exportProjectStagesCost( HttpServletRequest request);
+
+    HttpRespMsg getOvertimeList(Integer projectId, String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg exportOvertimeList(Integer projectId, String startDate, String endDate, HttpServletRequest request);
 }

+ 37 - 25
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -192,12 +192,17 @@ public class DingDingServiceImpl implements DingDingService {
             JSONObject json = JSONObject.parseObject(rsp.getBody());
             if (json.getInteger("errcode") == 0) {
                 JSONArray deptArray = json.getJSONObject("auth_org_scopes").getJSONArray("authed_dept");
-                List<Long> result = new ArrayList<>();
-                for (int i=0;i<deptArray.size(); i++) {
-                    long deptId = deptArray.getLongValue(i);
-                    getDepartmentDetailAndUserList(dingding.getCompanyId(), dingding.getCorpid(), dingding.getAccessToken(), deptId);
+                //如果授权的是全部公司部门,则递归获取子部门和人员
+                if (deptArray.size() == 1 && deptArray.getLong(0) == 1L) {
+                    getDepartmentList(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);
+                    }
                 }
 
+
                 //直接授权的人员,没有部门
                 JSONArray userArray = json.getJSONObject("auth_org_scopes").getJSONArray("authed_user");
                 for (int i=0;i<userArray.size(); i++) {
@@ -298,7 +303,9 @@ public class DingDingServiceImpl implements DingDingService {
             if (json.getInteger("errcode") == 0) {
                 JSONObject result = json.getJSONObject("result");
                 String dduid = result.getString("userid");
-                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("dingding_userid", dduid).orderByDesc("create_time"));
+                CompanyDingding companyDingding = companyDingdingMapper.selectById(corpid);
+                //一个钉钉用户可能有多个企业,他们的dingding_userid是一样的,此处需要结合companyId来组合判断
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("dingding_userid", dduid).eq("company_id", companyDingding.getCompanyId()).orderByDesc("create_time"));
                 if (userList.size() == 0) {
                     httpRespMsg.setError("您尚无权使用系统,请联系管理员。");
                     return httpRespMsg;
@@ -308,7 +315,8 @@ public class DingDingServiceImpl implements DingDingService {
                     httpRespMsg.setError("该账户已停用,无法登陆。请联系管理员");
                 } else {
                     //查看该公司非会员公司,只能允许试用三天,超时不可登录
-                    Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", user.getCompanyId()));
+
+                    Company company = companyMapper.selectById(companyDingding.getCompanyId());
                     //公司未办理会员
                     if (null != company.getExpirationDate()) {
                         if (0 == company.getSetMeal()) {
@@ -397,20 +405,24 @@ public class DingDingServiceImpl implements DingDingService {
                 departmentDingding.setName(dept.getString("name"));
                 departmentDingding.setDdParentid(dept.getInteger("parent_id"));
                 Department department = new Department();
-                department.setDepartmentName(dept.getString("name"));
+
                 department.setCompanyId(companyId);
-                //检查该部门是否已经创建
-                List<Department> existDept = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId).eq("department_name", dept.getString("name")));
-                if (existDept.size() > 0) {
-                    department = existDept.get(0);
-                } else {
-                    departmentMapper.insert(department);
+                //检查,根部门是公司名称,不需要创建部门
+                if (departmentDingding.getDdDeptid() != 1) {
+                    department.setDepartmentName(dept.getString("name"));
+                    //检查该部门是否已经创建
+                    List<Department> existDept = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId).eq("department_name", dept.getString("name")));
+                    if (existDept.size() > 0) {
+                        department = existDept.get(0);
+                    } else {
+                        departmentMapper.insert(department);
+                        departmentDingding.setSysDeptid(department.getDepartmentId());
+                        departmentDingdingMapper.insert(departmentDingding);
+                    }
                 }
 
-                departmentDingding.setSysDeptid(department.getDepartmentId());
-                departmentDingdingMapper.insert(departmentDingding);
 
-                //获取该部门下的人员
+                //获取该部门下的人员, 如果是根部门,不会创建,人员的部门id会使用数据库默认的0
                 getDeptUserIdList(companyId, deptId, department.getDepartmentId(), accessToken);
             }
 
@@ -431,8 +443,6 @@ public class DingDingServiceImpl implements DingDingService {
         if (json.getInteger("errcode") == 0) {
             //正确返回的情况
             JSONArray depts = json.getJSONArray("result");
-            List<Department> innerDeptList = new ArrayList<>();
-            List<DepartmentDingding> dingdingDeptList = new ArrayList<>();
             for (int i=0;i<depts.size(); i++) {
                 JSONObject dept = depts.getJSONObject(i);
                 DepartmentDingding departmentDingding = new DepartmentDingding();
@@ -444,11 +454,13 @@ public class DingDingServiceImpl implements DingDingService {
                 department.setDepartmentName(dept.getString("name"));
                 department.setCompanyId(companyId);
                 department.setSuperiorId(parentSysDeptId);
-                departmentMapper.insert(department);
-                departmentDingding.setSysDeptid(department.getDepartmentId());
-                departmentDingdingMapper.insert(departmentDingding);
-                innerDeptList.add(department);
-                dingdingDeptList.add(departmentDingding);
+                //检查部门是否重复
+                Integer count = department.selectCount(new QueryWrapper<Department>().eq("company_id", companyId).eq("department_name", department.getDepartmentName()));
+                if (count == 0) {
+                    departmentMapper.insert(department);
+                    departmentDingding.setSysDeptid(department.getDepartmentId());
+                    departmentDingdingMapper.insert(departmentDingding);
+                }
 
                 //获取该部门下的人员
 //                getDeptUserList(companyId, departmentDingding.getDdDeptid(), department.getDepartmentId(), access_token, 0L);
@@ -513,11 +525,11 @@ public class DingDingServiceImpl implements DingDingService {
                 user.setDepartmentCascade(convertDepartmentIdToCascade(departmentId));
             }
             //检查用户是否已经存在
-            if (userMapper.selectCount(new QueryWrapper<User>().eq("dingding_userid", dingdingUserid)) == 0) {
+            if (userMapper.selectCount(new QueryWrapper<User>().eq("dingding_userid", dingdingUserid).eq("company_id", companyId)) == 0) {
                 userMapper.insert(user);
             } else {
                 //更新信息
-                User oldUser = userMapper.selectList(new QueryWrapper<User>().eq("dingding_userid", dingdingUserid).orderByDesc("create_time")).get(0);
+                User oldUser = userMapper.selectList(new QueryWrapper<User>().eq("dingding_userid", dingdingUserid).eq("company_id", companyId).orderByDesc("create_time")).get(0);
                 oldUser.setName(userJson.getString("name"));
                 oldUser.setDepartmentId(departmentId);
                 if (oldUser.getRole() != Constant.ROLE_MASTER) {

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

@@ -469,6 +469,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 totalHouse = totalHouse.add(house);
                 totalOther = totalOther.add(other);
             }
+
+
             //整体四舍五入处理
             totalMoneyCost = totalMoneyCost.setScale(2, BigDecimal.ROUND_HALF_UP);
             totalSalary = totalSalary.setScale(2, BigDecimal.ROUND_HALF_UP);
@@ -619,18 +621,30 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             }
             List<Finance> finances = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+            //未投入项目的人员
+            ProjectSumItem noProjectItem = new ProjectSumItem();
+
             finances.forEach(f->{
                 String uid = f.getUserId();
                 BigDecimal b = userTime.get(uid);
                 if (b == null) {
-                    //该员工无工时填报,计入项目
+                    //该员工无工时填报,计入项目
                     f.setHourCost(new BigDecimal(0));
+                    if (noProjectItem.project == null) {
+                        noProjectItem.project = "无项目";
+                        noProjectItem.workingTime = 0;
+                        noProjectItem.cost = new BigDecimal(0);
+
+                    }
+                    noProjectItem.cost = noProjectItem.cost.add(f.getTotalCost());
+
                 } else {
                     BigDecimal avgHourCost = f.getTotalCost().divide(b,6, BigDecimal.ROUND_HALF_UP);
                     f.setHourCost(avgHourCost);
                 }
             });
 
+
             for (Map<String, Object> map : projectTimeList) {
                 String curProject = (String) map.get("project");
                 String creatorId = (String) map.get("creatorId");
@@ -655,12 +669,19 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 }
                 totalMoneyCost = totalMoneyCost.add(cost);
             }
+//            //存在无项目的人员,加入总成本
+//            if (noProjectItem.project != null){
+//                totalMoneyCost = totalMoneyCost.add(noProjectItem.cost);
+//                pList.add(noProjectItem);
+//            }
+
             //整体四舍五入处理
             totalMoneyCost = totalMoneyCost.setScale(2, BigDecimal.ROUND_HALF_UP);
             pList.forEach(p->{
                 p.cost = p.cost.setScale(2, BigDecimal.ROUND_HALF_UP);
             });
             resultMap.put("costList", pList);
+            resultMap.put("noProjectItem", noProjectItem);
             resultMap.put("totalMoneyCost", totalMoneyCost);
             httpRespMsg.data = resultMap;
         } catch (NullPointerException e) {
@@ -670,4 +691,39 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
         }
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg getNoProjectUsers(String yearMonth, HttpServletRequest request) {
+
+        Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
+
+        //获取月成本列表
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String dateStr = yearMonth+"-01";
+        LocalDate startDate = LocalDate.parse(dateStr,df);
+        LocalDate endDate = LocalDate.parse(dateStr,df);
+        endDate = endDate.plusMonths(1);
+        List<Map<String, Object>> projectTimeList = reportMapper.getRealProjectTime(startDate, endDate, companyId);
+
+        List<Finance> finances = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
+        List<Finance> noProjectUsers = new ArrayList<>();
+        finances.forEach(f->{
+            boolean has = false;
+            for (Map<String, Object> map : projectTimeList) {
+                String creatorId = (String) map.get("creatorId");
+                if (creatorId.equals(f.getUserId())) {
+                    has = true;
+                    break;
+                }
+            }
+            if (!has) {
+                noProjectUsers.add(f);
+            }
+        });
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = noProjectUsers;
+        return msg;
+    }
+
+
 }

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

@@ -90,7 +90,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
             queryWrapper.eq("leave_type", sheet.getLeaveType());
         }
         if (sheet.getStartDate() != null) {
-            queryWrapper.eq("start_date", sheet.getStartDate());
+            queryWrapper.le("start_date", sheet.getStartDate()).gt("end_date", sheet.getEndDate());
         }
         IPage<LeaveSheet> listIPager = leaveSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
                 queryWrapper);

+ 53 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -1335,6 +1335,59 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg getOvertimeList(Integer projectId, String startDate, String endDate, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        msg.data = projectMapper.getOvertimeList(user.getCompanyId(), startDate, endDate, projectId);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg exportOvertimeList(Integer projectId, String startDate, String endDate, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        try {
+            String token = request.getHeader("TOKEN");
+            User user = userMapper.selectById(token);
+            List<Map<String, Object>> list = projectMapper.getOvertimeList(user.getCompanyId(), startDate, endDate, projectId);
+
+            BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+            List<String> headList = new ArrayList<String>();
+            headList.add("人员");
+            headList.add("加班工时(h)");
+            headList.add("加班成本(元)");
+            List<List<String>> allList = new ArrayList<List<String>>();
+            allList.add(headList);
+            double totalCostTime = 0;
+            for (Map<String, Object> map : list) {
+                totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("cost"));
+                totalCostTime += (Double)map.get("workingTime");
+                List<String> rowData = new ArrayList<String>();
+                rowData.add((String)map.get("username"));
+                rowData.add(((Double)map.get("workingTime")).toString());
+                rowData.add(((BigDecimal)map.get("cost")).toString());
+                allList.add(rowData);
+            }
+            String total = totalMoneyCost.toString();
+            //合计
+            List<String> sumRow = new ArrayList<String>();
+            sumRow.add("合计");
+            sumRow.add(""+totalCostTime);
+            sumRow.add(totalMoneyCost.toString());
+            allList.add(sumRow);
+            //生成excel文件导出
+            String fileName = "加班统计报表_"+System.currentTimeMillis();
+            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+
+            httpRespMsg.data = resp;
+        } catch (NullPointerException e) {
+            httpRespMsg.setError("验证失败");
+            return httpRespMsg;
+        }
+        return httpRespMsg;
+    }
+
 
     @Override
     public HttpRespMsg importData(String userId, MultipartFile multipartFile, HttpServletRequest request) {

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

@@ -32,5 +32,6 @@
             and owner_name like '%${keyword}%'
         </if>
         and company_id = #{companyId}
+        group by owner_id
     </select>
 </mapper>

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

@@ -247,4 +247,18 @@
          AND project.`status` = 1 and project.plan_start_date is not null and project.plan_end_date is not null
         ORDER BY participation.user_id, project.`plan_start_date`
     </select>
+
+    <!--获取加班统计报表 -->
+    <select id="getOvertimeList" resultType="java.util.Map">
+    SELECT report.`creator_id` AS userId, user.`name` AS username, SUM(report.`working_time`) AS workingTime,
+    SUM(report.cost) AS cost FROM report LEFT JOIN user ON user.id = report.`creator_id`
+    WHERE report.is_overtime = 1
+    and report.`state` = 1
+    AND report.`create_date` BETWEEN #{startDate} and #{endDate}
+    AND user.`company_id` = #{companyId}
+    <if test="projectId != null">
+    AND report.`project_id` = #{projectId}
+    </if>
+    GROUP BY report.creator_id
+    </select>
 </mapper>