把工具条横过来,占满一行,数据导入也放到工具条中,不要单独放

This commit is contained in:
2026-09-22 11:56:08 +08:00
parent 69a32e31d0
commit 3fcec5d756
8 changed files with 74 additions and 88 deletions
@@ -330,6 +330,15 @@ public class JYSController {
return Result.success(pageResult); return Result.success(pageResult);
} }
/**
* 去重职称列表(职称检索下拉数据源,职称无字典表)
*/
@PreAuthorize("@ss.hasPermi('teach:teacher:list')")
@GetMapping("/teacher/zc-options")
public Result<java.util.List<String>> teacherZcOptions() {
return Result.success(facultyService.listDistinctZc());
}
/** /**
* 教员数据文件导入(.xls/.xlsx) * 教员数据文件导入(.xls/.xlsx)
* <p>表头顺序:教员编号, 教员姓名, 教研室代号, 职称, 专业技术职务等级, 教员类别, * <p>表头顺序:教员编号, 教员姓名, 教研室代号, 职称, 专业技术职务等级, 教员类别,
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.roomroot.jwgl.entity.JYB; import com.roomroot.jwgl.entity.JYB;
import com.roomroot.jwgl.vo.faculty.TeacherListVO; import com.roomroot.jwgl.vo.faculty.TeacherListVO;
import java.util.List;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
@@ -29,6 +30,10 @@ public interface JYBMapper extends BaseMapper<JYB> {
/** 教员列表双表联查分页 */ /** 教员列表双表联查分页 */
Page<TeacherListVO> selectTeacherPageList(Page<TeacherListVO> page, @Param("jyb") JYB cond); Page<TeacherListVO> selectTeacherPageList(Page<TeacherListVO> page, @Param("jyb") JYB cond);
/** 去重职称列表(教员类别/职称检索下拉数据源,职称无字典表) */
@Select("SELECT DISTINCT \"职称\" FROM \"教员表\" WHERE \"职称\" IS NOT NULL AND \"职称\" <> '' ORDER BY \"职称\"")
List<String> selectDistinctZc();
@Select("SELECT TRIM(b.\"教员编号\") FROM \"教员登录表\" b " @Select("SELECT TRIM(b.\"教员编号\") FROM \"教员登录表\" b "
+ "JOIN \"登录信息表\" a ON TRIM(a.\"编号\") = TRIM(b.\"登录信息编号\") " + "JOIN \"登录信息表\" a ON TRIM(a.\"编号\") = TRIM(b.\"登录信息编号\") "
+ "WHERE LOWER(TRIM(a.\"账号\")) = LOWER(TRIM(#{username})) " + "WHERE LOWER(TRIM(a.\"账号\")) = LOWER(TRIM(#{username})) "
@@ -84,6 +84,11 @@ public interface FacultyService {
*/ */
void enableJYB(String jYBH); void enableJYB(String jYBH);
/**
* 去重职称列表(职称检索下拉数据源)
*/
java.util.List<String> listDistinctZc();
/** /**
* 更新教员基本信息 * 更新教员基本信息
*/ */
@@ -316,6 +316,11 @@ public class FacultyServiceImpl implements FacultyService {
} }
} }
@Override
public java.util.List<String> listDistinctZc() {
return jybMapper.selectDistinctZc();
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateJYB(JYB entity) { public void updateJYB(JYB entity) {
+8
View File
@@ -56,6 +56,14 @@ export function disableTeacher(jybh) {
}) })
} }
/** 去重职称列表(职称检索下拉)GET /jys/teacher/zc-options */
export function listTeacherZcOptions() {
return request({
url: '/jys/teacher/zc-options',
method: 'get'
})
}
/** 教员复职(还原离职状态)POST /jys/teacher/enable?jybh= */ /** 教员复职(还原离职状态)POST /jys/teacher/enable?jybh= */
export function enableTeacher(jybh) { export function enableTeacher(jybh) {
return request({ return request({
@@ -485,21 +485,10 @@ body .el-table td.el-table__cell {
} }
#app .elective-page .query-card, #app .elective-page .query-card,
#app .elective-page .upload-card,
#app .elective-page .table-card { #app .elective-page .table-card {
grid-column: 1 / -1; grid-column: 1 / -1;
} }
#app .elective-page .action-card {
grid-column: 1;
grid-row: 2;
}
#app .elective-page .export-card {
grid-column: 2;
grid-row: 2;
}
#app .management-page .query-card .q-control, #app .management-page .query-card .q-control,
#app .management-page .search-card .q-control { #app .management-page .search-card .q-control {
max-width: 520px; max-width: 520px;
@@ -56,41 +56,6 @@
</div> </div>
<!-- ==================== 3. 导出按钮区域 ==================== -->
<div class="section-card export-card">
<div class="section-heading section-heading--compact">
<div>
<h2 class="section-title">数据导出</h2>
<p class="section-description">下载选修班及学员名单</p>
</div>
</div>
<div class="export-bar">
<el-button icon="el-icon-download" @click="handleDownloadList">下载选修班列表</el-button>
<el-button icon="el-icon-download" @click="handleDownloadWord">下载选修班学员名单Word</el-button>
<el-button icon="el-icon-download" @click="handleDownloadExcel">下载选修班学员名单Excel</el-button>
</div>
</div>
<!-- ==================== 5. 文件上传区域 ==================== -->
<div class="section-card upload-card">
<div class="section-heading section-heading--compact">
<div>
<h2 class="section-title">数据导入</h2>
<p class="section-description">选择填写完成的模板文件并上传</p>
</div>
</div>
<div class="upload-row">
<div class="upload-left">
<el-button icon="el-icon-folder-opened" @click="handleSelectFile">选择文件</el-button>
<span class="file-name" :class="{ 'has-file': selectedFile }">{{ fileName }}</span>
<input ref="fileInputRef" type="file" style="display: none" @change="handleFileChange" />
</div>
<div class="upload-right">
<el-button type="primary" icon="el-icon-upload2" @click="handleUpload">上传数据</el-button>
</div>
</div>
</div>
<!-- ==================== 6. 数据表格区域 ==================== --> <!-- ==================== 6. 数据表格区域 ==================== -->
<div class="section-card table-card"> <div class="section-card table-card">
<div class="list-header"> <div class="list-header">
@@ -106,6 +71,13 @@
<el-button type="danger" plain icon="el-icon-circle-close" @click="handleStopSignup"> <el-button type="danger" plain icon="el-icon-circle-close" @click="handleStopSignup">
批量停止报名 批量停止报名
</el-button> </el-button>
<el-button icon="el-icon-download" @click="handleDownloadList">下载选修班列表</el-button>
<el-button icon="el-icon-download" @click="handleDownloadWord">学员名单Word</el-button>
<el-button icon="el-icon-download" @click="handleDownloadExcel">学员名单Excel</el-button>
<el-button icon="el-icon-folder-opened" @click="handleSelectFile">选择文件</el-button>
<span class="file-name" :class="{ 'has-file': selectedFile }">{{ fileName }}</span>
<input ref="fileInputRef" type="file" style="display: none" @change="handleFileChange" />
<el-button type="primary" plain icon="el-icon-upload2" @click="handleUpload">上传数据</el-button>
</div> </div>
</div> </div>
<el-table v-loading="loading" :data="tableData" border stripe class="main-table" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="tableData" border stripe class="main-table" @selection-change="handleSelectionChange">
@@ -514,41 +486,6 @@ export default {
} }
} }
.export-bar {
align-items: center;
}
// ==================== 5. 文件上传区域 ====================
.upload-card {
.upload-row {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 12px;
.upload-left {
display: flex;
align-items: center;
gap: 12px;
.file-name {
font-size: 12px;
color: #999;
&.has-file {
color: #303133;
}
}
}
.upload-right {
display: flex;
align-items: center;
}
}
}
// ==================== 6. 数据表格区域 ==================== // ==================== 6. 数据表格区域 ====================
.table-card { .table-card {
.list-header { .list-header {
@@ -581,6 +518,19 @@ export default {
.el-button + .el-button { .el-button + .el-button {
margin-left: 0; margin-left: 0;
} }
.file-name {
max-width: 180px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 12px;
color: #999;
&.has-file {
color: #303133;
}
}
} }
} }
@@ -10,18 +10,24 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="教研室代号"> <el-form-item label="教研室">
<el-input v-model="searchForm.jysdh" placeholder="请输入" clearable /> <el-select v-model="searchForm.jysdh" placeholder="请选择" clearable filterable style="width:100%">
<el-option v-for="o in allOfficeOptions" :key="o.jysdh" :label="o.jysmc + '(' + o.jysdh + ')'" :value="o.jysdh" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="职称"> <el-form-item label="职称">
<el-input v-model="searchForm.zc" placeholder="请输入" clearable /> <el-select v-model="searchForm.zc" placeholder="请选择" clearable filterable style="width:100%">
<el-option v-for="z in zcOptions" :key="z" :label="z" :value="z" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="教员类别"> <el-form-item label="教员类别">
<el-input v-model="searchForm.jylb" placeholder="请输入" clearable /> <el-select v-model="searchForm.jylb" placeholder="请选择" clearable filterable style="width:100%">
<el-option v-for="item in jylbOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@@ -731,6 +737,7 @@ import {
updateTeacher, updateTeacher,
disableTeacher, disableTeacher,
enableTeacher, enableTeacher,
listTeacherZcOptions,
getTeacherAttribute, getTeacherAttribute,
updateTeacherAttribute, updateTeacherAttribute,
downloadTeacherTemplate, downloadTeacherTemplate,
@@ -823,6 +830,8 @@ export default {
jylbOptions: [], jylbOptions: [],
zzlbOptions: [], zzlbOptions: [],
dslbOptions: [], dslbOptions: [],
zcOptions: [],
allOfficeOptions: [],
defaultZzlb: '1', defaultZzlb: '1',
// 教研室下拉(新增教员时选择所属教研室) // 教研室下拉(新增教员时选择所属教研室)
officeOptions: [], officeOptions: [],
@@ -899,6 +908,7 @@ export default {
if (hit) this.defaultZzlb = hit.dictValue if (hit) this.defaultZzlb = hit.dictValue
}).catch(() => {}) }).catch(() => {})
getDicts('teacher_dslb').then(res => { this.dslbOptions = res.data || [] }).catch(() => {}) getDicts('teacher_dslb').then(res => { this.dslbOptions = res.data || [] }).catch(() => {})
listTeacherZcOptions().then(res => { this.zcOptions = res.data || [] }).catch(() => {})
}, },
/** 加载教研室下拉:教员表 [教研室代号] 为非空外键,新增时必须选择 */ /** 加载教研室下拉:教员表 [教研室代号] 为非空外键,新增时必须选择 */
@@ -909,14 +919,19 @@ export default {
const rows = data.records || [] const rows = data.records || []
const seen = {} const seen = {}
const options = [] const options = []
const all = []
rows.forEach(row => { rows.forEach(row => {
const jysdh = row.jysdh const jysdh = row.jysdh
// 已停用(ty=1)的教研室不再参与新建教员 if (!jysdh || seen[jysdh]) return
if (!jysdh || seen[jysdh] || Number(row.ty) === 1) return
seen[jysdh] = true seen[jysdh] = true
options.push({ jysdh, jysmc: row.jysmc || jysdh, bmbh: row.bmbh }) const opt = { jysdh, jysmc: row.jysmc || jysdh, bmbh: row.bmbh }
all.push(opt)
// 已停用(ty=1)的教研室不再参与新建教员
if (Number(row.ty) === 1) return
options.push(opt)
}) })
this.officeOptions = options this.officeOptions = options
this.allOfficeOptions = all
}).catch(() => { }).catch(() => {
this.officeOptions = [] this.officeOptions = []
}).finally(() => { }).finally(() => {