修复培训:对齐旧统计分析能力与V2接口契约

This commit is contained in:
wangzhibiao committed 2026-09-14 23:56:55 +08:00
1 parent 42f6822964
commit bfccc46f73
38 files changed
+1080 -2820

No files matched your search

-28
View File
@@ -1,6 +1,5 @@
import request from '@/utils/request'
// 查询学生签到列表
export function listCheckin(query) {
return request({
url: '/train/checkin/list',
@@ -9,36 +8,9 @@ export function listCheckin(query) {
})
}
// 查询学生签到详细
export function getCheckin(checkinId) {
return request({
url: '/train/checkin/' + checkinId,
method: 'get'
})
}
// 新增学生签到
export function addCheckin(data) {
return request({
url: '/train/checkin',
method: 'post',
data: data
})
}
// 修改学生签到
export function updateCheckin(data) {
return request({
url: '/train/checkin',
method: 'put',
data: data
})
}
// 删除学生签到
export function delCheckin(checkinId) {
return request({
url: '/train/checkin/' + checkinId,
method: 'delete'
})
}
-28
View File
@@ -1,6 +1,5 @@
import request from '@/utils/request'
// 查询学习时长统计列表
export function listDuration(query) {
return request({
url: '/train/duration/list',
@@ -9,36 +8,9 @@ export function listDuration(query) {
})
}
// 查询学习时长统计详细
export function getDuration(durId) {
return request({
url: '/train/duration/' + durId,
method: 'get'
})
}
// 新增学习时长统计
export function addDuration(data) {
return request({
url: '/train/duration',
method: 'post',
data: data
})
}
// 修改学习时长统计
export function updateDuration(data) {
return request({
url: '/train/duration',
method: 'put',
data: data
})
}
// 删除学习时长统计
export function delDuration(durId) {
return request({
url: '/train/duration/' + durId,
method: 'delete'
})
}
-28
View File
@@ -1,6 +1,5 @@
import request from '@/utils/request'
// 查询学员画像列表
export function listPortrait(query) {
return request({
url: '/train/portrait/list',
@@ -9,36 +8,9 @@ export function listPortrait(query) {
})
}
// 查询学员画像详细
export function getPortrait(portraitId) {
return request({
url: '/train/portrait/' + portraitId,
method: 'get'
})
}
// 新增学员画像
export function addPortrait(data) {
return request({
url: '/train/portrait',
method: 'post',
data: data
})
}
// 修改学员画像
export function updatePortrait(data) {
return request({
url: '/train/portrait',
method: 'put',
data: data
})
}
// 删除学员画像
export function delPortrait(portraitId) {
return request({
url: '/train/portrait/' + portraitId,
method: 'delete'
})
}
-28
View File
@@ -1,6 +1,5 @@
import request from '@/utils/request'
// 查询开班报到列表
export function listReport(query) {
return request({
url: '/train/report/list',
@@ -9,36 +8,9 @@ export function listReport(query) {
})
}
// 查询开班报到详细
export function getReport(reportId) {
return request({
url: '/train/report/' + reportId,
method: 'get'
})
}
// 新增开班报到
export function addReport(data) {
return request({
url: '/train/report',
method: 'post',
data: data
})
}
// 修改开班报到
export function updateReport(data) {
return request({
url: '/train/report',
method: 'put',
data: data
})
}
// 删除开班报到
export function delReport(reportId) {
return request({
url: '/train/report/' + reportId,
method: 'delete'
})
}
+50 -324
View File
@@ -1,381 +1,107 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="开班计划ID" prop="planId">
<el-input
v-model="queryParams.planId"
placeholder="请输入开班计划ID"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true">
<el-form-item label="培训计划" prop="planName">
<el-input v-model="queryParams.planName" placeholder="请输入计划名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="课程ID" prop="cId">
<el-input
v-model="queryParams.cId"
placeholder="请输入课程ID"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="学员" prop="studentName">
<el-input v-model="queryParams.studentName" placeholder="请输入学员姓名" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="学员学号" prop="studentId">
<el-input
v-model="queryParams.studentId"
placeholder="请输入学员学号"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="课程" prop="courseName">
<el-input v-model="queryParams.courseName" placeholder="请输入课程名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="签到电子班牌设备ID train_electronic_board.board_id" prop="boardId">
<el-input
v-model="queryParams.boardId"
placeholder="请输入签到电子班牌设备ID train_electronic_board.board_id"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="1 人脸签到 2 二维码签到 3 后台手动补签" prop="checkinWay">
<el-input
v-model="queryParams.checkinWay"
placeholder="请输入1 人脸签到 2 二维码签到 3 后台手动补签"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="签到时间" prop="checkinTime">
<el-date-picker clearable
v-model="queryParams.checkinTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择签到时间">
</el-date-picker>
</el-form-item>
<el-form-item label="本节课程上课时间" prop="lessonStartTime">
<el-date-picker clearable
v-model="queryParams.lessonStartTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择本节课程上课时间">
</el-date-picker>
</el-form-item>
<el-form-item label="本节课程下课时间" prop="lessonEndTime">
<el-date-picker clearable
v-model="queryParams.lessonEndTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择本节课程下课时间">
</el-date-picker>
<el-form-item label="考勤状态" prop="attendanceStatus">
<el-select v-model="queryParams.attendanceStatus" placeholder="全部" clearable>
<el-option v-for="item in attendanceStatuses" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['train:checkin:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['train:checkin:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['train:checkin:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-hasPermi="['train:attendance:export']"
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['train:checkin:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" />
</el-row>
<el-table v-loading="loading" :data="checkinList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="签到记录ID" align="center" prop="checkinId" />
<el-table-column label="开班计划ID" align="center" prop="planId" />
<el-table-column label="课程ID" align="center" prop="cId" />
<el-table-column label="学员学号" align="center" prop="studentId" />
<el-table-column label="签到电子班牌设备ID train_electronic_board.board_id" align="center" prop="boardId" />
<el-table-column label="1 人脸签到 2 二维码签到 3 后台手动补签" align="center" prop="checkinWay" />
<el-table-column label="签到时间" align="center" prop="checkinTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.checkinTime, '{y}-{m}-{d}') }}</span>
</template>
<el-alert title="考勤由课次签到、签退或留痕的人工修正流程生成,本页面仅供查询。" type="info" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="rows">
<el-table-column label="培训计划" prop="planName" min-width="150" show-overflow-tooltip />
<el-table-column label="课程" prop="courseName" min-width="140" show-overflow-tooltip />
<el-table-column label="学员" prop="studentName" min-width="100" />
<el-table-column label="班牌" min-width="130" show-overflow-tooltip>
<template slot-scope="scope">{{ scope.row.boardName || scope.row.boardSn || "-" }}</template>
</el-table-column>
<el-table-column label="1 正常签到 2 迟到 3 早退 4 缺勤" align="center" prop="checkinStatus" />
<el-table-column label="本节课程上课时间" align="center" prop="lessonStartTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.lessonStartTime, '{y}-{m}-{d}') }}</span>
</template>
<el-table-column label="签到方式" align="center" width="100">
<template slot-scope="scope">{{ labelOf(checkinWays, scope.row.checkinWay) }}</template>
</el-table-column>
<el-table-column label="本节课程下课时间" align="center" prop="lessonEndTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.lessonEndTime, '{y}-{m}-{d}') }}</span>
</template>
<el-table-column label="考勤状态" align="center" width="100">
<template slot-scope="scope">{{ labelOf(attendanceStatuses, scope.row.attendanceStatus) }}</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['train:checkin:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['train:checkin:remove']"
>删除</el-button>
</template>
<el-table-column label="签到时间" prop="signInTime" width="170" />
<el-table-column label="签退时间" prop="signOutTime" width="170" />
<el-table-column label="人工修正" align="center" width="90">
<template slot-scope="scope">{{ scope.row.manualFlag === 1 ? "是" : "否" }}</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改学生签到对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="开班计划ID" prop="planId">
<el-input v-model="form.planId" placeholder="请输入开班计划ID" />
</el-form-item>
<el-form-item label="课程ID" prop="cId">
<el-input v-model="form.cId" placeholder="请输入课程ID" />
</el-form-item>
<el-form-item label="学员学号" prop="studentId">
<el-input v-model="form.studentId" placeholder="请输入学员学号" />
</el-form-item>
<el-form-item label="签到电子班牌设备ID train_electronic_board.board_id" prop="boardId">
<el-input v-model="form.boardId" placeholder="请输入签到电子班牌设备ID train_electronic_board.board_id" />
</el-form-item>
<el-form-item label="1 人脸签到 2 二维码签到 3 后台手动补签" prop="checkinWay">
<el-input v-model="form.checkinWay" placeholder="请输入1 人脸签到 2 二维码签到 3 后台手动补签" />
</el-form-item>
<el-form-item label="签到时间" prop="checkinTime">
<el-date-picker clearable
v-model="form.checkinTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择签到时间">
</el-date-picker>
</el-form-item>
<el-form-item label="本节课程上课时间" prop="lessonStartTime">
<el-date-picker clearable
v-model="form.lessonStartTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择本节课程上课时间">
</el-date-picker>
</el-form-item>
<el-form-item label="本节课程下课时间" prop="lessonEndTime">
<el-date-picker clearable
v-model="form.lessonEndTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择本节课程下课时间">
</el-date-picker>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listCheckin, getCheckin, delCheckin, addCheckin, updateCheckin } from "@/api/train/checkin"
import { listCheckin } from '@/api/train/checkin'
export default {
name: "Checkin",
name: 'Checkin',
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 学生签到表格数据
checkinList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
planId: null,
cId: null,
studentId: null,
boardId: null,
checkinWay: null,
checkinTime: null,
checkinStatus: null,
lessonStartTime: null,
lessonEndTime: null
},
// 表单参数
form: {},
// 表单校验
rules: {
planId: [
{ required: true, message: "开班计划ID不能为空", trigger: "blur" }
],
cId: [
{ required: true, message: "课程ID不能为空", trigger: "blur" }
],
studentId: [
{ required: true, message: "学员学号不能为空", trigger: "blur" }
],
}
rows: [],
checkinWays: [
{ value: 1, label: '人脸' }, { value: 2, label: '刷卡' },
{ value: 3, label: '扫码' }, { value: 4, label: '教师代签' }
],
attendanceStatuses: [
{ value: 0, label: '缺勤' }, { value: 1, label: '正常' },
{ value: 2, label: '迟到' }, { value: 3, label: '早退' }, { value: 4, label: '请假' }
],
queryParams: { pageNum: 1, pageSize: 10, planName: null, studentName: null, courseName: null, attendanceStatus: null }
}
},
created() {
this.getList()
},
created() { this.getList() },
methods: {
/** 查询学生签到列表 */
getList() {
this.loading = true
listCheckin(this.queryParams).then(response => {
this.checkinList = response.rows
this.rows = response.rows
this.total = response.total
this.loading = false
})
}).finally(() => { this.loading = false })
},
// 取消按钮
cancel() {
this.open = false
this.reset()
labelOf(options, value) {
const match = options.find(item => item.value === value)
return match ? match.label : '-'
},
// 表单重置
reset() {
this.form = {
checkinId: null,
planId: null,
cId: null,
studentId: null,
boardId: null,
checkinWay: null,
checkinTime: null,
checkinStatus: null,
lessonStartTime: null,
lessonEndTime: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.checkinId)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加学生签到"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const checkinId = row.checkinId || this.ids
getCheckin(checkinId).then(response => {
this.form = response.data
this.open = true
this.title = "修改学生签到"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.checkinId != null) {
updateCheckin(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addCheckin(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const checkinIds = row.checkinId || this.ids
this.$modal.confirm('是否确认删除学生签到编号为"' + checkinIds + '"的数据项?').then(function() {
return delCheckin(checkinIds)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleQuery() { this.queryParams.pageNum = 1; this.getList() },
resetQuery() { this.resetForm('queryForm'); this.handleQuery() },
handleExport() {
this.download('train/checkin/export', {
...this.queryParams
}, `checkin_${new Date().getTime()}.xlsx`)
this.download('train/checkin/export', { ...this.queryParams }, `checkin_${new Date().getTime()}.xlsx`)
}
}
}
+40 -304
View File
@@ -1,358 +1,94 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="学员学号" prop="studentId">
<el-input
v-model="queryParams.studentId"
placeholder="请输入学员学号"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true">
<el-form-item label="培训计划" prop="planName">
<el-input v-model="queryParams.planName" placeholder="请输入计划名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="开班计划ID" prop="planId">
<el-input
v-model="queryParams.planId"
placeholder="请输入开班计划ID"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="学员" prop="studentName">
<el-input v-model="queryParams.studentName" placeholder="请输入学员姓名" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="课程ID" prop="cId">
<el-input
v-model="queryParams.cId"
placeholder="请输入课程ID"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="来源系统" prop="sourceSystem">
<el-input v-model="queryParams.sourceSystem" placeholder="如 VR实训系统" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="开始学习时间" prop="startTime">
<el-date-picker clearable
v-model="queryParams.startTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择开始学习时间">
</el-date-picker>
</el-form-item>
<el-form-item label="结束学习时间" prop="endTime">
<el-date-picker clearable
v-model="queryParams.endTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择结束学习时间">
</el-date-picker>
</el-form-item>
<el-form-item label="学习时长,单位秒" prop="studySeconds">
<el-input
v-model="queryParams.studySeconds"
placeholder="请输入学习时长,单位秒"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="数据同步入库时间" prop="syncTime">
<el-date-picker clearable
v-model="queryParams.syncTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择数据同步入库时间">
</el-date-picker>
<el-form-item label="学习内容" prop="learningContent">
<el-input v-model="queryParams.learningContent" placeholder="请输入学习内容" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['train:duration:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['train:duration:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['train:duration:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-hasPermi="['train:learning:export']"
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['train:duration:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" />
</el-row>
<el-table v-loading="loading" :data="durationList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="记录ID" align="center" prop="durId" />
<el-table-column label="学员学号" align="center" prop="studentId" />
<el-table-column label="开班计划ID" align="center" prop="planId" />
<el-table-column label="课程ID" align="center" prop="cId" />
<el-table-column label="设备类型:阅览室一体机 / 听书机 / VR实训 / 3D拆解 / 3D巡检" align="center" prop="deviceType" />
<el-table-column label="开始学习时间" align="center" prop="startTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="结束学习时间" align="center" prop="endTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="学习时长,单位秒" align="center" prop="studySeconds" />
<el-table-column label="数据同步入库时间" align="center" prop="syncTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.syncTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['train:duration:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['train:duration:remove']"
>删除</el-button>
</template>
<el-alert title="学习记录由外部学习系统或设备上报,本页面仅供查询。" type="info" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="rows">
<el-table-column label="培训计划" prop="planName" min-width="150" show-overflow-tooltip />
<el-table-column label="学员" prop="studentName" min-width="100" />
<el-table-column label="课程" prop="courseName" min-width="130" show-overflow-tooltip />
<el-table-column label="学习内容" prop="learningContent" min-width="160" show-overflow-tooltip />
<el-table-column label="学习资源" prop="resourceName" min-width="130" show-overflow-tooltip />
<el-table-column label="来源系统" prop="sourceSystem" min-width="120" show-overflow-tooltip />
<el-table-column label="开始时间" prop="startTime" width="170" />
<el-table-column label="结束时间" prop="endTime" width="170" />
<el-table-column label="有效时长" align="right" width="110">
<template slot-scope="scope">{{ formatDuration(scope.row.studySeconds) }}</template>
</el-table-column>
<el-table-column label="入库时间" prop="syncTime" width="170" />
</el-table>
<pagination
v-show="total>0"
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改学习时长统计对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="学员学号" prop="studentId">
<el-input v-model="form.studentId" placeholder="请输入学员学号" />
</el-form-item>
<el-form-item label="开班计划ID" prop="planId">
<el-input v-model="form.planId" placeholder="请输入开班计划ID" />
</el-form-item>
<el-form-item label="课程ID" prop="cId">
<el-input v-model="form.cId" placeholder="请输入课程ID" />
</el-form-item>
<el-form-item label="开始学习时间" prop="startTime">
<el-date-picker clearable
v-model="form.startTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择开始学习时间">
</el-date-picker>
</el-form-item>
<el-form-item label="结束学习时间" prop="endTime">
<el-date-picker clearable
v-model="form.endTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择结束学习时间">
</el-date-picker>
</el-form-item>
<el-form-item label="学习时长,单位秒" prop="studySeconds">
<el-input v-model="form.studySeconds" placeholder="请输入学习时长,单位秒" />
</el-form-item>
<el-form-item label="数据同步入库时间" prop="syncTime">
<el-date-picker clearable
v-model="form.syncTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择数据同步入库时间">
</el-date-picker>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listDuration, getDuration, delDuration, addDuration, updateDuration } from "@/api/train/duration"
import { listDuration } from '@/api/train/duration'
export default {
name: "Duration",
name: 'Duration',
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 学习时长统计表格数据
durationList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
studentId: null,
planId: null,
cId: null,
deviceType: null,
startTime: null,
endTime: null,
studySeconds: null,
syncTime: null
},
// 表单参数
form: {},
// 表单校验
rules: {
}
rows: [],
queryParams: { pageNum: 1, pageSize: 10, planName: null, studentName: null, sourceSystem: null, learningContent: null }
}
},
created() {
this.getList()
},
created() { this.getList() },
methods: {
/** 查询学习时长统计列表 */
getList() {
this.loading = true
listDuration(this.queryParams).then(response => {
this.durationList = response.rows
this.rows = response.rows
this.total = response.total
this.loading = false
})
}).finally(() => { this.loading = false })
},
// 取消按钮
cancel() {
this.open = false
this.reset()
formatDuration(seconds) {
if (seconds == null) return '-'
const hours = Math.floor(seconds / 3600)
const minutes = Math.floor((seconds % 3600) / 60)
return hours > 0 ? `${hours}小时${minutes}分` : `${minutes}分钟`
},
// 表单重置
reset() {
this.form = {
durId: null,
studentId: null,
planId: null,
cId: null,
deviceType: null,
startTime: null,
endTime: null,
studySeconds: null,
syncTime: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.durId)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加学习时长统计"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const durId = row.durId || this.ids
getDuration(durId).then(response => {
this.form = response.data
this.open = true
this.title = "修改学习时长统计"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.durId != null) {
updateDuration(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addDuration(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const durIds = row.durId || this.ids
this.$modal.confirm('是否确认删除学习时长统计编号为"' + durIds + '"的数据项?').then(function() {
return delDuration(durIds)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleQuery() { this.queryParams.pageNum = 1; this.getList() },
resetQuery() { this.resetForm('queryForm'); this.handleQuery() },
handleExport() {
this.download('train/duration/export', {
...this.queryParams
}, `duration_${new Date().getTime()}.xlsx`)
this.download('train/duration/export', { ...this.queryParams }, `duration_${new Date().getTime()}.xlsx`)
}
}
}
+33 -267
View File
@@ -1,319 +1,85 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="学员学号" prop="studentId">
<el-input
v-model="queryParams.studentId"
placeholder="请输入学员学号"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true">
<el-form-item label="培训计划" prop="planName">
<el-input v-model="queryParams.planName" placeholder="请输入计划名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="开班计划ID" prop="planId">
<el-input
v-model="queryParams.planId"
placeholder="请输入开班计划ID"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="学员" prop="studentName">
<el-input v-model="queryParams.studentName" placeholder="请输入学员姓名" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="累计学习总时长" prop="totalStudyHour">
<el-input
v-model="queryParams.totalStudyHour"
placeholder="请输入累计学习总时长"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="平均成绩" prop="avgScore">
<el-input
v-model="queryParams.avgScore"
placeholder="请输入平均成绩"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="签到率" prop="checkinRate">
<el-input
v-model="queryParams.checkinRate"
placeholder="请输入签到率"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="画像标签" prop="labelTag">
<el-input v-model="queryParams.labelTag" placeholder="请输入标签" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['train:portrait:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['train:portrait:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['train:portrait:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-hasPermi="['train:portrait:export']"
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['train:portrait:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" />
</el-row>
<el-table v-loading="loading" :data="portraitList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="画像ID" align="center" prop="portraitId" />
<el-table-column label="学员学号" align="center" prop="studentId" />
<el-table-column label="开班计划ID" align="center" prop="planId" />
<el-table-column label="累计学习总时长" align="center" prop="totalStudyHour" />
<el-table-column label="平均成绩" align="center" prop="avgScore" />
<el-table-column label="签到率" align="center" prop="checkinRate" />
<el-table-column label="画像标签,逗号分割,例如:动手能力强,理论薄弱" align="center" prop="labelTag" />
<el-table-column label="画像综合描述" align="center" prop="portraitContent" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['train:portrait:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['train:portrait:remove']"
>删除</el-button>
</template>
<el-alert title="画像由考勤、成绩和学习时长统计生成,本页面仅供查询。" type="info" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="rows">
<el-table-column label="培训计划" prop="planName" min-width="150" show-overflow-tooltip />
<el-table-column label="学员" prop="studentName" min-width="100" />
<el-table-column label="出勤率" align="right" width="90">
<template slot-scope="scope">{{ percent(scope.row.attendanceRate) }}</template>
</el-table-column>
<el-table-column label="理论成绩" prop="theoryScore" align="right" width="95" />
<el-table-column label="实操成绩" prop="practicalScore" align="right" width="95" />
<el-table-column label="累计学习学时" prop="totalStudyHour" align="right" width="120" />
<el-table-column label="画像标签" prop="labelTag" min-width="180" show-overflow-tooltip />
<el-table-column label="综合评价" prop="portraitContent" min-width="220" show-overflow-tooltip />
<el-table-column label="生成时间" prop="generatedTime" width="170" />
</el-table>
<pagination
v-show="total>0"
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改学员画像对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="学员学号" prop="studentId">
<el-input v-model="form.studentId" placeholder="请输入学员学号" />
</el-form-item>
<el-form-item label="开班计划ID" prop="planId">
<el-input v-model="form.planId" placeholder="请输入开班计划ID" />
</el-form-item>
<el-form-item label="累计学习总时长" prop="totalStudyHour">
<el-input v-model="form.totalStudyHour" placeholder="请输入累计学习总时长" />
</el-form-item>
<el-form-item label="平均成绩" prop="avgScore">
<el-input v-model="form.avgScore" placeholder="请输入平均成绩" />
</el-form-item>
<el-form-item label="签到率" prop="checkinRate">
<el-input v-model="form.checkinRate" placeholder="请输入签到率" />
</el-form-item>
<el-form-item label="画像标签,逗号分割,例如:动手能力强,理论薄弱" prop="labelTag">
<el-input v-model="form.labelTag" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="画像综合描述">
<editor v-model="form.portraitContent" :min-height="192"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listPortrait, getPortrait, delPortrait, addPortrait, updatePortrait } from "@/api/train/portrait"
import { listPortrait } from '@/api/train/portrait'
export default {
name: "Portrait",
name: 'Portrait',
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 学员画像表格数据
portraitList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
studentId: null,
planId: null,
totalStudyHour: null,
avgScore: null,
checkinRate: null,
labelTag: null,
portraitContent: null,
},
// 表单参数
form: {},
// 表单校验
rules: {
studentId: [
{ required: true, message: "学员学号不能为空", trigger: "blur" }
],
planId: [
{ required: true, message: "开班计划ID不能为空", trigger: "blur" }
],
}
rows: [],
queryParams: { pageNum: 1, pageSize: 10, planName: null, studentName: null, labelTag: null }
}
},
created() {
this.getList()
},
created() { this.getList() },
methods: {
/** 查询学员画像列表 */
getList() {
this.loading = true
listPortrait(this.queryParams).then(response => {
this.portraitList = response.rows
this.rows = response.rows
this.total = response.total
this.loading = false
})
}).finally(() => { this.loading = false })
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
portraitId: null,
studentId: null,
planId: null,
totalStudyHour: null,
avgScore: null,
checkinRate: null,
labelTag: null,
portraitContent: null,
updateTime: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.portraitId)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加学员画像"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const portraitId = row.portraitId || this.ids
getPortrait(portraitId).then(response => {
this.form = response.data
this.open = true
this.title = "修改学员画像"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.portraitId != null) {
updatePortrait(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addPortrait(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const portraitIds = row.portraitId || this.ids
this.$modal.confirm('是否确认删除学员画像编号为"' + portraitIds + '"的数据项?').then(function() {
return delPortrait(portraitIds)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
percent(value) { return value == null ? '-' : `${value}%` },
handleQuery() { this.queryParams.pageNum = 1; this.getList() },
resetQuery() { this.resetForm('queryForm'); this.handleQuery() },
handleExport() {
this.download('train/portrait/export', {
...this.queryParams
}, `portrait_${new Date().getTime()}.xlsx`)
this.download('train/portrait/export', { ...this.queryParams }, `portrait_${new Date().getTime()}.xlsx`)
}
}
}
+51 -306
View File
@@ -1,361 +1,106 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="开班计划ID train_class_plan.plan_id" prop="planId">
<el-input
v-model="queryParams.planId"
placeholder="请输入开班计划ID train_class_plan.plan_id"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true">
<el-form-item label="培训计划" prop="planName">
<el-input v-model="queryParams.planName" placeholder="请输入计划名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="学员学号 train_student.s_id" prop="studentId">
<el-input
v-model="queryParams.studentId"
placeholder="请输入学员学号 train_student.s_id"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="学员" prop="studentName">
<el-input v-model="queryParams.studentName" placeholder="请输入学员姓名" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="报到方式:1 身份证刷卡 2 人脸识别" prop="reportWay">
<el-input
v-model="queryParams.reportWay"
placeholder="请输入报到方式:1 身份证刷卡 2 人脸识别"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="报到方式" prop="reportWay">
<el-select v-model="queryParams.reportWay" placeholder="全部" clearable>
<el-option v-for="item in reportWays" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="报到一体机设备编号" prop="reportDeviceSn">
<el-input
v-model="queryParams.reportDeviceSn"
placeholder="请输入报到一体机设备编号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="实际报到时间" prop="reportTime">
<el-date-picker clearable
v-model="queryParams.reportTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择实际报到时间">
</el-date-picker>
</el-form-item>
<el-form-item label="分配宿舍ID train_dormitory_info.dorm_id" prop="allocDormId">
<el-input
v-model="queryParams.allocDormId"
placeholder="请输入分配宿舍ID train_dormitory_info.dorm_id"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分配教室ID train_classroom_info.class_room_id" prop="allocClassroomId">
<el-input
v-model="queryParams.allocClassroomId"
placeholder="请输入分配教室ID train_classroom_info.class_room_id"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分配实训场地ID train_training_site.site_id" prop="allocSiteId">
<el-input
v-model="queryParams.allocSiteId"
placeholder="请输入分配实训场地ID train_training_site.site_id"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="核验结果" prop="verifyResult">
<el-select v-model="queryParams.verifyResult" placeholder="全部" clearable>
<el-option v-for="item in verifyResults" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['train:report:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['train:report:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['train:report:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-hasPermi="['train:report:export']"
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['train:report:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" />
</el-row>
<el-table v-loading="loading" :data="reportList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="报到主键ID" align="center" prop="reportId" />
<el-table-column label="开班计划ID train_class_plan.plan_id" align="center" prop="planId" />
<el-table-column label="学员学号 train_student.s_id" align="center" prop="studentId" />
<el-table-column label="报到方式:1 身份证刷卡 2 人脸识别" align="center" prop="reportWay" />
<el-table-column label="报到一体机设备编号" align="center" prop="reportDeviceSn" />
<el-table-column label="实际报到时间" align="center" prop="reportTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.reportTime, '{y}-{m}-{d}') }}</span>
</template>
<el-alert title="报到记录由报到确认流程生成,本页面仅供查询。" type="info" :closable="false" show-icon class="mb8" />
<el-table v-loading="loading" :data="rows">
<el-table-column label="培训计划" prop="planName" min-width="160" show-overflow-tooltip />
<el-table-column label="学员" prop="studentName" min-width="110" />
<el-table-column label="报到方式" align="center" width="110">
<template slot-scope="scope">{{ labelOf(reportWays, scope.row.reportWay) }}</template>
</el-table-column>
<el-table-column label="0 未报到 1 已报到 2 请假未到" align="center" prop="reportStatus" />
<el-table-column label="分配宿舍ID train_dormitory_info.dorm_id" align="center" prop="allocDormId" />
<el-table-column label="分配教室ID train_classroom_info.class_room_id" align="center" prop="allocClassroomId" />
<el-table-column label="分配实训场地ID train_training_site.site_id" align="center" prop="allocSiteId" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['train:report:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['train:report:remove']"
>删除</el-button>
</template>
<el-table-column label="核验结果" align="center" width="110">
<template slot-scope="scope">{{ labelOf(verifyResults, scope.row.verifyResult) }}</template>
</el-table-column>
<el-table-column label="报到时间" prop="reportTime" width="170" />
<el-table-column label="核验设备" prop="reportDeviceSn" min-width="130" show-overflow-tooltip />
<el-table-column label="核验说明" prop="verifyNote" min-width="180" show-overflow-tooltip />
</el-table>
<pagination
v-show="total>0"
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改开班报到对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="开班计划ID train_class_plan.plan_id" prop="planId">
<el-input v-model="form.planId" placeholder="请输入开班计划ID train_class_plan.plan_id" />
</el-form-item>
<el-form-item label="学员学号 train_student.s_id" prop="studentId">
<el-input v-model="form.studentId" placeholder="请输入学员学号 train_student.s_id" />
</el-form-item>
<el-form-item label="报到方式:1 身份证刷卡 2 人脸识别" prop="reportWay">
<el-input v-model="form.reportWay" placeholder="请输入报到方式:1 身份证刷卡 2 人脸识别" />
</el-form-item>
<el-form-item label="报到一体机设备编号" prop="reportDeviceSn">
<el-input v-model="form.reportDeviceSn" placeholder="请输入报到一体机设备编号" />
</el-form-item>
<el-form-item label="实际报到时间" prop="reportTime">
<el-date-picker clearable
v-model="form.reportTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择实际报到时间">
</el-date-picker>
</el-form-item>
<el-form-item label="分配宿舍ID train_dormitory_info.dorm_id" prop="allocDormId">
<el-input v-model="form.allocDormId" placeholder="请输入分配宿舍ID train_dormitory_info.dorm_id" />
</el-form-item>
<el-form-item label="分配教室ID train_classroom_info.class_room_id" prop="allocClassroomId">
<el-input v-model="form.allocClassroomId" placeholder="请输入分配教室ID train_classroom_info.class_room_id" />
</el-form-item>
<el-form-item label="分配实训场地ID train_training_site.site_id" prop="allocSiteId">
<el-input v-model="form.allocSiteId" placeholder="请输入分配实训场地ID train_training_site.site_id" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listReport, getReport, delReport, addReport, updateReport } from "@/api/train/report"
import { listReport } from '@/api/train/report'
export default {
name: "Report",
name: 'Report',
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 开班报到表格数据
reportList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
planId: null,
studentId: null,
reportWay: null,
reportDeviceSn: null,
reportTime: null,
reportStatus: null,
allocDormId: null,
allocClassroomId: null,
allocSiteId: null,
},
// 表单参数
form: {},
// 表单校验
rules: {
planId: [
{ required: true, message: "开班计划ID train_class_plan.plan_id不能为空", trigger: "blur" }
],
studentId: [
{ required: true, message: "学员学号 train_student.s_id不能为空", trigger: "blur" }
],
}
rows: [],
reportWays: [
{ value: 1, label: '人脸识别' },
{ value: 2, label: '身份证刷卡' },
{ value: 3, label: '二维码' },
{ value: 4, label: '人工录入' }
],
verifyResults: [
{ value: 1, label: '核验通过' },
{ value: 2, label: '核验不匹配' },
{ value: 3, label: '人工放行' }
],
queryParams: { pageNum: 1, pageSize: 10, planName: null, studentName: null, reportWay: null, verifyResult: null }
}
},
created() {
this.getList()
},
created() { this.getList() },
methods: {
/** 查询开班报到列表 */
getList() {
this.loading = true
listReport(this.queryParams).then(response => {
this.reportList = response.rows
this.rows = response.rows
this.total = response.total
this.loading = false
})
}).finally(() => { this.loading = false })
},
// 取消按钮
cancel() {
this.open = false
this.reset()
labelOf(options, value) {
const match = options.find(item => item.value === value)
return match ? match.label : '-'
},
// 表单重置
reset() {
this.form = {
reportId: null,
planId: null,
studentId: null,
reportWay: null,
reportDeviceSn: null,
reportTime: null,
reportStatus: null,
allocDormId: null,
allocClassroomId: null,
allocSiteId: null,
createTime: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.reportId)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加开班报到"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const reportId = row.reportId || this.ids
getReport(reportId).then(response => {
this.form = response.data
this.open = true
this.title = "修改开班报到"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.reportId != null) {
updateReport(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addReport(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const reportIds = row.reportId || this.ids
this.$modal.confirm('是否确认删除开班报到编号为"' + reportIds + '"的数据项?').then(function() {
return delReport(reportIds)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleQuery() { this.queryParams.pageNum = 1; this.getList() },
resetQuery() { this.resetForm('queryForm'); this.handleQuery() },
handleExport() {
this.download('train/report/export', {
...this.queryParams
}, `report_${new Date().getTime()}.xlsx`)
this.download('train/report/export', { ...this.queryParams }, `report_${new Date().getTime()}.xlsx`)
}
}
}