Эх сурвалжийг харах

#IQRV #comment: 调整集中配置实体

陈纪林80310970 5 сар өмнө
parent
commit
393012111e

+ 2 - 2
Module/CMakeLists.txt

@@ -152,7 +152,7 @@ add_subdirectory(mod_healthmanager)
 add_subdirectory(mod_accessauth)
 #will be offline in future cly said
 add_subdirectory(mod_guiconsole)
-#add_subdirectory(mod_CenterSetting)
+add_subdirectory(mod_CenterSetting)
 add_subdirectory(mod_tokenmgr)
 add_subdirectory(mod_evtconverter)
 #zhaohu
@@ -214,7 +214,7 @@ add_subdirectory(mod_upload)
 add_subdirectory(mod_healthmanager)
 add_subdirectory(mod_accessauth)
 add_subdirectory(mod_guiconsole)
-#add_subdirectory(mod_CenterSetting)
+add_subdirectory(mod_CenterSetting)
 add_subdirectory(mod_tokenmgr)
 add_subdirectory(mod_evtconverter)
 #add_subdirectory(mod_interactivelog)

+ 31 - 0
Module/mod_CenterSetting/CMakeLists.txt

@@ -0,0 +1,31 @@
+define_module("CenterSetting")
+
+set(${MODULE_PREFIX}_SRCS
+	CenterSettingConn.cpp
+	CenterSettingConn.h
+	mod_centersetting.cpp
+	mod_centersetting.h
+	)
+
+set(MOD_VERSION_STRING "0.0.1-dev1")
+add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
+
+target_include_directories(${MODULE_NAME} PRIVATE
+	${RVC_TOOLKIT_INCLUDE_DIR}
+	${OTHER_LIB_BASE_DIR}/libpublicFun
+	${OTHER_LIB_BASE_DIR}/libRestfulFunc
+	${CONAN_INCLUDE_DIRS_JSONCPP}
+)
+
+set(CMAKE_CXX_FLAGS "${CMAK_CXX_FLAGS} -g3")
+
+target_link_directories(${MODULE_NAME} PRIVATE
+	${CONAN_LIB_DIRS_JSONCPP}
+)
+
+# 添加实体需要依赖的其他共享库(包括系统库)
+set(${MODULE_PREFIX}_LIBS ${MODULE_BASE_LIBS} ${RVCCOMM_LIB})
+target_link_libraries(${MODULE_NAME} 
+	${${MODULE_PREFIX}_LIBS} CONAN_PKG::OpenSSL libpublicFun ${CONAN_PKG_LIBS_JSONCPP})
+
+deploy_module(${MODULE_PREFIX} ${MODULE_NAME})

+ 795 - 0
Module/mod_CenterSetting/CenterSettingConn.cpp

