同步数据到外部系统


以仓库同步到腾一为例:

 

1. 先仓库表添加UD字段,meslog_c,代表是否同步到腾一

2. 查询列表和详情页 添加上这个字段的显示 只读

3. 再接口平台中添加仓库数据推送的接口

控制器 PushDataToTengYiController中添加 Warehse 方法

C# 全选
/// <summary>
/// 推送仓库
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<bool> WarehseSaveOrUpdateAsync(List<WarehseInput> input)
{
    try
    {
        var warehseCodes = input.Select(x => x.WarehouseCode).Distinct().ToList();
        var datas = _db.Queryable<Tables.ErpWarehse>().Where(x => warehseCodes.Contains(x.WarehouseCode)).ToList();

        if (datas.Count == 0) return true;

        var parameters = datas.Select(s => new WarehouseModel()
        {
            WarehouseCode = s.WarehouseCode,
            WarehouseName = s.Description,
            Inactive = s.Inactive ? 1 : 0
        }).ToList();

        await _ajaxToTengYi.Post<ResponseBase>(this.Company, "WarehouseStandard/WS_Create", new { ParameterList = parameters });

        // 更新同步标记
        var _sysRowIds = datas.Select(s => s.SysRowID).ToList();
        int resutl = _db.Updateable<Tables.ErpWarehseUD>().Where(w => _sysRowIds.Contains(w.ForeignSysRowID))
             .SetColumns(it => new ErpWarehseUD { MesLog_c = true })
             .ExecuteCommand();

        // 校验检查第一次同步
        var dataKeys = datas.Select(s => s.WarehouseCode).ToList();
        await _mesSyncDataBusiness.CreateAsync(this.Company, "erp.warehse", dataKeys, HttpContext.RequestAborted);

        return true;
    }
    catch (Exception ex)
    {
        if (ex is BusErrorException)
            throw;
        else
            throw new BusErrorException($"数据同步腾一时发生错误: {ex.Message}", ex);
    }

}

/// <summary>
/// 推送仓库 删除
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task WarehseDelete(DeleteCommonReq<List<WarehseInput>> input)
{
    try
    {
        var ids = input.Data.Select(s => s.WarehouseCode).ToList();

        // 检查一下,只有同步过的才删除
        if (!input.AlwayDelete)
        {
            var syncData = await _mesSyncDataBusiness.GetSyncDataAsync(this.Company, "erp.warehse", ids, HttpContext.RequestAborted);
            ids = syncData;
        }

        var q_data = _db.Queryable<Tables.ErpWarehse>().Where((a) => a.Company == this.Company && ids.Contains(a.WarehouseCode));
        var data = await q_data.ToListAsync(HttpContext.RequestAborted);

        var partNums = data.Select(s => new { WarehouseCode = s.WarehouseCode }).ToList();

        await _ajaxToTengYi.Post<ResponseBase>(this.Company, "WarehouseStandard/WS_Delete", new { ParameterList = partNums });



        var sysRowIDs = data.Select(s => s.SysRowID).ToList();
        // 更新UD字段
        await _db.Updateable<Tables.ErpWarehseUD>()
            .SetColumns(x => x.MesLog_c == false)
            .Where(x => sysRowIDs.Contains(x.ForeignSysRowID))
            .ExecuteCommandAsync();

        // 删除同步数据
        var dataKeys = data.Select(s => s.WarehouseCode).ToList();
        await _mesSyncDataBusiness.DeleteAsync(this.Company, "erp.rma", dataKeys, HttpContext.RequestAborted);
    }
    catch (Exception ex)
    {
        if (ex is BusErrorException)
            throw;
        else
            throw new BusErrorException($"数据同步腾一时发生错误: {ex.Message}", ex);
    }
}

4. 在适当的函数库中新建一个同步函数。

函数库需要引用 ZAPIServer库

同步数据到外部系统

新建函数 SendWarehouse

参数信息

同步数据到外部系统

内容方法:

C# 全选
var validCompanyReult = this.EfxLib.ZAPIServer.ValidCompanyToTengYi();
if(validCompanyReult == false ){
  this.success = true;
  this.message = "当前公司配置为无需同步";  
  return;
}

var paramData = this.keys.Split(',').Select(s=>new {
  warehouseCode= s
}).ToList();

var paramJson = System.Text.Json.JsonSerializer.Serialize(paramData);

var urlPath = $"/api/{this.callContextClient.CurrentCompany}/PushDataToTengYi/WarehseSaveOrUpdate";

