Преглед изворни кода

feat: 统计报表-导出指定时间段内系统使用情况统计

zhangying пре 9 месеци
родитељ
комит
fbb22e94fb

+ 75 - 2
src/main/java/com/hz/employmentsite/controller/statistics/StatisticsController.java

@@ -3,15 +3,18 @@ package com.hz.employmentsite.controller.statistics;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.services.service.statistics.StatisticsService;
+import com.hz.employmentsite.util.DateUtils;
+import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.statistics.SystemDataCount;
+import org.apache.poi.ss.util.CellRangeAddress;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.Date;
-import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
 
 @RestController
 @RequestMapping(value = "/api/statistics")
@@ -19,6 +22,12 @@ public class StatisticsController {
     @Autowired
     private StatisticsService statisticsService;
 
+    @Autowired
+    private ExcelHelper excelHelper;
+
+    @Autowired
+    private DateUtils dateUtils;
+
     /**
      * 查询指定时间段系统使用情况
      *
@@ -32,4 +41,68 @@ public class StatisticsController {
         List<SystemDataCount> systemDataCount = statisticsService.findSystemDataCount(startDate, endDate);
         return RespGenerstor.success(systemDataCount);
     }
+
+    /**
+     * 导出指定时间段的系统使用情况
+     *
+     * @param response  请求响应
+     * @param startDate 开始时间
+     * @param endDate   结束时间
+     * @return
+     */
+    @GetMapping("/export/systemApplyCount")
+    public BaseResponse exportSystemApplyCount(HttpServletResponse response,
+                                               @RequestParam(value = "startDate", required = false) Date startDate,
+                                               @RequestParam(value = "endDate", required = false) Date endDate) throws Exception {
+        List<SystemDataCount> systemDataCount = statisticsService.findSystemDataCount(startDate, endDate);
+        ExcelHelper.ExcelData data = excelHelper.new ExcelData();
+        Map<String, CellRangeAddress> titleMap = new HashMap<>();
+        String dataStr = "";
+        if (startDate != null && endDate != null) {
+            dataStr = dateUtils.dateToStrFormat(startDate, "yyyy年MM月dd日") + "-" + dateUtils.dateToStrFormat(endDate, "yyyy年MM月dd日");
+        }
+        titleMap.put(dataStr + "就业驿站系统使用情况表", new CellRangeAddress(0, 0, 0, 5));
+        data.setColspanTitles(Arrays.asList(titleMap));
+        data.setTitles(Arrays.asList(new String[]{"行政区划", "驿站名", "驿站人员数量", "录入企业数", "收集岗位数", "登记求职人数"}));
+        List<List<Object>> rowsData = new ArrayList();
+        for (SystemDataCount dataCount : systemDataCount) {
+            List<Object> row = new ArrayList();
+            row.add(dataCount.getRegionName());
+            row.add(dataCount.getSiteName());
+            row.add(dataCount.getSiteUserCount());
+            row.add(dataCount.getCompanyCount());
+            row.add(dataCount.getPostCount());
+            row.add(dataCount.getJobUserCount());
+            rowsData.add(row);
+        }
+        data.setRows(rowsData);
+        // 设置单元格合并
+        List<CellRangeAddress> cellRangeAddressList = new ArrayList<>();
+        // 合计行合并
+        cellRangeAddressList.add(new CellRangeAddress(2, 2, 0, 1));
+        // 计算数据,将相同的县区进行合并
+        Map<String, Integer> regionCodeFirstIndex = new HashMap<>();
+        Map<String, Integer> regionCodeLastIndex = new HashMap<>();
+        for (int i = 0; i < systemDataCount.size(); i++) {
+            String regionCode = systemDataCount.get(i).getRegionCode();
+            if (!"合计".equals(regionCode)) { // 排除 '合计' 这个 regionCode
+                if (!regionCodeFirstIndex.containsKey(regionCode)) {
+                    regionCodeFirstIndex.put(regionCode, i + 2); // 起始位置加2,避开标题行和合并统计
+                }
+                regionCodeLastIndex.put(regionCode, i + 2); // 结束位置加2
+            }
+        }
+        // 解析最终坐标
+        for (Map.Entry<String, Integer> entry : regionCodeFirstIndex.entrySet()) {
+            String regionCode = entry.getKey();
+            int firstIndex = entry.getValue();
+            int lastIndex = regionCodeLastIndex.get(regionCode);
+            // 创建合并区域
+            CellRangeAddress newMergedRegion = new CellRangeAddress(firstIndex, lastIndex, 0, 0);
+            cellRangeAddressList.add(newMergedRegion);
+        }
+        data.setCellRangeList(cellRangeAddressList);
+        excelHelper.exportExcel(response, data);
+        return null;
+    }
 }

