java 从GS1 DataMatrix条形码中提取GTIN、LoT、SN和EXP

ux6nzvsh  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(126)

我为药房开发软件,以验证NMVS中的药物。该程序应该以这样的方式工作,我用手持扫描仪扫描药物代码,单击“验证”并连接到NMVS。大部分工作已经完成,但要正确验证药物,我需要从GTIN代码(PC)、批号(LoT)、序列号(SN)和有效期(EXP)中提取
以下是测试药物的扫描结果:

01059099913808231003ZP082117230831210XXFAE5AWA6RF8
0105909990054152101123926172207012162RB6FBN09
010590999109968821100322567773831721093010100013978
01059099907954202190EPCNT32ZH5581004032217250331
010590999032841321YCK3EB53CNZXD1725083110C48700
0105909990071029211165895472021010MU465417241031

我知道它是GS1 DataMatrix,GTIN前缀为01(后面14位数字是GTIN),LoT前缀为10(后面1-20个字母数字字符是LoT),SN前缀为21(后面1-20个字母数字字符是LoT),失效日期前缀为17(后面6位数字是EXP)。
对于给定的例子,我应该有例如:

[
    {
        "gtin": "05909991380823",
        "lot": "03ZP08",
        "sn": "0XXFAE5AWA6RF8",
        "exp": "230831"
    },
    {
        "gtin": "05909990054152",
        "lot": "1123926",
        "sn": "62RB6FBN09",
        "exp": "220701"
    },
    {
        "gtin": "05909991099688",
        "lot": "100013978",
        "sn": "10032256777383",
        "exp": "210930"
    },
    {
        "gtin": "05909990795420",
        "lot": "040322",
        "sn": "90EPCNT32ZH558",
        "exp": "250331"
    },
    {
        "gtin": "05909990328413",
        "lot": "C48700",
        "sn": "YCK3EB53CNZXD",
        "exp": "250831"
    },
    {
        "gtin": "05909990071029",
        "lot": "10MU4654",
        "sn": "116589547202",
        "exp": "241031"
    }
]

问题是这些部分可以是任何顺序和不同的长度。只有GTIN和EXP具有固定长度。
我创建了一个正则表达式来提取这些部分:^(?=.*01(\d{14}))(?=.*10([a-zA-Z0-9]{1,20}))(? =.*17(\d{6}))(?=.*21([a-zA-Z0-9]{1,20})).*$但不幸的是它不能正常工作。客户端是用JavaScript编写的(不是TS,确切地说是AngularJS --是的,这是一个遗留项目,我正试图说服公司更新它),服务器是用Java编写的。
我正在寻找任何解决方案-无论是正则表达式,库(JavaScript或Java),外部API -对于这个问题,我个人已经没有想法了。
此外,我还要补充一点,我使用的手持式扫描仪是Zebra DS 2208。
我将感谢任何关于这个主题的帮助。
编辑:
我尝试读取条形码扫描仪输出字符的字符,但我没有看到一个模式。这是我得到的

kokeuurv

kokeuurv1#

我做到了!我注意到GTIN和EXP总是以正确的方式提取,所以我尝试了这样的东西:

const extractDataMatrix = (code) => {
        const response = {gtin: '', lot: '', sn: '', exp: ''};
        let responseCode = code;

        const prefixes = [
            {prefix: '01', key: 'gtin', length: 14},
            {prefix: '17', key: 'exp', length: 6}
        ];

        prefixes.forEach(({prefix, key, length}) => {
            const position = responseCode.indexOf(prefix);

            if (position !== -1) {
                const start = position + prefix.length;
                const end = start + length;

                response[key] = responseCode.substring(start, end);
                responseCode = responseCode.slice(0, position) + responseCode.slice(end);
            }
        });

        const lotAndSn = extractLotAndSn(responseCode);
        response.lot = lotAndSn.lot;
        response.sn = lotAndSn.sn;

        return response;
    };

    const extractLotAndSn = (responseCode) => {
        const pattern = /^(10.+?)(?=10|21)(21.+?)$|^(21.+?)(?=10|21)(10.+?)$/;
        const matches = responseCode.match(pattern);
        if (!matches) return {lot: '', sn: ''};

        const [lot1, sn1, sn2, lot2] = matches.slice(1);
        const lot = (lot1 || lot2 || '').substring(2);
        const sn = (sn1 || sn2 || '').substring(2);
        return checkLotAndSn(lot, sn, responseCode);
    };

    const checkLotAndSn = (lot, sn, responseCode) => {
        if (responseCode.includes("1010") && !responseCode.includes("10100")) {
            const isLotStart = lot.startsWith("10");
            if (isLotStart) {
                lot = lot.slice(2);
                sn += "10";
            }
        } else if (responseCode.includes("2121") && responseCode.includes("21210")) {
            const isSnStart = sn.startsWith("21");
            if (isSnStart) {
                sn = sn.slice(2);
                lot += "21";
            }
        }

        return {lot, sn};
    };

我认为无论如何都可以优化,但现在我不在乎;).
这是怎么回事?
1.在extractDataMatrix中,我检查固定长度的前缀(GTIN和EX)。
1.在forEach之后,我从responseCode中删除它。
1.我将这个responseCode传递给extractLotAndSn()函数。
1.在这个函数中,我使用正则表达式来获取lot和sn。
1.有时我得到代码,其中前缀是前一个序列的一部分(例如。1010和2121),所以checkLotAndSn()函数从序列的开始删除前缀并将其添加到前一个序列。
1.我不知道为什么在1010021210responseCode的一部分的情况下,所有内容都被正确分割,所以我将其从交换中排除。

相关问题