Merge branch '250213-prod-master_1202-gx' into test20250220

This commit is contained in:
gengxin
2025-02-20 17:43:24 +08:00
19 changed files with 7945 additions and 5415 deletions

21
package-lock.json generated
View File

@@ -3727,8 +3727,6 @@
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -3740,9 +3738,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
"optional": true,
"peer": true
"dev": true
},
"node_modules/ajv-keywords": {
"version": "3.5.2",
@@ -14457,6 +14453,7 @@
"integrity": "sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==",
"dev": true,
"requires": {
"@babel/core": "^7.12.16",
"@babel/helper-compilation-targets": "^7.12.16",
"@babel/helper-module-imports": "^7.12.13",
"@babel/plugin-proposal-class-properties": "^7.12.13",
@@ -14469,6 +14466,7 @@
"@vue/babel-plugin-jsx": "^1.0.3",
"@vue/babel-preset-jsx": "^1.1.2",
"babel-plugin-dynamic-import-node": "^2.3.3",
"core-js": "^3.8.3",
"core-js-compat": "^3.8.3",
"semver": "^7.3.4"
},
@@ -15334,14 +15332,15 @@
"resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"dev": true,
"requires": {},
"requires": {
"ajv": "^8.0.0"
},
"dependencies": {
"ajv": {
"version": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
"version": "8.12.0",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -15353,9 +15352,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
"optional": true,
"peer": true
"dev": true
}
}
},

View File

