戴安娜血型仪tan提取信息

博客内容涉及DianaEntry血型仪的数据解析挑战,特别是tan文件的处理,以及如何按流水号重命名相关图片。文章指出仪器设计的不便之处,如无法删除文件,数据与图像对应复杂,以及国内 LIS 系统对此的过度适应。作者通过编写代码实现了tan信息与图片的关联处理,并对当前行业现象表达了反思,呼吁抵制无底线迎合的行为。
摘要由CSDN通过智能技术生成

DianaEntry血型仪也是个奇葩设备。搞个tan文件还不能删除他的文件,只能增量监控。tan里的数据又和图没直接对应关系,能找到厂商给到算法就是万福了。算法也是一个神仙算法,根本不知道干了些啥。再分一下交叉配血、正定反定等事,麻烦的要死。按理这种事不属于lis范围,无奈国内lis太卷,各种舔狗厂商才让这种仪器大行其道。

磨了好久总算把tan信息对应流水号和图片信息搞清楚了,写个个公共处理按tan信息把关联的图处理为按流水号命名的图片。方便做业务处理。

原数据和图效果
在这里插入图片描述
数据文件

[Tanda]
version=2.400000
robot=2
NSerie=0000
AnalyzerName=
VersioSoft="ERY"
numero=9641
cruzada=1
status=4
StatusListas=1
StatusCQ=0
plantilla=""
separados=-1
uCreada=""
uCreadaNC=""
usuario=""
usuarioNC=""
uModificada=""
uModificadaNC=""
uHost="01719"
uHostNC="01719"
gru="DGW15D.gru"
curt="DGW15D.gru"
llarg="DGW15D.gru"
llistat=""
f_leida=28-10-2021  14:23:25
f_inicio=28-10-2021  13:27:05
f_cancelada=1-1-1990  23:59:59
Sensib=-1
Temp1=37
Temp2=37
[Muestra]
nombre="1015151892"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121008625"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015151959"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121008670"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015151966"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121000770"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015153557"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121008625"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015154162"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121004234"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015154984"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121000770"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015154994"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121007427"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015155241"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121000770"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015156016"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121007427"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015156132"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121009422"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015156263"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121008642"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015156491"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121007427"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015156497"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121008670"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015157238"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121004234"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015157487"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121008642"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015157512"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121008642"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015157583"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121008625"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015158879"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121008670"
tipo=D
incid=Ok:""
idManual=0
[Muestra]
nombre="1015159448"
tipo=R
incid=Ok:""
idManual=0
[Muestra]
nombre="0080121004234"
tipo=D
incid=Ok:""
idManual=0
[Soporte]
marca=DianaGel
clase=DG_Gel
id= "713004220980150328"
visio= ""
PosIncub=-1
incid=Ok:""
[Soporte]
marca=DianaGel
clase=DG_Gel
id= "713004220980150332"
visio= ""
PosIncub=-1
incid=Ok:""
[Soporte]
marca=DianaGel
clase=DG_Gel
id= "713004220980150340"
visio= ""
PosIncub=-1
incid=Ok:""
[Soporte]
marca=DianaGel
clase=DG_Gel
id= "713004220980150534"
visio= ""
PosIncub=-1
incid=Ok:""
[Soporte]
marca=DianaGel
clase=DG_Gel
id= "713004220980150330"
visio= ""
PosIncub=-1
incid=Ok:""
[Soporte]
marca=DianaGel
clase=DG_Gel
id= "713004220980150326"
visio= ""
PosIncub=-1
incid=Ok:""
[Pocillo]
sup=0
pac=12
don=25
nom="X.X"
res=-
pos=0
visio=
incid=Ok:""
[Pocillo]
sup=0
pac=12
don=25
nom="x.x"
res=-
pos=1
visio=
incid=Ok:""
[Pocillo]
sup=0
pac=1
don=3
nom="X.X"
res=-
pos=2
visio=
incid=Ok:""
[Pocillo]
sup=0
pac=1
don=3
nom="x.x"
res=-
pos=3
visio=
incid=Ok:""
[Pocillo]
sup=1
pac=2
don=5
nom="X.X"
res=-
pos=2
visio=
incid=Ok:""
[Pocillo]
sup=1
pac=2
don=5
nom="x.x"
res=-
pos=3
visio=
incid=Ok:""
[Pocillo]
sup=1
pac=7
don=15
nom="X.X"
res=-
pos=0
visio=
incid=Ok:""
[Pocillo]
sup=1
pac=7
don=15
nom="x.x"
res=-
pos=1
visio=
incid=Ok:""
[Pocillo]
sup=1
pac=6
don=13
nom="X.X"
res=-
pos=4
visio=
incid=Ok:""
[Pocillo]
sup=1
pac=6
don=13
nom="x.x"
res=-
pos=5
visio=
incid=Ok:""
[Pocillo]
sup=1
pac=11
don=23
nom="X.X"
res=-
pos=6
visio=
incid=Ok:""
[Pocillo]
sup=1
pac=11
don=23
nom="x.x"
res=-
pos=7
visio=
incid=Ok:""
[Pocillo]
sup=2
pac=17
don=35
nom="X.X"
res=-
pos=2
visio=
incid=Ok:""
[Pocillo]
sup=2
pac=17
don=35
nom="x.x"
res=-
pos=3
visio=
incid=Ok:""
[Pocillo]
sup=2
pac=5
don=11
nom="X.X"
res=-
pos=0
visio=
incid=Ok:""
[Pocillo]
sup=2
pac=5
don=11
nom="x.x"
res=-
pos=1
visio=
incid=Ok:""
[Pocillo]
sup=2
pac=8
don=17
nom="X.X"
res=-
pos=4
visio=
incid=Ok:""
[Pocillo]
sup=2
pac=8
don=17
nom="x.x"
res=-
pos=5
visio=
incid=Ok:"~"
[Pocillo]
sup=2
pac=3
don=7
nom="X.X"
res=-
pos=6
visio=
incid=Ok:""
[Pocillo]
sup=2
pac=3
don=7
nom="x.x"
res=-
pos=7
visio=
incid=Ok:""
[Pocillo]
sup=3
pac=14
don=29
nom="X.X"
res=M-
pos=0
visio=
incid=Ok:""
[Pocillo]
sup=3
pac=14
don=29
nom="x.x"
res=-
pos=1
visio=
incid=Ok:""
[Pocillo]
sup=3
pac=4
don=9
nom="X.X"
res=-
pos=4
visio=
incid=Ok:""
[Pocillo]
sup=3
pac=4
don=9
nom="x.x"
res=-
pos=5
visio=
incid=Ok:""
[Pocillo]
sup=3
pac=15
don=31
nom="X.X"
res=M-
pos=6
visio=
incid=Ok:""
[Pocillo]
sup=3
pac=15
don=31
nom="x.x"
res=-
pos=7
visio=
incid=Ok:""
[Pocillo]
sup=3
pac=13
don=27
nom="X.X"
res=-
pos=2
visio=
incid=Ok:""
[Pocillo]
sup=3
pac=13
don=27
nom="x.x"
res=-
pos=3
visio=
incid=Ok:""
[Pocillo]
sup=4
pac=0
don=1
nom="X.X"
res=-
pos=2
visio=
incid=Ok:""
[Pocillo]
sup=4
pac=0
don=1
nom="x.x"
res=-
pos=3
visio=
incid=Ok:""
[Pocillo]
sup=4
pac=16
don=33
nom="X.X"
res=-
pos=0
visio=
incid=Ok:""
[Pocillo]
sup=4
pac=16
don=33
nom="x.x"
res=-
pos=1
visio=
incid=Ok:""
[Pocillo]
sup=4
pac=10
don=21
nom="X.X"
res=M-
pos=6
visio=
incid=Ok:""
[Pocillo]
sup=4
pac=10
don=21
nom="x.x"
res=-
pos=7
visio=
incid=Ok:""
[Pocillo]
sup=4
pac=18
don=37
nom="X.X"
res=-
pos=4
visio=
incid=Ok:""
[Pocillo]
sup=4
pac=18
don=37
nom="x.x"
res=-
pos=5
visio=
incid=Ok:""
[Pocillo]
sup=5
pac=9
don=19
nom="X.X"
res=-
pos=0
visio=
incid=Ok:""
[Pocillo]
sup=5
pac=9
don=19
nom="x.x"
res=M-
pos=1
visio=
incid=Ok:""
[Reactivo]
marca=DianaGel
id= "031522730069"
posicion=-1
idManual=0
[Fin]
4527E6EA277689354FF3265DA09659865E9A3F876E0D6045D5A694FF1E59C87922DAFEFCEACDFA357578AE8CCD9DAFFA4072F96562BBB4E9119ACB17AA66F8673A650F5D6B2E7C05CAC1F02BD9885F527CEC7702E819C9AFC78240C66CA31E67762E39F52C79E03EF28C8326E8D0C4E97E1967D7EBA04F85D2FC19270F72278D

