2025年11月24日
实现了供应商管理模块的附件自动提取并填充表单功能,支持上传 Word(.docx)、Excel(.xlsx/.xls)、PDF 文件,自动提取供应商信息并填充到表单。
现象:图片上传和附件上传控件显示在表单底部,而非第一行和第二行
原因:HTML 中这两个上传表单项在其他表单字段之后
解决:
search_replace 工具certificateUpload(图片上传)从第229行移到第122行attachmentUpload(附件上传)紧跟在图片上传之后文件:d:\project\RuoYi-Vue-master\ruoyi-ui\src\views\system\supplier\index.vue
现象:修改 handleAttachmentChange 方法添加自动填充逻辑后,上传文件并未自动打开表单并填充数据
原因:el-upload 的 @change 事件处理可能存在异步延迟或事件触发时序问题
解决:
autoFillFromAttachment() 作为按钮点击事件处理器优势:
现象:虽然表单对象的数据被修改,但页面视图未更新,表单验证仍然失败
根本原因:
this.form.fieldName = value) 不能触发 Vue 的响应式更新错误写法:
// ❌ 不会触发响应式更新
this.form.supplierName = extractedValue;
正确写法:
// ✅ 正确方式:使用 $set 和 $nextTick
if (!this.open) {
this.reset();
this.open = true;
this.title = "新增供应商";
}
this.$nextTick(() => {
this.$set(this.form, 'supplierName', extractedValue);
this.$refs.form.clearValidate();
this.$modal.msgSuccess('数据填充成功');
});
关键步骤:
$set() 而非直接赋值$nextTick() 回调中执行,确保 DOM 渲染完成clearValidate() 清空旧的验证错误现象:选择文件后提示"请先选择文件",无法获取上传的文件列表
原因:Vue 2 中 el-upload 不支持 v-model 直接绑定文件列表
错误写法:
// ❌ v-model 绑定无效
this.form.attachments // 无法获取文件
正确写法:
// ✅ 通过 ref 直接访问
const uploadRef = this.$refs.attachmentUpload;
const files = uploadRef.uploadFiles; // 获取已上传的文件列表
// 获取第一个文件的原始 File 对象
const fileObj = files[0].raw || files[0];
现象:多次测试都显示 productName 为"卖方"而非实际产品名称"电缆"
原因:初期的文本匹配逻辑过于简单,没有足够的上下文判断
第一轮修复(不成功):
extractProductName() 方法的排除列表中添加"卖方"第二轮修复(不成功):
最终修复(成功):
// 最终的备用方案逻辑
if (!extracted.productName || extracted.productName.match(/^(买方|卖方|丫方|按一|按二)$/)) {
const commonProducts = ['电缆', '电线', '管材', '配件', '材料', '设备'];
for (const product of commonProducts) {
if (text.includes(product)) {
extracted.productName = product;
break;
}
}
}
现象:contractAmount 显示为 2025.00(来自日期 2025.11.12)而非正确的 252471.16
原因:金额正则表达式过于宽泛,无法排除年份数字
解决:
// 金额提取的关键逻辑
const amounts = [];
const amountMatches = text.match(/\b([0-9]+(?:\.[0-9]{2})?)\b/g) || [];
for (const match of amountMatches) {
const n = parseFloat(match);
// 排除年份 (2000-2099) 和过小的数字
if (n > 1000 && n < 999999 && !(n >= 2000 && n <= 2099)) {
amounts.push(n);
}
}
现象:含空格的税号格式(如"9143 0111 5765 6395 79")无法被识别
原因:正则表达式中只支持连续的数字和字母,未考虑空格分隔
原始正则:
// ❌ 无法匹配含空格的格式
/税号[\uff1a:]*\s*([0-9]{15,})/
修改后的正则:
// ✅ 支持数字、字母和空格
/税号[\uff1a:]*\s*([0-9A-Z\s]{15,25})/
// 1. 打开对话框(确保 DOM 存在)
if (!this.open) {
this.reset();
this.open = true;
}
// 2. 使用 $nextTick 等待 DOM 渲染
this.$nextTick(() => {
// 3. 使用 $set 触发响应式更新
this.$set(this.form, 'fieldName', value);
// 清空验证错误
this.$refs.form.clearValidate();
});
// 通过 ref 获取上传组件
const uploadRef = this.$refs.attachmentUpload;
// 获取文件列表
const files = uploadRef.uploadFiles;
// 获取原始 File 对象
const fileObj = files[0].raw || files[0];
阶段一:全文扫描(查找关键词)
阶段二:逐行扫描(提取详细字段)
阶段三:备用方案和数据清洗
d:\project\RuoYi-Vue-master\ruoyi-ui\src\views\system\supplier\index.vueUI 布局调整(第120-160行)
方法修改
handleAttachmentChange() 方法autoFillFromAttachment() 新方法功能实现
v1.0-supplier-auto-extracta438cb0# 查看所有标签
git tag -l
# 查看标签详情
git show v1.0-supplier-auto-extract
# 切换到这个版本
git checkout v1.0-supplier-auto-extract
# 回到最新版本
git checkout master
最后更新:2025年11月24日
版本:v1.0-supplier-auto-extract