仪器接口设计

不是所有设备都是TCP连接模式,有读文件的、读数据库的设备,为此还需要一个客户端仪器接口程序,面向接口编程是一个良好的思想,他使得调用者和接口实现者不用绑定太死,只要双方按约定实现即可。

仪器有读文件的、写文件的、读数据库的、写数据库的、定时取图的等,从PDF提取数据的、从Excel提取数据、读csv等。虽然很繁杂,但是对业务解析大家是固定的,都是要解析数据行,再把数据存入LIS。所以可以抽取接口,把繁杂的文件和数据库操作留给主程序,把业务解析操作留给接口实现类。

初步效果
在这里插入图片描述

配置对象,对接JSON的配置,通过配置控制主程序行为

package JRTMachineImpl.Base;/*** 用来配置仪器接口的行为,去和配置串匹配,通过配置控制行为*/
public class ConfDto {/*** 构造,避免为null*/public ConfDto(){MachID="";Type="";Address="";UpTime=30000;DealProcess="";Para="";UpPara="";PreDealClass="";UPPreDealClass="";BakPath="";PathRegex="";ReadFileModel="";IsDBLooseKey="";ReadFileLeavelModel="";OtherPara="";CopyFile="";ExcelSheetIndex="";RowSplitChar="";WaringDealNum="";DBChangeUpLoadWaringNum="";NotSaveLog="";DemoImageClass="";StableTime="8000";SleepTime="2000";Encoding="";WriteEncoding="";ImgPixelFormat="";ImgZipWidthHeight="";ImgCutRate="";ImgAddSuffix="";ExcludeFile="";MachName="";AutoClipboardImg="";PDFImageModel="";PDFCutPageRectImage="";}/*** 仪器主键*/public String MachID;/*** 监听类型*/public String Type;/*** 监听地址*/public String Address;/*** 上传定时间隔*/public int UpTime;/*** 处理程序类*/public String DealProcess;/*** 参数*/public String Para;/*** 上传前处理参数*/public String UpPara;/*** 前处理类:"类全名,动态库名"*/public String PreDealClass;/*** 上传前处理类:"类全名,动态库名"*/public String UPPreDealClass;/*** 备份路径*/public String BakPath;/*** 读取文件一级目录正则表达式,没有读取全部文件夹,有内容按正则表达式读取符合的文件夹对日期表示的约定$y1 $y2 $y3 $y4表示年的1234位,$M1 $M2表示月的12位,$d1 $d2表示日的12位。例如:$y1$y2$y3$y4$M1$M2$d1$d2.**/public String PathRegex;/*** 读取文件模式0:读完删除,1:读取变化的,读完不删,2:监听到变化后不整个读取,从上次最后行读取,行数小于最后行从头读取*/public String ReadFileModel;/*** 数据库监听比对模式是否是宽松型主键,1的话存一个主键多条记录日志,数据串和全部日志不同才上传检验,否则不上传*/public String IsDBLooseKey;/*** 读取文件层级模式0:读取子级,1:仅读取一级目录*/public String ReadFileLeavelModel;/*** 其他参数,供前处理使用*/public String OtherPara;/*** 拷贝文件参数*/public String CopyFile;/*** 读取Excel的页索引*/public String ExcelSheetIndex;/*** 读数据库一行数据多列之间的分隔符,不配置为~*/public String RowSplitChar;/*** 调用保存数据警告次数,一天内一次运行调用次数到达数量后将弹窗警告*/public String WaringDealNum;/*** 数据库变化模式,数据变化触发警告的次数,防止主键不唯一重复传输*/public String DBChangeUpLoadWaringNum;/*** 监听是否放弃保存数据文件日志1:是,否则默认保存到C盘10天,或者按配置的BakPath路径备份,完成新老并行。默认读取和上传日志在C:\LISMachineLogMian、上传日志在UP文件夹*/public String NotSaveLog;/*** 默认选图和截图上传图片的类别*/public String DemoImageClass;/*** 最后修改时间和当前时间的秒数,用来确定文件是否处于稳定状态,单位秒。为正数用当前电脑时间和文							件最后修改时间差比较。为负数的话第一次文件都不读,用两次文件的时间差比较*/public String StableTime;/*** 每一轮循环后休眠的时间,单位毫秒*/public String SleepTime;/*** 读取文本的编码格式:空默认系统编码,可为:ASCII、Default、Unicode、UTF32、UTF7、UTF8*/public String Encoding;/*** 写文本的编码格式:空默认系统编码,可为:ASCII、Default、Unicode、UTF32、UTF7、UTF8*/public String WriteEncoding;/*** 上传图片的图像深度,默认原图上传,自己画的为32深度。可以指定24就采用24深度在上传图片前转换*/public String ImgPixelFormat;/*** 上传图片的图像要压缩的宽高,格式230*200*/public String ImgZipWidthHeight;/*** 上传图片的图像要截取的宽高,格式1*0.7*/public String ImgCutRate;/*** 上传图片添加的后缀带点*/public String ImgAddSuffix;/*** 排除文件*/public String ExcludeFile;/*** 仪器名字*/public String MachName;/*** 自动监听粘贴板图片*/public String AutoClipboardImg;/*** 空得到所有图。0:只取小图,1:只取大图*/public String PDFImageModel;/*** PDF解析处理的一页图片是否切割矩形小图 1:切割,0:不切割*/public String PDFCutPageRectImage;
}

