Exemple #1
0
        //获取识别结果
        private static InvoiceDisResult GetDisResult(string disJson)
        {
            InvoiceDisResult result = JsonConvert.DeserializeObject <InvoiceDisResult>(disJson);

            return(result);
        }
Exemple #2
0
        /// <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);
        }