فهرست منبع

企业微信考勤打卡

seyason 3 سال پیش
والد
کامیت
fffc949fbc
18فایلهای تغییر یافته به همراه257 افزوده شده و 67 حذف شده
  1. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  2. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java
  3. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  4. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  5. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserCorpwxTimeMapper.java
  6. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserMapper.java
  7. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  9. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  10. 31 24
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  11. 24 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  12. 23 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  13. 8 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  14. 94 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  15. 20 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/DateTimeUtil.java
  16. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  17. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCorpwxTimeMapper.xml
  18. 24 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml

+ 4 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -68,13 +68,16 @@ public class UserController {
      * 获取员工的列表
      * departmentId 检索的部门id -1为全部 0为其他
      * keyword 姓名关键字匹配,可不传
+     * status 状态, 是否活跃,可不传。 1-活跃,0-停用
+     * role 角色
      * pageIndex 页面索引
      * pageSize 页面大小
      */
     @RequestMapping("/getEmployeeList")
     public HttpRespMsg getEmployeeList(@RequestParam Integer departmentId, String keyword,
+                                       Integer status, Integer role,
                                        @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
-        return userService.getEmployeeList(departmentId, keyword, pageIndex, pageSize, request);
+        return userService.getEmployeeList(departmentId, keyword, status, role, pageIndex, pageSize, request);
     }
 
     /**

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

@@ -64,13 +64,14 @@ public class UserCorpwxTimeController {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         List<Map> list = new ArrayList<Map>();
+        int excludeWeekend = 1;//排除周末两天
         if (user.getRole() == 1 || user.getRole() == 2) {
             //管理员查看全部人员的
-            list = userCorpwxTimeMapper.getUserDataList(user.getCompanyId(), startDate, endDate, null);
+            list = userCorpwxTimeMapper.getUserDataList(user.getCompanyId(), startDate, endDate, null, excludeWeekend);
         } else {
             Integer manageDeptId = user.getManageDeptId();
             if (manageDeptId != null && manageDeptId != 0) {
-                list = userCorpwxTimeMapper.getUserDataList(user.getCompanyId(), startDate, endDate, manageDeptId);
+                list = userCorpwxTimeMapper.getUserDataList(user.getCompanyId(), startDate, endDate, manageDeptId, excludeWeekend);
             }
         }
         HashMap item = new HashMap();

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

@@ -763,10 +763,10 @@ public class WeiXinCorpController {
 
     //获取企业微信考勤打卡统计数据
     @RequestMapping("/getUserCheckInDayData")
-    public HttpRespMsg getUserCheckInDayData(int companyId, String startDate, String endDate) {
+    public HttpRespMsg getUserCheckInDayData(int companyId, String userId, String startDate, String endDate) {
         LocalDateTime start = LocalDateTime.parse(startDate+" 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
         LocalDateTime end = LocalDateTime.parse(endDate+" 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-        return wxCorpInfoService.getUserCheckInDayData(companyId, start, end);
+        return wxCorpInfoService.getUserCheckInDayData(companyId, userId, start, end);
     }
 
 
@@ -908,7 +908,7 @@ public class WeiXinCorpController {
             }
         }
 
-//获取部门
+        //获取部门
         JSONObject deptObj = getAllDepartments(curCorpAccessToken);
         JSONArray deptObjJSONArray = deptObj.getJSONArray("department");
 

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

@@ -22,12 +22,13 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-12-20
+ * @since 2022-01-26
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 public class Report extends Model<Report> {
+
     private static final long serialVersionUID=1L;
 
     /**
@@ -214,6 +215,12 @@ public class Report extends Model<Report> {
     @TableField("company_id")
     private Integer companyId;
 
+    /**
+     * 代填或者导入的用户id
+     */
+    @TableField("fill_userid")
+    private String fillUserid;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -16,5 +16,5 @@ import java.util.Map;
  */
 public interface UserCorpwxTimeMapper extends BaseMapper<UserCorpwxTime> {
 
-    public List<Map> getUserDataList(Integer companyId, String startDate, String endDate, Integer deptId);
+    public List<Map> getUserDataList(Integer companyId, String startDate, String endDate, Integer deptId, Integer excludeWeekend);
 }

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

@@ -19,17 +19,17 @@ 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);
+                                                  @Param("departmentId") Integer departmentId, String keyword, Integer status, Integer role);
 
     Integer countUserByDepartment(@Param("companyId") Integer companyId,
-                                  @Param("departmentId") Integer departmentId, String keyword);
+                                  @Param("departmentId") Integer departmentId, String keyword, Integer status, Integer role);
 
     List<Map<String, Object>> getUserByDepartmentList(Page page,
                                                       @Param("companyId") Integer companyId,
-                                                      @Param("departmentIds") List departmentIds, String keyword);
+                                                      @Param("departmentIds") List departmentIds, String keyword, Integer status, Integer role);
 
     Integer countUserByDepartmentList(@Param("companyId") Integer companyId,
-                                      @Param("departmentIds") List departmentIds, String keyword);
+                                      @Param("departmentIds") List departmentIds, String keyword, Integer status, Integer role);
 
     List<Map<String, Object>> getPushUserList(@Param("companyId") Integer companyId);
 

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

