Exemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="fileType">1:PDF</param>
        /// <param name="timeOutSecond"></param>
        /// <returns></returns>
        public InvoiceCheckResult Scan_Check(string fileName, string fileType, int timeOutSecond = 8, string mode = "1", Dictionary <string, string> param = null)
        {
            InvoiceCheckResult result = null;

            try
            {
                FileLogger.WriteLog("开始调用KingDeeApi接口", 1, "OAInvoicehelper", "Run", "DataService", "AppMessage");
                if (mode == "1")
                {
                    //解密后的文件名
                    string decryptFileName = fileName + "_D";


                    System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName);
                    if (fileInfo.Length > 1024 * 1024 * 4)
                    {
                        result             = new InvoiceCheckResult();
                        result.errcode     = "333333";
                        result.description = "附件大小超过4M";
                    }
                    else
                    {
                        //若没有解过密,再先解密
                        if (!File.Exists(decryptFileName))
                        {
                            EncrptionUtil.AttDecrypt(fileName, decryptFileName);
                        }

                        byte[] bytes        = bytes = GetBytesByPath(decryptFileName);
                        string base64String = Convert.ToBase64String(bytes);
                        result = KingDeeApi.Check(fileName, base64String);
                    }
                }
                else
                {
                    result = KingDeeApi.ManualCheck(param["InvoiceCode"], param["InvoiceNo"], param["InvoiceDate"], param["InvoiceMoney"], param["InvoieCheckCode"]);
                }
                FileLogger.WriteLog("结束调用KingDeeApi接口", 1, "OAInvoicehelper", "Run", "DataService", "AppMessage");
            }
            catch (System.Exception err)
            {
                FileLogger.WriteLog("处理文件异常: " + err.Message + err.StackTrace + err.InnerException ?? "", 1, "InvoiceHelper", "Check_Scan", "DataService", "ErrMessage");
            }

            return(result);
        }
Exemplo n.º 2
0
        public static string InvoiceCheckResult2Xml(InvoiceCheckResult chkResult)
        {
            string xmlString = @"<InvoiceResult>
                                               <errcode>{0}</errcode>
                                               <description>{1}</description>
                                               <CheckDetailList>{2}</CheckDetailList></InvoiceResult> ";
            string detailStringFormat = @"<InvoiceCheckDetail>
			                                        <serialNo>{0}</serialNo>
			                                        <invoiceCode>{1}</invoiceCode>
			                                        <invoiceDate>{2}</invoiceDate>
			                                        <salerName>{3}</salerName>
			                                        <amount>{4}</amount>
			                                        <taxAmount>{5}</taxAmount>
			                                        <invoiceType>{6}</invoiceType>
			                                        <buyerTaxNo>{7}</buyerTaxNo>
			                                        <salerAccount>{8}</salerAccount>
			                                        <checkStatus>{9}</checkStatus>
			                                        <checkErrcode>{10}</checkErrcode>
			                                        <checkCode>{11}</checkCode>
			                                        <checkDescription>{12}</checkDescription>
			                                        <invoiceMoney>{13}</invoiceMoney>
			                                        <printingSequenceNo>{14}</printingSequenceNo>
			                                        <taxRate>{15}</taxRate>
			                                        <electronicTicketNum>{16}</electronicTicketNum>
                                                   <invoiceNo>{17}</invoiceNo>
		                                        </InvoiceCheckDetail>"        ;
            string detailString = "", detailStrings = "";

            foreach (InvoiceCheckDetail i in chkResult.CheckDetailList)
            {
                detailString = string.Format(detailStringFormat, i.serialNo, i.invoiceCode, i.invoiceDate, i.salerName,
                                             i.amount, i.taxAmount, i.invoiceType, i.buyerTaxNo,
                                             i.salerAccount, i.checkStatus, i.checkErrcode, i.checkCode,
                                             i.checkDescription, i.invoiceMoney, i.printingSequenceNo,
                                             i.taxRate, i.electronicTicketNum, i.invoiceNo);
                detailStrings = detailStrings + detailString;
            }
            xmlString = string.Format(xmlString, chkResult.errcode, chkResult.description, detailStrings);
            return(xmlString);
        }
Exemplo n.º 3
0
        public static InvoiceCheckResult  Xml2InvoiceCheckResult(string xmlInvoiceString)
        {
            InvoiceCheckResult chkResult = new InvoiceCheckResult();

            XmlDocument doc = new XmlDocument();

            doc.LoadXml(xmlInvoiceString);
            chkResult.errcode     = doc.SelectSingleNode("InvoiceResult/errcode").InnerText;
            chkResult.description = doc.SelectSingleNode("InvoiceResult/description").InnerText;
            XmlNodeList detailNodes = doc.SelectNodes("InvoiceResult/CheckDetailList/InvoiceCheckDetail");
            List <InvoiceCheckDetail> invoiceList = new List <InvoiceCheckDetail>();

            foreach (XmlNode i in detailNodes)
            {
                InvoiceCheckDetail detail = new InvoiceCheckDetail();
                detail.serialNo            = i.SelectSingleNode("serialNo").InnerText;
                detail.invoiceCode         = i.SelectSingleNode("invoiceCode").InnerText;
                detail.invoiceNo           = i.SelectSingleNode("invoiceNo").InnerText;
                detail.invoiceDate         = i.SelectSingleNode("invoiceDate").InnerText;
                detail.salerName           = i.SelectSingleNode("salerName").InnerText;
                detail.amount              = i.SelectSingleNode("amount").InnerText;
                detail.taxAmount           = i.SelectSingleNode("taxAmount").InnerText;
                detail.invoiceType         = i.SelectSingleNode("invoiceType").InnerText;
                detail.buyerTaxNo          = i.SelectSingleNode("buyerTaxNo").InnerText;
                detail.salerAccount        = i.SelectSingleNode("salerAccount").InnerText;
                detail.checkStatus         = i.SelectSingleNode("checkStatus").InnerText;
                detail.checkErrcode        = i.SelectSingleNode("checkErrcode").InnerText;
                detail.checkCode           = i.SelectSingleNode("checkCode").InnerText;
                detail.checkDescription    = i.SelectSingleNode("checkDescription").InnerText;
                detail.invoiceMoney        = i.SelectSingleNode("invoiceMoney").InnerText;
                detail.printingSequenceNo  = i.SelectSingleNode("printingSequenceNo").InnerText;
                detail.taxRate             = i.SelectSingleNode("taxRate").InnerText;
                detail.electronicTicketNum = i.SelectSingleNode("electronicTicketNum").InnerText;
                invoiceList.Add(detail);
            }
            chkResult.CheckDetailList = invoiceList;
            return(chkResult);
        }
