|
@@ -71,8 +71,8 @@
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
- <el-form-item label="" prop="dateType">
|
|
|
- <el-radio-group v-model="queryParams.dateType" @change="radioChange" class="!w-240px">
|
|
|
+ <el-form-item label="" prop="type">
|
|
|
+ <el-radio-group v-model="queryParams.type" @change="typeChange" class="!w-240px">
|
|
|
<el-radio-button label="最近七天" value="0" />
|
|
|
<el-radio-button label="上个月" value="1" />
|
|
|
<el-radio-button label="上季度" value="2" />
|
|
@@ -87,7 +87,7 @@
|
|
|
end-placeholder="结束日期"
|
|
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
|
|
class="!w-240px"
|
|
|
- @change="dateRangeChange"
|
|
|
+ @change="timeRangeChange"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
@@ -108,55 +108,35 @@
|
|
|
<!-- 数据对照 -->
|
|
|
<el-row :gutter="16" class="row">
|
|
|
<el-col :md="4" :sm="12" :xs="24" :loading="loading">
|
|
|
- <ComparisonCard
|
|
|
- tag="今日"
|
|
|
- title="浏览量"
|
|
|
- :value="4"
|
|
|
- />
|
|
|
+ <ComparisonCard title="职位浏览量" :value="pageViews.total" />
|
|
|
</el-col>
|
|
|
<el-col :md="4" :sm="12" :xs="24" :loading="loading">
|
|
|
- <ComparisonCard
|
|
|
- tag="今日"
|
|
|
- title="收到的简历"
|
|
|
- :value="4"
|
|
|
- />
|
|
|
+ <ComparisonCard title="收到的简历" :value="resumeReceived.total" />
|
|
|
</el-col>
|
|
|
<el-col :md="4" :sm="12" :xs="24" :loading="loading">
|
|
|
- <ComparisonCard
|
|
|
- tag="今日"
|
|
|
- title="已查看简历"
|
|
|
- :value="4"
|
|
|
- />
|
|
|
+ <ComparisonCard title="已查看简历" :value="resumeViewed.total" />
|
|
|
</el-col>
|
|
|
<el-col :md="4" :sm="12" :xs="24" :loading="loading">
|
|
|
- <ComparisonCard
|
|
|
- tag="今日"
|
|
|
- title="已邀面试"
|
|
|
- :value="4"
|
|
|
- />
|
|
|
+ <ComparisonCard title="已邀面试" :value="invitedInterviews.total" />
|
|
|
</el-col>
|
|
|
<el-col :md="4" :sm="12" :xs="24" :loading="loading">
|
|
|
- <ComparisonCard
|
|
|
- tag="今日"
|
|
|
- title="面试完成"
|
|
|
- :value="4"
|
|
|
- />
|
|
|
+ <ComparisonCard title="面试完成" :value="invitedCompleted.total" />
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
<el-row :gutter="16" class="row">
|
|
|
<el-col :md="12">
|
|
|
- <GenderDistribution title="性别分布" />
|
|
|
+ <genderDistribution :data="genderDistributionData" title="性别分布" />
|
|
|
</el-col>
|
|
|
<el-col :md="12">
|
|
|
- <AgeDistribution title="年龄分布" />
|
|
|
+ <ageDistribution :data="ageDistributionData" title="年龄分布" />
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
<el-row :gutter="16" class="row">
|
|
|
<el-col :md="12">
|
|
|
- <WorkExperience title="工作年限分布" />
|
|
|
+ <workExperience :data="workExperienceData" title="工作年限分布" />
|
|
|
</el-col>
|
|
|
<el-col :md="12">
|
|
|
- <Education title="学历分布" />
|
|
|
+ <education :data="educationData" title="学历分布" />
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
</div>
|
|
@@ -165,10 +145,11 @@
|
|
|
|
|
|
<script setup>
|
|
|
import ComparisonCard from './components/ComparisonCard.vue'
|
|
|
-import GenderDistribution from './components/GenderDistribution.vue'
|
|
|
-import AgeDistribution from './components/AgeDistribution.vue'
|
|
|
-import WorkExperience from './components/WorkExperience.vue'
|
|
|
-import Education from './components/Education.vue'
|
|
|
+import genderDistribution from './components/GenderDistribution.vue'
|
|
|
+import ageDistribution from './components/AgeDistribution.vue'
|
|
|
+import workExperience from './components/WorkExperience.vue'
|
|
|
+import education from './components/Education.vue'
|
|
|
+import { statisticAnalysisApi } from '@/api/menduner/system/analysis/statisticAnalysis'
|
|
|
defineOptions({name: 'StatisticAnalysis'})
|
|
|
|
|
|
const loading = ref(true) // 加载中
|
|
@@ -179,11 +160,14 @@ onMounted(async () => {
|
|
|
loading.value = false
|
|
|
})
|
|
|
|
|
|
-
|
|
|
+// const pageParams = {
|
|
|
+// pageNo: 1,
|
|
|
+// pageSize: 10,
|
|
|
+// }
|
|
|
const queryParams = reactive({
|
|
|
- // pageNo: 1,
|
|
|
- // pageSize: 10,
|
|
|
- dateType: '0',
|
|
|
+ pageNo: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ type: '0',
|
|
|
enterpriseId: undefined,
|
|
|
deptId: undefined,
|
|
|
userId: undefined,
|
|
@@ -198,26 +182,144 @@ const resetQuery = () => {
|
|
|
handleQuery()
|
|
|
}
|
|
|
|
|
|
-/** 搜索按钮操作 */
|
|
|
-const handleQuery = () => {
|
|
|
- // queryParams.pageNo = 1
|
|
|
- // getList()
|
|
|
-}
|
|
|
-const radioChange = (value) => {
|
|
|
+const typeChange = (value) => { //
|
|
|
if (value) {
|
|
|
queryParams.dateRange = []
|
|
|
handleQuery()
|
|
|
}
|
|
|
}
|
|
|
-const dateRangeChange = (value) => {
|
|
|
- if (value?.length) {
|
|
|
- queryParams.dateType = undefined
|
|
|
- } else {
|
|
|
- queryParams.dateType = '0'
|
|
|
- }
|
|
|
+const timeRangeChange = (value) => {
|
|
|
+ if (value?.length) queryParams.type = '99' // 自定义
|
|
|
+ else queryParams.type = '0'
|
|
|
handleQuery()
|
|
|
}
|
|
|
|
|
|
+// 职位浏览量
|
|
|
+const pageViews = reactive({ list: [], total: 0 })
|
|
|
+const getPageViewsList = async () => {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisJobBrowseNumPage(queryParams)
|
|
|
+ pageViews.list = data.list
|
|
|
+ pageViews.total = data.total
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 收到的简历
|
|
|
+const resumeReceived = reactive({ list: [], total: 0 })
|
|
|
+const getResumeReceivedList = async () => {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisJobCvNewPage(queryParams)
|
|
|
+ resumeReceived.list = data.list
|
|
|
+ resumeReceived.total = data.total
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 已查看简历
|
|
|
+const resumeViewed = reactive({ list: [], total: 0 })
|
|
|
+const getResumeViewedList = async () => {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisJobCvLookPage(queryParams)
|
|
|
+ resumeViewed.list = data.list
|
|
|
+ resumeViewed.total = data.total
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 已邀面试
|
|
|
+const invitedInterviews = reactive({ list: [], total: 0 })
|
|
|
+const getInvitedInterviewsList = async () => {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisInterviewWaitPage(queryParams)
|
|
|
+ invitedInterviews.list = data.list
|
|
|
+ invitedInterviews.total = data.total
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 面试完成
|
|
|
+const invitedCompleted = reactive({ list: [], total: 0 })
|
|
|
+const getInvitedCompletedList = async () => {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisInterviewCompletePage(queryParams)
|
|
|
+ invitedCompleted.list = data.list
|
|
|
+ invitedCompleted.total = data.total
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 性别分布
|
|
|
+const genderDistributionData = ref(null)
|
|
|
+const getAnalysisJobCvSexCount = async () => {
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisJobCvSexCount(queryParams)
|
|
|
+ if (data) genderDistributionData.value = data
|
|
|
+ console.log('性别分布', data)
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+}
|
|
|
+// 年龄分布
|
|
|
+const ageDistributionData = ref(null)
|
|
|
+const getAnalysisJobCvAgeCount = async () => {
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisJobCvAgeCount(queryParams)
|
|
|
+ if (data) ageDistributionData.value = data
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+}
|
|
|
+// 工作年限分布
|
|
|
+const workExperienceData = ref(null)
|
|
|
+const getAnalysisJobCvExpCount = async () => {
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisJobCvExpCount(queryParams)
|
|
|
+ if (data) workExperienceData.value = data
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+}
|
|
|
+// 学历分布
|
|
|
+const educationData = ref(null)
|
|
|
+const getAnalysisJobCvEduCount = async () => {
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisJobCvEduCount(queryParams)
|
|
|
+ if (data) educationData.value = data
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/** 搜索按钮操作 */
|
|
|
+let customTimeObj
|
|
|
+const handleQuery = () => {
|
|
|
+ customTimeObj = queryParams.type === '99' && queryParams.dateRange?.length === 2 ? customTimeObj = { 'time[0]': queryParams.dateRange.date[0] + ' 00:00:00', 'time[1]': queryParams.dateRange.date[1] + ' 23:59:59' } : {}
|
|
|
+ queryParams.value = { ...queryParams, ...customTimeObj }
|
|
|
+ queryParams.pageNo = 1
|
|
|
+ getPageViewsList()
|
|
|
+ getResumeReceivedList()
|
|
|
+ getResumeViewedList()
|
|
|
+ getInvitedInterviewsList()
|
|
|
+ getInvitedCompletedList()
|
|
|
+ getAnalysisJobCvSexCount()
|
|
|
+ getAnalysisJobCvAgeCount()
|
|
|
+ getAnalysisJobCvExpCount()
|
|
|
+ getAnalysisJobCvEduCount()
|
|
|
+}
|
|
|
+handleQuery()
|
|
|
+
|
|
|
const enterpriseOption = [
|
|
|
{ label: '企业 1', value: '1' },
|
|
|
{ label: '企业 2', value: '2' },
|