@@ -75,6 +75,13 @@ export const affiliationDelById = (id)=>http.post(`/admin/affiliation/delById?id
export const isEnable = (obj) => http.post(`/admin/affiliation/isEnable`,obj)
//撤回培训发生组织
export const affiliatIsConfirm = (id) => http.post(`/admin/affiliation/isConfirm?id=${id}`)
//删除 待提交 ,拒绝 的培训发生组织
export const affiliatRemoveById = (id) => http.post(`/admin/affiliation/removeById?id=${id}`)
//讲师费统计详情
export const expenseSummaryById = (obj) => http.get( `/admin/expenseSummary/queryById?id=${obj.id}&name=${obj.name}&trainOrgId=${obj.trainOrgId||''}&pageNo=${obj.pageNo}&pageSize=${obj.pageSize}`)
//撤回讲师费统计详情

View File

@@ -13,7 +13,7 @@ export const addTeacherFee= (obj) => http.post('/admin/teacherExpense/addTeacher
export const deleteInTeacher= (obj) => http.post(`/admin/teacher/delByIdr?id=${obj}`)
//修改讲师费信息
export const updateTeacherFee= (obj) => http.post('/admin/teacherExpense/editTeacherExpense',obj)
//修改讲师费状态提交
//修改讲师费状态提交/admin/expenseBill
export const updateStatusSubmit= (obj) => http.post('/admin/teacherExpense/confirm',obj)
//修改讲师费状态撤回
export const approveTeacherFee= (obj) => http.post('/admin/teacherExpense/withdraw',obj)
@@ -57,5 +57,7 @@ export const CreateSummary= () => http.post('/admin/expenseBill/CreateSummary')
export const queryExpnseByBillId= (obj) => http.get('/admin/expenseBill/queryExpnseByBillId',{params:obj})
//
export const CreateSummaryAgain= (id) => http.post(`/admin/expenseBill/createSummaryAgain?billId=${id}`)
//删除 费用审批删除
export const expenseBillDelById = (id)=>http.post(`/admin/expenseBill/delById?id=${id}`)
//
export const submitApproval= (obj) => http.post('/admin/expenseBill/submitApproval',obj)

View File

@@ -195,7 +195,11 @@ watch(()=>props.visible,(val)=>{
}
).then(res=>{
if(res.data.code === 200){
forData.value = res.data.data
forData.value = res.data.data;
//todo1 , 只有一个处理 初始化 处理数据 ,进行 激活处理
if(forData.value.length == 1){
activeList.value.push(0);
}
forData.value.forEach((item,i) => {
searchConditions.value.push({ nameUserNo: '', dateValue: [] });
expenseList.value.push(forData.value[i]?.expenseList || [])

View File

@@ -1,16 +1,13 @@
<template>
<a-drawer class="largeDrawerInside" :visible="visible" placement="right" :closable="false"
width="80%" :title="false" @close="handleClose">
<a-drawer class="largeDrawerInside" :visible="visible" placement="right" :closable="false" width="80%" :title="false"
@close="handleClose">
<!-- 内部讲师查看详情 -->
<div class="LookInsideLecturer">
<div class="header" style="margin-top: -24px;margin-left: -24px;">
<div class="headerTitle">查看讲师</div>
<!-- <router-link :to="{ path: '/lecturerList', query: { activeKey: '1', } }"> -->
<img
@click="handleClose"
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
/>
<img @click="handleClose" style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png" />
<!-- </router-link> -->
</div>
<a-layout-content>
@@ -22,45 +19,57 @@
<a-descriptions-item label="讲师头像">
<a-image :width="55" style="border-radius: 50%;width:55px;height:55px;" :src=formParam.photo />
</a-descriptions-item>
<a-descriptions-item label="讲师姓名"><div style="user-select:text">{{formParam.name}} / {{formParam.userNo}}</div></a-descriptions-item>
<a-descriptions-item label="讲师体系"><div style="user-select:text">{{formParam.tsystemName || '-'}}</div></a-descriptions-item>
<a-descriptions-item label="讲师姓名">
<div style="user-select:text">{{ formParam.name }} / {{ formParam.userNo }}</div>
</a-descriptions-item>
<a-descriptions-item label="讲师体系">
<div style="user-select:text">{{ formParam.tsystemName || '-' }}</div>
</a-descriptions-item>
<!-- 二层 -->
<a-descriptions-item label="讲师级别">{{formParam.tlevelName||'-'}}</a-descriptions-item>
<a-descriptions-item label="认证状态">{{ formParam.certStatus==0?'未认证' :formParam.certStatus==1 ?'已认证':'-'}}
<a-descriptions-item label="讲师级别">{{ formParam.tlevelName || '-' }}</a-descriptions-item>
<a-descriptions-item label="认证状态">{{ formParam.certStatus == 0 ? '未认证' : formParam.certStatus == 1 ? '已认证' : '-' }}
<span>
<a-button type="text" class="moreidbtn" v-if="formParam.certStatus == 1"
@click="handleup">查看认证资料</a-button>
</span>
</a-descriptions-item>
<a-descriptions-item label="授课时长"> <span v-if="formParam.teaching!= null" >{{formParam.teaching}}分钟({{ (Number(formParam.teaching) /60 ).toFixed(2)}}小时)</span><span v-else>-</span>
<a-descriptions-item label="授课时长"> <span v-if="formParam.teaching != null">{{ formParam.teaching }}分钟({{
(Number(formParam.teaching) / 60).toFixed(2)}}小时)</span><span v-else>-</span>
</a-descriptions-item>
<a-descriptions-item label="发薪地 ">{{formParam.salaryName||'-'}}</a-descriptions-item>
<a-descriptions-item label="发薪地 ">{{ formParam.salaryName || '-' }}</a-descriptions-item>
<!-- 三层 -->
<a-descriptions-item label="在职状态">{{formParam.waitStatus=='0'?'在职' :formParam.waitStatus=='1' ?'离职':'-'}}</a-descriptions-item>
<a-descriptions-item label="账号状态">{{formParam.status=='0'?'临时' :formParam.status=='1' ?'启用':formParam.status==2 ?'停用':'-'}}</a-descriptions-item>
<a-descriptions-item label="录入方式">{{formParam.createFrom=='0'?'自动录入' :formParam.createFrom=='1'?'手动录入':'-'}}</a-descriptions-item>
<a-descriptions-item style="max-width: 400px;" label="所属组织" >
<a-descriptions-item label="在职状态">{{ formParam.waitStatus == '0' ? '在职' : formParam.waitStatus == '1'
?'离职':'-'}}</a-descriptions-item>
<a-descriptions-item label="账号状态">{{ formParam.status == '0' ? '临时' : formParam.status == '1'
? '启用' : formParam.status == 2 ?'停用':'-'}}</a-descriptions-item>
<a-descriptions-item label="录入方式">{{ formParam.createFrom == '0' ? '自动录入'
: formParam.createFrom == '1' ? '手动录入':'-'}}</a-descriptions-item>
<a-descriptions-item style="max-width: 400px;" label="所属组织">
<span :title="formParam.orgName" style="user-select:text">{{ formParam.orgName || '-' }}</span>
</a-descriptions-item>
</a-descriptions>
<div style="margin-top: 10px;"></div>
<span class="line" ></span>
<a-descriptions title="其他信息" bordered :column="4" :contentStyle="rowCenter" :labelStyle="rowCenters" >
<span class="line"></span>
<a-descriptions title="其他信息" bordered :column="4" :contentStyle="rowCenter" :labelStyle="rowCenters">
<!-- 一层 -->
<a-descriptions-item style="max-width: 200px;" label="讲师介绍" :span="4" >
<div v-if="formParam.description !=null&&resp(formParam.description)" style="min-width: 500px;" v-html="formParam.description" ></div>
<a-descriptions-item style="max-width: 200px;" label="讲师介绍" :span="4">
<div v-if="formParam.description != null && resp(formParam.description)" style="min-width: 500px;"
v-html="formParam.description"></div>
<div v-else>-</div>
</a-descriptions-item>
<a-descriptions-item label="工作职责" :span="4">
<div v-if="formParam.workExperience !=null&&resp(formParam.workExperience)" style="min-width: 500px;" v-html="formParam.workExperience" ></div>
<div v-if="formParam.workExperience != null && resp(formParam.workExperience)" style="min-width: 500px;"
v-html="formParam.workExperience"></div>
<div v-else>-</div>
</a-descriptions-item>
<a-descriptions-item label="擅长课程" :span="4">
<div v-if="formParam.courses !=null&&resp(formParam.courses)" style="min-width: 500px;" v-html="formParam.courses" ></div>
<div v-if="formParam.courses != null && resp(formParam.courses)" style="min-width: 500px;"
v-html="formParam.courses"></div>
<div v-else>-</div>
</a-descriptions-item>
<a-descriptions-item label="教师专长" :span="4">
<a-tag v-if="formParam.expertiseNames" color="blue" style="margin-right:10px" v-for="item in formParam.expertiseNames?.split(',')">{{item}}</a-tag>
<a-tag v-if="formParam.expertiseNames" color="blue" style="margin-right:10px"
v-for="item in formParam.expertiseNames?.split(',')">{{ item }}</a-tag>
<span v-else>-</span>
</a-descriptions-item>
</a-descriptions>
@@ -69,79 +78,63 @@
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="授课记录">
<a-table :header-cell-style="{ 'text-align': 'center' }" :columns="teacherrecordsColumns"
:data-source="teacherrecordstableData" :loading="teacherrecordsLoading" :scroll="{ x: '1000' }" :pagination="pagination">
:data-source="teacherrecordstableData" :loading="teacherrecordsLoading" :scroll="{ x: '1000' }"
:pagination="pagination">
</a-table>
<div style="float: right;">
<a-pagination
v-if="tableDataTotal > 10"
:showSizeChanger="true"
:showQuickJumper="false"
:hideOnSinglePage="false"
:pageSize="searchParam.pageSize"
:current="searchParam.pageNo"
:total="tableDataTotal"
class="pagination"
@change="changePagination"
/>
<a-pagination v-if="tableDataTotal > 10" :showSizeChanger="true" :showQuickJumper="false"
:hideOnSinglePage="false" :pageSize="searchParam.pageSize" :current="searchParam.pageNo"
:total="tableDataTotal" class="pagination" @change="changePagination" />
</div>
</a-tab-pane>
<a-tab-pane key="2" tab="晋级记录">
<a-table :header-cell-style="{ 'text-align': 'center' }" style="border: 1px solid #f2f6fe" :columns="promotionrecordsColumns"
:data-source="promotionrecordstableData" :loading="promotionrecordsLoading" @expand="expandTable" :pagination="false">
<template #bodyCell="{ record, column,index }" >
<a-table :header-cell-style="{ 'text-align': 'center' }" style="border: 1px solid #f2f6fe"
:columns="promotionrecordsColumns" :data-source="promotionrecordstableData"
:loading="promotionrecordsLoading" @expand="expandTable" :pagination="false">
<template #bodyCell="{ record, column, index }">
</template>
</a-table>
<div style="float: right;">
<a-pagination
v-if="teacherrepromotableDataTotal > 10"
:showSizeChanger="true"
:showQuickJumper="false"
:hideOnSinglePage="true"
:pageSize="teacherrepromo.pageSize"
:current="teacherrepromo.pageNo"
:total="teacherrepromotableDataTotal"
class="pagination"
@change="teacherrepromoPagination"
/>
<a-pagination v-if="teacherrepromotableDataTotal > 10" :showSizeChanger="true" :showQuickJumper="false"
:hideOnSinglePage="true" :pageSize="teacherrepromo.pageSize" :current="teacherrepromo.pageNo"
:total="teacherrepromotableDataTotal" class="pagination" @change="teacherrepromoPagination" />
</div>
</a-tab-pane>
</a-tabs>
</div>
</div>
</a-layout-content>
</div>
</a-drawer>
</template>
<script lang ="jsx">
import { useRouter,useRoute } from "vue-router";
import { reactive, toRefs, ref, computed,watch } from "vue"
<script lang="jsx">
import { useRouter, useRoute } from "vue-router";
import { reactive, toRefs, ref, computed, watch } from "vue"
import { useStore } from "vuex";
import {getTeacherById ,getTeacherLogList} from "../../api/Lecturer";
import { getTeacherById, getTeacherLogList } from "../../api/Lecturer";
import { getNewInTeacherCourseList } from "../../api/Teaching";
import avatar from '@/assets/avatar.png'
import Avatarman from '@/assets/Avatarman.png'
import Avatarwoman from '@/assets/Avatarwoman.png'
import dayjs from "dayjs";
export default{
name :"LookInsideLecturer",
components:{
export default {
name: "LookInsideLecturer",
components: {
},
props:{
visible:{
props: {
visible: {
type: Boolean,
default: false,
},
id:{
id: {
type: String,
default: ""
}
},
setup(props,emits){
const router=useRouter();
setup(props, emits) {
const router = useRouter();
const state = reactive({
activeKey:'1',
activeKey: '1',
formParam: {
},
promotionrecordsLoading: false, //晋级记录遮罩层
@@ -149,46 +142,46 @@ export default{
teacherrecordstableDataTotal: 0,//授课记录列表总条数
teacherrepromotableDataTotal: -1,//晋级记录总条数
teacherrecords: {
recordType:1,
recordType: 1,
pageNo: "1",
pageSize: "10",
id: null
},
teacherrepromo:{
userId:null,
teacherrepromo: {
userId: null,
pageNo: "1",
pageSize: "10",
}
});
watch(() => props.visible, (val) => {
console.log(val,'xixixiixix')
if(val){
console.log(val, 'xixixiixix')
if (val) {
const id = props.id
TeacherSystem(id)
}else{
} else {
state.formParam = {}
}
})
const isOrgNames = (val) => {
if(val){
if (val) {
const parts = val.split('/');
const reversedParts = parts.reverse();
state.formParam.orgNames = reversedParts.join('/');
}
}
const handleClose = () => {
emits.emit('update:visible',false)
emits.emit('update:visible', false)
}
//内部讲师详情
const TeacherSystem = (id) => {
getTeacherById({id,}).then((res) => {
let objA= res.data.data
console.log(objA ,'11111111111')
getTeacherById({ id, }).then((res) => {
let objA = res.data.data
console.log(objA, '11111111111')
state.formParam = objA
state.formParam.photo = state.formParam.photo ==null ?
state.formParam.photo = state.formParam.photo == null ?
state.formParam.gender == 1 ? Avatarman :
state.formParam.gender ==2 ? Avatarwoman : Avatarman : (state.formParam.photo.includes('upload')?state.formParam.photo:'/upload'+state.formParam.photo)
state.teacherrepromo.userId=res.data.data.id
state.formParam.gender == 2 ? Avatarwoman : Avatarman : (state.formParam.photo.includes('upload') ? state.formParam.photo : '/upload' + state.formParam.photo)
state.teacherrepromo.userId = res.data.data.id
console.log(state.teacherrepromo.id);
isOrgNames(state.formParam.orgName)
getteacherrecordstableData()
@@ -199,7 +192,7 @@ export default{
});
}
const resp = (val) => {
if(val){
if (val) {
const reg = /<[^<>]+>/g;
const value = val.replace(reg, "");
return value
@@ -225,7 +218,7 @@ export default{
ellipsis: true,
align: "center",
width: 180,
customCell:()=>{return{style:{userSelect: 'text'}}},
customCell: () => { return { style: { userSelect: 'text' } } },
},
{
title: '课程日期',
@@ -236,7 +229,7 @@ export default{
customRender: (value) => {
return (
<div style="user-select: text">
{value.record?.teachingDate?dayjs(value.record?.teachingDate).format("YYYY-MM-DD HH:mm"):'-'}
{ value.record?.teachingDate ? dayjs(value.record?.teachingDate).format("YYYY-MM-DD HH:mm") : '-' }
</div>
);
},
@@ -258,7 +251,7 @@ export default{
customRender: (value) => {
return (
<div>
{String(value.record.type)
{ String(value.record.type)
? {
"0": "在线课",
"1": "面授课",
@@ -266,7 +259,7 @@ export default{
"3": "作业员入模培训",
"4": "其他",
}[value.record.type + ""]
: "-"}
: "-" }
</div>
)
}
@@ -277,8 +270,8 @@ export default{
key: 'studys',
ellipsis: true, align: "center",
width: 120,
customRender: ({text})=>{
return text ? text+'人' : '-'
customRender: ({ text }) => {
return text ? text + '人' : '-'
}
},
{
@@ -287,8 +280,8 @@ export default{
key: 'teaching',
ellipsis: true, align: "center",
width: 130,
customRender: ({text})=>{
return text ? text+'分钟' : '-'
customRender: ({ text }) => {
return text ? text + '分钟' : '-'
}
},
{
@@ -300,7 +293,7 @@ export default{
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(2)+'分' : '-'}
{ value.record.score ? Number(value.record.score).toFixed(0) == 0 ? '-' : Number(value.record.score).toFixed(2) + '分' : '-' }
</div>
)
}
@@ -314,12 +307,12 @@ export default{
customRender: (value) => {
return (
<div>
{value.record.courseStatus == 0 || value.record.courseStatus == 1
{ value.record.courseStatus == 0 || value.record.courseStatus == 1
? {
"0": "未开课",
"1": "已开课",
}[value.record.courseStatus + ""] || ""
: "-"}
: "-" }
</div>
)
}
@@ -333,7 +326,7 @@ export default{
width: 200,
customRender: (value) => {
return (
<div>{value.record.remark || '-'}</div>
<div>{ value.record.remark || '-' }</div>
)
}
},
@@ -358,12 +351,12 @@ export default{
const pagination = computed(() => ({
total: state.teacherrecordstableDataTotal,
showSizeChanger: true,
showQuickJumper:true,
showQuickJumper: true,
current: state.teacherrecords.pageNo,
pageSize: state.teacherrecords.pageSize,
onChange: paginationChange,
}));
const paginationChange = (e,pageSize) => {
const paginationChange = (e, pageSize) => {
state.teacherrecords.pageNo = e;
state.teacherrecords.pageSize = pageSize
getteacherrecordstableData();
@@ -398,7 +391,7 @@ export default{
customRender: (value) => {
return (
<div>
{value.record.type == 1 ? "自动" : value.record.type == 0 ? '手动':"-"}
{ value.record.type == 1 ? "自动" : value.record.type == 0 ? '手动' : "-" }
</div>
)
}
@@ -430,7 +423,7 @@ export default{
// })
// state.promotionrecordsLoading = false
// };
const goback = ()=>{
const goback = () => {
router.back()
}
const store = useStore();
@@ -443,12 +436,18 @@ export default{
// return store.state.sysTypeMap.get(code)
// }
// getSysTypeMap()
const handleup = ()=>{
window.open (
`${process.env.VUE_APP_BOE_API_URL}/upload${state.formParam.certification}`
);
}
return{
const handleup = () => {
let url = "";
if(state.formParam.certification != null && state.formParam.certification != undefined && state.formParam.certification != ''){
if(state.formParam.certification.includes("/upload")){
url = `${process.env.VUE_APP_BOE_API_URL}${state.formParam.certification}`
}else{
url = `${process.env.VUE_APP_BOE_API_URL}/upload${state.formParam.certification}`
}
}
window.open(url);
}
return {
...toRefs(state),
router,
goback,
@@ -458,8 +457,8 @@ window.open (
TeacherSystem,
handleClose,
isOrgNames,
rowCenter:{"text-align":"left",'min-width':'176px'},
rowCenters:{"text-align":"center",'width':'160px','min-width':'110px'},
rowCenter: { "text-align": "left", 'min-width': '176px' },
rowCenters: { "text-align": "center", 'width': '160px', 'min-width': '110px' },
teacherrecordstableData,
teacherrecordsColumns,
resp,
@@ -477,8 +476,9 @@ window.open (
</script>
<style lang="scss" scoped>
.LookInsideLecturer {
padding:24px;
.header {
padding: 24px;
.header {
padding: 0px 32px;
height: 73px;
border-bottom: 1px solid #e8e8e8;
@@ -496,46 +496,52 @@ padding:24px;
line-height: 25px;
// margin-left: 24px;
}
}
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.filter {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.filter {
margin-left: 38px;
margin-right: 38px;
margin-top: 30px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
.select {
margin-right: 20px;
margin-bottom: 20px;
}
}
}
.backbtn{
.backbtn {
float: right;
margin-right: 20px;
border: none;
color: #4ea6ff;
width: 80px;
height:64px
border: none;
color: #4ea6ff;
width: 80px;
height: 64px
}
//小竖线
.line{
float:left;
width: 3px;
height: 16px;
background: #4ea6ff;
border-radius: 30%;
margin-left: -10px;
margin-top: 5px;
.line {
float: left;
width: 3px;
height: 16px;
background: #4ea6ff;
border-radius: 30%;
margin-left: -10px;
margin-top: 5px;
}
::v-deep .ant-descriptions-header{
margin-bottom: 18px ;
::v-deep .ant-descriptions-header {
margin-bottom: 18px;
}
.goback {
float: right;
padding-right: 70px;
@@ -558,36 +564,42 @@ margin-top: 5px;
color: #4ea6ff;
font-size: 14px;
}
}
.moreidbtn {
border: none;
color: #4ea6ff;
width: 80px
}
.moreidbtn {
border: none;
color: #4ea6ff;
width: 80px
}
::v-deep .ant-select-selection-overflow-item {
margin-top: -2px;
margin-top: -2px;
}
::v-deep .ant-select-multiple .ant-select-selection-item {
height: 34px
height: 34px
}
.tableBox {
padding-bottom: 20px;
margin: 20px 38px 30px;
::v-deep .ant-select-dropdown{
display: inline-block;
}
::v-deep .ant-select-selection-item{
margin-left: 3px;
}
::v-deep .ant-pagination-options-size-changer.ant-select{
width: 84px;
}
.pa {
width: 100%;
display: flex;
justify-content: right;
}
padding-bottom: 20px;
margin: 20px 38px 30px;
::v-deep .ant-select-dropdown {
display: inline-block;
}
::v-deep .ant-select-selection-item {
margin-left: 3px;
}
::v-deep .ant-pagination-options-size-changer.ant-select {
width: 84px;
}
.pa {
width: 100%;
display: flex;
justify-content: right;
}
}
</style>

View File

@@ -8,7 +8,7 @@
v-model:value="managerArray"
:placeholder="placeholder"
:filterOption="false"
:options="isOpen?options:selectOptions"
:options="isOpen ? options : selectOptions"
allowClear
showSearch
:disabled="disabled"
@@ -21,71 +21,86 @@
style="width: 100%"
>
<template v-if="loading" #notFoundContent>
<a-spin size="small"/>
<a-spin size="small" />
</template>
</a-select>
</template>
<script setup>
import {computed, defineEmits, defineProps, onMounted, ref, watch} from "vue";
import {useThrottlePage} from "@/api/request";
import { computed, defineEmits, defineProps, onMounted, ref, watch } from "vue";
import { useThrottlePage } from "@/api/request";
import { getTeacherList } from "@/api/Lecturer";
const props = defineProps({
value: {
type: String,
default: ''
default: "",
},
name: {
type: String,
default: ''
default: "",
},
supplier: {
type: String,
default: ""
},
mobile: {
type: String,
default: ''
default: "",
},
disabled: Boolean,
placeholder: {
type: String,
default: "请输入搜索关键字",
},
mode: String
})
mode: String,
});
const selectOptions = ref([])
const selectOptions = ref([]);
const managerArray = computed(() => props.value === '' ? null : props.value)
const supplier = ref('')
const emit = defineEmits({})
const isOpen = ref(false)
const managerArray = computed(() => (props.value === "" ? null : props.value));
const emit = defineEmits({});
const isOpen = ref(false);
function debounce(func, wait) {
let timeout;
return function(...args) {
return function (...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
const memberParam = ref({name: '', pageNo:1, pageSize: 999,teacherType:2 ,status:1})
const memberParam = ref({
name: "",
pageNo: 1,
pageSize: 999,
teacherType: 2,
status: 1,
});
const userList = ref([])
const loading = ref(false)
const userList = ref([]);
const loading = ref(false);
const getOutTeacher = () => {
getTeacherList(memberParam.value).then(res=>{
if(res.data.code == 200){
userList.value = res.data.data.records
loading.value = false
getTeacherList(memberParam.value).then((res) => {
if (res.data.code == 200) {
userList.value = res.data.data.records;
loading.value = false;
}
})
}
const options = computed(() => userList.value.map(e => ({
});
};
const options = computed(() =>
userList.value.map((e) => ({
// label: e.name + '(' + e.userNo + ')' + e.organizationName,
label:e.name+ '(' +e.supplier + ')',
label: e.name + "/" + e.supplier,
value: e.name,
supplier: e.supplier,
...e,
audienceList: null
})))
audienceList: null,
}))
);
watch(props, init)
watch(props, init);
function init() {
//第一次进来 编辑赋值
@@ -95,46 +110,47 @@ function init() {
}
onMounted(() => {
console.log('onMounted')
init()
getOutTeacher()
})
console.log("onMounted");
init();
getOutTeacher();
});
const memberScroll = ({target: {scrollHeight, scrollTop, clientHeight}}) => {
scrollHeight === (clientHeight + scrollTop) && memberParam.value.pageNo++
const memberScroll = ({
target: { scrollHeight, scrollTop, clientHeight },
}) => {
scrollHeight === clientHeight + scrollTop && memberParam.value.pageNo++;
};
const debounceObject = debounce(getOutTeacher,1000)
const debounceObject = debounce(getOutTeacher, 1000);
//搜索学员
const searchMember = (keyword) => {
console.log('searchMember', keyword)
loading.value = true
isOpen.value = true
userList.value = []
memberParam.value.pageNo = 1
memberParam.value.teacherType=2
memberParam.value.name = keyword
console.log('searchMember', memberParam.value)
debounceObject()
console.log("searchMember", keyword);
loading.value = true;
isOpen.value = true;
userList.value = [];
memberParam.value.pageNo = 1;
memberParam.value.teacherType = 2;
memberParam.value.name = keyword;
console.log("searchMember", memberParam.value);
debounceObject();
};
function blur() {
isOpen.value = false
memberParam.value.name = ''
memberParam.value.pageNo = 1
memberParam.value.teacherType=2
isOpen.value = false;
memberParam.value.name = "";
memberParam.value.pageNo = 1;
memberParam.value.teacherType = 2;
}
function change(e, l) {
memberParam.value.name = ''
memberParam.value.teacherType=2
memberParam.value.pageNo = 1
isOpen.value = false
Array.isArray(l) && (selectOptions.value = l)
Array.isArray(selectOptions.value) && emit('onChange', e, l)
emit('update:name', l?.label)
emit('update:value', l?.value)
emit('update:mobile', l?.label)
memberParam.value.name = "";
memberParam.value.teacherType = 2;
memberParam.value.pageNo = 1;
isOpen.value = false;
Array.isArray(l) && (selectOptions.value = l);
Array.isArray(selectOptions.value) && emit("onChange", e, l);
emit("update:name", l?.label);
emit("update:value", l?.value);
emit("update:supplier", l?.supplier);
emit("update:mobile", l?.label);
}
</script>

View File

@@ -78,11 +78,11 @@
</a-tabs>
</div>
</div>
<div class="btnn" v-if="formData?.status==1||formData?.status==4">
<!-- <div class="btnn" v-if="formData?.status==1||formData?.status==4"> -->
<!-- <button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">确定</button> -->
<button class="btn2" @click="confirm">撤销编辑内容</button>
</div>
<!-- <button class="btn2" @click="confirm">撤销编辑内容</button> -->
<!-- </div> -->
</div>
<a-modal :footer="null" width="800px" v-model:visible="visibleModal" title="审批记录详情">
<div style="margin: 20px;padding-bottom: 20px;">

View File

@@ -9,34 +9,30 @@
<!-- <a-input v-model:value="searchParam.userNo" style="width: 276px; height: 40px; border-radius: 8px"
placeholder="请输入工号/讲师姓名进行检索" allowClear showSearch>
</a-input> -->
<a-input style="width: 235px; height: 40px; border-radius: 8px" placeholder="请输入姓名/手机号进行检索" showSearch
allowClear v-model:value="searchParam.name"
v-on:keydown.enter="enterPressHadlerSearch"></a-input>
<a-input style="width: 235px; height: 40px; border-radius: 8px" placeholder="请输入姓名进行检索" showSearch allowClear
v-model:value="searchParam.name" v-on:keydown.enter="enterPressHadlerSearch"></a-input>
</a-form-item>
<a-form-item class="select">
<a-select style="width: 235px ;margin-bottom:20px" v-model:value="searchParam.supplier" placeholder="请输入供应商" :options="supperList" allowClear
v-on:keydown.enter="enterPressHadlerSearch" showSearch >
<a-select style="width: 235px ;margin-bottom:20px" v-model:value="searchParam.supplier" placeholder="请输入供应商"
:options="supperList" allowClear v-on:keydown.enter="enterPressHadlerSearch" showSearch>
</a-select>
</a-form-item>
<a-form-item class="select">
<a-input v-model:value="searchParam.courseName" style="width: 235px; height: 40px; border-radius: 8px"
placeholder="请输入课程名称进行搜索" allowClear showSearch
v-on:keydown.enter="enterPressHadlerSearch">
placeholder="请输入课程名称进行搜索" allowClear showSearch v-on:keydown.enter="enterPressHadlerSearch">
</a-input>
</a-form-item>
<a-form-item class="select ">
<!-- <div class="select addTimeBox">
<div class="addTime">授课日期</div> -->
<a-range-picker v-model:value="searchdate" style="width: 340px !important;" format="YYYY-MM-DD" valueFormat="YYYY-MM-DD"
separator="至" :placeholder="['授课日期开始时间', '授课日期结束时间']
"
v-on:keydown.enter="enterPressHadlerSearch" />
<a-range-picker v-model:value="searchdate" style="width: 340px !important;" format="YYYY-MM-DD"
valueFormat="YYYY-MM-DD" separator="至" :placeholder="['授课日期开始时间', '授课日期结束时间']
" v-on:keydown.enter="enterPressHadlerSearch" />
<!-- </div> -->
</a-form-item>
<a-form-item class="select">
<a-select style="width: 200px ;margin-bottom:20px" v-model:value="searchParam.createFrom" placeholder="录入类型"
:options="entryTypeList" allowClear
v-on:keydown.enter="enterPressHadlerSearch">
:options="entryTypeList" allowClear v-on:keydown.enter="enterPressHadlerSearch">
</a-select>
</a-form-item>
<a-form-item class="select">
@@ -47,14 +43,12 @@
}" allow-clear :getPopupContainer="triggerNode => triggerNode.parentNode || document.body"
v-model:value="searchParam.courseTypeId" show-search
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="请选择内容分类" tree-default-expand-all
:tree-data="sysTypeOptions"
v-on:keydown.enter="enterPressHadlerSearch">
:tree-data="sysTypeOptions" v-on:keydown.enter="enterPressHadlerSearch">
</a-tree-select>
</a-form-item>
<a-form-item class="select">
<a-select style="width: 200px" v-model:value="searchParam.courseStatus" placeholder="开课状态"
:options="AuthenticationStatusList" allowClear
v-on:keydown.enter="enterPressHadlerSearch">
:options="AuthenticationStatusList" allowClear v-on:keydown.enter="enterPressHadlerSearch">
</a-select>
</a-form-item>
<div style="display: flex; margin-bottom: 20px">
@@ -105,8 +99,10 @@
<template v-if="column.key === 'operation'">
<a-space>
<a-button type="link" @click="() => handleLook(record, String(record.courseform))">查看</a-button>
<a-button type="link" @click="() => handleModify(record, String(record.courseform))" v-if="record.createFrom == 1&&checkMenu('lecturerRecordsEdit')">编辑</a-button>
<a-button v-if="record.isSuperPermission==='true'&&checkMenu('lecturerRecordsDel')" type="link" @click="() => deleteModal(record, String(record.courseform))">删除</a-button>
<a-button type="link" @click="() => handleModify(record, String(record.courseform))"
v-if="record.createFrom == 1 && checkMenu('lecturerRecordsEdit')">编辑</a-button>
<a-button v-if="record.isSuperPermission === 'true' && checkMenu('lecturerRecordsDel')" type="link"
@click="() => deleteModal(record, String(record.courseform))">删除</a-button>
</a-space>
</template>
</template>
@@ -116,63 +112,53 @@
</div>
<div class="tableBox ">
<div class="pa">
<a-pagination
v-if="tableDataTotal > 10"
:showSizeChanger="true"
:showQuickJumper="false"
:hideOnSinglePage="false"
:pageSize="searchParam.pageSize"
:current="searchParam.pageNo"
:total="tableDataTotal"
class="pagination"
@change="changePagination"
/>
<a-pagination v-if="tableDataTotal > 10" :showSizeChanger="true" :showQuickJumper="false"
:hideOnSinglePage="false" :pageSize="searchParam.pageSize" :current="searchParam.pageNo"
:total="tableDataTotal" class="pagination" @change="changePagination" />
<!-- :show-total="total => `共 ${total} 条数据`" -->
</div>
</div>
<!-- 弹窗组件 -->
<a-drawer class="largeDrawerInside" v-model:visible="teacherdialog" placement="right" :maskClosable="false" :closable="false"
width="60%" :title="false">
<a-drawer class="largeDrawerInside" v-model:visible="teacherdialog" placement="right" :maskClosable="false"
:closable="false" width="60%" :title="false">
<div style="padding:24px;">
<div class="headers" style="margin-top:-24px;">
<div class="headerTitle">{{ teacherdialogtitle }}</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="@/assets/images/basicinfo/close.png"
@click="cancelTeacherDialog"
/>
<img style="width: 29px; height: 29px; cursor: pointer" src="@/assets/images/basicinfo/close.png"
@click="cancelTeacherDialog" />
</div>
<a-form :model="formParam" layout="vertical" ref="formRef">
<!--讲师名称 teacherName 内容分类 coursetypeid -->
<a-row :gutter="16">
<a-col :span="12">
<a-form-item name="teacherName">
<template v-slot:label>
<img
style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
讲师名称
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
讲师名称todo
</template>
<ProjectManagerOutTeacher v-model:value="formParam.name"
v-model:name="formParam.teacherName"
placeholder="请输入工号/讲师姓名进行检索"
@onChange="managerChange"></ProjectManagerOutTeacher>
<!-- <a-input v-model:value="formParam.teacherName" allowClear showSearch class="draitem"
placeholder="请输入讲师姓名"></a-input> -->
<!-- TODO GX01 -->
<ProjectManagerOutTeacher v-model:value="formParam.name" v-model:name="formParam.teacherName"
placeholder="请输入工号/讲师姓名进行检索" @onChange="managerChange"></ProjectManagerOutTeacher>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item name="supplier">
<template v-slot:label>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
供应商
</template>
<!-- TODO GX01 -->
<a-input class="draitem" v-model:value="formParam.name" disabled :maxlength="20" showCount @blur="sendName">
</a-input>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item name="courseTypeId">
<template v-slot:label>
<img
style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
内容分类
</template>
<a-tree-select :fieldNames="{
@@ -181,9 +167,8 @@
value: 'code',
}" allow-clear :getPopupContainer="triggerNode => triggerNode.parentNode || document.body"
v-model:value="formParam.courseTypeId" show-search
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="请选择内容分类" tree-default-expand-all
:tree-data="sysTypeOptions"
@change="treetype">
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="请选择内容分类"
tree-default-expand-all :tree-data="sysTypeOptions" @change="treetype">
</a-tree-select>
</a-form-item>
</a-col>
@@ -193,14 +178,12 @@
<a-col :span="12">
<a-form-item name="courseName">
<template v-slot:label>
<img
style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
课程名称
</template>
<a-input class="draitem" v-model:value="formParam.courseName" :maxlength="20" showCount placeholder="请输入课程名称" @blur="sendName" allowClear showSearch>
<a-input class="draitem" v-model:value="formParam.courseName" :maxlength="20" showCount
placeholder="请输入课程名称" @blur="sendName" allowClear showSearch>
</a-input>
</a-form-item>
</a-col>
@@ -215,15 +198,12 @@
<a-col :span="12">
<a-form-item name="teachingDate">
<template v-slot:label>
<img
style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
授课/课程日期 :
</template>
<a-date-picker class="draitem" v-model:value="teachingDate" style="width:100%" format="YYYY-MM-DD HH:mm" :show-time="{ format: 'HH:mm' }"
placeholder="请选择课程日期" />
<a-date-picker class="draitem" v-model:value="teachingDate" style="width:100%" format="YYYY-MM-DD HH:mm"
:show-time="{ format: 'HH:mm' }" placeholder="请选择课程日期" />
</a-form-item>
</a-col>
</a-row>
@@ -233,16 +213,12 @@
<a-col :span="12">
<a-form-item name="teaching">
<template v-slot:label>
<img
style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
授课时长
</template>
<a-input v-model:value="formParam.teaching" style="width:100%; height: 40px; border-radius: 8px; "
placeholder="请输入授课时长" allowClear showSearch suffix="分钟"
:maxLength="8" @change="clearNonNumber">
placeholder="请输入授课时长" allowClear showSearch suffix="分钟" :maxLength="8" @change="clearNonNumber">
</a-input>
<!-- <span style="margin-left: 5px ;" v-if="formParam.teaching != null">{{ (formParam.teaching / 60
).toFixed(2) }}小时</span>
@@ -252,15 +228,12 @@
<a-col :span="12">
<a-form-item name="studys">
<template v-slot:label>
<img
style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
参训人数
</template>
<a-input v-model:value="formParam.studys" class="draitem" placeholder="请输入参训人数" allowClear showSearch :maxLength="8"
@blur="clearstudysNumber">
<a-input v-model:value="formParam.studys" class="draitem" placeholder="请输入参训人数" allowClear showSearch
:maxLength="8" @blur="clearstudysNumber">
</a-input>
</a-form-item>
</a-col>
@@ -271,17 +244,14 @@
<a-col :span="12">
<a-form-item name="score">
<template v-slot:label>
<img
style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
<img style="margin-right:4px;width: 7px;height: 7px"
src="@/assets/images/coursewareManage/asterisk.png" alt="" />
评分
</template>
<!-- <a-input class="draitem" v-model:value="formParam.score" @blur="clearscoreNumber" placeholder="" allowClear showSearch>
</a-input> -->
<a-input-number @blur="blurScore" @focus="focusScore" v-model:value="formParam.score" :precision="2" :min="1" :max="100"
style="width:100%; height: 40px; border-radius: 8px ; " placeholder="请输入评分" />
<a-input-number @blur="blurScore" @focus="focusScore" v-model:value="formParam.score" :precision="2"
:min="1" :max="100" style="width:100%; height: 40px; border-radius: 8px ; " placeholder="请输入评分" />
</a-form-item>
</a-col>
</a-row>
@@ -289,8 +259,7 @@
<a-row :gutter="16">
<a-col :span="24">
<a-form-item label="备注">
<a-textarea v-model:value="formParam.remark" showCount :maxlength="200"
@blur="sendRemark"
<a-textarea v-model:value="formParam.remark" showCount :maxlength="200" @blur="sendRemark"
style="width: 100%; height: 100px; border-radius: 8px" placeholder="请输入" />
</a-form-item>
</a-col>
@@ -314,36 +283,36 @@
</div>
</a-drawer>
<!-- 查看授课记录 -->
<a-drawer class="largeDrawerInside" v-model:visible="teachingdialog" placement="right" :maskClosable="true" :closable="false"
width="60%" :title="false">
<a-drawer class="largeDrawerInside" v-model:visible="teachingdialog" placement="right" :maskClosable="true"
:closable="false" width="60%" :title="false">
<div style="padding:24px;">
<div class="headers" style="margin-top:-24px;">
<div class="headerTitle">查看讲师授课记录</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="@/assets/images/basicinfo/close.png"
@click="cancelTeachingDialog"
/>
<img style="width: 29px; height: 29px; cursor: pointer" src="@/assets/images/basicinfo/close.png"
@click="cancelTeachingDialog" />
</div>
<a-descriptions bordered :column="2" :contentStyle="rowCenter" :labelStyle="{'width':'160px'}">
<a-descriptions-item label="讲师名称">{{ formParam.teacherName ||'-'}}</a-descriptions-item>
<a-descriptions-item label="手机号码">{{ formParam.mobile ||'-'}}</a-descriptions-item>
<a-descriptions-item label="课程类型">{{ formParam.type == 0 ? '在线课' : formParam.type == 1 ? '面授课' : formParam.type == 2 ? '手动录入' : '-'
<a-descriptions bordered :column="2" :contentStyle="rowCenter" :labelStyle="{ 'width': '160px' }">
<a-descriptions-item label="讲师名称">{{ formParam.teacherName || '-' }}</a-descriptions-item>
<a-descriptions-item label="手机号码">{{ formParam.mobile || '-' }}</a-descriptions-item>
<a-descriptions-item label="课程类型">{{ formParam.type == 0 ? '在线课' : formParam.type == 1 ? '面授课' :
formParam.type ==
2 ? '手动录入' : '-'
}}</a-descriptions-item>
<a-descriptions-item label="课程名称">{{ formParam.courseName ||'-'}}</a-descriptions-item>
<a-descriptions-item label="课程名称">{{ formParam.courseName || '-' }}</a-descriptions-item>
<a-descriptions-item label="开课状态">{{ formParam.courseStatus == 0 ? '未开课' : formParam.courseStatus == 1
? '已开课' : '-' }}</a-descriptions-item>
<a-descriptions-item label="内容分类 ">{{ formParam.courseTypeName ||'-'}}</a-descriptions-item>
<a-descriptions-item label="授课/课程日期 ">{{ formParam.teachingDate ||'-' }}
<a-descriptions-item label="内容分类 ">{{ formParam.courseTypeName || '-' }}</a-descriptions-item>
<a-descriptions-item label="授课/课程日期 ">{{ formParam.teachingDate || '-' }}
</a-descriptions-item>
<a-descriptions-item label="授课时长 "> <span > {{ formParam.teaching }} 分钟</span>
<a-descriptions-item label="授课时长 "> <span> {{ formParam.teaching }} 分钟</span>
<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?Number(formParam.score).toFixed(0)==0?'-':Number(formParam.score).toFixed(2)+'分':'-'}}</a-descriptions-item>
<a-descriptions-item label="参训人数 ">{{ formParam.studys ? formParam.studys+'' :'-'}}</a-descriptions-item>
<a-descriptions-item label="备注 " :span="2">{{ formParam.remark ||'-' }}</a-descriptions-item>
<a-descriptions-item label="评分 ">{{
formParam.score ? Number(formParam.score).toFixed(0) == 0 ? '-' : Number(formParam.score).toFixed(2) +'':'-'}}</a-descriptions-item>
<a-descriptions-item label="参训人数 ">{{ formParam.studys ? formParam.studys + '人' : '-' }}</a-descriptions-item>
<a-descriptions-item label="备注 " :span="2">{{ formParam.remark || '-' }}</a-descriptions-item>
</a-descriptions>
<!-- <div :style="{
position: 'absolute',
@@ -389,12 +358,13 @@
</a-modal>
</div>
<!-- <div> <ImageUpload/> </div> -->
<ImportWork v-model:showWork="showWork" :template="'外部讲师授课记录导入模版-20250115.xlsx'" :url="'/admin/export/importOutTeacherRecord'" :title="title"></ImportWork>
<ImportWork v-model:showWork="showWork" :template="'外部讲师授课记录导入模版-20250115.xlsx'"
:url="'/admin/export/importOutTeacherRecord'" :title="title"></ImportWork>
</div>
</template>
<script lang="jsx">
import { reactive, toRefs, ref, computed,onMounted } from "vue";
import { useRouter ,useRoute} from "vue-router";
import { reactive, toRefs, ref, computed, onMounted ,watch} from "vue";
import { useRouter, useRoute } from "vue-router";
import { useStore } from "vuex";
import {
RightOutlined,
@@ -408,7 +378,7 @@ import { message } from "ant-design-vue";
import ProjectManager from "@/components/project/ProjectManagerNew";
import ProjectManagerOutTeacher from "@/components/project/ProjectManagerOutTeacher";
import dayjs from "dayjs";
import { getTeacherCourseList, updateInTeacherCourse, getNewInTeacherCourseList, deleteInTeacherCourse, insertInTeacherCourse,selectSupplier } from "../../api/Teaching";
import { getTeacherCourseList, updateInTeacherCourse, getNewInTeacherCourseList, deleteInTeacherCourse, insertInTeacherCourse, selectSupplier } from "../../api/Teaching";
// import {getProjSt} from "../../api/indexProjStu";
import { checkMenu } from '@/utils/utils'
// import AddTeacher from "../../components/drawers/project/AddTeacher"
@@ -427,7 +397,7 @@ export default {
setup() {
onMounted(() => {
const search = sessionStorage.getItem('searchExter')
if(route.query.activeKey == 2&&search){
if (route.query.activeKey == 2 && search) {
state.searchParam = JSON.parse(search)
}
searchSubmit()
@@ -456,12 +426,14 @@ export default {
teachingDate: undefined, //选择时间
tableDataTotal: -1,//table列表总条数
formParam: {
name: null,
supplier: null,
courseStatus: '1',
createFrom: 1,
teaching: null,
teachingDate: null,
teacherId:null,
mobile:null,
teacherId: null,
mobile: null,
score: null
},
searchdate: undefined, //选择时间
@@ -503,8 +475,17 @@ export default {
//获取内容分类
const sysTypeOptions = computed(() => store.state.content_type);
const treetype =(val,lab)=>{
state.formParam.courseTypeName =lab.toString()
watch(() => state.formParam.name, (val) => {
console.log(val, 'name gx data')
})
watch(() => state.formParam.teacherName, (val) => {
console.log(val, 'teacherName gx data')
})
const treetype = (val, lab) => {
state.formParam.courseTypeName = lab.toString()
}
const OnTheJobStatusList = ref([
{ value: 1, label: "项目开课" },
@@ -512,13 +493,13 @@ export default {
{ value: 3, label: "面授开课" },
])
const supperList = ref([])
const getSupplier = ()=>{
selectSupplier().then(res=>{
if(res.data.code == 200){
supperList.value = res.data.data.map(item=>{
const getSupplier = () => {
selectSupplier().then(res => {
if (res.data.code == 200) {
supperList.value = res.data.data.map(item => {
return {
value:item,
label:item
value: item,
label: item
}
})
supperList.value.unshift({
@@ -560,7 +541,7 @@ export default {
key: 'supplier',
ellipsis: true, align: "center",
width: 150,
customRender: ({text})=> text||'-'
customRender: ({ text }) => text || '-'
},
{
title: '课程名称 ',
@@ -586,13 +567,13 @@ export default {
customRender: (value) => {
return (
<div>
{String(value.record.type)
{ String(value.record.type)
? {
"0": "在线课",
"1": "面授课",
"2": "手动录入",
}[value.record.type + ""]
: "-"}
: "-" }
</div>
)
}
@@ -606,7 +587,7 @@ export default {
customRender: (value) => {
return (
<div>
{value.record?.teachingDate?dayjs(value.record?.teachingDate).format("YYYY-MM-DD HH:mm"):'-'}
{ value.record?.teachingDate ? dayjs(value.record?.teachingDate).format("YYYY-MM-DD HH:mm") : '-' }
</div>
);
},
@@ -627,12 +608,12 @@ export default {
customRender: (value) => {
return (
<div>
{value.record.courseStatus == 0 || value.record.courseStatus == 1
{ value.record.courseStatus == 0 || value.record.courseStatus == 1
? {
"0": "未开课",
"1": "已开课",
}[value.record.courseStatus + ""] || ""
: "-"}
: "-" }
</div>
)
}
@@ -666,7 +647,7 @@ export default {
customRender: (value) => {
return (
<div>
{value.record?.teaching ? value.record.teaching + '分钟' : '-'}
{ value.record?.teaching ? value.record.teaching + '分钟' : '-' }
</div>
);
},
@@ -677,8 +658,8 @@ export default {
key: 'studys',
ellipsis: true, align: "center",
width: 120,
customRender: ({text})=>{
return text ? text+'人' : '-'
customRender: ({ text }) => {
return text ? text + '人' : '-'
}
},
{
@@ -690,7 +671,7 @@ export default {
customRender: (value) => {
return (
<div>
{value.record.score?Number(value.record.score).toFixed(0)==0?'-':Number(value.record.score).toFixed(2)+'分' : '-'}
{ value.record.score ? Number(value.record.score).toFixed(0) == 0 ? '-' : Number(value.record.score).toFixed(2) + '分' : '-' }
</div>
)
}
@@ -704,12 +685,12 @@ export default {
customRender: (value) => {
return (
<div>
{value.record.createFrom == "0" || value.record.createFrom == "1"
{ value.record.createFrom == "0" || value.record.createFrom == "1"
? {
"0": "系统生成",
"1": "手动录入",
}[value.record.createFrom + ""] || ""
: "-"}
: "-" }
</div>
)
}
@@ -802,7 +783,7 @@ export default {
cancel()
state.teacherdialog = true;
state.teacherdialogtitle = '添加授课记录'
state.formParam.createFrom='1'
state.formParam.createFrom = '1'
state.vf = true
}
@@ -829,12 +810,12 @@ export default {
//保存
const createTeacherDialog = async () => {
state.formParam.teachingDate = state.teachingDate ? dayjs(state.teachingDate).format("YYYY-MM-DD HH:mm").toString() : ""
if(state.formParam.studys==0){
if (state.formParam.studys == 0) {
state.formParam.studys = null
}
if(state.formParam.score||state.formParam.score==0){
if (state.formParam.score || state.formParam.score == 0) {
state.formParam.score = String(state.formParam.score)
}else{
} else {
state.formParam.score = null
}
state.formParam.courseStatus = String(state.formParam.courseStatus)
@@ -915,7 +896,7 @@ export default {
score: null,
remark: null,
teachingDate: null,
teacherId:null
teacherId: null
}
state.teachingDate = null
}
@@ -946,8 +927,8 @@ export default {
const TeacherSystem = () => {
getTeacherCourseList({ id: state.lookTeacherId }).then((res) => {
state.formParam = res.data.data
state.teachingDate = res.data.data.teachingDate ? dayjs(res.data.data.teachingDate, 'YYYY-MM-DD HH:mm'):'',
state.formParam.name=state.formParam.teacherName
state.teachingDate = res.data.data.teachingDate ? dayjs(res.data.data.teachingDate, 'YYYY-MM-DD HH:mm') : '',
state.formParam.name = state.formParam.teacherName
state.formParam.teachingDate = state.teachingDate ? dayjs(state.teachingDate).format("YYYY-MM-DD HH:mm").toString() : ""
state.formParam.courseStatus = String(state.formParam.courseStatus)
})
@@ -955,9 +936,11 @@ export default {
});
}
function managerChange(e, l, d, t, orgName) {
console.log("managerChange e l",e,l)
// console.log(e, l, d, t, orgName,'e, l, d, t, orgName');
state.formParam.mobile=e?l.mobile:''
state.formParam.teacherId=e?l.id:''
state.formParam.mobile = e ? l.mobile : '';
state.formParam.teacherId = e ? l.id : '';
state.formParam.supplier = e ? l.supplier : '';
// state.searchParam.userNo = d;
// state.searchParam.name = t;
// state.searchParam.trainorgName=orgName
@@ -972,7 +955,7 @@ export default {
//导出功能
const handleExport = () => {
window.open(
`${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 || ""}`
`${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 = () => {
@@ -982,13 +965,13 @@ export default {
state.formParam.score = state.formParam.score.replace(/\D/g, '');
}
//回车
const enterPressHadlerSearch = e => {
    if (e.keyCode === 13) {
      searchSubmit()
const enterPressHadlerSearch = e => {
if (e.keyCode === 13) {
searchSubmit()
    }
};
const sendName=()=>{
}
};
const sendName = () => {
state.formParam.courseName = state.formParam.courseName.replace(/\s/g, '');
}
const blurScore = () => {
@@ -997,7 +980,7 @@ const sendName=()=>{
const focusScore = () => {
// state.formParam.score == 0 && (state.formParam.score = null)
}
const sendRemark=()=>{
const sendRemark = () => {
state.formParam.remark = state.formParam.remark.replace(/\s/g, '');
}
return {
@@ -1050,10 +1033,11 @@ const sendName=()=>{
},
};
</script>
<style lang="scss" scoped >
<style lang="scss" scoped>
.select .ant-picker {
width: 410px !important;
}
.headers {
height: 73px;
border-bottom: 1px solid #e8e8e8;
@@ -1072,6 +1056,7 @@ const sendName=()=>{
// margin-left: 24px;
}
}
.addTimeBox {
position: relative;
display: flex;
@@ -1343,6 +1328,7 @@ const sendName=()=>{
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.search {
width: 15px;
height: 16px;

File diff suppressed because it is too large Load Diff

View File

@@ -50,8 +50,18 @@
<!-- <OrgClass @enter="searchSubmit()" v-model:value="searchParam.orgId" :placeholder="'请选择讲师组织'"
style="width: 235px"
></OrgClass> -->
<a-select style="width: 235px ;margin-bottom:20px" v-model:value="searchParam.trainOrgId" placeholder="请选择培训发生组织" allowClear
:options="orgListSearch"
<!-- TODO GX02-->
<a-select
style="width: 235px ;
margin-bottom:20px"
v-model:value="searchParam.trainOrgId"
placeholder="请选择培训发生组织"
allowClear
showSearch
:filter-option="false"
:options="filterOrgListSearch"
@search="handleOrgSearch"
@change="changeOrg"
v-on:keydown.enter="enterPressHadlerSearch">
</a-select>
</a-form-item>
@@ -284,8 +294,14 @@
/>
培训发生组织
</template>
<a-select v-model:value="formParam.trainOrgId" placeholder="请选择培训发生组织" allowClear
:options="orgList" @change="changeOrg">
<!-- TODO5 授课讲师 -->
<a-select v-model:value="formParam.trainOrgId" placeholder="请选择培训发生组织"
allowClear
showSearch
:filter-option="false"
:options="filterOrgListSearch"
@search="handleOrgSearch"
@change="changeOrg">
</a-select>
<!-- <OrgClass v-model:value="formParam.sourceBelongId" v-model:name="formParam.sourceBelongFullName"></OrgClass> -->
</a-form-item>
@@ -413,27 +429,28 @@
<span style="font-weight:600;">讲师信息</span>
<a-descriptions style="margin-top:15px;" bordered :column="2" :contentStyle="{'maxWidth':'300px'}" :labelStyle="{'width':'160px'}">
<a-descriptions-item label="讲师名称"><div style="user-select: text">{{ formParam.teacherName ||'-'}}/{{ formParam.userNo||'-' }}</div></a-descriptions-item>
<!-- <a-descriptions-item label="讲师组织">{{ formParam.orgName||'-' }}</a-descriptions-item> -->
<a-descriptions-item label="培训发生组织">{{ formParam.trainOrgName||'-' }}</a-descriptions-item>
<!-- <a-descriptions-item label="讲师体系">{{ formParam.tsystemName||'-' }}</a-descriptions-item> -->
<!-- <a-descriptions-item label="讲师级别">{{ formParam.tlevelName||'-'}}</a-descriptions-item> -->
<a-descriptions-item label="数据来源">
{{ formParam.createFrom == 0 ? '系统生成' : formParam.createFrom == 1 ? '手动录入' : '-' }}</a-descriptions-item>
<a-descriptions-item label="课程类型">{{ formParam.type == 0 ? '在线课' : formParam.type == 1 ? '面授课' : formParam.type == 2 ? '手动录入' : '-'
}}</a-descriptions-item>
<a-descriptions-item label="课程名称"><div style="user-select: text">{{ formParam.courseName||'-' }}</div></a-descriptions-item>
<a-descriptions-item label="课程类型">
{{ formParam.type == 0 ? '在线课' : formParam.type == 1 ? '面授课' : formParam.type == 5 ? '手动录入' : '-'
}}</a-descriptions-item>
<a-descriptions-item label="授课/课程日期"><div style="user-select: text">{{ formParam.teachingDate||'-' }}</div></a-descriptions-item>
<a-descriptions-item label="开课状态">{{ formParam.courseStatus == 0 ? '未开课' : formParam.courseStatus == 1
? '已开课' : '-' }}</a-descriptions-item>
<a-descriptions-item label="授课/课程时长 ">
<a-descriptions-item label="授课/课程时长(分钟)">
<span> {{ formParam.teaching }} 分钟</span>
<span style="margin-left: 10px ;" v-if="formParam.teaching != '0'">({{ (formParam.teaching / 60
).toFixed(2) }}小时)</span> </a-descriptions-item>
<a-descriptions-item label="授课/课程日期"><div style="user-select: text">{{ formParam.teachingDate||'-' }}</div></a-descriptions-item>
<a-descriptions-item label="参训人数 ">{{ formParam.studys?formParam.studys+'人':'-' }}</a-descriptions-item>
<a-descriptions-item label="评分 ">{{ formParam.score?Number(formParam.score).toFixed(0)==0?'-':Number(formParam.score).toFixed(2)+'分':'-' }}</a-descriptions-item>
<!-- <a-descriptions-item label="内容分类">{{ formParam.courseTypeName||'-' }}</a-descriptions-item> -->
<!-- <a-descriptions-item label="讲师组织">{{ formParam.orgName||'-' }}</a-descriptions-item> -->
<a-descriptions-item label="培训发生组织">{{ formParam.trainOrgName||'-' }}</a-descriptions-item>
<a-descriptions-item label="是否生成讲师费">{{{0:'否',1:'是'}[formParam.createdFee]}}</a-descriptions-item>
<!-- <a-descriptions-item label="讲师体系">{{ formParam.tsystemName||'-' }}</a-descriptions-item> -->
<!-- <a-descriptions-item label="讲师级别">{{ formParam.tlevelName||'-'}}</a-descriptions-item> -->
<!-- <a-descriptions-item label="数据来源">
{{ formParam.createFrom == 0 ? '系统生成' : formParam.createFrom == 1 ? '手动录入' : '-' }}</a-descriptions-item> -->
<!-- <a-descriptions-item label="内容分类">{{ formParam.courseTypeName||'-' }}</a-descriptions-item> -->
<a-descriptions-item label="备注 ">{{ formParam.remark||'-' }}</a-descriptions-item>
</a-descriptions>
<div v-if="formParam.createFrom == '0'">
@@ -560,6 +577,7 @@ export default {
const router = useRouter();
const state = reactive({
orgListSearch: [],
filterOrgListSearch: [],
moreid: 1,
title: '导入内部授课记录',
vf: false,
@@ -803,7 +821,7 @@ export default {
? {
"0": "在线课",
"1": "面授课",
"2": "手动录入",
"5": "手动录入",
}[value.record.type + ""]
: "-"}
</div>
@@ -890,25 +908,25 @@ export default {
)
}
},
{
title: '数据来源',
dataIndex: 'createFrom',
key: 'createFrom',
ellipsis: true, align: "center",
width: 120,
customRender: (value) => {
return (
<div>
{value.record.createFrom == "0" || value.record.createFrom == "1"
? {
"0": "系统生成",
"1": "手动录入",
}[value.record.createFrom + ""] || ""
: "-"}
</div>
)
}
},
// {
// title: '数据来源',
// dataIndex: 'createFrom',
// key: 'createFrom',
// ellipsis: true, align: "center",
// width: 120,
// customRender: (value) => {
// return (
// <div>
// {value.record.createFrom == "0" || value.record.createFrom == "1"
// ? {
// "0": "系统生成",
// "1": "手动录入",
// }[value.record.createFrom + ""] || ""
// : "-"}
// </div>
// )
// }
// },
{
title: '培训发生组织 ',
dataIndex: 'trainOrgName',
@@ -963,6 +981,7 @@ export default {
pageSize:50
}
queryTrainOrgPor(obj).then((res) => {
state.orgList = res.data.data?.map(item=>{
return{
label: item.affiliationName,
@@ -978,9 +997,19 @@ export default {
state.orgListSearch.unshift({
label: '全部', value: ''
})
state.filterOrgListSearch = state.orgListSearch;
})
}
//TODO5
const changeOrg = (e,l) => {
console.log("changeOrg e",e);
console.log("changeOrg l",l);
if(l == undefined || l == null){
state.filterOrgListSearch = state.orgListSearch;
}
state.formParam.trainOrgName = l?.label
}
const rules = {
@@ -1489,6 +1518,16 @@ export default {
const sendRemark = () => {
state.formParam.remark = state.formParam.remark.replace(/\s/g, '');
}
//TODO5
const handleOrgSearch = (value) => {
let temp = JSON.parse(JSON.stringify(state.orgListSearch));
//选择数据
state.filterOrgListSearch = temp.filter(item => item.label.includes(value))
}
return {
...toRefs(state),
sendName,
@@ -1548,7 +1587,8 @@ export default {
// editTimeChange,
scoreChange,
locale,
checkMenu
checkMenu,
handleOrgSearch
}
},
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +1,26 @@
<!-- 讲师费管理 -->
<template>
<div class="LecturerFeeManagement">
<div style="margin: 20px;margin-top:0;" >
<a-tabs v-model:activeKey="activeKey" >
<div style="margin: 20px;margin-top:0;">
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="讲师费管理">
<LecturerFee />
<LecturerFee :activeKeyFn="activeKeyFn"/>
</a-tab-pane>
<!-- v-if="lecturerAdmin('lecturer-admin')" -->
<a-tab-pane key="2" tab="审批中心">
<LecturerApproval/>
<LecturerApproval :activeKeyProps="activeKey"/>
</a-tab-pane>
</a-tabs>
</a-tabs>
</div>
</div>
</template>
<script lang="jsx">
import { reactive, toRefs, ref, watch,onMounted,computed } from "vue";
import { reactive, toRefs, ref, watch, onMounted, computed } from "vue";
import LecturerFee from "../lecturer/LecturerFee.vue"
import LecturerApproval from "../lecturer/LecturerApproval.vue"
import { useRoute } from "vue-router";
import {useStore} from 'vuex'
export default {
import { useStore } from 'vuex'
export default {
name: "LecturerFeeManagement",
components: {
LecturerFee,
@@ -28,36 +28,43 @@ import {useStore} from 'vuex'
},
setup() {
const store = useStore();
const userInfo = computed(()=> store.state.userInfo)
const userInfo = computed(() => store.state.userInfo)
const route = useRoute();
const state = reactive({
activeKey:'1',
activeKey: '1',
})
const lecturerAdmin = (admin)=>{
const roleCode = userInfo.value.roleList.map((item)=>item.roleCode)
if (admin){
//
const lecturerAdmin = (admin) => {
const roleCode = userInfo.value.roleList.map((item) => item.roleCode)
if (admin) {
return roleCode.some(t => t == admin)
}
}
watch(
)
onMounted(() => {
if(route.query.activeKey){
if (route.query.activeKey) {
state.activeKey = '2'
}
})
const activeKeyFn = () => {
state.activeKey = '2'
}
return {
...toRefs(state),
lecturerAdmin,
activeKeyFn
}
},
};
</script>
<style lang="scss" scoped>
::v-deep .ant-tabs-tab{
::v-deep .ant-tabs-tab {
font-weight: 600;
}
.LecturerFeeManagement {
.LecturerFeeManagement {
width: 100%;
height: 100%;
display: flex;

View File

@@ -1,25 +1,25 @@
<!-- 讲师列表 -->
<template>
<div class="LecturerList">
<div style="margin: 20px;margin-top:0;" >
<div style="margin: 20px;margin-top:0;">
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="内部讲师">
<InsideLecturer/>
<InsideLecturer />
</a-tab-pane>
<a-tab-pane key="2" tab="外部讲师">
<ExternalLecturer/>
<ExternalLecturer />
</a-tab-pane>
</a-tabs>
</div>
</div>
</template>
<script lang="jsx">
import { reactive, toRefs, ref, watch,onMounted,nextTick } from "vue";
import InsideLecturer from "../lecturer/InsideLecturer.vue"
import ExternalLecturer from "../lecturer/ExternalLecturer.vue"
import { useRoute } from 'vue-router'
import { useStore } from 'vuex'
export default {
</template>
<script lang="jsx">
import { reactive, toRefs, ref, watch, onMounted, nextTick } from "vue";
import InsideLecturer from "../lecturer/InsideLecturer.vue"
import ExternalLecturer from "../lecturer/ExternalLecturer.vue"
import { useRoute } from 'vue-router'
import { useStore } from 'vuex'
export default {
name: "LecturerList",
components: {
InsideLecturer,
@@ -29,12 +29,12 @@
const route = useRoute()
const store = useStore()
const state = reactive({
activeKey:'1'
activeKey: '1'
})
watch(
)
onMounted(() => {
if(route.query.activeKey){
if (route.query.activeKey) {
state.activeKey = route.query.activeKey
}
})
@@ -42,13 +42,14 @@
...toRefs(state),
}
},
};
</script>
<style lang="scss" scoped>
::v-deep .ant-tabs-tab{
};
</script>
<style lang="scss" scoped>
::v-deep .ant-tabs-tab {
font-weight: 600;
}
.LecturerList {
}
.LecturerList {
width: 100%;
height: 100%;
display: flex;
@@ -321,4 +322,3 @@
}
}
</style>

View File

@@ -1,7 +1,7 @@
<!-- 讲师费月度统计详情页面 -->
<template>
<a-drawer :visible="visible" class="largeDrawerInside" placement="right" :closable="false"
width="80%" :title="false" @close="handleBack">
<a-drawer :visible="visible" class="largeDrawerInside" placement="right" :closable="false" width="80%" :title="false"
@close="handleBack">
<div class="MonthlyStatistics">
<!-- 搜索框及按钮 -->
<!-- <a-layout-header style="background: white;color: black; font-size: 20px ;">
@@ -15,19 +15,15 @@
</a-layout-header> -->
<div class="header">
<div class="headerTitle">讲师费月度统计详情</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="handleBack"
/>
<img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
@click="handleBack" />
</div>
<!-- <a-divider style="height: 1px; background-color: #b7b8b7 ;margin: 0;" /> -->
<div class="filter">
<a-form layout="inline" >
<a-form layout="inline">
<a-form-item class="select">
<a-input v-model:value="searchParam.name" style="width: 240px; height: 40px; border-radius: 8px"
placeholder="请输入工号/讲师姓名进行检索" allowClear showSearch
v-on:keydown.enter="enterPressHadlerSearch">
placeholder="请输入工号/讲师姓名进行检索" allowClear showSearch v-on:keydown.enter="enterPressHadlerSearch">
</a-input>
</a-form-item>
<!-- <a-form-item class="select">
@@ -64,8 +60,16 @@
</div>
</a-form>
<div style="width: 100%;"></div>
<div v-if="checkMenu('lecturerSummaryExport')" style="display: flex; margin-bottom: 20px">
<a-button class="resetbtn" @click="handleFeeMonthly" type="primary"><UploadOutlined/>导出</a-button>
<div style="display: flex; margin-bottom: 20px">
<a-button v-if="checkMenu('lecturerSummaryExport')" class="resetbtn" @click="handleFeeMonthly" type="primary">
<UploadOutlined />导出
</a-button>
<a-button v-if="checkMenu('lecturerMonthDown')" class="resetbtn" @click="handleFeeMonthlyDown" type="primary">
<UploadOutlined />讲师月度费用下载
</a-button>
<a-button v-if="checkMenu('lecturerMonthDetailDown')" class="resetbtn" @click="handleFeeMonthlyDetail" type="primary">
<UploadOutlined />讲师费用详情下载
</a-button>
</div>
<!-- 表格 -->
<div style="margin-bottom: 4px;color: #aaaaaa;">
@@ -73,15 +77,16 @@
</div>
<div style="padding: 10px 0">
<a-table :header-cell-style="{ 'text-align': 'center' }" style="border: 1px solid #f2f6fe" :columns="columns"
:data-source="tableData" :loading="tableLoading" :scroll="{ x: 600}" :pagination="pagination">
:data-source="tableData" :loading="tableLoading" :scroll="{ x: 600 }" :pagination="pagination">
<template #orgName="{ record }">
<div :title="record.orgName">{{ endOrg(record.orgName) }}</div>
</template>"
<template #bodyCell="{ record, column }">
<template v-if="column.key === 'operation'">
<a-space >
<a-space>
<a-button type="link" @click="() => handleLook(record, String(record.courseform))">查看</a-button>
<a-button v-if="checkMenu('lecturerSummaryCancel')" type="link" @click="handleLess(record)">撤回</a-button>
<a-button v-if="checkMenu('lecturerSummaryCancel')" type="link"
@click="handleLess(record)">撤回</a-button>
</a-space>
</template>
</template>
@@ -106,37 +111,37 @@
</div>
</div> -->
<!-- 抽屉 -->
<a-drawer class="largeDrawerInside" v-model:visible="opendrawer" placement="right"
@closa="cancelTeachingDialog" :maskClosable="true" width="80%" :title="false">
<div style="padding:24px;">
<a-drawer class="largeDrawerInside" v-model:visible="opendrawer" placement="right" @closa="cancelTeachingDialog"
:maskClosable="true" width="80%" :title="false">
<div style="padding:24px;">
<div class="headers" style="margin-top:-24px;">
<div class="headerTitle">查看详情</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="@/assets/images/basicinfo/close.png"
@click="cancelTeachingDialog"
/>
<img style="width: 29px; height: 29px; cursor: pointer" src="@/assets/images/basicinfo/close.png"
@click="cancelTeachingDialog" />
</div>
<a-form layout="inline">
<a-form layout="inline">
<a-form-item class="select">
<a-input @pressEnter="searchSubmitdrawer" v-model:value="drawer.name" style="width: 260px; height: 40px; border-radius: 8px"
placeholder="请输入课程名称进行搜索" allowClear showSearch>
<a-input @pressEnter="searchSubmitdrawer" v-model:value="drawer.name"
style="width: 260px; height: 40px; border-radius: 8px" placeholder="请输入课程名称进行搜索" allowClear showSearch>
</a-input>
</a-form-item>
<a-form-item class="select ">
<a-range-picker format="YYYY-MM-DD"
valueFormat="YYYY-MM-DD" style="width: 260px; height: 40px; margin-bottom: 20px; border-radius: 8px" v-model:value="drawer.drawersearchdate" separator=""
:placeholder="[' 开始时间', ' 结束时间']" @change="searchTimeChange" />
<a-range-picker format="YYYY-MM-DD" valueFormat="YYYY-MM-DD"
style="width: 260px; height: 40px; margin-bottom: 20px; border-radius: 8px"
v-model:value="drawer.drawersearchdate" separator="" :placeholder="[' 开始时间', ' 结束时间']"
@change="searchTimeChange" />
</a-form-item>
<div style="display: flex; margin-bottom: 20px">
<a-button @click="searchSubmitdrawer()" type="primary" class="resetbtn">查询 </a-button>
<a-button class="resetbtn " @click="searchResetdrawer">重置</a-button>
</div>
</a-form>
<!-- <span>讲师费发放情况</span> -->
<a-table :columns="column" :scroll="{ x: '1000' }" :data-source="tableDatas" :loading="tableLoadings" :pagination="false">
</div>
</a-form>
<!-- <span>讲师费发放情况</span> -->
<a-table :columns="column" :scroll="{ x: '1000' }" :data-source="tableDatas" :loading="tableLoadings"
:pagination="false">
<template #action="{ record, column }">
<a-button v-if="checkMenu('lecturerSummaryCancel')" type="link" @click="handleDetail(record)">撤回</a-button>
<a-button v-if="checkMenu('lecturerSummaryCancel')" type="link"
@click="handleDetail(record)">撤回</a-button>
</template>
</a-table>
<!-- <div :style="{
@@ -155,50 +160,50 @@
</a-button>
</div> -->
</div>
</a-drawer>
</a-drawer>
</div>
</a-drawer>
</a-drawer>
</template>
<script lang="jsx">
import { reactive, toRefs, ref, watch,computed } from "vue";
import { reactive, toRefs, ref, watch, computed } from "vue";
import { useStore } from "vuex";
import { useRouter,useRoute } from "vue-router";
import { useRouter, useRoute } from "vue-router";
import {
UploadOutlined,
} from '@ant-design/icons-vue';
import { getPayRollPlace,expenseSummaryById ,removeBySummaryId,removeBySummaryDetailId,queryDetailId} from "../../api/Lecturer";
import { getOrganization } from "../../api/Teaching";
} from '@ant-design/icons-vue';
import { getPayRollPlace, expenseSummaryById, removeBySummaryId, removeBySummaryDetailId, queryDetailId } from "../../api/Lecturer";
import { getOrganization } from "../../api/Teaching";
import ProjectManager from "@/components/project/ProjectManagerNew";
import {queryTeacherFeeMonthly} from "../../api/lecturerFeeStatistics";
import {CostDetails} from "../lecturer/CostDetails.vue"
import { queryTeacherFeeMonthly } from "../../api/lecturerFeeStatistics";
import { CostDetails } from "../lecturer/CostDetails.vue"
// import * as api from '@/api/Lecturer'
import dialog from '@/utils/dialog'
import {message} from 'ant-design-vue'
import { message } from 'ant-design-vue'
import { checkMenu } from '@/utils/utils'
export default {
name: "MonthlyStatistics",
components: {
UploadOutlined,//图标--导出,
ProjectManager,CostDetails
ProjectManager, CostDetails
},
props:{
visible:{
props: {
visible: {
type: Boolean,
default: false,
},
id:{
id: {
type: String,
default: ""
},
},
setup(props,emits) {
const router=useRouter();
setup(props, emits) {
const router = useRouter();
const route = useRoute();
const { query: { id }} = useRoute();
const { query: { id } } = useRoute();
const state = reactive({
tableLoading: false,
tableLoadings: false,
opendrawer:false,
opendrawer: false,
id,
summaryDate: null,
resbgTxt: null,
@@ -219,11 +224,11 @@ export default {
name: '',
payrollPlaceId: null,
departId: null,
summaryDate:null,
summaryDate: null,
id: props.id,
// trainOrgId: '',
},
name:null,
name: null,
drawer: {
name: '',
drawersearchdate: [],
@@ -234,26 +239,26 @@ export default {
}
})
const handleBack = () => {
emits.emit('update:visible',false)
emits.emit('update:visible', false)
}
watch(()=>props.visible,(val)=>{
if(val){
watch(() => props.visible, (val) => {
if (val) {
state.searchParam.id = props.id
getTableDate()
}else{
} else {
state.searchParam = {
pageNo: "1",
pageSize: "10",
name: '',
payrollPlaceId: null,
departId: null,
summaryDate:null,
summaryDate: null,
id: null,
}
}
})
const endOrg = (val) => {
if(val){
if (val) {
const parts = val.split('/');
// const reversedParts = parts.reverse();
// return reversedParts.join('/');
@@ -271,9 +276,9 @@ export default {
ellipsis: true,
align: "center",
width: 180,
customRender: (value)=>{
customRender: (value) => {
return (
<div style="user-select:text">{value.record.name} / {value.record.userNo}</div>
<div style="user-select:text">{ value.record.name } / { value.record.userNo }</div>
)
}
},
@@ -312,8 +317,8 @@ export default {
ellipsis: true,
align: "center",
width: 140,
customRender: ({text})=>{
return text ? text+'分钟' : '-'
customRender: ({ text }) => {
return text ? text + '分钟' : '-'
}
},
{
@@ -323,8 +328,8 @@ export default {
ellipsis: true,
align: "center",
width: 140,
customRender: ({text})=>{
return text ? text+'分钟' : '-'
customRender: ({ text }) => {
return text ? text + '分钟' : '-'
}
},
{
@@ -334,8 +339,8 @@ export default {
ellipsis: true,
align: "center",
width: 120,
customRender: ({text})=>{
return text ? text+'分钟' : '-'
customRender: ({ text }) => {
return text ? text + '分钟' : '-'
}
},
{
@@ -345,8 +350,8 @@ export default {
ellipsis: true,
align: "center",
width: 120,
customRender: ({text})=>{
return text ? text+'元' : '-'
customRender: ({ text }) => {
return text ? text + '元' : '-'
}
},
{
@@ -356,9 +361,9 @@ export default {
ellipsis: true,
align: "center",
width: 120,
customCell:(text)=>{return{style:{color:colorSet(text)}}},
customRender: ({text})=>{
return text ? text+'元' : '-'
customCell: (text) => { return { style: { color: colorSet(text) } } },
customRender: ({ text }) => {
return text ? text + '元' : '-'
}
},
{
@@ -376,7 +381,7 @@ export default {
const tableData = ref([
])
const colorSet = (val) => {
if(val.payableExpense!=val.expense){
if (val.payableExpense != val.expense) {
return 'red'
}
}
@@ -417,7 +422,7 @@ export default {
tableData.value = res.data.data.records
state.tableDataTotal = Number(res.data.data.total);
state.tableLoading = false
}).catch(err=>{
}).catch(err => {
state.tableLoading = false
message.error(err.data.msg)
})
@@ -448,7 +453,7 @@ export default {
getOrganizationLista()
//表格内查看数据操作
const handleLook = (record) => {
state.drawer={
state.drawer = {
name: '',
drawersearchdate: [],
pageNo: '1',
@@ -457,22 +462,22 @@ export default {
startTime: '',
id: record.id,
}
state.opendrawer=true
state.opendrawer = true
searchSubmitdrawer()
}
const handleLess = (record) => {
dialog({
content: '是否确认撤回 ?',
ok:()=>{
removeBySummaryId({summaryId:record.id}).then(res=>{
if(res.data.code == 200){
ok: () => {
removeBySummaryId({ summaryId: record.id }).then(res => {
if (res.data.code == 200) {
message.success('撤回成功')
emits.emit('tableList',true)
emits.emit('tableList', true)
searchSubmit()
}else{
} else {
message.error(res.data.msg)
}
}).catch(err=>{
}).catch(err => {
message.error(err.data.msg)
})
}
@@ -481,17 +486,17 @@ export default {
const handleDetail = (record) => {
dialog({
content: '是否确认撤回 ?',
ok:()=>{
removeBySummaryDetailId({detailId:record.detailId}).then(res=>{
if(res.data.code == 200){
ok: () => {
removeBySummaryDetailId({ detailId: record.detailId }).then(res => {
if (res.data.code == 200) {
message.success('撤回成功')
emits.emit('tableList',true)
emits.emit('tableList', true)
searchSubmit()
searchSubmitdrawer()
}else{
} else {
message.error(res.data.msg)
}
}).catch(err=>{
}).catch(err => {
message.destroy()
message.error(err.data.msg)
})
@@ -499,11 +504,11 @@ export default {
})
}
const searchTimeChange = (e) => {
console.log(e,'eeeee')
if(e){
console.log(e, 'eeeee')
if (e) {
state.drawer.startTime = e[0]
state.drawer.endTime = e[1]
}else{
} else {
state.drawer.startTime = ''
state.drawer.endTime = ''
}
@@ -512,7 +517,7 @@ export default {
const pagination = computed(() => ({
total: state.tableDataTotal,
showSizeChanger: true,
showQuickJumper:true,
showQuickJumper: true,
current: state.searchParam.pageNo,
pageSize: state.searchParam.pageSize,
onChange: changePagination,
@@ -528,24 +533,40 @@ export default {
window.open(
`${process.env.VUE_APP_BASE_API}/admin/export/exportTeacherSummary?&name=${state.searchParam.name ? state.searchParam.name : ""}&id=${state.searchParam.id ? state.searchParam.id : ""}&trainOrgId=${state.searchParam.trainOrgId || ''}`)
}
// 讲师月度费用下载
const handleFeeMonthlyDown = () => {
console.log("handleFeeMonthlyDown state.searchParam.id param" , state.searchParam.id)
window.open(
`${process.env.VUE_APP_BASE_API}/admin/export/exportTeacherDimension?&billId=${state.searchParam.id ? state.searchParam.id : ""}`)
}
// 讲师费用详情下载
const handleFeeMonthlyDetail = () => {
console.log("handleFeeMonthlyDetail state.searchParam.id param" , state.searchParam.id)
window.open(
`${process.env.VUE_APP_BASE_API}/admin/export/exportTeacherDimensionDetail?&billId=${state.searchParam.id ? state.searchParam.id : ""}`)
}
//重置
const searchReset = () => {
state.searchParam = {
pageNo: "1",
pageSize: "10",
id: props.id,
name : '',
name: '',
payrollPlaceId: null,
departId: '',
summaryDate:'',
summaryDate: '',
// trainOrgId: '',
};
getTableDate();
};
//二级页面重置
const searchResetdrawer =()=>{
const searchResetdrawer = () => {
const id = state.drawer.id
state.drawer={
state.drawer = {
name: '',
drawersearchdate: [],
pageNo: '1',
@@ -557,7 +578,7 @@ export default {
searchSubmitdrawer()
}
//二级页面查询
const searchSubmitdrawer=()=>{
const searchSubmitdrawer = () => {
state.tableLoadings = true
const params = {
summaryId: state.drawer.id,
@@ -565,8 +586,8 @@ export default {
endTime: state.drawer.endTime,
startTime: state.drawer.startTime,
}
queryDetailId(params).then(res=>{
console.log(res,'resss')
queryDetailId(params).then(res => {
console.log(res, 'resss')
tableDatas.value = res.data.data
state.tableLoadings = false
})
@@ -583,7 +604,7 @@ export default {
customRender: (value) => {
return (
<div style="user-select: text">
{value.record?.name} / {value.record?.userNo}
{ value.record?.name } / { value.record?.userNo }
</div>
);
},
@@ -602,7 +623,7 @@ export default {
key: 'courseName',
ellipsis: true, align: "center",
width: 160,
customCell:()=>{return{style:{userSelect: 'text'}}}
customCell: () => { return { style: { userSelect: 'text' } } }
},
{
title: '培训发生组织 ',
@@ -610,7 +631,7 @@ export default {
key: 'trainOrgName',
ellipsis: true, align: "center",
width: 160,
customCell:()=>{return{style:{userSelect: 'text'}}}
customCell: () => { return { style: { userSelect: 'text' } } }
},
{
title: '课程类型 ',
@@ -621,7 +642,7 @@ export default {
customRender: (value) => {
return (
<div>
{String(value.record.courseType)
{ String(value.record.courseType)
? {
"0": "在线课",
"1": "面授课",
@@ -629,7 +650,7 @@ export default {
"3": "作业员入模培训",
"4": "其他",
}[value.record.courseType + ""]
: "-"}
: "-" }
</div>
)
}
@@ -640,8 +661,8 @@ export default {
key: 'teachingTime',
ellipsis: true, align: "center",
width: 120,
customRender: ({text})=>{
return text ? text+'分钟' : '-'
customRender: ({ text }) => {
return text ? text + '分钟' : '-'
}
},
{
@@ -682,8 +703,8 @@ export default {
key: 'levelPay',
ellipsis: true, align: "center",
width: 100,
customRender: ({text})=>{
return text||text==0 ? text+'元' : '-'
customRender: ({ text }) => {
return text || text == 0 ? text + '元' : '-'
}
},
{
@@ -693,8 +714,8 @@ export default {
ellipsis: true,
align: "center",
width: 100,
customRender: ({text})=>{
return text ? text+'元' : '-'
customRender: ({ text }) => {
return text ? text + '元' : '-'
}
},
{
@@ -704,9 +725,9 @@ export default {
ellipsis: true,
align: "center",
width: 100,
customCell:(text)=>{return{style:{color:colorSet(text)}}},
customRender: ({text})=>{
return text ? text+'元' : '-'
customCell: (text) => { return { style: { color: colorSet(text) } } },
customRender: ({ text }) => {
return text ? text + '元' : '-'
}
},
{
@@ -724,7 +745,7 @@ export default {
const cancelTeachingDialog = () => {
state.opendrawer = false
state.drawer={
state.drawer = {
name: '',
drawersearchdate: [],
pageNo: '1',
@@ -735,12 +756,12 @@ export default {
};
//回车
const enterPressHadlerSearch = e => {
  console.log("e",e);
    if (e.keyCode === 13) {
      searchSubmit()
console.log("e", e);
if (e.keyCode === 13) {
searchSubmit()
    }
};
}
};
return {
...toRefs(state),
tableDatas,
@@ -749,6 +770,8 @@ export default {
cancelTeachingDialog,
searchReset,
handleFeeMonthly,
handleFeeMonthlyDown,
handleFeeMonthlyDetail,
handleLook,
handleLess,
handleDetail,
@@ -774,7 +797,7 @@ export default {
},
};
</script>
<style lang="scss" scoped >
<style lang="scss" scoped>
.MonthlyStatistics {
.header {
padding: 0px 32px;
@@ -795,6 +818,7 @@ export default {
// margin-left: 24px;
}
}
width: 100%;
height: 100%;
display: flex;
@@ -804,6 +828,7 @@ export default {
margin-left: 38px;
margin-right: 38px;
margin-top: 30px;
// display: flex;
// justify-content: space-between;
// flex-wrap: wrap;
@@ -813,9 +838,11 @@ export default {
}
}
}
.select .ant-picker {
width: 410px !important;
}
.headers {
height: 73px;
border-bottom: 1px solid #e8e8e8;
@@ -834,6 +861,7 @@ export default {
// margin-left: 24px;
}
}
.addTimeBox {
position: relative;
display: flex;
@@ -1158,13 +1186,16 @@ export default {
border-radius: 8px;
margin-right: 20px
}
::v-deep .ant-select:not(.ant-select-customize-input) .ant-select-selector{
::v-deep .ant-select:not(.ant-select-customize-input) .ant-select-selector {
// border-radius:8px;
height:32px;
height: 32px;
}
.ant-col-12{
height:90px;
.ant-col-12 {
height: 90px;
}
.goback {
float: right;
padding-right: 70px;
@@ -1187,24 +1218,28 @@ export default {
color: #4ea6ff;
font-size: 14px;
}
}
tableBox {
padding-bottom: 20px;
margin: 20px 38px 30px;
::v-deep .ant-select-dropdown{
display: inline-block;
}
::v-deep .ant-select-selection-item{
margin-left: 3px;
}
::v-deep .ant-pagination-options-size-changer.ant-select{
width: 84px;
}
.pa {
width: 100%;
display: flex;
justify-content: right;
}
}
</style>
tableBox {
padding-bottom: 20px;
margin: 20px 38px 30px;
::v-deep .ant-select-dropdown {
display: inline-block;
}
::v-deep .ant-select-selection-item {
margin-left: 3px;
}
::v-deep .ant-pagination-options-size-changer.ant-select {
width: 84px;
}
.pa {
width: 100%;
display: flex;
justify-content: right;
}
}
</style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,23 +1,23 @@
<!-- 授课记录 -->
<template>
<div class="TeachingRecord" >
<div style="margin: 20px;margin-top:0;" >
<div class="TeachingRecord">
<div style="margin: 20px;margin-top:0;">
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="内部讲师授课记录">
<InsideTeaching/>
<InsideTeaching />
</a-tab-pane>
<a-tab-pane key="2" tab="外部讲师授课记录">
<ExternalTeaching/>
<ExternalTeaching />
</a-tab-pane>
</a-tabs>
</div>
</div>
</template>
<script lang="jsx">
import { reactive, toRefs, ref, watch } from "vue";
import InsideTeaching from "../lecturer/InsideTeaching.vue"
import ExternalTeaching from "../lecturer/ExternalTeaching.vue"
export default {
</template>
<script lang="jsx">
import { reactive, toRefs, ref, watch } from "vue";
import InsideTeaching from "../lecturer/InsideTeaching.vue"
import ExternalTeaching from "../lecturer/ExternalTeaching.vue"
export default {
name: "TeachingRecord",
components: {
InsideTeaching,
@@ -25,7 +25,7 @@
},
setup() {
const state = reactive({
activeKey:'1'
activeKey: '1'
})
watch(
)
@@ -34,12 +34,13 @@
}
},
};
</script>
<style lang="scss" scoped>
::v-deep .ant-tabs-tab{
};
</script>
<style lang="scss" scoped>
::v-deep .ant-tabs-tab {
font-weight: 600;
}
}
.TeachingRecord {
width: 100%;
height: 100%;