欢迎来到诚力友软件
18118028216 扫码关注
二维码
在线试用
二开案例
热门新闻
联系我们
诚力友软件
淮安:18505218550
常州:18118028216
淮安地址:淮安市清江浦区颐高广场3号楼工程917室
常州地址:常州市钟楼区怀德南路55号泰盈八千里5-8创新工场二楼
二开案例
当前位置:首页—新闻中心—二开案例
通过EDI接口平台实现跨系统数据安全发送接收
发布时间:2026-1-17  浏览次数:139

        应客户需求,需要实现客户家软件系统向他的客户系统及时共享约定的数据,具体需求 如下:

1 按照需要定期从对方的EDI平台接口获取料号信息,更新到客户的系统中(保证客户系统中的料号和对方的一致)

2、客户的系统定期调用对方EDI平台的API接口,将POS数据和Inventory数据送到对方

3、每次调用SAG 业务API接口,需调用OauthAPI先获取TOKEN,将TOKEN值放在HTTP Header进行OAuth验证,确保安全

4、每次获取的料号信息,为客户能看到的所有料号,包含客户特价部分,以及标准部分(计划每月1号凌晨1点同步一次)

5、库存数据发送方式:全量(每个仓库发送一次;计划每月1号凌晨1点送)

6、销售数据发送方式:增量(发生了销售,就及时发送销售数据)

image.png

为此确定与客户系统采用数据库对接方式,形成数据列表然后转化成JOIN报文格式向EDI平台发送,返回信息实现数据库交互的方式。具体来说:

1 首先要实现授权验证,EDI平台是有十分钟有效性,这里是只要发送报文就立即先授权TOKEN验证

 // 获取授权头

 var httpService = new HttpService();

         string authHeader = await GetAuthorizationHeaderAsync(httpService);


         if (string.IsNullOrEmpty(authHeader))

 {

     MessageBox.Show("无法获取授权令牌!");

     return;

2 实现报文的转序列化

{

    "inventory": {

     "uuid": "dbc82f62-e821-9121-e488-accdf5415e76",

     "transactionDate": "20230831164312",

     "disCode": "6020721",

     "disName": "xxx",

     "warehouseCode": "A01",

     "cityName": "NT",

     "counntryCode": "CN",

     "inventoryDate": "20230831",

     "inventoryDetail": [

      {

       "partItemNo": "B1F000",

       "partNo": "B1F000",

       "partQty": "3000",

       "unitPrice": "0.04200",

       "unitPriceType": "USD",

       "taxRate": "0",

       "agreementNo": "XXXX",

       "slipNo": ""

      },

      {

       "partItemNo": "B1F000",

       "partNo": "B2F000",

       "partQty": "2000",

       "unitPrice": "0.04200",

       "unitPriceType": "USD",

       "taxRate": "0",

       "agreementNo": "XXXX",

       "slipNo": ""

      }

     ]

    }

   }

可以通过以下语句实现从数据库查询的得到dataGridView列表转换成上面的JOIN报文格式进行发送

private List<RootInventoryRequest> ConvertGridToMultipleInventoryRequests()

{

    var requests = new List<RootInventoryRequest>();


    // 检查表格是否为空

    if (dataGridView1.Rows.Count == 0 || dataGridView1.Rows[0].IsNewRow)

    {

        MessageBox.Show("DataGridView 中没有可转换的数据!");

        return requests;

    }


    // 定义单据头的关键字段(用于判断是否为同一单据)

    string[] keyFields = { "disName", "disCode", "warehouseCode" };


    // 按单据头关键字段分组

    var groupedRows = dataGridView1.Rows

        .Cast<DataGridViewRow>()

        .Where(row => !row.IsNewRow)

        .GroupBy(row => string.Join("|", keyFields.Select(field => GetCellValue(row, field))));


    // 遍历每个分组,生成对应的 POS 请求

    foreach (var group in groupedRows)

    {

        // 从分组的第一行提取单据头字段

        var firstRow = group.First();

        var inventoryDto = new InventoryDto

        {

            uuid = Guid.NewGuid().ToString(),

            transactionDate = DateTime.UtcNow.ToString("yyyyMMddHHmmss"),

            

            disName = GetCellValue(firstRow, "DisName"),

            disCode = GetCellValue(firstRow, "DisCode"),

            warehouseCode = GetCellValue(firstRow, "warehouseCode"),

            inventoryDate = GetCellValue(firstRow, "inventoryDate"),

            cityName = GetCellValue(firstRow, "cityName"),

            

            countryCode = GetCellValue(firstRow, "countryCode"),

            inventoryDetail = new List<InventoryDetailDto>()

        };


        // 遍历分组内的所有行,提取明细字段

        foreach (var row in group)

        {

            var detail = new InventoryDetailDto

            {

                

                partItemNo = GetCellValue(row, "PartItemNo"),

                partNo = GetCellValue(row, "PartNo"),

                partQty = GetCellValue(row, "PartQty"),

                unitPrice = GetCellValue(row, "UnitPrice"),

               

                unitPriceType = GetCellValue(row, "UnitPriceType"),

                taxRate = GetCellValue(row, "TaxRate"),

                agreementNo = GetCellValue(row, "AgreementNo"),

                slipNo = GetCellValue(row, "slipNo")

            };

            inventoryDto.inventoryDetail.Add(detail);

        }


        // 将当前分组转换为一个 POS 请求对象

        requests.Add(new RootInventoryRequest { inventory = inventoryDto });

    }


    return requests;

具体呈现在前面的效果如下:

定期从对方的EDI平台接口获取料号信息,更新到客户的系统中

image.png

定期调用对方EDI平台的API接口,将POS数据和Inventory数据送到对方

image.png

3 针对料号,库存及销售数据不同的传送时间和频率通过设置自动作业设定就好了

功能持续改进中。


  • 上一篇:易飞易助BOM变更单同步生成工单(委外)变更单
  • 下一篇:末页
  • 淮安诚力友软件有限公司
    淮安:18505218550
    常州:18118028216
    淮安地址:淮安市清江浦区颐高广场3号楼工程917室
    常州地址:常州市钟楼区怀德南路55号泰盈八千里5-8创新工场二楼
    诚力友软件 Copyright 2019. All rights reserved
    咨询热线:
    18118028216
    在线客服:
    官方微信站:
    公司官网: www.hachliy.com