通过EDI接口平台实现跨系统数据安全发送接收
应客户需求,需要实现客户家软件系统向他的客户系统及时共享约定的数据,具体需求 如下:
1 按照需要定期从对方的EDI平台接口获取料号信息,更新到客户的系统中(保证客户系统中的料号和对方的一致)
2、客户的系统定期调用对方的EDI平台的API接口,将POS数据和Inventory数据送到对方
3、每次调用SAG 业务API接口,需调用OauthAPI先获取TOKEN,将TOKEN值放在HTTP Header进行OAuth验证,确保安全
4、每次获取的料号信息,为客户能看到的所有料号,包含客户特价部分,以及标准部分(计划每月1号凌晨1点同步一次)
5、库存数据发送方式:全量(每个仓库发送一次;计划每月1号凌晨1点送)
6、销售数据发送方式:增量(发生了销售,就及时发送销售数据)

为此确定与客户系统采用数据库对接方式,形成数据列表然后转化成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
{
var requests = new List
// 检查表格是否为空
if (dataGridView1.Rows.Count == 0 || dataGridView1.Rows[0].IsNewRow)
{
MessageBox.Show("DataGridView 中没有可转换的数据!");
return requests;
}
// 定义单据头的关键字段(用于判断是否为同一单据)
string[] keyFields = { "disName", "disCode", "warehouseCode" };
// 按单据头关键字段分组
var groupedRows = dataGridView1.Rows
.Cast
.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
};
// 遍历分组内的所有行,提取明细字段
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;
具体呈现在前面的效果如下:
1 定期从对方的EDI平台接口获取料号信息,更新到客户的系统中

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

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

