|
|
@@ -47,7 +47,7 @@ import ListPage from '@/components/ListPage.vue';
|
|
|
import type { ListColumn } from '@/components/list-column';
|
|
|
import { useListPage } from '@/composables/use-list-page';
|
|
|
import { useScope } from '@/store/scope';
|
|
|
-import { formatDateTime, formatMoney } from '@/utils/format';
|
|
|
+import { formatDateTime, formatMoney, moneyPlain } from '@/utils/format';
|
|
|
|
|
|
const scope = useScope();
|
|
|
|
|
|
@@ -103,9 +103,11 @@ function todayStr(): string {
|
|
|
}
|
|
|
|
|
|
/* ================= ① 课程列表(端点 44) ================= */
|
|
|
-const filters = reactive<{ keyword: string; status: number | undefined }>({ keyword: '', status: undefined });
|
|
|
+/** 状态筛选:'all' = 全部(el-segmented 哨兵值;fetcher 里剥离,不传 undefined 之外的脏值) */
|
|
|
+const filters = reactive<{ keyword: string; status: string }>({ keyword: '', status: 'all' });
|
|
|
const { rows: courses, total, page, pageSize, loading, error, fetchList } = useListPage<CourseDTO>({
|
|
|
- fetcher: (p, ps) => listCourses({ ...scope.toQuery(), ...filters, page: p, pageSize: ps }),
|
|
|
+ fetcher: (p, ps) =>
|
|
|
+ listCourses({ ...scope.toQuery(), keyword: filters.keyword, status: filters.status === 'all' ? undefined : Number(filters.status), page: p, pageSize: ps }),
|
|
|
});
|
|
|
const courseStatusText: Record<number, string> = { 0: '未开始', 1: '进行中' };
|
|
|
const columns: ListColumn<CourseDTO>[] = [
|
|
|
@@ -140,7 +142,7 @@ async function loadClasses(): Promise<void> {
|
|
|
}
|
|
|
classLoading.value = true;
|
|
|
try {
|
|
|
- const r = await listClasses(selectedCourseId.value, { pageSize: 200 });
|
|
|
+ const r = await listClasses(selectedCourseId.value, { ...scope.toQuery(), pageSize: 200 });
|
|
|
if (r.code === 200) classRows.value = r.data?.list ?? [];
|
|
|
else ElMessage_('error', r.message || '排班规则加载失败');
|
|
|
} catch {
|
|
|
@@ -181,6 +183,23 @@ function weeksToString(): string {
|
|
|
if (ws.includes(-1)) return '-1';
|
|
|
return [...ws].sort((a, b) => a - b).map(String).join(',');
|
|
|
}
|
|
|
+/**
|
|
|
+ * 周互斥切换(-1 全周 与 0..6 具体周不可共存):
|
|
|
+ * - 点"全周"(-1):清空所有具体周,只留 -1;
|
|
|
+ * - 点具体周:移除 -1,再 toggle 该周;
|
|
|
+ * - 取消"全周":若还有具体周则保留,否则清空。
|
|
|
+ */
|
|
|
+function toggleWeek(v: number): void {
|
|
|
+ if (v === -1) {
|
|
|
+ classForm.weeks = classForm.weeks.includes(-1) ? [] : [-1];
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const rest = classForm.weeks.filter((x) => x !== -1);
|
|
|
+ const idx = rest.indexOf(v);
|
|
|
+ if (idx >= 0) rest.splice(idx, 1);
|
|
|
+ else rest.push(v);
|
|
|
+ classForm.weeks = rest.length > 0 ? rest : [];
|
|
|
+}
|
|
|
async function doCreateClass(): Promise<void> {
|
|
|
if (!selectedCourseId.value) return;
|
|
|
if (!classForm.teacher || !weeksToString() || !classForm.start || !classForm.end) {
|
|
|
@@ -217,15 +236,17 @@ async function doCreateClass(): Promise<void> {
|
|
|
}
|
|
|
|
|
|
/* ================= ③ 课表区(端点 48/49/50/51) ================= */
|
|
|
-const recFilters = reactive<{ range: [string, string] | []; status: number | undefined }>({ range: [], status: undefined });
|
|
|
+/** 状态筛选:'all' 哨兵(el-segmented);fetcher 剥离为 undefined */
|
|
|
+const recFilters = reactive<{ range: [string, string] | []; status: string }>({ range: [], status: 'all' });
|
|
|
const { rows: records, total: recTotal, page: recPage, pageSize: recPageSize, loading: recLoading, error: recError, fetchList: fetchRecords } =
|
|
|
useListPage<CourseRecordDTO>({
|
|
|
fetcher: (p, ps) =>
|
|
|
listRecords(selectedCourseId.value ?? 0, {
|
|
|
+ ...scope.toQuery(),
|
|
|
// ⚠ 时间窗闭区间:to 含当日(契约 §3.C 显式例外)——daterange 原样传,不做 +1 天
|
|
|
from: recFilters.range[0] || undefined,
|
|
|
to: recFilters.range[1] || undefined,
|
|
|
- status: recFilters.status,
|
|
|
+ status: recFilters.status === 'all' ? undefined : Number(recFilters.status),
|
|
|
page: p,
|
|
|
pageSize: ps,
|
|
|
}),
|
|
|
@@ -333,9 +354,19 @@ async function doFinish(rec: CourseRecordDTO): Promise<void> {
|
|
|
const attVisible = ref(false);
|
|
|
const attBusy = ref(false);
|
|
|
const attRecord = ref<CourseRecordDTO | null>(null);
|
|
|
-interface AttRow extends AttendanceItem {
|
|
|
+/**
|
|
|
+ * 打卡行(端点 52 提交前):金额字段本地用 number(el-input-number 绑定),
|
|
|
+ * 提交时经 moneyPlain 转回契约要求的两位小数字符串。
|
|
|
+ */
|
|
|
+interface AttRow {
|
|
|
+ userId: string;
|
|
|
/** 展示名(53 realName 可空 → 兜底 userId) */
|
|
|
name: string;
|
|
|
+ /** 上课类型(1 正常 / 2 插班 / 3 赠送) */
|
|
|
+ type: number;
|
|
|
+ pay: number;
|
|
|
+ cost: number;
|
|
|
+ giveCost: number;
|
|
|
}
|
|
|
const attRows = ref<AttRow[]>([]);
|
|
|
const attTypeText: Record<number, string> = { 1: '正常', 2: '插班', 3: '赠送' };
|
|
|
@@ -345,7 +376,7 @@ async function openAttendance(rec: CourseRecordDTO): Promise<void> {
|
|
|
attVisible.value = true;
|
|
|
if (!selectedCourseId.value) return;
|
|
|
// 初值 = 端点 53 课程级报课学生(risk-1 免后端方案:52 提交时后端按该课实际学生匹配,不在课内的 userId 不生效)
|
|
|
- const r = await listCourseStudents(selectedCourseId.value, { pageSize: 200 });
|
|
|
+ const r = await listCourseStudents(selectedCourseId.value, { ...scope.toQuery(), pageSize: 200 });
|
|
|
if (r.code !== 200) {
|
|
|
ElMessage_('error', r.message || '学生初值加载失败');
|
|
|
return;
|
|
|
@@ -354,20 +385,23 @@ async function openAttendance(rec: CourseRecordDTO): Promise<void> {
|
|
|
userId: s.userId,
|
|
|
name: s.realName ?? s.userId,
|
|
|
type: 1,
|
|
|
- pay: s.pay,
|
|
|
- cost: s.cost,
|
|
|
- giveCost: s.giveCost,
|
|
|
+ // 金额字符串两位小数 → number(el-input-number 绑定;提交时 formatMoney 回字符串)
|
|
|
+ pay: Number(s.pay) || 0,
|
|
|
+ cost: Number(s.cost) || 0,
|
|
|
+ giveCost: Number(s.giveCost) || 0,
|
|
|
}));
|
|
|
}
|
|
|
async function doAttendance(): Promise<void> {
|
|
|
const rec = attRecord.value;
|
|
|
if (!rec) return;
|
|
|
+ // number → 金额字符串两位小数(契约:金额字符串两位小数;提交位用 moneyPlain 不带千分位;0/undefined 不下发 = 不改)
|
|
|
+ const toMoney = (v: number | null | undefined): string | undefined => (v && v > 0 ? moneyPlain(v) : undefined);
|
|
|
const list: AttendanceItem[] = attRows.value.map(({ userId, type, pay, cost, giveCost }) => ({
|
|
|
userId,
|
|
|
type,
|
|
|
- ...(pay ? { pay } : {}),
|
|
|
- ...(cost ? { cost } : {}),
|
|
|
- ...(giveCost ? { giveCost } : {}),
|
|
|
+ ...(toMoney(pay) ? { pay: toMoney(pay)! } : {}),
|
|
|
+ ...(toMoney(cost) ? { cost: toMoney(cost)! } : {}),
|
|
|
+ ...(toMoney(giveCost) ? { giveCost: toMoney(giveCost)! } : {}),
|
|
|
}));
|
|
|
attBusy.value = true;
|
|
|
try {
|
|
|
@@ -398,7 +432,7 @@ async function loadStudents(): Promise<void> {
|
|
|
}
|
|
|
stuLoading.value = true;
|
|
|
try {
|
|
|
- const r = await listCourseStudents(selectedCourseId.value, { pageSize: 200 });
|
|
|
+ const r = await listCourseStudents(selectedCourseId.value, { ...scope.toQuery(), pageSize: 200 });
|
|
|
if (r.code === 200) stuRows.value = r.data?.list ?? [];
|
|
|
else ElMessage_('error', r.message || '报课学生加载失败');
|
|
|
} catch {
|
|
|
@@ -412,31 +446,34 @@ const stuStatusText: Record<number, string> = { 0: '未确认', 1: '在读', 2:
|
|
|
/** 报名对话框(端点 54;不写资金流水、不动余额;重复 → 3143) */
|
|
|
const enrollVisible = ref(false);
|
|
|
const enrollBusy = ref(false);
|
|
|
+/** 金额字段统一 number(el-input-number 绑定);提交时 moneyPlain 转两位小数字符串 */
|
|
|
const enrollForm = reactive({
|
|
|
userId: '',
|
|
|
- pay: '',
|
|
|
- lessonCost: '',
|
|
|
+ pay: null as number | null,
|
|
|
+ lessonCost: null as number | null,
|
|
|
number: 1,
|
|
|
- giveNumber: '',
|
|
|
- discountCash: '',
|
|
|
- giveCost: '',
|
|
|
+ giveNumber: null as number | null,
|
|
|
+ discountCash: null as number | null,
|
|
|
+ giveCost: null as number | null,
|
|
|
campusId: 0,
|
|
|
recommenderUserId: '',
|
|
|
remark: '',
|
|
|
});
|
|
|
function openEnroll(): void {
|
|
|
enrollForm.userId = studentOpts.value[0]?.userId ?? '';
|
|
|
- enrollForm.pay = '';
|
|
|
- enrollForm.lessonCost = '';
|
|
|
+ enrollForm.pay = null;
|
|
|
+ enrollForm.lessonCost = null;
|
|
|
enrollForm.number = 1;
|
|
|
- enrollForm.giveNumber = '';
|
|
|
- enrollForm.discountCash = '';
|
|
|
- enrollForm.giveCost = '';
|
|
|
+ enrollForm.giveNumber = null;
|
|
|
+ enrollForm.discountCash = null;
|
|
|
+ enrollForm.giveCost = null;
|
|
|
enrollForm.campusId = scope.current.campusId;
|
|
|
enrollForm.recommenderUserId = '';
|
|
|
enrollForm.remark = '';
|
|
|
enrollVisible.value = true;
|
|
|
}
|
|
|
+/** 推荐人选项:排除被报学生本人(老带新不能自推荐) */
|
|
|
+const recommenderOpts = computed(() => studentOpts.value.filter((m) => m.userId !== enrollForm.userId));
|
|
|
async function doEnroll(): Promise<void> {
|
|
|
if (!selectedCourseId.value) return;
|
|
|
if (!enrollForm.userId || !enrollForm.pay || !enrollForm.lessonCost || enrollForm.number <= 0) {
|
|
|
@@ -447,12 +484,12 @@ async function doEnroll(): Promise<void> {
|
|
|
try {
|
|
|
const r = await enrollStudent(selectedCourseId.value, {
|
|
|
userId: enrollForm.userId,
|
|
|
- pay: enrollForm.pay,
|
|
|
- lessonCost: enrollForm.lessonCost,
|
|
|
+ pay: moneyPlain(enrollForm.pay ?? 0),
|
|
|
+ lessonCost: moneyPlain(enrollForm.lessonCost ?? 0),
|
|
|
number: enrollForm.number,
|
|
|
- ...(enrollForm.giveNumber ? { giveNumber: Number(enrollForm.giveNumber) } : {}),
|
|
|
- ...(enrollForm.discountCash ? { discountCash: enrollForm.discountCash } : {}),
|
|
|
- ...(enrollForm.giveCost ? { giveCost: enrollForm.giveCost } : {}),
|
|
|
+ ...(enrollForm.giveNumber && enrollForm.giveNumber > 0 ? { giveNumber: enrollForm.giveNumber } : {}),
|
|
|
+ ...(enrollForm.discountCash && enrollForm.discountCash > 0 ? { discountCash: moneyPlain(enrollForm.discountCash) } : {}),
|
|
|
+ ...(enrollForm.giveCost && enrollForm.giveCost > 0 ? { giveCost: moneyPlain(enrollForm.giveCost) } : {}),
|
|
|
...(enrollForm.campusId ? { campusId: enrollForm.campusId } : {}),
|
|
|
...(enrollForm.recommenderUserId ? { recommenderUserId: enrollForm.recommenderUserId } : {}),
|
|
|
...(enrollForm.remark ? { remark: enrollForm.remark } : {}),
|
|
|
@@ -497,15 +534,15 @@ const arrColumns: ListColumn<ArrearsDTO>[] = [
|
|
|
const actVisible = ref(false);
|
|
|
const actBusy = ref(false);
|
|
|
const actTarget = ref<ArrearsDTO | null>(null);
|
|
|
-const actMoney = ref('');
|
|
|
+const actMoney = ref<number | null>(null);
|
|
|
function openCounteract(row: ArrearsDTO): void {
|
|
|
actTarget.value = row;
|
|
|
- actMoney.value = row.remainderReceivable;
|
|
|
+ actMoney.value = Number(row.remainderReceivable) || 0;
|
|
|
actVisible.value = true;
|
|
|
}
|
|
|
async function doCounteract(): Promise<void> {
|
|
|
const t = actTarget.value;
|
|
|
- if (!t || !actMoney.value || Number(actMoney.value) <= 0) {
|
|
|
+ if (!t || !actMoney.value || actMoney.value <= 0) {
|
|
|
ElMessage_('warning', '请输入有效核销金额(>0)');
|
|
|
return;
|
|
|
}
|
|
|
@@ -515,7 +552,7 @@ async function doCounteract(): Promise<void> {
|
|
|
studentId: t.studentId,
|
|
|
institutionId: scope.current.institutionId,
|
|
|
campusId: scope.current.campusId,
|
|
|
- money: actMoney.value,
|
|
|
+ money: moneyPlain(actMoney.value),
|
|
|
});
|
|
|
if (r.code === 200 && r.data) {
|
|
|
ElMessage_('success', `核销完成:${studentName(t.studentId)} 核销 ${r.data.amount}`);
|
|
|
@@ -549,9 +586,10 @@ async function doCounteract(): Promise<void> {
|
|
|
>
|
|
|
<template #toolbar>
|
|
|
<el-input v-model="filters.keyword" placeholder="搜索课程名称" clearable class="toolbar-input" />
|
|
|
- <el-select v-model="filters.status" placeholder="状态" clearable class="toolbar-select">
|
|
|
- <el-option v-for="(t, k) in courseStatusText" :key="k" :value="Number(k)" :label="t" />
|
|
|
- </el-select>
|
|
|
+ <el-segmented
|
|
|
+ v-model="filters.status"
|
|
|
+ :options="[{ label: '全部', value: 'all' }, { label: '未开始', value: '0' }, { label: '进行中', value: '1' }]"
|
|
|
+ />
|
|
|
</template>
|
|
|
</ListPage>
|
|
|
|
|
|
@@ -559,9 +597,8 @@ async function doCounteract(): Promise<void> {
|
|
|
<div class="schedule-page__section">
|
|
|
<div class="schedule-page__head">
|
|
|
<span class="schedule-page__title">排班规则</span>
|
|
|
- <el-select v-model="selectedCourseId" filterable placeholder="选择课程" class="schedule-page__course-select">
|
|
|
- <el-option v-for="c in courses" :key="c.id" :value="c.id" :label="c.name" />
|
|
|
- </el-select>
|
|
|
+ <el-tag v-if="selectedCourse" type="success" effect="light">已选:{{ selectedCourse.name }}(点上方课程行切换)</el-tag>
|
|
|
+ <span v-else class="schedule-page__hint">点击上方课程行选中课程</span>
|
|
|
<el-button type="primary" :disabled="!selectedCourseId" @click="openClass">新建排班规则</el-button>
|
|
|
</div>
|
|
|
<el-table v-if="selectedCourse" :data="classRows" :loading="classLoading" size="small" border>
|
|
|
@@ -598,9 +635,10 @@ async function doCounteract(): Promise<void> {
|
|
|
end-placeholder="结束日期(含当日)"
|
|
|
class="schedule-page__date-range"
|
|
|
/>
|
|
|
- <el-select v-model="recFilters.status" placeholder="状态" clearable class="schedule-page__rec-status">
|
|
|
- <el-option v-for="(t, k) in recStatusText" :key="k" :value="Number(k)" :label="t" />
|
|
|
- </el-select>
|
|
|
+ <el-segmented
|
|
|
+ v-model="recFilters.status"
|
|
|
+ :options="[{ label: '全部', value: 'all' }, { label: '未开始', value: '0' }, { label: '上课中', value: '1' }, { label: '已结束', value: '2' }]"
|
|
|
+ />
|
|
|
<el-button @click="onRecSearch" :disabled="!selectedCourseId">刷新</el-button>
|
|
|
<el-button type="warning" :disabled="!selectedCourseId" @click="openGenerate">生成课表</el-button>
|
|
|
</div>
|
|
|
@@ -711,10 +749,17 @@ async function doCounteract(): Promise<void> {
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="上课周">
|
|
|
- <el-select v-model="classForm.weeks" multiple placeholder="选择周(-1 = 全周,与具体周互斥)" style="width: 100%">
|
|
|
- <el-option :value="-1" label="全周(-1)" />
|
|
|
- <el-option v-for="(t, k) in WEEK_NAMES" :key="k" :value="Number(k)" :label="t" />
|
|
|
- </el-select>
|
|
|
+ <div class="schedule-page__week">
|
|
|
+ <el-checkbox :model-value="classForm.weeks.includes(-1)" @change="toggleWeek(-1)">全周</el-checkbox>
|
|
|
+ <el-checkbox
|
|
|
+ v-for="(t, k) in WEEK_NAMES"
|
|
|
+ :key="k"
|
|
|
+ :model-value="classForm.weeks.includes(Number(k))"
|
|
|
+ @change="toggleWeek(Number(k))"
|
|
|
+ >
|
|
|
+ {{ t }}
|
|
|
+ </el-checkbox>
|
|
|
+ </div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="上课时间">
|
|
|
<el-time-picker v-model="classForm.start" value-format="HH:mm:ss" format="HH:mm:ss" placeholder="选择上课时间" style="width: 100%" />
|
|
|
@@ -764,19 +809,19 @@ async function doCounteract(): Promise<void> {
|
|
|
</el-select>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="课程费用" width="120">
|
|
|
+ <el-table-column label="课程费用" width="130">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-model="row.pay" size="small" placeholder="金额" />
|
|
|
+ <el-input-number v-model="row.pay" size="small" :min="0" :precision="2" :step="100" controls-position="right" style="width: 100%" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="课时费用" width="120">
|
|
|
+ <el-table-column label="课时费用" width="130">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-model="row.cost" size="small" placeholder="金额" />
|
|
|
+ <el-input-number v-model="row.cost" size="small" :min="0" :precision="2" :step="100" controls-position="right" style="width: 100%" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="赠送" width="110">
|
|
|
+ <el-table-column label="赠送" width="120">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-model="row.giveCost" size="small" placeholder="可空" />
|
|
|
+ <el-input-number v-model="row.giveCost" size="small" :min="0" :precision="2" :step="0" controls-position="right" style="width: 100%" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
@@ -805,22 +850,22 @@ async function doCounteract(): Promise<void> {
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="课程费用">
|
|
|
- <el-input v-model="enrollForm.pay" placeholder="必填,如 10000.00" />
|
|
|
+ <el-input-number v-model="enrollForm.pay" :min="0" :precision="2" :step="100" controls-position="right" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="单节课时费用">
|
|
|
- <el-input v-model="enrollForm.lessonCost" placeholder="必填,如 200.00" />
|
|
|
+ <el-input-number v-model="enrollForm.lessonCost" :min="0" :precision="2" :step="100" controls-position="right" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="课次">
|
|
|
<el-input-number v-model="enrollForm.number" :min="1" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="赠送课次">
|
|
|
- <el-input v-model="enrollForm.giveNumber" placeholder="可空" />
|
|
|
+ <el-input-number v-model="enrollForm.giveNumber" :min="0" :precision="0" controls-position="right" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="现金折扣">
|
|
|
- <el-input v-model="enrollForm.discountCash" placeholder="可空,金额" />
|
|
|
+ <el-input-number v-model="enrollForm.discountCash" :min="0" :precision="2" :step="0" controls-position="right" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="赠送金额">
|
|
|
- <el-input v-model="enrollForm.giveCost" placeholder="可空,金额" />
|
|
|
+ <el-input-number v-model="enrollForm.giveCost" :min="0" :precision="2" :step="0" controls-position="right" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="校区">
|
|
|
<el-select v-model="enrollForm.campusId" style="width: 100%">
|
|
|
@@ -829,8 +874,8 @@ async function doCounteract(): Promise<void> {
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="推荐人">
|
|
|
- <el-select v-model="enrollForm.recommenderUserId" filterable clearable placeholder="可空" style="width: 100%">
|
|
|
- <el-option v-for="m in studentOpts" :key="m.userId" :value="m.userId" :label="m.realName" />
|
|
|
+ <el-select v-model="enrollForm.recommenderUserId" filterable clearable placeholder="可空(不含被报学生)" style="width: 100%">
|
|
|
+ <el-option v-for="m in recommenderOpts" :key="m.userId" :value="m.userId" :label="m.realName" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="备注">
|
|
|
@@ -861,7 +906,7 @@ async function doCounteract(): Promise<void> {
|
|
|
<span>{{ actTarget?.remainderReceivable }}</span>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="核销金额">
|
|
|
- <el-input v-model="actMoney" placeholder="金额(>0)" />
|
|
|
+ <el-input-number v-model="actMoney" :min="0.01" :precision="2" :step="0.01" controls-position="right" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
@@ -891,14 +936,17 @@ async function doCounteract(): Promise<void> {
|
|
|
font-weight: 600;
|
|
|
min-width: 130px;
|
|
|
}
|
|
|
-.schedule-page__course-select {
|
|
|
- width: 240px;
|
|
|
-}
|
|
|
.schedule-page__date-range {
|
|
|
width: 260px;
|
|
|
}
|
|
|
-.schedule-page__rec-status {
|
|
|
- width: 120px;
|
|
|
+.schedule-page__week {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 4px 14px;
|
|
|
+}
|
|
|
+.schedule-page__week :deep(.el-checkbox) {
|
|
|
+ margin-right: 0;
|
|
|
+ height: 28px;
|
|
|
}
|
|
|
.schedule-page__hint {
|
|
|
font-size: var(--app-font-sm);
|