|
|
@@ -23,6 +23,7 @@ use common\models\PerfPeriod;
|
|
|
use common\models\EmployLevel;
|
|
|
use common\models\UserBonus;
|
|
|
use common\models\UserPerfMonthUpdate;
|
|
|
+use common\models\UserPerformance;
|
|
|
use common\models\UserPeriodPoints;
|
|
|
use common\models\UserInfo;
|
|
|
use common\models\UserPerf;
|
|
|
@@ -188,71 +189,23 @@ class BonusSend extends BaseObject {
|
|
|
// 初始化
|
|
|
$this->initTask();
|
|
|
echo('挂网开始');
|
|
|
- $this->putFakeOrder();
|
|
|
- // 先把有remainPv的订单处理一下,将remainPv加入到remain_pv及流水表
|
|
|
- echo('处理当期REMAIN PV ' . date('Y-m-d H:i:s', time()) . PHP_EOL);
|
|
|
- $this->_calcRemainPv();
|
|
|
- $t2 = microtime(true);
|
|
|
- echo('初始化完成,当前期数【' . $this->_periodNum . '】,耗时:' . round($t2 - $t1, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
+
|
|
|
// 改变状态
|
|
|
$this->setSendStatus('start');
|
|
|
- $t3 = microtime(true);
|
|
|
- echo('改变状态完成,耗时:' . round($t3 - $t2, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
- $this->_updatePercent(20);
|
|
|
- //Yii::$app->db->close();
|
|
|
- //Yii::$app->dbShop->close();
|
|
|
- // 更新StarDirectory
|
|
|
- $this->updateEmpLevel();
|
|
|
- $this->_updatePercent(40);
|
|
|
- $t4 = microtime(true);
|
|
|
- echo('更新聘级完成,耗时:' . round($t4 - $t3, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
|
|
|
- // 更新StarCrown
|
|
|
- $this->updateCrownLevel();
|
|
|
- $this->_updatePercent(50);
|
|
|
- $t41 = microtime(true);
|
|
|
- echo('更新星级完成,耗时:' . round($t41 - $t4, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
+ // 发放荣衔级别(Honor/Emp)、Elite级别
|
|
|
+ $this->sendMemberLevel();
|
|
|
+ $this->_updatePercent(30);
|
|
|
+ $t2 = microtime(true);
|
|
|
+ echo('更新会员级别完成,耗时:' . round($t2 - $t1, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
|
|
|
// 发放奖金
|
|
|
$this->sendBonusLoop();
|
|
|
- $this->_updatePercent(60);
|
|
|
- $t5 = microtime(true);
|
|
|
- echo('发放奖金完成,耗时:' . round($t5 - $t4, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
- // 更新会员上次报单级别
|
|
|
-// $this->updateUserDevLv();
|
|
|
-// $this->_updatePercent(80);
|
|
|
- $t6 = microtime(true);
|
|
|
-// echo('更新会员上次报单级别完成,耗时:' . round($t6 - $t5, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
- // 更新会员累计业绩
|
|
|
- $this->updateUserPerf();
|
|
|
$this->_updatePercent(80);
|
|
|
- $t7 = microtime(true);
|
|
|
- echo('更新会员累计业绩完成,耗时:' . round($t7 - $t6, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
-
|
|
|
- $this->updateUserPerfMonth();
|
|
|
- $this->_updatePercent(90);
|
|
|
- $t8 = microtime(true);
|
|
|
- echo('更新会员累计月业绩完成,耗时:' . round($t8 - $t7, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
-
|
|
|
- // 更新活跃用户状态,更新为已处理
|
|
|
- // $this->updateActiveUser();
|
|
|
- // $this->_updatePercent(95);
|
|
|
- // $t9 = microtime(true);
|
|
|
- // echo('更新会员累计月业绩完成,耗时:' . round($t9 - $t8, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
+ $t3 = microtime(true);
|
|
|
+ echo('发放奖金完成,耗时:' . round($t3 - $t2, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
|
|
|
|
|
|
- // 开启子进程去完成下面的循环发放和循环改聘级和循环更新累计业绩
|
|
|
- /*$process = new Process('sendBonus', 3);
|
|
|
- $process->run(function($workId, $pmid){
|
|
|
- $this->processStep($workId);
|
|
|
- });
|
|
|
- while (true){
|
|
|
- if($process->isFinish()) break;
|
|
|
- }
|
|
|
- unset($process);
|
|
|
- $this->_updatePercent(90);
|
|
|
- $t4 = microtime(true);
|
|
|
- echo('所有子进程的任务完成,耗时:'.round($t4 - $t3, 3).',内存使用:'.(round(memory_get_usage()/1024/1024, 3)).'MB'.PHP_EOL);*/
|
|
|
- echo('全部奖金发放完成,耗时:'.round($t7 - $t1, 3).',内存使用:'.(round(memory_get_usage()/1024/1024, 3)).'MB'.PHP_EOL);
|
|
|
+ echo('全部奖金发放完成,耗时:'.round($t3 - $t1, 3).',内存使用:'.(round(memory_get_usage()/1024/1024, 3)).'MB'.PHP_EOL);
|
|
|
$this->_updatePercent(100);
|
|
|
} catch (\Exception $e) {
|
|
|
LoggerTool::error('sendBonus' . sprintf('File【%s】, Line【%s】, Msg【%s】', $e->getFile(), $e->getLine(), $e->getMessage()));
|
|
|
@@ -262,59 +215,8 @@ class BonusSend extends BaseObject {
|
|
|
if (count($this->_errors) > 0) {
|
|
|
return false;
|
|
|
}
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 处理order表中有remain_pv的订单
|
|
|
- * 将结果写入到remainPv相关表中
|
|
|
- *
|
|
|
- */
|
|
|
- private function _calcRemainPv(){
|
|
|
- $sysConfig = Cache::getSystemConfig();
|
|
|
- $mesureUpCondition = $sysConfig['monthPcsPvFxCondition']['VALUE']; // 月达标条件 NG默认30
|
|
|
- $orders = Order::find()->where('PERIOD_NUM=:PERIOD_NUM AND REMAIN_PV>0 AND IS_DELETE=0',[':PERIOD_NUM'=>$this->_periodNum])->asArray()->all();
|
|
|
- foreach($orders as $order){
|
|
|
- $oRemainPv = RemainPv::find()->where(['USER_ID' => $order['USER_ID']])->one();
|
|
|
- $myRemainPv = $oRemainPv?$oRemainPv['REMAIN_PV']:0;
|
|
|
- $transactionRemain = \Yii::$app->db->beginTransaction();
|
|
|
- try{
|
|
|
- $flowRemainPvModel = new FlowRemainPv();
|
|
|
- $flowRemainPvModel->ID = $this->_generateSn();
|
|
|
- $flowRemainPvModel->USER_ID = $order['USER_ID'];
|
|
|
- $flowRemainPvModel->REMAIN_PV_FLOW = $order['REMAIN_PV'];
|
|
|
- $flowRemainPvModel->REMAIN_PV_TOTAL = $myRemainPv + $order['REMAIN_PV'];
|
|
|
- $flowRemainPvModel->PERIOD_NUM = $this->_periodNum;
|
|
|
- $flowRemainPvModel->UPDATED_AT = Date::nowTime();
|
|
|
- $flowRemainPvModel->ORDER_SN = $order['SN'];
|
|
|
- if(!$flowRemainPvModel->save()){
|
|
|
- $this->addErrors($flowRemainPvModel->getErrors());
|
|
|
- return false;
|
|
|
- }
|
|
|
|
|
|
- $oRemainPv = RemainPv::find()->where(['USER_ID' => $order['USER_ID']])->one();
|
|
|
- if($oRemainPv){
|
|
|
- $oRemainPv->updateCounters(['REMAIN_PV'=>$order['REMAIN_PV']]);
|
|
|
- }else{
|
|
|
- $remainPvModel = new RemainPv();
|
|
|
- $remainPvModel->ID = $this->_generateSn();
|
|
|
- $remainPvModel->USER_ID = $order['USER_ID'];
|
|
|
- $remainPvModel->UPDATED_AT = Date::nowTime();
|
|
|
- $remainPvModel->REMAIN_PV = $order['REMAIN_PV'];
|
|
|
- $remainPvModel->STATUS = 1;
|
|
|
- if(!$remainPvModel->save()){
|
|
|
- $this->addErrors($remainPvModel->getErrors());
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- $transactionRemain->commit();
|
|
|
- } catch (Exception $e) {
|
|
|
- $transactionRemain->rollBack();
|
|
|
- $this->addError('add', $e->getMessage());
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -404,133 +306,44 @@ class BonusSend extends BaseObject {
|
|
|
* @return bool
|
|
|
* @throws \yii\db\Exception
|
|
|
*/
|
|
|
- public function sendBonusLoop($page=1) {
|
|
|
+ public function sendBonusLoop($page = 1) {
|
|
|
echo sprintf("时间:[%s]数据库发奖,当前page为:【%s】" . PHP_EOL, date('Y-m-d H:i:s', time()), $page);
|
|
|
$periodNum = $this->_periodNum;
|
|
|
// 从奖金结算表中获取当期未发放的所有数据
|
|
|
-// $allData = CalcBonus::findUseDbCalc()
|
|
|
$allData = CalcBonus::find()
|
|
|
- ->yearMonth($this->_calcYearMonth)
|
|
|
- ->where(
|
|
|
- '(IS_SENT=0 OR IS_SENT=2) AND CALC_MONTH=:CALC_MONTH AND PERIOD_NUM=:PERIOD_NUM',
|
|
|
- [':CALC_MONTH' => $this->_calcYearMonth, ':PERIOD_NUM' => $periodNum]
|
|
|
- )
|
|
|
- ->limit($this->_limit)
|
|
|
- ->asArray()
|
|
|
- ->all();
|
|
|
+ ->yearMonth($this->_calcYearMonth)
|
|
|
+ ->select('ID, USER_ID, BONUS_REAL, BONUS_TOTAL, MANAGE_TAX, ')
|
|
|
+ ->where('(IS_SENT=0 OR IS_SENT=2) AND CALC_MONTH=:CALC_MONTH AND PERIOD_NUM=:PERIOD_NUM',
|
|
|
+ [':CALC_MONTH' => $this->_calcYearMonth, ':PERIOD_NUM' => $this->_periodNum]
|
|
|
+ )
|
|
|
+ ->limit($this->_limit)
|
|
|
+ ->asArray()
|
|
|
+ ->all();
|
|
|
+
|
|
|
if ($allData) {
|
|
|
$transaction = Yii::$app->db->beginTransaction();
|
|
|
try {
|
|
|
foreach ($allData as $key => $data) {
|
|
|
- // 期奖金
|
|
|
-// $periodAmount = $data['BONUS_QY'] + $data['BONUS_YC'] + $data['BONUS_XF'] + $data['BONUS_BD'] + $data['BONUS_TG'] + $data['BONUS_YJ'] + $data['BONUS_GX'] + $data['BONUS_GL'];
|
|
|
- $periodAmount = $data['BONUS_REAL'];
|
|
|
- // 获取本期结算的管理员
|
|
|
-// $period = Period::findOneAsArray(['PERIOD_NUM'=>$periodNum]);
|
|
|
-// $updateAminId = $period['CALC_ADMIN_ID'];
|
|
|
- if ($periodAmount > 0) {
|
|
|
- Balance::changeUserBonus($data['USER_ID'], 'bonus', $periodAmount, [
|
|
|
- 'CALC_ID' => $data['ID'],
|
|
|
- 'REMARK' => 'From Period ' . $periodNum,
|
|
|
- 'PERIOD_NUM' => $periodNum,
|
|
|
- 'QY' => $data['BONUS_QY'],
|
|
|
- 'FW' => $data['BONUS_FW'],
|
|
|
- 'YC' => $data['BONUS_YC'],
|
|
|
- 'VIP' => $data['BONUS_VIP'],
|
|
|
- 'BD' => $data['BONUS_BD'],
|
|
|
- 'TG' => $data['BONUS_TG'],
|
|
|
- 'YJ' => $data['BONUS_YJ'],
|
|
|
- 'GX' => $data['BONUS_GX'],
|
|
|
- 'GL' => $data['BONUS_GL'],
|
|
|
- 'BS' => $data['BONUS_BS'],
|
|
|
- 'BS_MNT' => $data['BONUS_BS_MNT'],
|
|
|
- 'BS_ABBR' => $data['BONUS_BS_ABBR'],
|
|
|
-
|
|
|
- 'ORI_QY' => $data['ORI_BONUS_QY'],
|
|
|
- 'ORI_YC' => $data['ORI_BONUS_YC'],
|
|
|
- 'ORI_VIP' => $data['ORI_BONUS_VIP'],
|
|
|
- 'ORI_STANDARD' => $data['ORI_BONUS_STANDARD'],
|
|
|
- 'ORI_BD' => $data['ORI_BONUS_BD'],
|
|
|
- 'ORI_TG' => $data['ORI_BONUS_TG'],
|
|
|
- 'ORI_YJ' => $data['ORI_BONUS_YJ'],
|
|
|
- 'ORI_GX' => $data['ORI_BONUS_GX'],
|
|
|
- 'ORI_GL' => $data['ORI_BONUS_GL'],
|
|
|
- 'ORI_BS' => $data['ORI_BONUS_BS'],
|
|
|
- 'ORI_BS_MNT' => $data['ORI_BONUS_BS_MNT'],
|
|
|
- 'ORI_BS_ABBR' => $data['ORI_BONUS_BS_ABBR'],
|
|
|
-
|
|
|
- 'RECONSUME_POINTS_TOTAL' => $data['RECONSUME_POINTS'],
|
|
|
- 'EXCHANGE_POINTS_TOTAL' => $data['EXCHANGE_POINTS'],
|
|
|
- 'MANAGE_TAX' => $data['MANAGE_TAX'],
|
|
|
-
|
|
|
- 'BONUS_TOTAL' => $data['BONUS_TOTAL'],
|
|
|
-
|
|
|
- 'DEAL_TYPE_ID' => DealType::BONUS_SEND,
|
|
|
- 'SORT' => $key * 10,
|
|
|
- 'BONUS_ISSUE' => true,
|
|
|
- ]);
|
|
|
-// $this->_teamworkBonus($data['USER_ID'], $periodAmount, $key);
|
|
|
+ // 用户奖金发放
|
|
|
+ if ($data['BONUS_REAL'] > 0) {
|
|
|
+ Balance::changeUserBonus($data['USER_ID'], 'userBonus', $data['BONUS_REAL'],
|
|
|
+ [
|
|
|
+ 'CALC_ID' => $data['ID'],
|
|
|
+ 'REMARK' => 'From Period ' . $data['PERIOD_NUM'],
|
|
|
+ 'PERIOD_NUM' => $periodNum,
|
|
|
+ 'MANAGE_TAX' => $data['MANAGE_TAX'],
|
|
|
+ 'BONUS_TOTAL' => $data['BONUS_TOTAL'],
|
|
|
+ 'DEAL_TYPE_ID' => DealType::BONUS_SEND,
|
|
|
+ 'SORT' => $key * 10,
|
|
|
+ 'BONUS_ISSUE' => true,
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
- // 旅游奖
|
|
|
- if ($data['BONUS_TOURISM'] > 0) {
|
|
|
- Balance::changeUserBonus($data['USER_ID'], 'tourism_points', $data['BONUS_TOURISM'], [
|
|
|
- 'CALC_ID' => $data['ID'],
|
|
|
- 'REMARK' => 'From Period ' . $periodNum,
|
|
|
- 'PERIOD_NUM' => $periodNum,
|
|
|
- 'TOURISM_POINTS' => $data['BONUS_TOURISM'],
|
|
|
- 'DEAL_TYPE_ID' => DealType::TOURISM_SEND,
|
|
|
- 'SORT' => $key * 10,
|
|
|
- 'BONUS_ISSUE' => true,
|
|
|
- ]);
|
|
|
- }
|
|
|
- // 车奖
|
|
|
- if ($data['BONUS_GARAGE'] > 0) {
|
|
|
- Balance::changeUserBonus($data['USER_ID'], 'garage_points', $data['BONUS_GARAGE'], [
|
|
|
- 'CALC_ID' => $data['ID'],
|
|
|
- 'REMARK' => 'From Period ' . $periodNum,
|
|
|
- 'PERIOD_NUM' => $periodNum,
|
|
|
- 'GARAGE_POINTS' => $data['BONUS_GARAGE'],
|
|
|
- 'DEAL_TYPE_ID' => DealType::GARAGE_SEND,
|
|
|
- 'SORT' => $key * 10,
|
|
|
- 'BONUS_ISSUE' => true,
|
|
|
- ]);
|
|
|
- }
|
|
|
- // 房奖
|
|
|
- if ($data['BONUS_VILLA'] > 0) {
|
|
|
- Balance::changeUserBonus($data['USER_ID'], 'villa_points', $data['BONUS_VILLA'], [
|
|
|
- 'CALC_ID' => $data['ID'],
|
|
|
- 'REMARK' => 'From Period ' . $periodNum,
|
|
|
- 'PERIOD_NUM' => $periodNum,
|
|
|
- 'VILLA_POINTS' => $data['BONUS_VILLA'],
|
|
|
- 'DEAL_TYPE_ID' => DealType::VILLA_SEND,
|
|
|
- 'SORT' => $key * 10,
|
|
|
- 'BONUS_ISSUE' => true,
|
|
|
- ]);
|
|
|
+ // 绩效奖金发放
|
|
|
+ if ($data['BONUS_PB'] > 0) {
|
|
|
+ UserPerformance::sentUserPerformance($data['USER_ID'], $data['BONUS_PB'], $data['PERIOD_NUM']);
|
|
|
}
|
|
|
|
|
|
- //发放重消积分
|
|
|
-// if ($data['RECONSUME_POINTS'] > 0) {
|
|
|
-// Balance::changeUserBonus($data['USER_ID'], 'reconsume_points', $data['RECONSUME_POINTS'], [
|
|
|
-// 'CALC_ID' => $data['ID'],
|
|
|
-// 'REMARK' => 'From ' . $periodNum . '期',
|
|
|
-// 'PERIOD_NUM' => $periodNum,
|
|
|
-// 'RECONSUME_POINTS' => $data['RECONSUME_POINTS'],
|
|
|
-// 'DEAL_TYPE_ID' => DealType::RECONSUME_POINTS_SEND,
|
|
|
-// ]);
|
|
|
-// }
|
|
|
-//
|
|
|
-// //发放兑换积分
|
|
|
-// if ($data['EXCHANGE_POINTS'] > 0) {
|
|
|
-// Balance::changeUserBonus($data['USER_ID'], 'exchange_points', $data['EXCHANGE_POINTS'], [
|
|
|
-// 'CALC_ID' => $data['ID'],
|
|
|
-// 'REMARK' => 'From ' . $periodNum . '期',
|
|
|
-// 'PERIOD_NUM' => $periodNum,
|
|
|
-// 'EXCHANGE_POINTS' => $data['EXCHANGE_POINTS'],
|
|
|
-// 'DEAL_TYPE_ID' => DealType::EXCHANGE_POINTS_SEND,
|
|
|
-// 'BONUS_ISSUE' => true,
|
|
|
-// ]);
|
|
|
-// }
|
|
|
// 把记录标记为已发放状态
|
|
|
CalcBonus::updateAll(['IS_SENT' => 1, 'SENT_AT' => Date::nowTime()], 'ID=:ID', [':ID' => $data['ID']]);
|
|
|
|
|
|
@@ -627,6 +440,50 @@ class BonusSend extends BaseObject {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ public function sendMemberLevel()
|
|
|
+ {
|
|
|
+ $transaction = Yii::$app->db->beginTransaction();
|
|
|
+ try {
|
|
|
+ $db = Yii::$app->db;
|
|
|
+
|
|
|
+ $sql =<<<SQL
|
|
|
+ UPDATE `AR_USER` `user`
|
|
|
+ INNER JOIN `AR_CALC_BONUS` `bonus` ON `user`.`ID` = `bonus`.`USER_ID` AND `bonus`.`CALC_MONTH` = :CALC_MONTH AND `bonus`.`PERIOD_NUM` = :PERIOD_NUM
|
|
|
+ SET
|
|
|
+ `user`.`EMP_LV` = `bonus`.`EMP_LV`,
|
|
|
+ `user`.`LAST_EMP_LV` = `bonus`.`LAST_EMP_LV`,
|
|
|
+ `user`.`LAST_EMP_LV_UPDATED_AT` = :UPDATED_AT,
|
|
|
+ `user`.`LAST_EMP_LV_UPDATED_PERIOD` = :PERIOD_NUM,
|
|
|
+
|
|
|
+ `user`.`ELITE_LV` = `bonus`.`ELITE_LV`,
|
|
|
+ `user`.`LAST_ELITE_LV` = `bonus`.`LAST_ELITE_LV`,
|
|
|
+ `user`.`LAST_ELITE_LV_UPDATED_AT` = :UPDATED_AT,
|
|
|
+ `user`.`LAST_ELITE_LV_UPDATED_PERIOD` = :PERIOD_NUM
|
|
|
+SQL;
|
|
|
+
|
|
|
+ $db->createCommand($sql)
|
|
|
+ ->bindValues(
|
|
|
+ [
|
|
|
+ ':CALC_MONTH' => $this->_calcYearMonth,
|
|
|
+ ':PERIOD_NUM' => $this->_periodNum,
|
|
|
+ ':UPDATED_AT' => time(),
|
|
|
+ ])
|
|
|
+ ->execute();
|
|
|
+
|
|
|
+ $transaction->commit();
|
|
|
+
|
|
|
+ // 删除缓存中的会员信息
|
|
|
+ User::deleteAllBaseInfoFromRedis();
|
|
|
+
|
|
|
+ } catch (Exception $e) {
|
|
|
+ $transaction->rollBack();
|
|
|
+ $this->addError('sendLevelFailed', '发放会员级别失败,原因:' . $e->getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
// 更活跃会员,将is_send改成1
|
|
|
public function updateActiveUser() {
|
|
|
$ret = PerfActiveUser::updateAll(
|