Browse Source

feat: 企业新报表

zhangying 6 months ago
parent
commit
6a23f3c952

+ 4 - 0
doc/待更新脚本.txt

@@ -1,3 +1,7 @@
 INSERT INTO sys_function_code VALUES ('T010506', '驿站统计报表', 'T0105', 6);
 INSERT INTO `sys_menu` VALUES ('T010506', 6, '驿站统计报表', NULL, 'views/statistics/SiteStatistics', '/siteStatistics', 'T0105', NULL, 0, 1, 1, 'T010506', 1, NULL, NULL);
 insert into sys_role_sys_function_code (`RoleID`, `FunctionCode`) values('20afde90-a81a-11ed-a6c5-7085c2a9999e','T010506');
+
+INSERT INTO sys_function_code VALUES ('T010507', '企业统计报表', 'T0105', 7);
+INSERT INTO `sys_menu` VALUES ('T010507', 7, '企业统计报表', NULL, 'views/statistics/CompanyStatistics', '/companyStatistics', 'T0105', NULL, 0, 1, 1, 'T010507', 1, NULL, NULL);
+insert into sys_role_sys_function_code (`RoleID`, `FunctionCode`) values('20afde90-a81a-11ed-a6c5-7085c2a9999e','T010507');

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

@@ -236,6 +236,21 @@ public class StatisticsController {
         return RespGenerstor.success(statisticsService.findPersonTypeCountInJobUserData(keyPersonTypeID, startDate, endDate, regionCode, siteID));
     }
 
