矿产品取制样信息管理系统的设计
唐 晨,赵 伟,吴 璟
(南京海关工业品检测中心,江苏 南京 210001)
摘 要:
本研究使用Python Flask设计了一款Web版取制样信息管理系统,实现了跨部门信息共享。经试运行测试,该系统各项功能正常,操作便捷;各环节信息采集、保存和展示准确;各用户权限、职责明确清晰;水分检测原始数据详细。该系统为LIMS抽采样业务管控、检测记录无纸化提供了解决方案。
关键词:
矿产品;信息管理系统;Python;Flask中图分类号:TG161 文献标识码:A 文章编号:
1002-5065(2023)02-0154-5Design of Information Management System for Sampling and Preparation of Mineral Products
TANG Chen, ZHAO Wei, WU Jing
(Nanjing Customs Industrial Products Testing Center, Jiangsu Nanjing 210001)
Abstract: In this study, a Web information management system for sampling and preparation was designed using Python
Flask, which realized information sharing across departments. Based on the test results, all functions in this system run normally and can be easily operated; all information in different parts can be accurately collected, stored and displayed; users have different permissions, and their duties are clear; the original data in moisture detection can be detailed recorded. This system provides a solution
for LIMS sampling service and paperless inspection record.Keywords: minerals; information management system; Python; Flask
收稿日期:
2022-12基金项目:
南京海关科研项目(2022KJ08)。作者简介:唐晨(1988—),男,汉族,江苏扬中人,硕士,工程师,主要从事进出口商品检验工作。
取样化验、检验时商品归类的技术手段之一,也为货物固废鉴定、准入性风险筛查、货物品级评定、定价参数核定等工作提供关键技术支撑,而高价值矿产品因价格结算需要,对取样、制样、水分检测有着更高的要求。为保证水分的准确性,取样方案的制定和实施、样品的保存、制备、水分检测等,都需要依据规范严格执行和记录。
目前实验室广泛使用的LIMS 实验室管理系统已实现实验室内部人、机、料、法、环的统一管理[1],但是大部分LIMS 系统仍有一些局限性,其一,只针对来样检测,不涉及抽样、取样业务管控需求[2];其二,只能记录存储检测项目最终结果,无法记录过程数据,仍然需要纸质原始记录辅助数据管理[3],因
此需要在抽取样环节和检测环节增加必要的信息化支撑系统,解决纸质记录誊写麻烦、容易记错记漏关键信息等问题,切实提升检验业务质量管理水平[4]。
本中心在进口矿产品卸货港口设立24h 工作点协助口岸海关第一时间取样以及开展水分检测工作,确保矿产品水分测定的准确性。由于该工作点远离中心实验室,工作信息、纸质记录、试验样品的传递存在一定的不便,取制样工作要求或指令的传达依靠若干工作,信息相对零散,缺乏统一有效的管理,工作点员工需要根据分派的工作,在内查相关的零散信息,以便完成工作记录的填写。
基于上述考虑,结合本中心取制样工作特点,拟开发取
制样信息管理系统,实现信息统一管理以及工作记录无纸化传递等功能,方便工作点与中心业务部门的信息传递、交流、共享。
1 总体构建要求
系统开发以取制样业务流程为基础,主要功能应包括:用户登录登出、用户维护、业务信息管理维护、基础选项信息管理维护等方面。
系统应设有至少一名管理员统一管理维护用户角、基础选项信息。
系统业务信息管理维护应基于纸质记录表所需内容,并依据流程阶段分配给对应的用户角完成,角应只能操控与自身业务相关的信息。
系统运行过程中所产生的信息应统一存储在数据库中。系统应能部署在互联网服务器上,通过网络轻松访问。
2 开发过程
2.1 编程语言选择
根据总体构建要求,首先考虑开发语言的选择。取制样信息管理系统总的来讲是对LIMS 系统的补充,可由多种语言开发,如Java、C++、Python 等,我们选择了Python 语言进行开发。
Python 是一种代表简单主义思想的语言,极其容易上手,适合于初学者编程。Python 免费、开源,可被移植在多种平台上,如Linux、Windows、Symbian 和基于Linux 的Android 平台。Python 既支持面向过程的编程也支持面向对象的编程。Python 具有庞大的标准库和拓展库,可以帮助处理各种工作。Python 提供所有主要的商业数据库的
接口。Python在云计算、Web开发、科学计算和人工智能、系统操作和维护、图形GUI等领域有着广泛应用。知名网站Google、YouTube、知乎、豆瓣等都在广泛使用Python开发处理任务,因此选择Python
语言开发Web版取制样信息管理系统[5]。
在开发Web应用前,另一个需要考虑的是使用何种Web框架。目前Python三大主流Web框架有Django、Tornado和Flask,其中Django是企业级开发框架,大而全,自带的功能特别多,Tornado是高并发处理框架,Flask是一个用python语言基于Werkzeug工具箱编写的轻量级框架,应用领域集中在微小项目上,比较适合取制样信息管理系统的开发[6-9]。
Flask本身相当于一个内核,其功能的实现大多需要以下扩展包:
(1)Flask-SQLAlchemy——操作数据库,可将Python对象模型(Model)映射到数据库中,实现Python 高效访问数据库;
(2)Flask-Migrate——管理迁移数据库;
(3)Flask-Bootstrap——集成前端Twitter Bootstrap框架,方便编辑网页渲染的HTML模板文件;
(4)Flask-Script——插入脚本。
图1 Flask工作流程
在Flask应用中处理一个请求的流程见图1所示,
参照图2中的Flask小应用示例代码,当程序运行时,用户在客户端发送http请求,即在浏览器地址栏输入“127.0.0.1:5000/index”后,Web服务器把请求交给Flask 程序,程序用Werkzeug来做路由分发,每个请求应对一个URL,URL决定映射到Python代码对应的视图函数来处理,如“/index”触发“index()”函数,执行函数处理逻辑代码取得“HelloWorld”,然后以text参数名传入index. html模板中,再由Jinja2负责渲染得到HTTP响应内容在浏览器中呈现。
2.2 信息数据的存储
取制样信息管理系统有三大类信息需要存储在数据库中,即业务推进过程中将产生记录信息、系统操作用户信息以及记录信息填报时一些固定的选项信息。系统开发的重点是围绕着这些信息数据处理的,实现数据存储、查询、修改、删除、页面渲染等。
首先需要确定数据存储的数据库。Python支持的商业性数据库种类非常多,有关系型MySQL、Oracle数据库,非关系型MongoDB数据库等,这些数据库都需要额外安装数据库服务系统和客户端库,比较麻烦。Python中自带一种更简单的SQLite数据库作为支持库直接供应用程序调用,因此开发测试环境中直接配置使用SQLite数据库,后期部署至服务器时,只需将配置文件修改为MySQL相关配置即可使用服务器上已安装的MySQL服务系统和客户端库。
为方便程序代码与数据库之间的关联操作,使用面向对象的编程方法,创建了Cargo、User、OptionSet
三个数据对象模型,使用Flask-SQLAlchemy将数据对象与数据库映射,使对象对应数据库中的table,对象属性对应table中的column。
三个数据对象模型的属性示例,见表1,Cargo对象模型定义了71个属性,大部分属性对应矿产品基础信息和记录信息,少量属性用作节点流程控制;User对象模型定义了17个属性,包括1个id属性主键、5个用户信息属性、11个角标记属性;OptionSet对象模型定义了3个属性,包括1个id属性主键、1个类别标签属性、1个信息内容属性。程序部署后,首先使用管理员账号登录系统,在“信息维护”
图2 Flask应用代码示例
模块中添加页面表单中需要用到的12条信息,提交数据库存储,以便在记录填报页面中能够调用。
表1 数据对象模型属性示例
Cargo属性User属性OptionSet属性id id id
name name label
bill password content
works admin
job_id applicant
sampling_std acceptor
preparation_std sampling_man
size_needed testing_man
moisture_dataset signatory
checked checker
signed buyer
2.3 用户操作模块的划分
系统开发是基于取制样业务流程考虑的,针对本中心业务流程特点,将其分割为以下几个阶段:
(1)申报阶段——申报人填报相关要求信息,包括货物基本信息和检验工作项目信息,提交至受理人;
(2)受理阶段——受理人受理申报、给定唯一的业务编号,根据工作项目信息流转至后续操作人员;
(3)取样阶段——若工作项目包含取样,取样人员根据已受理的业务,开展取样工作,完成后,将原始样品转交制样人,并填写取样记录;
(4)粒度检测阶段——若工作项目包含粒度检测,检验员优先使用原样测定,并填写记录;
(5)制样阶段——制样人员获得原样后开展样品缩分,若工作项目包含水分检测,按要求提取水分检测试样交检验员测试水分,提取一般分析试样放入烘箱干燥处理(一般分析试样需求量不大时,通常不在额外提取,使用水分测试后的干燥试样),提取原始留样封装标识后保存,一般分析试样干燥后,研磨并过筛,获得规定粒度的分析试样,分装密封,按照试样需求数量分别转交实验室和申请人,填写制样记录;
(6)水分检测阶段——若工作项目包含水分检测,检验员获得水分检测试样后开展水分检测,填写水分记录,将干燥的试样转交制样人员;
(7)分析试样签收阶段——分析试样接收人获得样品后填写接收记录;
(8)记录审核阶段——审核人对上述提交的各个记录进行审核;
(9)业务记录查看阶段——用户可以查看与自身相关的业务条目信息。
Flask中提供蓝图Blueprint功能,可以将不同阶段、权限的操作放到指定的蓝图里,对程序代码进行模块化管理。根据业务流程划分了11个模块,对应的用户角和蓝图见表2,此外每个用户可设定多个角,实现多个模块操作,用户角模块的显示和隐藏在基础模板base.html统一
配置,并在每次发起HTTP请求时校验用户权限。
表2 模块、用户角、蓝图对应表
模块用户角对应蓝图对应信息内容
业务申报申报人apply_bp矿产品基础信息
业务受理受理人accept_bp业务编号
取样取样人sampling_bp取样记录信息
制样制样人preparation_bp制样记录信息
粒度检测检验员size_bp粒度检测记录信息
水分检测检验员moisture_bp水分检测记录信息
试样签收试样签收人sign_bp签收记录信息
记录审核审核人check_bp审核记录信息
业务记录全部user_bp
与用户有关的业务
信息用户管理管理员admin_bp用户信息
信息维护管理员optionset_bp
记录填报中的固定
选项信息
2.4 页面模板的设计
系统页面模板主要使用HTML语言编辑,页面依据各蓝图的视图函数返回内容渲染指定HTML模板文件,向用户浏览器展示相关信息。各模块页面模板根据数据操作需求配置,统一存储在系统templates文件夹中,模板通常有以下几种:
(1)展示该环节未完成所有业务条目页面;
(2)展示该环节已完成所有业务条目页面,能与未完成页面相互切换显示;
(3)针对具体业务条目的详情页面;
(4)针对具体业务条目信息修改、
更新的页面。
图3 路由、函数与模板之间的调用关系图
以申报模块为例,创建了apply.view.py文件编辑与申报信息处理的相关函数,并在templates文件夹中创建了apply文件夹存放申报相关的HTML模板,路由、函数与模板之间的调用关系见图3。使用申报人账号登录系统,在顶部菜单栏点击【业务申报】链接,路由解析执行doing()函数,获得数据库中所有已创建未提交的业务,渲染apply/ doing.html模板页面,在表格中展现业务信息条目,见图4。【查看未申报列表】和【查看已申报列表】分别对应doing()
和done()函数操作,【新增】对应add()函数get 请求,每条业务信息操作列都有【详情】【修改】【删除】【复制】【提交申请】五个按钮,分别对应detail()、update()、delete()、copy()、submit()函数操作。其他的业务模块中的页面组成及功能与申报相似,只是增加了与本环节相关的一些信息。2.5 用户数据筛选
由于不同货物检验工作项目会有差异,在不同的模块中需要显示与之匹配的业务条目,因此在Cargo 对象属性中设置了sampling_needed、size_needed、moisture_needed 等控制属性,通过申请时提交的工作项目内容,对这三个属性赋值“True”或“False”。若需筛选出所有需取样业务条目,应在筛选条件中加上“Cargo.sampling_needed==True”。
为方便操作人员查看业务完成情况,在申报、受理、取样、制样、检测、签收、记录审核模块中均设计了两个独立的页面,分别展示已完成的业务条目和未完成的业务条目,通过页面上导航链接标签点击自
由切换。使用Cargo 对象属性中applied、accepted、sampled、prepared、size_completed、moisture_completed、checked、signed 进行筛选,如查询未提交的申报业务时应增加“Cargo.applied==False”筛选条件。
在后续流程筛选数据时,还应考虑前一流程是否完成,如查询未受理业务条目时,应考虑申请是否已提
交,未提交的业务条目,不应出现在受理阶段,因此需要同时满足“Cargo.applied==accepted”和“Cargo.applied==True”两个条件。此外,在申报、试样签收阶段,还应该考虑筛除掉其他用户申报的以及未申请委托制样的条目。各流程阶段数据筛选条件见表3。2.6
多组检测数据存储及展示
图5 水分检测数据记录页面
在水分检测时,需要将检测的原始数据全部记录存入数据库,然而,不同货物类别,数据的规模大不一样,
例如煤
图4 申报模板页面
表3 各流程阶段数据筛选条件
流程阶段筛选条件
未完成
已完成
申报Cargo.applicant == user.name, Cargo.applied == False Cargo.applicant == user.name, Cargo.applied == True
受理Cargo.applied == True, Cargo.accepted == False
Cargo.accepted == True 取样Cargo.sampling_needed == True, Cargo.accepted == True,
Cargo.sample_complete== False
Cargo.sample_complete== True
制样Cargo.accepted == True, Cargo.prepared == False
Cargo.prepared == True
粒度检测Cargo.size_needed == True, Cargo.accepted == True, Cargo.
size_completed == False
Cargo.size_completed == True
水分检测isture_needed == True, Cargo.accepted == True,
试样签收Cargo.applicant == user.name, ains ("委托制样"), Cargo.prepared == True, Cargo.signed == False Cargo.applicant == user.name, ains("委托制样"), Cargo.signed == True
记录审核
Cargo.accepted == True, Cargo.checked == False
Cargo.checked == True
[1] 黄超,隋艳.煤炭检测实验室信息管理系统的设计与应用[J].煤质技
术,2020,35(02):34-39.
[2] 孟雳,陈昕,文遥,唐海洋.浅谈移动抽样系统在检验检测机构日常抽
样工作中的运用[J].中国纤检,2022(05):51-53.
[3] 东方.LIMS 原始记录信息化的设计与实现[J].电子元器件与信息技
术,2022,6(04):100-103.
[4] 陈希.实验室信息管理系统在食品抽检业务管控中的运用探索[J].质量
安全与检验检测,2022,32(01):49-52.
[5] 杜继明.Python 语言的Web 开发应用分析[J].数字通信世
界,2022(01):76-78.
[6] 叶锋.Python 最新Web 编程框架Flask 研究[J].电脑编程技巧与维
护,2015(15):27-28.
[7] 史宝坤,李欣,王淑娴,樊笑含,张真真.基于Flask 的Python Web
开发[J].数码世界,2020(03):43-44.
[8] 王方雄,刘欣钰,王俊夫,梁超凡.基于Flask 的AIS 大数据地理信息
系统研究与开发[J].软件,2022,43(08):73-76.
[9] 冷四军.基于Python Flask 的运维信息管理系统设计与实现[J].电脑管理系统登录页面模板
编程技巧与维护,2021(05):87-88.
炭和铁矿都是以整批为一个取样单元,取一份样品,提取2个水分试样进行检测,得到2组数据,而铜精矿都已500吨为一个取样批,一万吨一批的铜精矿,需要取20份样品,每份提取2个水分试样进行检测,得到40组数据。
首先解决记录数据组的问题,在moisture/update.html 模板页面试验数据明细表下方添加两个按钮控件,见图5,编辑其点击事件的js 脚本代码,实现试验数据明细表中的行数动态增减,满足多组数据记录。
然后解决数据存储问题。由于数据库不支持存储数组格式,因此考虑将数据组进行适当处理,形成规范格式的文本数据集,赋值给Cargo 对象moisture_dataset 属性,并映射到数据库存储。在试验数据明细表中的输入框控件中都添加同一个onchange 事件js 脚本代码,输入框中的数据发生修改,自动执行js 脚本,获取该行六个输入框中的数据,计算水分结果,并使用“,”将数据相隔串联再以“;”结尾,暂存在该
行<span class="itemtext"hidden></span>标签元素中,随后获取class 为itemtext 的所有元素的text 值,生成“1A,500,400.6,1888.9,1770.4,1770.4,7.9621;1B,500,408.2,1829.3,1716.0,1716.0,7.9727;......”形式的文本存储到数据库中。
最后解决结构化的文本数据的展示。根据URL 中携带的id 参数在数据库中检索到Cargo 对象,将该对象作为返回值渲染目标页面,页面加载时执行js 代码,拆分对象moisture_dataset 属性中的内容,先使用split(";")分割文本,生成一个列表,再对列表中每一个值使用split(",")进行分割,等到原始的记录信息创建试验数据明细表,示意图见图6。
图7 粒度检测数据记录页面
粒度检测的多个试验条件下的检测数据,也使用相似的方法实现存储,记录页面见图7。
3 总结
经试运行测试,取制样信息管理系统满足构建要求,系统各项功能正常,各环节信息数据读取、保存准确;各用户对应的权限模块准确,职责明确清晰;多份样水分检测和多条件粒度检测原始数据详细,实现了加权平均水分和粒度结果的自动计算和汇总,减轻了数据汇算工作量,保障了计算准确率。
该系统实现了申报人、业务部门、检验部门之间的信息统一管理及共享,为取制样环节提供了信息化支撑,实现了信息记录无纸化,解决了信息数据查、归档、统计等难题,完备的检测原始数据,进一步保障了检验结果的质量溯源。
该系统也存在不完美之处,在水分检测记录填报阶段,需要记录的称量数据较多,检验员容易将称量数据录错,因此需要花费较多时间检查、核对数据的准确性,以免造成检验结果错误。针对这一问题,后期将研究如何自动获取天平称量数据填入记录,
避免手工录入错误。
图6 文本拆分
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论