首先校验

 

    /*** 校验导入文件* @param file 上传的文件* @return 校验结果,成功返回包含成功状态的AjaxResult,失败返回包含错误信息的AjaxResult*/private AjaxResult validateImportFile(MultipartFile file) {if (file.isEmpty()) {return AjaxResult.error("文件不能为空");}String filename = file.getOriginalFilename();if (filename == null || !(filename.endsWith(".xlsx") || filename.endsWith(".xls"))) {return AjaxResult.error("仅支持Excel文件");}return AjaxResult.success();}

 通过进行解析

    @Override@Transactional(rollbackFor = Exception.class)public AjaxResult importWnList(@RequestParam("file") MultipartFile file) {// 1. 校验文件AjaxResult validateResult = validateImportFile(file);if (!validateResult.isSuccess()) {return validateResult;}try {// 2. 解析ExcelList<Wn> dataList = parseExcel(file);// 3. 处理业务逻辑Map<String, Object> importResult = saveListData(dataList);// 4. 构建返回消息return buildImportResult(importResult);} catch (Exception e) {return AjaxResult.error("导入失败: " + e.getMessage());}}

 

    public List<Wn> parseExcel(MultipartFile file) throws IOException {List<Wn> list = new ArrayList<>();DataFormatter formatter = new DataFormatter();Workbook workbook = WorkbookFactory.create(file.getInputStream());Sheet sheet = workbook.getSheet("微脑列表");// 如果找不到指定名称的工作表,则获取第一个工作表if (sheet == null) {log.info("找不到名为'微脑列表'的工作表,将使用第一个工作表");sheet = workbook.getSheetAt(0);// 检查第一个工作表是否存在if (sheet == null) {throw new IllegalArgumentException("Excel文件中不包含任何工作表");}}for (Row row : sheet) {if (row.getRowNum() == 0) continue; // 跳过表头Wn wn = new Wn();wn.setWnNum(formatter.formatCellValue(row.getCell(0)));wn.setWnSn(formatter.formatCellValue(row.getCell(1)));wn.setWnType(formatter.formatCellValue(row.getCell(2)));wn.setAreaId(formatter.formatCellValue(row.getCell(3)));list.add(wn);}workbook.close();return list;}

最后保存逻辑

    public Map<String, Object> saveListData(List<Wn> dataList) {// 参数校验if (CollectionUtils.isEmpty(dataList)) {return Collections.singletonMap("message", "数据列表不能为空");}HashSet<Long> TempidList = new HashSet<>();// 初始化统计结果int successCount = 0;int failCount = 0;List<String> failReasons = new ArrayList<>();dataList.forEach(wn -> {String wnType = wn.getWnType();WnTemplate wnTemplateA = new WnTemplate();wnTemplateA.setId(Long.valueOf(wnType));List<WnTemplate> wnTemplates = wnTemplateMapper.selectWnTemplateList(wnTemplateA);TempidList.add(wnTemplates.get(0).getId());});// 优化:先加载所有模板信息到Map,避免循环内重复查询Map<Long, WnTemplate> templateMap = loadTemplateMapByType(TempidList);// 遍历处理每条数据for (int i = 0; i < dataList.size(); i++) {Wn wn = dataList.get(i);try {// 1. 输入参数基础校验validateWnData(wn);// 2. 唯一性校验(示例校验name和code组合唯一)if (selectWnByWnNum(wn.getWnNum()) != null) {throw new RuntimeException("微脑编号已存在"+wn.getWnNum());}// 3. 校验:微脑模板是否存在(从预加载的Map中获取)String wnType = wn.getWnType();WnTemplate wnTemplate = new WnTemplate();wnTemplate.setId(Long.valueOf(wnType));List<WnTemplate> wnTemplates = wnTemplateMapper.selectWnTemplateList(wnTemplate);WnTemplate wnTemplateB = templateMap.get(wnTemplates.get(0).getId());if (wnTemplateB == null) {throw new RuntimeException("该模板不存在:" + wn.getWnType());}wn.setWnType(wnTemplateB.getName());wn.setStatus("0");// 4. 插入数据insertWn(wn);if (StringUtils.isEmpty(wn.getQrCode())){String url=qrcode(wn.getId());wn.setQrCode(url);wnMapper.updateWn(wn);}for (WnTemplateSensors wnTemplateSensors : wnTemplateB.getSensorsList()) {Sensors sensors = new Sensors();sensors.setSensorType(wnTemplateSensors.getSensorType());sensors.setWnId(wn.getId());sensors.setCreateTime(DateUtils.getNowDate());sensors.setSensorNid(wnTemplateSensors.getSensorNid());sensorsMapper.insertSensors(sensors);}successCount++;} catch (Exception e) {failCount++;failReasons.add(failCount + ") 第" + (i + 2) + "行数据错误:" + e.getMessage());}}// 返回结构化结果Map<String, Object> result = new HashMap<>();result.put("successCount", successCount);result.put("failCount", failCount);result.put("failReasons", failReasons);return result;}

构建返回信息

    /*** 构建导入结果返回对象* @param importResult 导入结果Map,包含successCount、failCount和failReasons* @return 导入结果对象*/private AjaxResult buildImportResult(Map<String, Object> importResult) {// 从Map中提取结果数据Integer successCount = (Integer) importResult.getOrDefault("successCount", 0);Integer failCount = (Integer) importResult.getOrDefault("failCount", 0);List<String> failReasons = (List<String>) importResult.get("failReasons");// 构建返回消息String message;if(failCount.equals(0)){message = String.format("导入完成!成功 %d 条,失败 %d 条。",successCount,failCount);return AjaxResult.success(message).put("successCount", importResult.get("successCount")).put("failCount", failCount);}else{message = String.format("导入完成!成功 %d 条,失败 %d 条。\n失败原因:\n%s",successCount,failCount,String.join("\n", failReasons));return AjaxResult.success(message).put("successCount", importResult.get("successCount")).put("failCount", importResult.get("failCount")).put("details", importResult.get("failReasons"));}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89320.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89320.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89320.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0开始学习计算机视觉--Day06--反向传播算法

尽管解析梯度可以让我们省去巨大的计算量&#xff0c;但如果函数比较复杂&#xff0c;对这个损失函数进行微分计算会变得很困难。我们通常会用反向传播技术来递归地调用链式法则来计算向量每一个方向上的梯度。具体来说&#xff0c;我们将整个计算过程的输入与输入具体化&#…

企业流程知识:《学习观察:通过价值流图创造价值、消除浪费》读书笔记

《学习观察&#xff1a;通过价值流图创造价值、消除浪费》读书笔记 作者&#xff1a;迈克鲁斯&#xff08;Mike Rother&#xff09;&#xff0c;约翰舒克&#xff08;John Shook&#xff09; 出版时间&#xff1a;1999年 历史地位&#xff1a;精益生产可视化工具的黄金标准&am…

Day02_C语言IO进程线程

01.思维导图 02.将当前的时间写入到time. txt的文件中&#xff0c;如果ctrlc退出之后&#xff0c;在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止&#xff0c;再次执行程序 4.2022-04-26 20:00:00 5.2022-04-26 2…

FFmpeg中TS与MP4格式的extradata差异详解

在视频处理中&#xff0c;extradata是存储解码器初始化参数的核心元数据&#xff0c;直接影响视频能否正确解码。本文深入解析TS和MP4格式中extradata的结构差异、存储逻辑及FFmpeg处理方案。 &#x1f4cc; 一、extradata的核心作用 extradata是解码必需的参数集合&#xff0…

【CV数据集介绍-40】Cityscapes 数据集:助力自动驾驶的语义分割神器

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

SAP月结问题9-FAGLL03H与损益表中研发费用金额不一致(FAGLL03H Bug)

SAP月结问题9-FAGLL03H与损益表中研发费用金额不一致(S4 1709) 财务反馈&#xff0c;月结后核对数据时发现FAGLL03H导出的研发费用与损益表中的研发费用不一致&#xff0c;如下图所示&#xff1a; 对比FAGLL03H与损益表对应的明细&#xff0c;发现FAGLL03H与损益表数据存在倍数…

HTML inputmode 属性详解

inputmode 是一个 HTML 属性&#xff0c;用于指定用户在编辑元素或其内容时应使用的虚拟键盘布局类型。它主要影响移动设备和平板电脑的输入体验。 语法 <input inputmode"value"> <!-- 或 --> <textarea inputmode"value"></texta…

软考中级【网络工程师】第6版教材 第1章 计算机网络概述

考点分析&#xff1a; 本章重要程度&#xff1a;一般&#xff0c;为后续章节做铺垫&#xff0c;有总体认识即可&#xff0c;选择题1-2分高频考点&#xff1a;OSI模型、TCP/IP模型、每个层次的功能、协议层次新教材变化&#xff1a;删除网络结构、删除X.25、更新互联网发展【基本…

Mysql事务与锁

数据库并发事务 数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。为了解决这些并发事务的问题&#xff0c;数据库设计了事务隔离机制、锁机制、MVCC多…

Bilibili多语言字幕翻译扩展:基于上下文的实时翻译方案设计

Bilibili多语言字幕翻译扩展&#xff1a;基于上下文的实时翻译方案设计 本文介绍了一个Chrome扩展的设计与实现&#xff0c;该扩展可以为Bilibili视频提供实时多语言字幕翻译功能。重点讨论了字幕翻译中的上下文问题及其解决方案。 该项目已经登陆Chrome Extension Store: http…

热血三国野地名将列表

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>野地名将信息表</title><style>tabl…

【记录】Word|Word创建自动编号的多级列表标题样式

文章目录 前言创建方式第一种方法&#xff1a;从“定义多级列表”中直接绑定已有样式第二种方法&#xff1a;通过已有段落创建样式&#xff0c;再绑定补充说明 尾声 前言 这世上荒唐的事情不少&#xff0c;但若说到吊诡&#xff0c;Word中的多级列表样式设定&#xff0c;倒是能…

使用mavros启动多机SITL仿真

使用mavros启动多机SITL仿真 方式1&#xff1a;使用roslaunch一键启动Step1&#xff1a;创建一个新的 ROS 包或放到现有包里Step2&#xff1a;编辑 multi_mavros.launchStep3&#xff1a;构建工作空间并 source 环境Step4&#xff1a;构建工作空间并 source 环境 方式2&#xf…

Flutter 网络栈入门,Dio 与 Retrofit 全面指南

面向多年 iOS 开发者的零阻力上手 写在前面 你在 iOS 项目中也许习惯了 URLSession、Alamofire 或 Moya。 换到 Flutter 后&#xff0c;等价的「组合拳」就是 Dio Retrofit。 本文将带你一次吃透两套库的安装、核心 API、进阶技巧与最佳实践。 1. Dio&#xff1a;Flutter 里的…

工作室考核源码(带后端)

题目内容可更改 下载地址:https://mcwlkj.lanzoub.com/iUF3z300tgfe 如图所示

数字孪生技术为UI前端提供全面支持:实现产品的可视化配置与定制

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言&#xff1a;数字孪生驱动产品定制的技术革命 在消费升级与工业 4.0 的双重驱动下&a…

通往物理世界自主智能的二元实在论与罗塞塔协议

序章&#xff1a;AI的“两种文化”之争——我们是否在构建错误的“神”&#xff1f; 自诞生以来&#xff0c;人工智能领域始终存在着一场隐秘的“两种文化”之争。一方是符号主义与逻辑的信徒&#xff0c;他们追求可解释、严谨的推理&#xff0c;相信智能的核心在于对世界规则…

探索 AI 系统提示与模型资源库:`system-prompts-and-models-of-ai-tools`

在当今的人工智能领域,系统提示和工具模型的优化与应用对于提升 AI 助手的性能和响应质量至关重要。x1xhlol 开源的 system-prompts-and-models-of-ai-tools 仓库为开发者们提供了一个丰富的资源集合,涵盖了多种 AI 工具的系统提示、工具和模型。 仓库概述 这个仓库包含了超…

城市灯光夜景人像街拍摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 “城市灯光夜景人像街拍摄影后期 Lr 调色”&#xff0c;主要是利用 Lightroom 软件&#xff0c;对城市夜景中灯光下的人像街拍照片进行处理。通过调整色彩平衡、明暗对比和细节质感&#xff0c;强化夜景灯光的绚丽感&#xff0c;突出人像主体&#xff0c;同时协调人物…

JavaScript中的call、apply、bind:用法、实现与区别详解(面试常见)

# JavaScript中的call、apply、bind&#xff1a;用法、实现与区别详解## 核心概念 这三个方法都用于改变函数执行时的this指向&#xff0c;是JavaScript中函数上下文操作的核心API。## 1. 基本用法对比### call方法 javascript function.call(thisArg, arg1, arg2, ...)特点&am…