From 0998498b2f9192b3fd04b34dc6074cac63e14985 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期二, 20 一月 2026 17:43:23 +0800
Subject: [PATCH] 人力资源分析接口

---
 src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java            |   18 ++
 src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java |    7 
 src/main/java/com/ruoyi/staff/controller/AnalyticsController.java     |   32 ++++
 src/main/java/com/ruoyi/staff/mapper/StaffLeaveMapper.java            |    5 
 src/main/java/com/ruoyi/project/system/domain/SysDept.java            |   12 +
 src/main/java/com/ruoyi/staff/vo/MonthlyTurnoverRateVo.java           |   39 +++++
 src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java                  |   10 +
 src/main/java/com/ruoyi/staff/vo/TotalTurnoverRateVo.java             |   19 ++
 src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java |    4 
 src/main/java/com/ruoyi/staff/service/AnalyticsService.java           |   20 ++
 src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java  |  145 ++++++++++++++++++++
 src/main/resources/mapper/staff/StaffOnJobMapper.xml                  |   15 ++
 src/main/java/com/ruoyi/common/enums/StaffLeaveReason.java            |   14 ++
 src/main/resources/mapper/staff/StaffLeaveMapper.xml                  |   20 ++
 src/main/resources/mapper/system/SysDeptMapper.xml                    |   23 ++-
 15 files changed, 367 insertions(+), 16 deletions(-)

diff --git a/src/main/java/com/ruoyi/common/enums/StaffLeaveReason.java b/src/main/java/com/ruoyi/common/enums/StaffLeaveReason.java
index 44d3098..5c043fb 100644
--- a/src/main/java/com/ruoyi/common/enums/StaffLeaveReason.java
+++ b/src/main/java/com/ruoyi/common/enums/StaffLeaveReason.java
@@ -25,4 +25,18 @@
     public String getInfo() {
         return info;
     }
+
+    /**
+     * 鏍规嵁code鑾峰彇鏋氫妇瀹炰緥
+     * @param code 绂昏亴鍘熷洜缂栫爜
+     * @return 瀵瑰簲鐨勬灇涓惧疄渚嬶紝鑻ユ湭鎵惧埌鍒欒繑鍥瀗ull
+     */
+    public static StaffLeaveReason getByCode(String code) {
+        for (StaffLeaveReason reason : StaffLeaveReason.values()) {
+            if (reason.getCode().equals(code)) {
+                return reason;
+            }
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/com/ruoyi/project/system/domain/SysDept.java b/src/main/java/com/ruoyi/project/system/domain/SysDept.java
index e2c6b2b..54e53a7 100644
--- a/src/main/java/com/ruoyi/project/system/domain/SysDept.java
+++ b/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())
diff --git a/src/main/java/com/ruoyi/staff/controller/AnalyticsController.java b/src/main/java/com/ruoyi/staff/controller/AnalyticsController.java
new file mode 100644
index 0000000..cfa802c
--- /dev/null
+++ b/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());
+    }
+}
diff --git a/src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java b/src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java
index 7cdf48a..3685410 100644
--- a/src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/staff/mapper/StaffLeaveMapper.java b/src/main/java/com/ruoyi/staff/mapper/StaffLeaveMapper.java
index e8d2854..170bbba 100644
--- a/src/main/java/com/ruoyi/staff/mapper/StaffLeaveMapper.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java b/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
index 1451487..5bd15e4 100644
--- a/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
+++ b/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);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/staff/service/AnalyticsService.java b/src/main/java/com/ruoyi/staff/service/AnalyticsService.java
new file mode 100644
index 0000000..ee8ff83
--- /dev/null
+++ b/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();
+}
diff --git a/src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java
new file mode 100644
index 0000000..13a440c
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
index 2d30dc5..ff8faa5 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
+++ b/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, "鍛樺伐绂昏亴瀵煎嚭");
     }
-
 }
 
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
index 6fb0cd0..9756f33 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/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;
 
 
diff --git a/src/main/java/com/ruoyi/staff/vo/MonthlyTurnoverRateVo.java b/src/main/java/com/ruoyi/staff/vo/MonthlyTurnoverRateVo.java
new file mode 100644
index 0000000..90f9c69
--- /dev/null
+++ b/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;
+
+/**
+ * 鏈堝害鍛樺伐娴佸姩鐜囧拰娴佸け鐜囩粺璁O
+ */
+@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;
+}
diff --git a/src/main/java/com/ruoyi/staff/vo/TotalTurnoverRateVo.java b/src/main/java/com/ruoyi/staff/vo/TotalTurnoverRateVo.java
new file mode 100644
index 0000000..49d2f42
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/resources/mapper/staff/StaffLeaveMapper.xml b/src/main/resources/mapper/staff/StaffLeaveMapper.xml
index c3faf41..4637ff0 100644
--- a/src/main/resources/mapper/staff/StaffLeaveMapper.xml
+++ b/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>
diff --git a/src/main/resources/mapper/staff/StaffOnJobMapper.xml b/src/main/resources/mapper/staff/StaffOnJobMapper.xml
index a43bb37..75ae5ef 100644
--- a/src/main/resources/mapper/staff/StaffOnJobMapper.xml
+++ b/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>
diff --git a/src/main/resources/mapper/system/SysDeptMapper.xml b/src/main/resources/mapper/system/SysDeptMapper.xml
index 5c6310a..afc1130 100644
--- a/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/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

--
Gitblit v1.9.3