diff --git a/Debug_Unicode/SmsCenter.exe b/Debug_Unicode/SmsCenter.exe index ea59feb..91f5569 100644 Binary files a/Debug_Unicode/SmsCenter.exe and b/Debug_Unicode/SmsCenter.exe differ diff --git a/Debug_Unicode/SmsCenter.tlog/CL.command.1.tlog b/Debug_Unicode/SmsCenter.tlog/CL.command.1.tlog index 1ab656a..ad2a707 100644 Binary files a/Debug_Unicode/SmsCenter.tlog/CL.command.1.tlog and b/Debug_Unicode/SmsCenter.tlog/CL.command.1.tlog differ diff --git a/Debug_Unicode/SmsCenter.tlog/CL.read.1.tlog b/Debug_Unicode/SmsCenter.tlog/CL.read.1.tlog index 2ffa37e..b5c47ed 100644 Binary files a/Debug_Unicode/SmsCenter.tlog/CL.read.1.tlog and b/Debug_Unicode/SmsCenter.tlog/CL.read.1.tlog differ diff --git a/Debug_Unicode/SmsCenter.tlog/CL.write.1.tlog b/Debug_Unicode/SmsCenter.tlog/CL.write.1.tlog index d8c951d..187a026 100644 Binary files a/Debug_Unicode/SmsCenter.tlog/CL.write.1.tlog and b/Debug_Unicode/SmsCenter.tlog/CL.write.1.tlog differ diff --git a/Debug_Unicode/SmsCenterW.dat b/Debug_Unicode/SmsCenterW.dat index fff7a46..d2a1ca5 100644 Binary files a/Debug_Unicode/SmsCenterW.dat and b/Debug_Unicode/SmsCenterW.dat differ diff --git a/Debug_Unicode/vc143.idb b/Debug_Unicode/vc143.idb index 50ce880..835eca0 100644 Binary files a/Debug_Unicode/vc143.idb and b/Debug_Unicode/vc143.idb differ diff --git a/ProcessSocket.cpp b/ProcessSocket.cpp index 68f5780..c1d5904 100644 --- a/ProcessSocket.cpp +++ b/ProcessSocket.cpp @@ -1406,9 +1406,12 @@ try case SMSFUNC_GZMSG_JL_PARA: //取激励参数 lRet = Process_GZMsg_JL_Para((REQ_GZMsg_JL_PARA*)pFrame); break; - case SMSFUNC_GZMSG_JL: //取手机号码地归属数据 + case SMSFUNC_GZMSG_JL: //查询激励结果 lRet = Process_GZMsg_JL((REQ_GZMsg_JL*)pFrame); break; + case SMSFUNC_GZMSG_JL_MMDCOUNT: //激励中的么么哒数据处理 + lRet = Process_GZMsg_JL_MMDCount((REQ_GZMsg_JL_MMDCount*)pFrame); + break; case SMSFUNC_CORP_USERMODIFY2: //修改企业用户 lRet = Process_Corp_UserModify2((REQ_Corp_UserModify2*)pFrame); diff --git a/ProcessSocket.h b/ProcessSocket.h index 69a37d9..acd82d9 100644 --- a/ProcessSocket.h +++ b/ProcessSocket.h @@ -123,6 +123,7 @@ public: long Process_GZMsg_JL_GetYZKH(CAdoRecordSet *pAdoRSP1, CAdoRecordSet *pAdoRSP2, CAdoRecordSet *pAdoRSP3, long lYWYID, long lYear, long lMon, double & fTotalYZ, long & lTotalKH); long Process_GZMsg_JL_Para(REQ_GZMsg_JL_PARA* pPara); long Process_GZMsg_JL(REQ_GZMsg_JL* pJL); + long Process_GZMsg_JL_MMDCount(REQ_GZMsg_JL_MMDCount* pReq); long Process_GAddress_Place(REQ_GAddress_Place* pPlace); long Process_YWY_Analyse(REQ_YWY_Analyse * pAnalyse); long Process_Corp_Analyse(REQ_Corp_Analyse * pAnalyse); diff --git a/ProcessSocket2.cpp b/ProcessSocket2.cpp index 868630e..5d46240 100644 --- a/ProcessSocket2.cpp +++ b/ProcessSocket2.cpp @@ -25622,6 +25622,324 @@ long CProcessSocket::Process_GZMsg_JL(REQ_GZMsg_JL *pJL) bConnectOtherSql = false; } } + + //2025年新的激励规则 + if (pJL->lType == 0) //月度冠军,计算 + { + + long lMaxPara = 512; + long lYWYIndex = 0; + ANS_GZMsg_JL_Data* pYWYData = new ANS_GZMsg_JL_Data[lMaxPara]; + memset((BYTE*)pYWYData, 0, sizeof(ANS_GZMsg_JL_Data) * lMaxPara); + + strSelect = _T("select * from YWY_Group where Name like '%市场%' order by Name desc"); + m_AdoRS.Open(strSelect); + while (!m_AdoRS.IsEOF()) + { + long lYWYID = 0; + CString strGroupName; + m_AdoRS.GetCollect(_T("GroupID"), lYWYID); + m_AdoRS.GetCollect(_T("Name"), strGroupName); + strSelect.Format(_T("select * from YWY where groupID=%d and GZ_JBRW>0 order by YWYID"), lYWYID); + m_AdoRS2.Open(strSelect); + while (!m_AdoRS2.IsEOF()) + { + long lYWYID = 0; + CString strYWYName; + //取前半年平均业绩与平均客户数 + m_AdoRS2.GetCollect(_T("YWYID"), lYWYID); + m_AdoRS2.GetCollect(_T("Name"), strYWYName); + m_AdoRS2.GetCollect(_T("MMDCount"), pYWYData[lYWYIndex].lMMDCount); //读取么么哒计数 + pYWYData[lYWYIndex].lYWYID = lYWYID; + _tcscpy(pYWYData[lYWYIndex].szGroupName, strGroupName); + _tcscpy(pYWYData[lYWYIndex].szYWYName, strYWYName); + + //取客户经理当月的业绩。 + //先从工资表中取业绩 + double fYZ = 0.0f; + double fKH = 0.0f; + strSelect.Format(_T("select * from YWY_GZJS where YWYID=%d and GZ_Mon='%04d.%02d.01'"), lYWYID, lYear, lMon); + if (m_AdoRS3.Open(strSelect) && !m_AdoRS3.IsEOF()) + { + long lMMDCount = 0; + m_AdoRS3.GetCollect(_T("GZ_TotalYZ"), fYZ); + m_AdoRS3.GetCollect(_T("GZ_NEWSL"), fKH); + m_AdoRS3.GetCollect(_T("MMDCount"), lMMDCount); + pYWYData[lYWYIndex].lMMDCount = lMMDCount; + } + //当月工资为0的,从充值记录中读取 + if (fYZ == 0.0f && bConnectOtherSql) + { + long lKH = 0; + Process_GZMsg_JL_GetYZKH(&m_AdoRS3, &AdoRS2, &AdoRS3, lYWYID, lYear, lMon, fYZ, lKH); + fKH = (float)lKH; + pYWYData[lYWYIndex].bUnconfirmed = true; + } + //计算A、B值及总数。 + float fA = 0.0f; + float fB = 0.0f; + if (fYZ != 0.0f) + { + fA = fYZ / 160000.0f * 90.0f; + } + if (pYWYData[lYWYIndex].lMMDCount > 0) + { + fB = pYWYData[lYWYIndex].lMMDCount / 8.0f * 10.0f; + } + pYWYData[lYWYIndex].tMon1.wYear = lYear; + pYWYData[lYWYIndex].tMon1.wMonth = lMon; + pYWYData[lYWYIndex].fYZ1 = fYZ; + pYWYData[lYWYIndex].fKH1 = fKH; + pYWYData[lYWYIndex].fA1 = fA; + pYWYData[lYWYIndex].fB1 = fB; + pYWYData[lYWYIndex].fT1 = fA + fB; + pYWYData[lYWYIndex].fAvg = pYWYData[lYWYIndex].fT1; + + + lYWYIndex++; + m_AdoRS2.MoveNext(); + } + m_AdoRS.MoveNext(); + } + + + long lSize = sizeof(ANS_GZMsg_JL) + sizeof(ANS_GZMsg_JL_Data) * lYWYIndex; + BYTE* pDataSend = new BYTE[lSize]; + memset(pDataSend, 0, lSize); + + ANS_GZMsg_JL* pRetJL = (ANS_GZMsg_JL*)pDataSend; + ANS_GZMsg_JL_Data* pJLData = (ANS_GZMsg_JL_Data*)(pDataSend + sizeof(ANS_GZMsg_JL)); + + pRetJL->bOK = true; + pRetJL->lType = pJL->lType; //评比类型 + _tcscpy(pRetJL->szMon, pJL->szMon); //评比月份 + pRetJL->lPK1 = pJL->lPK1; //挑战者 + pRetJL->lPK2 = pJL->lPK2; //被挑战者 + pRetJL->lPKRatio = pJL->lPKRatio; //比例 + pRetJL->lCount = lYWYIndex; + + memcpy(pJLData, pYWYData, sizeof(ANS_GZMsg_JL_Data) * lYWYIndex); + + // 使用 std::sort 对数组排序 + std::sort(pJLData, pJLData + lYWYIndex, [](const ANS_GZMsg_JL_Data& a, const ANS_GZMsg_JL_Data& b) { + return a.fAvg > b.fAvg; // 倒序排列 + }); + + + delete pYWYData; + + SendFrame(SMSFUNC_GZMSG_JL, (BYTE*)pDataSend, lSize); //发送返回 + } + + + if (pJL->lType == 1) //PK计算 + { + + long lSize = sizeof(ANS_GZMsg_JL) + sizeof(ANS_GZMsg_JL_Data2); + BYTE* pDataSend = new BYTE[lSize]; + memset(pDataSend, 0, lSize); + + ANS_GZMsg_JL* pRetJL = (ANS_GZMsg_JL*)pDataSend; + ANS_GZMsg_JL_Data2* pJLData = (ANS_GZMsg_JL_Data2*)(pDataSend + sizeof(ANS_GZMsg_JL)); + + pRetJL->bOK = true; + pRetJL->lType = pJL->lType; //评比类型 + _tcscpy(pRetJL->szMon, pJL->szMon); //评比月份 + pRetJL->lPK1 = pJL->lPK1; //挑战者 + pRetJL->lPK2 = pJL->lPK2; //应战者 + pRetJL->lPKRatio = pJL->lPKRatio; //比例 + pRetJL->lCount = 0; + + //循环,取2个PK者的业绩 + for (int b = 0; b < 2; b++) + { + double fAvgScore = 0.0f; + double fAvgYZ = 0.0f; + double fAvgMMDCount = 0.0f; + long lYWYCount = 0; + BOOL bUnconfirmed = false; //未确认业绩 + + long lGetYWYID = pJL->lPK1; + if (b > 0) lGetYWYID = pJL->lPK2; + CString strPKName; + if (lGetYWYID >= 500000) //用户组 + { + //取用户组名称 + strSelect.Format(_T("select * from YWY_Group where groupID=%d "), lGetYWYID - 500000); + if (m_AdoRS2.Open(strSelect) && !m_AdoRS2.IsEOF()) + { + //m_AdoRS2.GetCollect(_T("Name"), strPKName); + m_AdoRS2.GetCollect(_T("BZ"), strPKName); + } + + //分别取PK者业绩与么么哒数量 + strSelect.Format(_T("select * from YWY where Branch='%s' and GZ_JBRW>0 order by YWYID"), strPKName); + m_AdoRS2.Open(strSelect); + double fTotalScore = 0.0f; + double fTotalYZ = 0.0f; + long lTotalMMDCount = 0; + while (!m_AdoRS2.IsEOF()) + { + long lYWYID = 0; + long lMMDCount = 0; + CString strName; + m_AdoRS2.GetCollect(_T("YWYID"), lYWYID); + m_AdoRS2.GetCollect(_T("Name"), strName); + m_AdoRS2.GetCollect(_T("MMDCount"), lMMDCount); + if (lYWYCount == 0) + strPKName = strPKName + CString(_T("(")) + strName; + else + strPKName = strPKName + CString(_T(",")) + strName; + + double fYZ = 0.0f; + double fKH = 0.0f; + strSelect.Format(_T("select * from YWY_GZJS where YWYID=%d and GZ_Mon='%04d.%02d.01'"), lYWYID, lYear, lMon); + if (m_AdoRS3.Open(strSelect) && !m_AdoRS3.IsEOF()) + { + m_AdoRS3.GetCollect(_T("GZ_TotalYZ"), fYZ); + m_AdoRS3.GetCollect(_T("GZ_NEWSL"), fKH); + m_AdoRS3.GetCollect(_T("MMDCount"), lMMDCount); + } + if (fYZ == 0.0f && bConnectOtherSql) //当月工资为0的,从充值记录中读取 + { + long lKH = 0; + Process_GZMsg_JL_GetYZKH(&m_AdoRS3, &AdoRS2, &AdoRS3, lYWYID, lYear, lMon, fYZ, lKH); + fKH = (float)lKH; + bUnconfirmed = true; + } + //计算A、B值及总数。 + float fA = 0.0f; + float fB = 0.0f; + if (fYZ != 0.0f) + { + fA = fYZ / 160000.0f * 90.0f; + } + if (lMMDCount > 0) + { + fB = lMMDCount / 8.0f * 10.0f; + } + fTotalScore = fTotalScore + fA + fB; //所有选手的总分 + lTotalMMDCount = lTotalMMDCount + lMMDCount; + fTotalYZ = fTotalYZ + fYZ; + + lYWYCount++; + m_AdoRS2.MoveNext(); + } + strPKName = strPKName + CString(_T(")")); + if (fTotalScore > 0 && lYWYCount > 0) + { + fAvgScore = fTotalScore / (float)lYWYCount; + } + if (fTotalYZ > 0 && lYWYCount > 0) + { + fAvgYZ = fTotalYZ / (float)lYWYCount; + } + if (lTotalMMDCount > 0 && lYWYCount > 0) + { + fAvgMMDCount = (float)lTotalMMDCount / (float)lYWYCount; + } + //if (fYZPre3 > 0 && lYWYCount > 0) fYZPre3 = fYZPre3 / (float)lYWYCount; + //if (fYZNow > 0 && lYWYCount > 0) fYZNow = fYZNow / (float)lYWYCount; + } + else + { + //单独用户 + //取用户组名称 + long lMMDCount = 0; + strSelect.Format(_T("select * from YWY where YWYID=%d "), lGetYWYID); + if (m_AdoRS2.Open(strSelect) && !m_AdoRS2.IsEOF()) + { + m_AdoRS2.GetCollect(_T("Name"), strPKName); + m_AdoRS2.GetCollect(_T("MMDCount"), lMMDCount); + } + strSelect.Format(_T("select * from YWY_GZJS where YWYID=%d and GZ_Mon='%04d.%02d.01'"), lGetYWYID, lYear, lMon); + fAvgYZ = 0.0f; + double fAvegKH = 0.0f; + if (m_AdoRS3.Open(strSelect) && !m_AdoRS3.IsEOF()) + { + m_AdoRS3.GetCollect(_T("GZ_TotalYZ"), fAvgYZ); + m_AdoRS3.GetCollect(_T("GZ_NEWSL"), fAvegKH); + m_AdoRS3.GetCollect(_T("MMDCount"), lMMDCount); + } + if (fAvgYZ == 0.0f && bConnectOtherSql) //当月工资为0的,从充值记录中读取 + { + long lKH = 0; + Process_GZMsg_JL_GetYZKH(&m_AdoRS3, &AdoRS2, &AdoRS3, lGetYWYID, lYear, lMon, fAvgYZ, lKH); + fAvegKH = (float)lKH; + } + //计算A、B值及总数。 + float fA = 0.0f; + float fB = 0.0f; + if (fAvgYZ != 0.0f) + { + fA = fAvgYZ / 160000.0f * 90.0f; + } + if (lMMDCount > 0) + { + fB = lMMDCount / 8.0f * 10.0f; + } + fAvgScore = fA + fB; //计算总分 + lYWYCount = 1; + fAvgMMDCount = lMMDCount; + } + + if (b == 0) //挑战者业绩 + { + _tcscpy(pJLData->szPK1, strPKName); //战队名称 + pJLData->fPK1Pre3 = fAvgYZ; //平均业绩 + pJLData->fPK1Now = fAvgScore; //平均分数 + pJLData->fPK1YWYCount = lYWYCount; //战队队员数量 + pJLData->fPK1MMDCount = fAvgMMDCount; //平均么么哒数量 + pJLData->bPK1Unconfirmed = bUnconfirmed; //含未确认业绩 + } + if (b == 1) //被挑战者业绩 + { + _tcscpy(pJLData->szPK2, strPKName); //战队名称 + pJLData->fPK2Pre3 = fAvgYZ; //平均业绩 + pJLData->fPK2Now = fAvgScore; //平均分数 + pJLData->fPK2YWYCount = lYWYCount;//战队队员数量 + pJLData->fPK2MMDCount = fAvgMMDCount;//平均么么哒数量 + pJLData->bPK2Unconfirmed = bUnconfirmed; + } + } + //当月业绩+挑战比例 + pJLData->fAddRatio = 0.02f; + switch (pJL->lPKRatio) + { + case 1: + pJLData->fAddRatio = 0.05f; + break; + case 2: + pJLData->fAddRatio = 0.08f; + break; + } + + if (pJLData->fPK1Now > 0.0f && pJLData->fPK2Now > 0.0f) //分数 + { + if ((pJLData->fPK1Now - pJLData->fPK2Now) / pJLData->fPK1Now >= pJLData->fAddRatio) + { + pJLData->bWin = true; + } + //分数差 + pJLData->fWin1Score = pJLData->fPK1Now - pJLData->fPK2Now / (1.0f - pJLData->fAddRatio); + pJLData->fWin2Score = pJLData->fPK2Now - pJLData->fPK1Now * (1.0f - pJLData->fAddRatio); + + //将分数差换算成业绩 + pJLData->fWin1YZ = pJLData->fWin1Score * (160000.0f / 90.0f) * pJLData->fPK1YWYCount; + pJLData->fWin2YZ = pJLData->fWin2Score * (160000.0f / 90.0f) * pJLData->fPK2YWYCount; + + //将分数差换算成么么哒数量 + pJLData->fWin1MMDCount = pJLData->fWin1Score * (8.0f / 10.0f) * pJLData->fPK1YWYCount; + pJLData->fWin2MMDCount = pJLData->fWin2Score * (8.0f / 10.0f) * pJLData->fPK2YWYCount; + } + + SendFrame(SMSFUNC_GZMSG_JL, (BYTE*)pDataSend, lSize); //发送返回 + } + + + + //以下为2024年之前的旧激励规则 + /* if (pJL->lType == 0) //月度冠军,计算 { @@ -25702,12 +26020,6 @@ long CProcessSocket::Process_GZMsg_JL(REQ_GZMsg_JL *pJL) { fA1 = (fYZ - fAvegYZ) / fAvegYZ * 100.0f; } - /* - if (fAvegKH>=1 && fYZ > 0) - { - fB1 = (fKH - fAvegKH) / fAvegKH * 20.0f; - } - */ fB1 = 0; //暂时取消B值 if (j == 0) @@ -25955,7 +26267,7 @@ long CProcessSocket::Process_GZMsg_JL(REQ_GZMsg_JL *pJL) SendFrame(SMSFUNC_GZMSG_JL, (BYTE*)pDataSend, lSize); //发送返回 } - +*/ return 1; } catch (...) @@ -25968,6 +26280,94 @@ long CProcessSocket::Process_GZMsg_JL(REQ_GZMsg_JL *pJL) +long CProcessSocket::Process_GZMsg_JL_MMDCount(REQ_GZMsg_JL_MMDCount* pReq) +{ + try + { + ANS_GZMsg_JL_MMDCount* pRetTemp = new ANS_GZMsg_JL_MMDCount; + memset((BYTE*)pRetTemp, 0, sizeof(ANS_GZMsg_JL_MMDCount)); + + pRetTemp->lErrCode = 0; + pRetTemp->lType = pReq->lType; + _tcscpy(pRetTemp->szMon, pReq->szMon); + + CString str; + if (!(m_ulPurview & PURVIEW_LIST)) //没有取清单的权限不能继续 + { + pRetTemp->lErrCode = -1; + _tcscpy(pRetTemp->szErrMsg, _T("权限不足")); + SendFrame(SMSFUNC_GZMSG_JL_MMDCOUNT, (BYTE*)pRetTemp, sizeof(ANS_GZMsg_JL_MMDCount)); //发送返回 + return 1; + } + + //取请求数据 + ANS_GZMsg_JL_MMDCount_Data* pReqData = (ANS_GZMsg_JL_MMDCount_Data*)(((BYTE*)pReq) + sizeof(REQ_GZMsg_JL_MMDCount)); + //生成临时保存数据 + long lMaxYWY = 128; + long lYWYCount = 0; + ANS_GZMsg_JL_MMDCount_Data * pYWYData = new ANS_GZMsg_JL_MMDCount_Data[lMaxYWY]; + memset((BYTE*)pYWYData, 0, sizeof(ANS_GZMsg_JL_MMDCount_Data) * lMaxYWY); + + //生成日期 + CString strMon = pReq->szMon; + long lYear = _ttol(strMon.Left(4)); + long lMon = _ttol(strMon.Mid(5, 2)); + long lDay = 1; + CString strGZMon; + strGZMon.Format(_T("%04d%02d%02d"), lYear, lMon, lDay); + //保存么么哒数据 + for (int i = 0; i < pReq->lCount && i < lMaxYWY; i++) + { + str.Format(_T("select * from YWY where Name='%s'"), pReqData[i].szYWYName); //根据客户经理名称取ID + if (m_AdoRS.Open(str) && !m_AdoRS.IsEOF()) + { + long lYWYID = 0; + m_AdoRS.GetCollect(_T("YWYID"), lYWYID); + + //更新客户经理表中的么么哒数据 + str.Format(_T("update YWY set MMDCount=%d where YWYID=%d"), pReqData[i].lMMDCount, lYWYID); + m_AdoRS.Open(str); + + //更新工资表中的么么哒数据 + str.Format(_T("update YWY_GZJS set MMDCount=%d where YWYID=%d and GZ_Mon='%s'"), pReqData[i].lMMDCount, lYWYID, strGZMon); + m_AdoRS.Open(str); + + pYWYData[lYWYCount] = pReqData[i]; + lYWYCount++; + } + } + + + pRetTemp->lCount = lYWYCount; //返回的记录数 + long lSize = sizeof(ANS_GZMsg_JL_MMDCount) + sizeof(ANS_GZMsg_JL_MMDCount_Data) * lYWYCount; + BYTE* pDataRet = new BYTE[lSize]; + memset(pDataRet, 0, lSize); + + ANS_GZMsg_JL_MMDCount* pRet = (ANS_GZMsg_JL_MMDCount*)pDataRet; + ANS_GZMsg_JL_MMDCount_Data* pRetData = (ANS_GZMsg_JL_MMDCount_Data*)(((BYTE*)pDataRet) + sizeof(ANS_GZMsg_JL_MMDCount)); + + *pRet = *pRetTemp; //复制返回数据 + delete pRetTemp; //临时返回数据,删除 + + //复制返回数据 + memcpy((BYTE*)pRetData, (BYTE*)pYWYData, sizeof(ANS_GZMsg_JL_MMDCount_Data) * lYWYCount); + delete[] pYWYData; //临时返回数据,删除 + + + SendFrame(SMSFUNC_GZMSG_JL_MMDCOUNT, (BYTE*)pDataRet, lSize); //发送返回 + + + return 1; + } + catch (...) + { + LOG_APPERROR(_T("T")); + return 0; + } + return 0; +} + + long CProcessSocket::Process_GZMsg_JL_GetYZKH(CAdoRecordSet *pAdoRSP1, CAdoRecordSet *pAdoRSP2, CAdoRecordSet *pAdoRSP3, long lYWYID, long lYear, long lMon, double & fTotalYZ, long & lTotalKH) { CString str; diff --git a/StdAfx.h b/StdAfx.h index 306c787..d5e2e08 100644 --- a/StdAfx.h +++ b/StdAfx.h @@ -99,7 +99,7 @@ //#define SMSCENTER_ADC_TEMP //ʱ3ƽ̨ܷţ嵥ֻܵ¼ѯ -//#define SMSCENTER_DEMO //ƽ̨ģʽ,Remote +#define SMSCENTER_DEMO //ƽ̨ģʽ,Remote //#define SMSCENTER_UPDATE //ϵͳά