首页 > 学技术 > 技术网文 > Linux Shell > 正文

[原创] [原创]SCO平台下的通用代工代扣接口系统


来源 chinaunix.net 酷勤网整理

近期,因工作需要,在行领导和处长的主持下,开发了SCO平台下的通用代工代扣接口系统,该系统采用bsh编程,利用awk中正则表达式的强大模式匹配功能来处理代工单位的工资文件(当然啦,必须先将工资文件转换为文本文件),取得了良好的效果,大大降低了银行网点业务员的劳动强度,提高了代工代扣业务的办理效率,现将源代码共享,以表示对chinaunix论坛的感谢和支持。如果您觉得很有实用价值,不必感谢我啦,请致电0792-8223568(熊行长)8110751(施处长)表示感谢。

代工单位的工资文件大致有三种类型:文本文件、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 "%s\t%s\t%sn",substr($0,1,10),substr($0,11,21),substr($0,35,10)
}' $fn >$fn.tmp
cp $fn.tmp $fn

[font=黑体][color=Blue]源码见附件,请将其下载后,用winrar解开,传到SCO平台上解压缩并炸包即可。[/color][/font]

[ 本帖最后由 hlm5097 于 2006-5-18 11:58 编辑 ]

TYDFGZ.tar.rar



 xy-coordinate 回复于:2005-11-01 10:55:59

不错呀!
拿来参考参考!
3KS!

0792是什么地方呀???:em02:

[ 本帖最后由 xy-coordinate 于 2005-11-1 11:18 编辑 ]


 hlm5097 回复于:2005-11-15 09:15:34

这么好的通用菜单和代工代扣接口。


 li2002 回复于:2005-11-15 09:58:33

学习之~~~是那家银行用这个?


 ljm1911 回复于:2005-11-15 15:10:18

不错呀


 hlm5097 回复于:2005-11-16 09:44:57

目前可在江西建行通用,只需修改“5.单位处理”模块,即可在所有的SCO平台上通用。

[ 本帖最后由 hlm5097 于 2005-11-16 15:19 编辑 ]


 mocou 回复于:2005-11-16 13:21:05

麻烦用过的各位将测试结果和使用情况回下贴

麻烦楼主将文件更名并上传到CU,谢谢
目前CU支持如下格式的文件
chm, pdf, zip, rar, tar, gz, bzip2, gif, jpg, jpeg, png


 光明晓仙 回复于:2005-11-16 15:50:11

高手啊,顶一下,好人啊..........


 c1l2d3 回复于:2005-11-17 08:51:13

真棒~~这是我所见过的最快最好的shell菜单系统。
但好象只有一个下级子菜单,改写成多级就完美啦


 hlm5097 回复于:2005-11-28 10:34:38

二级菜单的显示可以无限制(仅受限于屏幕的大小),三级或多级菜单我觉得没有太大必要,因为shell程序毕竟只擅长于在中小项目的应用中,倒是这种通用的代工代扣接口系统较难实现,让我花费了不少时间。
如果您觉得接口系统很实用,请致电0792-8223568(熊行长)8110751(施处长)表示感谢,也算是对我的支持。

[ 本帖最后由 hlm5097 于 2005-12-19 17:38 编辑 ]


 abist 回复于:2005-11-28 21:17:04

这个菜单真的不借,学习


 mocou 回复于:2005-11-28 21:39:59

引用:原帖由 hlm5097 于 2005-11-28 10:34 发表
二级菜单的显示可以无限制(仅受限于屏幕的大小),三级或多级菜单我觉得没有太大必要,因为shell程序毕竟只擅长于在中小项目的应用中,倒是这种通用的代工代扣接口系统较难实现,让我花费了不少时间。
如果您觉 ... 



为什么要致电感谢? 莫非这个行长是你顶头上司?


 hlm5097 回复于:2005-11-29 08:25:57

毕竟,接口系统是在领导的重视下才开发出来的,这是一个规则。


 hlm5097 回复于:2005-12-02 10:37:44

结构、功能模块说明:
$HOME/bin/dgmenu ->水平菜单定义
$HOME/bin/dgbar    ->下拉菜单定义
$HOME/bin/dgfunc  ->公用函数定义
$HOME/bin/dgprog ->自定义过程(或子程序)
$HOME/bin/dgmain ->主程序(包括系统初始化)
$HOME/bin/dg_help ->帮助文件(每行不超过78个字符)
系统保留变量(编写自定义过程时不能使用的变量):
DL、TTY、i、j、visual、itemcont*、itemx*、itemy*、MAXITM、dqj*、
barcont*、barx*、bary*、barts*、barprog*、MAXBAR*、MAXLN
另外,所有的公用函数名、自定义过程名、主程序中的函数和过程名不能重新进行定义。


 xchen301 回复于:2005-12-14 09:00:33

是九江~佩服佩服


 teatree 回复于:2005-12-14 13:30:59

引用:原帖由 hlm5097 于 2005-11-29 08:25 发表
毕竟,接口系统是在领导的重视下才开发出来的,这是一个规则。 


有没有money???:mrgreen:


 hlm5097 回复于:2005-12-15 12:34:25

no money but honor。


 teatree 回复于:2005-12-16 03:15:35

引用:原帖由 hlm5097 于 2005-12-15 12:34 发表
no money but honor。 


