Compare commits

..

No commits in common. "832b6303f0cfa2e622a403f68ff815cc7c6102ff" and "0e7784970ac2ee84d3a53dd2841436496a1f0fe0" have entirely different histories.

5 changed files with 95 additions and 112 deletions

View File

@ -1,4 +1,3 @@
import { ComboModel } from "@/components/hTable/hTable";
import { http } from "@/utils/http"; import { http } from "@/utils/http";
import type { Res } from "@/utils/http/types"; import type { Res } from "@/utils/http/types";
@ -8,7 +7,7 @@ import type { Res } from "@/utils/http/types";
* @return {object} * @return {object}
*/ */
export function getenum(type) { export function getenum(type) {
return http.request<Res<ComboModel[]>>("get", `Public/enum/${type}`); return http.request<Res<any>>("get", `Public/enum/${type}`);
} }
/** /**
* @description * @description

View File

@ -34,6 +34,16 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12">
<el-form-item label="减免金额(元)" prop="amountRelief">
<el-input-number
v-model="form.amountRelief"
:precision="2"
:step="0.1"
:max="10"
/>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="当前状态:" prop="status"> <el-form-item label="当前状态:" prop="status">
<el-select <el-select
@ -48,55 +58,9 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="申请减免" prop="amountRelief">
<el-switch v-model="form.reliefApplication" />
</el-form-item>
</el-col>
</el-row> </el-row>
<el-row v-show="form.reliefApplication" class="pb-4.5"> <el-row v-show="form.userType === 1" class="pb-4.5">
<el-col :span="24">
<div style="display: flex; gap: 10px">
<label for="Level" class="el-form-item__label" style="width: 120px"
>减免详情:
</label>
<el-input-number
v-model="form.amountRelief"
:precision="2"
:step="0.1"
style="width: 180px"
placeholder="减免金额(元)"
:max="99999999"
/>
<el-select
v-model="form.reliefType"
filterable
placeholder="减免类型"
style="width: 180px"
>
<el-option
v-for="(item, i) in reliefSubTimeEnum"
:key="i"
autocomplete="off"
:label="item.text"
:value="item.value"
>
</el-option>
</el-select>
<el-date-picker
placeholder="减免时间"
style="width: 180px"
v-model="form.reliefSubTime"
type="date"
/>
</div>
</el-col>
</el-row>
<el-row class="pb-4.5">
<el-col :span="24"> <el-col :span="24">
<div style="display: flex; gap: 10px"> <div style="display: flex; gap: 10px">
<label for="Level" class="el-form-item__label" style="width: 120px" <label for="Level" class="el-form-item__label" style="width: 120px"
@ -259,9 +223,6 @@ interface FormData {
remark?: string; remark?: string;
status?: string; status?: string;
amountRelief?: number; amountRelief?: number;
reliefSubTime?: number;
reliefType?: number;
reliefApplication?: number;
} }
interface DialogConfig { interface DialogConfig {
@ -283,8 +244,6 @@ const formLabelWidth = "120px";
const size = "small"; const size = "small";
const loading = ref(false); const loading = ref(false);
const reliefSubTimeEnum = ref<ComboModel[]>();
const subject1 = ref<ComboModel[]>([ const subject1 = ref<ComboModel[]>([
{ value: 4, text: "物理" }, { value: 4, text: "物理" },
{ value: 8, text: "历史" }, { value: 8, text: "历史" },
@ -442,9 +401,7 @@ const handleResetForm = () => {
positionList.value = []; positionList.value = [];
}; };
const fetchInitData = async () => { const fetchInitData = async () => {};
reliefSubTimeEnum.value = (await getenum("ReliefSubTimeEnum")).data;
};
const fetchFormData = async () => { const fetchFormData = async () => {
handleResetForm(); handleResetForm();

View File

@ -171,13 +171,10 @@
<el-table-column prop="gkSubject" label="选修" width="140" /> <el-table-column prop="gkSubject" label="选修" width="140" />
<el-table-column prop="joinTime" label="入班时间" width="100" /> <el-table-column prop="joinTime" label="入班时间" width="100" />
<el-table-column prop="exitTime" label="退出时间" width="100" /> <el-table-column prop="exitTime" label="退出时间" width="100" />
<el-table-column label="减免情况(元)" width="230"> <el-table-column label="减免情况(元)" width="150">
<template #default="scope"> <template #default="scope">
<span v-if="!scope.row.reliefApplication">未申请</span> <span v-if="scope.row.amountRelief == 0">未申请</span>
<span v-else <span v-else>{{ scope.row.amountRelief }}</span>
>{{ scope.row.reliefSubTime }} {{ scope.row.amountRelief }}
{{ scope.row.reliefType }}
</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="状态"> <el-table-column label="状态">
@ -193,7 +190,7 @@
style="display: flex; justify-content: center; padding-top: 10px" style="display: flex; justify-content: center; padding-top: 10px"
@size-change="pageSizeChange" @size-change="pageSizeChange"
@current-change="pageIndexChange" @current-change="pageIndexChange"
:current-page="pagination.now" :current-page="pagination.total + 1"
:page-sizes="[10, 20, 40, 80, 100]" :page-sizes="[10, 20, 40, 80, 100]"
:page-size="pagination.size" :page-size="pagination.size"
layout="prev, pager, next,sizes, total" layout="prev, pager, next,sizes, total"
@ -270,7 +267,6 @@ interface TableData {
interface PaginationData { interface PaginationData {
index: number; index: number;
size: number; size: number;
now?: number;
total: number; total: number;
} }

View File

@ -210,7 +210,7 @@
style="display: flex; justify-content: center" style="display: flex; justify-content: center"
@size-change="pageSizeChange" @size-change="pageSizeChange"
@current-change="pageIndexChange" @current-change="pageIndexChange"
:current-page="pagination.now" :current-page="pagination.total + 1"
:page-sizes="[10, 20, 40, 80, 100]" :page-sizes="[10, 20, 40, 80, 100]"
:page-size="pagination.size" :page-size="pagination.size"
layout="prev, pager, next,sizes, total" layout="prev, pager, next,sizes, total"
@ -288,7 +288,6 @@ interface PaginationData {
index: number; index: number;
size: number; size: number;
total: number; total: number;
now?: number;
} }
interface DialogData { interface DialogData {

View File

@ -29,7 +29,11 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="年级" prop="baseInfo.grade"> <el-form-item label="年级" prop="baseInfo.grade">
<el-select v-model="form.baseInfo.grade" placeholder="请选择年级" clearable> <el-select
v-model="form.baseInfo.grade"
placeholder="请选择年级"
clearable
>
<el-option <el-option
v-for="g in gradeOptions" v-for="g in gradeOptions"
:key="g.value" :key="g.value"
@ -84,7 +88,6 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="座谈情况"> <el-form-item label="座谈情况">
<el-input <el-input
:maxlength="500"
v-model="form.work.talkDetail" v-model="form.work.talkDetail"
:disabled="!form.work.talk" :disabled="!form.work.talk"
placeholder="请输入座谈情况" placeholder="请输入座谈情况"
@ -102,7 +105,6 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="班会情况"> <el-form-item label="班会情况">
<el-input <el-input
:maxlength="500"
v-model="form.work.classMeetingDetail" v-model="form.work.classMeetingDetail"
:disabled="!form.work.classMeeting" :disabled="!form.work.classMeeting"
placeholder="请输入班会情况" placeholder="请输入班会情况"
@ -113,14 +115,21 @@
<el-divider>反馈问题</el-divider> <el-divider>反馈问题</el-divider>
<div style="height: 370px; overflow-y: auto"> <div style="height: 370px; overflow-y: auto">
<div v-for="group in feedbackGroups" :key="group.key" class="feedback-group"> <div
v-for="group in feedbackGroups"
:key="group.key"
class="feedback-group"
>
<div class="feedback-header"> <div class="feedback-header">
<span class="group-title">{{ group.name }}</span> <span class="group-title">{{ group.name }}</span>
<el-button type="primary" link @click="addProblem(group.key)" <el-button type="primary" link @click="addProblem(group.key)"
>添加问题</el-button >添加问题</el-button
> >
</div> </div>
<div v-if="form.feedback[group.key].length === 0" class="feedback-empty"> <div
v-if="form.feedback[group.key].length === 0"
class="feedback-empty"
>
暂无问题 暂无问题
</div> </div>
<div <div
@ -128,7 +137,10 @@
:key="item.id" :key="item.id"
class="feedback-item" class="feedback-item"
> >
<el-input v-model="item.text" :placeholder="`请输入${group.name}问题描述`" /> <el-input
v-model="item.text"
:placeholder="`请输入${group.name}问题描述`"
/>
<el-button type="danger" text @click="removeProblem(group.key, idx)" <el-button type="danger" text @click="removeProblem(group.key, idx)"
>删除</el-button >删除</el-button
> >
@ -154,7 +166,10 @@ import { ref, reactive, computed, defineProps, defineEmits, watch } from "vue";
import type { FormInstance, FormRules } from "element-plus"; import type { FormInstance, FormRules } from "element-plus";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { getSchoolData } from "@/api/userCenter"; import { getSchoolData } from "@/api/userCenter";
import { getSchoolBusinessPeopleListApi, addOrEditApi } from "@/api/toschoolinfomanage"; import {
getSchoolBusinessPeopleListApi,
addOrEditApi
} from "@/api/toschoolinfomanage";
const props = defineProps<{ visible: boolean }>(); const props = defineProps<{ visible: boolean }>();
// const emit = defineEmits<{ (e: "update:visible", value: boolean): void }>(); // const emit = defineEmits<{ (e: "update:visible", value: boolean): void }>();
const emit = defineEmits<{ const emit = defineEmits<{
@ -163,7 +178,7 @@ const emit = defineEmits<{
}>(); }>();
const dialogVisible = computed({ const dialogVisible = computed({
get: () => props.visible, get: () => props.visible,
set: (v) => emit("update:visible", v), set: v => emit("update:visible", v)
}); });
const formRef = ref<FormInstance>(); const formRef = ref<FormInstance>();
@ -174,11 +189,11 @@ function uid() {
const schoolOptions = ref([]); const schoolOptions = ref([]);
const peopleOptions = ref([]); const peopleOptions = ref([]);
const getSchoolDataFn = () => { const getSchoolDataFn = () => {
getSchoolData().then((res) => { getSchoolData().then(res => {
if (res.code == 200) { if (res.code == 200) {
schoolOptions.value = res.data.map((i: any) => ({ schoolOptions.value = res.data.map((i: any) => ({
label: i.text, label: i.text,
value: i.value, value: i.value
})); }));
} }
}); });
@ -189,9 +204,9 @@ const getSchoolDataFn = () => {
const getSchoolBusinessPeopleList = () => { const getSchoolBusinessPeopleList = () => {
getSchoolBusinessPeopleListApi({}).then((res: any) => { getSchoolBusinessPeopleListApi({}).then((res: any) => {
if (res.code == 200) { if (res.code == 200) {
peopleOptions.value = (res.data || []).map((i) => ({ peopleOptions.value = (res.data || []).map(i => ({
label: i.text, label: i.text,
value: i.text, value: i.text
})); }));
} }
}); });
@ -204,10 +219,15 @@ const gradeOptions = [
{ label: "初三", value: "初三" }, { label: "初三", value: "初三" },
{ label: "高一", value: "高一" }, { label: "高一", value: "高一" },
{ label: "高二", value: "高二" }, { label: "高二", value: "高二" },
{ label: "高三", value: "高三" }, { label: "高三", value: "高三" }
]; ];
type FeedbackKey = "leaders" | "classroom" | "equipment" | "students" | "others"; type FeedbackKey =
| "leaders"
| "classroom"
| "equipment"
| "students"
| "others";
interface FeedbackItem { interface FeedbackItem {
id: string; id: string;
text: string; text: string;
@ -233,47 +253,53 @@ const form = reactive<FormModel>({
school: undefined, school: undefined,
grade: undefined, grade: undefined,
date: undefined, date: undefined,
people: [], people: []
}, },
work: { work: {
talk: false, talk: false,
talkDetail: "", talkDetail: "",
classMeeting: false, classMeeting: false,
classMeetingDetail: "", classMeetingDetail: ""
}, },
feedback: { feedback: {
leaders: [], leaders: [],
classroom: [], classroom: [],
equipment: [], equipment: [],
students: [], students: [],
others: [], others: []
}, }
}); });
watch( watch(
() => form.work.talk, () => form.work.talk,
(val) => { val => {
!val ? (form.work.talkDetail = "") : ""; !val ? (form.work.talkDetail = "") : "";
} }
); );
watch( watch(
() => form.work.classMeeting, () => form.work.classMeeting,
(val) => { val => {
!val ? (form.work.classMeetingDetail = "") : ""; !val ? (form.work.classMeetingDetail = "") : "";
} }
); );
const rules: FormRules = { const rules: FormRules = {
"baseInfo.school": [{ required: true, message: "请选择学校", trigger: "change" }], "baseInfo.school": [
"baseInfo.grade": [{ required: true, message: "请选择年级", trigger: "change" }], { required: true, message: "请选择学校", trigger: "change" }
"baseInfo.date": [{ required: true, message: "请选择赴校时间", trigger: "change" }], ],
"baseInfo.grade": [
{ required: true, message: "请选择年级", trigger: "change" }
],
"baseInfo.date": [
{ required: true, message: "请选择赴校时间", trigger: "change" }
],
"baseInfo.people": [ "baseInfo.people": [
{ required: true, message: "请选择赴校人员", trigger: "change" }, { required: true, message: "请选择赴校人员", trigger: "change" },
{ {
type: "array", type: "array",
min: 1, min: 1,
message: "请至少选择一名赴校人员", message: "请至少选择一名赴校人员",
trigger: "change", trigger: "change"
}, }
], ]
}; };
const feedbackGroups = [ const feedbackGroups = [
@ -281,7 +307,7 @@ const feedbackGroups = [
{ key: "classroom", name: "双师课堂" }, { key: "classroom", name: "双师课堂" },
{ key: "equipment", name: "设备" }, { key: "equipment", name: "设备" },
{ key: "students", name: "学生" }, { key: "students", name: "学生" },
{ key: "others", name: "其他" }, { key: "others", name: "其他" }
] as { key: FeedbackKey; name: string }[]; ] as { key: FeedbackKey; name: string }[];
function addProblem(key: FeedbackKey) { function addProblem(key: FeedbackKey) {
@ -298,7 +324,7 @@ const feedbackGroupNameMap: Record<FeedbackKey, string> = {
classroom: "双师课堂", classroom: "双师课堂",
equipment: "设备", equipment: "设备",
students: "学生", students: "学生",
others: "其他", others: "其他"
}; };
function validateFeedbackNotEmpty() { function validateFeedbackNotEmpty() {
for (const g of feedbackGroups) { for (const g of feedbackGroups) {
@ -329,17 +355,22 @@ const handleFeedback = (data: any) => {
return items.map((item, idx) => ({ return items.map((item, idx) => ({
question: item.text, question: item.text,
questionType, questionType,
sort: (idx + 1).toString(), sort: (idx + 1).toString()
})); }));
}; };
let handledData = []; let handledData = [];
if (data.leaders.length > 0) handledData.push(...processData(data.leaders, 1)); if (data.leaders.length > 0)
if (data.classroom.length > 0) handledData.push(...processData(data.classroom, 10)); handledData.push(...processData(data.leaders, 1));
if (data.equipment.length > 0) handledData.push(...processData(data.equipment, 15)); if (data.classroom.length > 0)
if (data.students.length > 0) handledData.push(...processData(data.students, 20)); handledData.push(...processData(data.classroom, 10));
if (data.others.length > 0) handledData.push(...processData(data.others, 999)); if (data.equipment.length > 0)
handledData.push(...processData(data.equipment, 15));
if (data.students.length > 0)
handledData.push(...processData(data.students, 20));
if (data.others.length > 0)
handledData.push(...processData(data.others, 999));
return handledData; return handledData;
}; };
@ -368,8 +399,8 @@ let editParams = {
// //
solution: "string", solution: "string",
// //
endTime: "2025-08-19T07:20:29.292Z", endTime: "2025-08-19T07:20:29.292Z"
}, }
], ],
// //
solutionRecord: { solutionRecord: {
@ -384,18 +415,18 @@ let editParams = {
// //
executionRecords: "string", executionRecords: "string",
// //
executionTime: "2025-08-19T07:20:29.292Z", executionTime: "2025-08-19T07:20:29.292Z"
}, }
], ]
}, },
// //
discussion: "string", discussion: "string",
// //
classMeeting: "string", classMeeting: "string"
}; };
async function onSubmit() { async function onSubmit() {
if (!formRef.value) return; if (!formRef.value) return;
await formRef.value.validate((valid) => { await formRef.value.validate(valid => {
if (!valid) return; if (!valid) return;
// //
if (!validateFeedbackNotEmpty()) return; if (!validateFeedbackNotEmpty()) return;
@ -411,7 +442,8 @@ async function onSubmit() {
let reqParams = { let reqParams = {
id: 0, //id0 id: 0, //id0
schoolId: form.baseInfo.school, schoolId: form.baseInfo.school,
schoolName: schoolOptions.value.find((i) => i.value == form.baseInfo.school).label, schoolName: schoolOptions.value.find(i => i.value == form.baseInfo.school)
.label,
grade: form.baseInfo.grade, grade: form.baseInfo.grade,
// //
gradeLevel: "", gradeLevel: "",
@ -421,12 +453,12 @@ async function onSubmit() {
discussion: form.work.talkDetail, discussion: form.work.talkDetail,
isClassMeeting: form.work.classMeeting, isClassMeeting: form.work.classMeeting,
classMeeting: form.work.classMeetingDetail, classMeeting: form.work.classMeetingDetail,
feedbackQuestions: handleFeedback(form.feedback), feedbackQuestions: handleFeedback(form.feedback)
}; };
// return; // return;
console.log("提交数据", reqParams); console.log("提交数据", reqParams);
addOrEditApi(reqParams) addOrEditApi(reqParams)
.then((res) => { .then(res => {
if (res.code === 200) { if (res.code === 200) {
ElMessage.success("提交成功"); ElMessage.success("提交成功");
dialogVisible.value = false; dialogVisible.value = false;
@ -452,7 +484,7 @@ function resetForm() {
form.work.talkDetail = ""; form.work.talkDetail = "";
form.work.classMeeting = false; form.work.classMeeting = false;
form.work.classMeetingDetail = ""; form.work.classMeetingDetail = "";
(Object.keys(form.feedback) as FeedbackKey[]).forEach((k) => { (Object.keys(form.feedback) as FeedbackKey[]).forEach(k => {
form.feedback[k] = []; form.feedback[k] = [];
}); });
} }