From 6ed4b397bb9dbb9c2d7bb0676339721fa97996bf Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期五, 30 一月 2026 10:32:26 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New' into dev_New

---
 src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java |   37 +++++++++++++++++++++++++------------
 1 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java
index 24abcfc..ff74b0f 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/AnalyticsServiceImpl.java
@@ -94,19 +94,22 @@
             Integer leaveCount = staffLeaveMapper.countLeaveByMonth(monthStart, monthEnd);
             vo.setLeaveCount(leaveCount != null ? leaveCount : 0);
 
-            // 璁$畻娴佸け鐜囷細娴佸け鐜� = 鏈堝害绂昏亴鍛樺伐鏁� / 鏈堝垵鍛樺伐鏁� * 100%
+            // 璁$畻褰撴湡骞冲潎鍦ㄨ亴浜烘暟 = (鏈堝垵鍛樺伐鏁� + 鏈堟湯鍛樺伐鏁�) / 2
+            Double averageStaffCount = (vo.getBeginMonthStaffCount() + vo.getEndMonthStaffCount()) / 2.0;
+
+            // 璁$畻娴佸け鐜囷細娴佸け鐜� = 鏈堝害绂昏亴鍛樺伐鏁� / 褰撴湡骞冲潎鍦ㄨ亴浜烘暟 * 100%
             Double turnoverRate = 0.0;
-            if (vo.getBeginMonthStaffCount() > 0) {
-                turnoverRate = (double) vo.getLeaveCount() / vo.getBeginMonthStaffCount() * 100;
+            if (averageStaffCount > 0) {
+                turnoverRate = (double) vo.getLeaveCount() / averageStaffCount * 100;
                 // 淇濈暀涓や綅灏忔暟
                 turnoverRate = Math.round(turnoverRate * 100.0) / 100.0;
             }
             vo.setTurnoverRate(turnoverRate);
 
-            // 璁$畻娴佸姩鐜囷細娴佸姩鐜� = (鏈堝害鍏ヨ亴鍛樺伐鏁� + 鏈堝害绂昏亴鍛樺伐鏁�) / 鏈堝垵鍛樺伐鏁� * 100%
+            // 璁$畻娴佸姩鐜囷細娴佸姩鐜� = (鏈堝害鍏ヨ亴鍛樺伐鏁� + 鏈堝害绂昏亴鍛樺伐鏁�) / 褰撴湡骞冲潎鍦ㄨ亴浜烘暟 * 100%
             Double flowRate = 0.0;
-            if (vo.getBeginMonthStaffCount() > 0) {
-                flowRate = (double) (vo.getNewHireCount() + vo.getLeaveCount()) / vo.getBeginMonthStaffCount() * 100;
+            if (averageStaffCount > 0) {
+                flowRate = (double) (vo.getNewHireCount() + vo.getLeaveCount()) / averageStaffCount * 100;
                 // 淇濈暀涓や綅灏忔暟
                 flowRate = Math.round(flowRate * 100.0) / 100.0;
             }
@@ -133,26 +136,36 @@
 
         // 鑾峰彇鏈堝垵鍛樺伐鏁帮紙鍗充笂鏈堟湯鍛樺伐鏁帮級
         Integer beginMonthStaffCount = staffOnJobMapper.countOnJobStaffByDate(monthStartDate.minusDays(1));
+        beginMonthStaffCount = beginMonthStaffCount != null ? beginMonthStaffCount : 0;
+
+        // 鑾峰彇鏈堟湯鍛樺伐鏁�
+        Integer endMonthStaffCount = staffOnJobMapper.countOnJobStaffByDate(monthEndDate);
+        endMonthStaffCount = endMonthStaffCount != null ? endMonthStaffCount : 0;
 
         // 鑾峰彇鏈湀鏂板叆鑱屽憳宸ユ暟
         Integer newHireCount = staffOnJobMapper.countNewHireByMonth(monthStartDate, monthEndDate);
+        newHireCount = newHireCount != null ? newHireCount : 0;
 
         // 鑾峰彇鏈湀绂昏亴鍛樺伐鏁�
         Integer leaveCount = staffLeaveMapper.countLeaveByMonth(monthStartDate, monthEndDate);
+        leaveCount = leaveCount != null ? leaveCount : 0;
 
-        // 璁$畻鎬绘祦鍔ㄧ巼 = (鍏ヨ亴浜烘暟 + 绂昏亴浜烘暟) / 鏈堝垵鍛樺伐鏁� * 100%
+        // 璁$畻褰撴湡骞冲潎鍦ㄨ亴浜烘暟 = (鏈堝垵鍛樺伐鏁� + 鏈堟湯鍛樺伐鏁�) / 2
+        Double averageStaffCount = (beginMonthStaffCount + endMonthStaffCount) / 2.0;
+
+        // 璁$畻鎬绘祦鍔ㄧ巼 = (鍏ヨ亴浜烘暟 + 绂昏亴浜烘暟) / 褰撴湡骞冲潎鍦ㄨ亴浜烘暟 * 100%
         Double totalFlowRate = 0.0;
-        if (beginMonthStaffCount > 0) {
-            totalFlowRate = (double) (newHireCount + leaveCount) / beginMonthStaffCount * 100;
+        if (averageStaffCount > 0) {
+            totalFlowRate = (double) (newHireCount + leaveCount) / averageStaffCount * 100;
             // 淇濈暀涓や綅灏忔暟
             totalFlowRate = Math.round(totalFlowRate * 100.0) / 100.0;
         }
         result.setTotalFlowRate(totalFlowRate);
 
-        // 璁$畻鎬绘祦澶辩巼 = 绂昏亴浜烘暟 / 鏈堝垵鍛樺伐鏁� * 100%
+        // 璁$畻鎬绘祦澶辩巼 = 绂昏亴浜烘暟 / 褰撴湡骞冲潎鍦ㄨ亴浜烘暟 * 100%
         Double totalTurnoverRate = 0.0;
-        if (beginMonthStaffCount > 0) {
-            totalTurnoverRate = (double) leaveCount / beginMonthStaffCount * 100;
+        if (averageStaffCount > 0) {
+            totalTurnoverRate = (double) leaveCount / averageStaffCount * 100;
             // 淇濈暀涓や綅灏忔暟
             totalTurnoverRate = Math.round(totalTurnoverRate * 100.0) / 100.0;
         }

--
Gitblit v1.9.3