瀏覽代碼

no message

kllay 2 天之前
父節點
當前提交
d48640f4cb

+ 86 - 0
src/views/system/borrow/approval/BorrowApprovalDialog/index.vue

@@ -0,0 +1,86 @@
+<template>
+<el-dialog v-model="approvalDialogVisible" title="借用审批" width="600px" :close-on-click-modal="false">
+        <div>
+        <p><strong>申请编号:</strong>{{ approvalData.application_no }}</p>
+        <p><strong>借用人:</strong>{{ approvalData.emergency_contact }}</p>
+        <p><strong>课程:</strong>{{ approvalData.purpose }}</p>
+        <!-- 可继续展示更多字段 -->
+        </div>
+    
+        <div v-if="showRejectReason" style="margin-top: 16px;">
+        <el-input
+            type="textarea"
+            v-model="rejectReason"
+            placeholder="请输入拒绝原因"
+            rows="3"
+        />
+        </div>
+    
+        <template #footer>
+        <el-button @click="approvalDialogVisible = false">取消</el-button>
+        <el-button type="danger" @click="handleReject">拒绝</el-button>
+        <el-button type="primary" @click="handleApprove">通过</el-button>
+        </template>
+  </el-dialog>
+</template>
+
+<script lang="ts" setup name="BorrowApprovalDialog" >
+import { ref } from 'vue';
+
+const approvalDialogVisible = ref(false);
+const approvalData = ref<any>({});
+const showRejectReason = ref(false);
+const rejectReason = ref('');
+
+
+const visible = ref(false);
+const currentRow = ref({});
+
+function open(row) {
+  currentRow.value = row;
+  visible.value = true;
+}
+
+defineExpose({ open });
+
+
+function openApprovalDialog(row) {
+  approvalData.value = row;
+  approvalDialogVisible.value = true;
+  showRejectReason.value = false;
+  rejectReason.value = '';
+}
+
+async function handleApprove() {
+  try {
+    await BorrowingReview(approvalData.value.id, 'approve', '同意借用');
+    ElMessage.success('审批通过');
+    approvalDialogVisible.value = false;
+  } catch (err) {
+    ElMessage.error('审批失败');
+  }
+}
+
+function handleReject() {
+  if (!showRejectReason.value) {
+    showRejectReason.value = true;
+    return;
+  }
+
+  if (!rejectReason.value.trim()) {
+    ElMessage.warning('请填写拒绝原因');
+    return;
+  }
+
+  try {
+    BorrowingReview(approvalData.value.id, 'reject', rejectReason.value);
+    ElMessage.success('已拒绝');
+    approvalDialogVisible.value = false;
+  } catch (err) {
+    ElMessage.error('拒绝失败');
+  }
+}
+
+
+</script>
+

+ 9 - 5
src/views/system/borrow/approval/curd.tsx

