瀏覽代碼

报销接口,钉钉授权开通接口,钉钉手动同步通讯录接口

seyason 3 年之前
父節點
當前提交
29102025f3

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

@@ -126,6 +126,20 @@ public class DingDingController {
                                         e.printStackTrace();
                                     }
                                 }
+                            } 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();
+//                                    }
+                                }
                             }
                         }
                     }
@@ -142,6 +156,23 @@ public class DingDingController {
     }
 
 
+    @RequestMapping("/syncCorpMembs")
+    public HttpRespMsg syncCorpMembs(String corpid) {
+        try {
+            String rest = dingDingService.syncCorpMembs(corpid);
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.data = rest;
+            return msg;
+        } catch (ApiException e) {
+            e.printStackTrace();
+            System.err.println(e.getMessage());
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError(e.getMessage());
+            return msg;
+        }
+
+    }
+
     @RequestMapping("/getUserByCode")
     public HttpRespMsg getUserByCode(String code, String corpid) {
         return dingDingService.getUserByCode(code, corpid);

+ 91 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveSheetController.java

@@ -0,0 +1,91 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.ExpenseSheet;
+import com.management.platform.entity.LeaveSheet;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ExpenseSheetService;
+import com.management.platform.service.LeaveSheetService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-09
+ */
+@RestController
+@RequestMapping("/leave-sheet")
+public class LeaveSheetController {
+
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    LeaveSheetService leaveSheetService;
+    @Resource
+    private HttpServletRequest request;
+
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(LeaveSheet sheet) {
+        String userId = request.getHeader("Token");
+        return leaveSheetService.add(sheet, userId);
+
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        return leaveSheetService.delete(id);
+
+    }
+
+    @RequestMapping("/list")
+    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) {
+            //普通员工只能看自己的
+            sheet.setOwnerId(user.getId());
+        }
+        sheet.setCompanyId(user.getCompanyId());
+        return leaveSheetService.queryList(sheet, pageIndex, pageSize);
+    }
+
+    @RequestMapping("/approve")
+    public HttpRespMsg approve(Integer id) {
+
+        return leaveSheetService.approve(id);
+
+    }
+    @RequestMapping("/deny")
+    public HttpRespMsg deny(Integer id) {
+
+        return leaveSheetService.deny(id);
+
+    }
+
+    /**
+     *
+     * @param keyword 姓名(模糊匹配)
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @return
+     */
+    @RequestMapping("/summaryData")
+    public HttpRespMsg summaryData(String keyword, String startDate, String endDate) {
+        String userId = request.getHeader("Token");
+        return leaveSheetService.summaryData(keyword, startDate, endDate, userId);
+
+    }
+}
+

+ 129 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/LeaveSheet.java

