//获取识别结果 private static InvoiceDisResult GetDisResult(string disJson) { InvoiceDisResult result = JsonConvert.DeserializeObject <InvoiceDisResult>(disJson); return(result); }
/// <summary> /// 识别与查验(需要查验的自动查验) /// </summary> /// <param name="fileName">文件名</param> /// <param name="base64String">base64 字符串 </param> /// <returns></returns> public static InvoiceCheckResult Check(string fileName, string base64string) { string jsonstr = "", logjson = ""; bool authflag = false; //识别 + json 查验 InvoiceCheckResult invoiceCheckResult = new InvoiceCheckResult() { CheckDetailList = new List <InvoiceCheckDetail>() }; try { string token = GetAccessToken(); //image和pdf用base64识别 disData = PostImage(ApiUtil.BaseUrl + ApiUtil.ImgDistguishUrl + token, base64string); logjson = disData; InvoiceDisResult invoiceDisResult = GetDisResult(disData); invoiceCheckResult.errcode = invoiceDisResult.errcode; invoiceCheckResult.description = invoiceDisResult.description; //不需要验真的状态 //识别成功 if (invoiceDisResult.errcode == "0000" || invoiceDisResult.errcode == "10300") { for (int i = 0; i < invoiceDisResult.data.Count; i++) { InvoiceCheckDetail item = invoiceDisResult.data[i]; jsonstr = ""; //默认识别结果日志 logjson = disData; ReciveData recive = new ReciveData(); //虽然识别成功有些数据可能还是null item.invoiceCode = item.invoiceCode == null ? "" : item.invoiceCode; item.invoiceNo = item.invoiceNo == null ? "" : item.invoiceNo; item.invoiceDate = item.invoiceDate == null ? "" : item.invoiceDate; item.invoiceMoney = item.invoiceMoney == null ? "" : item.invoiceMoney; item.checkCode = item.checkCode == null ? "" : item.checkCode; item.totalAmount = item.totalAmount == null ? "" : item.totalAmount; item.taxRate = item.taxRate == null ? "" : item.taxRate; item.taxAmount = item.taxAmount == null ? "" : item.taxAmount; item.printingSequenceNo = item.printingSequenceNo == null ? "" : item.printingSequenceNo; item.electronicTicketNum = item.electronicTicketNum == null ? "" : item.electronicTicketNum; //不需要验真发票必须初始化的值 item.serialNo = item.serialNo == null ? "" : item.serialNo; item.salerName = item.salerName == null ? "" : item.salerName; item.salerAccount = item.salerAccount == null ? "" : item.salerAccount; item.amount = item.amount == null ? "" : item.amount; item.buyerTaxNo = item.buyerTaxNo == null ? "" : item.buyerTaxNo; //已经初始化完成,开始判断是否串号 if (invoiceDisResult.errcode == "10300") { //发票代码转具体发票 item.invoiceType = Enum.GetName(typeof(InvoiceType), int.Parse(item.invoiceType)); item.checkErrcode = "10300"; item.checkStatus = "不通过"; item.checkDescription = "发票串号"; //添加发票 invoiceCheckResult.CheckDetailList.Add(item); invoiceCheckResult.description = "操作成功"; //修改操作码 invoiceCheckResult.errcode = "0000"; InvoiceLogger.WriteToDB("发票串号", $"{invoiceCheckResult.errcode}", "", $"{invoiceCheckResult.description}", fileName, logjson, item.invoiceType); //条件不满足 进行下一个 continue; } //验真类型 if (authType.Contains(item.invoiceType)) { authflag = false; //提前判断 如果查验条件不满足,不去验真 if (item.invoiceNo.Trim().Length == 0) { authflag = true; item.checkDescription += " 发票号码识别为空 "; } if (item.invoiceCode.Trim().Length == 0) { authflag = true; item.checkDescription += " 发票代码识别为空 "; } if (item.invoiceDate.Trim().Length == 0) { authflag = true; item.checkDescription += " 发票日期识别为空 "; } //增值税普通发票、增值税电子普通发票(含通行费发票)、增值税普通发票(卷票) if (item.invoiceType == "1" || item.invoiceType == "3" || item.invoiceType == "5" || item.invoiceType == "15") { if (item.checkCode.Trim().Length == 0) { authflag = true; item.checkDescription += " 发票检验码识别为空 "; } } //机动车和 纸质专用发票必须要有 InvoiceMoney if (item.invoiceType == "2" || item.invoiceType == "4" || item.invoiceType == "12") { if (item.invoiceMoney.Trim().Length == 0) { authflag = true; item.checkDescription += " 不含税金额识别为空 "; } } // 二手车 if (item.invoiceType == "13") { if (item.totalAmount.Trim().Length == 0) { authflag = true; item.checkDescription += " 车价合计识别为空 "; } } //必须同时满足几个条件 if (authflag) { //发票代码转具体发票 item.invoiceType = Enum.GetName(typeof(InvoiceType), int.Parse(item.invoiceType)); item.checkErrcode = "10005"; item.checkStatus = "未查验"; //先写日志 InvoiceLogger.WriteToDB("发票查验条件不满足", $"{invoiceCheckResult.errcode}", "", $"{invoiceCheckResult.description}", fileName, logjson, item.invoiceType); item.checkDescription = "未识别到完整发票信息"; //添加发票 invoiceCheckResult.CheckDetailList.Add(item); //条件不满足 进行下一个 continue; } //纸质专用发票,机动车 用invoiceMoney 验真,其他用totalAmount 避免校验码和金额同时为空 if (item.invoiceType != "4" && item.invoiceType != "12") { item.invoiceMoney = item.totalAmount; } //验真用另一个数据结构 AuthData authData = new AuthData(); authData.invoiceCode = item.invoiceCode; authData.invoiceNo = item.invoiceNo; authData.invoiceDate = item.invoiceDate; authData.invoiceMoney = item.invoiceMoney; authData.checkCode = item.checkCode; authData.isCreateUrl = "1"; KingdeeCheck(token, ref item, authData, ref logjson, ref jsonstr, ref invoiceCheckResult, 1, fileName); } //不用验真的 else { item.checkErrcode = "0000"; item.checkDescription = "不验真发票状态正常"; item.checkStatus = "通过"; //火车票 if (item.invoiceType == "9") { item.invoiceNo = item.printingSequenceNo; } //飞机票 if (item.invoiceType == "10") { item.invoiceNo = item.electronicTicketNum; } //发票代码转具体发票 item.invoiceType = Enum.GetName(typeof(InvoiceType), int.Parse(item.invoiceType)); logjson = JsonConvert.SerializeObject(item); } //在加一次判断,免税的发票,设置0%,没有税率的也设置0% if (item.taxAmount.Trim().Length > 0) { //0.00 if (double.Parse(item.taxAmount) == 0.00) { item.taxRate = "0%"; } } //添加发票 invoiceCheckResult.CheckDetailList.Add(item); } } else { InvoiceLogger.WriteToDB("识别非正常情况日志", invoiceCheckResult.errcode, "", invoiceCheckResult.description, fileName, disData); } } catch (Exception ex) { //有时候基础连接会已被意外关闭,接口下次可以正常查验 //意外关闭无错误码 通常是发票无法识别 if (invoiceCheckResult.description.Contains("意外关闭")) { invoiceCheckResult.errcode = "0310"; invoiceCheckResult.description = "识别验真时发生异常" + ex.Message; } else { invoiceCheckResult.errcode = "20000"; invoiceCheckResult.description = "识别验真时发生异常" + ex.Message; } InvoiceLogger.WriteToDB("识别验真时发生异常:" + ex.Message, invoiceCheckResult.errcode, "", invoiceCheckResult.description, fileName); } return(invoiceCheckResult); }