| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- <?php
- namespace addons\ServeBonus\common\logic;
- use addons\ServeBonus\common\enums\ServeBonusEnum;
- use addons\ServeBonus\common\models\ServeBonus;
- use addons\ServeBonus\common\models\ServeBonusLevel;
- use addons\ServeBonus\common\models\ServeBonusLevelSetting;
- use addons\ServeBonus\common\models\ServeBonusUpgradeCount;
- use addons\ServeBonus\common\models\ServeBonusUpgradeLimit;
- use common\enums\StatusEnum;
- use common\models\statistics\UserStatisticsTotal;
- use common\models\statistics\UserTeamStatistics;
- use common\models\user\UserPartitionRelationship;
- use common\models\user\UserTeamMonthStatistics;
- use common\traits\ErrorTrait;
- use Exception;
- use yii;
- /**
- * Class AchievementLogic
- * @Author: lun
- * @DateTime: 2023/4/1 0001 14:38
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @package addons\ServeBonus\common\logic
- */
- class AchievementLogic
- {
- use ErrorTrait;
- /**
- * 团队业绩条件升级记录
- * @Author: lun
- * @DateTime: 2023/4/1 0001 15:40
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $order
- * @return bool
- */
- public static function limitHandle($order)
- {
- $mall_id = $order['mall_id'];
- $user_id = $order['user_id'];
- $pay_money = $order['pay_money'];
- // 获取配置
- $set_team_achievement = Yii::$app->services->setting->addons->get($mall_id, 'ServeBonus', 'basic.set_team_achievement');
- if (empty($set_team_achievement)) return true;// 不开启统计直接跳过
- try {
- $trans = Yii::$app->db->beginTransaction();
- // 获取消费者上级
- $parent_ids = UserPartitionRelationship::getParentIdArr($user_id);
- if (empty($parent_ids)) {
- $trans->commit();
- return true;
- }
- // 获取上级的所有属于服务商的用户
- $parent_ids = ServeBonus::find()->select('user_id')->where(['user_id' => $parent_ids, 'status' => StatusEnum::ENABLED])->column();
- if (empty($parent_ids)) {
- $trans->commit();
- return true;
- }
- // 获取上级服务商的等级
- $serve_users = ServeBonus::find()->select('mall_id,user_id,level')->where(['user_id' => $parent_ids, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->asArray()->all();
- // 增加上级的业绩
- $time = time();
- foreach ($parent_ids as $parent_id) {
- $add_achievement = false;// 是否可增加业绩
- // 检查是否存在该用户已为服务商增加过业绩
- $limit = ServeBonusUpgradeLimit::find()->where(['user_id' => $user_id, 'serve_uid' => $parent_id, 'status' => StatusEnum::ENABLED])->one();
- $parent_level = empty($serve_users[$parent_id]['level']) ? 0 : $serve_users[$parent_id]['level'];
- // 查询是否之前已贡献过业绩
- if (empty($limit)) {
- // 增加一条上级的业绩
- $inster[] = [
- 'mall_id' => $mall_id,
- 'user_id' => $user_id,
- 'serve_uid' => $parent_id,
- 'level' => $parent_level,
- 'achievement' => $pay_money,
- 'created_at' => $time,
- 'updated_at' => $time,
- ];
- $add_achievement = true;
- } else {
- // 当用户已经为该上级生成业绩,并且此业绩生成的等级=上级等级时,则表示此上级还处于当前等级可以继续增加业绩
- if ($limit['level'] == $parent_level) {
- $limit->achievement += $pay_money;
- if (!$limit->save()) throw new yii\db\Exception($limit->getErrorMessage());
- $add_achievement = true;
- }
- }
- // 增加上级统计业绩
- if ($add_achievement) {
- $res = ServeBonusUpgradeCount::setData($mall_id, $parent_id, 0, $pay_money);
- if ($res == false) throw new Exception('保存业绩报错:'.ServeBonusUpgradeCount::getStaticError());
- }
- }
- if ($inster) {
- $field = ['mall_id','user_id','serve_uid','level','achievement','created_at','updated_at'];
- $res = Yii::$app->db->createCommand()->batchInsert(ServeBonusUpgradeLimit::tableName(), $field, $inster)->execute();
- if ($res == false) throw new \yii\db\Exception(ServeBonusUpgradeLimit::getStaticError());
- }
- $trans->commit();
- return true;
- } catch (Exception $e) {
- $trans->rollBack();
- Yii::error('条件升级业绩报错参数:' . json_encode($order));
- Yii::error($e->getMessage());
- return false;
- }
- }
- /**
- * 获取用户业绩
- * @param int $user_id
- * @param int $mall_id
- * @return array
- */
- public static function getUserAchievement($user_id, $mall_id)
- {
- $configs = Yii::$app->services->setting->addons->get($mall_id, ServeBonusEnum::ADDONS_NAME, 'basic');
- $team_statistics = UserTeamStatistics::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id])->asArray()->one();
- $user_statistics = UserStatisticsTotal::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id])->asArray()->one();
- $data = [];
- if ($configs['achievement_count_method'] == 0) { // 支付完成
- $data['total_price'] = bcadd(($team_statistics['user_team_order_price_total'] ?? 0), ($user_statistics['pay_money'] ?? 0), 2);
- } else { // 订单完成
- $data['total_price'] = bcadd(($team_statistics['team_finish_order_price_total'] ?? 0), ($user_statistics['finish_order_money'] ?? 0), 2);
- }
- $month_statistics = UserTeamMonthStatistics::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id, 'month' => date('Y-m'), 'status' => StatusEnum::ENABLED])->one();
- $last_month = date('Y-m', strtotime('last month'));
- $last_month_statistics = UserTeamMonthStatistics::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id, 'month' => $last_month, 'status' => StatusEnum::ENABLED])->one();
- // 获取服务商等级设置的限制条件
- $serve_bonus = ServeBonus::find()->where(['user_id' => $user_id, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED])->asArray()->one();
- $accumulation_condition_money = 0;
- if ($serve_bonus) {
- $serve_bonus_level_setting = ServeBonusLevelSetting::find()->where(['mall_id' => $mall_id, 'level' => $serve_bonus['level'], 'status' => StatusEnum::ENABLED])->asArray()->one();
- if ($serve_bonus_level_setting['accumulation_condition'] == 1) {
- $accumulation_condition_money = $serve_bonus_level_setting['accumulation_condition_money'];
- }
- }
- if ($configs['achievement_count_method'] == 0) { // 支付完成
- $price = $month_statistics->price ?? 0;
- $last_price = $last_month_statistics->price ?? 0;
- } else { // 订单完成
- $price = $month_statistics->finish_price ?? 0;
- $last_price = $last_month_statistics->finish_price ?? 0;
- }
- $data['month_achievement'] = $price >= $accumulation_condition_money ? 1 : 0;
- $data['last_month_achievement'] = $last_price >= $accumulation_condition_money ? 1 : 0;
- $data['month_price'] = $price ?? 0;
- $data['last_month_price'] = $last_price ?? 0;
- return $data;
- }
- }
|