讲师管理bug

This commit is contained in:
zhangsir
2024-12-30 17:42:03 +08:00
parent a5bc33d5c7
commit 6ca854aab1
4 changed files with 109 additions and 29 deletions

View File

@@ -22,9 +22,9 @@
<div class="item"> <div class="item">
<a-input @pressEnter="searchData(true)" style="border-radius: 8px;width:240px;height: 40px;" v-model:value="nameUserNo" placeholder="请输入工号/讲师名称进行搜索" allowClear /> <a-input @pressEnter="searchData(true)" style="border-radius: 8px;width:240px;height: 40px;" v-model:value="nameUserNo" placeholder="请输入工号/讲师名称进行搜索" allowClear />
</div> </div>
<!-- <div class="item"> <div class="item">
<a-range-picker format="YYYY-MM-DD" valueFormat="YYYY-MM-DD" style="border-radius: 8px;width:360px;height: 40px;" v-model:value="dateValue" /> <a-range-picker format="YYYY-MM-DD" valueFormat="YYYY-MM-DD" style="border-radius: 8px;width:360px;height: 40px;" v-model:value="dateValue" />
</div> --> </div>
<div class="item"> <div class="item">
<a-button type="primary" @click="searchData(true)" style="margin-right:20px;border-radius:8px;width: 100px;height: 40px;">搜索</a-button> <a-button type="primary" @click="searchData(true)" style="margin-right:20px;border-radius:8px;width: 100px;height: 40px;">搜索</a-button>
<a-button type="primary" @click="resetData()" style="border-radius:8px;width: 100px;height: 40px;">重置</a-button> <a-button type="primary" @click="resetData()" style="border-radius:8px;width: 100px;height: 40px;">重置</a-button>
@@ -34,7 +34,7 @@
<a-table <a-table
ref="drawerContent" ref="drawerContent"
:columns="columns" :columns="columns"
:data-source="tableData" :data-source="searchTrue?timesList:tableData"
:pagination="false" :pagination="false"
:scroll="{ x: 'max-content',y:tableData.length? pageHeight : null }" :scroll="{ x: 'max-content',y:tableData.length? pageHeight : null }"
row-key="id" row-key="id"
@@ -87,6 +87,7 @@ const pageHeight = computed(() => {
watch(()=>props.visible,(val)=>{ watch(()=>props.visible,(val)=>{
if(val){ if(val){
loading.value = true loading.value = true
tableData.value = []
api.getListByStatus().then(res=>{ api.getListByStatus().then(res=>{
if(res.data.code == 200 ){ if(res.data.code == 200 ){
tableData.value = res.data.data tableData.value = res.data.data
@@ -96,7 +97,6 @@ watch(()=>props.visible,(val)=>{
loading.value = false loading.value = false
}).catch(err=>{ }).catch(err=>{
loading.value = false loading.value = false
tableData.value = []
message.error(err.data.msg) message.error(err.data.msg)
}) })
}else{ }else{
@@ -110,6 +110,7 @@ const nameUserNo = ref(null)
const dateValue = ref(null) const dateValue = ref(null)
const searchTrue = ref(false) const searchTrue = ref(false)
const searchList = ref([]) const searchList = ref([])
const timesList = ref([])
const resetData = () => { const resetData = () => {
nameUserNo.value = null nameUserNo.value = null
dateValue.value = null dateValue.value = null
@@ -120,26 +121,45 @@ const searchData = (val) => {
searchTrue.value = val searchTrue.value = val
if(!nameUserNo.value&&!dateValue.value){ if(!nameUserNo.value&&!dateValue.value){
searchList.value = []; searchList.value = [];
timesList.value = tableData.value
return return
} }
//搜索 数组expenseList.value 参数名字或者工号nameUserNo.value 日期dateValue.value //搜索 数组expenseList.value 参数名字或者工号nameUserNo.value 日期dateValue.value
const filteredList = tableData.value.filter(item => { // const filteredList = tableData.value.filter(item => {
const isNameMatch = (item.name + item.userNo).includes(nameUserNo.value); // const isNameMatch = (item.name + item.userNo).includes(nameUserNo.value);
// const teachingDateTimestamp = new Date(item.teachingDate).getTime();
// if(dateValue.value==null){
// return isNameMatch
// }
// const startDateTimestamp = new Date(dateValue.value[0]).getTime();
// const endDateTimestamp = new Date(dateValue.value[1]).getTime();
// const isDateInRange = teachingDateTimestamp >= startDateTimestamp && teachingDateTimestamp <= endDateTimestamp;
// if(nameUserNo.value&&startDateTimestamp&&endDateTimestamp){
// return isNameMatch && isDateInRange;
// }
// return isNameMatch || isDateInRange;
// });
const timesLists = tableData.value.filter(item => {
const teachingDateTimestamp = new Date(item.teachingDate).getTime(); const teachingDateTimestamp = new Date(item.teachingDate).getTime();
if(dateValue.value==null){ if(dateValue.value==null){
return isNameMatch return tableData.value
} }
const startDateTimestamp = new Date(dateValue.value[0]).getTime(); const startDateTimestamp = new Date(dateValue.value[0]).getTime();
const endDateTimestamp = new Date(dateValue.value[1]).getTime(); const endDateTimestamp = new Date(dateValue.value[1]).getTime();
const isDateInRange = teachingDateTimestamp >= startDateTimestamp && teachingDateTimestamp <= endDateTimestamp; const isDateInRange = teachingDateTimestamp >= startDateTimestamp && teachingDateTimestamp <= endDateTimestamp;
if(nameUserNo.value&&startDateTimestamp&&endDateTimestamp){ return isDateInRange;
return isNameMatch && isDateInRange; });
} selectedRowKeys.value = selectedRowKeys.value.filter(id =>
return isNameMatch || isDateInRange; timesLists.some(item => item.id === id)
);
const filteredList = timesLists.filter(item => {
const isNameMatch = (item.name + item.userNo).includes(nameUserNo.value);
return isNameMatch
}); });
searchList.value = filteredList; searchList.value = filteredList;
timesList.value = timesLists
let scrollHeight = null let scrollHeight = null
filteredList.length && (scrollHeight = tableData.value.findIndex(item => item.id === filteredList[0].id)) filteredList.length && (scrollHeight = timesLists.findIndex(item => item.id === filteredList[0].id))
if(scrollHeight||scrollHeight==0){ if(scrollHeight||scrollHeight==0){
drawerContent.value?.$el.querySelector('.ant-table-body')?.scrollTo({top:scrollHeight*55,behavior: 'smooth'}) drawerContent.value?.$el.querySelector('.ant-table-body')?.scrollTo({top:scrollHeight*55,behavior: 'smooth'})
} }

View File

@@ -25,7 +25,7 @@
</div> </div>
<div class="right"> <div class="right">
<div class="org" :title="item?.trainOrgName">{{item?.trainOrgName||'-'}}</div> <div class="org" :title="item?.trainOrgName">{{item?.trainOrgName||'-'}}</div>
<div class="text org" :title="item?.summaryTotal">{{item?.summaryTotal?item?.summaryTotal+'元':'-'}}</div> <div class="text org" :title="Number(item?.summaryTotal).toFixed(2)">{{item?.summaryTotal?Number(item?.summaryTotal).toFixed(2)+'元':'-'}}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -46,7 +46,7 @@
<a-table <a-table
ref="drawerContent" ref="drawerContent"
:columns="columns" :columns="columns"
:data-source="expenseList" :data-source="searchTrue?timesList:expenseList"
:pagination="false" :pagination="false"
:scroll="{ x: 'max-content',y:expenseList.length? pageHeight : null }" :scroll="{ x: 'max-content',y:expenseList.length? pageHeight : null }"
:loading="loadingData" :loading="loadingData"
@@ -141,6 +141,12 @@ const handleConfirm = () => {
// numTime.value+=1 // numTime.value+=1
// localStorage.setItem('numTime',numTime.value) // localStorage.setItem('numTime',numTime.value)
const ids = forData.value.flatMap(item => item.expenseList.map(item => item.id)); const ids = forData.value.flatMap(item => item.expenseList.map(item => item.id));
// let ids = []
// if(searchTrue.value){
// ids = timesList.value.map(item=>item.id)
// }else{
// ids = expenseList.value.map(item=>item.id)
// }
if(!ids.length){ if(!ids.length){
return message.error('暂无可提交的数据') return message.error('暂无可提交的数据')
} }
@@ -171,6 +177,7 @@ const forData = ref()
const indexList = ref(0) const indexList = ref(0)
const expenseList = ref([]) const expenseList = ref([])
const searchList = ref([]) const searchList = ref([])
const timesList = ref([])
const clickItem = (item,i) => { const clickItem = (item,i) => {
expenseList.value = item.expenseList expenseList.value = item.expenseList
indexList.value = i indexList.value = i
@@ -182,6 +189,8 @@ const pageHeight = computed(() => {
watch(()=>props.visible,(val)=>{ watch(()=>props.visible,(val)=>{
if(val){ if(val){
loadingData.value = true loadingData.value = true
forData.value = []
expenseList.value = []
// numTime.value = Number(localStorage.getItem('numTime')||0) // numTime.value = Number(localStorage.getItem('numTime')||0)
api.getListByAffiliation( api.getListByAffiliation(
{ {
@@ -200,8 +209,6 @@ watch(()=>props.visible,(val)=>{
}).catch(()=>{ }).catch(()=>{
message.error('获取数据失败,请重新尝试') message.error('获取数据失败,请重新尝试')
loadingData.value = false loadingData.value = false
forData.value = []
expenseList.value = []
}) })
}else{ }else{
nameUserNo.value = null nameUserNo.value = null
@@ -222,7 +229,8 @@ const removeId = (e,i) =>{
}) })
}) })
if(searchTrue.value){ if(searchTrue.value){
searchList.value = searchList.value.filter(item=>item.id !== e.id) // searchList.value = searchList.value.filter(item=>item.id !== e.id)
timesList.value = timesList.value.filter(item=>item.id !== e.id)
expenseList.value = expenseList.value.filter(item=>item.id !== e.id) expenseList.value = expenseList.value.filter(item=>item.id !== e.id)
}else{ }else{
expenseList.value = expenseList.value.filter(item=>item.id !== e.id) expenseList.value = expenseList.value.filter(item=>item.id !== e.id)
@@ -250,26 +258,44 @@ const searchData = (val) => {
searchTrue.value = val searchTrue.value = val
if(!nameUserNo.value&&!dateValue.value){ if(!nameUserNo.value&&!dateValue.value){
searchList.value = []; searchList.value = [];
timesList.value = expenseList.value
forData.value[indexList.value].summaryTotal = expenseList.value.reduce((sum, item) => sum + (Number(item.expense) || 0), 0);
return return
} }
//搜索 数组expenseList.value 参数名字或者工号nameUserNo.value 日期dateValue.value //搜索 数组expenseList.value 参数名字或者工号nameUserNo.value 日期dateValue.value
const filteredList = expenseList.value.filter(item => { // const filteredList = expenseList.value.filter(item => {
const isNameMatch = (item.name + item.userNo).includes(nameUserNo.value); // const isNameMatch = (item.name + item.userNo).includes(nameUserNo.value);
// const teachingDateTimestamp = new Date(item.teachingDate).getTime();
// if(dateValue.value==null){
// return isNameMatch
// }
// const startDateTimestamp = new Date(dateValue.value[0]).getTime();
// const endDateTimestamp = new Date(dateValue.value[1]).getTime();
// const isDateInRange = teachingDateTimestamp >= startDateTimestamp && teachingDateTimestamp <= endDateTimestamp;
// if(nameUserNo.value&&startDateTimestamp&&endDateTimestamp){
// return isNameMatch && isDateInRange;
// }
// return isNameMatch || isDateInRange;
// });
const timesLists = expenseList.value.filter(item => {
const teachingDateTimestamp = new Date(item.teachingDate).getTime(); const teachingDateTimestamp = new Date(item.teachingDate).getTime();
if(dateValue.value==null){ if(dateValue.value==null){
return isNameMatch return expenseList.value
} }
const startDateTimestamp = new Date(dateValue.value[0]).getTime(); const startDateTimestamp = new Date(dateValue.value[0]).getTime();
const endDateTimestamp = new Date(dateValue.value[1]).getTime(); const endDateTimestamp = new Date(dateValue.value[1]).getTime();
const isDateInRange = teachingDateTimestamp >= startDateTimestamp && teachingDateTimestamp <= endDateTimestamp; const isDateInRange = teachingDateTimestamp >= startDateTimestamp && teachingDateTimestamp <= endDateTimestamp;
if(nameUserNo.value&&startDateTimestamp&&endDateTimestamp){ return isDateInRange;
return isNameMatch && isDateInRange; });
} const filteredList = timesLists.filter(item => {
return isNameMatch || isDateInRange; const isNameMatch = (item.name + item.userNo).includes(nameUserNo.value);
return isNameMatch
}); });
searchList.value = filteredList; searchList.value = filteredList;
timesList.value = timesLists
forData.value[indexList.value].summaryTotal = timesLists.reduce((sum, item) => sum + (Number(item.expense) || 0), 0);
let scrollHeight = null let scrollHeight = null
filteredList.length && (scrollHeight = expenseList.value.findIndex(item => item.id === filteredList[0].id)) filteredList.length && (scrollHeight = timesLists.findIndex(item => item.id === filteredList[0].id))
if(scrollHeight||scrollHeight==0){ if(scrollHeight||scrollHeight==0){
drawerContent.value?.$el.querySelector('.ant-table-body')?.scrollTo({top:scrollHeight*55,behavior: 'smooth'}) drawerContent.value?.$el.querySelector('.ant-table-body')?.scrollTo({top:scrollHeight*55,behavior: 'smooth'})
} }
@@ -446,9 +472,16 @@ const columns = [
const closeDrawer = () => emit("update:visible", false); const closeDrawer = () => emit("update:visible", false);
const qureyDrawer = () => { const qureyDrawer = () => {
const ids = forData.value.flatMap(item => item.expenseList.map(item => item.id)); const ids = forData.value.flatMap(item => item.expenseList.map(item => item.id));
// let ids = []
// if(searchTrue.value){
// ids = timesList.value.map(item=>item.id)
// }else{
// ids = expenseList.value.map(item=>item.id)
// }
if(!ids.length){ if(!ids.length){
return message.error('暂无可提交的数据') return message.error('暂无可提交的数据')
} }
console.log(ids,'idssssss')
dialog({ dialog({
content: '是否确认讲师费信息无误?提交后按“培训发生组织”汇总至审批中心,等待验证后“提交”进入审批流程。', content: '是否确认讲师费信息无误?提交后按“培训发生组织”汇总至审批中心,等待验证后“提交”进入审批流程。',
ok: () => { ok: () => {
@@ -471,6 +504,15 @@ const config = () => {
message.error('暂无可提交的数据') message.error('暂无可提交的数据')
return return
} }
// let ids = []
// if(searchTrue.value){
// ids = timesList.value.map(item=>item.id)
// }else{
// ids = expenseList.value.map(item=>item.id)
// }
// if(!ids.length){
// return message.error('暂无可提交的数据')
// }
modalVisible.value = true; modalVisible.value = true;
} }
</script> </script>
@@ -686,11 +728,13 @@ const config = () => {
padding-bottom: 80px; padding-bottom: 80px;
.top{ .top{
display: flex; display: flex;
flex-wrap: wrap;
align-items: center; align-items: center;
margin-bottom: 20px; // margin-bottom: 20px;
margin-top: 10px; margin-top: 10px;
.item{ .item{
margin-right: 20px; margin-right: 20px;
margin-bottom: 20px;
} }
} }
.table{ .table{

View File

@@ -1,6 +1,8 @@
<template> <template>
<a-drawer class="largeDrawerInside" :visible="visible" placement="right" :closable="false" :maskClosable="false" <a-drawer class="largeDrawerInside" :visible="visible" placement="right" :closable="false" :maskClosable="false"
width="60%" :title="false"> width="60%" :title="false">
<div v-if="mask" style="width:100%;height:100%;background:rgba(0, 0, 0, 0.45);position: fixed;
z-index: 999;"></div>
<div class="appedit"> <div class="appedit">
<div class="header" style="margin-top: -24px;"> <div class="header" style="margin-top: -24px;">
<div class="headerTitle">汇总讲师费</div> <div class="headerTitle">汇总讲师费</div>
@@ -457,6 +459,7 @@ export default {
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
const state = reactive({ const state = reactive({
mask: false,
orgList: [], orgList: [],
params: { params: {
pageNo: 1, pageNo: 1,
@@ -517,6 +520,7 @@ export default {
}) })
const getTableList = () => { const getTableList = () => {
state.loading = true state.loading = true
state.mask = true
queryExpnseByBillId({ queryExpnseByBillId({
billId: props.id, billId: props.id,
pageNo: state.params.pageNo, pageNo: state.params.pageNo,
@@ -528,6 +532,11 @@ export default {
state.dataList = res.data.data.records state.dataList = res.data.data.records
state.params.total = Number(res.data.data.total); state.params.total = Number(res.data.data.total);
state.loading = false state.loading = false
state.mask = false
}).catch(err=>{
state.loading = false
state.mask = false
message.error(err.data?.msg)
}) })
} }
const dateChange = (e) => { const dateChange = (e) => {
@@ -576,6 +585,7 @@ export default {
state.formData = res.data.data state.formData = res.data.data
}) })
search(); search();
emits.emit('successParams',true)
}).catch(err=>{ }).catch(err=>{
message.destroy() message.destroy()
message.error(err.data.msg) message.error(err.data.msg)
@@ -779,6 +789,11 @@ export default {
closeDrawer(); closeDrawer();
} }
}).catch(err=>{ }).catch(err=>{
if(err.message=='timeout of 15000ms exceeded'){
message.destroy()
message.error('请求超时,请重试')
return
}
message.destroy() message.destroy()
message.error(err.data.msg) message.error(err.data.msg)
}) })
@@ -837,9 +852,10 @@ export default {
}).then(res=>{ }).then(res=>{
message.success('移除成功') message.success('移除成功')
search() search()
emits.emit('successParams',true)
state.formData.summaryTotal = (Number(state.formData.summaryTotal) - Number(record.expense)).toFixed(2) state.formData.summaryTotal = (Number(state.formData.summaryTotal) - Number(record.expense)).toFixed(2)
}).catch(err=>{ }).catch(err=>{
message.error(err.msg) message.error(err.data?.msg)
}) })
} }
}) })

View File

@@ -1179,7 +1179,7 @@ getAllLevelList().then((res) => {
} }
//一键确认讲师费 //一键确认讲师费
const handleTeacher =()=>{ const handleTeacher =()=>{
// state.visibleConfirm = true state.visibleConfirm = true
} }
async function validateField(name) { async function validateField(name) {
return new Promise((resolve) => { return new Promise((resolve) => {