如何监控1小时内EDI系统传输的文件数量?

Posted 知行EDI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何监控1小时内EDI系统传输的文件数量?相关的知识,希望对你有一定的参考价值。

在知行之桥EDI系统中,我们可以设置周报和日报,从而来清楚知道EDI系统上每天或者每周的文件收发数量的情况。对于每天传输文件数量较多的客户,或者传输的业务数据比较重要的客户,若想每小时都收到来自EDI系统文件收发数量的汇总,了解是否有传输失败的文件,以便及时处理以避免或者减少损失,我们该如何实现?

首先我们需要建立一个script端口。在script端口配置如下代码。

<arc:call op="portStatisticsTransactionLogs?type=day" out="output">
  <!-- Only check transactions on the last hour (e.g. 02:00 to 03:00) -->
  <arc:if exp="[_index] == 2">
      <!-- Send Email -->
           <arc:set attr="Subject"  value="Transaction Log Notify-2020"></arc:set>
          <arc:set attr="Message"   value="The transaction log is Received:[output.Received] + Sent:[output.Sent] + Error:[output.Error] within the last hour, please check."></arc:set>
          <arc:set attr="To"    value="michaelw@kasoftware.cn"></arc:set>
          <arc:call op="appSendEmail" ></arc:call>
  </arc:if>
</arc:call>

注:

关于此段代码中涉及的参数说明如下:

(1)arc:call op=”portStatisticsTransactionLogs? 是我们需要调用StatisticsTransactionLogs里的记录,该记录中包含了EDI系统中每小时发送和接收文件的数量以及error的数量。

(2)Subject是邮件通知的主题,可以在value里面自定义,这里邮件的标题是Transaction Log Notify-2020.

(3)Message是邮件内容,可自定义,这里邮件内容是:The transaction log is Received:[output.Received] + Sent:[output.Sent] + Error:[output.Error] within the last hour, please check.。其中[output.Received]为一小时中接收到的文件数量,[output.Sent]是一小时中发送文件的数量,[output.Error]是失败文件的数量。

(4)To是收件人邮箱,可以配置多个收件人,多个邮箱间以英文逗号间隔。

代码逻辑:首先我们通过获取StatisticsTransactionLogs中的记录,在记录里获取到近一小时内Sent和Received以及Error对应的数值,将获取到的值写在我们邮件通知的内容中。

在Script端口写好代码后,我们需要打开自动接收并且选择每小时自动接收一次。

此时我们每小时就会收到EDI系统的邮件通知,汇总近一小时内收到的文件收发数量以及报错数量。

知识拓展:

除了上述的代码部署方式,我们也可以根据用户不同的需求来自定义部署。例如有的客户只想当系统近一小时传输文件数量少于某值时再进行邮件通知,而不是每小时都会接收到通知。我们就可以在上面的代码基础上进行修改来满足客户的需求。比如我们只想当遇到近一小时内EDI系统中发送接收以及报错的文件总数量少于100时再进行邮件通知的情况,我们可以这样修改代码:

<arc:call op="portStatisticsTransactionLogs?type=day" out="output">
  <!-- Only check transactions on the last hour (e.g. 02:00 to 03:00) -->
  <arc:if exp="[_index] == 2">
    <arc:if exp="([output.Received] + [output.Sent] + [output.Error]) < 100">
      <!-- Send Email -->
          <arc:set attr="Subject"    value="Transaction Log Notify-2020"></arc:set>
          <arc:set attr="Message"  value="The transaction log is Received:[output.Received] + Sent:[output.Sent] + Error:[output.Error] within the last hour, please check."></arc:set>
          <arc:set attr="To"    value="michaelw@kasoftware.cn"></arc:set>
          <arc:call op="appSendEmail" ></arc:call>
    </arc:if>
  </arc:if>
</arc:call>

修改的地方就是在配置邮件发送前添加了一个判断条件,判断Received和Sent以及Error三者加起来的数量是否少于100。

有的客户如果有每天收到邮件太多或者不经常看邮箱的情况时,我们配置邮件通知的方案可能就起不到很好的效果,那为了解决这样的问题我们同样可以用钉钉通知的方案替换邮件通知。修改后的代码如下:

<arc:call op="portStatisticsTransactionLogs?type=day" out="output">
  <!-- Only check transactions on the last hour (e.g. 02:00 to 03:00) -->
  <arc:if exp="[_index] == 2">
          <rsb:set attr="check.sslcert" value="*"/>
          <rsb:call op="httpGet" in="check">
          <rsb:catch code="*">
          <rsb:setattr="notify.url" value="https://oapi.dingtalk.com/robot/send?access_token=986e48ae3595afc58363adcf7da08a61549c6e66554fd77e84e6947e1dafe6d9"/>
          <rsb:setm item="notify">
           url= https://oapi.dingtalk.com/robot/send?access_token=986e48ae3595afc58363adcf7da08a61549c6e66554fd77e84e6947e1dafe6d9           
postdata = 
"at": "atMobiles":\\["18991281155"\\],"isAtAll":true,"text": "content":"收到:[output.Received] + Sent:[output.Sent] + Error:[output.Error] within the last hour, please check.","msgtype":"text"
           contenttype = application/json
    </rsb:setm>
    <rsb:call op="httpPost" in="notify" />
  </rsb:catch>
</rsb:call>
  </arc:if>
</arc:call>

修改的部分就是将邮件通知配置改为钉钉群通知配置,如何配置钉钉群通知可以参考官网之前的文章:调用REST端口实现钉钉通知

了解更多 EDI 信息,请参阅: EDI 是什么?

BAT的使用~如何把DIR查看的文件数量输出到一个TXT里

