按2025年新的激励政策,修改了显示模式,同时支持上传么么哒数据

This commit is contained in:
lujiang 2025-01-22 16:08:52 +08:00
parent bddc05e3b9
commit 88a4cb449f
10 changed files with 413 additions and 9 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -99,7 +99,7 @@
//#define SMSCENTER_ADC_TEMP //临时第3平台不能发短信不结算清单只能登录查询余额
//#define SMSCENTER_DEMO //¸±Æ½Ì¨Ä£Ê½,Remote
#define SMSCENTER_DEMO //¸±Æ½Ì¨Ä£Ê½,Remote
//#define SMSCENTER_UPDATE //系统在升级维护