Main #1
@@ -0,0 +1,166 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 课程教学运行管理(CourseRunningController /course-running)
|
||||||
|
// 接口依据:course-running 控制器(前端 baseURL 为 /api,此处不重复 /api 前缀)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询教学实施计划课次列表
|
||||||
|
* GET /course-running/plan/list
|
||||||
|
* 查询参数(TeachingPlanQueryDTO):
|
||||||
|
* sskcbh 实施_课程编号、nd 年度、jxff 教学方法、
|
||||||
|
* rqStart 日期范围开始、rqEnd 日期范围结束(均传 ISO 格式,如 2026-08-23T00:00:00)、
|
||||||
|
* txzt 填写状态(0-未填写 1-已填写 2-已提交)、pageNum、pageSize
|
||||||
|
* 返回:PageResult<TeachingPlanLessonVO>(records/total)
|
||||||
|
*/
|
||||||
|
export function listTeachingPlan(params) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/plan/list',
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 调课申请管理 /course-running/adjust ====================
|
||||||
|
// 接口依据:CourseRunningController(前端 baseURL 为 /api,此处不重复 /api 前缀)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询调课申请列表
|
||||||
|
* GET /adjust/list
|
||||||
|
* 查询参数(ScheduleAdjustQueryDTO):sskcbbh 课次编号、sqjybh 申请教员编号、nd 年度、
|
||||||
|
* jyspzzt 教研室审批状态、jyscszt 教研室查收状态、jgspzt 机关审批状态、sczt 删除状态、
|
||||||
|
* cjsjStart/cjsjEnd 申请日期范围(ISO 格式)、pageNum、pageSize
|
||||||
|
* 返回:PageResult<ScheduleAdjustApplyVO>(records/total)
|
||||||
|
*/
|
||||||
|
export function listScheduleAdjust(params) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/list',
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询可供调课课次
|
||||||
|
* GET /adjust/lessons
|
||||||
|
* 查询参数:nd 学期年度
|
||||||
|
* 返回:List<AdjustableLessonVO>
|
||||||
|
* 注意:后端当前未实现该接口,调用会报错(页面已做兜底提示)
|
||||||
|
*/
|
||||||
|
export function listAdjustableLessons(params) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/lessons',
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询调课申请详情
|
||||||
|
* GET /adjust/detail
|
||||||
|
* @param ssdksqbh 调课申请编号
|
||||||
|
* 返回:ScheduleAdjustDetailVO
|
||||||
|
*/
|
||||||
|
export function getScheduleAdjustDetail(ssdksqbh) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/detail',
|
||||||
|
method: 'get',
|
||||||
|
params: { ssdksqbh }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交调课申请
|
||||||
|
* POST /adjust/submit
|
||||||
|
* 请求体(ScheduleAdjustApplyDTO):sskcbbh 课次编号、sy 调课事由、rq 新日期、jc 新节次、
|
||||||
|
* nd 年度、sqjybh 申请教员编号、jxnr 教学内容、jxyd 教学要点、jxff 教学方法、
|
||||||
|
* jxbzbz 教学保障备注、ycxx 用车信息、bz 备注、roomList/teacherList/teamList/supportList
|
||||||
|
*/
|
||||||
|
export function submitScheduleAdjust(data) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/submit',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 教研室审批调课申请
|
||||||
|
* POST /adjust/audit/jys
|
||||||
|
* 请求体(ScheduleAdjustAuditDTO):ssdksqbh、auditRole=jys、spzt(1同意/2发回/3拒绝)、fhyj、sprbh
|
||||||
|
*/
|
||||||
|
export function auditByTeachingOffice(data) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/audit/jys',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 教研室查收调课申请
|
||||||
|
* POST /adjust/receive/jys
|
||||||
|
* @param ssdksqbh 调课申请编号
|
||||||
|
* @param csrbh 查收人编号
|
||||||
|
*/
|
||||||
|
export function receiveByTeachingOffice(params) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/receive/jys',
|
||||||
|
method: 'post',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 教学系审批调课申请
|
||||||
|
* POST /adjust/audit/jxx
|
||||||
|
* 请求体(ScheduleAdjustAuditDTO):ssdksqbh、auditRole=jxx、spzt、fhyj、sprbh
|
||||||
|
*/
|
||||||
|
export function auditByTeachingDepartment(data) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/audit/jxx',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机关审批调课申请
|
||||||
|
* POST /adjust/audit/jg
|
||||||
|
* 请求体(ScheduleAdjustAuditDTO):ssdksqbh、auditRole=jg、spzt、fhyj、sprbh、jgbh(机关编号必填)
|
||||||
|
*/
|
||||||
|
export function auditByAuthority(data) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/audit/jg',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机关查收调课申请
|
||||||
|
* POST /adjust/receive/jg
|
||||||
|
* @param ssdksqbh 调课申请编号
|
||||||
|
* @param jgbh 机关编号
|
||||||
|
* @param csrbh 查收人编号
|
||||||
|
*/
|
||||||
|
export function receiveByAuthority(params) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/receive/jg',
|
||||||
|
method: 'post',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 撤销调课申请
|
||||||
|
* DELETE /adjust/cancel
|
||||||
|
* @param ssdksqbh 调课申请编号
|
||||||
|
* @param sqjybh 申请教员编号(权限校验)
|
||||||
|
*/
|
||||||
|
export function cancelScheduleAdjust(params) {
|
||||||
|
return request({
|
||||||
|
url: '/course-running/adjust/cancel',
|
||||||
|
method: 'delete',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="page-container">
|
<div class="page-container">
|
||||||
<!-- 近期申请统计卡片 -->
|
<!-- 统计卡片 -->
|
||||||
<div class="section-card">
|
<div class="section-card">
|
||||||
<div class="section-title">近期课表调整申请</div>
|
<div class="section-title">调课申请统计(当前页)</div>
|
||||||
<div class="stat-grid">
|
<div class="stat-grid">
|
||||||
<div
|
<div
|
||||||
v-for="card in statCards"
|
v-for="card in statCards"
|
||||||
@@ -22,19 +22,18 @@
|
|||||||
|
|
||||||
<!-- 查询条件 -->
|
<!-- 查询条件 -->
|
||||||
<div class="section-card">
|
<div class="section-card">
|
||||||
<el-form :model="queryParams" :inline="true" size="small" class="search-form">
|
<el-form :model="queryParams" :inline="true" size="small" class="search-form" @submit.native.prevent>
|
||||||
<el-form-item label="课程名称">
|
<el-form-item label="年度">
|
||||||
<el-input v-model="queryParams.kcmc" placeholder="请输入课程名称" clearable style="width: 180px" @keyup.enter.native="handleQuery" />
|
<el-select v-model="queryParams.nd" placeholder="请选择年度" clearable style="width: 140px">
|
||||||
|
<el-option v-for="y in yearOptions" :key="y" :label="y" :value="y" />
|
||||||
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="队别(班次)">
|
<el-form-item label="申请教员编号">
|
||||||
<el-input v-model="queryParams.dbbc" placeholder="请输入队别班次" clearable style="width: 160px" @keyup.enter.native="handleQuery" />
|
<el-input v-model="queryParams.sqjybh" placeholder="请输入申请教员编号" clearable style="width: 180px" @keyup.enter.native="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="申请教员">
|
<el-form-item label="教研室审批状态">
|
||||||
<el-input v-model="queryParams.sqjy" placeholder="请输入申请教员" clearable style="width: 160px" @keyup.enter.native="handleQuery" />
|
<el-select v-model="queryParams.jyspzzt" placeholder="请选择" clearable style="width: 150px">
|
||||||
</el-form-item>
|
<el-option v-for="item in auditStatusOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
<el-form-item label="状态">
|
|
||||||
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable style="width: 140px">
|
|
||||||
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
@@ -53,87 +52,270 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-table :data="filteredData" v-loading="loading" size="small" border stripe class="compact-table" max-height="520">
|
<el-table :data="tableData" v-loading="loading" size="small" border stripe class="compact-table" max-height="520">
|
||||||
<el-table-column type="index" label="序号" width="55" align="center" />
|
<el-table-column type="index" label="序号" width="55" align="center" />
|
||||||
<el-table-column prop="kcmc" label="课程名称" min-width="140" show-overflow-tooltip />
|
<el-table-column prop="kcmc" label="课程名称" min-width="140" show-overflow-tooltip header-align="center" />
|
||||||
<el-table-column prop="jxsj" label="教学时间" width="110" align="center" />
|
<el-table-column label="申请教员" min-width="110" align="center" show-overflow-tooltip>
|
||||||
<el-table-column prop="sksj" label="上课时间" width="180" />
|
<template slot-scope="scope">{{ scope.row.sqjyxm || scope.row.sqjybh || '-' }}</template>
|
||||||
<el-table-column prop="jy" label="教员" width="90" align="center" />
|
</el-table-column>
|
||||||
<el-table-column prop="jxcd" label="教学场地" width="120" show-overflow-tooltip />
|
<el-table-column prop="sy" label="调课事由" min-width="180" show-overflow-tooltip header-align="center" />
|
||||||
<el-table-column prop="dbbc" label="队别(班次)" min-width="140" show-overflow-tooltip />
|
<el-table-column label="拟调整时间" width="170" align="center" show-overflow-tooltip>
|
||||||
<el-table-column prop="sqjy" label="申请教员" width="90" align="center" />
|
<template slot-scope="scope">{{ fmtRqJc(scope.row.rq, scope.row.jc) }}</template>
|
||||||
<el-table-column prop="zxkb" label="拟调整时间" width="180" />
|
</el-table-column>
|
||||||
<el-table-column label="申请类型" width="90" align="center">
|
<el-table-column prop="nd" label="年度" width="80" align="center" />
|
||||||
|
<el-table-column label="教研室审批状态" width="110" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-tag :type="typeTag(scope.row.lx)" size="mini">{{ scope.row.lx }}</el-tag>
|
<el-tag :type="auditStatusTag(scope.row.jyspzzt).type" size="mini">{{ auditStatusTag(scope.row.jyspzzt).label }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="状态" width="90" align="center">
|
<el-table-column label="教研室查收状态" width="100" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-tag :type="statusTag(scope.row.status).type" size="mini">{{ statusTag(scope.row.status).label }}</el-tag>
|
<el-tag :type="receiveStatusTag(scope.row.jyscszt).type" size="mini">{{ receiveStatusTag(scope.row.jyscszt).label }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
<el-table-column label="创建时间" width="150" align="center">
|
||||||
|
<template slot-scope="scope">{{ fmtDateTime(scope.row.cjsj) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="操作" width="210" align="center" fixed="right">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button type="text" size="mini" icon="el-icon-view" @click="openDetail(scope.row)">查看</el-button>
|
<div class="ops-cell">
|
||||||
<template v-if="scope.row.status === '0'">
|
<el-button type="text" size="mini" icon="el-icon-view" @click="openDetail(scope.row)">详情</el-button>
|
||||||
<el-button type="text" size="mini" icon="el-icon-check" @click="approve(scope.row)">批准</el-button>
|
<el-dropdown v-if="showAuditMenu(scope.row)" trigger="click" @command="cmd => openAudit(scope.row, cmd)">
|
||||||
<el-button type="text" size="mini" icon="el-icon-close" class="danger-btn" @click="reject(scope.row)">驳回</el-button>
|
<el-button type="text" size="mini" @click.stop>审批<i class="el-icon-arrow-down el-icon--right" /></el-button>
|
||||||
</template>
|
<el-dropdown-menu slot="dropdown">
|
||||||
<el-button v-else type="text" size="mini" class="danger-btn" @click="removeRow(scope.row)">删除</el-button>
|
<el-dropdown-item v-if="scope.row.jyspzzt === 0" command="jys">教研室审批</el-dropdown-item>
|
||||||
|
<el-dropdown-item v-if="scope.row.jyspzzt === 1" command="jxx">教学系审批</el-dropdown-item>
|
||||||
|
<el-dropdown-item v-if="scope.row.jyspzzt === 1" command="jg">机关审批</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
|
<el-dropdown v-if="showReceiveMenu(scope.row)" trigger="click" @command="cmd => openReceive(scope.row, cmd)">
|
||||||
|
<el-button type="text" size="mini" @click.stop>查收<i class="el-icon-arrow-down el-icon--right" /></el-button>
|
||||||
|
<el-dropdown-menu slot="dropdown">
|
||||||
|
<el-dropdown-item v-if="scope.row.jyscszt === 0" command="jys">教研室查收</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="jg">机关查收</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
|
<el-button v-if="scope.row.sczt === 0 && scope.row.jyspzzt !== 1" type="text" size="mini" class="danger-btn" @click="handleCancel(scope.row)">撤销</el-button>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-empty v-show="!loading && filteredData.length === 0" description="暂无调整申请" />
|
<el-empty v-show="!loading && tableData.length === 0" description="暂无调整申请" />
|
||||||
|
<pagination
|
||||||
|
v-show="total > 0"
|
||||||
|
:total="total"
|
||||||
|
:page.sync="queryParams.pageNum"
|
||||||
|
:limit.sync="queryParams.pageSize"
|
||||||
|
@pagination="loadList"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 新增申请弹窗 -->
|
<!-- 新增申请弹窗 -->
|
||||||
<el-dialog title="新增课表调整申请" :visible.sync="dialogVisible" width="640px" append-to-body>
|
<el-dialog title="新增课表调整申请" :visible.sync="addVisible" width="640px" append-to-body>
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
<el-form ref="addForm" :model="addForm" :rules="addRules" label-width="110px">
|
||||||
<el-form-item label="课程名称" prop="kcmc">
|
<el-form-item label="年度" prop="nd">
|
||||||
<el-input v-model="form.kcmc" placeholder="请输入课程名称" />
|
<el-select v-model="addForm.nd" placeholder="请选择年度" style="width: 100%">
|
||||||
|
<el-option v-for="y in yearOptions" :key="y" :label="y" :value="y" />
|
||||||
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="申请类型" prop="lx">
|
<el-form-item label="课次编号" prop="sskcbbh">
|
||||||
<el-radio-group v-model="form.lx">
|
<el-input v-model="addForm.sskcbbh" placeholder="请输入课次编号" />
|
||||||
<el-radio label="调课" />
|
<el-button type="primary" plain size="mini" class="pick-lesson-btn" :loading="lessonLoading" @click="loadAdjustableLessons">选择可供调课课次</el-button>
|
||||||
<el-radio label="停课" />
|
|
||||||
<el-radio label="补课" />
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="队别(班次)" prop="dbbc">
|
<el-form-item label="调课事由" prop="sy">
|
||||||
<el-input v-model="form.dbbc" placeholder="请输入队别班次" />
|
<el-input v-model="addForm.sy" type="textarea" :rows="2" placeholder="请输入调课事由" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="原上课时间" prop="sksj">
|
<el-form-item label="拟调整日期" prop="rq">
|
||||||
<el-input v-model="form.sksj" placeholder="如:周一 第3-4节" />
|
<el-date-picker v-model="addForm.rq" type="date" value-format="yyyy-MM-dd" placeholder="请选择日期" style="width: 100%" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="拟调整时间" prop="zxkb">
|
<el-form-item label="拟调整节次" prop="jc">
|
||||||
<el-input v-model="form.zxkb" placeholder="请输入拟调整后的上课时间" />
|
<el-select v-model="addForm.jc" placeholder="请选择节次" style="width: 100%">
|
||||||
|
<el-option v-for="n in jcOptions" :key="n" :label="jcLabel(n)" :value="n" />
|
||||||
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="申请理由" prop="bz">
|
<el-form-item label="申请教员编号" prop="sqjybh">
|
||||||
<el-input v-model="form.bz" type="textarea" :rows="3" placeholder="请输入申请理由" />
|
<el-input v-model="addForm.sqjybh" placeholder="请输入申请教员编号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="教学内容">
|
||||||
|
<el-input v-model="addForm.jxnr" placeholder="选填" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="教学要点">
|
||||||
|
<el-input v-model="addForm.jxyd" placeholder="选填" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="教学方法">
|
||||||
|
<el-input v-model="addForm.jxff" placeholder="选填" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="教学保障备注">
|
||||||
|
<el-input v-model="addForm.jxbzbz" placeholder="选填" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="用车信息">
|
||||||
|
<el-input v-model="addForm.ycxx" placeholder="选填" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="备注">
|
||||||
|
<el-input v-model="addForm.bz" type="textarea" :rows="2" placeholder="选填" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div slot="footer" class="dialog-footer">
|
<div slot="footer" class="dialog-footer">
|
||||||
<el-button type="primary" :loading="submitLoading" @click="submitForm">提交申请</el-button>
|
<el-button type="primary" :loading="addLoading" @click="submitAdd">提交申请</el-button>
|
||||||
<el-button @click="dialogVisible = false">取消</el-button>
|
<el-button @click="addVisible = false">取消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 可供调课课次选择弹窗 -->
|
||||||
|
<el-dialog title="选择可供调课课次" :visible.sync="lessonDialogVisible" width="760px" append-to-body>
|
||||||
|
<el-table :data="lessonOptions" v-loading="lessonLoading" size="small" border stripe max-height="420">
|
||||||
|
<el-table-column prop="kcmc" label="课程名称" min-width="140" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column label="原上课时间" width="160" align="center">
|
||||||
|
<template slot-scope="scope">{{ fmtRqJc(scope.row.rq, scope.row.jc) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="xydmc" label="学员队" min-width="120" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column prop="kcxh" label="课次序号" width="90" align="center" />
|
||||||
|
<el-table-column prop="jsbh" label="教室编号" width="110" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column label="操作" width="90" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button type="text" size="mini" @click="pickLesson(scope.row)">选择</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<el-empty v-show="!lessonLoading && lessonOptions.length === 0" description="暂无可供调课课次" />
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 审批弹窗 -->
|
||||||
|
<el-dialog :title="auditTitle" :visible.sync="auditVisible" width="520px" append-to-body>
|
||||||
|
<el-form ref="auditForm" :model="auditForm" label-width="100px">
|
||||||
|
<el-form-item label="审批结果" required>
|
||||||
|
<el-radio-group v-model="auditForm.spzt">
|
||||||
|
<el-radio :label="1">同意</el-radio>
|
||||||
|
<el-radio :label="2">发回</el-radio>
|
||||||
|
<el-radio :label="3">拒绝</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="审批意见">
|
||||||
|
<el-input v-model="auditForm.fhyj" type="textarea" :rows="3" placeholder="请输入审批意见(发回/拒绝时必填)" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="审批人编号" required>
|
||||||
|
<el-input v-model="auditForm.sprbh" placeholder="请输入审批人编号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="auditForm.auditRole === 'jg'" label="机关编号" required>
|
||||||
|
<el-input v-model="auditForm.jgbh" placeholder="请输入机关编号" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button type="primary" :loading="auditLoading" @click="submitAudit">确定</el-button>
|
||||||
|
<el-button @click="auditVisible = false">取消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 查收弹窗 -->
|
||||||
|
<el-dialog :title="receiveTitle" :visible.sync="receiveVisible" width="460px" append-to-body>
|
||||||
|
<el-form ref="receiveForm" :model="receiveForm" label-width="100px">
|
||||||
|
<el-form-item v-if="receiveForm.type === 'jg'" label="机关编号" required>
|
||||||
|
<el-input v-model="receiveForm.jgbh" placeholder="请输入机关编号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="查收人编号" required>
|
||||||
|
<el-input v-model="receiveForm.csrbh" placeholder="请输入查收人编号" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button type="primary" :loading="receiveLoading" @click="submitReceive">确定</el-button>
|
||||||
|
<el-button @click="receiveVisible = false">取消</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<!-- 查看详情弹窗 -->
|
<!-- 查看详情弹窗 -->
|
||||||
<el-dialog title="申请详情" :visible.sync="detailVisible" width="580px" append-to-body>
|
<el-dialog title="申请详情" :visible.sync="detailVisible" width="760px" append-to-body>
|
||||||
<el-descriptions v-if="detailTarget" :column="2" border size="small">
|
<div v-loading="detailLoading">
|
||||||
<el-descriptions-item label="课程名称">{{ detailTarget.kcmc }}</el-descriptions-item>
|
<el-descriptions v-if="detailData" :column="2" border size="small">
|
||||||
<el-descriptions-item label="申请类型">
|
<el-descriptions-item label="课程名称">{{ detailData.kcmc || '-' }}</el-descriptions-item>
|
||||||
<el-tag :type="typeTag(detailTarget.lx)" size="mini">{{ detailTarget.lx }}</el-tag>
|
<el-descriptions-item label="申请教员">{{ detailData.sqjyxm || detailData.sqjybh || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="调课事由" :span="2">{{ detailData.sy || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="拟调整时间">{{ fmtRqJc(detailData.rq, detailData.jc) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="年度">{{ detailData.nd || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="创建时间">{{ fmtDateTime(detailData.cjsj) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="教研室审批状态">
|
||||||
|
<el-tag :type="auditStatusTag(detailData.jyspzzt).type" size="mini">{{ auditStatusTag(detailData.jyspzzt).label }}</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="队别(班次)">{{ detailTarget.dbbc }}</el-descriptions-item>
|
<el-descriptions-item label="教研室查收状态">
|
||||||
<el-descriptions-item label="教员">{{ detailTarget.jy }} / {{ detailTarget.sqjy }}</el-descriptions-item>
|
<el-tag :type="receiveStatusTag(detailData.jyscszt).type" size="mini">{{ receiveStatusTag(detailData.jyscszt).label }}</el-tag>
|
||||||
<el-descriptions-item label="教学场地">{{ detailTarget.jxcd }}</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="执行时间">{{ detailTarget.zxsj }}</el-descriptions-item>
|
<el-descriptions-item label="教研室审批人">{{ detailData.jyspzrbh || '-' }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="原上课时间" :span="2">{{ detailTarget.sksj }}</el-descriptions-item>
|
<el-descriptions-item label="教研室审批时间">{{ fmtDateTime(detailData.jyspzsj) }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="拟调整时间" :span="2">{{ detailTarget.zxkb }}</el-descriptions-item>
|
<el-descriptions-item label="教研室查收人">{{ detailData.jyscsrbh || '-' }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="申请理由" :span="2">{{ detailTarget.bz }}</el-descriptions-item>
|
<el-descriptions-item label="教研室查收时间">{{ fmtDateTime(detailData.jyscssj) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="发回意见" :span="2">{{ detailData.fhyj || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="教学内容" :span="2">{{ detailData.jxnr || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="教学要点" :span="2">{{ detailData.jxyd || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="教学方法" :span="2">{{ detailData.jxff || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="教学保障备注" :span="2">{{ detailData.jxbzbz || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="用车信息" :span="2">{{ detailData.ycxx || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="备注" :span="2">{{ detailData.bz || '-' }}</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
|
|
||||||
|
<!-- 新教室 -->
|
||||||
|
<div v-if="detailData && detailData.roomList && detailData.roomList.length" class="sub-section">
|
||||||
|
<div class="sub-title">新教室</div>
|
||||||
|
<el-table :data="detailData.roomList" size="small" border stripe>
|
||||||
|
<el-table-column prop="jsbh" label="教室编号" min-width="120" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column prop="jsmc" label="教室名称" min-width="140" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column prop="bz" label="备注" min-width="160" show-overflow-tooltip header-align="center" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 新辅助教员 -->
|
||||||
|
<div v-if="detailData && detailData.teacherList && detailData.teacherList.length" class="sub-section">
|
||||||
|
<div class="sub-title">新辅助教员</div>
|
||||||
|
<el-table :data="detailData.teacherList" size="small" border stripe>
|
||||||
|
<el-table-column prop="fzjybh" label="教员编号" min-width="120" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column prop="fzjyxm" label="教员姓名" min-width="120" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column label="是否主教员" width="100" align="center">
|
||||||
|
<template slot-scope="scope">{{ scope.row.zjy === 1 ? '是' : '否' }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="bz" label="备注" min-width="140" show-overflow-tooltip header-align="center" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 新学员队 -->
|
||||||
|
<div v-if="detailData && detailData.teamList && detailData.teamList.length" class="sub-section">
|
||||||
|
<div class="sub-title">新学员队</div>
|
||||||
|
<el-table :data="detailData.teamList" size="small" border stripe>
|
||||||
|
<el-table-column prop="xydbh" label="学员队编号" min-width="140" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column prop="xydmc" label="学员队名称" min-width="140" show-overflow-tooltip header-align="center" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 新保障明细 -->
|
||||||
|
<div v-if="detailData && detailData.supportList && detailData.supportList.length" class="sub-section">
|
||||||
|
<div class="sub-title">新保障明细</div>
|
||||||
|
<el-table :data="detailData.supportList" size="small" border stripe>
|
||||||
|
<el-table-column prop="bztgmxbh" label="保障编号" min-width="140" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column prop="bztgmxmc" label="保障名称" min-width="160" show-overflow-tooltip header-align="center" />
|
||||||
|
<el-table-column prop="sl" label="数量" width="80" align="center" />
|
||||||
|
<el-table-column prop="bz" label="备注" min-width="140" show-overflow-tooltip header-align="center" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 机关审批记录 -->
|
||||||
|
<div v-if="detailData && detailData.auditList && detailData.auditList.length" class="sub-section">
|
||||||
|
<div class="sub-title">机关审批记录</div>
|
||||||
|
<el-table :data="detailData.auditList" size="small" border stripe>
|
||||||
|
<el-table-column prop="jgmc" label="机关" min-width="140" show-overflow-tooltip header-align="center">
|
||||||
|
<template slot-scope="scope">{{ scope.row.jgmc || scope.row.jgbh || '-' }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="审批状态" width="100" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="auditStatusTag(scope.row.spzt).type" size="mini">{{ auditStatusTag(scope.row.spzt).label }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="sprxm" label="审批人" min-width="110" show-overflow-tooltip header-align="center">
|
||||||
|
<template slot-scope="scope">{{ scope.row.sprxm || scope.row.sprbh || '-' }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="审批时间" width="150" align="center">
|
||||||
|
<template slot-scope="scope">{{ fmtDateTime(scope.row.spsj) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="fhyj" label="发回意见" min-width="140" show-overflow-tooltip header-align="center" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div slot="footer" class="dialog-footer">
|
<div slot="footer" class="dialog-footer">
|
||||||
<el-button @click="detailVisible = false">关闭</el-button>
|
<el-button @click="detailVisible = false">关闭</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -142,175 +324,348 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// 课表调整申请静态示例数据(待对接 getTimetableAdjustList 接口)
|
import {
|
||||||
const MOCK_LIST = [
|
listScheduleAdjust,
|
||||||
{ id: 1, kcmc: '高等数学', lx: '调课', jxsj: '2026-2027-1', sksj: '周一 第1-2节', zxkb: '周二 第3-4节', jy: '张教员', sqjy: '张教员', jxcd: '1号教学楼-101', dbbc: '一班', zxsj: '2026-09-01', bz: '因学院集中活动调整上课时间', status: '0' },
|
listAdjustableLessons,
|
||||||
{ id: 2, kcmc: '大学英语', lx: '停课', jxsj: '2026-2027-1', sksj: '周三 第5-6节', zxkb: '—', jy: '李教员', sqjy: '王教员', jxcd: '1号教学楼-205', dbbc: '二班', zxsj: '2026-09-03', bz: '教员参加教研会议,申请停课顺延', status: '1' },
|
getScheduleAdjustDetail,
|
||||||
{ id: 3, kcmc: '计算机基础', lx: '补课', jxsj: '2026-2027-1', sksj: '周五 第7-8节', zxkb: '周六 第1-2节', jy: '王教员', sqjy: '王教员', jxcd: '实验楼-303', dbbc: '三班', zxsj: '2026-09-04', bz: '补上周五因停课落下的课程', status: '1' },
|
submitScheduleAdjust,
|
||||||
{ id: 4, kcmc: '军事理论', lx: '调课', jxsj: '2026-2027-1', sksj: '周四 第3-4节', zxkb: '周五 第3-4节', jy: '赵教员', sqjy: '赵教员', jxcd: '3号教学楼-110', dbbc: '一班', zxsj: '2026-09-05', bz: '场地临时被占用,调换上课时间', status: '2' },
|
auditByTeachingOffice,
|
||||||
{ id: 5, kcmc: '高等数学', lx: '补课', jxsj: '2026-2027-1', sksj: '周二 第1-2节', zxkb: '周四 第7-8节', jy: '张教员', sqjy: '张教员', jxcd: '1号教学楼-101', dbbc: '二班', zxsj: '2026-09-06', bz: '补国庆假期调休停上的课程', status: '0' }
|
auditByTeachingDepartment,
|
||||||
]
|
auditByAuthority,
|
||||||
|
receiveByTeachingOffice,
|
||||||
|
receiveByAuthority,
|
||||||
|
cancelScheduleAdjust
|
||||||
|
} from '@/api/teachBusiness/courseRunning'
|
||||||
|
|
||||||
// 状态描述
|
// 节次 -> 节次区间映射
|
||||||
const STATUS_MAP = {
|
const JC_SECTION = {
|
||||||
'0': { label: '待审批', type: 'warning' },
|
1: '1-2节', 2: '3-4节', 3: '5-6节', 4: '7-8节', 5: '9-10节', 6: '11-12节'
|
||||||
'1': { label: '已批准', type: 'success' },
|
}
|
||||||
'2': { label: '已驳回', type: 'danger' }
|
|
||||||
|
// 审批状态:0-未审批,1-已同意,2-已发回,3-已拒绝
|
||||||
|
const AUDIT_STATUS = {
|
||||||
|
0: { label: '未审批', type: 'info' },
|
||||||
|
1: { label: '已同意', type: 'success' },
|
||||||
|
2: { label: '已发回', type: 'warning' },
|
||||||
|
3: { label: '已拒绝', type: 'danger' }
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查收状态:0-未查收,1-已查收
|
||||||
|
const RECEIVE_STATUS = {
|
||||||
|
0: { label: '未查收', type: 'info' },
|
||||||
|
1: { label: '已查收', type: 'success' }
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TimetableAdjust',
|
name: 'TimetableAdjust',
|
||||||
data() {
|
data() {
|
||||||
|
const currentYear = new Date().getFullYear()
|
||||||
|
const curUserName = (this.$store.state.user && this.$store.state.user.name) || ''
|
||||||
return {
|
return {
|
||||||
|
currentYear: currentYear,
|
||||||
|
curUserName: curUserName,
|
||||||
loading: false,
|
loading: false,
|
||||||
submitLoading: false,
|
tableData: [],
|
||||||
allData: [],
|
total: 0,
|
||||||
queryParams: {
|
queryParams: {
|
||||||
kcmc: undefined,
|
nd: currentYear,
|
||||||
dbbc: undefined,
|
sqjybh: undefined,
|
||||||
sqjy: undefined,
|
jyspzzt: undefined,
|
||||||
status: undefined
|
pageNum: 1,
|
||||||
|
pageSize: 20
|
||||||
},
|
},
|
||||||
statusOptions: [
|
yearOptions: [currentYear - 1, currentYear, currentYear + 1],
|
||||||
{ label: '待审批', value: '0' },
|
jcOptions: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
||||||
{ label: '已批准', value: '1' },
|
auditStatusOptions: [
|
||||||
{ label: '已驳回', value: '2' }
|
{ label: '未审批', value: 0 },
|
||||||
|
{ label: '已同意', value: 1 },
|
||||||
|
{ label: '已发回', value: 2 },
|
||||||
|
{ label: '已拒绝', value: 3 }
|
||||||
],
|
],
|
||||||
statCards: [],
|
statCards: [],
|
||||||
dialogVisible: false,
|
// 新增申请
|
||||||
detailVisible: false,
|
addVisible: false,
|
||||||
detailTarget: null,
|
addLoading: false,
|
||||||
form: {},
|
addForm: {},
|
||||||
rules: {
|
addRules: {
|
||||||
kcmc: [{ required: true, message: '请输入课程名称', trigger: 'blur' }],
|
nd: [{ required: true, message: '请选择年度', trigger: 'change' }],
|
||||||
lx: [{ required: true, message: '请选择申请类型', trigger: 'change' }],
|
sskcbbh: [{ required: true, message: '请输入课次编号', trigger: 'blur' }],
|
||||||
dbbc: [{ required: true, message: '请输入队别班次', trigger: 'blur' }],
|
sy: [{ required: true, message: '请输入调课事由', trigger: 'blur' }],
|
||||||
bz: [{ required: true, message: '请输入申请理由', trigger: 'blur' }]
|
rq: [{ required: true, message: '请选择拟调整日期', trigger: 'change' }],
|
||||||
}
|
jc: [{ required: true, message: '请选择拟调整节次', trigger: 'change' }],
|
||||||
}
|
sqjybh: [{ required: true, message: '请输入申请教员编号', trigger: 'blur' }]
|
||||||
},
|
},
|
||||||
computed: {
|
// 可供调课课次
|
||||||
filteredData() {
|
lessonDialogVisible: false,
|
||||||
const q = this.queryParams
|
lessonLoading: false,
|
||||||
return this.allData.filter(item => {
|
lessonOptions: [],
|
||||||
if (q.kcmc && !(item.kcmc || '').includes(q.kcmc)) return false
|
// 审批
|
||||||
if (q.dbbc && !(item.dbbc || '').includes(q.dbbc)) return false
|
auditVisible: false,
|
||||||
if (q.sqjy && !(item.sqjy || '').includes(q.sqjy)) return false
|
auditLoading: false,
|
||||||
if (q.status !== undefined && q.status !== '' && item.status !== q.status) return false
|
auditTitle: '审批',
|
||||||
return true
|
auditForm: { ssdksqbh: '', auditRole: 'jys', spzt: 1, fhyj: '', sprbh: '', jgbh: '' },
|
||||||
})
|
// 查收
|
||||||
|
receiveVisible: false,
|
||||||
|
receiveLoading: false,
|
||||||
|
receiveTitle: '查收',
|
||||||
|
receiveForm: { ssdksqbh: '', type: 'jys', csrbh: '', jgbh: '' },
|
||||||
|
// 详情
|
||||||
|
detailVisible: false,
|
||||||
|
detailLoading: false,
|
||||||
|
detailData: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.loadData()
|
this.loadList()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
typeTag(lx) {
|
/* ---------- 通用格式化 ---------- */
|
||||||
const map = { '调课': 'warning', '停课': 'danger', '补课': 'success' }
|
fmtDateTime(v) {
|
||||||
return map[lx] || 'info'
|
if (!v) return '-'
|
||||||
|
return String(v).replace('T', ' ').substring(0, 16)
|
||||||
},
|
},
|
||||||
statusTag(status) {
|
fmtRqJc(rq, jc) {
|
||||||
return STATUS_MAP[status] || { label: status, type: 'info' }
|
if (!rq) return '-'
|
||||||
|
const date = String(rq).substring(0, 10)
|
||||||
|
const sec = jc === null || jc === undefined || jc === '' ? '第?节' : (JC_SECTION[jc] || '第' + jc + '节')
|
||||||
|
return date + ' ' + sec
|
||||||
},
|
},
|
||||||
loadData() {
|
jcLabel(n) {
|
||||||
|
return JC_SECTION[n] || ('第' + n + '节')
|
||||||
|
},
|
||||||
|
auditStatusTag(v) {
|
||||||
|
return AUDIT_STATUS[v] || { label: '-', type: 'info' }
|
||||||
|
},
|
||||||
|
receiveStatusTag(v) {
|
||||||
|
return RECEIVE_STATUS[v] || { label: '-', type: 'info' }
|
||||||
|
},
|
||||||
|
/* ---------- 列表查询 ---------- */
|
||||||
|
loadList() {
|
||||||
|
const params = {
|
||||||
|
pageNum: this.queryParams.pageNum,
|
||||||
|
pageSize: this.queryParams.pageSize
|
||||||
|
}
|
||||||
|
if (this.queryParams.nd) params.nd = this.queryParams.nd
|
||||||
|
if (this.queryParams.sqjybh) params.sqjybh = this.queryParams.sqjybh
|
||||||
|
if (this.queryParams.jyspzzt !== undefined && this.queryParams.jyspzzt !== '') {
|
||||||
|
params.jyspzzt = this.queryParams.jyspzzt
|
||||||
|
}
|
||||||
this.loading = true
|
this.loading = true
|
||||||
// 模拟接口延迟,后续替换为真实接口
|
listScheduleAdjust(params).then(response => {
|
||||||
setTimeout(() => {
|
const data = response.data || {}
|
||||||
this.allData = MOCK_LIST.map((item, index) => ({ ...item, xh: index + 1 }))
|
this.tableData = data.records || []
|
||||||
|
this.total = data.total || 0
|
||||||
this.refreshStatCards()
|
this.refreshStatCards()
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}, 200)
|
}).catch(() => {
|
||||||
},
|
this.tableData = []
|
||||||
refreshStatCards() {
|
this.total = 0
|
||||||
const total = this.allData.length
|
this.refreshStatCards()
|
||||||
const pending = this.allData.filter(i => i.status === '0').length
|
this.loading = false
|
||||||
const approved = this.allData.filter(i => i.status === '1').length
|
})
|
||||||
const rejected = this.allData.filter(i => i.status === '2').length
|
|
||||||
this.statCards = [
|
|
||||||
{ title: '申请总数', value: total, gradient: 'linear-gradient(135deg, #00875a 0%, #00b877 100%)' },
|
|
||||||
{ title: '待审批', value: pending, gradient: 'linear-gradient(135deg, #e6a23c 0%, #f8b04c 100%)' },
|
|
||||||
{ title: '已批准', value: approved, gradient: 'linear-gradient(135deg, #409eff 0%, #66b1ff 100%)' },
|
|
||||||
{ title: '已驳回', value: rejected, gradient: 'linear-gradient(135deg, #f56c6c 0%, #f78989 100%)' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
handleStatClick(card) {
|
|
||||||
const statusMap = { '待审批': '0', '已批准': '1', '已驳回': '2' }
|
|
||||||
if (statusMap[card.title]) {
|
|
||||||
this.queryParams.status = this.queryParams.status === statusMap[card.title] ? undefined : statusMap[card.title]
|
|
||||||
this.$message.info(`已按「${card.title}」筛选`)
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
handleQuery() {
|
handleQuery() {
|
||||||
this.$message.success('查询完成')
|
this.queryParams.pageNum = 1
|
||||||
|
this.loadList()
|
||||||
},
|
},
|
||||||
resetQuery() {
|
resetQuery() {
|
||||||
this.queryParams = {
|
this.queryParams = {
|
||||||
kcmc: undefined,
|
nd: this.currentYear,
|
||||||
dbbc: undefined,
|
sqjybh: undefined,
|
||||||
sqjy: undefined,
|
jyspzzt: undefined,
|
||||||
status: undefined
|
pageNum: 1,
|
||||||
|
pageSize: 20
|
||||||
}
|
}
|
||||||
|
this.loadList()
|
||||||
},
|
},
|
||||||
|
refreshStatCards() {
|
||||||
|
const list = this.tableData
|
||||||
|
this.statCards = [
|
||||||
|
{ title: '本页申请', value: list.length, gradient: 'linear-gradient(135deg, #00875a 0%, #00b877 100%)', filter: undefined },
|
||||||
|
{ title: '教研室待审批', value: list.filter(i => i.jyspzzt === 0).length, gradient: 'linear-gradient(135deg, #e6a23c 0%, #f8b04c 100%)', filter: 0 },
|
||||||
|
{ title: '教研室已同意', value: list.filter(i => i.jyspzzt === 1).length, gradient: 'linear-gradient(135deg, #409eff 0%, #66b1ff 100%)', filter: 1 },
|
||||||
|
{ title: '教研室已拒绝', value: list.filter(i => i.jyspzzt === 3).length, gradient: 'linear-gradient(135deg, #f56c6c 0%, #f78989 100%)', filter: 3 }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
handleStatClick(card) {
|
||||||
|
if (card.filter === undefined) return
|
||||||
|
this.queryParams.jyspzzt = this.queryParams.jyspzzt === card.filter ? undefined : card.filter
|
||||||
|
this.handleQuery()
|
||||||
|
},
|
||||||
|
/* ---------- 新增申请 ---------- */
|
||||||
openAdd() {
|
openAdd() {
|
||||||
this.form = { kcmc: '', lx: '调课', dbbc: '', sksj: '', zxkb: '', bz: '' }
|
this.addForm = {
|
||||||
this.$nextTick(() => this.$refs.form && this.$refs.form.clearValidate())
|
nd: this.currentYear,
|
||||||
this.dialogVisible = true
|
sskcbbh: '',
|
||||||
|
sy: '',
|
||||||
|
rq: '',
|
||||||
|
jc: 1,
|
||||||
|
sqjybh: this.curUserName,
|
||||||
|
jxnr: '',
|
||||||
|
jxyd: '',
|
||||||
|
jxff: '',
|
||||||
|
jxbzbz: '',
|
||||||
|
ycxx: '',
|
||||||
|
bz: ''
|
||||||
|
}
|
||||||
|
this.$nextTick(() => this.$refs.addForm && this.$refs.addForm.clearValidate())
|
||||||
|
this.addVisible = true
|
||||||
},
|
},
|
||||||
submitForm() {
|
loadAdjustableLessons() {
|
||||||
this.$refs.form.validate(valid => {
|
if (!this.addForm.nd) {
|
||||||
|
this.$message.warning('请先选择年度')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.lessonLoading = true
|
||||||
|
listAdjustableLessons({ nd: this.addForm.nd }).then(response => {
|
||||||
|
this.lessonOptions = response.data || []
|
||||||
|
this.lessonLoading = false
|
||||||
|
this.lessonDialogVisible = true
|
||||||
|
}).catch(() => {
|
||||||
|
this.lessonLoading = false
|
||||||
|
this.$message.info('后端暂未提供可供调课课次接口,请手动填写课次编号')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
pickLesson(row) {
|
||||||
|
this.addForm.sskcbbh = row.sskcbbh
|
||||||
|
this.lessonDialogVisible = false
|
||||||
|
this.$message.success('已选择课次:' + (row.kcmc || row.sskcbbh))
|
||||||
|
},
|
||||||
|
submitAdd() {
|
||||||
|
this.$refs.addForm.validate(valid => {
|
||||||
if (!valid) return
|
if (!valid) return
|
||||||
this.submitLoading = true
|
const payload = {
|
||||||
setTimeout(() => {
|
sskcbbh: this.addForm.sskcbbh,
|
||||||
const nextId = this.allData.length ? Math.max(...this.allData.map(i => i.id)) + 1 : 1
|
sy: this.addForm.sy,
|
||||||
this.allData.unshift({
|
rq: this.addForm.rq + 'T00:00:00',
|
||||||
id: nextId,
|
jc: this.addForm.jc,
|
||||||
kcmc: this.form.kcmc,
|
nd: this.addForm.nd,
|
||||||
lx: this.form.lx,
|
sqjybh: this.addForm.sqjybh
|
||||||
jxsj: '2026-2027-1',
|
}
|
||||||
sksj: this.form.sksj || '待定',
|
;['jxnr', 'jxyd', 'jxff', 'jxbzbz', 'ycxx', 'bz'].forEach(key => {
|
||||||
zxkb: this.form.lx === '停课' ? '—' : (this.form.zxkb || '待定'),
|
if (this.addForm[key]) payload[key] = this.addForm[key]
|
||||||
jy: '-',
|
})
|
||||||
sqjy: this.form.sqjy || '-',
|
this.addLoading = true
|
||||||
jxcd: '-',
|
submitScheduleAdjust(payload).then(() => {
|
||||||
dbbc: this.form.dbbc,
|
this.addLoading = false
|
||||||
zxsj: this.getNow(),
|
this.addVisible = false
|
||||||
bz: this.form.bz,
|
this.$message.success('申请提交成功')
|
||||||
status: '0'
|
this.loadList()
|
||||||
|
}).catch(() => {
|
||||||
|
this.addLoading = false
|
||||||
})
|
})
|
||||||
this.refreshStatCards()
|
|
||||||
this.submitLoading = false
|
|
||||||
this.dialogVisible = false
|
|
||||||
this.$message.success('申请已提交')
|
|
||||||
}, 300)
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getNow() {
|
/* ---------- 审批 ---------- */
|
||||||
const d = new Date()
|
showAuditMenu(row) {
|
||||||
const p = n => (n < 10 ? '0' + n : '' + n)
|
return row.sczt === 0 && (row.jyspzzt === 0 || row.jyspzzt === 1)
|
||||||
return d.getFullYear() + '-' + p(d.getMonth() + 1) + '-' + p(d.getDate())
|
|
||||||
},
|
},
|
||||||
approve(row) {
|
openAudit(row, role) {
|
||||||
row.status = '1'
|
const titleMap = { jys: '教研室审批', jxx: '教学系审批', jg: '机关审批' }
|
||||||
this.refreshStatCards()
|
this.auditTitle = titleMap[role] || '审批'
|
||||||
this.$message.success('已批准该申请')
|
this.auditForm = {
|
||||||
|
ssdksqbh: row.ssdksqbh,
|
||||||
|
auditRole: role,
|
||||||
|
spzt: 1,
|
||||||
|
fhyj: '',
|
||||||
|
sprbh: this.curUserName,
|
||||||
|
jgbh: ''
|
||||||
|
}
|
||||||
|
this.auditVisible = true
|
||||||
},
|
},
|
||||||
reject(row) {
|
submitAudit() {
|
||||||
row.status = '2'
|
const f = this.auditForm
|
||||||
this.refreshStatCards()
|
if (!f.sprbh) {
|
||||||
this.$message.warning('已驳回该申请')
|
this.$message.warning('请填写审批人编号')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (f.auditRole === 'jg' && !f.jgbh) {
|
||||||
|
this.$message.warning('请填写机关编号')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const payload = {
|
||||||
|
ssdksqbh: f.ssdksqbh,
|
||||||
|
auditRole: f.auditRole,
|
||||||
|
spzt: f.spzt,
|
||||||
|
fhyj: f.fhyj,
|
||||||
|
sprbh: f.sprbh
|
||||||
|
}
|
||||||
|
if (f.jgbh) payload.jgbh = f.jgbh
|
||||||
|
const apiMap = {
|
||||||
|
jys: auditByTeachingOffice,
|
||||||
|
jxx: auditByTeachingDepartment,
|
||||||
|
jg: auditByAuthority
|
||||||
|
}
|
||||||
|
this.auditLoading = true
|
||||||
|
apiMap[f.auditRole](payload).then(() => {
|
||||||
|
this.auditLoading = false
|
||||||
|
this.auditVisible = false
|
||||||
|
this.$message.success('审批成功')
|
||||||
|
this.loadList()
|
||||||
|
}).catch(() => {
|
||||||
|
this.auditLoading = false
|
||||||
|
})
|
||||||
},
|
},
|
||||||
removeRow(row) {
|
/* ---------- 查收 ---------- */
|
||||||
this.$confirm('确认删除该申请?', '提示', { type: 'warning' })
|
showReceiveMenu(row) {
|
||||||
|
return row.sczt === 0 && row.jyspzzt === 1
|
||||||
|
},
|
||||||
|
openReceive(row, type) {
|
||||||
|
this.receiveTitle = type === 'jys' ? '教研室查收' : '机关查收'
|
||||||
|
this.receiveForm = {
|
||||||
|
ssdksqbh: row.ssdksqbh,
|
||||||
|
type: type,
|
||||||
|
csrbh: this.curUserName,
|
||||||
|
jgbh: ''
|
||||||
|
}
|
||||||
|
this.receiveVisible = true
|
||||||
|
},
|
||||||
|
submitReceive() {
|
||||||
|
const f = this.receiveForm
|
||||||
|
if (!f.csrbh) {
|
||||||
|
this.$message.warning('请填写查收人编号')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (f.type === 'jg' && !f.jgbh) {
|
||||||
|
this.$message.warning('请填写机关编号')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const params = { ssdksqbh: f.ssdksqbh, csrbh: f.csrbh }
|
||||||
|
if (f.jgbh) params.jgbh = f.jgbh
|
||||||
|
const api = f.type === 'jys' ? receiveByTeachingOffice : receiveByAuthority
|
||||||
|
this.receiveLoading = true
|
||||||
|
api(params).then(() => {
|
||||||
|
this.receiveLoading = false
|
||||||
|
this.receiveVisible = false
|
||||||
|
this.$message.success('查收成功')
|
||||||
|
this.loadList()
|
||||||
|
}).catch(() => {
|
||||||
|
this.receiveLoading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/* ---------- 撤销 ---------- */
|
||||||
|
handleCancel(row) {
|
||||||
|
this.$confirm('确认撤销该调课申请?撤销后课次将恢复原时间。', '提示', { type: 'warning' })
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.allData = this.allData.filter(i => i.id !== row.id)
|
cancelScheduleAdjust({ ssdksqbh: row.ssdksqbh, sqjybh: row.sqjybh }).then(() => {
|
||||||
this.refreshStatCards()
|
this.$message.success('撤销成功')
|
||||||
this.$message.success('删除成功')
|
this.loadList()
|
||||||
|
}).catch(() => {})
|
||||||
})
|
})
|
||||||
.catch(() => {})
|
.catch(() => {})
|
||||||
},
|
},
|
||||||
|
/* ---------- 详情 ---------- */
|
||||||
openDetail(row) {
|
openDetail(row) {
|
||||||
this.detailTarget = row
|
|
||||||
this.detailVisible = true
|
this.detailVisible = true
|
||||||
|
this.detailLoading = true
|
||||||
|
this.detailData = null
|
||||||
|
getScheduleAdjustDetail(row.ssdksqbh).then(response => {
|
||||||
|
this.detailData = response.data || {}
|
||||||
|
this.detailLoading = false
|
||||||
|
}).catch(() => {
|
||||||
|
this.detailData = null
|
||||||
|
this.detailLoading = false
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -405,6 +760,30 @@ export default {
|
|||||||
color: #f78989;
|
color: #f78989;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ops-cell {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pick-lesson-btn {
|
||||||
|
margin-top: 6px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-section {
|
||||||
|
margin-top: 16px;
|
||||||
|
|
||||||
|
.sub-title {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #303133;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 992px) {
|
@media (max-width: 992px) {
|
||||||
|
|||||||
Reference in New Issue
Block a user