UINT8 IfInvHeadRoll()
{
	CInvHead curInvHead;
	UINT8 ret = SUCCESS;
	UINT32 nInvDelDate = 0;
	
//	ret = CheckIfFull(g_globalArg->m_invCount, g_globalArg->m_invSumCount);
//	if (ret==SUCCESS) 
//	{
//		DBG_RETURN(DB_FULL);		
//	}

	TDateTime lastDate(g_globalArg->m_startDecDate, 000001);
	lastDate--;
	UINT32 nRefDate = lastDate.FormatInt(YYYYMMDD);//上次申报的截止日期

	//判断是否需要滚动,并计算需滚动的记录数量
	ret = curInvHead.CheckRoll(g_globalArg->m_invCount, nRefDate,nInvDelDate);
	if (ret!=SUCCESS)
	{
		CaMsgBox::ShowMsg("发票张数滚动判断失败!");
		DBG_RETURN(FAILURE);
	}

	//滚动
	if (nInvDelDate>0)
	{
		DBG_PRINT(("nInvDelDate = %u", nInvDelDate));
		CaMsgBox::ShowMsg("发票张数要滚动!");
	}
	DBG_RETURN(SUCCESS);
}
//------------------------------------------------------------------
//存根打印
//------------------------------------------------------------------
UINT8 INVM_GetInvNum(string nCode, UINT32 nStartNo, UINT32 nEndNo, UINT32 &nNum)
{
    DBG_ENTER("GetInvNum(UINT32 &nNum)");

    nNum = 0;
    INT32 errorcode;
    INT32 nTmpNum = 0;
    CInvHead curInvHead;
    CInvHead *pInvHead = &curInvHead;
    DBG_ASSERT_EXIT((pInvHead != NULL), (" pInvHead == NULL!"));

    //查总记录数,已分发未导入,赋值pageNum

    INT8 value[256];
    memset((void*)value, 0, sizeof(value));
    pInvHead->m_filter = "where FPDM = ";
    sprintf(value,"'%s' and FPHM >= %u and FPHM <= %u",nCode.c_str(),nStartNo,nEndNo);
    pInvHead->m_filter.append(value);
    DBG_PRINT((" pInvHead->m_filter = %s", pInvHead->m_filter.c_str()));
    nTmpNum = pInvHead->GetRecordNum();

    pInvHead = NULL;

    if (nTmpNum<0)
    {
        DBG_RETURN(FAILURE);
    }
    nNum = nTmpNum;
    DBG_RETURN(SUCCESS);
}
//按发票号码查询发票明细
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::FPBL_Proc(string nsrsbh, string sksbbh, UINT32 SDate, UINT32 EDate, string &strErr)
{
	DBG_PRINT(("FPBL_Proc Begin()"));
	CInvHead invHead;
	INT8 sqlbuf[128];
	INT8 tmpBuf[128];
	INT32 errcode = 0;
	XMLConstruct pXmlBuild;
	UINT32 nCount = 1;
	string filename("");

	memset(tmpBuf, 0, sizeof(tmpBuf));
	UINT8 ret = UsbDiskMount(tmpBuf);
	if (SUCCESS != ret)
	{
		DBG_PRINT(("挂载U盘失败"));
		strErr = "挂载U盘失败";
		UsbDiskUnMount();
		return JSK_FAILURE;
	}

	UINT32 uDate = SDate/100;
	DBG_PRINT(("uDate= %u",uDate));
	sprintf(tmpBuf, "/mnt/%s%s%s_%s_%u_%s%s.DAT", XML_FILE_NAME_CGLPLBL,XML_FILE_NAME_KFSBM,nsrsbh.c_str(),sksbbh.c_str(),uDate,XML_FILE_NAME_ENCODE,"0001");
	filename = tmpBuf;
	DBG_PRINT(("filename = %s", filename.c_str()));

	memset(sqlbuf, 0, sizeof(sqlbuf));
	sprintf(sqlbuf, "where KPRQ>=%u and KPRQ<=%u", SDate, EDate);
	DBG_PRINT(("sqlbuf = %s", sqlbuf));
	invHead.m_filter.append(sqlbuf);
	INT32 m_InvNum = invHead.GetRecordNum();
	DBG_PRINT(("m_InvNum = %ld", m_InvNum));
	if(m_InvNum  > 0 )
	{
		pXmlBuild.XMLConstructBegin("1.0", "gbk", "business");
		pXmlBuild.m_RootElement->SetAttribute("id", "JSZZP");
		pXmlBuild.m_RootElement->SetAttribute("comment", "卷式增普票");
		pXmlBuild.m_RootElement->SetAttribute("version", "1.0");
	}
	else
	{
		strErr = "该时间段没有开票信息!";
		return JSK_FAILURE;
	}

	UINT32 date_StartNo = 0;	//当天的发票起始号码
	TDateTime tmpDateTime(SDate, 0);
	UINT32 TempDate = tmpDateTime.FormatInt(YYYYMMDD);	
	DBG_PRINT(("TempDate = %u", TempDate));
	while(TempDate <= EDate)
	{
		DBG_PRINT(("补录日期: %u", TempDate));
		date_StartNo = 0;

		memset(sqlbuf, 0, sizeof(sqlbuf));
		sprintf(sqlbuf, "WHERE KPRQ=%u order by NO limit 1", TempDate);
		DBG_PRINT(("sqlbuf = %s", sqlbuf));
		invHead.m_filter.append(sqlbuf);
		errcode = invHead.Load();
		DBG_PRINT(("errcode = %u", errcode));	

		while (errcode == SQLITE_OK)	//查到记录
		{
			DBG_PRINT(("查询invhead表有内容!"));
			pXmlBuild.AddNode(pXmlBuild.m_RootElement, "body");
			memset(tmpBuf, 0, sizeof(tmpBuf));
			sprintf(tmpBuf, "%u", nCount);
			pXmlBuild.AddAttr("no", tmpBuf);
			pXmlBuild.m_parentElement[1] = pXmlBuild.m_NewElement;
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "fpdm");
			pXmlBuild.AddText(invHead.m_fpdm);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "fphm");
			memset(tmpBuf, 0, sizeof(tmpBuf));
			sprintf(tmpBuf, "%08u", invHead.m_fphm);
			pXmlBuild.AddText(tmpBuf);


			TDateTime tmpdate(invHead.m_kprq, invHead.m_kpsj);
			string tmpKprq = tmpdate.FormatString(YYYYMMDD);
			DBG_PRINT(("tmpKprq= %s",tmpKprq.c_str()));
			string tmpKpsj = tmpdate.FormatString(HHMMSS);
			DBG_PRINT(("tmpKpsj= %s",tmpKpsj.c_str()));

			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "kprq");
			//memset(tmpBuf, 0, sizeof(tmpBuf));
			//sprintf(tmpBuf, "%08u", invHead.m_kprq);
			pXmlBuild.AddText(tmpKprq);			
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "kpsj");
// 			memset(tmpBuf, 0, sizeof(tmpBuf));
// 			sprintf(tmpBuf, "%u", invHead.m_kpsj);
			pXmlBuild.AddText(tmpKpsj);			

			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "sbbh");
			pXmlBuild.AddText(sksbbh);

			if(invHead.m_kplx == JSK_RETURN_INV)
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "hjje");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "-%.2lf", ((double)(invHead.m_kpje)*1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
			
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "se");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				if(invHead.m_kpse == 0)
				{
					sprintf(tmpBuf, "%.2lf", ((double)invHead.m_kpse *1.0)/SUM_EXTENSION);
				}
				else
				{
					sprintf(tmpBuf, "-%.2lf", ((double)invHead.m_kpse *1.0)/SUM_EXTENSION);
				}
				pXmlBuild.AddText(tmpBuf);

				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "jshj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				invHead.m_kphjje = invHead.m_kpje + invHead.m_kpse;
				sprintf(tmpBuf, "-%.2lf", ((double)invHead.m_kphjje *1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);		
			}
			else
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "hjje");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", ((double)(invHead.m_kpje)*1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "se");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", ((double)invHead.m_kpse *1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "jshj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				invHead.m_kphjje = invHead.m_kpje + invHead.m_kpse;
				sprintf(tmpBuf, "%.2lf", ((double)invHead.m_kphjje *1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
			}
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "jym");
			pXmlBuild.AddText(invHead.m_fwm);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "xfmc");
			pXmlBuild.AddText(g_globalArgLib->m_corpInfo->m_Nsrmc);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "xfsh");
			pXmlBuild.AddText(nsrsbh);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "gfmc");
			pXmlBuild.AddText(invHead.m_fkdw);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "gfsh");
			pXmlBuild.AddText(invHead.m_payerCode);
			
				
			string fpztbz("");
			switch(invHead.m_kplx)
			{
			case JSK_NORMAL_INV:
					fpztbz = "0";	//正票
				break;
			case JSK_RETURN_INV:
					fpztbz = "1";	//退票
				break;
			case JSK_WASTE_INV:
					fpztbz = "2";	//空白废
				break;
			case JSK_WASTE_NOR:
					fpztbz = "3";	//正废
				break;
			case JSK_WASTE_RET:
					fpztbz = "4";	//负废
				break;
			}
			//发票状态标志(0 正常票1 退票2新发票的作废发票3正常发票的作废发票4已开退票的作废发票)
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "fpbz");
			pXmlBuild.AddText(fpztbz);

			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "skr");
			pXmlBuild.AddText(invHead.m_sky);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "bz");
			UINT8 baseBuf[256];
			memset(baseBuf, 0, sizeof(baseBuf));
			sprintf((INT8 *)baseBuf, "%s", invHead.m_backup1.c_str());
			Base64_Encode_2(baseBuf, invHead.m_backup1.length());
			string tmpStr = (INT8 *)baseBuf;
			pXmlBuild.AddText(tmpStr);
			
			if(invHead.m_kplx == JSK_RETURN_INV)
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "yfpdm");
				pXmlBuild.AddText(invHead.m_yfpdm);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "yfphm");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%u",  invHead.m_yfphm);
				pXmlBuild.AddText(tmpBuf);
			}
			else
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "yfpdm");
				pXmlBuild.AddText("");
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "yfphm");
				pXmlBuild.AddText("");
			}

			if( (invHead.m_kplx == JSK_WASTE_NOR) || (invHead.m_kplx == JSK_WASTE_RET) || (invHead.m_kplx == JSK_WASTE_INV) )
			{
				TDateTime zfDate(invHead.m_zfsj.c_str(), DATETIME_POS);
				string strZfrq =  zfDate.FormatString(YYYYMMDD);
				DBG_PRINT(("strZfrq= %s",strZfrq.c_str()));
				string strZfsj=zfDate.FormatString(HHMMSS);
				DBG_PRINT(("strZfsj= %s",strZfsj.c_str()));

				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zfrq");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				//sprintf(tmpBuf, "%u", zfDate.FormatInt(YYYYMMDD));
				pXmlBuild.AddText(strZfrq);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zfsj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				//sprintf(tmpBuf, "%u", zfDate.FormatInt(HHMMSS));
				pXmlBuild.AddText(strZfsj);				
			}
			else
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zfrq");
				pXmlBuild.AddText("");
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zfsj");
				pXmlBuild.AddText("");
			}

			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "qmz");
			pXmlBuild.AddText(invHead.m_casign);


			CInvDet *pInvDet = invHead.pHead;
			
			for(int j=1; j<=invHead.m_sphsl; j++, pInvDet=pInvDet->pNext)
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zb");
				pXmlBuild.m_parentElement[2] = pXmlBuild.m_NewElement;
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "xh");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%u", pInvDet->m_sphxh);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "xm");
				pXmlBuild.AddText(pInvDet->m_spmc);
				
				if(invHead.m_kplx == JSK_RETURN_INV)
				{
					pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "sl");
					memset(tmpBuf, 0, sizeof(tmpBuf));
					if(pInvDet->m_spsl < 0.001)
					{
						sprintf(tmpBuf, "0.00000000");
					}
					else
					{
						sprintf(tmpBuf, "-%.3lf00000",  pInvDet->m_spsl);
					}
					pXmlBuild.AddText(tmpBuf);
				}
				else
				{
					pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "sl");
					memset(tmpBuf, 0, sizeof(tmpBuf));
					sprintf(tmpBuf, "%.3lf00000",  pInvDet->m_spsl);
					pXmlBuild.AddText(tmpBuf);
				}
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "hsdj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.3lf00000", pInvDet->m_spdj);
				pXmlBuild.AddText(tmpBuf);
				
				if(invHead.m_kplx == JSK_RETURN_INV)
				{
					pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "hsje");
					memset(tmpBuf, 0, sizeof(tmpBuf));
					sprintf(tmpBuf, "-%.2lf", ((double)pInvDet->m_spje*1.0)/SUM_EXTENSION);
					pXmlBuild.AddText(tmpBuf);
				}
				else
				{
					pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "hsje");
					memset(tmpBuf, 0, sizeof(tmpBuf));
					sprintf(tmpBuf, "%.2lf", ((double)pInvDet->m_spje*1.0)/SUM_EXTENSION);
					pXmlBuild.AddText(tmpBuf);
				}
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "dj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.3lf00000", pInvDet->m_dj);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "je");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", ((double)pInvDet->m_je*1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "zsl");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", (double)pInvDet->m_sl);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "se");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", ((double)pInvDet->m_spse*1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
			}

			nCount++;
			DBG_PRINT(("nCount = %u", nCount));
			date_StartNo = invHead.m_no;
			sprintf(sqlbuf, "WHERE KPRQ=%u and NO>%u limit 1", TempDate, date_StartNo);
			invHead.m_filter.append(sqlbuf);
			errcode = invHead.Load();			
		}

		//--------------------------------------------------
		//未找到票,查下一天
		//--------------------------------------------------
		if (errcode == SQLITE_DONE)
		{
			tmpDateTime ++;
			TempDate = tmpDateTime.FormatInt(YYYYMMDD);
			continue;
		}
		else
		{
			DBG_PRINT(("读数据库错误"));
			break;
		}
	}


	if( 1 != pXmlBuild.XMLConstructEnd(filename.c_str()) )
	{
		strErr = "报存XML文件错误!";
		return JSK_FAILURE;
	}

	UsbDiskUnMount();
	
	return JSK_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;
}
INT32 CJSKMakeInvoice::FPSC_Proc(UINT8 czlx, UINT32 &fpzx, string &strInvInfo, string &strErr)
{
	INT8 sqlbuf[128];
	CInvServ invServ;
	CInvHead invHead;
	INT32 retcode = JSK_SUCCESS;
	INT32 errcode = 0;
	string tmpErr("");

//	CJSKDeclareProc::DelUploadInv();

	memset(sqlbuf, 0, sizeof(sqlbuf));
	sprintf(sqlbuf, "where UP_FLAG=0 or UP_FLAG=1 ");
	invServ.m_filter.append(sqlbuf);
	invServ.Requery();
	errcode = invServ.LoadOneRecord();
	DBG_PRINT(("errcode = %d", errcode));
	if(errcode == SQLITE_OK)
	{
		if((invServ.m_code=="") || (invServ.m_InvNo==0))
			errcode = SQLITE_DONE;
	}
	if(errcode != SQLITE_OK)
	{
		retcode = CJSKInfoFunc::GetFirstOffInvInfo(&invHead, tmpErr);
		if((invHead.m_fpdm=="") || (invHead.m_fphm==0))
			retcode = JSK_FAILURE;
		if(retcode != JSK_SUCCESS)
		{
			g_globalArgLib->m_pthreadFlag = 0;
			g_globalArgLib->m_InvServNum = 0;
			retcode = JSK_COMMON_ERR_NO;
			strErr = "所有发票都已上传!";
			return retcode;
		}
		memset(sqlbuf, 0, sizeof(sqlbuf));
		sprintf(sqlbuf, "where FPDM='%s' and FPHM=%u ", invHead.m_fpdm.c_str(), invHead.m_fphm);
		DBG_PRINT(("sqlbuf = %s", sqlbuf));
		invServ.m_filter.append(sqlbuf);
		invServ.Requery();
		if(invServ.LoadOneRecord() == SQLITE_OK)
		{
			if(invServ.m_upFlag == INV_UPLOAD_FLAG2)
			{
				g_globalArgLib->m_pthreadFlag = 0;
				retcode = JSK_COMMON_ERR_NO;
				strErr = "发票上传错误,请核对!";
				return retcode;
			}
		}

		invServ.m_code = invHead.m_fpdm;
		invServ.m_InvNo = invHead.m_fphm;
		invServ.m_fpsyh = invHead.m_fpsyh;
	}

	UINT32 invLen = 0;
	fpzx = 1;		//发票张数
	memset(sqlbuf, 0, sizeof(sqlbuf));
	sprintf(sqlbuf, "where FPDM='%s' and FPHM=%u ", invServ.m_code.c_str(), invServ.m_InvNo);
	DBG_PRINT(("sqlbuf = %s", sqlbuf));
	invHead.m_filter.append(sqlbuf);
	retcode = invHead.Load();
	if(retcode != SQLITE_OK)
	{
		DBG_PRINT(("here query from JSK"));
		invHead.m_fpdm = invServ.m_code;
		invHead.m_fphm = invServ.m_InvNo;
		invHead.m_fpsyh = invServ.m_fpsyh;
		retcode = CJSKInfoFunc::GetInvDetailInfoNO(&invHead, g_invInfo, invLen, strErr);
		if(retcode != JSK_SUCCESS)
		{
			return retcode;
		}
		
// 		if(invHead.Save() != SQLITE_OK)
// 		{
// 			retcode = JSK_COMMON_ERR_NO;
// 			strErr = "发票信息保存数据库错误";
// 			return retcode;
// 		}
	}
	else
	{
		DBG_PRINT(("here query from DB success"));
		//将invHead类转换成string类型输出
		CJSKInfoFunc::MutexLock();
		CJSKInfoFunc::InvDetail2Data(&invHead, g_invInfo, invLen);
		CJSKInfoFunc::MutexUnlock();
		DBG_PRINT(("invLen = %u", invLen));
	}

	DBG_PRINT(("invLen = %u", invLen));
	AddInvDetail2Data(&invHead, g_invInfo, invLen);
	strInvInfo.append((INT8 *)g_invInfo);
	DBG_PRINT(("invLen = %u", invLen));


	//更新上传标志
	invServ.m_upFlag = INV_UPLOAD_FLAG1;
	DBG_PRINT(("sqlbuf = %s", sqlbuf));
	invServ.Update(sqlbuf, &invServ.m_upFlag, NULL);
	
	return JSK_SUCCESS;
}
INT32 CJSKMakeInvoice::FPZF_Proc(CInvHead *pInvhead, UINT8 zflx, string &strErr)
{
	DBG_PRINT(("===== FPZF_Proc Begin() ======"));
	DBG_ASSERT_EXIT((pInvhead != NULL), (" pInvhead == NULL!"));
	INT32 retcode = JSK_SUCCESS;

	if(zflx == 0)	//空白票作废
	{
		pInvhead->m_kplx = JSK_WASTE_INV;
		pInvhead->m_xfmc = g_globalArgLib->m_corpInfo->m_Nsrmc;
		retcode = FPKJ_Proc(pInvhead, strErr, 1);

		return retcode;
	}

	//////////////////////////////////////////////////////////////////////////
	if(zflx != 1)
	{
		strErr = "发票作废类型错误!";
		return JSK_FAILURE;
	}
	CJSKInvManageProc::fplxdm2fplx(pInvhead->m_fplxdm, pInvhead->m_fplb);
	//已开票作废
	//查询数据库中已开发票信息
	INT8 sqlbuf[256];
	UINT32  errorcode;
	CInvHead tmpInvHead;
	memset(sqlbuf, 0, sizeof(sqlbuf));
	sprintf(sqlbuf, "where FPDM='%s' and FPHM=%u", pInvhead->m_fpdm.c_str(), pInvhead->m_fphm);
	DBG_PRINT(("sqlbuf = %s", sqlbuf));
	pInvhead->m_filter.append(sqlbuf);
	if(pInvhead->Load() != SQLITE_OK)
	{
		DBG_PRINT(("here find by jsp"));
		//数据库查询不到,从盘中查询
		retcode = CJSKInfoFunc::GetInvDetailInfoNO(pInvhead, strErr);
		if(retcode != JSK_SUCCESS)
		{
			return retcode;
		}

		pInvhead->Save();
	}

	//已开发票作废控制
	if(pInvhead->m_kplx == JSK_NORMAL_INV)
	{
		pInvhead->m_kplx = JSK_WASTE_NOR;
	}
	else if(pInvhead->m_kplx == JSK_RETURN_INV)
	{
		pInvhead->m_kplx = JSK_WASTE_RET;
	}
	else
	{
		retcode = JSK_COMMON_ERR_NO;
		strErr = "废票不能再次作废!";
		return retcode;
	}

	//权限控制
	retcode = MakeInvAuthority(pInvhead, strErr);
	if( retcode != JSK_SUCCESS )
	{
		return retcode;
	}

	retcode = CJSKInfoFunc::WasteInvHandInfo(pInvhead, strErr);
	if( retcode != JSK_SUCCESS )
	{
		return retcode;
	}

	//数据库事务开始
	pInvhead->BeginTransaction();

	//修改数据库对应信息
	tmpInvHead.m_kplx = pInvhead->m_kplx;
	tmpInvHead.m_fpsyh = pInvhead->m_fpsyh;
	tmpInvHead.m_casign = pInvhead->m_casign;
	tmpInvHead.m_zfsj = pInvhead->m_zfsj;
	retcode = tmpInvHead.Update(sqlbuf, &tmpInvHead.m_kplx, &tmpInvHead.m_fpsyh, &tmpInvHead.m_zfsj, &tmpInvHead.m_casign, NULL);
	DBG_PRINT(("更新DB的INV_HEAD:retcode = %d", retcode));
	CInvDet invDet;
	invDet.m_kplx = pInvhead->m_kplx;
	retcode = invDet.Update(sqlbuf, &invDet.m_kplx, NULL);
	DBG_PRINT(("更新DB的INV_DET:retcode = %d", retcode));

	if(pInvhead->m_kplx == JSK_WASTE_RET )
	{
		DBG_PRINT(("更新RT_INV表"));
		CRtInv curRtInv;
		CRtInv *pRtInv = &curRtInv;
		memset(sqlbuf, 0, sizeof(sqlbuf));
		sprintf(sqlbuf, "where FPDM='%s' and FPHM=%u ", pInvhead->m_yfpdm.c_str(), pInvhead->m_yfphm);
		DBG_PRINT(("sqlbuf = %s", sqlbuf));
		pRtInv->m_filter.append(sqlbuf);
		pRtInv->Delete();
	}

	//处理INV_SERV表,如果已上传发票,需要重新记录INV_SERV???
	CInvServ invServ;
	errorcode = invServ.Save(pInvhead, g_globalArgLib->m_InvServNum, g_globalArgLib->m_InvServSum, strErr);	
	DBG_PRINT(("存储到DB的INV_SERV, errorcode = %u", errorcode));
	
	//数据库事务结束
	pInvhead->EndTransaction();

	return JSK_SUCCESS;
}
void CMaintenanceMenu::OnButton9(int iEvent, unsigned char * pEventData, int iDataLen)
{
	if (g_globalArg->m_initFlag == 0)
	{
		CaMsgBox::ShowMsg("机器未初始化");
		return ;
	}

	CInvServ invServ;
	CInvHead invHead;
	CInvDet  invDet;
	INT32 nErrCode;
	INT8 chValue[128];

	invServ.Requery();
	nErrCode = invServ.LoadOneRecord();
   DBG_PRINT(("nErrCode= %u",nErrCode));
	if( nErrCode != SQLITE_OK )
	{
		CaMsgBox::ShowMsg("无缓存记录");
		return;
	}

	memset(chValue, 0, sizeof(chValue));
	sprintf(chValue,"代码:'%s' 号码:%u 确认删除?", invServ.m_code.c_str(), invServ.m_InvNo);
	CaMsgBox msgBox(chValue,CaMsgBox::MB_YESNO);
	msgBox.ShowBox();	
	if (msgBox.m_iStatus == OK_PRESSED)
	{
		memset((void*)chValue, 0, sizeof(chValue));
		//sprintf(chValue, "where CODE = '%s' and INV_NO = %u", invServ.m_code.c_str(), invServ.m_InvNo);
		// 更改inv_serv中的两个字段
		sprintf(chValue, "where FPDM = '%s' and FPHM = %u", invServ.m_code.c_str(), invServ.m_InvNo);
		invHead.m_filter = chValue;
		nErrCode = invHead.Delete();
		if (SQLITE_OK != nErrCode)
		{
			CaMsgBox::ShowMsg("删除失败");
			return;
		}
		invDet.m_filter = chValue;
		nErrCode = invDet.Delete();
		if (SQLITE_OK != nErrCode)
		{
			CaMsgBox::ShowMsg("删除失败");
			return;
		}
		
		sprintf(chValue, "where CODE = '%s' and INV_NO = %u", invServ.m_code.c_str(), invServ.m_InvNo);
		invServ.m_filter = chValue;
		nErrCode = invServ.Delete();
		if (SQLITE_OK != nErrCode)
		{
	
			CaMsgBox::ShowMsg("删除失败");
			return;
		}
		CaMsgBox::ShowMsg("删除成功");

		if(0 != g_globalArg->m_InvServNum)
		{
			g_globalArg->m_InvServNum--;
		}
		DBG_PRINT(("m_InvServNum = %u", g_globalArg->m_InvServNum ));
	}
}