Exemplo n.º 4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="chkResult">发票查验结果对象</param>
        /// <returns></returns>
        private InvoiceCheckResult CheckInvoiceData(InvoiceCheckResult chkResult)
        {
            string result = "通过", sql = "", resultDetail = "";

            SQLServerHelper runner = new SQLServerHelper();

            switch (chkResult.errcode) //操作错误代码
            {
            case "0000":               //调用成功

                #region 调用成功

                int invoiceSeq = 0;
                for (int i = 0; i < chkResult.CheckDetailList.Count; i++)    //每张发票查验结果
                {
                    switch (chkResult.CheckDetailList[i].checkErrcode)
                    {
                    case "0000":

                        //类型为其他、发票号为空,不是发票,设置不是发票状态,以免下次还继续查验
                        if (chkResult.CheckDetailList[i].invoiceNo.Trim().Length == 0)
                        {
                            chkResult.CheckDetailList[i].checkStatus = "非发票";
                            result       = "异常";
                            resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + ";" : "" + " 非发票";
                        }
                        if (chkResult.CheckDetailList[i].invoiceNo.Trim().Length > 0)
                        {
                            invoiceSeq = invoiceSeq + 1;
                            if (chkResult.CheckDetailList[i].taxAmount.Trim().Length == 0)
                            {
                                chkResult.CheckDetailList[i].taxAmount = "0";
                            }
                            sql = @"Select field0015 from formson_5248 Where field0016='{0}' and  field0015='{1}'  and  Isnull(field0027,'') = '通过'";        //验重判断
                            sql = string.Format(sql, chkResult.CheckDetailList[i].invoiceNo, chkResult.CheckDetailList[i].invoiceCode);
                            DataTable dt1 = new DataTable();
                            dt1 = runner.ExecuteSql(sql);
                            if (dt1.Rows.Count > 0)
                            {
                                chkResult.CheckDetailList[i].checkStatus = "重号";
                                result       = "异常";
                                resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + " 重号";
                            }
                            if (chkResult.CheckDetailList[i].totalAmount == null)
                            {
                                chkResult.CheckDetailList[i].totalAmount = "0";
                            }

                            if (chkResult.CheckDetailList[i].invoiceMoney.ToString().Trim().Length == 0)
                            {
                                chkResult.CheckDetailList[i].invoiceMoney = "0";
                            }
                        }
                        break;

                    case "1001":        //超过该张票当天查验次数,不处理

                        chkResult.CheckDetailList[i].checkStatus = "当天查验次数";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    case "1002":        //查验超时,2小时后再处理,查验次数+1
                        chkResult.CheckDetailList[i].checkStatus = "查验超时";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    case "1014":        //当天票不能查验,,查验次数+1
                        chkResult.CheckDetailList[i].checkStatus = "当天票不查验";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    case "1015":        //超过一年的不能查验,
                        chkResult.CheckDetailList[i].checkStatus = "超1年票";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    case "3110":        //发票查验地区税局服务暂停
                        chkResult.CheckDetailList[i].checkStatus = "官网暂停服务";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    case "10002":        //在官方数据库查不到此发票
                        chkResult.CheckDetailList[i].checkStatus = "此票不存在";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    case "10003":        //发票查验接口无法正常使用,退出应用
                        chkResult.CheckDetailList[i].checkStatus = "接口错误";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    case "10004":        //发票作废
                        chkResult.CheckDetailList[i].checkStatus = "此票作废";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    case "10005":        //
                        chkResult.CheckDetailList[i].checkStatus = "发票信息不全";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    case "10300":        //
                        chkResult.CheckDetailList[i].checkStatus = "发票串号";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;

                    default:        //10001,
                        chkResult.CheckDetailList[i].checkStatus = "查验异常";
                        result       = "异常";
                        resultDetail = resultDetail.Trim().Length > 0 ? resultDetail + "; " : "" + "发票号:" + chkResult.CheckDetailList[i].invoiceNo + chkResult.CheckDetailList[i].checkStatus;
                        break;
                    }
                }
                break;

                #endregion 调用成功

            case "20000":    //调用接口发生异常

                result       = "异常";
                resultDetail = "调用接口发生异常";
                break;

            case "1011":    //查验超时,2小时后再处理,查验次数+1
                result       = "异常";
                resultDetail = chkResult.description;
                break;

            case "0310":    //调用接口发生异常

                #region 调用接口错误处理

                result       = "异常";
                resultDetail = chkResult.description;

                #endregion 调用接口错误处理

                break;

            case "333333":    //附件超大

                #region 附件超大

                result       = "异常";
                resultDetail = "附件大小超过4M";

                #endregion 附件超大

                break;
            }
            chkResult.errcode     = result;
            chkResult.description = resultDetail;
            return(chkResult);
        }
