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