前处理接口(重要)

package JRTMachineImpl.Base;import JRTMachineImpl.Base.ConfDto;import java.util.Map;/*** 往检验上传数据之前调用的处理接口,任何要给LIS上传数据的处理类实现该接口,主程序会把数据一行行抛给接口方法处理,* 接口不需要关心主程序的实现,主程序不用关心具体的业务处理*/
public interface IPreDeal {/*** 前处理** @param conf     监听配置* @param result   结果串* @param index    当前文件的第几行* @param fileName 当前读取的文件全名* @return 是否继续后处理,true是,false否*/boolean PreDeal(ConfDto conf, String result, int index, String fileName);/*** 数据库前处理** @param conf  监听配置* @param row   结果Map* @param index 当前文件的第几行* @return 是否继续后处理,true是,false否*/boolean PreDealDataBase(ConfDto conf, Map row, int index);
}

上传前处理接口(重要)

package JRTMachineImpl.Base;import JRTMachineImpl.Base.ConfDto;
import JRTMachineImpl.Base.CmdDto;import java.util.Map;/*** 往检验上传数据之前调用的处理接口,根据虚拟M返回的命令执行。任何要给仪器上传的仪器接口实现该接口,主程序会按时间配置定时执行虚拟M查询数据逻辑后调用该接口。*/
public interface IUpPreDeal {/*** 上传前处理** @param conf 监听配置* @param key  操作键,不为空成功就调用处理类的SetFlag方法设置状态* @param cmd  要执行的命令* @return 是否继续后处理,true是,false否*/boolean UPPreDeal(ConfDto conf, String key, CmdDto cmd);
}

定时执行接口

package JRTMachineImpl.Base;import JRTMachineImpl.Base.ConfDto;/*** 定时执行的接口,定时取图等实现。任何要实现定制执行逻辑的对象实现此接口,主程序会按配置时间定时调用该接口,来达到定时执行固定逻辑。*/
public interface ITimer {/*** 执行任务* @param conf*/void Action(ConfDto conf);
}

基础类

