Exemple #1
0
uchar ProCheckAgreeUpdate(void)
{
	uchar ucRet,ucFd;
	uint  uiCount;

	ucRet = EA_ucPFOpen(YLWATER, &ucFd);

	if ( ucRet != EM_SUCCESS)
	{
		return EM_SUCCESS;
	}

	uiCount = 0;
	ucRet = EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiCount);
	EA_ucPFClose(ucFd);
	if (uiCount)
	{
		return EM_ERROR;
	}
	else
	{
		return EM_SUCCESS;
	}
}
Exemple #2
0
// *****************************************************************
// 功能:		QUERY_NOTE_RECORD
// 说明:		查询日结小票
// 入口参数:	
// 出口参数:	Null
// 作者:
// 返回值:	-1 关机				
// *****************************************************************
int QUERY_NOTE_RECORD(void)
{
	int         count;
	INT32U      RecordCount = 0;
	uchar       uckey; 
	uint        uikey; 
	uchar 		ucOpenID=0;
	INT8U 		rec[60];

	memset(rec, 0, sizeof(rec));

	if ( EA_ucPFOpen( (uchar *)hisrecFileName, &ucOpenID) != EM_ffs_SUCCESS )
	{
		lcddisperr("打开日结文件失败");
		return 0;
	}
	// 获取有效信息条数
	(void)EA_ucPFInfo(ucOpenID, EM_ffs_VALIDREC, &RecordCount);
	if( RecordCount == 0)
	{
		lcddisperr("没有日结信息");
		(void)EA_ucPFClose(ucOpenID);
		return 0;//表示没有记录
	}
	count = RecordCount;//最后一条		

	if(EA_ucPFReadRec(ucOpenID, count, 1, &RecordCount, rec) != EM_SUCCESS)
	{
		(void)EA_ucPFClose(ucOpenID);
		lcddisperr((void *)"读取不符合");
		return 0;
	}

	AnalyAndDisplayNote(rec);

	while ( 1 )
	{
		uckey = EA_ucKBHit();
		if(uckey == EM_key_HIT)    //有按键
		{
			uikey = EA_uiInkey(0);    //读取按键键值
			if ( (uikey == EM_key_EXIT) || (uikey == EM_key_CANCEL) )			//退出
			{
				(void)EA_ucPFClose(ucOpenID);
				return 1;
			}
			switch ( uikey )
			{
				case EM_key_UP:	//	按[2]键或往上拨动拨轮则屏幕往上滚动一行
					count --;
					if ( count < 0 )//记录超限
					{
						lcddisperr("最后一条");
						count ++;
					}
					break;

				case EM_key_DOWN:	//	按[8]键或往下拨动拨轮则屏幕往下滚动一行
					count ++;
					if ( count >= RecordCount )
					{
						lcddisperr("最后一条");
						count --;
					}
					break;
				case EM_key_ENTER:
					break;
				default:
					break;
			}

			if ( (uikey==EM_key_UP) || (uikey==EM_key_DOWN)  )
			{
				if(EA_ucPFReadRec(ucOpenID, count, 1, &RecordCount, rec) != EM_SUCCESS)
				{
					(void)EA_ucPFClose(ucOpenID);
					lcddisperr((void *)"读取不符合");
					return 0;
				}
				AnalyAndDisplayNote(rec);
			}

			if(uikey == EM_key_ENTER)
			{
				print_work_note_his(rec);
				(void)EA_ucPFClose(ucOpenID);
				return 1;
			}			
		}
	}
}
Exemple #3
0
int dlm_main(void)
{
    char szGetBuffer[100],szTmpBuf[100];

    char cWaitRet;
    uint uiKey , uiRet;
    uchar ucRetVal;
    uchar ucFd;
    uchar ucRet;

    int nScreen = 0;
    char cMenuTime;
    uint uiCount1,uiCount2;
    uint uiOption;
	uint puiConfigInfo;
   
    const char *pcModuleName = MODULE_FILE_NAME;
//    const char *pcCommModuleName = "applib";
    DevHandle phPinpad;
#ifdef EPT_A9L
	uint_64 llCnt = 0;
	char szData[100];
#endif

#ifdef EMVIC
	EA_EMV_vInit();
#endif
    //设备句柄清空 
    gbPrintHandle = EM_NULL;
	//清空所有全局设备句柄,add by zhuchentao 060831
	gbhdlMagCard = EM_NULL;;	//磁卡模块 
	gbhdlUserCard = EM_NULL;
	gbhdlMasterCard = EM_NULL;
	gbhdlSAM1Card = EM_NULL;
	gbhdlSAM2Card = EM_NULL;
	gbhdlSAM3Card = EM_NULL;
	gbhdlSAM4Card = EM_NULL;
	gbMifCardHandle = EM_NULL;
#ifdef EMVIC 
	gbhdlPINPAD = EM_NULL;   
	gbhdlRS232 = EM_NULL;
	gbMifCardHandle = EM_NULL; 
#endif
	cRunState = 1;
    CommInfo.gbHdl = EM_NULL;
    memset(&iso, 0, sizeof(ISODataStru));
    memset(&iso1, 0, sizeof(ISODataStru));
    memset(&printiso, 0, sizeof(ISODataStru));
    memset(&upiso, 0, sizeof(ISODataStru));
	gbcECDefault = 0;
#ifndef EPT_A9L
#ifdef EPT_M3
	if (EA_uiLoadAndExecuteModule("LibRFReader.dlm", "") != EM_SUCCESS)
#endif
#ifdef EPT56X0
	if (EA_uiLoadAndExecuteModule("LibRFReader", "") != EM_SUCCESS)
#endif
    {
    	
        PubDisplay(3, "载入LibRFReader.dlm失败");
        PubDisplay(4, "请下载LibRFReader.dlm文件");
		PubuiInkey(0);
		return EXCEPTION;
    }
#endif
	EA_vCls();
	PubucLoadAllMfVar((char*)MODULE_FILE_NAME, &FV, sizeof(FV));
// #ifdef EPT56X0
// 	EA_ucSetStopFlag(EM_DISABLE_STOP);
// #endif
// #ifdef EPT_A9L
// 	EA_ucSetStopFlag(EM_DISABLE_STOP);
// #endif
// 银商允许修改参数标志,提交程序的时候分别tms非tms的2种情况编译提交 
//	setup.c 中设置的地方取消无用了!!
	cSetupModifyFlag = 1;// 下载版 允许修改参数
//   	cSetupModifyFlag = 0;// TMS服务器版 不允许修改参数

#ifndef EPT5610
	EA_vSetLCDLightTimer(60);
#endif
    EA_vCls();
    if (PubucFirstRunPara(pcModuleName, "parafile") == EM_SUCCESS)
    {
		PubGetPinpadPara();// 先读取参数文件中密码键盘标签
        FV.gbnParaFirstFlag = YES;
		WRITE_nVAR(FV.gbnParaFirstFlag);
    }
	PubUsePinpadInside(FV.Other.SetPinpadType);
// 	PubUsePinpadInside(1);
    PubGetPrinterType(&iPrinterType); 
    PubGetPinpadType(&iPinpadType);
    while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS)
    {
        PubDisplayInv(2, "打开密码键盘错");
        PubDisplay(3, "请接入密码键盘");
        PubDisplay(4, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
		uiRet = PubuiInkey(1);
        if (uiRet == EM_key_FUNC1)
		{
			PubSetUsePinpadType();
		}
		if (uiRet == EM_key_FUNC9||uiRet == EM_key_CANCEL)
		{
			return EM_ERROR;
		}
    }
    while ((PubGetPinpadVer(phPinpad ,&iPinpadVer)) == 3)
    {
        PubDisplayInv(2, "请接好密码键盘");
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
#ifndef EPT5610
    //20070914  by wei 将安全级别设置成默认级别
	if ( iPinpadVer == 2 )  
	{
		EA_pci_ucGetSecureConfig(phPinpad, EM_NULL, &puiConfigInfo);
		if ( puiConfigInfo != EM_pin_DEFAULTCONFIG)
		{
			EA_pci_ucSetSecureConfig(phPinpad, EM_NULL, EM_pin_DEFAULTCONFIG);
		}
	}
#endif
    EA_ucCloseDevice(&phPinpad);

    nFirstSetupFlag = NO;

    if (PubucFirstRunProg(pcModuleName) == EM_SUCCESS)
	{
        FV.gbnFirstFlag = YES;
		WRITE_nVAR(FV.gbnFirstFlag);
	}


    // 导入def8583.h中的8583包定义
    if (PubImport8583(YlIso8583Def) == EXCEPTION)
    {
        EA_vCls();
        PubDisplay(3, "8583包导入出错");
        PubDisplay(4, "请检查程序重新下装");
        PubuiInkey(0);
        return EXCEPTION;
    }
    // 导入结束 
	PubGetMifsType(&iMifsType);	//增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断

    if (FV.gbnFirstFlag == YES)
    {
        PubSetupFirst();
#ifdef EMVIC
   		setup_first ();
#endif   		
		WRITE_nVAR(FV); //这里把setupfirst里面的内容统一写入一次
        nFirstSetupFlag = YES;
        FV.gbnFirstFlag = NO;
		WRITE_nVAR(FV.gbnFirstFlag);

        FV.gbnParaFirstFlag = YES;
		WRITE_nVAR(FV.gbnParaFirstFlag);

        if (FV.gbnParaFirstFlag == YES)
        {
            PubReadPara() ;
        }
        FV.gbnParaFirstFlag = NO;
		WRITE_nVAR(FV.gbnParaFirstFlag);
    }
    if (FV.gbnParaFirstFlag == YES)
    {
        PubReadPara();
    }
    if (nFirstSetupFlag == YES)
    {
		PubInitGlobal();
        PubSetup(10);
        nFirstSetupFlag = NO;
    }
	else
	{    
		PubInitGlobal();
	}
#ifdef TMS
	//读取主控应用参数
	ProReadBasePara();
#endif
	// by wei 每次进入应用不需要重新操作员签到 modify by baijz 20110723 BCTC要求每次开机操作员签到
     BUFCLR(szGetBuffer);
//      VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));
//      if (szGetBuffer[0] == LOGON)
//          PubSetPoscfgcPosState(NO_LOGON);

    EA_vCls();
    PubKeyOn();
	PubDisplayInv( 1, "银联应用" ); 
	PubDisplayCen(2, "CUP2.0");
	PubDisplayCen(3, "自检...");

    //ucRet = EA_ucOpenDevice("PINPAD",EM_io_IPP, &phPinpad);
    while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS)
	{
        PubDisplayInv(2, "打开密码键盘错");
        PubDisplay(3, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
        PubuiInkey(1);
	}
    while ((ucRet = PubResetPinpad(phPinpad)) != EM_SUCCESS)
	{
        PubDisplayInv(2, "请接好密码键盘");
        PubDisplay(3, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
        PubuiInkey(1);
	}
	// 为多应用,怕其他应用使用和银联相同的mackey workkey的ID号,这里重新load一次。
	PubucSelectKey(phPinpad, EM_pin_MASTERKEY, FV.bank.nMKeyIndex);
	if(FV.Other.gbMacKeyLen)
		PubucLoadKey(phPinpad,EM_pin_DEFAULTMODE ,EM_pin_MACKEY, 0, FV.Other.gbMacKeyLen, FV.Other.gbszMacKey);
	if(FV.Other.gbWorkKeyLen)
		PubucLoadKey(phPinpad, EM_pin_DEFAULTMODE ,EM_pin_WORKKEY, 0, FV.Other.gbWorkKeyLen, FV.Other.gbszWorkKey);
    EA_ucCloseDevice(&phPinpad);
    if (PubuiInkeyMs(500) == EM_key_CANCEL)
        PubLogin();

	PubGetMifsType(&iMifsType);	//增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断
    PubInitComm(&CommInfo, AUTOCHECK);
    BUFCLR(szGetBuffer);
    VERIFY_NORMAL(PubGetPoscfgcBatchState(szGetBuffer));

    if (szGetBuffer[0] == YES)
    {
        EA_vCls();
        PubDisplayInv(2, "请先结算再作交易");
        PubuiInkey(0);
    }
    BUFCLR(szGetBuffer);
	BUFCLR(gbPosTags);
	gbTags = 0; 
#ifdef EMVIC
	PubSetExeReader(1);
#endif
	// 为防止清冲正标志的时候死机这种非常极端小概率事件,这里做一次判断最后一笔交易流水来清冲正
	PubPreAutoVoid();
	nScreen = 0 ;
    while (1)
    {
		// 当冲正标识、冲正缓冲区两者中的一个为0时,两者都清0
		if (FV.Void.cAutoVoidFlag != 1 || !memcmp(FV.Void.gbszVoidStr, "\x00\x00\x00\x00\x00\x00\x00\x00", 8))
		{
			PubClearAutoVoidBuf();
		}
		PubClearIcon();// //清图标行
#ifdef TMS
		if (ProJudgeBaseDlaVer() == EM_SUCCESS)
		{
			ProGetBaseDialFix();
			ucRet = PubReturnUpdate() ;
			if (ucRet != EM_ERROR)
			{
				PubDelAllBit(&iso);
				close_all_dev();
				return ucRet;
			}
			if (PubCheckRunState() == EM_SUCCESS)
			{
				PubDelAllBit(&iso);
				close_all_dev();
				return EM_ERROR;
			}
			if (PubCheckSettleTimes() == EM_SUCCESS)
			{
				PubDisplay(2 , "到达累计结算次数");
				PubDisplay(3 , "自动联机报道");
				PubuiInkey(2);
				FV.SettleTimesCount = 0;
				WRITE_nVAR(FV.SettleTimesCount);
				PubDelAllBit(&iso);
				close_all_dev();
				return 29;// 标签120000029
			}
		}
#endif
        memset(&gbTrkInfo, 0, sizeof(struct TrackInfo));
		memset(&gbCardinfo, 0, sizeof(struct CardConfig));

		//FV.Other.POSSTATFLAG = 6;//chenjs20060915 ls add for test TMS 
		
        switch (FV.Other.POSSTATFLAG)
        {
        case 0:
            break;
        case 1:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求下载参数");
            PubDisplay(2, "请按确认键继续");
			PubuiInkey(0);  
            PubDownPara();
            continue;
        case 2:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求上传状态");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
            PubUploadState();
            continue;
        case 3:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求重新签到");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
			PubSetPoscfgcLoginState(NO_LOGON);   //add by chenjis 20130423
            PubBankLogin();
            continue;

#ifdef EMVIC
        case 4:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求公钥下载");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
            if(PubYlConnect(&CommInfo)!=NORMAL)
			    continue;
	    	if (PubQueryPubilcKey () == 1)
			{
			    PubDownPubilcKey ();
			}
		    PubDialOff (&CommInfo);
			continue;     
        case 5:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求更新参数");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
	        if(PubYlConnect(&CommInfo)!=NORMAL)
			    continue;
//add by baijz 20110906 下载过程断电,需要删除EMV参数文件,否则会重复下载
			EA_ucPFDel (FEmvPara);
			EA_ucPFCreate (FEmvPara, (sizeof (struct EMVPARA)));
//add end 
		    PubDownEmvPara ();
		    PubDialOff (&CommInfo);
            continue;
#endif

#ifdef TMS
		case 6:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
			EA_vCls();
            PubDisplay(1, "要求下载TMS参数");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(60);
	        TmsDownPara();
			continue;
#endif
			
			case 7:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
			EA_vCls();
            PubDisplay(1, "要求下载卡BIN黑名单");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(60);
	        PubDownCardBin();
			continue;
			//JP add
        default:
            break;
        }
		FV.Other.POSSTATFLAG = 0;//chenjs20070104 add防止不小心死循环
		CheckPOSSTATFLAGTimes = 0;

		WRITE_nVAR(FV.Other.POSSTATFLAG);
        EA_ucGetDateTime(&datetime);
        sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay);
        PubDialOff(&CommInfo);

        // 判断打印是否完成 
        PubJudePrintFinish(1);

        if (EA_ucPFOpen(YLWATER, &ucFd) == EM_SUCCESS)
        {
            uiCount1 = 0;
			uiCount2 = 0;
            EA_ucPFInfo(ucFd, EM_ffs_FREEREC, &uiCount1);    //查询剩余笔数
			EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiCount2);   //查询有效笔数 //add by chenjis 20130624
            if (uiCount1 < 5 || uiCount2 >= FV.Other.gbnForceSettleNums)  //modify by chenjis 20130624
            {
                EA_vCls();
                PubDisplayInv(1, "系统报告");
				if(uiCount1 < 5)
					PubDisplay(2, "存储满,请先结算");
				else
					PubDisplay(2, "满%d笔,请先结算", FV.Other.gbnForceSettleNums );
                PubDisplay(3, "按确认键结算");
                PubuiInkey(0);
                EA_ucPFClose(ucFd);
                PubSettle();
                continue;
            }
            EA_ucPFClose(ucFd);
        }
//		 如果隔日了,就要求POS的操作员签到。
		if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 ))
			PubSetPoscfgcPosState(NO_LOGON);

        BUFCLR(szGetBuffer);
        VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));
           
        if (szGetBuffer[0] == NO_LOGON)
        {
#ifdef TMS
			EA_vCls();
			PubDisplayInv(1,"银联EMV应用");
			PubDisplayCen(3,"按任意键签到");
			PubDisplayCen(4,"按取消键切换应用");
			uiRet = PubuiInkey(10);
			if (uiRet == EM_key_FUNC9|| uiRet == EM_key_CANCEL)
			{
				EA_vCls();
				PubClearIcon();// //清图标行
                PubDisplayCen(2, "应用切换");
                PubuiInkeyMs(500);
                PubDelAllBit(&iso);
				close_all_dev();
				EA_vCls();
                return EM_ERROR;
			}
#endif
            if (PubLogin() != NORMAL)
                continue;
        }
	
        