处理后效果
在这里插入图片描述

按tan得到按流水命名图片逻辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PreDeal.Interface;
using LIS.Model.Bussiness;
using LIS.DAL.DataAccess;
using PreDeal.Ftp;
using PreDeal.Attributes;
using System.Text.RegularExpressions;
using System.Data;
using System.IO;
using System.Drawing;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace PreDeal
{

    ///<summary  NoteObject="Class">
    /// [功能描述:DianaEntry血型仪出图,处理他的tan文件] <para/>
    /// [创建者:zlz] <para/>
    /// [创建时间:2022年03月15日] <para/>
    ///<说明>
    ///  [说明:DianaEntry血型仪出图,处理他的tan文件,数据为从上到下表示。先是标本号,一个个的。用索引0,1,2这样增加
    ///  然后是板条的卡号,一个个的用索引0,1,2这样增加。然后就是每个实验的数据块。每个实验通过sup指向所在的板条,通过pac指向所用的患者标本或血袋标本。
    ///  通过pos指示当前一个实验在板条8个位置的哪个位置(0-7)。
    ///    
    ///  ]<para/>
    ///</说明>
    ///<修改记录>
    ///    [修改时间:本次修改时间]<para/>
    ///    [修改内容:本次修改内容]<para/>
    ///</修改记录>
    ///<修改记录>
    ///    [修改时间:本次修改时间]<para/>
    ///    [修改内容:本次修改内容]<para/>
    ///</修改记录>
    ///</summary>
    [Remark(Remark = "DianaEntry血型仪出图,带交叉配血的处理,处理他的tan文件")]
    public class DealGERYTRADGW15D : BaseDeal, IPreDeal
    {
        /// <summary>
        /// 批号
        /// </summary>
        private static string BatchNo = string.Empty;

        /// <summary>
        /// 样本号
        /// </summary>
        private static string NumStr = string.Empty;

        /// <summary>
        /// 测试板条卡号
        /// </summary>
        private static string CardStr = string.Empty;

        /// <summary>
        /// 指示所用板条的索引
        /// </summary>
        private static string SupStr = string.Empty;

        /// <summary>
        /// 指示标本的索引
        /// </summary>
        private static string PacStr = string.Empty;

        /// <summary>
        /// 指示所在板条的位置0-7
        /// </summary>
        private static string PosStr = string.Empty;

        /// <summary>
        /// 指示所做的项目
        /// </summary>
        private static string NomStr = string.Empty;

        public bool PreDeal(string result, string machID, string dealProcess, int index, string fileName)
        {
            //第一行初始化状态并且得到批号
            if (index == 0)
            {
                NumStr = "";
                CardStr = "";
                PacStr = "";
                PosStr = "";
                SupStr = "";
                NomStr = "";
                FileInfo fi = new FileInfo(fileName);
                BatchNo = fi.Name.Split('.')[0];
                string[] arr = BatchNo.Split('\\');
                //提取批号
                if (arr.Length > 0)
                {
                    BatchNo = arr[arr.Length - 1];
                }
                else
                {
                    BatchNo = "";
                }
            }
            //最后一行初始化变量
            if (index == -1)
            {
                NumStr = "";
                CardStr = "";
                PacStr = "";
                PosStr = "";
                BatchNo = "";
                SupStr = "";
                NomStr = "";
            }
            //tipo为D的是交叉配血,把他所在的血袋标本号和前一个患者标本号拼接
            if (result.Contains("tipo=D"))
            {
                string[] arr = NumStr.Split(',');
                int len = arr.Length;
                if(len > 2)
                {
                    arr[len - 3] = arr[len - 3] + "^" + arr[len - 2];
                    NumStr = "";
                    for (int ni=0;ni<len-1;ni++)
                    {
                        NumStr = NumStr + arr[ni] + ",";
                    }
                }
            }
            //患者标本号和血袋标本号,后面数据通过pac的值当数组索引取
            if (result.Contains("nombre="))
            {
                string number = result.Substring(7).Replace("\"", "");
                //数字串
                NumStr = NumStr + number + ",";
            }
            //一个八位卡片的唯一ID,通过这个ID知道是哪个配血卡做的,后面数据通过sup的值当数组索引来取用的哪个卡片做的
            if (result.Contains("id=") && result.Substring(0, 3) == "id=")
            {
                string CardId = result.Substring(3).Replace("\"", "");
                //卡串
                CardStr = CardStr + CardId + ",";
            }
            //sup值指向用的卡片号的数组索引
            if (result.Contains("sup="))
            {
                string sup = result.Substring(4).Replace("\"", "");
                //sup串
                SupStr = SupStr + sup + ",";
            }
            //pac值指向对应的标本的数组索引
            if (result.Contains("pac="))
            {
                string pac = result.Substring(4).Replace("\"", "");
                //pac字符串
                PacStr = PacStr + pac + ",";
            }
            //pos指示在8位卡片的哪个位置上
            if (result.Contains("pos="))
            {
                string pos = result.Substring(4).Replace("\"", "");
                //pos字符串
                PosStr = PosStr + pos + ",";
            }
            //为项目名字,项目缩写
            if (result.Contains("nom="))
            {
                string nom = result.Substring(4).Replace("\"", "");
                //nom字符串
                NomStr = NomStr + nom + ",";
            }
            //结束,处理文件名
            if (result.Contains("[Reactivo]"))
            {
                if (BatchNo != "" && NumStr != "" && CardStr != "")
                {
                    string[] pacArr = PacStr.Split(',');
                    string[] supArr = SupStr.Split(',');
                    string[] posArr = PosStr.Split(',');
                    string[] nomArr = NomStr.Split(',');
                    if (pacArr != null && pacArr.Length > 0)
                    {
                        for (int i = 0; i < pacArr.Length; i++)
                        {
                            string pac = pacArr[i];
                            if (pac == "")
                            {
                                continue;
                            }
                            int intPac = Convert.ToInt32(pac);
                            string sup = supArr[i];
                            if (sup == "")
                            {
                                continue;
                            }
                            string pos = posArr[i];
                            if (pos == "")
                            {
                                continue;
                            }
                            string nom = nomArr[i];
                            string epis = NumStr.Split(',')[intPac];
                            if (epis == "")
                            {
                                continue;
                            }
                            int intSub = Convert.ToInt32(sup);
                            string CardId = CardStr.Split(',')[intSub];
                            string file = BatchNo.Trim() + "-" + CardId.Trim() + "-" + pos + ".BMP";
                            string Type = pos;
                            if (pos == "0")
                            {
                                Type = "A";
                            }
                            if (pos == "1")
                            {
                                Type = "B";
                            }
                            if (pos == "2")
                            {
                                Type = "D";
                            }
                            if (pos == "3")
                            {
                                Type = "QC";
                            }
                            if (pos == "4")
                            {
                                Type = "A";
                            }
                            if (pos == "5")
                            {
                                Type = "B";
                            }
                            if (pos == "6")
                            {
                                Type = "D";
                            }
                            if (pos == "7")
                            {
                                Type = "QC";
                            }
                            FileInfo fi = new FileInfo(fileName);
                            string imgPath = fi.DirectoryName + "\\" + file;
                            if (File.Exists(imgPath))
                            {
                                string newName = Path.Combine(Application.StartupPath,"temp","TMPimedicallis-" + epis + "-" + pos + "-" + CardId + "-" + nom + ".bmp");
                                if(File.Exists(newName))
                                {
                                    File.Delete(newName);
                                }
                                File.Copy(imgPath, newName);
                                DealData(newName, machID, epis, dealProcess, index, fileName);
                            }
                        }

                    }

                }
                NumStr = "";
                CardStr = "";
                PacStr = "";
                PosStr = "";
                BatchNo = "";
                SupStr = "";
                NomStr = "";
            }
            return false;

        }

    }
}


国内lis还是该反思一下无底线越界改最后自己也反受其害,像酶标仪厂商的控制软件要收费不想买要每个lis开发,有人开先例做了别的人都被迫只能做了。抵制下舔狗行为,期待这种仪器早点消失吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小乌鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值