教师权重

This commit is contained in:
zhangsir
2024-01-30 17:12:26 +08:00
parent ab34f1737f
commit 3b3442b867
3 changed files with 249 additions and 61 deletions

View File

@@ -464,7 +464,7 @@ const columns = ref([
width: "20%",
align: "center",
customRender: ({ record }) => {
const teachers = record.offteachers;
const teachers = record.offteachers;
return teachers.map((teacher, index) => {
// 如果需要显示为列表形式
return (
@@ -473,7 +473,7 @@ const columns = ref([
{index !== teachers.length - 1 && ', '}
</div>
);
});
});
},
},
@@ -562,33 +562,33 @@ const formDataRule = {
message: "请输入开课名称",
},
],
beginTime: [
{
required: true,
message: "请选择开始时间",
},
],
endTime: [
{
required: true,
message: "请选择结束时间",
},
],
// beginTime: [
// {
// required: true,
// message: "请选择开始时间",
// },
// ],
// endTime: [
// {
// required: true,
// message: "请选择结束时间",
// },
// ],
offteachers: [
{
validator: (rule, value, callback) => {
if (!value.every(item => item.teacherName)) {
callback(new Error('请选择教师'));
callback(new Error('请填写教师名称和设置权重'));
} else {
callback();
}
},
message: '请选择教师',
message: '请填写教师名称和设置权重',
fields: {
teacherName: [
{
required: true,
message: "请选择教师",
message: "请填写教师名称和设置权重",
},
],
},
@@ -740,15 +740,18 @@ const del = (id,record) => {
};
async function coursePlanConfirm() {
console.log({ ...formData.value },'{ ...formData.value }')
if(!dateTime.value[0]){
message.info('开始时间未填写')
return
}
if(!dateTime.value[1]){
message.info('结束时间未填写')
return
}
await validate().catch(({ errorFields }) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过");
});
if(dateTime.value.length<2){
message.info('请选择开始时间和结束时间')
return
}
if(formData.value.offteachers.length==1&& totalWeightSum.value!=100){
message.error('单名教师您设置的权重应该是100%')
return
@@ -756,6 +759,10 @@ async function coursePlanConfirm() {
message.error('多名教师权重合计值为100%')
return
}
if(formData.value.offteachers.some(item => item.weight==0)){
message.error('权重值不能为0%')
return
}
if(editBeginClass.value){
message.info('讲师费已进入审批阶段,无法编辑')
return
@@ -1308,8 +1315,8 @@ defineExpose({ openDrawer });
margin-top: 5px;
span{
width: 100%;
height: 100%;
font-size: 33px;
height: 100%;
font-size: 33px;
}
}
.signbox {

View File

@@ -188,7 +188,7 @@ const signOptions = ref([
},
{
id: 3,
value: 0,
value: 2,
label: "未签到",
},
]);

View File

@@ -904,9 +904,9 @@
<span v-else>新建开课</span>
<div class="close_exit" @click="handleCancelStu"></div>
</div>
<div class="cstm_title">
<!-- <div class="cstm_title">
<span>面授名称:{{ newCourseName }}</span>
</div>
</div> -->
<div class="cstm_items">
<div class="signbox">
<div class="sign">
@@ -942,8 +942,8 @@
</div>
<span style="margin-right: 3px">面授时间</span>
</div>
<div class="select fitems">
<a-range-picker
<div class="select fitems" style="width: 84%">
<!-- <a-range-picker
style="width: 440px; height: 40px; border-radius: 8px"
:show-time="{ format: 'HH:mm' }"
format="YYYY-MM-DD HH:mm"
@@ -952,6 +952,33 @@
separator="至"
:placeholder="[' 开始时间', ' 结束时间']"
:disabled="editBeginClass"
/> -->
<a-date-picker
style="width: 45%; height: 40px; border-radius: 8px"
:show-time="{ format: 'HH:mm' }"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
v-model:value="xjkkinputV3[0]"
@change="timeChange"
:placeholder="' 开始时间'"
:disabled="editBeginClass"
@blur="onBlurStart"
@focus="onFocusStart"
@select="onDateSelect"
/>
<span style="margin: 0 10px;">至</span>
<a-date-picker
style="width: 45%; height: 40px; border-radius: 8px"
:show-time="{ format: 'HH:mm' }"
format="YYYY-MM-DD HH:mm"
valueFormat="YYYY-MM-DD HH:mm"
v-model:value="xjkkinputV3[1]"
@change="timeChangeEnd"
:placeholder="' 结束时间'"
:disabled="editBeginClass"
@focus="onFocusEnd"
@blur="onBlurEnd"
@select="onDateEnd"
/>
</div>
</div>
@@ -983,7 +1010,7 @@
</div>
</div>
</div>
<div class="cstm_items">
<div class="cstm_items" style="align-items: baseline;">
<div class="signbox">
<div class="sign">
<img
@@ -993,12 +1020,26 @@
</div>
<span style="margin-right: 3px">授课教师</span>
</div>
<div class="select" style="width: 440px">
<ProjectManager
<div class="select teacher_input" style="display: flex; flex-wrap: wrap;width: 74.5%">
<!-- <ProjectManager
v-model:value="member.value"
v-model:name="member.name"
:disabled="editBeginClass"
></ProjectManager>
></ProjectManager> -->
<div v-for="(item, index) in offteachers"
:key="index" style="display: flex;margin-bottom: 10px;width: 100%;">
<ProjectManager
v-model:value="item.teacherId"
v-model:name="item.teacherName"
:disabled="editBeginClass"
></ProjectManager>
<a-input-number :min="0" :max="100" @change="inputWeightChange(index)" v-model:value="item.weight" placeholder="%"/>
<span style="margin-top: 10px;width: 34px;">权重</span>
<div style="display: flex;">
<a-button shape="circle" class="btn-circle btn-add" @click="inputAdd">+</a-button>
<a-button shape="circle" class="btn-circle" @click="inputRemove(index)" :disabled="offteachers.length == 1">-</a-button>
</div>
</div>
</div>
</div>
<div class="cstm_items">
@@ -1264,7 +1305,7 @@
</div>
<div class="stmm_i4">
<span style="color: #999ba3">授课教师:</span>
<span>{{ currentPlanItem.teacher }}</span>
<!-- <span>{{ currentPlanItem.teacher }}</span> -->
</div>
<div class="stmm_i5">
<TableStudent
@@ -1750,7 +1791,7 @@ import { fileUp } from "../../api/indexEval";
import * as api1 from "../../api/index1";
import "@wangeditor/editor/dist/css/style.css";
import ProjectManager from "@/components/project/ProjectManagerNew";
import ProjectManager from "@/components/project/ProjectManagerNewTeacher";
import SeeModal from "./components/seeModal.vue";
import CourseModal from "./courseModal.vue";
@@ -1941,9 +1982,18 @@ const columns6 = [
width: "8%",
align: "center",
ellipsis: true,
customRender: ({ text }) => {
return text ? text : "-";
},
customRender: ({ record }) => {
const teachers = record.offteachers;
return teachers.map((teacher, index) => {
// 如果需要显示为列表形式
return (
<div key={index}>
{teacher.teacherName}
{index !== teachers.length - 1 && ', '}
</div>
);
});
}
},
{
@@ -2402,11 +2452,16 @@ export default defineComponent({
addLoading: false,
currentPlanItem: {},
teacherId: null,
teacher: null,
// teacher: null,
selectedRowKeys7: [],
auditDescription: "",
isEdit: 0,
member: { name: "", value: "" },
offteachers:[{
teacherId: "",
teacherName: "",
weight: '',
}],
//列表表格
tableData1: [
// {
@@ -2619,7 +2674,7 @@ export default defineComponent({
onceName: "",
xjkkinputV2: "",
duration: "",
xjkkinputV3: "",
xjkkinputV3: [],
xjkkinputV4: null,
beforeValue: null, //考勤 开始前
afterStartValue: null, //考勤 开始后
@@ -2829,8 +2884,78 @@ export default defineComponent({
codeType: null, //二维码类型
});
function timeChange(time, timeStr) {
// state.duration || (state.duration = dayjs(timeStr[1]).diff(dayjs(timeStr[0]),'minute'))
// function timeChange(time, timeStr) {
// // state.duration || (state.duration = dayjs(timeStr[1]).diff(dayjs(timeStr[0]),'minute'))
// }
// function timeChange(timeStr) {
// console.log(timeStr,'timeStr')
// formData.value.beginTime = timeStr;
// }
function onDateSelect(date) {
const month = String(date.$M+1).padStart(2, '0')
const day = String(date.$D).padStart(2, '0')
state.xjkkinputV3[0]=date.$y+'-'+month+'-'+day+' '+date.$H+':'+date.$m
}
function onBlurStart(){
onFocusStart()
console.log(state.xjkkinputV3[0],'dateTime')
}
function onFocusStart(){
if(!state.xjkkinputV3[0]){
let now=new Date()
let start=new Date(now.setFullYear(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0))
state.xjkkinputV3 = [
moment(start).format('YYYY-MM-DD HH:mm'),
state.xjkkinputV3[1]
];
}
}
// function timeChangeEnd(timeStr){
// formData.value.endTime = timeStr;
// }
function onDateEnd(date) {
const month = String(date.$M+1).padStart(2, '0')
const day = String(date.$D).padStart(2, '0')
state.xjkkinputV3[1]=date.$y+'-'+month+'-'+day+' '+date.$H+':'+date.$m
}
function onFocusEnd(){
if(!state.xjkkinputV3[1]){
let now=new Date()
let start=new Date()
let end=new Date(now.setFullYear(now.getFullYear()))
state.xjkkinputV3 = [
state.xjkkinputV3[0],
moment(end).format('YYYY-MM-DD HH:mm')
];
}
}
const totalWeightSum = ref(0)
function inputWeightChange(index) {
let totalWeight = 0
state.offteachers.forEach(item => {
totalWeight += Number(item.weight);
});
if (totalWeight > 100) {
state.offteachers[index].weight -= totalWeight - 100;
totalWeight = 100;
}
totalWeightSum.value = totalWeight
}
function inputAdd() {
state.offteachers.push({
teacherId: "",
teacherName: "",
weight: '',
});
}
function inputRemove(index) {
dialog({
content: "确定删除此授课教师吗?",
ok: async () => {
state.offteachers.splice(index, 1);
message.success("删除成功");
},
});
}
function findClassFullName(list, classify, name = "") {
@@ -3239,7 +3364,7 @@ export default defineComponent({
const rest = () => {
options4CurName.value = "";
options4CurId.value = "";
state.teacher = null;
// state.teacher = null;
state.teacherId = null;
};
const handleChangeTea1 = (val) => {
@@ -3409,7 +3534,7 @@ export default defineComponent({
pageNo: type?state.currentPage2:state.currentPage222,
pageSize: state.pageSize222,
createName: state.kk_inputV1,
teacher: state.kk_inputV2,
// teacher: state.kk_inputV2,
beginTime: beginTime,
endTime: endTime,
offcourseId: state.offcourseId,
@@ -3582,7 +3707,7 @@ export default defineComponent({
CourseModalRef.value.visibleOpen(null, state.xzinputV1);
state.valueE1 = "";
state.teacher = "";
// state.teacher = "";
state.teacherName = "";
state.qdms_inputV1 = state.xzinputV1;
@@ -3655,9 +3780,15 @@ export default defineComponent({
handleRestTable();
};
const createkk = () => {
state.xjkkinputV1 = state.newCourseName
state.offcoursePlanId = null;
state.itemType = 3;
state.member = {};
state.offteachers = [{
teacherId: "",
teacherName: "",
weight: '',
}]
state.cstm_hs = true;
};
const handleCancelStu = () => {
@@ -3672,7 +3803,7 @@ export default defineComponent({
state.onceName = "";
state.xjkkinputV2 = "";
state.duration = "";
state.xjkkinputV3 = "";
state.xjkkinputV3 = [];
state.xjkkinputV4 = null;
state.checked1 = false;
state.checked4 = false;
@@ -3696,7 +3827,7 @@ export default defineComponent({
}
let startTime,
endTime = 0;
if (state.xjkkinputV3) {
if (state.xjkkinputV3.length!=0) {
startTime = dayjs(state.xjkkinputV3[0]).format("YYYY-MM-DD HH:mm"); //parseInt(state.xjkkinputV3[0].$d.getTime() / 1000);
endTime = dayjs(state.xjkkinputV3[1]).format("YYYY-MM-DD HH:mm"); //parseInt(state.xjkkinputV3[1].$d.getTime() / 1000);
}
@@ -3734,8 +3865,9 @@ export default defineComponent({
name: state.xjkkinputV1,
signFlag: state.xjkkradioV1 ? 1 : 0, //是否允许未报名的签到:1是0否
// signWordFlag: state.xjkkradioV1 === 1 ? 1 : 0, //签到是否需要口令:1是0否
teacherId: state.member.value,
teacher: state.member.name,
// teacherId: state.member.value,
// teacher: state.member.name,
offteachers: state.offteachers,
workInfo: state.workInfo, //提交的作业信息
examInfo: state.examInfo, //提交的考试信息
beforeStart: state.beforeValue, //考勤 开始前
@@ -3745,15 +3877,27 @@ export default defineComponent({
if(!postData.name){
return message.error("请输入开课名称");
}
if(!postData.beginTime){
return message.error("请选择开课时间");
if(!state.xjkkinputV3[0]){
return message.error("开始时间未填写");
}
if(!postData.endTime){
return message.error("请选择结束时间");
if(!state.xjkkinputV3[1]){
return message.error("结束时间未填写");
}
if(!postData.teacherId){
return message.error("请选择授课老师");
if(state.offteachers.some(item => !item.teacherName)){
return message.error("请填写教师名称和设置权重");
}
if(state.offteachers.length==1&& totalWeightSum.value!=100){
message.error('单名教师您设置的权重应该是100%')
return
}else if(state.offteachers.length>1&& totalWeightSum.value!=100){
message.error('多名教师权重合计值为100%')
return
}
if(state.offteachers.some(item => item.weight==0)){
message.error('权重值不能为0%')
return
}
console.log(postData,'传输的数据')
// if(!postData.duration){
// return message.error("请输入持续时间");
// }
@@ -3827,7 +3971,8 @@ export default defineComponent({
//是否允许未报名的签到:1是0否
state.xjkkradioV1 = true;
}
state.member = { value: item.teacherId, name: item.teacher };
// state.member = { value: item.teacherId, name: item.teacher };
state.offteachers = [...item.offteachers]
state.cstm_hs = true;
state.kk_eidt = true;
};
@@ -4417,10 +4562,11 @@ export default defineComponent({
state.chang_jin = String(item.sceneId);
state.tags_val = item.tips ? item.tips.split(",") : [];
//state.qdms_inputV5 = item.teacherId;
state.teacher = item.teacher;
state.teacherId = item.teacherId;
// state.teacher = item.teacher;
// state.teacherId = item.teacherId;
state.qdms_inputV6 = item.intro;
state.member = { value: item.teacherId, name: item.teacher };
// state.member = { value: item.teacherId, name: item.teacher };
state.offteachers = [...item.offteachers]
if (item.attach == "") {
state.imgList = [];
} else {
@@ -4902,9 +5048,11 @@ export default defineComponent({
const qrcodeVisible = (record, type) => {
// `${location.protocol}//${location.host}${import.meta.env.VUE_APP_BASE_API}/stu/project/redirectDetail?courseId=${record.id}`
state.codevisible = true;
let teacherNames = record.offteachers?.filter(teacher => teacher.teacherName !== null).map(teacher => teacher.teacherName);
state.codeInfo = {
title: type == 1 ? "【课程】二维码" : "【签到】二维码",
name: record.name ? record.name : "",
teacherName: teacherNames.length > 0 ? teacherNames.join(' ') : "",
url:
type == 1
? process.env.VUE_APP_BASE_API +
@@ -5054,8 +5202,19 @@ export default defineComponent({
logW,
logT,
qrcodeVisible,
timeChange,
editBeginClass
// timeChange,
editBeginClass,
onDateSelect,
onBlurStart,
onFocusStart,
// timeChangeEnd,
onDateEnd,
onFocusEnd,
inputWeightChange,
totalWeightSum,
inputAdd,
inputRemove
};
},
});
@@ -5560,6 +5719,28 @@ export default defineComponent({
margin: auto;
align-items: center;
margin-bottom: 23px;
.teacher_input{
.ant-input-number{
width: 15%;
height: 40px !important;
border-radius: 8px !important;
border: 1px solid #C7CBD2 !important;
margin: 0 10px 0 10px;
}
.btn-add{
margin: 0 10px 0 10px;
}
.btn-circle{
text-align: center;
line-height: 100%;
margin-top: 5px;
span{
width: 100%;
height: 100%;
font-size: 33px;
}
}
}
.signbox {
display: flex;