如何在实验室信息管理系统实现不定行,不定列检测?
前言
实验室信息管理系统,即 LIMS(Laboratory Information Management System),它是由计算机和应用软件组成,能够完成实验室数据和信息的收集、分析、报告和管理。早期的 LIMS 系统大多基于计算机局域网,专门针对一个实验室的整体环境而设计,是一个包括了信号采集设备、数据通讯软件、数据库管理软件在内的高效集成系统。
LIMS 系统以实验室为中心,将实验室的业务流程、环境、人员、仪器设备、标物标液、化学试剂、标准方法、图书资料、文件记录、客户管理等等影响分析的数据因素有机结合起来,采用先进的计算机网络技术,数据库技术和标准化的实验室管理思想,组成一个全面、规范的管理体系,为实现分析数据网上调度、分析数据自动采集、快速分布、信息共享、分析报告无纸化、质量保证体系顺利实施、成本严格控制、人员量化考核、实验室管理水平整体提高等各方面提供技术支持,是连接实验室、采样现场、监管部门及客户信息的信息平台,同时引入先进的数理统计技术,如方差分析、相关和回归分析、显著性检验、累积和控制图、抽样检验等,协助职能部门及时发现和控制影响产品质量的关键因素。
LIMS 系统中面临的痛点问题:
痛点一:
LIMS 系统在报表分析中经常会遇见这样的问题:实验模板的报表行数与列数是固定的,但是检测物和检测方法的数量是不固定的,举个简单的例子,如下图所示,【离子色谱测定原始记录】表中检测方法共有 20 行,检测物共 7 列。
但是在实际的使用中,检测方法数据有 24 行,检测物有 7 列,这个时候就无法满足报表的现有行列模板模式,像上面这个例子数据少的,可以人工手动进行修改,但是当数据过大时(几千甚至几万列数据),人工修改就会很浪费时间,且费时费力。
痛点二:
配置在单元格中的公式也需要自动扩展,公式引用的单元格也需要相对变化:
解决方法
面对这样需求,可以借助葡萄城的 SpreadJS在线表格编辑器来解决这些痛点问题:
1.首先通过数据绑定完成固定单元格的数据渲染和填报:
- 面对行列总数超过模板总数这样的问题,实现的思路就是把检测数据根据模板的行列总数进行分割,根据分割的数据,复制现有模板到新的sheet中,将分割的数据放到新的sheet中实现分页,当然实际业务中某些行列
3.公式函数通过api填充实现:
核心代码分享
1.根据模板行列总数,动态处理数据源:
// 根据模板行列总数,动态处理数据源 processBindData() { this.dataSource = JSON.parse(JSON.stringify(data)); delete this.dataSource.test; let test1, test2, test3, test4 // 实际项目中需要根据模板行列动态判断是否需要分页,本示例中20行,7列 if (data.test.length > 20 && Object.keys(data.test[0]).length > 7) { test1 = data.test.slice(0, 20); test1.forEach((item, index) => { test1[index] = pickByIndex(item, 0, 6) }) this.dataSource.test1 = test1; test2 = data.test.slice(0, 9).concat(data.test.slice(20, data.test.length)); test2.forEach((item, index) => { test2[index] = pickByIndex(item, 0, 6) }) this.dataSource.test2 = test2; test3 = data.test.slice(0, 20); test3.forEach((item, index) => { test3[index] = Object.assign(pickByIndex(item, 0, 1), pickByIndex(item, 7, 8)) }) this.dataSource.test3 = test3; test4 = data.test.slice(0, 9).concat(data.test.slice(20, data.test.length)); test4.forEach((item, index) => { test4[index] = Object.assign(pickByIndex(item, 0, 1), pickByIndex(item, 7, 8)) }) this.dataSource.test4 = test4; console.log(this.dataSource); this.templatePagination(); } // }) }, 2. 根据处理好的数据,动态生成新的sheet,动态填充数据 // 根据处理好的数据,动态生成新的sheet,动态填充数据 templatePagination() { let sheetJSON = this.spread.getSheet(0).toJSON(); for (let i = 1; i < 5; i++) { if (i == 1) { this.spread.removeSheet(0) } let newSheet = new GC.Spread.Sheets.Worksheet("第" + i + "页"); this.spread.addSheet(this.spread.getSheetCount(), newSheet); newSheet.fromJSON(sheetJSON); newSheet.name("第" + i + "页"); newSheet.setValue(1, 6, "共4页,第" + i + "页"); var tableColumns = [], names = Object.keys(this.dataSource[test${i}][0]), labels = Object.keys(this.dataSource[test${i}][0]); var table = newSheet.tables.add(test${i}, 6, 0, this.dataSource[test${i}].length + 1, Object.keys(this.dataSource[test${i}][0]).length); table.autoGenerateColumns(false); names.forEach(function (name, index) { var tableColumn = new GC.Spread.Sheets.Tables.TableColumn(); tableColumn.name(labels[index]); tableColumn.dataField(name); tableColumns.push(tableColumn); }); table.bindColumns(tableColumns); table.bindingPath(test${i}); table.style(GC.Spread.Sheets.Tables.TableThemes.none); table.filterButtonVisible(false); let source = new GC.Spread.Sheets.Bindings.CellBindingSource(this.dataSource); newSheet.setDataSource(source); const sRange = new GC.Spread.Sheets.Range(7, 3, 1, 1); const fRange = new GC.Spread.Sheets.Range(7, 3, this.dataSource[test${i}].length, 1); newSheet.fillAuto(sRange, fRange, { fillType: GC.Spread.Sheets.Fill.FillType.auto, series: GC.Spread.Sheets.Fill.FillSeries.column, fillDirection: GC.Spread.Sheets.Fill.FillDirection.down, }); newSheet.options.showZeros = false; } },
2.公式函数填充逻辑:
const sRange = new GC.Spread.Sheets.Range(7, 3, 1, 1); const fRange = new GC.Spread.Sheets.Range(7, 3, this.dataSource[test${i}].length, 1); newSheet.fillAuto(sRange, fRange, { fillType: GC.Spread.Sheets.Fill.FillType.auto, series: GC.Spread.Sheets.Fill.FillSeries.column, fillDirection: GC.Spread.Sheets.Fill.FillDirection.down, });
最后附上完整的代码链接
https://gitee.com/GrapeCity/lims
扩展链接:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
得物Flink内核探索实践
一、前言 随着大数据技术的飞速发展,实时处理能力变得越来越重要。在众多实时处理框架中,Apache Flink以其强大的流处理能力和丰富的功能集,受到了广泛关注和应用。在实时业务日益增长的趋势下,这促使我们深入探索Flink的内核,以更好地保障Flink任务的维护。本次分享将重点介绍得物在Flink内核方面的探索与实践,探讨如何通过深度优化和定制,实现更加高效和稳定的数据处理能力。 二、读者收益 通过阅读本次分享,读者将获得以下收益: 深入理解Flink内核:了解Flink的核心架构和关键组件,掌握Flink内核的运行机制。 优化实践:学习得物在Flink优化方面的实战经验,包括如何通过参数调优和内核定制,提升系统性能。 问题解决方案:掌握处理Flink常见问题的方法和技巧,提高在实际项目中应对复杂场景的能力。 实时处理案例:通过实际案例,了解如何在复杂业务场景中应用Flink,实现高效的实时数据处理。 最佳实践:获得得物在Flink应用中的最佳实践建议,帮助在实际项目中少走弯路,提高开发效率。 无论你是刚接触Flink的初学者,还是有一定经验的开发者,相信通过本次分享,都能有所收获,...
- 下一篇
阿里云,用 AI 技术 Create@ 出属于自己的少年江湖!
随着网剧《少年白马醉春风》的热播,许多人心中的江湖梦被唤醒,渴望踏入那个充满传奇色彩的影视世界,体验一段属于自己的江湖之旅。 在 AIGC 技术日益成熟的今天,这一梦想变得触手可及。 阿里云携手优酷,发起了Create@AI江湖创作大赛,将网剧《少年白马醉春风》这一热门影视 IP 与阿里云的 AI 技术相结合,利用阿里云函数计算的强大技术支持,为AI创作的开发和部署提供源源不断的算力和专业指导。 此次赛事由阿里云联合优酷共同发起,作为“创客北京”专项赛,赛事面向全社会开放。截止2024年8月14日23:59分参赛作品已全部提交,8 月 15 日至 16 日为作品评审/路演阶段;8 月 20 日公布获奖名单。 访问链接可即刻查看创作空间:https://developer.aliyun.com/plan/create/snbm 以下是精彩作品展示😉😉😉 这场 AI 创作赛事不仅是影视 IP 与 AI 技术融合,更是 AI 技术创意与传统文化的碰撞。 少年白马,踏歌追梦!
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- 2048小游戏-低调大师作品
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果