//按发票号码查询发票明细
UINT8 INVM_InvDetailNOQuery(string invCode,UINT32 invNO,UINT8 uFlag)
{
    INT32 Ret=SUCCESS;
    string strsql("");
    string strErr="";
    string strBar="";
    INT32 ret=0;

    //发票明细查询
    CInvHead Invhead;
    UINT32 invNum=0;//发票张数
    UINT8 cxfs=0;  //0:按发票号码段查询
    string cxtj(""); // cxfs为0时:12发票代码+8位起始号码+8位终止号码
    cxtj =invCode;
    INT8 tmpChar[16];
    memset((void *)tmpChar,0x00,sizeof(tmpChar));
    sprintf(tmpChar,"%08u",invNO);
    cxtj.append(tmpChar);
    cxtj.append(tmpChar);
    DBG_PRINT(("cxtj= %s",cxtj.c_str()));

    if (uFlag ==0)
    {
        strBar="发票信息查询中.....";
    }
    else
    {
        strBar="发票信息补传中.....";
    }

    CaProgressBar proBar(strBar.c_str());
    proBar.ReFresh();

    Ret=g_pAPIBase->GetInvHeadInfo_API(*g_YwXmlArg, cxfs, cxtj, invNum, &Invhead, strErr);
    DBG_PRINT(("Ret= %d",Ret));
    if (Ret !=SUCCESS)
    {
        CaMsgBox::ShowMsg(strErr);
        return FAILURE;
    }

    if (uFlag ==1)
    {
        CaMsgBox::ShowMsg("发票信息等待上传!");
        g_globalArg->m_pthreadFlag = 1;
        return SUCCESS;
    }

    //从盘上获取的明细编码为空,则置为 "0000000000000",便于报表统计
    CInvDet *p = Invhead.pHead;
    while (p)
    {
        DBG_PRINT(("p->m_spbm = %u", p->m_spbm.c_str()));
        if ("" == p->m_spbm)
        {
            p->m_spbm = "0000000000000";
        }
        p = p->pNext;
        DBG_PRINT(("INV_DET AddNew()"));
    }

    //查看本地是否有该发票信息
    CInvHead invheadtmp;
    INT8 sqlbuf[128];
    memset(sqlbuf, 0x00, sizeof(sqlbuf));
    sprintf(sqlbuf, "where FPDM = '%s' and FPHM = %u", invCode.c_str(), invNO);
    invheadtmp.m_filter = sqlbuf;
    invheadtmp.Requery();
    if (invheadtmp.LoadOneRecord() == SQLITE_OK)
    {
        //判断本地数据库的数据类型是否与转换器一致
        DBG_PRINT(("invheadtmp.m_kplx= %u",invheadtmp.m_kplx));
        DBG_PRINT(("Invhead.m_kplx= %u",Invhead.m_kplx));
        if (invheadtmp.m_kplx != Invhead.m_kplx )
        {
            strsql = sqlbuf;
            invheadtmp.m_kplx = Invhead.m_kplx;
            ret = invheadtmp.Update(strsql, &(invheadtmp.m_kplx), NULL);
            DBG_PRINT(("ret= %d",ret));
            if ( ret!= SQLITE_OK)
            {
                CaMsgBox::ShowMsg("更新发票头信息表错误");
                return FAILURE;
            }

            //更新INV_DET发票类型
            CInvDet invDet;
            invDet.m_kplx =invheadtmp.m_kplx;
            ret = invDet.Update(strsql, &(invDet.m_kplx), NULL);
            DBG_PRINT(("ret= %d",ret));
            if ( ret!= SQLITE_OK)
            {
                CaMsgBox::ShowMsg("更新发票明细信息表错误");
                return FAILURE;
            }

        }

    }
    else
    {
        //发票信息保存
        if (SUCCESS != Invhead.Save())
        {
            CaMsgBox::ShowMsg("查询发票存储失败!");
            return FAILURE;
        }
        DBG_PRINT(("Invhead.m_kplx= %u",Invhead.m_kplx));
        if(Invhead.m_kplx == RETURN_INV)
        {
            CRtInv rtInv;
            rtInv.m_fpdm =Invhead.m_yfpdm;
            rtInv.m_fphm =Invhead.m_yfphm;
            ret = rtInv.AddNew();				//写已退发票信息表
            DBG_PRINT(("ret= %d",ret));
// 			if ( ret!= SQLITE_OK)
// 			{
// 				CaMsgBox::ShowMsg("查询红票,存储蓝票信息表错误");
// 				return FAILURE;
// 			}

        }
    }

    CaMsgBox::ShowMsg("查询发票成功");

    return SUCCESS;
}
INT32 CJSKMakeInvoice::MakeInvAuthority(CInvHead *pInvHead, string& strErr)
{
	INT32 retcode = JSK_SUCCESS;
	INT8 tmpBuff[32];
	UINT8 sDecBuff[MAX_DATETIME_LEN+1];
	INT8 sqlbuf[128];
	INT32 errcode = 0;
	memset(sqlbuf, 0, sizeof(sqlbuf));

	UINT32 uCurDate = 0;
	UINT32 uCurTime = 0;
	uCurDate = pInvHead->m_kprq;
	uCurTime = pInvHead->m_kpsj;
	DBG_PRINT(("uCurDate = %u", uCurDate));
	DBG_PRINT(("uCurTime = %u", uCurTime));

	switch(pInvHead->m_kplx)
	{
	case JSK_NORMAL_INV:
// 		{
// 			//离线锁死日(判断当前时间是否超过离线锁死日)
// 			
// 			//离线开票限定时长(当前时间与第一张未上传的发票时间比对)
// 			CInvServ invServ;
// 			invServ.Requery();
// 			if(invServ.LoadOneRecord() == SQLITE_OK)
// 			{
// 				DBG_PRINT(("invServ.m_issueDate = %u", invServ.m_issueDate));
// 				DBG_PRINT(("invServ.m_issueTime = %u", invServ.m_issueTime));
// 				DBG_PRINT(("g_globalArgLib->m_invKind->m_Lxkjsj = %u", g_globalArgLib->m_invKind->m_Lxkjsj));
// 				TDateTime upDateTime(invServ.m_issueDate, invServ.m_issueTime);
// 				upDateTime = upDateTime.HourAdd(upDateTime, g_globalArgLib->m_invKind->m_Lxkjsj);
// 				DBG_PRINT(("upDateTime = %s", upDateTime.FormatString(YYYYMMDDHHMMSS).c_str()));
// 				DBG_PRINT(("curDateTime = %s", curDateTime.FormatString(YYYYMMDDHHMMSS).c_str()));
// 				if(curDateTime >= upDateTime)
// 				{
// 					strErr = "离线开具限定时长超限!";
// 					return JSK_FAILURE;
// 				}
// 			}
// 			
// 			//离线开票限定正数累计金额
// 			if(nSum + g_globalArgLib->m_InvServSum > g_globalArgLib->m_invKind->m_maxSum)
// 			{
// 				strErr = "离线累计金额超限!";
// 				return JSK_FAILURE;
// 			}
// 		}
		break;
	case JSK_RETURN_INV:
		{
			sprintf(sqlbuf, "where FPDM='%s' and FPHM=%u", pInvHead->m_yfpdm.c_str(), pInvHead->m_yfphm);
			DBG_PRINT(("sqlbuf = %s", sqlbuf));
			CRtInv tmpRtInv;
			tmpRtInv.m_filter.append(sqlbuf);
			tmpRtInv.Requery();
			errcode = tmpRtInv.LoadOneRecord();
			if(errcode == SQLITE_OK)
			{
				retcode = JSK_COMMON_ERR_NO;
				strErr = "已开过负票,不能再次开具!";
				return retcode;
			}
			
			memset(sDecBuff, 0, sizeof(sDecBuff));
			retcode = CJSKInfoFunc::GetJSPSendTime(sDecBuff, strErr);
			if( retcode != JSK_SUCCESS )
			{
				return retcode;
			}
			TDateTime sDecDate((INT8 *)sDecBuff, DATETIME_POS);
			CInvHead tmpInvHead;
			tmpInvHead.m_filter.append(sqlbuf);
			tmpInvHead.Requery();
			errcode = tmpInvHead.LoadOneRecord();
			if(errcode != SQLITE_OK)
			{
				tmpInvHead.m_fpdm = pInvHead->m_yfpdm;
				tmpInvHead.m_fphm = pInvHead->m_yfphm;
				retcode = CJSKInfoFunc::GetInvDetailInfoNO(&tmpInvHead, strErr);
				if(retcode != JSK_SUCCESS)
				{
					return retcode;
				}
				
				if(tmpInvHead.Save() != SUCCESS)
				{
					DBG_PRINT(("InvHead Save Error!"));
				}
			}

			if(tmpInvHead.m_kplx != JSK_NORMAL_INV)
			{
				retcode = JSK_COMMON_ERR_NO;
				strErr = "原发票非正数发票,不能开具负票!";
				return retcode;
			}

			if(tmpInvHead.m_kphjje != pInvHead->m_kphjje)
			{
				retcode = JSK_COMMON_ERR_NO;
				strErr = "负票金额与原发票不一致!";
				return retcode;
			}

// 			TDateTime invDate(tmpInvHead.m_kprq, tmpInvHead.m_kpsj);
// 			DBG_PRINT(("invDate = %s", invDate.FormatString(YYYYMMDDHHMMSS).c_str()));
// 			DBG_PRINT(("sDecDate = %s", sDecDate.FormatString(YYYYMMDDHHMMSS).c_str()));
// 			if(invDate >= sDecDate)
// 			{
// 				retcode = JSK_COMMON_ERR_NO;
// 				strErr = "原发票未抄报,不能开具负票!";
// 				return retcode;
// 			}
		}
		break;
	case JSK_WASTE_INV:
		break;
	case JSK_WASTE_NOR:
	case JSK_WASTE_RET:
		{
			memset(sDecBuff, 0, sizeof(sDecBuff));
			retcode = CJSKInfoFunc::GetJSPSendTime(sDecBuff, strErr);
			if( retcode != JSK_SUCCESS )
			{
				return retcode;
			}
			TDateTime sDecDate((INT8 *)sDecBuff, DATETIME_POS);

			memset(sDecBuff, 0, sizeof(sDecBuff));
			sprintf((INT8 *)sDecBuff, "%08u%06u", pInvHead->m_kprq, pInvHead->m_kpsj);
			TDateTime invDate((INT8 *)sDecBuff, DATETIME_POS);
			if(invDate < sDecDate)
			{
				retcode = JSK_COMMON_ERR_NO;
				strErr = "原发票已抄报,不能作废";
				return retcode;
			}
		}
		break;
	default:
		break;
	}

	
	return JSK_SUCCESS;
}