qaz vor 5 Tagen
Ursprung
Commit
ebb19a04ce

+ 19 - 1
src/views/system/borrow/component/ClassroomBorrow/index.vue

@@ -8,7 +8,7 @@
 						<el-option
 							v-for="course in weeklyCourses"
 							:key="course.id"
-							:label="`${course.classdetail} - ${course.teacher_name} - ${course.classroom} - ${course.time_label}`"
+							:label="formatCourseSelectLabel(course)"
 							:value="course.classdetail"
 						/>
 					</el-select>
@@ -502,6 +502,24 @@ function getStartTime(time: number): string {
   return timeMap[time] || '09:00:00';
 }
 
+/** 下拉展示用:接口可能返回带时间的字符串,统一为 YYYY-MM-DD */
+function formatClassDateForCourseLabel(raw: unknown): string {
+  if (raw == null || String(raw).trim() === '') return '';
+  const s = String(raw).trim();
+  const d = dayjs(s);
+  if (d.isValid()) return d.format('YYYY-MM-DD');
+  return s.split(/[T\s]/)[0] || s;
+}
+
+/** 课程下拉:日期(仅年月日)、节次/时段文案、与借用开始时间一致的具体时刻 */
+function formatCourseSelectLabel(course: any): string {
+  const clock = getStartTime(Number(course?.time)).slice(0, 5);
+  const dateTime = [formatClassDateForCourseLabel(course?.class_date), course?.time_label, clock]
+    .filter((s) => s != null && String(s).trim() !== '')
+    .join(' ');
+  return `${course?.classdetail} - ${course?.teacher_name} - ${course?.classroom} - ${dateTime}`;
+}
+
 
 
 

+ 9 - 9
src/views/system/borrow/component/CollectEquipment/index.vue

@@ -324,7 +324,7 @@
                             </el-table-column>
                             <el-table-column
                                 v-if="showUnreturnedReturnTableColumns"
-                                label="未归还可还"
+                                label="未归还数量"
                                 width="110"
                                 align="center"
                             >
