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; } }
// ***************************************************************** // 功能: 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; } } } }
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; }
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; }
// 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 } }
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; }
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; }