如何在采购收货分配弹窗中批量上传批次/序列号?
实现采购收货分配弹窗的批次/序列号文件上传功能
我太懂这种上千个非连续序列号手动输入的痛苦了——完全是耗时又容易出错的体力活!针对你在采购收货界面分配弹窗里批量上传序列号表格的需求,我整理了一套可落地的实现方案,结合你提到的代码片段来完善:
核心实现思路
- 给分配弹窗新增文件上传按钮,触发本地文件选择对话框(优先支持Excel/CSV格式,适配大多序列号表格场景)
- 读取上传文件中的序列号数据,先做格式合法性校验(过滤空值、重复值等)
- 将校验通过的序列号批量填充到弹窗的显示区域,同时同步到后台数据存储中
代码实现示例
1. 触发文件选择的弹窗控件逻辑
假设你是基于桌面ERP框架(比如WinForms)开发,先添加上传按钮的点击事件:
private void btnUploadSerial_Click(object sender, EventArgs e) { using (OpenFileDialog fileDialog = new OpenFileDialog()) { fileDialog.Filter = "Excel文件 (*.xlsx)|*.xlsx|CSV文件 (*.csv)|*.csv"; fileDialog.Title = "选择序列号表格"; if (fileDialog.ShowDialog() == DialogResult.OK) { // 读取文件二进制数据,对应你提到的filedata byte[] fileData = File.ReadAllBytes(fileDialog.FileName); // 解析并处理文件内容 HandleSerialNumberFile(fileData, fileDialog.FileName); } } }
2. 文件解析与ERP数据同步
结合你提到的NVE类(推测是ERP内部数据上下文),编写核心处理逻辑:
private void HandleSerialNumberFile(byte[] fileData, string fileName) { try { List<string> validSerials = new List<string>(); // 根据文件格式解析数据 if (fileName.EndsWith(".xlsx")) { // 需先安装EPPlus NuGet包处理Excel using (MemoryStream ms = new MemoryStream(fileData)) using (ExcelPackage excelPackage = new ExcelPackage(ms)) { ExcelWorksheet sheet = excelPackage.Workbook.Worksheets[0]; int totalRows = sheet.Dimension.Rows; // 假设序列号在第一列,跳过表头(第二行开始读取) for (int row = 2; row <= totalRows; row++) { string serial = sheet.Cells[row, 1].Text.Trim(); if (!string.IsNullOrEmpty(serial) && !validSerials.Contains(serial)) { validSerials.Add(serial); } } } } else if (fileName.EndsWith(".csv")) { using (MemoryStream ms = new MemoryStream(fileData)) using (StreamReader reader = new StreamReader(ms)) { // 跳过CSV表头 reader.ReadLine(); string line; while ((line = reader.ReadLine()) != null) { string serial = line.Trim().Split(',')[0].Trim(); if (!string.IsNullOrEmpty(serial) && !validSerials.Contains(serial)) { validSerials.Add(serial); } } } } // 校验数据有效性 if (validSerials.Count == 0) { MessageBox.Show("未读取到有效序列号,请检查文件内容"); return; } // 同步到ERP系统,结合你提到的NVE上下文 using (NVE nveContext = new NVE()) { // 假设当前分配单对象为currentAllocation foreach (string serial in validSerials) { // 实例化ERP对应的序列号实体 SerialNumber serialEntity = new SerialNumber { SerialCode = serial, AllocationId = currentAllocation.Id, Status = "Valid" }; nveContext.SerialNumbers.Add(serialEntity); } nveContext.SaveChanges(); // 更新弹窗UI,展示已导入的序列号 RefreshSerialListUI(validSerials); MessageBox.Show($"成功导入{validSerials.Count}个序列号"); } } catch (Exception ex) { MessageBox.Show($"文件处理失败:{ex.Message}"); // 可添加日志记录便于排查问题 } } // 更新弹窗中的序列号列表显示 private void RefreshSerialListUI(List<string> serials) { lstSerialNumbers.Items.Clear(); foreach (string serial in serials) { lstSerialNumbers.Items.Add(serial); } }
关键注意事项
- 依赖准备:如果处理Excel文件,需要安装
EPPlus或类似的Excel处理NuGet包 - ERP适配:要确保
NVE类、SerialNumber实体的字段和关联逻辑与你司ERP的实际数据结构完全匹配,可能需要调整字段名或关联ID - 数据校验:建议添加更严格的校验规则(比如序列号长度、格式匹配),避免导入无效数据
- 权限检查:确认当前操作用户拥有采购收货分配环节的文件上传和数据修改权限
内容的提问来源于stack exchange,提问作者Ben Rothe
相关产品推荐
相关产品推荐

