Files
school-developer/src/components/tools/drawer-container.vue
guochunsi 74c06bb8a0 a
2025-12-31 17:40:01 +08:00

708 lines
23 KiB
Vue

<template>
<div class="drawer-container">
<!-- 遮罩层 -->
<div
v-show="visible"
:class="['drawer-mask', { 'drawer-mask-show': visible, 'drawer-mask-hide': !visible }]"
@click="closeByMask"
></div>
<!-- 抽屉内容 -->
<div
:class="['drawer-main', `drawer-${direction}`, { 'drawer-main-show': visible, 'drawer-main-hide': !visible }]"
:style="mainStyle"
>
<div class="drawer-header">
<span class="drawer-title">{{ title }}</span>
<el-button
v-if="showClose"
class="drawer-close-btn"
icon="el-icon-close"
type="text"
@click="closeByButton"
></el-button>
</div>
<div class="drawer-body">
<div style="display: none;">
<!--学生请假审批-->
<stu-leave-apply ref="stuApplyRef" v-if="permissions.stuwork_pending_work_stuleaveapply"></stu-leave-apply>
<!--班级请假审批-->
<class-leave-apply ref="classLeaveRef" v-if="permissions.stuwork_pending_work_stuleaveapply"></class-leave-apply>
<!--留宿申请审批-->
<dorm-live-apply ref="dormLiveApplyRef" v-if="permissions.stuwork_pending_work_dormliveapply"></dorm-live-apply>
<!-- 顶岗申请审批 -->
<company-change ref="companyChangeRef"></company-change>
<!-- 场地使用申请审批 -->
<building-assembly-room-apply ref="buildingAssemblyRoomApplyRef"></building-assembly-room-apply>
<!-- 固定资产调拨 -->
<asset-d-b ref="assetDB" v-if="permissions.asset_assetassetstransfer_edit"></asset-d-b>
<!-- 资产报废 -->
<asset-b-f ref="assetBF" v-if="permissions.asset_assetassetsinvalid_edit"></asset-b-f>
<!-- 资产预报废 -->
<asset-y-b-f ref="assetYBF" v-if="permissions.asset_assetassetsinvalid_add"></asset-y-b-f>
<!-- 入库单待处理 -->
<asset-in ref="assetIn" v-if="permissions.asset_assetinbound_exam_dept || permissions.asset_assetinbound_exam_hq "></asset-in>
<!-- 出库单待处理 -->
<asset-out ref="assetOut" v-if="permissions.asset_assetassetsdetail_edit || permissions.asset_assetassets_exam"></asset-out>
<!-- 采购申请单-->
<purchasingrequisition ref="purchasingrequisition" ></purchasingrequisition>
<!-- 采购流转单-->
<purchasingwander ref="purchasingwander" v-if="permissions.finance_purchasingrequisition_look"></purchasingwander>
<!-- 履约验收-->
<purchasinglyys ref="purchasinglyys" v-if="permissions.finance_purchasinglypj_look"></purchasinglyys>
<!-- 省常技12345-->
<schoolBully ref="schoolBully" v-if="permissions.stuwork_schoolbully_look"></schoolBully>
<!-- 培训项目审核 -->
<train-project-apply ref="trainProjectApplyRef"></train-project-apply>
<!--培训项目到账-->
<train-project-arrived-apply ref="trainProjectArrivedApplyRef"></train-project-arrived-apply>
</div>
<el-tabs v-model="activeName" @tab-click="changeTaskTab">
<el-tab-pane label="已订阅任务" name="1">
<el-table :data="tableData" height="150" border v-loading="tableLoading">
<el-table-column prop="label" label="任务类型" min-width="100" align="center"></el-table-column>
<el-table-column prop="value" label="待办" min-width="80" align="center">
<template v-slot="scope">
<el-tag size="mini" type="danger" v-if="taskNumMap[scope.row.type]">{{taskNumMap[scope.row.type]}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="150">
<template v-slot="scope">
<el-button type="text" size="mini" @click="handleShowDetail(scope.row)" icon="el-icon-view">查看</el-button>
<el-button type="text" size="mini" @click="handleIgnoreTask(scope.row,scope.$index)" icon="el-icon-close" >不再提醒</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="已取消订阅" name="2">
<el-table :data="ignoreTask" border height="150" v-loading="tableLoading">
<el-table-column label="任务类型" prop="label" min-width="100" align="center"></el-table-column>
<el-table-column label="操作" min-width="150" align="center">
<template v-slot="scope">
<el-button type="text" size="mini" @click="handleCancleIgnore(scope.row,scope.$index)" icon="el-icon-check">恢复</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
</template>
<script>
import StuLeaveApply from "@/page/task/stuLeaveApply.vue";
import ClassLeaveApply from "@/page/task/classLeaveApply.vue";
import {mapGetters} from "vuex";
import {getStuLeaveApplyTask} from "@/api/stuwork/stuleaveapply";
import {getClassLeaveApplyTask} from "@/api/stuwork/classleaveapply";
import {getStore, setStore} from "@/util/store";
import DormLiveApply from "@/page/task/dormLiveApply.vue";
import {getDormLiveApplyTask} from "@/api/stuwork/dormliveapply";
import * as taskApi from "@/api/activiti/task";
import purchasingrequisition from "@/page/task/purchasingrequisition.vue";
import assetOut from "@/page/task/assetOut.vue";
import purchasingwander from "@/page/task/purchasingwander.vue";
import CompanyChange from "@/page/task/companyChange.vue";
import assetIn from "@/page/task/assetIn.vue";
import buildingAssemblyRoomApply from "@/page/task/buildingAssemblyRoomApply.vue";
import schoolBully from "@/page/task/schoolBully.vue";
import assetYBF from "@/page/task/assetYBF.vue";
import purchasinglyys from "@/page/task/purchasinglyys.vue";
import assetDB from "@/page/task/assetDB.vue";
import assetBF from "@/page/task/assetBF.vue";
import {hasTimeOut} from "@/api/asset/assets/assetassets";
import {fetchListPage} from "@/api/asset/assetinbound/assetinbound";
import {pageIndex} from "@/api/asset/assetoutbound/assetoutbound";
import {waitingList} from "@/api/finance/purchasinglypj";
import {fetchList} from "@/api/stuwork/schoolbully";
import trainProjectApply from "@/page/task/trainProjectApply.vue";
import trainProjectArrivedApply from "@/page/task/trainProjectArrivedApply.vue";
export default {
name: 'CustomDrawer',
components: {
trainProjectArrivedApply,
trainProjectApply,
assetBF,
assetDB,
purchasinglyys,
assetYBF,
schoolBully,
buildingAssemblyRoomApply,
assetIn,
CompanyChange,
purchasingwander,
assetOut,
purchasingrequisition,
DormLiveApply, ClassLeaveApply, StuLeaveApply},
data() {
return {
timer:Object,
activeName: '1',
deleteTaskType:[],
showCompent:{},
taskNumMap:{},
allTaskTable:[
{label:"学生请假",type:"1",value:0},
{label:"班级请假",type:"2",value:0},
{label:"留宿申请",type:"3",value:0},
{label:"单位申请",type:"4",value:0},
{label:"场地使用申请",type:"5",value:0},
{label:"资产调拨申请",type:"6",value:0},
{label:"资产报废申请",type:"7",value:0},
{label:"资产预报废",type:"8",value:0},
{label:"资产入库申请",type:"9",value:0},
{label:"资产出库申请",type:"10",value:0},
{label:"采购申请",type:"11",value:0},
{label:"采购审核",type:"12",value:0},
{label:"履约验收",type:"13",value:0},
{label:"省常技12345",type:"14",value:0},
{label:"培训项目审核",type:"15",value:0},
{label:"培训到账审核",type:"16",value:0},
],
normalTaskTable:[],
tableData:[
],
ignoreTask:[
],
tableLoading:false
};
},
props: {
visible: { // 控制抽屉显示
type: Boolean,
default: false
},
title: { // 抽屉标题
type: String,
default: '标题'
},
direction: { // 抽屉方向
type: String,
default: 'right', // 可选 'left', 'right', 'top', 'bottom'
validator: (value) => ['left', 'right', 'top', 'bottom'].includes(value)
},
width: { // 抽屉宽度(左右方向时有效)
type: String,
default: '400px'
},
height: { // 抽屉高度(上下方向时有效)
type: String,
default: '300px'
},
showClose: { // 是否显示关闭按钮
type: Boolean,
default: true
},
maskClosable: { // 点击遮罩层是否可关闭
type: Boolean,
default: true
},
withHeader: { // 是否显示头部
type: Boolean,
default: true
}
},
computed: {
...mapGetters(['permissions']),
mainStyle() {
// 根据方向设置宽度或高度
const style = {};
if (this.direction === 'left' || this.direction === 'right') {
style.width = this.width;
} else {
style.height = this.height;
}
return style;
}
},
watch:{
visible:{
immediate: true,
handler(val){
if (val){
//初始化已订阅任务
this.activeName='1'
this.initNormalTask();
//初始化未订阅任务
this.$nextTick(()=>{
this.initTaskTableData()
})
}
}
}
},
methods: {
initTaskTableData(){
this.tableLoading=this
this.tableData=[]
//查询已订阅任务的 任务值 将任务数为0的忽略掉
let ignoreTypeList = getStore({name:"myTaskTable_ignore"})
if (undefined == ignoreTypeList) {
ignoreTypeList = [];
}
if (!ignoreTypeList.includes("1")) {
if (this.$refs.stuApplyRef) {
this.getStuLeaveData();
}
}
if (!ignoreTypeList.includes("2")) {
if(this.$refs.classLeaveRef){
this.getClassLeaveData()
}
}
if (!ignoreTypeList.includes("3")) {
if (this.$refs.dormLiveApplyRef) {
this.getDormApply()
}
}
if (!ignoreTypeList.includes("4")) {
if (this.$refs.companyChangeRef) {
this.getCompanyChangeTask()
}
}
if (!ignoreTypeList.includes("5")) {
if (this.$refs.buildingAssemblyRoomApplyRef) {
this.getBuildingAssemblyRoomApply();
}
}
if (!ignoreTypeList.includes("6")) {
if (this.$refs.assetDB) {
this.getAssesstsTransferTask()
}
}
if (!ignoreTypeList.includes("7")) {
if (this.$refs.assetBF) {
this.getAssetBfList();
}
}
if (!ignoreTypeList.includes("8")) {
if (this.$refs.assetYBF) {
this.getYbFData()
}
}
if (!ignoreTypeList.includes("9")) {
if (this.$refs.assetIn) {
this.getAssetInList()
}
}
if (!ignoreTypeList.includes("10")) {
if (this.$refs.assetOut) {
this.getAssetOutList()
}
}
if (!ignoreTypeList.includes("11")) {
if (this.$refs.purchasingrequisition) {
this.getPurchaseList()
}
}
if (!ignoreTypeList.includes("12")) {
if (this.$refs.purchasingwander) {
this.getPruchaseWarningList()
}
}
if (!ignoreTypeList.includes("13")) {
if (this.$refs.purchasinglyys) {
this.getPurchaseLyysData();
}
}
if (!ignoreTypeList.includes("14")) {
if (this.$refs.schoolBully) {
this.getSchoolBully()
}
}
if (!ignoreTypeList.includes("15")) {
if (this.$refs.trainProjectApplyRef) {
this.getTrainProjectApply()
}
}
if (!ignoreTypeList.includes("16")) {
if (this.$refs.trainProjectArrivedApplyRef) {
this.getTrainProjectArrived()
}
}
setTimeout(()=>{
this.tableLoading=false
},1500);
},
changeTaskTab(tab){
if (tab.name == '1') {
this.initNormalTask()
this.initTaskTableData()
}
if (tab.name == '2') {
this.initIgnoreTask();
}
},
initNormalTask(){
this.normalTaskTable=[]
let ignoreTypeList = getStore({name:"myTaskTable_ignore"})
for (let item of this.allTaskTable) {
if (!ignoreTypeList||!ignoreTypeList.includes(item.type)) {
this.normalTaskTable.push(item)
}
}
this.initIgnoreTask();
},
initIgnoreTask(){
this.ignoreTask=[]
//存在忽略的订阅任务 则清除数据
let ignoreTypeList = getStore({name:"myTaskTable_ignore"})
for (let item of this.allTaskTable) {
if (ignoreTypeList && ignoreTypeList.includes(item.type)) {
this.ignoreTask.push(item)
}
}
},
//任务查询集合 start
getStuLeaveData() {
getStuLeaveApplyTask({}).then(response => {
this.taskNumMap['1']=response.data.data.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data, "1")
})
},
getClassLeaveData(){
getClassLeaveApplyTask().then(response=>{
this.taskNumMap['2']=response.data.data.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data, "2")
})
},
getDormApply(){
getDormLiveApplyTask().then(response => {
this.taskNumMap['3']=response.data.data.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data, "3")
})
},
getCompanyChangeTask(){
taskApi.fetchList({"current":1,"size":9999,"procDefKey":"work_stu_company_change"}).then(response => {
this.taskNumMap['4']=response.data.data.records.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data.records, "4")
})
},
getBuildingAssemblyRoomApply(){
taskApi.fetchList({"current":1,"size":9999,"procDefKey":"building_assembly_room_apply"}).then(response => {
this.taskNumMap['5']=response.data.data.records.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data.records, "5")
})
},
getAssesstsTransferTask(){
taskApi.fetchList({"current":1,"size":9999,"procDefKey":"assetsTransfer"}).then(response => {
this.taskNumMap['6']=response.data.data.records.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data.records, "6")
})
},
getAssetBfList(){
taskApi.fetchList({"current":1,"size":9999,"procDefKey":"asset_invalid"}).then(response => {
this.taskNumMap['7']=response.data.data.records.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data.records, "7")
})
},
getYbFData(){
let page={currentPage:1,pageSize:10}
hasTimeOut(Object.assign({
current: page.currentPage,
size: page.pageSize
}, {})).then(response => {
this.taskNumMap['8']=response.data.data.total
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumenForLength(response.data.data.total, "8")
})
},
getAssetInList(){
let page={currentPage:1,pageSize:10}
fetchListPage(Object.assign({
current: page.currentPage,
size: page.pageSize
}, {})).then(response => {
this.taskNumMap['9']=response.data.data.total
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumenForLength(response.data.data.total, "9")
})
},
getAssetOutList(){
let page={currentPage:1,pageSize:10}
pageIndex(Object.assign({
current: page.currentPage,
size: page.pageSize
}, {})).then(response => {
this.taskNumMap['10']=response.data.data.total
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumenForLength(response.data.data.total, "10")
})
},
getPurchaseList(){
taskApi.fetchList({"current":1,"size":9999,"procDefKey":"process"}).then(response => {
this.taskNumMap['11']=response.data.data.records.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data.records, "11")
})
},
getPruchaseWarningList(){
taskApi.fetchList({"current":1,"size":9999,"procDefKey":"processWander"}).then(response => {
this.taskNumMap['12']=response.data.data.records.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data.records, "12")
})
},
getPurchaseLyysData(){
waitingList().then(response => {
this.taskNumMap['13']=response.data.data.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data, "13")
});
},
getSchoolBully(){
let page={currentPage:1,pageSize:10}
fetchList(Object.assign({
current: page.currentPage,
size: page.pageSize
}, {isContact:0})).then(response => {
this.taskNumMap['14']=response.data.data.total
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumenForLength(response.data.data.total, "14")
})
},
getTrainProjectApply(){
taskApi.fetchList({"current":1,"size":9999,"procDefKey":"train_project_approval"}).then(response => {
this.taskNumMap['15']=response.data.data.records.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data.records, "15")
})
},
getTrainProjectArrived(){
taskApi.fetchList({"current":1,"size":9999,"procDefKey":"train_project_money_arrived"}).then(response => {
this.taskNumMap['16']=response.data.data.records.length
//忽略 没有任务数的 订阅任务
this.removeTaskTableColumen(response.data.data.records, "16")
})
},
removeTaskTableColumen( data,targetType){
if (data.length > 0) {
for (let index in this.normalTaskTable) {
if (this.normalTaskTable[index].type == targetType) {
this.tableData.push(this.normalTaskTable[index])
}
}
}
},
removeTaskTableColumenForLength( dataLength,targetType){
if (dataLength >0) {
for (let index in this.normalTaskTable) {
if (this.normalTaskTable[index].type == targetType) {
this.tableData.push(this.normalTaskTable[index])
}
}
}
},
handleShowDetail(row){
if (row.type == '1') {
this.$refs.stuApplyRef.handleShowList();
}
if (row.type == '2') {
this.$refs.classLeaveRef.handleShowList();
}
if (row.type == '3') {
this.$refs.dormLiveApplyRef.handleShowList();
}
if (row.type == '4') {
this.$refs.companyChangeRef.handleShowList();
}
if (row.type == '5') {
this.$refs.buildingAssemblyRoomApplyRef.handleShowList();
}
if (row.type == '6') {
this.$refs.assetDB.handleShowList();
}
if (row.type == '7') {
this.$refs.assetBF.handleShowList();
}
if (row.type == '8') {
this.$refs.assetYBF.handleShowList();
}
if (row.type == '9') {
this.$refs.assetIn.handleShowList();
}
if (row.type == '10') {
this.$refs.assetOut.handleShowList();
}
if (row.type == '11') {
this.$refs.purchasingrequisition.handleShowList();
}
if (row.type == '12') {
this.$refs.purchasingwander.handleShowList();
}
if (row.type == '13') {
this.$refs.purchasinglyys.handleShowList();
}
if (row.type == '14') {
this.$refs.schoolBully.handleShowList();
}
if (row.type == '15') {
this.$refs.trainProjectApplyRef.handleShowList();
}
if (row.type == '16') {
this.$refs.trainProjectArrivedApplyRef.handleShowList();
}
},
handleIgnoreTask(row,index){
let ignoreTypeList = getStore({name:"myTaskTable_ignore"})
if (undefined == ignoreTypeList) {
ignoreTypeList = [];
}
ignoreTypeList.push(row.type);
setStore({name:"myTaskTable_ignore",content:ignoreTypeList, type: "session"});
this.tableData.splice(index,1)
},
handleCancleIgnore(row,index){
let ignoreTask = getStore({name:"myTaskTable_ignore"})
if (ignoreTask) {
let index=ignoreTask.indexOf(row.type)
ignoreTask.splice(index,1)
}
setStore({name:"myTaskTable_ignore",content:ignoreTask, type: "session"});
this.ignoreTask.splice(index,1)
},
handleClick(){
},
closeByMask() {
if (this.maskClosable) {
this.$emit('update:visible', false); // 支持 .sync 修饰符
this.$emit('close', 'mask');
}
},
closeByButton() {
this.$emit('update:visible', false);
this.$emit('close', 'button');
}
}
};
</script>
<style scoped>
.drawer-container {
font-family: inherit; /* 继承 Element UI 的字体 */
}
.drawer-mask {
//position: fixed;
//top: 0;
//left: 0;
//width: 100%;
//height: 100%;
//background-color: rgba(0, 0, 0, 0.5);
//z-index: 2000; /* 确保遮罩层在抽屉之下,但在其他页面内容之上 */
//transition: opacity 0.3s ease;
}
.drawer-mask-show {
opacity: 1;
}
.drawer-mask-hide {
opacity: 0;
pointer-events: none; /* 隐藏时不允许交互 */
}
.drawer-main {
position: fixed;
z-index: 2001; /* 在遮罩层之上 */
background: #fff;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
overflow: hidden;
display: flex;
flex-direction: column;
}
.drawer-right {
top: 65%;
right: 0;
height: 34%;
transform: translateX(100%);
}
.drawer-left {
top: 0;
left: 0;
height: 30%;
transform: translateX(-100%);
}
.drawer-top {
top: 0;
left: 0;
width: 100%;
transform: translateY(-100%);
}
.drawer-bottom {
bottom: 0;
left: 0;
width: 100%;
transform: translateY(100%);
}
.drawer-main-show {
transform: translateX(0) translateY(0); /* 显示时复位 */
opacity: 1;
}
.drawer-main-hide {
/* 根据方向隐藏 */
opacity: 0;
pointer-events: none;
}
.drawer-right.drawer-main-hide {
transform: translateX(100%);
}
.drawer-left.drawer-main-hide {
transform: translateX(-100%);
}
.drawer-top.drawer-main-hide {
transform: translateY(-100%);
}
.drawer-bottom.drawer-main-hide {
transform: translateY(100%);
}
.drawer-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 10px;
border-bottom: 1px solid #ebeef5;
font-size: 14px;
font-weight: bold;
color: #303133;
flex-shrink: 0; /* 防止头部被压缩 */
}
.drawer-title {
line-height: 1;
}
.drawer-close-btn {
padding: 0;
margin-left: auto; /* 将关闭按钮推到右侧 */
}
.drawer-body {
flex: 1; /* 占据剩余空间 */
padding: 10px;
overflow-y: auto; /* 内容过多时允许滚动 */
}
</style>