仪器接口设计

news2024/12/23 20:55:23

不是所有设备都是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.coloradmin.cn/o/1434801.html

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

相关文章

Unity_修改天空球

Unity_修改天空球 Unity循序渐进的深入会发现可以改变的其实很多&#xff0c;剖开代码逻辑&#xff0c;可视化的表现对于吸引客户的眼球是很重要的。尤其对于知之甚少的客户&#xff0c;代码一般很难说服客户&#xff0c;然表现确很容易。 非代码色彩通才&#xff0c;持续学习…

详解spring6.0新特性汇总

spring6新特性汇总 part1 spring6.0新特性 spring6.0 2022年11月。新一代框架带jdk17&jakarta ee9 https://www.graalvm.org/ part2 AOP&事务 1.AOP:面向切面编程 通过预编译方式和运行期动态 代理实现程序功能的统一维护的一种技术。 使用场景&#xff1a; 权…

【如何学习CAN总线测试】——Vector VH6501干扰仪测试BusOff

系列文章目录 【如何学习CAN总线测试】系列文章目录汇总 文章目录 系列文章目录前言一、环境搭建1.硬件环境2.软件环境3.原理 二、测试方法1.打开Disturbance(CAN)工程2.使能 VH65013.MainConfigPanel面板4.TriggerConfiguration配置5.Sequence Configuration配置6.干扰结果 前…

论文阅读-通过云特征增强的深度学习预测云工作负载转折点

论文名称&#xff1a;Cloud Workload Turning Points Prediction via Cloud Feature-Enhanced Deep Learning 摘要 云工作负载转折点要么是代表工作负载压力的局部峰值点&#xff0c;要么是代表资源浪费的局部谷值点。预测这些关键点对于向系统管理者发出警告、采取预防措施以…

c语言动态数组的实现

动态数组是在程序运行时动态分配内存空间的数组&#xff0c;可以根据需要随时改变大小。在C语言中&#xff0c;动态数组通常通过指针和malloc函数来实现。 使用malloc函数动态分配内存空间&#xff1a; int *arr; int size 10; arr (int*)malloc(size * sizeof(int));使用r…

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题一解析(选择题)

CSP-J入门组初赛模拟题一&#xff08;选择题&#xff09; 1、以下与电子邮件无关的网络协议是 A、SMTP B、POP3 C、MIME D、FTP 答案&#xff1a;D 考点分析&#xff1a;主要考查小朋友们网络相关知识的储备&#xff0c;FTP是文件传输协议和电子邮件无关&#xff0c;所以…

高校建设AI算力平台方案探索

近年来&#xff0c;人工智能行业发展迅速&#xff0c;在自动驾驶、金融、医疗、教育等行业广泛应用。尤其是ChatGPT发布以后更是掀起了生成式AI的热潮&#xff0c;国内各大互联网厂商也相继发布自己的AI大模型。这也造成了大量的AI人才缺口&#xff0c;同时促进了高校的AI专业建…

VitePress-09-文档中引入静态资源-图片-相对路径的方式

补充-markdown文档中引入图片的格式 格式如下 &#xff1a;![图片异常时展示的文案](图片资源的路径) 图片资源的路径 &#xff1a; 可以是【绝对路径】&#xff0c;也可以是【相对路径】&#xff0c;关键是可以正确的找到该资源。 引入静态资源的说明 需要注意的是&#xff0c…

第01课:自动驾驶概述

文章目录 1、无人驾驶行业概述什么是无人驾驶智慧出行大趋势无人驾驶能解决什么问题行业趋势无人驾驶的发展历程探索阶段&#xff08;2004年以前&#xff09;发展阶段&#xff08;2004年-2016年&#xff09;成熟阶段&#xff08;2016年以后&#xff09; 2、无人驾驶技术路径无人…

【码农新闻】 用HTTPS,还能被查出浏览记录吗 常用且好用的在线工具......

目录 【码农新闻】 用HTTPS&#xff0c;还能被查出浏览记录吗 常用且好用的在线工具...... 用HTTPS&#xff0c;还能被查出浏览记录吗常用且好用的在线工具尤雨溪 文章所属专区 码农新闻 欢迎各位编程大佬&#xff0c;技术达人&#xff0c;以及对编程充满热情的朋友们&#xf…

代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出…

c#cad 创建-文本(一)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 该代码是一个用于在AutoCAD中创建文本的命令。 首先&#xff0c;通过添加using语句引用了需要使用的Autodesk.AutoCAD命名空间。 然后&#xff0c;在命名空间CreateTextInCad下定义了一个名为CreateTextCommand的类&…

01背包问题 动态规划

01背包问题 动态规划 01背包问题 动态规划写了点代码 C#实现程序运行结果代码和程序已经上传 01背包问题 动态规划 很有意思的问题。 写了点代码 C#实现 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Ta…

java之spring事务管理

spring事务管理 1. 事务概念 事务是一组操作的集合&#xff0c;是一个不可 分割的工作单位&#xff0c; 这些操作&#xff0c;要么同时成功&#xff0c;要么同时失败 和mysql数据库的事务管理道理一样。开启事务 start 提交事务 commit 回滚事务 rollback2.操作实现 Transa…

系统架构设计师考试大纲2023

一、 考试方式&#xff08;机考&#xff09; 考试采取科目连考、 分批次考试的方式&#xff0c; 连考的第一个科目作答结束交卷完成后自动进 入第二个科目&#xff0c; 第一个科目节余的时长可为第二个科目使用。 高级资格&#xff1a; 综合知识科目考试时长 150 分钟&#xff…

8868体育助力意甲国际米兰俱乐部 国米成功续约球员

意甲的国际米兰俱乐部是8868合作体育球队之一&#xff0c;根据国米新闻网站的消息&#xff0c;在与劳塔罗、巴雷拉续签之前&#xff0c;国际米兰将会首先签下约迪马尔科。 有消息说&#xff0c;国际米兰的确有和巴雷拉续约的打算&#xff0c;但是根据国际米兰的计划&#xff0…

YoloV8改进策略:Neck改进:HAM混合注意力机制改进YoloV8|多种改进,多种姿势涨点|代码注释详解

摘要 HAM通过快速一维卷积来缓解通道注意机制的负担,并引入通道分离技术自适应强调重要特征。HAM作为通用模块,在CIFAR-10、CIFAR-100和STL-10数据集上实现了SOTA级别的分类性能。 论文链接:https://www.sciencedirect.com/science/article/abs/pii/S0031320322002667?vi…

迁移学习实现图片分类任务

导入工具包 import time import osimport numpy as np from tqdm import tqdmimport torch import torchvision import torch.nn as nn import torch.nn.functional as Fimport matplotlib.pyplot as plt %matplotlib inline# 忽略烦人的红色提示 import warnings warnings.fi…

Haas 开发板连接阿里云上传温湿度和电池电压

目录 一、在阿里云上创建一个产品 二、开发环境的介绍 三、创建wifi示例 四、编写SI7006和ADC驱动 五、wifi配网 六、主要源码 七、查看实现结果 一、在阿里云上创建一个产品 登录自己的阿里云账号&#xff0c; 应该支付宝&#xff0c;淘宝账号都是可以的。 接着根据需求…

【leetcode题解C++】77.组合 and 216.组合总和III and 17.电话号码的字母组合

77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&#xff1a…