|
|
@@ -160,6 +160,8 @@ class PreparePerfCalc {
|
|
|
$this->_updatePercent(80);
|
|
|
|
|
|
$t8 = microtime(true);
|
|
|
+ // 计算预计月业绩表的数据,这些数据用户不在前三期非月节点的数据.需要将此期新用户业绩统计一下
|
|
|
+ $this->loopCalcMonthPerfTableDataPrepare();
|
|
|
|
|
|
//本月业绩入库
|
|
|
$this->loopWriteMonthPerf();
|
|
|
@@ -789,11 +791,19 @@ class PreparePerfCalc {
|
|
|
if (!$this->_isCalcMonth) {
|
|
|
return true;
|
|
|
}
|
|
|
- // 正常计算的时候,维护业绩到prepare表中,预计计算月业绩的时候,只需要插入定时任务的结算那期的业绩即可.
|
|
|
- // 这里直接获取预计计算业绩单数据
|
|
|
+ // AR_PERF_ORDER_PREPARE\AR_PERF_PERIOD_PREPARE\AR_PERIOD_PREPARE\AR_PERF_MONTH_PREPARE
|
|
|
+ // AR_PERIOD_PREPARE 表只需要是结算月的数据
|
|
|
+ // AR_PERF_PERIOD_PREPARE 表特殊,需要增加一个字段,是否存在于前三期中
|
|
|
+ // `IS_HAS_USER` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否有此用户,默认为0没有此用户1为有
|
|
|
+ // 如果依旧是0则再次循环此月业绩的时候,需要再次处理'
|
|
|
+ //
|
|
|
+ // 月业绩由perfperiod表加上perfperiodprepare表之和,其中perfperiod表数据为此月非计算月的期业绩数据
|
|
|
+ // 先查询perfperiod表的数据,再查询perfperiodprepare这个表的数据.
|
|
|
+ // 如果查询到了perfperiodprepare的数据,则将此perfperiodprepare表的新增的是否统计到的字段标识为1.
|
|
|
+ // 最后再循环 perfperiodprepare 表中标识依旧为0的数据,再次循环.相当于这些数据是此结算月业绩期的新增用户
|
|
|
echo sprintf("时间:[%s]月业绩,当前offset为:【%s】" . PHP_EOL, date('Y-m-d H:i:s', time()) , $offset);
|
|
|
// 从缓存列表里面从底层往上倒序获取会员
|
|
|
- $allData = PerfPeriodPrepare::findUseDbCalc()
|
|
|
+ $allData = PerfPeriod::findUseDbCalc()
|
|
|
->select('USER_ID, SUM(FX_AMOUNT_CASH) AS FX_AMOUNT_CASH_SUM,SUM(PV_PCS) AS PV_PCS_SUM,
|
|
|
SUM(PV_PCS_FX) AS PV_PCS_FX_SUM,SUM(PV_PSS) AS PV_PSS_SUM,
|
|
|
SUM(PV_1L) AS PV_1L_SUM,SUM(PV_2L) AS PV_2L_SUM,
|
|
|
@@ -826,7 +836,43 @@ class PreparePerfCalc {
|
|
|
if( $this->_sysConfig['vipBonusGoldDecLevel']['VALUE'] && $userBaseInfo['DEC_LV'] === DeclarationLevel::JIN_ZUAN_LEVEL_ID ) {
|
|
|
$isVip = true;
|
|
|
}
|
|
|
-
|
|
|
+ // 查询perfperiodprepare表中数据,是否有此用户信息.因为是月提前结算,所以此结算期是只有一个数据
|
|
|
+ $monthPrepare = PerfPeriodPrepare::findUseDbCalc()
|
|
|
+ ->select('USER_ID, SUM(FX_AMOUNT_CASH) AS FX_AMOUNT_CASH_SUM,SUM(PV_PCS) AS PV_PCS_SUM,
|
|
|
+ SUM(PV_PCS_FX) AS PV_PCS_FX_SUM,SUM(PV_PSS) AS PV_PSS_SUM,
|
|
|
+ SUM(PV_1L) AS PV_1L_SUM,SUM(PV_2L) AS PV_2L_SUM,
|
|
|
+ SUM(PV_3L) AS PV_3L_SUM,SUM(PV_4L) AS PV_4L_SUM,
|
|
|
+ SUM(PV_5L) AS PV_5L_SUM,SUM(PV_1L_ZC) AS PV_1L_ZC_SUM,
|
|
|
+ SUM(PV_2L_ZC) AS PV_2L_ZC_SUM,SUM(PV_3L_ZC) AS PV_3L_ZC_SUM,
|
|
|
+ SUM(PV_4L_ZC) AS PV_4L_ZC_SUM,SUM(PV_5L_ZC) AS PV_5L_ZC_SUM')
|
|
|
+ ->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM ', [':USER_ID' => $userId, ':PERIOD_NUM' => $this->_periodNum])
|
|
|
+ ->asArray()
|
|
|
+ ->one();
|
|
|
+ if (!empty($monthPrepare)) {
|
|
|
+ // 如果前三期中,在此提前计算业绩期中有数据,则需要加上此用户信息
|
|
|
+ $everyData['FX_AMOUNT_CASH_SUM'] = $everyData['FX_AMOUNT_CASH_SUM'] + $monthPrepare['FX_AMOUNT_CASH_SUM'];
|
|
|
+ $everyData['PV_PCS_SUM'] = $everyData['PV_PCS_SUM'] + $monthPrepare['PV_PCS_SUM'];
|
|
|
+ $everyData['PV_PCS_FX_SUM'] = $everyData['PV_PCS_FX_SUM'] + $monthPrepare['PV_PCS_FX_SUM'];
|
|
|
+ $everyData['PV_PSS_SUM'] = $everyData['PV_PSS_SUM'] + $monthPrepare['PV_PSS_SUM'];
|
|
|
+ $everyData['PV_1L_SUM'] = $everyData['PV_1L_SUM'] + $monthPrepare['PV_1L_SUM'];
|
|
|
+ $everyData['PV_2L_SUM'] = $everyData['PV_2L_SUM'] + $monthPrepare['PV_2L_SUM'];
|
|
|
+ $everyData['PV_3L_SUM'] = $everyData['PV_3L_SUM'] + $monthPrepare['PV_3L_SUM'];
|
|
|
+ $everyData['PV_4L_SUM'] = $everyData['PV_4L_SUM'] + $monthPrepare['PV_4L_SUM'];
|
|
|
+ $everyData['PV_5L_SUM'] = $everyData['PV_5L_SUM'] + $monthPrepare['PV_5L_SUM'];
|
|
|
+ $everyData['PV_1L_ZC_SUM'] = $everyData['PV_1L_ZC_SUM'] + $monthPrepare['PV_1L_ZC_SUM'];
|
|
|
+ $everyData['PV_2L_ZC_SUM'] = $everyData['PV_2L_ZC_SUM'] + $monthPrepare['PV_2L_ZC_SUM'];
|
|
|
+ $everyData['PV_3L_ZC_SUM'] = $everyData['PV_3L_ZC_SUM'] + $monthPrepare['PV_3L_ZC_SUM'];
|
|
|
+ $everyData['PV_4L_ZC_SUM'] = $everyData['PV_4L_ZC_SUM'] + $monthPrepare['PV_4L_ZC_SUM'];
|
|
|
+ $everyData['PV_5L_ZC_SUM'] = $everyData['PV_5L_ZC_SUM'] + $monthPrepare['PV_5L_ZC_SUM'];
|
|
|
+ // 将用户的状态改成1,为存在此用户.当之后再次循环PerfPeriodPrepare的时候,不再循环此用户了.
|
|
|
+ PerfPeriodPrepare::updateAll(
|
|
|
+ [
|
|
|
+ 'IS_HAS_USER' => 1
|
|
|
+ ],
|
|
|
+ 'PERIOD_NUM=:PERIOD_NUM AND USER_ID=:USER_ID',
|
|
|
+ [':PERIOD_NUM' => $this->_periodNum, ':USER_ID' => $userId]
|
|
|
+ );
|
|
|
+ }
|
|
|
|
|
|
$nowMonthPerf = [
|
|
|
'USER_ID' => $userId,
|
|
|
@@ -870,6 +916,108 @@ class PreparePerfCalc {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 预计计算月业绩,当前三期没有此最新业绩单的用户
|
|
|
+ * 再次添加进去
|
|
|
+ * @param int $offset
|
|
|
+ * @return bool
|
|
|
+ * @throws Exception
|
|
|
+ * @throws \yii\db\Exception
|
|
|
+ */
|
|
|
+ public function loopCalcMonthPerfTableDataPrepare(int $offset = 0) {
|
|
|
+ if (!$this->_isCalcMonth) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 上面的计算月业绩,计算了前三期有的用户,此次只计算此结算周期未含有前三期业绩的用户
|
|
|
+
|
|
|
+ echo sprintf("时间:[%s]预计月业绩,结算月新添加的用户,当前offset为:【%s】" . PHP_EOL, date('Y-m-d H:i:s', time()) , $offset);
|
|
|
+ // 从缓存列表里面从底层往上倒序获取会员 IS_HAS_USER 0 代表是此结算周期新增的业绩
|
|
|
+ $allData = PerfPeriodPrepare::findUseDbCalc()
|
|
|
+ ->select('USER_ID, SUM(FX_AMOUNT_CASH) AS FX_AMOUNT_CASH_SUM,SUM(PV_PCS) AS PV_PCS_SUM,
|
|
|
+ SUM(PV_PCS_FX) AS PV_PCS_FX_SUM,SUM(PV_PSS) AS PV_PSS_SUM,
|
|
|
+ SUM(PV_1L) AS PV_1L_SUM,SUM(PV_2L) AS PV_2L_SUM,
|
|
|
+ SUM(PV_3L) AS PV_3L_SUM,SUM(PV_4L) AS PV_4L_SUM,
|
|
|
+ SUM(PV_5L) AS PV_5L_SUM,SUM(PV_1L_ZC) AS PV_1L_ZC_SUM,
|
|
|
+ SUM(PV_2L_ZC) AS PV_2L_ZC_SUM,SUM(PV_3L_ZC) AS PV_3L_ZC_SUM,
|
|
|
+ SUM(PV_4L_ZC) AS PV_4L_ZC_SUM,SUM(PV_5L_ZC) AS PV_5L_ZC_SUM')
|
|
|
+ ->where('CALC_MONTH=:CALC_MONTH AND IS_HAS_USER=:IS_HAS_USER', [':CALC_MONTH' => $this->_calcYearMonth,':IS_HAS_USER'=>0])
|
|
|
+ ->groupBy('USER_ID')
|
|
|
+ ->orderBy('USER_ID DESC')
|
|
|
+ ->offset($offset)
|
|
|
+ ->limit($this->_limit)
|
|
|
+ ->asArray()
|
|
|
+ ->all();
|
|
|
+ if ($allData) {
|
|
|
+ // 月度业绩表
|
|
|
+ foreach ($allData as $everyData) {
|
|
|
+ $userId = $everyData['USER_ID'];
|
|
|
+ //往期业绩
|
|
|
+ $userLastPerf = PrepareCalcCache::userPerf($userId, $this->_periodNum);
|
|
|
+ //本期业绩
|
|
|
+ $periodPerf = PrepareCalcCache::nowPeriodPerf($userId, $this->_periodNum);
|
|
|
+
|
|
|
+ $userBaseInfo = PrepareCalcCache::getUserInfo($userId, $this->_periodNum);
|
|
|
+ //级别必须为VIP
|
|
|
+ $isVip = false;
|
|
|
+ if( $userBaseInfo['DEC_LV'] === DeclarationLevel::VIP_LEVEL_ID ) {
|
|
|
+ $isVip= true;
|
|
|
+ }
|
|
|
+ if( $this->_sysConfig['vipBonusGoldDecLevel']['VALUE'] && $userBaseInfo['DEC_LV'] === DeclarationLevel::JIN_ZUAN_LEVEL_ID ) {
|
|
|
+ $isVip = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ $nowMonthPerf = [
|
|
|
+ 'USER_ID' => $userId,
|
|
|
+ 'FX_AMOUNT_CASH' => $everyData['FX_AMOUNT_CASH_SUM'],
|
|
|
+ 'PV_PCS' => $everyData['PV_PCS_SUM'],
|
|
|
+ 'PV_PCS_FX' => $everyData['PV_PCS_FX_SUM'],
|
|
|
+ 'PV_PSS' => $everyData['PV_PSS_SUM'],
|
|
|
+ 'PV_1L' => $everyData['PV_1L_SUM'],
|
|
|
+ 'PV_2L' => $everyData['PV_2L_SUM'],
|
|
|
+ 'PV_3L' => $everyData['PV_3L_SUM'],
|
|
|
+ 'PV_4L' => $everyData['PV_4L_SUM'],
|
|
|
+ 'PV_5L' => $everyData['PV_5L_SUM'],
|
|
|
+
|
|
|
+ //VIP统计相关业绩
|
|
|
+ 'VIP_PV_1L_ZC' => $isVip ? $everyData['PV_1L_ZC_SUM'] : 0,
|
|
|
+ 'VIP_PV_2L_ZC' => $isVip ? $everyData['PV_2L_ZC_SUM'] : 0,
|
|
|
+ 'VIP_PV_3L_ZC' => $isVip ? $everyData['PV_3L_ZC_SUM'] : 0,
|
|
|
+ 'VIP_PV_4L_ZC' => $isVip ? $everyData['PV_4L_ZC_SUM'] : 0,
|
|
|
+ 'VIP_PV_5L_ZC' => $isVip ? $everyData['PV_5L_ZC_SUM'] : 0,
|
|
|
+
|
|
|
+ //总数据,历史+本期。不能用上月加本月,因为上月可能没业绩,上上个月有业绩。
|
|
|
+ 'PV_1L_TOTAL' => $periodPerf['PV_1L'] + $userLastPerf['PV_1L'],
|
|
|
+ 'PV_2L_TOTAL' => $periodPerf['PV_2L'] + $userLastPerf['PV_2L'],
|
|
|
+ 'PV_3L_TOTAL' => $periodPerf['PV_3L'] + $userLastPerf['PV_3L'],
|
|
|
+ 'PV_4L_TOTAL' => $periodPerf['PV_4L'] + $userLastPerf['PV_4L'],
|
|
|
+ 'PV_5L_TOTAL' => $periodPerf['PV_5L'] + $userLastPerf['PV_5L'],
|
|
|
+ 'PV_PSS_TOTAL' => $periodPerf['PV_PSS'] + $userLastPerf['PV_PSS_TOTAL'],
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 把会员的月业绩写入缓存中,以便下面的奖金计算从缓冲中获取数据效率高
|
|
|
+ PrepareCalcCache::addHasMonthPerfUsers($userId, $this->_periodNum);
|
|
|
+ PrepareCalcCache::nowMonthPerf($userId, $this->_periodNum, $nowMonthPerf);
|
|
|
+ // 将用户的状态改成1,为存在此用户.当之后再次循环PerfPeriodPrepare的时候,不再循环此用户了.
|
|
|
+ PerfPeriodPrepare::updateAll(
|
|
|
+ [
|
|
|
+ 'IS_HAS_USER' => 1
|
|
|
+ ],
|
|
|
+ 'PERIOD_NUM=:PERIOD_NUM AND USER_ID=:USER_ID',
|
|
|
+ [':PERIOD_NUM' => $this->_periodNum, ':USER_ID' => $userId]
|
|
|
+ );
|
|
|
+
|
|
|
+
|
|
|
+ unset($userId, $everyData, $nowMonthPerf, $lastMonthData, $userBaseInfo, $isVip);
|
|
|
+ }
|
|
|
+ unset($allData);
|
|
|
+ $this->loopCalcMonthPerfTableDataPrepare($offset + $this->_limit);
|
|
|
+ }
|
|
|
+
|
|
|
+ unset($allData);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 循环有业绩会员,并入库
|
|
|
* @param int $offset
|