Merge branch 'zcwy-teacher-manage' into master_1202

This commit is contained in:
joshen
2024-12-26 18:20:03 +08:00
20 changed files with 564 additions and 225 deletions

View File

@@ -71,6 +71,8 @@ export const getApprovalResultByApprovalIdList = (approvalId) => http.post(`/adm
export const recovery = (id) => http.post(`/admin/affiliation/recovery?id=${id}`)
//删除培训发生组织
export const affiliationDelById = (id)=>http.post(`/admin/affiliation/delById?id=${id}`)
//停用启用培训发生组织
export const isEnable = (obj) => http.post(`/admin/affiliation/isEnable`,obj)
//撤回培训发生组织
export const affiliatIsConfirm = (id) => http.post(`/admin/affiliation/isConfirm?id=${id}`)
//讲师费统计详情

View File

@@ -43,6 +43,8 @@ export const queryTeacherFeeTotalList= (obj) => http.post('/teacher/fee/queryTea
export const getPreviousTeacherFee= (obj) => http.post('/teacher/fee/getPreviousTeacherFee',obj)
//汇总上月讲师费月度数据
export const CreateMonthSummary= (obj) => http.post('/admin/expenseSummary/createMonthSummary',obj)
//是否显示重汇按钮
export const isShowReimport= () => http.get('/admin/expenseSummary/isAdmin')
//讲师费统计列表
export const expenseSummaryList= (obj) => http.get('/admin/expenseSummary/list',{params:obj})
//提交/撤回

View File

@@ -295,7 +295,7 @@ import {getCookieForName} from "@/api/method";
}
};
function downTemplate() {
window.open(`${process.env.VUE_APP_BASE}/template/${props.template}.xlsx`);
window.open(`${process.env.VUE_APP_BOE_API_URL}/upload/template/${props.template}`);
}
return {

View File

@@ -93,7 +93,7 @@ import * as lecturerApi from "@/api/Lecturer.js";
notLists?.value?.some(i=>{
if(i.orgId == item.id){
item.disabled = true
item.name = item.name + '(' + i.orgName + ')'
item.name = item.name + '(' + i.affiliationName + ')'
return true
}
})
@@ -129,7 +129,7 @@ import * as lecturerApi from "@/api/Lecturer.js";
notLists.value.some(i=>{
if(i.orgId == item.id){
item.disabled = true
item.name = item.name + '(' + i.orgName + ')'
item.name = item.name + '(' + i.affiliationName + ')'
return true
}
})

View File

@@ -4,7 +4,7 @@
:closable="false"
class="largeDrawerInside"
placement="right"
width="70%"
width="80%"
>
<div class="drawerMains">
<div class="headers" style="margin-top:-24px;">
@@ -22,9 +22,9 @@
<div class="item">
<a-input @pressEnter="searchData(true)" style="border-radius: 8px;width:240px;height: 40px;" v-model:value="nameUserNo" placeholder="请输入工号/讲师名称进行搜索" allowClear />
</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" />
</div>
</div> -->
<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="resetData()" style="border-radius:8px;width: 100px;height: 40px;">重置</a-button>
@@ -32,13 +32,15 @@
</div>
<div class="table" style="padding-bottom:72px;">
<a-table
ref="drawerContent"
:columns="columns"
:data-source="searchTrue?searchList:tableData"
:data-source="tableData"
:pagination="false"
:scroll="{ x: 'max-content' }"
:scroll="{ x: 'max-content',y:tableData.length? pageHeight : null }"
row-key="id"
:loading="loading"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
:custom-row="customRow"
>
<template #action="{ record }">
<div class="action">
@@ -71,6 +73,17 @@ const props = defineProps({
default: ""
}
});
const drawerContent = ref(null)
const customRow = (record) => {
return {
style:{
backgroundColor: searchTrue.value && searchList.value.some(item => item.id === record.id) ? '#a6dff9' : '',
},
};
};
const pageHeight = computed(() => {
return window.innerHeight - 360
});
watch(()=>props.visible,(val)=>{
if(val){
loading.value = true
@@ -82,12 +95,15 @@ watch(()=>props.visible,(val)=>{
}
loading.value = false
}).catch(err=>{
message.error(err.data.msg)
loading.value = false
tableData.value = []
message.error(err.data.msg)
})
}else{
selectedRowKeys.value = []
selectsData.value = []
drawerContent.value?.$el.querySelector('.ant-table-body')?.scrollTo({top:0,behavior: 'smooth'})
resetData()
}
})
const nameUserNo = ref(null)
@@ -100,9 +116,10 @@ const resetData = () => {
searchData(false)
}
const searchData = (val) => {
// drawerContent.value.scrollTo({top:200,behavior: 'smooth'})
searchTrue.value = val
if(!nameUserNo.value&&!dateValue.value){
searchList.value = tableData.value;
searchList.value = [];
return
}
//搜索 数组expenseList.value 参数名字或者工号nameUserNo.value 日期dateValue.value
@@ -121,6 +138,11 @@ const searchData = (val) => {
return isNameMatch || isDateInRange;
});
searchList.value = filteredList;
let scrollHeight = null
filteredList.length && (scrollHeight = tableData.value.findIndex(item => item.id === filteredList[0].id))
if(scrollHeight||scrollHeight==0){
drawerContent.value?.$el.querySelector('.ant-table-body')?.scrollTo({top:scrollHeight*55,behavior: 'smooth'})
}
}
const loading = ref(false)
const selectedRowKeys = ref([])
@@ -154,19 +176,30 @@ const columns = [
dataIndex: 'name',
key: 'name',
align: 'center',
width:100,
},
{
title: '讲师工号',
dataIndex: 'userNo',
key: 'userNo',
align: 'center',
width:100
},
{
title: '课程名称',
dataIndex: 'courseName',
key: 'courseName',
align: 'left',
width:160,
customCell :() => {return {style: {maxWidth: '200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis',cursor:'pointer'}}},
},
{
title: '所属组织',
dataIndex: 'orgName',
key: 'orgName',
align: 'center',
align: 'left',
ellipsis: true,
width:100,
customCell :() => {return {style: {maxWidth: '200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis',cursor:'pointer'}}},
},
@@ -174,13 +207,16 @@ const columns = [
title: '讲师体系',
dataIndex: 'tsystemName',
key: 'tsystemName',
align: 'center',
align: 'left',
width:100,
customCell :() => {return {style: {maxWidth: '200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis',cursor:'pointer'}}},
},
{
title: '讲师等级',
dataIndex: 'tlevelName',
key: 'tlevelName',
align: 'center',
width:100,
customRender: ({ text })=>{
return text||'-'
}
@@ -190,6 +226,7 @@ const columns = [
dataIndex: 'payrollPlace',
key: 'payrollPlace',
align: 'center',
width:120,
customRender: ({ text })=>{
return text||'-'
}
@@ -200,6 +237,7 @@ const columns = [
dataIndex: 'courseType',
key: 'courseType',
align: 'center',
width:120,
customRender: ({ text,record })=>{
switch (text) {
case 0:
@@ -217,23 +255,19 @@ const columns = [
}
}
},
{
title: '课程名称',
dataIndex: 'courseName',
key: 'courseName',
align: 'center',
},
{
title: '授课/开发课程日期',
dataIndex: 'teachingDate',
key: 'teachingDate',
align: 'center',
width:150
},
{
title: '授课/开发课程时长',
dataIndex: 'teachingTime',
key: 'teachingTime',
align: 'center',
width:150,
customRender: ({ text,record })=>{
return (text/60).toFixed(2)+'小时'
}
@@ -243,6 +277,7 @@ const columns = [
dataIndex: 'studys',
key: 'studys',
align: 'center',
width:100,
customRender: ({ text })=>{
return text||'0'
}
@@ -252,21 +287,28 @@ const columns = [
dataIndex: 'score',
key: 'score',
align: 'center',
customRender: ({ text })=>{
return text||'-'
}
width:100,
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
title: '课酬基准',
dataIndex: 'levelPay',
key: 'levelPay',
align: 'center',
width:100
},
{
title: '计划费用',
dataIndex: 'expense',
key: 'expense',
align: 'center',
width:100
},
// {
// title: '应发费用',
@@ -279,6 +321,7 @@ const columns = [
align: 'center',
fixed: 'right',
width: 100,
customCell:()=>{return {style:{background:'#fff'}}},
slots: { customRender: "action" },
},
]
@@ -299,13 +342,44 @@ const queryDrawer = () => {
</script>
<style lang="scss" scoped>
.ant-table-wrapper{
border-right: 1px solid #ecf5ff;
}
/* 重置表格行的悬停效果 */
::v-deep .ant-table-tbody > tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected) > td {
background: none;
}
// 选中鼠标划入
::v-deep .ant-table-tbody > tr.ant-table-row-selected:hover > td{
background: none ;
}
/* 未选中行的鼠标划入样式 */
::v-deep .ant-table-tbody > tr:not(.ant-table-row-selected):hover > td {
background: none;
}
/* 未选中行的鼠标划出样式 */
::v-deep .ant-table-tbody > tr:not(.ant-table-row-selected):not(:hover) > td {
background: none;
}
// 选中
::v-deep .ant-table-tbody > tr.ant-table-row-selected > td{
background: none ;
}
/* 重置表格行的选中效果 */
::v-deep .ant-table-row-selected td {
// background: none !important;
}
::v-deep .ant-table-thead > tr > th {
background-color: #eff4fc !important;
text-align: center !important;
}
.largeDrawerInside {
.drawerMains {
min-width: 600px;
// margin: 0px 32px 0px 32px;
overflow-x: auto;
height:100%;
overflow: auto;
display: flex;
flex-direction: column;
padding:24px;
@@ -319,6 +393,7 @@ const queryDrawer = () => {
margin-bottom: 20px;
.headerTitle {
margin: 24px 0;
font-size: 18px;
font-weight: 600;
color: #333333;
@@ -373,7 +448,7 @@ const queryDrawer = () => {
}
.table{
::v-deep .ant-table-cell-fix-right {
width: 160px !important;
width: 120px !important;
}
}
}

View File

@@ -4,7 +4,7 @@
:closable="false"
class="largeDrawerInside"
placement="right"
width="64%"
width="76%"
:zIndex="1001"
>
<div class="drawerMains">
@@ -30,25 +30,27 @@
</div>
</div>
<div class="box">
<!-- <div class="top">
<div class="top">
<div class="item">
<a-input @pressEnter="searchData(true)" style="border-radius: 8px;width:240px;height: 40px;" v-model:value="nameUserNo" placeholder="请输入工号/讲师名称进行搜索" allowClear />
</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" />
</div>
</div> -->
<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="resetData()" style="border-radius:8px;width: 100px;height: 40px;">重置</a-button>
</div>
</div> -->
</div>
<div class="table">
<a-table
ref="drawerContent"
:columns="columns"
:data-source="searchTrue?searchList:expenseList"
:data-source="expenseList"
:pagination="false"
:scroll="{ x: 'max-content' }"
:scroll="{ x: 'max-content',y:expenseList.length? pageHeight : null }"
:loading="loadingData"
:custom-row="customRow"
>
<template #action="{ record,index }">
<div class="action">
@@ -60,8 +62,8 @@
</div>
</div>
<div class="btnn">
<button class="btn1" @click="config">确认提交审批</button>
<button class="btn1" @click="qureyDrawer">确认至审批中心</button>
<button class="btn1" @click="config">提交审批</button>
<button class="btn1" @click="qureyDrawer">保存至审批中心</button>
<button class="btn2" @click="closeDrawer">取消</button>
</div>
</div>
@@ -174,6 +176,9 @@ const clickItem = (item,i) => {
indexList.value = i
resetData()
}
const pageHeight = computed(() => {
return window.innerHeight - 450
});
watch(()=>props.visible,(val)=>{
if(val){
loadingData.value = true
@@ -195,10 +200,14 @@ watch(()=>props.visible,(val)=>{
}).catch(()=>{
message.error('获取数据失败,请重新尝试')
loadingData.value = false
forData.value = []
expenseList.value = []
})
}else{
nameUserNo.value = null
dateValue.value = null
indexList.value = 0
drawerContent.value?.$el.querySelector('.ant-table-body')?.scrollTo({top:0,behavior: 'smooth'})
}
})
const removeId = (e,i) =>{
@@ -218,7 +227,7 @@ const removeId = (e,i) =>{
}else{
expenseList.value = expenseList.value.filter(item=>item.id !== e.id)
}
forData.value[indexList.value].summaryTotal = forData.value[indexList.value]?.summaryTotal - e.payableExpense
forData.value[indexList.value].summaryTotal = (forData.value[indexList.value]?.summaryTotal - e.expense).toFixed(2)
if(!forData.value[indexList.value].expenseList.length){
forData.value.splice(indexList.value,1)
forData.value.length > 0 && clickItem(forData.value[0],0)
@@ -229,10 +238,18 @@ const removeId = (e,i) =>{
const nameUserNo = ref(null)
const dateValue = ref(null)
const searchTrue = ref(false)
const drawerContent = ref(null)
const customRow = (record) => {
return {
style:{
backgroundColor: searchTrue.value && searchList.value.some(item => item.id === record.id) ? '#a6dff9' : '',
}
};
};
const searchData = (val) => {
searchTrue.value = val
if(!nameUserNo.value&&!dateValue.value){
searchList.value = expenseList.value;
searchList.value = [];
return
}
//搜索 数组expenseList.value 参数名字或者工号nameUserNo.value 日期dateValue.value
@@ -251,6 +268,11 @@ const searchData = (val) => {
return isNameMatch || isDateInRange;
});
searchList.value = filteredList;
let scrollHeight = null
filteredList.length && (scrollHeight = expenseList.value.findIndex(item => item.id === filteredList[0].id))
if(scrollHeight||scrollHeight==0){
drawerContent.value?.$el.querySelector('.ant-table-body')?.scrollTo({top:scrollHeight*55,behavior: 'smooth'})
}
}
const resetData = () => {
nameUserNo.value = null
@@ -264,19 +286,30 @@ const columns = [
dataIndex: 'name',
key: 'name',
align: 'center',
width:100,
},
{
title: '讲师工号',
dataIndex: 'userNo',
key: 'userNo',
align: 'center',
width:100,
},
{
title: '课程名称',
dataIndex: 'courseName',
key: 'courseName',
align: 'left',
width:160,
customCell :() => {return {style: {maxWidth: '200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis',cursor:'pointer'}}},
},
{
title: '所属组织',
dataIndex: 'orgName',
key: 'orgName',
align: 'center',
align: 'left',
ellipsis: true,
width:100,
customCell :() => {return {style: {maxWidth: '200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis',cursor:'pointer'}}},
},
@@ -284,13 +317,16 @@ const columns = [
title: '讲师体系',
dataIndex: 'tsystemName',
key: 'tsystemName',
align: 'center',
align: 'left',
width:100,
customCell :() => {return {style: {maxWidth: '200px',overflow: 'hidden',whiteSpace: 'nowrap',textOverflow:'ellipsis',cursor:'pointer'}}},
},
{
title: '讲师等级',
dataIndex: 'tlevelName',
key: 'tlevelName',
align: 'center',
width:100,
customRender: ({ text })=>{
return text||'-'
}
@@ -300,6 +336,7 @@ const columns = [
dataIndex: 'payrollPlace',
key: 'payrollPlace',
align: 'center',
width:120,
customRender: ({ text })=>{
return text||'-'
}
@@ -310,6 +347,7 @@ const columns = [
dataIndex: 'courseType',
key: 'courseType',
align: 'center',
width:120,
customRender: ({ text,record })=>{
switch (text) {
case 0:
@@ -327,23 +365,19 @@ const columns = [
}
}
},
{
title: '课程名称',
dataIndex: 'courseName',
key: 'courseName',
align: 'center',
},
{
title: '授课/开发课程日期',
dataIndex: 'teachingDate',
key: 'teachingDate',
align: 'center',
width:150,
},
{
title: '授课/开发课程时长',
dataIndex: 'teachingTime',
key: 'teachingTime',
align: 'center',
width:150,
customRender: ({ text,record })=>{
return (text/60).toFixed(2)+'小时'
}
@@ -353,6 +387,7 @@ const columns = [
dataIndex: 'studys',
key: 'studys',
align: 'center',
width:100,
customRender: ({ text })=>{
return text||'0'
}
@@ -362,21 +397,28 @@ const columns = [
dataIndex: 'score',
key: 'score',
align: 'center',
customRender: ({ text })=>{
return text||'-'
}
width:100,
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
title: '课酬基准',
dataIndex: 'levelPay',
key: 'levelPay',
align: 'center',
width:100,
},
{
title: '计划费用',
dataIndex: 'expense',
key: 'expense',
align: 'center',
width:100,
},
// {
// title: '应发费用',
@@ -388,6 +430,8 @@ const columns = [
title: '操作',
align: 'center',
fixed: 'right',
width:100,
customCell:()=>{return {style:{background:'#fff'}}},
slots: { customRender: "action" },
},
]
@@ -424,6 +468,23 @@ const config = () => {
</script>
<style lang="scss" scoped>
/* 重置表格行的悬停效果 */
::v-deep .ant-table-tbody > tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected) > td {
background: none;
}
/* 未选中行的鼠标划入样式 */
::v-deep .ant-table-tbody > tr:not(.ant-table-row-selected):hover > td {
background: none;
}
/* 未选中行的鼠标划出样式 */
::v-deep .ant-table-tbody > tr:not(.ant-table-row-selected):not(:hover) > td {
background: none;
}
::v-deep .ant-table-thead > tr > th {
background-color: #eff4fc !important;
text-align: center !important;
}
.delete {
min-width: 424px;
background: #ffffff;
@@ -541,7 +602,8 @@ const config = () => {
.drawerMains {
min-width: 600px;
// margin: 0px 32px 0px 32px;
overflow-x: auto;
height:100%;
overflow: auto;
display: flex;
flex-direction: column;
padding:24px;
@@ -555,6 +617,7 @@ const config = () => {
margin-bottom: 20px;
.headerTitle {
margin: 24px 0;
font-size: 18px;
font-weight: 600;
color: #333333;
@@ -624,7 +687,7 @@ const config = () => {
}
.table{
::v-deep .ant-table-cell-fix-right {
width: 160px !important;
width: 120px !important;
}
}
}

View File

@@ -227,6 +227,13 @@ export default{
key: 'score',
ellipsis: true, align: "center",
width: 120,
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
title: '开课状态',
@@ -240,7 +247,7 @@ export default{
{value.record.courseStatus == 0 || value.record.courseStatus == 1
? {
"0": "未开课",
"1": "开课",
"1": "开课",
}[value.record.courseStatus + ""] || ""
: "-"}
</div>

View File

@@ -290,6 +290,13 @@ export default{
key: 'score',
ellipsis: true, align: "center",
width: 120,
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
title: '开课状态',
@@ -303,7 +310,7 @@ export default{
{value.record.courseStatus == 0 || value.record.courseStatus == 1
? {
"0": "未开课",
"1": "开课",
"1": "开课",
}[value.record.courseStatus + ""] || ""
: "-"}
</div>

View File

@@ -64,11 +64,11 @@
<a-tab-pane key="2" tab="审批记录" force-render>
<div style="margin-bottom: 20px">
<a-table :columns="columnsTwo" :loading="formData?.loadingTwo" :data-source="formData?.tableDataTwo" :pagination="pagination">
<template #action="{ record }">
<!-- <template #action="{ record }">
<div class="action">
<div style="color: #1890ff;cursor: pointer;" class="btn" @click="lookList(record)">查看</div>
</div>
</template>
</template> -->
</a-table>
</div>
<!-- <div style="margin-bottom: 100px">
@@ -244,18 +244,18 @@ const columnsTwo = ref([
}
},
{
title: '审批人',
title: '提交人',
dataIndex: 'employeeName',
key: 'employeeName',
align: 'center',
},
{
title: '操作',
dataIndex: 'address',
key:'age',
align: 'center',
slots: { customRender: "action" },
}
// {
// title: '操作',
// dataIndex: 'address',
// key:'age',
// align: 'center',
// slots: { customRender: "action" },
// }
])
const approvalData = ref(null)
const threeList = ref(false)

View File

@@ -4080,7 +4080,7 @@ function onFocusEnd(){
editPlan(postData)
.then((res) => {
if(res.data.code == 200){
getTableDate3();
handleSearchTable();
handleCancelStu();
rest();
}else{
@@ -4089,6 +4089,7 @@ function onFocusEnd(){
state.addLoading = false;
})
.catch((err) => {
handleSearchTable();
message.destroy()
message.error(err.data.msg)
state.addLoading = false;
@@ -4474,9 +4475,13 @@ function onFocusEnd(){
dialog({
content: "确定撤回吗?",
ok: () => {
message.success("撤回成功");
record.publishStatus ? (state.tableData1[index].publishStatus = 0) : (state.tableData1[index].auditStatus = 0);
handle({ offcourseId: id, type: 0 });
handle({ offcourseId: id, type: 0 }).then(res=>{
message.success("撤回成功");
record.publishStatus ? (state.tableData1[index].publishStatus = 0) : (state.tableData1[index].auditStatus = 0);
}).catch(err=>{
message.destroy();
message.error(err.data.msg);
})
},
});
};
@@ -4860,10 +4865,14 @@ function onFocusEnd(){
dialog({
content: "确定删除该课程吗?",
ok: async () => {
message.success("删除成功");
state.tableLoading = true;
await handle({ offcourseId: id, type: -1 });
getTableDate();
await handle({ offcourseId: id, type: -1 }).then(res=>{
message.success("删除成功");
state.tableLoading = true;
getTableDate();
}).catch(err=>{
message.destroy()
message.error(err.data.msg)
})
},
});
};
@@ -4912,9 +4921,14 @@ function onFocusEnd(){
dialog({
content: "确定停用该课程吗?",
ok: () => {
message.success("停用成功");
record.status = 0;
handle({ offcourseId: record.id, type: -2 });
handle({ offcourseId: record.id, type: -2 }).then(res=>{
console.log(res,'handleStop')
message.success("停用成功");
record.status = 0;
}).catch(err=>{
message.destroy()
message.error(err.data.msg)
})
},
});
};

View File

@@ -142,7 +142,7 @@
<a-row :gutter="16">
<a-col :span="24">
<a-form-item label="手机号码" name="mobile" prop="mobile">
<a-input v-model:value.trim="formParam.mobile" class="draitem"
<a-input type="number" v-model:value.trim="formParam.mobile" class="draitem"
placeholder="请输入手机号码" allowClear showSearch :maxLength="11" @blur="sendPhone">
</a-input>
</a-form-item>
@@ -155,8 +155,16 @@
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="初始授课时长" name="teaching">
<a-input v-model:value="formParam.teaching" style="width:100%; height: 40px; border-radius: 8px ; "
<a-form-item name="defaultTeachingTime">
<template v-slot:label>
<img
style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
初始授课时长
</template>
<a-input v-model:value="formParam.defaultTeachingTime" style="width:100%; height: 40px; border-radius: 8px ; "
placeholder="0" allowClear showSearch suffix="分钟" @blur="clearNonNumber" @focus="focusTeaching">
</a-input>
<!-- <span style="margin-left: 5px ;" v-if="formParam.teaching !== null">{{ (formParam.teaching / 60
@@ -316,6 +324,8 @@ export default {
const router = useRouter();
const userInfo = computed(() => store.state.userInfo);
const state = reactive({
phoneEmil: 0,
phoneEmilTwo: 0,
lookExternalVisi:false,
lookExterId: null,
currentPage1: 1,
@@ -348,7 +358,7 @@ export default {
teacherType:'2',
photo:null,
status:1,
teaching:0,
defaultTeachingTime:0,
},
vf:true,
searchParam: {
@@ -397,8 +407,8 @@ export default {
};
const AccountStatusList = ref([
{ value: '', label: "全部" },
{ value: 1, label: "启用" },
{ value: 2, label: "停用" },
{ value: '1', label: "启用" },
{ value: '2', label: "停用" },
])
const columns = ref([
{
@@ -527,6 +537,8 @@ export default {
// 新增讲师
const addTeacher = () => {
cancel()
state.phoneEmil = 0
state.phoneEmilTwo = 0
state.teacherdialog = true;
state.teacherdialogtitle = '新增讲师'
// state.formParam.photo =userInfo.value?.avatar
@@ -538,6 +550,8 @@ export default {
//修改讲师信息弹窗
const handleModify = (record) => {
state.phoneEmil = 0
state.phoneEmilTwo = 0
state.teacherdialog = true;
state.teacherdialogtitle = '编辑讲师'
state.id = record.id
@@ -558,6 +572,9 @@ export default {
//保存
const createTeacherDialog = async () => {
state.formParam.supplier = state.formParam?.supplier?.trim()
if(state.formParam.defaultTeachingTime||state.formParam.defaultTeachingTime==0){
state.formParam.defaultTeachingTime = String(state.formParam.defaultTeachingTime)
}
const formItemNames = Object.keys(rules);
for(let i=0;i<formItemNames.length;i++){
// const result = await validateField(formItemNames[i]);
@@ -566,6 +583,14 @@ export default {
return message.error(rules[formItemNames[i]][0].log)
}
}
if(state.phoneEmil){
message.destroy()
return message.warning( '手机号格式不正确')
}
if(state.phoneEmilTwo){
message.destroy()
return message.warning( '邮箱格式不正确')
}
state.formParam.description = repl(state.formParam.description)
state.formParam = {...state.formParam}
if (state.vf == false) {
@@ -624,6 +649,7 @@ export default {
}
})
.catch((err) => {
message.error(err.data.msg)
state.deleteTeacherdialog = false
});
}
@@ -669,7 +695,7 @@ export default {
status:1,
teacherType:2,
photo:null,
teaching:0,
defaultTeachingTime:0,
name: null,
mobile: null,
email: null,
@@ -684,6 +710,7 @@ export default {
const rules = {
name: [{ required: true, message: '',log: '讲师不能为空' }],
supplier:[{ required: true, message: '',log:'供应商不能为空' }],
defaultTeachingTime:[{ required: true, message: '',log:'初始授课时长不能为空' }],
// email:[
// {
// type: "email",
@@ -745,34 +772,38 @@ export default {
state.formParam.name = state.formParam?.name?.replace(/\s/g, '');
}
const sendPhone=()=>{
state.phoneEmil = 0
console.log(state.formParam.mobile)
const reg = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
if (!state.formParam.mobile) {
} else if (!reg.test(state.formParam.mobile)) {
message.warning( '手机号格式不正确')
state.formParam.mobile=''
// state.formParam.mobile=''
state.phoneEmil = 1
// state.formParam.mobile = state.formParam.mobile.replace(/\D/g, '');
}
}
const sendEmail=()=>{
state.phoneEmilTwo = 0
const reg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.\w{2,}$/;
if(!state.formParam.email){
return
}
if (!reg.test(state.formParam.email)) {
message.warning( '邮箱格式不正确')
state.formParam.email=''
// state.formParam.email=''
state.phoneEmilTwo = 2
// state.formParam.email = state.formParam.email.replace( /[\u4e00-\u9fa5]/g, '');
}
}
const clearNonNumber = () => {
state.formParam.teaching = state.formParam.teaching?.replace(/\D/g, '');
state.formParam.teaching = state.formParam.teaching?.slice(0,8)
!state.formParam.teaching && (state.formParam.teaching = 0)
state.formParam.defaultTeachingTime = state.formParam.defaultTeachingTime?.replace(/\D/g, '');
state.formParam.defaultTeachingTime = state.formParam.defaultTeachingTime?.slice(0,8)
!state.formParam.defaultTeachingTime && (state.formParam.defaultTeachingTime = 0)
}
const focusTeaching = () => {
state.formParam.teaching == 0 && (state.formParam.teaching = null)
state.formParam.defaultTeachingTime == 0 && (state.formParam.defaultTeachingTime = null)
}
const sendRemark=()=>{
state.formParam.remark = state.formParam.remark?.replace(/\s/g, '');
@@ -788,8 +819,7 @@ export default {
//导出功能
const handleExport = () => {
window.open(
`${process.env.VUE_APP_BASE_API}/admin/export/exportOutTeacher?pageNo=${state.searchParam.pageNo
}&pageSize=${state.searchParam.pageSize}&name=${state.searchParam.name ? state.searchParam.name : ""}&status=${state.searchParam.status ? state.searchParam.status : ""}`
`${process.env.VUE_APP_BASE_API}/admin/export/exportOutTeacher?name=${state.searchParam.name || ""}&status=${state.searchParam.status || ""}`
);
// this.download('lesson_records/export', {
// ...state.searchParam

View File

@@ -341,7 +341,7 @@
<span style="margin-left: 10px ;" v-if="formParam.teaching != '0'">({{ (formParam.teaching / 60
).toFixed(2) }}小时)</span>
</a-descriptions-item>
<a-descriptions-item label="评分 ">{{ formParam.score ||'-'}}</a-descriptions-item>
<a-descriptions-item label="评分 ">{{ formParam.score?Number(formParam.score).toFixed(0)==0?'-':Number(formParam.score).toFixed(0):'-'}}</a-descriptions-item>
<a-descriptions-item label="参训人数 ">{{ formParam.studys ||'-'}}</a-descriptions-item>
<a-descriptions-item label="备注 " :span="2">{{ formParam.remark ||'-' }}</a-descriptions-item>
</a-descriptions>
@@ -520,18 +520,22 @@ export default {
label:item
}
})
supperList.value.unshift({
value: '',
label: '全部'
})
}
})
}
const AuthenticationStatusList = ref([
{ value: '', label: "全部" },
{ value: 0, label: "未开课" },
{ value: 1, label: "已开课" },
{ value: '0', label: "未开课" },
{ value: '1', label: "已开课" },
])
const entryTypeList = ref([
{ value: '', label: "全部" },
{ value: 0, label: "系统生成" },
{ value: 1, label: "手动录入" },
{ value: '0', label: "系统生成" },
{ value: '1', label: "手动录入" },
])
const columns = ref([
@@ -700,6 +704,13 @@ export default {
key: 'score',
ellipsis: true, align: "center",
width: 120,
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
@@ -963,7 +974,7 @@ export default {
//导出功能
const handleExport = () => {
window.open(
`${process.env.VUE_APP_BASE_API}/admin/export/exportOutTeacherRecord?pageNo=${state.searchParam.pageNo}&pageSize=${state.searchParam.pageSize}&recordType=2&name=${state.searchParam.name ? state.searchParam.name : ""}&courseName=${state.searchParam.courseName ? state.searchParam.courseName : ""}&createFrom=${state.searchParam.createFrom ? state.searchParam.createFrom : ""}&beginTime=${state.searchParam.beginTime ? state.searchParam.beginTime : ""}&endTime=${state.searchParam.endTime ? state.searchParam.endTime : ""}&courseTypeId=${state.searchParam.courseTypeId ? state.searchParam.courseTypeId : ""}&courseStatus=${state.searchParam.courseStatus ? state.searchParam.courseStatus : ""}`
`${process.env.VUE_APP_BASE_API}/admin/export/exportOutTeacherRecord?recordType=2&name=${state.searchParam.name || ""}&courseName=${state.searchParam.courseName || ""}&createFrom=${state.searchParam.createFrom || ""}&beginTime=${state.searchParam.beginTime|| ""}&endTime=${state.searchParam.endTime || ""}&courseTypeId=${state.searchParam.courseTypeId || ""}&courseStatus=${state.searchParam.courseStatus || ""}&supplier=${state.searchParam.supplier || ""}`
);
}
const clearstudysNumber = () => {

View File

@@ -77,7 +77,7 @@
<template #bodyCell="{ record, column }">
<template v-if="column.key === 'orgName'">
<a-space style="display:flex ;justify-content: space-around; ">
<a-space style="display:flex ;justify-content: left; ">
<!-- <a-popover>
<template #content>
<p>{{ record.orgName}}</p>
@@ -674,6 +674,10 @@ export default {
array.push(obj);
});
LecturerSystemList.value = array;
LecturerSystemList.value.unshift({
value: "",
label: "全部"
})
}
})
}
@@ -706,19 +710,23 @@ export default {
array.push(obj);
});
getLevelList.value = array;
getLevelList.value.unshift({
value: "",
label: "全部"
})
}
})
}
changetlevel()
const OnTheJobStatusList = ref([
{ value:"", label: "全部" },
{ value: 0, label: "在职" },
{ value: 1, label: "离职" },
{ value: '0', label: "在职" },
{ value: '1', label: "离职" },
])
const AuthenticationStatusList = ref([
{ value: "", label: "全部" },
{ value: 0, label: "未认证" },
{ value: 1, label: "已认证" },
{ value: '0', label: "未认证" },
{ value: '1', label: "已认证" },
])
// const PlaceOfPayList = ref([
// // { value: 0, label: "发薪地B1" },
@@ -783,7 +791,7 @@ export default {
title: '所属组织 ',
dataIndex: 'orgName',
key: 'orgName',
ellipsis: true, align: "center",
ellipsis: true, align: "left",
scopedSlots: { customRender: "orgName" },
width: 200,
// customRender: (value, record) => {
@@ -798,7 +806,7 @@ export default {
title: '讲师体系 ',
dataIndex: 'tsystemName',
key: 'tsystemName',
ellipsis: true, align: "center",
ellipsis: true, align: "left",
width: 200,
},
{
@@ -1343,7 +1351,7 @@ export default {
//导出功能
const handleExport = () => {
window.open(
`${process.env.VUE_APP_BASE_API}/admin/export/exportInTeacher?pageNo=${state.searchParam.pageNo}&pageSize=${state.searchParam.pageSize}&name=${state.searchParam.name ? state.searchParam.name : ""}&tsystemId=${state.searchParam.tsystemId ? state.searchParam.tsystemId : ""}&tLevelName=${state.searchParam.tLevelName ? state.searchParam.tLevelName : "" }&waitStatus=${state.searchParam.waitStatus ? state.searchParam.waitStatus : ""}&certStatus=${state.searchParam.certStatus ? state.searchParam.certStatus : ""}&courses=${state.searchParam.courses ? state.searchParam.courses : ""}`
`${process.env.VUE_APP_BASE_API}/admin/export/exportInTeacher?name=${state.searchParam.name || ""}&tSystemId=${state.searchParam.tSystemId || ""}&tLevelName=${state.searchParam.tLevelName || "" }&waitStatus=${state.searchParam.waitStatus || ""}&certStatus=${state.searchParam.certStatus || ""}&courses=${state.searchParam.courses || ""}`
);
// this.download('lesson_records/export', {
// ...state.searchParam

View File

@@ -64,7 +64,7 @@
</a-form-item>
<!-- <div style="width: 100%;"></div> -->
<a-form-item class="select" v-if="moreid == 2">
<a-select style="min-width: 200px ; height: auto ;margin-bottom:20px" v-model:value="score" placeholder="请选择评分"
<a-select style="min-width: 200px ; height: auto ;margin-bottom:20px" v-model:value="score" placeholder="请选择评分" showArrow
:options="scoreList" allowClear showSearch mode="multiple" @change="scoreChange"
v-on:keydown.enter="enterPressHadlerSearch">
</a-select>
@@ -423,7 +423,7 @@
).toFixed(2) }}小时)</span> </a-descriptions-item>
<a-descriptions-item label="授课/课程日期 ">{{ formParam.teachingDate||'-' }}</a-descriptions-item>
<a-descriptions-item label="参训人数 ">{{ formParam.studys||'-' }}</a-descriptions-item>
<a-descriptions-item label="评分 ">{{ formParam.score||'-' }}</a-descriptions-item>
<a-descriptions-item label="评分 ">{{ formParam.score?Number(formParam.score).toFixed(0)==0?'-':Number(formParam.score).toFixed(0):'-' }}</a-descriptions-item>
<a-descriptions-item label="内容分类">{{ formParam.courseTypeName||'-' }}</a-descriptions-item>
<a-descriptions-item label="备注 ">{{ formParam.remark||'-' }}</a-descriptions-item>
</a-descriptions>
@@ -486,7 +486,7 @@
</div>
</a-modal>
</div>
<ImportWork v-model:showWork="showWork" :template="'内部授课记录导入模板'" :url="'/admin/export/importInTeacherRecord'" :title="title"></ImportWork>
<ImportWork v-model:showWork="showWork" :template="'内部讲师授课记录导入模板-20241220.xlsx'" :url="'/admin/export/importInTeacherRecord'" :title="title"></ImportWork>
<!-- <div> <Upload/> </div> -->
</div>
</template>
@@ -659,6 +659,10 @@ export default {
array.push(obj);
});
LecturerSystemList.value = array;
LecturerSystemList.value.unshift({
value: '',
label: '全部'
})
}
console.log("获取讲师", LecturerSystemList);
})
@@ -678,13 +682,13 @@ export default {
])
const AuthenticationStatusList = ref([
{ value: '', label: "全部" },
{ value: 0, label: "未开课" },
{ value: 1, label: "已开课" },
{ value: '0', label: "未开课" },
{ value: '1', label: "已开课" },
])
const entryTypeList = ref([
{ value: '', label: "全部" },
{ value: 0, label: "系统生成" },
{ value: 1, label: "手动录入" },
{ value: '0', label: "系统生成" },
{ value: '1', label: "手动录入" },
])
const scoreList = ref([
{ value: '', label: "全部" },
@@ -699,13 +703,15 @@ export default {
{ value: '10~20', label: "10~20" },
])
const studysList = ref([
{ value: '', label: "全部" },
{ value: '0-30', label: "0~30" },
{ value: '0-50', label: "0~50" },
{ value: '0-70', label: "0~70" },
{ value: '0-100', label: "0~100" },
{ value: '0-150', label: "0~150" },
// { value: '0-150', label: "0~150" },
{ value: '0-200', label: "0~200" },
{ value: '0-300', label: "0~300 " },
{ value: '300以上', label: "300以上" },
])
const scoreChange = (e) => {
if (e.length !== 0) {
@@ -751,18 +757,25 @@ export default {
ellipsis: true, align: "center",
width: 120,
},
{
title: '课程名称 ',
dataIndex: 'courseName',
key: 'courseName ',
ellipsis: true, align: "left",
width: 200,
},
{
title: '讲师体系 ',
dataIndex: 'tsystemName',
key: 'tsystemName',
ellipsis: true, align: "center",
ellipsis: true, align: "left",
width: 200,
},
{
title: '培训发生组织 ',
dataIndex: 'trainOrgName',
key: 'trainOrgName',
ellipsis: true, align: "center",
ellipsis: true, align: "left",
width: 200,
customRender: (value, record) => {
return (
@@ -791,13 +804,7 @@ export default {
)
}
},
{
title: '课程名称 ',
dataIndex: 'courseName',
key: 'courseName ',
ellipsis: true, align: "center",
width: 120,
},
{
title: '课程类型 ',
dataIndex: 'type',
@@ -881,6 +888,13 @@ export default {
key: 'score',
ellipsis: true, align: "center",
width: 120,
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
title: '是否生成课时费 ',
@@ -905,8 +919,9 @@ export default {
title: '操作 ',
dataIndex: 'operation',
key: 'operation',
ellipsis: true, align: "right",
width: 200,
// ellipsis: true,
align: "center",
width: 100,
fixed: "right",
scopedSlots: { customRender: "action" },
},
@@ -1024,7 +1039,23 @@ export default {
tableData.value = res.data.data.records
state.tableDataTotal = Number(res.data.data.total);
state.tableLoading = false
console.log("获取tableData", tableData);
// console.log("获取tableData", tableData);
let findValue = false;
tableData.value.some(item=>{
if(item.createFrom == 1 && item.isSuperPermission === 'true'){
columns.value[14].width = 160
findValue = true
return true
}
})
if(!findValue){
const text = tableData.value.find(item=>item.createFrom == 1)
if(text){
columns.value[14].width = 120
}else{
columns.value[14].width = 100
}
}
})
.catch(err => {
state.tableLoading = false
@@ -1298,13 +1329,13 @@ export default {
ellipsis: true, align: "center",
width: 120,
},
{
title: '应发费用 ',
dataIndex: 'payableExpense',
key: 'payableExpense',
ellipsis: true, align: "center",
width: 120,
},
// {
// title: '应发费用 ',
// dataIndex: 'payableExpense',
// key: 'payableExpense',
// ellipsis: true, align: "center",
// width: 120,
// },
{
title: '状态 ',
dataIndex: 'status',
@@ -1313,14 +1344,15 @@ export default {
width: 120,
customRender: (value) => {
return (
<div >
{value.record.status == "A10" || value.record.status == "A20" || value.record.status == "A30" || value.record.status == "E10" || value.record.status == "S20"
<div>
{String(value.record.status)
? {
"A10": "待审核",
"A20": "提交",
"A30": "审核中",
"E10": "审核打回",
"S20": "审核通过",
"0": "待确认",
"1": "提交",
"2": "审核中",
"3": "审核通过",
'4': '审核拒绝',
'5': '待提交',
}[value.record.status + ""] || ""
: "-"}
</div>
@@ -1337,11 +1369,11 @@ export default {
// },
])
const gettableDatas = (record) => {
getExpenseByCourseId({ courseId: record.courseId })
getExpenseByCourseId({ courseId: record.courseId,teacherId:record.teacherId })
.then((res) => {
console.log(res)
tableDatas.value = res.data.data.records
state.tableDataTotal = Number(res.data.data.total);
tableDatas.value = res.data.data
// state.tableDataTotal = Number(res.data.data.total);
}).catch(err => {
message.destroy()
})
@@ -1357,7 +1389,7 @@ export default {
//导出功能
const handleExport = () => {
window.open(
`${process.env.VUE_APP_BASE_API}/admin/export/exportInTeacherRecord?pageNo=${state.searchParam.pageNo}&pageSize=${state.searchParam.pageSize}&recordType=1&name=${state.searchParam.name ? state.searchParam.name : ''}&courseName=${state.searchParam.courseName ? state.searchParam.courseName : ''}&createFrom=${state.searchParam.createFrom ? state.searchParam.createFrom : ''}&courseStatus=${state.searchParam.courseStatus ? state.searchParam.courseStatus : ''}&tSystemId=${state.searchParam.tSystemId ? state.searchParam.tSystemId : ''}&beginTime=${state.searchParam.beginTime ? state.searchParam.beginTime : ''}&endTime=${state.searchParam.endTime ? state.searchParam.endTime : ''}&orgId=${state.searchParam.orgId ? state.searchParam.orgId : ''}&courseTypeId=${state.searchParam.courseTypeId ? state.searchParam.courseTypeId : ''}&score=${state.searchParam.score ? state.searchParam.score : ''}&studys=${state.searchParam.studys ? state.searchParam.studys : ' '}
`${process.env.VUE_APP_BASE_API}/admin/export/exportInTeacherRecord?recordType=1&name=${state.searchParam.name || ''}&courseName=${state.searchParam.courseName || ''}&createFrom=${state.searchParam.createFrom || ''}&courseStatus=${state.searchParam.courseStatus || ''}&tSystemId=${state.searchParam.tSystemId || ''}&beginTime=${state.searchParam.beginTime || ''}&endTime=${state.searchParam.endTime || ''}&orgId=${state.searchParam.orgId || ''}&courseTypeId=${state.searchParam.courseTypeId || ''}&score=${state.searchParam.score || ''}&studys=${state.searchParam.studys || ''}
`)
console.log(state.searchParam.name, state.searchParam, '参数')
}