@@ -1338,8 +1338,8 @@ const autoSubmitPendingCodes = async () => {
             existingDevice.borrow_count++;
             console.log(`设备 ${trimmedCode} 已存在,借用数量+1`);
           } else {
-            // 如果不存在,添加到列表
-            deviceList.value.push({
+            // 如果不存在,添加到列表(unshift:最新添加的在表格最上方)
+            deviceList.value.unshift({
               device_no: device.id,
               device_code: device.code,
               device_type: device.category_name,
@@ -2111,7 +2111,7 @@ const handleScanSearch = async (event?: Event) => {
           existingDevice.borrow_count++;
           successCount++;
         } else {
-          deviceList.value.push(deviceData);
+          deviceList.value.unshift(deviceData);
           successCount++;
         }
       });
@@ -3102,8 +3102,8 @@ function onDeviceSelected(devices: Device[]) {
       ElMessage.warning(`已过滤 ${devices.length - newDevices.length} 个重复的设备`);
     }
     
-    deviceList.value.push(
-      ...newDevices.map(d => ({
+    newDevices.forEach((d) => {
+      deviceList.value.unshift({
         device_no: d.id,
         device_code: d.code,
         device_type: d.category_name,
@@ -3113,9 +3113,9 @@ function onDeviceSelected(devices: Device[]) {
         model: d.model,
         device_specification: d.specification,
         warehouse: d.warehouse,
-        available_quantity:d.available_quantity
-      }))
-    );
+        available_quantity: d.available_quantity
+      });
+    });
   }else if(activeName.value === 'third'){
     // 在添加前检查每个设备是否已存在;手动选设备:将本次归还数量记满至「待归还」上限
     devices.forEach(d => {

+ 28 - 12
src/views/system/borrow/crud.tsx

@@ -21,21 +21,28 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 		/**
 		 * 多状态:列 status__in。fast-crud 可能放在 form 里,也可能展到 query 根上(故 q.form 为空时仍可能有 q.status__in)。
 		 * 列表接口使用 params.status(与后端一致),不单独传 status__in,避免后端忽略。
+		 * 搜索栏「当前状态」单选优先于地址栏/看板注入的 status__in,避免用户改选后请求仍带多状态。
 		 */
-		const fromInForm =
-			form.status__in != null && String(form.status__in).trim() !== '' ? String(form.status__in).trim() : '';
-		const fromInQuery =
-			q.status__in != null && String(q.status__in).trim() !== '' ? String(q.status__in).trim() : '';
-		const statusInVal = fromInForm || fromInQuery;
-		if (statusInVal) {
-			q.status = statusInVal;
+		const singleStatus =
+			form.status != null && String(form.status).trim() !== '' ? String(form.status).trim() : '';
+		if (singleStatus) {
+			q.status = singleStatus;
 			delete q.status__in;
-			if (fromInForm) {
-				delete (form as any).status__in;
-			}
-		} else if (form.status != null && String(form.status).trim() !== '') {
-			q.status = String(form.status).trim();
+			delete (form as any).status__in;
 			delete (form as any).status;
+		} else {
+			const fromInForm =
+				form.status__in != null && String(form.status__in).trim() !== '' ? String(form.status__in).trim() : '';
+			const fromInQuery =
+				q.status__in != null && String(q.status__in).trim() !== '' ? String(q.status__in).trim() : '';
+			const statusInVal = fromInForm || fromInQuery;
+			if (statusInVal) {
+				q.status = statusInVal;
+				delete q.status__in;
+				if (fromInForm) {
+					delete (form as any).status__in;
+				}
+			}
 		}
 		q.form = form;
 		if (BORROW_LIST_PAGE_REQUEST_LOG) {
@@ -478,6 +485,15 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					type: 'dict-select',
 					search: {
 						show: true,
+						/** 用户操作搜索区「当前状态」时清掉残留 status__in,与地址栏/程序化多状态解耦;清空时同理 */
+						valueChange: (arg0: any, _arg1?: any, formArg?: any) => {
+							const f =
+								arg0 && typeof arg0 === 'object' && 'form' in arg0
+									? (arg0 as { form: any }).form
+									: formArg;
+							if (f == null) return;
+							delete f.status__in;
+						},
 					},
 					dict: dict({
 						data: [

+ 30 - 2
src/views/system/timetablemanage/index.vue

@@ -55,7 +55,10 @@
 						"
 					@click.stop="openDialogEdit(course)"
 					>
-						{{ course.classdetail }} 老师:({{ course.teacher_name }}) 教室:{{ course.classroom }}
+						<div>{{ course.classdetail }} 老师:({{ course.teacher_name }}) 教室:{{ course.classroom }}</div>
+						<div v-if="formatCourseDisplayTime(course)" class="course-cell-time">
+							时间:{{ formatCourseDisplayTime(course) }}
+						</div>
 					<el-link
 						v-if="!isEmbedded"
 						type="danger"
@@ -183,6 +186,23 @@ function getStartTime(time: number): string {
   return timeMap[time] ?? '09:00:00';
 }
 
+/** 展示用:接口可能返回带时间的日期字符串,统一为 YYYY-MM-DD */
+function formatClassDateForDisplay(raw: unknown): string {
+  if (raw == null || String(raw).trim() === '') return '';
+  const s = String(raw).trim();
+  const d = dayjs(s);
+  if (d.isValid()) return d.format('YYYY-MM-DD');
+  return s.split(/[T\s]/)[0] || s;
+}
+
+/** 与课堂借用下拉里一致:日期(仅年月日)、节次/时段、具体开始时刻 */
+function formatCourseDisplayTime(course: any): string {
+  const clock = getStartTime(Number(course?.time)).slice(0, 5);
+  return [formatClassDateForDisplay(course?.class_date), course?.time_label, clock]
+    .filter((s) => s != null && String(s).trim() !== '')
+    .join(' ');
+}
+
 
 function openDialogEdit(course?: any) {
 	const courseId = course?.id || '';
@@ -194,7 +214,9 @@ function openDialogEdit(course?: any) {
 
 	const timeStr = getStartTime(course?.time); 
 	const expectedStartTime = `${courseclassdate} ${timeStr}`;
-	const courseName = `${courseClassdetail} - ${courseteacher_name} - ${courseclassroom} - ${coursetime_label}`;
+	const baseName = `${courseClassdetail} - ${courseteacher_name} - ${courseclassroom}`;
+	const nameSuffix = formatCourseDisplayTime(course) || coursetime_label;
+	const courseName = nameSuffix ? `${baseName} - ${nameSuffix}` : baseName;
 	// eslint-disable-next-line no-console
 	// console.log("expectedStartTime:::",expectedStartTime)
 	// eslint-disable-next-line no-console
@@ -271,6 +293,12 @@ onMounted(async () => {
 
 
 <style scoped>
+.course-cell-time {
+  font-size: 12px;
+  color: #606266;
+  margin-top: 4px;
+  line-height: 1.3;
+}
    .header-bar {
   display: flex;
   align-items: center;