var result = this.EfxLib.ZAPIServer.PostEx(urlPath, paramJson);


this.success = result.success;
this.message = result.message;
if(!result.success) 
{
  throw new Ice.Common.BusinessObjectException(new Ice.Common.BusinessObjectMessage(this.message){
            Type=Ice.Common.BusinessObjectMessageType.Error
        });
}

 

5. 自动同步

自动同步到腾一逻辑主要通过BPM中来实现,

7.1 Before Update

update方法BPM指令

  1. 数据更新,要清除同步标记
  2. 删除时需要先调用API删除外围系统,删除成功后再删除Epicor
  3. 加入一个BPMData缓存数据,缓存单号,一遍afterUpdate后,同步数据到外围系统使用

BPM指令推荐使用名称:BeforeUpdate

同步数据到外部系统

代码:

C# 全选
List<string> keys = new List<string>();
List<string> delData = new List<string>();
foreach(var row in ds.Warehse) {
    // 新增,修改 滕一同步标记置为false
    if(row.RowMod =="A" || row.RowMod =="U") {
        row["MesLog_c"] = false;
        keys.Add(row.WarehouseCode);
    }

    if(row.RowMod =="D") {
       delData.Add(row.WarehouseCode);
    }
}
callContextBpmData.Character01 = String.Join(',',keys);

if(delData.Count>0) {
    var resultValid = (Tuple<System.Boolean>)this.InvokeFunction("ZAPIServer","ValidCompanyToTengYi",new Tuple<object>(null));
    // 公司没有配置推送腾一
    if(resultValid.Item1 == false) {
        return;
    }
    string functionLibrary =  "ZAPIServer";
    string function =  "PostEx";

    var paramData =delData.Select(s=>new {
        warehouseCode= s
    }).ToList();

    var jsonBody = new {
        alwayDelete = false,
        data = paramData
    };

    var urlPath = $"/api/{callContextClient.CurrentCompany}/PushDataToTengYi/WarehseDelete";
    string jsonStr = System.Text.Json.JsonSerializer.Serialize(jsonBody);
    try{
        var result = (Tuple<System.Boolean,System.String,System.String>)this.InvokeFunction(functionLibrary,function,Tuple.Create(urlPath,jsonStr));
        bool success = result.Item1;
        string message = result.Item2;
        if(!success) {
            throw new Ice.Common.BusinessObjectException(new Ice.Common.BusinessObjectMessage("调用滕一删除发生错误:"+message){
                Type=Ice.Common.BusinessObjectMessageType.Error
            });
        }
    } 
    catch(Ice.Common.BusinessObjectException bex) {
        throw bex;
    }
    catch(Exception ex){
        throw new Ice.Common.BusinessObjectException(new Ice.Common.BusinessObjectMessage("调用滕一删除发生异常:"+ex.Message){
            Type=Ice.Common.BusinessObjectMessageType.Error
        });
    }
}

7.2 After Update

更新后,同步数据到外围系统

C# 全选
if(String.IsNullOrEmpty(callContextBpmData.Character01)) return;
// PublishInfoMessage(callContextBpmData.Character01, Ice.Common.BusinessObjectMessageType.Information, Ice.Bpm.InfoMessageDisplayMode.Individual, "", "");

var resultValid = (Tuple<System.Boolean>)this.InvokeFunction("ZAPIServer","ValidCompanyToTengYi",new Tuple<object>(null));
// 公司没有配置推送腾一
if(resultValid.Item1 == false) {
	return;
}

string functionLibrary =  "ZAPIServer";
string function =  "PostEx";

var urlPath = $"/api/{callContextClient.CurrentCompany}/PushDataToTengYi/WarehseSaveOrUpdate";
// 仓库代码集合
var warehouseCodes = callContextBpmData.Character01.Split(',');
var paramData = warehouseCodes.Select(s=>new {
    WarehouseCode= s
}).ToList();

