如何开发出一个POS收款应用
一、初始化数据
初始化数据一般是在欢迎页面,也就是WelcomeActivity。不管是不是POS应用,都会有都会有所谓的欢迎页面。
欢迎页面的主要作用是为了初始化基础数据和获取权限。
在POS应用中欢迎页面主要是初始化以下数据:
款台号、机构号、是否绑定、ip地址。
像这些数据一般是从共享内存中获取出来SharePrefences的,但有些数据可以设置成死的数据,例如ip地址。
如何还有其他需要初始化的数据也是在这里初始化,初始化的数据一般是全局变量。
创建一个类叫Variable,主要通过它保存全局变量,例如:
/**
全局变量
**/
public class Variable{
public static String posNo;//款台号
public static String shopId;//机构号
}
除了Variable用来保存变量外,我们还需要Constants类来保存静态的数据和全局参数类Global。
Constants一般是用来保存地址、支付方式id等基本不变的数据,例如如下所示:
/**
静态数据
**/
public class Constants{
public staitc final WECHAT_PAY_URL = "crmp/pay/wechat";
public static final int WECHAT_PATY = 1;
}
而Global类是用来保存全局参数的,主要是当前的订单、退货单、支付方式等。
代码如下:
public class Global{
public static Global instance;
private Order order;//订单
private Order refundOrder;//退货单
private List<Payment> payments;//支付方式
public static Global getInstance(){
if(instance == null){
synchronized(Global.class){
if(instance == null){
instance = new Global();
}
}
}
}
}
处理完数据后,开始跳转到登录页面,即LoginActivity。
二、登录页面
在登录页面也需要初始化一些数据,例如:
Variable.model = android.os.Build.MODEL;//设备型号
Variable.LocalIp;//本地ip,一般会区分wifi和电话卡
Varialbe.version;//版本号
Varialbe.terminalNo;//终端号
下面是登录的流程:
点击登录按钮——》检查版本——》登录和绑定——》登录成功并跳转页面
1.检查版本
当前版本不是最新版本时,就下载并安装最新的版本,如何是最新的版本,那么就开始登录和绑定。
步骤如下:
(1)调用获取当前最新版本的信息
(2)判断返回的版本号是否大于当前版本号,如果大于就下载并更新,否则调用登录并绑定接口
2.登录与绑定
步骤如下:
(1)发送参数
一般一个收款员会绑定一个收款台,那么登录的时候肯定需要款台号,登录需要的参数有以下数据:
账号、密码、本地ip、终端号、款台号、机构号、租户id。
本地ip:是为了限制用户在某个特定的场所使用或电话卡使用,例如大大降低了不法分子的攻击。
终端号:每个款台号都会有一个唯一的终端号,类似于出厂时设置的设备id
机构号:也就是门店id,就是你所在的门店
租户id:租户的id
(2)返回参数
接口调用成功后,一般会返回以下参数:
flag:成功标识
payIp:支付地址
saleIp:销售地址
wxUrl:微信地址
sercet:安全码
shopId:机构号
tenantId:租户id
payments:支付方式列表
posId:款台号
posNum:款台数量
ckbbqx:查看班表权限
storeId:商户id
copies:打印份数
ifAll:是否统收
ifReturn:退货权限
xpName小票头部名称
ifDiscount:前台折扣
ifFigure:抹零标记
storeName:店铺名
ghNo:
ifQr:是否可以领积分
wxpayAccount:微信支付账号
wxpayAccountName:微信支付账号名称
wxShop:微信门店编号
mChid:微信支付商户号
alipayAccoountName:支付宝商户名
alipayAppid:支付宝appid
alipayAccount:支付包账号
koubeiShopid:口碑
获取成功后,更新这些数据。
登录成功后开始跳转到购物车页面ShoppingCatActivity
三、购物车页面
进入到购车页面后,才是一个订单开始,需要实例化订单类Order,并把订单对象Order保存到全局参数类Global中。
订单号有几种生成方式,一种是调用接口去数据库获取查询最新的流水号,并加1。另一种是通过时间和款台号的拼接,例如 posNo+dateString
订单的数据一般有
订单编号、订单总额、已支付金额、剩余金额、折扣金额、优惠劵折扣金额、优惠卷折率、总优惠卷金额、满减金额、会员折扣金额、订单应付金额、
收款员账号、收款员姓名、管理卡卡号、管理员、收款台、机构号、机构名称、旧款台号、旧流水号、参与折扣的优惠卷号码、参与折扣的优惠卷规则、
交易参考号、会员积分、发票链接、已退金额、扣除金额、支付方式列表、商品列表、所赠优惠卷、所用劵、银行卡记录。
订单状态有:未创建、未支付、部分支付、待上传、已完成。
创建订单时就初始化以下数据:
款台号、订单号、收款员账号、收款员名称、机构号、机构名称
一般购物车页面有,选择商品和结算这两个功能。
1.选择商品
收款员账号有统收和非统收之分,统收的账号选择商品时需要输入金额,非统收的不需要输入金额。这个统收的标识数据在登录时就已经获取到数据了。
步骤如下:
(1)点击选择按钮,进入到选择商品页面
(2)判断是否是统收,是就获取商品列表
商品的属性如下:
id:商品编号
count:商品数量
finalAmount:折后价
originalAmount:商品原总价
originalPrice:原单价
finalPrice:折后单价
discountAmount:折扣总额
disPrice:折扣
cAmount:优惠分摊单价
cPrice:优惠分摊单价
mjRuleid:满减规则id
mjDis:满减金额
mjPrice:满减金额
mjRate:蛮近折扣率
disRuleId:折扣规则
disNum:享受打折的数量
disRate:均价折扣率
vipDisRule:会员折扣规则
vipDisPrice:会员折扣金额
vipDiscountRate:会员折扣率
vipDisType:折扣类型
vipScoreAmount:会员积分金额
vipScoreTimes:会员积分倍数
vipScoreRatio:会员积分比
vipScore:会员积分
vipScoreRule:会员积分规则
integral:商品积分
code:商品代码
barcode:商品条码
unit:单位
name:商品名称
vipprice:会员价
disctype:折扣类型
ifvip:同时会员折扣
salenum:已销售数量
num:限量数额
disvalue:折扣值
startdate:开始日期
enddate:结算日期
iftime:特殊时段
conNo:合同号
ifzj:正价码
ifzjName:正价码
seq:商品序号
htSeq:合同序号
refundedCount:已退金额
paytype:支付类型
(3)点击商品,并输入价格加入购物车,good信息加入order列表
(4)调用order的计算方法计算金额
步骤:
订单和商品都要calculate方法分别是计算订单或商品的价格
商品的calculate方法:
商品的calculate有非会员折扣和会员折扣,
非会员折扣的计算方法不用算出折扣,原单价就是最终价格originalPrice,总价格就是count乘以originalPrice
而会员折扣,通过原单价和会员折扣比例的乘积计算金额。
订单的calculate方法:
遍历商品,并执行商品的calculate方法计算出订单的总原价、总折扣、vip折扣等数据。
遍历完后,计算订单的应付金额、剩余金额,应付金额=原订单总额-总折扣
(5)刷新页面
2.结算
步骤:
设置订单为未支付状态,设置收款员、时间、款台号、合同号
商品合同号要记录:不同商品的合同号可能相同,记录每个合同号的商品数量。
计算订单要支付的金额,要支付的金额等于应付金额。
保存订单到本地缓存。
跳转到支付页面
四、支付页面
进入支付页面要初始化以下数据:
(1)要支付的订单order,这个订单一般是保存到本地缓存中
(2)展示支付列表
支付方式的属性有以下:
name:支付方式名称
amount:支付金额
oAmount:溢余金额
change:找零金额
code:支付类型
couponcode:优惠卷代码
reAmount:已退金额
fxRate:外汇
ifintegral:是否积分
ifchange:是否找零
fxrate:外币汇率
showName:展示名称
(3)点击支付
支付方式有:
(1)支付宝
获取到支付宝的串码后,调用支付宝的支付接口,需要以下参数:
串码、订单编号、等数据。
调用成功后,执行查询支付宝查询接口,查询是否支付成功。
一般分为三种状态,等待支付、支付成功、支付失败
等待支付,需要每隔5秒查询一次持续10次,直到查询接口返回支付成功或失败为止
支付成功剩余金额为0后,上传支付结果,然后更新订单金额并保存订单信息到本地
接下是核销优惠卷。
调用上传接口:
获取设备时间,然后调用保存订单接口,最后调用赠送优惠卷接口。
(2)微信
(3)vip积分
(4)优惠卷
(5)现金
五、订单列表
订单有五种状态,0未创建,1未支付,2部分支付,3待上传,4已完成
订单列表显示的数据主要有:
本地保存的:部分支付、或上传失败的订单。
已完成支付的订单,通过接口获取。