package JRTMachineImpl.Base;import JRTMachineImpl.WebService.OutValue;
import JRTMachineImpl.Util.LogUtils;
import JRTMachineImpl.Base.CmdDto;import java.util.List;/*** 实现基础逻辑,保存数据,存图片路径,上传文件,执行命令等*/
public class BaseDeal {/*** 保存数据** @param conf      配置* @param data      数据* @param epis      流水* @param index     序号* @param fileName  文件全名* @param DBColName 数据库列名* @return* @throws Exception*/public String SaveData(JRTMachineImpl.Base.ConfDto conf, String data, String epis, int index, String fileName, String DBColName) throws Exception {//得到配置的处理程序处理数据try {LogUtils.WriteSecurityLog("开始调用保存:" + conf.DealProcess + ".SaveData" + " 参数:P0:" + conf.MachID + " P1:" + data + " P2:");LogUtils.WriteDebugLog("开始调用:" + conf.DealProcess + ".SaveData" + " 参数:P0:" + conf.MachID + " P1:" + data + " P2:" + epis);//索引int rowCount;//类名String className = conf.DealProcess;//方法名String funcName = "SaveData";//创建参数对象JRTMachineImpl.WebService.Parameters param = new JRTMachineImpl.WebService.Parameters();//仪器主键param.P0 = conf.MachID;//结果param.P1 = data;//流水号param.P2 = epis;//文件名param.P3 = fileName;//文件名param.P4 = DBColName;//读文件序号param.P5 = String.valueOf(index);//写日志LogUtils.WriteDebugLog("保存:" + conf.MachID + ",数据:" + data + ",流水号:" + epis);OutValue session = new OutValue();OutValue out = new OutValue();//序列号保存配置数据String objStr = JRTMachineImpl.WebService.WebGetData.GetData("", className, funcName, param, session, out);LogUtils.WriteDebugLog("调用结束");LogUtils.WriteDebugLog("保存返回:" + objStr);LogUtils.WriteSecurityLog("保存返回:" + objStr);//返回就认为返回的命令列表if (objStr != "") {LogUtils.WriteDebugLog("处理返回消息");List<CmdDto> cmdList = JRTMachineImpl.Util.JsonDealUtil.Json2List(objStr, CmdDto.class);ExecCommand(cmdList, conf);LogUtils.WriteDebugLog("处理返回消息结束");}//设置调用次数//SetDealNum();} catch (Exception ex) {LogUtils.WriteExceptionLog("获得数据处理程序失败", ex);throw ex;}return "";}/*** 执行命令** @param cmdList 要执行的命令列表* @param conf 配置*/public void ExecCommand(List<CmdDto> cmdList, JRTMachineImpl.Base.ConfDto conf) {//把取图,写文件,执行SQL等约定成命令来简化程序逻辑}
}

主程序模型
在这里插入图片描述

这样监听的基础就打下了

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

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

相关文章

Maven配置笔记

1、下载Maven 在Maven的官网即可下载&#xff0c;点击访问Apache Maven。 2、配置环境变量 chcp 65001 echo off set mvnhomeE:\apache-maven-3.8.4 rem LPY echo. echo ************************************************************ echo * …

线程池,定时器以及阻塞队列(生产者/消费者模型)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录专栏&#xff1a;线程池,定时器以及阻塞队列(生产者/消费者模型) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 实现线程池,定时器以及阻塞队列,生产者/消费者模型 线程池线程池…

Redis核心技术与实战【学习笔记】 - 11.响应延迟的波动问题及解决方案

在 Redis 的实际应用中&#xff0c;有一个非常严重的问题&#xff0c;就是 Redis 突然变慢了。举个例子&#xff0c;在秒杀场景下&#xff0c;一旦 Redis 变慢了&#xff0c;大量的用户下单请求就会被拖慢&#xff0c;也就是说&#xff0c;用户提交了下单申请&#xff0c;确没有…

【JavaEE进阶】 图书管理系统开发日记——肆

文章目录 &#x1f343;前言&#x1f38d;约定前后端交互接⼝&#x1f340;服务器代码实现&#x1f6a9;控制层&#x1f6a9;业务层&#x1f6a9;数据层 &#x1f334;前端代码的修改⭕总结 &#x1f343;前言 今天我们来实现修改图书模块 首先我们先来看一下&#xff0c;需要…

【React】redux状态管理、react-redux状态管理高级封装模块化

【React】react组件传参、redux状态管理 一、redux全局状态管理1、redux概述2、redux的组成1.1 State-状态1.2 Action-事件1.3 Reducer1.4 Store 3、redux入门案例1.1 前期准备1.2 构建store1.2.1 在src下新建store文件夹1.2.2 在store文件夹下新建index.ts文件1.2.3 在index.t…

[AIGC] 21世纪Java与Go的相爱相杀

在21世纪的软件开发领域中&#xff0c;Java和Go这两门编程语言可谓是相爱相杀的存在。它们各自拥有着强大的特点和独特的优势&#xff0c;同时也存在着一些明显的竞争和冲突。让我们来看看这两门语言的故事&#xff0c;以及它们之间的深远意义。 文章目录 Java的魅力Go的魅力相…

C++写算法题时常见问题(稳定更新)

目录 1.如何用 getline 函数读取用户输入的一行 2.如何防止用 scanf 读取字符时读取了 换行和空格 3.map和unordered_map的差别和使用 4.“表达式求值”问题解析 5.运行报RE错误 6.在set或者map里面使用结构体 7.运行时报TLE时&#xff0c;时间复杂度问题 8.double类型的…

Photoshop CS6 下载安装教程,保姆级教程,小白也能轻松搞的,附安装包

前言 Adobe Photoshop CS6强大的照片拍摄和突破性的新功能&#xff0c;用于复杂的图形、选择、逼真的绘画和装饰智能。创建惊人的高动态范围(HDR)图像。用逼真的笔触和混合的颜色绘画。消除噪音&#xff0c;添加种子&#xff0c;并绘制一个国家最先进的摄影设备的草图。凭借原…

神经网络不需要懂原理,只需要应用???(附268篇顶会论文)

神经网络不需要弄明白原理&#xff0c;只要会应用就行&#xff0c;这是真的吗&#xff1f; 具体情况具体分析。如果你是论文要求不高&#xff0c;那么就不需要搞太清楚&#xff0c;如果你的毕业要求高&#xff0c;或者想要更高的提升&#xff0c;尤其是想申博、进大厂&#xf…

【C语言】socket编程接收问题

一、recv()函数接收到的返回值为0表示对端已经关闭 在TCP套接字编程中&#xff0c;通过recv()函数接收到的返回值为0通常表示对端已经关闭了套接字的发送部分。这是因为TCP是一个基于连接的协议&#xff0c;其中有定义明确的连接建立和终止流程&#xff1b;当对端调用close()或…

数据分析:当当网书籍数据可视化分析

当当网书籍数据可视化分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&…

基于场景文字知识挖掘的细粒度图像识别算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;基于场景文字知识挖掘的细粒度图像识别算法1、研究背景2、方法提出方法模块 3、试验4、文章贡献 二、RNN代码学习2.1、什么是RNN2…

Mysql学习记录补充

索引 在无索引情况下&#xff0c;就需要从第一行开始扫描&#xff0c;一直扫描到最后一行&#xff0c;我们称之为 全表扫描&#xff0c;性能很低。 如果我们针对于这张表建立了索引&#xff0c;假设索引结构就是二叉树&#xff0c;那么也就意味着&#xff0c;会对age这个字段…

Linux|Grep 命令的 12 个实用示例

您是否曾经遇到过在文件中查找特定字符串或模式的任务&#xff0c;但不知道从哪里开始查找&#xff1f;那么&#xff0c;grep 命令可以拯救你&#xff01; grep 是一个功能强大的文件模式搜索器&#xff0c;每个 Linux 发行版都配备了它。如果出于某种原因&#xff0c;它没有安…

【C++入门学习指南】:函数重载提升代码清晰度与灵活性

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、函数重载1.1 函数重载的概念1.2 函数重载的作用1.3 C支持函数重载的原理1.4 扩展 &…

C++ STL库详解:容器适配器stack和queue的结构及功能

一、stack 1.1stack的介绍 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xf…

图数据库(neo4j)在工业控制中的应用

图模型 事物的模型中&#xff0c;除了它自身的某些特征之外&#xff0c;还包括它与其它事物的关系特征&#xff0c;例如一个学生的属性包括姓名&#xff0c;性别&#xff0c;年龄等属性&#xff0c;同时&#xff0c;他还有许多关系属性&#xff0c;比如他属于哪一个院系&#x…

修改照片尺寸好用的工具,分享4款!

在数字时代&#xff0c;照片已成为我们生活的一部分&#xff0c;而如何调整照片尺寸以满足不同的需求&#xff0c;则显得至关重要。今天&#xff0c;我们就来探讨那些可以修改照片尺寸的工具&#xff0c;让你轻松应对各种尺寸需求。 茄子水印相机 这是一款功能强大、操作简单的…

MacBook有必要装清理软件吗?CleanMyMac X v4.14.6 直装特别版 附安装教程

MacBook是苹果公司的一款高端笔记本电脑&#xff0c;但是&#xff0c;随着使用时间的增长&#xff0c;MacBook也会出现一些问题&#xff0c;比如运行缓慢、卡顿、垃圾文件堆积、磁盘空间不足等。这些问题不仅影响了用户的使用体验&#xff0c;也可能对MacBook的寿命和安全性造成…