首页 > 编程语言 >C# 适配大华TM-F条码秤

C# 适配大华TM-F条码秤

时间:2024-07-11 10:41:42浏览次数:16  
标签:00 string C# 适配 报文 TM sb public Append

背景

大华条码秤(TM-F),使用了自己的私有协议。在对接过程中,将PLU信息部分的转义和解析进行了封装。

基础信息

首先,为适配将来更多的条码秤,抽象PLU的基本信息作为基类。基类为充血模型,包含了信息转报文和报文解析信息的方法。

public class BasePLU
{
    /// <summary>
    /// 商品名
    /// </summary>
    public string GoodsName { get; set; } = string.Empty;

    /// <summary>
    /// 商品序号
    /// </summary>
    public int GoodsNum { get; set; }

    /// <summary>
    /// 商品代码
    /// </summary>
    public string GoodsCode { get; set; } = string.Empty;

    /// <summary>
    /// 商品单价,元
    /// </summary>
    public double UnitPrice { get; set; }

    /// <summary>
    /// 总价
    /// </summary>
    public double TotalPrice { get; set; }

    /// <summary>
    /// 称重方式
    /// </summary>
    public EnumWeighingWay WeighingWay { get; set; }

    /// <summary>
    /// 门店号
    /// </summary>
    public string StoreCode { get; set; } = string.Empty;

    /// <summary>
    /// 皮重,KG.最大1位数+3位小数
    /// </summary>
    public double Tare { get; set; }

    /// <summary>
    /// 有效期
    /// </summary>
    public int Validity { get; set; }

    public bool CheckSuccess { get; set; }

    /// <summary>
    /// 转义成PLU报文
    /// </summary>
    /// <returns></returns>
    public virtual string ToPLU() { return null; }


    /// <summary>
    /// 从PLU报文解析成实体
    /// </summary>
    /// <param name="message"></param>
    public virtual void ConvertFromImportMessage(string message) { }
}

从PLU报文解析成实体

报文解析时有一点需要注意,报文中的商品名称包含中文,中文是传入的区域码,不能直接转换成中文。需要先将区域码转换为中文。

/// <summary>
/// 区域码转文字
/// </summary>
/// <param name="coding"></param>
/// <returns></returns>
public static string ConvertCoding2Chinese(this string coding) {
    var result = string.Empty;
    if (coding.Length % 4 != 0) {
        throw new System.Exception("编码格式不正确");
    }
    var encoding = System.Text.Encoding.GetEncoding("GB2312");
    for (int i = 0; i < coding.Length; i += 4) {
        byte[] pArray = new byte[2];
        string front = coding.Substring(i, 2);
        string back = coding.Substring(i + 2, 2);
        if ("03".Equals(front))
        {
            byte[] pArray2 = new byte[1];
            pArray2[0] = (byte)(Convert.ToInt16(back) + 32);
            result += encoding.GetString(pArray2);
        }
        else
        {
            pArray[0] = (byte)(Convert.ToInt16(front) + 160);
            pArray[1] = (byte)(Convert.ToInt16(back) + 160);
            result += encoding.GetString(pArray);
        }
    }
    return result;
}

然后重写ConvertFromImportMessage函数

/// <summary>
/// 从PLU报文解析成实体
/// </summary>
/// <param name="message">报文</param>
public override void ConvertFromImportMessage(string message)
{
    var messageContentArray = message.ToArray();
    char[] goodsNumCharArray = new char[4];
    Array.Copy(messageContentArray,3, goodsNumCharArray, 0, 4);
    this.GoodsNum = messageContentArray.SubInt32(3, 4);
    this.GoodsCode = messageContentArray.SubString(8, 7);
    this.UnitPrice = messageContentArray.SubInt32(15, 6)/100f;
    this.WeighingWay = (EnumWeighingWay)messageContentArray.SubInt32(21,1);
    this.Validity = messageContentArray.SubInt32(28, 3);
    this.StoreCode = messageContentArray.SubString(31, 2);
    this.Tare = messageContentArray.SubInt32(48, 5);
    var tempGoodsName = messageContentArray.SubString(82, message.LastIndexOf("CDE") - 82);
    this.GoodsName = tempGoodsName.ConvertCoding2Chinese();
}

转义成PLU报文

大华报文的规则不在此赘述,可以参考以下代码的注释

