分组教学任务和教学任务计划管理
This commit is contained in:
@@ -1,9 +1,10 @@
|
|||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
|
|
||||||
// 教学任务管理(TeachingTaskController /teachingTask)
|
// 教学任务管理(TeachingTaskController /teachingTask)
|
||||||
// 接口依据:TeachingTaskController(前端 baseURL 为 /api,此处不重复 /api 前缀)
|
// 接口依据:api.txt「教学任务管理」分组(前端 baseURL 为 /api,此处不重复 /api 前缀)
|
||||||
// 实体:JXRW(bh 编号[IdType.INPUT 必填]、rwmc 任务名称、nd 年度、zt 状态、
|
// 实体:JXRW(bh 编号、rwmc 任务名称、nd 年度、zt 状态、
|
||||||
// fbsj 发布时间、cjsj 创建时间、jssj 结束时间、jcxqscsj 教材需求生成时间)
|
// fbsj 发布时间、cjsj 创建时间、jssj 结束时间、jcxqscsj 教材需求生成时间)
|
||||||
|
// 新增时 bh 留空由后端生成(api.txt 新增示例未传 bh),编辑/更新时 bh 必传
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询教学任务列表
|
* 分页查询教学任务列表
|
||||||
@@ -20,18 +21,6 @@ export function listTeachingTask(params) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询所有有效教学任务(DEL_FLAG = 0)
|
|
||||||
* GET /teachingTask/all
|
|
||||||
* 返回:List<JXRW>
|
|
||||||
*/
|
|
||||||
export function listAllTeachingTask() {
|
|
||||||
return request({
|
|
||||||
url: '/teachingTask/all',
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据编号查询教学任务
|
* 根据编号查询教学任务
|
||||||
* GET /teachingTask/get?bh=
|
* GET /teachingTask/get?bh=
|
||||||
@@ -49,8 +38,8 @@ export function getTeachingTask(bh) {
|
|||||||
/**
|
/**
|
||||||
* 新增教学任务
|
* 新增教学任务
|
||||||
* POST /teachingTask/add
|
* POST /teachingTask/add
|
||||||
* 请求体(JXRW):bh 编号(必填,IdType.INPUT 无自动生成)、rwmc 任务名称(必填)、
|
* 请求体(JXRW):rwmc 任务名称(必填)、nd 年度(必填)、zt 状态、fbsj/jssj/jcxqscsj
|
||||||
* nd 年度(必填)、zt 状态(选填)
|
* 说明:bh 不传由后端自动生成;cjsj 创建时间由后端自动维护
|
||||||
*/
|
*/
|
||||||
export function addTeachingTask(data) {
|
export function addTeachingTask(data) {
|
||||||
return request({
|
return request({
|
||||||
@@ -61,7 +50,7 @@ export function addTeachingTask(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新教学任务
|
* 更新教学任务(根据主键)
|
||||||
* POST /teachingTask/update
|
* POST /teachingTask/update
|
||||||
* 请求体(JXRW):bh 编号(必填)、rwmc、nd、zt
|
* 请求体(JXRW):bh 编号(必填)、rwmc、nd、zt
|
||||||
*/
|
*/
|
||||||
@@ -74,7 +63,7 @@ export function updateTeachingTask(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除教学任务
|
* 级联删除教学任务和教研室任务书
|
||||||
* POST /teachingTask/delete?bh=
|
* POST /teachingTask/delete?bh=
|
||||||
* @param bh 编号
|
* @param bh 编号
|
||||||
*/
|
*/
|
||||||
@@ -87,20 +76,7 @@ export function deleteTeachingTask(bh) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量删除教学任务
|
* 教学任务发布(需要先填写教研室任务书)
|
||||||
* POST /teachingTask/batchDelete
|
|
||||||
* 请求体:List<String>(编号数组)
|
|
||||||
*/
|
|
||||||
export function batchDeleteTeachingTask(bhList) {
|
|
||||||
return request({
|
|
||||||
url: '/teachingTask/batchDelete',
|
|
||||||
method: 'post',
|
|
||||||
data: bhList
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 发布教学任务及关联教研室任务书
|
|
||||||
* POST /teachingTask/batchPublish?bh=
|
* POST /teachingTask/batchPublish?bh=
|
||||||
* @param bh 教学任务编号
|
* @param bh 教学任务编号
|
||||||
* 返回:更新数量
|
* 返回:更新数量
|
||||||
|
|||||||
@@ -1,25 +1,49 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container teaching-task-page">
|
<div class="app-container teaching-task-page">
|
||||||
<!-- 页面标题 -->
|
<!-- ==================== 页面标题 ==================== -->
|
||||||
<div class="page-title">分组课列表</div>
|
<div class="page-title">教学任务列表</div>
|
||||||
|
|
||||||
<!-- ==================== 1. 查询条件区域 ==================== -->
|
<!-- ==================== 1. 查询条件区域 ==================== -->
|
||||||
<el-card shadow="never" class="search-card">
|
<el-card shadow="never" class="search-card">
|
||||||
<el-form :model="searchForm" label-width="80px" class="search-form">
|
<el-form :model="searchForm" label-width="80px" class="search-form">
|
||||||
<el-row :gutter="24">
|
<el-row :gutter="24">
|
||||||
<el-col :xs="24" :md="8">
|
<el-col :xs="24" :sm="12" :md="8">
|
||||||
<el-form-item label="任务名称">
|
<el-form-item label="任务名称">
|
||||||
<el-input v-model="searchForm.rwmc" placeholder="请输入任务名称" clearable @keyup.enter.native="handleQuery" />
|
<el-input
|
||||||
|
v-model="searchForm.rwmc"
|
||||||
|
placeholder="请输入任务名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :xs="24" :md="8">
|
<el-col :xs="24" :sm="12" :md="8">
|
||||||
<el-form-item label="年度">
|
<el-form-item label="年度">
|
||||||
<el-input-number v-model="searchForm.nd" :controls="false" placeholder="请输入年度" clearable class="w-full" />
|
<el-select
|
||||||
|
v-model="searchForm.nd"
|
||||||
|
placeholder="请选择年度"
|
||||||
|
clearable
|
||||||
|
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-col>
|
</el-col>
|
||||||
<el-col :xs="24" :md="8">
|
<el-col :xs="24" :sm="12" :md="8">
|
||||||
<el-form-item label="状态">
|
<el-form-item label="状态">
|
||||||
<el-input v-model="searchForm.zt" placeholder="请输入状态" clearable @keyup.enter.native="handleQuery" />
|
<el-select
|
||||||
|
v-model="searchForm.zt"
|
||||||
|
placeholder="请选择状态"
|
||||||
|
clearable
|
||||||
|
style="width: 100%"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="opt in statusOptions"
|
||||||
|
:key="opt.value"
|
||||||
|
:label="opt.label"
|
||||||
|
:value="opt.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -29,38 +53,30 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<!-- ==================== 2. 操作区域 ==================== -->
|
<!-- ==================== 2. 数据表格 ==================== -->
|
||||||
<el-card shadow="never" class="action-card">
|
|
||||||
<div class="action-left">
|
|
||||||
<el-button type="primary" @click="handleAdd">新增教学任务</el-button>
|
|
||||||
<el-button type="danger" plain :disabled="selectedRows.length === 0" @click="handleBatchDelete">批量删除</el-button>
|
|
||||||
<el-button type="primary" plain @click="handleDownloadGroupCourseList">下载分组班列表</el-button>
|
|
||||||
<el-button type="primary" plain @click="handleDownloadWord">下载分组班学员名单Word</el-button>
|
|
||||||
<el-button type="primary" plain @click="handleDownloadExcel">下载分组班学员名单Excel</el-button>
|
|
||||||
<el-button type="primary" plain @click="handleDownloadTemplate">【分组课数据文件模板】下载</el-button>
|
|
||||||
</div>
|
|
||||||
</el-card>
|
|
||||||
|
|
||||||
<!-- ==================== 3. 数据表格 ==================== -->
|
|
||||||
<el-card shadow="never" class="table-card">
|
<el-card shadow="never" class="table-card">
|
||||||
<el-table v-loading="loading" :data="tableData" border stripe highlight-current-row
|
<el-table v-loading="loading" :data="tableData" border stripe>
|
||||||
@selection-change="handleSelectionChange">
|
|
||||||
<template slot="empty">
|
<template slot="empty">
|
||||||
<span>无数据!</span>
|
<span>无数据!</span>
|
||||||
</template>
|
</template>
|
||||||
<el-table-column type="selection" width="50" align="center" />
|
<el-table-column type="index" label="序号" width="70" align="center" />
|
||||||
<el-table-column type="index" label="序号" width="80" align="center" />
|
<el-table-column prop="bh" label="编号" width="200" align="center" show-overflow-tooltip />
|
||||||
<el-table-column prop="bh" label="编号" width="140" align="center" show-overflow-tooltip />
|
<el-table-column prop="rwmc" label="任务名称" min-width="160" align="left" header-align="center" show-overflow-tooltip />
|
||||||
<el-table-column prop="rwmc" label="任务名称" min-width="160" show-overflow-tooltip />
|
|
||||||
<el-table-column prop="nd" label="年度" width="90" align="center" />
|
<el-table-column prop="nd" label="年度" width="90" align="center" />
|
||||||
<el-table-column prop="zt" label="状态" width="90" align="center" show-overflow-tooltip />
|
<el-table-column label="状态" width="100" align="center">
|
||||||
<el-table-column prop="fbsj" label="发布时间" width="150" align="center" :formatter="formatDateTime" />
|
|
||||||
<el-table-column prop="cjsj" label="创建时间" width="150" align="center" :formatter="formatDateTime" />
|
|
||||||
<el-table-column label="操作" width="180" align="center" fixed="right">
|
|
||||||
<template slot-scope="{ row }">
|
<template slot-scope="{ row }">
|
||||||
<el-button type="text" size="small" @click="handleEdit(row)">编辑</el-button>
|
<el-tag :type="row.zt === '发布' ? 'success' : 'info'" size="small">
|
||||||
<el-button type="text" size="small" @click="handlePublish(row)">发布</el-button>
|
{{ row.zt || '-' }}
|
||||||
<el-button type="text" size="small" class="text-danger" @click="handleDelete(row)">删除</el-button>
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="fbsj" label="发布时间" width="150" align="center" :formatter="fmtDateTime" />
|
||||||
|
<el-table-column prop="jssj" label="结束时间" width="150" align="center" :formatter="fmtDateTime" />
|
||||||
|
<el-table-column prop="cjsj" label="创建时间" width="150" align="center" :formatter="fmtDateTime" />
|
||||||
|
<el-table-column prop="jcxqscsj" label="教材需求生成时间" width="170" align="center" :formatter="fmtDateTime" />
|
||||||
|
<el-table-column label="操作" width="80" align="center" fixed="right">
|
||||||
|
<template slot-scope="{ row }">
|
||||||
|
<el-button type="text" size="small" @click="handleDetail(row)">详情</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -77,102 +93,107 @@
|
|||||||
/>
|
/>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<!-- ==================== 4. 新增/修改对话框 ==================== -->
|
<!-- ==================== 3. 详情对话框 ==================== -->
|
||||||
<el-dialog
|
<el-dialog
|
||||||
:visible="dialogVisible"
|
:visible="detailVisible"
|
||||||
:title="dialogTitle"
|
title="教学任务详情"
|
||||||
width="520px"
|
width="620px"
|
||||||
:close-on-click-modal="false"
|
:close-on-click-modal="false"
|
||||||
@update:visible="val => dialogVisible = val"
|
@update:visible="val => detailVisible = val"
|
||||||
>
|
>
|
||||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px" class="add-form">
|
<el-descriptions v-if="detailData.bh" :column="2" border>
|
||||||
<el-form-item label="编号" prop="bh">
|
<el-descriptions-item label="编号">{{ detailData.bh || '-' }}</el-descriptions-item>
|
||||||
<el-input v-model="form.bh" placeholder="请输入编号" :disabled="isEdit" clearable />
|
<el-descriptions-item label="任务名称">{{ detailData.rwmc || '-' }}</el-descriptions-item>
|
||||||
</el-form-item>
|
<el-descriptions-item label="年度">{{ fmtVal(detailData.nd) }}</el-descriptions-item>
|
||||||
<el-form-item label="任务名称" prop="rwmc">
|
<el-descriptions-item label="状态">{{ detailData.zt || '-' }}</el-descriptions-item>
|
||||||
<el-input v-model="form.rwmc" placeholder="请输入任务名称" clearable />
|
<el-descriptions-item label="发布时间">{{ fmtVal(detailData.fbsj) }}</el-descriptions-item>
|
||||||
</el-form-item>
|
<el-descriptions-item label="结束时间">{{ fmtVal(detailData.jssj) }}</el-descriptions-item>
|
||||||
<el-form-item label="年度" prop="nd">
|
<el-descriptions-item label="创建时间">{{ fmtVal(detailData.cjsj) }}</el-descriptions-item>
|
||||||
<el-input-number v-model="form.nd" :min="0" :controls="false" placeholder="请输入年度" class="w-full" />
|
<el-descriptions-item label="教材需求生成时间">{{ fmtVal(detailData.jcxqscsj) }}</el-descriptions-item>
|
||||||
</el-form-item>
|
</el-descriptions>
|
||||||
<el-form-item label="状态">
|
<div v-else v-loading="detailLoading" class="detail-empty">加载中...</div>
|
||||||
<el-input v-model="form.zt" placeholder="请输入状态(选填)" clearable />
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<div slot="footer">
|
<div slot="footer">
|
||||||
<el-button @click="dialogVisible = false">取消</el-button>
|
<el-button type="primary" @click="detailVisible = false">关闭</el-button>
|
||||||
<el-button type="primary" :loading="saving" @click="handleSubmit">确定</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {
|
/**
|
||||||
listTeachingTask,
|
* 教学任务列表(只读查询页)
|
||||||
addTeachingTask,
|
* 对应菜单:teachBusiness/teachingTask(原「分组课列表」页,下载类功能后端无接口已移除)
|
||||||
updateTeachingTask,
|
* 仅提供 分页查询 list + 详情 get?bh=,不做增删改发(避免与教学任务计划管理页重复操作同一实体)
|
||||||
deleteTeachingTask,
|
* 增删改发统一在 src/views/teachOffice/taskPlan/index.vue(教学任务计划管理)完成
|
||||||
batchDeleteTeachingTask,
|
*/
|
||||||
publishTeachingTask
|
import { listTeachingTask, getTeachingTask } from '@/api/teachBusiness/teachingTask'
|
||||||
} from '@/api/teachBusiness/teachingTask'
|
import { listAllSemester } from '@/api/teachBusiness/semester'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TeachingTask',
|
name: 'TeachingTask',
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
pageTitle: '分组课列表',
|
|
||||||
|
|
||||||
// ==================== 1. 查询条件 ====================
|
// ==================== 1. 查询条件 ====================
|
||||||
searchForm: {
|
searchForm: {
|
||||||
rwmc: '',
|
rwmc: '',
|
||||||
nd: undefined,
|
nd: undefined,
|
||||||
zt: ''
|
zt: ''
|
||||||
},
|
},
|
||||||
|
yearOptions: [],
|
||||||
|
statusOptions: [
|
||||||
|
{ label: '未发布', value: '未发布' },
|
||||||
|
{ label: '发布', value: '发布' }
|
||||||
|
],
|
||||||
|
|
||||||
// ==================== 2. 批量选择 ====================
|
// ==================== 2. 表格数据 ====================
|
||||||
selectedRows: [],
|
|
||||||
|
|
||||||
// ==================== 3. 表格数据 ====================
|
|
||||||
loading: false,
|
loading: false,
|
||||||
tableData: [],
|
tableData: [],
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
total: 0,
|
total: 0,
|
||||||
|
|
||||||
// ==================== 4. 新增/修改表单 ====================
|
// ==================== 3. 详情 ====================
|
||||||
dialogVisible: false,
|
detailVisible: false,
|
||||||
dialogTitle: '新增教学任务',
|
detailLoading: false,
|
||||||
isEdit: false,
|
detailData: {}
|
||||||
saving: false,
|
|
||||||
form: this.createEmptyForm(),
|
|
||||||
rules: {
|
|
||||||
bh: [{ required: true, message: '请输入编号', trigger: 'blur' }],
|
|
||||||
rwmc: [{ required: true, message: '请输入任务名称', trigger: 'blur' }],
|
|
||||||
nd: [{ required: true, message: '请输入年度', trigger: 'blur' }]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
created() {
|
||||||
this.fetchList()
|
this.loadYearOptions().then(() => this.fetchList())
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
createEmptyForm() {
|
/* ---------- 年度下拉(数据来自 /semester/all,禁止硬编码) ---------- */
|
||||||
return {
|
loadYearOptions() {
|
||||||
bh: '',
|
return listAllSemester().then(response => {
|
||||||
rwmc: '',
|
const list = response.data || []
|
||||||
nd: undefined,
|
const map = {}
|
||||||
zt: ''
|
list.forEach(item => {
|
||||||
}
|
if (item.nd !== null && item.nd !== undefined && item.nd !== '') map[item.nd] = item
|
||||||
|
})
|
||||||
|
const arr = Object.keys(map).sort((a, b) => String(b).localeCompare(String(a)))
|
||||||
|
this.yearOptions = arr
|
||||||
|
// 默认年度:优先当前学期(dqxq=true),否则取最新年度
|
||||||
|
const current = list.find(item => item.dqxq === true)
|
||||||
|
const defaultNd = (current && current.nd) || arr[0]
|
||||||
|
if (!this.searchForm.nd) this.searchForm.nd = defaultNd
|
||||||
|
return arr
|
||||||
|
}).catch(() => {
|
||||||
|
this.yearOptions = []
|
||||||
|
return []
|
||||||
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
/** 后端 LocalDateTime 规范化显示:去掉 T,截断到分钟 */
|
/* ---------- 通用格式化 ---------- */
|
||||||
formatDateTime(row, column, cellValue) {
|
fmtDateTime(row, column, cellValue) {
|
||||||
if (cellValue === null || cellValue === undefined || cellValue === '') return '-'
|
if (cellValue === null || cellValue === undefined || cellValue === '') return '-'
|
||||||
return String(cellValue).replace('T', ' ').slice(0, 16)
|
return String(cellValue).replace('T', ' ').slice(0, 16)
|
||||||
},
|
},
|
||||||
|
fmtVal(val) {
|
||||||
|
if (val === null || val === undefined || val === '') return '-'
|
||||||
|
return String(val).replace('T', ' ').slice(0, 16)
|
||||||
|
},
|
||||||
|
|
||||||
// ==================== 列表加载 ====================
|
/* ---------- 列表加载 ---------- */
|
||||||
fetchList() {
|
fetchList() {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
const params = { pageNum: this.pageNum, pageSize: this.pageSize }
|
const params = { pageNum: this.pageNum, pageSize: this.pageSize }
|
||||||
@@ -193,10 +214,6 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
handleSearch() {
|
|
||||||
this.handleQuery()
|
|
||||||
},
|
|
||||||
|
|
||||||
handleQuery() {
|
handleQuery() {
|
||||||
this.pageNum = 1
|
this.pageNum = 1
|
||||||
this.fetchList()
|
this.fetchList()
|
||||||
@@ -213,124 +230,17 @@ export default {
|
|||||||
this.fetchList()
|
this.fetchList()
|
||||||
},
|
},
|
||||||
|
|
||||||
// ==================== 选择 ====================
|
/* ---------- 详情(只读,走真实 get?bh= 接口) ---------- */
|
||||||
handleSelectionChange(rows) {
|
handleDetail(row) {
|
||||||
this.selectedRows = rows
|
this.detailVisible = true
|
||||||
},
|
this.detailLoading = true
|
||||||
|
this.detailData = {}
|
||||||
// ==================== 新增 / 修改 ====================
|
getTeachingTask(row.bh).then(res => {
|
||||||
handleAdd() {
|
this.detailData = (res && res.data) || {}
|
||||||
this.form = this.createEmptyForm()
|
this.detailLoading = false
|
||||||
this.isEdit = false
|
}).catch(() => {
|
||||||
this.dialogTitle = '新增教学任务'
|
this.detailLoading = false
|
||||||
this.dialogVisible = true
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.$refs.formRef && this.$refs.formRef.clearValidate()
|
|
||||||
})
|
})
|
||||||
},
|
|
||||||
|
|
||||||
handleEdit(row) {
|
|
||||||
this.form = {
|
|
||||||
bh: row.bh || '',
|
|
||||||
rwmc: row.rwmc || '',
|
|
||||||
nd: row.nd,
|
|
||||||
zt: row.zt || ''
|
|
||||||
}
|
|
||||||
this.isEdit = true
|
|
||||||
this.dialogTitle = '修改教学任务'
|
|
||||||
this.dialogVisible = true
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.$refs.formRef && this.$refs.formRef.clearValidate()
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
handleSubmit() {
|
|
||||||
this.$refs.formRef.validate(valid => {
|
|
||||||
if (!valid) {
|
|
||||||
this.$message.warning('请完善必填项后再提交')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const payload = this.buildPayload()
|
|
||||||
this.saving = true
|
|
||||||
const req = this.isEdit ? updateTeachingTask(payload) : addTeachingTask(payload)
|
|
||||||
req.then(() => {
|
|
||||||
this.$message.success(this.isEdit ? '修改成功' : '新增成功')
|
|
||||||
this.dialogVisible = false
|
|
||||||
this.fetchList()
|
|
||||||
}).catch(() => {}).finally(() => {
|
|
||||||
this.saving = false
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
/** 构建请求体,仅含实体非空字段(时间字段后端自动维护,不传) */
|
|
||||||
buildPayload() {
|
|
||||||
const f = this.form
|
|
||||||
const payload = {}
|
|
||||||
if (f.bh && String(f.bh).trim()) payload.bh = String(f.bh).trim()
|
|
||||||
if (f.rwmc && String(f.rwmc).trim()) payload.rwmc = String(f.rwmc).trim()
|
|
||||||
if (f.nd !== undefined && f.nd !== null && f.nd !== '') payload.nd = f.nd
|
|
||||||
if (f.zt && String(f.zt).trim()) payload.zt = String(f.zt).trim()
|
|
||||||
return payload
|
|
||||||
},
|
|
||||||
|
|
||||||
// ==================== 删除 ====================
|
|
||||||
handleDelete(row) {
|
|
||||||
this.$confirm(`确定要删除「${row.rwmc || row.bh || '该记录'}」吗?`, '系统提示', {
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'warning'
|
|
||||||
}).then(() => deleteTeachingTask(row.bh)).then(() => {
|
|
||||||
this.$message.success('删除成功')
|
|
||||||
this.fetchList()
|
|
||||||
}).catch(() => {})
|
|
||||||
},
|
|
||||||
|
|
||||||
handleBatchDelete() {
|
|
||||||
if (this.selectedRows.length === 0) {
|
|
||||||
this.$message.warning('请先选择数据')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.$confirm(`确定要删除选中的 ${this.selectedRows.length} 条记录吗?`, '系统提示', {
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'warning'
|
|
||||||
}).then(() => {
|
|
||||||
const bhList = this.selectedRows.map(r => r.bh)
|
|
||||||
return batchDeleteTeachingTask(bhList)
|
|
||||||
}).then(() => {
|
|
||||||
this.$message.success('删除成功')
|
|
||||||
this.fetchList()
|
|
||||||
}).catch(() => {})
|
|
||||||
},
|
|
||||||
|
|
||||||
// ==================== 发布 ====================
|
|
||||||
handlePublish(row) {
|
|
||||||
this.$confirm(`确定要发布教学任务「${row.rwmc || row.bh || '该记录'}」吗?发布后将同步更新关联教研室任务书状态。`, '系统提示', {
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'warning'
|
|
||||||
}).then(() => publishTeachingTask(row.bh)).then(() => {
|
|
||||||
this.$message.success('发布成功')
|
|
||||||
this.fetchList()
|
|
||||||
}).catch(() => {})
|
|
||||||
},
|
|
||||||
|
|
||||||
// ==================== 无后端接口功能 ====================
|
|
||||||
handleDownloadGroupCourseList() {
|
|
||||||
this.$message.info('后端暂未提供该接口')
|
|
||||||
},
|
|
||||||
|
|
||||||
handleDownloadWord() {
|
|
||||||
this.$message.info('后端暂未提供该接口')
|
|
||||||
},
|
|
||||||
|
|
||||||
handleDownloadExcel() {
|
|
||||||
this.$message.info('后端暂未提供该接口')
|
|
||||||
},
|
|
||||||
|
|
||||||
handleDownloadTemplate() {
|
|
||||||
this.$message.info('后端暂未提供该接口')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -355,10 +265,6 @@ export default {
|
|||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
|
|
||||||
.search-form {
|
.search-form {
|
||||||
.w-full {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-actions {
|
.search-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
@@ -368,29 +274,22 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==================== 2. 操作区域 ====================
|
// ==================== 2. 数据表格 ====================
|
||||||
.action-card {
|
|
||||||
margin-bottom: 16px;
|
|
||||||
|
|
||||||
.action-left {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================== 3. 数据表格 ====================
|
|
||||||
.table-card {
|
.table-card {
|
||||||
.pagination {
|
.pagination {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
margin-top: 12px;
|
margin-top: 12px;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.text-danger {
|
// ==================== 3. 详情 ====================
|
||||||
color: #f56c6c;
|
.detail-empty {
|
||||||
}
|
min-height: 120px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
color: #909399;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,376 +1,440 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container task-plan-page">
|
<div class="app-container task-plan-page">
|
||||||
<!-- ==================== 1. 学期信息区域 ==================== -->
|
<!-- ==================== 页面标题 ==================== -->
|
||||||
|
<div class="page-title">教学任务计划管理</div>
|
||||||
|
|
||||||
|
<!-- ==================== 1. 查询条件区域 ==================== -->
|
||||||
<el-card shadow="never" class="search-card">
|
<el-card shadow="never" class="search-card">
|
||||||
<el-form :inline="true" :model="semester" class="search-form">
|
<el-form :inline="true" :model="searchForm" class="search-form">
|
||||||
<el-form-item label="学期名称">
|
<el-form-item label="任务名称">
|
||||||
<el-input v-model="semester.name" style="width: 160px" />
|
<el-input
|
||||||
</el-form-item>
|
v-model="searchForm.rwmc"
|
||||||
<el-form-item label="校历开学日期">
|
placeholder="请输入任务名称"
|
||||||
<el-date-picker
|
clearable
|
||||||
v-model="semester.kxrq"
|
style="width: 180px"
|
||||||
type="date"
|
@keyup.enter.native="handleQuery"
|
||||||
format="yyyy年M月d日"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="选择日期"
|
|
||||||
style="width: 160px"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="结束日期">
|
<el-form-item label="年度">
|
||||||
<el-date-picker
|
<el-select v-model="searchForm.nd" placeholder="请选择年度" clearable style="width: 140px">
|
||||||
v-model="semester.jsrq"
|
<el-option v-for="y in yearOptions" :key="y" :label="y" :value="y" />
|
||||||
type="date"
|
</el-select>
|
||||||
format="yyyy年M月d日"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="选择日期"
|
|
||||||
style="width: 160px"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="学期周数">
|
<el-form-item label="状态">
|
||||||
<el-input v-model="semester.weeks" style="width: 90px" />
|
<el-select v-model="searchForm.zt" placeholder="请选择状态" clearable style="width: 140px">
|
||||||
|
<el-option
|
||||||
|
v-for="opt in statusOptions"
|
||||||
|
:key="opt.value"
|
||||||
|
:label="opt.label"
|
||||||
|
:value="opt.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" @click="handleQuery">查询</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<!-- ==================== 2. 数据表格区域 ==================== -->
|
<!-- ==================== 2. 操作区域 ==================== -->
|
||||||
<div class="list-title">教学任务列表:</div>
|
|
||||||
<div class="list-toolbar">
|
<div class="list-toolbar">
|
||||||
<div class="left-group">
|
<div class="left-group">
|
||||||
<el-button type="primary" @click="handleAdd">新建</el-button>
|
<el-button type="primary" icon="el-icon-plus" @click="handleAdd">新建教学任务</el-button>
|
||||||
<el-button type="primary" plain @click="handleEdit">编辑</el-button>
|
|
||||||
<el-button type="danger" plain @click="handleDelete">删除</el-button>
|
|
||||||
<el-button type="primary" plain @click="handlePublish">发布教学任务</el-button>
|
|
||||||
<el-button type="primary" plain @click="handleEndPublish">结束发布</el-button>
|
|
||||||
<el-button type="primary" plain @click="handleManageTeams">管理教学任务所含学员队</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- ==================== 3. 数据表格 ==================== -->
|
||||||
<el-card shadow="never" class="table-card">
|
<el-card shadow="never" class="table-card">
|
||||||
<el-table
|
<el-table v-loading="loading" :data="tableData" border stripe class="task-table">
|
||||||
ref="tableRef"
|
<template slot="empty">
|
||||||
v-loading="loading"
|
<span>无数据!</span>
|
||||||
:data="tableData"
|
</template>
|
||||||
border
|
<el-table-column type="index" label="序号" width="70" align="center" />
|
||||||
stripe
|
<el-table-column prop="rwmc" label="任务名称" min-width="180" align="left" header-align="center" show-overflow-tooltip />
|
||||||
highlight-current-row
|
<el-table-column prop="nd" label="年度" width="90" align="center" />
|
||||||
class="task-table"
|
<el-table-column label="状态" width="100" align="center">
|
||||||
@selection-change="handleSelectionChange"
|
|
||||||
@current-change="handleCurrentChange"
|
|
||||||
>
|
|
||||||
<el-table-column type="selection" width="40" align="center" />
|
|
||||||
<el-table-column prop="rwmc" label="任务名称" min-width="170" show-overflow-tooltip />
|
|
||||||
<el-table-column label="状态" width="80" align="center">
|
|
||||||
<template slot-scope="{ row }">
|
<template slot-scope="{ row }">
|
||||||
<span class="status-text">{{ row.zt }}</span>
|
<el-tag :type="row.zt === '发布' ? 'success' : 'info'" size="small">
|
||||||
|
{{ row.zt || '-' }}
|
||||||
|
</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="fbsj" label="发布时间" width="130" align="center" />
|
<el-table-column prop="fbsj" label="发布时间" width="150" align="center" :formatter="fmtDateTime" />
|
||||||
<el-table-column prop="cjsj" label="创建时间" width="130" align="center" />
|
<el-table-column prop="jssj" label="结束时间" width="150" align="center" :formatter="fmtDateTime" />
|
||||||
<el-table-column label="结束时间" width="130" align="center">
|
<el-table-column prop="cjsj" label="创建时间" width="150" align="center" :formatter="fmtDateTime" />
|
||||||
|
<el-table-column prop="jcxqscsj" label="教材需求生成时间" width="170" align="center" :formatter="fmtDateTime" />
|
||||||
|
<el-table-column label="操作" width="200" align="center" fixed="right">
|
||||||
<template slot-scope="{ row }">
|
<template slot-scope="{ row }">
|
||||||
{{ row.jssj || '' }}
|
<el-button type="text" size="small" @click="handleDetail(row)">详情</el-button>
|
||||||
|
<el-button type="text" size="small" @click="handleEdit(row)">编辑</el-button>
|
||||||
|
<el-button
|
||||||
|
type="text"
|
||||||
|
size="small"
|
||||||
|
:disabled="row.zt === '发布'"
|
||||||
|
@click="handlePublish(row)"
|
||||||
|
>发布</el-button>
|
||||||
|
<el-button type="text" size="small" class="text-danger" @click="handleDelete(row)">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="jysCount" label="教研室数" width="90" align="center" />
|
|
||||||
<el-table-column prop="teamCount" label="学员队数" width="90" align="center" />
|
|
||||||
<el-table-column prop="hbqKcCount" label="合班前课程任务数" width="140" align="center" />
|
|
||||||
<el-table-column prop="hbqXssCount" label="合班前总学时数" width="140" align="center" />
|
|
||||||
<el-table-column prop="hbhKcCount" label="合班后课程任务数" width="140" align="center" />
|
|
||||||
<el-table-column prop="hbhXssCount" label="合班后总学时数" width="140" align="center" />
|
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
|
<el-pagination
|
||||||
|
:current-page="pageNum"
|
||||||
|
:page-size="pageSize"
|
||||||
|
:total="total"
|
||||||
|
:page-sizes="[10, 20, 50, 100]"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
class="pagination"
|
||||||
|
@current-change="handlePageChange"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
/>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<!-- ==================== 教学任务信息弹窗 ==================== -->
|
<!-- ==================== 4. 新增/修改对话框 ==================== -->
|
||||||
<el-dialog
|
<el-dialog
|
||||||
:visible="dialogVisible"
|
:visible="dialogVisible"
|
||||||
title="教学任务信息"
|
:title="dialogTitle"
|
||||||
width="900px"
|
width="560px"
|
||||||
class="teaching-task-dialog"
|
|
||||||
:close-on-click-modal="false"
|
:close-on-click-modal="false"
|
||||||
@update:visible="val => (dialogVisible = val)"
|
@update:visible="val => dialogVisible = val"
|
||||||
>
|
>
|
||||||
<!-- ==================== 1. 基本信息区域 ==================== -->
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="140px" class="add-form">
|
||||||
<el-form label-width="86px" class="basic-form">
|
<el-form-item v-if="isEdit" label="编号" prop="bh">
|
||||||
<el-row :gutter="20">
|
<el-input v-model="form.bh" disabled placeholder="编号不可修改" />
|
||||||
<el-col :span="12">
|
</el-form-item>
|
||||||
<el-form-item label="学期">
|
<el-form-item v-else label="编号">
|
||||||
<el-input v-model="form.xq" readonly />
|
<el-input disabled placeholder="新增后由系统自动生成" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
<el-form-item label="任务名称" prop="rwmc">
|
||||||
<el-col :span="12">
|
<el-input v-model="form.rwmc" placeholder="请输入任务名称" clearable />
|
||||||
<el-form-item label="任务名称">
|
</el-form-item>
|
||||||
<el-input v-model="form.rwmc" placeholder="请输入任务名称" />
|
<el-form-item label="年度" prop="nd">
|
||||||
</el-form-item>
|
<el-select v-model="form.nd" placeholder="请选择年度" style="width: 100%">
|
||||||
</el-col>
|
<el-option v-for="y in yearOptions" :key="y" :label="y" :value="y" />
|
||||||
</el-row>
|
</el-select>
|
||||||
<el-row :gutter="20">
|
</el-form-item>
|
||||||
<el-col :span="12">
|
<el-form-item label="状态" prop="zt">
|
||||||
<el-form-item label="创建时间">
|
<el-select v-model="form.zt" placeholder="请选择状态" style="width: 100%">
|
||||||
<el-input v-model="form.cjsj" readonly />
|
<el-option
|
||||||
</el-form-item>
|
v-for="opt in statusOptions"
|
||||||
</el-col>
|
:key="opt.value"
|
||||||
<el-col :span="12">
|
:label="opt.label"
|
||||||
<el-form-item label="发布时间">
|
:value="opt.value"
|
||||||
<el-input v-model="form.fbsj" readonly />
|
/>
|
||||||
</el-form-item>
|
</el-select>
|
||||||
</el-col>
|
</el-form-item>
|
||||||
</el-row>
|
<el-form-item label="发布时间">
|
||||||
<el-row :gutter="20">
|
<el-date-picker
|
||||||
<el-col :span="12">
|
v-model="form.fbsj"
|
||||||
<el-form-item label="结束时间">
|
type="datetime"
|
||||||
<el-input v-model="form.jssj" readonly />
|
value-format="yyyy-MM-ddTHH:mm:ss"
|
||||||
</el-form-item>
|
placeholder="请选择发布时间"
|
||||||
</el-col>
|
style="width: 100%"
|
||||||
</el-row>
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="结束时间">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="form.jssj"
|
||||||
|
type="datetime"
|
||||||
|
value-format="yyyy-MM-ddTHH:mm:ss"
|
||||||
|
placeholder="请选择结束时间"
|
||||||
|
style="width: 100%"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="教材需求生成时间">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="form.jcxqscsj"
|
||||||
|
type="datetime"
|
||||||
|
value-format="yyyy-MM-ddTHH:mm:ss"
|
||||||
|
placeholder="请选择教材需求生成时间"
|
||||||
|
style="width: 100%"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<!-- ==================== 2. Tab 标签页区域 ==================== -->
|
|
||||||
<el-tabs v-model="activeTab" class="tt-tabs">
|
|
||||||
<!-- 教研室任务书列表 -->
|
|
||||||
<el-tab-pane label="教研室任务书列表" name="taskbook">
|
|
||||||
<div class="sub-toolbar">
|
|
||||||
<el-button type="primary" plain size="small" @click="handleTaskBookDetail">
|
|
||||||
教研室任务书详细
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
<el-table
|
|
||||||
ref="taskBookTable"
|
|
||||||
:data="taskBookRows"
|
|
||||||
border
|
|
||||||
stripe
|
|
||||||
highlight-current-row
|
|
||||||
class="taskbook-table"
|
|
||||||
@selection-change="handleTaskBookSelection"
|
|
||||||
>
|
|
||||||
<el-table-column type="selection" width="40" align="center" />
|
|
||||||
<el-table-column prop="jys" label="教研室" min-width="120" align="center" />
|
|
||||||
<el-table-column prop="zt" label="状态" width="80" align="center" />
|
|
||||||
<el-table-column prop="sbsj" label="上报时间" width="150" align="center" show-overflow-tooltip />
|
|
||||||
<el-table-column prop="xydkcCount" label="学员队课程任务数" width="150" align="center" />
|
|
||||||
<el-table-column prop="wczdsCount" label="完成指定数" width="100" align="center" />
|
|
||||||
</el-table>
|
|
||||||
</el-tab-pane>
|
|
||||||
|
|
||||||
<!-- 学员队列表 -->
|
|
||||||
<el-tab-pane label="学员队列表" name="team">
|
|
||||||
<div class="tab-empty">暂无学员队列表数据</div>
|
|
||||||
</el-tab-pane>
|
|
||||||
</el-tabs>
|
|
||||||
|
|
||||||
<!-- ==================== 3. 底部按钮区域 ==================== -->
|
|
||||||
<div slot="footer">
|
<div slot="footer">
|
||||||
<el-button @click="dialogVisible = false">取消</el-button>
|
<el-button @click="dialogVisible = false">取消</el-button>
|
||||||
<el-button type="primary" @click="handleConfirm">确定</el-button>
|
<el-button type="primary" :loading="saving" @click="handleSubmit">确定</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- ==================== 5. 详情对话框 ==================== -->
|
||||||
|
<el-dialog
|
||||||
|
:visible="detailVisible"
|
||||||
|
title="教学任务详情"
|
||||||
|
width="620px"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
@update:visible="val => detailVisible = val"
|
||||||
|
>
|
||||||
|
<el-descriptions v-if="detailData.bh" :column="2" border>
|
||||||
|
<el-descriptions-item label="编号">{{ detailData.bh || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="任务名称">{{ detailData.rwmc || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="年度">{{ fmtVal(detailData.nd) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="状态">{{ detailData.zt || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="发布时间">{{ fmtVal(detailData.fbsj) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="结束时间">{{ fmtVal(detailData.jssj) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="创建时间">{{ fmtVal(detailData.cjsj) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="教材需求生成时间">{{ fmtVal(detailData.jcxqscsj) }}</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
<div v-else v-loading="detailLoading" class="detail-empty">加载中...</div>
|
||||||
|
<div slot="footer">
|
||||||
|
<el-button type="primary" @click="detailVisible = false">关闭</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
/**
|
||||||
|
* 教学任务计划管理(完整管理页)
|
||||||
|
* 对应菜单:teachOffice/taskPlan
|
||||||
|
* 提供 teachingTask 全套真实接口操作:分页查询 list、详情 get?bh=、新增 add、编辑 update、
|
||||||
|
* 发布 batchPublish?bh=(需先填写教研室任务书)、删除 delete?bh=(级联删除教研室任务书)
|
||||||
|
* 只读查询视图在 src/views/teachBusiness/teachingTask/index.vue(教学任务列表)提供,避免重复操作同一实体
|
||||||
|
*/
|
||||||
|
import {
|
||||||
|
listTeachingTask,
|
||||||
|
getTeachingTask,
|
||||||
|
addTeachingTask,
|
||||||
|
updateTeachingTask,
|
||||||
|
deleteTeachingTask,
|
||||||
|
publishTeachingTask
|
||||||
|
} from '@/api/teachBusiness/teachingTask'
|
||||||
|
import { listAllSemester } from '@/api/teachBusiness/semester'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'TaskPlan',
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
// ==================== 1. 学期信息区域 ====================
|
// ==================== 1. 查询条件 ====================
|
||||||
semester: {
|
searchForm: {
|
||||||
name: '2017年秋季学期', // 学期名称
|
rwmc: '',
|
||||||
kxrq: '2017-07-08', // 校历开学日期
|
nd: undefined,
|
||||||
jsrq: '2018-02-11', // 结束日期
|
zt: ''
|
||||||
weeks: 32 // 学期周数
|
|
||||||
},
|
},
|
||||||
|
yearOptions: [],
|
||||||
// ==================== 2. 数据表格 ====================
|
statusOptions: [
|
||||||
loading: false,
|
{ label: '未发布', value: '未发布' },
|
||||||
tableData: [
|
{ label: '发布', value: '发布' }
|
||||||
{
|
|
||||||
bh: 'task-2017-2',
|
|
||||||
rwmc: '2017年下半年教学任务',
|
|
||||||
zt: '发布',
|
|
||||||
fbsj: '2017年12月1日',
|
|
||||||
cjsj: '2017年7月8日',
|
|
||||||
jssj: '',
|
|
||||||
jysCount: 31,
|
|
||||||
teamCount: 78,
|
|
||||||
hbqKcCount: 1126,
|
|
||||||
hbqXssCount: 36050,
|
|
||||||
hbhKcCount: 1058,
|
|
||||||
hbhXssCount: 34050
|
|
||||||
},
|
|
||||||
{
|
|
||||||
bh: 'task-2019-1',
|
|
||||||
rwmc: '研究生下半年教学任务',
|
|
||||||
zt: '发布',
|
|
||||||
fbsj: '2019年12月1日',
|
|
||||||
cjsj: '2017年7月8日',
|
|
||||||
jssj: '',
|
|
||||||
jysCount: 12,
|
|
||||||
teamCount: 2,
|
|
||||||
hbqKcCount: 16,
|
|
||||||
hbqXssCount: 560,
|
|
||||||
hbhKcCount: 16,
|
|
||||||
hbhXssCount: 560
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
selectedRows: [],
|
|
||||||
currentRow: null,
|
|
||||||
|
|
||||||
// ==================== 操作按钮 ====================
|
// ==================== 2. 表格数据 ====================
|
||||||
/** 教学任务信息弹窗 */
|
loading: false,
|
||||||
|
tableData: [],
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
total: 0,
|
||||||
|
|
||||||
|
// ==================== 3. 新增/修改表单 ====================
|
||||||
dialogVisible: false,
|
dialogVisible: false,
|
||||||
/** 弹窗模式:新建 / 编辑 */
|
dialogTitle: '新建教学任务',
|
||||||
dialogMode: 'create',
|
isEdit: false,
|
||||||
/** 编辑模式选中的任务行 */
|
saving: false,
|
||||||
editRow: null,
|
form: this.createEmptyForm(),
|
||||||
|
rules: {
|
||||||
// ==================== 弹窗:基本信息 ====================
|
rwmc: [{ required: true, message: '请输入任务名称', trigger: 'blur' }],
|
||||||
form: {
|
nd: [{ required: true, message: '请选择年度', trigger: 'change' }],
|
||||||
xq: '2017年秋季学期', // 学期(只读)
|
zt: [{ required: true, message: '请选择状态', trigger: 'change' }]
|
||||||
rwmc: '', // 任务名称(可编辑)
|
|
||||||
cjsj: '', // 创建时间(只读)
|
|
||||||
fbsj: '', // 发布时间(只读)
|
|
||||||
jssj: '' // 结束时间(只读)
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// ==================== 弹窗:Tab 标签页 ====================
|
// ==================== 4. 详情 ====================
|
||||||
activeTab: 'taskbook',
|
detailVisible: false,
|
||||||
|
detailLoading: false,
|
||||||
// ==================== 弹窗:教研室任务书列表 ====================
|
detailData: {}
|
||||||
taskBookRows: [],
|
|
||||||
selectedTaskBookRows: [],
|
|
||||||
/** 编辑模式下的教研室任务书数据(按截图还原) */
|
|
||||||
editTaskBookRows: [
|
|
||||||
{ jys: '军事81教研室', zt: '发布', sbsj: '', xydkcCount: 33, wczdsCount: 0 },
|
|
||||||
{ jys: '翻译室', zt: '发布', sbsj: '', xydkcCount: 2, wczdsCount: 0 },
|
|
||||||
{ jys: '军事共同教研室', zt: '上报', sbsj: '2019-12-13 10:39', xydkcCount: 97, wczdsCount: 8 },
|
|
||||||
{ jys: '作战保障教研室', zt: '发布', sbsj: '', xydkcCount: 47, wczdsCount: 0 },
|
|
||||||
{ jys: '军事10教研室', zt: '发布', sbsj: '', xydkcCount: 21, wczdsCount: 0 },
|
|
||||||
{ jys: '军事83', zt: '发布', sbsj: '', xydkcCount: 2, wczdsCount: 0 },
|
|
||||||
{ jys: '军事09教研室', zt: '发布', sbsj: '', xydkcCount: 52, wczdsCount: 0 }
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
created() {
|
||||||
mounted() {
|
this.loadYearOptions().then(() => this.fetchList())
|
||||||
// 默认选中第一行(高亮)
|
|
||||||
this.$nextTick(() => {
|
|
||||||
if (this.tableData.length) {
|
|
||||||
this.$refs.tableRef.setCurrentRow(this.tableData[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
|
methods: {
|
||||||
|
/* ---------- 年度下拉(数据来自 /semester/all,禁止硬编码) ---------- */
|
||||||
|
loadYearOptions() {
|
||||||
|
return listAllSemester().then(response => {
|
||||||
|
const list = response.data || []
|
||||||
|
const map = {}
|
||||||
|
list.forEach(item => {
|
||||||
|
if (item.nd !== null && item.nd !== undefined && item.nd !== '') map[item.nd] = item
|
||||||
|
})
|
||||||
|
const arr = Object.keys(map).sort((a, b) => String(b).localeCompare(String(a)))
|
||||||
|
this.yearOptions = arr
|
||||||
|
// 默认年度:优先当前学期(dqxq=true),否则取最新年度
|
||||||
|
const current = list.find(item => item.dqxq === true)
|
||||||
|
const defaultNd = (current && current.nd) || arr[0]
|
||||||
|
if (!this.searchForm.nd) this.searchForm.nd = defaultNd
|
||||||
|
return arr
|
||||||
|
}).catch(() => {
|
||||||
|
this.yearOptions = []
|
||||||
|
return []
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
watch: {
|
/* ---------- 通用格式化 ---------- */
|
||||||
// 弹窗打开时按模式初始化
|
fmtDateTime(row, column, cellValue) {
|
||||||
dialogVisible(val) {
|
if (cellValue === null || cellValue === undefined || cellValue === '') return '-'
|
||||||
if (!val) return
|
return String(cellValue).replace('T', ' ').slice(0, 16)
|
||||||
this.form.xq = this.semester.name
|
},
|
||||||
if (this.dialogMode === 'edit') {
|
fmtVal(val) {
|
||||||
this.form.rwmc = (this.editRow && this.editRow.rwmc) || ''
|
if (val === null || val === undefined || val === '') return '-'
|
||||||
this.form.cjsj = '2017-07-14 17:00'
|
return String(val).replace('T', ' ').slice(0, 16)
|
||||||
this.form.fbsj = '2019-12-13 10:39'
|
},
|
||||||
this.form.jssj = ''
|
/** 移除空值(''/null/undefined),保留 0 等有效值 */
|
||||||
this.taskBookRows = [...this.editTaskBookRows]
|
cleanPayload(obj) {
|
||||||
} else {
|
const payload = {}
|
||||||
this.form.rwmc = '新研究生教学任务'
|
Object.keys(obj).forEach(key => {
|
||||||
this.form.cjsj = ''
|
const value = obj[key]
|
||||||
this.form.fbsj = ''
|
if (value !== '' && value !== null && value !== undefined) {
|
||||||
this.form.jssj = ''
|
payload[key] = value
|
||||||
this.taskBookRows = []
|
|
||||||
}
|
|
||||||
this.activeTab = 'taskbook'
|
|
||||||
// 默认选中第一行(高亮)
|
|
||||||
this.$nextTick(() => {
|
|
||||||
if (this.taskBookRows.length && this.$refs.taskBookTable) {
|
|
||||||
this.$refs.taskBookTable.setCurrentRow(this.taskBookRows[0])
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
return payload
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
/* ---------- 列表加载 ---------- */
|
||||||
// ==================== 表格 ====================
|
fetchList() {
|
||||||
handleSelectionChange(rows) {
|
this.loading = true
|
||||||
this.selectedRows = rows
|
const params = { pageNum: this.pageNum, pageSize: this.pageSize }
|
||||||
},
|
if (this.searchForm.rwmc && this.searchForm.rwmc.trim()) params.rwmc = this.searchForm.rwmc.trim()
|
||||||
handleCurrentChange(row) {
|
if (this.searchForm.nd !== undefined && this.searchForm.nd !== null && this.searchForm.nd !== '') {
|
||||||
this.currentRow = row
|
params.nd = this.searchForm.nd
|
||||||
},
|
}
|
||||||
/** 获取当前选中行,未选中时提示 */
|
if (this.searchForm.zt && this.searchForm.zt.trim()) params.zt = this.searchForm.zt.trim()
|
||||||
getSelected() {
|
listTeachingTask(params).then(res => {
|
||||||
if (!this.currentRow) {
|
const data = (res && res.data) || {}
|
||||||
this.$message.warning('请先选择一条教学任务')
|
this.tableData = data.records || []
|
||||||
return null
|
this.total = data.total || 0
|
||||||
|
this.loading = false
|
||||||
|
}).catch(() => {
|
||||||
|
this.tableData = []
|
||||||
|
this.total = 0
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
handleQuery() {
|
||||||
|
this.pageNum = 1
|
||||||
|
this.fetchList()
|
||||||
|
},
|
||||||
|
|
||||||
|
handlePageChange(page) {
|
||||||
|
this.pageNum = page
|
||||||
|
this.fetchList()
|
||||||
|
},
|
||||||
|
|
||||||
|
handleSizeChange(size) {
|
||||||
|
this.pageSize = size
|
||||||
|
this.pageNum = 1
|
||||||
|
this.fetchList()
|
||||||
|
},
|
||||||
|
|
||||||
|
/* ---------- 新增 / 修改 ---------- */
|
||||||
|
createEmptyForm() {
|
||||||
|
return {
|
||||||
|
bh: '',
|
||||||
|
rwmc: '',
|
||||||
|
nd: undefined,
|
||||||
|
zt: '未发布',
|
||||||
|
fbsj: '',
|
||||||
|
jssj: '',
|
||||||
|
jcxqscsj: ''
|
||||||
}
|
}
|
||||||
return this.currentRow
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// ==================== 操作按钮 ====================
|
|
||||||
/** 新建教学任务 */
|
|
||||||
handleAdd() {
|
handleAdd() {
|
||||||
this.dialogMode = 'create'
|
this.form = this.createEmptyForm()
|
||||||
this.editRow = null
|
if (!this.form.nd && this.searchForm.nd) this.form.nd = this.searchForm.nd
|
||||||
|
this.isEdit = false
|
||||||
|
this.dialogTitle = '新建教学任务'
|
||||||
this.dialogVisible = true
|
this.dialogVisible = true
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.formRef && this.$refs.formRef.clearValidate()
|
||||||
|
})
|
||||||
},
|
},
|
||||||
/** 编辑教学任务 */
|
|
||||||
handleEdit() {
|
handleEdit(row) {
|
||||||
const row = this.getSelected()
|
this.form = {
|
||||||
if (!row) return
|
bh: row.bh || '',
|
||||||
this.dialogMode = 'edit'
|
rwmc: row.rwmc || '',
|
||||||
this.editRow = row
|
nd: row.nd,
|
||||||
|
zt: row.zt || '未发布',
|
||||||
|
fbsj: row.fbsj || '',
|
||||||
|
jssj: row.jssj || '',
|
||||||
|
jcxqscsj: row.jcxqscsj || ''
|
||||||
|
}
|
||||||
|
this.isEdit = true
|
||||||
|
this.dialogTitle = '修改教学任务'
|
||||||
this.dialogVisible = true
|
this.dialogVisible = true
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.formRef && this.$refs.formRef.clearValidate()
|
||||||
|
})
|
||||||
},
|
},
|
||||||
/** 弹窗确认保存 */
|
|
||||||
handleDialogConfirm() {
|
handleSubmit() {
|
||||||
// TODO: 调用保存接口
|
this.$refs.formRef.validate(valid => {
|
||||||
this.$message.success('已保存教学任务信息(前端演示)')
|
if (!valid) {
|
||||||
|
this.$message.warning('请完善必填项后再提交')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const payload = this.cleanPayload(this.buildPayload())
|
||||||
|
this.saving = true
|
||||||
|
const req = this.isEdit ? updateTeachingTask(payload) : addTeachingTask(payload)
|
||||||
|
req.then(() => {
|
||||||
|
this.$message.success(this.isEdit ? '修改成功' : '新建成功')
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.fetchList()
|
||||||
|
}).catch(() => {}).finally(() => {
|
||||||
|
this.saving = false
|
||||||
|
})
|
||||||
|
})
|
||||||
},
|
},
|
||||||
/** 删除教学任务 */
|
|
||||||
handleDelete() {
|
/** 构建请求体:年度转数字以匹配后端 Integer,时间字段有值才传 */
|
||||||
const row = this.getSelected()
|
buildPayload() {
|
||||||
if (!row) return
|
const f = this.form
|
||||||
this.$confirm(`确定删除教学任务"${row.rwmc}"吗?删除后不可恢复。`, '删除确认', {
|
const payload = {}
|
||||||
confirmButtonText: '确定删除',
|
if (this.isEdit && f.bh && String(f.bh).trim()) payload.bh = String(f.bh).trim()
|
||||||
|
if (f.rwmc && String(f.rwmc).trim()) payload.rwmc = String(f.rwmc).trim()
|
||||||
|
if (f.nd !== undefined && f.nd !== null && f.nd !== '') payload.nd = Number(f.nd)
|
||||||
|
if (f.zt && String(f.zt).trim()) payload.zt = String(f.zt).trim()
|
||||||
|
if (f.fbsj) payload.fbsj = f.fbsj
|
||||||
|
if (f.jssj) payload.jssj = f.jssj
|
||||||
|
if (f.jcxqscsj) payload.jcxqscsj = f.jcxqscsj
|
||||||
|
return payload
|
||||||
|
},
|
||||||
|
|
||||||
|
/* ---------- 详情 ---------- */
|
||||||
|
handleDetail(row) {
|
||||||
|
this.detailVisible = true
|
||||||
|
this.detailLoading = true
|
||||||
|
this.detailData = {}
|
||||||
|
getTeachingTask(row.bh).then(res => {
|
||||||
|
this.detailData = (res && res.data) || {}
|
||||||
|
this.detailLoading = false
|
||||||
|
}).catch(() => {
|
||||||
|
this.detailLoading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
/* ---------- 删除 ---------- */
|
||||||
|
handleDelete(row) {
|
||||||
|
this.$confirm(`确定要删除「${row.rwmc || row.bh || '该记录'}」吗?删除将级联删除关联的教研室任务书。`, '系统提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
})
|
}).then(() => deleteTeachingTask(row.bh)).then(() => {
|
||||||
.then(() => {
|
this.$message.success('删除成功')
|
||||||
// TODO: 调用删除接口
|
this.fetchList()
|
||||||
this.$message.success('删除成功(前端演示)')
|
}).catch(() => {})
|
||||||
})
|
|
||||||
.catch(() => {})
|
|
||||||
},
|
|
||||||
/** 发布教学任务 */
|
|
||||||
handlePublish() {
|
|
||||||
const row = this.getSelected()
|
|
||||||
if (!row) return
|
|
||||||
// TODO: 调用发布接口
|
|
||||||
this.$message.success(`已发布教学任务:${row.rwmc}`)
|
|
||||||
},
|
|
||||||
/** 结束发布 */
|
|
||||||
handleEndPublish() {
|
|
||||||
const row = this.getSelected()
|
|
||||||
if (!row) return
|
|
||||||
// TODO: 调用结束发布接口
|
|
||||||
this.$message.success(`已结束发布:${row.rwmc}`)
|
|
||||||
},
|
|
||||||
/** 管理教学任务所含学员队 */
|
|
||||||
handleManageTeams() {
|
|
||||||
const row = this.getSelected()
|
|
||||||
if (!row) return
|
|
||||||
// TODO: 学员队管理弹窗,待接口接入
|
|
||||||
this.$message.success(`管理教学任务所含学员队:${row.rwmc}`)
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// ==================== 弹窗 ====================
|
/* ---------- 发布 ---------- */
|
||||||
handleTaskBookSelection(rows) {
|
handlePublish(row) {
|
||||||
this.selectedTaskBookRows = rows
|
this.$confirm(`确定要发布教学任务「${row.rwmc || row.bh || '该记录'}」吗?发布前请先填写关联的教研室任务书。`, '系统提示', {
|
||||||
},
|
confirmButtonText: '确定',
|
||||||
/** 打开教研室任务书详细(前端演示) */
|
cancelButtonText: '取消',
|
||||||
handleTaskBookDetail() {
|
type: 'warning'
|
||||||
// TODO: 教研室任务书详细弹窗,待接口接入
|
}).then(() => publishTeachingTask(row.bh)).then(() => {
|
||||||
},
|
this.$message.success('发布成功')
|
||||||
/** 弹窗确定 */
|
this.fetchList()
|
||||||
handleConfirm() {
|
}).catch(() => {})
|
||||||
this.handleDialogConfirm()
|
|
||||||
this.dialogVisible = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -382,7 +446,15 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.task-plan-page {
|
.task-plan-page {
|
||||||
// ========== 1. 学期信息区域 ==========
|
.page-title {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== 1. 查询条件区域 ==========
|
||||||
.search-card {
|
.search-card {
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
|
|
||||||
@@ -394,17 +466,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 2. 列表标题 ==========
|
// ========== 2. 工具栏 ==========
|
||||||
.list-title {
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
color: #303133;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
padding-left: 10px;
|
|
||||||
border-left: 4px solid var(--edu-green-primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ========== 3. 工具栏 ==========
|
|
||||||
.list-toolbar {
|
.list-toolbar {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -422,66 +484,30 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 4. 数据表格区域 ==========
|
// ========== 3. 数据表格区域 ==========
|
||||||
.table-card {
|
.table-card {
|
||||||
.task-table {
|
.task-table {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.status-text {
|
.pagination {
|
||||||
color: var(--edu-green-primary);
|
display: flex;
|
||||||
font-weight: 600;
|
justify-content: flex-end;
|
||||||
}
|
margin-top: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
// 当前行高亮
|
.text-danger {
|
||||||
::v-deep(.el-table__body tr.current-row > td.el-table__cell) {
|
color: #f56c6c;
|
||||||
background-color: #e1f5ec;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep(.el-table__body tr.current-row:hover > td.el-table__cell) {
|
|
||||||
background-color: #e1f5ec;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 4. 教学任务信息弹窗 ==========
|
// ========== 4. 详情 ==========
|
||||||
.teaching-task-dialog {
|
.detail-empty {
|
||||||
.basic-form {
|
min-height: 120px;
|
||||||
padding-bottom: 8px;
|
display: flex;
|
||||||
border-bottom: 1px solid #ebeef5;
|
align-items: center;
|
||||||
margin-bottom: 4px;
|
justify-content: center;
|
||||||
}
|
color: #909399;
|
||||||
|
|
||||||
.tt-tabs {
|
|
||||||
::v-deep(.el-tabs__header) {
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sub-toolbar {
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.taskbook-table {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
// 当前行高亮
|
|
||||||
::v-deep(.el-table__body tr.current-row > td.el-table__cell) {
|
|
||||||
background-color: #e1f5ec;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep(.el-table__body tr.current-row:hover > td.el-table__cell) {
|
|
||||||
background-color: #e1f5ec;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tab-empty {
|
|
||||||
min-height: 200px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
color: #909399;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Reference in New Issue
Block a user