@@ -22,7 +22,7 @@ public interface UserService extends IService<User> {
 
     HttpRespMsg getUserInfo(String id);
 
-    HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer pageIndex, Integer pageSize, HttpServletRequest request);
+    HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer status, Integer role, Integer pageIndex, Integer pageSize, HttpServletRequest request);
 
     HttpRespMsg deleteUser(String userId, HttpServletRequest request);
 

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

@@ -23,5 +23,5 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
 
     public String testDownloadFile();
 
-    public HttpRespMsg getUserCheckInDayData(int companyId, LocalDateTime startDateTime, LocalDateTime endDateTime);
+    public HttpRespMsg getUserCheckInDayData(int companyId, String userId, LocalDateTime startDateTime, LocalDateTime endDateTime);
 }

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

@@ -654,6 +654,7 @@ public class DingDingServiceImpl implements DingDingService {
                 //可能需要更新姓名
                 if (oldUser.getName() == null) {
                     oldUser.setName(userJson.getString("name"));
+                    oldUser.setDingdingUnionid(userJson.getString("unionid"));
                     userMapper.updateById(oldUser);
                     System.out.println("更新用户姓名==" + oldUser.getName());
                 }

+ 31 - 24
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -150,12 +150,6 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 Cell inMedicalCell = row.getCell(5);
                 Cell inJobCell = row.getCell(6);
                 Cell injuryCell = row.getCell(7);
-                Cell houseFundCell = row.getCell(8);
-//                Cell otherCell = row.getCell(9);
-                Cell field1 = cusColList.size() > 0?row.getCell(9):null;
-                Cell field2 = cusColList.size() > 1?row.getCell(10):null;
-                Cell field3 = cusColList.size() > 2?row.getCell(11):null;
-
 
                 nameCell.setCellType(CellType.STRING);
                 salaryCell.setCellType(CellType.STRING);
@@ -164,17 +158,12 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 inOldCell.setCellType(CellType.STRING);
                 inMedicalCell.setCellType(CellType.STRING);
                 inJobCell.setCellType(CellType.STRING);
-                houseFundCell.setCellType(CellType.STRING);
-//                if (otherCell != null)otherCell.setCellType(CellType.STRING);
-                if (field1 != null)field1.setCellType(CellType.STRING);
-                if (field2 != null)field2.setCellType(CellType.STRING);
-                if (field3 != null)field3.setCellType(CellType.STRING);
-
                 String name = nameCell.getStringCellValue().trim().replaceAll("\\u00a0", "");
                 Finance finance = new Finance();
 
                 if (name.equals("姓名") && rowIndex == 0) {
                     //跳过第一行标题
+                    System.out.println("injuryCell===="+injuryCell.getStringCellValue());
                     if (!"工伤保险".equals(injuryCell.getStringCellValue())) {
                         //缺少工伤保险,需要新的财务报表模板
                         msg.setError("缺少工伤保险栏,请重新下载财务模板填写上传");
@@ -182,6 +171,22 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                     }
                     continue;
                 }
+                Cell houseFundCell = row.getCell(8);
+//                Cell otherCell = row.getCell(9);
+                Cell field1 = cusColList.size() > 0?row.getCell(9):null;
+                Cell field2 = cusColList.size() > 1?row.getCell(10):null;
+                Cell field3 = cusColList.size() > 2?row.getCell(11):null;
+
+
+
+                houseFundCell.setCellType(CellType.STRING);
+//                if (otherCell != null)otherCell.setCellType(CellType.STRING);
+                if (field1 != null)field1.setCellType(CellType.STRING);
+                if (field2 != null)field2.setCellType(CellType.STRING);
+                if (field3 != null)field3.setCellType(CellType.STRING);
+
+
+
                 finance.setCompanyId(companyId);
                 finance.setName(name);
 
@@ -335,20 +340,22 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             if (syncHistoryReport) {
 
                 List<Report> reportList = reportMapper.selectSimpleTime(companyId, startStr, endStr);
-                for (Report r : reportList) {
-                    Optional<User> first = updateUserList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
-                    if (!first.isPresent()) {
-                        String notFillUser = userMapper.selectById(r.getCreatorId()).getName();
-                        System.out.println("缺少[" + notFillUser + "]的薪资成本, 请修改数据重新上传");
-                        throw new UserNotFoundException("缺少[" + notFillUser + "]的薪资成本, 请修改数据重新上传");
+                if (reportList.size() > 0) {
+                    for (Report r : reportList) {
+                        Optional<User> first = updateUserList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
+                        if (!first.isPresent()) {
+                            String notFillUser = userMapper.selectById(r.getCreatorId()).getName();
+                            System.out.println("缺少[" + notFillUser + "]的薪资成本, 请修改数据重新上传");
+                            throw new UserNotFoundException("缺少[" + notFillUser + "]的薪资成本, 请修改数据重新上传");
+                        }
+                        BigDecimal hourCost = first.get().getCost();
+                        r.setCost(hourCost.multiply(new BigDecimal(r.getWorkingTime())));
+                        r.setCreatorId(null);
+                        r.setWorkingTime(null);
                     }
-                    BigDecimal hourCost = first.get().getCost();
-                    r.setCost(hourCost.multiply(new BigDecimal(r.getWorkingTime())));
-                    r.setCreatorId(null);
-                    r.setWorkingTime(null);
+                    //批量更新日报的成本
+                    reportService.updateBatchById(reportList);
                 }
-                //批量更新日报的成本
-                reportService.updateBatchById(reportList);
             }
         } catch (IOException e) {
             e.printStackTrace();

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

@@ -193,6 +193,30 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
+
+        //检查负责人要在参与人中
+        if (inchargerId != null) {
+            if (userIds == null || userIds.length == 0) {
+                userIds = new String[1];
+                userIds[0] = inchargerId;//自动加进去
+            } else {
+                boolean has = false;
+                for (int i=0;i<userIds.length; i++) {
+                    if (userIds[i].equals(inchargerId)) {
+                        has = true;
+                        break;
+                    }
+                }
+                if (!has) {
+                    String[] newArray = new String[userIds.length + 1];
+                    for (int i=0;i<userIds.length; i++) {
+                        newArray[i] = userIds[i];
+                    }
+                    newArray[newArray.length -1] = inchargerId;
+                    userIds = newArray;
+                }
+            }
+        }
         if (id == null) {
             //新增项目
             if (name == null) {

+ 23 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -425,13 +425,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (r.getMultiWorktime() == 1) {
                     //设置多个工时情况下的报告列表
                     String timeStr = r.getContent();
-                    JSONArray parse = JSONArray.parseArray(timeStr);
-                    List<WorktimeItem> list = new ArrayList<>();
-                    for (int i=0;i<parse.size(); i++) {
-                        JSONObject obj = parse.getJSONObject(i);
-                        list.add(JSONObject.toJavaObject(obj, WorktimeItem.class));
+                    if (timeStr != null) {
+                        JSONArray parse = JSONArray.parseArray(timeStr);
+                        List<WorktimeItem> list = new ArrayList<>();
+                        for (int i=0;i<parse.size(); i++) {
+                            JSONObject obj = parse.getJSONObject(i);
+                            list.add(JSONObject.toJavaObject(obj, WorktimeItem.class));
+                        }
+                        r.setWorktimeList(list);
                     }
-                    r.setWorktimeList(list);
                 }
 
                 //处理维度列表数据
@@ -947,6 +949,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (reason == null) {
                 reason = "-";
             }
+            Report oneReport = reportMapper.selectById(ids.get(0));
             if (company.getPackageEngineering() == 1) {
                 //检查是否有专业进度待审核
                 List<ReportProfessionProgress> list = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().eq("report_id", ids.get(0)).eq("audit_state", 0));
@@ -984,11 +987,20 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<Integer> collect = rList.stream().map(Report::getProjectId).collect(Collectors.toList());
             List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect));
             String pNames = projectList.stream().map(Project::getProjectName).collect(Collectors.joining(", ", "[", "]"));
-            String str = "您"+date+"填写的日报中"+pNames+"项目被领导驳回。原因:" + reason;
-            informationMapper.insert(new Information().setType(0).setContent(date).setUserId(id).setMsg(str));
+            String str = null;
+            String fillUserId = null;
+            if (oneReport.getState() == -1) {//待部门直属领导审核
+                str = "您"+date+"导入的日报中"+pNames+"项目被直属领导驳回。原因:" + reason+",请重新导入。";
+                fillUserId = oneReport.getFillUserid();
+            } else {
+                str = "您"+date+"填写的日报中"+pNames+"项目被领导驳回。原因:" + reason;
+                fillUserId = id;
+            }
+
+            informationMapper.insert(new Information().setType(0).setContent(date).setUserId(fillUserId).setMsg(str));
 
             //发送企业微信通知消息
-            User reporter = userMapper.selectById(id);
+            User reporter = userMapper.selectById(fillUserId);
             String corpwxUserid = reporter.getCorpwxUserid();
             if (corpwxUserid != null) {
                 WxCorpInfo info = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
@@ -1669,6 +1681,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 report.setProjectId(project.getId());
                                 report.setReportTimeType(1);
                                 report.setWorkingTime(time);
+                                report.setMultiWorktime(timeType.getMultiWorktime());
+                                report.setFillUserid(user.getId());
                                 if (timeType.getNeedDeptAudit() == 0) {
                                     report.setState(1);//导入的直接算审核通过
                                 } else {

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

@@ -237,7 +237,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
     //获取员工的列表
     @Override
-    public HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer pageIndex, Integer pageSize, HttpServletRequest request) {
+    public HttpRespMsg getEmployeeList(Integer departmentId, String keyword, Integer status, Integer role, Integer pageIndex, Integer pageSize, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
@@ -246,16 +246,16 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             Page<User> page = new Page<>(pageIndex, pageSize);
             if (departmentId == -1) {
                 //单独查找全部
-                list = userMapper.getUserByDepartment(page, companyId, null, keyword);
-                total = userMapper.countUserByDepartment(companyId, null, keyword);
+                list = userMapper.getUserByDepartment(page, companyId, null, keyword, status, role);
+                total = userMapper.countUserByDepartment(companyId, null, keyword, status, role);
             } else if (departmentId == 0) {
-                //单独查找0
-                list = userMapper.getUserByDepartment(page, companyId, departmentId, keyword);
-                total = userMapper.countUserByDepartment(companyId, departmentId, keyword);
+                //单独查找0, 未分配的
+                list = userMapper.getUserByDepartment(page, companyId, departmentId, keyword, status, role);
+                total = userMapper.countUserByDepartment(companyId, departmentId, keyword, status, role);
             } else {
                 //范围查找
-                list = userMapper.getUserByDepartmentList(page, companyId, getBranchDepartment(departmentId, companyId), keyword);
-                total = userMapper.countUserByDepartmentList(companyId, getBranchDepartment(departmentId, companyId), keyword);
+                list = userMapper.getUserByDepartmentList(page, companyId, getBranchDepartment(departmentId, companyId), keyword, status, role);
+                total = userMapper.countUserByDepartmentList(companyId, getBranchDepartment(departmentId, companyId), keyword, status, role);
             }
             Map<String, Object> resultMap = new HashMap<>();
             resultMap.put("records", list);

+ 94 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -29,6 +29,8 @@ import java.io.FileOutputStream;
 import java.time.*;
 import java.util.List;
 
+import static org.mockito.ArgumentMatchers.startsWith;
+
 /**
  * <p>
  *  服务实现类
@@ -225,7 +227,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     }
 
     @Override
-    public HttpRespMsg getUserCheckInDayData(int companyId, LocalDateTime startDateTime, LocalDateTime endDateTime) {
+    public HttpRespMsg getUserCheckInDayData(int companyId, String userId, LocalDateTime startDateTime, LocalDateTime endDateTime) {
         HttpRespMsg msg = new HttpRespMsg();
         WxCorpInfo corpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         if (corpInfo == null) {
@@ -248,11 +250,23 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             reqParam.put("starttime", startTime);
             reqParam.put("endtime",  endTime);
 
-            //获取企业下的全部员工
-            List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).isNotNull("corpwx_userid").eq("is_active", 1));
-            System.out.println("users size=="+users.size());
-            Object[] objects = users.stream().map(User::getCorpwxUserid).toArray();
-            reqParam.put("useridlist",  objects);
+
+            if (userId == null) {
+                //获取企业下的全部员工
+                List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).isNotNull("corpwx_userid").eq("is_active", 1));
+                System.out.println("获取考勤记录users size=="+users.size());
+                Object[] objects = users.stream().map(User::getCorpwxUserid).toArray();
+                System.out.println(objects);
+                reqParam.put("useridlist",  objects);
+            } else {
+                //指定获取员工
+                User user = userMapper.selectById(userId);
+                Object[] objects = new Object[1];
+                objects[0] = user.getCorpwxUserid();
+                reqParam.put("useridlist",  objects);
+                System.out.println("获取corpwxuserid=="+user.getCorpwxUserid()+"的考勤记录");
+            }
+
             HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
             ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
                     HttpMethod.POST, requestEntity, String.class);
@@ -283,9 +297,53 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         int regular_work_sec = summary_info.getIntValue("regular_work_sec");//秒
                         Integer standard_work_sec = summary_info.getInteger("standard_work_sec");
 
+
                         ct.setStartTime(DateTimeUtil.getTimeFromSeconds(sTime));
                         ct.setEndTime(DateTimeUtil.getTimeFromSeconds(eTime));
-                        ct.setCardTime(DateTimeUtil.getHoursFromSeconds(regular_work_sec));
+
+                        JSONArray holidayItems = jsonObject.getJSONArray("holiday_infos");
+                        if (eTime == sTime) {
+                            //开始时间和结束时间一样,说明下班没有打卡,需要提取请假的最晚时间作为下班打卡时间
+                            String lastestOffworkTime = null;
+                            for (int t=0;t<holidayItems.size(); t++) {
+                                JSONObject holiday = holidayItems.getJSONObject(t);
+                                JSONObject spTitle = holiday.getJSONObject("sp_title");
+                                JSONArray data = spTitle.getJSONArray("data");
+                                for (int m=0;m<data.size(); m++) {
+                                    String leaveText = data.getJSONObject(m).getString("text");
+                                    if (leaveText.startsWith("请假")) {
+                                        //获取对应位置的请假时间段
+                                        String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
+                                        String[] s = string.split(" ");
+                                        //获取到请假的开始时间和结束时间
+                                        String leaveEnd = s[4];
+                                        if (leaveEnd.equals("下午")) {
+                                            leaveEnd = "13:00";//请假的下班打卡时间,算上午结束的时间
+                                        }
+                                        if (lastestOffworkTime == null || leaveEnd.compareTo(lastestOffworkTime) > 0) {
+                                            lastestOffworkTime = leaveEnd;
+                                        }
+                                    }
+                                }
+                            }
+                            if (lastestOffworkTime != null) {
+                                ct.setEndTime(lastestOffworkTime);
+                                //重新计算打卡时长
+
+                                regular_work_sec = DateTimeUtil.getSecondsFromTime(lastestOffworkTime) - sTime;
+                                if (lastestOffworkTime.compareTo("13:00") > 0) {
+                                    //下午请假的,减掉午休的一小时
+                                    regular_work_sec -= 3600;
+                                }
+                            }
+                        }
+                        //打卡时间先要四舍五入
+                        double hoursFromSeconds = DateTimeUtil.getHoursFromSeconds(regular_work_sec);
+                        System.out.println("打卡间隔时长为=="+hoursFromSeconds);
+                        double hoursFromDouble = DateTimeUtil.getHoursFromDouble(hoursFromSeconds);
+                        System.out.println("四舍五入后cardTime时间=="+hoursFromDouble);
+                        ct.setCardTime(hoursFromDouble);
+
                         ct.setName(name);
                         //解析请假和外出的情况
                         JSONArray sp_items = jsonObject.getJSONArray("sp_items");
@@ -311,6 +369,35 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                     break;
                             }
                         }
+                        //获取假期详情
+                        //获取请假的最早和最晚时间
+                        for (int t=0;t<holidayItems.size(); t++) {
+                            JSONObject holiday = holidayItems.getJSONObject(t);
+                            JSONObject spTitle = holiday.getJSONObject("sp_title");
+                            JSONArray data = spTitle.getJSONArray("data");
+                            for (int m=0;m<data.size(); m++) {
+                                String leaveText = data.getJSONObject(m).getString("text");
+                                if (leaveText.startsWith("请假")) {
+                                    //获取对应位置的请假时间段
+                                    String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
+                                    String[] s = string.split(" ");
+                                    //获取到请假的开始时间和结束时间
+                                    String leaveStart = s[1];
+                                    String leaveEnd = s[4];
+
+                                    //检查请假时间段是否在打卡的时间范围内
+                                    if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
+                                        //上下午请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
+                                        System.out.println("====请假 = " + leaveEnd);
+                                    } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
+                                        String hourLeaveTime = leaveText.replaceAll("请假", "").replaceAll("小时", "");
+                                        System.out.println("请假时长=" + hourLeaveTime);
+                                        ct.setCardTime(ct.getCardTime() - Double.parseDouble(hourLeaveTime));
+                                    }
+                                }
+                            }
+
+                        }
                         if (regular_work_sec < standard_work_sec) {
                             ct.setWorkHours(ct.getCardTime() + ct.getOutdoorTime());
                         } else {

+ 20 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/DateTimeUtil.java

@@ -2,11 +2,13 @@ package com.management.platform.util;
 
 import org.apache.tomcat.jni.Local;
 
+import java.math.BigDecimal;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAccessor;
 import java.util.Arrays;
 
 public class DateTimeUtil {
@@ -24,12 +26,28 @@ public class DateTimeUtil {
         return format;
     }
 
+    //把时间转为为秒,方便计算时长
+    public static int getSecondsFromTime(String time) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+        LocalDateTime date = LocalDateTime.parse("2022-01-01 "+time, dateTimeFormatter);
+        int intSeconds = date.getHour() * 3600 + date.getMinute() * 60 + date.getSecond();
+        return intSeconds;
+    }
+
     //把时长秒转化为小时
     public static double getHoursFromSeconds(int seconds) {
         double hours = 1.0f * seconds/3600;
         return hours;
     }
 
+    /**
+     * 返回四舍五入到整数的部分
+     */
+    public static double getHoursFromDouble(double time) {
+        BigDecimal decimal = new BigDecimal(time);
+        return decimal.setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
     public static LocalDate getLocalDateFromSeconds(long time) {
         LocalDate localDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(time), ZoneId.systemDefault()).toLocalDate();
         return localDate;
@@ -42,8 +60,7 @@ public class DateTimeUtil {
 
     public static void main(String[] args) {
 
-        LocalDate now = LocalDate.now();
-        System.out.println(now.getDayOfWeek().getValue());
-        System.out.println(now.getDayOfWeek().name());
+        System.out.println(getHoursFromDouble(3.5)
+        );
     }
 }

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

@@ -30,14 +30,16 @@
         <result column="reject_userid" property="rejectUserid" />
         <result column="degree_id" property="degreeId" />
         <result column="company_id" property="companyId" />
+        <result column="fill_userid" property="fillUserid" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, creator_id, project_id, create_date, working_time, content, state, create_time, time_type, cost, start_time, end_time, report_time_type, sub_project_id, task_id, is_overtime, progress, department_audit_state, stage, pic_str, multi_worktime, reject_reason, reject_username, reject_userid, degree_id, company_id
+        id, creator_id, project_id, create_date, working_time, content, state, create_time, time_type, cost, start_time, end_time, report_time_type, sub_project_id, task_id, is_overtime, progress, department_audit_state, stage, pic_str, multi_worktime, reject_reason, reject_username, reject_userid, degree_id, company_id, fill_userid
     </sql>
 
 
+
     <!--根据日期获取全部报告信息-->
     <select id="getAllReportByDate" resultType="java.util.Map">
         SELECT c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,

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

@@ -27,13 +27,16 @@
 
 
     <select id="getUserDataList" resultType="java.util.HashMap" >
-        SELECT user.id as userId, DATE_FORMAT(a.create_date, '%Y/%m/%d') as createDate,a.start_time as startTime, a.end_time as endTime, a.work_hours as workHours, user.name as username,
+        SELECT user.id as userId, DATE_FORMAT(a.create_date, '%Y/%m/%d') as createDate,a.start_time as startTime, a.end_time as endTime, a.work_hours as workHours, user.name as username,a.week_day as weekDay,
         week_day_txt as weekDayTxt,card_time as cardTime, outdoor_time as outdoorTime, ask_leave_time as askLeaveTime FROM user_corpwx_time a LEFT JOIN user ON user.`corpwx_userid` = a.corpwx_userid
         WHERE a.create_date BETWEEN #{startDate} AND #{endDate}
         AND a.company_id = #{companyId}
         <if test="deptId != null">
             AND user.`department_id` = #{deptId}
         </if>
+        <if test="excludeWeekend == 1">
+            AND a.week_day &lt; 6
+        </if>
         ORDER BY a.create_date ASC
     </select>
 

+ 24 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml

@@ -48,6 +48,12 @@
         <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>
     </select>
 
     <!--单独分页获取人员数量-->
@@ -61,6 +67,12 @@
         <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>
     </select>
 
     <!--范围分页获取人员-->
@@ -77,6 +89,12 @@
         <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>
     </select>
 
     <!--范围分页获取人员数量-->
@@ -90,6 +108,12 @@
         <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>
     </select>