因为运输公司过路费电子发票的认证问题太过繁琐,所以想用程序来解决其中大部分的步骤,于是就想出来了这个破方法。
先把电子发票区分开
因为发票的二维码的扫描出来的内容有限,所以需要先把不征税的发票和可以抵扣的发票区分开,这个只能由人工分捡,程序实现太过复杂,还需要用扫描仪识别税额是否是*
,暂时用不了这样的功能,所以先用人工区分。
用手机扫描电子发票二维码
电子发票二维码扫描出来的只有其中的几个字段有意义:
- 第三位是发票代码;
- 第四位是发票号码;
- 第五位是不含税的金额;
- 第六位是开票日期。
这些字段以,
分割,所以扫描后可以将以上字段存储进数据库。
因为以前没有接触过java
和安卓编程
,所以入门都用了很长的时间。
参考ZXingLite的连续扫码功能,最终实现了很简陋的连续扫发票。
主要修改了MainActivity.java
和CustomCaptureActivity.java
涉及的部分功能,比如扫码时异步POST得到该发票是否重复(因为特殊原因,很有必要有这个功能);扫码后异步POST结果存储到数据库。
CustomCaptureActivity.java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| ...
public void insertScanResult(String[] arr){ RequestParams params = new RequestParams(); if(arr.length == 8){ params.put("code", arr[2]); params.put("number", arr[3]); params.put("money", arr[4]); params.put("date",arr[5]); params.put("com", company_id); params.put("do", "insert"); params.put("notax", no_tax ? 1 : 0); }else{ Toast.makeText(getApplicationContext(), "你扫描的不是电子发票", Toast.LENGTH_LONG).show(); errorSound(); return; } AsyncHttpClient client = new AsyncHttpClient(); client.post(this.path, params, new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { System.out.println("--------------onSuccess--------------"); try { if(response.getInt("code") == 100){ Toast.makeText(getApplicationContext(), "扫描成功", Toast.LENGTH_LONG).show(); successSound(); }else{ Toast.makeText(getApplicationContext(), "未知错误", Toast.LENGTH_LONG).show(); errorSound(); } } catch (JSONException e) { e.printStackTrace(); } } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable error) { System.out.println("--------onFailure------"); System.out.println("反馈结果:" + responseString); System.out.println("状态码:" + error); } }); } ...
|
关于Java和安卓程序,需要学习的东西还太多,因为暂时用这些就足够,所以先凑合着。
后台处理程序
当时本来是要用Python实现后台接口,但是Python也是不熟练,再加上时间紧迫,还是用比较顺手的PHP吧
PHP没啥要说的,虽然我离了搜索引擎写不成代码,但是也不影响很迅速的就实现了基本的功能。
当然数据库还是使用的Mysql。
不过,对于代码还是没有系统的学习过,粗糙是肯定的。
第三方页面用油猴脚本实现读取
本来本省的发票勾选认证是不能用Chrome浏览器打开的,但是最近一次的更新,发现金税盘开始支持使用Chrome了。
于是浏览器的扩展程序可以大展身手了。
基本思路是:
- 先在第三方页面添加按钮等DOM元素;
- 然后点击链接或按钮后得到服务器数据库中,手机扫码存入的电子发票;
- 将第三方页面显示的电子发票与前一步得到的发票比较,如果有则勾选;
- 显示已勾选和未勾选数量。
油猴有个功能不是很理解,就是那个类似Ajax
的GM_xmlhttpRequest
,本来是想用原生的Ajax
的,结果在油猴里,不管怎么改,远程获取的方法一直是GET
不是POST
,网上查到可以使用油猴御用的POST
方法,试验了一下还挺不错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| var getInvoice = function (com, sjq, sjz){ var params = "do=getinvoice&com=" + com + "&sjq=" + sjq + "&sjz=" + sjz; GM_xmlhttpRequest ({ method: method, url: url, data: params, headers: headers, onload: function (response) { var json = JSON.parse(response.responseText); var tobeCheckList = json.result; $("#tobeCheck").text(tobeCheckList.length); $("#unCheck").text(tobeCheckList.length); GM_setValue("tobeCheck", tobeCheckList); $("#search_check").show(); $("#search_check_btn").bind("click", function(){ searchAll(); }); }, onerror: function(reponse) { console.log("error: ", reponse); } }); }
|
不知道是我没看到还是怎样,在调试状态,也不能在浏览器中看到油猴连接服务器获取数据的记录。
关于前端的代码我自然也还是一知半解,所以程序运行过程中,可能还有多少的BUG没有发现。
统计不抵扣发票
对于不抵扣发票计算,以前的做法是一张一张的用计算器加。
既然现在可以扫码了,那么统计不抵扣发票应该也是小菜一碟。
于是在服务器中,使用Layui前端框架,将服务器数据库里面的指定发票显示出来,一一计算。
多年不见的layui,功能越来越多了,捡几个用的到的先使使。
这些功能还在完善。
理论上来说,电子发票扫码的结果中不能区分是否是不征税,所以计算时,只能将征税和不征税的发票分开计算。
这是一个绕不过去的坎。
还有税控盘
可能是本次发票系统更新的不彻底,税控盘还是不能在Chrome浏览器中使用,于是目前这还是一个大难题。
难道还要使用C#写一个桌面程序?
暂且放在一边。
好久好久
好久好久没有更新了。
太多太多的事儿,不像以前那样无所事事。