由于我每个小时都要查看我自己的一些文件数量,但我不用一个小时去看一次,每天看一次就可以了,想用一个BAT写,但不知道怎么写,可以让他,ctar:\>dir 只要一个文件的总数量就可以了,怎么写~~谢谢了~~
先谢谢各位,三楼的老师,如果不放到要查看的文件下面,结果输出也不要放在那下面怎么改啊~
而且我每一个小时对,18台电脑里的CTAR1:\> CTAR2:\> CTAR3:\> CTAR4:\> 都要查看,想把结果都输出到一个文本里,只看一个文本就可以知道每台电脑里的每个文件夹下面的数量~

谢谢~~

加100分

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo.>>统计文件个数.txt
if "%1"=="h" goto start
>%temp%\dj.vbs echo set ws=createobject("wscript.shell")
>>%temp%\dj.vbs echo do
>>%temp%\dj.vbs echo wscript.sleep 3600000
>>%temp%\dj.vbs echo ws.run """%~0"""+"h",0,true
>>%temp%\dj.vbs echo loop
start %temp%\dj.vbs

:start
for /f %%i in ('dir /b /a-d') do (
set /a s+=1
)
set /a s=s-2
echo %date% 系统时间%time:~0,5% 统计给文件夹下有: %s% 文件>>统计文件个数.txt

说明:上面是一个小时统计一次 批处理文件 所在 文件夹里面 的文件的 个数,统计数放在 叫 ”统计文件个数“里面的,
如果要改变统计时间 把上面的 3600000 数值改成你要统计时间的数值,该单位是毫秒,3600000就表示1个小时,3600000毫秒,如果是一秒,就改成 1000。
把上面的代码复制到记事本里面,保存为bat的格式,然后把该批处理文件放在要统计的文件夹里面,
注意:我把 该批处理文件和上面的统计数值的文件排除了,所以只统计你文件下的文件个数,不会统计这两个文件。

补充说明:要是该批处理不放在查看的文件夹下,就必须要写出统计的文件夹的路径,假如要查看c:\windows 下面的文件个数,就该上面的for /f %%i in ('dir /b /a-d')中()里面的内容,那么就是 ('dir /b /a-d c:\widows\*'),是不是只加了个 c:\windows\* ,就是这样,只加这个,*是通配符,表示所有文件。所以就写在这里。

要改变输入内容的文件,假如把上面的 “统计文件个数.txt”这个文件保存在 c: 下,那么上面的只改有 “统计文件个数.txt”字符的地方,把前面加上输入的路径就行的,那么就是 c:\统计文件个数.txt ,好,就是这样,
上面的代码就是这样:

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo.>>c:\统计文件个数.txt
if "%1"=="h" goto start
>%temp%\dj.vbs echo set ws=createobject("wscript.shell")
>>%temp%\dj.vbs echo do
>>%temp%\dj.vbs echo wscript.sleep 3600000
>>%temp%\dj.vbs echo ws.run """%~0"""+"h",0,true
>>%temp%\dj.vbs echo loop
start %temp%\dj.vbs

:start
for /f %%i in ('dir /b /a-d c:\windows\*') do (
set /a s+=1
)
echo %date% 系统时间%time:~0,5% 统计给文件夹下有: %s% 文件>>c:\统计文件个数.txt

注释:没有set /a s=s-2 ,因为刚是把该文件放在一个文件夹下的,所以要减去批处理和统计文件这两个文件 。

特别注意的是,如果上面改写的文件路径中有空格,必须用“”括起来,比如
C:\Documents and Settings\Administrator\桌面 这个路径,其中Documents and Settings 中就有空格,所以要加“”,所以就是 “C:\Documents and Settings\Administrator\桌面”上面()里面那个路径有空,也要加上“”,所以就是 ”c:\windows\*“
参考技术A @echo OFF
echo %date:~0,-3%%time:~0,-3% 监视开始,主目录:%1,工作目录:%CD% >>%2
:LOOP
dir %1 /A-D /S /B|find /V /C "/" >tmp
for /F %%I IN ('type tmp') do set fc=%%I
echo %date:~0,-3%%time:~0,-3% 文件数:%fc%。>>%2
timeout /T %3 /NOBREAK >NUL
GOTO LOOP

Usage:
另存为FileWatcher.Bat,执行FileWatcher 监视目录 日志保存目录 间隔时间
如:FileWatcher C:\WINDOWS\SYSTEM32\ D:\log.txt 3600
即为统计C:\WINDOWS\SYSTEM32目录及子目录的所有文件数量,每一小时(3600秒)把结果记录在D:\log.txt下。

Tips:
1.统计的是所有目录和子目录的文件(包含系统文件和隐藏文件),如果不合意思请自行更改批处理中dir命令的 /A-D和/S参数。
2.因为FOR /F不支持管道命令,因此把中间结果暂存到批处理所在目录的tmp文件中,请确保你拥有这个目录的完全控制权限。
3.批处理运行后不会中止也没有任何输出,要中止请按ctrl+break
4.期望的日期格式形如2009/12/30 08:28:30,在win7中%date%格式是2009/12/30 周三,%time%格式是 8:32:10.08因此用%date:~0,-3%%time:~0,-3%各裁剪掉倒数3个字符,如果你的系统格式不是这样请自行修改。

HaveFun~
参考技术B @echo off&for /f %%a in ('dir /s *.*') do echo %%a>>new.txt&for /f %%b in ('dir /s/b *.*') do echo %%b>>new.txt
pause

以上是关于如何监控1小时内EDI系统传输的文件数量?的主要内容,如果未能解决你的问题,请参考以下文章

EDI必备手册

EDI Capability 是什么?

.NET 中的 EDI 解析器

Target EDI 对接详解 1– Partner Online EDI 注册

读取 EDI 格式的文件

如何使用知行之桥EDI系统实现CSV和XML相互转化