etc卡能在自动取款机可以存钱吗上取钱吗

工商银行卡不能在自动取款机上取钱,却能在网上消费_百度知道
工商银行卡不能在自动取款机上取钱,却能在网上消费
我有更好的答案
应该是银行的问题
我农行的卡也与到过
在别的银行也提不出来
法规和法国合法化
其他类似问题
为您推荐:
工商银行卡的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁ATM 系统需求分析设计与改进 目录1.引言............................................................................................................................................. 1 1.1 编写目的.....
....................................................................................................................... 1 1.2 定义.................................................................................................................................... 1 2.总体设计..................................................................................................................................... 1 2.1 需求概述............................................................................................................................ 1 2.2 软件结构............................................................................................................................ 2 3. ATM 自动取款机系统分析设计 .................................................................................................. 2 3.1 定义业务流程................................................................................................................. 2 3.2 业务流程......................................................................................................................... 4 3.2.1 银行管理员 ATM 自动取款机 .......................................................................... 4 3.2.2 客户 ATM 自动取款机 ........................................................................................ 6 3.3 系统范围...................................................................................................................... 12 3.3.1 客户包下可启动的系统用例 ........................................................................... 12 3.3.2 银行管理员包下的系统用例图 ....................................................................... 13 3.4 分析业务流程................................................................................................................. 13 3.4.1 atm001-查询余额业务系统用例 ....................................................................... 13 3.4.2 atm002-存款系统用例业务 ............................................................................... 14 3.4.3 atm003-取款系统用例业务 ............................................................................... 14 3.4.4 atm004-转账业务系统用例 ............................................................................... 15 3.4.5 atm005- 修改密码业务系统用例 ..................................................................... 16 3.5.6 业务规则状态图(取款) ................................................................................... 17 4. ATM 系统开发测试环境 ........................................................................................................... 18 4.1 开发环境........................................................................................................................... 18 4.2 目录设置........................................................................................................................... 18 4.3 服务器客户端程序 ........................................................................................................... 18 4.4 交易命名........................................................................................................................... 18 4.5 错误码............................................................................................................................... 19 4.6 测试环境........................................................................................................................... 19 4.7 参考文档........................................................................................................................... 19 5. ATM 数据库的创建 ................................................................................................................... 19 5.1 ATM 自动取款机关联系统数据表结构.......................................................................... 19 5.1.1 客户信息―存储客户基本信息表(customermessage_iq) .............................. 19 5.1.2 银行卡信息―存储客户银行卡基本信息表(cardinfo_iq) ............................ 20 5.1.3 交易流水―记录交易流水表(tradelist_iq) .................................................. 20 5.1.4 黑名单―黑名单增删改查表(blacklist_iq) .................................................. 20 5.2 数据库建表语句.............................................................................................................. 21 5.2.1 客户信息―存储客户基本信息表(customermessage_iq) .............................. 21 5.2.2 银行卡信息―存储客户银行卡基本信息表(cardinfo_iq) ............................ 21 5.2.3 交易流水―记录交易流水表(tradelist_iq) .................................................. 22 5.2.4 黑名单―黑名单增删改查表(blacklist_iq) .................................................. 22 6.程序描述..................................................................................................................................... 23 6.1 银行管理员 ATM 自动取款机 ........................................................................................ 23 6.2 客户 ATM 自动取款机 .................................................................................................... 26 6.2.1 取款子系统 ........................................................................................................... 26 6.2.2 存款子系统 ............................................................................................................ 30 6.2.3 转账子系统 ........................................................................................................... 33 6.2.4 查询余额子系统 ................................................................................................... 37 6.2.4.10 测试要点 ........................................................................................................... 40 6.2.5 修改密码子系统 ................................................................................................... 40 6.程序 ............................................................................................................................................. 43 6.1 atm006.ec .......................................................................................................................... 43 6.2 atm006.h............................................................................................................................ 73 五、详细设计说明书1.引言1.1 编写目的ATM 自动取款机系统是银行业务流程过程中十分重要且必备的环节之一, 在 银行业务流程当中起着承上启下的作用,其重要性不言而喻。但是,目前许多银 行在具体的一些业务流程处理过程中仍然使用手工操作的方式来实施,不仅费 时、费力,效率低下,而且无法达到理想的效果。为此,我们在明确该软件需求 的基础上,安排项目规划与进度、组织软件开发与测试,撰写本文档。本文档针 对上述问题, 采用软件工程的开发原理, 依据软件流程过程规范, 按照需求分析, 概要设计,程序编码,软件应用等过程,开发了这个系统。1.2 定义专业术语与缩略词 帐号:在银行中,事物应用的单个帐号。每个顾客可以拥有多个帐号。 用户:拥有银行的一个或多个帐号的人。可以是一个人或多个人,或者是公司。 相同的人,拥有不同的银行帐号被认为是不同的落户。 ATM:ATM 是 Automatic Teller Machine 的缩写,意为自动取款机。是一种高度 精密的机电一体化设备,利用磁卡或智能 IC 卡储存用户信息并通过加密键盘输 入密码然后通过银行内部网络验证并进行各种交易的金融自助设备。2.总体设计2.1 需求概述随着科技的发展,人们生活水平的不断提高,高性能高效率的产品越来越 受到人们的欢迎。 ATM 自动取款机是一种非常智能的机器,人们可以直接与它 交互,代替以前的手工操作,大大提高了银行的工作效率。针对银行业务种类繁1 五、详细设计说明书多、客户需求量大等现象,为了减少银行人员的工作任务,方便客户,使用户自 己就可以在 ATM 机上存款、取款、查询余额、转账、修改密码、打印凭条、退卡 等基础功能。在这样的需求下我们模拟开发了 ATM 自动取款机系统。2.2 软件结构系统的层次结构图如图 2.1ATM自动取款机系 统柜台ATM自动 取款机注册注销修改密 码存款模 块取款模 块转账模 块修改密 码模块余额查 询模块图 2.1 系统的层次结构3. ATM 自动取款机系统分析设计3.1 定义业务流程ATM 自动取款机系统业务用例图. 该系统主要有两个执行者: 银行管理员和客户。 银行管理员会启动或参与的业务主要有 注册客户、注销客户、修改密码。客户启动或参与的业务主要有修改密码、取钱、转账和查 询余额。2 五、详细设计说明书注册注销修改密码 银行管理员查询余额 ATM系统 存款取款 客户 转账图 3-1 银行管理员 ATM 自动取款机业务用例 业务用例名称 (1)注册客户 (2)注销客户 (3)修改密码 客户 ATM 自动取款机业务用例 业务用例名称 (1)修改密码 (2)存钱 简述 客户于 ATM 自动取款机上可以进行修改密码业务操作 客户于 ATM 自动取款机上可以进行存钱操作3简述 银行管理员协助客户注册客户 银行管理员协助客户注销客户 银行管理员协助客户修改密码 五、详细设计说明书(3)取钱 (4)查询余额 (5)转账客户于 ATM 自动取款机上可以进行取钱操作 客户于 ATM 自动取款机上可以进行查询余额操作 客户于 ATM 自动取款机上可以进行转账操作3.23.2.1业务流程 银行管理员 ATM 自动取款机3.2.1.1 银行管理员注册客户流程图银行管理员获得权限后, 根据屏幕提示依次输入客户名称、身份证,系统验证身份证正 确性,若不正确,退出程序,若正确, 根据屏幕提示继续依次输入住址、手机号,系统验手机 号正确性,若不正确,退出程序,若正确,客户根据提示输入两次密码,系统验证密码一致性,若 不正确,重新输入密码,若输入密码正确, 银行管理员根据屏幕提示输入存钱金额,系统保存 信息,退出服务。开始输入身份证号输入客户名称是校验身份证 号 是否正确否输入住址输入手机号校验手机号 是否有误 否校验密码是 否一致再次输入密码否校验密码是 否合法输入密码否输入存款金额 是是结束是4 五、详细设计说明书3.2.1.2 银行管理员注消客户流程图银行管理员首先根据屏幕提示输入卡号,系统验证卡号正确性,若不正确, 最后退出服务,若 正确根据屏幕提示输入密码,系统验证密码正确性,若不正确,重新输入密码,若连续输入密码 三次不正确,退出服务.若输入密码正确, 删除客户,最后退出服务。开始输入卡号校验卡号是否正 确 是是否输入密码系统校验密码(输 入超3次)否校验密码是否有误是否结束删除客户3.2.1.3 银行管理员修改密码流程图银行管理员首先根据屏幕提示输入卡号,系统验证卡号正确性,若不正确, 最后退出服务,若 正确客户根据提示输入两次密码,系统验证密码一致性,若不正确,重新输入密码,若输入密码 正确, 更改密码,最后退出服务。5 五、详细设计说明书开始校验卡号是 否正确输入卡号是 校验密码是否 合法 校验密码是否 一致输入密码是再次输入密码否否是结束修改密码3.2.2客户 ATM 自动取款机3.2.2.1 客户取款业务流程图.客户首先根据屏幕提示输入卡号,系统验证卡号正确性,若不正确, 最后退出服务,若正 确客户根据提示输入密码,系统验证密码正确性,若不正确,重新输入密码,若连续输入密码三 次不正确,退出服务.若输入密码正确,客户根据屏幕提示选择存款服务,进入存款服务界面。 根 据界面提示选择要存的金额。系统更新余额。最后退出服务。6 五、详细设计说明书开始 输入卡号 校验卡号校验卡号是否 正确是输入密码系统校验密码 (输入超3次)否校验密码是否 有误否冻结是否 否系统验证存款 钱币是否合法否 客户选择服 务器类型 是 否 黑名单 是放入钱币存款是保存到数据库结束3.2.2.2 客户取款业务流程图.客户首先根据屏幕提示输入卡号,系统验证卡号正确性,若不正确, 最后退出服务,若正 确客户根据提示输入密码,系统验证密码正确性,若不正确,重新输入密码,若连续输入密码三 次不正确,退出服务.若输入密码正确,客户根据屏幕提示选择取款服务,进入取款服务界面。 根 据界面提示选择要取的金额。 系统验证此金额的的合法性, 看是否是大于余额, 如通过验证, 系统出钞票,提示成功。7 五、详细设计说明书开始 输入卡号 校验卡号校验卡号是否 正确是输入密码系统校验密码 (输入超3次) 否否校验密码是否 有误否冻结是否系统验证取款 数额是否合法 是 吐钱机(吐钱)否 客户选择服 务器类型是输入取款数额取款否黑名单是结束图 3-23.2.2.3 客户转账业务流程图.客户首先根据屏幕提示输入卡号,系统验证卡号正确性,若不正确, 最后退出服务,若正 确客户根据提示输入密码,系统验证密码正确性,若不正确,重新输入密码,若连续输入密码三 次不正确,退出服务.若输入密码正确,客户根据屏幕提示选择转账服务,进入转账/汇款的操作 界面,选择要转入卡的账户类型(银行卡或存折) ,然后输入所要转入卡的卡号,输入转账金 额,系统更改余额。8 五、详细设计说明书开始输入卡号校验卡号校验卡号是 否正确是输入密码系统校验密码 (输入超3次)否校验密码是 否有误否冻结是否 否输入要转入卡 号 输入要转入金 额选择转入卡的 类型 系统验证金 额法性转账客户选择服务 器类型否黑名单是是是 否系统转账结束图 3-33.2.2.4 客户修改密码业务流程图客户首先根据屏幕提示输入卡号,系统验证卡号正确性,若不正确, 最后退出服务,若正 确客户根据提示输入密码,系统验证密码正确性,若不正确,重新输入密码,若连续输入密码三 次不正确,退出服务.若输入密码正确,客户根据屏幕提示选择修改密码服务,进入修改密码服 务界面。根据语音及界面提示两次输入客户欲设置的新密码。系统验证新密码的合法性,看 是否是六位数,两次输入是否一致等。如通过验证,系统通过 AYM 屏幕提示客户密码修改 成功。9 五、详细设计说明书开始 输入卡号 校验卡号 否校验卡号是否 正确是输入密码系统校验密码 (输入超3次)否校验密码是否 有误输入新密码判断是否合法更改密码是判断是否 一致再次输入新密 码结束否否图 3-43.2.2.5 客户查询余额业务流程图客户首先根据屏幕提示输入卡号,系统验证卡号正确性,若不正确, 最后退出服务,若正 确客户根据提示输入密码,系统验证密码正确性,若不正确,重新输入密码,若连续输入密码三 次不正确,退出服务.若输入密码正确,客户根据屏幕提示选择查询余额服务,进入查询余额服 务界面。ATM 机显示余额给客户.10 五、详细设计说明书开始 输入卡号 校验卡号校验卡号是否 正确是输入密码系统校验密码 (输入超3次)否校验密码是否 有误否冻结是否否 客户选择服 务器类型 是 否 黑名单 是查询并显示余 额查询余额结束图 3-511 五、详细设计说明书3.33.3.1系统范围.客户包下可启动的系统用例修改密码查询余额存款取款 客户 转账图 3-6 系统用例名称 (1)转账 (2)存款 (3)取款 (4)修改密码 (5)查询余额 简述ATM系统客 户 到 AT M 机 使 用 系 统 执 行 转 账 业 务 客户到 ATM 机使用系统执行存款业务 客户到 ATM 机使用系统执行取款业务 客户到 ATM 机使用系统执行修改密码操作 客户到 ATM 机使用系统执行查询余额操作12 五、详细设计说明书3.3.2银行管理员包下的系统用例图注册注销修改密码 银行管理员图 3-7 业务用例名称 (1)注册客户 (2)注销客户 (3)修改密码 简述 银行管理员协助客户注册客户 银行管理员协助客户注销客户 银行管理员协助客户修改密码ATM系统3.4 分析业务流程3.4.1 atm001-查询余额业务系统用例用例名称 用例编号 用例简述 用例图查询余额 atm001 客户在 ATM 机上查询余额主要流程(1) 系统提示输入账号 (2) 客户输入卡号并通过系统验证13 五、详细设计说明书(3) (4) (5) (6) (7) 替代流程系统提示输入密码。 客户输入密码并通过系统验证 系统列出服务项目 客户选择查询余额,按下确定键。 ATM 系统屏幕显示客户账户余额与可用余额3)a[密码错误]系统出现密码错误警告。并返回主要流程(2) ,供客户重新输 入密码3.4.2 atm002-存款系统用例业务用例名称 用例编号 用例简述 用例图 取款 atm001 客户在 ATM 机上取款主要流程(1) (2) (3) (4) (5) (6) (7)系统提示输入账号 客户输入账号并通过系统验证 系统提示输入密码。 客户输入密码并通过系统验证 系统列出服务项目 客户选择存款,输入取存款金额,按下确定键。 系统更改余额,交易成立替代流程(1)a[密码错误]系统出现密码错误警告。并返回主要流程(2) ,供客户重新 输入密码3.4.3 atm003-取款系统用例业务用例名称 用例编号 用例简述 取款 atm001 客户在 ATM 机上取款14 五、详细设计说明书用例图主要流程(1) (2) (3) (4) (5) (6) (7) (8)系统提示输入账号 客户输入账号并通过系统验证 系统提示输入密码。 客户输入密码并通过系统验证 系统列出服务项目 客户选择取款,输入取款金额,按下确定键。 系统连接到综存系统,查询账户余额,确认余额是否足够。 吐款机吐款,交易成立替代流程(3)a[密码错误]系统出现密码错误警告。并返回主要流程(2) ,供客户重新 输入密码 (6) a[金额不符]系统出现取款金额必须为 50 元整数的信息, 回到主要流程 , (5) 供客户重新输入取款金额 (6)b[金额过低]系统出现最低取款的信息,回到主要流程(5) ,供客户重新输 入取款金额 (6)c [金额过高]系统出现最高取款的信息,回到主要流程(5) ,供客户重新输 入取款金额 (7)a[余额不足]系统出现余额不足的信息,回到主要流程(5) ,供客户重新 输入取款金额3.4.4 atm004-转账业务系统用例用例名称 用例编号 用例简述 用例图 转账 atm004 客户 ATM 机上转账主要流程(1) 系统提示输入账号15 五、详细设计说明书(2) (3) (4) (5) (6) (7) (8) (9) (10) (11) 替代流程客户输入账号并通过系统验证 系统提示输入密码。 客户输入密码并通过系统验证 系统列出服务项目 客户选择转账, 系统提示输入转入账号 客户输入账号并通过系统验证 输入转账金额,按下确定键。 查询账户余额,确认余额是否足够。 交易成立。3)a[密码错误]系统出现密码错误警告。并返回主要流程(2) ,供客户重新输 入密码 (6) a[金额不符]系统出现转账金额必须为 50 元整数的信息, 回到主要流程 , (5) 供客户重新输入取款金额 (6)b[金额过低]系统出现最低取款的信息,回到主要流程(5) ,供客户重新输 入取款金额 (6c[金额过高]系统出现最高取款的信息,回到主要流程(5) ,供客户重新输 入取款金额 (7)a[余额不足]系统出现余额不足的信息,回到主要流程(5) ,供客户重新输入 取款金额3.4.5 atm005- 修改密码业务系统用例用例名称 用例编号 用例简述 用例图修改密码atm005客户在 ATM 机上修改客户密码主要流程(1) (2) (3) (4) (5) (6)系统提示输入账号 客户输入账号并通过系统验证 系统提示输入密码。 客户输入密码并通过系统验证 系统列出服务项目 客户选择修改密码,按下确定键。16 五、详细设计说明书(7) 客户连续 2 次输入新密码,并通过校验。 (8) 系统更改密码 替代流程 1)a[密码错误]系统出现密码错误警告。并返回主要流程(2) ,供客户重新输 入密码 2)a[密码不符]系统出现密码格式必须为 6 位数字的信息,回到主要流程(5) , 供客户重新输入新密码。3.5.6 业务规则状态图(取款)客户取款业务的状态分析:从客户插入磁卡的起始状态到结状态,中间还有输入密码,选 择服务,取款,吐款状态. (1)客户插入磁卡初始化 ATM 系统屏幕,进入屏幕提示输入密码界面,客户此时可 有输入密码动作(DoAction) 。 (2)若密码输入不正确,返回输入密码,若三次输入不正确,退卡。若密码通过系统 验证, 进入选择服务类型界面。 此时客户的动作可以为选择取款, 选择修改密码, 选择转账, 选择查询爷额。 (3)若客户选择取款服务后进入取款界面,此时客户可以动作为输入取款数额。 (40 若输入取款数额不合法,退卡。系统验证取款熟额合法后,进入吐款机吐款状态。17 五、详细设计说明书4. ATM 系统开发测试环境4.1 开发环境开发主机:10.10.10.10 开发操作系统 suse linux10u3 登录用户名/密码:bankht/123456 开发数据库 sybase ase15.0 库名:comoa 用户/密码:comoa/1234564.2 目录设置开发目录:/home/bankht/ aps/aps_bmd/epps 头文件目录 include 静态库目录 lib 静态库源码 libsrc 动态库目录/home/bankht/ ap/lib 动态库源码 sosrc 数据库脚本目录 sql 二进制程序目录/home/bankht /ap/bin 源码目录 src4.3 服务器客户端程序服务器进程 IP 是 127.0.0.1 端口 7007 进程名/home/bankht /ap/bin/aps_sc 配置文件/home/bankht/ ap/etc/aps_sc.xml 使用命令 ./aps_sc ../etc/aps_sc.xml 客户端程序名/home/bankht /ap/bin/aps_call_epps 总配置文件/home/bankhtap/bin/aps_bmd_call_epps.xml 各个报文配置文件目录/home/bankht/cCompass/ap/etc 使用命令:./aps_call_epps ../etc/发送报文.xml4.4 交易命名源码文件命名按照详细设计文档里面的交易码或程序名来命名 配置文件即发送报文命名按照详细设计文档里面的交易码或程序名来命名+.xml18 五、详细设计说明书4.5 错误码错误码查询数据库 aps_errcode 表中 EEPPS 开头的错误码 表中不包含错误码,通知添加4.6 测试环境配置文件即发送报文目录是/home/bankht/cCompass/ap/eppsetc 测试命令为 cd ~/cCompass/ap/bin ./aps_call ../eppsetc/发送报文.xml4.7 参考文档编码规范参考《综合应用前置@编程规范@.doc》 bel 库函数参考《综合应用前置@开发参考手册@.doc》 aps 开发参考《aps 配置说明文档.doc》5. ATM 数据库的创建5.1 ATM 自动取款机关联系统数据表结构5.1.1 客户信息―存储客户基本信息表(customermessage_iq)序号 字段名 标识 数据类型 主键 默 认 值 1 2 3 4 5 卡号 客户名称 身份证 住址 手机号 是 否 NULL 数据字典表来源 备注cm_accountid cm_cusname cm_idno cm_addresscm_phonenuchar(19) char(20) char(18) char(60) char(11)PK非空PK非空19 五、详细设计说明书6办卡日期cm_recorddatechar(8)5.1.2 银行卡信息―存储客户银行卡基本信息表(cardinfo_iq)序号字段名标识数据类型主键默 认 值是 否 NULL数据字典表来源备注1 2 3 4卡号 密码 账户状态 剩余金额ci_accountid ci_password ci_accountstate ci_balancechar(19) char(6) char(1) decimal(18,2)PK非空5.1.3 交易流水―记录交易流水表(tradelist_iq)序号 字段名 标识 数据类型 主 键 默 认 值 是 否 NU LL 1 交易流水 号 2 3 5 5 6 卡号 自动取款 机编号 取款 存款 余额 交易时间 数据字典表来源 备注tl_tradeid tl_accountid tl_atmid tl_withdraw tl_deposit tl_restmony tl_tradedateInt char(19) char(6) Int int decimal(18,2 ) char(8)非 PK 空75.1.4 黑名单―黑名单增删改查表(blacklist_iq)序号 字段名 标识 数据类型 主 键 默 认 值 1 卡号 是 否 NUL L 非空 数据字典表来源 备注bl_accountidchar(19)P K 20 五、详细设计说明书5.2 数据库建表语句5.2.1 客户信息―存储客户基本信息表(customermessage_iq)if exists (select 1 from sysobjects where id = object_id('customermessage_iq') and type = 'U') drop table customermessage_iq go create table customermessage_iq( cm_accountid cm_cusname cm_idno cm_address cm_phonenu cm_recorddate ) gochar(19) char(20) char(18) char(60) char(11) char(8)not null, null, not null, null, null, nullcreate unique index customermessage_iq_index on customermessage_iq( cm_accountid, cm_idno ) go5.2.2 银行卡信息―存储客户银行卡基本信息表(cardinfo_iq)if exists (select 1 from sysobjects where id = object_id('cardinfo_iq') and type = 'U') drop table cardinfo_iq go create table cardinfo_iq( ci_accountid ci_password ci_accountstate ci_balancechar(19) char(6) char(1) decimal(18,2)21not null, null, null, null 五、详细设计说明书) go create unique index cardinfo_iq_index on cardinfo_iq ( ci_accountid ) go5.2.3 交易流水―记录交易流水表(tradelist_iq)if exists (select 1 from sysobjects where id = object_id('tradelist_iq') and type = 'U') drop table tradelist_iq go create table tradelist_iq( tl_tradeid tl_accountid tl_atmid tl_withdraw tl_deposit tl_restmony tl_tradedate ) goint char(19) char(6) int int decimal(18,2) char(8)not null, null, null, null, null, null, nullcreate unique index tradelist_iq_index on tradelist_iq( tl_tradeid ) go5.2.4 黑名单―黑名单增删改查表(blacklist_iq)if exists (select 1 from sysobjects where id = object_id('blacklist_iq') and type = 'U') drop table blacklist_iq go create table blacklist_iq(22 五、详细设计说明书bl_accountid ) gochar(19)not nullcreate unique index blacklist_iq_index on blacklist_iq( bl_accountid ) go6.程序描述6.1 银行管理员 ATM 自动取款机 6.1.1 取款子系统6.1.1.1 功能用户可以在 ATM 自动取款机上完成取款的操作。6.11.2 性能在取款的时候,ATM 自动取款机的反应时间不能超过 2 秒,在 45 秒内完成 所有的取款动作,否则自动退卡。6.1.1.3 输入项目表 3-1 取款的输入项目名称 卡号 密码 取款金额类型 char(19) 卡号结构为: + 9 位顺序号+1 位校验码int(6 位整数) int(100 的整数倍,不能超过 2500)23 五、详细设计说明书6.11.4 输出项目表 3-2 取款的输出项目名称 交易成功类型 文本6.1.1.5 算法图 3.8 取款的活动图24 五、详细设计说明书6.1.1.6 程序逻辑InsertCard User : NewClass 1: 插卡VerifyloginWithdrawFun dsDataBase2: 核实信息 3: 验证信息 4: 返回信息 5: 登录 6: 取款 7: 存入数据库 8: 返回信息图 3.9 取款的时序图6.1.1.7 接口系统程序内部在功能模块下设置的程序接口见表 3-3,图 3.10表 3-3 取款的软件接口函数 CheckAccountId(char *pszAccountId) CheckPassword(char *pszPassword,char *pszAccountId) CheckAccountState(char *pszAccountId) CheckBlackList(char *pszAccountId) WithdrawFunds()输入 卡号 密码、卡号输出 RESULT 返回值 RESULT 返回值卡号 卡号 金额RESULT 返回值 RESULT 返回值 RESULT 返回值25 五、详细设计说明书图 3.10 取款的类图6.1.1.8 存储分配账户表 储蓄卡表 ATM 表 清单表6.1.1.9 限制条件ATM 自动取款机中纸币没有了。6.1.1.10 测试要点因为好的产品才能得到用户的认可和肯定,所以要对系统的反应速度、准 确性(输入的金额数和吐钱机吐出的钱数要一致)和安全性,以及系统的稳定应 有非常高的要求。6.2 客户 ATM 自动取款机 6.2.1 取款子系统6.2.1.1 功能用户可以在 ATM 自动取款机上完成取款的操作。26 五、详细设计说明书6.2.1.2 性能在取款的时候,ATM 自动取款机的反应时间不能超过 2 秒,在 45 秒内完成 所有的取款动作,否则自动退卡。6.2.1.3 输入项目表 3-1 取款的输入项目名称 卡号 密码 取款金额类型 char(19) 卡号结构为: + 9 位顺序号+1 位校验码int(6 位整数) int(100 的整数倍,不能超过 2500)6.2.1.4 输出项目表 3-2 取款的输出项目名称 交易成功类型 文本27 五、详细设计说明书6.2.1.5 算法图 3.8 取款的活动图28 五、详细设计说明书6.2.1.6 程序逻辑InsertCard User : NewClass 1: 插卡VerifyloginWithdrawFun dsDataBase2: 核实信息 3: 验证信息 4: 返回信息 5: 登录 6: 取款 7: 存入数据库 8: 返回信息图 3.9 取款的时序图6.2.1.7 接口系统程序内部在功能模块下设置的程序接口见表 3-3,图 3.10表 3-3 取款的软件接口函数 CheckAccountId(char *pszAccountId) CheckPassword(char *pszPassword,char *pszAccountId) CheckAccountState(char *pszAccountId) CheckBlackList(char *pszAccountId) WithdrawFunds()输入 卡号 密码、卡号输出 RESULT 返回值 RESULT 返回值卡号 卡号 金额RESULT 返回值 RESULT 返回值 RESULT 返回值29 五、详细设计说明书图 3.10 取款的类图6.2.1.8 存储分配账户表 储蓄卡表 ATM 表 清单表6.2.1.9 限制条件ATM 自动取款机中纸币没有了。6.2.1.10 测试要点因为好的产品才能得到用户的认可和肯定,所以要对系统的反应速度、准 确性(输入的金额数和吐钱机吐出的钱数要一致)和安全性,以及系统的稳定应 有非常高的要求。6.2.2 存款子系统6.2.2.1 功能用户可以通过和 ATM 自动取款机交互,完成存款的操作。6.2.2.2 性能系统的反应时间是不能超过 2 秒,完成取款操作的时间不能超过 30 秒。30 五、详细设计说明书6.2.2.3 输入项目表 3-4 存款子系统的输入项目名称 卡号 密码 金额类型 char(19) 卡号结构为: + 9 位顺序号+1 位校验码int(6 位整数) int(100 的整数倍)6.2.2.4 输出项目表 3-5 存款子系统的输出项目名称 存款成功类型 文本6.2.2.5 算法图 3.11 存款的活动图31 五、详细设计说明书6.2.2.6 程序逻辑InsertCard User : NewClass 1: 插卡VerifyloginDepositFund sDataBase2: 核实信息 3: 验证信息 4: 返回信息 5: 登录 6: 存款 7: 存入数据库 8: 返回信息图 3.12 存款的时序图6.2.2.7 接口系统程序内部在功能模块下设置的程序接口见表 3-6 ,图 3.13表 3-6 存款子系统的软件接口函数 CheckAccountId(char *pszAccountId) CheckPassword(char *pszPassword,char *pszAccountId) CheckAccountState(char *pszAccountId) CheckBlackList(char *pszAccountId) DepositFunds(char *pszAccountId,double dDepositFunds)输入 卡号 密码、卡号输出 RESULT 返回值 RESULT 返回值卡号 卡号 密码、卡号、金额RESULT 返回值 RESULT 返回值 RESULT 返回值32 五、详细设计说明书图 3.13 存款的类图6.2.2.8 存储分配账户表 储蓄卡表 ATM 表 清单表6.2.2.9 限制条件ATM 自动取款机中的纸币以满,不能再放入纸币。6.2.2.10 测试要点好的产品才能得到用户的认可和肯定,只有得到用户的肯定才会有市场,为 此要对系统的反应速度、准确性(能准确读取放入的纸币数目)和安全性,以及 系统的稳定应有非常高的要求。6.2.3 转账子系统6.2.3.1 功能用户可以通过和 ATM 自动取款机交互,完成转账的操作。6.2.3.2 性能系统的反应时间是不能超过 2 秒,完成转账操作的时间不能超过 30 秒。33 五、详细设计说明书6.2.3.3 输入项目表 3-7 转账子系统的输入项目名称 卡号 密码 转入账号 金额类型 char(19) 卡号结构为: + 9 位顺序号+1 位校验码int(6 位整数) char(19) 卡号结构为: + 9 位顺序号+1 位校验码int(100 的整数倍)6.2.3.4 输出项目表 3-8 转账子系统的输出项目名称 凭条类型 文本34 五、详细设计说明书6.2.3.5 算法图 3.14 转账的活动图35 五、详细设计说明书6.2.3.6 程序逻辑InsertCard User : NewClass 1: 插卡VerifyloginTransferFun dsDataBase2: 核实信息 3: 验证信息 4: 返回信息 5: 登录 6: 转账 7: 存入数据库 8: 返回信息图 3.15 转账的时序图6.2.3.7 接口系统程序内部在功能模块下设置的程序接口见表 3-9,图 3.16表 3-9 转账子系统的软件接口函数 Open() TransferFunds() DeductFunds() VerifyFunds()输入 卡号 金额 无 无密码输出 提示信息 无 无 无36 五、详细设计说明书图 3.16 转账的类图6.2.3.8 存储分配账户表 储蓄卡表 ATM 表 清单表6.2.3.9 限制条件银行卡里的余额不足或不是同一类型的卡。6.2.3.10 测试要点好的产品才能得到用户的认可和肯定,只有得到用户的肯定才会有市场,为 此要对系统的反应速度、准确性(转走的金额和转入到某一账户的金额数一致, 数据库里的信息要准确的更新)和安全性,以及系统的稳定应有非常高的要求。6.2.4 查询余额子系统6.2.4.1 功能用户可以通过和 ATM 自动取款机交互,完成查询余额的操作。6.2.4.2 性能系统的反应时间是不能超过 2 秒, 完成查询余额操作的时间不能超过 30 秒。6.2.4.3 输入项目表 3-10 余额查询子系统的输入项目名称 卡号 密码类型 char(19) 卡号结构为: + 9 位顺序号+1 位校验码int(6 为整数)37 五、详细设计说明书6.2.4.4 输出项目表 3-11 余额查询子系统的输出项目名称 凭条类型 文本6.2.4.5 算法图 3.17 余额查询的活动图38 五、详细设计说明书6.2.4.6 程序逻辑InsertCard User : NewClass 1: 插卡VerifyloginQueryFundsDataBase2: 核实信息 3: 验证信息 4: 返回信息 5: 登录 6: 查询余额 7: 存入数据库 8: 返回信息图 3.18 余额查询的时序图6.2.4.7 接口系统程序内部在功能模块下设置的程序接口见表 3-12,图 3.19表 3-12 查询余额子系统的软件接口函数 CheckAccountId(char *pszAccountId) CheckPassword(char *pszPassword,char *pszAccountId) CheckAccountState(char *pszAccountId) CheckBlackList(char *pszAccountId) QueryBalance(char *pszAccountId,float* fBalance)输入 卡号 密码、卡号输出 RESULT 返回值 RESULT 返回值卡号 卡号 卡号RESULT 返回值 RESULT 返回值 RESULT 返回值、余额39 五、详细设计说明书图 3.19 余额查询的类图6.2.4.8 存储分配账户表 储蓄卡表 清单表6.2.4.9 限制条件硬件故障6.2.4.10 测试要点好的产品才能得到用户的认可和肯定,只有得到用户的肯定才会有市场,为 此要对系统的反应速度有非常高的要求,这也是最基本的要求。6.2.5 修改密码子系统6.2.5.1 功能用户可以通过和 ATM 自动取款机交互,完成修改密码的操作。6.2.5.2 性能系统的反应时间是不能超过 2 秒, 完成修改密码操作的时间不能超过 30 秒。6.2.5.3 输入项目表 3-13 修改密码子系统的输入项目40 五、详细设计说明书名称 卡号 旧密码 新密码类型 char(19) 卡号结构为: + 9 位顺序号+1 位校验码char(6) char(6)6.2.5.4 输出项目表 3-14 修改密码子系统的输出项目名称 凭条类型 文本6.2.5.5 算法图 3.20 修改密码的活动图41 五、详细设计说明书6.2.5.6 程序逻辑InsertCard User : NewClass 1: 插卡VerifyloginAlterPasswo rdDataBase2: 核实信息 3: 验证信息 4: 返回信息 5: 登录 6: 修改密码 7: 存入数据库 8: 返回信息图 3.21 修改密码的时序图6.2.5.7 接口系统程序内部在功能模块下设置的程序接口见表 3-15,图 3.22 函数 输入 输出 CheckAccountId(char 卡号 RESULT 返回值 *pszAccountId) CheckPassword(char 密码、卡号 RESULT 返回值 *pszPassword,char *pszAccountId) CheckAccountState(char 卡号 RESULT 返回值 *pszAccountId) CheckBlackList(char 卡号 RESULT 返回值 *pszAccountId) ChangePassword(char 密码、卡号 RESULT 返回值 *pszPassword,char * pszAccountId)42 五、详细设计说明书图 3.22 修改密码的类图6.2.5.8 存储分配账户表 储蓄卡表 清单表6.2.5.9 限制条件忘记了旧密码6.2.5.10 测试要点好的产品才能得到用户的认可和肯定, 为此要对系统的反应速度、 安全性, 以及系统的稳定有非常高的要求。6.程序6.1 atm006.ec/*********************************************************** 文件名 :atm006.ec 提交日期: 版本号 :1.0 功能说明:atm 自动取款机的基本功能(取款、存款、查询、转账、更改密码) 所有者 :闫海鑫 维护记录: ***********************************************************/ #include &atm006.h& EXEC SQL INCLUDE SQLCA;43 五、详细设计说明书EXEC SQL WHENEVER SQLERROR CALL sqlErrorHandler(); EXEC SQL WHENEVER SQLWARNING CALL sqlWarningHandler(); EXEC SQL WHENEVER NOT FOUND CALL sqlNotFoundHandler(); int main(int argc, char *argv[]) { atexit(batAtExit); int iC int iChoice1; char cF int iFlag = 1; int iFlag1 = 1; int iFlag2 = 1; int iLoop = 0; char szTemp[128]; float fC char szCusName[20 + 1]; float fB char szAccountId[19 + 1]; char szToAccountId[19 + 1]; char szPassword[6 + 1]; char szNewPassword[6 + 1];/*转账金额*/ /*户主姓名*/ /*剩余金额*/ /*银行卡号*/ /*转入银行卡卡号*/ /*银行密码*/ /*新密码*//*清空数组*/ CLRSTU(stDbObj); CLRBUF(szAccountId); /*设置日志文件名*/ bel_SetDiagFile(LOG_PATH); bel_PrintDiagLog( PROGRAM_NAME); &\n\n=====PROCEDURE %s BEGIN=====\n&,/*调用 GetDbIni 函数,读取 db.ini,获得数据库连接信息*/ if (FAIL == GetDbIni(&stDbObj)) { bel_PrintDiagLog(&配置文件读取失败!&); return FAIL; } /*调用数据库连接函数*/44 五、详细设计说明书if (SUCCESS != bel_DbConnect(&stDbObj)) { bel_PrintDiagLog(&数据库连接失败!&); return FAIL; } /*获取卡号*/ printf(&请输入卡号:&); scanf(&%s&,szTemp); memcpy(szAccountId,szTemp,19); strcat(szAccountId,&\0&); bel_TrimString(szAccountId); bel_PrintDiagLog(&szAccountId = %s&,szAccountId); /*校验卡号*/ if (FAIL == CheckAccountId(szAccountId)) { return FAIL; } /*获取并校验校验密码*/ while(1) { CLRBUF(szPassword); CLRBUF(szTemp); printf(&请输入密码:&); scanf(&%s&,szTemp); memcpy(szPassword,szTemp,6); strcat(szPassword,&\0&); bel_TrimString(szPassword); bel_PrintDiagLog(&szPassword = %s&,szPassword); if (FAIL == CheckPassword(szPassword,szAccountId)) { iLoop++; } else { } bel_PrintDiagLog(&iLoop = %d&,iLoop); if(iLoop &= 3) {45 五、详细设计说明书return FAIL; } bel_PrintDiagLog(&iLoop = %d&,iLoop); } /*校验本卡是否被冻结*/ if (FAIL == CheckAccountState(szAccountId)) { return FAIL; } /*校验本卡是否在黑名单*/ if (FAIL == CheckBlackList(szAccountId)) { return FAIL; } sqlCommit(); /*ATM 自动取款机基本操作*/ while(iFlag) { AtmdrawMenu(); printf(&请选择选项:&); scanf(&%d&,&iChoice); switch(iChoice) { case 1: if (FAIL == QueryBalance(szAccountId, &fBalance)) /*查看余额*/ { } printf(&\n***剩余金额为:%.2f***\n\n&,fBalance); case 2: /*取款*/ while(iFlag1) { WithdrawMenu(); printf(&请选择取款金额的选项:&); scanf(&%d&,&iChoice1); switch(iChoice1)46/*取款金额选 五、详细设计说明书项*/ { case 1: fChange = 100.00; iFlag1 = 0; case 2: fChange = 200.00; iFlag1 = 0; case 3: fChange = 300.00; iFlag1 = 0; case 4: fChange = 500.00; iFlag1 = 0; case 5: printf(&请输入取款金额:&); scanf(&%f&,&fChange); iFlag1 = 0; default : printf(&输入错误,请重新输入\n&); } if(!iFlag1) { /*获取余额*/ if (FAIL == QueryBalance(szAccountId, &fBalance)) { } bel_PrintDiagLog(&剩余金额为:%.2f\n&,fBalance); /*查看余额是否小于要取金额*/ if(fBalance & fChange) { printf(&\n***剩余金额不足***\n&); iFlag1 = 1; }47 五、详细设计说明书} } /*更改剩余金额并插入操作信息到流水表*/ if (FAIL == WithdrawFunds(szAccountId, fChange)) { sqlRollback(); commit 之后*/ } sqlCommit(); printf(&\n***取款成功***\n&); iFlag1 = 1; case 3: printf(&请输入存款金额:&); scanf(&%f&,&fBalance); /*更改剩余金额并插入操作信息到流水表*/ if (FAIL == DepositFunds(szAccountId, fBalance)) { sqlRollback(); commit 之后*/ } sqlCommit(); printf(&\n***存款成功***\n&); case 4: CLRBUF(szTemp); CLRBUF(szToAccountId); CLRBUF(szCusName); /*校验本卡是否被冻结*/ printf(&请输入转入卡号:&); scanf(&%s&,szTemp); memcpy(szToAccountId,szTemp,19); strcat(szToAccountId,&\0&); bel_TrimString(szToAccountId); bel_PrintDiagLog(&szToAccountId = %s&,szToAccountId); /*校验卡号*/ if (FAIL == CheckAccountId(szToAccountId)) {48/*回滚到上个/*存款*//*回滚到上个/*转账*/ 五、详细设计说明书 } /*校验本卡是否被冻结*/ if (FAIL == CheckAccountState(szToAccountId)) { return FAIL; } /*校验卡号是否在黑名单*/ if (FAIL == CheckBlackList(szToAccountId)) { } sqlCommit(); /*获取转入卡号户主姓名*/ QueryCusName(szToAccountId,szCusName); printf(&转入户主姓名:%s\n&,szCusName); /*判断是否继续*/ printf(&继续请输入 Y,否则输入 N\n&); getchar(); scanf(&%c&,&cFlag); if(cFlag != 'y' && cFlag != 'Y') { } while(iFlag2) { iFlag2 = 0; printf(&请输入转账金额:&); scanf(&%f&,&fChange); if (FAIL == QueryBalance(szAccountId, &fBalance)) { } bel_PrintDiagLog(&剩余金额为:%.2f\n&,fBalance); /*校验剩余金额是否不足*/ if(fBalance &= fChange)49 五、详细设计说明书{ printf(&\n***剩余金额不足***\n&); iFlag2 = 1; } } bel_PrintDiagLog(&转账金额为:%.2f\n&,fChange); /*更改剩余金额并插入操作信息到流水表*/ if (FAIL == WithdrawFunds(szAccountId, fChange)) { sqlRollback(); commit 之后*/ } /*更改剩余金额并插入操作信息到流水表*/ if (FAIL == DepositFunds(szToAccountId, fChange)) { sqlRollback(); commit 之后*/ } sqlCommit(); printf(&\n***转账成功***\n&); iFlag2 = 1; case 5: /*获取新密码*/ CLRBUF(szNewPassword); if (FAIL == NewPassword(szNewPassword)) { } bel_PrintDiagLog(&szNewPassword = %s&,szNewPassword); /*更改密码*/ if (FAIL == ChangePassword(szNewPassword,szAccountId)) { }50/*回滚到上个/*回滚到上个/*更改密码*/ 五、详细设计说明书case 6: iFlag = 0; default : printf(&输入错误,请重新输入\n&); } } bel_PrintDiagLog( &\n=====PROCEDURE %s END=====\n\n&, PROGRAM_NAME); return FAIL; } /*********************************************************** 函数名称:batAtExit 函数功能:释放资源 参数说明:无 返回说明:无 维护记录: ***********************************************************/ void batAtExit() { /*调用数据库断开函数*/ bel_DbDisconnect(&stDbObj); } /*********************************************************** 函数名称:GetTime 函数功能:获取八位当日日期 参数说明:无 返回说明:FAIL 失败 SUCCESS 成功 维护记录: ***********************************************************/ RESULT GetTime(char *pcCurrTime) { TIMESTRU time_t _time_t; struct tm * _ time(&_time_t);51 五、详细设计说明书_ptm = localtime(&_time_t); timestru.nYear = _ptm-&tm_year + 1900; timestru.nMon = _ptm-&tm_mon + 1; timestru.nDay = _ptm-&tm_ timestru.nHour = _ptm-&tm_ timestru.nMin = _ptm-&tm_ timestru.nSec = _ptm-&tm_ sprintf(pcCurrTime,&%04d%02d%02d&,timestru.nYear,timestru.nMon,timestru.nDay); return SUCCESS; } /*********************************************************** 函数名称:sqlRollback 函数功能:回滚 参数说明:无 返回说明:SQLCODE_NORMAL 正常 SQLCODE_NOTFOUND 未找到 DBERRORCOD 出错 维护记录: ***********************************************************/ RESULT sqlRollback() { EXEC SQL ROLLBACK; if(sqlca.sqlcode == SQLCODE_NORMAL && sqlca.sqlwarn[0] != 'W') return SQLCODE_NORMAL; else if(sqlca.sqlcode == SQLCODE_NOTFOUND) return SQLCODE_NOTFOUND; else return DBERRORCOD; } /*********************************************************** 函数名称:sqlCommit 函数功能:提交保存 参数说明:无 返回说明:SQLCODE_NORMAL 正常 SQLCODE_NOTFOUND 未找到 DBERRORCOD 出错 维护记录:52 五、详细设计说明书***********************************************************/ RESULT sqlCommit() { EXEC SQL COMMIT; if(sqlca.sqlcode == SQLCODE_NORMAL && sqlca.sqlwarn[0] != 'W') return SQLCODE_NORMAL; else if(sqlca.sqlcode == SQLCODE_NOTFOUND) return SQLCODE_NOTFOUND; else return DBERRORCOD; } /*********************************************************** 函数名称:sqlErrorHandler 函数功能:处理数据库出错的情况 参数说明:无 返回说明:无 维护记录: ***********************************************************/ void sqlErrorHandler() { printf(&SQLCODE=[%ld] ERRORMSG=[%s]\n&,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc); } /*********************************************************** 函数名称:sqlWarningHandler 函数功能:处理数据库警告的情况 参数说明:无 返回说明:无 维护记录: ***********************************************************/ void sqlWarningHandler() { if (sqlca.sqlwarn[1] == 'W') { printf(&[%s] Warning=[Data was truncated]\n&); } if (sqlca.sqlwarn[2] == 'W') { printf(&[%s] Warning=[The input contained a null value]\n&); }53 五、详细设计说明书if (sqlca.sqlwarn[3] == 'W') { printf(&[%s] Warning=[The number of columns exceeds the number of host variables]\n&); } if (sqlca.sqlwarn[5] == 'W') { printf(&[%s] Warning=[A conversion error occurred]\n&); } } /*********************************************************** 函数名称:sqlNotFoundHandler 函数功能:处理数据库数据未找到的情况 参数说明:无 返回说明:无 维护记录: ***********************************************************/ void sqlNotFoundHandler() { printf(&*[%s]*\n [%s] No rows affected! \n&); } /*********************************************************** 函数名称:GetDbIni 函数功能:读取配置文件 参数说明:pstDbObj stuDbObj 保存数据库连接信息的结构体 返回说明:FAIL 表示读取配置文件失败 SUCCESS 表示读取配置文件成功 维护记录: ***********************************************************/ RESULT GetDbIni(stuDbObj *pstDbObj) { FILE *pfIni = NULL; /*指向 config.ini 文件指针*/ char szBuf[MAX_SIZE]; /*暂存读取 config.ini 文件的一行数据*/ char *pszTemp = NULL; /*临时字符串指针*/ char *pszDbname = NULL; /*保存数据库组名*/ bel_ClrBuf(szBuf); /*打开配置文件*/ pfIni = fopen(INI_PATH,&r&); if(NULL == pfIni) {54 五、详细设计说明书bel_PrintDiagLog(&open db.ini failed!\n&); return FAIL; } /*逐行读数据*/ while(NULL != (fgets(szBuf, MAX_SIZE, pfIni))) { /*首尾去空格*/ bel_TrimStringExt(szBuf); /*跳过以#开头行及空行*/ if ('#' == szBuf[0] || '\n' == szBuf[0] || 0 == strlen(szBuf)) { } /*比较组名来判断是否为 database*/ if(!strcmp(szBuf,&[database]&)) { } else { if(szBuf[0] == '[') { } /*获取 KEY 值和 VALUE 值*/ if(NULL != (pszTemp = strchr(szBuf, '='))) { *pszTemp = '\0'; pszTemp++; /*首尾去空格*/ bel_TrimStringExt(szBuf); bel_TrimStringExt(pszTemp); /*若 KEY 值相等,则把相应的 VALUE 值赋给相应的结构体成员*/ if((strcmp(szBuf, &Server&)) == 0) { strcpy(pstDbObj-&szServer, pszTemp); } else if((strcmp(szBuf, &User&)) == 0)55 五、详细设计说明书{ strcpy(pstDbObj-&szUser, pszTemp); } else if((strcmp(szBuf, &Pwd&)) == 0) { strcpy(pstDbObj-&szPwd, pszTemp); } else if((strcmp(szBuf, &Db&)) == 0) { strcpy(pstDbObj-&szDb, pszTemp); } else if((strcmp(szBuf, &Connect&)) == 0) { strcpy(pstDbObj-&szConnect, pszTemp); } } } } /*关闭配置文件*/ fclose(pfIni); return SUCCESS; } /*****************************************************************/ /* 函数名称:AtmMenu */ /* 功能说明:取款额度菜单 */ /* 参数说明:无 */ /* 返回说明:无 */ /* 维护记录: */ /*****************************************************************/ void AtmdrawMenu() { printf(&/****************************************************/\n&); printf(&/*查询 请输入 1 */\n&); printf(&/*取款 请输入 2 */\n&); printf(&/*存款 请输入 3 */\n&); printf(&/*转账 请输入 4 */\n&); printf(&/*更改密码 请输入 5 */\n&); printf(&/*退卡 请输入 6 */\n&); printf(&/****************************************************/\n&);56 五、详细设计说明书} /*****************************************************************/ /* 函数名称:WithdrawMenu */ /* 功能说明:取款额度菜单 */ /* 参数说明:无 */ /* 返回说明:无 */ /* 维护记录: */ /*****************************************************************/ void WithdrawMenu() { printf(&/*****************************************************/\n&); printf(&/*取 100 请输入 1 */\n&); printf(&/*取 200 请输入 2 */\n&); printf(&/*取 300 请输入 3 */\n&); printf(&/*取 500 请输入 4 */\n&); printf(&/*其他金额 请输入 5 */\n&); printf(&/*****************************************************/\n&); } /*****************************************************************/ /* 函数名称:CheckNu */ /* 功能说明:检查字参数是否全是数字并判断长度是否符合标准 */ /* 参数说明:pszArry 字符串,iCount 数字应有个数 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT CheckNu(char *pszArry, int iCount) { char *ppos = NULL; char *pszTemp = pszA /*校验参数位数*/ if(strlen(pszTemp) != iCount) { bel_PrintDiagLog( &输入的参数位数有误!&); return FAIL; } else { /*校验参数是否每位都是数字*/ for(ppos = pszT *ppos != '\0'; ppos++)57 五、详细设计说明书{ if((*ppos & '0') || (*ppos &'9')) { bel_PrintDiagLog( &参数中含有非数字!&); return FAIL; } } } return SUCCESS; } /*****************************************************************/ /* 函数名称:CheckAccountId */ /* 功能说明:检查卡号是否正确 */ /* 参数说明:pszAccountId 卡号 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT CheckAccountId(char *pszAccountId) { bel_PrintDiagLog(&szAccountId = %s&,pszAccountId); RESULT iRe; int iL unsigned iSum = 0; char szHead[9 + 1]; char szTemp[19 + 1]; sprintf(szTemp,&%s&,pszAccountId); //sprintf(szTemp,&%s&,&0000927&); bel_PrintDiagLog(pszAccountId,&%s&,pszAccountId); /*检查参数长度以及是否都是数字*/ iRe = CheckNu(szTemp,19); if(-1 == iRe) { bel_PrintDiagLog( &卡号不正确!&); return FAIL; } else { memcpy(szHead,szTemp,9); strcat(szHead,&\0&); /*判断卡号前九位不是 */ if(strcmp(szHead,&&))58 五、详细设计说明书{ bel_PrintDiagLog( &卡号前九位不是 !&); return FAIL; } /*计算校验码应该是的值*/ for(iLoop = 17; iLoop != -1; iLoop--) { if((18 - iLoop)%2) { iSum += szTemp[iLoop]; } else { iSum += szTemp[iLoop] * 2; } } bel_PrintDiagLog( &sum = %d&,iSum); while(iSum & 10) { iSum = iSum % 10; } bel_PrintDiagLog( &sum = %d&,iSum); bel_PrintDiagLog( &szTemp[18] = %d\n&,(szTemp[18] - '0')); /*对比校验码是否正确*/ if((0 == iSum)&&(0 == (szTemp[18]) - '0')) { bel_PrintDiagLog( &卡号校验未通过!&); return FAIL; } else if((10 - iSum) != (szTemp[18] - '0')) { bel_PrintDiagLog( &卡号校验未通过!&); return FAIL; } } return SUCCESS; } /*****************************************************************/ /* 函数名称:CheckPassword */ /* 功能说明:检查密码格式并返回加密后的密码 */59 五、详细设计说明书/* 参数说明:pszPassword 密码 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT CheckPassword(char *pszPassword,char * pszAccountId) { char cT int iT RESULT iRe; int iL unsigned iSum = 0; char szTemp[6 + 1]; /*声明宿主变量*/ EXEC SQL BEGIN DECLARE SECTION; typedef struct tagCardInfo { char szAccountId[19+1]; char szPassword[6+1]; }stuCardI stuCardInfo stCardI EXEC SQL END DECLARE SECTION; CLRSTU(stCardInfo); CLRBUF(szTemp); sprintf(szTemp,&%s&,pszPassword); /*检查参数长度以及是否都是数字*/ iRe = CheckNu(szTemp,6); if(-1 == iRe) { bel_PrintDiagLog( &密码不正确!&); return FAIL; } else { /*计算密码加密后的值*/ for(iLoop = 5; iLoop != -1; iLoop--) { if((szTemp[iLoop] - '0')%2) {60/*卡号 */ /*密码 *//*清空结构体*/ /*清空数组*/ 五、详细设计说明书szTemp[iLoop] = ((szTemp[iLoop] - '0') & 1) + '0' ; } else { szTemp[iLoop] = ((szTemp[iLoop] - '0') | 2) + '0'; } } bel_PrintDiagLog( &szTemp = %s&,szTemp); sprintf(stCardInfo.szAccountId,&%s&,pszAccountId); bel_PrintDiagLog( &stCardInfo.szAccountId = %s&,stCardInfo.szAccountId); EXEC SQL SELECT ci_password INTO :stCardInfo.szPassword FROM cardinfo_iq WHERE ci_accountid = :stCardInfo.szAccountId; switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: bel_PrintDiagLog(&密码获取失败&); return FAIL; } bel_PrintDiagLog( &stCardInfo.szPassword = %s&,stCardInfo.szPassword ); if(strcmp(stCardInfo.szPassword, szTemp)) { bel_PrintDiagLog(&密码校验失败&); return FAIL; } } return SUCCESS; } /*****************************************************************/ /* 函数名称:CheckAccountState */ /* 功能说明:检查账户是否被冻结 */ /* 参数说明:pszAccountId 账户账号 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */61 五、详细设计说明书/* 维护记录: */ /*****************************************************************/ RESULT CheckAccountState(char *pszAccountId) { /*声明宿主变量*/ EXEC SQL BEGIN DECLARE SECTION; typedef struct tagCardInfo { char szAccountId[19+1]; /*卡号 */ char szAccountState[1+1]; /*账户状态*/ }stuCardI stuCardInfo stCardI EXEC SQL END DECLARE SECTION; CLRSTU(stCardInfo); /*清空结构体*/sprintf(stCardInfo.szAccountId,&%s&,pszAccountId); /*获取账户状态*/ EXEC SQL SELECT ci_accountstate INTO :stCardInfo.szAccountState FROM cardinfo_iq WHERE ci_accountid = :stCardInfo.szAccountId; switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: bel_PrintDiagLog(&账户状态获取失败&); return FAIL; } bel_PrintDiagLog( &stCardInfo.szPassword = %s&,stCardInfo.szAccountState); if(strcmp(stCardInfo.szAccountState, &0&)) { bel_PrintDiagLog(&账户被冻结&); return FAIL; } return SUCCESS; }62 五、详细设计说明书/*****************************************************************/ /* 函数名称:CheckBlackList */ /* 功能说明:检查账户是否在黑名单 */ /* 参数说明:pszAccountId 账户账号 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT CheckBlackList(char *pszAccountId) { /*声明宿主变量*/ EXEC SQL BEGIN DECLARE SECTION; char szAccountId[19+1]; /*卡号*/ int iS /*在黑名单中的次数*/ EXEC SQL END DECLARE SECTION; sprintf(szAccountId,&%s&,pszAccountId); /*获取账户状态*/ EXEC SQL SELECT count(*) INTO :iSum FROM blacklist_iq WHERE bl_accountid = :szAccountId; switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: bel_PrintDiagLog(&黑名单查询失败&); return FAIL; } bel_PrintDiagLog( &在黑名单中出现次数 = %d&,iSum); if(1 == iSum) { bel_PrintDiagLog(&账户在黑名单中&); return FAIL; } return SUCCESS; }63 五、详细设计说明书/*****************************************************************/ /* 函数名称:NewPassword */ /* 功能说明:获得新密码 */ /* 参数说明:pszPassword 密码 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT NewPassword(char *pszPassword) { char szTemp[128]; char szPassword1[6 + 1]; /*临时密码*/ char szPassword2[6 + 1]; /*临时密码*/ while(1) { CLRBUF(szPassword1); CLRBUF(szTemp); printf(&请输入新密码:&); scanf(&%s&,szTemp); memcpy(szPassword1,szTemp,6); strcat(szPassword1,&\0&); bel_TrimString(szPassword1); bel_PrintDiagLog(&szPassword1 = %s&,szPassword1); /*检查参数长度以及是否都是数字*/ if(FAIL == CheckNu(szPassword1,6)) { bel_PrintDiagLog( &密码不正确!&); } CLRBUF(szPassword2); CLRBUF(szTemp); printf(&请再次输入新密码:&); scanf(&%s&,szTemp); memcpy(szPassword2,szTemp,6); strcat(szPassword2,&\0&); bel_TrimString(szPassword2); bel_PrintDiagLog(&szPassword2 = %s&,szPassword2); /*检查参数长度以及是否都是数字*/ if(FAIL == CheckNu(szPassword2,6)) {64 五、详细设计说明书bel_PrintDiagLog( &密码不正确!&); } if(!strcmp(szPassword2,szPassword1)) { memcpy(pszPassword,szPassword2,6); strcat(pszPassword,&\0&); } else { printf(&两次密码输入不一样\n&); } } return SUCCESS; } /*****************************************************************/ /* 函数名称:ChangePassword */ /* 功能说明:生成加密密码并更改 */ /* 参数说明:pszPassword 密码 pszAccountId 账号 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT ChangePassword(char *pszPassword,char * pszAccountId) { char cT int iT RESULT iRe; int iL unsigned iSum = 0; char szTemp[6 + 1]; /*声明宿主变量*/ EXEC SQL BEGIN DECLARE SECTION; typedef struct tagCardInfo { char szAccountId[19+1]; char szPassword[6+1]; }stuCardI stuCardInfo stCardI EXEC SQL END DECLARE SECTION;65/*卡号 */ /*密码 */ 五、详细设计说明书CLRSTU(stCardInfo); CLRBUF(szTemp); sprintf(szTemp,&%s&,pszPassword);/*清空结构体*/ /*清空数组*//*计算密码加密后的值*/ for(iLoop = 5; iLoop != -1; iLoop--) { if((szTemp[iLoop] - '0')%2) { szTemp[iLoop] = ((szTemp[iLoop] - '0') & 1) + '0' ; } else { szTemp[iLoop] = ((szTemp[iLoop] - '0') | 2) + '0'; } } sprintf(stCardInfo.szAccountId,&%s&,pszAccountId); sprintf(stCardInfo.szPassword,&%s&,szTemp); bel_PrintDiagLog( &stCardInfo.szAccountId = %s&,stCardInfo.szAccountId); bel_PrintDiagLog( &stCardInfo.szPassword = %s&,stCardInfo.szPassword); EXEC SQL UPDATE cardinfo_iq SET ci_password = :stCardInfo.szPassword WHERE ci_accountid = :stCardInfo.szAccountId; switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: sqlRollback(); bel_PrintDiagLog(&密码修改失败&); return FAIL; } bel_PrintDiagLog(&更新了映射[%d]条数据!&, SQLFETCHROWS); sqlCommit(); printf(&\n***密码修改成功***\n&);66 五、详细设计说明书return SUCCESS; } /*****************************************************************/ /* 函数名称:QueryBalance */ /* 功能说明:查询余额 */ /* 参数说明:pszAccountId 账户账号 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT QueryBalance(char *pszAccountId,float* fBalance) { EXEC SQL BEGIN DECLARE SECTION; char szAccountId[19+1]; float fT EXEC SQL END DECLARE SECTION; CLRBUF(szAccountId); sprintf(szAccountId,&%s&,pszAccountId); EXEC SQL SELECT convert( FLOAT,(SELECT ci_balance FROM cardinfo_iq WHERE ci_accountid = :szAccountId))INTO :fT switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: bel_PrintDiagLog(&余额查询失败&); return FAIL; } *fBalance = fT return SUCCESS; } /*卡号*/ /*剩余金额*/67 五、详细设计说明书/*****************************************************************/ /* 函数名称:QueryCusName */ /* 功能说明:查询户主姓名 */ /* 参数说明:pszAccountId 账户账号 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT QueryCusName(char *pszAccountId,char* pCusName) { EXEC SQL BEGIN DECLARE SECTION; char szAccountId[19+1]; char szCusName[20 + 1]; EXEC SQL END DECLARE SECTION; CLRBUF(szAccountId); sprintf(szAccountId,&%s&,pszAccountId); EXEC SQL SELECT cm_cusname FROM customermessage_iq WHERE cm_accountid = :szAccountId INTO :szCusN switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: bel_PrintDiagLog(&户主姓名&); return FAIL; } sprintf(pCusName,&%s&,szCusName); return SUCCESS; } /*****************************************************************/ /* 函数名称:WithdrawFunds */ /* 功能说明:更改剩余金额并插入操作信息到流水表 */ /* 参数说明:pszAccountId 账户账号 */68/*卡号*/ /*户主姓名*/ 五、详细设计说明书/* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT WithdrawFunds(char *pszAccountId,double dDepositFunds) { //float fB /*剩余金额*/ EXEC SQL BEGIN DECLARE SECTION; char szAccountId[19+1]; double dT typedef struct tagTradeList { int iTradeId; float fRestM char sztradedate[8 + 1]; }stuTradeL stuTradeList stTradeL EXEC SQL END DECLARE SECTION; CLRBUF(szAccountId); CLRSTU(stTradeList); sprintf(szAccountId,&%s&,pszAccountId); dTemp = dDepositF EXEC SQL UPDATE cardinfo_iq SET ci_balance = ci_balance - :dTemp WHERE ci_accountid = :szAccountId; switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: bel_PrintDiagLog(&存款失败&);69/*卡号*/ /*存入金额*//*交易流水号*/ /*取款 */ /*存款 */ /*余额 */ /*交易时间*//*清空数组*/ /*清空结构体*/ 五、详细设计说明书return FAIL; } bel_PrintDiagLog(&更新了映射[%d]条数据!&, SQLFETCHROWS);/*获取最后一个流水号*/ EXEC SQL SELECT top 1 tl_tradeid INTO :stTradeList.iTradeId FROM tradelist_iq ORDER BY tl_tradeid DESC; switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: stTradeList.iTradeId = 0; default: bel_PrintDiagLog(&最后一个流水号获取失败&); return FAIL; } bel_PrintDiagLog( &最后一个流水号 = %d&,stTradeList.iTradeId); if (FAIL == QueryBalance(szAccountId, &stTradeList.fRestMony)) { return FAIL; } bel_PrintDiagLog(&剩余金额为:%.2f&,stTradeList.fRestMony); if (FAIL == GetTime(stTradeList.sztradedate)) { return FAIL; } bel_PrintDiagLog( &流水时间 = %s&,stTradeList.sztradedate); EXEC SQL INSERT INTO tradelist_iq VALUES(:stTradeList.iTradeId + 1, 0.00, :stTradeList.fRestMony,:stTradeList.sztradedate); switch(SQLCODE)70:szAccountId,';,:dTemp, 五、详细设计说明书{ case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: bel_PrintDiagLog(&流水插入失败&); return FAIL; } bel_PrintDiagLog(&更新了映射[%d]条数据!&, SQLFETCHROWS);return SUCCESS; } /*****************************************************************/ /* 函数名称:DepositFunds */ /* 功能说明:更改剩余金额并插入操作信息到流水表 */ /* 参数说明:pszAccountId 账户账号 */ /* 返回说明:FAIL 失败,SUCCESS 成功 */ /* 维护记录: */ /*****************************************************************/ RESULT DepositFunds(char *pszAccountId,double dDepositFunds) { //float fB /*剩余金额*/ EXEC SQL BEGIN DECLARE SECTION; char szAccountId[19+1]; double dT typedef struct tagTradeList { int iTradeId; float fRestM char sztradedate[8 + 1]; }stuTradeL stuTradeList stTradeL EXEC SQL END DECLARE SECTION;71/*卡号*/ /*存入金额*//*交易流水号*/ /*取款 */ /*存款 */ /*余额 */ /*交易时间*/ 五、详细设计说明书CLRBUF(szAccountId); CLRSTU(stTradeList); sprintf(szAccountId,&%s&,pszAccountId); dTemp = dDepositF EXEC SQL UPDATE cardinfo_iq SET ci_balance = ci_balance + :dTemp WHERE ci_accountid = :szAccountId; switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: bel_PrintDiagLog(&存款失败&); return FAIL; }/*清空数组*/ /*清空结构体*/bel_PrintDiagLog(&更新了映射[%d]条数据!&, SQLFETCHROWS);/*获取最后一个流水号*/ EXEC SQL SELECT top 1 tl_tradeid INTO :stTradeList.iTradeId FROM tradelist_iq ORDER BY tl_tradeid DESC; switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: stTradeList.iTradeId = 0; default: bel_PrintDiagLog(&最后一个流水号获取失败&); return FAIL; } bel_PrintDiagLog( &最后一个流水号 = %d&,stTradeList.iTradeId);72 五、详细设计说明书if (FAIL == QueryBalance(szAccountId, &stTradeList.fRestMony)) { return FAIL; } bel_PrintDiagLog(&剩余金额为:%.2f&,stTradeList.fRestMony); if (FAIL == GetTime(stTradeList.sztradedate)) { return FAIL; } bel_PrintDiagLog( &流水时间 = %s&,stTradeList.sztradedate); EXEC SQL INSERT INTO tradelist_iq VALUES(:stTradeList.iTradeId + 1, 0.00, :dTemp, :stTradeList.fRestMony,:stTradeList.sztradedate); switch(SQLCODE) { case SQLCODE_NORMAL: case SQLCODE_NOTFOUND: default: bel_PrintDiagLog(&流水插入失败&); return FAIL; } bel_PrintDiagLog(&更新了映射[%d]条数据!&, SQLFETCHROWS);:szAccountId,';,return SUCCESS; }/*End of this file*/6.2 atm006.h#ifndef ATM001_H73 五、详细设计说明书#define ATM001_H /*ESQL/C 预编译器的头文件*/ #include &sybhesql.h& #include &sybtesql.h& #include &cc_bel.h& /*每行读取最多字符*/ #define MAX_SIZE 60 /*保存数据库连接的相关信息*/ stuDbObj stDbO /*************************返回值********************************/ #define PROGRAM_NAME &atm006& #define SQLCODE_NORMAL 0 #define SQLCODE_NOTFOUND 100 #define LEN_NAME_PROC 16 /*Length constant macros*/ #define DBERRORCOD 1 /*A error or warning occurred*/ #define SQLERRMSG #define SQLFETCHROWS sqlca.sqlerrm.sqlerrmc ((short int)(sqlca.sqlerrd[2]))/***************************结构体定义**************************/ typedef struct tagTIMESTRU { unsigned nY unsigned nM unsigned nD unsigned nH unsigned nM unsigned nS } TIMESTRU; /************************清空数组和结构体************************/ #define CLRBUF(abc) memset(abc, '\0', sizeof(abc)) #define CLRSTU(abc) memset(&abc, '\0', sizeof(abc)) /**************************路径*********************************/ /*日志*/ #define LOG_PATH &/home/bankht/Desktop/lunwen/log.txt& /*配置文件*/74 五、详细设计说明书#define INI_PATH &/home/bankht/Desktop/lunwen/config.ini& /**************************函数********************************/ void batAtExit(); void sqlErrorHandler(); void sqlWarningHandler(); void sqlNotFoundHandler(); RESULT sqlCommit(); RESULT sqlRollback(); RESULT GetTime(char *pcCurrTime); RESULT CheckNu(char *pszArry, int iCount); RESULT CheckAccountId(char *pszAccountId); RESULT CheckPassword(char *pszPassword,char *pszAccountId); RESULT CheckAccountState(char *pszAccountId); RESULT CheckBlackList(char *pszAccountId); RESULT QueryBalance(char *pszAccountId,float* fBalance); RESULT ChangePassword(char *pszPassword,char * pszAccountId); RESULT NewPassword(char *pszPassword); RESULT QueryBalance(char *pszAccountId,float* fBalance); RESULT WithdrawFunds(char *pszAccountId,double dDepositFunds); RESULT DepositFunds(char *pszAccountId,double dDepositFunds); RESULT QueryCusName(char *pszAccountId,char* pCusName); void AtmdrawMenu(); void WithdrawMenu(); #endif /* End of this file */75
ATM自动取款机系统-详细设计―汇集和整理大量word文档,专业文献,应用文书,考试资料,教学教材,办公文档,教程攻略,文档搜索下载下载,拥有海量中文文档库,关注高价值的实用信息,我们一直在努力,争取提供更多下载资源。

我要回帖

更多关于 自动取款机能存钱吗 的文章

 

随机推荐