|
@@ -447,19 +447,6 @@ ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
|
|
|
//MessageBoxA(0,0,0,0);
|
|
|
m_eDeviceType = eStand2sType;
|
|
|
m_bNeedRestart = false;
|
|
|
- m_eAudioOutQuality = eUltraHD;
|
|
|
- m_bIsAudioNsOn = false;
|
|
|
- m_iAudioNsPolicy = 2;
|
|
|
- m_iAudioChannels = 1;
|
|
|
-
|
|
|
- m_strHttpServerAPI = RVC_UPLOAD_VIDEORECORDING_HTTP_API;
|
|
|
- m_iHttpTimeOut = RVC_HTTPTIMEOUT;
|
|
|
- m_strHttpServerAddr = RVC_UPLOAD_VIDEORECORDING_HTTP_ADDR;
|
|
|
- m_strAppVersion = NULL;
|
|
|
- m_strTerminalId = NULL;
|
|
|
- m_bPostOn = false;
|
|
|
- m_bWholeSection = false;
|
|
|
- m_bEncFlag = true;
|
|
|
|
|
|
#ifdef RVC_OS_WIN
|
|
|
m_xIdlePre = m_xKernelPre = m_xUserPre = 0;
|
|
@@ -471,78 +458,6 @@ ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
|
|
|
|
|
|
m_eDeviceType = RvcGetDeviceType();
|
|
|
|
|
|
- int iAudioQuality = 3;
|
|
|
- int iAudioNsPolicy = 2;
|
|
|
- int iIsAudioNsOn = 0;
|
|
|
- int iAudioChannels = 1;
|
|
|
- int iLogLevel = 1;
|
|
|
- int iLowestLevel = 1;
|
|
|
- int iTimeOut = RVC_HTTPTIMEOUT;
|
|
|
- CSimpleStringA strHttpServerAddr("");
|
|
|
- int iPostOn = 0;
|
|
|
- m_max_disk_percent = MAX_DISK_PERCENT;
|
|
|
- m_audio_samplerate = 8;
|
|
|
- int iStopEncflag = 0;
|
|
|
- CSmartPointer<IConfigInfo> spConfig;
|
|
|
- CSmartPointer<IEntityFunction> spFunction = GetFunction();
|
|
|
- if (spFunction->OpenConfig(Config_CenterSetting, spConfig) == Error_Succeed) {
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder","MaxDiskPercent",m_max_disk_percent);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder","AudioSampleRate",m_audio_samplerate);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder","AudioBitRate",m_audio_out_bitrate);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder","AudioNsPolicy",iAudioNsPolicy);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder","IsAudioNsOn",iIsAudioNsOn);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder","AudioQuality",iAudioQuality);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder","AudioChannels",iAudioChannels);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder","LogLevel",iLogLevel);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder","LowestLevel",iLowestLevel);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder", "post_salesrecord_info_on", iPostOn);
|
|
|
- spConfig->ReadConfigValue("Recorder", "http_video_record_addr", strHttpServerAddr);
|
|
|
- spConfig->ReadConfigValueInt("Recorder", "http_timeout", iTimeOut);
|
|
|
- spConfig->ReadConfigValueInt("SalesRecorder", "stopencflag", iStopEncflag);
|
|
|
- }
|
|
|
-
|
|
|
- if (m_max_disk_percent <= 0 || m_max_disk_percent >= 100) {
|
|
|
- m_max_disk_percent = MAX_DISK_PERCENT;
|
|
|
- }
|
|
|
-
|
|
|
- if (iLogLevel <= RECORD_LOG_ERROR && iLogLevel > 0){
|
|
|
- m_loglevel = (record_loglevel)iLogLevel;
|
|
|
- }
|
|
|
-
|
|
|
- if (iLowestLevel <= RECORD_LOG_ERROR && iLowestLevel > 0){
|
|
|
- m_lowestlevel = (record_loglevel)iLowestLevel;
|
|
|
- }
|
|
|
-
|
|
|
- if (strHttpServerAddr.GetLength() > 0) {
|
|
|
- m_strHttpServerAddr = strHttpServerAddr;
|
|
|
- }
|
|
|
-
|
|
|
- if (iTimeOut > 0 && iTimeOut < 20 * RVC_HTTPTIMEOUT) {
|
|
|
- m_iHttpTimeOut = iTimeOut;
|
|
|
- }
|
|
|
-
|
|
|
- if (1 == iPostOn) {
|
|
|
- m_bPostOn = true;
|
|
|
- }
|
|
|
-
|
|
|
- SetRecordAudioQuality(iAudioQuality);
|
|
|
- SetRecordAudioNsPolicy(iAudioNsPolicy);
|
|
|
- SetRecordAudioChannles(iAudioChannels);
|
|
|
-
|
|
|
- if (0 != iIsAudioNsOn){
|
|
|
- m_bIsAudioNsOn = true;
|
|
|
- }
|
|
|
-
|
|
|
- if (1 == iStopEncflag) {
|
|
|
- m_bEncFlag = false;
|
|
|
- }
|
|
|
-
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_bEncFlag is %s.", m_bEncFlag ? "true" : "false");
|
|
|
-
|
|
|
- if (m_bWholeSection != 0 && m_bWholeSection != 1){
|
|
|
- m_bWholeSection = false;
|
|
|
- }
|
|
|
-
|
|
|
if (preOperationError != Error_Succeed) {
|
|
|
return preOperationError;
|
|
|
}
|
|
@@ -599,12 +514,30 @@ ErrorCodeEnum CSalesRecorderEntity::__OnStart( ErrorCodeEnum preOperationError )
|
|
|
|
|
|
void CSalesRecorderEntity::OnStarted()
|
|
|
{
|
|
|
+ m_eAudioOutQuality = eUltraHD;
|
|
|
+ m_bIsAudioNsOn = false;
|
|
|
+ m_iAudioNsPolicy = 2;
|
|
|
+ m_iAudioChannels = 1;
|
|
|
+
|
|
|
+ m_strHttpServerAPI = RVC_UPLOAD_VIDEORECORDING_HTTP_API;
|
|
|
+ m_iHttpTimeOut = RVC_HTTPTIMEOUT;
|
|
|
+ m_strHttpServerAddr = RVC_UPLOAD_VIDEORECORDING_HTTP_ADDR;
|
|
|
+ m_strAppVersion = NULL;
|
|
|
+ m_strTerminalId = NULL;
|
|
|
+ m_bPostOn = false;
|
|
|
+ m_bWholeSection = false;
|
|
|
+ m_bEncFlag = true;
|
|
|
+ m_iRemoteRecordType = 0;
|
|
|
+
|
|
|
CSystemStaticInfo si;
|
|
|
ErrorCodeEnum Error = GetFunction()->GetSystemStaticInfo(si);
|
|
|
if (Error == Error_Succeed) {
|
|
|
m_strAppVersion = si.InstallVersion.ToString();
|
|
|
m_strTerminalId = si.strTerminalID;
|
|
|
}
|
|
|
+
|
|
|
+ GetEntityConfig();
|
|
|
+
|
|
|
#ifndef RVC_OS_WIN
|
|
|
InitSalesRecorder();
|
|
|
#endif
|
|
@@ -692,9 +625,24 @@ void CSalesRecorderEntity::vDebug(record_loglevel elevel, const char* str, va_li
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-int CSalesRecorderEntity::GetActiveCamera()
|
|
|
+int CSalesRecorderEntity::GetRecordCamera()
|
|
|
{
|
|
|
- return m_iActiveCamera;
|
|
|
+ int iRecordCamera = m_iRecordCamera;
|
|
|
+ if (1 != m_iRemoteRecordType) {
|
|
|
+ iRecordCamera = m_iActiveCamera;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (0 == iRecordCamera) {
|
|
|
+ LogWarn(Severity_Low, Error_Debug, LOG_EVT_SALESRECORD_USE_ENVCAMERA, "remote video record use env camera.");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ LogWarn(Severity_Low, Error_Debug, LOG_EVT_SALESRECORD_USE_OPTCAMERA, "remote video record use opt camera.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("remote record camera is %d.", iRecordCamera);
|
|
|
+
|
|
|
+ return iRecordCamera;
|
|
|
}
|
|
|
|
|
|
int CSalesRecorderEntity::GetCameraState()
|
|
@@ -1130,39 +1078,49 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
|
|
|
|
|
|
size_t ulen = strlen(pszMessage);
|
|
|
char *tmp = new char[ulen+1];
|
|
|
+ memset(tmp, 0, ulen + 1);
|
|
|
+ memcpy(tmp, pszMessage, ulen);
|
|
|
+
|
|
|
+ char* result[16] = { 0 };
|
|
|
+
|
|
|
#ifdef RVC_OS_WIN
|
|
|
- strncpy_s(tmp, ulen+1, pszMessage, ulen);
|
|
|
-
|
|
|
- char *result[16] = {0};
|
|
|
- //CStringSplit(tmp, result, "@");
|
|
|
- // 解决中文stringsplit偶现乱码的问题 edit by ly@2018/07/04
|
|
|
auto arr1 = CSimpleStringA2W(tmp).Split('@');
|
|
|
auto arr2 = CAutoArray<CSimpleStringA>(arr1.GetCount());
|
|
|
- for (int i = 0; i < arr1.GetCount(); ++i)
|
|
|
- {
|
|
|
+ for (int i = 0; i < arr1.GetCount(); ++i){
|
|
|
arr2[i] = CSimpleStringW2A(arr1[i]);
|
|
|
- result[i] = const_cast<LPSTR>(arr2[i].GetData());
|
|
|
+ result[i] = const_cast<char*>(arr2[i].GetData());
|
|
|
}
|
|
|
+ _snprintf(m_SalesVideoName, MAX_PATH, "%s", result[4]); //录像名:录像类型标志_录像流水号(如S_C13213EF)
|
|
|
|
|
|
- sprintf(m_SalesVideoName, "%s", result[4]);//录像名:录像类型标志_录像流水号(如S_C13213EF)
|
|
|
#else
|
|
|
- strncpy(tmp, pszMessage, ulen);
|
|
|
-
|
|
|
- char *result[32] = {0};
|
|
|
- CStringSplit(tmp, result, "@");
|
|
|
|
|
|
+ CStringSplit(tmp, result, "@");
|
|
|
memset(m_SalesVideoName, 0, MAX_PATH);
|
|
|
if (result[4]) {
|
|
|
- snprintf(m_SalesVideoName, MAX_PATH, "%s", result[4]);//录像名:录像类型标志_录像流水号(如S_C13213EF)
|
|
|
+ snprintf(m_SalesVideoName, MAX_PATH, "%s", result[4]); //录像名:录像类型标志_录像流水号(如S_C13213EF)
|
|
|
}
|
|
|
#endif
|
|
|
+
|
|
|
+ int iPostionArr[4][2] = { 0 };
|
|
|
+ for (int i = 0; i < 4; i++){
|
|
|
+ sscanf(result[i], "%d|%d", &iPostionArr[i][0], &iPostionArr[i][1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local video frame size is (%d,%d).", iPostionArr[2][0], iPostionArr[3][0]);
|
|
|
+ if (iPostionArr[2][0] >= iPostionArr[3][0]) {
|
|
|
+ m_iRecordCamera = CAMERA_TYPE_ENV;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ m_iRecordCamera = CAMERA_TYPE_OPT;
|
|
|
+ }
|
|
|
+
|
|
|
RecordSubTitle subTitle;
|
|
|
- ZeroMemory(&subTitle,sizeof(RecordSubTitle));
|
|
|
+ memset(&subTitle, 0, sizeof(RecordSubTitle));
|
|
|
|
|
|
if (result[5]) {
|
|
|
CSimpleStringA strCardNo = DecryptString(result[5]);
|
|
|
if (sizeof(subTitle.CustCardNo) > strCardNo.GetLength()) {
|
|
|
- snprintf(subTitle.CustCardNo, sizeof(subTitle.CustCardNo), "%s", strCardNo.GetData());
|
|
|
+ _snprintf(subTitle.CustCardNo, sizeof(subTitle.CustCardNo), "%s", strCardNo.GetData());
|
|
|
}
|
|
|
else {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invalid CustCardNo.");
|
|
@@ -1177,7 +1135,7 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
|
|
|
}
|
|
|
else {
|
|
|
CSimpleStringW aa = szCustName.SubString(0, 4);
|
|
|
- sprintf(subTitle.CustName, "%s...", (LPCTSTR)CSimpleStringW2A(aa));
|
|
|
+ _snprintf(subTitle.CustName, 32, "%s...", CSimpleStringW2A(aa).GetData());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1191,7 +1149,7 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
|
|
|
char aa[5] = { 0 }, bb[5] = { 0 };
|
|
|
strncpy(aa, pStr, 4);
|
|
|
strncpy(bb, pStr + nProductCodeLen - 4, 4);
|
|
|
- sprintf(subTitle.ProductCode, "%s...%s", aa, bb);
|
|
|
+ _snprintf(subTitle.ProductCode, 32, "%s...%s", aa, bb);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1204,13 +1162,14 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
|
|
|
else {
|
|
|
CSimpleStringW aa = szProductName.SubString(0, 3);
|
|
|
CSimpleStringW bb = szProductName.SubString(szProductName.GetLength() - 2, 2);
|
|
|
- sprintf(subTitle.ProductName, "%s...%s", (LPCTSTR)CSimpleStringW2A(aa), (LPCTSTR)CSimpleStringW2A(bb));
|
|
|
+ _snprintf(subTitle.ProductName, 128, "%s...%s", CSimpleStringW2A(aa).GetData(), CSimpleStringW2A(bb).GetData());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (result[9]) {
|
|
|
strcpy(subTitle.SapID, result[9]);
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
subTitle.SapID[0] = '\0';
|
|
|
}
|
|
|
|
|
@@ -1222,7 +1181,7 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
|
|
|
}
|
|
|
else {
|
|
|
CSimpleStringW aa = szCustManagerName.SubString(0,4);
|
|
|
- sprintf(subTitle.CustManagerName,"%s...",(LPCTSTR)CSimpleStringW2A(aa));
|
|
|
+ _snprintf(subTitle.CustManagerName, 32,"%s...",CSimpleStringW2A(aa).GetData());
|
|
|
}
|
|
|
} else {
|
|
|
subTitle.CustManagerName[0] = '\0';
|
|
@@ -1232,18 +1191,18 @@ ErrorCodeEnum CSalesRecorderEntity::HandleStartRecord(const char *pszMessage, co
|
|
|
tmp = NULL;
|
|
|
|
|
|
SubtitleParam subtitleParam;
|
|
|
- ZeroMemory(&subtitleParam,sizeof(SubtitleParam));
|
|
|
- subtitleParam.bSubtitle = TRUE;
|
|
|
- subtitleParam.bSubtitleSection = TRUE;
|
|
|
+ memset(&subtitleParam, 0, sizeof(SubtitleParam));
|
|
|
+ subtitleParam.bSubtitle = true;
|
|
|
+ subtitleParam.bSubtitleSection = true;
|
|
|
subtitleParam.topSubtitleData[0] = '\0';
|
|
|
#ifdef RVC_OS_WIN
|
|
|
if (strlen(subTitle.SapID)>0&&strlen(subTitle.CustManagerName)>0){
|
|
|
- sprintf(subtitleParam.bottomSubtitleData1, "%s %s %s", subTitle.CustCardNo, subTitle.CustName, subTitle.ProductCode);
|
|
|
- sprintf(subtitleParam.bottomSubtitleData2, "%s %s %s", subTitle.ProductName, subTitle.SapID, subTitle.CustManagerName);
|
|
|
+ _snprintf(subtitleParam.bottomSubtitleData1, MAX_PATH, "%s %s %s", subTitle.CustCardNo, subTitle.CustName, subTitle.ProductCode);
|
|
|
+ _snprintf(subtitleParam.bottomSubtitleData2, MAX_PATH, "%s %s %s", subTitle.ProductName, subTitle.SapID, subTitle.CustManagerName);
|
|
|
}
|
|
|
else{
|
|
|
- sprintf(subtitleParam.bottomSubtitleData1, "%s %s", subTitle.CustCardNo, subTitle.CustName);
|
|
|
- sprintf(subtitleParam.bottomSubtitleData2, "%s %s", subTitle.ProductCode, subTitle.ProductName);
|
|
|
+ _snprintf(subtitleParam.bottomSubtitleData1, MAX_PATH, "%s %s", subTitle.CustCardNo, subTitle.CustName);
|
|
|
+ _snprintf(subtitleParam.bottomSubtitleData2, MAX_PATH, "%s %s", subTitle.ProductCode, subTitle.ProductName);
|
|
|
}
|
|
|
#else
|
|
|
if (strlen(subTitle.SapID)>0&&strlen(subTitle.CustManagerName)>0){
|
|
@@ -1898,6 +1857,92 @@ ErrorCodeEnum CSalesRecorderEntity::SetRecordCamera(int iCamera)
|
|
|
return Error;
|
|
|
}
|
|
|
|
|
|
+ErrorCodeEnum CSalesRecorderEntity::GetEntityConfig()
|
|
|
+{
|
|
|
+ ErrorCodeEnum Error = Error_Succeed;
|
|
|
+
|
|
|
+ int iAudioQuality = 3;
|
|
|
+ int iAudioNsPolicy = 2;
|
|
|
+ int iIsAudioNsOn = 0;
|
|
|
+ int iAudioChannels = 1;
|
|
|
+ int iLogLevel = 1;
|
|
|
+ int iLowestLevel = 1;
|
|
|
+ int iTimeOut = RVC_HTTPTIMEOUT;
|
|
|
+ CSimpleStringA strHttpServerAddr("");
|
|
|
+ int iPostOn = 0;
|
|
|
+ m_max_disk_percent = MAX_DISK_PERCENT;
|
|
|
+ m_audio_samplerate = 8;
|
|
|
+ int iStopEncflag = 0;
|
|
|
+ int iRemoteRecordType = 0;
|
|
|
+
|
|
|
+ CSmartPointer<IConfigInfo> spConfig;
|
|
|
+ CSmartPointer<IEntityFunction> spFunction = GetFunction();
|
|
|
+ if (spFunction->OpenConfig(Config_CenterSetting, spConfig) == Error_Succeed) {
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "MaxDiskPercent", m_max_disk_percent);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "AudioSampleRate", m_audio_samplerate);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "AudioBitRate", m_audio_out_bitrate);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "AudioNsPolicy", iAudioNsPolicy);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "IsAudioNsOn", iIsAudioNsOn);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "AudioQuality", iAudioQuality);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "AudioChannels", iAudioChannels);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "LogLevel", iLogLevel);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "LowestLevel", iLowestLevel);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "post_salesrecord_info_on", iPostOn);
|
|
|
+ spConfig->ReadConfigValue("Recorder", "http_video_record_addr", strHttpServerAddr);
|
|
|
+ spConfig->ReadConfigValueInt("Recorder", "http_timeout", iTimeOut);
|
|
|
+ spConfig->ReadConfigValueInt("SalesRecorder", "stopencflag", iStopEncflag);
|
|
|
+ spConfig->ReadConfigValueInt("InteractiveControl", "RemoteRecordType", iRemoteRecordType);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (m_max_disk_percent <= 0 || m_max_disk_percent >= 100) {
|
|
|
+ m_max_disk_percent = MAX_DISK_PERCENT;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (iLogLevel <= RECORD_LOG_ERROR && iLogLevel > 0) {
|
|
|
+ m_loglevel = (record_loglevel)iLogLevel;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (iLowestLevel <= RECORD_LOG_ERROR && iLowestLevel > 0) {
|
|
|
+ m_lowestlevel = (record_loglevel)iLowestLevel;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (strHttpServerAddr.GetLength() > 0) {
|
|
|
+ m_strHttpServerAddr = strHttpServerAddr;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (iTimeOut > 0 && iTimeOut < 20 * RVC_HTTPTIMEOUT) {
|
|
|
+ m_iHttpTimeOut = iTimeOut;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (1 == iPostOn) {
|
|
|
+ m_bPostOn = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ SetRecordAudioQuality(iAudioQuality);
|
|
|
+ SetRecordAudioNsPolicy(iAudioNsPolicy);
|
|
|
+ SetRecordAudioChannles(iAudioChannels);
|
|
|
+
|
|
|
+ if (0 != iIsAudioNsOn) {
|
|
|
+ m_bIsAudioNsOn = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (1 == iStopEncflag) {
|
|
|
+ m_bEncFlag = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (1 == iRemoteRecordType) {
|
|
|
+ m_iRemoteRecordType = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_bEncFlag is %s, m_iRemoteRecordType is %d.", m_bEncFlag ? "true" : "false", m_iRemoteRecordType);
|
|
|
+
|
|
|
+ if (m_bWholeSection != 0 && m_bWholeSection != 1) {
|
|
|
+ m_bWholeSection = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return Error;
|
|
|
+}
|
|
|
+
|
|
|
SP_BEGIN_ENTITY_MAP()
|
|
|
SP_ENTITY(CSalesRecorderEntity)
|
|
|
SP_END_ENTITY_MAP()
|