//   20060119
//for test dudj
/*
PubDisplay(3, "是否联机签到?");
 if (PubuiInkey(2)!=EM_key_ENTER)
	sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf);
PubDisplay(3, "");
*/
		// 测试的时候打开。发布的封掉
//		sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf);
        if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 ))
        {
                if (PubBankLogin() != NORMAL)
                {
                    PubSetPoscfgcPosState(NO_LOGON);
                }
                else
                {
			        EA_ucGetDateTime(&datetime);
					sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay);
                    sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf);
					WRITE_nVAR(FV.Other.gbLoginDate);
                }
			    continue;
        }           
        
        BUFCLR(szGetBuffer);
        VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));

        if (szGetBuffer[0] == LOCK)
        {
            PubLock();
            continue;
        }

        PubGetPoscfgcMenuTime(&cMenuTime);
		PubGetTermCapSet();     //add by chenjis 20130311
        while (1)
        {
// 			PubSetExeReader(0);
			gbcECDefault = 0;
			gbcMifUpCard = 0;
			PubClearIcon();// //清图标行
#ifdef TMS
			if (ProJudgeBaseDlaVer() == EM_SUCCESS)
			{		
				// for 主控应用更新,添加一个新返回值2
				ucRet = PubReturnUpdate() ;
				if (ucRet != EM_ERROR)
				{
					PubDelAllBit(&iso);
					close_all_dev();
					return ucRet;
				}
				if (PubCheckRunState() == EM_SUCCESS)
				{
					PubDelAllBit(&iso);
					close_all_dev();
					return EM_ERROR;
				}
				if (PubCheckSettleTimes() == EM_SUCCESS)
				{
					PubDisplay(2 , "到达累计结算次数");
					PubDisplay(3 , "自动联机报道");
					PubuiInkey(2);
					FV.SettleTimesCount = 0;
					WRITE_nVAR(FV.SettleTimesCount);
					PubDelAllBit(&iso);
					close_all_dev();
					return 29;// 标签120000029
				}
			}
#endif
            PubSetPoscfgcSettleEnd(1);  /*设置结算未结束标志 */
            EA_vCls();
			PubClearIcon();// //清图标行
           // nScreen = 0 ;
            //chenjs20060725 add down
            memset(&gbTrkInfo, 0, sizeof(struct TrackInfo));
            memset(&gbCardinfo, 0, sizeof(struct CardConfig));
#ifndef TAICANGTEST
			PubSetBankcMacChk(MAC_X99);
#else
			PubSetBankcMacChk(MAC_NO);
#endif
#ifdef EMVIC          
            //ecash   by wei
			gblTranAmt = 0l;
			BUFCLR(gbszTermData);
			gbszTermData[0] = FV.EmvStru.gbcMSD;//loyes
#endif
			strcpy(gbszErrCode, "");
//             if(nScreen == 0)
//             {
// 		        PubDisplay (1, "1.消  费   2.撤  销");
// 		        PubDisplay (2, "3.退  货   4.预授权");
// 		        PubDisplay (3, "5.离  线   6.打  印");
// 		        PubDisplay (4, "7.管  理   8.其  它");
//             }
// 			else
// 				PubDisplay (1, "9.转  账   0.水电煤");
            //[08/31/2015 shizd]modify
            PubDisplay (1, "1.查  询   2.消  费");
            PubDisplay (2, "3.撤  销   4.补  登");
            PubDisplay (3, "5.管  理   6.打  印");
            gbTrkInfo.cDoneFlag = 0;
            uiKey = PubuiInkey((char) cMenuTime);
            if (uiKey == EM_key_FUNC||uiKey == EM_key_CANCEL)
            {
                uiKey = EM_key_NOHIT ;           
            }
            if (uiKey == EM_key_ENTER)
            {
                nScreen = (nScreen + 1) % 2;
				continue;               
            }
            uiOption = 0;
            //if (nScreen == 1)
                //uiOption += 8;
            switch (uiKey)
            {
            case EM_key_NOHIT:
                PubDisdoter();
				/*chenjs 20060228 del
                PubDisplays(5 , 1 , " ");
                PubDisplays(6 , 1 , " ");
				*/
                PubDispLogo();
                cWaitRet = PubWaitProcess(&ucRetVal);
                if (cWaitRet == EXCEPTION)
                    continue;
				PubClearIcon();// //清图标行
                switch (ucRetVal)
                {
                case 0x99:
                    continue;//[08/31/2015 shizd]add for不允许待机快速交易
                    if (FV.Other.gbuiDefault == 0)       //无默认交易 
                        continue;
                    else        // 有默认交易 
                    {
                      if (FV.Other.gbuiDefault == PRE_AUTH)
                            uiOption = 9;
                        else
                            uiOption = 1;
                       break;
                    }
                // 屏保状态下对快捷键的响应 
                case EM_key_PURCHASE:
                    uiOption = 1;
                    break;
                case EM_key_POSVOID:
                    uiOption = 2;
                    break;
                case EM_key_QUERY:
                    uiOption = 10;
                    break;
                case EM_key_REFUND:
                    uiOption = 3;
                    break;
                case EM_key_PREAUTH:
                    uiOption = 9;
                    break;
                case EM_key_SETTLE:
                    uiOption = 12;
                    break;
				case '1':
                    uiOption = 13;// 电子现金快速支付
                    break;
				case '2':
                    uiOption = 14;// 电子现金余额查询
                    break;
				case '3':
					uiOption = 15;//分期付款消费
					break;
				case '4':
					uiOption = 16;//手机芯片消费
					break;
				case '5':
					uiOption = 9;//预授权
					break;
				case '6':
					uiOption = 17;//预授权撤销
					break;
				case '7':
					uiOption = 18;//预授权完成请求
					break;
				case '8':
					uiOption = 19;//圈存
					break;
                case EM_key_CANCEL:
					PubClearIcon();// //清图标行
					EA_vCls();
					PubDisplayCen(2, "应用切换");
					PubuiInkeyMs(500);
					PubDelAllBit(&iso);
					close_all_dev();
					EA_vCls();
                    return EM_ERROR;
                default:
					nScreen = 0;
                    continue;
                }
                break;

                // 对快捷键的响应 
            case EM_key_PURCHASE:
                uiOption = 1;
                break;
            case EM_key_POSVOID:
                uiOption = 2;
                break;
            case EM_key_QUERY:
                uiOption = 10;
                break;
            case EM_key_REFUND:
                uiOption = 3;
                break;
            case EM_key_PREAUTH:
                uiOption = 9;
                break;
            case EM_key_SETTLE:
                uiOption = 12;
                break;
            // 对ATM键的响应  
            case EM_key_L1:
            case '1':
                uiOption = 10;
                break;
            case EM_key_R1:
            case '2':
                uiOption = 1;
                break;
            case EM_key_L2:
            case '3':
                uiOption = 2;
                break;
            case EM_key_R2:
            case '4':
                uiOption = 21;
                break;
            case EM_key_L3:
            case '5':
                uiOption = 7;
                break;
            case EM_key_R3:
            case '6':
                uiOption = 6;
                break;
//             case EM_key_L4:
//             case '7':
//                 uiOption = 7;
//                 break;
//             case EM_key_R4:
//             case '8':
//                 uiOption = 8;
//                 break;
// 			//添加转账 liudy
// 			case '9':
// 				uiOption = 11;
// 				break;
//             //添加水电煤 liudy
//             case '0':
//                 uiOption = 20;
//                 break;
			case EM_key_FUNC8:
#ifdef EPT_A9L
				EA_vCls();
				PubDisplay(2, "写内存文件次数:");
				PubucGetMfVarCnt((char*)MODULE_FILE_NAME, &llCnt);
				BUFCLR(szData);
				sprintf(szData, "%lld", llCnt);		
				PubDisplay(3, "  %s", szData);
				PubuiInkey(5);
#endif
				continue;
			
            case EM_key_FUNC9:
                EA_vCls();//chenjs20061127 add
                PubDisplayCen(2, "应用切换");
                PubuiInkeyMs(500);
                PubDelAllBit(&iso);
				close_all_dev();
				EA_vCls();
                return EM_ERROR;
            default:
                continue;
            }
            if (uiOption >= 1 && uiOption <= 21)
                break;
        }
