huminmin
8 天以前 0998498b2f9192b3fd04b34dc6074cac63e14985
人力资源分析接口
已添加5个文件
已修改10个文件
383 ■■■■■ 文件已修改
src/main/java/com/ruoyi/common/enums/StaffLeaveReason.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/domain/SysDept.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/AnalyticsController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/mapper/StaffLeaveMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/AnalyticsService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/vo/MonthlyTurnoverRateVo.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/vo/TotalTurnoverRateVo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/StaffLeaveMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/StaffOnJobMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysDeptMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/StaffLeaveReason.java
@@ -25,4 +25,18 @@
    public String getInfo() {
        return info;
    }
    /**
     * æ ¹æ®code获取枚举实例
     * @param code ç¦»èŒåŽŸå› ç¼–ç 
     * @return å¯¹åº”的枚举实例,若未找到则返回null
     */
    public static StaffLeaveReason getByCode(String code) {
        for (StaffLeaveReason reason : StaffLeaveReason.values()) {
            if (reason.getCode().equals(code)) {
                return reason;
            }
        }
        return null;
    }
}
src/main/java/com/ruoyi/project/system/domain/SysDept.java
@@ -54,6 +54,9 @@
    /** éƒ¨é—¨ç¼–号 */
    private String deptNick;
    /** å‘˜å·¥æ•°é‡ */
    private Integer staffCount;
    
    /** å­éƒ¨é—¨ */
    private List<SysDept> children = new ArrayList<SysDept>();
