yangg 1 день тому
батько
коміт
7b539451b3

+ 3 - 1
src/utils/service.ts

@@ -109,8 +109,10 @@ function createService() {
 		(error) => {
 			const status = get(error, 'response.status');
 			switch (status) {
+				
 				case 400:
-					error.message = '请求错误';
+					console.log(error)
+					error.message = error.response.data.msg||'请求错误';
 					break;
 				case 401:
 					// Local.clear();

+ 19 - 0
src/views/system/allusers/api.ts

@@ -45,3 +45,22 @@ export function GetPermission() {
         method: 'get',
     });
 }
+
+// 批量导出用户
+export function BatchExportUsers(userIds: number[], userType?: number) {
+    const params: any = {
+        user_ids: userIds
+    };
+    
+    // 如果指定了用户类型,添加到查询参数中
+    if (userType !== undefined) {
+        params.user_type = userType;
+    }
+    
+    return request({
+        url: apiPrefix + 'export_selected/',
+        method: 'post',
+        data: params,
+        responseType: 'blob', // 重要:设置响应类型为blob以处理文件下载
+    });
+}

+ 115 - 2
src/views/system/allusers/crud.tsx

@@ -1,6 +1,8 @@
-import { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, dict, UserPageQuery,compute } from '@fast-crud/fast-crud';
+import { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, dict, UserPageQuery, compute, InfoReq, EditReq, DelReq } from '@fast-crud/fast-crud';
 import * as api from './api';
 import { auth } from '/@/utils/authFunction';
+import { ElMessage } from 'element-plus';
+import { ref } from 'vue';
 
 export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet {
 	const pageRequest = async (query: UserPageQuery) => {
@@ -22,6 +24,14 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 		return await api.AddObj(form);
 	};
 
+	const selectedIds = ref<any[]>([]);
+
+	const onSelectionChange = (changed: any[]) => {
+		console.log("selection", changed);
+		selectedIds.value = changed.map((item: any) => item.id);
+	};
+
+	(crudExpose as any).selectedIds = selectedIds;
 	/**
 	 * 懒加载
 	 * @param row
@@ -47,6 +57,20 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					add: {
 						show: auth('area:Create'),
 					},
+					/* batchExport: {
+						text: '批量导出',
+						type: 'primary',
+						show: auth('area:Export'),
+						click: ({ getSelectedRows }: any) => {
+							const selectedRows = getSelectedRows();
+							if (selectedRows.length === 0) {
+								ElMessage.warning('请先选择要导出的用户');
+								return;
+							}
+							// 触发批量导出 - 通过全局事件总线
+							window.dispatchEvent(new CustomEvent('batch-export', { detail: selectedRows }));
+						},
+					}, */
 				},
 			},
 			form:{
@@ -63,8 +87,29 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 			},
 			pagination: {
 				show: true,
+			},
+			table: {
+				rowSelection: {
+					show: true,
+					multiple: true,
+				},
+				onSelectionChange,
 			},		
 			columns: {
+				$checked: {
+					title: "选择",
+					form: { show: false },
+					column: {
+					type: "selection",
+					align: "center",
+					width: "55px",
+					columnSetDisabled: true, //禁止在列设置中选择
+					selectable(row: any, index: any) {
+						// return row.id !== 1; //设置第一行不允许选择
+						return row.id;
+					}
+				}
+				},
 				_index: {
 					title: '序号',
 					form: { show: false },
@@ -224,12 +269,54 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: false, message: '请填写租户' }],
 					},
 				},
