Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

liao-sea vor 11 Monaten
Ursprung
Commit
3dd0d40563

+ 6 - 0
doc/待更新脚本

@@ -0,0 +1,6 @@
+-- 2024-5-23 添加系统使用情况统计菜单与权限编码
+INSERT INTO sys_function_code VALUES ('T010502', '系统使用情况统计', 'T0105', 2);
+INSERT INTO `sys_menu` VALUES ('T010502', 2, '系统使用情况统计', NULL, 'views/statistics/SystemApplyCount', '/systemApplyCount', 'T0105', NULL, 0, 1, 1, 'T010502', 1, NULL);
+-- 2024-5-23 为系统管理员添加统使用情况统计权限
+insert into sys_role_sys_function_code (`RoleID`, `FunctionCode`) values('20afde90-a81a-11ed-a6c5-7085c2a9999e','T0105');
+insert into sys_role_sys_function_code (`RoleID`, `FunctionCode`) values('20afde90-a81a-11ed-a6c5-7085c2a9999e','T010502');

+ 125 - 0
src/main/java/com/hz/employmentsite/controller/statistics/StatisticsController.java

@@ -0,0 +1,125 @@
+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 javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+@RequestMapping(value = "/api/statistics")
+public class StatisticsController {
+    @Autowired
+    private StatisticsService statisticsService;
+
+    @Autowired
+    private ExcelHelper excelHelper;
+
+    @Autowired
+    private DateUtils dateUtils;
+
+    /**
+     * 查询指定时间段系统使用情况
+     *
+     * @param startDate 开始时间
+     * @param endDate   结束时间
+     * @return 数据统计VO类集合
+     */
+    @GetMapping("/systemApplyCount")
+    public BaseResponse getSystemApplyCount(@RequestParam(value = "startDate", required = false) Date startDate,
+                                            @RequestParam(value = "endDate", required = false) Date endDate) {
+        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 {
+        if (startDate != null) {
+            Calendar startCal = Calendar.getInstance();
+            startCal.setTime(startDate);
+            startCal.set(Calendar.HOUR_OF_DAY, 0);
+            startCal.set(Calendar.MINUTE, 0);
+            startCal.set(Calendar.SECOND, 0);
+            startDate = startCal.getTime();
+        }
+
+        if (endDate != null) {
+            Calendar endCal = Calendar.getInstance();
+            endCal.setTime(endDate);
+            endCal.set(Calendar.HOUR_OF_DAY, 23);
+            endCal.set(Calendar.MINUTE, 59);
+            endCal.set(Calendar.SECOND, 59);
+            endDate = endCal.getTime();
+        }
+        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 {
                                @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);
         PageInfo<DoWorkVo> result = doWorkService.getList(pageIndex, pageSize, doWorkIDList, userName, workStartDate, workEndDate, doTypeID, regionCode, streetCode, null, siteID, startDate, endDate);
         ExcelHelper.ExcelData data = excelHelper.new ExcelData();
         ExcelHelper.ExcelData data = excelHelper.new ExcelData();
-        data.setTitles(Arrays.asList(new String[]{"序号", "姓名", " ", "日志类型", "工作情况", "所属县区", "所属街道"}));
+        data.setTitles(Arrays.asList(new String[]{"序号", "姓名", "工作日期", "日志类型", "工作情况", "所属县区", "所属街道"}));
         int i = 0;
         int i = 0;
         List<List<Object>> rowsData = new ArrayList();
         List<List<Object>> rowsData = new ArrayList();
         for (DoWorkVo item : result.getList()) {
         for (DoWorkVo item : result.getList()) {

+ 1 - 1
src/main/java/com/hz/employmentsite/filter/TokenInterceptor.java

@@ -32,7 +32,7 @@ public class TokenInterceptor implements HandlerInterceptor {
         response.setContentType("application/json; charset=utf-8");
         response.setContentType("application/json; charset=utf-8");
         try {
         try {
             JSONObject json = new JSONObject();
             JSONObject json = new JSONObject();
-            json.put("msg", "token verify fail");
+            json.put("message", "登录过期,请重新登录!");
             json.put("code", "500");
             json.put("code", "500");
             response.getWriter().append(json.toString());
             response.getWriter().append(json.toString());
         } catch (Exception e) {
         } catch (Exception e) {

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

@@ -0,0 +1,18 @@
+package com.hz.employmentsite.mapper.cquery;
+
+import com.hz.employmentsite.vo.statistics.SystemDataCount;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface StatisticsCQuery {
+    /**
+     * 查询指定时间段系统使用情况
+     *
+     * @param startDate 开始时间
+     * @param endDate   结束时间
+     * @return 数据统计VO类集合
+     */
+    List<SystemDataCount> findSystemDataCount(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
+}

+ 74 - 0
src/main/java/com/hz/employmentsite/services/impl/statistics/StatisticsServiceImpl.java

@@ -0,0 +1,74 @@
+package com.hz.employmentsite.services.impl.statistics;
+
+import com.hz.employmentsite.mapper.cquery.StatisticsCQuery;
+import com.hz.employmentsite.services.service.statistics.StatisticsService;
+import com.hz.employmentsite.vo.statistics.SystemDataCount;
+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 {
+
+    @Autowired
+    private StatisticsCQuery statisticsCQuery;
+
+    /**
+     * 查询指定时间段系统使用情况
+     *
+     * @param startDate 开始时间
+     * @param endDate   结束时间
+     * @return 数据统计VO类集合
+     */
+    @Override
+    public List<SystemDataCount> findSystemDataCount(Date startDate, Date 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;
+    }
+}

+ 17 - 0
src/main/java/com/hz/employmentsite/services/service/statistics/StatisticsService.java

@@ -0,0 +1,17 @@
+package com.hz.employmentsite.services.service.statistics;
+
+import com.hz.employmentsite.vo.statistics.SystemDataCount;
+
+import java.util.Date;
+import java.util.List;
+
+public interface StatisticsService {
+    /**
+     * 查询指定时间段系统使用情况
+     *
+     * @param startDate 开始时间
+     * @param endDate   结束时间
+     * @return 数据统计VO类集合
+     */
+    List<SystemDataCount> findSystemDataCount(Date startDate, Date endDate);
+}

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

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

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

@@ -0,0 +1,38 @@
+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;
+
+    private String siteName;
+
+    private String regionCode;
+
+    private String regionName;
+
+    private Integer siteUserCount;
+
+    private Integer companyCount;
+
+    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;
+    }
+}

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

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.hz.employmentsite.mapper.cquery.StatisticsCQuery">
+    <select id="findSystemDataCount" resultType="com.hz.employmentsite.vo.statistics.SystemDataCount">
+        SELECT
+        site.SiteID,
+        site.RegionCode,
+        site.SiteName,
+        area.`name` AS regionName,
+        -- 驿站人员数量
+        ( SELECT COUNT( 1 ) FROM pc_site_user WHERE SiteID = site.SiteID ) AS siteUserCount,
+        -- 指定时间段的登记企业数量
+        (
+        SELECT
+        COUNT( 1 )
+        FROM
+        pc_company
+        WHERE
+        SiteID = site.SiteID
+        <if test="startDate != null">
+            and DATE(CreateTime) <![CDATA[ >= ]]> DATE(#{startDate})
+        </if>
+        <if test="endDate != null ">
+            and DATE(CreateTime) <![CDATA[ <= ]]> DATE(#{endDate})
+        </if>
+        ) AS companyCount,
+        -- 指定时间段的登记岗位数量
+        (
+        SELECT
+        COUNT( 1 )
+        FROM
+        pc_post post
+        WHERE
+        CompanyID IN ( SELECT company.CompanyID FROM pc_company company WHERE company.SiteID = site.SiteID )
+        <if test="startDate != null">
+            and DATE(CreateTime) <![CDATA[ >= ]]> DATE(#{startDate})
+        </if>
+        <if test="endDate != null ">
+            and DATE(CreateTime) <![CDATA[ <= ]]> DATE(#{endDate})
+        </if>
+        ) AS postCount,
+        -- 指定时间段的登记求职人员数量
+        (
+        SELECT
+        COUNT( 1 )
+        FROM
+        pc_jobuser
+        WHERE
+        SiteID = site.SiteID
+        <if test="startDate != null">
+            and DATE(CreateTime) <![CDATA[ >= ]]> DATE(#{startDate})
+        </if>
+        <if test="endDate != null ">
+            and DATE(CreateTime) <![CDATA[ <= ]]> DATE(#{endDate})
+        </if>
+        ) AS jobUserCount
+        FROM
+        pc_site site
+        LEFT JOIN area_code area ON site.RegionCode = area.`code`
+        ORDER BY
+        site.RegionCode
+    </select>
+</mapper>

+ 18 - 0
vue/src/api/statistics/index.ts

@@ -0,0 +1,18 @@
+import {request} from "@/utils/request";
+
+/**
+ * 查询指定时间段系统使用情况
+ * @param params 查询参数
+ */
+export function getSystemApplyCount(params: any) {
+  return request<object>(
+    {
+      url: 'statistics/systemApplyCount',
+      method: 'get',
+      params: params,
+    },
+    {
+      isNew: true,
+    },
+  );
+}

+ 3 - 0
vue/src/router/asyncModules/statistics.ts

@@ -0,0 +1,3 @@
+export default {
+  'views/statistics/SystemApplyCount': () => import('@/views/statistics/SystemApplyCount.vue'),
+};

+ 52 - 12
vue/src/views/jobUserManager/jobhunt/edit.vue

@@ -16,10 +16,19 @@
         </a-col>
         </a-col>
       <a-col :span="8">
       <a-col :span="8">
         <a-form-item label="求职岗位"  name="professionName" :label-col="{span:7}" :rules="[{ required: true,message:'请选择求职岗位!' }]">
         <a-form-item label="求职岗位"  name="professionName" :label-col="{span:7}" :rules="[{ required: true,message:'请选择求职岗位!' }]">
-          <!-- <label v-if="opCategory==3">{{dataModel.postID}}</label> -->
-          <a-cascader :load-data="loadLevelProfessionList" v-model:value="dataModel.professionName"
-                      :options="firstProfessionList" change-on-select>
-          </a-cascader>
+          <a-auto-complete
+            v-model:value="dataModel.professionName"
+            :options="professionList"
+            @search="selectProfessionList"
+            @change="professionChange"
+            :field-names="{
+                            value:'professionName',
+                          }"
+          >
+            <template #option="item">
+              <span v-html="formatStr(item.professionName)"></span>({{ item.parentProfessionName }})
+            </template>
+          </a-auto-complete>
         </a-form-item>
         </a-form-item>
       </a-col>
       </a-col>
         <a-col :span="9">
         <a-col :span="9">
@@ -27,13 +36,13 @@
             <label style="color:red;float: left;position:relative;right:80px;line-height: 35px;" >*</label>
             <label style="color:red;float: left;position:relative;right:80px;line-height: 35px;" >*</label>
             <a-form-item name="minSalary" :rules="[{ required: true, message: '请输入最低月薪!' }]"  style="float:left;">
             <a-form-item name="minSalary" :rules="[{ required: true, message: '请输入最低月薪!' }]"  style="float:left;">
               <a-input-number :controls="false" :min="0" name="minSalary" v-model:value="dataModel.minSalary"
               <a-input-number :controls="false" :min="0" name="minSalary" v-model:value="dataModel.minSalary"
-                              style="min-width: 145px;max-width: 150px;" placeholder="" @change="salaryChange"/>
+                              style="min-width: 145px;max-width: 150px;" placeholder=""/>
             </a-form-item>
             </a-form-item>
             <label style="margin-right:10px;margin-left:10px;float: left;">-</label>
             <label style="margin-right:10px;margin-left:10px;float: left;">-</label>
             <a-form-item name="maxSalary"  :rules="[{ required: true, message: '请输入最高月薪!' }]" style="float: left;" >
             <a-form-item name="maxSalary"  :rules="[{ required: true, message: '请输入最高月薪!' }]" style="float: left;" >
               <a-input-number :controls="false" :min="dataModel.minSalary" name="maxSalary"
               <a-input-number :controls="false" :min="dataModel.minSalary" name="maxSalary"
                               v-model:value="dataModel.maxSalary"
                               v-model:value="dataModel.maxSalary"
-                              style="min-width: 145px;max-width: 150px;" placeholder="" @change="salaryChange"/>
+                              style="min-width: 145px;max-width: 150px;" placeholder=""/>
             </a-form-item>
             </a-form-item>
           </a-form-item>
           </a-form-item>
         </a-col>
         </a-col>
@@ -110,6 +119,8 @@ import {getSysDictionaryList} from '@/api/system/dictionary';
 import BUploadFile from "@/components/file/uploadFile.vue";
 import BUploadFile from "@/components/file/uploadFile.vue";
 import {CascaderProps, message, SelectProps} from "ant-design-vue";
 import {CascaderProps, message, SelectProps} from "ant-design-vue";
 import {get} from "@/api/common";
 import {get} from "@/api/common";
+import {debounce} from "lodash-es";
+import {getProfessionLikeList} from "@/api/jobUserManager/recommendMgt";
 
 
 interface jobHuntModel {
 interface jobHuntModel {
   dataModel: any;
   dataModel: any;
@@ -140,6 +151,7 @@ export default defineComponent({
     const jobHuntTypeList =  ref<SelectProps['options']>();
     const jobHuntTypeList =  ref<SelectProps['options']>();
     const jobUserTypeList =  ref<SelectProps['options']>();
     const jobUserTypeList =  ref<SelectProps['options']>();
     const regionList = ref<SelectProps['options']>();
     const regionList = ref<SelectProps['options']>();
+    const professionList = ref<Array<any>>([]);
 
 
     const getWorkAreas = async function(){
     const getWorkAreas = async function(){
       const result :any = await get('system/area/getCityList',{});
       const result :any = await get('system/area/getCityList',{});
@@ -252,8 +264,6 @@ export default defineComponent({
         isAllowCommit.value = false;
         isAllowCommit.value = false;
       }
       }
       if (isAllowCommit.value){
       if (isAllowCommit.value){
-        formData.dataModel.professionName=null;
-        //console.log("当前意向信息",formData.dataModel);
         saveJobHuntCopy(formData.dataModel).then(result => {
         saveJobHuntCopy(formData.dataModel).then(result => {
           if (result) {
           if (result) {
             onClose(1);
             onClose(1);
@@ -262,10 +272,37 @@ export default defineComponent({
       }
       }
     };
     };
 
 
-    function salaryChange() {
-      if (formData.dataModel.maxSalary < formData.dataModel.minSalary) {
-        formData.dataModel.maxSalary = formData.dataModel.minSalary
+    // 查询岗位
+    const selectProfessionList = debounce((professionName: string) => {
+      if (professionName) {
+        getProfessionLikeList({
+          pageIndex: 1,
+          pageSize: 30,
+          professionName,
+        }).then(data => {
+          professionList.value = data.list;
+        })
       }
       }
+    }, 200)
+
+    // 岗位名称变更
+    function professionChange(value: any) {
+      formData.dataModel.professionName = value
+      const profession = professionList.value.find(prof => prof.professionName === value);
+      if (profession) {
+        formData.dataModel.professionID = profession.professionID;
+      } else {
+        formData.dataModel.professionID = "";
+      }
+    }
+
+    // 名称搜索关键字高亮
+    const formatStr = (str: any) => {
+      if (!str) {
+        return "";
+      }
+
+      return str.replace(formData.dataModel.professionName, '<span style="color: coral">' + formData.dataModel.professionName + '</span>');
     }
     }
 
 
     return {
     return {
@@ -285,7 +322,10 @@ export default defineComponent({
       jobHuntTypeList,
       jobHuntTypeList,
       jobWorkTypeList,
       jobWorkTypeList,
       isAllowCommit,
       isAllowCommit,
-      salaryChange
+      professionList,
+      selectProfessionList,
+      professionChange,
+      formatStr
     };
     };
   },
   },
   created() {
   created() {

+ 183 - 0
vue/src/views/statistics/SystemApplyCount.vue

@@ -0,0 +1,183 @@
+<template>
+  <div class="card-search">
+    <a-form
+      ref="formRef"
+      name="advanced_search"
+      class="ant-advanced-search-form"
+      :model="searchParams"
+    >
+      <a-row :gutter="24">
+        <a-col :span="6">
+          <a-form-item label="统计日期" :label-col="{span:6}" name="reportDate">
+            <a-range-picker format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']"
+                            @change="onRangeChange"/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="6" style="text-align: left">
+          <a-button type="primary" html-type="submit" @click="loadData">查询</a-button>
+          <a-button style="margin: 0 8px" @click="onReset">重置</a-button>
+        </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"
+               :pagination="false"
+               bordered>
+        <template #bodyCell="{ column, text, record }">
+          <template v-if="column.key == 'regionName'">
+            <div>
+              {{ record.regionName }}
+            </div>
+          </template>
+          <template v-if="column.key == 'siteName'">
+            <div>
+              {{ record.siteName }}
+            </div>
+          </template>
+          <template v-if="column.key == 'siteUserCount'">
+            <div>
+              {{ record.siteUserCount }}
+            </div>
+          </template>
+          <template v-if="column.key == 'companyCount'">
+            <div>
+              {{ record.companyCount }}
+            </div>
+          </template>
+          <template v-if="column.key == 'postCount'">
+            <div>
+              {{ record.postCount }}
+            </div>
+          </template>
+          <template v-if="column.key == 'jobUserCount'">
+            <div>
+              {{ record.jobUserCount }}
+            </div>
+          </template>
+        </template>
+      </a-table>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+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>();
+
+const originalColumns: TableColumnType[] = [
+  {
+    title: '行政区划', dataIndex: 'regionName', key: 'regionName', align: "center", width: 250,
+    customCell: (record, index: any) => {
+      const obj = {
+        colSpan: 1,
+        rowSpan: 1,
+      };
+      if (record.regionName == '合计') {
+        obj.colSpan = 2;
+      }
+      if (index === 0 || record.regionName !== systemApplyCount.value[index - 1].regionName) {
+        for (let i = index + 1; i < systemApplyCount.value.length; i++) {
+          if (systemApplyCount.value[i].regionName == record.regionName) {
+            obj.rowSpan++;
+          } else {
+            break;
+          }
+        }
+      } else {
+        obj.rowSpan = 0;
+      }
+      return obj;
+    },
+  },
+  {
+    title: '驿站名', dataIndex: 'siteName', key: 'siteName', align: "center", width: 250,
+    customCell: (record) => {
+      const obj = {
+        colSpan: 1,
+      };
+      if (record.siteName == '合计') {
+        obj.colSpan = 0;
+      }
+      return obj;
+    },
+  },
+  {title: '驿站人员数量', dataIndex: 'siteUserCount', key: 'siteUserCount', align: "center"},
+  {title: '录入企业数量', dataIndex: 'companyCount', key: 'companyCount', align: "center"},
+  {title: '收集岗位数量', dataIndex: 'postCount', key: 'postCount', align: "center"},
+  {title: '登记求职人数', dataIndex: 'jobUserCount', key: 'jobUserCount', align: "center"},
+]
+
+// 统计数据
+const systemApplyCount = ref<Array<any>>([]);
+// 查询条件
+const searchParams = reactive({
+  startDate: "",
+  endDate: ""
+})
+// 表格加载
+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;
+  }).finally(() => {
+    tableLoading.value = false;
+  })
+}
+
+// 时间段变更事件
+const onRangeChange = (dateString: [string, string]) => {
+  searchParams.startDate = dateString != null ? dayjs(dateString[0]).format("YYYY-MM-DD") : "";
+  searchParams.endDate = dateString != null ? dayjs(dateString[1]).format("YYYY-MM-DD") : "";
+};
+
+// 查询表单
+function onReset() {
+  formRef.value?.resetFields();
+  loadData()
+}
+
+// 页面初始化
+onMounted(() => {
+  loadData()
+})
+</script>
+
+<script lang="ts">
+// 设置页面名称进行组件缓存
+export default {
+  name: "SystemApplyDataCount",
+}
+</script>
+
+<style lang="less">
+.totalCol {
+  background-color: #40a9ff !important;
+}
+</style>