@@ -0,0 +1,129 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class LeaveSheet extends Model<LeaveSheet> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 填报人id
+     */
+    @TableField("owner_id")
+    private String ownerId;
+
+    /**
+     * 填报人姓名
+     */
+    @TableField("owner_name")
+    private String ownerName;
+
+    /**
+     * 开始日期
+     */
+    @TableField("start_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    /**
+     * 结束日期
+     */
+    @TableField("end_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+    /**
+     * 假期类型:0-事假,1-病假,2-年假,3-产假
+     */
+    @TableField("leave_type")
+    private Integer leaveType;
+
+    /**
+     * 0-审核通过,1-待审核,2-驳回,3-已撤回
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 录入人
+     */
+    @TableField("operator_id")
+    private String operatorId;
+
+    /**
+     * 请假时长
+     */
+    @TableField("time_hours")
+    private Float timeHours;
+
+    /**
+     * 请假天数
+     */
+    @TableField("time_days")
+    private Float timeDays;
+
+    /**
+     * 时间
+     */
+    @TableField("indate")
+    private LocalDateTime indate;
+
+    /**
+     * 0-按天,1-按小时
+     */
+    @TableField("time_type")
+    private Integer timeType;
+
+    /**
+     * 手机号
+     */
+    @TableField("tel")
+    private String tel;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveSheetMapper.java

@@ -0,0 +1,19 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.LeaveSheet;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-09
+ */
+public interface LeaveSheetMapper extends BaseMapper<LeaveSheet> {
+
+    List<LeaveSheet> summaryData(String keyword, String startDate, String endDate, Integer companyId);
+}

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java

@@ -5,6 +5,9 @@ import com.taobao.api.ApiException;
 
 public interface DingDingService {
     public void corpAuth(String corpid, String corpName, String authUserId) throws ApiException;
+
+    public String syncCorpMembs(String corpid) throws ApiException;
+
     public void updateSuiteTicket(String suiteTicket);
 
     HttpRespMsg getUserByCode(String code, String corpid);

+ 29 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LeaveSheetService.java

@@ -0,0 +1,29 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ExpenseSheet;
+import com.management.platform.entity.LeaveSheet;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-09
+ */
+public interface LeaveSheetService extends IService<LeaveSheet> {
+
+    HttpRespMsg add(LeaveSheet sheet, String userId);
+
+    HttpRespMsg delete(Integer id);
+
+    HttpRespMsg queryList(LeaveSheet sheet,  Integer pageIndex,  Integer pageSize);
+
+    HttpRespMsg approve(Integer id);
+
+    HttpRespMsg deny(Integer id);
+
+    HttpRespMsg summaryData(String keyword, String startDate, String endDate, String userId);
+}

+ 112 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -90,6 +90,9 @@ public class DingDingServiceImpl implements DingDingService {
             //首先生成一个新公司,增加会员的试用一个月
             company = new Company().setCompanyName(corpName)
                     .setExpirationDate(LocalDateTime.now().plusMonths(1));
+            company.setPackageExpense(1);
+            company.setPackageCustomer(1);
+            company.setPackageProject(1);
             companyMapper.insert(company);
 
             //生成工作时长
@@ -140,13 +143,76 @@ public class DingDingServiceImpl implements DingDingService {
             //获取部门
             if (dingding.getAccessToken() != null) {
                 String accessToken = dingding.getAccessToken();
-                getDepartmentList(company.getId(), corpid, accessToken, 1L, null);
+                System.out.println("======dingding========首次授权, accessToken="+accessToken);
+//                getDepartmentList(company.getId(), corpid, accessToken, 1L, null);
+
+                //获取授权的部门
+                getAuthedDeptsAndUsers(dingding, accessToken);
+
+            } else {
+                System.out.println("AccessToken为空,无法获取部门列表");
             }
         } else {
             companyDingdingMapper.updateById(dingding);
         }
     }
 
+    @Override
+    public String syncCorpMembs(String corpid) throws ApiException {
+        CompanyDingding dingding = companyDingdingMapper.selectById(corpid);
+        if (dingding.getExpireTime().isBefore(LocalDateTime.now())) {
+            SysConfig config = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "dingding_suite_ticket"));
+            OapiServiceGetCorpTokenResponse result = getAuthCorpAccessToken(corpid, config.getParamValue());
+            if (result != null) {
+                dingding.setAccessToken(result.getAccessToken());
+                LocalDateTime time = LocalDateTime.now();
+                time = time.plusSeconds(result.getExpiresIn());//设置token过期时间
+                dingding.setExpireTime(time);
+                companyDingdingMapper.updateById(dingding);
+            }
+        }
+        String accessToken = dingding.getAccessToken();
+        System.out.println("syncCorpMembs 开始获取部门, accessToken="+accessToken);
+
+        //获取授权的部门
+        getAuthedDeptsAndUsers(dingding, accessToken);
+        return "调用成功";
+
+//        String rest = getDepartmentList(dingding.getCompanyId(), corpid, accessToken, 1L, null);
+
+    }
+
+    private void getAuthedDeptsAndUsers(CompanyDingding dingding, String accessToken) {
+        try {
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/auth/scopes");
+            OapiAuthScopesRequest req = new OapiAuthScopesRequest();
+            req.setHttpMethod("GET");
+            OapiAuthScopesResponse rsp = client.execute(req, accessToken);
+            System.out.println("获取通讯录授权范围:"+rsp.getBody());
+            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);
+                }
+
+                //直接授权的人员,没有部门
+                JSONArray userArray = json.getJSONObject("auth_org_scopes").getJSONArray("authed_user");
+                for (int i=0;i<userArray.size(); i++) {
+                    String userdingId = userArray.getString(i);
+                    //获取人员详情
+                    getUserDetail(dingding.getCompanyId(), 0, userdingId, accessToken);
+                }
+            } else {
+                System.err.println("获取通讯录范围出错:" + json.toJSONString());
+            }
+        } catch (ApiException e) {
+            e.printStackTrace();
+        }
+    }
+
     private void getUserDetailInfo(User user, String accessToken) throws ApiException {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
         OapiV2UserGetRequest req = new OapiV2UserGetRequest();
@@ -314,14 +380,53 @@ public class DingDingServiceImpl implements DingDingService {
         return null;
     }
 
+    //获取部门详情和部门下的人员
+    public void getDepartmentDetailAndUserList(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();
+            req.setDeptId(deptId);
+            OapiV2DepartmentGetResponse rsp = client.execute(req, accessToken);
+            System.out.println(rsp.getBody());
+            JSONObject json = JSONObject.parseObject(rsp.getBody());
+            if (json.getInteger("errcode") == 0) {
+                JSONObject dept = json.getJSONObject("result");
+                DepartmentDingding departmentDingding = new DepartmentDingding();
+                departmentDingding.setCorpid(corpid);
+                departmentDingding.setDdDeptid(dept.getInteger("dept_id"));
+                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);
+                }
+
+                departmentDingding.setSysDeptid(department.getDepartmentId());
+                departmentDingdingMapper.insert(departmentDingding);
+
+                //获取该部门下的人员
+                getDeptUserIdList(companyId, deptId, department.getDepartmentId(), accessToken);
+            }
+
+        } catch (ApiException e) {
+            e.printStackTrace();
+        }
+    }
+
     //获取该部门下的人员和子部门列表,递归下一级子部门