我也是建行的,以后要多向你学习.


 hlm5097 回复于:2005-12-20 10:51:54

请大家将测试结果,以及意见和建议回复出来,毕竟个人的力量是有限的,也许您有更好的思路和模式。


 hlm5097 回复于:2006-05-18 14:53:02

1、修改了dgmain中的子程序xtcsh(系统初始化),使在dgmenu和dgbar中进行菜单定义更灵活(不必严格按顺序定义)
2、修改了dgprog中的子程序sjfx(数据分析),原来判断重复的帐号或企业人员编号采用数组遍历的方法,现利用awk中数组下标为字符串的特点来解决,大大加快了程序的分析处理速度。


 xxjoyjn 回复于:2006-05-18 14:58:16

引用:原帖由 mocou 于 2005-11-28 21:39 发表


为什么要致电感谢? 莫非这个行长是你顶头上司? 



这还用问?我刚才打电话了,关机:mrgreen::mrgreen::mrgreen:


 herolyh 回复于:2006-05-19 10:20:16

很好用!!!向楼主学习!!


 cjabis 回复于:2006-05-20 22:10:12

请老大多编一些实用小程序,供同志们参考。
顶!


 herolyh 回复于:2006-05-23 11:02:06

问一个问题,请回答:
stty min 0 time 2;getc ch;stty min 1 time 1
这段代码是什么意思?不理解!!


 hlm5097 回复于:2006-05-23 11:18:27

stty min 0 time 2;getc ch
表示在2毫秒内等待输入至少零个字符,如果在2毫秒内没有输入字符,则变量ch保持原有的值
stty min 1 time 1
表示将终端设置为缺省的响应方式,即在1毫秒内等待输入至少1个字符,如果在1毫秒内没有输入字符,则一直等待下去


 longtor 回复于:2006-06-14 16:03:45

有UNIX下的,EXCELL格式转换成TXT文本格式的程序吗?SHELL能做得到吗?


 teatree 回复于:2006-10-08 20:46:24

引用:原帖由 longtor 于 2006-6-14 16:03 发表
有UNIX下的,EXCELL格式转换成TXT文本格式的程序吗?SHELL能做得到吗? 


同问!!!!


 hlm5097 回复于:2006-10-09 10:53:48

引用:原帖由 teatree 于 2006-10-8 20:46 发表

同问!!!! 


shell中很难实现这个功能。perl或php中或许能实现。
其实,将excel或foxpro文件转换为特定格式的文本文件是非常方便的,只需点几下鼠标即可。


 doosen 回复于:2006-10-09 17:12:58

rtrtrtrt


 cocoa1227 回复于:2006-10-10 15:20:15

我的积分太低了,下不了


 enjoy48 回复于:2006-10-11 20:22:08

正在研究程序,在Aix+ksh+Neterm(VT100)下能正常运行,但是在ubuntu+bash+xterm下好像不能正常运行,查了些资料,还是不太明白v_graph函数,可否提示一下或给个链接?


 cyxcyx 回复于:2006-10-12 19:40:28

不错!先下载学习


 hlm5097 回复于:2006-10-13 11:04:27

引用:原帖由 enjoy48 于 2006-10-11 20:22 发表
正在研究程序,在Aix+ksh+Neterm(VT100)下能正常运行,但是在ubuntu+bash+xterm下好像不能正常运行,查了些资料,还是不太明白v_graph函数,可否提示一下或给个链接? 


接口系统仅适合在SCO平台下的bourne shell或ksh环境下运行;
v_graph 0   表示终端设置为字符模式
v_graph 1   表示终端设置为图形模式,在该模式下,26个小写英文字母中的一部分在终端上显示为特殊的图形(只占一个字符大小),设计的参照为黄石建行版的综合业务网的c源代码。


 enjoy48 回复于:2006-10-13 19:46:43

呵呵,我已经弄明白了,并且已经迁移到了我现在的环境(ubuntu+bash+xterm),另外加了适当的注释,过段时间再传上来。
谢谢楼主的程序!


 enjoy48 回复于:2006-10-15 22:51:10

非常感谢楼主的源程序,一直对菜单很感兴趣,通过这个程序大致明白了一些知识。
原程序在bash上似乎不能正常运行,于是我边学习边修改,顺便加了一些注释,现在该程序已经能顺利在我的"GNU bash, version 3.1.17"上正常运行了。
原计划再完善完善的,但是周末看了一些帖子感觉自己要学的方面实在太多,这个东东就等以后需要用的时候再去完善吧,
厚着脸皮将此注释版也发上来,希望初学者能更快理解:)

menu.tar


 wuleisky 回复于:2006-10-23 09:53:55

我看了比较长的时间,不知道怎么理解很多函数
我下了
谢谢
另外想问下echo -ne "\033[7m\c";
这个东西怎么去自己理解,参考什么?


 hlm5097 回复于:2006-11-15 17:24:55

引用:原帖由 wuleisky 于 2006-10-23 09:53 发表
我看了比较长的时间,不知道怎么理解很多函数
我下了
谢谢
另外想问下echo -ne "\033[7m\c";
这个东西怎么去自己理解,参考什么? 


参考终端使用手册,如实达、国光、新大陆等。




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=638338
转载请注明作者名及原文出处



收藏本页到: