Browse Source

fix: 系统月度统计报表查询优化

zhangying 9 months ago
parent
commit
a8631d044b

+ 27 - 0
src/main/java/com/hz/employmentsite/mapper/cquery/StatisticsCQuery.java

@@ -80,4 +80,31 @@ public interface StatisticsCQuery {
     List<RegionSystemDataCount> findYearJobUserCount(@Param("year") String year,
                                                   @Param("regionCode") String regionCode, @Param("institutionID") String institutionID,
                                                   @Param("siteID") String siteID);
+
+    /**
+     * 查询月度添加的企业数量,并按周数分开统计
+     * @param year 年份
+     * @param month 月份
+     */
+    List<RegionSystemDataCount> findMonthCompanyCount(@Param("year") String year, @Param("month") String month,
+                                                     @Param("regionCode") String regionCode, @Param("institutionID") String institutionID,
+                                                     @Param("siteID") String siteID);
+
+    /**
+     * 查询年度添加的岗位数量
+     * @param year 年份
+     * @param month 月份
+     */
+    List<RegionSystemDataCount> findMonthPostCount(@Param("year") String year, @Param("month") String month,
+                                                  @Param("regionCode") String regionCode, @Param("institutionID") String institutionID,
+                                                  @Param("siteID") String siteID);
+
+    /**
+     * 查询年度添加的求职人员数量
+     * @param year 年份
+     * @param month 月份
+     */
+    List<RegionSystemDataCount> findMonthJobUserCount(@Param("year") String year, @Param("month") String month,
+                                                     @Param("regionCode") String regionCode, @Param("institutionID") String institutionID,
+                                                     @Param("siteID") String siteID);
 }

+ 57 - 36
src/main/java/com/hz/employmentsite/services/impl/statistics/StatisticsServiceImpl.java

@@ -12,7 +12,6 @@ import com.hz.employmentsite.vo.statistics.jobUser.RegionJobUserCount;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDate;
 import java.util.*;
 
 @Service("StatisticsService")