@@ -192,6 +195,14 @@
        this.deptNick = deptNick;
    }
    public Integer getStaffCount() {
        return staffCount;
    }
    public void setStaffCount(Integer staffCount) {
        this.staffCount = staffCount;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -199,6 +210,7 @@
            .append("parentId", getParentId())
            .append("ancestors", getAncestors())
            .append("deptName", getDeptName())
            .append("staffCount", getStaffCount())
            .append("orderNum", getOrderNum())
            .append("leader", getLeader())
            .append("phone", getPhone())
src/main/java/com/ruoyi/staff/controller/AnalyticsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.staff.controller;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.service.AnalyticsService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/staff/analytics")
public class AnalyticsController {
    @Resource
    private AnalyticsService analyticsService;
    @GetMapping("/reason")
    public AjaxResult staffLeaveReasonAnalytics() {
        return AjaxResult.success(analyticsService.staffLeaveReasonAnalytics());
    }
    @GetMapping("/monthly_turnover_rate")
    public AjaxResult getMonthlyTurnoverRateFor12Months() {
        return AjaxResult.success(analyticsService.getMonthlyTurnoverRateFor12Months());
    }
    @GetMapping("/total_statistic")
    public AjaxResult getTotalStatistic() {
        return AjaxResult.success(analyticsService.getTotalStatistic());
    }
}
src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java
@@ -1,11 +1,8 @@
package com.ruoyi.staff.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.staff.pojo.StaffLeave;
import lombok.Data;
import java.util.Date;
@Data
public class StaffLeaveDto extends StaffLeave {
@@ -95,4 +92,11 @@
     */
    @Excel(name = "紧急联系人电话", sort = 15)
    private String emergencyContactPhone;
    private int count;
    /**
     * ç¦»èŒåŽŸå› æ–‡æœ¬
     */
    private String reasonText;
}
src/main/java/com/ruoyi/staff/mapper/StaffLeaveMapper.java
@@ -10,6 +10,7 @@
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.List;
@@ -18,4 +19,8 @@
    IPage<StaffLeaveDto> staffLeaveListPage(Page page, @Param("c") StaffLeaveDto staffLeaveDto);
    List<StaffLeaveDto> staffLeaveList(@Param("c") StaffLeaveDto staffLeaveDto);
    List<StaffLeaveDto> staffLeaveReasonAnalytics();
    Integer countLeaveByMonth(@Param("monthStart") LocalDate monthStart, @Param("monthEnd") LocalDate monthEnd);
}
src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
@@ -8,6 +8,7 @@
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.List;
@Mapper
@@ -16,4 +17,19 @@
    IPage<StaffOnJobDto> staffOnJobListPage(Page page, @Param("staffOnJob") StaffOnJob staffOnJob);
    List<StaffOnJobDto> staffOnJobList(@Param("staffOnJob") StaffOnJob staffOnJob);
}
    /**
     * ç»Ÿè®¡æŒ‡å®šæ—¥æœŸçš„在职员工数
     * @param date æ—¥æœŸ
     * @return åœ¨èŒå‘˜å·¥æ•°
     */
    Integer countOnJobStaffByDate(@Param("date") LocalDate date);
    /**
     * ç»Ÿè®¡æŒ‡å®šæœˆä»½çš„æ–°å…¥èŒå‘˜å·¥æ•°
     * @param monthStart æœˆä»½å¼€å§‹æ—¥æœŸ
     * @param monthEnd æœˆä»½ç»“束日期
     * @return æ–°å…¥èŒå‘˜å·¥æ•°
     */
    Integer countNewHireByMonth(@Param("monthStart") LocalDate monthStart, @Param("monthEnd") LocalDate monthEnd);
}
src/main/java/com/ruoyi/staff/service/AnalyticsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.staff.service;
import com.ruoyi.staff.dto.StaffLeaveDto;
import com.ruoyi.staff.vo.MonthlyTurnoverRateVo;
import com.ruoyi.staff.vo.TotalTurnoverRateVo;
import java.util.List;
public interface AnalyticsService {
    List<StaffLeaveDto> staffLeaveReasonAnalytics();
    List<MonthlyTurnoverRateVo> getMonthlyTurnoverRateFor12Months();
    /**
     * æŸ¥è¯¢æ€»æµåŠ¨çŽ‡ã€æµå¤±çŽ‡ä»¥åŠåœ¨èŒå‘˜å·¥æ•°
     * @return æ€»ç»Ÿè®¡ç»“æžœ
     */
    TotalTurnoverRateVo getTotalStatistic();
}
src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,145 @@
package com.ruoyi.staff.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.StaffLeaveReason;
import com.ruoyi.staff.dto.StaffLeaveDto;
import com.ruoyi.staff.mapper.StaffLeaveMapper;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.pojo.StaffLeave;
import com.ruoyi.staff.service.AnalyticsService;
import com.ruoyi.staff.vo.MonthlyTurnoverRateVo;
import com.ruoyi.staff.vo.TotalTurnoverRateVo;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
@AllArgsConstructor
@Service
public class AnalyticsServiceImpl extends ServiceImpl<StaffLeaveMapper, StaffLeave> implements AnalyticsService {
    @Autowired
    private StaffLeaveMapper staffLeaveMapper;
    @Autowired
    private StaffOnJobMapper staffOnJobMapper;
    @Override
    public List<StaffLeaveDto> staffLeaveReasonAnalytics() {
        List<StaffLeaveDto> result = staffLeaveMapper.staffLeaveReasonAnalytics();
        result.forEach(dto -> {
            String reasonCode = dto.getReason();
            StaffLeaveReason reasonEnum = StaffLeaveReason.getByCode(reasonCode);
            if (reasonEnum != null) {
                dto.setReasonText(reasonEnum.getInfo());
            } else {
                dto.setReasonText("未知原因");
            }
        });
        return result;
    }
    @Override
    public List<MonthlyTurnoverRateVo> getMonthlyTurnoverRateFor12Months() {
        List<MonthlyTurnoverRateVo> result = new ArrayList<>();
        LocalDate now = LocalDate.now();
        DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
        // è®¡ç®—è¿‘12个月的数据
        for (int i = 11; i >= 0; i--) {
            LocalDate currentMonth = now.minusMonths(i);
            LocalDate monthStart = currentMonth.withDayOfMonth(1);
            LocalDate monthEnd = currentMonth.withDayOfMonth(currentMonth.lengthOfMonth());
            MonthlyTurnoverRateVo vo = new MonthlyTurnoverRateVo();
            vo.setMonth(currentMonth.format(monthFormatter));
            vo.setMonthStartDate(monthStart);
            vo.setMonthEndDate(monthEnd);
            // æœˆåˆå‘˜å·¥æ•°ï¼ˆä¸Šæœˆæœ«åœ¨èŒå‘˜å·¥æ•°ï¼‰
            LocalDate lastMonthEnd = monthStart.minusDays(1);
            Integer beginMonthStaffCount = staffOnJobMapper.countOnJobStaffByDate(lastMonthEnd);
            vo.setBeginMonthStaffCount(beginMonthStaffCount != null ? beginMonthStaffCount : 0);
            // æœˆæœ«å‘˜å·¥æ•°
            Integer endMonthStaffCount = staffOnJobMapper.countOnJobStaffByDate(monthEnd);
            vo.setEndMonthStaffCount(endMonthStaffCount != null ? endMonthStaffCount : 0);
            // æœˆåº¦å…¥èŒå‘˜å·¥æ•°
            Integer newHireCount = staffOnJobMapper.countNewHireByMonth(monthStart, monthEnd);
            vo.setNewHireCount(newHireCount != null ? newHireCount : 0);
            // æœˆåº¦ç¦»èŒå‘˜å·¥æ•°
            Integer leaveCount = staffLeaveMapper.countLeaveByMonth(monthStart, monthEnd);
            vo.setLeaveCount(leaveCount != null ? leaveCount : 0);
            // è®¡ç®—流失率:流失率 = æœˆåº¦ç¦»èŒå‘˜å·¥æ•° / æœˆåˆå‘˜å·¥æ•° * 100%
            Double turnoverRate = 0.0;
            if (vo.getBeginMonthStaffCount() > 0) {
                turnoverRate = (double) vo.getLeaveCount() / vo.getBeginMonthStaffCount() * 100;
                // ä¿ç•™ä¸¤ä½å°æ•°
                turnoverRate = Math.round(turnoverRate * 100.0) / 100.0;
            }
            vo.setTurnoverRate(turnoverRate);
            // è®¡ç®—流动率:流动率 = (月度入职员工数 + æœˆåº¦ç¦»èŒå‘˜å·¥æ•°) / æœˆåˆå‘˜å·¥æ•° * 100%
            Double flowRate = 0.0;
            if (vo.getBeginMonthStaffCount() > 0) {
                flowRate = (double) (vo.getNewHireCount() + vo.getLeaveCount()) / vo.getBeginMonthStaffCount() * 100;
                // ä¿ç•™ä¸¤ä½å°æ•°
                flowRate = Math.round(flowRate * 100.0) / 100.0;
            }
            vo.setFlowRate(flowRate);
            result.add(vo);
        }
        return result;
    }
    @Override
    public TotalTurnoverRateVo getTotalStatistic() {
        TotalTurnoverRateVo result = new TotalTurnoverRateVo();
        LocalDate now = LocalDate.now();
        // èŽ·å–å½“å‰åœ¨èŒå‘˜å·¥æ•°
        Integer currentOnJobCount = staffOnJobMapper.countOnJobStaffByDate(now);
        result.setCurrentOnJobCount(currentOnJobCount);
        // èŽ·å–æœ¬æœˆçš„å¼€å§‹å’Œç»“æŸæ—¥æœŸ
        LocalDate monthStartDate = now.withDayOfMonth(1);
        LocalDate monthEndDate = now.withDayOfMonth(now.lengthOfMonth());
        // èŽ·å–æœˆåˆå‘˜å·¥æ•°ï¼ˆå³ä¸Šæœˆæœ«å‘˜å·¥æ•°ï¼‰
        Integer beginMonthStaffCount = staffOnJobMapper.countOnJobStaffByDate(monthStartDate.minusDays(1));
        // èŽ·å–æœ¬æœˆæ–°å…¥èŒå‘˜å·¥æ•°
        Integer newHireCount = staffOnJobMapper.countNewHireByMonth(monthStartDate, monthEndDate);
        // èŽ·å–æœ¬æœˆç¦»èŒå‘˜å·¥æ•°
        Integer leaveCount = staffLeaveMapper.countLeaveByMonth(monthStartDate, monthEndDate);
        // è®¡ç®—总流动率 = (入职人数 + ç¦»èŒäººæ•°) / æœˆåˆå‘˜å·¥æ•° * 100%
        Double totalFlowRate = 0.0;
        if (beginMonthStaffCount > 0) {
            totalFlowRate = (double) (newHireCount + leaveCount) / beginMonthStaffCount * 100;
            // ä¿ç•™ä¸¤ä½å°æ•°
            totalFlowRate = Math.round(totalFlowRate * 100.0) / 100.0;
        }
        result.setTotalFlowRate(totalFlowRate);
        // è®¡ç®—总流失率 = ç¦»èŒäººæ•° / æœˆåˆå‘˜å·¥æ•° * 100%
        Double totalTurnoverRate = 0.0;
        if (beginMonthStaffCount > 0) {
            totalTurnoverRate = (double) leaveCount / beginMonthStaffCount * 100;
            // ä¿ç•™ä¸¤ä½å°æ•°
            totalTurnoverRate = Math.round(totalTurnoverRate * 100.0) / 100.0;
        }
        result.setTotalTurnoverRate(totalTurnoverRate);
        return result;
    }
}
src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
@@ -11,6 +11,7 @@
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.StaffLeaveService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.staff.pojo.StaffLeave;
import org.springframework.transaction.annotation.Transactional;
@@ -23,8 +24,10 @@
@AllArgsConstructor
@Service
public class StaffLeaveServiceImpl extends ServiceImpl<StaffLeaveMapper, StaffLeave> implements StaffLeaveService {
    @Autowired
    private StaffLeaveMapper staffLeaveMapper;
    @Autowired
    private StaffOnJobMapper staffOnJobMapper;
    //新增离职列表分页查询
@@ -97,6 +100,5 @@
        ExcelUtil<StaffLeaveDto> util = new ExcelUtil<StaffLeaveDto>(StaffLeaveDto.class);
        util.exportExcel(response, staffLeaves, "员工离职导出");
    }
}
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -23,6 +23,7 @@
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@@ -39,12 +40,14 @@
@Service
public class StaffOnJobServiceImpl extends ServiceImpl<StaffOnJobMapper, StaffOnJob>  implements IStaffOnJobService {
    @Autowired
    private StaffOnJobMapper staffOnJobMapper;
    @Autowired
    private SysPostMapper sysPostMapper;
    @Autowired
    private StaffContractMapper staffContractMapper;
    @Autowired
    private StaffLeaveMapper staffLeaveMapper;
src/main/java/com/ruoyi/staff/vo/MonthlyTurnoverRateVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.staff.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
/**
 * æœˆåº¦å‘˜å·¥æµåŠ¨çŽ‡å’Œæµå¤±çŽ‡ç»Ÿè®¡VO
 */
@Data
public class MonthlyTurnoverRateVo {
    @ApiModelProperty("月份")
    private String month;
    @ApiModelProperty("月初员工数")
    private Integer beginMonthStaffCount;
    @ApiModelProperty("月末员工数")
    private Integer endMonthStaffCount;
    @ApiModelProperty("月度入职员工数")
    private Integer newHireCount;
    @ApiModelProperty("月度离职员工数")
    private Integer leaveCount;
    @ApiModelProperty("流失率(%)")
    private Double turnoverRate;
    @ApiModelProperty("流动率(%)")
    private Double flowRate;
    @ApiModelProperty("月份开始日期")
    private LocalDate monthStartDate;
    @ApiModelProperty("月份结束日期")
    private LocalDate monthEndDate;
}
src/main/java/com/ruoyi/staff/vo/TotalTurnoverRateVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.staff.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * å‘˜å·¥æ€»æµåŠ¨çŽ‡ã€æµå¤±çŽ‡åŠåœ¨èŒå‘˜å·¥æ•°ç»Ÿè®¡VO
 */
@Data
public class TotalTurnoverRateVo {
    @ApiModelProperty("总流动率(%)")
    private Double totalFlowRate;
    @ApiModelProperty("总流失率(%)")
    private Double totalTurnoverRate;
    @ApiModelProperty("当前在职员工数")
    private Integer currentOnJobCount;
}
src/main/resources/mapper/staff/StaffLeaveMapper.xml
@@ -61,4 +61,24 @@
            AND soj.staff_name LIKE CONCAT('%',#{c.staffName},'%')
        </if>
    </select>
    <select id="staffLeaveReasonAnalytics" resultType="com.ruoyi.staff.dto.StaffLeaveDto">
        SELECT
        staff_leave.reason as reason,
        COUNT(*) as count
        FROM staff_leave
        LEFT JOIN
        staff_on_job soj ON soj.id = staff_leave.staff_on_job_id
        where 1=1
        GROUP BY staff_leave.reason
    </select>
    <!-- ç»Ÿè®¡æŒ‡å®šæœˆä»½çš„离职员工数 -->
    <select id="countLeaveByMonth" resultType="java.lang.Integer">
        SELECT COUNT(*)
        FROM staff_leave sl
        LEFT JOIN staff_on_job soj ON sl.staff_on_job_id = soj.id
        WHERE DATE_FORMAT(sl.create_time, '%Y-%m-%d') BETWEEN #{monthStart} AND #{monthEnd}
        AND soj.staff_state = 0
    </select>
</mapper>
src/main/resources/mapper/staff/StaffOnJobMapper.xml
@@ -43,4 +43,19 @@
            AND staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%')
        </if>
    </select>
    <!-- ç»Ÿè®¡æŒ‡å®šæ—¥æœŸçš„在职员工数 -->
    <select id="countOnJobStaffByDate" resultType="java.lang.Integer">
        SELECT COUNT(*)
        FROM staff_on_job
        WHERE staff_state = 1
        AND DATE_FORMAT(create_time, '%Y-%m-%d') &lt;= #{date}
    </select>
    <!-- ç»Ÿè®¡æŒ‡å®šæœˆä»½çš„æ–°å…¥èŒå‘˜å·¥æ•° -->
    <select id="countNewHireByMonth" resultType="java.lang.Integer">
        SELECT COUNT(*)
        FROM staff_on_job
        WHERE staff_state = 1
        AND DATE_FORMAT(create_time, '%Y-%m-%d') BETWEEN #{monthStart} AND #{monthEnd}
    </select>
</mapper>
src/main/resources/mapper/system/SysDeptMapper.xml
@@ -20,32 +20,37 @@
        <result property="createTime" column="create_time" />
        <result property="updateBy"   column="update_by"   />
        <result property="updateTime" column="update_time" />
        <result property="staffCount" column="staff_count" />
    </resultMap>
    
    <sql id="selectDeptVo">
        select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time 
        from sys_dept d
    </sql>
    <select id="selectDeptList" parameterType="com.ruoyi.project.system.domain.SysDept" resultMap="SysDeptResult">
        <include refid="selectDeptVo"/>
        where d.del_flag = '0'
        select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time,
        count(distinct soj.id) as staff_count
        from sys_dept d
        left join staff_on_job soj on soj.sys_dept_id = d.dept_id and soj.staff_state = '1'
        where d.del_flag = '0'
        <if test="deptId != null and deptId != 0">
            AND dept_id = #{deptId}
            AND d.dept_id = #{deptId}
        </if>
        <if test="parentId != null and parentId != 0">
            AND parent_id = #{parentId}
        <if test="parentId != null and parentId != 0">
            AND d.parent_id = #{parentId}
        </if>
        <if test="deptName != null and deptName != ''">
            AND dept_name like concat('%', #{deptName}, '%')
            AND d.dept_name like concat('%', #{deptName}, '%')
        </if>
        <if test="status != null and status != ''">
            AND status = #{status}
            AND d.status = #{status}
        </if>
        <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
        ${params.dataScope}
        group by d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time
        order by d.parent_id, d.order_num
    </select>
    </select>
    
    <select id="selectDeptListByRoleId" resultType="Long">
        select d.dept_id