|
|
|
|
@ -84,9 +84,17 @@
|
|
|
|
|
<h5 class="table-title">
|
|
|
|
|
<i class="el-icon-reading"></i> 课程分类明细统计
|
|
|
|
|
</h5>
|
|
|
|
|
<el-button type="success" @click="exportCourseData" class="btn-export">
|
|
|
|
|
<i class="el-icon-download"></i> 导出数据
|
|
|
|
|
</el-button>
|
|
|
|
|
<div class="table-header-right">
|
|
|
|
|
<el-button type="primary" @click="exportCoursePersonData" class="btn-export">
|
|
|
|
|
<i class="el-icon-download"></i> 导出人员明细
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button type="warning" @click="exportCourseOpenData" class="btn-export">
|
|
|
|
|
<i class="el-icon-download"></i> 导出开课明细
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button type="success" @click="exportCourseData" class="btn-export">
|
|
|
|
|
<i class="el-icon-download"></i> 导出数据
|
|
|
|
|
</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="detail-table">
|
|
|
|
|
<el-table :data="courseDetailData" :span-method="objectSpanMethod" :header-cell-style="headerCellStyle">
|
|
|
|
|
@ -128,9 +136,12 @@
|
|
|
|
|
import { index as courseTypeIndex } from '@/api/course/courseType.js'
|
|
|
|
|
import { courseChart } from '@/api/homeChart.js'
|
|
|
|
|
import * as XLSX from "xlsx";
|
|
|
|
|
import { download } from "@/utils/downloadRequest";
|
|
|
|
|
import formMixin from "@/mixin/formMixin.js";
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
name: 'Statistics',
|
|
|
|
|
mixins: [formMixin],
|
|
|
|
|
components: {},
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
@ -146,43 +157,37 @@ export default {
|
|
|
|
|
studentStats: [
|
|
|
|
|
{
|
|
|
|
|
icon: 'el-icon-user-solid',
|
|
|
|
|
value: '1,247',
|
|
|
|
|
value: '0',
|
|
|
|
|
label: '报名人数(未去重)',
|
|
|
|
|
cardClass: 'student-card-1'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
icon: 'el-icon-s-check',
|
|
|
|
|
value: '1,156',
|
|
|
|
|
value: '0',
|
|
|
|
|
label: '培养人数(未去重)',
|
|
|
|
|
cardClass: 'student-card-2'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
icon: 'el-icon-s-custom',
|
|
|
|
|
value: '892',
|
|
|
|
|
value: '0',
|
|
|
|
|
label: '培养人数(已去重)',
|
|
|
|
|
cardClass: 'student-card-3'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
icon: 'el-icon-date',
|
|
|
|
|
value: '56',
|
|
|
|
|
value: '0',
|
|
|
|
|
label: '开课场次',
|
|
|
|
|
cardClass: 'student-card-4'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
icon: 'el-icon-c-scale-to-original',
|
|
|
|
|
value: '89',
|
|
|
|
|
value: '0',
|
|
|
|
|
label: '开课天数',
|
|
|
|
|
cardClass: 'student-card-5'
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
courseDetailData: [],
|
|
|
|
|
regionData: [
|
|
|
|
|
{ region: '吴中区', totalPeople: 125, uniquePeople: 98 },
|
|
|
|
|
{ region: '相城区', totalPeople: 82, uniquePeople: 65 },
|
|
|
|
|
{ region: '昆山市', totalPeople: 74, uniquePeople: 58 },
|
|
|
|
|
{ region: '太仓市', totalPeople: 74, uniquePeople: 62 },
|
|
|
|
|
{ region: '姑苏区', totalPeople: 65, uniquePeople: 52 }
|
|
|
|
|
]
|
|
|
|
|
regionData: []
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
mounted() {
|
|
|
|
|
@ -367,6 +372,136 @@ export default {
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 导出人员明细数据
|
|
|
|
|
exportCoursePersonData() {
|
|
|
|
|
try {
|
|
|
|
|
// 获取选中的课程体系ID,以逗号分隔
|
|
|
|
|
const courseTypeIds = this.filterForm.selectedCourses.length > 0
|
|
|
|
|
? this.filterForm.selectedCourses.join(',')
|
|
|
|
|
: ''
|
|
|
|
|
|
|
|
|
|
// 格式化日期参数
|
|
|
|
|
const startDate = this.formatDate(this.filterForm.startDate)
|
|
|
|
|
const endDate = this.formatDate(this.filterForm.endDate)
|
|
|
|
|
|
|
|
|
|
// 构建导出字段映射
|
|
|
|
|
const exportFields = {
|
|
|
|
|
'course.type_detail.name': '课程体系',
|
|
|
|
|
'course.name': '课程名称',
|
|
|
|
|
'status_text': '审核状态',
|
|
|
|
|
'created_at': '报名时间'
|
|
|
|
|
// 'user.name': '姓名',
|
|
|
|
|
// 'user.sex': '性别',
|
|
|
|
|
// 'user.no': '学号',
|
|
|
|
|
// 'user.idcard': '身份证号',
|
|
|
|
|
// 'user.mobile': '联系方式',
|
|
|
|
|
// 'user.birthday': '出生年月',
|
|
|
|
|
// 'user.email': '邮箱',
|
|
|
|
|
// 'user.company_name': '公司名称',
|
|
|
|
|
// 'user.company_position': '职务',
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
this.selectFormList.map(item => {
|
|
|
|
|
if (item.prop === 'index') {
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
exportFields['user.'+item.field] = item.name
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 调用下载API
|
|
|
|
|
download(
|
|
|
|
|
'/api/admin/course-signs/index',
|
|
|
|
|
'get',
|
|
|
|
|
{
|
|
|
|
|
export_fields: exportFields,
|
|
|
|
|
is_export: 1,
|
|
|
|
|
page: 1,
|
|
|
|
|
page_size: 9999,
|
|
|
|
|
start_date: startDate,
|
|
|
|
|
end_date: endDate,
|
|
|
|
|
course_type_id: courseTypeIds,
|
|
|
|
|
clear: 1
|
|
|
|
|
},
|
|
|
|
|
this.generateFileName('人员明细')
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
this.$message.success('人员明细导出任务已开始,请稍后查看下载文件')
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('导出失败:', error)
|
|
|
|
|
this.$message.error('导出失败,请重试')
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// 导出开课明细数据
|
|
|
|
|
exportCourseOpenData() {
|
|
|
|
|
try {
|
|
|
|
|
// 获取选中的课程体系ID,以逗号分隔
|
|
|
|
|
const courseTypeIds = this.filterForm.selectedCourses.length > 0
|
|
|
|
|
? this.filterForm.selectedCourses.join(',')
|
|
|
|
|
: ''
|
|
|
|
|
|
|
|
|
|
// 格式化日期参数
|
|
|
|
|
const startDate = this.formatDate(this.filterForm.startDate)
|
|
|
|
|
const endDate = this.formatDate(this.filterForm.endDate)
|
|
|
|
|
|
|
|
|
|
// 构建导出字段映射
|
|
|
|
|
const exportFields = {
|
|
|
|
|
'type_detail.name': '课程体系',
|
|
|
|
|
'name': '课程名称',
|
|
|
|
|
'status_text': '发布状态',
|
|
|
|
|
'date_status': '课程状态',
|
|
|
|
|
'sign_date_status': '报名状态',
|
|
|
|
|
|
|
|
|
|
'is_virtual_text': '是否为虚拟课程',
|
|
|
|
|
'url_title': '资讯链接',
|
|
|
|
|
'year': '所属年份',
|
|
|
|
|
'start_date': '课程开始日期',
|
|
|
|
|
'end_date': '课程结束日期',
|
|
|
|
|
'total': '开课人数',
|
|
|
|
|
'sign_start_date': '报名开始日期',
|
|
|
|
|
'sign_end_date': '报名截止日期',
|
|
|
|
|
'address_detail': '签到地点',
|
|
|
|
|
|
|
|
|
|
'is_fee_text': '课程类型',
|
|
|
|
|
'is_arrange_text': '是否排课',
|
|
|
|
|
'show_txl_text': '是否显示通讯录',
|
|
|
|
|
'show_mobile_text': '是否显示联系方式',
|
|
|
|
|
'auto_schoolmate_text': '已审核学员是否自动进入校友库',
|
|
|
|
|
|
|
|
|
|
'course_signs_count':'目前报名人数',
|
|
|
|
|
'sign_wait_total':'待审核人数',
|
|
|
|
|
'sign_pass_total':'审核通过人数',
|
|
|
|
|
'sign_fault_total':'审核不通过人数',
|
|
|
|
|
'sign_prepare_total':'备选人数',
|
|
|
|
|
'sign_cancel_total':'已取消人数',
|
|
|
|
|
'sign_give_up_total':'主动放弃人数',
|
|
|
|
|
'sign_black_total':'黑名单人数',
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 调用下载API
|
|
|
|
|
download(
|
|
|
|
|
'/api/admin/courses/index',
|
|
|
|
|
'get',
|
|
|
|
|
{
|
|
|
|
|
export_fields: exportFields,
|
|
|
|
|
'show_relation[0]':'typeDetail',
|
|
|
|
|
is_export: 1,
|
|
|
|
|
page: 1,
|
|
|
|
|
page_size: 9999,
|
|
|
|
|
start_date: startDate,
|
|
|
|
|
end_date: endDate,
|
|
|
|
|
course_type_id: courseTypeIds
|
|
|
|
|
},
|
|
|
|
|
this.generateFileName('开课明细')
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
this.$message.success('开课明细导出任务已开始,请稍后查看下载文件')
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('导出失败:', error)
|
|
|
|
|
this.$message.error('导出失败,请重试')
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// 导出区域明细数据
|
|
|
|
|
exportRegionData() {
|
|
|
|
|
if (!this.regionData || this.regionData.length === 0) {
|
|
|
|
|
@ -420,6 +555,35 @@ export default {
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 生成导出文件名
|
|
|
|
|
generateFileName(type) {
|
|
|
|
|
// 获取选中的课程体系标签,以逗号分隔
|
|
|
|
|
let courseTypeLabels = ''
|
|
|
|
|
if (this.filterForm.selectedCourses.length > 0) {
|
|
|
|
|
const selectedCourseTypes = this.courseOptions.filter(option =>
|
|
|
|
|
this.filterForm.selectedCourses.includes(option.value)
|
|
|
|
|
)
|
|
|
|
|
courseTypeLabels = selectedCourseTypes.map(course => course.label).join('、')
|
|
|
|
|
} else {
|
|
|
|
|
courseTypeLabels = '全部课程体系'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取时间周期文本
|
|
|
|
|
let timeText = ''
|
|
|
|
|
if (this.filterForm.timeRange === 'all') {
|
|
|
|
|
timeText = '全周期'
|
|
|
|
|
} else {
|
|
|
|
|
// 非全周期显示具体日期范围
|
|
|
|
|
const startDate = this.formatDate(this.filterForm.startDate)
|
|
|
|
|
const endDate = this.formatDate(this.filterForm.endDate)
|
|
|
|
|
timeText = `${startDate}_${endDate}`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 生成文件名:课程体系名称 + 类型 + 时间周期 + 日期
|
|
|
|
|
const fileName = `${courseTypeLabels}${type}_${timeText}.xlsx`
|
|
|
|
|
return fileName
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 更新统计数据
|
|
|
|
|
updateStatisticsData(data) {
|
|
|
|
|
// 根据API返回的数据更新统计卡片
|
|
|
|
|
|