@@ -2,10 +2,11 @@ import { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, Edi
 import * as api from './api';
 import { BorrowingReview, Switchspost } from './api';
 import { ElMessage } from 'element-plus';
+import { Ref } from 'vue';
 
 
 
-export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet {
+export const createCrudOptions = function ({ crudExpose ,approvalDialogRef}: CreateCrudOptionsProps& { approvalDialogRef: Ref<any> }): CreateCrudOptionsRet {
 	const pageRequest = async (query: UserPageQuery) => {
 		try {
 			const res = await api.GetList(query);
@@ -70,14 +71,17 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					order: 5,
 					size: "small",
 					show: true,
-					click(context) {
+					click({row}) {
 							// eslint-disable-next-line no-console
 						// console.log("click", context);
 						// alert(context);
 						try{
-							BorrowingReview(context.row.id,'approve','同意借用');
-							ElMessage.success('审判通过');
+							approvalDialogRef.value.open(row);
+							// BorrowingReview(context.row.id,'approve','同意借用');
+							// ElMessage.success('审批通过');
 						}catch(err){
+							// eslint-disable-next-line no-console
+							console.log("error:::::", err);
 							ElMessage.error("系统错误!");
 						}
 					}
@@ -124,7 +128,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					},
 				},
 				"borrower_info.user_code": {
-					title: '学号',
+					title: '学号/工号',
 					search: { show: true },
 					type: 'input',
 					column: { minWidth: 120 },

+ 9 - 1
src/views/system/borrow/approval/index.vue

@@ -1,16 +1,24 @@
 <template>
 	<fs-page>
 		<fs-crud ref="crudRef" v-bind="crudBinding" />
+		<BorrowApprovalDialog ref="approvalDialogRef" @approved="crudExpose.doRefresh()" />
 	</fs-page>
 </template>
 
 <script lang="ts" setup name="approval">
-import { onMounted } from 'vue';
+import { onMounted,ref } from 'vue';
 import { useFs } from '@fast-crud/fast-crud';
 import { createCrudOptions } from './curd';
+import BorrowApprovalDialog from './BorrowApprovalDialog/index.vue';
+
+const approvalDialogRef = ref();
 
 const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions });
 
+createCrudOptions({ crudExpose, approvalDialogRef });
+
+
+
 onMounted(() => {
 	crudExpose.doRefresh();
 });

+ 76 - 15
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}`"
+							:label="`${course.classdetail} - ${course.teacher_name} - ${course.classroom} - ${course.time_label}`"
 							:value="course.classdetail"
 						/>
 					</el-select>
@@ -18,12 +18,12 @@
 				<!-- <el-col :span="3">
 					<el-button>手动输入</el-button>
 				</el-col> -->
-				<el-col :span="6">
+				<!-- <el-col :span="6">
 					<el-input v-model="form.course_input" placeholder="请输入课程名称" />
 				</el-col>
 				<el-col :span="3">
 					<el-button type="primary">搜索</el-button>
-				</el-col>
+				</el-col> -->
 			</el-row>
 			<div style="max-height: 400px; overflow-y: auto; border: 1px solid #eee; padding: 8px; margin-bottom:0px">
 				<timetablemanage />
@@ -52,8 +52,8 @@
 					</el-form-item>
 				</el-col>
 				<el-col :span="8">
-					<el-form-item label="用部门" prop="borrower_dept">
-						<el-input v-model="form.borrower_dept" placeholder="请输入用部门"  />
+					<el-form-item label="用部门" prop="borrower_dept">
+						<el-input v-model="form.borrower_dept" placeholder="请输入用部门"  />
 					</el-form-item>
 				</el-col>
 				<el-col :span="4">
@@ -94,14 +94,26 @@
 				</el-table-column>
 			</el-table>
 			<el-button type="primary" @click="addItem">添加设备</el-button>
+
 			<div style="margin: 16px 0 8px 0; font-weight: bold">附件</div>
-			<el-upload action="#" list-type="text">
-				<el-button type="primary">点击或拖拽上传</el-button>
+			<el-upload
+			action="#"
+			drag
+			list-type="text"
+			accept=".bmp,.gif,.jpeg,.jpg,.png,‌.webp,.svg"
+			multiple
+			:show-file-list="true"
+			:on-success="handleUploadSuccess"
+			:on-error="handleUploadError"
+			>
+			<i class="el-icon-upload"></i>
+			<div class="el-upload__text">将文件拖到此处,或 <em>点击上传</em></div>
 			</el-upload>
+
 		</el-form>
 		<template #footer>
-			<el-button @click="onCancel">取消</el-button>
-			<el-button v-if="!isViewMode" type="primary" @click="onSave">保存</el-button>
+			<el-button @click="onCancel">关闭</el-button>
+			<el-button v-if="!isViewMode" type="primary" @click="onSave">提交</el-button>
 		</template>
 		<SelectDeviceDialog v-model:visible="showSelectDeviceDialog" @confirm="onDeviceSelected" />
 	</el-dialog>
@@ -126,8 +138,23 @@ const visible = ref(props.visible);
 const formRef = ref();
 
 
-function handleCourseSelected({ course_name, expected_start_time }) {
-  form.value.purpose = course_name;
+const lastFormSnapshot = ref<any>(null);
+
+function handleUploadSuccess(response, file, fileList) {
+	// eslint-disable-next-line no-console
+  console.log('上传成功:', file.name);
+}
+
+function handleUploadError(err, file, fileList) {
+	// eslint-disable-next-line no-console
+  console.error('上传失败:', file.name);
+}
+
+
+function handleCourseSelected({ course_id, course_Name,expected_start_time }) {
+	// eslint-disable-next-line no-console
+	// console.log("course_name:::",course_Name)
+  form.value.purpose = course_Name;
   form.value.expected_start_time = expected_start_time;
 }
 
@@ -213,10 +240,43 @@ onMounted(() => {
 	fetchWeeklySchedule();
 });
 
-watch(
-	() => props.visible,
-	(v) => (visible.value = v)
-);
+
+
+function resetForm() {
+  form.value = {
+    application_no: '',
+    emergency_contact: '',
+    purpose: '',
+    emergency_phone: '',
+    app_user_borrower: 1,
+    borrower_dept: '',
+    team_type: 1,
+    team_members_count: 1,
+    team_members: '',
+    expected_start_time: '',
+    expected_end_time: '',
+    applicant_remark: '',
+    return_location: '',
+    items: [],
+    borrow_type: 1,
+    course_input: ''
+  };
+}
+
+
+
+watch(() => props.visible, (v) => {
+  visible.value = v;
+  if (v) {
+    if (lastFormSnapshot.value) {
+      form.value = { ...lastFormSnapshot.value };
+    } else {
+      resetForm(); // 如果没有快照,初始化表单
+    }
+  }
+});
+
+
 watch(
 	() => props.modelValue,
 	(v) => {
@@ -260,6 +320,7 @@ function onSave() {
 			emit('submit', { ...form.value });
 			emit('update:visible', false);
 			ElMessage.success("添加成功!");
+			lastFormSnapshot.value = { ...form.value }; //用于记忆上次记录
 		}
 	});
 }

+ 21 - 2
src/views/system/borrow/component/SpecialBorrow/index.vue

@@ -88,9 +88,20 @@
 			<el-button type="primary" @click="addItem" v-if="!isView">添加设备</el-button>
 			<div style="margin: 16px 0 8px 0; font-weight: bold">配件信息</div>
 			<el-input v-model="form.accessory_info" placeholder="请输入配件信息"  :disabled="isView"/>
+
 			<div style="margin: 16px 0 8px 0; font-weight: bold">附件</div>
-			<el-upload action="#" list-type="text">
-				<el-button type="primary">点击或拖拽上传</el-button>
+			<el-upload
+			action="#"
+			drag
+			list-type="text"
+			accept=".bmp,.gif,.jpeg,.jpg,.png,‌.webp,.svg"
+			multiple
+			:show-file-list="true"
+			:on-success="handleUploadSuccess"
+			:on-error="handleUploadError"
+			>
+			<i class="el-icon-upload"></i>
+			<div class="el-upload__text">将文件拖到此处,或 <em>点击上传</em></div>
 			</el-upload>
 		</el-form>
 		<!-- 审批信息流程展示 -->
@@ -163,7 +174,15 @@ const timeline = ref({
 });
 const activeStep = ref(1);
 
+function handleUploadSuccess(response, file, fileList) {
+	// eslint-disable-next-line no-console
+  console.log('上传成功:', file.name);
+}
 
+function handleUploadError(err, file, fileList) {
+	// eslint-disable-next-line no-console
+  console.error('上传失败:', file.name);
+}
 
 
 const form = ref({

+ 1 - 0
src/views/system/timetablemanage/crud.tsx

@@ -19,6 +19,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 
 	return {
 		crudOptions: {
+			layout: 'custom',
 			request: {
 				pageRequest,
 				addRequest,

+ 31 - 12
src/views/system/timetablemanage/index.vue

@@ -45,9 +45,9 @@
 					v-for="course in scope.row[`day${index + 1}`]"
 					:key="course.id"
 					style="margin-bottom: 4px; cursor: pointer"
-					@click.stop="openDialogEdit(course, scope.row.timeLabel, index)"
+					@click.stop="openDialogEdit(course)"
 					>
-						{{ course.classdetail }} 老师:({{ course.teacher_name }}) 班级:{{ course.classroom }}
+						{{ course.classdetail }} 老师:({{ course.teacher_name }}) 教室:{{ course.classroom }}
 					</div>
 				</div>
 			</template>
@@ -59,7 +59,7 @@
 
 
 		</div>
-		<fs-crud ref="crudRef" v-bind="crudBinding"> </fs-crud>
+		<!-- <fs-crud ref="crudRef" v-bind="crudBinding"> </fs-crud> -->
 
 		<AdditionDialog ref="dialogRef" @saved="loadData"  />
 		
@@ -141,23 +141,42 @@ function editCourse(course: any) {
 }
 
 
+function getStartTime(time: number): string {
+  const timeMap = {
+    1: '09:00:00',
+    2: '14:00:00',
+    3: '19:00:00'
+  };
+  return timeMap[time] || '09:00';
+}
 
-function openDialogEdit(course?: any, timeLabel?: string, dayIndex?: number) {
-  const courseName = course?.classdetail || '';
-  const dateLabel = weekDates.value[dayIndex]; 
-  const dateMatch = dateLabel.match(/\d{4}-\d{2}-\d{2}/);
-  const dateStr = dateMatch ? dateMatch[0] : dayjs().format('YYYY-MM-DD');
-  const timeStr = timeLabel?.split('-')[0] || '09:00';
-  const expectedStartTime = `${dateStr} ${timeStr}:00`;
 
+function openDialogEdit(course?: any) {
+	const courseId = course?.id || '';
+	const courseClassdetail = course?.classdetail || '';
+	const courseteacher_name = course?.teacher_name || '';
+	const courseclassroom = course?.classroom || '';
+	const coursetime_label = course?.time_label || '';
+	const courseclassdate=course?.class_date||'';
+
+	const timeStr = getStartTime(course?.time); 
+	const expectedStartTime = `${courseclassdate} ${timeStr}`;
+	const courseName = `${courseClassdetail} - ${courseteacher_name} - ${courseclassroom} - ${coursetime_label}`;
+	// eslint-disable-next-line no-console
+	// console.log("expectedStartTime:::",expectedStartTime)
+	// eslint-disable-next-line no-console
+	// console.log("courseName:::",courseName)
   if (isEmbedded && typeof onCourseSelected === 'function') {
+	
 	try {
       onCourseSelected({
-		course_name: courseName,
+		course_id: courseId,
+		course_Name:courseName,
 		expected_start_time: expectedStartTime
       	});
-		dialogRef.value.open(course);
+		// dialogRef.value.open(course);
     } catch (e) {
+		// eslint-disable-next-line no-console
       console.warn('onCourseSelected failed:', e);
     }
   } else {