/// <summary>
/// 转义成PLU报文
/// </summary>
/// <returns></returns>
public override string ToPLU()
{
    var sb = new StringBuilder("!0V");// 2
    sb.Append(this.GoodsNum.ToString("0000"));//商品序号 6
    sb.Append("A");// 7
    sb.Append(this.GoodsCode.PadLeft(7,'0'));//商品代码,7位
    sb.Append(this.UnitPrice.ConvertPrice4DHPLU());//单价,6位
    sb.Append((int)this.WeighingWay);//称重方式,1位
    sb.Append("00");//特殊信息1
    sb.Append("00");//特殊信息2
    sb.Append("00");//特殊信息3
    sb.Append(this.Validity.ToString("000"));//有效期,3位
    sb.Append(this.StoreCode.PadLeft(2,'0'));//门店号,2位
    sb.Append("00");//部门号
    sb.Append("0000000000000");//数字代号
    sb.Append((this.Tare * 1000).ToString("00000"));//皮重,克
    sb.Append("00");//标签号
    sb.Append("00");//是否打折
    sb.Append("00");//第一时间段起始时间
    sb.Append("00");//第一时间段结束时间
    sb.Append("00");//第一时间段内折扣
    sb.Append("00");//第二时间段起始时间
    sb.Append("00");//第二时间段结束时间
    sb.Append("00");//第二时间段内折扣
    sb.Append("00");//第三时间段起始时间
    sb.Append("00");//第三时间段结束时间
    sb.Append("00");//第三时间段内折扣
    sb.Append("00");//第四时间段起始时间
    sb.Append("00");//第四时间段结束时间
    sb.Append("00");//第四时间段内折扣
    sb.Append("B");
    sb.Append(this.GoodsName.ConvertChinese2Coding());
    sb.Append("CDE");
    sb.Append("\r\n");

    var result = sb.ToString();
    return result;
}

标签:00,string,C#,适配,报文,TM,sb,public,Append
From: https://www.cnblogs.com/yantaixuchao/p/18295563

相关文章

  • WPF ContextMenu MVVM Command CommandParameter Path=PlacementTarget
    <DataGridItemsSource="{BindingBooksList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"SelectionMode="Extended"><DataGrid.ContextMenu><ContextMenu><MenuItemHeader="Ex......
  • [题解] [ABC221H] Count Multiset - DP
    [ABC221H]CountMultiset题面翻译输入两个正整数\(N,M\),并存在一个集合,问你一个长度为\(k\)的合法集合存在多少个?你需要回答\(k\)的值为\(1\)到\(N\)的每种情况。一个合法的集合定义指长度为\(k\),元素和为\(N\),每一个数字在集合中出现的次数都小于等于\(M\)的集......
  • 中移ML307R(4G Cat1,C-SDK,OpenCPU)模组学习开发-AT指令测试
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ML307R_OPEN"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>   AT指令手册(串口默认通信波特......
  • Mock Server
    参考资料https://blog.51cto.com/u_16213306/11046902https://debugtalk.com/post/ApiTestEngine-0-setup-CI-test/以下是文心一言对mock server作用的描述:Mockserver(模拟服务器)在软件开发过程中扮演着至关重要的角色,它主要用于模拟后端服务的行为,以便前端开发者或测试人员......
  • 深入理解 CompletableFuture 的底层原理
    引言在现代Java编程中,异步编程变得越来越重要。为了实现高效和非阻塞的代码,Java8引入了CompletableFuture,一个用于构建异步应用程序的强大工具。本文将详细探讨CompletableFuture的底层原理,展示其工作机制,并通过代码示例说明如何在实际应用中使用它。异步编程的背景......
  • (免费领源码)Java/Mysql数据库+09536 SSM爱心捐赠物资维护系统,计算机毕业设计项目推荐上
    摘要随着信息技术的快速发展,计算机应用已经进入成千上万的家庭。随着物资数量的增加,物资库存管理也存在许多问题。物资数据的处理量正在迅速增加,原来的手工管理模式不适合这种形式。使用计算机可以完成数据收集、处理和分析,减少人力和物力的浪费。需要建立爱心捐赠物资维护系......
  • vscode初体验
    一、下载安装官网下载安装包,直接进行安装,一直点击下一步即可安装成功。注:不想安装在c盘,直接点击浏览更改安装位置即可二、插件安装 因为是基于已有webstorm配置,并且运行过vue项目。关于运行vue项目的相关配置项不再需要进行安装,所以只进行提高使用舒适度的插件安装。三、用......
  • 01.前后端分离中台框架后端 Admin.Core 学习-介绍与配置说明
    合集-Admin.Core(6) 1.01.前后端分离中台框架后端Admin.Core学习-介绍与配置说明2023-08-202.02.前后端分离中台框架前端admin.ui.plus学习-介绍与简单使用2023-08-213.03.前后端分离中台框架zhontai项目代码生成器的使用2023-08-224.04.使用githubactions+dock......
  • CodeForces - 1984E
    题目大意每次在每个联通块中选一个点\(u\),删除这个点使得联通块分成若干个联通块,再从联通块中选点\(v\),在新树上连接\(u,v\),求新树叶节点的最大个数。分析易转化为求原树的最大独立集,设\(f_{u,0/1}\)为以1为根时不选/选\(u\)的最大独立集。显然有:\[dp_{u,0}=\sum\li......
  • cubemx+hal stm32 atgm336h GPS 北斗 定位 模块 驱动代码
    usart2.cgps的串口2设置voidMX_USART2_UART_Init(void){/*USERCODEBEGINUSART2_Init0*//*USERCODEENDUSART2_Init0*//*USERCODEBEGINUSART2_Init1*//*USERCODEENDUSART2_Init1*/huart2.Instance=USART2;huart2.Init.BaudR......