View File

@@ -62,7 +62,7 @@
text-overflow: ellipsis;">{{flipData(record.orgName)||'-'}}</div>
</template>
<template #appEdit="{ record }">
<a-button type="link" :disabled="record.createFrom==1 ?false :true" @click="edit(record)">编辑</a-button>
<a-button type="link" v-if="record.createFrom" @click="edit(record)">编辑</a-button>
<a-button type="link" @click="recome(record)">移除</a-button>
</template>
</a-table>
@@ -837,7 +837,7 @@ export default {
}).then(res=>{
message.success('移除成功')
search()
state.formData.summaryTotal = Number(state.formData.summaryTotal) - Number(record.expense)
state.formData.summaryTotal = (Number(state.formData.summaryTotal) - Number(record.expense)).toFixed(2)
}).catch(err=>{
message.error(err.msg)
})
@@ -851,7 +851,7 @@ export default {
key: 'name',
ellipsis: true,
align: "center",
width: 160,
width: 120,
},
{
title: '讲师工号',
@@ -859,7 +859,7 @@ export default {
key: 'userNo',
align: "center",
ellipsis: true,
width: 160,
width: 120,
},
{
title: '所属组织 ',
@@ -867,7 +867,7 @@ export default {
key: 'orgName',
ellipsis: true,
align: "center",
width: 200,
width: 160,
slots: { customRender: "orgName" },
},
{
@@ -876,7 +876,7 @@ export default {
key: 'tsystemName',
ellipsis: true,
align: "center",
width: 160,
width: 120,
},
{
title: '讲师级别',
@@ -884,7 +884,7 @@ export default {
key: 'tlevelName',
ellipsis: true,
align: "center",
width: 160,
width: 100,
},
{
title: '发薪地',
@@ -892,7 +892,10 @@ export default {
key: 'payrollPlace',
ellipsis: true,
align: "center",
width: 160,
width: 100,
customRender: ({text}) => {
return text || '-'
}
},
{
title: '课程类型',
@@ -900,7 +903,7 @@ export default {
key: 'courseType',
ellipsis: true,
align: "center",
width: 160,
width: 100,
customRender: (value) => {
return (
<div>
@@ -923,7 +926,7 @@ export default {
key: 'courseName',
ellipsis: true,
align: "center",
width: 200,
width: 160,
},
{
title: '授课/开发课程日期',
@@ -931,7 +934,7 @@ export default {
key: 'teachingDate',
ellipsis: true,
align: "center",
width: 200,
width: 160,
},
{
title: '授课/开发课程时长 ',
@@ -954,7 +957,7 @@ export default {
key: 'studys',
ellipsis: true,
align: "center",
width: 160,
width: 100,
customRender: ({text}) => {
return text || "0";
}
@@ -965,9 +968,13 @@ export default {
key: 'score',
ellipsis: true,
align: "center",
width: 160,
customRender: ({text}) => {
return text || "-";
width: 100,
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
@@ -976,7 +983,7 @@ export default {
key: 'levelPay',
ellipsis: true,
align: "center",
width: 160,
width: 120,
},
{
title: '计划费用 ',
@@ -984,7 +991,7 @@ export default {
key: 'expense',
ellipsis: true,
align: "center",
width: 160,
width: 120,
},
// {
// title: '应发费用 ',
@@ -1001,7 +1008,7 @@ export default {
ellipsis: true,
align: "center",
fixed: "right",
width: 160,
width: 120,
slots: { customRender: "appEdit" },
},
])
@@ -1252,7 +1259,7 @@ export default {
.table{
padding-bottom: 70px;
::v-deep .ant-table-cell-fix-right {
width: 160px !important;
width: 120px !important;
}
}
}

View File

@@ -95,7 +95,7 @@
<!-- <a-button type="link" @click="() => handleOperate(record, String(record.courseform))">审批</a-button> -->
<!-- <a-button type="link" @click="() => deleteModal(record, String(record.courseform))">删除</a-button> -->
<!-- <a-button v-if="record.status == 4" type="link" @click="submit(record)">提交</a-button> -->
<a-button v-if="record.status == 2" type="link" @click="withdraw(record)">撤回</a-button>
<a-button v-if="record.status == 2&&false" type="link" @click="withdraw(record)">撤回</a-button>
</a-space>
</template>
</template>
@@ -136,9 +136,9 @@
<a-descriptions style="margin-top:16px" bordered :column="2" :contentStyle="rowCenter" :labelStyle="rowCenter">
<a-descriptions-item label="审批编号">{{formParam?.approvalNumber||'-'}}</a-descriptions-item>
<a-descriptions-item label="培训发生组织">{{formParam?.trainOrgName||'-'}}</a-descriptions-item>
<a-descriptions-item v-if="activeKey==2" label="汇总周期" >{{formParam?.summaryDate||'-'}}</a-descriptions-item>
<a-descriptions-item label="提交时间">{{formParam?.approvalSubmitTime||'-'}}</a-descriptions-item>
<a-descriptions-item label="汇总时间" >{{formParam?.summaryTime||'-'}}</a-descriptions-item>
<a-descriptions-item label="汇总金额">{{formParam?.summaryTotal||'-'}}</a-descriptions-item>
<a-descriptions-item label="提交时间">{{formParam?.approvalSubmitTime||'-'}}</a-descriptions-item>
<a-descriptions-item label="状态">{{{0:'待确认' ,1:'待提交' ,2:'审核中', 3:'已完成', 4:'审核拒绝',5:'待提交'}[formParam?.status]}}</a-descriptions-item>
</a-descriptions>
<!-- <span>审批详情</span> -->
@@ -165,7 +165,7 @@
</div>
</div>
</a-tab-pane>
<a-tab-pane key="2" tab="讲师费审批记录" force-render>
<a-tab-pane key="2" tab="讲师费审批记录" force-render v-if="false">
<div style="padding-bottom:70px">
<a-table :header-cell-style="{ 'text-align': 'center' }" style="border: 1px solid #f2f6fe" :columns="columnsExamineTwo"
:data-source="tableDataExamineTwo" :loading="tableDataExamineLoading" @expand="expandTable" :pagination="false">
@@ -387,6 +387,10 @@
array.push(obj);
});
trainOrglist.value = array;
trainOrglist.value.unshift({
value: '',
label: "全部"
})
}
})
}
@@ -400,7 +404,7 @@
])
//认证状态0待确认 1待提交 2审核中 3审核通过 4.审核拒绝
const AuthenticationStatusList = ref([
// { value: 0, label: "待确认" },
{ value: '', label: "全部" },
{ value: 1, label: "待提交" },
{ value: 2, label: "审核中" },
{ value: 4, label: "审核拒绝" },
@@ -448,7 +452,7 @@
dataIndex: 'trainOrgName',
key: 'trainOrgName',
ellipsis: true, align: "center",
width: 120,
width: 200,
},
{
title: '汇总时间 ',
@@ -507,9 +511,9 @@
title: '操作 ',
dataIndex: 'operation',
key: 'operation',
ellipsis: true, align: "right",
ellipsis: true, align: "center",
fixed: "right",
width: 200,
width: 120,
scopedSlots: { customRender: "action" },
},
@@ -959,6 +963,9 @@
ellipsis: true,
align: "center",
width: 120,
customRender: ({text}) => {
return text || '-'
}
},
{
title: '基准课酬 ',
@@ -994,9 +1001,13 @@
ellipsis: true,
align: "center",
width: 120,
customRender: ({text}) => {
return text || "-";
}
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
title: '课程类型 ',

View File

@@ -18,7 +18,7 @@
</a-form-item>
<a-form-item class="select">
<a-select style="width: 235px ;margin-bottom:20px" v-model:value="searchParam.trainOrgId" placeholder="请选择培训发生组织" allowClear
:options="orgList"
:options="orgListSearch"
v-on:keydown.enter="enterPressHadlerSearch">
</a-select>
</a-form-item>
@@ -528,7 +528,7 @@
<a-descriptions-item label="授课时间 ">{{(formParam.teachingDate) || '-'}}</a-descriptions-item>
<a-descriptions-item label="授课时长 ">{{formParam.teachingTime || '-'}} <span v-if="formParam.teachingTime">({{(formParam.teachingTime/60).toFixed(2)}}小时)</span></a-descriptions-item>
<a-descriptions-item label="参训人数 ">{{formParam.studys || '-'}}</a-descriptions-item>
<a-descriptions-item label="评分 ">{{formParam.score || '-'}}</a-descriptions-item>
<a-descriptions-item label="评分 ">{{formParam.score?Number(formParam.score).toFixed(0)==0?'-':Number(formParam.score).toFixed(0):'-' }}</a-descriptions-item>
<a-descriptions-item label="课酬基准 ">{{formParam.levelPay || '-'}}</a-descriptions-item>
<a-descriptions-item label="计划费用 ">{{formParam.expense || '-'}}</a-descriptions-item>
<!-- <a-descriptions-item label="应发费用 ">{{formParam.payableExpense || '-'}}</a-descriptions-item> -->
@@ -536,11 +536,11 @@
<a-descriptions-item label="状态">{{{0:'待确认' ,1:'待提交' ,2:'审核中', 3:'已完成', 4:'拒绝',5:'待提交'}[formParam?.status]}}</a-descriptions-item>
<a-descriptions-item label="备注 ">{{formParam.remark || '-'}}</a-descriptions-item>
</a-descriptions>
<div style="margin-bottom: 20px;">
<div style="margin-bottom: 20px;" v-if="false">
<span class="line"></span>
<span style="font-weight: 600;">讲师费审批</span>
</div>
<div style="margin-bottom:32px;">
<div style="margin-bottom:32px;" v-if="false">
<a-table :columns="columnSee" :loading="SeeLoading" :data-source="tableDataSee" :pagination="false" />
</div>
<!-- <span class="line"></span> -->
@@ -561,7 +561,7 @@
</div> -->
</div>
</a-drawer>
<ImportWork v-model:showWork="showWork" :template="'讲师费导入模板'" :url="'/admin/export/importTeacherExpense'" :fileName="uploadFile" :title="title"></ImportWork>
<ImportWork v-model:showWork="showWork" :template="'讲师费导入模板-20241220.xlsx'" :url="'/admin/export/importTeacherExpense'" :fileName="uploadFile" :title="title"></ImportWork>
</div>
<!-- 一键确认讲师费 -->
<ConfirmLecturer @visibleFalse="visibleAll" :ids="selectsIds" v-model:visible="visibleConfirm" :name="'确认讲师费'" />
@@ -611,6 +611,7 @@
tableDataSee: [],
SeeLoading: false,
orgList: [],
orgListSearch: [],
selectsIds: '',
visibleConfirm: false,
title:'导入讲师费记录',
@@ -699,6 +700,15 @@
value: item.id
}
})
state.orgListSearch = res.data.data?.map(item=>{
return{
label: item.affiliationName,
value: item.id
}
})
state.orgListSearch.unshift({
label: '全部', value: ''
})
})
}
//费用类型
@@ -717,15 +727,16 @@
{ value: '0', label: "在线课" },
{ value: '2', label: "课程开发" },
{ value: '3', label: "作业员入模培训" },
{ value: '4', label: "其他" },
// { value: '4', label: "其他" },
])
//认证状态
const AuthenticationStatusList = ref([
{ value: 0, label: "待确认" },
{ value: 1, label: "待审核" },
{ value: 2, label: "审核中" },
{ value: 4, label: "审核拒绝" },
{ value: 3, label: "审核通过" },
{ value: '', label: "全部" },
{ value: '0', label: "待确认" },
{ value: '1', label: "待提交" },
{ value: '2', label: "审核" },
{ value: '4', label: "审核拒绝" },
{ value: '3', label: "审核通过" },
])
const lecturerSystemList = ref([
@@ -748,6 +759,10 @@
array.push(obj);
});
lecturerSystemList.value = array;
lecturerSystemList.value.unshift({
value: '',
label: '全部'
})
}
})
}
@@ -768,6 +783,10 @@ getAllLevelList().then((res) => {
array.push(obj);
});
getLevelList.value = array;
getLevelList.value.unshift({
value: "",
label: "全部"
})
}
})
}
@@ -904,14 +923,14 @@ getAllLevelList().then((res) => {
dataIndex: 'courseName',
key: 'courseName',
ellipsis: true,
align: "center",
align: "left",
width: 200,
},
{
title: '培训发生组织',
dataIndex: 'trainOrgName',
key: 'trainOrgName',
ellipsis: true, align: "center",
ellipsis: true, align: "left",
width: 200,
},
@@ -941,8 +960,8 @@ getAllLevelList().then((res) => {
title: '讲师体系',
dataIndex: 'tsystemName',
key: 'tsystemName',
ellipsis: true, align: "center",
width: 120,
ellipsis: true, align: "left",
width: 200,
customRender: ({ text })=>{
return text||'-'
}
@@ -997,9 +1016,13 @@ getAllLevelList().then((res) => {
key: 'score',
ellipsis: true, align: "center",
width: 120,
customRender: ({ text })=>{
return text||'-'
}
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
title: '课程类型 ',
@@ -1640,9 +1663,13 @@ const column = ref([
key: 'courseAssess',
ellipsis: true, align: "center",
width: 120,
customRender: ({ text })=>{
return text||'-'
}
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(0) : '-'}
</div>
)
}
},
{
title: '课程类型 ',
@@ -1726,8 +1753,8 @@ const column = ref([
//导出功能
const handleExport = ()=>{
window.open (
`${process.env.VUE_APP_BASE_API}/admin/export/exportTeacherExpense?pageNo=${state.searchParam.pageNo}&pageSize=${state.searchParam.pageSize}&name=${state.searchParam.name ? state.searchParam.name : ""
}&trainOrgId=${ state.searchParam.trainOrgId ? state.searchParam.trainOrgId : ""}&type=${state.searchParam.type ? state.searchParam.type : ""}&tsystemId=${ state.searchParam.tSystemId ? state.searchParam.tSystemId : ""}&tLevelName=${ state.searchParam.tLevelName ? state.searchParam.tLevelName : ""}&beginTime=${state.searchParam.beginTime ? state.searchParam.beginTime : ""}&endTime=${state.searchParam.endTime ? state.searchParam.endTime : ""}`
`${process.env.VUE_APP_BASE_API}/admin/export/exportTeacherExpense?name=${state.searchParam.name || ""
}&status=${ state.searchParam.status || ""}&trainOrgId=${ state.searchParam.trainOrgId || ""}&type=${state.searchParam.type || ""}&tSystemId=${ state.searchParam.tSystemId || ""}&tLevelName=${ state.searchParam.tLevelName || ""}&beginTime=${state.searchParam.beginTime || ""}&endTime=${state.searchParam.endTime || ""}`
);
// this.download('lesson_records/export', {
// ...state.searchParam

View File

@@ -25,7 +25,7 @@
</div>
</a-form>
<div style="width: 100%;"></div>
<div style="display: flex; margin-bottom: 20px">
<div v-if="isAdmin" style="display: flex; margin-bottom: 20px">
<a-button @click="searchResetPrevious()" type="primary" class="langbtn" style="width: 150px; height: 40px; border-radius: 8px" >
<FolderAddOutlined /> 重新汇总上月讲师费
</a-button>
@@ -171,7 +171,7 @@
<MonthlyStatistics v-model:visible="opendrawer" :id="drawerId" ></MonthlyStatistics>
</template>
<script lang="jsx">
import { reactive, toRefs, ref, watch } from "vue";
import { reactive, toRefs, ref, watch,onMounted } from "vue";
import { message } from "ant-design-vue";
import dayjs from "dayjs";
import { useStore } from "vuex";
@@ -179,7 +179,7 @@ import { useRouter } from "vue-router";
import { getOrganization } from "../../api/Teaching";
import { queryTeacherFeeMonthly, getTeacherFeeDetailListByTeacherNo, getTeacherFeeListByTeacherNo,TeacherFeeTotalList,createMonthSummary} from "../../api/lecturerFeeStatistics"
;
import {expenseSummaryList,getTrainOrg,CreateMonthSummary} from "../../api/lecturerFeeManagement";
import {expenseSummaryList,getTrainOrg,CreateMonthSummary,isShowReimport} from "../../api/lecturerFeeManagement";
import dialog from '@/utils/dialog'
import MonthlyStatistics from './MonthlyStatistics'
export default {
@@ -188,9 +188,22 @@ export default {
MonthlyStatistics,
},
setup() {
onMounted(() => {
isShowReimport().then(res=>{
if(res.data.code == 200){
state.isAdmin = res.data.data
}else{
state.isAdmin = false
}
}).catch(err=>{
state.isAdmin = false
message.error(err.data.msg)
})
})
const store = useStore();
const router = useRouter();
const state = reactive({
isAdmin: false,
opendrawer: false,
drawerId: '',
summaryDate: null,
@@ -243,11 +256,11 @@ export default {
width:'100px',
},
{
title: '资源归属 ',
title: '培训发生组织 ',
dataIndex: 'trainOrgName',
key: 'trainOrgName',
ellipsis: true,
align: "center",
align: "left",
width: '200px',
},
{
@@ -378,6 +391,10 @@ export default {
array.push(obj);
});
TrainOrglist.value = array;
TrainOrglist.value.unshift({
value: '',
label: "全部"
})
}
console.log("获取发薪地",TrainOrglist);
})

View File

@@ -258,7 +258,7 @@ export default {
key: 'name',
ellipsis: true,
align: "center",
width: 160,
width: 120,
},
{
title: '讲师工号',
@@ -266,7 +266,7 @@ export default {
key: 'userNo',
align: "center",
ellipsis: true,
width: 160,
width: 120,
},
{
title: '所属组织 ',
@@ -274,7 +274,7 @@ export default {
key: 'orgName',
ellipsis: true,
align: "center",
width: 200,
width: 160,
customRender: ({text})=>{
return endOrg(text)
}
@@ -285,7 +285,7 @@ export default {
key: 'payrollPlace',
ellipsis: true,
align: "center",
width: 160,
width: 120,
},
{
title: '授课时长(系统 ) ',
@@ -293,7 +293,7 @@ export default {
key: 'teachingSystem',
ellipsis: true,
align: "center",
width: 160,
width: 140,
},
{
title: '授课时长(录入) ',
@@ -301,15 +301,15 @@ export default {
key: 'teachingEnter',
ellipsis: true,
align: "center",
width: 160,
width: 140,
},
{
title: '开发课程时长 ',
dataIndex: 'expense',
key: 'expense',
dataIndex: 'teachingDevelop',
key: 'teachingDevelop',
ellipsis: true,
align: "center",
width: 160,
width: 120,
},
{
title: '计划费用 ',
@@ -317,7 +317,7 @@ export default {
key: 'expense',
ellipsis: true,
align: "center",
width: 160,
width: 120,
},
{
title: '应发费用 ',
@@ -325,7 +325,7 @@ export default {
key: 'payableExpense',
ellipsis: true,
align: "center",
width: 160,
width: 120,
},
{
title: '操作 ',
@@ -334,7 +334,7 @@ export default {
ellipsis: true,
align: "center",
fixed: "right",
width: 160,
width: 100,
scopedSlots: { customRender: "action" },
},
])

View File

@@ -39,8 +39,10 @@
<div style="color: #1890ff;cursor: pointer;">查看</div>
</lockLecturer>
<a-button v-if="record.status!=2" type="link" @click="() => handleModify(record, String(record.courseform))">编辑</a-button>
<a-button v-if="record.status==2" type="link" @click="() => updateModal(record)">撤回</a-button>
<a-button type="link" @click="() => deleteModal(record, String(record.courseform))">删除</a-button>
<a-button v-if="record.status==2&&false" type="link" @click="() => updateModal(record)">撤回</a-button>
<!-- <a-button type="link" @click="() => deleteModal(record, String(record.courseform))">删除</a-button> -->
<a-button @click="isEnablePost(record,0)" v-if="record.enable" type="link" >启用</a-button>
<a-button @click="isEnablePost(record,1)" v-if="!record.enable" type="link" >停用</a-button>
</a-space>
</template>
</template>
@@ -148,11 +150,11 @@
是否为根节点
</template>
<div style="display: flex;align-items: center;">
<a-radio-group style="min-width:126px;" @change="selectRadio" v-model:value="formParam.isParent" name="radioGroup">
<a-radio-group :disabled="!formParam.locking" style="min-width:126px;" @change="selectRadio" v-model:value="formParam.isParent" name="radioGroup">
<a-radio :value="1"></a-radio>
<a-radio :value="0"></a-radio>
</a-radio-group>
<a-select v-model:value="formParam.code" :placeholder="!formParam.isParent?'请选择审批层级':'请选择根节点'"
<a-select :disabled="!formParam.locking" v-model:value="formParam.code" :placeholder="!formParam.isParent?'请选择审批层级':'请选择根节点'"
:options="!formParam.isParent?PlaceOfPayList:PlaceOfPayListTwo" allowClear showSearch/>
</div>
</a-form-item>
@@ -348,6 +350,7 @@ export default{
code: null,
isContains: '0',
affiliationOrgList: [],
locking: 1,
},
})
const PlaceOfPayList = ref([
@@ -385,19 +388,19 @@ export default{
state.formParam.code = null
}
const columns = ref([
{
title: '培训发生组织编号 ',
dataIndex: 'affiliationCode',
key: 'affiliationCode',
ellipsis: true,
align: "center",
width: '100px',
},
// {
// title: '培训发生组织编号 ',
// dataIndex: 'affiliationCode',
// key: 'affiliationCode',
// ellipsis: true,
// align: "center",
// width: '100px',
// },
{
title: '培训发生组织名称 ',
dataIndex: 'affiliationName',
key: 'affiliationName',
ellipsis: true, align: "center",
ellipsis: true, align: "left",
width: '200px',
},
{
@@ -427,7 +430,7 @@ export default{
title: '是否为根节点名称',
dataIndex: 'parentName',
key: 'parentName',
align: "center",
align: "left",
width: '200px',
customRender: ({text,record})=>{
return (
@@ -440,7 +443,7 @@ export default{
dataIndex: 'leaderName',
key: 'leaderName',
ellipsis: true,
align: "center",
align: "left",
width: '200px',
},
@@ -581,6 +584,24 @@ const getTableDate = (obj) => {
}
})
};
const isEnablePost = (record,status) => {
dialog({
content: `是否确认${!status?'启用':'停用'}该培训发生组织?`,
ok: () => {
lecturer.isEnable({id:record.id,status}).then(res=>{
if(typeof (res.data.data) != 'object'){
message.error(res.data.data)
return
}
message.success(`${!status?'启用':'停用'}成功`)
searchSubmit();
}).catch(err=>{
message.destroy()
message.error(err.data.msg)
})
}
})
}
//确认删除
const closeDeleteTeacher = () => {
//调用删除接口
@@ -689,7 +710,7 @@ const getTableDate = (obj) => {
...item
};
});
state.formParam.leveTwoValue = state.formParam.leveTwoArray.map(item => item.label).join(',');
state.formParam.leveTwoValue = state.formParam.leveTwoArray.map(item => item.label).join(',')||null;
state.formParam.leveThreeArray = leveThreeArray.map(item => {
return {
label: item.userName + item.userNo,
@@ -698,7 +719,7 @@ const getTableDate = (obj) => {
...item
};
});
state.formParam.leveThreeValue = state.formParam.leveThreeArray.map(item => item.label).join(',');
state.formParam.leveThreeValue = state.formParam.leveThreeArray.map(item => item.label).join(',')||null;
state.formParam.orglistName = state.formParam.affiliationOrgList?.map(item=>item.id).join(',')
state.formParam.selectOrgList?.map(item=>{
state.formParam.affiliationOrgList.some(item2=>{
@@ -739,6 +760,7 @@ const getTableDate = (obj) => {
code: null,
isContains: '0',
affiliationOrgList: [],
locking: 1,
}
}
async function validateField(name) {
@@ -786,6 +808,9 @@ const getTableDate = (obj) => {
}
}
}
if(!state.formParam.leveTwoValue&&state.formParam.leveThreeValue&&state.formParam.isParent){
return message.error('请选择二级审批人')
}
state.formParam.remark = state.formParam?.remark?.trim()
state.formParam.submitStatus = val
dialog({
@@ -859,6 +884,7 @@ const getTableDate = (obj) => {
searchReset,
searchList,
deleteModal,
isEnablePost,
updateModal,
cancelTeacherDialog,
addTeacher,