近期,因工作需要,在行领导和处长的主持下,开发了SCO平台下的通用代工代扣接口系统,该系统采用bsh编程,利用awk中正则表达式的强大模式匹配功能来处理代工单位的工资文件(当然啦,必须先将工资文件转换为文本文件),取得了良好的效果,大大降低了银行网点业务员的劳动强度,提高了代工代扣业务的办理效率,现将源代码共享。
代工单位的工资文件大致有三种类型:文本文件、excel文件、dbf文件,银行方前端系统只能识别文本文件,且只需要工资文件中的“姓名”、“银行帐号或企业人员编号”、“实发或实扣金额”三个字段,因此需要将excel文件、dbf文件转换为文本文件后提交给银行方,转换工作很简单,既可由代工单位方来做,也可由银行方来做,步骤如下:
1、对于excel文件,直接在excel中将其“另存为”保存类型为“文本文件(制表符分隔)”的文件即可。
2、对于dbf文件,直接在“visual foxpro”中将其“导出”为类型为“Delimited Text”的文件,即以“逗号”作为字段分隔符的文本文件。
然后将文本文件拷贝到DOS格式的软盘上提供给银行网点,由网点业务员通过接口系统来操作。
通用代工代扣接口系统能识别以三种字符作为字段分隔符的文本文件:制表符、逗号、竖线。为什么不采用“空格”作为分隔符呢?因为工资文件中,“姓名”中可能包含了空格符,不便于分析和处理。如果有其他特定格式的,如:各字段定长的文本文件,工资文件中含有不需要的其他银行的银行帐号的,或采用其他字符作为字段分隔符的,这时需要编制特定的bsh小程序来进行预处理,若代工单位在银行方的单位编号为203,则该预处理的bsh小程序名为$HOME/bin/cpdisk203,在后面会举例说明。因此,通用代工代扣接口系统的适应性很广,具有良好的通用性。
功能模块如下:
1、单位管理(过程名为dwdzgl,在$HOME/bin/dgprog中定义,下面的功能模块也是如此)
定义单位编号、磁盘文件名、字段分隔符、银行帐号方向、银行帐号前缀。
单位编号:代工单位在银行方的代工单位编号,唯一索引。
磁盘文件名:代工单位提供的工资文件的文件名称(含后缀名),如:“713gz.txt”(不含双引号)。
字段分隔符:工资文件中列与列之间的分隔符,有三种:1.制表符、2.逗号、3.竖线,一般情况下为制表符。
银行帐号方向:指银行帐号的存放地点,有两种:1.在代工单位,2.在银行网点,一般情况下在代工单位。在银行网点时,工资文件中没有银行帐号,只有企业人员编号,需要在下面的功能模块“2、人员管理”中建立企业人员编号和银行帐号的对应关系。
银行帐号前缀:指代工单位将其员工的储蓄存折帐号录入到代工单位的工资管理系统时, 省去的储蓄存折帐号的前面部分,这部分省去的帐号针对该代工单位的所有储蓄存折帐号来说必须是相同的。一般情况下为空。
形成的文件为$HOME/qydg/dwdzb。
2、人员管理(过程名为djdzgl,仅当银行帐号方向在银行网点时有效)
代工单位的工资管理系统中,无法录入银行帐号,但可以提供企业员工的唯一编号或身份证号,这时需要银行网点人员在人员管理中建立企业人员编号与银行帐号的对应关系(工作量较大),不推荐使用这种模式,即银行帐号在银行网点的模式。
企业人员编号:长度1~18位,可以为身份证号,唯一索引。是字符串,不是数字。
银行帐号:可以为本省内的储蓄存折帐号、储蓄卡号或信用卡号,唯一索引。
对于每个银行帐号在银行网点的代工单位,形成一个文件,名为$HOME/qydg/djdzbXXXX,XXXX为单位编号。
3、磁盘拷入(过程名为cpdisk)
将代工单位的工资文件从软盘上拷入到本网点主机中。若报错,可能是工资文件名不正确或软盘或软盘驱动器有问题,程序会自动调用功能模块“6.查看磁盘”功能来显示磁盘的内容,并采用中文提示来显示磁盘上所有文件的文件名、大小、创建日期、创建时间,工资文件名不正确可以在“1.单位管理”中修改,其他情况下,请联系技术人员解决。
其中,会判断是否存在bsh小程序$HOME/bin/cpdiskXXXX,若存在,则调用它,该bsh小程序的输入为$HOME/temp/gzXXXX.tmp,输出也是$HOME/temp/gzXXXX.tmp,最后生成文件$HOME/temp/gzXXXX.1,该文件的字段分隔符必须与“单位管理”中定义的相同。
4、数据分析(过程名为sjfx)
根据单位管理中定义的字段分隔符来分析拷入到网点主机中的工资文件$HOME/temp/gzXXXX.1,输入"姓名"、"实发或实扣金额"、"银行帐号或企业人员编号"所在列的列号,根据列号分析出合计金额和合计人数,以便核对,银行帐号或企业人员编号重复的,会自动合并为一条记录,"实发或实扣金额"为0的程序不予以处理。若在数据分析过程中报错,出错原因可能是:
1)字段分隔符不正确,这种错误较少出现,这时会在终端屏幕上显示工资文件的部分内容,可以明显看到工资文件的字段分隔符,需要在单位管理中修改该单位的字段分隔符,然后重新做数据分析。
2)合计金额与合计人数不正确,特别是合计金额不正确,可能是代工单位提供的工资文件的格式有误或新增人员无银行帐号,需要联系代工单位解决这个问题,一般情况下不会出现这种问题。
其中,工资文件中的"实发或实扣金额"的千分位符(即逗号)会被替换为空,以方便分析和处理,当然啦,工资文件的字段分隔符此时可不能为“逗号”哟。还会将所有的无效的工资记录显示在屏幕上,并可选择是否打印出来。
最后,生成文件$HOME/temp/gzXXXX.2,无效记录文件$HOME/temp/gzXXXX.2.err。
5、单位处理(过程名为dwcl,目前仅适用于江西建行,你可以修改该模块以满足自己的需求)
根据“4.数据分析”的结果,输入代工单位编号,选择代工代扣类型,程序分析处理文件$HOME/temp/gzXXXX.2,先备份和删除该代工单位所对应的数据库表中的记录(备份前会判断本年本月本日是否做了备份,若有备份则不需备份,备份文件为$HOME/djbf/gzXXXX.mmdd,mmdd为月日),然后显示出成功转入到网点前端系统中(即数据库表中)的金额和人数,并且将错误部分的工资记录全部显示出来,并可以选择打印出错部分的工资录。若正确,网点人员可以启动相应的工代扣交易。
最后形成文件$HOME/temp/gzXXXX.3(可直接导入到数据库表中),出错文件gzXXXX.3.txt(银行帐号在代工单位)或gzXXXX.3.err(银行帐号在银行网点),出错打印文件gzXXXX.3.???.prn,“???”为“txt”或“err”。
6、查看磁盘(过程名为“help f 查看磁盘内容 7 35”,在$HOME/bin/dgbar中命名)
查看软盘上的文件列表。在“3.磁盘拷入”报错时,用于查看代工单位提供的工资文件的文件名,若显示不出文件名或显示出的文件名与“1.单位管理”中的磁盘文件名相符合,则表示软盘或软盘驱动器有问题,需联系技术人员解决;若显示出的文件名与“1.单位管理”中定义的磁盘文件名不符合时,必须在“1.单位管理”中更改磁盘文件名,并重新做“3.磁盘拷入”。
操作说明:
首次使用本系统时,应先做“1.单位管理”、“2.人员管理”(仅当银行帐号在银行网点时有效)。在代工单位每次代发或代扣工资时,依次做“3.磁盘拷入”、“4.数据分析”、“5.单位处理”,若在过程中报错,会有详细的出错提示,请根据出错提示做相应的处理。
安装说明:
在sco系统下,建立一用户,用户名和密码自定,将安装包在$HOME目录下解压缩并炸开,赋予$HOME/bin/dgmain文件以可执行的权限,在命令提示符下,输入dgmain并回车,即可体验到它的功能了。
重要提示:
对于特殊格式的工资文件,需要编制bsh小程序$HOME/bin/cpdiskXXXX,其中XXXX为单位编号,举例如下:
例1、 工资文件内容如下(以制表符为字段分隔符):
……
胡望 1507210601000417923 905.99
查惊乾 2030089980100134263 306.47
黄细文 1507210601000368567 658.92
杨进军 2030089980110000314 605.01
……
其中以203打头的长度至少为16位的才是我们需要的银行帐号,其余的为其他银行的帐号,在“1.单位管理”中定义该单位的字段分隔符为“制表符”,则cpdiskXXXX的内容如下:
cd $HOME/temp
fn=`basename $0`
fn=`echo $fn|cut -c7-`
fn=gz$fn.tmp
awk '{
clbz=0
for(i=1;i<=NF;i++)
{
if($i~/^[0-9]+$/&&length($i)>=16)
{
if($i~/^203/||$i~/^436742/||$i~/^53242/||$i~/^453242/)
{clbz=1;break}
else
{clbz=0;break}
}
}
if(clbz==1)
print $0
}' $fn >$fn.tmp
cp $fn.tmp $fn
例2、 工资文件内容如下(定长字段的文本文件):
……
刘少华 2030279980101044263 3,354.27
柯传发 2030279980101039057 2,603.94
陈卫健 2030279980101035220 2,598.74
蔡 平 2030279980100160722 2,603.86
……
其中,姓名所在列从第1-10列,帐号列从第11-29列,金额列从第35-44列,在“1.单位管理”中定义该单位的字段分隔符为“制表符”,则cpdiskXXXX的内容如下:
cd $HOME/temp
fn=`basename $0`
fn=`echo $fn|cut -c7-`
fn=gz$fn.tmp
awk '{
printf "%st%st%sn",substr($0,1,10),substr($0,11,21),substr($0,35,10)
}' $fn >$fn.tmp
cp $fn.tmp $fn
源码下载地址:
http://unix-cd.com/unixcd12/upload/article/df.tar.Z
请将其下载后在SCO平台上解压缩并解包即可。
|
|
|