Exemplo n.º 5
0
        public string UpdateInvoiceDB(string xmlResult, string formID, string formType)
        {
            string result = "<UpdateData> " +
                            "<Result>{0}</Result>" +
                            "<InvoiceResult>{1}</InvoiceResult>" +
                            "<Description>{2}</Description></UpdateData>";

            try
            {
                string field0005 = formType;
                string field0029 = "";
                string field0035 = ""; //源主表查验结果字段
                string field0036 = ""; //源表发票类型字
                string field0037 = ""; //源发票子表名
                string field0038 = ""; //发票子表发票附件字段
                string field0040 = ""; //发票子表开票日期字段
                string field0041 = ""; //发票子表查验结果字段
                string field0044 = ""; //子表税率字段
                string field0045 = ""; //子表税金字段
                string field0046 = ""; //子表不含税额字段
                string field0047 = ""; //子表发票号码字段
                string field0048 = ""; //子表发票代码字段
                string field0051 = ""; //子表发票校验码字段
                string field0052 = ""; //子表是否重验字段

                InvoiceCheckResult chkResult = InvoiceHelper.Xml2InvoiceCheckResult(xmlResult);
                chkResult = CheckInvoiceData(chkResult);
                if (chkResult == null)
                {
                    result = "<UpdateData>" +
                             "<Result>{0}</Result>" +
                             "<InvoiceResult>{1}</InvoiceResult>" +
                             "<Description>{2}</Description></UpdateData>";
                    result = string.Format(result, "False", "异常", "发票不存在");
                }
                else if (chkResult.errcode == "通过")
                {
                    string          sql    = "Select ID from v3x.dbo.formmain_5247 Where ID = '" + formID + "'";
                    SQLServerHelper runner = new SQLServerHelper();
                    DataTable       dt     = runner.ExecuteSql(sql);
                    if (dt.Rows.Count == 0)//发票库中不存在,插入
                    {
                        switch (formType)
                        {
                        case "学术活动费用支付单":
                            field0029 = "formmain_5925";
                            field0035 = "field0016";
                            field0036 = "field0026";
                            field0037 = "formson_5926";
                            field0038 = "field0029";
                            field0040 = "field0031";
                            field0041 = "field0030";
                            field0044 = "field0074";
                            field0045 = "field0068";
                            field0046 = "field0069";
                            field0047 = "field0072";
                            field0048 = "field0071";
                            field0051 = "field0073";
                            field0052 = "field0070";
                            break;

                        case "招待费报销单":
                            field0029 = "formmain_5935";
                            field0035 = "field0016";
                            field0036 = "field0026";
                            field0037 = "formson_5936";
                            field0038 = "field0028";
                            field0040 = "field0030";
                            field0041 = "field0029";
                            field0044 = "field0048";
                            field0045 = "field0047";
                            field0046 = "field0049";
                            field0047 = "field0053";
                            field0048 = "field0052";
                            field0051 = "field0054";
                            field0052 = "field0051";

                            break;
                        }
                        //插入发票库主表
                        sql = @"Declare @formmainID numeric(19,0)
                                          EXEC  DataService.[dbo].[Insert_Invoice_Data20]  @formmainID output,'','','{0}','{1}','','','','','{2}','-1','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}'";
                        sql = string.Format(sql, DateTime.Now.ToString("yyyy-MM-dd"), field0005, field0029, field0035, field0036, field0037, field0038, field0040, field0041, field0044, field0045, field0046, field0047, field0048, field0051, field0052, formID);
                        runner.ExecuteSqlNone(sql);
                    }
                    //删除已存在的发票记录
                    sql = "Delete from v3x.dbo.[formson_5248]  Where formmain_Id = '" + formID + "'";
                    runner.ExecuteSqlNone(sql);
                    foreach (InvoiceCheckDetail invoiceDetail in chkResult.CheckDetailList)
                    {
                        sql = @" INSERT INTO v3x.dbo.[formson_5248]([ID],[formmain_id],[sort],[field0012],[field0013],[field0014],[field0015],[field0016],[field0017],
                                [field0018],[field0019],[field0020],[field0021],[field0022],[field0023],[field0024],[field0025],[field0026],[field0027] ,[field0032],
                                [field0034],[field0033],[field0039],[field0042],[field0050],[field0053],[field0054],[field0049])
                                Values({0},{1},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}')";
                        string formsonId = GetID();
                        sql = string.Format(sql, formsonId, formID, "YRB已验证", "", invoiceDetail.invoiceType, invoiceDetail.invoiceCode, invoiceDetail.invoiceNo, invoiceDetail.invoiceDate,
                                            invoiceDetail.salerName, invoiceDetail.amount, "", invoiceDetail.buyerTaxNo, invoiceDetail.salerAccount, invoiceDetail.checkStatus, invoiceDetail.checkErrcode, invoiceDetail.checkDescription, invoiceDetail.taxAmount, "通过", "",
                                            invoiceDetail.invoiceType, "2", "是", DateTime.Now.ToString("yyyy-MM-dd"), invoiceDetail.invoiceMoney, "", "-1", invoiceDetail.taxRate);
                        runner.ExecuteSqlNone(sql);
                    }
                    result = string.Format(result, "True", "通过", "");
                }
                else
                {
                    result = string.Format(result, "False", "异常", chkResult.description);
                }
            }
            catch (Exception err)
            {
                result = string.Format(result, "False", "异常", err.Message);
            }
            return(result);
        }
