A. 业务流程建模。
B. 领域建模。
A. 系统用例图。
B. 用例详述文本。
UC2:收银
范围:便利店POS应用
级别:用户目标
主要参与者:收银员、顾客
涉众及其关注点:
① 收银员:希望能够准确、快速地收取顾客应付金额。
② 顾客:希望以最小代价完成付款活动并得到快速服务。希望便捷、清晰地看到所输入的商品项目和价格。希望有购买凭证,以作为购买清单和作为退货的凭据。
③ 公司:希望准确地记录交易,满足顾客要求。希望能够自动、快速地更新账务和库存信息。希望系统足够健壮和容错性,当系统出现一些小问题时,也可以完成收银。
④经理:希望能够快速执行超控操作,并易于更正收银员的不当操作。
前置条件:收银员必须经过确认和认证。
成功保证(或后置条件):存储销售信息。准确计算税金。更新账务和库存信息。记录提成。生成票据。记录支付授权的批准。
主成功场景:
1、顾客携带所购商品或服务到收银台通过POS机付款。
2、收银员开始一次新的开单记录。
3、收银员输入商品条码。
4、系统逐条记录出售的商品,并显示该商品的描述、价格和累计额。价格通过一组价格规则来计算。
收银员重复3~4步,知道输入结束。
5、系统显示总额和所计算的税金。
6、收银员告知顾客总额,并请顾客付款。
7、顾客付款,系统处理支付。
8、系统记录完整的销售信息,并将销售和支付信息发送到外部的账务系统(进行账务处理和提成)和库存系统(更新库存)。
9、系统打印票据。
10、顾客携带商品和票据离开(如果有)。
扩展:
*a、经理在任意时刻要求进行超控操作:
1、系统进入经理授权模式、
2、经理或收银员执行某一经理模式的操作。
3、系统回复到收银员授权模式。
*b、系统在任意时刻失败:
为了支持恢复和更正账务处理,要保证所有交易的敏感状态和事件都能够从场景的任何一步中完全恢复。
1、收银员重启系统,登录,请求恢复上次状态。
2、系统重建上次状态。
2a、系统在恢复过程中检测到异常:
1、系统向收银员提示错误,记录次错误,并进入一个初始状态。
2、收银员开始一次新的销售交易。
1a、客户或经理需要恢复一个中断的销售交易。
1、收银员执行恢复操作,并且输入ID以提取相应的销售交易。
2、系统显示被恢复的销售交易状态及其小计。
2a、未发现对应的销售交易。
1、系统向收银员提示错误。
2、收银员可能会开始一个新销售交易,并重新输入所以商品。
3、收银员继续该次销售交易(可能要输入更多的商品或处理支付)。
2-4a、顾客告诉收银员其免税状况(例如年长者、本国人等)。
1、收银员进行核实,并输入免税状况编码。
2、系统记录该状况编码(在计算税金时使用)。
3a、无效商品ID(在系统中未发现):
1、系统提示错误并拒绝输入该ID。
2、收银员响应该错误。
2a、商品ID可读(例如,数字型的UPC):
1、收银员手动输入商品ID。
2、系统显示商品项目的描述和价格。
2a、无效商品ID:系统提示错误。收银员尝试其他方式。
2b、系统内不存在该商品ID,但是该商品附有价签:
1、收银员请求经理执行超控操作。
2、经理执行相应的超控操作。
3、收银员选择手工输入价格,输入价签上的价格,并请求对该价目进行标准计税。(因为没有产品信息,计税引擎无法确定如何计税。)
2c、收银员通过执行寻找产品帮助以获取正确的商品ID及其价格。
2d、另外,收银员可以向其他员工询问商品ID或价格,然后手工输入ID或价格(参见以上内容)。
3b、当有多个商品项目属于同一类别的时候(如5瓶可乐),不必记录每个商品项目的唯一标识:
1、收银员可以输入类别的标识和商品的数量。
3c、需要手工输入类别和价格(例如,花卉或纸牌及其价格):
1、收银员手工输入特定的类别代码及其价格。
3-6a、顾客要求收银员从所购商品中去掉一项:
所去除商品的价格必须小于收银员权限,否则需要经理执行超控操作。
1、收银员输入商品ID并将其删除。
2、系统删除该项目并显示更新后的累计额。
2a、商品价格超过了收银员权限:
1、系统提示错误,并建议经理超控。
2、收银员请求经理超控,完成超控后,重做该操作。
3-6b、顾客要求收银员取消销售交易:
1、收银员在系统中取消销售交易。
3-6c、收银员延迟销售交易:
1、系统记录销售交易信息,使其能够在任何POS登录中恢复操作。
2、系统显示用来恢复销售交易的“延迟票据”,其中包含商品项目和销售交易ID。
5a、系统检测到与外部税务计算系统服务的通信故障:
1、系统在POS机节点上重启次服务,并继续操作。
1a、系统检测到该服务无法重启。
1、系统提示错误。
2、收银员手工计算和输入税金,或者取消该销售交易。
5b、顾客声称他们符合打折条件(例如,是雇员或重要顾客):
1、收银员提出打折请求。
2、收银员输入顾客ID。
3、系统按照打折规则显示折扣总计。
5c、顾客要求兑现账户积分,用于此次销售交易:
1、收银员提交积分请求。
2、收银员输入顾客ID。
3、系统应用积分直到价格为0,同时扣除结余积分。
6a、顾客要求现金付款,但所携带现金不足:
1、顾客要求使用其他支付方式。
1a、顾客要求取消此次销售交易,收银员在系统上取消该销售交易。
7a、现金支付:
1、收银员输入收取的现金额。
2、系统显示找零金额,并弹出现金抽屉。
3、收银员放入收取的现金,并给顾客找零。
4、系统记录改现金支付。
7b、信用卡支付:
1、顾客输入信用卡账户信息。
2、系统显示其支付信息以备验证。
3、收银员确认。
3a、收银员取消付款步骤。
1、系统回复到“商品输入”模式。
4、系统向外部支付授权服务系统发送支付授权请求,并请求批准该支付。
4a、系统检测到与外部系统协作时的故障:
1、系统向收银员提示错误。
2、收银员请求顾客更换支付方式。
5、系统受到批准支付的应答并提示收银员,同时弹出现金抽屉(以便放入签名后的信用卡支付票据)。
5a、系统受到拒绝支付的应答:
1、系统向收银员提示支付被拒绝。
2、收银员请求顾客更换支付方式。
5b、应答超时。
1、系统提示收银员应答超时。
2、收银员重试,或者请求顾客更换支付方式。
6、系统记录信用卡支付信息,其中包括支付批准。
7、系统显示信用卡支付的签名输入机制。
8、收银员请求顾客签署信用卡支付。顾客输入签名。
9、如果在纸质票据上签名,则收银员将改票据放入现金抽屉并关闭抽屉。
7c、收银员取消支付步骤:
1、系统回到“商品输入”模式。
7d、顾客出示优惠券:
1、在处理支付之前,收银员记录每张优惠券,系统扣除相应金额。系统记录已使用的优惠券以备账务处理之用。
1a、输入的优惠券不适用于所购商品:
1、系统向收银员提示错误。
9a、存在产品回扣:
1、系统对每个具有回扣的商品给出回扣表单和票据。
9b、顾客索要赠品票据(不显示价格):
1、收银员请求赠品票据,系统给出赠品票据。
9c、打印票据。
1、如果系统能够检测到错误,给出提示。
2、收银员更换纸张。
3、收银员请求打印其他票据。
UC2:
1、功能性
①日志和错误处理
在持久性存储中记录所有错误。
②可插拨规则
在几个用例的不同场景点执行任意一组规则,以支持对系统功能的定制。
③安全性
任何使用都需要经过用户认证。
④国际化
支持文本显示的语言国际化,以便于处理与外国顾客的交易。
⑤正确性
系统能正确结算顾客应付的金额,不能算少或算多
2、可用性
①顾客能够看到POS大屏幕显示器的显示。因此:
应该在1米外轻松看到文本。
避免使用一般色盲人群难以辨认的颜色。
②收银员的视线通常停留在顾客或商品,而不是计算机显示器上。因此,提示和警告应该通过声音传递而不仅仅是通过图像传递。
3、可靠性
①可恢复性
如果在使用外部服务时出现错误,为了完成销售交易,需要尝试采用本地方案(如存储和转发)加以解决。
②性能
购买者希望非常快速地完成付款过程。目标是在90%情况下,能够在1分钟之内完成授权。
4.健壮性
系统对于规范要求以外的输入情况的处理能力强。当用户对系统的操作不规范时,系统能够识别这些操作,并且能有效合理的处理。
5、接口
①重要硬件和接口
(1)触摸屏(操作系统将此视为普通监视器,且触摸动作也视为鼠标事件)。
(2)票据打印机。
(3)信用卡读卡器
(4)签名读取装置
②软件接口
由于存在众多外部协作系统(税金计算器等),我们需要采用不同的接口,接入不停的系统。
6、法律问题
法律规定,在销售交易中必须遵从所以税务规则。同时,这些规则可以频繁变更。
7、所关注领域内的信息
①信用卡支付处理
当支付授权服务批准了信用卡支付后,将由支付授权服务而不是买方来负责对卖方的支付。因此,对于每笔支付,卖方都需要将授权服务的未付金额记录于其应收账户下。通常,授权服务在每晚执行电子转账操作,将卖方当天的应收总额转入其账户下,同时对每笔交易扣除(少量的)服务费。
上面的图一看就懂,一个顾客(customer)下了个订单,该订单信息包括其支付信息(payment)和购买的商品(saleorderitem),购买的商品包括商品(product),商品又包括商品类别(producttype)。形象图如下(不好意思,图太好了不得不盗):
详细数据库表如下:
/* Navicat MySQL Data Transfer Source Server : ycd Source Server Version : 50617 Source Host : localhost:3306 Source Database : ooad Target Server Type : MYSQL Target Server Version : 50617 File Encoding : 65001 Date: 2015-05-02 10:36:57 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `customer` -- ---------------------------- DROP TABLE IF EXISTS `customer`; CREATE TABLE `customer` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `ADDRESS` varchar(36) DEFAULT NULL, `CUSTOMERNAME` varchar(36) NOT NULL, `CUSTOMERNO` varchar(36) NOT NULL, `TELEPHONE` varchar(36) DEFAULT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `UK_dhenwbym43ms1mnmosa8rigo1` (`CUSTOMERNO`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of customer -- ---------------------------- INSERT INTO `customer` VALUES ('1', '无', '散客', '0000', '无'); -- ---------------------------- -- Table structure for `payment` -- ---------------------------- DROP TABLE IF EXISTS `payment`; CREATE TABLE `payment` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `amount` double DEFAULT NULL, `datetime` datetime DEFAULT NULL, `paymentMethod` int(11) DEFAULT NULL, `paymentNo` varchar(36) NOT NULL, `saleOrder_id_ID` int(11) DEFAULT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `UK_id8hdoj9ei71troeofnyd1gjx` (`paymentNo`), KEY `FK_nwnm9k8el0ujmclcw3phl9ctk` (`saleOrder_id_ID`), CONSTRAINT `FK_nwnm9k8el0ujmclcw3phl9ctk` FOREIGN KEY (`saleOrder_id_ID`) REFERENCES `saleorder` (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of payment -- ---------------------------- -- ---------------------------- -- Table structure for `product` -- ---------------------------- DROP TABLE IF EXISTS `product`; CREATE TABLE `product` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `description` varchar(100) DEFAULT NULL, `inventory` int(11) NOT NULL, `price` double DEFAULT NULL, `productName` varchar(36) NOT NULL, `productNo` varchar(36) NOT NULL, `PRODUCTTYPE_ID` int(11) NOT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `UK_me6h51vxps59trfh9nce1rfr8` (`productNo`), KEY `FK_ey7bb0tctmyd7v0d7k4glujr6` (`PRODUCTTYPE_ID`), CONSTRAINT `FK_ey7bb0tctmyd7v0d7k4glujr6` FOREIGN KEY (`PRODUCTTYPE_ID`) REFERENCES `producttype` (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of product -- ---------------------------- INSERT INTO `product` VALUES ('1', '超好吃的', '64', '1', '辣条', '1', '1'); -- ---------------------------- -- Table structure for `producttype` -- ---------------------------- DROP TABLE IF EXISTS `producttype`; CREATE TABLE `producttype` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `description` varchar(100) DEFAULT NULL, `productTypeNo` varchar(36) NOT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `UK_j449sxvmk1m2ufkq314pdndp1` (`productTypeNo`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of producttype -- ---------------------------- INSERT INTO `producttype` VALUES ('1', '零食', '1'); -- ---------------------------- -- Table structure for `saleorder` -- ---------------------------- DROP TABLE IF EXISTS `saleorder`; CREATE TABLE `saleorder` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `createDateTime` datetime DEFAULT NULL, `saleOrderNo` varchar(36) DEFAULT NULL, `state` int(11) DEFAULT '0', `total` double DEFAULT NULL, `customer_ID` int(11) DEFAULT NULL, PRIMARY KEY (`ID`), KEY `FK_5aqvq3omy2ccr32ndj7uobd6w` (`customer_ID`), CONSTRAINT `FK_5aqvq3omy2ccr32ndj7uobd6w` FOREIGN KEY (`customer_ID`) REFERENCES `customer` (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of saleorder -- ---------------------------- -- ---------------------------- -- Table structure for `saleorderitem` -- ---------------------------- DROP TABLE IF EXISTS `saleorderitem`; CREATE TABLE `saleorderitem` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `price` double NOT NULL, `quantity` int(11) NOT NULL, `product_fk` int(11) DEFAULT NULL, `SALEORDER_ID` int(11) NOT NULL, PRIMARY KEY (`ID`), KEY `FK_7xvcyjwp40gtimkhp92qduee1` (`product_fk`), KEY `FK_43dkqgryt2qkvgfk2bnjmq4e6` (`SALEORDER_ID`), CONSTRAINT `FK_43dkqgryt2qkvgfk2bnjmq4e6` FOREIGN KEY (`SALEORDER_ID`) REFERENCES `saleorder` (`ID`), CONSTRAINT `FK_7xvcyjwp40gtimkhp92qduee1` FOREIGN KEY (`product_fk`) REFERENCES `product` (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of saleorderitem -- ----------------------------