staging #23
|
|
@ -1,3 +1,4 @@
|
|||
import { ComboModel } from "@/components/hTable/hTable";
|
||||
import { http } from "@/utils/http";
|
||||
import type { Res } from "@/utils/http/types";
|
||||
|
||||
|
|
@ -7,7 +8,7 @@ import type { Res } from "@/utils/http/types";
|
|||
* @return {object}
|
||||
*/
|
||||
export function getenum(type) {
|
||||
return http.request<Res<any>>("get", `Public/enum/${type}`);
|
||||
return http.request<Res<ComboModel[]>>("get", `Public/enum/${type}`);
|
||||
}
|
||||
/**
|
||||
* @description 获取枚举对象
|
||||
|
|
|
|||
|
|
@ -34,16 +34,6 @@
|
|||
</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-form-item label="当前状态:" prop="status">
|
||||
<el-select
|
||||
|
|
@ -58,9 +48,55 @@
|
|||
</el-select>
|
||||
</el-form-item>
|
||||
</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 v-show="form.userType === 1" class="pb-4.5">
|
||||
<el-row v-show="form.reliefApplication" 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">
|
||||
<div style="display: flex; gap: 10px">
|
||||
<label for="Level" class="el-form-item__label" style="width: 120px"
|
||||
|
|
@ -223,6 +259,9 @@ interface FormData {
|
|||
remark?: string;
|
||||
status?: string;
|
||||
amountRelief?: number;
|
||||
reliefSubTime?: number;
|
||||
reliefType?: number;
|
||||
reliefApplication?: number;
|
||||
}
|
||||
|
||||
interface DialogConfig {
|
||||
|
|
@ -244,6 +283,8 @@ const formLabelWidth = "120px";
|
|||
const size = "small";
|
||||
const loading = ref(false);
|
||||
|
||||
const reliefSubTimeEnum = ref<ComboModel[]>();
|
||||
|
||||
const subject1 = ref<ComboModel[]>([
|
||||
{ value: 4, text: "物理" },
|
||||
{ value: 8, text: "历史" },
|
||||
|
|
@ -401,7 +442,9 @@ const handleResetForm = () => {
|
|||
positionList.value = [];
|
||||
};
|
||||
|
||||
const fetchInitData = async () => {};
|
||||
const fetchInitData = async () => {
|
||||
reliefSubTimeEnum.value = (await getenum("ReliefSubTimeEnum")).data;
|
||||
};
|
||||
|
||||
const fetchFormData = async () => {
|
||||
handleResetForm();
|
||||
|
|
|
|||
|
|
@ -171,10 +171,13 @@
|
|||
<el-table-column prop="gkSubject" label="选修" width="140" />
|
||||
<el-table-column prop="joinTime" label="入班时间" width="100" />
|
||||
<el-table-column prop="exitTime" label="退出时间" width="100" />
|
||||
<el-table-column label="减免情况(元)" width="150">
|
||||
<el-table-column label="减免情况(元)" width="230">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.amountRelief == 0">未申请</span>
|
||||
<span v-else>{{ scope.row.amountRelief }}</span>
|
||||
<span v-if="!scope.row.reliefApplication">未申请</span>
|
||||
<span v-else
|
||||
>{{ scope.row.reliefSubTime }} {{ scope.row.amountRelief }}
|
||||
{{ scope.row.reliefType }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态">
|
||||
|
|
@ -190,7 +193,7 @@
|
|||
style="display: flex; justify-content: center; padding-top: 10px"
|
||||
@size-change="pageSizeChange"
|
||||
@current-change="pageIndexChange"
|
||||
:current-page="pagination.total + 1"
|
||||
:current-page="pagination.now"
|
||||
:page-sizes="[10, 20, 40, 80, 100]"
|
||||
:page-size="pagination.size"
|
||||
layout="prev, pager, next,sizes, total"
|
||||
|
|
@ -267,6 +270,7 @@ interface TableData {
|
|||
interface PaginationData {
|
||||
index: number;
|
||||
size: number;
|
||||
now?: number;
|
||||
total: number;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@
|
|||
style="display: flex; justify-content: center"
|
||||
@size-change="pageSizeChange"
|
||||
@current-change="pageIndexChange"
|
||||
:current-page="pagination.total + 1"
|
||||
:current-page="pagination.now"
|
||||
:page-sizes="[10, 20, 40, 80, 100]"
|
||||
:page-size="pagination.size"
|
||||
layout="prev, pager, next,sizes, total"
|
||||
|
|
@ -288,6 +288,7 @@ interface PaginationData {
|
|||
index: number;
|
||||
size: number;
|
||||
total: number;
|
||||
now?: number;
|
||||
}
|
||||
|
||||
interface DialogData {
|
||||
|
|
|
|||
|
|
@ -29,11 +29,7 @@
|
|||
</el-col>
|
||||
<el-col :span="12">
|
||||
<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
|
||||
v-for="g in gradeOptions"
|
||||
:key="g.value"
|
||||
|
|
@ -88,6 +84,7 @@
|
|||
<el-col :span="12">
|
||||
<el-form-item label="座谈情况">
|
||||
<el-input
|
||||
:maxlength="500"
|
||||
v-model="form.work.talkDetail"
|
||||
:disabled="!form.work.talk"
|
||||
placeholder="请输入座谈情况"
|
||||
|
|
@ -105,6 +102,7 @@
|
|||
<el-col :span="12">
|
||||
<el-form-item label="班会情况">
|
||||
<el-input
|
||||
:maxlength="500"
|
||||
v-model="form.work.classMeetingDetail"
|
||||
:disabled="!form.work.classMeeting"
|
||||
placeholder="请输入班会情况"
|
||||
|
|
@ -115,21 +113,14 @@
|
|||
|
||||
<el-divider>反馈问题</el-divider>
|
||||
<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">
|
||||
<span class="group-title">{{ group.name }}</span>
|
||||
<el-button type="primary" link @click="addProblem(group.key)"
|
||||
>添加问题</el-button
|
||||
>
|
||||
</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
|
||||
|
|
@ -137,10 +128,7 @@
|
|||
:key="item.id"
|
||||
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
|
||||
>
|
||||
|
|
@ -166,10 +154,7 @@ import { ref, reactive, computed, defineProps, defineEmits, watch } from "vue";
|
|||
import type { FormInstance, FormRules } from "element-plus";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { getSchoolData } from "@/api/userCenter";
|
||||
import {
|
||||
getSchoolBusinessPeopleListApi,
|
||||
addOrEditApi
|
||||
} from "@/api/toschoolinfomanage";
|
||||
import { getSchoolBusinessPeopleListApi, addOrEditApi } from "@/api/toschoolinfomanage";
|
||||
const props = defineProps<{ visible: boolean }>();
|
||||
// const emit = defineEmits<{ (e: "update:visible", value: boolean): void }>();
|
||||
const emit = defineEmits<{
|
||||
|
|
@ -178,7 +163,7 @@ const emit = defineEmits<{
|
|||
}>();
|
||||
const dialogVisible = computed({
|
||||
get: () => props.visible,
|
||||
set: v => emit("update:visible", v)
|
||||
set: (v) => emit("update:visible", v),
|
||||
});
|
||||
|
||||
const formRef = ref<FormInstance>();
|
||||
|
|
@ -189,11 +174,11 @@ function uid() {
|
|||
const schoolOptions = ref([]);
|
||||
const peopleOptions = ref([]);
|
||||
const getSchoolDataFn = () => {
|
||||
getSchoolData().then(res => {
|
||||
getSchoolData().then((res) => {
|
||||
if (res.code == 200) {
|
||||
schoolOptions.value = res.data.map((i: any) => ({
|
||||
label: i.text,
|
||||
value: i.value
|
||||
value: i.value,
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
|
@ -204,9 +189,9 @@ const getSchoolDataFn = () => {
|
|||
const getSchoolBusinessPeopleList = () => {
|
||||
getSchoolBusinessPeopleListApi({}).then((res: any) => {
|
||||
if (res.code == 200) {
|
||||
peopleOptions.value = (res.data || []).map(i => ({
|
||||
peopleOptions.value = (res.data || []).map((i) => ({
|
||||
label: i.text,
|
||||
value: i.text
|
||||
value: i.text,
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
|
@ -219,15 +204,10 @@ const gradeOptions = [
|
|||
{ 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 {
|
||||
id: string;
|
||||
text: string;
|
||||
|
|
@ -253,53 +233,47 @@ const form = reactive<FormModel>({
|
|||
school: undefined,
|
||||
grade: undefined,
|
||||
date: undefined,
|
||||
people: []
|
||||
people: [],
|
||||
},
|
||||
work: {
|
||||
talk: false,
|
||||
talkDetail: "",
|
||||
classMeeting: false,
|
||||
classMeetingDetail: ""
|
||||
classMeetingDetail: "",
|
||||
},
|
||||
feedback: {
|
||||
leaders: [],
|
||||
classroom: [],
|
||||
equipment: [],
|
||||
students: [],
|
||||
others: []
|
||||
}
|
||||
others: [],
|
||||
},
|
||||
});
|
||||
watch(
|
||||
() => form.work.talk,
|
||||
val => {
|
||||
(val) => {
|
||||
!val ? (form.work.talkDetail = "") : "";
|
||||
}
|
||||
);
|
||||
watch(
|
||||
() => form.work.classMeeting,
|
||||
val => {
|
||||
(val) => {
|
||||
!val ? (form.work.classMeetingDetail = "") : "";
|
||||
}
|
||||
);
|
||||
const rules: FormRules = {
|
||||
"baseInfo.school": [
|
||||
{ required: true, message: "请选择学校", trigger: "change" }
|
||||
],
|
||||
"baseInfo.grade": [
|
||||
{ required: true, message: "请选择年级", trigger: "change" }
|
||||
],
|
||||
"baseInfo.date": [
|
||||
{ required: true, message: "请选择赴校时间", trigger: "change" }
|
||||
],
|
||||
"baseInfo.school": [{ required: true, message: "请选择学校", trigger: "change" }],
|
||||
"baseInfo.grade": [{ required: true, message: "请选择年级", trigger: "change" }],
|
||||
"baseInfo.date": [{ required: true, message: "请选择赴校时间", trigger: "change" }],
|
||||
"baseInfo.people": [
|
||||
{ required: true, message: "请选择赴校人员", trigger: "change" },
|
||||
{
|
||||
type: "array",
|
||||
min: 1,
|
||||
message: "请至少选择一名赴校人员",
|
||||
trigger: "change"
|
||||
}
|
||||
]
|
||||
trigger: "change",
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const feedbackGroups = [
|
||||
|
|
@ -307,7 +281,7 @@ const feedbackGroups = [
|
|||
{ key: "classroom", name: "双师课堂" },
|
||||
{ key: "equipment", name: "设备" },
|
||||
{ key: "students", name: "学生" },
|
||||
{ key: "others", name: "其他" }
|
||||
{ key: "others", name: "其他" },
|
||||
] as { key: FeedbackKey; name: string }[];
|
||||
|
||||
function addProblem(key: FeedbackKey) {
|
||||
|
|
@ -324,7 +298,7 @@ const feedbackGroupNameMap: Record<FeedbackKey, string> = {
|
|||
classroom: "双师课堂",
|
||||
equipment: "设备",
|
||||
students: "学生",
|
||||
others: "其他"
|
||||
others: "其他",
|
||||
};
|
||||
function validateFeedbackNotEmpty() {
|
||||
for (const g of feedbackGroups) {
|
||||
|
|
@ -355,22 +329,17 @@ const handleFeedback = (data: any) => {
|
|||
return items.map((item, idx) => ({
|
||||
question: item.text,
|
||||
questionType,
|
||||
sort: (idx + 1).toString()
|
||||
sort: (idx + 1).toString(),
|
||||
}));
|
||||
};
|
||||
|
||||
let handledData = [];
|
||||
|
||||
if (data.leaders.length > 0)
|
||||
handledData.push(...processData(data.leaders, 1));
|
||||
if (data.classroom.length > 0)
|
||||
handledData.push(...processData(data.classroom, 10));
|
||||
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));
|
||||
if (data.leaders.length > 0) handledData.push(...processData(data.leaders, 1));
|
||||
if (data.classroom.length > 0) handledData.push(...processData(data.classroom, 10));
|
||||
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;
|
||||
};
|
||||
|
|
@ -399,8 +368,8 @@ let editParams = {
|
|||
// 解决情况
|
||||
solution: "string",
|
||||
// 解决时间
|
||||
endTime: "2025-08-19T07:20:29.292Z"
|
||||
}
|
||||
endTime: "2025-08-19T07:20:29.292Z",
|
||||
},
|
||||
],
|
||||
// 解决方案记录
|
||||
solutionRecord: {
|
||||
|
|
@ -415,18 +384,18 @@ let editParams = {
|
|||
// 执行记录
|
||||
executionRecords: "string",
|
||||
// 执行时间
|
||||
executionTime: "2025-08-19T07:20:29.292Z"
|
||||
}
|
||||
]
|
||||
executionTime: "2025-08-19T07:20:29.292Z",
|
||||
},
|
||||
],
|
||||
},
|
||||
// 座谈情况
|
||||
discussion: "string",
|
||||
// 班会情况
|
||||
classMeeting: "string"
|
||||
classMeeting: "string",
|
||||
};
|
||||
async function onSubmit() {
|
||||
if (!formRef.value) return;
|
||||
await formRef.value.validate(valid => {
|
||||
await formRef.value.validate((valid) => {
|
||||
if (!valid) return;
|
||||
// 新增:校验反馈问题不为空
|
||||
if (!validateFeedbackNotEmpty()) return;
|
||||
|
|
@ -442,8 +411,7 @@ async function onSubmit() {
|
|||
let reqParams = {
|
||||
id: 0, //id传0代表新增
|
||||
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,
|
||||
// 固定传空字符串
|
||||
gradeLevel: "",
|
||||
|
|
@ -453,12 +421,12 @@ async function onSubmit() {
|
|||
discussion: form.work.talkDetail,
|
||||
isClassMeeting: form.work.classMeeting,
|
||||
classMeeting: form.work.classMeetingDetail,
|
||||
feedbackQuestions: handleFeedback(form.feedback)
|
||||
feedbackQuestions: handleFeedback(form.feedback),
|
||||
};
|
||||
// return;
|
||||
console.log("提交数据", reqParams);
|
||||
addOrEditApi(reqParams)
|
||||
.then(res => {
|
||||
.then((res) => {
|
||||
if (res.code === 200) {
|
||||
ElMessage.success("提交成功");
|
||||
dialogVisible.value = false;
|
||||
|
|
@ -484,7 +452,7 @@ function resetForm() {
|
|||
form.work.talkDetail = "";
|
||||
form.work.classMeeting = false;
|
||||
form.work.classMeetingDetail = "";
|
||||
(Object.keys(form.feedback) as FeedbackKey[]).forEach(k => {
|
||||
(Object.keys(form.feedback) as FeedbackKey[]).forEach((k) => {
|
||||
form.feedback[k] = [];
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue