解决一个破问题居然需要这么多程序

因为运输公司过路费电子发票的认证问题太过繁琐,所以想用程序来解决其中大部分的步骤,于是就想出来了这个破方法。

先把电子发票区分开

因为发票的二维码的扫描出来的内容有限,所以需要先把不征税的发票和可以抵扣的发票区分开,这个只能由人工分捡,程序实现太过复杂,还需要用扫描仪识别税额是否是*,暂时用不了这样的功能,所以先用人工区分。

用手机扫描电子发票二维码

电子发票二维码扫描出来的只有其中的几个字段有意义:

  • 第三位是发票代码;
  • 第四位是发票号码;
  • 第五位是不含税的金额;
  • 第六位是开票日期。

这些字段以,分割,所以扫描后可以将以上字段存储进数据库。
因为以前没有接触过java安卓编程,所以入门都用了很长的时间。
参考ZXingLite的连续扫码功能,最终实现了很简陋的连续扫发票。

主要修改了MainActivity.javaCustomCaptureActivity.java涉及的部分功能,比如扫码时异步POST得到该发票是否重复(因为特殊原因,很有必要有这个功能);扫码后异步POST结果存储到数据库。

CustomCaptureActivity.java
1
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--------------");
//System.out.println(response);
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了。
于是浏览器的扩展程序可以大展身手了。
基本思路是:

  1. 先在第三方页面添加按钮等DOM元素;
  2. 然后点击链接或按钮后得到服务器数据库中,手机扫码存入的电子发票;
  3. 将第三方页面显示的电子发票与前一步得到的发票比较,如果有则勾选;
  4. 显示已勾选和未勾选数量。

油猴有个功能不是很理解,就是那个类似AjaxGM_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) {
//alert('error');
console.log("error: ", reponse);
}
});
}

不知道是我没看到还是怎样,在调试状态,也不能在浏览器中看到油猴连接服务器获取数据的记录。
关于前端的代码我自然也还是一知半解,所以程序运行过程中,可能还有多少的BUG没有发现。

统计不抵扣发票

对于不抵扣发票计算,以前的做法是一张一张的用计算器加。
既然现在可以扫码了,那么统计不抵扣发票应该也是小菜一碟。
于是在服务器中,使用Layui前端框架,将服务器数据库里面的指定发票显示出来,一一计算。
多年不见的layui,功能越来越多了,捡几个用的到的先使使。
这些功能还在完善。
理论上来说,电子发票扫码的结果中不能区分是否是不征税,所以计算时,只能将征税和不征税的发票分开计算。
这是一个绕不过去的坎。

还有税控盘

可能是本次发票系统更新的不彻底,税控盘还是不能在Chrome浏览器中使用,于是目前这还是一个大难题。
难道还要使用C#写一个桌面程序?
暂且放在一边。

好久好久

好久好久没有更新了。
太多太多的事儿,不像以前那样无所事事。