Exemplo n.º 6
0
        //public string WebCheck(string billNumber)
        //{
        //    string checkresult = Run(1, billNumber, true);
        //    return checkresult;
        //}

        /// <summary>
        ///
        /// </summary>
        /// <param name="mode">0:识别+查验+所有发票</param>
        /// <returns></returns>
        public string Run(int mode = 0, string billNo = "", bool status = false)
        {
            string   result   = "0";
            string   fileName = "";
            string   path     = "";
            string   fileType = "2";
            int      chkCount = 0;
            string   sql      = "";
            DateTime checkDate;

            FileLogger.WriteLog("开始发票查验", 1, "OAInvoicehelper", "Run" + billNo, "DataService", "AppMessage");
            try
            {
                path = doc.SelectSingleNode("Configuration/Path").InnerText;
                //尝试次数field0033少于3次,已经过了验证日期的,开发日期小于 当天,状态为
                //sql = "Select ID, formmain_ID as pid, field0020 as FileID,field0013 as folder,field0012 as FileName,field0014,Isnull(field0033,0) as field0033," +
                //          "    Isnull(field0053,'') As field0053,field0015,field0016,field0017,field0050,field0032 " +
                //          "    from formson_5248   ";

                sql = @"Select t1.ID, t1.formmain_ID as pid, t1.field0020 as FileID,t1.field0013 as folder,t1.field0012 as FileName,t1.field0014,Isnull(t1.field0033,0) as field0033,
                        Isnull(t1.field0053,'') As field0053,t1.field0015,t1.field0016,t1.field0017,t1.field0050,t1.field0032,t3.Name  AS field0006,  t2.field0008,t1.field0018,t2.field0005
                        from v3x.dbo.formson_5248   t1
                        Left Join v3x.dbo.formmain_5247 t2 On t1.formmain_id = t2.ID
                        Left Join v3x.dbo.ORG_MEMBER  t3 On t2.field0006 = convert(varchar(100),t3.ID)";

                if (mode == 0)
                {
                    sql = sql + " Where    isnull(t1.field0033,0) < 2 and isnull(t1.field0039,'') ='是'  and CONVERT(varchar(100),t1.field0017, 23) <CONVERT(varchar(100),getdate(), 23)  " + "   and  t1.formmain_id='8342463430625887200'" +
                          "  and  (isnull(t1.field0023,'')   Not In('通过','重号') or isnull(t1.field0053,'')='-4875734478274671070')  " +
                          "   and  t1.field0042<='" + DateTime.Now.ToString() + "'  and field0014 In ('机打卷票','电子普通票','电子专用票','纸质普通票','纸质专用票') order by t1.field0042 desc";

                    //   sql = sql + "     t1.formmain_id='8342463430625887200'";
                }

                if (mode == 1)
                {
                    sql = sql + " Where t1.formmain_Id In ( Select ID from formmain_5247 Where field0008 = '" + billNo + "') " +
                          "  and t1.field0014 In ('机打卷票','电子普通票','电子专用票','纸质普通票','纸质专用票','普通纸质发票')  and  isnull(t1.field0027,'')   Not In('通过') ";
                    //"  and isnull(field0039,'') ='是' ";
                }
                SQLServerHelper runner = new SQLServerHelper();
                FileLogger.WriteLog("sql获取未查询发票 " + sql, 1, "OAInvoicehelper", "Run" + billNo, "DataService", "AppMessage");
                DataTable dt = runner.ExecuteSql(sql);
                FileLogger.WriteLog("sql获取未查询发票完成", 1, "OAInvoicehelper", "Run" + billNo, "DataService", "AppMessage");
                InvoiceHelper invoice = new InvoiceHelper();

                foreach (DataRow row in dt.Rows)
                {
                    try
                    {
                        chkCount = int.Parse(row["field0033"].ToString()) + 1;//设置检查次数
                        InvoiceCheckResult chkResult = new InvoiceCheckResult();
                        //调用金蝶发票查验接口
                        FileLogger.WriteLog("开始获取Scan_Check查验结果", 1, "OAInvoicehelper", "Run" + billNo, "DataService", "AppMessage");
                        if (row["field0053"].ToString() == "-4875734478274671070")//手工重验
                        {
                            Dictionary <string, string> param = new Dictionary <string, string>();
                            param["InvoiceCode"]     = row["field0015"].ToString().Trim();
                            param["InvoiceNo"]       = row["field0016"].ToString().Trim();
                            param["InvoiceDate"]     = row["field0017"].ToString().Trim();
                            param["InvoiceMoney"]    = row["field0050"].ToString().Trim();
                            param["InvoieCheckCode"] = row["field0032"].ToString().Trim();
                            chkResult = invoice.Scan_Check(fileName, fileType, 8, "2", param);
                        }
                        else//自动扫描与查验
                        {
                            fileName  = path + "\\" + row["folder"].ToString() + "\\" + row["FileID"].ToString();
                            chkResult = invoice.Scan_Check(fileName, fileType);
                        }
                        if (chkResult == null)//云接口调用报错,没有正常返回
                        {
                            FileLogger.WriteLog("调用发票云接口错误:返回值为空 FileName:" + fileName, 1, "OAInvoicehelper", "Run", "DataService", "AppMessage");
                            continue;
                        }
                        FileLogger.WriteLog("结束获取Scan_Check查验结果", 1, "OAInvoicehelper", "Run" + billNo, "DataService", "AppMessage");
                        //调用成功
                        if (fileName.Length > 0)
                        {
                            FileLogger.WriteLog("调用接口成功,文件:" + fileName, 1, "OAInvoicehelper", "Run", "DataService", "AppMessage");
                        }

                        switch (chkResult.errcode) //操作错误代码
                        {
                        case "0000":               //调用成功

                            #region 调用成功

                            int    invoiceSeq = 0;
                            string rowID      = "-1";
                            foreach (InvoiceCheckDetail i in chkResult.CheckDetailList)    //每张发票查验结果
                            {
                                switch (i.checkErrcode)
                                {
                                case "0000":
                                    rowID = row["ID"].ToString();
                                    //类型为其他、发票号码或代码为空,不是发票,设置不是发票状态,以免下次还继续查验
                                    //王天池 2021-07-20 增加代码为空时也设置为不是发票
                                    if (i.invoiceNo.Trim().Length == 0 || i.invoiceCode.Trim().Length == 0)
                                    {
                                        sql = "Update formson_5248 Set field0039='否' Where ID='" + rowID + "'";
                                        runner.ExecuteSqlNone(sql);
                                        continue;
                                    }
                                    else
                                    {
                                        decimal taxamout = 0;
                                        invoiceSeq = invoiceSeq + 1;
                                        string  lianhao = "", lianhao1 = ""; //同单连号备注
                                        string  lianhaoType       = "";      //连号类型
                                        decimal invoiceTotalamout = 0;

                                        int invoiceCount = 0, invoiceCount1 = 0;        //同单连号发票张数,异单连号发票张数

                                        if (i.taxAmount.Trim().Length > 0)
                                        {
                                            taxamout = decimal.Parse(i.taxAmount.Trim());
                                        }
                                        // 王天池,2021-07-21,修正代码与号码设置反了的问题
                                        sql =
                                            "Select *  From  v3x.dbo.formson_5248 Where field0015='{0}' and field0016='{1}'  and  field0027='通过'";

                                        //sql = @"Select field0015 from v3x.dbo.formson_5248 Where (Select count(*) From  v3x.dbo.formson_5248 where field0015='{0}' and field0016='{1}'  and  field0027='通过') >= 1";//验重判断
                                        sql = string.Format(sql, i.invoiceCode, i.invoiceNo);
                                        DataTable dt1 = new DataTable();
                                        dt1 = runner.ExecuteSql(sql);
                                        if (dt1.Rows.Count > 0)
                                        {
                                            i.checkStatus = "重号";
                                        }
                                        else        // 增加发票连号检查功能,王天池,2021-07-20,
                                                    // 王天池,2021-08-27,根据新的发票管控规则,优化
                                        {
                                            sql = @"Select   t2.field0005 ,t2.field0008,t3.Name  AS field0006,t1.field0016,t1.field0019,convert(varchar(100),t1.field0017,23) AS field0017
                                                            From v3x.dbo.formson_5248 t1
                                                            Left Join v3x.dbo.formmain_5247 t2 On t1.formmain_id = t2.ID
                                                            Left Join v3x.dbo.ORG_MEMBER  t3 On t2.field0006 = convert(varchar(100),t3.ID)
                                                            Where Isnull(t1.field0016,'')<> '' and t2.field0004 >= '2021-01-01' and len(field0016)= 8 and Isnull(t1.field0015,'')= '{0}'
                                                            and Convert(int,'1' + t1.field0016)> (Convert(int, '1' + '{1}') - 5)  and Convert(int,'1' + t1.field0016)< (Convert(int, '1' + '{1}') + 5)  and
                                                             t1.field0016 <> '{1}'";
                                            sql = string.Format(sql, i.invoiceCode, i.invoiceNo);

                                            DataTable dt2 = runner.ExecuteSql(sql);

                                            //连号备注初始化,格式为:发票代码:XXXX 号码:XXX 与以下单据存在连号情况:单据,单号
                                            if (dt2.Rows.Count > 0)
                                            {
                                                foreach (DataRow r in dt2.Rows)
                                                {
                                                    if (row["field0008"].ToString() == r["field0008"].ToString())         //同单连号
                                                    {
                                                        invoiceCount = invoiceCount + 1;
                                                        lianhao      = r["field0016"].ToString() + "(" + r["field0019"].ToString() + ")  " + lianhao;
                                                    }
                                                    else        //异单连号
                                                    {
                                                        invoiceCount1 = invoiceCount1 + 1;
                                                        lianhao1      = "单据:" + r["field0005"].ToString() + " 单号:" + r["field0008"].ToString() + r["field0016"].ToString() + "(" + r["field0019"].ToString() + ")  " + r["field0006"].ToString() + " \r\n" + lianhao1;
                                                    }
                                                }

                                                //获取开票机构180天累计开票额度
                                                if (row["field0005"].ToString() == "付款申请5.0")        //服务类
                                                {
                                                    sql = @" Select Isnull(field0006,0) As field0006 from v3x.dbo.formmain_8899 Where field0002  = '服务类'  and field0001 ='{0}'";
                                                }
                                                else
                                                {
                                                    sql = @" Select Isnull(field0006,0) As field0006 from v3x.dbo.formmain_8899 Where field0002 = '餐饮类'  and field0001 ='{0}'";
                                                }
                                                sql = string.Format(sql, row["field0018"].ToString());
                                                DataTable dtInvoice = runner.ExecuteSql(sql);
                                                if (dtInvoice.Rows.Count > 0)
                                                {
                                                    invoiceTotalamout = decimal.Parse(dtInvoice.Rows[0]["field0006"].ToString());
                                                }


                                                if (lianhao.Length > 0)
                                                {
                                                    lianhao = "【同单连号】代码 " + i.invoiceCode + " 号码 " + i.invoiceNo + "的连号情况:张数( " + invoiceCount.ToString() + ") " + row["field0018"].ToString() + "(" + "))\r\n" + lianhao;
                                                }
                                                if (lianhao1.Length > 0)
                                                {
                                                    lianhao1 = "【异单连号】代码 " + i.invoiceCode + " 号码 " + i.invoiceNo + "的连号情况:张数( " + invoiceCount.ToString() + ") " + row["field0018"].ToString() + "(" + "))\r\n" + lianhao1;
                                                }

                                                if (lianhao1.Length > 0)
                                                {
                                                    lianhaoType = "异单";
                                                }
                                                if (lianhao.Length > 0)
                                                {
                                                    lianhaoType = lianhaoType.Length > 0 ? "同异单" : "同单";
                                                    lianhao     = lianhao1.Length > 0 ? lianhao + " \r\n" + lianhao1 : lianhao;
                                                }
                                            }
                                        }

                                        if (invoiceSeq == 1)        //文件中只有一张发票
                                        {
                                        }
                                        else        //文件中有多张发票,先插入新纪录(先判断是否存在,不存在则插入)
                                        {
                                            //先判断相应的多张发票记录已存在
                                            sql = "Select ID from formson_5248 Where field0020='{0}' and isnull(field0016,'') ='{1}'";
                                            sql = string.Format(sql, row["FileID"].ToString(), i.invoiceCode);
                                            dt1 = runner.ExecuteSql(sql);
                                            if (dt1.Rows.Count == 0)        //文件中多张发票不存在,则插入
                                            {
                                                rowID = GetID();
                                                sql   = @"Insert Into [formson_5248](ID,formmain_id,sort,field0012,field0013,field0014,field0020)
			                                                Values({0},{1},1,'{2}','{3}','{4}','{5}')"            ;
                                                sql   = string.Format(sql, rowID, row["pid"].ToString(), row["FileName"].ToString(), row["folder"].ToString(), row["field0014"].ToString(), row["FileID"].ToString());
                                                runner.ExecuteSqlNone(sql);
                                            }
                                        }
                                        ///处理没有返回值的数字型属性
                                        //保存查验结果
                                        decimal amount = 0;
                                        if (i.totalAmount.ToString().Trim().Length == 0)
                                        {
                                            amount = 0;
                                        }
                                        else
                                        {
                                            amount = decimal.Parse(i.totalAmount);
                                        }

                                        if (i.invoiceMoney.ToString().Trim().Length == 0)
                                        {
                                            i.invoiceMoney = "0";
                                        }

                                        //设置查验日期
                                        checkDate = DateTime.Now;

                                        sql = @"update formson_5248 Set field0033= isnull(field0033,0)+1,field0015='{0}',field0016='{1}',field0017='{2}',
                                                        field0018='{3}',field0019='{4}',field0021='{5}',field0022='{6}',field0023  ='{7}',
                                                        field0024='{8}',field0025='{9}',field0026='{10}',field0027='{7}',field0032='{11}',field0034='{12}' , field0042='{14}',
                                                        field0049='{15}', field0050='{16}' ,field0053='',field0056='{17}',field0057='{18}',field0058={19}  Where ID={13}";

                                        sql = string.Format(sql, i.invoiceCode, i.invoiceNo, i.invoiceDate, i.salerName, amount, i.buyerTaxNo, i.salerAccount,
                                                            i.checkStatus, i.checkErrcode, i.checkDescription, taxamout, i.checkCode, i.invoiceType, rowID, checkDate.ToString(),
                                                            i.taxRate, i.invoiceMoney, lianhao, lianhaoType, invoiceTotalamout);

                                        runner.ExecuteSqlNone(sql);
                                        if (fileName.Length > 0)
                                        {
                                            FileLogger.WriteLog(" 成功处理文件名:" + fileName, 1, "OAInvoicehelper", "Run", "DataService", "AppMessage");
                                        }
                                    }
                                    break;

                                case "1001":        //超过该张票当天查验次数,不处理
                                    checkDate = Convert.ToDateTime(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd 01:30:00"));
                                    sql       = @"update formson_5248 Set field0033= {0} ,field0042 ='{1}' ,field0025='{3}',field0024 ='{4}' Where ID={2}";
                                    sql       = string.Format(sql, 2, checkDate, row["ID"].ToString(), i.checkDescription, i.checkCode);
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                case "1002":        //查验超时,2小时后再处理,查验次数+1
                                    checkDate = DateTime.Now.AddHours(2);
                                    sql       = @"update formson_5248 Set field0033= {0} ,field0042 ='{1}' ,field0025='{3}',field0024 ='{4}' Where ID={2}";
                                    sql       = string.Format(sql, chkCount, checkDate, row["ID"].ToString(), i.checkDescription, i.checkCode);
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                case "1014":        //当天票不能查验,,查验次数+1
                                    checkDate = DateTime.Now;
                                    sql       = @"update formson_5248 Set field0033= {0} ,field0042 ='{1}' ,field0017 ='{2}',field0025='{4}',field0024 ='{5}'   Where ID={3}";
                                    sql       = string.Format(sql, chkCount, checkDate.AddDays(1), checkDate, row["ID"].ToString(), chkResult.description, chkResult.errcode);
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                case "1015":        //超过一年的不能查验,
                                    sql = @"update formson_5248 Set field0033= {0} , field0027 ='{1}' Where ID={2}";
                                    sql = string.Format(sql, 2, "发票超1年", row["ID"].ToString());
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                case "3110":        //发票查验地区税局服务暂停
                                    sql = @"update formson_5248 Set field0033= {0} , field0027 ='{1}' Where ID={2}";
                                    sql = string.Format(sql, 2, "地方税局暂停查验服务", row["ID"].ToString());
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                case "10002":        //在官方数据库查不到此发票
                                    sql = @"update formson_5248 Set field0033= {0} , field0023 ='{1}' , field0027 ='{1}' Where ID={2}";
                                    sql = string.Format(sql, 2, "此票不存在", row["ID"].ToString());
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                case "10003":        //发票查验接口无法正常使用,退出应用
                                                     //Process.GetCurrentProcess().Kill();
                                    sql = @"update formson_5248 Set field0033= {0} , field0027 ='{1}' Where ID={2}";
                                    sql = string.Format(sql, 2, "接口错误", row["ID"].ToString());
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                case "10004":        //发票作废
                                    sql = @"update formson_5248 Set field0033= {0} , field0027 ='{1}' Where ID={2}";
                                    sql = string.Format(sql, 2, "此票作废", row["ID"].ToString());
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                case "10005":        //
                                    sql = @"update formson_5248 Set field0033= {0} , field0027 ='{1}' Where ID={2}";
                                    sql = string.Format(sql, 2, "发票信息不全", row["ID"].ToString());
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                case "10300":        //
                                    sql = @"update formson_5248 Set field0033= {0} , field0027 ='{1}' Where ID={2}";
                                    sql = string.Format(sql, 3, "发票串号", row["ID"].ToString());
                                    runner.ExecuteSqlNone(sql);
                                    break;

                                default:        //10001,
                                    checkDate = DateTime.Now;
                                    SetInvoceCheckStatus(row["ID"].ToString(), checkDate, 2, i.checkDescription, i.checkErrcode);
                                    break;
                                }
                            }
                            break;

                            #endregion 调用成功

                        case "20000":    //调用接口发生异常

                            #region 调用接口错误处理,

                            //Process.GetCurrentProcess().Kill();
                            checkDate = DateTime.Now.AddHours(2);
                            sql       = @"update formson_5248 Set field0033= {0} ,field0042 ='{1}' ,field0025='{3}',field0024 ='{4}' Where ID={2}";
                            sql       = string.Format(sql, chkCount, checkDate, row["ID"].ToString(), chkResult.description, chkResult.errcode);
                            runner.ExecuteSqlNone(sql);

                            #endregion 调用接口错误处理,

                            break;

                        case "1011":    //查验超时,2小时后再处理,查验次数+1
                            checkDate = DateTime.Now.AddHours(2);
                            sql       = @"update formson_5248 Set field0033= {0} ,field0042 ='{1}' ,field0025='{3}',field0024 ='{4}' Where ID={2}";
                            sql       = string.Format(sql, chkCount, checkDate, row["ID"].ToString(), chkResult.description, chkResult.errcode);
                            runner.ExecuteSqlNone(sql);
                            break;

                        case "0310":    //调用接口发生异常

                            #region 调用接口错误处理

                            checkDate = DateTime.Now;
                            SetInvoceCheckStatus(row["ID"].ToString(), checkDate, 2, chkResult.description, chkResult.errcode);

                            #endregion 调用接口错误处理

                            break;

                        case "333333":    //附件超大

                            #region 附件超大

                            checkDate = DateTime.Now;
                            SetInvoceCheckStatus(row["ID"].ToString(), checkDate, 2, chkResult.description, chkResult.errcode);

                            #endregion 附件超大

                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        FileLogger.WriteLog("Err:" + ex.Message + ex.StackTrace + ex.InnerException ?? "", 1, "OAInvoicehelper", fileName, "DataService", "ErrMessage");
                    }
                    //根据接口返回情况,处理发票数据库记录
                }
                //返回已处理记录数
                result = dt.Rows.Count.ToString();
            }
            catch (Exception err)
            {
                FileLogger.WriteLog("Err:" + err.Message + err.StackTrace + err.InnerException ?? "", 1, "OAInvoicehelper", fileName, "DataService", "ErrMessage");
            }
            FileLogger.WriteLog("结束发票查验", 1, "OAInvoicehelper", "Run", "DataService", "AppMessage");
            if (status)
            {
                SQLServerHelper sqlServer = new SQLServerHelper();
                var             invoice   = sqlServer.ExecuteSql(
                    $"Select t1.field0012 文件名,t1.field0014 类型 ,t1.field0015 代码,t1.field0016 号码,t1.field0032 校验码, t1.field0017 开票日期,t1.field0026 税金, t1.field0019 开票金额,t1.field0033 查验次数,t1.field0027 状态,t1.field0018 开票机构,t1.field0039 是否是发票,t1.field0025 结果 From   v3x.dbo.formson_5248 t1 Left Join   v3x.dbo.formmain_5247 t2 On t1.formmain_id = t2.ID Where t2.field0008='{billNo}'");
                List <Invoice> invoiceList = new List <Invoice>();
                foreach (DataRow row in invoice.Rows)
                {
                    invoiceList.Add(new Invoice()
                    {
                        Field0012 = row["文件名"].ToString() ?? "", Field0014 = row["类型"].ToString() ?? "", Field0015 = row["代码"].ToString() ?? "", Field0016 = row["号码"].ToString() ?? "", Field0032 = row["校验码"].ToString() ?? "", Field0017 = row["开票日期"].ToString() ?? "", Field0026 = row["税金"].ToString() ?? "", Field0019 = row["开票金额"].ToString() ?? "", Field0033 = row["查验次数"].ToString() ?? "", Field0027 = row["状态"].ToString() ?? "", Field0018 = row["开票机构"].ToString() ?? "", Field0039 = row["是否是发票"].ToString() ?? "", Field0025 = row["结果"].ToString() ?? ""
                    });
                }

                MessageModel <List <Invoice> > me = new MessageModel <List <Invoice> >();
                var objResult = me.Success(invoiceList);
                result = JsonConvert.SerializeObject(objResult);
            }

            return(result);
        }
Exemplo n.º 7
0
        public string InvoiceCheck(string xmlString)
        {
            string mode = "0", base64String = "", InvoiceCode = "", InvoiceNo = "", InvoiceDate = "", InvoiceMoney = "", InvoieVCode = "";
            string formID = "", formType = "";

            string result = "<UpdateData> " +
                            "<Result>{0}</Result>" +
                            "<InvoiceResult>{1}</InvoiceResult>" +
                            "<Description>{2}</Description></UpdateData>";

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xmlString);

                XmlNode node = doc.SelectSingleNode("UpdateData/Mode");
                if (node != null && node.InnerText.Trim().Length > 0)
                {
                    mode = node.InnerText.Trim();
                }

                node = doc.SelectSingleNode("UpdateData/FormID");
                if (node != null && node.InnerText.Trim().Length > 0)
                {
                    formID = node.InnerText.Trim();
                }
                else
                {
                    throw new System.Exception("FormID不能为空");
                }


                node = doc.SelectSingleNode("UpdateData/Form");
                if (node != null && node.InnerText.Trim().Length > 0)
                {
                    formType = node.InnerText.Trim();
                }
                else
                {
                    throw new System.Exception("OA表单不能为空");
                }

                InvoiceCheckResult chkresult = null;
                if (mode == "0")//扫描查验
                {
                    node = doc.SelectSingleNode("UpdateData/InvoiceData");
                    if (node != null && node.InnerText.Trim().Length > 0)
                    {
                        base64String = node.InnerText.Trim();
                    }
                    else
                    {
                        throw new System.Exception("发票数据不能为空");
                    }
                    chkresult = KingDeeApi.Check(OAInvoiceHelper.GetID(), base64String);
                }
                if (mode == "1")//手工
                {
                    node = doc.SelectSingleNode("UpdateData/InvoiceCode");
                    if (node != null && node.InnerText.Trim().Length > 0)
                    {
                        InvoiceCode = node.InnerText.Trim();
                    }
                    else
                    {
                        throw new System.Exception("发票代码不能为空");
                    }

                    node = doc.SelectSingleNode("UpdateData/InvoiceNo");
                    if (node != null && node.InnerText.Trim().Length > 0)
                    {
                        InvoiceNo = node.InnerText.Trim();
                    }
                    else
                    {
                        throw new System.Exception("发票代码不能为空");
                    }


                    node = doc.SelectSingleNode("UpdateData/InvoiceDate");
                    if (node != null && node.InnerText.Trim().Length > 0)
                    {
                        InvoiceDate = node.InnerText.Trim();
                    }
                    else
                    {
                        throw new System.Exception("发票日期为空");
                    }

                    node = doc.SelectSingleNode("UpdateData/InvoiceMoney");
                    if (node != null && node.InnerText.Trim().Length > 0)
                    {
                        InvoiceMoney = node.InnerText.Trim();
                    }
                    else
                    {
                        throw new System.Exception("发票不含税金额为空");
                    }

                    node = doc.SelectSingleNode("UpdateData/InvoiceVCode");
                    if (node != null && node.InnerText.Trim().Length > 0)
                    {
                        InvoieVCode = node.InnerText.Trim();
                    }

                    chkresult = KingDeeApi.ManualCheck(InvoiceCode, InvoiceNo, InvoiceDate, InvoiceMoney, InvoieVCode);
                }


                string xmlResult = "";
                // 只有通过验证的发票财务更新到OA发票数据库
                if (chkresult != null)
                {
                    if (chkresult.errcode == "0000" && chkresult.CheckDetailList.Count > 0)
                    {
                        xmlResult = InvoiceCheckResult2Xml(chkresult);
                        WebInvoke invoke = new WebInvoke();
                        object[]  param  = new object[] { xmlResult, formID, formType };
                        //OAInvoiceHelper o = new OAInvoiceHelper();
                        //o.UpdateInvoiceDB(xmlResult, formID, formType);
                        oawsUrl   = oawsUrl + "FinaceAppService.asmx";
                        xmlResult = invoke.Invoke(oawsUrl, "FinaceAppService", "CheckInvoiceData", param, null, 8000).ToString();
                        result    = xmlResult;
                    }
                }
                else
                {
                    result = string.Format(result, "False", "异常", "不是发票或接口异常");
                }
            }
            catch (System.Exception err)
            {
                throw err;
            }
            return(result);
        }