+				/* 组织架构*/
+				/* organization_detail:{
+					title: '组织架构',
+					type: 'input',
+					column: {
+						show: true,
+						minWidth: 200,
+						formatter: ({ row, value }: { row: any; value: any }) => {
+							// 如果有 organization_detail 对象,显示 full_path
+							if (row.organization_detail && row.organization_detail.full_path) {
+								return row.organization_detail.full_path;
+							}
+							// 否则显示原始值
+							return value || '';
+						},
+					},
+					form: {
+						show:false,
+						component: { placeholder: '请填写组织架构' },
+						rules: [{ required: false, message: '请填写组织架构' }],
+					},
+					viewForm:{
+						component: { placeholder: '' },
+					}
+				}, */
 				organization:{
 					title: '学院',
 					type: 'input',
 					column: {
 						show: true,
-						minWidth: 120,
+						minWidth: 200,
+						formatter: ({ row, value }: { row: any; value: any }) => {
+							// 如果有 organization_detail 对象,显示 parent_chain 的第二项(专业)
+							if (row.organization_detail && row.organization_detail.parent_chain && row.organization_detail.parent_chain.length >= 2) {
+								const major = row.organization_detail.parent_chain[0]; // 第二项是专业
+								return major.name || major.code || '';
+							}
+							// 否则显示原始值
+							return value || row.sub_organization;
+						},
+						/* formatter: ({ row, value }: { row: any; value: any }) => {
+							// 如果有 organization_detail 对象,显示 full_path
+							if (row.organization_detail && row.organization_detail.full_path) {
+								return row.organization_detail.full_path;
+							}
+							// 否则显示原始值
+							return value || '';
+						}, */
 					},
 					form: {
 						component: { placeholder: '请填写学院' },
@@ -245,6 +332,15 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					column: {
 						show: true,
 						minWidth: 120,
+						formatter: ({ row, value }: { row: any; value: any }) => {
+							// 如果有 organization_detail 对象,显示 parent_chain 的第二项(专业)
+							if (row.organization_detail && row.organization_detail.parent_chain && row.organization_detail.parent_chain.length >= 2) {
+								const major = row.organization_detail.parent_chain[1]; // 第二项是专业
+								return major.name || major.code || '';
+							}
+							// 否则显示原始值
+							return value || row.sub_organization;
+						},
 					},
 					form: {
 						component: { placeholder: '请填写专业' },
@@ -260,6 +356,15 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					column: {
 						show: true,
 						minWidth: 120,
+						formatter: ({ row, value }: { row: any; value: any }) => {
+							// 如果有 organization_detail 对象,显示 parent_chain 的第二项(专业)
+							if (row.organization_detail && row.organization_detail.parent_chain && row.organization_detail.parent_chain.length >= 2) {
+								const major = row.organization_detail.parent_chain[2]; // 第二项是专业
+								return major.name || major.code || '';
+							}
+							// 否则显示原始值
+							return value || row.grade_or_level;
+						},
 					},
 					form: {
 						component: { placeholder: '请填写年级' },
@@ -275,6 +380,14 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					column: {
 						show: true,
 						minWidth: 120,
+						formatter: ({ row, value }: { row: any; value: any }) => {
+							// 如果有 organization_detail 对象,显示 name
+							if (row.organization_detail && row.organization_detail.name) {
+								return row.organization_detail.name;
+							}
+							// 否则显示原始值
+							return value || row.class_or_group;
+						},
 					},
 					form: {
 						component: { placeholder: '请填写班级' },

+ 20 - 4
src/views/system/allusers/index.vue

@@ -3,7 +3,8 @@
 		<fs-crud ref="crudRef" v-bind="crudBinding"> 
 			<template #actionbar-right>
 				<el-button type="primary" style="margin-left: 12px;" @click="handleBatchImport">批量导入</el-button>
-				<el-button type="primary"  @click="handleDownloadTemplate">下载模板</el-button>
+				<el-button type="primary" @click="handleDownloadTemplate">下载模板</el-button>
+				<el-button type="primary" @click="handleBatchExport">批量导出</el-button>
 			</template>
 
 		</fs-crud>
@@ -35,15 +36,14 @@ import { onMounted,ref } from 'vue';
 import { GetPermission } from './api';
 import { createCrudOptions } from './crud';
 import { handleColumnPermission } from '/@/utils/columnPermission';
-import { downloadFile } from '/@/utils/service';
-import { request } from '/@/utils/service';
+import {request, downloadFile,downloadFilePost } from '/@/utils/service';
 import Cookies from 'js-cookie';
 import { ElMessage } from 'element-plus';
 
 const importDialogVisible = ref(false); 
 const fileList = ref<File[]>([]);
 
-const { crudBinding, crudRef, crudExpose, crudOptions, resetCrudOptions } = useFs({ createCrudOptions });
+const { crudBinding, crudRef, crudExpose, crudOptions, resetCrudOptions, selectedRows } = useFs({ createCrudOptions });
 
 const handleBatchImport = () => {
 	importDialogVisible.value = true;
@@ -101,6 +101,22 @@ const handleDownloadTemplate = () => {
 		})
 }
 
+const handleBatchExport = () => {
+	const selectedRows = (crudExpose as any).selectedIds?.value || [];	
+	console.log("selectedRows::",selectedRows)
+	if (selectedRows.length === 0) {
+		ElMessage.warning('请先选择要导出的用户')
+		return
+	}
+	downloadFilePost({
+	url: '/api/system/app_user/export_selected/',
+	method: 'post',
+	data: {
+		user_ids: selectedRows
+	},
+	filename: '用户导出'
+	})
+}
 
 // 页面打开后获取列表数据
 onMounted(async () => {

+ 1 - 1
src/views/system/device/crud.tsx

@@ -275,7 +275,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					align: "center",
 					width: "55px",
 					columnSetDisabled: true, //禁止在列设置中选择
-					selectable(row, index) {
+					selectable(row: any, index: any) {
 						// return row.id !== 1; //设置第一行不允许选择
 						return row.id;
 					}

+ 1 - 1
src/views/system/device/index.vue

@@ -89,7 +89,7 @@ const submitImport = async () => {
 		}
 	}).then((res: any) => {
 		console.log("导入resssss:::",res)
-		ElMessage.success('导入成功');
+		ElMessage.success(res.msg);
 		importDialogVisible.value = false;
 		fileList.value = [];
 		crudExpose.doRefresh(); 

+ 59 - 24
src/views/system/devicedamage/crud.tsx

@@ -145,6 +145,63 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: true, message: '' }],
 					}
 				},
+				device_code:{
+					title: '设备编号',
+					type: 'input',
+					column: {
+						show:true,
+						minWidth: 120,
+					},
+					form: {
+						show:true,
+						component: { 
+							placeholder: '请填写设备编号',
+							onBlur: async (event: any) => {
+								// 当输入框失去焦点时,根据编号搜索设备信息
+								const deviceCode = event.target.value?.trim();
+								console.log("onBlur deviceCode:", deviceCode);
+								
+								if (!deviceCode) return;
+								
+								try {
+									// 调用API搜索设备信息
+									const response = await request({
+										url: `/api/system/device/?code=${encodeURIComponent(deviceCode)}`,
+										method: 'get'
+									});
+									
+									console.log("设备搜索响应:", response);
+									
+									if (response.code === 2000 && response.data && response.data.length > 0) {
+										const deviceData = response.data[0]; // 取第一个匹配的设备
+										console.log("找到设备:", deviceData);
+										
+										// 使用 crudExpose 来设置表单数据
+										const formData = crudExpose.getFormData();
+										formData.device = deviceData.id; // 设置设备ID
+										formData.device_code = deviceData.code; // 设置设备编号
+										formData.device_name = deviceData.name; // 设置设备名称
+										crudExpose.setFormData(formData);
+									} else {
+										console.log("未找到匹配的设备");
+										// 可以在这里显示提示信息
+									}
+								} catch (error) {
+									console.error("搜索设备信息失败:", error);
+								}
+							}
+							/* disabled: true  */ // 新增时也禁用,因为会自动回填
+						},
+						rules: [{ required: true, message: '请填写设备编号' }],
+					},
+					editForm:{
+						component: { disabled: true },
+					},
+					viewForm:{
+						component: { placeholder: '' },
+						rules: [{ required: true, message: '' }],
+					}
+				},
 				device:{
 					title: '设备名称',
 					type: 'dict-select',
@@ -218,29 +275,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: true, message: '' }],
 					}
 				},
