|
@@ -20,8 +20,8 @@
|
|
|
<el-option
|
|
|
v-for="dict in enterpriseOption"
|
|
|
:key="dict.value"
|
|
|
- :label="dict.label"
|
|
|
- :value="dict.value"
|
|
|
+ :label="dict.name"
|
|
|
+ :value="dict.id"
|
|
|
/>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
@@ -50,8 +50,8 @@
|
|
|
<el-option
|
|
|
v-for="dict in userOption"
|
|
|
:key="dict.value"
|
|
|
- :label="dict.label"
|
|
|
- :value="dict.value"
|
|
|
+ :label="dict.name"
|
|
|
+ :value="dict.userId"
|
|
|
/>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
@@ -65,8 +65,8 @@
|
|
|
<el-option
|
|
|
v-for="dict in jobOption"
|
|
|
:key="dict.value"
|
|
|
- :label="dict.label"
|
|
|
- :value="dict.value"
|
|
|
+ :label="dict.name"
|
|
|
+ :value="dict.positionId"
|
|
|
/>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
@@ -78,9 +78,9 @@
|
|
|
<el-radio-button label="上季度" value="2" />
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="" prop="dateRange">
|
|
|
+ <el-form-item label="" prop="time">
|
|
|
<el-date-picker
|
|
|
- v-model="queryParams.dateRange"
|
|
|
+ v-model="queryParams.time"
|
|
|
value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
type="daterange"
|
|
|
start-placeholder="开始日期"
|
|
@@ -168,6 +168,7 @@ import { statisticAnalysisApi } from '@/api/menduner/system/analysis/statisticAn
|
|
|
defineOptions({name: 'StatisticAnalysis'})
|
|
|
|
|
|
const loading = ref(true) // 加载中
|
|
|
+const dialogLoading = ref(false)
|
|
|
|
|
|
/** 初始化 **/
|
|
|
onMounted(async () => {
|
|
@@ -176,14 +177,12 @@ onMounted(async () => {
|
|
|
|
|
|
const page = reactive({ pageNo: 1, pageSize: 10 })
|
|
|
const queryParams = reactive({
|
|
|
- pageNo: 1,
|
|
|
- pageSize: 10,
|
|
|
type: '0',
|
|
|
enterpriseId: undefined,
|
|
|
deptId: undefined,
|
|
|
userId: undefined,
|
|
|
jobId: undefined,
|
|
|
- dateRange: [],
|
|
|
+ time: [],
|
|
|
})
|
|
|
|
|
|
const queryFormRef = ref() // 搜索的表单
|
|
@@ -195,23 +194,22 @@ const resetQuery = () => {
|
|
|
|
|
|
const typeChange = (value) => { //
|
|
|
if (value) {
|
|
|
- queryParams.dateRange = []
|
|
|
- handleQuery()
|
|
|
+ queryParams.time = []
|
|
|
}
|
|
|
}
|
|
|
const timeRangeChange = (value) => {
|
|
|
if (value?.length) queryParams.type = '99' // 自定义
|
|
|
else queryParams.type = '0'
|
|
|
- handleQuery()
|
|
|
}
|
|
|
|
|
|
const apiArr = reactive({
|
|
|
// 统计
|
|
|
- pageViews: statisticAnalysisApi.getAnalysisJobBrowseNumPage,
|
|
|
- resumeReceived: statisticAnalysisApi.getAnalysisJobCvNewPage,
|
|
|
- resumeViewed: statisticAnalysisApi.getAnalysisJobCvLookPage,
|
|
|
- invitedInterviews: statisticAnalysisApi.getAnalysisInterviewWaitPage,
|
|
|
- invitedCompleted: statisticAnalysisApi.getAnalysisInterviewCompletePage,
|
|
|
+ pageViewsTotal: statisticAnalysisApi.getAnalysisJobBrowseNum, // 职位浏览量-总数据
|
|
|
+ pageViews: statisticAnalysisApi.getAnalysisJobBrowseNumPage, // 职位浏览量-钻取
|
|
|
+ resumeReceived: statisticAnalysisApi.getAnalysisJobCvNewPage, // 钻取
|
|
|
+ resumeViewed: statisticAnalysisApi.getAnalysisJobCvLookPage, // 钻取
|
|
|
+ invitedInterviews: statisticAnalysisApi.getAnalysisInterviewWaitPage, // 钻取
|
|
|
+ invitedCompleted: statisticAnalysisApi.getAnalysisInterviewCompletePage, // 钻取
|
|
|
// 分布
|
|
|
sexDistributionData: statisticAnalysisApi.getAnalysisJobCvSexCount,
|
|
|
ageDistributionData: statisticAnalysisApi.getAnalysisJobCvAgeCount,
|
|
@@ -245,13 +243,27 @@ const distribution = reactive({
|
|
|
})
|
|
|
|
|
|
// 统计
|
|
|
-const getList = async (typeName, deal = '') => {
|
|
|
+const tableData = ref([])
|
|
|
+const total = ref(0)
|
|
|
+const getList = async (typeName, details = '') => {
|
|
|
loading.value = true
|
|
|
try {
|
|
|
- const data = await apiArr[typeName]({ ...queryParams, ...customTimeObj })
|
|
|
- tableData.value = data.list || []
|
|
|
- statistic[typeName] = data.total
|
|
|
- if (deal) dealTableData()
|
|
|
+ let data
|
|
|
+ if (!details && typeName === 'pageViews') {
|
|
|
+ // 职位浏览量-总数据
|
|
|
+ const res = await apiArr.pageViewsTotal(queryParams)
|
|
|
+ data ={ total: res || 0 }
|
|
|
+ } else {
|
|
|
+ // 使用钻取接口
|
|
|
+ data = await apiArr[typeName]({ ...queryParams, ...page })
|
|
|
+ }
|
|
|
+ if (details) {
|
|
|
+ tableData.value = data.list || []
|
|
|
+ total.value = data.total || 0
|
|
|
+ dealTableData()
|
|
|
+ } else {
|
|
|
+ statistic[typeName] = data.total || data || 0
|
|
|
+ }
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
dialogLoading.value = false
|
|
@@ -269,64 +281,11 @@ const getText = (value, arr, itemText = 'name', itemValue = 'id') => { // 一维
|
|
|
return item[itemText]
|
|
|
}
|
|
|
|
|
|
-const dealTableData = async () => {
|
|
|
- if (currentItem.value.name === 'pageViews') {
|
|
|
- const areaList = await getDictOptions('areaList')
|
|
|
- tableData.value = tableData.value.map(item => {
|
|
|
- item.salaryDisplay = `${item.payFrom}-${item.payTo}/${getDictLabel(DICT_TYPE.MENDUNER_PAY_UNIT, item.payUnit)}`
|
|
|
- item.areaName = getText(item.areaId, areaList)
|
|
|
- item.expName = getDictLabel(DICT_TYPE.MENDUNER_EXP_TYPE, item.expType)
|
|
|
- item.eduName = getDictLabel(DICT_TYPE.MENDUNER_EDUCATION_TYPE, item.eduType)
|
|
|
- return item
|
|
|
- })
|
|
|
- }
|
|
|
- if (currentItem.value.name === 'resumeReceived') {
|
|
|
- const areaList = await getDictOptions('areaList')
|
|
|
- tableData.value = tableData.value.map(item => {
|
|
|
- item.areaName = getText(item.job.areaId, areaList)
|
|
|
- item.salaryDisplay = `${item.job.payFrom}-${item.job.payTo}/${getDictLabel(DICT_TYPE.MENDUNER_PAY_UNIT, item.job.payUnit)}`
|
|
|
- item.jobStatus = getDictLabel(DICT_TYPE.MENDUNER_JOB_STATUS, item.person.jobStatus)
|
|
|
- item.expName = getDictLabel(DICT_TYPE.MENDUNER_EXP_TYPE, item.job.expType)
|
|
|
- item.eduName = getDictLabel(DICT_TYPE.MENDUNER_EDUCATION_TYPE, item.job.eduType)
|
|
|
- item.personName = item.person.name
|
|
|
- return item
|
|
|
- })
|
|
|
- }
|
|
|
- if (currentItem.value.name === 'resumeViewed') {
|
|
|
- tableData.value = tableData.value.map(item => {
|
|
|
- item.personName = item.person.name
|
|
|
- item.address = item.job.address
|
|
|
- item.typeName = item.type === 0 ? '平台投递': '赏金投递'
|
|
|
- item.recommendPersonName = item.recommendPerson?.name || ''
|
|
|
- return item
|
|
|
- })
|
|
|
- }
|
|
|
- if (currentItem.value.name === 'invitedInterviews') {
|
|
|
- tableData.value = tableData.value.map(item => {
|
|
|
- item.personName = item.person.name
|
|
|
- item.jobName = item.job.name
|
|
|
- item.typeName = item.type === 0 ? '线上面试': '线下面试'
|
|
|
- item.timeName = timesTampChange(item.time, 'Y-M-D h:m')
|
|
|
- item.addressName = item.job.address
|
|
|
- return item
|
|
|
- })
|
|
|
- }
|
|
|
- if (currentItem.value.name === 'invitedCompleted') {
|
|
|
- tableData.value = tableData.value.map(item => {
|
|
|
- item.personName = item.person.name
|
|
|
- item.jobName = item.job.name
|
|
|
- item.typeName = item.type === 0 ? '线上面试': '线下面试'
|
|
|
- item.timeName = timesTampChange(item.time, 'Y-M-D h:m')
|
|
|
- item.addressName = item.job.address
|
|
|
- return item
|
|
|
- })
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
// 分布
|
|
|
const getDistributionCount = async (typeName) => {
|
|
|
try {
|
|
|
- const data = await apiArr[typeName]({ ...queryParams, ...customTimeObj })
|
|
|
+ const data = await apiArr[typeName](queryParams)
|
|
|
distribution[typeName] = data || {}
|
|
|
} catch (error) {
|
|
|
console.log(error)
|
|
@@ -334,9 +293,7 @@ const getDistributionCount = async (typeName) => {
|
|
|
}
|
|
|
|
|
|
/** 搜索按钮操作 */
|
|
|
-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' } : {}
|
|
|
if (Object.keys(statistic).length) {
|
|
|
Object.keys(statistic).forEach(name => {
|
|
|
getList(name)
|
|
@@ -352,29 +309,30 @@ const handleQuery = () => {
|
|
|
handleQuery()
|
|
|
|
|
|
const showDialog = ref(false)
|
|
|
-const dialogLoading = ref(false)
|
|
|
-const tableData = ref([])
|
|
|
const currentItem = ref({})
|
|
|
// 打开弹窗
|
|
|
const openDialog = (item) => {
|
|
|
dialogLoading.value = true
|
|
|
- queryParams.pageNo = 1
|
|
|
currentItem.value = item
|
|
|
+ page.pageNo = 1
|
|
|
tableData.value = []
|
|
|
getList(item.name, '钻取')
|
|
|
showDialog.value = true
|
|
|
}
|
|
|
const closeDialog = () => {
|
|
|
}
|
|
|
+const paginationChange = () => {
|
|
|
+ getList(currentItem.value.name, '钻取')
|
|
|
+}
|
|
|
|
|
|
const tableHeaders = {
|
|
|
pageViews: [
|
|
|
+ { name: '浏览量', prop: 'num' },
|
|
|
{ name: '招聘职位', prop: 'name' },
|
|
|
{ name: '薪酬', prop: 'salaryDisplay' },
|
|
|
{ name: '工作地区', prop: 'areaName' },
|
|
|
{ name: '工作经验', prop: 'expName' },
|
|
|
{ name: '学历要求', prop: 'eduName' },
|
|
|
- { name: '浏览量', prop: 'num' }
|
|
|
],
|
|
|
resumeReceived: [
|
|
|
{ name: '投递人', prop: 'personName' },
|
|
@@ -408,22 +366,101 @@ const tableHeaders = {
|
|
|
],
|
|
|
}
|
|
|
|
|
|
-const enterpriseOption = [
|
|
|
- { label: '企业 1', value: '1' },
|
|
|
- { label: '企业 2', value: '2' },
|
|
|
-]
|
|
|
-const deptOption = [
|
|
|
- { label: '部门 1', value: '1' },
|
|
|
- { label: '部门 2', value: '2' },
|
|
|
-]
|
|
|
-const userOption = [
|
|
|
- { label: '用户 1', value: '1' },
|
|
|
- { label: '用户 2', value: '2' },
|
|
|
-]
|
|
|
-const jobOption = [
|
|
|
- { label: '职位 1', value: '1' },
|
|
|
- { label: '职位 2', value: '2' },
|
|
|
-]
|
|
|
+const dealTableData = async () => {
|
|
|
+ if (currentItem.value.name === 'pageViews') {
|
|
|
+ const areaList = await getDictOptions('areaList')
|
|
|
+ tableData.value = tableData.value.map(item => {
|
|
|
+ item.salaryDisplay = `${item.payFrom}-${item.payTo}/${getDictLabel(DICT_TYPE.MENDUNER_PAY_UNIT, item.payUnit)}`
|
|
|
+ item.areaName = getText(item.areaId, areaList)
|
|
|
+ item.expName = getDictLabel(DICT_TYPE.MENDUNER_EXP_TYPE, item.expType)
|
|
|
+ item.eduName = getDictLabel(DICT_TYPE.MENDUNER_EDUCATION_TYPE, item.eduType)
|
|
|
+ return item
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (currentItem.value.name === 'resumeReceived') {
|
|
|
+ const areaList = await getDictOptions('areaList')
|
|
|
+ tableData.value = tableData.value.map(item => {
|
|
|
+ item.areaName = getText(item.job.areaId, areaList)
|
|
|
+ item.salaryDisplay = `${item.job.payFrom}-${item.job.payTo}/${getDictLabel(DICT_TYPE.MENDUNER_PAY_UNIT, item.job.payUnit)}`
|
|
|
+ item.jobStatus = getDictLabel(DICT_TYPE.MENDUNER_JOB_STATUS, item.person.jobStatus)
|
|
|
+ item.expName = getDictLabel(DICT_TYPE.MENDUNER_EXP_TYPE, item.job.expType)
|
|
|
+ item.eduName = getDictLabel(DICT_TYPE.MENDUNER_EDUCATION_TYPE, item.job.eduType)
|
|
|
+ item.personName = item.person.name
|
|
|
+ return item
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (currentItem.value.name === 'resumeViewed') {
|
|
|
+ tableData.value = tableData.value.map(item => {
|
|
|
+ item.personName = item.person.name
|
|
|
+ item.address = item.job.address
|
|
|
+ item.typeName = item.type === 0 ? '平台投递': '赏金投递'
|
|
|
+ item.recommendPersonName = item.recommendPerson?.name || ''
|
|
|
+ return item
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (currentItem.value.name === 'invitedInterviews') {
|
|
|
+ tableData.value = tableData.value.map(item => {
|
|
|
+ item.personName = item.person.name
|
|
|
+ item.jobName = item.job.name
|
|
|
+ item.typeName = item.type === 0 ? '线上面试': '线下面试'
|
|
|
+ item.timeName = timesTampChange(item.time, 'Y-M-D h:m')
|
|
|
+ item.addressName = item.job.address
|
|
|
+ return item
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (currentItem.value.name === 'invitedCompleted') {
|
|
|
+ tableData.value = tableData.value.map(item => {
|
|
|
+ item.personName = item.person.name
|
|
|
+ item.jobName = item.job.name
|
|
|
+ item.typeName = item.type === 0 ? '线上面试': '线下面试'
|
|
|
+ item.timeName = timesTampChange(item.time, 'Y-M-D h:m')
|
|
|
+ item.addressName = item.job.address
|
|
|
+ return item
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 企业
|
|
|
+const enterpriseOption = ref([])
|
|
|
+const getEnterpriseOption = async () => {
|
|
|
+ try {
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisEnterpriseSimpleList()
|
|
|
+ enterpriseOption.value = data || []
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+}
|
|
|
+getEnterpriseOption()
|
|
|
+
|
|
|
+// 部门
|
|
|
+const deptOption = ref([])
|
|
|
+
|
|
|
+// 用户
|
|
|
+const userOption = ref([])
|
|
|
+const getUserOption = async () => {
|
|
|
+ try {
|
|
|
+ // const params = {}
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisEnterpriseUserList()
|
|
|
+ userOption.value = data || []
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+}
|
|
|
+getUserOption()
|
|
|
+
|
|
|
+// 用户
|
|
|
+const jobOption = ref([])
|
|
|
+const getJobOption = async () => {
|
|
|
+ try {
|
|
|
+ // const params = {}
|
|
|
+ const data = await statisticAnalysisApi.getAnalysisJobAdvertisedList()
|
|
|
+ jobOption.value = data || []
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+}
|
|
|
+getJobOption()
|
|
|
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|