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

This commit is contained in:
joshen
2025-02-26 17:50:41 +08:00
23 changed files with 8080 additions and 5444 deletions

View File

@@ -1,2 +1,3 @@
NODE_ENV=test NODE_ENV=test
VUE_APP_BOE_API_URL=//u-pre.boe.com VUE_APP_BOE_API_URL=//u-pre.boe.com
VUE_APP_BASE_API=/manageApi

21
package-lock.json generated
View File

@@ -3727,8 +3727,6 @@
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dev": true, "dev": true,
"optional": true,
"peer": true,
"dependencies": { "dependencies": {
"fast-deep-equal": "^3.1.1", "fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0", "json-schema-traverse": "^1.0.0",
@@ -3740,9 +3738,7 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true, "dev": true
"optional": true,
"peer": true
}, },
"node_modules/ajv-keywords": { "node_modules/ajv-keywords": {
"version": "3.5.2", "version": "3.5.2",
@@ -14457,6 +14453,7 @@
"integrity": "sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==", "integrity": "sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/core": "^7.12.16",
"@babel/helper-compilation-targets": "^7.12.16", "@babel/helper-compilation-targets": "^7.12.16",
"@babel/helper-module-imports": "^7.12.13", "@babel/helper-module-imports": "^7.12.13",
"@babel/plugin-proposal-class-properties": "^7.12.13", "@babel/plugin-proposal-class-properties": "^7.12.13",
@@ -14469,6 +14466,7 @@
"@vue/babel-plugin-jsx": "^1.0.3", "@vue/babel-plugin-jsx": "^1.0.3",
"@vue/babel-preset-jsx": "^1.1.2", "@vue/babel-preset-jsx": "^1.1.2",
"babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-dynamic-import-node": "^2.3.3",
"core-js": "^3.8.3",
"core-js-compat": "^3.8.3", "core-js-compat": "^3.8.3",
"semver": "^7.3.4" "semver": "^7.3.4"
}, },
@@ -15334,14 +15332,15 @@
"resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz", "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"dev": true, "dev": true,
"requires": {}, "requires": {
"ajv": "^8.0.0"
},
"dependencies": { "dependencies": {
"ajv": { "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==", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dev": true, "dev": true,
"optional": true,
"peer": true,
"requires": { "requires": {
"fast-deep-equal": "^3.1.1", "fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0", "json-schema-traverse": "^1.0.0",
@@ -15353,9 +15352,7 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true, "dev": true
"optional": true,
"peer": 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 isEnable = (obj) => http.post(`/admin/affiliation/isEnable`,obj)
//撤回培训发生组织 //撤回培训发生组织
export const affiliatIsConfirm = (id) => http.post(`/admin/affiliation/isConfirm?id=${id}`) 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}`) 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

@@ -23,8 +23,14 @@ export const importTeacherCourseRecord = (obj) => http.post('/importTeacherCours
export const getAddress = (obj) => http.post('/admin/teacher/getAddress', obj) export const getAddress = (obj) => http.post('/admin/teacher/getAddress', obj)
//讲师费发放情况 //讲师费发放情况
export const getCharges = (obj) => http.post('/teacher/fee/getCharges', obj) export const getCharges = (obj) => http.post('/teacher/fee/getCharges', obj)
//讲师费发放情况
export const exportTeacherExpense = (obj) => http.get('/admin/export/exportExpenseTemplate', {params: obj})
//上传组件 //上传组件
export const teacherUpload = (data) => export const teacherUpload = (data) =>
http.post("/admin/teacher/teacherUpload", data, { http.post("/admin/teacher/teacherUpload", data, {
headers: { "Content-Type": "multipart/form-data",token:getCookieForName("token") }, headers: { "Content-Type": "multipart/form-data",token:getCookieForName("token") },
}); });

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 deleteInTeacher= (obj) => http.post(`/admin/teacher/delByIdr?id=${obj}`)
//修改讲师费信息 //修改讲师费信息
export const updateTeacherFee= (obj) => http.post('/admin/teacherExpense/editTeacherExpense',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 updateStatusSubmit= (obj) => http.post('/admin/teacherExpense/confirm',obj)
//修改讲师费状态撤回 //修改讲师费状态撤回
export const approveTeacherFee= (obj) => http.post('/admin/teacherExpense/withdraw',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 queryExpnseByBillId= (obj) => http.get('/admin/expenseBill/queryExpnseByBillId',{params:obj})
// //
export const CreateSummaryAgain= (id) => http.post(`/admin/expenseBill/createSummaryAgain?billId=${id}`) 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) export const submitApproval= (obj) => http.post('/admin/expenseBill/submitApproval',obj)

View File

@@ -9,7 +9,7 @@
:zIndex="9" :zIndex="9"
@cancel="qr_exit" @cancel="qr_exit"
> >
<div class="QR"> <div class="QR">
<div class="qr_header"></div> <div class="qr_header"></div>
<div class="qr_main"> <div class="qr_main">
<div class="qrm_header"> <div class="qrm_header">
@@ -22,7 +22,11 @@
<div class="main"> <div class="main">
<div class="minatitl"> <div class="minatitl">
<div class="up1">请下载</div> <div class="up1">请下载</div>
<div class="up2" @click="downTemplate" style="cursor: pointer"> <div
class="up2"
@click="downTemplate"
style="cursor: pointer"
>
模板 模板
</div> </div>
<div class="up1">按要求填写数据并导入</div> <div class="up1">按要求填写数据并导入</div>
@@ -31,18 +35,28 @@
<div class="text">上传</div> <div class="text">上传</div>
<div class="right"> <div class="right">
<div style="height: 176px; margin-bottom: 20px"> <div style="height: 176px; margin-bottom: 20px">
<a-upload-dragger v-model:fileList="fileList" :action="importHomeWork" name="uploadFile" <a-upload-dragger
:headers="headers" v-model:fileList="fileList"
@change="handleChange" :showUploadList="false"> :action="importHomeWork"
name="uploadFile"
:headers="headers"
@change="handleChange"
:showUploadList="false"
>
<p class="ant-upload-drag-icon"> <p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined> <inbox-outlined></inbox-outlined>
</p> </p>
<p class="ant-upload-text">点击或将文件拖拽到此处上传</p> <p class="ant-upload-text">
点击或将文件拖拽到此处上传
</p>
<p class="ant-upload-hint">支持扩展名.xls/.xlsx</p> <p class="ant-upload-hint">支持扩展名.xls/.xlsx</p>
</a-upload-dragger> </a-upload-dragger>
</div> </div>
<div class="loadstate"> <div class="loadstate">
<div class="loadborder" v-if="uploadpercent < 100 && uploadpercent !== -1"> <div
class="loadborder"
v-if="uploadpercent < 100 && uploadpercent !== -1"
>
<div class="content"> <div class="content">
<div class="img"></div> <div class="img"></div>
<div class="timebox"> <div class="timebox">
@@ -52,8 +66,7 @@
</div> </div>
<a-progress :percent="uploadpercent" /> <a-progress :percent="uploadpercent" />
</div> </div>
<div class="curloading"> <div class="curloading"></div>
</div>
</div> </div>
</div> </div>
<div class="loadborder" v-if="uploadErr"> <div class="loadborder" v-if="uploadErr">
@@ -90,7 +103,11 @@
<a-progress :percent="uploadpercent" /> <a-progress :percent="uploadpercent" />
</div> </div>
<div class="curloading"> <div class="curloading">
<div class="cancel" style="margin-left: 20px; cursor: pointer" @click="removeUpload"> <div
class="cancel"
style="margin-left: 20px; cursor: pointer"
@click="removeUpload"
>
删除 删除
</div> </div>
</div> </div>
@@ -101,25 +118,43 @@
</div> </div>
</div> </div>
</div> </div>
<div v-if="uploadpercent === 100" class="defeat" style=" <!-- <div
display: flex; v-if="uploadpercent === 100"
align-items: center; class="defeat"
width: 500px; style="
height: 40px;" :style="{ display: flex;
background: errNum align-items: center;
? 'rgba(255, 116, 116, 0.1)' width: 500px;
: 'rgba(53, 174, 105, 0.1)', height: 40px;
border: errNum ? '1px solid #ff7474' : '1px solid #35AE69', "
}"> :style="{
<img style="width: 14px; height: 14px; margin-left: 16px" :src=" background: errNum
errNum ? 'rgba(255, 116, 116, 0.1)'
? require('../../assets/images/err.png') : 'rgba(53, 174, 105, 0.1)',
: require('../../assets/images/success.png') border: errNum
" /> ? '1px solid #ff7474'
<div style="margin-left: 8px" :style="{ color: errNum ? '#ff7474' : 'rgba(0,0,0,0.65)' }"> : '1px solid #35AE69',
{{ succNum }}条数据导入成功{{ errNum }}条数据导入失败 }"
</div> >
</div> <img
style="width: 14px; height: 14px; margin-left: 16px"
:src="
errNum
? require('../../assets/images/err.png')
: require('../../assets/images/success.png')
"
/> -->
<!-- <div
style="margin-left: 8px"
:style="{
color: errNum ? '#ff7474' : 'rgba(0,0,0,0.65)',
}"
>
{{ succNum }}条数据导入成功{{
errNum
}}条数据导入失败
</div> -->
<!-- </div> -->
</div> </div>
</div> </div>
</div> </div>
@@ -137,178 +172,182 @@
</template> </template>
<script> <script>
import { reactive, toRefs, watch,ref,computed } from "vue"; import { reactive, toRefs, watch, ref, computed } from "vue";
import { exportTeacherExpense } from "../../api/Teaching";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
import { useStore } from "vuex"; import { useStore } from "vuex";
import * as api from "../../api/index1"; import * as api from "../../api/index1";
import {getCookieForName} from "@/api/method"; import { getCookieForName } from "@/api/method";
export default { export default {
name: "importWork", name: "importWork",
components: { components: {},
props: {
showWork: {
type: Boolean,
default: false,
}, },
props: { url: {
showWork: { type: String,
type: Boolean, default: null,
default: false,
},
url: {
type: String,
default: null,
},
title:{
type: String,
default: null,
},
template:{
type: String,
default: null,
},
}, },
setup(props, ctx) { title: {
const state = reactive({ type: String,
fileType: ["xls", "xlsx"], default: null,
importHomeWork: },
process.env.VUE_APP_BASE_API + props.url, template: {
uploadpercent: -1, type: String,
uploadErr: false, //上传失败 default: null,
addLoading: false, },
fileList: [], },
succNum: 0, //成功数据数 setup(props, ctx) {
errNum: 0, //失败数据数 const state = reactive({
downloadErrUrl: null, //下载失败数据 fileType: ["xls", "xlsx"],
fileName: "", importHomeWork: process.env.VUE_APP_BASE_API + props.url,
}); uploadpercent: -1,
const headers = { token: getCookieForName("token") }; uploadErr: false, //上传失败
addLoading: false,
fileList: [],
succNum: 0, //成功数据数
errNum: 0, //失败数据数
downloadErrUrl: null, //下载失败数据
fileName: "",
});
const headers = { token: getCookieForName("token") };
const closeCodeModal = () => { const closeCodeModal = () => {
ctx.emit("update:showWork", false); ctx.emit("update:showWork", false);
state.fileList = []; state.fileList = [];
state.uploadpercent = -1; state.uploadpercent = -1;
state.uploadErr = false; //上传失败 state.uploadErr = false; //上传失败
}; };
//上传文件 //上传文件
const handleChange = (info) => { const handleChange = (info) => {
if (info) { if (info) {
var FileExt = info.file.name.replace(/.+\./, ""); var FileExt = info.file.name.replace(/.+\./, "");
if (["xls", "xlsx"].indexOf(FileExt.toLowerCase()) === -1) { if (["xls", "xlsx"].indexOf(FileExt.toLowerCase()) === -1) {
state.fileList = [];
state.uploadpercent = -1;
message.destroy();
message.error("请按模板格式上传文件");
return;
}
}
let isLt1M = info.file.size < 512000000;
if (!isLt1M) {
state.fileList = []; state.fileList = [];
state.uploadpercent = -1; state.uploadpercent = -1;
message.destroy(); message.destroy();
message.error("文件大小超出500M,请重新上传"); message.error("请按模板格式上传文件");
return; return;
} }
}
state.addLoading = true; let isLt1M = info.file.size < 512000000;
state.uploadpercent = parseInt(info.file.percent); if (!isLt1M) {
console.log("我是文件上传的进度---------->", info.file.percent);
const status = info.file.status;
console.log(info.file,'status')
if (status !== "uploading") {
// console.log(info.file, info.fileList);
}
if (status === "done") {
state.fileName = info.file.name;
if(info.file.response.code == 200){
state.succNum = Number(info.file.response.data.success);
state.errNum = Number(info.file.response.data.failed);
state.downloadErrUrl = info.file.response.data.path;
}else{
state.uploadErr = true;
state.fileList = [];
state.uploadpercent = -1
message.destroy();
message.error(info.file.response.msg);
}
// let i = 0;
// let timeouts = setTimeout(() => {
// // clearInterval(timer)
// state.addLoading = false;
// message.destroy();
// message.error(`文件导入超时`);
// }, 30000);
// let timer = setInterval(() => {
// let uid = info.file.response.data;
// api
// .getImportStatus(uid)
// .then((res) => {
// console.log("查询导入状态", res);
// if (res.data.code === 200) {
// if (res.data.data.status !== "START") {
// i++;
// if (i === 1) {
// message.destroy();
// message.success(`${info.file.name}上传成功`);
// state.addLoading = false;
// props.searchTaskList && props.searchTaskList();
// }
// state.succNum = res.data.data.successNum;
// state.errNum = res.data.data.failedNum;
// state.downloadErrUrl = res.data.data.url;
// console.log("props.getStudent", props.getStudent);
// clearInterval(timer);
// clearTimeout(timeouts);
// }
// } else {
// state.addLoading = false;
// message.destroy();
// clearTimeout(timeouts);
// }
// })
// .catch((err) => {
// state.addLoading = false;
// clearInterval(timer);
// clearTimeout(timeouts);
// console.log("查询导入状态失败", err);
// });
// }, 500);
} else if (status === "error") {
state.uploadErr = true;
message.error(`${info.file.name}上传失败`);
}
};
//删除
const removeUpload = () => {
state.fileList = []; state.fileList = [];
state.uploadpercent = -1; state.uploadpercent = -1;
state.uploadErr = false; //上传失败 message.destroy();
state.succNum = 0; message.error("文件大小超出500M,请重新上传");
state.errNum = 0; return;
state.downloadErrUrl = null;
state.addLoading = false;
};
// 下载失败数据
const downloadEeeorData = () => {
if (state.downloadErrUrl !== "") {
window.open(process.env.VUE_APP_FILE_PATH + state.downloadErrUrl);
}
};
function downTemplate() {
window.open(`${process.env.VUE_APP_BOE_API_URL}/upload/template/${props.template}`);
} }
return { state.addLoading = true;
...toRefs(state), state.uploadpercent = parseInt(info.file.percent);
closeCodeModal, console.log("我是文件上传的进度---------->", info.file.percent);
handleChange, const status = info.file.status;
downTemplate, console.log(info.file, "status");
headers, if (status !== "uploading") {
removeUpload, // console.log(info.file, info.fileList);
downloadEeeorData, }
}; if (status === "done") {
}, state.fileName = info.file.name;
} if (info.file.response.code == 200) {
state.succNum = Number(info.file.response.data.success);
state.errNum = Number(info.file.response.data.failed);
state.downloadErrUrl = info.file.response.data.path;
} else {
state.uploadErr = true;
state.fileList = [];
state.uploadpercent = -1;
message.destroy();
message.error(info.file.response.msg);
}
// let i = 0;
// let timeouts = setTimeout(() => {
// // clearInterval(timer)
// state.addLoading = false;
// message.destroy();
// message.error(`文件导入超时`);
// }, 30000);
// let timer = setInterval(() => {
// let uid = info.file.response.data;
// api
// .getImportStatus(uid)
// .then((res) => {
// console.log("查询导入状态", res);
// if (res.data.code === 200) {
// if (res.data.data.status !== "START") {
// i++;
// if (i === 1) {
// message.destroy();
// message.success(`${info.file.name}上传成功`);
// state.addLoading = false;
// props.searchTaskList && props.searchTaskList();
// }
// state.succNum = res.data.data.successNum;
// state.errNum = res.data.data.failedNum;
// state.downloadErrUrl = res.data.data.url;
// console.log("props.getStudent", props.getStudent);
// clearInterval(timer);
// clearTimeout(timeouts);
// }
// } else {
// state.addLoading = false;
// message.destroy();
// clearTimeout(timeouts);
// }
// })
// .catch((err) => {
// state.addLoading = false;
// clearInterval(timer);
// clearTimeout(timeouts);
// console.log("查询导入状态失败", err);
// });
// }, 500);
} else if (status === "error") {
state.uploadErr = true;
message.error(`${info.file.name}上传失败`);
}
};
//删除
const removeUpload = () => {
state.fileList = [];
state.uploadpercent = -1;
state.uploadErr = false; //上传失败
state.succNum = 0;
state.errNum = 0;
state.downloadErrUrl = null;
state.addLoading = false;
};
// 下载失败数据
const downloadEeeorData = () => {
if (state.downloadErrUrl !== "") {
window.open(process.env.VUE_APP_FILE_PATH + state.downloadErrUrl);
}
};
function downTemplate() {
console.log("downTemplate gx")
window.open(
`${process.env.VUE_APP_BASE_API}${props.template}`
);
// window.open(`${process.env.VUE_APP_BOE_API_URL}/upload/template/${props.template}`);
}
return {
...toRefs(state),
closeCodeModal,
handleChange,
downTemplate,
headers,
removeUpload,
downloadEeeorData,
};
},
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@@ -360,12 +399,12 @@ import {getCookieForName} from "@/api/method";
background-size: 100% 100%; background-size: 100% 100%;
} }
} }
.line{ .line {
height: 1px; height: 1px;
margin-top: 16px; margin-top: 16px;
background-color: #f0f0f0; background-color: #f0f0f0;
} }
.contents{ .contents {
display: flex; display: flex;
min-height: 500px; min-height: 500px;
.drawerMain { .drawerMain {
@@ -651,4 +690,4 @@ import {getCookieForName} from "@/api/method";
} }
} }
} }
</style> </style>

View File

@@ -195,7 +195,11 @@ watch(()=>props.visible,(val)=>{
} }
).then(res=>{ ).then(res=>{
if(res.data.code === 200){ 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) => { forData.value.forEach((item,i) => {
searchConditions.value.push({ nameUserNo: '', dateValue: [] }); searchConditions.value.push({ nameUserNo: '', dateValue: [] });
expenseList.value.push(forData.value[i]?.expenseList || []) expenseList.value.push(forData.value[i]?.expenseList || [])

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -78,11 +78,11 @@
</a-tabs> </a-tabs>
</div> </div>
</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="closeDrawer">确定</button> --> <button class="btn2" @click="closeDrawer">确定</button> -->
<button class="btn2" @click="confirm">撤销编辑内容</button> <!-- <button class="btn2" @click="confirm">撤销编辑内容</button> -->
</div> <!-- </div> -->
</div> </div>
<a-modal :footer="null" width="800px" v-model:visible="visibleModal" title="审批记录详情"> <a-modal :footer="null" width="800px" v-model:visible="visibleModal" title="审批记录详情">
<div style="margin: 20px;padding-bottom: 20px;"> <div style="margin: 20px;padding-bottom: 20px;">

View File

@@ -815,7 +815,7 @@ export default {
//导出功能 //导出功能
const handleExport = () => { const handleExport = () => {
window.open( window.open(
`${process.env.VUE_APP_BASE_API}/admin/export/exportOutTeacher?name=${state.searchParam.name || ""}&status=${state.searchParam.status || ""}` `${process.env.VUE_APP_BASE_API}/admin/export/exportOutTeacher?name=${state.searchParam.name || ""}&status=${state.searchParam.status || ""}&teacherType=${state.searchParam.teacherType || ""}`
); );
// this.download('lesson_records/export', { // this.download('lesson_records/export', {
// ...state.searchParam // ...state.searchParam

View File

@@ -146,7 +146,6 @@
<!--讲师名称 teacherName 内容分类 coursetypeid --> <!--讲师名称 teacherName 内容分类 coursetypeid -->
<a-row :gutter="16"> <a-row :gutter="16">
<a-col :span="12"> <a-col :span="12">
<a-form-item name="teacherName"> <a-form-item name="teacherName">
<template v-slot:label> <template v-slot:label>
<img <img
@@ -157,14 +156,30 @@
讲师名称 讲师名称
</template> </template>
<ProjectManagerOutTeacher v-model:value="formParam.name" <ProjectManagerOutTeacher v-model:value="formParam.name"
v-model:name="formParam.teacherName" v-model:name="formParam.teacherName"
placeholder="请输入工号/讲师姓名进行检索" v-model:supplier="formParam.supplier"
placeholder="请输入工号/讲师姓名进行检索"
@onChange="managerChange"></ProjectManagerOutTeacher> @onChange="managerChange"></ProjectManagerOutTeacher>
<!-- <a-input v-model:value="formParam.teacherName" allowClear showSearch class="draitem" <!-- <a-input v-model:value="formParam.teacherName" allowClear showSearch class="draitem"
placeholder="请输入讲师姓名"></a-input> --> placeholder="请输入讲师姓名"></a-input> -->
</a-form-item> </a-form-item>
</a-col> </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.supplier" disabled :maxlength="20" showCount >
</a-input>
</a-form-item>
</a-col>
</a-row>
<!-- 课程名称name 开课状态 courseStatus-->
<a-row :gutter="16">
<a-col :span="12"> <a-col :span="12">
<a-form-item name="courseTypeId"> <a-form-item name="courseTypeId">
<template v-slot:label> <template v-slot:label>
@@ -187,9 +202,6 @@
</a-tree-select> </a-tree-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row>
<!-- 课程名称name 开课状态 courseStatus-->
<a-row :gutter="16">
<a-col :span="12"> <a-col :span="12">
<a-form-item name="courseName"> <a-form-item name="courseName">
<template v-slot:label> <template v-slot:label>
@@ -212,6 +224,10 @@
</a-radio-group> </a-radio-group>
</a-form-item> </a-form-item>
</a-col> --> </a-col> -->
</a-row>
<!-- 授课日期 teachingDate 授课时长defaultTeachingTime-->
<a-row :gutter="16">
<a-col :span="12"> <a-col :span="12">
<a-form-item name="teachingDate"> <a-form-item name="teachingDate">
<template v-slot:label> <template v-slot:label>
@@ -226,10 +242,6 @@
placeholder="请选择课程日期" /> placeholder="请选择课程日期" />
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row>
<!-- 授课日期 teachingDate 授课时长defaultTeachingTime-->
<a-row :gutter="16">
<a-col :span="12"> <a-col :span="12">
<a-form-item name="teaching"> <a-form-item name="teaching">
<template v-slot:label> <template v-slot:label>
@@ -249,6 +261,9 @@
<span style="margin-left: 5px ;" v-if="formParam.teaching == null">0.00小时</span> --> <span style="margin-left: 5px ;" v-if="formParam.teaching == null">0.00小时</span> -->
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row>
<!-- 参训人数 studys评分 score-->
<a-row :gutter="16">
<a-col :span="12"> <a-col :span="12">
<a-form-item name="studys"> <a-form-item name="studys">
<template v-slot:label> <template v-slot:label>
@@ -264,10 +279,6 @@
</a-input> </a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row>
<!-- 参训人数 studys评分 score-->
<a-row :gutter="16">
<a-col :span="12"> <a-col :span="12">
<a-form-item name="score"> <a-form-item name="score">
<template v-slot:label> <template v-slot:label>
@@ -327,8 +338,9 @@
</div> </div>
<a-descriptions bordered :column="2" :contentStyle="rowCenter" :labelStyle="{'width':'160px'}"> <a-descriptions bordered :column="2" :contentStyle="rowCenter" :labelStyle="{'width':'160px'}">
<a-descriptions-item label="讲师名称">{{ formParam.teacherName ||'-'}}</a-descriptions-item> <a-descriptions-item label="讲师名称">{{ formParam.teacherName ||'-'}}</a-descriptions-item>
<a-descriptions-item label="供应商">{{ formParam.supplier || '-' }}</a-descriptions-item>
<a-descriptions-item label="手机号码">{{ formParam.mobile ||'-'}}</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 label="课程类型">{{ formParam.type == 0 ? '在线课' : formParam.type == 1 ? '面授课' : formParam.type == 2 ? '训练班' : formParam.type == 5 ? '手动录入' : '-'
}}</a-descriptions-item> }}</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 label="开课状态">{{ formParam.courseStatus == 0 ? '未开课' : formParam.courseStatus == 1
@@ -389,7 +401,8 @@
</a-modal> </a-modal>
</div> </div>
<!-- <div> <ImageUpload/> </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="'/admin/export/exportRecordTemplate'"
:url="'/admin/export/importOutTeacherRecord'" :title="title"></ImportWork>
</div> </div>
</template> </template>
<script lang="jsx"> <script lang="jsx">
@@ -590,7 +603,8 @@ export default {
? { ? {
"0": "在线课", "0": "在线课",
"1": "面授课", "1": "面授课",
"2": "手动录入", "2": "训练班",
"5": "手动录入",
}[value.record.type + ""] }[value.record.type + ""]
: "-"} : "-"}
</div> </div>

File diff suppressed because it is too large Load Diff

View File

@@ -50,10 +50,20 @@
<!-- <OrgClass @enter="searchSubmit()" v-model:value="searchParam.orgId" :placeholder="'请选择讲师组织'" <!-- <OrgClass @enter="searchSubmit()" v-model:value="searchParam.orgId" :placeholder="'请选择讲师组织'"
style="width: 235px" style="width: 235px"
></OrgClass> --> ></OrgClass> -->
<a-select style="width: 235px ;margin-bottom:20px" v-model:value="searchParam.trainOrgId" placeholder="请选择培训发生组织" allowClear <!-- TODO GX02-->
:options="orgListSearch" <a-select
v-on:keydown.enter="enterPressHadlerSearch"> style="width: 235px ;
</a-select> 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> </a-form-item>
<a-form-item class="select" v-if="moreid == 2"> <a-form-item class="select" v-if="moreid == 2">
<a-select style="width: 200px;margin-bottom:20px" placeholder="是否生成讲师费" v-model:value="searchParam.createdFee" <a-select style="width: 200px;margin-bottom:20px" placeholder="是否生成讲师费" v-model:value="searchParam.createdFee"
@@ -284,8 +294,14 @@
/> />
培训发生组织 培训发生组织
</template> </template>
<a-select v-model:value="formParam.trainOrgId" placeholder="请选择培训发生组织" allowClear <!-- TODO5 授课讲师 -->
:options="orgList" @change="changeOrg"> <a-select v-model:value="formParam.trainOrgId" placeholder="请选择培训发生组织"
allowClear
showSearch
:filter-option="false"
:options="filterOrgListSearch"
@search="handleOrgSearch"
@change="changeOrg">
</a-select> </a-select>
<!-- <OrgClass v-model:value="formParam.sourceBelongId" v-model:name="formParam.sourceBelongFullName"></OrgClass> --> <!-- <OrgClass v-model:value="formParam.sourceBelongId" v-model:name="formParam.sourceBelongFullName"></OrgClass> -->
</a-form-item> </a-form-item>
@@ -413,27 +429,27 @@
<span style="font-weight:600;">讲师信息</span> <span style="font-weight:600;">讲师信息</span>
<a-descriptions style="margin-top:15px;" bordered :column="2" :contentStyle="{'maxWidth':'300px'}" :labelStyle="{'width':'160px'}"> <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="讲师名称"><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="课程名称"><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 label="开课状态">{{ formParam.courseStatus == 0 ? '未开课' : formParam.courseStatus == 1
? '已开课' : '-' }}</a-descriptions-item> ? '已开课' : '-' }}</a-descriptions-item>
<a-descriptions-item label="授课/课程时长 "> <a-descriptions-item label="授课/课程时长(分钟)">
<span> {{ formParam.teaching }} 分钟</span> <span> {{ formParam.teaching }} 分钟</span>
<span style="margin-left: 10px ;" v-if="formParam.teaching != '0'">({{ (formParam.teaching / 60 <span style="margin-left: 10px ;" v-if="formParam.teaching != '0'">({{ (formParam.teaching / 60
).toFixed(2) }}小时)</span> </a-descriptions-item> ).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.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.score?Number(formParam.score).toFixed(0)==0?'-':Number(formParam.score).toFixed(2)+'分':'-' }}</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.courseTypeName||'-' }}</a-descriptions-item> -->
<a-descriptions-item label="是否生成讲师费">{{{0:'否',1:'是'}[formParam.createdFee]}}</a-descriptions-item>
<a-descriptions-item label="备注 ">{{ formParam.remark||'-' }}</a-descriptions-item> <a-descriptions-item label="备注 ">{{ formParam.remark||'-' }}</a-descriptions-item>
</a-descriptions> </a-descriptions>
<div v-if="formParam.createFrom == '0'"> <div v-if="formParam.createFrom == '0'">
@@ -495,7 +511,8 @@
</div> </div>
</a-modal> </a-modal>
</div> </div>
<ImportWork v-model:showWork="showWork" :template="'内部讲师授课记录导入模版-20250115.xlsx'" :url="'/admin/export/importInTeacherRecord'" :title="title"></ImportWork> <!-- 导入01 -->
<ImportWork v-model:showWork="showWork" :template="'/admin/export/exportRecordTemplate'" :url="'/admin/export/importInTeacherRecord'" :title="title"></ImportWork>
<!-- <div> <Upload/> </div> --> <!-- <div> <Upload/> </div> -->
</div> </div>
</template> </template>
@@ -560,6 +577,7 @@ export default {
const router = useRouter(); const router = useRouter();
const state = reactive({ const state = reactive({
orgListSearch: [], orgListSearch: [],
filterOrgListSearch: [],
moreid: 1, moreid: 1,
title: '导入内部授课记录', title: '导入内部授课记录',
vf: false, vf: false,
@@ -705,7 +723,8 @@ export default {
{ value: '', label: "全部" }, { value: '', label: "全部" },
{ value: '0', label: "在线课" }, { value: '0', label: "在线课" },
{ value: '1', label: "面授课" }, { value: '1', label: "面授课" },
{ value: '2', label: "手动录入" }, { value: '2', label: "训练班" },
{ value: '5', label: "手动录入" },
]) ])
const scoreList = ref([ const scoreList = ref([
{ value: '', label: "全部" }, { value: '', label: "全部" },
@@ -803,7 +822,8 @@ export default {
? { ? {
"0": "在线课", "0": "在线课",
"1": "面授课", "1": "面授课",
"2": "手动录入", "2": "训练班",
"5": "手动录入",
}[value.record.type + ""] }[value.record.type + ""]
: "-"} : "-"}
</div> </div>
@@ -890,25 +910,25 @@ export default {
) )
} }
}, },
{ // {
title: '数据来源', // title: '数据来源',
dataIndex: 'createFrom', // dataIndex: 'createFrom',
key: 'createFrom', // key: 'createFrom',
ellipsis: true, align: "center", // ellipsis: true, align: "center",
width: 120, // width: 120,
customRender: (value) => { // customRender: (value) => {
return ( // return (
<div> // <div>
{value.record.createFrom == "0" || value.record.createFrom == "1" // {value.record.createFrom == "0" || value.record.createFrom == "1"
? { // ? {
"0": "系统生成", // "0": "系统生成",
"1": "手动录入", // "1": "手动录入",
}[value.record.createFrom + ""] || "" // }[value.record.createFrom + ""] || ""
: "-"} // : "-"}
</div> // </div>
) // )
} // }
}, // },
{ {
title: '培训发生组织 ', title: '培训发生组织 ',
dataIndex: 'trainOrgName', dataIndex: 'trainOrgName',
@@ -963,6 +983,7 @@ export default {
pageSize:50 pageSize:50
} }
queryTrainOrgPor(obj).then((res) => { queryTrainOrgPor(obj).then((res) => {
state.orgList = res.data.data?.map(item=>{ state.orgList = res.data.data?.map(item=>{
return{ return{
label: item.affiliationName, label: item.affiliationName,
@@ -978,9 +999,16 @@ export default {
state.orgListSearch.unshift({ state.orgListSearch.unshift({
label: '全部', value: '' label: '全部', value: ''
}) })
state.filterOrgListSearch = state.orgListSearch;
}) })
} }
//TODO5
const changeOrg = (e,l) => { 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 state.formParam.trainOrgName = l?.label
} }
const rules = { const rules = {
@@ -1489,6 +1517,16 @@ export default {
const sendRemark = () => { const sendRemark = () => {
state.formParam.remark = state.formParam.remark.replace(/\s/g, ''); 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 { return {
...toRefs(state), ...toRefs(state),
sendName, sendName,
@@ -1548,7 +1586,8 @@ export default {
// editTimeChange, // editTimeChange,
scoreChange, scoreChange,
locale, 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> <template>
<div class="LecturerFeeManagement"> <div class="LecturerFeeManagement">
<div style="margin: 20px;margin-top:0;" > <div style="margin: 20px;margin-top:0;">
<a-tabs v-model:activeKey="activeKey" > <a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="讲师费管理"> <a-tab-pane key="1" tab="讲师费管理">
<LecturerFee /> <LecturerFee :activeKeyFn="activeKeyFn"/>
</a-tab-pane> </a-tab-pane>
<!-- v-if="lecturerAdmin('lecturer-admin')" --> <!-- v-if="lecturerAdmin('lecturer-admin')" -->
<a-tab-pane key="2" tab="审批中心"> <a-tab-pane key="2" tab="审批中心">
<LecturerApproval/> <LecturerApproval :activeKeyProps="activeKey"/>
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
</div>
</div> </div>
</div>
</template> </template>
<script lang="jsx"> <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 LecturerFee from "../lecturer/LecturerFee.vue"
import LecturerApproval from "../lecturer/LecturerApproval.vue" import LecturerApproval from "../lecturer/LecturerApproval.vue"
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import {useStore} from 'vuex' import { useStore } from 'vuex'
export default { export default {
name: "LecturerFeeManagement", name: "LecturerFeeManagement",
components: { components: {
LecturerFee, LecturerFee,
@@ -28,36 +28,43 @@ import {useStore} from 'vuex'
}, },
setup() { setup() {
const store = useStore(); const store = useStore();
const userInfo = computed(()=> store.state.userInfo) const userInfo = computed(() => store.state.userInfo)
const route = useRoute(); const route = useRoute();
const state = reactive({ const state = reactive({
activeKey:'1', activeKey: '1',
}) })
const lecturerAdmin = (admin)=>{ //
const roleCode = userInfo.value.roleList.map((item)=>item.roleCode) const lecturerAdmin = (admin) => {
if (admin){ const roleCode = userInfo.value.roleList.map((item) => item.roleCode)
if (admin) {
return roleCode.some(t => t == admin) return roleCode.some(t => t == admin)
} }
} }
watch(
)
onMounted(() => { onMounted(() => {
if(route.query.activeKey){ if (route.query.activeKey) {
state.activeKey = '2' state.activeKey = '2'
} }
}) })
return {
...toRefs(state), const activeKeyFn = () => {
state.activeKey = '2'
}
return {
...toRefs(state),
lecturerAdmin, lecturerAdmin,
activeKeyFn
} }
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .ant-tabs-tab{ ::v-deep .ant-tabs-tab {
font-weight: 600; font-weight: 600;
} }
.LecturerFeeManagement {
.LecturerFeeManagement {
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex; display: flex;

View File

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

File diff suppressed because it is too large Load Diff

View File

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