Files
mir_server/server/LogicServer/entitysystem/RebateSystem.cpp

1000 lines
36 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#include "StdAfx.h"
CRebateSystem::CRebateSystem()
{
m_RunningRebates.clear();
m_WaitingRebates.clear();
m_RunningSeq.clear();
m_WaitingSeq.clear();
m_SendNextDayAwardRebates.clear();
m_SendImmediatelyAwardRebates.clear();
m_ClearTimeOutRebates.clear();
}
CRebateSystem::~CRebateSystem()
{
}
bool CRebateSystem::Initialize(void *data,SIZE_T size)
{
PACTORDBDATA pActorData = (ACTORDBDATA *)data;
if(pActorData == NULL || size != sizeof(ACTORDBDATA))
{
OutputMsg(rmError,_T("data len error len=%d ,correct len=%d"),size, sizeof(ACTORDBDATA));
return false;
}
LoadFromDB();
return true;
}
void CRebateSystem::Destroy()
{
}
VOID CRebateSystem::OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader)
{
if(m_pEntity == NULL)
{
OutputMsg(rmError,_T("Rebate Data is Error..."));
return;
}
if ( nCmd == jxInterSrvComm::DbServerProto::dcLoadRebateData && nErrorCode == jxInterSrvComm::DbServerProto::reSucc )
{
//需要判断是否重复装载玩家的数据,避免出现装载复制
if(HasDbDataInit())
{
OutputMsg(rmError,_T("db return Rebate repeated,actorid=%u "),m_pEntity->GetProperty<unsigned int>(PROP_ENTITY_ID));
return;
}
m_SendImmediatelyAwardRebates.clear();
m_SendNextDayAwardRebates.clear();
m_ClearTimeOutRebates.clear();
CMiniDateTime nCurTime = GetGlobalLogicEngine()->getMiniDateTime();
std::map<int, RebateGroupInfo>& rebateGroupInfo = GetLogicServer()->GetDataProvider()->GetRebateProvider().GetRebateConfig();
int nCount = 0;
reader >> nCount;
RebateData rebateData;
// 用于判断 返利活动 是否已经发放 立即发放 奖励
bool isSendImmediatelyAward = true;
// 用于判断 返利活动 是否已经发放 次日发放 奖励
bool isSendNextDayAward = true;
std::string strStatus = "";
for(int i = 0; i < nCount; ++i)
{
isSendImmediatelyAward = true;
isSendNextDayAward = true;
strStatus.clear();
memset(&rebateData, 0, sizeof(rebateData));
reader.readBuf(&rebateData, sizeof(rebateData));
// OutputMsg(rmTip,"[Rebate] 返利活动加载(%d)活动Type=%d, 活动ID=%d !", i, rebateData.nActivityType, rebateData.nId);
// 单笔返利不存数据库,针对之前数据库中存有单笔返利记录的,修改
if ( rebateData.nId >= SingleRebateStartId && rebateData.nId < YBRebateStartId )
{
OutputMsg(rmError,"[Rebate] 数据库中 存在 单笔返利活动 BBBB ,活动ID=%d 玩家Id%d!",rebateData.nId, rebateData.nActorId);
continue;
}
strStatus = intToString( rebateData.nStatus );
// 清理 领取奖励后保存时间 超时的返利活动
if ( rebateData.nClearTime && nCurTime > rebateData.nClearTime )
{
m_ClearTimeOutRebates[rebateData.nId] = rebateData;
}
if ( rebateGroupInfo.find(rebateData.nId) != rebateGroupInfo.end() )
{
// 返利活动 期间
if ( nCurTime >= rebateData.nStartTime && nCurTime < rebateData.nEndTime )
{
// 判断数据库中的 返利活动数据 是否与配置表中的 返利活动数据一致
if ( rebateData.nTimeType == rebateGroupInfo[rebateData.nId].nTimeType && rebateData.nOfflineType == rebateGroupInfo[rebateData.nId].nOfflineType
&& rebateData.nAtonce == rebateGroupInfo[rebateData.nId].nAtonce && rebateData.nOverlay == rebateGroupInfo[rebateData.nId].nOverlay
&& m_RunningRebates.find(rebateData.nId) == m_RunningRebates.end() )
{
OutputMsg(rmError,"[Rebate] 数据库中的返利活动 加载到 运行列表 1111 ,活动ID=%d !",rebateData.nId);
m_RunningRebates[rebateData.nId] = rebateData;
m_RunningSeq.insert(&m_RunningRebates[rebateData.nId]);
}
}
// 发放 已结束、立即发放、不可叠加、未发放奖励 的返利活动
if ( nCurTime > rebateData.nEndTime && !rebateData.nOverlay && rebateData.nAtonce )
{
for (size_t i = 0; i < strStatus.length(); i++)
{
if ( strStatus[i] == '1' )
{
isSendImmediatelyAward = false;
}
}
// 未发放奖励
if ( !isSendImmediatelyAward )
{
m_SendImmediatelyAwardRebates[rebateData.nId] = rebateData;
}
}
// 返利活动 已经结束,且为循环类型
if ( nCurTime >= rebateData.nEndTime && rebateData.nTimeType == 3 && m_WaitingRebates.find(rebateData.nId) == m_WaitingRebates.end() )
{
if ( GetLogicServer()->GetDataProvider()->GetRebateProvider().UpdateOpenTime(GetGlobalLogicEngine()->GetGlobalNpcLua(), rebateGroupInfo[rebateData.nId]) && m_WaitingRebates.find(rebateData.nId) == m_WaitingRebates.end() )
{
OutputMsg(rmError,"[Rebate] 数据库中的返利活动 加载到 等待列表 2222 ,活动ID=%d !",rebateData.nId);
rebateData.nStartTime = rebateGroupInfo[rebateData.nId].nStartTime;
rebateData.nEndTime = rebateGroupInfo[rebateData.nId].nEndTime;
rebateData.nClearTime = 0;
rebateData.nYBValue = 0;
rebateData.nStatus = 0;
m_WaitingRebates[rebateData.nId] = rebateData;
m_WaitingSeq.insert(&m_WaitingRebates[rebateData.nId]);
}
}
}
}
// 清理过期的 返利活动
if ( m_ClearTimeOutRebates.size() )
{
ClearTimeOutRebates();
}
RebateGroupIterator iter = rebateGroupInfo.begin();
memset(&rebateData, 0, sizeof(rebateData));
for (; iter != rebateGroupInfo.end(); iter++)
{
// 返利活动 期间
if ( nCurTime > (*iter).second.nStartTime && nCurTime < (*iter).second.nEndTime )
{
if (m_RunningRebates.find((*iter).second.nId) == m_RunningRebates.end())
{
OutputMsg(rmError,"[Rebate] 配置中的返利活动 加载到 运行列表 3333 ,活动ID=%d !",(*iter).second.nId);
rebateData.nId = (*iter).second.nId;
rebateData.nTimeType = (*iter).second.nTimeType;
rebateData.nStartTime = (*iter).second.nStartTime;
rebateData.nEndTime = (*iter).second.nEndTime;
rebateData.nOfflineType = (*iter).second.nOfflineType;
rebateData.nAtonce = (*iter).second.nAtonce;
rebateData.nOverlay = (*iter).second.nOverlay;
rebateData.nActorId = m_pEntity->GetId();;
rebateData.nClearTime = 0;
rebateData.nYBValue = 0;
rebateData.nStatus = 0;
m_RunningRebates[rebateData.nId] = rebateData;
m_RunningSeq.insert(&m_RunningRebates[rebateData.nId]);
}
}
// 返利活动 未开始
if ( nCurTime <= (*iter).second.nStartTime && m_WaitingRebates.find((*iter).second.nId) == m_WaitingRebates.end() )
{
OutputMsg(rmError,"[Rebate] 配置中的返利活动 加载到 等待列表 EEEE ,活动ID=%d !",rebateData.nId);
rebateData.nId = (*iter).second.nId;
rebateData.nTimeType = (*iter).second.nTimeType;
rebateData.nOfflineType = (*iter).second.nOfflineType;
rebateData.nAtonce = (*iter).second.nAtonce;
rebateData.nOverlay = (*iter).second.nOverlay;
rebateData.nStartTime = (*iter).second.nStartTime;
rebateData.nEndTime = (*iter).second.nEndTime;
rebateData.nActorId = m_pEntity->GetId();;
rebateData.nClearTime = 0;
rebateData.nYBValue = 0;
rebateData.nStatus = 0;
m_WaitingRebates[rebateData.nId] = rebateData;
m_WaitingSeq.insert(&m_WaitingRebates[rebateData.nId]);
}
// 返利活动 已经结束,且为循环类型
if ( nCurTime >= (*iter).second.nEndTime && (*iter).second.nTimeType == 3 )
{
if ( GetLogicServer()->GetDataProvider()->GetRebateProvider().UpdateOpenTime(GetGlobalLogicEngine()->GetGlobalNpcLua(), (*iter).second) )
{
if (m_WaitingRebates.find((*iter).second.nId) == m_WaitingRebates.end())
{
OutputMsg(rmError,"[Rebate] 配置中的返利活动 加载到 等待列表 4444 ,活动ID=%d !",rebateData.nId);
rebateData.nId = (*iter).second.nId;
rebateData.nTimeType = (*iter).second.nTimeType;
rebateData.nOfflineType = (*iter).second.nOfflineType;
rebateData.nAtonce = (*iter).second.nAtonce;
rebateData.nOverlay = (*iter).second.nOverlay;
rebateData.nStartTime = (*iter).second.nStartTime;
rebateData.nEndTime = (*iter).second.nEndTime;
rebateData.nActorId = m_pEntity->GetId();;
rebateData.nClearTime = 0;
rebateData.nYBValue = 0;
rebateData.nStatus = 0;
m_WaitingRebates[rebateData.nId] = rebateData;
m_WaitingSeq.insert(&m_WaitingRebates[rebateData.nId]);
}
}
}
}
((CActor*)m_pEntity)->OnFinishOneInitStep(eMSG_USR_LOGIN_DATA_REBATE_SYSTEM);
// 跨天登录
if ( ((CActor*)m_pEntity)->GetNewDayArrive() > 0 )
{
CheckNextDayAward();
}
}
else if ( nCmd == jxInterSrvComm::DbServerProto::dcLoadNextDayRebateData && nErrorCode == jxInterSrvComm::DbServerProto::reSucc )
{
CMiniDateTime nCurTime = GetGlobalLogicEngine()->getMiniDateTime();
std::map<int, RebateGroupInfo>& rebateGroupInfo = GetLogicServer()->GetDataProvider()->GetRebateProvider().GetRebateConfig();
int nCount = 0;
reader >> nCount;
RebateData rebateData;
// 用于判断 返利活动 是否已经发放 次日发放 奖励
bool isSendNextDayAward = true;
std::string strStatus = "";
m_SendNextDayAwardRebates.clear();
for (int i = 0; i < nCount; i++)
{
isSendNextDayAward = true;
strStatus.clear();
memset(&rebateData, 0, sizeof(rebateData));
reader.readBuf(&rebateData, sizeof(rebateData));
strStatus = intToString( rebateData.nStatus );
if ( rebateGroupInfo.find(rebateData.nId) != rebateGroupInfo.end() )
{
// 发放 已经结束、次日发放、未发放奖励 的多日返利活动 或者 次日发放、未发放奖励 的单日返利活动,
if ( (rebateData.nOfflineType == eRebateOfflineType_OneDayRecharge || rebateData.nOfflineType == eRebateOfflineType_OneDayConsume)
|| ( (rebateData.nOfflineType == eRebateOfflineType_DaysRecharge || rebateData.nOfflineType == eRebateOfflineType_DaysConsume) && nCurTime > rebateData.nEndTime )
&& !nCurTime.isSameDay(rebateData.nEndTime) && !rebateData.nAtonce )
{
for (size_t i = 0; i < strStatus.length(); i++)
{
if ( strStatus[i] == '1' )
{
isSendNextDayAward = false;
}
}
// 未发放奖励
if ( !isSendNextDayAward )
{
m_SendNextDayAwardRebates[rebateData.nId] = rebateData;
}
}
}
}
// 发放 已经结束、次日发放、未发放奖励 的多日返利活动 或者 次日发放、未发放奖励 的单日返利活动,
if ( m_SendNextDayAwardRebates.size() )
{
SendNextDayAward();
}
ClearOneDayRechargeAndOneDayConsumeYBNum();
}
}
VOID CRebateSystem::OnTimeCheck(TICKCOUNT nTickCount)
{
if (!m_pEntity || m_pEntity->GetType() != enActor)
{
return;
}
int nCount = 0;
// 运行中的活动
CMiniDateTime nCurTime = GetGlobalLogicEngine()->getMiniDateTime();
RebateSetIterator runIter = m_RunningSeq.begin();
std::map<int, RebateGroupInfo>& rebateGroupInfo = GetLogicServer()->GetDataProvider()->GetRebateProvider().GetRebateConfig();
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
std::map<int, RebateData> tempRebateData;
for ( ; runIter != m_RunningSeq.end(); )
{
nCount++;
if ( 1000 == nCount )
{
OutputMsg(rmError,"[Rebate] 运行中的返利活动 循环有误 DDDD ,当前循环次数=%d !", nCount);
break;
}
// 判断指针
if ( !(*runIter) )
{
OutputMsg(rmError,"[Rebate] 运行中的返利活动 HHHH (*runIter) 指针非法 !");
break;
}
if ( (*runIter)->nEndTime != 0 && nCurTime > (*runIter)->nEndTime )
{
if(rebateGroupInfo.find((*runIter)->nId) != rebateGroupInfo.end())
{
bool result = GetLogicServer()->GetDataProvider()->GetRebateProvider().UpdateOpenTime(GetGlobalLogicEngine()->GetGlobalNpcLua(), rebateGroupInfo[(*runIter)->nId] );
if (result && m_WaitingRebates.find((*runIter)->nId) == m_WaitingRebates.end() )
{
OutputMsg(rmError,"[Rebate] 运行中的返利活动 加载到 等待列表 5555 ,活动ID=%d !",(*runIter)->nId);
RebateData &rebateData = m_WaitingRebates[(*runIter)->nId];
rebateData.nActorId = (*runIter)->nActorId;
rebateData.nId = (*runIter)->nId;
rebateData.nTimeType = (*runIter)->nTimeType;
rebateData.nOfflineType = (*runIter)->nOfflineType;
rebateData.nAtonce = (*runIter)->nAtonce;
rebateData.nOverlay = (*runIter)->nOverlay;
rebateData.nStartTime = rebateGroupInfo[(*runIter)->nId].nStartTime;
rebateData.nEndTime = rebateGroupInfo[(*runIter)->nId].nEndTime;
rebateData.nClearTime = 0;
rebateData.nYBValue = 0;
rebateData.nStatus = 0;
m_WaitingSeq.insert(&m_WaitingRebates[rebateData.nId]);
}
// 已经结束 不可叠加、立即发放,且玩家在线
int nStatus = 0;
char sContent[1024];
if ( !(*runIter)->nOverlay && (*runIter)->nAtonce && pDbClient->connected() )
{
nStatus = 0;
tempRebateData.clear();
std::string strStatus = intToString( (*runIter)->nStatus );
for (int i = strStatus.length() - 1; i >= 0; i--)
{
if ( strStatus[i] == '1' )
{
if (rebateGroupInfo[(*runIter)->nId].RebatesInfo.find( strStatus.length() - i ) != rebateGroupInfo[(*runIter)->nId].RebatesInfo.end())
{
memset(&sContent, 0, sizeof(sContent));
sprintf(sContent, rebateGroupInfo[(*runIter)->nId].RebatesInfo[strStatus.length() - i].sContent, rebateGroupInfo[(*runIter)->nId].RebatesInfo[strStatus.length() - i].nPay);
CVector<ACTORAWARD> awardlist;
for(int j = 0; (j < rebateGroupInfo[(*runIter)->nId].RebatesInfo[strStatus.length() - i].vecAwardList.size()) && (j < MAILATTACHCOUNT); j++) {
ACTORAWARD actorAward = rebateGroupInfo[(*runIter)->nId].RebatesInfo[strStatus.length() - i].vecAwardList[j];
if (actorAward.wId == 0) {
continue;
}
actorAward.wCount = actorAward.wCount;
awardlist.add(actorAward);
}
CMailSystem::SendMailByAward((*runIter)->nActorId, rebateGroupInfo[(*runIter)->nId].RebatesInfo[strStatus.length() - i].sTitle, sContent, awardlist);
}
nStatus = 2 * pow(10, i);
RebateData &temp = tempRebateData[(*runIter)->nId];
temp.nActorId = (*runIter)->nActorId;
temp.nId = (*runIter)->nId;
temp.nTimeType = (*runIter)->nTimeType;
temp.nStartTime = (*runIter)->nStartTime;
temp.nEndTime = (*runIter)->nEndTime;
temp.nOfflineType = (*runIter)->nOfflineType;
temp.nAtonce = (*runIter)->nAtonce;
temp.nOverlay = (*runIter)->nOverlay;
temp.nYBValue = (*runIter)->nYBValue;
temp.nStatus = nStatus;
temp.nClearTime = (*runIter)->nEndTime.today() + REBATEDATASAVETIME;
continue;
}
}
//更新数据库
CDataPacket& dataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcUpdateRebateData);
dataPacket << m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
dataPacket << (unsigned int)m_pEntity->GetId();
dataPacket << (unsigned int)tempRebateData.size();
// 更新数据库中 已经结束、次日发放、(可叠加 或 不可叠加)返利活动的 状态码
for ( RebateMapIterator iter = tempRebateData.begin(); iter != tempRebateData.end(); iter++ )
{
dataPacket << (*iter).second.nId << (*iter).second.nTimeType << (*iter).second.nStartTime << (*iter).second.nEndTime
<< (*iter).second.nClearTime << (*iter).second.nOfflineType << (*iter).second.nAtonce << (*iter).second.nOverlay << (*iter).second.nYBValue << (*iter).second.nStatus;
}
GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
}
}
OutputMsg(rmTip, "[Rebate] 运行中的返利活动,被释放 8888 活动ID=%d !", (*runIter)->nId);
m_RunningRebates.erase(m_RunningRebates.find((*runIter)->nId));
runIter = m_RunningSeq.erase(runIter);
}
else
{
runIter++;
}
}
nCount = 0;
// 等待中的活动
RebateSetIterator waitIter = m_WaitingSeq.begin();
for ( ; waitIter != m_WaitingSeq.end(); )
{
nCount++;
if ( 1000 == nCount )
{
OutputMsg(rmError,"[Rebate] 等待中的返利活动 循环有误 CCCC ,当前循环次数=%d !", nCount);
break;
}
// 判断指针
if ( !(*waitIter) )
{
OutputMsg(rmError,"[Rebate] 运行中的返利活动 JJJJ (*waitIter) 指针非法 !");
break;
}
if ( nCurTime >= (*waitIter)->nStartTime && nCurTime <= (*waitIter)->nEndTime)
{
if ( m_RunningRebates.find((*waitIter)->nId) != m_RunningRebates.end() )
{
OutputMsg(rmError,"[Rebate] 等待中的循环活动却在运行列表中活动ID=%d !",(*waitIter)->nId);
m_WaitingRebates.erase(m_WaitingRebates.find((*waitIter)->nId));
waitIter = m_WaitingSeq.erase(waitIter);
continue;
}
OutputMsg(rmTip, "[Rebate] 等待中的返利活动,加载到 运行列表中 6666 活动ID=%d !", (*waitIter)->nId);
m_RunningRebates[(*waitIter)->nId] = *(*waitIter);
m_RunningSeq.insert(&m_RunningRebates[(*waitIter)->nId]);
// 删除
OutputMsg(rmTip, "[Rebate] 等待中的返利活动,被释放 7777 活动ID=%d !", (*waitIter)->nId);
m_WaitingRebates.erase(m_WaitingRebates.find((*waitIter)->nId));
waitIter = m_WaitingSeq.erase(waitIter);
}
else
{
waitIter++;
}
}
}
void CRebateSystem::OnEnterGame()
{
}
void CRebateSystem::LoadFromDB()
{
if(!m_pEntity)
{
return;
}
if (((CActor*)m_pEntity)->OnGetIsTestSimulator())
{
return;
}
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if (pDbClient->connected())
{
CDataPacket& DataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcLoadRebateData);
DataPacket << m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
DataPacket << (unsigned int)m_pEntity->GetId();
GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
}
}
void CRebateSystem::SaveToDB()
{
}
void CRebateSystem::OnEnterScene()
{
}
void CRebateSystem::UpdateRebateData(int nYBValue, int nType)
{
if(!m_pEntity) return;
if (nYBValue < 0)
{
nYBValue = abs(nYBValue);
}
// 验证参数
if ( nYBValue == 0 || (nType >= eRebateYBChangeType_MAX || nType <= eRebateYBChangeType_MIN) )
{
return;
}
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if ( !pDbClient->connected() || !m_RunningRebates.size() )
{
OutputMsg(rmNormal, _T("m_RunningRebates.size() : %d"), m_RunningRebates.size());
return;
}
std::map<int, RebateGroupInfo>& rebateGroupInfo = GetLogicServer()->GetDataProvider()->GetRebateProvider().GetRebateConfig();
// 用于判断当前 返利活动是否存在可领取奖励
// int nIndex = 0;
std::map<int, RebateData> SaveRebates;
SaveRebates.clear();
for (RebateSetIterator iter = m_RunningSeq.begin(); iter != m_RunningSeq.end(); )
{
// 判断指针
if ( !(*iter) )
{
OutputMsg(rmTip, "[Rebate] 运行的返利活动 FFFF (*iter) 指针非法 !");
break;
}
if ( rebateGroupInfo.find((*iter)->nId) == rebateGroupInfo.end() )
{
OutputMsg(rmTip, "[Rebate] 运行的返利活动,被释放 9999 活动ID=%d !", (*iter)->nId);
m_RunningRebates.erase(m_RunningRebates.find((*iter)->nId));
iter = m_RunningSeq.erase(iter);
continue;
}
else
{
/*
* nOfflineType
* 1.eRebateOfflineType_OneDayRecharge
* 2.eRebateOfflineType_DaysRecharge
* 3.eRebateOfflineType_OneDayConsume
* 4.eRebateOfflineType_DaysConsume
*/
if ( nType == eRebateYBChangeType_Recharge && ( (*iter)->nOfflineType == eRebateOfflineType_OneDayConsume || (*iter)->nOfflineType == eRebateOfflineType_DaysConsume ) )
{
iter++;
continue;
} else if( nType == eRebateYBChangeType_Consume && ( (*iter)->nOfflineType == eRebateOfflineType_OneDayRecharge || (*iter)->nOfflineType == eRebateOfflineType_DaysRecharge ) )
{
iter++;
continue;
}
// 线下返利、元宝返利 增加对应活动的元宝值
if ( (*iter)->nId < SingleRebateStartId || (*iter)->nId >= YBRebateStartId )
{
(*iter)->nYBValue += nYBValue;
} else {
(*iter)->nYBValue = nYBValue;
}
char sContent[1024];
std::string strStatus = intToString( (*iter)->nStatus );
for (RebateIterator iterator = rebateGroupInfo[(*iter)->nId].RebatesInfo.begin(); iterator != rebateGroupInfo[(*iter)->nId].RebatesInfo.end(); iterator++)
{
strStatus = strStatus + '0';
if ( (*iter)->nId < YBRebateStartId)
{
// 线下返利
if ( (*iter)->nId < SingleRebateStartId && (*iter)->nYBValue < (*iterator).second.nPay )
{
continue;
}
// 单笔返利
if ( (*iter)->nId >= SingleRebateStartId && nYBValue != (*iterator).second.nPay )
{
continue;
}
}
else
{
// 元宝返利
if ( (*iter)->nYBValue < (*iterator).second.nMinPay )
{
continue;
}
}
if ( (*iter)->nId >= SingleRebateStartId && (*iter)->nId < YBRebateStartId )
{
OutputMsg(rmTip, "[Rebate] 玩家 %s 已完成 %d 元宝单笔返利", ((CEntity*)m_pEntity)->GetEntityName(), (*iterator).second.nPay);
}
/*
* nOverlay
* 0
* 1
*/
if ( (*iter)->nOverlay || ( (*iter)->nId >= SingleRebateStartId && (*iter)->nId < YBRebateStartId ) ) // 单笔返利 默认不可叠加,立刻发放
{
// 单笔返利 不检查领取状态(可以通过邮件记录查看 是否已发放奖励)
if ( ( (*iter)->nId < SingleRebateStartId || (*iter)->nId >= YBRebateStartId ) && ( (*iterator).second.nIndex > strStatus.length() - 1 || strStatus[(*iterator).second.nIndex - 1] == '2') )
{
continue;
}
if ( strStatus[(*iterator).second.nIndex - 1] == '0' )
{
// 线下返利、单笔返利 立刻发放
if ( (*iter)->nAtonce )
{
// 发放奖励
memset(&sContent, 0, sizeof(sContent));
sprintf(sContent, rebateGroupInfo[(*iter)->nId].RebatesInfo[(*iterator).second.nIndex].sContent, rebateGroupInfo[(*iter)->nId].RebatesInfo[(*iterator).second.nIndex].nPay);
CVector<ACTORAWARD> awardlist;
for(int j = 0; (j < (*iterator).second.vecAwardList.size()) && (j < MAILATTACHCOUNT); j++) {
ACTORAWARD actorAward = (*iterator).second.vecAwardList[j];
if (actorAward.wId == 0) {
continue;
}
actorAward.wCount = actorAward.wCount;
awardlist.add(actorAward);
}
CMailSystem::SendMailByAward((*iter)->nActorId, (*iterator).second.sTitle, sContent, awardlist);
if ( (*iter)->nId >= SingleRebateStartId && (*iter)->nId < YBRebateStartId )
{
OutputMsg(rmTip, "[Rebate] 玩家 %s 已完成 %d 元宝单笔返利 邮件已发送", ((CEntity*)m_pEntity)->GetEntityName(), rebateGroupInfo[(*iter)->nId].RebatesInfo[(*iterator).second.nIndex].nPay);
}
// 更新线下返利、元宝返利 领取状态(单笔返利不存储领取状态,可以通过邮件查看是否已发放奖励)
if ( (*iter)->nId < SingleRebateStartId || (*iter)->nId >= YBRebateStartId )
{
(*iter)->nStatus += 2*pow(10, (*iterator).second.nIndex - 1);
}
if ( !(*iter)->nClearTime )
{
(*iter)->nClearTime = (*iter)->nEndTime.rel_today() + REBATEDATASAVETIME;
}
} else // 线下返利、单笔返利、元宝返利 次日发放
{
// 更新线下返利、元宝返利 领取状态(单笔返利不存储领取状态,可以通过邮件查看是否已发放奖励)
if ( (*iter)->nId < SingleRebateStartId || (*iter)->nId >= YBRebateStartId )
{
(*iter)->nStatus += pow(10, (*iterator).second.nIndex - 1);
}
}
}
}
else
{
m_RunningRebates[(*iter)->nId].nStatus = pow(10, (*iterator).second.nIndex - 1);
}
}
// 单笔返利暂不存数据库
if ( !( (*iter)->nId >= SingleRebateStartId && (*iter)->nId < YBRebateStartId ) )
{
SaveRebates[(*iter)->nId] = m_RunningRebates[(*iter)->nId];
}
iter++;
}
}
// 保存到数据库
if ( !SaveRebates.size() )
{
return;
}
CDataPacket& dataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcSaveRebateData);
dataPacket << m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
dataPacket << (unsigned int)m_pEntity->GetId();
dataPacket << (unsigned int)SaveRebates.size();
for (RebateMapIterator iter = SaveRebates.begin(); iter != SaveRebates.end(); iter++)
{
dataPacket << (*iter).second.nId << (*iter).second.nTimeType << (*iter).second.nStartTime << (*iter).second.nEndTime
<< (*iter).second.nClearTime << (*iter).second.nOfflineType << (*iter).second.nAtonce << (*iter).second.nOverlay << (*iter).second.nYBValue << (*iter).second.nStatus;
}
GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
}
void CRebateSystem::ClearOneDayRechargeAndOneDayConsumeYBNum()
{
if(!m_pEntity) return;
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if ( !pDbClient->connected() || !m_RunningRebates.size() )
{
return;
}
std::map<int, RebateGroupInfo>& rebateGroupInfo = GetLogicServer()->GetDataProvider()->GetRebateProvider().GetRebateConfig();
CMiniDateTime nCurTime = GetGlobalLogicEngine()->getMiniDateTime();
std::map<int, RebateData> SaveRebates;
SaveRebates.clear();
for (RebateSetIterator iter = m_RunningSeq.begin(); iter != m_RunningSeq.end(); )
{
// 判断指针
if ( !(*iter) )
{
OutputMsg(rmTip, "[Rebate] 运行的返利活动 GGGG (*iter) 指针非法 !");
break;
}
if ( rebateGroupInfo.find((*iter)->nId) == rebateGroupInfo.end() )
{
OutputMsg(rmTip, "[Rebate] 运行的返利活动,被释放 AAAA 活动ID=%d !", (*iter)->nId);
m_RunningRebates.erase(m_RunningRebates.find((*iter)->nId));
iter = m_RunningSeq.erase(iter);
continue;
}
else
{
if ( ((*iter)->nOfflineType == eRebateOfflineType_OneDayRecharge || (*iter)->nOfflineType == eRebateOfflineType_OneDayConsume)
&& !nCurTime.isSameDay((*iter)->nStartTime) && (*iter)->nYBValue && (*iter)->nStatus )
{
m_RunningRebates[(*iter)->nId].nClearTime = 0;
m_RunningRebates[(*iter)->nId].nYBValue = 0;
m_RunningRebates[(*iter)->nId].nStatus = 0;
SaveRebates[(*iter)->nId] = m_RunningRebates[(*iter)->nId];
}
iter++;
}
}
// 保存到数据库
if ( !SaveRebates.size() )
{
return;
}
CDataPacket& dataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcSaveRebateData);
dataPacket << m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
dataPacket << (unsigned int)m_pEntity->GetId();
dataPacket << (unsigned int)SaveRebates.size();
for (RebateMapIterator iter = SaveRebates.begin(); iter != SaveRebates.end(); iter++)
{
dataPacket << (*iter).second.nId << (*iter).second.nTimeType << (*iter).second.nStartTime << (*iter).second.nEndTime
<< (*iter).second.nClearTime << (*iter).second.nOfflineType << (*iter).second.nAtonce << (*iter).second.nOverlay << (*iter).second.nYBValue << (*iter).second.nStatus;
}
GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
}
void CRebateSystem::SendNextDayAward()
{
if(!m_pEntity) return;
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if (pDbClient->connected() && m_SendNextDayAwardRebates.size() )
{
std::map<int, RebateGroupInfo>& rebateGroupInfo = GetLogicServer()->GetDataProvider()->GetRebateProvider().GetRebateConfig();
char sContent[1024];
int nStatus = 0;
for ( RebateMapIterator iter = m_SendNextDayAwardRebates.begin(); iter!= m_SendNextDayAwardRebates.end(); iter++ )
{
nStatus = 0;
std::string strStatus = intToString( (*iter).second.nStatus );
for (int i = strStatus.length() - 1; i >= 0; i--)
{
if ( strStatus[i] == '1' )
{
if ( rebateGroupInfo.find( (*iter).second.nId ) != rebateGroupInfo.end() && rebateGroupInfo[(*iter).second.nId].RebatesInfo.find( strStatus.length() - i ) != rebateGroupInfo[(*iter).second.nId].RebatesInfo.end() )
{
memset(&sContent, 0, sizeof(sContent));
sprintf(sContent, rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].sContent, rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].nPay);
CVector<ACTORAWARD> awardlist;
if ( (*iter).second.nId < YBRebateStartId)
{
sprintf(sContent, rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].sContent, rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].nPay);
for(int j = 0; (j < rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].vecAwardList.size()) && (j < MAILATTACHCOUNT); j++) {
ACTORAWARD actorAward = rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].vecAwardList[j];
if (actorAward.wId == 0) {
continue;
}
awardlist.add(actorAward);
}
}
else
{
// 元宝返利
sprintf(sContent, rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].sContent, (*iter).second.nYBValue);
ACTORAWARD actorAward;
actorAward.btType = 4;
actorAward.wId = 4;
actorAward.wCount = (int)( (*iter).second.nYBValue * (rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].nRebatePercentage / 10000.0));
awardlist.add(actorAward);
}
CMailSystem::SendMailByAward((*iter).second.nActorId, rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].sTitle, sContent, awardlist);
if ( (*iter).second.nOverlay )
{
nStatus += 2*pow(10, i);
} else
{
nStatus = 2*pow(10, i);
}
}
}
}
// 更新 次日发放、(可叠加 或 不可叠加)返利活动的 状态码
if ( nStatus )
{
if ( m_RunningRebates.find((*iter).second.nId) != m_RunningRebates.end() )
{
m_RunningRebates[(*iter).second.nId].nStatus = nStatus;
m_RunningRebates[(*iter).second.nId].nClearTime = (*iter).second.nEndTime.today() + REBATEDATASAVETIME;
}
(*iter).second.nStatus = nStatus;
(*iter).second.nClearTime = (*iter).second.nEndTime.today() + REBATEDATASAVETIME;
}
}
CDataPacket& dataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcUpdateRebateData);
dataPacket << m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
dataPacket << (unsigned int)m_pEntity->GetId();
dataPacket << (unsigned int)m_SendNextDayAwardRebates.size();
// 更新数据库中 次日发放、(可叠加 或 不可叠加)返利活动的 状态码
for ( RebateMapIterator iter = m_SendNextDayAwardRebates.begin(); iter!= m_SendNextDayAwardRebates.end(); iter++ )
{
dataPacket << (*iter).second.nId << (*iter).second.nTimeType << (*iter).second.nStartTime << (*iter).second.nEndTime
<< (*iter).second.nClearTime << (*iter).second.nOfflineType << (*iter).second.nAtonce << (*iter).second.nOverlay << (*iter).second.nYBValue << (*iter).second.nStatus;
}
GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
m_SendNextDayAwardRebates.clear();
}
}
void CRebateSystem::CheckNextDayAward()
{
if(!m_pEntity) return;
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if (pDbClient->connected())
{
CDataPacket& DataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcLoadNextDayRebateData);
DataPacket << m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
DataPacket << (unsigned int)m_pEntity->GetId();
DataPacket << (int)0;//struct RebateData : nAtonce // 0次日发放1立刻发放奖励
GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
}
}
void CRebateSystem::SendAward()
{
if(!m_pEntity || !m_pEntity->IsInited()) return;
// 发放 已结束、立即发放、未发放奖励 的返利活动
if ( m_SendImmediatelyAwardRebates.size() )
{
SendImmediatelyAward();
}
}
void CRebateSystem::SendImmediatelyAward()
{
if(!m_pEntity) return;
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if ( pDbClient->connected() )
{
std::map<int, RebateGroupInfo>& rebateGroupInfo = GetLogicServer()->GetDataProvider()->GetRebateProvider().GetRebateConfig();
char sContent[1024];
int nStatus = 0;
for ( RebateMapIterator iter = m_SendImmediatelyAwardRebates.begin(); iter!= m_SendImmediatelyAwardRebates.end(); iter++ )
{
nStatus = 0;
std::string strStatus = intToString( (*iter).second.nStatus );
for (int i = strStatus.length() - 1; i >= 0; i++)
{
if ( strStatus[i] == '1' )
{
if ( rebateGroupInfo.find( (*iter).second.nId ) != rebateGroupInfo.end() && rebateGroupInfo[(*iter).second.nId].RebatesInfo.find( strStatus.length() - i ) != rebateGroupInfo[(*iter).second.nId].RebatesInfo.end() )
{
memset(&sContent, 0, sizeof(sContent));
sprintf(sContent, rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].sContent, rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].nPay);
CVector<ACTORAWARD> awardlist;
for(int j = 0; (j < rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].vecAwardList.size()) && (j < MAILATTACHCOUNT); j++) {
ACTORAWARD actorAward = rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].vecAwardList[j];
if (actorAward.wId == 0) {
continue;
}
actorAward.wCount = actorAward.wCount;
awardlist.add(actorAward);
}
CMailSystem::SendMailByAward((*iter).second.nActorId, rebateGroupInfo[(*iter).second.nId].RebatesInfo[strStatus.length() - i].sTitle, sContent, awardlist);
if ( (*iter).second.nOverlay )
{
nStatus += 2*pow(10, i);
} else
{
nStatus = 2*pow(10, i);
}
}
}
}
// 更新 已经结束、不可叠加、立即发放 返利活动的 状态码
if ( nStatus )
{
(*iter).second.nStatus = nStatus;
(*iter).second.nClearTime = (*iter).second.nEndTime.today() + REBATEDATASAVETIME;
}
}
CDataPacket& dataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcUpdateRebateData);
dataPacket << m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
dataPacket << (unsigned int)m_pEntity->GetId();
dataPacket << (unsigned int)m_SendImmediatelyAwardRebates.size();
// 更新数据库中 已经结束、次日发放、(可叠加 或 不可叠加)返利活动的 状态码
for ( RebateMapIterator iter = m_SendImmediatelyAwardRebates.begin(); iter!= m_SendImmediatelyAwardRebates.end(); iter++ )
{
dataPacket << (*iter).second.nId << (*iter).second.nTimeType << (*iter).second.nStartTime << (*iter).second.nEndTime
<< (*iter).second.nClearTime << (*iter).second.nOfflineType << (*iter).second.nAtonce << (*iter).second.nOverlay << (*iter).second.nYBValue << (*iter).second.nStatus;
}
GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
m_SendImmediatelyAwardRebates.clear();
}
}
void CRebateSystem::ClearTimeOutRebates()
{
if(!m_pEntity) return;
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if ( pDbClient->connected() )
{
CDataPacket& dataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcClearRebateData);
dataPacket << m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
dataPacket << (unsigned int)m_pEntity->GetId();
dataPacket << (unsigned int)m_ClearTimeOutRebates.size();
for ( RebateMapIterator iter = m_ClearTimeOutRebates.begin(); iter!= m_ClearTimeOutRebates.end(); iter++ )
{
OutputMsg(rmTip, " ClearTimeOutRebates 玩家 %s活动Id : %d, 活动结束时间 %d, 活动清理时间 %d", ((CEntity*)m_pEntity)->GetEntityName(), (*iter).second.nId, (int)(*iter).second.nEndTime, (int)(*iter).second.nClearTime);
dataPacket << (*iter).second.nId << (*iter).second.nTimeType << (*iter).second.nStartTime << (*iter).second.nEndTime
<< (*iter).second.nClearTime << (*iter).second.nOfflineType << (*iter).second.nAtonce << (*iter).second.nOverlay << (*iter).second.nYBValue << (*iter).second.nStatus;
}
GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
m_ClearTimeOutRebates.clear();
}
}