+ 1 - 1
src/main/java/com/hz/employmentsite/controller/taskAndLog/DoWorkController.java

@@ -101,7 +101,7 @@ public class DoWorkController {
                                @RequestParam(required = false) Date endDate) throws Exception {
         PageInfo<DoWorkVo> result = doWorkService.getList(pageIndex, pageSize, doWorkIDList, userName, workStartDate, workEndDate, doTypeID, regionCode, streetCode, null, siteID, startDate, endDate);
         ExcelHelper.ExcelData data = excelHelper.new ExcelData();
-        data.setTitles(Arrays.asList(new String[]{"序号", "姓名", " ", "日志类型", "工作情况", "所属县区", "所属街道"}));
+        data.setTitles(Arrays.asList(new String[]{"序号", "姓名", "工作日期", "日志类型", "工作情况", "所属县区", "所属街道"}));
         int i = 0;
         List<List<Object>> rowsData = new ArrayList();
         for (DoWorkVo item : result.getList()) {

+ 46 - 1
src/main/java/com/hz/employmentsite/services/impl/statistics/StatisticsServiceImpl.java

@@ -7,7 +7,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service("StatisticsService")
 public class StatisticsServiceImpl implements StatisticsService {
@@ -24,6 +26,49 @@ public class StatisticsServiceImpl implements StatisticsService {
      */
     @Override
     public List<SystemDataCount> findSystemDataCount(Date startDate, Date endDate) {
-        return statisticsCQuery.findSystemDataCount(startDate, endDate);
+        List<SystemDataCount> list = statisticsCQuery.findSystemDataCount(startDate, endDate);
+        // 初始化总和变量
+        SystemDataCount totalData = new SystemDataCount("合计", "合计", "合计", "合计", 0, 0, 0, 0);
+        // 遍历list,计算各项总和
+        for (SystemDataCount data : list) {
+            totalData.setSiteUserCount(totalData.getSiteUserCount() + data.getSiteUserCount());
+            totalData.setCompanyCount(totalData.getCompanyCount() + data.getCompanyCount());
+            totalData.setPostCount(totalData.getPostCount() + data.getPostCount());
+            totalData.setJobUserCount(totalData.getCompanyCount() + data.getJobUserCount());
+        }
+        // 将合计对象插入到list的第一个位置
+        list.add(0, totalData);
+
+        // 计算每个县区的小计
+        Map<String, SystemDataCount> regionCounts = new HashMap<>();
+        for (SystemDataCount data : list) {
+            if (!data.getRegionName().equals("合计")) {
+                String regionCode = data.getRegionCode();
+                if (!regionCounts.containsKey(regionCode)) {
+                    regionCounts.put(regionCode, new SystemDataCount(data.getSiteID(), "小计", data.getRegionCode(), data.getRegionName(), 0, 0, 0, 0));
+                }
+                SystemDataCount regionTotal = regionCounts.get(regionCode);
+                regionTotal.setSiteUserCount(regionTotal.getSiteUserCount() + data.getSiteUserCount());
+                regionTotal.setCompanyCount(regionTotal.getCompanyCount() + data.getCompanyCount());
+                regionTotal.setPostCount(regionTotal.getPostCount() + data.getPostCount());
+                regionTotal.setJobUserCount(regionTotal.getJobUserCount() + data.getJobUserCount());
+            }
+        }
+        // 将小计结果插入到每个相同regionCode的最前面
+        for (Map.Entry<String, SystemDataCount> entry : regionCounts.entrySet()) {
+            String regionCode = entry.getKey();
+            SystemDataCount regionTotal = entry.getValue();
+            // 找到相同regionCode的第一个位置
+            int index = 0;
+            for (int i = 0; i < list.size(); i++) {
+                if (list.get(i).getRegionCode().equals(regionCode)) {
+                    index = i;
+                    break;
+                }
+            }
+            list.add(index, regionTotal);
+        }
+
+        return list;
     }
 }

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

@@ -265,6 +265,9 @@ public class DateUtils {
      * @return
      */
     public String dateToStrFormat(java.util.Date dateDate, String format) {
+        if (dateDate == null) {
+            return "";
+        }
         SimpleDateFormat formatter = new SimpleDateFormat(format);
         String dateString = formatter.format(dateDate);
         return dateString;

+ 13 - 0
src/main/java/com/hz/employmentsite/vo/statistics/SystemDataCount.java

@@ -1,11 +1,15 @@
 package com.hz.employmentsite.vo.statistics;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 /**
  * 系统使用情况统计VO
  */
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class SystemDataCount {
     private String siteID;
 
@@ -22,4 +26,13 @@ public class SystemDataCount {
     private Integer postCount;
 
     private Integer jobUserCount;
+
+    public SystemDataCount(String siteName, String regionName, Integer siteUserCount, Integer companyCount, Integer postCount, Integer jobUserCount) {
+        this.siteName = siteName;
+        this.regionName = regionName;
+        this.siteUserCount = siteUserCount;
+        this.companyCount = companyCount;
+        this.postCount = postCount;
+        this.jobUserCount = jobUserCount;
+    }
 }

+ 19 - 46
vue/src/views/statistics/SystemApplyCount.vue

@@ -19,6 +19,19 @@
         </a-col>
       </a-row>
     </a-form>
+    <a-row class="edit-operation">
+      <a-col :span="24" class="flex-space-between">
+        <div>
+
+        </div>
+        <div>
+          <BExportExcel :filename="'系统使用情况统计'"
+                        :params="{...exportSearchParams}"
+                        :title="'导出'"
+                        :url="'statistics/export/systemApplyCount'"></BExportExcel>
+        </div>
+      </a-col>
+    </a-row>
     <div class="search-result-list">
       <a-table :columns="originalColumns" :data-source="systemApplyCount" :scroll="{ x:'100%' }"
                :loading="tableLoading"
@@ -62,10 +75,11 @@
 </template>
 
 <script setup lang="ts">
-import {onMounted, reactive, ref} from "vue";
+import {computed, onMounted, reactive, ref} from "vue";
 import {getSystemApplyCount} from "@/api/statistics";
 import type {FormInstance, TableColumnType} from "ant-design-vue";
 import dayjs from "dayjs";
+import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
 
 const formRef = ref<FormInstance>();
 
@@ -122,57 +136,16 @@ const searchParams = reactive({
 // 表格加载
 const tableLoading = ref(false);
 // const reportDate = ref();
+// 导出Excel查询参数
+const exportSearchParams = computed(() => {
+  return JSON.parse(JSON.stringify(searchParams));
+})
 
 // 数据加载
 function loadData() {
   tableLoading.value = true;
   getSystemApplyCount(searchParams).then((result: any) => {
     systemApplyCount.value = result;
-    // 计算合计数据
-    let total = result.reduce((acc, item) => {
-      acc.siteUserCount += item.siteUserCount || 0;
-      acc.companyCount += item.companyCount || 0;
-      acc.postCount += item.postCount || 0;
-      acc.jobUserCount += item.jobUserCount || 0;
-      return acc;
-    }, {siteUserCount: 0, companyCount: 0, postCount: 0, jobUserCount: 0});
-    total.siteName = "合计"
-    total.regionName = "合计"
-    systemApplyCount.value.unshift(total);
-
-    // 为每个县区计算小计
-    let regionMap = new Map();
-    result.forEach((item: any) => {
-      if (item.regionName !== '合计') {
-        if (!regionMap.has(item.regionCode)) {
-          regionMap.set(item.regionCode, {
-            regionCode: item.regionCode,
-            regionName: item.regionName,
-            siteName: "小计",
-            siteUserCount: 0,
-            companyCount: 0,
-            postCount: 0,
-            jobUserCount: 0
-          });
-        }
-        let regionTotal = regionMap.get(item.regionCode);
-        regionTotal.siteUserCount += item.siteUserCount || 0;
-        regionTotal.companyCount += item.companyCount || 0;
-        regionTotal.postCount += item.postCount || 0;
-        regionTotal.jobUserCount += item.jobUserCount || 0;
-      }
-    });
-
-    // 将统计结果插入到相同regionCode的第一个位置
-    let arr = new Array<any>();
-    systemApplyCount.value.forEach(item => {
-      if (regionMap.has(item.regionCode)) {
-        arr.push(regionMap.get(item.regionCode));
-        regionMap.delete(item.regionCode);
-      }
-      arr.push(item);
-    });
-    systemApplyCount.value = arr;
   }).finally(() => {
     tableLoading.value = false;
   })