db->beginTransaction(); try { $mall_id = $order['mall_id']; if (empty(MallAddons::isInstall($order['mall_id'], AchievementEnum::ADDONS_NAME))){ throw new \Exception(false); } //判断业绩奖励是否开启 $configs = \Yii::$app->services->setting->addons->get($order['mall_id'], AddonsEnum::ADDONS_NAME_ACHIEVEMENT, 'basic'); if (empty($configs['status'])) throw new \Exception(false); $order_detail_list = OrderDetail::findAll(['order_id' => $order['id']]); if (empty($order_detail_list)) throw new \Exception(false); $goods_id_arr = array_column($order_detail_list, 'goods_id'); //判断云库存 todo if (MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_CLOUD_STOCK)) { //过滤掉,由云库存补货,平台扣库存触发 $cloud_stock_goods_list = CloudStockGoods::lists(['where' => [['goods_id' => $goods_id_arr], ['status' => StatusEnum::ENABLED]], 'select' => 'goods_id']); $cloud_stock_goods_id_arr = array_column($cloud_stock_goods_list, 'goods_id'); foreach ($order_detail_list as $k => &$item) { if (in_array($item['goods_id'], $cloud_stock_goods_id_arr)) unset($order_detail_list[$k]); } } if (empty($order_detail_list)) throw new \Exception(false); $grant = AchievementGrantLog::findOne(['mall_id' => $mall_id, 'status' => 1, 'is_wait' => 0, 'is_create' => 0, // 'id' => 179 ]); if (empty($grant)) throw new \Exception(false); if ($grant['statistical_methods'] == 0 && $order['order_status'] != 4) { //订单完成 throw new \Exception(false); } if ($grant['statistical_methods'] == 1 && ($order['pay_status'] != 1|| $order['order_status'] != 1)) { //支付完成 throw new \Exception(false); } self::addData($mall_id, $order['order_no'], $order['user_id'], $grant['id'], $order['created_at'], 0, $goods_id_arr, $order_detail_list, $grant, $configs['equal_type'] ?? 0, $configs); $t->commit(); return true; } catch (\Exception $e) { $t->rollBack(); if($e->getMessage()){ var_dump('AchievementOrderLogic:orderStatistics::::order_id:'.$order['id'].':::: '. $e->getMessage() .' -> '. $e->getLine() .' -> '. $e->getFile()); } return true; } } //生成统计业绩数据 public static function addData($mall_id, $order_no, $user_id, $grant_id, $created_at, $is_cloud, $goods_id_arr, $order_detail_list, $grant, $c_equal_type, $config) { $res = AchievementOrderLog::findOne(['order_no' => $order_no]); if (!empty($res)) throw new \Exception(false); $is_self = true; if(!$is_cloud){ //关闭后,购买团长升级礼包,首单不计算自身业绩。 $configs = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_ACHIEVEMENT, 'basic'); if(isset($configs['first_order'])&&$configs['first_order']==0){ $configs_goods_ids = []; if(!empty($configs['goods_ids'])){ $configs_goods_ids = json_decode($configs['goods_ids'],true); } if(array_intersect($configs_goods_ids,$goods_id_arr)){ $res = AchievementFirstOrder::lists([ 'where'=>[ ['mall_id'=>$mall_id], ['user_id'=>$user_id], ['goods_id'=>$goods_id_arr], ['status'=>StatusEnum::ENABLED], ], ]); if(empty($res)){ $achievement_user = null; $is_self = false; foreach ($order_detail_list as $order_detail){ $add_data = [ 'mall_id'=>$mall_id, 'user_id'=>$user_id, 'order_id'=>$order_detail['order_id'], 'order_detail_id'=>$order_detail['id'], 'goods_id'=>$order_detail['goods_id'], ]; $res = AchievementFirstOrder::setData($add_data); if(empty($res)) throw new \Exception(AchievementFirstOrder::getStaticError()); } } } } } if($is_self) $achievement_user = AchievementUser::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED]); if (empty($achievement_user)) { //订单付款者不是团长身份,就往他的上级找 $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $parent_id_arr = array_reverse($parent_id_arr); $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']); foreach ($parent_id_arr as $user_id) { if (isset($parent_achievement_user_list[$user_id])) { $achievement_user = $parent_achievement_user_list[$user_id]; break; } } } if (empty($achievement_user)) throw new \Exception(false); $price = 0; $insert = []; $time = time(); $order = Order::findOne(['order_no' => $order_no]); if ($order['mch_id'] > 0 || $order['store_id'] > 0) { $item_setting_list = []; } else { $item_setting_list = AchievementCommissionItemSetting::lists( [ 'where' => [ ['item_id' => $goods_id_arr], ['status' => StatusEnum::ENABLED] ], 'index' => 'item_id' ]); } $order_detail_id_arr = array_column($order_detail_list, 'id'); $where = [ ['order_detail_id' => $order_detail_id_arr], ['is_cloud'=>$is_cloud] ]; $log_list = AchievementOrderLog::lists(['where' =>$where, 'select' => 'id,goods_id']); $have_add_order_detail_id_arr = array_column($log_list, 'id'); //独立平级奖励 $user_equal_first = 0; $user_equal_second = 0; foreach ($order_detail_list as $item) { if (in_array($item['id'], $have_add_order_detail_id_arr)) continue; $goods_id = $item["goods_id"]; $total_price = $item['goods_price']; $is_alone_equal = 0; $equal_first = 0; $equal_second = 0; //查询订单商品是否设置单独的商品业绩奖励 if (isset($item_setting_list[$goods_id])) { //是否参与业绩奖励 if (!empty($item_setting_list[$goods_id]['is_join'])) { if (!empty($item_setting_list[$goods_id]['is_enable'])) { if ($item_setting_list[$goods_id]['is_percent'] == 0) { $total_price = $item_setting_list[$goods_id]['price'] * $total_price / 100; // 业绩 百分比 } if ($item_setting_list[$goods_id]['is_percent'] == 1) { $total_price = $item_setting_list[$goods_id]['price'] * $item['num']; // 业绩 固定 } } //独立平级奖励 基础设置开启了平级奖 并且 商品独立设置也开启了平级奖 if ($grant->is_equal == 1 && !empty($item_setting_list[$goods_id]['is_alone_equal'])) { if ($item_setting_list[$goods_id]['is_alone_equal_percent'] == 0) { $equal_first = $item_setting_list[$goods_id]['alone_equal_first'] * $total_price / 100; // 平级一 百分比 $equal_second = $item_setting_list[$goods_id]['alone_equal_second'] * $total_price / 100; // 平级二 百分比 } if ($item_setting_list[$goods_id]['is_alone_equal_percent'] == 1) { $equal_first = $item_setting_list[$goods_id]['alone_equal_first'] * $item['num']; // 平级一 固定 $equal_second = $item_setting_list[$goods_id]['alone_equal_second'] * $item['num'];// 平级二 固定 } $is_alone_equal = $item_setting_list[$goods_id]['is_alone_equal']; $user_equal_first += $equal_first; $user_equal_second += $equal_second; } } else { $total_price = 0; } //平级奖励 平台开启平级奖并且商品独立设置没有开启平级奖 if($grant->is_equal == 1 && empty($is_alone_equal)){ $equal_first = $grant->equal_price_first * $total_price / 100; // 一级百分比 比例 * 业绩 / 100 $equal_second = $grant->equal_price_second * $total_price / 100; // 二级百分比 比例 * 业绩 / 100 $user_equal_first += $equal_first; $user_equal_second += $equal_second; } } $insert[] = [ $mall_id, $item['user_id'], $grant_id, $goods_id, $order_no, $item['id'], $user_id, $total_price, $is_cloud, $created_at, $time, $time, StatusEnum::ENABLED, $is_alone_equal, $equal_first, $equal_second, ]; $price += $total_price; } if(empty($insert)) throw new \Exception('insert数组为空'); $field = ['mall_id', 'user_id', 'grant_id', 'goods_id', 'order_no', 'order_detail_id', 'chief_user_id', 'price', 'is_cloud', 'order_create_time', 'created_at', 'updated_at', 'status','is_alone_equal','equal_first','equal_second']; // 批量插入数据 $res = \Yii::$app->db->createCommand()->batchInsert(AchievementOrderLog::tableName(), $field, $insert)->execute(); if (empty($res)) throw new \Exception('添加业绩订单日志失败'); $list = []; $user_id_arr = []; [$award_log, $old_personal_achievement, $old_achievement_sum] = self::handleSelf($achievement_user['user_id'], $price, $grant, $list, $user_id_arr,$user_equal_first,$user_equal_second, $c_equal_type, $config); $awards = self::handleParent($user_id, $grant, $list, $user_id_arr); // if (!empty($c_equal_type)) { // 有可能有的业绩已经清0了 那么就需要将平级奖去掉 // self::reWriteEqual($award_log, // bcmul($awards[0]['money'] ?? 0, bcmul($config['equal_price_first'], 0.01, 3), 3), // bcmul($awards[1]['money'] ?? 0, bcmul($config['equal_price_second'], 0.01, 3), 3)); // foreach ($awards as $t_award) { // $_awards = self::_handleParent($t_award['user_id'], $grant); // $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $t_award['user_id']]); // $__ = $_awards[0]['money'] ?? 0; // $___ = $_awards[1]['money'] ?? 0; // \Yii::error("_handleParent -> {$award_log['id']}, {$__}, {$___}"); // self::reWriteEqual($award_log, // bcmul($_awards[0]['money'] ?? 0, bcmul($config['equal_price_first'], 0.01, 3), 3), // bcmul($_awards[1]['money'] ?? 0, bcmul($config['equal_price_second'], 0.01, 3), 3)); // } // unset($award_log); // } if ($grant->settlement_mode == 1) self::planB($grant, $list, $user_id_arr);//极差 if ($grant->settlement_mode == 2) { self::planC($grant, $list, $achievement_user['user_id'], $c_equal_type, $config); }//业绩极差 - 团队平级奖这里面有处理 //平级奖 self::settleEqual($grant, $achievement_user['user_id'], $c_equal_type, $config); // } self::updateGrant($grant); // } public static function planB($grant, $list, $user_id_arr) { $sum_award = 0; $achievement_award_log_list = AchievementAwardLog::lists([ 'where' => [ ['parent_team' => $user_id_arr], ['mall_id' => $grant['mall_id']], ['grant_id' => $grant['id']], ['status' => StatusEnum::ENABLED], ], 'index' => 'parent_team', 'group' => 'parent_team', 'select' => 'sum(proportion_money) as money,parent_team', ]); $achievement_award_log_list_end = AchievementAwardLog::lists([ 'where' => [ ['parent_team' => $user_id_arr], ['mall_id' => $grant['mall_id']], ['status' => StatusEnum::ENABLED], ['is_end' => 1], ], 'index' => 'user_id', 'group' => 'user_id', 'select' => 'sum(proportion_money+equal_money) as money,user_id', ]); foreach ($list as $k => $v) { //查看所有下级的结算金额 $money = 0; if (isset($achievement_award_log_list[$v['user_id']])) $money = $achievement_award_log_list[$v['user_id']]['money']; var_dump($money); $award_money = $v['proportion_money'] - $money > 0 ? $v['proportion_money'] - $money : 0; var_dump($v['user_id'] . '::::' . $award_money); $v->award_money = $award_money; //总计 $sum_money = 0; $sum_money += $award_money; if (isset($achievement_award_log_list_end[$v['user_id']])) $sum_money += $achievement_award_log_list_end[$v['user_id']]['money']; $v->award_sum = $sum_money; if (!$v->save()) throw new \Exception("业绩修改奖励日志失败"); $sum_award += $v->award_money; } return $sum_award; } public static function reWriteEqual($award_log, $user_equal_first,$user_equal_second) { // 需要重新计算 平级奖 - 每个商品不一样? $award_log->equal_first += $user_equal_first; $award_log->equal_second += $user_equal_second; $flag = $award_log->save(); echo "reWriteEqual -> $award_log->id, $user_equal_first,$user_equal_second \n"; if (!$flag) throw new \Exception("重写平级奖失败"); } public static function _rewriteEqual($grant, $award_list, $first_user_id) { // 上级有业绩,那么 平级奖写在我这里 $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id); $parent_id_arr = array_reverse($parent_id_arr); $list = []; foreach($parent_id_arr as $parent_id){ foreach($award_list as $award_log){ if($parent_id == $award_log->user_id){ $list[] = $award_log; } } } $grant_id = $grant['id']; $mall_id = $grant['mall_id']; //同一条关系链,已给最近上级计算团队业绩,再往上上级不再计算对应团队业绩 $achievement_child_ids = []; $team_user_ids = AchievementAwardLog::find()->where(['grant_id'=>$grant_id,'mall_id'=>$mall_id,'status'=>StatusEnum::ENABLED])->select('user_id')->column(); foreach($list as $item){ $child_ids = UserPartitionRelationship::getChildIdArr($item['user_id']); //$child_ids = array_diff($child_ids, $achievement_child_ids); //找到最下层团队长 foreach($child_ids as $key => $child_id){ $child_child_ids = UserPartitionRelationship::getChildIdArr($child_id); if(!empty(array_intersect($child_child_ids,$team_user_ids))){ unset($child_ids[$key]); } } $last_childs = AchievementAwardLog::find() ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$child_ids,'team_achievement'=>0]) ->all(); $total_personal_achievement = 0; $equal_first = 0; $equal_second = 0; //$last_child_ids = []; foreach($last_childs as $child){ $user_id = $child['user_id']; //$last_child_ids[] = $user_id; $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $parent_id_arr = array_reverse($parent_id_arr); $log = null; $parent_achievement = 0; $parent_equal_first = 0; $parent_equal_second = 0; foreach($parent_id_arr as $parent_id){ $log = AchievementAwardLog::find() ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$parent_id]) //->andWhere(['>','award_money',0]) ->one(); if(($log && $log->award_money > 0) || empty($log)) break; if($parent_id == $item['user_id']) break; $parent_achievement += $log['personal_achievement']; $parent_equal_first += $log['equal_first']; $parent_equal_second += $log['equal_second']; } if($log && $log['user_id'] != $item['user_id']) continue; $total_personal_achievement += $parent_achievement; $equal_first += $parent_equal_first; $equal_second += $parent_equal_second; if($child['award_money'] > 0) continue; $total_personal_achievement += $child['personal_achievement']; $equal_first += $child['equal_first']; $equal_second += $child['equal_second']; } $total_personal_achievement += $item['personal_achievement']; $award = AchievementLogic::confirmProportion($grant['award_proportion'], $total_personal_achievement, $item['personal_achievement'], $grant['settlement_mode']); foreach ($last_childs as $child) { $user_id = $child['user_id']; //$last_child_ids[] = $user_id; $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $parent_id_arr = array_reverse($parent_id_arr); $log = null; foreach($parent_id_arr as $parent_id){ } } // $item->award_money = $award['money']; echo "$item->id, $equal_first, $equal_second \n"; $item->team_equal_first = $equal_first; $item->team_equal_second = $equal_second; if (!$item->save()) throw new \Exception("业绩添加个人业绩日志时失败"); //if($item->award_money <= 0) $achievement_child_ids = array_merge($achievement_child_ids,$last_child_ids); } } public static function handleSelf($user_id, $price, $grant, &$list, &$user_id_arr,$user_equal_first,$user_equal_second, $c_equal_type, $config) { $grant_id = $grant['id']; $mall_id = $grant['mall_id']; $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $user_id]); if (empty($award_log)) { $award_log = new AchievementAwardLog(); $award_log->mall_id = $mall_id; $award_log->grant_id = $grant_id; $award_log->user_id = $user_id; } // 旧的 $_award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']); $old_personal_achievement = $award_log->personal_achievement; $old_achievement_sum = $award_log->achievement_sum; $award_log->personal_achievement += $price; $award_log->achievement_sum += $price; $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']); // 需要重新计算 平级奖 - 每个商品不一样? // $old_ $award_log->equal_first += empty($c_equal_type) ? $user_equal_first : bcmul(bcsub($award['money'], $_award['money'], 3), bcmul($config['equal_price_first'], 0.01, 3), 3); // 获得的收益比例 $award_log->equal_second += empty($c_equal_type) ? $user_equal_second : bcmul(bcsub($award['money'], $_award['money'], 3), bcmul($config['equal_price_second'], 0.01, 3), 3); \Yii::error("handleSelf-> {$c_equal_type} {$award_log->id} $grant_id $user_id -> {$award['money']}, {$_award['money']}, {$config['equal_price_first']}, {$config['equal_price_second']}, $award_log->equal_first, $award_log->equal_second"); $sum_list = AchievementAwardLog::lists([ 'where' => [ ['user_id' => $user_id], ['mall_id' => $grant['mall_id']], ['status' => StatusEnum::ENABLED], ['is_end' => 1] ], 'index' => 'user_id', 'group' => 'user_id', 'select' => 'sum(award_money+equal_money) as money,user_id' ]); $award_log->award_proportion = $award['proportion']; if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差 $award_log->award_money = $award['money']; $sum_money = 0; if (isset($sum_list[$award_log['user_id']])) $sum_money = $sum_list[$award_log['user_id']]['money']; $sum_money = $sum_money + $award['money']; $award_log->award_sum = $sum_money; } else { $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id); $award_log->proportion_money = $award['money']; } if (!$award_log->save()) throw new \Exception("业绩添加个人业绩日志时失败"); $list[] = $award_log; $user_id_arr[] = $award_log['user_id']; return [ $award_log, $old_personal_achievement, $old_achievement_sum ]; } public static function _handleParent($user_id, $grant) { $grant_id = $grant['id']; $mall_id = $grant['mall_id']; //給所有的上级加上日志,就算为空也加 $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $parent_id_arr = array_reverse($parent_id_arr); $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']); //给父级团队业绩 $sum_list = AchievementAwardLog::lists([ 'where' => [ ['user_id' => $parent_id_arr], ['mall_id' => $mall_id], ['status' => StatusEnum::ENABLED], ['is_end' => 1] ], 'index' => 'user_id', 'group' => 'user_id', 'select' => 'sum(award_money+equal_money) as money,user_id' ]); $awards = []; foreach ($parent_achievement_user_list as $k => $item) { $child_ids = UserPartitionRelationship::getChildIdArr($item['user_id']); $personal_achievement = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$child_ids]) ->sum('personal_achievement'); if(!isset($personal_achievement)) $personal_achievement = 0; $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $item['user_id']]); if (empty($award_log)) { $award_log = new AchievementAwardLog(); $award_log->mall_id = $mall_id; $award_log->grant_id = $grant_id; $award_log->user_id = $item['user_id']; } $award_log->personal_achievement += 0; $award_log->team_achievement = $personal_achievement; $award_log->achievement_sum = $personal_achievement+$award_log->personal_achievement; $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']); $award_log->award_proportion = $award['proportion']; if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差 $award_log->award_money = $award['money']; $sum_money = 0; if (isset($sum_list[$award_log['user_id']])) $sum_money = $sum_list[$award_log['user_id']]['money']; $sum_money = $sum_money + $award['money']; $award_log->award_sum = $sum_money; $awards[] = $award_log; } else { $award_log->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']); $award_log->proportion_money = $award['money']; } } return $awards; } public static function handleParent($user_id, $grant, &$list, &$user_id_arr) { $grant_id = $grant['id']; $mall_id = $grant['mall_id']; //給所有的上级加上日志,就算为空也加 $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $parent_id_arr = array_reverse($parent_id_arr); $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']); //给父级团队业绩 $sum_list = AchievementAwardLog::lists([ 'where' => [ ['user_id' => $parent_id_arr], ['mall_id' => $mall_id], ['status' => StatusEnum::ENABLED], ['is_end' => 1] ], 'index' => 'user_id', 'group' => 'user_id', 'select' => 'sum(award_money+equal_money) as money,user_id' ]); $awards = []; foreach ($parent_achievement_user_list as $k => $item) { $child_ids = UserPartitionRelationship::getChildIdArr($item['user_id']); $personal_achievement = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$child_ids]) ->sum('personal_achievement'); if(!isset($personal_achievement)) $personal_achievement = 0; $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $item['user_id']]); if (empty($award_log)) { $award_log = new AchievementAwardLog(); $award_log->mall_id = $mall_id; $award_log->grant_id = $grant_id; $award_log->user_id = $item['user_id']; } $award_log->personal_achievement += 0; $award_log->team_achievement = $personal_achievement; $award_log->achievement_sum = $personal_achievement+$award_log->personal_achievement; $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']); $award_log->award_proportion = $award['proportion']; if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差 $award_log->award_money = $award['money']; $awards[] = [ 'user_id' => $award_log->user_id, 'money' => $award['money'] ]; $sum_money = 0; if (isset($sum_list[$award_log['user_id']])) $sum_money = $sum_list[$award_log['user_id']]['money']; $sum_money = $sum_money + $award['money']; $award_log->award_sum = $sum_money; } else { $award_log->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']); $award_log->proportion_money = $award['money']; } if (!$award_log->save()) throw new \Exception("业绩添加父级业绩日志时失败"); $list[] = $award_log; $user_id_arr[] = $award_log['user_id']; } return $awards; } public static function updateGrant($grant) { $grant_id = $grant['id']; $mall_id = $grant['mall_id']; $total_performance = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('personal_achievement'); $sum_award = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('award_money'); $user_num = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->count(); $sum_equal = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('equal_money'); if (!isset($total_performance)) $total_performance = 0; if (!isset($sum_award)) $sum_award = 0; if (!isset($user_num)) $user_num = 0; $grant->total_performance = $total_performance; $grant->user_num = $user_num; $grant->award_money = $sum_award + $sum_equal; $grant->equal_money = $sum_equal; if (!$grant->save()) throw new \Exception("业绩修改规则日志失败"); } public static function settleEqual($grant,$user_id, $c_equal_type, $config){ $grant_id = $grant['id']; $mall_id = $grant['mall_id']; $current_id = $user_id; $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); if(!empty($parent_id_arr)) $current_id = current($parent_id_arr); $child_ids = UserPartitionRelationship::getChildIdArr($current_id); $list = AchievementAwardLog::find() ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $child_ids]) ->andWhere(['>','award_money',0]) ->all(); $is_send_ids = []; foreach($list as $item){ $parent_id_arr = UserPartitionRelationship::getParentIdArr($item['user_id']); $parent_id_arr = array_reverse($parent_id_arr); $deep = 1; $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id'],false); foreach ($parent_id_arr as $user_id) { if (isset($parent_achievement_user_list[$user_id])) { $parent_award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $user_id]); if (empty($parent_award_log)) { $parent_award_log = new AchievementAwardLog(); $parent_award_log->mall_id = $mall_id; $parent_award_log->grant_id = $grant_id; $parent_award_log->user_id = $user_id; } if($deep == 1){ $equal_money = $item['equal_first'] + $item['team_equal_first']; }elseif($deep == 2){ $equal_money = $item['equal_second'] + $item['team_equal_second']; } if($equal_money > 0){ //首次添加重置平级奖 if(!in_array($user_id,$is_send_ids)){ $parent_award_log->equal_money = 0; } $parent_award_log->equal_money += $equal_money; if(!$parent_award_log->save()) throw new \Exception($parent_award_log['user_id'].'平级奖励发放异常:'.AchievementAwardLog::getStaticError()); $is_send_ids[] = $user_id; } if($deep == 2) break; $deep++; } } } return true; } protected static function _($log, $grant) { self::_handleParent($log->user_id, $grant); } public static function planC($grant,$award_list,$first_user_id, $c_equal_type, $configs){ $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id); $parent_id_arr = array_reverse($parent_id_arr); $list = []; foreach($parent_id_arr as $parent_id){ foreach($award_list as $award_log){ if($parent_id == $award_log->user_id){ $list[] = $award_log; } } } $grant_id = $grant['id']; $mall_id = $grant['mall_id']; //同一条关系链,已给最近上级计算团队业绩,再往上上级不再计算对应团队业绩 $achievement_child_ids = []; $team_user_ids = AchievementAwardLog::find()->where(['grant_id'=>$grant_id,'mall_id'=>$mall_id,'status'=>StatusEnum::ENABLED])->select('user_id')->column(); foreach($list as $item){ $child_ids = UserPartitionRelationship::getChildIdArr($item['user_id']); //$child_ids = array_diff($child_ids, $achievement_child_ids); //找到最下层团队长 foreach($child_ids as $key => $child_id){ $child_child_ids = UserPartitionRelationship::getChildIdArr($child_id); if(!empty(array_intersect($child_child_ids,$team_user_ids))){ unset($child_ids[$key]); } } $last_childs = AchievementAwardLog::find() ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$child_ids,'team_achievement'=>0]) ->all(); $total_personal_achievement = 0; $equal_first = 0; $equal_second = 0; //$last_child_ids = []; foreach($last_childs as $child){ $user_id = $child['user_id']; //$last_child_ids[] = $user_id; $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $parent_id_arr = array_reverse($parent_id_arr); $log = null; $parent_achievement = 0; $parent_equal_first = 0; $parent_equal_second = 0; $is_set_equal = false; foreach($parent_id_arr as $parent_id){ $log = AchievementAwardLog::find() ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$parent_id]) //->andWhere(['>','award_money',0]) ->one(); if(($log && $log->award_money > 0)) { if (!empty($c_equal_type) && !empty($log)) { $log->equal_first = bcmul($log['award_money'], bcmul($configs['equal_price_first'], 0.01, 3), 3); $log->equal_second = bcmul($log['award_money'], bcmul($configs['equal_price_second'], 0.01, 3), 3); $log->team_equal_first = 0; $log->team_equal_second = 0; if (!$log->save()) throw new \Exception("重写计算业绩奖错误 -> log -> $log->id"); } // break; } else { if ($parent_id == $item['user_id']) continue; if (!$is_set_equal) { $is_set_equal = true; $parent_achievement += $log['personal_achievement']; $parent_equal_first += $log['equal_first']; $parent_equal_second += $log['equal_second']; } } } if($log && $log['user_id'] != $item['user_id']) continue; $total_personal_achievement += $parent_achievement; $equal_first += $parent_equal_first; $equal_second += $parent_equal_second; if($child['award_money'] > 0) { if (!empty($c_equal_type)) { $child->equal_first = bcmul($child['award_money'], bcmul($configs['equal_price_first'], 0.01, 3), 3); $child->equal_second = bcmul($child['award_money'], bcmul($configs['equal_price_second'], 0.01, 3), 3); $child->team_equal_first = 0; $child->team_equal_second = 0; if (!$child->save()) throw new \Exception("重写计算业绩奖错误 -> child -> $child->id"); } continue; } $total_personal_achievement += $child['personal_achievement']; $equal_first += $child['equal_first']; $equal_second += $child['equal_second']; } $team_achievement = $total_personal_achievement; $total_personal_achievement += $item['personal_achievement']; $equal_first += $item['equal_first']; $equal_second += $item['equal_second']; $award = AchievementLogic::confirmProportion($grant['award_proportion'], $total_personal_achievement, $item['personal_achievement'], $grant['settlement_mode']); $item->award_proportion = $award['proportion']; $item->award_money = $award['money']; if (!empty($c_equal_type)) { $item->equal_first = bcmul($award['money'], bcmul($configs['equal_price_first'], 0.01, 3), 3); $item->equal_second = bcmul($award['money'], bcmul($configs['equal_price_second'], 0.01, 3), 3); } // echo ("====================== $item->id, {$award['money']} $equal_first $equal_second {$item['equal_first']} {$item['equal_second']} \n"); $item->team_achievement = $team_achievement; $item->achievement_sum = $total_personal_achievement; $sum_money = 0; $sum_list = AchievementAwardLog::lists([ 'where' => [ ['user_id' => $item['user_id']], ['mall_id' => $grant['mall_id']], ['status' => StatusEnum::ENABLED], ['is_end' => 1] ], 'index' => 'user_id', 'group' => 'user_id', 'select' => 'sum(award_money+equal_money) as money,user_id' ]); if (isset($sum_list[$item['user_id']])) $sum_money = $sum_list[$item['user_id']]['money']; $sum_money = $sum_money + $award['money']; $item->award_sum = $sum_money; // if($item->award_money > 0){ // $item->total_personal_achievement = $total_personal_achievement; // }else{ // $item->total_personal_achievement = 0; // } echo "$item->id, $equal_first, $equal_second \n"; $item->team_equal_first = empty($c_equal_type) ? $equal_first : 0; $item->team_equal_second = empty($c_equal_type) ? $equal_second : 0; if (!$item->save()) throw new \Exception("业绩添加个人业绩日志时失败"); //if($item->award_money <= 0) $achievement_child_ids = array_merge($achievement_child_ids,$last_child_ids); } } }