-				device_code:{
-					title: '设备编号',
-					type: 'input',
-					column: {
-						show:true,
-						minWidth: 120,
-					},
-					form: {
-						show:true,
-						component: { 
-							placeholder: '请填写设备编号',
-							/* disabled: true  */ // 新增时也禁用,因为会自动回填
-						},
-						rules: [{ required: true, message: '请填写设备编号' }],
-					},
-					editForm:{
-						component: { disabled: true },
-					},
-					viewForm:{
-						component: { placeholder: '' },
-						rules: [{ required: true, message: '' }],
-					}
-				},
+				
 				quantity:{
 					title: '报废数量',
 					type: 'input',
@@ -333,7 +368,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						})
 					}
 				},
-				reporter_name:{
+				reporter_person:{
 					title: '负责人',
 					type: 'input',
 					column: {

+ 63 - 23
src/views/system/devicemaintenance/crud.tsx

@@ -37,9 +37,9 @@ export const createCrudOptions = function ({ crudExpose,  dialogId,
 					buttons: {
 						ok:{
 							text:'提交',
-														show:compute((row) => {
-															return row.mode !=='view'
-														})
+							show:compute((row) => {
+								return row.mode !=='view'
+							})
 						}
 					}
 				}
@@ -122,6 +122,10 @@ export const createCrudOptions = function ({ crudExpose,  dialogId,
 						// ],
 						component: {
 							placeholder: '请输入编号',
+							onChange: async (context: any) => {
+								// 当选择设备时,自动回填设备编号和设备名称
+								console.log("onChange context:", context);
+							}
 						},
 					},
 					viewForm:{
@@ -129,6 +133,61 @@ export const createCrudOptions = function ({ crudExpose,  dialogId,
 						rules: [{ required: true, message: '' }],
 					}
 				},
+				device_code:{
+					title: '设备编号',
+					type: 'input',
+					column: {
+						show:true,
+						minWidth: 120,
+					},
+					form: {
+						show:true,
+						component: { placeholder: '请填写设备编号',
+							onBlur: async (event: any) => {
+								// 当输入框失去焦点时,根据编号搜索设备信息
+								const deviceCode = event.target.value?.trim();
+								console.log("onBlur deviceCode:", deviceCode);
+								
+								if (!deviceCode) return;
+								
+								try {
+									// 调用API搜索设备信息
+									const response = await request({
+										url: `/api/system/device/?code=${encodeURIComponent(deviceCode)}`,
+										method: 'get'
+									});
+									
+									console.log("设备搜索响应:", response);
+									
+									if (response.code === 2000 && response.data && response.data.length > 0) {
+										const deviceData = response.data[0]; // 取第一个匹配的设备
+										console.log("找到设备:", deviceData);
+										
+										// 使用 crudExpose 来设置表单数据
+										const formData = crudExpose.getFormData();
+										formData.device = deviceData.id; // 设置设备ID
+										formData.device_code = deviceData.code; // 设置设备编号
+										formData.device_name = deviceData.name; // 设置设备名称
+										crudExpose.setFormData(formData);
+									} else {
+										console.log("未找到匹配的设备");
+										// 可以在这里显示提示信息
+									}
+								} catch (error) {
+									console.error("搜索设备信息失败:", error);
+								}
+							}
+						 },
+						rules: [{ required: true, message: '请填写设备编号' }],
+					},
+					editForm:{
+						component: { disabled: true },
+					},
+					viewForm:{
+						component: { placeholder: '' },
+						rules: [{ required: true, message: '' }],
+					}
+				},
 				device:{
 					title: '设备名称',
 					type: 'dict-select',
@@ -184,26 +243,7 @@ export const createCrudOptions = function ({ crudExpose,  dialogId,
 						rules: [{ required: true, message: '' }],
 					}
 				},
-				device_code:{
-					title: '设备编号',
-					type: 'input',
-					column: {
-						show:true,
-						minWidth: 120,
-					},
-					form: {
-						show:true,
-						component: { placeholder: '请填写设备编号' },
-						rules: [{ required: true, message: '请填写设备编号' }],
-					},
-					editForm:{
-						component: { disabled: true },
-					},
-					viewForm:{
-						component: { placeholder: '' },
-						rules: [{ required: true, message: '' }],
-					}
-				},
+				
 				
 				device_name:{
 					title: '设备名称',

+ 86 - 4
src/views/system/devicemanual/crud.tsx

@@ -98,6 +98,63 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						show:false},
 					column: {show:false}
 				},
+				device_code:{
+					title: '设备编号',
+					type: 'input',
+					column: {
+						show:true,
+						minWidth: 120,
+					},
+					form: {
+						show:true,
+						component: { 
+							placeholder: '请填写设备编号',
+							onBlur: async (event: any) => {
+								// 当输入框失去焦点时,根据编号搜索设备信息
+								const deviceCode = event.target.value?.trim();
+								console.log("onBlur deviceCode:", deviceCode);
+								
+								if (!deviceCode) return;
+								
+								try {
+									// 调用API搜索设备信息
+									const response = await request({
+										url: `/api/system/device/?code=${encodeURIComponent(deviceCode)}`,
+										method: 'get'
+									});
+									
+									console.log("设备搜索响应:", response);
+									
+									if (response.code === 2000 && response.data && response.data.length > 0) {
+										const deviceData = response.data[0]; // 取第一个匹配的设备
+										console.log("找到设备:", deviceData);
+										
+										// 使用 crudExpose 来设置表单数据
+										const formData = crudExpose.getFormData();
+										formData.device = deviceData.id; // 设置设备ID
+										formData.device_code = deviceData.code; // 设置设备编号
+										formData.device_name = deviceData.name; // 设置设备名称
+										crudExpose.setFormData(formData);
+									} else {
+										console.log("未找到匹配的设备");
+										// 可以在这里显示提示信息
+									}
+								} catch (error) {
+									console.error("搜索设备信息失败:", error);
+								}
+							}
+							/* disabled: true  */ // 新增时也禁用,因为会自动回填
+						},
+						rules: [{ required: true, message: '请填写设备编号' }],
+					},
+					editForm:{
+						component: { disabled: true },
+					},
+					viewForm:{
+						component: { placeholder: '' },
+						rules: [{ required: true, message: '' }],
+					}
+				},
 				device:{
 					title: '设备名称',
 					search: {
@@ -165,7 +222,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					}
 
 				},
-				device_code: {
+				/* device_code: {
 					title: '设备编号',
 					search: {
 						show: false,
@@ -178,7 +235,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					form: {
 						show:true,
 					},
-				},
+				}, */
 				article_title: {//article_title
 					title: '文章标题',//'设备名称',
 					search: {
@@ -204,6 +261,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: true, message: '' }],
 					}
 				},
+				
 				device_name:{
 					title: '设备名称',
 					type: 'input',
@@ -212,8 +270,8 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					},
 					form: {
 						show:false,
-						component: { placeholder: '请填发布人' },
-						rules: [{ required: false, message: '请填写发布人' }],
+						component: { placeholder: '请填设备名称' },
+						rules: [{ required: false, message: '请填写设备名称' }],
 					},
 					viewForm:{
 						component: { placeholder: '' },
@@ -227,6 +285,14 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					column: {
 						show:true,
 						minWidth: 120,
+						formatter: ({ row, value }: { row: any; value: any }) => {
+							// 去除HTML标签,只显示纯文本内容
+							if (!value) return '';
+							const text = value.replace(/<[^>]*>/g, '').trim();
+							console.log('原始内容:', value);
+							console.log('处理后内容:', text);
+							return text;
+						},
 					},
 					form: {
 						show:true,
@@ -266,6 +332,22 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: true, message: '' }],
 					}
 				},
+				publisher_name:{
+					title: '发布人',
+					type: 'input',
+					column: {
+						minWidth: 120,
+					},
+					form: {
+						show:false,
+						component: { placeholder: '请填写发布人' },
+						rules: [{ required: false, message: '请填写发布人' }],
+					},
+					viewForm:{
+						component: { placeholder: '' },
+						rules: [{ required: true, message: '' }],
+					}
+				},
 				create_datetime:{
 					title: '发布时间',
 					type: 'input',

+ 60 - 2
src/views/system/devicepreserve/crud.tsx

@@ -2,6 +2,7 @@ import { AddReq, CreateCrudOptionsProps, dict,CreateCrudOptionsRet, UserPageQuer
 import * as api from './api';
 import { auth } from '/@/utils/authFunction';
 import dayjs from 'dayjs';
+import { request } from '/@/utils/service'
 
 export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet {
 	const pageRequest = async (query: UserPageQuery) => {
@@ -160,6 +161,63 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: true, message: '' }],
 					}
 				},
+				device_code:{
+					title: '设备编号',
+					type: 'input',
+					column: {
+						show:true,
+						minWidth: 120,
+					},
+					form: {
+						show:true,
+						component: { 
+							placeholder: '请填写设备编号',
+							onBlur: async (event: any) => {
+								// 当输入框失去焦点时,根据编号搜索设备信息
+								const deviceCode = event.target.value?.trim();
+								console.log("onBlur deviceCode:", deviceCode);
+								
+								if (!deviceCode) return;
+								
+								try {
+									// 调用API搜索设备信息
+									const response = await request({
+										url: `/api/system/device/?code=${encodeURIComponent(deviceCode)}`,
+										method: 'get'
+									});
+									
+									console.log("设备搜索响应:", response);
+									
+									if (response.code === 2000 && response.data && response.data.length > 0) {
+										const deviceData = response.data[0]; // 取第一个匹配的设备
+										console.log("找到设备:", deviceData);
+										
+										// 使用 crudExpose 来设置表单数据
+										const formData = crudExpose.getFormData();
+										formData.device = deviceData.id; // 设置设备ID
+										formData.device_code = deviceData.code; // 设置设备编号
+										formData.device_name = deviceData.name; // 设置设备名称
+										crudExpose.setFormData(formData);
+									} else {
+										console.log("未找到匹配的设备");
+										// 可以在这里显示提示信息
+									}
+								} catch (error) {
+									console.error("搜索设备信息失败:", error);
+								}
+							}
+							/* disabled: true  */ // 新增时也禁用,因为会自动回填
+						},
+						rules: [{ required: true, message: '请填写设备编号' }],
+					},
+					editForm:{
+						component: { disabled: true },
+					},
+					viewForm:{
+						component: { placeholder: '' },
+						rules: [{ required: true, message: '' }],
+					}
+				},
 				device:{
 					title: '设备名称',
 					type: 'dict-select',
@@ -198,7 +256,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: false, message: '' }],
 					}
 				},
