项目说明报告
某店POS积分管理系统
——积分失效与数据分析模块的实现
开发一个大而复杂的POS积分管理软件系统,将它进行适当的分解,不但可以降低其复杂性,还可以减少开发工作量,降低开发成本,提高软件生产率。其中, 积分失效处理,是为了刺激客户消费,对于一年以内未购买任何商品的会员,对其积分进行清除处理。数据处理模块,是对商品销售金额等具体数据进行计算处理,以方便企业对各类型商品销售情况等进行数据分析。作为商务用软件,错误检测机制尤为重要。因此,在模块开发时应考虑到各种实发情况的出现,并做出相应处理。在完成程序开发后,需作成单元检测清单(PCL),并进行测试,验证软件的有效性,发现并修补缺陷,以提高软件质量,确保开发出用户满意的软件产品。
POS积分管理软件系统;积分失效;数据分析;单元检测清单
目 录
总页数:30页
随着社会科学技术突飞猛进的发展,计算机的应用已经普及到经济和社会的各个领域。长期以来人们所使用的传统的单纯凭借人力进行管理的销售方式,已经无法适应当今社会的现状,同时也存在着很多弊端,如成本较高、安全性低、效率难以提高等。因此,作为计算机应用的一个方面,利用其强大的运算能力,进行销售管理具有无法替代的优势。其高效、可靠、稳定等优点已得到了消费者和销售企业一致的好评。
不同类型的销售行业有自己的特点,对于零售业而言,是一个成本敏感,同时具有大规模的分布性和灵活多变的特点。因此,如何处理好在一个高度分布的网络环境中,多种软硬件平台的管理、部署和升级,适应实际的需求变化,为用户提供一种可靠的低成本运作模式,成为零售业解决方案成功的关键。
针对这一情况,希望研究出一套POS积分管理系统,用来对商品销售情况、会员消费情况、分店经营情况等信息进行系统高效的管理。降低甚至消除不必要的成本和费用,给客户带来更大效益。而本课题的研究正是要在这个系统之下开发出积分失效和数据分析两个模块。其中积分失效模块对一年内未购买任何物品的会员,进行积分过期失效处理。这样做可以刺激用户消费,提高销售业绩。而数据分析模块则是对商品销售信息进行分析,对各种类型的商品销售情况,销售利润做成数据资料以供外部分析使用。
作为以JAVA语言为基础的商务型软件,此次研究主要采用面向对象的方法进行软件开发。尽可能模拟人类习惯的思维方式来分析和解决问题,保证软件系统的稳定性和可复用性以及良好的维护性。在程序中,采用了JDBC—ODBC桥的方式,进行数据库连接。另外,由于是商务软件,就要考虑到用户在使用该系统时有可能出现的各种错误,并针对这些错误制定出解决的方案。整个开发过程分为四个部分,包括分析工程、设计工程、制造工程、测试工程。下面将详细对上述过程进行细致的描述。
由于该百货店实行会员管理模式,每个会员都有代金消费点数,其中就存在部分会员在获得消费点后,因某些原因长期未能进行消费,但仍要对他们的消费点进行管理,这就给整个管理系统带来了负担,同时也占用了很多不必要的资源,无形中增大了管理的成本。为了解决这个问题,就需要建立一个模块来定期检查会员消费情况,对限定时间内未消费的用户进行积分失效处理,以节约系统资源,同时,也在一定程度上刺激会员消费。
把握市场动向,提高销售利润是企业的最终目标。在企业管理日趋科学化的今天,如何准确及时地进行生产经营决策是销售企业面临的严峻问题。要求决策者准确及时地捕捉到销售信息,分析销售情况,随时根据历史的销售情况,对下一步的生产经营科学地进行决策。销售分析需要大量的基础数据,但是如果将原始的销售信息直接用于分析又会给分析工作带来很大不便,是效率无法提高。因此就需要将原始销售信息进行整理,处理成决策分析所需的数据资料,进行保存。
- 硬件需求:计算机一台
- 操作系统:Windows 2000(日文)
- 开发语言:Java
- 开发工具:eclipse
- 数据库:Microsoft SQL Server 2000
- 其他软件:Microsoft SQL Server 2000 Driver for JDBC Service,Subversion(S VN)1.30
- 积分失效
从会员信息表中,找出一年前注册,当前点数不为0,且一年内未进行消费的用户,对其积分进行清零处理。
-
- 数据分析
对每日POS消费记录文件进行数据处理,生成用于外部数据分析的明细文件
会员数据:包括会员的基本信息数据(入会日期,会员编码,姓名,住址,联系电话,出生年月日,会员种类,入会店铺编码等等);
积分数据:包括积分卡基本信息数据(会员编码,现在积分点,累计积分点,输出累计积分点,增加累计积分点,基本累计积分点,购买次数,购买累计金额等等);
店铺数据:包括店铺基本信息数据(店铺编码,店铺名称,DOMINANT编码,住址,联系电话等等);
用于进行数据分析处理的原始销售信息存放于一个名为FSP_EFI010.DAT的文件中,其数据格式如表1所示:
表1 原始销售信息文件数据格式
数据名称 | 数据字段长度(位) |
店铺CODE | 6 |
Terminal NO | 6 |
交易序列号 | 5 |
交易日期 | 8 |
交易时间 | 2 |
会员NO | 13 |
JAN CODE | 13 |
商品名称 | 不定 |
消费点数 | 3 |
消费金额 | 6 |
会员价格 | 4 |
退货交易 | 1 |
折扣价 | 4 |
贴现价 | 4 |
按比例折扣价 | 4 |
按比例贴现价 | 4 |
按比例M&M值 | 4 |
GP CODE | 4 |
部门 CODE | 6 |
数据库表结构的设计在每一个开发项目中都是非常重要的一个部分,数据库表设计的好坏直接关系到开发过程中代码实现的功能强大与否,是否包含齐备客户所需求的功能。因此现在来介绍该模块所用到的数据库表的详细设计。各数据表定义如表2所示
表2 数据表定义
序号 | 表参数名 | 表名说明 |
1 | FSPTB_MEMBER | 记录会员基本信息 |
2 | FSPTB_MEMBER_STATUS | 记录会员状态信息 |
3 | FSPTB_POINT | 记录会员点数基本信息 |
4 | FSPTB_POINT_JNL | 记录会员点数更新履历 |
5 | FSPTB_POINT_RIREKI | 记录会员当日消费点数信息 |
表3 FSPTB_MEMBER(会员)
主键 | 列(属性)名 | 中文名称 | 类型 | 宽度 | 是否允许为空 |
◎ | MEMBER_CODE | 会员编码 | Char | 13 | NOT NULL |
NYUKAI_YMD | 入会年月日 | Char | 8 | NULL | |
SHIMEI_KANA_S | 日语假名性 | Char | 16 | NOT NULL | |
SHIMEI_KANA_N | 日语假名名 | Char | 16 | NOT NULL | |
SHIMEI_KANJI_S | 中文姓 | Char | 32 | NOT NULL | |
SHIMEI_KANJI_N | 中文名 | Char | 32 | NOT NULL | |
TEL_SHIGAI_1 | 电话1(市外) | Char | 8 | NOT NULL | |
TEL_SHINAI_1 | 电话1(市内) | Char | 8 | NOT NULL | |
TEL_BANGO_1 | 电话1(其它) | Char | 8 | NOT NULL | |
TEL_SHIGAI_2 | 电话2(市外) | Char | 8 | NOT NULL | |
TEL_SHINAI_2 | 电话2(市内) | Char | 8 | NOT NULL | |
TEL_BANGO_2 | 电话3(其它) | Char | 8 | NOT NULL | |
TEL_SHIGAI_3 | 电话3(市外) | Char | 8 | NOT NULL | |
TEL_SHINAI_3 | 电话3(市内) | Char | 8 | NOT NULL | |
TEL_BANGO_3 | 电话3(其它) | Char | 8 | NOT NULL | |
BIRTH_DAY | 出生年月日 | Char | 8 | NULL | |
MEMBER_KBN | 会员种类 | Char | 1 | NULL | |
FM_KBN | 性别 | Char | 1 | NULL | |
MEMBER_ZIP | 邮政编码 | Char | 8 | NOT NULL | |
ADDR_1 | 地址1 | Char | 32 | NOT NULL | |
ADDR_2 | 地址2 | Char | 48 | NOT NULL | |
ADDR_3 | 地址3 | Char | 48 | NOT NULL | |
ADDR_4 | 地址4 | Char | 48 | NOT NULL | |
NYUKAI_TENPO | 入会的店铺编码 | Char | 6 | NULL | |
MUKOU_KBN | 起效种类 | Char | 1 | NULL | |
HOLD_CODE | 家庭所属代码 | Char | 13 | NULL | |
ADD_YMDHMS | 注册时间 | Char | 14 | NULL | |
ADD_TANTOU | 注册负责人ID | Char | 6 | NULL | |
UPD_YMDHMS | 更新时间 | Char | 14 | NULL | |
UPD_TANTOU | 更新负责人ID | Char | 6 | NULL |
表4 FSPTB_MEMBER_STATUS(会员状态)
主键 | 列(属性)名 | 中文名称 | 类型 | 宽度 | 是否允许为空 |
◎ | MEMBER_CODE | 会员编码 | Char | 13 | NOT NULL |
OLD_MEMBER_CODE | 旧会员编码 | Char | 13 | NULL | |
DOMINANT_CODE | 优先级别编码 | Char | 3 | NOT NULL | |
TENPO_CODE | 店铺号码 | Char | 6 | NOT NULL | |
OLD_DOMINANT_CODE | 旧优先级别编码 | Char | 3 | NOT NULL | |
OLD_TENPO_CODE | 旧店铺编码 | Char | 6 | NOT NULL | |
UPD_KBN | 更新种类 | Char | 1 | NULL | |
MSTS_AUTO_ID | 记录番号 | Numeric | 15 | NULL |
表5 FSPTB_POINT(积分)
主键 | 列(属性)名 | 中文名称 | 类型 | 宽度 | 是否允许为空 |
◎ | MEMBER_CODE | 会员编码 | Char | 13 | NOT NULL |
OLD_MEMBER_CODE | 旧会员编码 | Char | 13 | NULL | |
YUTAI_RANK | 优惠等级 | Char | 2 | NULL | |
NOW_POINT | 现在积分点 | 9 | 8 | NULL | |
RUIKEI_POINT | 累计积分点 | 9 | 8 | NULL | |
OUT_RUIKEI_POINT | 支出的累计积分点 | 9 | 8 | NULL | |
ADD_RUIKEI_POINT | 增加的累计积分点 | 9 | 8 | NULL | |
KIHON_RUIKEI_POINT | 基本累计积分点 | 9 | 8 | NULL | |
BONUS_RUIKEI_POINT | 奖励累计积分点 | 9 | 8 | NULL | |
KAIAGE_R | 最后交易时间 | Char | 8 | NULL | |
TUKI_KAIAGE_M | 每月交易金额 | 9 | 10 | NULL | |
BEFORE_TUKI_KAIAGE_M | 上月交易金额 | 9 | 10 | NULL | |
KAIAGE_F | 交易次数 | 9 | 5 | NULL | |
KAIAGE_M | 交易金额 | 9 | 10 | NULL | |
MEMBER_WARIBIKI_M | 打折累计金额 | 9 | 10 | NULL | |
KOUNYU_M | 购买金额 | 9 | 10 | NULL | |
MUKOU_KBN | 起效种类 | Char | 1 | NULL | |
ADD_YMDHMS | 登陆时间 | Char | 14 | NULL | |
ADD_TANTOU | 登陆负责人ID | Char | 6 | NULL | |
UPD_YMDHMS | 更新时间 | Char | 14 | NULL | |
UPD_TANTOU | 更新负责人ID | Char | 6 | NULL | |
SYSTEM_UPD_YMDHMS | 系统更新时间 | Char | 14 | NULL |
表6 FSPTB_POINT_JNL(积分更新记录)
主键 | 列(属性)名 | 中文名称 | 类型 | 宽度 | 是否允许为空 |
TENPO_CODE | 店舗CODE | Char | 6 | NOT NULL | |
MEMBER_CODE | 会员CODE | Char | 13 | NOT NULL | |
CLIENT_NO | 顾客NO | Char | 8 | NOT NULL | |
ADD_POINT_B | 当日追加POINT(更新前) | 9 | 6 | NOT NULL | |
OUT_POINT_B | 当日支出POINT(更新前) | 9 | 6 | NOT NULL | |
NOW_POINT_B | 現在POINT(更新前) | 9 | 8 | NOT NULL | |
BONUS_POINT_B | 当日奖励POINT(更新前) | 9 | 8 | NOT NULL | |
OUT_KAIAGE_M_B | 当日減算金額(更新前) | 9 | 10 | NOT NULL | |
ADD_KAIAGE_M_B | 当日加算金額(更新前) | 9 | 10 | NOT NULL | |
TUKI_KAIAGE_M_B | 月购买金額(更新前) | 9 | 10 | NOT NULL | |
ADD_POINT_A | 当日追加POINT(更新后) | 9 | 6 | NOT NULL | |
ADD_RIYU_CODE | 追加理由CODE | Char | 2 | NOT NULL | |
OUT_POINT_A | 当日支出POINT(更新后) | 9 | 6 | NOT NULL | |
OUT_RIYU_CODE | 支出理由CODE | Char | 2 | NOT NULL | |
NOW_POINT_A | 現在POINT(更新后) | 9 | 8 | NOT NULL | |
BONUS_POINT_A | 当日奖励POINT(更新后) | 9 | 8 | NOT NULL | |
OUT_KAIAGE_M_A | 当日減算金額(更新后) | 9 | 10 | NOT NULL | |
ADD_KAIAGE_M_A | 当日加算金額(更新后) | 9 | 10 | NOT NULL | |
TUKI_KAIAGE_M_A | 月购买金額(更新后) | 9 | 10 | NOT NULL | |
KURIKOSHI_POINT | 转入POINT | 9 | 8 | NOT NULL | |
TODAY_POINT | 本日最終POINT | 9 | 8 | NOT NULL | |
UPD_YMDHMS | 更新日期 | Char | 14 | NOT NULL | |
UPD_TANTOU | 担当者CODE | Char | 6 | NOT NULL | |
JNL_AUTO_ID | 记录ID | Numeric | 15 | NOT NULL |
表7 FSPTB_POINT_RIREKI(积分当日消费记录)
主键 | 列(属性)名 | 中文名称 | 类型 | 宽度 | 是否允许为空 |
◎ | MEMBER_CODE | 会员CODE | Char | 13 | NOT NULL |
YMD | 日期 | Char | 8 | NOT NULL | |
YUTAI_RANK | 优待等级 | Char | 2 | NULL | |
KIHON_POINT | 当日基本POINT | 9 | 6 | NULL | |
BONUS_POINT | 当日奖励POINT | 9 | 6 | NULL | |
ADD_POINT | 当日追加POINT | 9 | 6 | NULL | |
OUT_POINT | 当日支出POINT | 9 | 6 | NULL | |
NOW_POINT | 現在POINT | 9 | 8 | NOT NULL | |
UPD_YMDHMS | 更新日期 | Char | 14 | NOT NULL | |
UPD_TANTOU | 担当者CODE | Char | 6 | NULL |
FSPTB_POINT_JNL |
FSPTB_POINT_RIREKI |
FSPTB_POINT |
FSPTB_MEMBER |
FSPTB_MEMBER_STATUS |
FSPTB_LOG |
积分失效模块 |
CSV |
图1 积分失效处理流图
FSP_EFI010.DAT |
POSYYYYMMDDXX.DAT |
分析数据作成模块 |
FSPTB_LOG |
图2 数据分析模块流图
图形注释: :数据文件 :数据库表 :功能模块 :数据流 |
图3 注释图
-
- 内部设计(详细设计)
- 程序初期设定。
如果出现错误,输出错误信息,程序结束。
- 输出开始日志记录。
(1)如果出现错误,程序结束。
(2)否则,取得系统前一年日期。
- 处理日期check。
(1)读入初始设定的会员信息数据文件。
-
- 如果出现错误,输出错误信息,程序结束。
- 否则,取得POINT实效日期。
(2)设定会员信息数据文件。
系统日期不是POINT实效处理日期的场合,输出信息,程序结束。
- POINT实效处理。
- CSV文件读入。
- 如果出现错误,输出错误信息,程序结束。
- 取得文件名。
- 打开CSV文件。
- POINT失效对象抽出(1)
- CSV文件读入。
- 从FSPTB_POINT中读取会员CODE。
条件:最后购买日期在一年前&&现在POINT不为0。
失效区分有效。
- 抽出失效区分有效数据。
- POINT失效对象抽出(2)
- 从FSPTB_POINT和FSPTB_MEMBER中读取会员CODE。
条件:会员CODE匹配;入会日期在一年以前;失效区分有效;买入次数为0;现在POINT不为0。
- 返回值不为空。
- 各表的更新处理
-
- 从FSPTB_POINT中取出匹配会员的数据。
条件:会员编号是匹配会员编号。
-
- 匹配会员的POINT信息更新。
参照“POINT信息项目移动表”。
-
- 从FSPTB_MEMBER中取出匹配会员的数据。
条件:会员编号是匹配会员编。
-
-
- 匹配用户数据的店铺CODE为NULL的场合。
-
输出信息,处理终止。
-
-
- 否则,取得店铺CODE。
- 从FSPTB_POINT_RIREKI中取出匹配会员的POINT履历信息数据。
-
条件:会员编号是匹配会员编号;日期在系统日期之前。
-
-
- 如果出现错误,输出错误信息,程序结束。
- 在FSPTB_POINT_JNL中追加数据。
- 匹配用户的POINT更新日志不存在。
-
参照“POINT更新日志新建项目移动表”。
-
-
- 匹配用户的POINT更新日志存在。
-
参照“POINT更新日志更新项目移动表”。
-
- FSPTB_POINT_RIREKI的追加更新。
条件:会员编号是匹配会员编号;日期在系统日期之前。
-
-
- 通过(4)取得的POINT履历是EOF的情况,新追加POINT履历。
-
参照“POINT履历(追加)项目移动表”。
-
-
- 通过(4)取得的POINT履历不是EOF的情况,存储初始状态,并更新,参照“POINT履历(更新)项目移动表”。
- 在FSPTB_POINT中检索匹配的用户数据。
-
条件:用户CODE是匹配用户CODE;
-
- 不是EOF的情况,程序结束。
- 如果是EOF ,在FSPTB_MEMBER追加新的数据。
参照“用户数据项目移动表”。
-
- CSV文件数据输出。
参照“CSV文件项目移动表”。
- 输出结束日志。
表8 POINT信息项目移动表
移动表名称 | 移动操作地址名称 | A | FSPTB_POINT | ||||
POINT信息项目移动表 | B | ||||||
C | |||||||
D | |||||||
编辑项目名称 | 原项目名称 | A | B | C | D | 移动方式 | |
现在POINT | 0 | ||||||
消费累计POINT | 消费累计POINT+当前POINT | ||||||
担当者CODE | NULL | ||||||
系统更新时间 | 执行操作时系统时间 | ||||||
表9 POINT更新日志新建项目移动表
移动表名称 | 移动操作地址名称 | A | FSPTB_MEMBER | ||||
POINT更新日志新建项目移动表 | B | FSPTB_POINT | |||||
C | |||||||
D | |||||||
编辑项目名称 | 原项目名称 | A | B | C | D | 移动方式 | |
店铺CODE | 店铺CODE | Y | FSPTB_MEMBER的店舗CODE的右3位数的值
| ||||
会员CODE | 会员CODE | Y | 同项目 | ||||
顾客NO | NULL | ||||||
当日追加POINT(更新前) | 0 | ||||||
当日支出POINT(更新前) | 0 | ||||||
现在POINT(更新前) | 现在POINT | Y | 同项目 | ||||
当日获赠POINT(更新前) | 0 | ||||||
当日减算金额(更新前) | 0 | ||||||
当日加算金额(更新前) | 0 | ||||||
月中购买金额(更新前) | 0 | ||||||
当日追加POINT(更新后) | 0 | ||||||
追加理由CODE | NULL | ||||||
当日追加POINT(更新后) | 现在POINT | Y | 同项目 | ||||
支出理由CODE | “04” | ||||||
现在POINT(更新后) | 0 | ||||||
当日奖励POINT(更新后) | 0 | ||||||
当日减算金额(更新后) | 0 | ||||||
当日加算金额(更新后) | 0 | ||||||
月中购买金额(更新后) | 0 | ||||||
转入POINT | 0 | ||||||
本日最终POINT | 0 | ||||||
更新时间 | 当前的时间 | ||||||
执行者CODE | NULL | ||||||
记录号 | 自动获取 | ||||||
表10 POINT更新日志更新项目移动表
移动表名称 | 移动操作地址名称 | A | FSPTB_MEMBER | ||||
POINT更新日志更新项目移动表 | B | FSPTB_POINT | |||||
C | FSPTB_POINT_RIREKI | ||||||
D | |||||||
编辑项目名称 | 原项目名称 | A | B | C | D | 移动方式 | |
店铺CODE | 店铺CODE | Y | FSPTB_MEMBER的店舗コード的右3位数的值
| ||||
会员CODE | 会员CODE | Y | 同项目 | ||||
顾客NO | NULL | ||||||
当日追加POINT(更新前) | 当日追加POINT | Y | 同项目 | ||||
当日支出POINT(更新前) | 当日支出POINT | Y | 同项目 | ||||
现在POINT(更新前) | 现在POINT( | Y | 同项目 | ||||
当日获赠POINT(更新前) | 当日获赠POINT | Y | 同项目 | ||||
当日减算金额(更新前) | 0 | ||||||
当日加算金额(更新前) | 0 | ||||||
月中购买金额(更新前) | 0 | ||||||
当日追加POINT(更新后) | 同项目 | ||||||
追加理由CODE | NULL | ||||||
当日追加POINT(更新后) | 当日追加POINT | Y | 同项目 | ||||
支出理由CODE | “04” | ||||||
现在POINT(更新后) | 0 | ||||||
当日奖励POINT(更新后) | 0 | ||||||
当日减算金额(更新后) | 0 | ||||||
当日加算金额(更新后) | 0 | ||||||
月中购买金额(更新后) | 0 | ||||||
转入POINT | 0 | ||||||
本日最终POINT | 0 | ||||||
更新时间 | 前一日的时间 | ||||||
执行者CODE | NULL | ||||||
记录号 | 自动获取 | ||||||
表11 POINT履历(追加)项目移动表
移动表名称 | 移动操作地址名称 | A | FSPTB_MEMBER | ||||
POINT履历(追加)项目移动表 | B | FSPTB_POINT | |||||
C | |||||||
D | |||||||
编辑项目名称 | 原项目名称 | A | B | C | D | 移动方式 | |
会员CODE | 会员CODE | Y | 同项目 | ||||
日期 | 执行时的时间 | ||||||
优待等级号 | 优待等级号 | Y | 同项目 | ||||
当日基本POINT | 0 | ||||||
当日奖励POINT | 0 | ||||||
当日追加POINT | 0 | ||||||
当日支出POINT | 现在POINT | Y | 同项目 | ||||
现在POINT | 0 | ||||||
更新时间 | 执行时时间 | ||||||
执行者CODE | NULL | ||||||
表12 POINT履历(更新)项目移动表
移动表名称 | 移动操作地址名称 | A | FSPTB_MEMBER | ||||
POINT履历(更新)项目移动表 | B | ||||||
C | |||||||
D | |||||||
编辑项目名称 | 原项目名称 | A | B | C | D | 移动方式 | |
当日支出POINT | Y | 当日支出POINT+现在POINT | |||||
现在POINT | 0 | ||||||
执行者CODE | Y | NULL | |||||
更新日期 | 执行操作时的日期 | ||||||
表13用户数据项目移动表
移动表名称 | 移动操作地址名称 | A | FSPTB_MEMBER | ||||
用户数据项目移动表 | B | ||||||
C | |||||||
D | |||||||
编辑项目名称 | 原项目名称 | A | B | C | D | 移动方式 | |
会员CODE | Y | 同项目 | |||||
旧会员CODE | NULL | ||||||
Dominant CODE | NULL | ||||||
店铺CODE | 店铺CODE | 同项目 | |||||
旧Dominant CODE | NULL | ||||||
旧店铺CODE | NULL | ||||||
更新区分 | “1” | ||||||
记录号 | 自动获取 | ||||||
- 初期处理。
(1)共通文件(INI)取得。
如存在错误,输出错误信息,程序结束。
(2)输出开始日志。
- 分析用POS明细文件作成。
(1)文件检查处理。
-
- 检查POS明细文件路径。
如果不存在,输出错误日志,程序结束。
-
- 生成POS明细文件。
如果超过99个,直接跳转到步骤3。
-
- 检查POS项目信息文件路径。
如果不存在,输出错误日志,程序结束。
-
- 检查POS项目信息文件。
如果不存在,输出错误日志,程序结束。
(2)读取POS项目信息文件。
当数据读完,结束。
(3)POS明细文件CODE作成。
(4)参照“项目数据移动表”。
- 结束处理。
输出结束日志。
表14项目数据移动表
移动表名称 | 移动操作地址名称 | A | FSP_EFI010.DAT | ||||
项目数据移动表 | B | ||||||
C | |||||||
D | |||||||
编辑项目名称 | 原项目名称 | A | B | C | D | 移动方式 | |
record区分 | record区分 | Y | 同项目 | ||||
店铺CODE | 店铺CODE | Y | 同项目 | ||||
register NO | terminal NO | Y | |||||
店铺CODE | 店铺CODE | Y | 同项目 | ||||
receipt NO | 购买编号 | Y | |||||
购买日期 | 购买日期 | Y | 同项目 | ||||
购买时间 | 购买时间 | Y | 同项目 | ||||
会员CODE | 会员CODE | Y | 同项目 | ||||
商品分类号1 | 大分类号 | Y | JAN CODE的左1~2位 | ||||
商品分类号2 | 中分类号 | Y | JAN CODE的左3~4位 | ||||
商品分类号3 | 小分类号 | Y | JAN CODE的左5~7位 | ||||
商品分类号4 | 细分类号 | Y | JAN CODE的左8~13位 | ||||
扩充预留 | “0” | ||||||
JAN CODE | Y | 如果FSP_EFI010.DAT中的JANCODE="0000000000000", JANCODE=""9999999"+GPCODE的右2位+部门CODE的右4位.否则, JANCODE等于FSP_EFI010.DAT中JANCODE | |||||
商品名 | 商品名 | Y | 同项目 | ||||
购买点数 | 购买点数 | Y | 同项目 | ||||
购买金额 | Y | FSP_EFI010.DAT中的‘消费金额’-折扣价-贴现价-按比例折扣价-按比例贴现价-按比例M&M值 | |||||
折扣价 | "0000000" | ||||||
特价区分 | FSP_EFI010.DAT中的‘会员价格’不等于0则设为“1”,否则设为“0” | ||||||
内税符号 | GPCODE的右2位=“90”且购买点数=“000”且部门CODE的右4位=“9701”或“9702”或“9703”,则置“1”; 退货交易=”1”或者购买金额的计算结果<0,则置“1”;其他情况置位空格 | ||||||
原价 | "000000" | ||||||
备注 | 两个空格 | ||||||
开发环境为Eclipse3.2,JDK包采用版本为jdk1.5.0_06。OBDC数据源为tokyosuper。数据库登录帐号:sa ;密码:123456。
图4 积分失效模块流程图
图5 数据分析模块模块流程图
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");/*注册数据库驱动程序为 SQL JDBC-ODBC驱动*/
}
catch (ClassNotFoundException e) { /*如无法找到该驱动,则捕获异常,并输出错误*/
// TODO Auto-generated catch block
e.printStackTrace();
}
INI文件中记录了本系统中所有数据文件的存储地址。因此,在开始模块编码前,一定要先读取该文件。专门建立一个类Iniread.java来实现各种功能。具体如下:
成员变量:
FileReader inOjb; //创建一个用来读取字符文件的对象
BufferedReader br; //创建一个使用默认大小输入缓冲区的缓冲字符输入流。
Connection con; //与特定数据库的连接
Statement stmt; //用于执行静态 SQL 语句并返回它所生成结果的对象
String url; //定义数据源名
String user; //定义数据源的login name
String password; //定义数据源的密码
/*构造方法(参数是为了进行数据库连接,在读取INI文件过程中如出现错误则将错误 日志输入数据库的LOG表)*/
Iniread(String url,String user,String password){
inOjb=new FileReader("FSP.INI");
br=new BufferedReader(inOjb);
…
…
}
/*此方法用于获取数据文件在服务器上的地址,参数是数据文件名*/
public String getaddress(String a) {
str=br.readLine(); //读取INI文件中的一行
…
…
}
//向数据库插入一条数据,此处temp除可进行插入操作外,还能进行更新,删除操作
String url="jdbc:odbc:tokyosuper"; //定义数据源名
String user="sa"; //定义数据源的login name
String password="123456"; //定义数据源的密码
String temp="INSERT INTO FSPTB_LOG(P_Sel,P_Msg,P_AppNM,P_FuncNM,P_JobNM,p_ErrDetail,P_InIFile) VALUES('L','读取文件错误','查找的地址不存在','iniread ','iniread ','FSP.INI读取出错','FSP.INI')";
try {
con=DriverManager.getConnection(url,user,password);
stmt=con.createStatement();
stmt.executeUpdate(temp);
con.close();
}
catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//在数据库中查询数据查询的结果全部存放于ResultSet的对象中,利用next方法可以读取结果集的第一行,以后每执行一次,向下跳转一行。getxxx方法可以获得结果集中的某一项其中xxx为该项的属性,如String等
try {
con=DriverManager.getConnection(url,user,password);
stmt=con.createStatement();
String temp="SELECT MEMBER_CODE,TENPO_CODE FROM FSPTB_MEMBER WHERE MEMBER_CODE='"+member+"'";
ResultSet rs=stmt.executeQuery(temp);
rs.next();
String tenpo=rs.getString("TENPO_CODE");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//判断文件路径或文件是否存在,File的exists方法返回是ture则存在。
File posdata=new File(Pos_Data);
File outposprefix=new File(Pos_Data,Out_Pos_PreFIX);
posdata.exists();
outposprefix.exists();
//打开文件,逐条读取
FileReader fr=new FileReader(positem.getPath());
BufferedReader inOjb = new BufferedReader(fr);
str=inOjb.readLine();
while(str!=null)
{
…
}
//打开文件写入数据
String address=file.getPath();
FileWriter fw;
try {
fw = new FileWriter(address,true);//打开address所表示的文件,ture表示在该文件末尾写入数据,而非文件的开始处
BufferedWriter out=new BufferedWriter(fw);
//从新的一行开始写入
out.newLine();
//写入新的一行信息
out.write(str,0,str.length());
out.close();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
本系统属于一款商务应用型软件,因此,对各种可能出现的错误情况要有很高的检测能力,并进行响应处理。所以,在软件开发完成后,为了检验是否达到客户要求需要进行全面的测试,包括程序的逻辑处理,输入/输出处理,边界条件判断,异常处理等。在进行测试前,应针对上述各情况填写一份全面的单元测试检测清单。
表 15 积分失效模块单元检测表
项目名称 | POINT失效 | 项目标记名 | FSPB1400 | |
测试编号 | 测试内容 | 测试结果 | ||
***异常测试*** | ||||
*共通文件(INI)取得* | ||||
1 | INI文件不存在的场合 | 向数据库日志表输出”INI文件地址错误。”消息。 程序结束 | ||
2 | INI文件打开出错,或INI文件不可打开 | 向数据库日志表输出”INI文件地址错误。”消息。 程序结束 | ||
3 | 在INI文件中,文件地址、标记值、内容值不存在 | 向数据库日志表输出”INI设定错误。”消息。 程序结束 | ||
4 | POINT失效处理日期取得错误 | 向数据库日志表输出”非失效处理日期。”消息。 程序结束 | ||
*CSV文件准备处理* | ||||
5 | 无法取得CSV文件名 | 向数据库日志表输出”POINT失效处理失败。”消息。 程序结束 | ||
6 | 无法打开CSV文件 | 向数据库日志表输出”POINT失效处理失败。”消息。 程序结束 | ||
*数据库更新处理时共通错误* | ||||
7 | 各表更新处理时出错 | 向数据库日志表输出”POINT失效处理失败。”消息。 程序结束 | ||
*检索、获取数据时错误* | ||||
8 | 店铺CODE取得错误 | 向数据库日志表输出“ ‘店铺CODE未设定,会员号:’+检索的会员号”消息。 数据不更新,程序结束 | ||
9 | POINT信息取得错误 | 向数据库日志表输出“ ‘POINT信息获取失败,会员号:’+检索的会员号”消息。 数据不更新,程序结束 | ||
10 | POINT履历取得错误 | 向数据库日志表输出“ ‘POINT履历获取失败,会员号:’+检索的会员号”消息。 数据不更新,程序结束 | ||
11 | 会员信息取得错误 | 向数据库日志表输出“ 会员信息获取失败,会员号:’+检索的会员号”消息。 数据不更新,程序结束 | ||
12 | 会员数据检索失败 | 向数据库日志表输出“ 会员数据检索失败,会员号:’+检索的会员号”消息。 数据不更新,程序结束 | ||
*插入、更新数据时错误* | ||||
13 | POINT履历插入错误 | 向数据库日志表输出“ POINT履历插入失败,会员号:’+检索的会员号”消息。 原数据不改变,程序结束 | ||
14 | 会员履历更新错误 | 向数据库日志表输出“ 会员履历插入失败,会员号:’+检索的会员号”消息。 原数据不改变,程序结束 | ||
15 | POINT更新日志插入失败 | 向数据库日志表输出“ POINT更新日志插入失败,会员号:’+检索的会员号”消息。 原数据不改变,程序结束 | ||
16 | 会员数据更新失败 | 向数据库日志表输出“ 会员数据更新失败,会员号:’+检索的会员号”消息。 原数据不改变,程序结束 | ||
17 | POINT表更新错误 | 向数据库日志表输出“ POINT表更新失败,会员号:’+检索的会员号”消息。 原数据不改变,程序结束 | ||
18 | CSV文件写入错误 | 向数据库日志表输出“ CSV文件写入失败,日期:’+当前日期”消息。 原数据不改变,程序结束 | ||
***正常测试*** | ||||
19 | 无错误的情况 | 所有处理正常执行,程序正常结束 | ||
*初期处理* | ||||
20 | 开始日志输出 | 正常输出 | ||
*POINT失效对象取出条件检查1* POINT表中取出会员号 | ||||
21 | 最终购买日是一年前的后一天 | 对应的会员数据不进行更新 | ||
22 | 最终购买日是一年内的任意一天 | 对应的会员数据不进行更新 | ||
23 | 当前POINT已经是0 | 对应的会员数据不进行更新 | ||
24 | 失效区分为无效 | 对应的会员数据不进行更新 | ||
25 | 最终购买日正好是一年前、现在POINT不为0且失效区分有效的记录为0个 | 所有的会员信息不进行更新 | ||
26 | 最终购买日是一年前的前一天、现在POINT不为且失效区分有效的记录为0个 | 所有的会员信息不进行更新 | ||
27 | 最终购买日是一年前的某一天、现在POINT不为0且失效区分有效的记录为0个 | 所有的会员信息不进行更新 | ||
28 | 最终购买日正好是一年前、现在POINT不为0且失效区分有效的记录大于0个 | 对该范围的会员信息进行更新、并且更新正确 | ||
29 | 最终购买日是一年前的前一天、现在POINT不为且失效区分有效的记录大于0个 | 对该范围的会员信息进行更新、并且更新正确 | ||
30 | 最终购买日是一年前的某一天、现在POINT不为0且失效区分有效的记录大于0个 | 对该范围的会员信息进行更新、并且更新正确 | ||
*POINT失效对象取出条件检查2* POINT表及会员信息表中取出会员号 | ||||
31 | 未检测到该会员CODE | 对应的会员数据不进行更新 | ||
32 | 入会日期是一年前的后一天 | 对应的会员数据不进行更新 | ||
33 | 入会日期是一年内的某一天 | 对应的会员数据不进行更新 | ||
34 | 失效区分无效 | 对应的会员数据不进行更新 | ||
35 | 购买次数不为0 | 对应的会员数据不进行更新 | ||
36 | 现在POINT为0 | 对应的会员数据不进行更新 | ||
37 | 会员CODE检测的到、最终购买日正好是一年前、现在POINT不为0且失效区分有效的记录为0个 | 所有的会员数据不进行更新 | ||
38 | 会员CODE检测的到、最终购买日正好是一年前的前一天、现在POINT不为0且失效区分有效的记录为0个 | 所有的会员数据不进行更新 | ||
39 | 会员CODE检测的到、最终购买日正好是一年前的某一天、现在POINT不为0且失效区分有效的记录为0个 | 所有的会员数据不进行更新 | ||
40 | 会员CODE检测的到、最终购买日正好是一年前、现在POINT不为0且失效区分有效的记录大于0个 | 对该范围的会员信息进行更新、并且更新正确 | ||
41 | 会员CODE检测的到、最终购买日正好是一年前的前一天、现在POINT不为0且失效区分有效的记录大于0个 | 对该范围的会员信息进行更新、并且更新正确 | ||
42 | 会员CODE检测的到、最终购买日正好是一年前的某一天、现在POINT不为0且失效区分有效的记录大于0个 | 对该范围的会员信息进行更新、并且更新正确 | ||
*各表的编辑处理* | ||||
43 | POINT信息更新 | 输出正确(参照“POINT信息项目移动表”) | ||
44 | 该会员的POINT更新日志不存在的情况 | 输出正确(参照“POINT更新日志新建项目移动表”) | ||
45 | 该会员的POINT更新日志已经存在的情况 | 输出正确(参照“POINT更新日志更新项目移动表”) | ||
46 | POINT履历中取得的该会员的POINT履历是EOF的场合 | 输出正确(参照“POINT履历(追加)项目移动表”以及“用户数据项目移动表“) | ||
47 | POINT履历中取得的该会员的POINT履历不是EOF的场合 | 输出正确(参照“POINT履历(更新)项目移动表” ),程序结束 | ||
48 | CSV文件数据输出 | 输出正确(参照“CSV文件项目移动表” ) | ||
*结束处理* | ||||
49 | 终了日志的输出 | 终了日志正确输入到数据库日志表 | ||
表16 分析用POS明细作成模块单元检测表
项目名称 | 分析用POS明细作成 | 项目标记名 | FSPB1310 | |
测试编号 | 测试内容 | 测试结果 | ||
***异常测试*** | ||||
*共通文件(INI)取得* | ||||
1 | INI文件不存在的场合 | 向数据库日志表输出”INI文件地址错误。”消息。 程序结束 | ||
2 | INI文件打开出错,或INI文件不可打开 | 向数据库日志表输出”INI文件地址错误。”消息。 程序结束 | ||
3 | 在INI文件中,文件地址、标记值、内容值不存在 | 向数据库日志表输出”INI设定错误。”消息。 程序结束 | ||
*文件存在检查* | ||||
4 | POS明细数据文件路径不存在 | 向数据库日志表输出“ 外部分析用POS明细数据文件路径不存在”消息。 程序结束 | ||
5 | 外部分析用POS明细数据文件超过99个 | 向数据库日志表输出“ 外部分析用POS明细数据文件超出99个”消息。 程序结束 | ||
6 | POS情报项目文件路径不存在 | 向数据库日志表输出“ POS情报项目文件路径不存在”消息。 程序结束 | ||
7 | POS情报项目文件不存在 | 向数据库日志表输出“ POS情报项目文件不存在”消息。 程序结束 | ||
*分析用POS明细作成处理* | ||||
8 | 处理过程中出现错误 | 显示该系统错误 向数据库日志表输出“ POS明细作成出错”消息。 程序结束 | ||
***正常测试*** | ||||
9 | 无错误的情况 | 所有处理正常执行,程序正常结束 | ||
*初期处理* | ||||
10 | 开始日志输出 | 正常输出 | ||
*分析用明细作成项目编辑* | ||||
11 | 明细文件CODE作成 | 正确输出(参照) | ||
12 | 外部分析用POS明细文件是0的场合 | POSYYYYMMDD01.DAT文件正确作成 | ||
13 | 外部分析用POS明细文件是1的场合 | POSYYYYMMDD02.DAT文件正确作成 | ||
14 | 外部分析用POS明细文件是50的场合 | POSYYYYMMDD51.DAT文件正确作成 | ||
15 | 外部分析用POS明细文件是98的场合 | POSYYYYMMDD99.DAT文件正确作成 | ||
*结束处理* | ||||
16 | 终了日志的输出 | 终了日志正确输入到数据库日志表 | ||
在准备好测试数据,配置好测试环境后,根据测试清单上的内容,逐条进行测试,其中,如果中途发现BUG存在,并对程序进行相应更改的话,则前面所做的测试全部作废,需重新开始测试。
积分失效模块测试
如图6所示编号为842345143672的会员其注册日期为一年以前。其积分失效区分为有效。
图6 用户注册信息表
如图7所示该用户当前积分为130
图7 用户POINT信息表
图8所示为该用户积分被清零
图8 用户积分清零
数据分析模块测试结果如图9所示
图9 分析用POS明细文件生成
FSP_EFI010.DAT文件中测试数据:
123456,sdcdsc,21458,20080525,13,1234567890123,2001010000000,苹果,122,554545,1234,2,1245,1222,1235,5589,7789,2490,009701
123456,sdcdsc,21458,20080525,13,1234567890123,2001010000000,苹果,122,254545,1234,1,1245,1222,1235,5589,7789,2490,009701
生成POS明细文件POS2004011004.DAT中结果数据如下:
51,123456,sdcdsc,20080525,13,1234567890123,20,01,010,000000,02001010000000,苹果,122,554545,0000000,0, ,000000,
51,123456,sdcdsc,20080525,13,1234567890123,20,01,010,000000,02001010000000,苹果,122,254545,0000000,0, ,000000,
结 论
本次设计的内容主要是对积分失效和数据处理模块进行设计。其中积分失效模块对一年内未购买任何物品的会员,进行积分过期失效处理。这样做可以刺激用户消费,提高销售业绩。而数据分析模块则是对商品销售信息进行分析,对各种类型的商品销售情况,销售利润做成数据资料以供外部分析使用。作为商务用软件,错误检测机制尤为重要。因此,在模块开发时应考虑到各种实发情况的出现,并做出相应处理。在完成程序开发后,做了单元检测清单(PCL),并进行测试,验证了软件的有效性,发现并修补缺陷,以提高软件质量,确保开发出用户满意的软件产品。
通过本次设计,进一步学习了Java编程语言和SQL数据库知识。比如Java编程中如何建立JDBC桥接器,怎样运用Java中的各种类对象,怎样查询API知识,以及怎样用Java来查询数据库表等等。而且还学习了怎样对各种文件进行操作。在操作文件方面遇到了很多问题,特别是在文件的写入方面,花了很多的时间才成功地向文件里写入内容。以上都是在编程时所涉及到的知识,其实在编程之前还要构架环境,在这一方面也有很多问题,比如在设置数据源时,这要根据数据源是在本机还是其它服务器的不同来设置。这些问题都在老师的细心指导下成功地解决的。
在这次的设计中,不仅巩固和加深了以前所学的理论知识,而且在实践方面也吸取了很多经验。某百货店POS积分管理系统是由一个团队所开发的。因此在开发过程中还让我了解到团队精神的重要性。潜意识里没有协力合作互相帮助的概念,整个项目的开发是没有办法进行的。在短短两个多月时间里,在老师的指导和同学的帮助下,我顺利完成了积分失效和数据分析模块的功能实现。
参考文献
[1] 罗积玉,李超.软件工程推进方法[M].四川:电子科技大学出版社,2004.9。
[2] 杜斌,幸利.软件设计工程[M].四川:电子科技大学出版社,2004.9。
[3] 李超,罗积玉.软件制造工程[M].四川:电子科技大学出版社,2004.9。
[4] 林邦杰.Java程序设计入门教程[M].北京:中国青年出版社,2001。
[5] John D.mcGregor David A.Skyes[美].面向对象的软件测试[M].杨文宏等译.北京:机械工业出版社,2002。
[6] 周竞涛.Eclipse完全手册 基础·进阶·高级[M].北京:电子工业出版社,2006。
[7] 萧仁惠, 陈锦辉.JDBC数据库程序设计[M].北京:中国铁道出版社,2002。
参考资料:
java毕业设计——JAVA某店POS积分管理系统(源代码+论文).zip