@@ -90,13 +89,20 @@ public class StatisticsServiceImpl implements StatisticsService {
      */
     @Override
     public Map<String, List<RegionSystemDataCount>> findMonthSystemDataCount(String dateStr, String regionCode, String institutionID, String siteID) {
+        String[] dateStrSplit = dateStr.split("-");
+
         // 各区县的驿站工作人员统计数量
         List<RegionSystemDataCount> regionSiteUserCount = statisticsCQuery.findRegionSiteUserCount(regionCode, institutionID, siteID);
+        // 指定年份的企业统计数量
+        List<RegionSystemDataCount> monthCompanyCount = statisticsCQuery.findMonthCompanyCount(dateStrSplit[0], dateStrSplit[1], regionCode, institutionID, siteID);
+        // 指定年份的岗位统计数量
+        List<RegionSystemDataCount> monthPostCount = statisticsCQuery.findMonthPostCount(dateStrSplit[0], dateStrSplit[1], regionCode, institutionID, siteID);
+        // 指定年份的求职人员统计数量
+        List<RegionSystemDataCount> monthJobUserCount = statisticsCQuery.findMonthJobUserCount(dateStrSplit[0], dateStrSplit[1], regionCode, institutionID, siteID);
 
-        // 解析日期,获取每周的开始结束时间
-        List<Map<String, LocalDate>> weekDate = dateUtils.getWeekDateByMonth(dateStr);
+        // 获取当年的1-1日距离当前dateStr的月份过去了几周
+        Integer weeksPassed = dateUtils.getWeeksPassed(dateStr);
 
-        Map<String, List<RegionSystemDataCount>> result = new LinkedHashMap<>();
         // 汇总数据
         List<RegionSystemDataCount> sumData = new ArrayList<>();
         // 创建一个 map 来存储 regionCode 和 siteUserCount 的对应关系
@@ -107,45 +113,61 @@ public class StatisticsServiceImpl implements StatisticsService {
             RegionSystemDataCount summaryData = new RegionSystemDataCount(item.getRegionCode(), item.getRegionName(), item.getSiteUserCount(), 0, 0, 0);
             sumData.add(summaryData);
         }
-        // 按每周的日期进行系统使用数据查询
-        for (int i = 0; i < weekDate.size(); i++) {
-            // 获取当前周的开始日期和结束日期
-            LocalDate startDate = weekDate.get(i).get("startDate");
-            LocalDate endDate = weekDate.get(i).get("endDate");
 
-            // 查询当前周的系统使用数据
-            List<RegionSystemDataCount> contData = statisticsCQuery.findWeekSystemDataCount(startDate, endDate, regionCode, institutionID, siteID);
+        // 最终数据
+        Map<String, List<RegionSystemDataCount>> result = new LinkedHashMap<>();
 
+        for (int i = 1; i <= 5; i++) {
+            // 初始化第i周的数据集合
+            List<RegionSystemDataCount> iWeekList = new ArrayList<>();
             // 创建合计数据
             RegionSystemDataCount summaryData = new RegionSystemDataCount("100", "合计", 0, 0, 0, 0);
+            // 计算周数应该是几
+            int week = weeksPassed + i;
 
-            // 填充驿站工作人员统计数量
-            for (RegionSystemDataCount dataCount : contData) {
-                String dataRegionCode = dataCount.getRegionCode();
-                if (siteUserCountMap.containsKey(dataRegionCode)) {
-                    dataCount.setSiteUserCount(siteUserCountMap.get(dataRegionCode));
+            // 开始循环
+            for (RegionSystemDataCount sd : sumData) {
+                if (stringUtils.IsNullOrEmpty(sd.getRegionCode())){
+                    continue;
                 }
-                // 合计数据累加
-                summaryData.setSiteUserCount(summaryData.getSiteUserCount() + dataCount.getSiteUserCount());
-                summaryData.setCompanyCount(summaryData.getCompanyCount() + dataCount.getCompanyCount());
-                summaryData.setPostCount(summaryData.getPostCount() + dataCount.getPostCount());
-                summaryData.setJobUserCount(summaryData.getJobUserCount() + dataCount.getJobUserCount());
-
+                // 获取到企业,岗位,求职人员的统计数据
+                int companyCount = monthCompanyCount.stream()
+                        .filter(item -> (!stringUtils.IsNullOrEmpty(item.getRegionCode()) && item.getRegionCode().equals(sd.getRegionCode()) && item.getWeek() != null && item.getWeek() == week))
+                        .findFirst()
+                        .orElse(new RegionSystemDataCount())
+                        .getCompanyCount();
+                int postCount = monthPostCount.stream()
+                        .filter(item -> (!stringUtils.IsNullOrEmpty(item.getRegionCode()) && item.getRegionCode().equals(sd.getRegionCode()) && item.getWeek() != null && item.getWeek() == week))
+                        .findFirst()
+                        .orElse(new RegionSystemDataCount())
+                        .getPostCount();
+                int jobUserCount = monthJobUserCount.stream()
+                        .filter(item -> (!stringUtils.IsNullOrEmpty(item.getRegionCode()) && item.getRegionCode().equals(sd.getRegionCode()) && item.getWeek() != null && item.getWeek() == week))
+                        .findFirst()
+                        .orElse(new RegionSystemDataCount())
+                        .getJobUserCount();
+                // 当周合计数据计算
+                summaryData.setSiteUserCount(summaryData.getSiteUserCount() + sd.getSiteUserCount());
+                summaryData.setCompanyCount(summaryData.getCompanyCount() + companyCount);
+                summaryData.setPostCount(summaryData.getPostCount() + postCount);
+                summaryData.setJobUserCount(summaryData.getJobUserCount() + jobUserCount);
                 // 将各个区县的数据累加到汇总
                 for (RegionSystemDataCount sumDatum : sumData) {
-                    if (sumDatum.getRegionCode().equals(dataCount.getRegionCode())) {
-                        sumDatum.setSiteUserCount(dataCount.getSiteUserCount());
-                        sumDatum.setCompanyCount(sumDatum.getCompanyCount() + dataCount.getCompanyCount());
-                        sumDatum.setPostCount(sumDatum.getPostCount() + dataCount.getPostCount());
-                        sumDatum.setJobUserCount(sumDatum.getJobUserCount() + dataCount.getJobUserCount());
+                    if (sumDatum.getRegionCode().equals(sd.getRegionCode())) {
+                        sumDatum.setSiteUserCount(sd.getSiteUserCount());
+                        sumDatum.setCompanyCount(sumDatum.getCompanyCount() + companyCount);
+                        sumDatum.setPostCount(sumDatum.getPostCount() + postCount);
+                        sumDatum.setJobUserCount(sumDatum.getJobUserCount() + jobUserCount);
                     }
                 }
+                // 添加区县的数据
+                iWeekList.add(new RegionSystemDataCount(sd.getRegionCode(), sd.getRegionName(), sd.getSiteUserCount(), companyCount, postCount, jobUserCount));
             }
-            // 将汇总对象添加到结果中
-            contData.add(summaryData);
+            // 添加合计数据
+            iWeekList.add(summaryData);
 
-            // 保存结果
-            result.put("第" + (i + 1) + "周", contData);
+            // 将数据添加的结果中
+            result.put("第" + i + "周", iWeekList);
         }
         // 计算汇总的合计
         RegionSystemDataCount summaryData = new RegionSystemDataCount("100", "合计", 0, 0, 0, 0);
@@ -209,17 +231,17 @@ public class StatisticsServiceImpl implements StatisticsService {
                 if (!stringUtils.IsNullOrEmpty(monthData.getRegionCode())){
                     // 获取到企业,岗位,求职人员的统计数据
                     int companyCount = yearCompanyCount.stream()
-                            .filter(item -> (item.getRegionCode().equals(monthData.getRegionCode()) && item.getMonth() == finalI))
+                            .filter(item -> (!stringUtils.IsNullOrEmpty(item.getRegionCode()) && item.getRegionCode().equals(monthData.getRegionCode()) && item.getMonth() != null && item.getMonth() == finalI))
                             .findFirst()
                             .orElse(new RegionSystemDataCount())
                             .getCompanyCount();
                     int postCount = yearPostCount.stream()
-                            .filter(item -> (item.getRegionCode().equals(monthData.getRegionCode()) && item.getMonth() == finalI))
+                            .filter(item -> (!stringUtils.IsNullOrEmpty(item.getRegionCode()) && item.getRegionCode().equals(monthData.getRegionCode()) && item.getMonth() != null && item.getMonth() == finalI))
                             .findFirst()
                             .orElse(new RegionSystemDataCount())
                             .getPostCount();
                     int jobUserCount = yearJobUserCount.stream()
-                            .filter(item -> (item.getRegionCode().equals(monthData.getRegionCode()) && item.getMonth() == finalI))
+                            .filter(item -> (!stringUtils.IsNullOrEmpty(item.getRegionCode()) && item.getRegionCode().equals(monthData.getRegionCode()) && item.getMonth() != null && item.getMonth() == finalI))
                             .findFirst()
                             .orElse(new RegionSystemDataCount())
                             .getJobUserCount();
@@ -240,8 +262,7 @@ public class StatisticsServiceImpl implements StatisticsService {
                         }
                     }
                     // 添加区县的数据
-                    iMonthList.add(new RegionSystemDataCount(monthData.getRegionCode(), monthData.getRegionName(), monthData.getSiteUserCount(), monthData.getSiteUserCount(), companyCount, postCount, jobUserCount));
-
+                    iMonthList.add(new RegionSystemDataCount(monthData.getRegionCode(), monthData.getRegionName(), monthData.getSiteUserCount(), companyCount, postCount, jobUserCount));
                 }
             });
             // 添加合计数据

+ 27 - 0
src/main/java/com/hz/employmentsite/util/DateUtils.java

@@ -5,6 +5,7 @@ import org.springframework.stereotype.Component;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.*;
+import java.time.temporal.WeekFields;
 import java.util.*;
 
 @Component
@@ -513,4 +514,30 @@ public class DateUtils {
         return weeks;
     }
 
+    /**
+     * 获取给定日期的当年第一天到给定日期一共过去了多少周
+     * @param yearMonthStr YYYY-MM格式日期
+     * @return
+     */
+    public Integer getWeeksPassed(String yearMonthStr) {
+        // 解析YearMonth字符串
+        YearMonth yearMonth = YearMonth.parse(yearMonthStr);
+
+        // 获取这一年的第一天
+        LocalDate firstDayOfYear = yearMonth.atDay(1).withDayOfYear(1);
+
+        // 获取指定YearMonth月份的第一天
+        LocalDate firstDayOfMonth = yearMonth.atDay(1);
+
+        // 获取本地的周定义 (可以是周日或周一作为一周的第一天)
+        WeekFields weekFields = WeekFields.of(Locale.getDefault());
+
+        // 获取这两天所在的周数
+        int startWeek = firstDayOfYear.get(weekFields.weekOfYear());
+        int endWeek = firstDayOfMonth.get(weekFields.weekOfYear());
+
+        // 计算经过的周数
+        return endWeek - startWeek;
+    }
+
 }

+ 12 - 0
src/main/java/com/hz/employmentsite/vo/statistics/RegionSystemDataCount.java

@@ -14,6 +14,8 @@ public class RegionSystemDataCount {
 
     private Integer month;
 
+    private Integer week;
+
     private int siteUserCount;
 
     private int companyCount;
@@ -30,4 +32,14 @@ public class RegionSystemDataCount {
         this.postCount = postCount;
         this.jobUserCount = jobUserCount;
     }
+
+    public RegionSystemDataCount(String regionCode, String regionName, Integer month, int siteUserCount, int companyCount, int postCount, int jobUserCount) {
+        this.regionCode = regionCode;
+        this.regionName = regionName;
+        this.month = month;
+        this.siteUserCount = siteUserCount;
+        this.companyCount = companyCount;
+        this.postCount = postCount;
+        this.jobUserCount = jobUserCount;
+    }
 }

+ 98 - 0
src/main/resources/mapping/cquery/StatisticsCQuery.xml

@@ -345,4 +345,102 @@
             area.`code`,
             `Month` ASC
     </select>
+
+    <select id="findMonthCompanyCount" resultType="com.hz.employmentsite.vo.statistics.RegionSystemDataCount">
+        SELECT
+            area.`code` AS RegionCode,
+            area.`name` AS RegionName,
+            WEEK ( company.CreateTime, 5 ) AS `Week`,
+            COUNT( 1 ) AS CompanyCount
+        FROM
+            pc_company company
+                LEFT JOIN pc_site site ON company.SiteID = site.SiteID
+                LEFT JOIN pc_site_institution siteInst ON site.SiteID = siteInst.SiteID
+                LEFT JOIN area_code area ON area.`code` = site.RegionCode
+        WHERE
+            YEAR ( company.CreateTime ) = #{year}
+            AND MONTH ( company.CreateTime ) = #{month}
+            <if test="siteID!='' and siteID!=null">
+                and site.siteID = #{siteID}
+            </if>
+            <if test="institutionID!='' and institutionID!=null">
+                and siteInst.institutionID = #{institutionID}
+            </if>
+            <if test="regionCode!='' and regionCode!=null">
+                and area.`code` = #{regionCode}
+            </if>
+        GROUP BY
+            area.`code`,
+            area.`name`,
+            `Week`
+        ORDER BY
+            area.`code`,
+            `Week` ASC
+    </select>
+
+    <select id="findMonthPostCount" resultType="com.hz.employmentsite.vo.statistics.RegionSystemDataCount">
+        SELECT
+            area.`code` AS RegionCode,
+            area.`name` AS RegionName,
+            WEEK( post.CreateTime, 5 ) AS `Week`,
+            COUNT( 1 ) AS PostCount
+        FROM
+            pc_post post
+                LEFT JOIN pc_company company ON post.CompanyID = company.CompanyID
+                LEFT JOIN pc_site site ON company.SiteID = site.SiteID
+                LEFT JOIN pc_site_institution siteInst ON site.SiteID = siteInst.SiteID
+                LEFT JOIN area_code area ON area.`code` = site.RegionCode
+        WHERE
+            YEAR ( post.CreateTime ) = #{year}
+            AND MONTH ( post.CreateTime ) = #{month}
+            <if test="siteID!='' and siteID!=null">
+                and site.siteID = #{siteID}
+            </if>
+            <if test="institutionID!='' and institutionID!=null">
+                and siteInst.institutionID = #{institutionID}
+            </if>
+            <if test="regionCode!='' and regionCode!=null">
+                and area.`code` = #{regionCode}
+            </if>
+        GROUP BY
+            area.`code`,
+            area.`name`,
+            `Week`
+        ORDER BY
+            area.`code`,
+            `Week` ASC
+    </select>
+
+
+    <select id="findMonthJobUserCount" resultType="com.hz.employmentsite.vo.statistics.RegionSystemDataCount">
+        SELECT
+            area.`code` AS RegionCode,
+            area.`name` AS RegionName,
+            WEEK( jobUser.CreateTime, 5 ) AS `Week`,
+            COUNT( 1 ) AS JobUserCount
+        FROM
+            pc_jobuser jobUser
+                LEFT JOIN pc_site site ON jobUser.SiteID = site.SiteID
+                LEFT JOIN pc_site_institution siteInst ON site.SiteID = siteInst.SiteID
+                LEFT JOIN area_code area ON area.`code` = site.RegionCode
+        WHERE
+            YEAR ( jobUser.CreateTime ) = #{year}
+            AND MONTH ( jobUser.CreateTime ) = #{month}
+            <if test="siteID!='' and siteID!=null">
+                and site.siteID = #{siteID}
+            </if>
+            <if test="institutionID!='' and institutionID!=null">
+                and siteInst.institutionID = #{institutionID}
+            </if>
+            <if test="regionCode!='' and regionCode!=null">
+                and area.`code` = #{regionCode}
+            </if>
+        GROUP BY
+            area.`code`,
+            area.`name`,
+            `Week`
+        ORDER BY
+            area.`code`,
+            `Week` ASC
+    </select>
 </mapper>