-				device_code:{
+				/* device_code:{
 					title: '设备编码',
 					type: 'input',
 					column: {
@@ -214,7 +272,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						component: { placeholder: '' },
 						rules: [{ required: false, message: '' }],
 					}
-				},
+				}, */
 				maintenance_items:{
 					title: '维护项目',
 					type: 'input',

+ 60 - 3
src/views/system/devicepreserveplan/crud.tsx

@@ -2,7 +2,7 @@ import { AddReq, CreateCrudOptionsProps, dict,CreateCrudOptionsRet, UserPageQuer
 import * as api from './api';
 import { auth } from '/@/utils/authFunction';
 import dayjs from 'dayjs';
-
+import { request } from '/@/utils/service'
 export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet {
 	const pageRequest = async (query: UserPageQuery) => {
 		return await api.GetList(query);
@@ -154,6 +154,63 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: true, message: '' }],
 					}
 				},
+				device_code:{
+					title: '设备编号',
+					type: 'input',
+					column: {
+						show:true,
+						minWidth: 120,
+					},
+					form: {
+						show:true,
+						component: { 
+							placeholder: '请填写设备编号',
+							onBlur: async (event: any) => {
+								// 当输入框失去焦点时,根据编号搜索设备信息
+								const deviceCode = event.target.value?.trim();
+								console.log("onBlur deviceCode:", deviceCode);
+								
+								if (!deviceCode) return;
+								
+								try {
+									// 调用API搜索设备信息
+									const response = await request({
+										url: `/api/system/device/?code=${encodeURIComponent(deviceCode)}`,
+										method: 'get'
+									});
+									
+									console.log("设备搜索响应:", response);
+									
+									if (response.code === 2000 && response.data && response.data.length > 0) {
+										const deviceData = response.data[0]; // 取第一个匹配的设备
+										console.log("找到设备:", deviceData);
+										
+										// 使用 crudExpose 来设置表单数据
+										const formData = crudExpose.getFormData();
+										formData.device = deviceData.id; // 设置设备ID
+										formData.device_code = deviceData.code; // 设置设备编号
+										formData.device_name = deviceData.name; // 设置设备名称
+										crudExpose.setFormData(formData);
+									} else {
+										console.log("未找到匹配的设备");
+										// 可以在这里显示提示信息
+									}
+								} catch (error) {
+									console.error("搜索设备信息失败:", error);
+								}
+							}
+							/* disabled: true  */ // 新增时也禁用,因为会自动回填
+						},
+						rules: [{ required: true, message: '请填写设备编号' }],
+					},
+					editForm:{
+						component: { disabled: true },
+					},
+					viewForm:{
+						component: { placeholder: '' },
+						rules: [{ required: true, message: '' }],
+					}
+				},
 				device:{
 					title: '设备名称',
 					type: 'dict-select',
@@ -192,7 +249,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: true, message: '' }],
 					}
 				},
-				device_code:{
+				/* device_code:{
 					title: '设备编码',
 					type: 'input',
 					column: {
@@ -207,7 +264,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						component: { placeholder: '' },
 						rules: [{ required: true, message: '' }],
 					}
-				},
+				}, */
 				cycle_type:{
 					title: '维护类型',
 					type: 'dict-select',