string jsonStr = System.Text.Json.JsonSerializer.Serialize(paramData);
try{
    var result = (Tuple<System.Boolean,System.String,System.String>)this.InvokeFunction(functionLibrary,function,Tuple.Create(urlPath,jsonStr));
    if(result.Item1 == false) {
        // throw new Ice.Common.BusinessObjectException(new Ice.Common.BusinessObjectMessage("数据保存成功,但同步腾一发生错误:"+result.Item3){
        //     Type=Ice.Common.BusinessObjectMessageType.Error
        // });
        PublishInfoMessage("数据保存成功,但同步腾一发生错误:"+result.Item3, Ice.Common.BusinessObjectMessageType.Information, Ice.Bpm.InfoMessageDisplayMode.Individual, "", "");
    } else {
        // 更新主键值,避免前端再次修改保存时提示数据已被修改
        var dataWhseNew = this.Db.Warehse.Where(w=>w.Company == callContextClient.CurrentCompany && warehouseCodes.Contains(w.WarehouseCode)).Select(s=>new {
            s.WarehouseCode,
            s.MesLog_c,
            s.UD_SysRevID
        }).ToList();

        for(int i = 0;i<ds.Warehse.Count;i++) {
            var row = ds.Warehse[0];
            var item = dataWhseNew.Where(w=>w.WarehouseCode == row.WarehouseCode).FirstOrDefault();
            if(item!=null) {
                row["MesLog_c"] = item.MesLog_c;
                row["UD_SysRevID"] = item.UD_SysRevID;
            }
        }
    }
} 
catch(Exception ex){
    // throw new Ice.Common.BusinessObjectException(new Ice.Common.BusinessObjectMessage("同步腾一发生异常:"+ex.Message){
    //     Type=Ice.Common.BusinessObjectMessageType.Error
    // });
    PublishInfoMessage("数据保存成功,但同步腾一发生异常:"+ex.Message, Ice.Common.BusinessObjectMessageType.Information, Ice.Bpm.InfoMessageDisplayMode.Individual, "", "");
}
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:Epicor BPM中自定义代码弹出错误提醒
下一篇:function函数无法更改原因排查
评论列表

发表评论

评论内容
昵称:
验证码:
验证码
关联文章

同步数据外部系统
飞牛资料同步网盘
两台Linux之间自动同步文件
nginx内外网分流+https证书同步
GZDBHelper中Update方法,更新表格数据数据库
.net异步Task转同步
Exsi迁移pve
C# 从做早餐看同步异步
Javascript 中通过 yield 和 promise 使异步变同步
客户端发送数据
系统登录后默认显示可视化数据大屏
网站迁移纪实:从Web Form Asp.Net Core (Abp vNext 自定义开发)
vscode同步配置时,重新生成 github token 之后,怎样继续下载配置
PVE复制虚拟机硬盘另一个虚拟机
selenium爬虫被检测 该如何破
PVE备份115网盘
YES-CMS 内容管理系统 快速发布与部署
数据扩展:BPM中判断数据是扩展而来的还是通过新增来的
EF并发处理,防止并发修改数据
数据绑定模式

热门标签
.NET Core .NET Reactor ag-grid AI发布 api安全 ASP.NET Core C#DLL加密 C#播放声音 C#代码混淆 C#代码加密 ChromeDriver Codex DateTime DBeaver devexpress devTool DLL混淆 edge.js EF EFCore Electron element-ui el-form el-table excel FastReport FileStream FolderBrowerDialog FolderSelectDialog form提交 git gridcontrol gridview input javascript json字符串 JS转换对象JSON jwt JWT授权 linq log Math MCP mitmproxy MVC MySQL Navicat netstat nginx node_modules NSwag Nuget Nuget镜像 number PowerShell pyinstaller python pythoncom python爬虫 python抓包 pywin32 redis Requests-html RestSharp Selenium sql SQL Server Swagger to-cms Visual Studio VSCode vue VueRouter vue路由 VUE页面通讯 Webpack Windows Windows服务 winform wmi xlrd yaml YESCMS YESWEB开发框架 白象 表单提交 播放声音 打开URL 代码混淆 弹窗提醒 端口占用 对象转换 分布式 公共字典 机器码 进程排查 静态资源 开发指南 路由参数 密钥 配置教程 配置文件 权限 人工智能 任务 任务调度 日期间隔 日志 日志记录 省市区 授权验证 数据库 四舍五入 文案 文件读取 文件夹选择 文件目录选择 问题排查 行政区域数据 页面通讯 中间件 CSharp 事务锁 工单系统 并发控制 重复提交 CMS Markdig Markdown markdown-it marked 技术选型 VS Code 开发工具 源代码管理 版本控制 Docker PostgreSQL 时区 部署排查 CMS架构 EF Core 主题系统 二次开发 插件系统 容器 运维命令 镜像清理 Linux NAS 远程挂载 飞牛 fnOS
联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码