+    /**
+     * 查询各区县的各个规模的企业数量与走访企业次数
+     */
+    @GetMapping("/companyModelCompanyCountInRegion")
+    public BaseResponse getRegionCompanyModelCompanyCount(@RequestParam(required = false) Date startDate, @RequestParam(required = false) Date endDate) {
+        return RespGenerstor.success(statisticsService.findRegionCompanyModelCompanyCount(startDate, endDate));
+    }
+
+    /**
+     * 查询各区县的各个规模的企业用工人数与岗位招聘人数
+     */
+    @GetMapping("/workSituationCountInRegion")
+    public BaseResponse getRegionCompanyWorkSituationCount(@RequestParam(required = false) Date startDate, @RequestParam(required = false) Date endDate) {
+        return RespGenerstor.success(statisticsService.findRegionCompanyWorkSituationCount(startDate, endDate));
+    }
 
     /**
      * 导出指定时间段的系统使用情况

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

@@ -213,4 +213,24 @@ public interface StatisticsCQuery {
     List<PersonTypeJobUserCount> findPersonTypeCountInCultureRank(@Param("keyPersonTypeID") Integer keyPersonTypeID, @Param("startDate") Date startDate,
                                                                @Param("endDate") Date endDate, @Param("regionCode") String regionCode,
                                                                @Param("siteID") String siteID);
+
+    /**
+     * 查询各区县额企业的企业规模分布情况
+     */
+    List<ModelCompanyCount> findRegionCompanyModelCompanyCount(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
+
+    /**
+     * 查询各区县各个规模的企业走访情况
+     */
+    List<ModelCompanyCount> findRegionCompanyModelSigninCompanyCount(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
+
+    /**
+     * 查询各区县各个规模的企业的用工情况
+     */
+    List<ModelCompanyCount> findRegionCompanyWorkSituationCount(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
+
+    /**
+     * 查询各区县各个规模的企业的岗位招聘人数情况
+     */
+    List<ModelCompanyCount> findRegionCompanyRecruitCount(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
 }

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

@@ -643,4 +643,26 @@ public class StatisticsServiceImpl implements StatisticsService {
         return personTypeCountList;
 
     }
+
+    /**
+     * 查询各区县的各个规模的企业数量与走访企业次数
+     */
+    @Override
+    public List<ModelCompanyCount> findRegionCompanyModelCompanyCount(Date startDate, Date endDate) {
+        List<ModelCompanyCount> companyCountList = new ArrayList<>();
+        companyCountList.addAll(statisticsCQuery.findRegionCompanyModelCompanyCount(startDate, endDate)); // 企业数量
+        companyCountList.addAll(statisticsCQuery.findRegionCompanyModelSigninCompanyCount(startDate, endDate)); // 走访企业次数
+        return companyCountList;
+    }
+
+    /**
+     * 查询各区县的各个规模的企业用工人数与岗位招聘人数
+     */
+    @Override
+    public List<ModelCompanyCount> findRegionCompanyWorkSituationCount(Date startDate, Date endDate) {
+        List<ModelCompanyCount> companyCountList = new ArrayList<>();
+        companyCountList.addAll(statisticsCQuery.findRegionCompanyWorkSituationCount(startDate, endDate)); // 用工人数
+        companyCountList.addAll(statisticsCQuery.findRegionCompanyRecruitCount(startDate, endDate)); // 岗位招聘人数
+        return companyCountList;
+    }
 }

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

@@ -122,4 +122,14 @@ public interface StatisticsService {
      */
     List<PersonTypeJobUserCount> findPersonTypeCountInJobUserData(Integer keyPersonTypeID, Date startDate, Date endDate,
                                                                   String regionCode, String siteID);
+
+    /**
+     * 查询各区县的各个规模的企业数量与走访企业次数
+     */
+    List<ModelCompanyCount> findRegionCompanyModelCompanyCount(Date startDate, Date endDate);
+
+    /**
+     * 查询各区县的各个规模的企业用工人数与岗位招聘人数
+     */
+    List<ModelCompanyCount> findRegionCompanyWorkSituationCount(Date startDate, Date endDate);
 }

+ 6 - 0
src/main/java/com/hz/employmentsite/vo/statistics/company/ModelCompanyCount.java

@@ -13,4 +13,10 @@ public class ModelCompanyCount {
     private String companyModelName;
 
     private int companyCount;
+
+    private int signinCompanyCount;
+
+    private int workSituationCount;
+
+    private int recruitCount;
 }

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

@@ -1026,4 +1026,137 @@
         ORDER BY
             jobuser.KeyPersonTypeID DESC
     </select>
+
+    <select id="findRegionCompanyModelCompanyCount" resultType="com.hz.employmentsite.vo.statistics.company.ModelCompanyCount">
+        SELECT
+            area.`code` AS regionCode,
+            area.`name` AS regionName,
+            company.CompanyModel,
+            dict.`Name` AS companyModelName,
+            COUNT( company.CompanyID ) AS companyCount
+        FROM
+            area_code area
+                LEFT JOIN pc_site site ON area.`code` = site.RegionCode
+                LEFT JOIN pc_company company ON site.SiteID = company.SiteID
+                LEFT JOIN sys_dictionary_item dict ON company.CompanyModel = dict.`Value`
+                AND dict.DictionaryCode = 'CompanyModel'
+        WHERE
+            area.lv = 3
+            AND area.`code` != '441301000000000'
+	        AND company.CompanyModel IS NOT NULL
+            <if test="startDate != null">
+                and DATE(company.CreateTime) <![CDATA[ >= ]]> DATE(#{startDate})
+            </if>
+            <if test="endDate != null ">
+                and DATE(company.CreateTime) <![CDATA[ <= ]]> DATE(#{endDate})
+            </if>
+        GROUP BY
+            area.`code`,
+            area.`name`,
+            company.CompanyModel,
+            dict.`Name`
+        ORDER BY
+            area.`code`
+    </select>
+
+    <select id="findRegionCompanyModelSigninCompanyCount" resultType="com.hz.employmentsite.vo.statistics.company.ModelCompanyCount">
+        SELECT
+            area.`code` AS regionCode,
+            area.`name` AS regionName,
+            company.CompanyModel,
+            dict.`Name` AS companyModelName,
+            COUNT( signin.CompanyID ) AS signinCompanyCount
+        FROM
+            area_code area
+                LEFT JOIN pc_site site ON area.`code` = site.RegionCode
+                LEFT JOIN pc_company company ON site.SiteID = company.SiteID
+                LEFT JOIN pc_signin signin ON company.CompanyID = signin.CompanyID
+                LEFT JOIN sys_dictionary_item dict ON company.CompanyModel = dict.`Value`
+                AND dict.DictionaryCode = 'CompanyModel'
+        WHERE
+            area.lv = 3
+            AND area.`code` != '441301000000000'
+            AND company.CompanyModel IS NOT NULL
+            AND signin.SigninType = 1
+            <if test="startDate != null">
+                and DATE(signin.CreateTime) <![CDATA[ >= ]]> DATE(#{startDate})
+            </if>
+            <if test="endDate != null ">
+                and DATE(signin.CreateTime) <![CDATA[ <= ]]> DATE(#{endDate})
+            </if>
+        GROUP BY
+            area.`code`,
+            area.`name`,
+            company.CompanyModel,
+            dict.`Name`
+        ORDER BY
+            area.`code`
+    </select>
+
+    <select id="findRegionCompanyWorkSituationCount" resultType="com.hz.employmentsite.vo.statistics.company.ModelCompanyCount">
+        SELECT
+            area.`code` AS regionCode,
+            area.`name` AS regionName,
+            company.CompanyModel,
+            dict.`Name` AS companyModelName,
+            COUNT( company.workSituation ) AS workSituationCount
+        FROM
+            area_code area
+                LEFT JOIN pc_site site ON area.`code` = site.RegionCode
+                LEFT JOIN pc_company company ON site.SiteID = company.SiteID
+                LEFT JOIN sys_dictionary_item dict ON company.CompanyModel = dict.`Value`
+                AND dict.DictionaryCode = 'CompanyModel'
+        WHERE
+            area.lv = 3
+            AND area.`code` != '441301000000000'
+            AND company.CompanyModel IS NOT NULL
+            AND company.WorkSituation IS NOT NULL
+            <if test="startDate != null">
+                and DATE(company.CreateTime) <![CDATA[ >= ]]> DATE(#{startDate})
+            </if>
+            <if test="endDate != null ">
+                and DATE(company.CreateTime) <![CDATA[ <= ]]> DATE(#{endDate})
+            </if>
+        GROUP BY
+            area.`code`,
+            area.`name`,
+            company.CompanyModel,
+            dict.`Name`
+        ORDER BY
+            area.`code`
+    </select>
+
+    <select id="findRegionCompanyRecruitCount" resultType="com.hz.employmentsite.vo.statistics.company.ModelCompanyCount">
+        SELECT
+            area.`code` AS regionCode,
+            area.`name` AS regionName,
+            company.CompanyModel,
+            dict.`Name` AS companyModelName,
+            COUNT( post.recruitCount ) AS recruitCount
+        FROM
+            area_code area
+                LEFT JOIN pc_site site ON area.`code` = site.RegionCode
+                LEFT JOIN pc_company company ON site.SiteID = company.SiteID
+                LEFT JOIN pc_post post ON company.CompanyID = post.CompanyID
+                LEFT JOIN sys_dictionary_item dict ON company.CompanyModel = dict.`Value`
+                AND dict.DictionaryCode = 'CompanyModel'
+        WHERE
+            area.lv = 3
+            AND area.`code` != '441301000000000'
+            AND company.CompanyModel IS NOT NULL
+            AND post.RecruitCount IS NOT NULL
+            <if test="startDate != null">
+                and DATE(post.CreateTime) <![CDATA[ >= ]]> DATE(#{startDate})
+            </if>
+            <if test="endDate != null ">
+                and DATE(post.CreateTime) <![CDATA[ <= ]]> DATE(#{endDate})
+            </if>
+        GROUP BY
+            area.`code`,
+            area.`name`,
+            company.CompanyModel,
+            dict.`Name`
+        ORDER BY
+            area.`code`
+    </select>
 </mapper>

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

@@ -324,3 +324,35 @@ export function getPersonTypeCountInJobUserData(params: any) {
     },
   );
 }
+
+/**
+ * 查询各区县的各个规模的企业数量与走访企业次数
+ */
+export function getRegionCompanyModelCompanyCount(params: any) {
+  return request<object>(
+    {
+      url: 'statistics/companyModelCompanyCountInRegion',
+      method: 'get',
+      params: params,
+    },
+    {
+      isNew: true,
+    },
+  );
+}
+
+/**
+ * 查询各区县的各个规模的企业用工人数与岗位招聘人数
+ */
+export function getRegionCompanyWorkSituationCount(params: any) {
+  return request<object>(
+    {
+      url: 'statistics/workSituationCountInRegion',
+      method: 'get',
+      params: params,
+    },
+    {
+      isNew: true,
+    },
+  );
+}

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

@@ -4,4 +4,5 @@ export default {
   'views/statistics/JobUserCount': () => import('@/views/statistics/JobUserCount.vue'),
   'views/statistics/YearSystemApplyCount': () => import('@/views/statistics/YearSystemApplyCount.vue'),
   'views/statistics/SiteStatistics': () => import('@/views/statistics/SiteStatistics.vue'),
+  'views/statistics/CompanyStatistics': () => import('@/views/statistics/CompanyStatistics.vue'),
 };

+ 274 - 0
vue/src/views/statistics/CompanyStatistics.vue

@@ -0,0 +1,274 @@
+<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: 8 }" name="emphasisTypeId">
+            <a-range-picker format="YYYY-MM-DD" :placeholder="['开始日期', '结束日期']" v-model:value="reportDate"
+                            @change="onRangeChange"/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="6" style="text-align: left">
+          <a-button type="primary" html-type="submit" @click="onFinish">查询</a-button>
+          <a-button
+            style="margin: 0 8px"
+            @click="
+              () => {
+                formRef.resetFields();
+                onFinish();
+              }
+            ">重置
+          </a-button>
+        </a-col>
+      </a-row>
+    </a-form>
+    <!-- 操作按钮 -->
+    <a-row class="edit-operation" style="margin-bottom: 20px">
+      <a-col :span="24" class="flex-space-between">
+        <div>
+          <a-radio-group v-model:value="searchType" button-style="solid" @change="searchTypeChange">
+            <a-radio-button value="companyCount">企业入库与走访情况统计</a-radio-button>
+            <a-radio-button value="workSituationCount">企业用工人数与岗位招聘人数统计</a-radio-button>
+          </a-radio-group>
+        </div>
+        <div>
+        </div>
+      </a-col>
+    </a-row>
+    <!-- 数据展示 -->
+    <!-- 企业入库与走访情况统计 -->
+    <div v-show="searchType == 'companyCount'">
+      <a-table :columns="companyCountDataTableColumns" :data-source="companyCountDataList"
+               :scroll="{ x:'100%' }"
+               :loading="searchLoading"
+               :pagination="false"
+               bordered>
+      </a-table>
+    </div>
+    <!-- 企业用工人数与岗位招聘人数统计 -->
+    <div v-show="searchType == 'workSituationCount'">
+      <a-table :columns="workSituationCountDataTableColumns" :data-source="workSituationCountDataList"
+               :scroll="{ x:'100%' }"
+               :loading="searchLoading"
+               :pagination="false"
+               bordered>
+      </a-table>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import {onMounted, reactive, ref} from "vue";
+import type {RangeValue} from "ant-design-vue/es/vc-picker/interface";
+import dayjs from "dayjs";
+import {getSysDictionaryList} from "@/api/system/dictionary";
+import {getRegionCompanyModelCompanyCount, getRegionCompanyWorkSituationCount} from "@/api/statistics";
+
+const searchParams = reactive({
+  startDate: "",
+  endDate: "",
+});
+const reportDate = ref<RangeValue<any>>();
+const searchType = ref("companyCount");
+const formRef = ref();
+const searchLoading = ref(false);
+const companyModelList = ref<Array<any>>();
+// 企业入库与走访情况统计表结构
+const companyCountDataTableColumns = ref<Array<any>>([
+  {
+    title: '区县', dataIndex: 'regionName', key: 'regionName', align: "center", width: 280
+  },
+]);
+const companyCountDataList = ref<Array<any>>([]);
+const companyCountKeyTemp = ref<Array<any>>([]);
+// 企业用工人数与岗位招聘人数统计表结构
+const workSituationCountDataTableColumns = ref<Array<any>>([
+  {
+    title: '区县', dataIndex: 'regionName', key: 'regionName', align: "center", width: 280
+  },
+]);
+const workSituationCountDataList = ref<Array<any>>([]);
+const workSituationCountKeyTemp = ref<Array<any>>([]);
+
+// 时间段变更事件
+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") : "";
+  onFinish();
+};
+
+function onFinish() {
+  searchTypeChange();
+}
+
+// 获取企业规模
+function getCompanyModel() {
+  getSysDictionaryList("CompanyModel").then((result: any) => {
+    companyModelList.value = result;
+    // 生成表结构
+    result.forEach((item: any) => {
+      const key = 'companyModel' + item.value;
+      // 企业入库与走访情况统计表结构
+      companyCountKeyTemp.value.push(...[key + 'Count', key + 'SigninCount']);
+      companyCountDataTableColumns.value.push({
+        title: item.name, dataIndex: key, key, align: "center",
+        children: [
+          {
+            title: '入库',
+            dataIndex: key + 'Count',
+            key: key + 'Count',
+            align: "center"
+          },
+          {
+            title: '走访',
+            dataIndex: key + 'SigninCount',
+            key: key + 'SigninCount',
+            align: "center"
+          },
+        ]
+      })
+      // 企业用工人数与岗位招聘人数统计表结构
+      workSituationCountKeyTemp.value.push(...[key + 'WorkSituationCount', key + 'RecruitCount']);
+      workSituationCountDataTableColumns.value.push({
+        title: item.name, dataIndex: key, key, align: "center",
+        children: [
+          {
+            title: '用工人数',
+            dataIndex: key + 'WorkSituationCount',
+            key: key + 'WorkSituationCount',
+            align: "center"
+          },
+          {
+            title: '岗位人数',
+            dataIndex: key + 'RecruitCount',
+            key: key + 'RecruitCount',
+            align: "center"
+          },
+        ]
+      })
+    })
+  });
+}
+
+function searchTypeChange() {
+  if (searchType.value == "companyCount") {
+    searchLoading.value = true;
+    companyCountDataList.value = [];
+    getRegionCompanyModelCompanyCount({...searchParams}).then((result: any) => {
+      // 初始化合计数据
+      let count = {
+        regionCode: -1,
+        regionName: "合计",
+      }
+      // 初始化字段值为O
+      companyCountKeyTemp.value.forEach((key: any) => {
+        count[key] = 0;
+      })
+      result.forEach((resItem: any) => {
+        const key = 'companyModel' + resItem.companyModel;
+        // 查询获取区县数据的下标,保证每个区县只存在一条数据
+        const findIndex = companyCountDataList.value.findIndex((find: any) => find.regionCode == resItem.regionCode);
+        if (findIndex > -1) {
+          // 区县已存在,修改这条数据
+          if (resItem.companyCount > 0) {
+            companyCountDataList.value[findIndex][key + 'Count'] = resItem.companyCount;
+            count[key + 'Count'] += resItem.companyCount;
+          }
+          if (resItem.signinCompanyCount > 0) {
+            companyCountDataList.value[findIndex][key + 'SigninCount'] = resItem.signinCompanyCount;
+            count[key + 'SigninCount'] += resItem.signinCompanyCount;
+          }
+        } else {
+          // 不存在,新增一条数据
+          const newData = {
+            regionCode: resItem.regionCode,
+            regionName: resItem.regionName,
+          }
+          companyCountKeyTemp.value.forEach((key: any) => {
+            newData[key] = 0;
+          })
+          if (resItem.companyCount > 0) {
+            newData[key + 'Count'] = resItem.companyCount;
+            count[key + 'Count'] += resItem.companyCount;
+          }
+          if (resItem.signinCompanyCount > 0) {
+            newData[key + 'SigninCount'] = resItem.signinCompanyCount;
+            count[key + 'SigninCount'] += resItem.signinCompanyCount;
+          }
+          companyCountDataList.value.push(newData);
+        }
+      });
+      console.log(count);
+      companyCountDataList.value.push(count);
+    }).finally(() => {
+      searchLoading.value = false;
+    })
+  }
+  if (searchType.value == "workSituationCount") {
+    searchLoading.value = true;
+    workSituationCountDataList.value = [];
+    getRegionCompanyWorkSituationCount({...searchParams}).then((result: any) => {
+      // 初始化合计数据
+      let count = {
+        regionCode: -1,
+        regionName: "合计",
+      }
+      // 初始化字段值为O
+      workSituationCountKeyTemp.value.forEach((key: any) => {
+        count[key] = 0;
+      });
+      result.forEach((resItem: any) => {
+        const key = 'companyModel' + resItem.companyModel;
+        // 查询获取区县数据的下标,保证每个区县只存在一条数据
+        const findIndex = workSituationCountDataList.value.findIndex((find: any) => find.regionCode == resItem.regionCode);
+        if (findIndex > -1) {
+          // 区县已存在,修改这条数据
+          if (resItem.workSituationCount > 0) {
+            workSituationCountDataList.value[findIndex][key + 'WorkSituationCount'] = resItem.workSituationCount;
+            count[key + 'WorkSituationCount'] += resItem.workSituationCount;
+          }
+          if (resItem.recruitCount > 0) {
+            workSituationCountDataList.value[findIndex][key + 'RecruitCount'] = resItem.recruitCount;
+            count[key + 'RecruitCount'] += resItem.recruitCount;
+          }
+        } else {
+          // 不存在,新增一条数据
+          const newData = {
+            regionCode: resItem.regionCode,
+            regionName: resItem.regionName,
+          }
+          workSituationCountKeyTemp.value.forEach((key: any) => {
+            newData[key] = 0;
+          })
+          if (resItem.workSituationCount > 0) {
+            newData[key + 'WorkSituationCount'] = resItem.workSituationCount;
+            count[key + 'WorkSituationCount'] += resItem.workSituationCount;
+          }
+          if (resItem.recruitCount > 0) {
+            newData[key + 'RecruitCount'] = resItem.recruitCount;
+            count[key + 'RecruitCount'] += resItem.recruitCount;
+          }
+          workSituationCountDataList.value.push(newData);
+        }
+      });
+      workSituationCountDataList.value.push(count);
+    }).finally(() => {
+      searchLoading.value = false;
+    })
+  }
+}
+
+onMounted(() => {
+  getCompanyModel();
+  onFinish();
+})
+</script>
+
+<style scoped>
+
+</style>

+ 2 - 2
vue/src/views/statistics/SiteStatistics.vue

@@ -136,8 +136,8 @@ const regionList = ref<Array<any>>([]);
 const siteList = ref();
 const searchType = ref("personTypeByJobUser");
 const searchLoading = ref(false);
-const personTypeInRegionKeyTemp = [];
-const personTypeInRegionTableColumns = ref([{
+const personTypeInRegionKeyTemp = new Array<any>([]);
+const personTypeInRegionTableColumns = ref<Array<any>>([{
   title: '人员类别', dataIndex: 'keyTypeName', key: 'keyTypeName', align: "center", width: 280
 },]);
 const personTypeInRegionList = ref<Array<any>>([])