-    public void getDepartmentList(Integer companyId, String corpid, String access_token, long parentDeptId, Integer parentSysDeptId) throws ApiException {
+    public String getDepartmentList(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);
         req.setLanguage("zh_CN");
         OapiV2DepartmentListsubResponse rsp = client.execute(req, access_token);
-        System.out.println(rsp.getBody());
+        System.out.println("获取部门返回:"+rsp.getBody());
         JSONObject json = JSONObject.parseObject(rsp.getBody());
         if (json.getInteger("errcode") == 0) {
             //正确返回的情况
@@ -352,7 +457,10 @@ public class DingDingServiceImpl implements DingDingService {
             }
             //获取部门下的人员列表
             getDeptUserIdList(companyId, parentDeptId, parentSysDeptId, access_token);
+        } else {
+            return json.toJSONString();
         }
+        return null;
     }
 
     //获取部门下的人员ids
@@ -361,7 +469,7 @@ public class DingDingServiceImpl implements DingDingService {
         OapiUserListidRequest req = new OapiUserListidRequest();
         req.setDeptId(ddDeptId);
         OapiUserListidResponse rsp = client.execute(req, access_token);
-        System.out.println(rsp.getBody());
+        System.out.println("获取人员返回:"+rsp.getBody());
         JSONObject resp = JSONObject.parseObject(rsp.getBody());
         if (resp.getInteger("errcode") == 0) {
             JSONArray jsonArray = resp.getJSONObject("result").getJSONArray("userid_list");

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

@@ -0,0 +1,132 @@
+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.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.ExpenseItemService;
+import com.management.platform.service.LeaveSheetService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-09
+ */
+@Service
+@Transactional
+public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSheet> implements LeaveSheetService {
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private LeaveSheetMapper  leaveSheetMapper;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+
+
+    @Override
+    public HttpRespMsg add(LeaveSheet sheet, String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        boolean isNew = false;
+        if (sheet.getId() == null) {
+            isNew = true;
+        }
+        sheet.setOperatorId(userId);//设置操作人id
+//        sheet.setOwnerId(userId);
+        User user = userMapper.selectById(userId);
+        sheet.setOwnerName(userMapper.selectById(sheet.getOwnerId()).getName());
+        sheet.setCompanyId(user.getCompanyId());
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        if (sheet.getLeaveType() == 0) {
+            //按天请假时,计算小时数
+            float v = timeType.getAllday() * sheet.getTimeDays();
+            sheet.setTimeHours(v);
+        }
+        if (isNew) {
+            leaveSheetMapper.insert(sheet);
+        } else {
+            leaveSheetMapper.updateById(sheet);
+        }
+
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg delete(Integer id) {
+        leaveSheetMapper.deleteById(id);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg queryList(LeaveSheet sheet, Integer pageIndex, Integer pageSize) {
+        QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>();
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
+
+        //增加状态
+        if (sheet.getStatus() != null) {
+            queryWrapper.eq("status", sheet.getStatus());
+        }
+        if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+            queryWrapper.eq("owner_id", sheet.getOwnerId());
+        }
+        if (sheet.getLeaveType() != null) {
+            queryWrapper.eq("leave_type", sheet.getLeaveType());
+        }
+        if (sheet.getStartDate() != null) {
+            queryWrapper.eq("start_date", sheet.getStartDate());
+        }
+        IPage<LeaveSheet> listIPager = leaveSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<LeaveSheet> records = listIPager.getRecords();
+        System.out.println("record size===="+records.size());
+        Long total = listIPager.getTotal();
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", records);
+        map.put("total", total);
+        httpRespMsg.data = map;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg approve(Integer id) {
+        LeaveSheet sheet = new LeaveSheet();
+        sheet.setId(id);
+        sheet.setStatus(0);
+        leaveSheetMapper.updateById(sheet);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg deny(Integer id) {
+        LeaveSheet sheet = new LeaveSheet();
+        sheet.setId(id);
+        sheet.setStatus(2);
+        leaveSheetMapper.updateById(sheet);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg summaryData(String keyword, String startDate, String endDate, String userId) {
+        Integer companyId = userMapper.selectById(userId).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = leaveSheetMapper.summaryData(keyword, startDate, endDate, companyId);
+        return msg;
+    }
+}

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

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.LeaveSheetMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.LeaveSheet">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="owner_id" property="ownerId" />
+        <result column="owner_name" property="ownerName" />
+        <result column="start_date" property="startDate" />
+        <result column="end_date" property="endDate" />
+        <result column="leave_type" property="leaveType" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+        <result column="operator_id" property="operatorId" />
+        <result column="time_hours" property="timeHours" />
+        <result column="time_days" property="timeDays" />
+        <result column="indate" property="indate" />
+        <result column="time_type" property="timeType" />
+        <result column="tel" property="tel" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, owner_id, owner_name, start_date, end_date, leave_type, status, remark, operator_id, time_hours, time_days, indate, time_type, tel
+    </sql>
+    <select id="summaryData"  resultMap="BaseResultMap">
+        select owner_id, owner_name, sum(time_hours) as time_hours, sum(time_days) as time_days from leave_sheet
+        where start_date &gt;= #{startDate} and end_date &lt;= #{endDate}
+        <if test="keyword != null and keyword != ''">
+            and owner_name like '%${keyword}%'
+        </if>
+        and company_id = #{companyId}
+    </select>
+</mapper>