@@ -0,0 +1,795 @@
+#include "stdafx.h"
+#include "CenterSettingConn.h"
+#include "Event.h"
+#include <map>
+#include <regex>
+using namespace std;
+using std::regex;
+#include "mod_centersetting.h"
+#include <iostream>
+#include <sys/types.h> 
+#include <sys/stat.h>
+#include <fstream>
+#include "fileutil.h"
+#pragma comment(lib, "crypt32.lib")
+
+#ifdef RVC_OS_LINUX
+#include "CommEntityUtil.hpp"
+#include "iniutil.h"
+#include "json/json.h"
+#include "CommEntityRestful.hpp"
+#include "SpUtility.h"
+#include "RVCComm.h"
+#endif //RVC_OS_WIN
+
+#ifdef RVC_OS_WIN
+char* ConvertUtf8ToGBK(const char* strUtf8)
+{
+	int len = MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, NULL, 0);
+	WCHAR* wszGBK = new WCHAR[len + 1];
+	memset(wszGBK, 0, len * 2 + 2);
+	MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, wszGBK, len);
+
+	len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
+	char* szGBK = new char[len + 1];
+	memset(szGBK, 0, len + 1);
+	WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
+	delete[] wszGBK;
+
+	return szGBK;
+}
+
+void ConvertUtf8ToGBK(std::string& str)
+{
+	char* dst = ConvertUtf8ToGBK(str.c_str());
+	str = dst;
+	delete[] dst;
+}
+
+char* ConvertGBKToUtf8(const char* gbk, int* n)
+{
+	int len = MultiByteToWideChar(CP_ACP, 0, gbk, -1, NULL, 0);
+	WCHAR* wszGBK = new WCHAR[len + 1];
+	memset(wszGBK, 0, len * 2 + 2);
+	MultiByteToWideChar(CP_ACP, 0, gbk, -1, wszGBK, len);
+
+	len = WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, NULL, 0, NULL, NULL);
+	char* szUtf8 = new char[len + 1];
+	memset(szUtf8, 0, len + 1);
+	WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, szUtf8, len, NULL, NULL);
+
+	delete[] wszGBK;
+	*n = len - 1;
+	return szUtf8;
+}
+
+void ConvertGBKToUtf8(std::string& str)
+{
+	//char *src = new char[str.length() + 1];
+	//strncpy(src, str.c_str(), str.length() + 1);
+	int len = 0;
+	char* dst = ConvertGBKToUtf8(str.c_str(), &len);
+
+	str = dst;
+	//delete[] src;
+	delete[] dst;
+}
+
+static char* ConvertBytesToHexStr(BYTE *pBuf, int nLen)
+{
+	char *pRet = (char*)malloc(nLen * 2 + 1);
+	memset(pRet, 0, nLen * 2 + 1);
+	char *p = pRet;
+	for (int i = 0; i < nLen; i++)
+	{
+		BYTE b = pBuf[i];
+		BYTE l = (b >> 4) & 0x0F;
+		if (l >= 10)
+			*p = l - 10 + 'a';
+		else
+			*p = l + '0';
+
+		p++;
+		BYTE r = b & 0x0F;
+		if (r >= 10)
+			*p = r - 10 + 'a';
+		else
+			*p = r + '0';
+		p++;
+	}
+
+	return pRet;
+}
+#endif //RVC_OS_WIN
+
+void convert(string& str)
+{
+    //将单斜杠转为双斜杠
+    for (size_t i = 0; i < str.size(); i++) {
+        if (str[i] == '\\') {
+            str.insert(i, string("\\"));
+            i++;
+        }
+    }
+}
+
+void transferblank(string& str)
+{
+    int oldLen = str.length();
+    int cnt = 0;
+    for(int idx = 0; idx < oldLen; idx++)
+    {
+        if(str[idx] == ' ')
+            cnt++;
+    }
+
+    str.resize(oldLen + cnt * 2);
+    int j = oldLen - 1;
+    int i = str.length() - 1;
+    while( i >= 0 )
+    {
+        if(str[j] == ' ')
+        {
+            str[i--] = '0';
+            str[i--] = '2';
+            str[i--] = '%';
+            j--;
+        }
+        else
+        {
+            str[i--] = str[j--];
+        }
+    }
+}
+
+#ifndef  WITH_CPPRESTSDK_IN_CENTER
+bool CenterSettingResponse::Parse(string strData)
+{
+    Json::Value root;
+    Json::Reader reader;
+    Json::Value arrConfig;
+
+    reader.parse(strData, root, false);
+
+    m_success = root["success"].asBool();
+
+    if(m_success)
+    {
+        m_message = root["message"].asString();
+        m_is_update = root["data"]["is_update"].asBool();
+        m_is_reset = root["data"]["is_reset"].asBool();
+        m_version_no = root["data"]["version_no"].asString();
+        transferblank(m_version_no);
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_version_no:%s", m_version_no.c_str());
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_is_reset:%d", m_is_reset ? 1 : 0);
+        m_sm3 = root["data"]["sm3"].asString();
+        m_strConfig = root["data"]["config"].asString();
+
+        if(m_is_update)
+        {
+            reader.parse(m_strConfig, arrConfig, false);
+            if(arrConfig.isArray())
+            {
+                for(int j = 0; j < arrConfig.size(); j++)
+                {
+                    ConfigItem configItem;
+
+                    configItem.m_moudle = arrConfig[j]["moudle"].asString();
+                    configItem.m_name = arrConfig[j]["name"].asString();
+                    configItem.m_value = arrConfig[j]["value"].asString();
+
+                    m_config.push_back(configItem);
+                }
+            }
+        }
+    }
+    return true;
+}
+#endif
+
+bool AddVersionResponse::Parse(string strData)
+{
+    Json::Value root;
+    Json::Reader reader;
+    reader.parse(strData, root, false);
+    m_success = root["success"].asBool();
+    return m_success;
+}
+
+CenterSettingsMicroServiceHelper::CenterSettingsMicroServiceHelper(CEntityBase* pEntity)
+    :m_pEntity(pEntity), m_strLastTime(true), m_strCurSite(true), m_arrKeys(NULL), m_arrURLs(NULL), m_isFirst(true)
+{
+    m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, m_pCenterConfig);
+    m_pEntity->GetFunction()->OpenConfig(Config_Run, m_pRunConfig);
+
+    m_pEntity->GetFunction()->GetSystemStaticInfo(m_terminalInfo);
+    m_pHttpFunc = create_http(HTTPLogCallback);
+
+    InitCenterSettingInfo();
+}
+
+#ifdef RVC_OS_WIN
+int CenterSettingsMicroServiceHelper::GetCenterSetting()
+{
+#else
+int CenterSettingsMicroServiceHelper::GetCenterSetting(bool byHand)
+{
+#endif
+    LOG_FUNCTION();
+
+    if(m_strUrl.IsNullOrEmpty() && m_urlsFromShell.size() <= 0)
+    {
+        m_strErrMsg = "集中配置服务地址不存在";
+        return AllAddressNull;
+    }
+
+    CenterSettingReq req;
+    CenterSettingResponse res;
+    req.m_terminal_no = m_terminalInfo.strTerminalID.GetData();
+
+    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_strFilePath:%s", m_strFilePath.GetData());
+#ifdef RVC_OS_WIN
+	if(!ExistsFile(m_strFilePath))
+	{
+		Dbg("!ExistsFile(m_strFilePath)");
+#else
+if ((byHand && !m_isFirst) || !ExistsFile(m_strFilePath)) 
+    {
+        if (byHand && !m_isFirst && ExistsFileA(m_strFilePath)) {
+            LogWarn(Severity_Low, Error_Debug, EVENT_MOD_CENTERSETTING_UPDATE_CENTER_FORCE, "尝试强制重新下载集中配置");
+        }
+#endif
+        req.m_version = "";
+        req.m_config = "";
+    }
+    else
+    {
+#ifdef RVC_OS_LINUX
+if (m_isFirst) //如果是第一次更新则强制下载集中配置
+        {
+            req.m_version = "";
+            req.m_config = "";
+        }
+        else
+#endif
+        {
+            req.m_version = m_strVersion.GetData();
+            req.m_config = GetLocalConfig();
+        }
+    }
+
+    if(m_isFirst) m_isFirst = false;
+
+    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_strVersion:%s", req.m_version.c_str());
+    req.m_update_time = GetUpdateTime();
+    GetTimeoutValue(req.m_timeOut);
+
+    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")(CSimpleStringA::Format("timeout:%d", req.m_timeOut));
+
+    int ret1 = MANUAL, ret2 = MANUAL;
+    if(!m_strUrl.IsNullOrEmpty())
+    {
+        req.m_url = m_strUrl;
+        m_strCurUrl = req.m_url;
+        req.m_url += "?update_time=" + req.m_update_time + "&terminal_no=" + req.m_terminal_no + "&version=" + req.m_version;
+#ifdef RVC_OS_WIN
+		ret1 = OnRequest(req, res, m_strErrMsg);
+#else
+        ret1 = GetCenterSettingsFromHttp(req, m_strErrMsg);
+#endif
+    }
+    else
+    {
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("集中配置文件中地址为空,使用默认地址");
+    }
+
+    if(SUCC != ret1 && ret1 != EXIST)
+    {
+
+        if(m_urlsFromShell.size() <= 0)
+        {
+            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("shell.ini中找不到集中配置地址");
+            return ret1;
+        }
+
+        for(int i = 0; i < m_urlsFromShell.size(); i++)
+        {
+            req.m_url = m_urlsFromShell[i].GetData();
+            m_strCurUrl = m_urlsFromShell[i].GetData();
+            req.m_url += "?update_time=" + req.m_update_time + "&terminal_no=" + req.m_terminal_no + "&version=" + req.m_version;
+#ifdef RVC_OS_WIN
+			ret2 = OnRequest(req, res);
+			if(ret2 == SUCC)
+				break;
+#else
+            ret1 = GetCenterSettingsFromHttp(req, m_strErrMsg);
+            if (ret1 == SUCC || ret1 == EXIST)
+                break;
+#endif
+        }
+    }
+	
+#ifdef RVC_OS_WIN
+    if(SUCC == ret1 || SUCC == ret2)
+	{
+		if(!res.m_is_update)
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("Centersetting not changed.");
+			m_strErrMsg = "集中配置已是最新版本";
+			return EXIST;
+		}
+
+		if(WriteToConfig(res))
+		{
+			m_strVersion = res.m_version_no.c_str();
+			Dbg("WriteToConfig m_strVersion:%s", m_strVersion.GetData());
+			m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, m_pCenterConfig, true);
+			m_pRunConfig->WriteConfigValue("CenterSetting", "version", m_strVersion);
+			UpdateVersion();
+			if(res.m_is_reset)
+				LogEvent(Severity_Middle, EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE, "Update centersetting with critical items.");
+			
+			return SUCC;
+		}
+	}
+#endif	
+
+    return ret1;
+}
+
+void CenterSettingsMicroServiceHelper::InitCenterSettingInfo()
+{
+    CSmartPointer<IConfigInfo> shellConfig;
+    m_pEntity->GetFunction()->OpenConfig(Config_Shell, shellConfig);
+
+    m_pCenterConfig->ReadConfigValue("CenterSetting", "LastUpdateTime", m_strLastTime);
+    m_pRunConfig->ReadConfigValue("CenterSetting", "version", m_strVersion);
+#ifdef RVC_OS_LINUX
+    if (!m_strVersion.IsNullOrEmpty()) {
+        std::string tmp = m_strVersion.GetData();
+        transferblank(tmp);
+        m_strVersion = tmp.c_str();
+    }
+#endif
+    //从集中配置和shell.ini获取url
+    m_pCenterConfig->ReadConfigValue("CenterSetting", "CenterConfigUrlNew", m_strUrl);
+    if(m_strUrl.IsNullOrEmpty())
+    {
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InitCenterSettingInfo")("集中配置中的服务链接为空,使用默认链接");
+    } 
+    else
+    {
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CenterConfigUrlNew:%s", m_strUrl.GetData());
+    }
+
+    CSimpleStringA strMicroServiceURLSection = "MicroServiceURL";
+
+#ifdef RVC_OS_WIN /** UOS配置后置后没这堆玩意,至少现在的配置中没有  但是windows还有[Gifur@202397]*/
+#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
+    strMicroServiceURLSection = "MicroServiceURL-ST";
+#elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
+    strMicroServiceURLSection = "MicroServiceURL-UAT";
+#elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
+    //strMicroServiceURLSection = "MicroServiceURL-PRD";
+#elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
+    strMicroServiceURLSection = "MicroServiceURL-Dev";
+#else/*本地编译等非DevOps环境编译的版本*/
+    strMicroServiceURLSection = "MicroServiceURL-Dev";
+#endif
+#endif //RVC_OS_WIN
+
+    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InitCenterSettingInfo")("获取集中配置服务地址 Section name:%s", strMicroServiceURLSection.GetData());
+
+    shellConfig->ReadAllKeys(strMicroServiceURLSection, m_arrKeys);
+
+    CSimpleStringA strUrl;
+    for(int i = 0; i < m_arrKeys.GetCount() && m_arrKeys[i].IsStartWith("CenterConfigUrl", true); i++)
+    {
+        shellConfig->ReadConfigValue(strMicroServiceURLSection, m_arrKeys[i].GetData(), strUrl);
+        if(!strUrl.IsNullOrEmpty())
+        {
+            DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("add CenterURL:%s", strUrl.GetData());
+            m_urlsFromShell.push_back(strUrl);
+        }
+    }
+
+    //获取集中配置路径、文件名、场所
+    m_pEntity->GetFunction()->GetPath("CenterSetting", m_strFilePath);
+    m_pEntity->GetFunction()->GetPath("RunInfo", m_strBakPath);
+#ifdef RVC_OS_WIN
+    m_strBakPath += "\\runcfg\\CenterSetting.ini";
+#else
+    m_strBakPath += SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "CenterSetting.ini";
+#endif
+}
+
+bool CenterSettingsMicroServiceHelper::WriteToConfig(const CenterSettingResponse& sResponse)
+{
+    CSimpleStringA newPath = m_strBakPath + ".new";
+
+    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("config size: %d", sResponse.m_config.size());
+    for(int i = 0; i < sResponse.m_config.size(); i++)
+	{
+		string module = sResponse.m_config[i].m_moudle;
+		string name = sResponse.m_config[i].m_name;
+		string value = sResponse.m_config[i].m_value;
+
+#ifdef RVC_OS_WIN
+		if(!WritePrivateProfileStringA(module.c_str(), name.c_str(), value.c_str(), newPath))
+		{
+#else
+		if (inifile_write_str(newPath.GetData(), module.c_str(), name.c_str(), value.c_str()) == -1) 
+        {
+#endif
+            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("WriteToConfig")
+                ("write %s:%s:%s fail", module.c_str(), name.c_str(), value.c_str());
+            m_strErrMsg = "集中配置写入失败";
+            LogWarn(Severity_Middle, Error_Unexpect, ERR_MOD_CENTERSETTING_WRITE_FAILED,
+                    CSimpleStringA::Format("集中配置写入失败:%s:%s:%s", module.c_str(), name.c_str(), value.c_str()));
+            return false;
+        }
+    }
+
+    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("WriteToConfig")("集中配置写入成功");
+#ifdef RVC_OS_WIN
+    CopyFileA(newPath, m_strFilePath, FALSE);
+    DeleteFileA(newPath);
+#else
+    fileutil_copy_file(m_strFilePath, newPath);
+    fileutil_delete_file(newPath);
+#endif
+    return true;
+}
+
+string CenterSettingsMicroServiceHelper::GetLocalConfig()
+{
+    CAutoArray<CSimpleStringA> arrSections, arrKeys;
+    CSimpleStringA strItem;
+
+    if(Error_Succeed != m_pCenterConfig->ReadAllSections(arrSections))
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetLocalConfig")("Read all sections failed.");
+
+    if(arrSections.GetCount() == 0)
+        return "";
+
+    for(int i = 0; i < arrSections.GetCount(); ++i)
+    {
+        m_pCenterConfig->ReadAllKeys(arrSections[i].GetData(), arrKeys);
+        for(int j = 0; j < arrKeys.GetCount(); ++j)
+        {
+            CSimpleStringA value, tmp;
+            m_pCenterConfig->ReadConfigValue(arrSections[i].GetData(), arrKeys[j].GetData(), value);
+
+            tmp = CSimpleStringA::Format("{\"moudle\":\"%s\", \"name\":\"%s\", \"value\":\"%s\"}",
+                                        arrSections[i].GetData(), arrKeys[j].GetData(), value.GetData());
+
+            strItem += tmp + ",";
+        }
+    }
+
+
+    string strConfig = strItem.SubString(0, strItem.GetLength() - 1).GetData();
+    convert(strConfig);
+    return strConfig;
+}
+
+void CenterSettingsMicroServiceHelper::UpdateVersion()
+{
+    AddVersionReq sReq;
+    AddVersionResponse sResponse;
+#ifdef RVC_OS_WIN
+	CSimpleStringA url;
+	m_pCenterConfig->ReadConfigValue("CenterSetting", "UpdateVersionUrl", url);
+	sReq.m_url = url.GetData();
+	sReq.m_terminal_no = m_terminalInfo.strTerminalID.GetData();
+	sReq.m_version = m_strVersion;
+	sReq.m_update_time = GetUpdateTime();
+	GetTimeoutValue(sReq.m_timeOut);
+	
+	//IHttpFunc* m_pHttpFunc = create_http(HTTPLogCallback);
+    PROCESS_LINK_CONTEXT("LR0402101UploadVersion")
+    bool ret = m_pHttpFunc->Post(sReq, sResponse, &nextLink);
+
+	if(ret && sResponse.m_success)
+	{
+		CSimpleStringA msg = CSimpleStringA::Format("上传版本号成功:{version : %s, update_time : %s}", 
+			sReq.m_version.c_str(), sReq.m_update_time.c_str());
+		LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_SUCC, msg.GetData());
+	}
+	else
+	{
+		CSimpleStringA msg = CSimpleStringA::Format("上传版本号失败:%s", sResponse.m_errMsg.c_str());
+		LogWarn(Severity_Middle, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_FAILED, msg.GetData());
+
+	}
+#else
+	struct UpdateVersionReq  //Req和Ans的变量名必须和服务端json要求的一致,切记!
+    {
+        string terminal_no;
+        string version_no;
+        string terminal_update_time;
+        JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminal_no, version_no, terminal_update_time)
+    } updateVersionReq;
+
+    CSimpleStringA url;
+    m_pCenterConfig->ReadConfigValue("CenterSetting", "UpdateVersionUrl", url);
+
+    HttpClientResponseResult result;
+    HttpClientRequestConfig config(HttpRequestMethod::POST, url.GetData(), &SpGetToken);
+
+    updateVersionReq.terminal_no = m_terminalInfo.strTerminalID.GetData();
+    updateVersionReq.version_no = m_strVersion;
+    updateVersionReq.terminal_update_time = GetUpdateTime();
+
+    SP::Module::Restful::FulfillRequestJsonBody(&config, updateVersionReq);
+
+    RestfulClient client = RestfulClient::getInstance();
+    PROCESS_LINK_CONTEXT("LR0402101UpdateVersion");
+    config.PreDo();
+    client.Do(&config, &result, &nextLink);
+
+    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("返回内容为 %s", result.content.length() > 1000 ? result.content.substr(0, 1000).c_str() : result.content.c_str());
+
+    if (!result.ResponseOK()) {
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Do failed: %s", result.WhatError().c_str());
+        return;
+    }
+
+    SP::Module::Restful::CommResponseJson responseStatus;
+    SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
+
+    if (responseStatus.success) {
+        CSimpleStringA msg = CSimpleStringA::Format("上传版本号成功:{version : %s, update_time : %s}",
+            updateVersionReq.version_no.c_str(), updateVersionReq.terminal_update_time.c_str());
+        LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_SUCC, msg.GetData());
+    } else {
+        CSimpleStringA msg = CSimpleStringA::Format("上传版本号失败:%s", result.content.c_str());
+        LogWarn(Severity_Middle, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_FAILED, msg.GetData());
+
+    }
+#endif
+}
+
+SYSTEMTIME GetModifyTime(const string& strFilename)
+{
+#if defined(_MSC_VER)
+    struct _stat64i32 statbuf;
+    _stat64i32(strFilename.c_str(), &statbuf);
+    struct tm* temptm = _localtime64(&statbuf.st_mtime);
+#else
+    struct stat statbuf;
+    ZeroMemory(&statbuf, sizeof(statbuf));
+    stat(strFilename.c_str(), &statbuf);
+    struct tm* temptm = localtime(&statbuf.st_mtime);
+#endif //_MSC_VER
+
+    SYSTEMTIME st = { 1900 + temptm->tm_year,
+        1 + temptm->tm_mon,
+        temptm->tm_wday,
+        temptm->tm_mday,
+        temptm->tm_hour,
+        temptm->tm_min,
+        temptm->tm_sec,
+        0 };
+
+    return st;
+}
+
+string CenterSettingsMicroServiceHelper::GetUpdateTime()
+{
+    CSimpleStringA strUpdateTime;
+
+    /** 配置后置后本地没有这个实体文件,都被框架放到运行时了,所以需要处理这个逻辑 [Gifur@202397]*/
+    if(ExistsFileA(m_strFilePath))
+    {
+#ifdef RVC_OS_WIN
+		struct _stat64i32 statbuf;
+		_stat64i32(m_strFilePath.GetData(), &statbuf);
+#endif
+        SYSTEMTIME st = GetModifyTime(m_strFilePath.GetData());
+        strUpdateTime = CSimpleStringA::Format("%d-%02d-%02d-%02d:%02d:%02d",
+                                               st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
+	}
+	else
+	{
+#ifdef RVC_OS_WIN
+        SYSTEMTIME st, stLocal;
+		GetSystemTime(&st);
+		SystemTimeToTzSpecificLocalTime(NULL, &st, &stLocal);
+#else
+        SYSTEMTIME stLocal = CSmallDateTime::GetNow().ToSystemTime();
+#endif
+        strUpdateTime = CSimpleStringA::Format("%d-%02d-%02d-%02d:%02d:%02d",
+                                               stLocal.wYear, stLocal.wMonth, stLocal.wDay,
+                                               stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
+    }
+    return strUpdateTime.GetData();
+}
+
+void CenterSettingsMicroServiceHelper::GetTimeoutValue(int& timeout)
+{
+    int timeoutFromConfig = 0;
+    m_pCenterConfig->ReadConfigValueInt("CenterSetting", "Timeout", timeoutFromConfig);
+    if(timeoutFromConfig == 0)
+        return;
+    else
+        timeout = timeoutFromConfig;
+}
+
+#ifdef RVC_OS_WIN
+int CenterSettingsMicroServiceHelper::OnRequest(CenterSettingReq& req, CenterSettingResponse& res, string& errMsg)
+{
+    PROCESS_LINK_CONTEXT("LR0402101SyncCenter")
+	bool ret = m_pHttpFunc->Post(req, res, &nextLink);
+
+	if(ret && res.m_success)
+	{
+		if(!res.m_is_update)
+			return SUCC;
+
+		ConvertGBKToUtf8(res.m_strConfig);
+		string strConfig = res.m_strConfig;
+
+
+		BYTE sm3[32] = {};
+		if(strConfig.length() > 2)
+		{
+			if (!SM3Hash((BYTE*)(strConfig.c_str()), strlen(strConfig.c_str()), sm3))
+			{
+				errMsg = "计算SM3失败";
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnRequest")
+					(CSimpleStringA::Format("计算SM3失败(%s)", req.m_url.c_str()));
+				return CalcSM3Fail;
+			}
+			else
+			{
+				int sm3len = sizeof(sm3);
+				char* strsm3 = ConvertBytesToHexStr(sm3, 32);
+
+				if(0 != strcmp(strsm3, res.m_sm3.c_str()))
+				{
+					errMsg = "SM3校验失败";
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnRequest")
+						(CSimpleStringA::Format("SM3校验失败(%s)", req.m_url.c_str()));
+					return CheckSM3Fail;
+				}
+
+				m_strVersion = res.m_version_no.c_str();
+				
+				return SUCC;
+			}
+		}
+	}
+	else
+	{
+		//ConvertUtf8ToGBK(res.m_errMsg);
+		errMsg = res.m_errMsg;
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnRequest")
+			(CSimpleStringA::Format("访问失败:%s", res.m_errMsg.c_str()));
+
+		if(res.m_sysCode == 28 || res.m_sysCode == 7)
+			return AccessServiceFail;
+
+		return MANUAL;
+	}
+}
+#else
+int CenterSettingsMicroServiceHelper::GetCenterSettingsFromHttp(CenterSettingReq& req, string& errMsg)
+{
+    LOG_FUNCTION();
+    CenterSettingResponse res;
+
+    struct GetCenterSettingReq //Req和Ans的变量名必须和服务端json要求的一致,切记!
+    {
+        string m_terminal_no;
+        string m_version;
+        string m_update_time;
+        string m_config;
+        JSONCONVERT2OBJECT_MEMEBER_REGISTER(m_terminal_no, m_version, m_update_time, m_config)
+    } getCenterSettingReq;
+
+    struct GetCenterSettingAns //Req和Ans的变量名必须和服务端json要求的一致,切记!
+    {
+        bool success;
+        string message;
+        bool is_update;
+        bool is_reset;
+        string version_no;
+        string sm3;
+        string config;
+        JSONCONVERT2OBJECT_MEMEBER_REGISTER(success, message, is_update, is_reset, version_no, sm3, config)
+    }getCenterSettingAns;
+
+    HttpClientResponseResult result;
+    HttpClientRequestConfig config(HttpRequestMethod::POST, req.m_url, &SpGetToken);
+    if (req.m_timeOut > 0) config.SetTimeout(req.m_timeOut);
+
+    getCenterSettingReq.m_terminal_no = req.m_terminal_no;
+    getCenterSettingReq.m_version = req.m_version;
+    getCenterSettingReq.m_update_time = req.m_update_time;
+    getCenterSettingReq.m_config = req.m_config;
+
+    SP::Module::Restful::FulfillRequestJsonBody(&config, getCenterSettingReq);
+
+    Dbg("Geting centtersetting...");
+
+    RestfulClient client = RestfulClient::getInstance();
+    PROCESS_LINK_CONTEXT("LR0402101GetCenterSetting");
+    config.PreDo();
+    client.Do(&config, &result, &nextLink);
+
+    Dbg("ret result.ResponseOK() = %d.", result.ResponseOK());
+    if (!result.ResponseOK()) {
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Do failed: %s", result.WhatError().c_str());
+        errMsg = result.WhatError();
+        return AccessServiceFail;
+    }
+    SP::Module::Restful::CommResponseJson responseStatus;
+    SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
+    if (!responseStatus.IsOperatedOK()) {
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(result.content.c_str());
+        errMsg = responseStatus.WhatError().c_str();
+        return MANUAL;
+    }
+
+    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s", result.content.length() > 1000 ? result.content.substr(0, 1000).c_str() : result.content.c_str());
+    if (!SP::Module::Restful::ExtractDataFromDebranchResponse(result.content, getCenterSettingAns)) {
+        DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("parse json data node failed: ");
+        errMsg = "解析集中配置返回的信息失败";
+        return UNknown;
+    }
+    //transferblank(centerSettingAns.version_no);
+    ///** 当时粤超开发Windows版本时,要求服务端将数组转化为字符串传送,这边信创为了兼容,需要重新转为数组处理(信创是支持JSON数组) [Gifur@202398]*/
+    //string strConfig = centerSettingAns.config;  
+    //vector<ConfigItem> m_config;
+    //SP::Utility::replaceInPlace(centerSettingAns.config, "\\\"", "\"");
+    //if (!Json2Object(m_config, centerSettingAns.config)) {
+    //    DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse config content failed!");
+    //    errMsg = "解析集中配置返回的配置信息失败";
+    //    return UNknown;
+    //}
+    res.Parse(result.content);
+    string strConfig = SP::Utility::GBK2UTF8(res.m_strConfig);
+
+    if (!res.m_is_update) {
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("Centersetting not changed.");
+        errMsg = "集中配置已是最新版本";
+        return EXIST;
+    }
+
+    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("config length:%d", strConfig.length());
+
+    BYTE sm3[32] = {};
+    if (strConfig.length() > 2) {
+        if (!SM3Hash((BYTE*)(strConfig.c_str()), strConfig.length(), sm3)) {
+            errMsg = "计算SM3失败";
+            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSettingsFromHttp")("计算SM3失败(%s)", req.m_url.c_str());
+            return CalcSM3Fail;
+        } else {
+            DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sm3:%s", res.m_sm3.c_str());
+            char* strsm3 = SP::Module::Util::ConvertBytesToHexStr(sm3, 32);
+            if (0 != strcmp(strsm3, res.m_sm3.c_str())) {
+                errMsg = "SM3校验失败";
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSettingsFromHttp")("SM3校验失败(%s)", req.m_url.c_str());
+                delete[] strsm3;
+                return CheckSM3Fail;
+            }
+            m_strVersion = res.m_version_no.c_str();
+            delete[] strsm3;
+        }
+
+        if (WriteToConfig(res)) {
+            m_strVersion = res.m_version_no.c_str();
+            DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("WriteToConfig m_strVersion:%s", m_strVersion.GetData());
+            m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, m_pCenterConfig, true);
+            m_pRunConfig->WriteConfigValue("CenterSetting", "version", m_strVersion);
+            UpdateVersion();
+            if (res.m_is_reset) {
+                LogEvent(Severity_Middle, EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE, "Update centersetting with critical items.");
+            }
+            return SUCC;
+        }
+    }
+    return UNknown;
+}
+#endif

+ 198 - 0
Module/mod_CenterSetting/CenterSettingConn.h

@@ -0,0 +1,198 @@
+#ifndef RVC_MOD_CENTERSETTING_CONN_H_
+#define RVC_MOD_CENTERSETTING_CONN_H_
+
+#pragma once
+#include "json/json.h"
+#include "SpSecureClient.h"
+#include "SpIni.h"
+#include "IHttpFunc.h"
+#include "EventCode.h"
+#include <vector>
+#include <string>
+
+#ifdef WITH_CPPRESTSDK_IN_CENTER
+#include "CommEntityRestful.hpp"
+#include "microservices/api_terminal_center_config.h"
+
+struct ModuleConfigItemJson : public MicroServices::API::TerminalV3::ModuleConfigItem
+{
+    JSONCONVERT2OBJECT_MEMEBER_REGISTER(m_moudle, m_name, m_value)
+        JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("moudle", "name", "value")
+};
+
+struct CenterSettingReq
+{
+    CenterSettingReq() :m_terminal_no(""), m_version(""), m_update_time(""),m_url(""),m_timeOut(0) {}
+    std::string m_terminal_no;
+    std::string m_version;
+    std::string m_update_time;
+    /** 兼容用途 [Gifur@202398]*/
+    std::string m_url;
+    int m_timeOut;
+    std::string m_config;
+    std::vector<ModuleConfigItemJson> configs;
+    JSONCONVERT2OBJECT_MEMEBER_REGISTER(m_terminal_no, m_version, configs, m_update_time)
+        JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("terminal_no", "version", "config", "update_time")
+};
+
+struct CenterSettingResponse
+{
+    bool m_is_update;
+    bool m_is_reset;
+    std::string m_sm3;
+    std::string m_version_no;
+    std::vector<ModuleConfigItemJson> m_config;
+    std::string m_strConfig;
+    JSONCONVERT2OBJECT_MEMEBER_REGISTER(m_is_update, m_is_reset, m_sm3, m_version_no, m_strConfig)
+        JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("is_update", "is_reset", "sm3", "version_no", "config")
+};
+
+#else
+
+struct CenterSettingReq : CHTTPReq
+{
+    CenterSettingReq()
+    {
+#if defined(_MSC_VER)
+        m_bTransCode = true;
+#else
+        m_bTransCode = false;
+#endif //_MSC_VER
+    }
+    string m_terminal_no;
+    string m_version;
+    string m_update_time;
+    string m_config;
+
+    virtual string ToJson()
+    {
+        CSimpleStringA reqcontent = CSimpleStringA::Format("{\"terminal_no\":\"%s\", \"version\":\"%s\", \"update_time\":\"%s\", \"config\":[%s]}",
+            m_terminal_no.c_str(), m_version.c_str(), m_update_time.c_str(), m_config.c_str());
+        return reqcontent.GetData();
+    }
+};
+
+struct ConfigItem
+{
+    std::string m_moudle;
+    std::string m_name;
+    std::string m_value;
+
+#ifdef RVC_OS_LINUX
+    // 默认构造函数
+    ConfigItem()
+        : m_moudle(""), m_name(""), m_value("")
+    {
+    }
+
+    // 带参数的构造函数
+    ConfigItem(const std::string& module, const std::string& name, const std::string& value)
+        : m_moudle(module), m_name(name), m_value(value)
+    {
+    }
+
+    // 拷贝构造函数
+    ConfigItem(const ConfigItem& other)
+        : m_moudle(other.m_moudle), m_name(other.m_name), m_value(other.m_value)
+    {
+    }
+#endif
+};
+
+struct CenterSettingResponse : CHTTPRet
+{
+    CenterSettingResponse(){}
+
+    bool m_success;
+    string m_message;
+    bool m_is_update;
+    bool m_is_reset;
+    string m_version_no;
+    string m_sm3;
+    string m_strConfig;
+    vector<ConfigItem> m_config;
+
+    virtual bool Parse(string strData);
+};
+
+#ifdef RVC_OS_LINUX
+#define SAFE_DELETE_HTTPCLIENT(obj)	\
+	do{if(obj != NULL) { obj->Destory(); obj = NULL; }}while(false)
+#endif //RVC_OS_LINUX
+
+#endif //WITH_CPPRESTSDK_IN_CENTER
+
+struct AddVersionReq : CHTTPReq
+{
+    AddVersionReq(){}
+    string m_terminal_no;
+    string m_version;
+    string m_update_time;
+
+    virtual string ToJson()
+    {
+        char reqcontent[256];
+        sprintf(reqcontent, "{\"terminal_no\":\"%s\", \"version_no\":\"%s\", \"terminal_update_time\":\"%s\"}",
+                m_terminal_no.c_str(), m_version.c_str(), m_update_time.c_str());
+        return reqcontent;
+    }
+};
+
+struct AddVersionResponse : CHTTPRet
+{
+    AddVersionResponse() {}
+
+    bool m_success;
+    string m_message;
+
+    virtual bool Parse(string strData);
+};
+
+class CenterSettingsMicroServiceHelper
+{
+public:
+    CenterSettingsMicroServiceHelper(CEntityBase* pEntity);
+#ifdef RVC_OS_WIN
+    int GetCenterSetting();
+#else
+	int GetCenterSetting(bool byHand);
+#endif
+    string GetLocalConfig(); //将集中配置转换成Json串
+    string GetUpdateTime();  //获取集中配置更新时间,如果文件不存在则获取当前系统时间
+    const char* GetErrMsg() { return m_strErrMsg.c_str(); }
+    void GetTimeoutValue(int& timeout);
+    void InitCenterSettingInfo();
+    bool WriteToConfig(const CenterSettingResponse& sResponse);
+    void UpdateVersion();
+    void UpdateUrl(const string& url) { m_strUrl = url.c_str(); };
+
+#ifdef RVC_OS_WIN
+    int OnRequest(CenterSettingReq& req, CenterSettingResponse& res, string& errMsg = string(""));  //轮询域名下载集中配置
+#else
+	int GetCenterSettingsFromHttp(CenterSettingReq& req, string& errMsg);  //轮询域名下载集中配置
+#endif
+
+    string GetCurUrl() { return m_strCurUrl; }
+
+private:
+    string m_strErrMsg;
+    CEntityBase* m_pEntity;
+    CSimpleStringA m_strLastTime;
+    CSystemStaticInfo m_terminalInfo;
+    IHttpFunc* m_pHttpFunc;
+    CAutoArray<CSimpleStringA> m_arrKeys;
+    vector<CSimpleStringA> m_arrURLs;
+
+    CSimpleStringA m_strCurSite;
+    CSmartPointer<IConfigInfo> m_pCenterConfig;
+    CSmartPointer<IConfigInfo> m_pRunConfig;
+    CSimpleStringA m_strFilePath;
+    CSimpleStringA m_strBakPath;
+    CSimpleStringA m_strVersion;
+    CSimpleStringA m_strUrl;
+    vector<CSimpleStringA> m_urlsFromShell;
+    string m_strCurUrl;
+    bool m_isFirst;
+};
+
+#endif //RVC_MOD_CENTERSETTING_CONN_H_

+ 42 - 0
Module/mod_CenterSetting/CenterSettingService.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="gb2312" ?>
+<entity name="CenterSetting">
+	<class name="CenterSettingService" overlap="true" exclusive="false">
+		<twoway name="Downloadv2" overlap="true">
+			<req>
+				<param name="reqCenterConfigUrl" type="string"/>
+			</req>
+			<res>
+				<param name="downloadStat" type="int"/>
+				<param name="strErrMsg" type="string"/>
+				<param name="retCenterConfigUrl" type="string"/>
+				<param name="HostUrl" type="string"/>
+			</res>
+		</twoway>
+		<oneway name="Hold1" overlap="true">
+		</oneway>
+		<oneway name="Hold2" overlap="true">
+		</oneway>
+		<twoway name="GetAccessUrl" overlap="true">
+			<res>
+				<param name="HostUrl" type="string"/>
+			</res>
+		</twoway>
+		<twoway name="GetCertainAceessUrl" overlap="true">
+			<req>
+				<param name="reqName" type="string"/>
+				<param name="reverse1" type="string"/>
+				<param name="reverse2" type="string"/>
+				<param name="intreverse1" type="int"/>
+				<param name="intreverse2" type="int"/>
+			</req>
+			<res>
+				<param name="CertainAceessUrl" type="string"/>
+				<param name="reverse1" type="string"/>
+				<param name="reverse2" type="string"/>
+				<param name="intreverse1" type="int"/>
+				<param name="intreverse2" type="int"/>
+			</res>
+		</twoway>
+
+	</class>
+</entity>

+ 255 - 0
Module/mod_CenterSetting/CenterSetting_client_g.h

@@ -0,0 +1,255 @@
+
+#ifndef __CENTERSETTING_CLIENT_G_H
+#define __CENTERSETTING_CLIENT_G_H
+
+#pragma once
+
+// This code is generated by spgen tool!
+
+#include "CenterSetting_def_g.h"
+
+namespace CenterSetting {
+class CenterSettingService_ClientBase : public CClientSessionBase {
+public:
+	explicit CenterSettingService_ClientBase(CEntityBase *pEntity) : m_pEntityBase(pEntity), m_bSysManaged(false) {}
+
+	CenterSettingService_ClientBase* operator () (const linkContext &curLink) 
+	{
+		m_context = curLink;
+		return this;
+	}
+
+protected:
+	virtual ~CenterSettingService_ClientBase()
+	{
+		/// override by user
+	}
+public:
+
+	void OnConnectSucceed()
+	{
+		bSessionClosed = false;
+	}
+	void OnClose(ErrorCodeEnum)
+	{
+		bSessionClosed = true;
+	}
+	bool QuerySessionClosed()
+	{
+		return bSessionClosed;
+	}
+	ErrorCodeEnum Connect(CSmartPointer<IAsynWaitSp> &spAsyncWait)
+	{
+		CSmartPointer<IEntityFunction> pFunc = m_pEntityBase->GetFunction();
+		ErrorCodeEnum Error = pFunc->ConnectRemoteEntity(this, "CenterSetting", "CenterSettingService", spAsyncWait);
+		if (Error == Error_Succeed) {
+			m_bSysManaged = true;
+			bSessionClosed = false;
+		}
+		return Error;
+	}
+	ErrorCodeEnum Connect()
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = Connect(spAsyncWait);
+		if (Error == Error_Succeed) {
+			Error = spAsyncWait->WaitAnswer();
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum Downloadv2(CenterSettingService_Downloadv2_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(CenterSettingService_Method_Downloadv2, CenterSettingService_MethodSignature_Downloadv2, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum Downloadv2(CenterSettingService_Downloadv2_Req &Req, CenterSettingService_Downloadv2_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = Downloadv2(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum Downloadv2(CenterSettingService_Downloadv2_Req &Req, CenterSettingService_Downloadv2_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = Downloadv2(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum Downloadv2(CenterSettingService_Downloadv2_Req &Req, CenterSettingService_Downloadv2_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = Downloadv2(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum Hold1()
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->OnewayCall(CenterSettingService_Method_Hold1, CenterSettingService_MethodSignature_Hold1, m_context);
+		m_context.clear();
+		return ret;
+	}
+
+	ErrorCodeEnum Hold2()
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->OnewayCall(CenterSettingService_Method_Hold2, CenterSettingService_MethodSignature_Hold2, m_context);
+		m_context.clear();
+		return ret;
+	}
+
+	ErrorCodeEnum GetAccessUrl(CenterSettingService_GetAccessUrl_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(CenterSettingService_Method_GetAccessUrl, CenterSettingService_MethodSignature_GetAccessUrl, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetAccessUrl(CenterSettingService_GetAccessUrl_Req &Req, CenterSettingService_GetAccessUrl_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetAccessUrl(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetAccessUrl(CenterSettingService_GetAccessUrl_Req &Req, CenterSettingService_GetAccessUrl_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetAccessUrl(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetAccessUrl(CenterSettingService_GetAccessUrl_Req &Req, CenterSettingService_GetAccessUrl_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetAccessUrl(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum GetCertainAceessUrl(CenterSettingService_GetCertainAceessUrl_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(CenterSettingService_Method_GetCertainAceessUrl, CenterSettingService_MethodSignature_GetCertainAceessUrl, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetCertainAceessUrl(CenterSettingService_GetCertainAceessUrl_Req &Req, CenterSettingService_GetCertainAceessUrl_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetCertainAceessUrl(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetCertainAceessUrl(CenterSettingService_GetCertainAceessUrl_Req &Req, CenterSettingService_GetCertainAceessUrl_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetCertainAceessUrl(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetCertainAceessUrl(CenterSettingService_GetCertainAceessUrl_Req &Req, CenterSettingService_GetCertainAceessUrl_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetCertainAceessUrl(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+
+	bool SafeDelete()
+	{
+		if (!m_bSysManaged) {
+			delete this;
+		}
+		return m_bSysManaged;
+	}
+
+protected:
+	bool m_bSysManaged;
+	CEntityBase *m_pEntityBase;
+	linkContext m_context;
+	bool bSessionClosed;
+};
+
+///////////////////////////
+
+} // namespace CenterSetting
+#endif // __CENTERSETTING_CLIENT_G_H

+ 131 - 0
Module/mod_CenterSetting/CenterSetting_def_g.h

@@ -0,0 +1,131 @@
+#ifndef __CENTERSETTING_DEF_G_H
+#define __CENTERSETTING_DEF_G_H
+
+#pragma once
+
+// This code is generated by spgen tool!
+
+#include "SpHelper.h"
+
+namespace CenterSetting {
+//
+// const goes here
+//
+
+#define CenterSettingService_Method_Downloadv2 0
+#define CenterSettingService_Method_Hold1 1
+#define CenterSettingService_Method_Hold2 2
+#define CenterSettingService_Method_GetAccessUrl 3
+#define CenterSettingService_Method_GetCertainAceessUrl 4
+
+#define CenterSettingService_MethodSignature_Downloadv2 -1569222403
+#define CenterSettingService_MethodSignature_Hold1 35758230
+#define CenterSettingService_MethodSignature_Hold2 35758233
+#define CenterSettingService_MethodSignature_GetAccessUrl 1887530540
+#define CenterSettingService_MethodSignature_GetCertainAceessUrl -927544309
+
+#define CenterSettingService_LogCode_Downloadv2 "QLR040210100"
+#define CenterSettingService_LogCode_Hold1 "QLR040210101"
+#define CenterSettingService_LogCode_Hold2 "QLR040210102"
+#define CenterSettingService_LogCode_GetAccessUrl "QLR040210103"
+#define CenterSettingService_LogCode_GetCertainAceessUrl "QLR040210104"
+
+struct CenterSettingService_Downloadv2_Req
+{
+	CSimpleStringA reqCenterConfigUrl;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & reqCenterConfigUrl;
+	}
+
+};
+
+struct CenterSettingService_Downloadv2_Ans
+{
+	int downloadStat;
+	CSimpleStringA strErrMsg;
+	CSimpleStringA retCenterConfigUrl;
+	CSimpleStringA HostUrl;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & downloadStat & strErrMsg & retCenterConfigUrl & HostUrl;
+	}
+
+};
+
+struct CenterSettingService_Hold1_Info
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct CenterSettingService_Hold2_Info
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct CenterSettingService_GetAccessUrl_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct CenterSettingService_GetAccessUrl_Ans
+{
+	CSimpleStringA HostUrl;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & HostUrl;
+	}
+
+};
+
+struct CenterSettingService_GetCertainAceessUrl_Req
+{
+	CSimpleStringA reqName;
+	CSimpleStringA reverse1;
+	CSimpleStringA reverse2;
+	int intreverse1;
+	int intreverse2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & reqName & reverse1 & reverse2 & intreverse1 & intreverse2;
+	}
+
+};
+
+struct CenterSettingService_GetCertainAceessUrl_Ans
+{
+	CSimpleStringA CertainAceessUrl;
+	CSimpleStringA reverse1;
+	CSimpleStringA reverse2;
+	int intreverse1;
+	int intreverse2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & CertainAceessUrl & reverse1 & reverse2 & intreverse1 & intreverse2;
+	}
+
+};
+
+
+///////////////////////////
+
+} // namespace CenterSetting
+
+#endif // __CENTERSETTING_DEF_G_H

+ 218 - 0
Module/mod_CenterSetting/CenterSetting_server_g.h

@@ -0,0 +1,218 @@
+
+#ifndef __CENTERSETTING_SERVER_G_H
+#define __CENTERSETTING_SERVER_G_H
+
+#pragma once
+
+// This code is generated by spgen tool!
+
+#include "CenterSetting_def_g.h"
+
+namespace CenterSetting {
+class CenterSettingService_ServerSessionBase : public CServerSessionBase
+{
+public:
+	CenterSettingService_ServerSessionBase()
+	{
+		/// override by user
+	}
+
+	virtual ~CenterSettingService_ServerSessionBase()
+	{
+		/// override by user
+	}
+
+	virtual bool IsExclusive() { return false; }
+
+	virtual bool IsSessionOverlap() { return true; }
+
+	virtual ErrorCodeEnum GetMessageAttr(DWORD dwMessageID, DWORD dwSignature, bool &bOverlap)
+	{
+		ErrorCodeEnum Error = Error_Succeed;
+		switch (dwMessageID) {
+		case CenterSettingService_Method_Downloadv2:
+			if (dwSignature == CenterSettingService_MethodSignature_Downloadv2) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CenterSettingService_Method_Hold1:
+			if (dwSignature == CenterSettingService_MethodSignature_Hold1) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CenterSettingService_Method_Hold2:
+			if (dwSignature == CenterSettingService_MethodSignature_Hold2) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CenterSettingService_Method_GetAccessUrl:
+			if (dwSignature == CenterSettingService_MethodSignature_GetAccessUrl) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CenterSettingService_Method_GetCertainAceessUrl:
+			if (dwSignature == CenterSettingService_MethodSignature_GetCertainAceessUrl) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		default:
+			Error = Error_MethodNotFound;
+			break;
+		}
+		return Error;
+	}
+
+	int CheckMessageSignature(DWORD dwMessageID, DWORD dwSignature)
+	{
+		ErrorCodeEnum Error = Error_Succeed;
+		switch (dwMessageID) {
+		case CenterSettingService_Method_Downloadv2:
+			if (dwSignature != CenterSettingService_MethodSignature_Downloadv2) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CenterSettingService_Method_Hold1:
+			if (dwSignature != CenterSettingService_MethodSignature_Hold1) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CenterSettingService_Method_Hold2:
+			if (dwSignature != CenterSettingService_MethodSignature_Hold2) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CenterSettingService_Method_GetAccessUrl:
+			if (dwSignature != CenterSettingService_MethodSignature_GetAccessUrl) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CenterSettingService_Method_GetCertainAceessUrl:
+			if (dwSignature != CenterSettingService_MethodSignature_GetCertainAceessUrl) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		default:
+			Error = Error_MethodNotFound;
+			break;
+		}
+		return Error;
+	}
+
+	virtual void Handle_Downloadv2(SpReqAnsContext<CenterSettingService_Downloadv2_Req, CenterSettingService_Downloadv2_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_Hold1(SpOnewayCallContext<CenterSettingService_Hold1_Info>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_Hold2(SpOnewayCallContext<CenterSettingService_Hold2_Info>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_GetAccessUrl(SpReqAnsContext<CenterSettingService_GetAccessUrl_Req, CenterSettingService_GetAccessUrl_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_GetCertainAceessUrl(SpReqAnsContext<CenterSettingService_GetCertainAceessUrl_Req, CenterSettingService_GetCertainAceessUrl_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
+	{
+		CAutoBuffer Buf;
+		DWORD dwMessageID;
+		DWORD dwMessageSignature;
+		ErrorCodeEnum Error = pTransactionContext->GetReceiveBuffer(dwMessageID, dwMessageSignature, Buf);
+		if (Error == Error_Succeed) {
+#ifdef DEBUG
+			assert(CheckMessageSignature(dwMessageID, dwMessageSignature) == Error_Succeed);
+#else
+			if (CheckMessageSignature(dwMessageID, dwMessageSignature) != Error_Succeed) {
+				pTransactionContext->SendAnswer(Error_MethodSignatureFailed);
+				return;
+			}
+#endif
+			switch (dwMessageID) {
+				case CenterSettingService_Method_Downloadv2:
+					{
+						SpReqAnsContext<CenterSettingService_Downloadv2_Req,CenterSettingService_Downloadv2_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CenterSettingService_Downloadv2_Req,CenterSettingService_Downloadv2_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_Downloadv2(ctx);
+					}
+					break;
+				case CenterSettingService_Method_Hold1:
+					{
+						SpOnewayCallContext<CenterSettingService_Hold1_Info>::Pointer ctx;
+						ctx.Attach(new SpOnewayCallContext<CenterSettingService_Hold1_Info>());
+						SpBuffer2Object(Buf, ctx->Info);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_Hold1(ctx);
+					}
+					break;
+				case CenterSettingService_Method_Hold2:
+					{
+						SpOnewayCallContext<CenterSettingService_Hold2_Info>::Pointer ctx;
+						ctx.Attach(new SpOnewayCallContext<CenterSettingService_Hold2_Info>());
+						SpBuffer2Object(Buf, ctx->Info);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_Hold2(ctx);
+					}
+					break;
+				case CenterSettingService_Method_GetAccessUrl:
+					{
+						SpReqAnsContext<CenterSettingService_GetAccessUrl_Req,CenterSettingService_GetAccessUrl_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CenterSettingService_GetAccessUrl_Req,CenterSettingService_GetAccessUrl_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetAccessUrl(ctx);
+					}
+					break;
+				case CenterSettingService_Method_GetCertainAceessUrl:
+					{
+						SpReqAnsContext<CenterSettingService_GetCertainAceessUrl_Req,CenterSettingService_GetCertainAceessUrl_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CenterSettingService_GetCertainAceessUrl_Req,CenterSettingService_GetCertainAceessUrl_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetCertainAceessUrl(ctx);
+					}
+					break;
+				default:
+					assert(0);
+					break;
+			}
+			
+		} else {
+			pTransactionContext->SendAnswer(Error);
+		}
+	}
+
+};
+
+
+///////////////////////////
+
+} // namespace CenterSetting
+#endif // __CENTERSETTING_SERVER_G_H

+ 4 - 0
Module/mod_CenterSetting/ChangeLog

@@ -0,0 +1,4 @@
+* 网络不通时不切备用地址(廖桂发,2021年1月26日)
+* 处理主动下载集中配置的问题(廖桂发,2020年12月26日)
+* 2020年10月27日 合并国密版本的代码
+* 2020-7-3 调通与分行服务进行通信的功能,双活机制中用到

+ 19 - 0
Module/mod_CenterSetting/Event.h

@@ -0,0 +1,19 @@
+#pragma once
+
+enum CenterSetting_UserErrorCode
+{
+    CenterSetting_UserErrorCode_Start = 0x10100200,
+    ERR_MOD_CENTERSETTING_CONNECT_FAILED,                //获取集中配置失败
+    EVENT_MOD_CENTERSETTING_CONNECT_SUCC,                //获取集中配置成功
+    ERR_MOD_CENTERSETTING_HTTP_FAILED,                   //HTTP连接失败
+    ERR_MOD_CENTERSETTING_WRITE_FAILED,                  //集中配置写入失败
+    ERR_MOD_CENTERSETTING_LOST,		          		     //集中配置丢失
+    EVENT_MOD_CENTERSETTING_UPDATE_VERSION_FAILED,    	 //上传版本号失败
+    EVENT_MOD_CENTERSETTING_UPDATE_VERSION_SUCC,      	 //上传版本号成功
+    EVENT_MOD_CENTERSETTING_CENTER,               //总行模式
+    EVENT_MOD_CENTERSETTING_UPDATE_CENTER_FORCE,               //强制下载集中配置
+    EVENT_MOD_CENTERSETTING_UPDATE_CENTER,               //集中配置发生更新(总行)  
+};
+
+// 下载成功	事件	2	0x10100011	向后台成功进行配置下载,或完成比较当前序列化版本为后台最新版本。
+#define EVENT_MOD_CENTERSETTING_DOWNOK	0x10100011

+ 239 - 0
Module/mod_CenterSetting/mod_centersetting.cpp

@@ -0,0 +1,239 @@
+#include "stdafx.h"
+#include "SpBase.h"
+#include "Event.h"
+#include "mod_centersetting.h"
+#include <regex>
+#include "fileutil.h"
+#include "array.h"
+using namespace std;
+
+CServerSessionBase* CCenterSettingEntity::OnNewSession(const char* /*pszRemoteEntityName*/, const char* /*pszClass*/)
+{
+	return new CCenterSettingService(this);
+}
+
+void CCenterSettingEntity::OnStarted()
+{
+	GetFunction()->GetPath("CenterSetting", m_strFilePath);
+	GetFunction()->OpenConfig(Config_CenterSetting, m_pCenterConfig);
+
+	GetFunction()->GetPath("RunInfo", m_strBakPath);
+
+#ifdef RVC_OS_WIN
+	m_strBakPath += "\\runcfg\\CenterSetting.ini";
+#else
+	m_strBakPath += SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "CenterSetting.ini";
+#endif
+
+	m_pMicroServiceHelper = new CenterSettingsMicroServiceHelper(this);
+
+	if(!m_pCenterConfig->storageInMem())
+	{
+		m_isUseMemCfg = false;
+		BeginDownloadCenterSetting();
+	}
+	else
+	{
+		m_isUseMemCfg = true;
+	}
+
+	// 启动轮询定时器
+	const DWORD interval = 60000 * 5;
+	GetFunction()->SetTimer(1, this, interval);
+}
+
+void CCenterSettingEntity::OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext)
+{
+	GetFunction()->KillTimer(1);
+	pTransactionContext->SendAnswer(Error_Succeed);
+}
+
+ErrorCodeEnum CCenterSettingEntity::BeginDownloadCenterSetting(bool bByHand, const string& url)
+{
+	LOG_FUNCTION();
+#ifdef _MSC_VER
+	EnterCriticalSection(&m_lock);
+#else
+	std::unique_lock<std::mutex> lock1(m_lock);
+#endif
+
+	if(!url.empty())
+	{
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("update centersettings url...");
+		m_pMicroServiceHelper->UpdateUrl(url);
+	}
+
+#ifdef RVC_OS_WIN
+	int rc = m_pMicroServiceHelper->GetCenterSetting();
+#else
+	int rc = m_pMicroServiceHelper->GetCenterSetting(bByHand);
+#endif
+
+	if(EXIST == rc)
+	{
+	}
+	else if(SUCC == rc)
+	{
+		LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_CENTER,
+				CSimpleStringA::Format("下载集中配置成功:%s", m_pMicroServiceHelper->GetCurUrl().c_str()));
+		LogEvent(Severity_Low, EVENT_MOD_CENTERSETTING_UPDATE_CENTER, "Update Centersetting.");
+		if (bByHand)
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210101")("手工下载集中配置成功");
+		else
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402101Z01")("自动下载集中配置成功");
+	}
+	else
+	{
+		LogWarn(Severity_High, Error_Unexpect, ERR_MOD_CENTERSETTING_CONNECT_FAILED,
+				CSimpleStringA::Format("下载集中配置失败:%s", m_pMicroServiceHelper->GetErrMsg()));
+		if (!bByHand)
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402101Z01").setResultCode("RTA1104")("集中配置下载失败");
+	}
+
+	if(m_spDownloadCall != NULL)
+	{
+		m_spDownloadCall->Ans.downloadStat = rc;
+		m_spDownloadCall->Ans.retCenterConfigUrl = m_pMicroServiceHelper->GetCurUrl().c_str();
+
+		if(rc == AllAddressNull)
+		{
+			m_spDownloadCall->Ans.strErrMsg = "所有地址都为空,请检查终端版本";
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210101").setResultCode("RTA1101")("所有集中配置下载地址都为空");
+		}
+		else if(rc == AccessServiceFail)
+		{
+			m_spDownloadCall->Ans.strErrMsg = "网络异常,请检查网络连接情况";
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210101").setResultCode("RTA1102")("网络异常,请检查网络连接情况");
+		}
+		else if(rc == CalcSM3Fail || rc == CheckSM3Fail)
+		{
+			m_spDownloadCall->Ans.strErrMsg = "集中配置内容校验失败,请重试";
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210101").setResultCode("RTA1103")("集中配置内容校验失败");
+		}
+		else if(rc == MANUAL)
+		{
+			m_spDownloadCall->Ans.strErrMsg = "集中配置下载失败";
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210101").setResultCode("RTA1104")("集中配置下载失败");
+		}
+		else if(rc == EXIST)
+		{
+			m_spDownloadCall->Ans.strErrMsg = "集中配置已是最新版本";
+		}
+
+		CSimpleStringA hostUrl;
+		m_pCenterConfig->ReadConfigValue("AccessAuthorization", "HostInitUrl", hostUrl);
+		m_spDownloadCall->Ans.HostUrl = hostUrl;
+
+		m_spDownloadCall->Answer(Error_Succeed);
+		m_spDownloadCall.Clear();
+	}
+#ifdef _MSC_VER
+	LeaveCriticalSection(&m_lock);
+#endif
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CCenterSettingEntity::DownloadCenterSetting(SpReqAnsContext<CenterSettingService_Downloadv2_Req, CenterSettingService_Downloadv2_Ans>::Pointer sp)
+{
+	if (m_spDownloadCall != NULL)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DownloadCenterSetting")
+			("last download call not complet");
+		sp->Answer(Error_Duplication);
+		return Error_Duplication;
+	}
+
+	m_spDownloadCall = sp;
+	ErrorCodeEnum error = BeginDownloadCenterSetting(true, sp->Req.reqCenterConfigUrl.GetData());
+	if (error != Error_Succeed) {
+		m_spDownloadCall = nullptr;
+		if (sp != NULL) {
+			sp->Answer(Error_Succeed);
+		}
+		return error;
+	}
+	return Error_Succeed;
+}
+
+DWORD getCenterCfgThread(LPVOID param)
+{
+	CCenterSettingEntity* req = (CCenterSettingEntity*)param;
+	bool isUpdate = false, isReset = false;
+	CSimpleString version;
+	if(false == req->GetFunction()->HasPrivilege())
+	{
+		LogWarn(Severity_High, Error_Unexpect, ERR_MOD_CENTERSETTING_CONNECT_FAILED,
+			CSimpleStringA::Format("下载集中配置失败:%s do not has privilege", __FUNCTION__));
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402101Z01").setResultCode("RTA1104")("集中配置下载失败");
+		return -1;
+	}
+
+
+	auto ret = req->GetFunction()->GetPrivilegeFunction()->TryUpdateCenterCfg(isUpdate, isReset, version);
+	if (ret != ErrorCodeEnum::Error_Succeed)
+	{
+		LogWarn(Severity_High, Error_Unexpect, ERR_MOD_CENTERSETTING_CONNECT_FAILED,
+			CSimpleStringA::Format("下载集中配置失败:%d", ret));
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402101Z01").setResultCode("RTA1104")("集中配置下载失败");
+		return -1;
+	}
+
+	if (!isUpdate)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("Centersetting not changed from spshell");
+		return -1;
+	}
+
+	LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_CENTER,
+		CSimpleStringA::Format("下载集中配置成功,版本号变更成:%s", version.GetData()));
+	LogEvent(Severity_Low, EVENT_MOD_CENTERSETTING_UPDATE_CENTER, "Update Centersetting.");
+
+	if (isReset)
+		LogEvent(Severity_Middle, EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE, "SpShell:Update centersetting with critical items.");
+	return 0;
+}
+
+void CCenterSettingEntity::OnTimeout(DWORD dwTimerID)
+{
+	if(m_isUseMemCfg)
+	{
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("use memory config....");
+		CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&getCenterCfgThread, this, 0, NULL));
+	} 
+	else
+	{
+		BeginDownloadCenterSetting();
+	}
+		
+}
+
+ErrorCodeEnum CCenterSettingEntity::GetAccessUrl(CSimpleStringA& url) //初始化地址
+{
+	CSimpleStringA hostInitUrl;
+	m_pCenterConfig->ReadConfigValue("AccessAuthorization", "HostInitUrl", hostInitUrl);
+	if(hostInitUrl.IsNullOrEmpty())
+		url = "初始化地址为空";
+	else
+		url = hostInitUrl;
+
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CCenterSettingEntity::GetCertainAceessUrl(CSimpleStringA& accessName, CSimpleStringA& url) //准入地址
+{
+	LOG_FUNCTION();
+	CSimpleStringA tUrl;
+	m_pCenterConfig->ReadConfigValue("AccessAuthorization", accessName.GetData(), tUrl);
+	if (tUrl.IsNullOrEmpty())
+		url = "地址为空";
+	else
+		url = tUrl;
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("准入地址 = %s", url.GetData());
+	return Error_Succeed;
+}
+
+SP_BEGIN_ENTITY_MAP()
+	SP_ENTITY(CCenterSettingEntity)
+SP_END_ENTITY_MAP()
+

+ 105 - 0
Module/mod_CenterSetting/mod_centersetting.h

@@ -0,0 +1,105 @@
+#ifndef RVC_MOD_CENTERSETTING_H__
+#define RVC_MOD_CENTERSETTING_H__
+
+#pragma once
+
+#include "CenterSetting_server_g.h"
+using namespace CenterSetting;
+#include "CenterSettingConn.h"
+#include <regex>
+#include <map>
+#include <string>
+#ifdef RVC_OS_LINUX
+#include <mutex>
+#endif
+using namespace std;
+
+enum DownloadStat
+{
+	SUCC = 1,
+	AccessServiceFail = 2,
+	EXIST = 3,
+	MANUAL = 4,
+	AllAddressNull = 5,
+	CalcSM3Fail = 6,
+	CheckSM3Fail = 7,
+	UNknown = 8
+};
+
+static void HTTPLogCallback(const char* msg){
+}
+
+class CCenterSettingEntity : public CEntityBase, public ITimerListener
+{
+public:
+	CCenterSettingEntity() : m_strFilePath(true){}
+	virtual ~CCenterSettingEntity() {}
+	virtual const char* GetEntityName() const { return "CenterSetting"; }
+	virtual bool IsService()const{ return true; }
+
+	virtual void OnStarted();
+	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext);
+	virtual void OnTimeout(DWORD dwTimerID);
+	virtual CServerSessionBase* OnNewSession(const char* /*pszRemoteEntityName*/, const char* /*pszClass*/);
+
+	ErrorCodeEnum DownloadCenterSetting(SpReqAnsContext<CenterSettingService_Downloadv2_Req, CenterSettingService_Downloadv2_Ans>::Pointer sp);
+	ErrorCodeEnum GetAccessUrl(CSimpleStringA &url);
+	ErrorCodeEnum GetCertainAceessUrl(CSimpleStringA &accessName, CSimpleStringA& url);
+
+private:
+	ErrorCodeEnum BeginDownloadCenterSetting(bool bByHand = false, const string& url = "");
+
+private:
+
+	CenterSettingsMicroServiceHelper* m_pMicroServiceHelper;
+
+	CSimpleStringA m_strFilePath;
+	CSmartPointer<IConfigInfo> m_pCenterConfig;
+
+	CSimpleStringA m_strBakPath;
+
+#ifdef _MSC_VER
+	CRITICAL_SECTION m_lock;
+#else
+	std::mutex m_lock;
+#endif
+
+	SpReqAnsContext<CenterSettingService_Downloadv2_Req, CenterSettingService_Downloadv2_Ans>::Pointer m_spDownloadCall;
+	friend class CCenterSettingConn;
+	bool m_isUseMemCfg;
+};
+
+class CCenterSettingService : public CenterSettingService_ServerSessionBase
+{
+public:
+	CCenterSettingService(CCenterSettingEntity* pEntity) :m_pEntity(pEntity){}
+	virtual ~CCenterSettingService(){}
+
+	virtual void Handle_Downloadv2(SpReqAnsContext<CenterSettingService_Downloadv2_Req, CenterSettingService_Downloadv2_Ans>::Pointer ctx)
+	{
+		DbgToBeidou(ctx->link, __FUNCTION__)();
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(CenterSettingService_LogCode_Downloadv2).setAPI(__FUNCTION__)(__FUNCTION__);
+		m_pEntity->DownloadCenterSetting(ctx);
+	}
+
+	/** 有必要废弃,采用通用化的接口获取即可,特别是要JS化时 [Gifur@2023823]*/
+	virtual void Handle_GetAccessUrl(SpReqAnsContext<CenterSettingService_GetAccessUrl_Req, CenterSettingService_GetAccessUrl_Ans>::Pointer ctx)
+	{
+		DbgToBeidou(ctx->link, __FUNCTION__)();
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(CenterSettingService_LogCode_GetAccessUrl).setAPI(__FUNCTION__)(__FUNCTION__);
+		auto rc = m_pEntity->GetAccessUrl(ctx->Ans.HostUrl); //获取初始化地址,是的,就是初始化地址,不要在意这里的名称问题,之前同事开发接口的时候估计随手一打
+		ctx->Answer(rc);
+	}
+
+	virtual void Handle_GetCertainAceessUrl(SpReqAnsContext<CenterSettingService_GetCertainAceessUrl_Req, CenterSettingService_GetCertainAceessUrl_Ans>::Pointer ctx)
+	{
+		DbgToBeidou(ctx->link, __FUNCTION__)();
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(CenterSettingService_LogCode_GetCertainAceessUrl).setAPI(__FUNCTION__)(__FUNCTION__);
+		auto rc = m_pEntity->GetCertainAceessUrl(ctx->Req.reqName, ctx->Ans.CertainAceessUrl); //获取准入地址,这个接口是后面加的
+		ctx->Answer(rc);
+	}
+private:
+	CCenterSettingEntity* m_pEntity;
+};
+
+#endif /*RVC_MOD_CENTERSETTING_H__*/

+ 3 - 0
Module/mod_CenterSetting/test/testCenterSettingEntity.cpp

@@ -0,0 +1,3 @@
+
+#include "mod_centersetting.h"
+