//        PubInitComm(&CommInfo, WAIT);
        PubProcess(uiOption);
//        gbnTransType = 0;
    }
    return EM_SUCCESS;
}
Exemple #4
0
void PubPreAutoVoid(void)
{
	struct FileRecStru FileRecTmp, VoidRec;
	char  szReadBuff[sizeof(struct FileRecStru)+1024], szBuffer[512];
	uint nRetLen,uiValidRec; 
	uchar ucFd;
	int   nRet, nLen;
	ISODataStru isotmp;


    if (FV.Void.cAutoVoidFlag != 1 || !memcmp(FV.Void.gbszVoidStr, "\x00\x00\x00\x00\x00\x00\x00\x00", 8))
    {
		BUFCLR(FV.Void.gbszVoidStr);		//清除冲正缓冲区
		WRITE_nVAR(FV.Void.gbszVoidStr);
		FV.Void.cAutoVoidFlag = 0;	//清除冲正标识
		WRITE_nVAR(FV.Void.cAutoVoidFlag);
		return;			
    }

	if (EA_ucPFOpen((uchar*)YLWATER, &ucFd) != EM_SUCCESS)
		return;

	uiValidRec = 0;
	EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiValidRec);

	// 无记录直接退出
	if (uiValidRec == 0)
	{
		EA_ucPFClose(ucFd);
		return;
	}
	
	BUFCLR(szReadBuff);
	nRet = PubFileOper (ucFd, REC_READ, uiValidRec, 1, szReadBuff, (uint*)&nRetLen);
	EA_ucPFClose(ucFd);
	if (nRet != NORMAL)
		return;

	memcpy(&FileRecTmp, szReadBuff, sizeof(FileRecTmp));
	if (FileRecTmp.transresult != 0x00)
	{
		return;
	}

	memset(&VoidRec, 0, sizeof(VoidRec));
	PubStrToIso(FV.Void.gbszVoidStr, FV.Void.gbnVoidLen, &isotmp, NULL);

	// 根据需要增减匹配条件,目前流水号、卡号、金额、处理码

	// 原流水号
	nLen = sizeof(szBuffer);
	BUFCLR(szBuffer);
	PubGetBit(&isotmp, TRACE, szBuffer, &nLen);
	if (nLen > 0)
	{
		memcpy(VoidRec.szTrace, szBuffer, 6);
		if(memcmp(FileRecTmp.szTrace, VoidRec.szTrace, 6))
			return;
	}
	// 批次号
	nLen = sizeof(szBuffer);
	BUFCLR(szBuffer);
	PubGetBit(&isotmp, 60, szBuffer, &nLen);
	if (nLen > 0)
	{
		memcpy(VoidRec.szBatchNum, szBuffer+2, 6);
		if(memcmp(FileRecTmp.szBatchNum, VoidRec.szBatchNum, 6))
			return;
	}

	// 卡号
	nLen = sizeof(VoidRec.szCardNo);
	PubGetBit(&isotmp, PAN, VoidRec.szCardNo, &nLen);
	if (nLen > 0)
	{
		BUFCLR(szBuffer);
		strncpy(szBuffer, FileRecTmp.szCardNo, 19);
		
		// 非指定账户圈存第二域是转出卡号// 银联程序中转出卡号就在szCardNo中,中行程序在szClientNO中
// 		if (FileRecTmp.cTransType == EC_LOAD_U)
// 			strncpy(szBuffer, FileRecTmp.szClientNO, 19);

		// 卡号不同
		if(strcmp(szBuffer, VoidRec.szCardNo))
			return;
	}

	// 金额
	nLen = sizeof(VoidRec.szAmount);
	PubGetBit(&isotmp, AMOUNT, VoidRec.szAmount, &nLen);
	if (nLen > 0)
	{
		if(strcmp(FileRecTmp.szAmount, VoidRec.szAmount))
			return;
	}

	// 处理码
	nLen = sizeof(VoidRec.szProcCode);
	PubGetBit(&isotmp, PROC_CODE, VoidRec.szProcCode, &nLen);
	if (nLen >= 6)
	{
		if(memcmp(FileRecTmp.szProcCode, VoidRec.szProcCode, 6))
			return;
	}

	// 到这里应当视作是末笔成功交易,清除冲正信息
	PubClearAutoVoidBuf();

	PubSaveDetail(&FileRecTmp);
	
    PubIncNum(FV.bankstate.szTrace);
	WRITE_nVAR(FV.bankstate.szTrace); 

    return;
}
Exemple #5
0
// E5X0的DLM需要固定dlm_main这个名字,base才能调用
int dlm_main(void)
{
    DevHandle phPinpad;
    uchar     ucFd;
    uint      uiCount, uiValidRec;
    char      cMenuTime;
    uchar     ucRet;
    int       nLoginFailCnt;  // 签到失败次数
    int       nSettleFailCnt;  // 自动结算失败次数
    ET_DATETIME dtTmp;
    char      szBuffer[200];
    char *CMDBUF=0 ;//yinzc add 2011-10-29
    int *nCmdLen=0;//yinzc add 2011-10-29
    int nRet;//yinzc add 2011-10-29
    UINT uiKey;//yinzc add 2011-10-29
#ifdef EPT56X0
    uint      uiConfigInfo;
#endif
    char      cIsAutoVoid=0;    // 是否需要自动发送冲正,开机若有遗留冲正,签到后自动发送一次

    ProInitVar();
    PubucLoadAllMfVar (MODULE_FILE_NAME, (void *)&FV, sizeof(FV));

#ifdef _ECASH_
    PubInitRFReader();
#endif

#ifdef EPT_A9L
    // EPT_A9L的FV内存写操作不记录日志
    PubSetFVDBGMsgWrite(1);
#endif

#ifdef SGPL ///add by kevin 20150423
	uchar ucFd1;
	uint uiCount3;
#endif


    BUFCLR(szBuffer);


    // 导入def8583.h中的8583包定义。
    if (PubImport8583(Iso8583Def) == EXCEPTION)
    {
        EA_vCls();
        PubDisplay(3, "8583包导入出错");
        PubDisplay(4, "请检查程序重新下装");
        PubuiInkey(0);
        ASSERT_NORMAL(EXCEPTION);
    }
    if (PubucFirstRunProg(MODULE_FILE_NAME) == EM_SUCCESS)
        FV.gbcFirstFlag = YES;

    if (PubucFirstRunPara(MODULE_FILE_NAME, PARAM_FILE_NAME) == EM_SUCCESS)
        FV.gbcParaFirstFlag = YES;

    gbPrintHandle  = NULL_HANDLE;
    CommInfo.gbHdl = NULL_HANDLE;

    EA_vCls();


    PubGetPrinterType(&iPrinterType);
    gbcPrintType = iPrinterType;

    PubUsePinpadInside(FV.bank.cPinpadUseInside);
    PubGetPinpadType(&iPinpadType);

    ucRet = FV.bank.cIsDCCMode;
    FV.bank.cIsDCCMode = YES; // 20090928确保DCC模块存在的话,能先执行DCC模块的初始化动作
    ucFd=PubRunBocccProc(CMD_INITPOS, (char *)"", 0);
    FV.bank.cIsDCCMode = ucRet;

    if (FV.gbcFirstFlag == YES || FV.gbcParaFirstFlag == YES)
    {
        if (FV.gbcFirstFlag == YES)
        {
            PubSetupFirst();
#ifdef EMVIC
            setup_first();

            gbnNeedDownAIDParamAll = YES;
            gbnNeedDownAIDParam = YES;//[5/12/2015 shizd]modify
            gbnNeedDownCAPKeyAll = YES;
            gbnNeedDownCAPKey = YES;//[5/12/2015 shizd]modify
#endif
            FV.gbcNeedDownParam = YES;
        }
        PubInitGlobal();

        if (PubReadPara() != NORMAL)
        {
            PubDisplayCen(2, "读参数失败");
            PubDisplayCen(3, "请下载参数");
            PubDisplayCen(4, "或按<确认键>设置");
            while (PubuiInkey(5) != ENTER)
                ;
            PubSetup();
        }
        else
        {
#ifdef TMS
            ProTmsRestorePara();  // 成功读入参数文件后,恢复TMS保存的相关参数
#endif

        }
        FV.gbcFirstFlag     = NO;
        FV.gbcParaFirstFlag = NO;

        PubWriteMemFile(&FV, sizeof(FV));
        PubRunBocccProc(CMD_SETFORCECHGPWD, &FV.bank.cForceChgPwd, 1);

#ifdef TMS
        iInitTmsVar((void *)&EG_tTMSHead, sizeof(EG_tTMSHead));

        // 支持TMS的如果系统管理员密码是默认值,则提示设置,否则不设置
        if (memcmp(FV.gbszParSetupOperPwd, "000000", ADMIN_PWD_LEN) == 0)
        {
            ProSetManager();
            ProSetCustom();
        }
#else
        ProSetManager();
        ProSetCustom();
#endif
    }

    PubInitGlobal();

#ifdef TEL_FUNC
    if (FV.bank.cCommFlag == TCP)
        EA_ucSelectEnetOrFsk(ETH_USED);       //获取以太网模块工作需要的SPI口,使用以太网通讯方式,将无法支持电话来电显示
    else
        EA_ucSelectEnetOrFsk(FSK_USED);       //获取FSK模块工作需要的SPI口

    //电话模块初始化
    TA_Tel_vInit(0x71,0x1b);
//	main_teltest(); // 电话功能测试
#endif


#ifdef EMVIC
#if EPT_A9L || EPT_M3
    EA_EMV_vInit();
#endif
#endif

#ifdef TMS
    iRestoreAllTmsVar((void *)&EG_tTMSHead, sizeof(EG_tTMSHead));  // 载入TMS结构
#endif

    EA_vCls();
    PubDisplayInv(1, "BOC POS");
    PubDisplay(2, "自检...");
    PubKeyOn();
    /*
        EA_vCls();
        PubDisplay(1, "自检:");
        PubDisplayInv(2, "密码键盘");
        PubDisplayCen(3, "打 印 机");
        PubDisplayCen(4, "通 信 口");

        PubDisplayInv(2, "密码键盘");
        EA_vDelay(1);
        PubDisplayCen(2, "密码键盘");
        PubDisplayInv(3, "打 印 机");
        EA_vDelay(1);
        PubDisplayCen(3, "打 印 机");
        PubDisplayInv(4, "通 信 口");
    */

#ifdef _ECASH_
    gblTranAmt = 0l;
    BUFCLR(gbszTermData);
    gbszTermData[0] = FV.EmvStru.gbcMSD;//loyes
    if (FV.bank.nRFReaderType == 0)
        ProAutoSetcBanknRFReaderType();
#endif

    PubDisplay(3, "按<取消>进入设置");
    if (PubuiInkey(1) == EM_key_CANCEL)   //如果误选通讯方式(无线),造成死机,在这里可以进行设置。
        ProGetSuperOper();
    PubDisplay(3, " ");
    while ((ucRet = PubOpenDevice((char *)"PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS)
    {
        PubClearAll();
        PubDisplayInv(2, "打开密码键盘错");
        PubDisplay(3, "请接好密码键盘%d %d", ucRet, FV.bank.cPinpadUseInside);
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
    while ((PubGetPinpadVer(phPinpad, &iPinpadVer)) == 3)
    {
        PubClearAll();
        PubDisplayInv(2, "请接好密码键盘");
        PubDisplay(4, "[%02x]", FV.bank.cPinpadUseInside);
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
#ifdef EPT56X0
    // 2007-9-18  将pinpad安全级别设置成默认级别
    if (iPinpadVer == 2)
    {
        EA_pci_ucGetSecureConfig(phPinpad, EM_NULL, &uiConfigInfo);
        if (uiConfigInfo != EM_pin_DEFAULTCONFIG)
        {
            EA_pci_ucSetSecureConfig(phPinpad, EM_NULL, EM_pin_DEFAULTCONFIG);
        }
    }
#endif
    PubSetPinTimer(phPinpad, 50); // liudy 将密码键盘超时时间设置为120秒
    while ((ucRet = PubResetPinpad(phPinpad)) != EM_SUCCESS)
    {
        PubClearAll();
        PubDisplayInv(2, "请接好密码键盘");
        PubDisplay(3, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
    EA_ucCloseDevice(&phPinpad);

    //yinzc add below 2011-10-28 for compos
#ifdef COMPOS
    //打开MISPOS的通讯接口
#ifdef EPT_A9L
    //	ucRet = EA_ucOpenDevice("USBD", EM_io_PORT1, &gbhdCMDRS232);
    //debug
    //	PubDisplay(2, "port[%s]", FV.szRecvPortName);
    //	PubuiInkey(1);

    ucRet = EA_ucOpenDevice(FV.szRecvPortName, EM_io_PORT1, &gbhdCMDRS232);
#else
    ucRet = EA_ucOpenDevice("COM", EM_io_PORT1, &gbhdCMDRS232);
#endif
    if (ucRet != EM_SUCCESS)
    {
        EA_vCls();
        PubDisplay(1,"无法打开通信端口!");
        PubDisplay(2,"请重启设备");
        EA_vBeepMs(1000);
        PubuiInkey(2);
        return EXCEPTION;
    }
    else
    {
        //		ucRet = EA_ucInitRS232(gbhdCMDRS232,EM_232_9600BPS,EM_232_NOPAR ,EM_232_8DBS);
        ucRet = EA_ucInitRS232(gbhdCMDRS232,EM_232_115200BPS,EM_232_NOPAR ,EM_232_8DBS);
        ucRet = EA_ucCloseDevice(&gbhdCMDRS232);
        //gbhdCMDRS232 = EM_NULL;
    }
#endif
    // end of above //////
#ifdef COMPOS
    if (FV.gbnComposType == 0)//yinzc add 2011-10-28 是否完全COMPOS模式  1--收银机通讯 0--POS通讯
        PubInitComm(&CommInfo, AUTOCHECK);
#endif

    PubRunBocccProc(CMD_IMPORTCARDBIN, NULL, 0);//091001

    gbcPreState    = 0;
    FV.gbNacInfo.cPreState = 0;

//    gbcPosState   = NO_LOGON;   //-zyf
//    gbcLoginState = NO_LOGON;
    nLoginFailCnt = 0;
    nSettleFailCnt = 0;
    cIsAutoVoid = 1;

    PubPreAutoVoid();

    while (1)
    {
        EA_ucGetDateTime(&dtTmp);
        if (dtTmp.usYear != FV.gdtLastCheck.usYear
                || dtTmp.ucMonth != FV.gdtLastCheck.ucMonth
                || dtTmp.ucDay != FV.gdtLastCheck.ucDay)  // 隔日重新签到,自动结算
        {
//linq del 20081203 中行规范未提及隔日签到的功能
//            gbcPosState   = NO_LOGON;
//            gbcLoginState = NO_LOGON;
        }
        FV.gdtLastCheck = dtTmp;

        if (FV.poscfg.cBatchState == YES)
        {
            EA_vCls();
            PubDisplayInv(2, "请先结算再作交易");
            ProAccumulate(); // 重新统计
            PubuiInkey(0);
        }

        if (gbcPreState != 0)
            PubDialOff(&CommInfo);
        gbcPreState = 0;


        //mis不打印del by wangrm 2011-12-6
        // PubJudePrintFinish();

//-zyfdel
//        if (gbcPosState == NO_LOGON)
//        {
//			// 重新获取菜单
//			ProSetDefaultMenu();
//
//            if (PubLogin() != NORMAL)
//                continue;
//            else
//                EA_ucGetDateTime(&FV.gdtLastCheck);
//        }

        //  [7/2/2013 zyf]del
// 		// 签到失败5次则等待用户按键,防止无人值守时无谓的拨号,出现高额话费
// 		if (nLoginFailCnt >= 5)
// 		{
// 			EA_vCls();
// 			PubDisplay(2, "签到失败");
// 			PubDisplay(3, "请按任意键继续...");
//
// 			ProucSetStopFlag(FV.bank.cDisableSave);
//
// 			PubuiInkey(0);
// 			nLoginFailCnt = 0;
//
// 			ProucSetStopFlag(1);
//
// 			continue;
// 		}
//         if (gbcLoginState == NO_LOGON)
//         {
//             if (PubBankLogin() != NORMAL)
//             {
// 				nLoginFailCnt ++;
//                 gbcPosState = NO_LOGON;
// 				PubDialOff(&CommInfo);
// 				PubClearAll();
// 				PubDisplay(3, "签到失败");
// 				PubuiInkey(TIPS_TIMEOUT);
//                 continue;
//             }
//
// 			nLoginFailCnt = 0;
// 			BUFCLR(szBuffer);
// 			memcpy(szBuffer, gbszOper, OPER_NUM_LEN);
// 			memcpy(szBuffer+OPER_NUM_LEN, gbszOperPwd, OPER_PWD_LEN);
// 			PubRunBocccProc(CMD_SETCURRENTOPER, szBuffer, OPER_NUM_LEN + OPER_PWD_LEN);
//         }

#ifdef COMPOS
        if ( nCmdLen != NULL && CMDBUF != NULL)
        {
            FV.CMDBUFLen = *nCmdLen;
            if (FV.CMDBUFLen >0 )
            {
                memset(szCMDBuffer , 0 , sizeof(szCMDBuffer));
                memcpy(szCMDBuffer , CMDBUF , FV.CMDBUFLen);
                FV.szGetCmdFlag = 15;
            }
        }
#endif

        if (gbcPosState == LOCK)
        {
            PubLock();
            continue;
        }

        switch (gbcPosCtrlCode)
        {
        case '1':   // 在交易后下装参数
            FV.gbcNeedDownParam = YES;
            gbcLoginState = NO_LOGON;
            gbcPosCtrlCode = 0;
            continue;
        case '2':   // 强制结束批请求 保留
            break;
        case '3':   // 还有消息需要发送指示 下装参数时 终端批上送时不在此处
            FV.gbcNeedDownParam = YES;
            gbcLoginState = NO_LOGON;
            continue;
        case '4':   // 终端批号更新及签到标志
        case '5':   // 终端批号更新

#ifdef TMS
            PubTmsUpdate(2); // 在系统要求更新批次时,先做TMS更新处理
#endif
            PubUpdateBatchPorc();

            if (strlen((char *)gbszBatchNum) > 0)
            {
                memcpy(FV.bankstate.szBatchNum, gbszBatchNum, 6);
                PubWriteMemFile(&FV.bankstate, sizeof(FV.bankstate));
            }

            if (gbcPosCtrlCode == '4')
                gbcLoginState = NO_LOGON;

            gbcPosCtrlCode = 0;
            if (IsSupportBoccc() == YES &&
                    ( PubRunBocccProc(CMD_ISWATER_EDC,NULL,0) == NORMAL || PubRunBocccProc(CMD_ISWATER_DCC,NULL,0) == NORMAL )
               )//090929卡司结账,有流水的情况才结算
            {
                EA_vCls();
                PubDisplayCen(1, "中行结账已完成");
                PubDisplayCen(2, "将进行卡司结算");
                PubDisplayCen(3, "请勿取消");
                PubDisplayCen(4, "任意键继续");
                PubuiInkey(10);
                PubRunBocccProc(CMD_DCCSETTLE, (char *)"\x00", 1);
                if (PubRunBocccProc(CMD_ISBJMODE, NULL, 0) != NORMAL) // 非北京模式
                    PubRunBocccProc(CMD_EDCSETTLE, (char *)"\x00", 1);

            }
            continue;
        case '6':   // 要求终端签到标志
            gbcLoginState = NO_LOGON;
            gbcPosCtrlCode = 0;
            continue;

        case '7':   // POS终端应该提示终端操作员进行结帐动作
            EA_vCls();
            PubDisplay(2, "请先结算");
            PubuiInkey(TIPS_TIMEOUT);
            break;

        default:
            break;
        }

        // 	当POS上成功批准一笔基于EMV标准/基于PBOC电子现金IC卡离线消费交易后,
        // 如果此时POS上所保留的需要上送IST而未上送IST的交易笔数已经超过基本参数
        // 中"POS中允许保存的未上送交易笔数"的值,则此时,POS必须主动拨号,将未上送交易全部上送到IST。
        //add by liudy COMPOS不允许自主脱机上送
#ifndef COMPOS
        if ((FV.bank.nHasOfflineNum > 0) && (FV.bank.nHasOfflineNum >= FV.bank.nMaxOfflineNum))
        {
            gbnTransType = OFFLINE_UPLOAD;
            PubSendOfflineTrans();
        }
#endif

#ifdef TMS
        // 如果已TMS下载,进行更新处理
        PubTmsUpdate(1);   // 自动结账POS,若无流水,即可以进行程序更新

        if (FV.gbcNeedDownloadTmsPara == YES)
        {
            // 下载TMS参数信息
            if (PubDownTmsParam() == NORMAL) // 下载TMS参数
            {
                FV.gbcNeedDownloadTms = YES;   // 需要进行下载TMS
                FV.gbcNeedDownloadTmsPara = NO; // 不需要进行下载TMS参数
                PubWriteMemFile(&FV.gbcNeedDownloadTms, sizeof(FV.gbcNeedDownloadTms));
                PubWriteMemFile(&FV.gbcNeedDownloadTmsPara, sizeof(FV.gbcNeedDownloadTmsPara));
            }
        }
#endif

// #ifdef EMVIC
// 		if ((gbnNeedDownAIDParam == YES) && (memcmp(AUTHENTIC_VERSION, "\x13\x03", 2) >= 0))
// 		{
// 			// 系统主动要求下载AID参数
// 			PubDownEmvPara();
// 		}
// 		if ((gbnNeedDownCAPKey == YES) && (memcmp(AUTHENTIC_VERSION, "\x13\x03", 2) >= 0))
// 		{
// 			// 系统主动要求下载认证中心公钥
// 			PubDownEmvCAPKey();
// 		}
// #endif

        // 开机后自动发送一次冲正
// 		if (cIsAutoVoid == 1) //  [7/2/2013 zyf]del mis不主动交易
// 			PubAutoVoid();
        cIsAutoVoid = 0;

#ifdef COMPOS
        FV.szCMDChangeAppFlag = 0x01;
        ClearCMD();
        while (1)
        {
            FV.poscfg.cSettleEnd               = 0;        /* 设置结算结束标志         */
            //EA_vCls();
            //             nScreen = 0 ;
            //chenjs20060725 add down
            memset(&gbTrkInfo, 0, sizeof(struct TrackInfo));
            memset(&gbCardinfo, 0, sizeof(struct CardConfig));
            gbTrkInfo.cDoneFlag = 0;

            //add by liudy 20140228增加显示余额的控制
            if(iDisplayTimer == 1)
            {
                ulong passtime = 0;
                EA_ucGetPassTimer(gbhdlDisplayTimer,&passtime);
                if(passtime >= 3000)
                {
                    if (iPinpadType == 1)
                    {
                        ClearPinpadDisp(gbPinpadHandle);
                        if(gbPinpadHandle != NULL_HANDLE)
                        {
                            while (EA_ucCloseDevice(&gbPinpadHandle) != EM_SUCCESS)
                                ;
                            gbPinpadHandle = NULL_HANDLE;
                        }
                    }
                    iDisplayTimer = 0;
                    EA_ucCloseTimer(&gbhdlDisplayTimer);
                }
            }
            if (CMDCONT.Type == cmd_NONE) // CMD_NONE表示无命令
            {
                nRet = GetCMD();

                if (nRet != NORMAL)
                {
                    PubDisplayInv(1, "中国银行");
                    PubDisplayCen(2, "等待接收数据-->");
                    PubDisplay(3, "  ");
                    PubDisplay(4, "  ");
                    EA_ucLKeySwitch(EM_key_ENLKEY);
                    if (EA_ucKBHit_ped() == EM_key_HIT)
                    {
                        uiKey = PubuiInkey(5);
                        if (uiKey == EM_key_FUNC)
                        {
                            EA_vCls();
                            PubDisplay (1, "1.签到2.重打印");
                            PubDisplay (2, "3.查询交易明细");
                            PubDisplay (3, "4.按流水号查询交易");
                            PubDisplay (4, "5.结算");
                            ucRet = PubuiInkey(10);

                            switch (ucRet)
                            {
                            case '1':
                                EA_vCls();
                                PubLogin();
                                break;
                            case '2':
                                EA_vCls();
                                ProPrintManageExt(1);
                                break;
                            case '3':
                                EA_vCls();
                                PubCheckLsExt(4);
                                break;
                            case '4':
                                EA_vCls();
                                PubCheckLsExt(2);
                                break;
                            case '5':
                                EA_vCls();
                                ProSettle_POS();
                                break;
                            default:
                                break;

                            }
                        }
                    }
                    EA_ucLKeySwitch(EM_key_DISLKEY);
                    continue;
                }
            }

            if (CMDCONT.Type != cmd_NONE)
            {
                break;
            }

        }

        //  [6/8/2013 zyf]
        if (EA_ucPFOpen((uchar *) WATERFILE, &ucFd) == EM_SUCCESS)
        {
            uiCount = 0;
            EA_ucPFInfo(ucFd, EM_ffs_FREEREC, &uiCount);
            uiValidRec = 0;
            EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiValidRec);
            EA_ucPFClose(ucFd);
            if (uiCount < 5 || uiValidRec >= 300)
            {
                //  [6/7/2013 zyf] 存储满自动清流水
                EA_vCls();
                PubDisplayInv(1, "系统报告");
                PubDisplay(2, "存储满,清流水中");
                NAK_info(4, (char *)"XX",(char *)"交易失败");
                PubuiInkey(1);
                ProDelWater2();
                continue;
            }

        }

        if (PubProcess(CMDCONT.Type) != cmd_INTERRUPT)
        {
            ClearCMD();
        }

#else
        PubDialOff(&CommInfo);

// 20130107 存储满判断从前面调整到这里,避免存储满自动结算,系统返回需要重新签到时无法进入签到的问题
        // 自动结算5次则等待用户按键,防止无谓的拨号,出现高额话费
        if (nSettleFailCnt >= 5)
        {
            EA_vCls();
            PubDisplay(2, "结算失败");
            PubDisplay(3, "请按任意键继续...");

            ProucSetStopFlag(FV.bank.cDisableSave);
            PubuiInkey(0);
            nSettleFailCnt = 0;

            ProucSetStopFlag(1);

            continue;
        }

        if (EA_ucPFOpen((uchar *) WATERFILE, &ucFd) == EM_SUCCESS)
        {
            uiCount = 0;
            EA_ucPFInfo(ucFd, EM_ffs_FREEREC, &uiCount);
            uiValidRec = 0;
            EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiValidRec);
            EA_ucPFClose(ucFd);
			
#ifdef SGPL ///modify by kevin 20150423
			if (EA_ucPFOpen((uchar *)YLSIGNWATER, &ucFd1) == EM_SUCCESS)
			{
				uiCount3 = 0;
				EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiCount3);	  //查询剩余笔数
			}
			if (uiCount < 5 || uiValidRec >= 300 || uiCount3 >= FV.Other.gbnForceSettleSignNums)
#else
			if (uiCount < 5 || uiValidRec >= 300)
#endif
            //if (uiCount < 5 || uiValidRec >= 300)
            {
                EA_vCls();
                PubDisplayInv(1, "系统报告");
                PubDisplay(2, "存储满,请先结算");
                PubDisplay(3, "自动结算...");
                if (PubuiInkey(TIPS_TIMEOUT) != EM_key_FUNC1)
                {
                    if (FV.poscfg.cBatchState == YES)  // 自动结算支持披上送的断点续传
                        PubBatchUp();
                    else
                    {
                        if (PubSettle() == EXCEPTION)
                            nSettleFailCnt++;
                        else
                            nSettleFailCnt = 0;  // 结算成功的

                        PubRunBocccProc(CMD_DCCSETTLE, (char *)"\x00", 1);
                        if (PubRunBocccProc(CMD_ISBJMODE, NULL, 0) != NORMAL) // 非北京模式
                            PubRunBocccProc(CMD_EDCSETTLE, (char *)"\x00", 1);
                    }
                    continue;
                }
            }
#ifdef SGPL
			EA_ucPFClose(ucFd1);
#endif
        }


        cMenuTime = FV.poscfg.cMenuTime;

        // linq add 20081117 重新获取菜单
        ProSetDefaultMenu();

        PubLoadMenu(gbszMenuResource, MenuResource);

        if (QUIT_APP == PubProcMenu(MenuResource, (char *)"中国银行"))
        {
            PubucUnloadAllMfVar(MODULE_FILE_NAME);
            return NORMAL;
        }
#endif
    }
}
Exemple #6
0
void PubPreAutoVoid(void)
{
    struct FileRecStru FileRecTmp, VoidRec;
    char  szReadBuff[sizeof(struct FileRecStru)+1024], szBuffer[512];
    uint nRetLen,uiValidRec;
    uchar ucFd;
    int   nRet, nLen;
    ISODataStru isotmp;


    if (FV.AutoVoid.cAutoVoidFlag != 1 || !memcmp(FV.AutoVoid.gbszVoidStr, "\x00\x00\x00\x00\x00\x00\x00\x00", 8))
    {
        return;
    }

    if (EA_ucPFOpen((uchar *) WATERFILE, &ucFd) != EM_SUCCESS)
        return;

    uiValidRec = 0;
    EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiValidRec);

    // 无记录直接退出
    if (uiValidRec == 0)
    {
        EA_ucPFClose(ucFd);
        return;
    }

    BUFCLR(szReadBuff);
    nRet = PubFileOper (ucFd, REC_READ, uiValidRec, 1, szReadBuff, &nRetLen);
    EA_ucPFClose(ucFd);

    if (nRet != NORMAL)
        return;

    memcpy(&FileRecTmp, szReadBuff, sizeof(FileRecTmp));

#ifdef EMVIC
    // 20130116 加入下面这个判断,不成功的EMV交易
    if (FileRecTmp.transresult != 0x00)
        return;
#endif


    memset(&VoidRec, 0, sizeof(VoidRec));
    PubStrToIso(FV.AutoVoid.gbszVoidStr, FV.AutoVoid.gbnVoidLen, &isotmp, NULL);

    // 根据需要增减匹配条件,目前流水号、卡号、金额、处理码

    // 原流水号
    nLen = sizeof(szBuffer);
    BUFCLR(szBuffer);
    PubGetBit(&isotmp, ORIGINAL_DATA, szBuffer, &nLen);
    memcpy(VoidRec.szTrace, szBuffer+4, 6);
    if(memcmp(FileRecTmp.szTrace, VoidRec.szTrace, 6))
        return;

    // 卡号
    nLen = sizeof(VoidRec.szCardNo);
    PubGetBit(&isotmp, PAN, VoidRec.szCardNo, &nLen);
    if (nLen > 0)
    {
        BUFCLR(szBuffer);
        strncpy(szBuffer, FileRecTmp.szCardNo, 19);

        // 非指定账户圈存第二域是转出卡号
        if (FileRecTmp.cTransType == EC_LOAD_U)
            strncpy(szBuffer, FileRecTmp.szClientNO, 19);

        // 卡号不同
        if(strcmp(szBuffer, VoidRec.szCardNo))
            return;
    }

    // 金额
    nLen = sizeof(VoidRec.szAmount);
    PubGetBit(&isotmp, AMOUNT, VoidRec.szAmount, &nLen);
    if(strcmp(FileRecTmp.szAmount, VoidRec.szAmount))
        return;


    // 处理码
    nLen = sizeof(VoidRec.szProcCode);
    PubGetBit(&isotmp, PROC_CODE, VoidRec.szProcCode, &nLen);
    if(memcmp(FileRecTmp.szProcCode, VoidRec.szProcCode, 6))
        return;

    // 到这里应当视作是末笔成功交易,清除冲正信息
    PubClearVoid();

    PubSaveDetail(&FileRecTmp);

    // 20130116 不自动打印票据,由操作员手动操作去重打印
    //FV.poscfg.cPrintEndFlag = 1;
    //PubWriteMemFile(&FV.poscfg, sizeof(FV.poscfg));

    PubIncNum(FV.bankstate.szCheckNum);
    PubWriteMemFile(&FV.bankstate, sizeof(FV.bankstate));

    return;
}
Exemple #7
0
int PubUpdateBatchPorc(void)
{
    uchar     ucFd, ucFdBak;
    uint      uiCount, uiValidRec;
    uchar     ucRet, cFlag, cLastPrtSave=0;

    struct FileRecStru TmpFileRec;
    int       nRet, i;
    int       nNewBatchNum=0;
    uint       nRetLen;
    char  szReadBuff[sizeof(struct FileRecStru)+1024];

    cLastPrtSave = 0; // 上笔打印结构是否保存
    // 如果是新批交易或者是未成功上送IST的IC卡脱机批准交易、预授权完成通知交易,给予保存到新批中
    uiCount = EA_ucPFOpen((uchar *) WATERFILE, &ucFd);
    if (uiCount != EM_SUCCESS)
    {
        EA_vCls();
        PubDisplayInv(1, "系统报告");
        PubDisplay(2, "流水文件打开错![%d]", uiCount);
        PubDisplay(3, "文件[%s]", WATERFILE);
        PubuiInkey(TIPS_TIMEOUT);
        ASSERT_NORMAL(EXCEPTION);
    }
    uiValidRec = 0;
    EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiValidRec);
    if (uiValidRec == 0)
    {
        // 文件无记录直接返回
        EA_ucPFClose(ucFd);
        ReCreateWaterFile();
        return NORMAL;
    }

    for (i=1;;)
    {
        cFlag = 0;
        ZERO_STRUCT(TmpFileRec);
        nRet = PubFileOper(ucFd, REC_READ, i, 1, szReadBuff, &nRetLen);
        if (nRet != NORMAL)
        {
            break;
        }
        memcpy(&TmpFileRec, szReadBuff, sizeof(struct FileRecStru));

        // 预授权完成通知未上送, 或者是IC卡脱机批准(未被脱机撤消)未上送交易, 或者是新批交易给予保存
        if ((IsUploadTrans(&TmpFileRec) == YES) ||
                (atol(TmpFileRec.szBatchNum) == atol((char *)gbszBatchNum)))
            cFlag = 1;

        if (cFlag == 0)
        {
            i++;
            continue;
        }

        // 如果最后一笔交易是转入下批次的(批次、流水、查询号均相同),保存上笔打印结构

        if (atol(TmpFileRec.szBatchNum) == atol(FV.gbPrintDetail.szBatchNum)
                && atol(TmpFileRec.szTrace) == atol(FV.gbPrintDetail.szTrace)
                && atol(TmpFileRec.szCheck) == atol(FV.gbPrintDetail.szCheck))
            cLastPrtSave = 1; // 保存上笔打印结构

        nNewBatchNum ++;
        if (nNewBatchNum == 1)
        {
            // 创建临时文件
            EA_ucPFDel((uchar *)WATERFILEBAK);
            EA_ucPFCreate((uchar *)WATERFILEBAK, (sizeof(struct FileRecStru)));
            uiCount = EA_ucPFOpen((uchar *) WATERFILEBAK, &ucFdBak);
            if (uiCount != EM_SUCCESS)
            {
                EA_ucPFClose(ucFd);
                EA_vCls();
                PubDisplayInv(1, "系统报告");
                PubDisplay(2, "流水文件打开错![%d]", uiCount);
                PubuiInkey(TIPS_TIMEOUT);
                ASSERT_NORMAL(EXCEPTION);
            }
        }

        nRetLen = sizeof(struct FileRecStru);
        uiCount = PubFileOper(ucFdBak, REC_WRITE, 0, 1, (char *) &TmpFileRec, &nRetLen);
        if (uiCount != NORMAL)
        {
            EA_ucPFClose(ucFd);
            EA_ucPFClose(ucFdBak);
            EA_vCls();
            PubDisplayInv(1, "系统报告");
            PubDisplay(2, "写流水文件错![%d]", uiCount);
            PubuiInkey(TIPS_TIMEOUT);
            ASSERT_NORMAL(EXCEPTION);
        }
        uiCount = PubFileOper(ucFd, REC_DEL, i, 1, (char *) &TmpFileRec, &nRetLen);
        if (uiCount != NORMAL)
        {
            EA_ucPFClose(ucFd);
            EA_ucPFClose(ucFdBak);
            EA_vCls();
            PubDisplayInv(1, "系统报告");
            PubDisplay(2, "删除流水记录错![%d]", uiCount);
            PubuiInkey(TIPS_TIMEOUT);
            ASSERT_NORMAL(EXCEPTION);
        }
    }

    EA_ucPFClose(ucFd);
    if (nNewBatchNum > 0)
        EA_ucPFClose(ucFdBak);

    ProAccumulate();
    if (gbStruSettleData[0].num + gbStruSettleData[1].num + gbStruSettleData[19].num + gbStruSettleData[20].num + gbStruSettleData[21].num != 0)
    {
        PubClearAll();
        PubDisplayCen(2, "强制结帐");
        PubDisplayCen(3, "请确认!");
        PubuiInkey(5);
        FV.poscfg.cSettleEnd               = 0;        /* 设置结算结束标志         */
        PubWriteMemFile(&FV.poscfg, sizeof(FV.poscfg));

        // 自动结帐,不打账单;主动结帐,提示打单。
        // 手动结账的POS
        // 20090410 或者有TMS下载需要更新的(手动结账和自动结账)

        if ((FV.bank.cAutoSettle == NO)
#ifdef TMS
                || ( FV.EG_TMSstru.Tms_Download_Flag == 1 )
#endif
           )
        {
            PubClearAll();
            PubDisplay(2, "是否打印结算单");
            PubDisplay(3, "  0.否      1.是  ");
            ucRet = PubuiInkey(TIPS_TIMEOUT);
            if (ucRet == '1' || ucRet == ENTER)
            {
                FV.poscfg.cSettlePrintEndFlag = 1;             /* 结算单打印结束标志       */
                FV.poscfg.cSettleWaterPrintEndFlag = 1;        /* 结算明细单打印结束标志   */

                PubWriteMemFile(&FV.poscfg, sizeof(FV.poscfg));

                PubPrintSum(0);

                // 是否有打印流水
                if (PubIsWaterPrint() == NORMAL)
                {
                    PubClearAll();
                    PubDisplay(2, "是否打印交易明细单");
                    PubDisplay(3, "  0.否      1.是  ");
                    ucRet = PubuiInkey(TIPS_TIMEOUT);
                    if (ucRet == '1' || ucRet == ENTER)
                        PubPrintWater();
                    else
                    {
                        FV.poscfg.cSettleWaterPrintEndFlag = 0;/* 结算明细单打印结束标志   */
                        PubWriteMemFile(&FV.poscfg, sizeof(FV.poscfg));
                    }
                }
                else
                {
                    FV.poscfg.cSettleWaterPrintEndFlag = 0;/* 结算明细单打印结束标志   */
                    PubWriteMemFile(&FV.poscfg, sizeof(FV.poscfg));
                }
            }
        }
        // linq 移到删除文件之后执行 FV.poscfg.cSettleEnd = 1;
    }

    ReCreateWaterFile();

    FV.poscfg.cSettleEnd = 1;
    PubWriteMemFile(&FV.poscfg, sizeof(FV.poscfg));


    // 如果上笔交易不是新批次交易,则不能重打印该票据
    if ((atol(FV.gbPrintDetail.szBatchNum) != atol((char *)gbszBatchNum))
            && (cLastPrtSave == 0))
    {
        memset(FV.gbPrintDetail.szCardNo, 0, sizeof(FV.gbPrintDetail.szCardNo));
        PubWriteMemFile(FV.gbPrintDetail.szCardNo, sizeof(FV.gbPrintDetail.szCardNo));
    }

    FV.bank.nHasOfflineNum = 0;
    PubWriteMemFile(&FV.bank.nHasOfflineNum, sizeof(FV.bank.nHasOfflineNum));

    if (nNewBatchNum == 0)
        return NORMAL;


    uiCount = EA_ucPFOpen((uchar *) WATERFILE, &ucFd);
    if (uiCount != EM_SUCCESS)
    {
        EA_vCls();
        PubDisplayInv(1, "系统报告");
        PubDisplay(2, "流水文件打开错![%d]", uiCount);
        PubuiInkey(TIPS_TIMEOUT);
        ASSERT_NORMAL(EXCEPTION);
    }
    uiCount = EA_ucPFOpen((uchar *) WATERFILEBAK, &ucFdBak);
    if (uiCount != EM_SUCCESS)
    {
        EA_ucPFClose(ucFd);
        EA_vCls();
        PubDisplayInv(1, "系统报告");
        PubDisplay(2, "流水文件打开错![%d]", uiCount);
        PubuiInkey(TIPS_TIMEOUT);
        ASSERT_NORMAL(EXCEPTION);
    }

    for (i=1;; i++)
    {
        ZERO_STRUCT(TmpFileRec);
        nRet = PubFileOper(ucFdBak, REC_READ, i, 1, szReadBuff, &nRetLen);
        if (nRet != NORMAL)
        {
            break;
        }
        memcpy(&TmpFileRec, szReadBuff, sizeof(struct FileRecStru));

// 20110310 批次号在未成功上送前,还是保持原样较好		memcpy(TmpFileRec.szBatchNum, gbszBatchNum, 6);  // 批次号全部转换为新批

        if (IsUploadTrans(&TmpFileRec) == YES)
            FV.bank.nHasOfflineNum++;

        nRetLen = sizeof(struct FileRecStru);
        uiCount = PubFileOper(ucFd, REC_WRITE, 0, 1, (char *) &TmpFileRec, &nRetLen);
        if (uiCount != NORMAL)
        {
            EA_ucPFClose(ucFd);
            EA_ucPFClose(ucFdBak);
            EA_vCls();
            PubDisplayInv(1, "系统报告");
            PubDisplay(2, "写流水文件错![%d]", uiCount);
            PubuiInkey(TIPS_TIMEOUT);
            ASSERT_NORMAL(EXCEPTION);
        }
    }
    EA_ucPFClose(ucFdBak);
    EA_ucPFClose(ucFd);
    EA_ucPFDel((uchar *)WATERFILEBAK);  // 删除临时文件

    PubWriteMemFile(&FV.bank.nHasOfflineNum, sizeof(FV.bank.nHasOfflineNum));

    if(FV.gbPrintDetail.szCardNo[0])
    {
// 20110310 批次号在未成功上送前,还是保持原样较好	memcpy(FV.gbPrintDetail.szBatchNum, gbszBatchNum, 6);  // 重打印的批次号转换为新批
//		PubWriteMemFile(FV.gbPrintDetail.szBatchNum, sizeof(FV.gbPrintDetail.szBatchNum));
    }

    return NORMAL;
}