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)) { $setting = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic'); if (!empty($setting['is_enable'])) {// 判断云库存是否开启(如果云库存未开启则不过滤掉商品) //过滤掉,由云库存补货,平台扣库存触发 $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]); 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); } $user_id = 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 ['user_id' => $user_id, 'mall_id' => $mall_id, 'grant_id' => $grant['id'], 'settlement_mode' => $grant['settlement_mode']]; } catch (\Exception $e) { $t->rollBack(); \Yii::error('AchievementOrderLogic:orderStatistics::::order_id:' . $order['id'] . '::::' . $e->getMessage() . $e->getLine() . $e->getFile()); echo $e->getMessage() . $e->getLine() . $e->getFile(); return false; } } //生成统计业绩数据 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) { $extra_user_id = $user_id; if ($is_cloud) { $res = AchievementOrderLog::findone(['order_no' => $order_no, 'order_detail_id' => array_column($order_detail_list, 'id')]); if (!empty($res)) throw new \Exception(false); } else { $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'); // 根据新需求。团长如果是后台手动添加。则首单也要计算自身业绩 $is_manual = AchievementUser::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED, 'is_manual' => 1])->exists(); if (isset($configs['first_order']) && $configs['first_order'] == 0 && !$is_manual) { $configs_goods_ids = []; if (!empty($configs['goods_ids'])) { $configs_goods_ids = json_decode($configs['goods_ids'], true); } if ($configs['goods_type'] == 1 || ($configs['goods_type'] == 2 && array_intersect($configs_goods_ids, $goods_id_arr))) { $where = [ ['mall_id' => $mall_id], ['user_id' => $user_id], ['status' => StatusEnum::ENABLED], ]; if ($configs['goods_type'] == 2) { $where [] = ['goods_id' => $configs_goods_ids]; } $res = AchievementFirstOrder::lists(['where' => $where]); 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)) { //如果下单用户没有团长身份,则为true //订单付款者不是团长身份,就往他的上级找 $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)) return 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; $equal_second = $grant->equal_price_second * $total_price / 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 = []; self::handleSelf($achievement_user['user_id'], $price, $grant, $list, $user_id_arr, $user_equal_first, $user_equal_second); //如果团队业绩按钮没有开启,或者不存在数据则计算个人业绩 //is_team_achievement, 如果开启了团队业绩按钮,且下单用户没有团长身份,则需要为user_id也计算团队业绩,该字段为true //累计上级团队业绩 $parent_id_arr = UserPartitionRelationship::getParentIdArr($achievement_user['user_id']); $parent_id_arr = array_reverse($parent_id_arr); self::staticTeamAchievement($mall_id, $grant, $parent_id_arr, $price, $equal_first, $equal_second); if ($grant->settlement_mode != 2) self::handleParent($user_id, $grant, $list, $user_id_arr); if ($grant->settlement_mode == 1) self::planB($grant, $list, $user_id_arr);//极差 if ($grant->settlement_mode == 2) self::planCTwo($grant, $list, $achievement_user['user_id'], $price, $c_equal_type, $order_no);//业绩极差 if (!empty($c_equal_type)) self::planD($grant, $achievement_user['user_id'], $config); //平级奖 self::settleEqual($grant, $achievement_user['user_id']); self::updateGrant($grant); return $user_id; } //累计下单用户所有上级团队业绩 public static function staticTeamAchievement($mall_id, $grant, $parent_id_arr = [], $price = 0, $equal_first = 0.00, $equal_second = 0.00) { if (!empty($parent_id_arr)) { foreach ($parent_id_arr as $key => $value) { //获取用户是否存在数据 $extra_info = AchievementAwardLogExtra::getOne([ ['mall_id' => $mall_id], ['user_id' => $value], ['grant_id' => $grant['id']] ]); if (empty($extra_info)) { $extra_info = new AchievementAwardLogExtra(); $extra_info->loadDefaultValues(); $extra_info->mall_id = $mall_id; $extra_info->user_id = $value; $extra_info->grant_id = $grant['id']; } $extra_info->team_achievement += $price; $extra_info->equal_first += $equal_first; $extra_info->equal_second += $equal_second; if (!$extra_info->save()) throw new Exception('累计团队业绩失败'); } } } 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(); if (!$flag) throw new \Exception("重写平级奖失败"); } 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 handleSelf($user_id, $price, $grant, &$list, &$user_id_arr, $user_equal_first, $user_equal_second) { $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_log->team_achievement = 0.00; $award_log->sub_personal_achievement = 0.00; } //开启团队奖励按钮,需排除本身的个人业绩 if (empty($grant->is_team_achievement)) { $award_log->personal_achievement += $price; } $team_achievement = $award_log->team_achievement; if ($grant['settlement_mode'] != 2) { $team_achievement_data = AchievementAwardLogExtra::getOne([ ['mall_id' => $grant['mall_id']], ['user_id' => $user_id], ['grant_id' => $grant['id']], ], true); if (empty($team_achievement_data)) { $team_achievement = self::checkAchievement($grant['mall_id'], $grant['id'], $user_id); } else { $team_achievement = $team_achievement_data['team_achievement']; } } $award_log->team_achievement = $team_achievement; $award_log->achievement_sum = $team_achievement + $award_log->personal_achievement; $award_log->equal_first += $user_equal_first; $award_log->equal_second += $user_equal_second; $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']); $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) { //不含极差/业绩极差 if ($grant['settlement_mode'] == 2) { $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id); } else { $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']; } $is_skip_settlement = self::checkCanSettle($grant, $award_log->user_id); $award_log->is_skip_settlement = $is_skip_settlement; if (!$award_log->save()) throw new \Exception("业绩添加个人业绩日志时失败"); $list[] = $award_log; $user_id_arr[] = $award_log['user_id']; return $award_log; } /** * @desc:更新父级团长id,因在同周期内 * 例如 a -> b -> c(团长) -> d->e -> f(团长),f下单,e,d不是团长,f的parent_team记录为c,当e在周期内成为团队,且下单时,需要更新f的parent_team为e * @Author: hua * @Date: 2021/11/12 * @Time: 9:30 * @param $mall_id * @param $grant_id * @param $user_id * @return void */ public static function updateParentTeam($mall_id, $grant_id, $user_id) { $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'grant_id' => $grant_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]); if (empty($award_log)) { $del_award_log = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'grant_id' => $grant_id, 'user_id' => $user_id, 'status' => StatusEnum::DELETE]) ->select('personal_achievement')->orderBy('id desc')->one(); $award_log = new AchievementAwardLog(); $award_log->loadDefaultValues(); $award_log->mall_id = $mall_id; $award_log->grant_id = $grant_id; $award_log->personal_achievement = $del_award_log['personal_achievement'] ?? 0; $award_log->user_id = $user_id; $award_log->sub_personal_achievement = 0.00; $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id); $award_log->save(); } $list = AchievementAwardLog::lists([ 'where' => [ ['mall_id' => $mall_id], ['grant_id' => $grant_id], ['parent_team' => $award_log['parent_team']], ['status' => StatusEnum::ENABLED] ] ], false); if (empty($list)) { return true; } //获取规则数据 $grant = AchievementGrantLog::getOne([ ['mall_id' => $mall_id], ['id' => $grant_id], ], true); if (!empty($grant['award_proportion'])) $grant['award_proportion'] = json_decode($grant['award_proportion'], true); foreach ($list as $item) { $is_add = true; $parent_id_arr = UserPartitionRelationship::getParentIdArr($item['user_id']); if (in_array($user_id, $parent_id_arr)) { $item->parent_team = $user_id; $item->save(); if (!empty($item->parent_team)) { $achievement_sum = $item['team_achievement'] + $item['personal_achievement']; $is_add = true; foreach ($grant['award_proportion'] as $key => $value) { if ($value['money'] <= $achievement_sum) { $is_add = false; } } if ($is_add) { //获取上级团长数据 $parent_achievement = AchievementAwardLog::getOne([ ['mall_id' => $mall_id], ['grant_id' => $grant_id], ['user_id' => $item->parent_team], ['status' => StatusEnum::ENABLED] ]); $parent_achievement->team_achievement += $achievement_sum; $parent_achievement->achievement_sum += $achievement_sum; if (!$parent_achievement->save()) var_dump('保存上级团长数据失败user_id:' . $item->parent_team); //查看是否需要更改所有上级团队业绩 self::changeParentAchievement($grant, $item->parent_team); } } } } return true; } //查看是否需要更改所有上级团队业绩 public static function changeParentAchievement($grant, $first_user_id) { $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id); $parent_id_arr[] = $first_user_id; $parent_id_arr = array_reverse($parent_id_arr); $list = []; $award_list = AchievementAwardLog::lists([ 'where' => [ ['mall_id' => $grant['mall_id']], ['grant_id' => $grant['id']], ['user_id' => $parent_id_arr], ] ], false); $award_arr = array_column($award_list, null, 'user_id'); foreach ($parent_id_arr as $parent_id) { if (isset($award_arr[$parent_id])) { $list[] = $award_arr[$parent_id]; } // foreach ($award_list as $award_log) { // if ($parent_id == $award_log->user_id) { // $list[] = $award_log; // } // } } // $sub_team_achievemment = []; $award_proportion = $grant['award_proportion']; $grant['award_proportion'] = json_encode($grant['award_proportion']); $change_team_achievemment = []; // print_r($list);exit; foreach ($list as $item) { // print_r($change_team_achievemment); // $item = self::checkAchievementPlanC($item, $award_proportion, $first_user_id, 0, $change_team_achievemment); $item['team_achievement'] = AchievementLogic::getTeamAchievementByParentTeamC($item['user_id'], $grant['id']); $item['equal_first'] = AchievementLogic::getEqualFirstByParentTeamC($item['user_id'], $grant['id']); $item['equal_second'] = AchievementLogic::getEqualSecondByParentTeamC($item['user_id'], $grant['id']); $item['team_achievement'] = $item['team_achievement'] ?? 0; $item['equal_first'] = $item['equal_first'] ?? 0; $item['equal_second'] = $item['equal_second'] ?? 0; var_dump('user_id:' . $item['user_id'] . '---team_achievement:' . $item['team_achievement']); //获取团队业绩数据 $team_achievement = $achievement_sum = $item['team_achievement']; $achievement_sum += $item['personal_achievement']; $award = AchievementLogic::confirmProportion($grant['award_proportion'], $achievement_sum, $item['personal_achievement'], $grant['settlement_mode'], $grant['is_team_achievement']); $item->award_proportion = $award['proportion']; $item->award_money = $award['money']; $item->team_achievement = $team_achievement ?? 0.00; $item->achievement_sum = $achievement_sum; $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; $item->team_equal_first = empty($c_equal_type) ? $item->equal_first : 0; $item->team_equal_second = empty($c_equal_type) ? $item->equal_second : 0; // print_r($item); if (!$item->save()) var_dump('业绩添加个人业绩日志时失败'); // if (empty($sub_team_achievemment)) break; //总业绩达标,且奖励金额不为0时,只累计当前团长数据 // if ($is_add == false) break; } // print_r($list);exit; } protected static function changeParentTeam($mall_id, $grant_id, $user_id) { $award_log = AchievementAwardLog::find() ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $user_id]) ->one(); if ($award_log) { $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id); $award_log->save(); } } 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); //开启了团队业绩按钮,如果user_id 不是下单用户本人,则需要给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) { $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->team_achievement = 0.00; $award_log->personal_achievement = 0.00; $award_log->sub_personal_achievement = 0.00; } $team_achievement_data = AchievementAwardLogExtra::getOne([ ['mall_id' => $grant['mall_id']], ['user_id' => $item['user_id']], ['grant_id' => $grant['id']], ], true); if (empty($team_achievement_data)) { $team_achievement = self::checkAchievement($grant['mall_id'], $grant['id'], $item['user_id']); } else { $team_achievement = $team_achievement_data['team_achievement']; } $award_log->team_achievement = $team_achievement; $award_log->achievement_sum = $team_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[] = [ 'user_id' => $award_log->user_id, 'money' => $award['money'] ]; if ($grant['settlement_mode'] == 2) { $award_log->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']); } } else { $award_log->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']); $award_log->proportion_money = $award['money']; } $is_skip_settlement = self::checkCanSettle($grant, $award_log->user_id); $award_log->is_skip_settlement = $is_skip_settlement; if (!$award_log->save()) throw new \Exception($item['user_id'] . "业绩添加父级业绩日志时失败"); $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 = AchievementOrderLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('price'); $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 ?? 0; if (!$grant->save()) throw new \Exception("业绩修改规则日志失败"); } public static function settleEqual($grant, $user_id) { $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; } public static function planD($grant, $first_user_id, $config) { // 取出所有 $grant_id = $grant['id']; $mall_id = $grant['mall_id']; $current_id = $first_user_id; $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id); if (!empty($parent_id_arr)) $current_id = current($parent_id_arr); $child_ids = UserPartitionRelationship::getChildIdArr($current_id); $child_ids[] = $current_id; $list = AchievementAwardLog::find() ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $child_ids]) ->all(); /** * @var $item AchievementAwardLog */ foreach ($list as $item) { $item->equal_first = bcmul($item->award_money, bcmul($config['equal_price_first'], 0.01, 3), 3); $item->equal_second = bcmul($item->award_money, bcmul($config['equal_price_second'], 0.01, 3), 3); $item->team_equal_first = 0; $item->team_equal_second = 0; $item->equal_money = 0; // 先将平级奖设置为0 echo "$item->id $item->user_id $item->award_money $item->equal_first $item->equal_first \n"; if (!$item->save()) throw new \Exception("重新计算平级奖失败 {$item->id} !!"); } } public static function planCTwo($grant, $award_list, $first_user_id, $price, $c_equal_type, $order_no) { $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id); $parent_id_arr[] = $first_user_id; $parent_id_arr = array_reverse($parent_id_arr); $award_list = AchievementAwardLog::lists([ 'where' => [ ['mall_id' => $grant['mall_id']], ['grant_id' => $grant['id']], ['user_id' => $parent_id_arr], ], ], false); $list = []; $award_arr = array_column($award_list, null, 'user_id'); // foreach ($parent_id_arr as $parent_id) { // if (isset($award_arr[$parent_id])) { // $list[] = $award_arr[$parent_id]; // } // } //获取上级团长信息 $team_user_data = AchievementUser::lists([ 'where' => [ ['mall_id' => $grant['mall_id']], ['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED] ], 'index' => 'user_id', ]); $change_team_achievemment = []; foreach ($parent_id_arr as $id) { $is_add = true; //获取团队业绩数据 if (empty($award_arr[$id])) { //如果不是团长,则跳过 if (empty($team_user_data[$id])) continue; $item = new AchievementAwardLog(); $item->loadDefaultValues(); $item->mall_id = $grant->mall_id; $item->grant_id = $grant->id; $item->user_id = $id; $item->sub_personal_achievement = 0.00; $item->parent_team = AchievementLogic::getParentAchievementUser($id); //获取当前用户上级 } else { $item = $award_arr[$id]; } $award_proportion = json_decode($grant['award_proportion'], true); // print_r($change_team_achievemment); var_dump('user_id:' . $item['user_id'] . ',order_no:' . $order_no . 'change_team_achievemment:' . json_encode($change_team_achievemment)); //数据操作 // $item = self::checkAchievementPlanC($item, $award_proportion, $first_user_id, $price, $change_team_achievemment); $item['team_achievement'] = AchievementLogic::getTeamAchievementByParentTeamC($id, $grant['id']); $item['equal_first'] = AchievementLogic::getEqualFirstByParentTeamC($id, $grant['id']); $item['equal_second'] = AchievementLogic::getEqualSecondByParentTeamC($id, $grant['id']); $item['team_achievement'] = $item['team_achievement'] ?? 0; $item['equal_first'] = $item['equal_first'] ?? 0; $item['equal_second'] = $item['equal_second'] ?? 0; // print_r($item); $team_achievement = $achievement_sum = $item['team_achievement']; $achievement_sum += $item['personal_achievement']; $award = AchievementLogic::confirmProportion($grant['award_proportion'], $achievement_sum, $item['personal_achievement'], $grant['settlement_mode'], $grant->is_team_achievement); $item->award_proportion = $award['proportion']; $item->award_money = $award['money']; $item->team_achievement = $team_achievement ?? 0.00; $item->achievement_sum = $achievement_sum; $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; $item->team_equal_first = empty($c_equal_type) ? $item->equal_first : 0; $item->team_equal_second = empty($c_equal_type) ? $item->equal_second : 0; if (!$item->save()) throw new \Exception("业绩添加个人业绩日志时失败"); //总业绩达标,且奖励金额不为0时,只累计当前团长数据 if ($is_add == false) break; } // print_r($list);exit; } //planC检查团队业绩 public static function checkAchievementPlanC($item, $award_proportion, $first_user_id, $price, &$change_team_achievemment) { $team_achievement_data = []; $team_achievement = $item['team_achievement']; $equal_first = $item['equal_first']; $equal_second = $item['equal_second']; $achievement_sum = $item['team_achievement'] + $item['personal_achievement']; if (empty($change_team_achievemment) && $item['user_id'] != $first_user_id) return $item; if (!empty($change_team_achievemment[$item['user_id']])) { $team_achievement_data = $change_team_achievemment[$item['user_id']]; } //根据数据类型,进行数据操作 if (!empty($team_achievement_data)) { if ($team_achievement_data['type'] == 'add') { $team_achievement += $team_achievement_data['team_achievement']; $achievement_sum += $team_achievement_data['team_achievement']; $equal_first += $team_achievement_data['equal_first']; $equal_second += $team_achievement_data['equal_second']; } else { $team_achievement -= $team_achievement_data['team_achievement']; $achievement_sum -= $team_achievement_data['team_achievement']; $equal_first -= $team_achievement_data['equal_first']; $equal_second -= $team_achievement_data['equal_second']; } } //判断是否达标 $is_sub = false; foreach ($award_proportion as $key => $value) { if ($value['money'] <= $achievement_sum) { $is_sub = true; break; } } if ($is_sub) {//业绩达标,扣减上级团长团队业绩 $team_achievement_data = [ 'type' => 'sub', 'team_achievement' => $achievement_sum, 'equal_first' => $equal_first, 'equal_second' => $equal_second, 'is_team' => true, ]; if ($item['award_money'] == 0) { //第一次达标时,将当前订单金额从总业绩内扣除 $team_achievement_data['team_achievement'] -= $price; } else { $team_achievement_data = []; } } else { //曾经达标,需重新为上级增加团队业绩 if ($item['award_money'] > 0) { $team_achievement_data = [ 'type' => 'add', 'team_achievement' => $achievement_sum, 'equal_first' => $equal_first, 'equal_second' => $equal_second, 'is_team' => true, ]; } else {//未达标过,则累加当前订单金额 if (empty($team_achievement_data['is_team'])) { if ($price > 0) { $team_achievement_data = [ 'type' => 'add', 'team_achievement' => $price, 'equal_first' => $equal_first, 'equal_second' => $equal_second, ]; } } } } $change_team_achievemment = []; $change_team_achievemment[$item['parent_team']] = $team_achievement_data; $item['team_achievement'] = $team_achievement; $item['equal_first'] = $equal_first; $item['equal_second'] = $equal_second; // $return = ['team_achievement' => $team_achievement, 'equal_first' => $equal_first, 'equal_second' => $equal_second, 'user_id' => $item['user_id']]; return $item; } /** * 检查团队业绩 * * @param $mall_id * @param $grant_id * @param $user_id * @return int|mixed */ public static function checkAchievement($mall_id, $grant_id, $user_id) { //获取下级团长数据 $my_team_data = AchievementAwardLog::lists([ 'where' => [ ['mall_id' => $mall_id], ['grant_id' => $grant_id], ['parent_team' => $user_id] ], ]); $team_achievement = 0; if (!empty($my_team_data)) { $user_ids = array_column($my_team_data, 'user_id'); //获取下级团长团队数据 $team_achievement_data = AchievementAwardLogExtra::lists([ 'where' => [ ['mall_id' => $mall_id], ['user_id' => $user_ids], ['grant_id' => $grant_id], ], 'index' => 'user_id', ]); foreach ($my_team_data as $value) { $temp_team_achievement = $team_achievement_data[$value['user_id']]['team_achievement'] ?? 0; $team_achievement += $value['personal_achievement'] + $temp_team_achievement; } } return $team_achievement; } /** * 因为升级,需要修复parent_team=='',parent_team字段 * @param $mall_id * @param $grant_id * @param $settlement_mode * @return string|void */ public static function fillParentTeamByEmpty($mall_id, $grant_id, $settlement_mode) { if ($settlement_mode == 0) { return ''; } //获取规则数据 $grant = AchievementGrantLog::getOne([ ['mall_id' => $mall_id], ['id' => $grant_id], ], true); if (!empty($grant['award_proportion'])) $grant['award_proportion'] = json_decode($grant['award_proportion'], true); $j = 1; while (true) { $limit = 1000; $offset = ($j - 1) * $limit; $list = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id]) ->andWhere(['parent_team' => '']) ->offset($offset) ->limit($limit) ->all(); if (empty($list)) { break; } foreach ($list as $item) { $item->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']); $item->save(); if (!empty($item->parent_team)) { $achievement_sum = $item['team_achievement'] + $item['personal_achievement']; $is_add = true; foreach ($grant['award_proportion'] as $key => $value) { if ($value['money'] <= $achievement_sum) { $is_add = false; } } if ($is_add) { //获取上级团长数据 $parent_achievement = AchievementAwardLog::getOne([ ['mall_id' => $mall_id], ['grant_id' => $grant_id], ['status' => StatusEnum::ENABLED], ['user_id' => $item->parent_team] ]); if (empty($parent_achievement)) { $del_award_log = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'grant_id' => $grant_id, 'user_id' => $item->parent_team, 'status' => StatusEnum::DELETE]) ->select('personal_achievement')->orderBy('id desc')->one(); $parent_achievement = new AchievementAwardLog(); $parent_achievement->loadDefaultValues(); $parent_achievement->mall_id = $mall_id; $parent_achievement->grant_id = $grant_id; $parent_achievement->personal_achievement = $del_award_log['personal_achievement'] ?? 0; $parent_achievement->user_id = $item->parent_team; $parent_achievement->sub_personal_achievement = 0.00; $parent_achievement->parent_team = AchievementLogic::getParentAchievementUser($item->parent_team); } $parent_achievement->team_achievement += $achievement_sum; $parent_achievement->achievement_sum += $achievement_sum; if (!$parent_achievement->save()) var_dump('保存上级团长数据失败user_id:' . $item->parent_team); } } } $j++; } } //迁移文件-统计未结算周期用户团队业绩 public function statisAward($data) { $mall_list = Mall::getEnableMallList(true); if (!empty($mall_list)) { foreach ($mall_list as $mall) { $isInsall = MallAddons::isInstall($mall['id'], AchievementEnum::ADDONS_NAME); if (!$isInsall) continue; //获取所有未结算周期 $grant_list = AchievementAwardLog::find()->where(['mall_id' => $mall['id'], 'is_settlement' => 0, 'status' => 1])->asArray()->all(); if (empty($grant_list)) { continue; } $grant_ids = array_column($grant_list, 'grant_id', 'grant_id'); foreach ($grant_ids as $key => $value) { //查找对应周期的订单 $grant_order_list = AchievementOrderLog::lists([ 'where' => [ ['mall_id' => $mall['id']], ['status' => StatusEnum::ENABLED], ['grant_id' => $value], ] ]); if (empty($grant_order_list)) continue; foreach ($grant_order_list as $k => $val) { $parent_id_arr = UserPartitionRelationship::getParentIdArr($val['user_id']); if (empty($parent_id_arr)) continue; $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)) continue; //获取团长的上级 $parent_id_arr = UserPartitionRelationship::getParentIdArr($achievement_user['user_id']); if (empty($parent_id_arr)) continue; $parent_id_arr = array_reverse($parent_id_arr); //处理拓展表数据 foreach ($parent_id_arr as $uk => $uv) { //实例化拓展表 $extra_info = AchievementAwardLogExtra::getOne([ ['mall_id' => $mall['id']], ['user_id' => $uv], ['grant_id' => $value], ]); if (empty($extra_info)) { $extra_info = new AchievementAwardLogExtra(); $extra_info->mall_id = $mall['id']; $extra_info->user_id = $uv; $extra_info->grant_id = $value; $extra_info->equal_first = 0.00; $extra_info->equal_second = 0.00; } if ($val['price'] <= 0) continue; $extra_info->team_achievement += $val['price']; $extra_info->save(); if (!$extra_info->save()) echo 'user_id:' . $uv . 'order_detail_id:' . $val['order_detail_id'] . '写入失败'; } } } } } return true; } public static function checkCanSettle($grant, $user_id) { $is_skip_settlement = 0; //判断周期是否开启了 团长首页不发放奖励 if (empty($grant['is_leader_first_month_no_award']) || $grant['cycle'] !== 1) { return $is_skip_settlement; } //判断团长是否首月 $achievement_user = AchievementUser::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED]); $is_current_month = self::isCurrentMonth($achievement_user['created_at']); return $is_current_month ? 1 : 0; } public static function isCurrentMonth($timestamp) { //判断是否时间戳是否是当月的 // 获取时间戳对应的年月 $targetYear = date('Y', $timestamp); $targetMonth = date('m', $timestamp); // 获取当前年月 $currentYear = date('Y'); $currentMonth = date('m'); return ($targetYear == $currentYear) && ($targetMonth == $currentMonth); } public static function fillParentTeam($mall_id, $grant) { $j = 1; if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差 } else { $grant_id = $grant['id']; while (true) { $limit = 1000; $offset = ($j - 1) * $limit; $list = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id]) ->andWhere(['parent_team' => '']) ->offset($offset) ->limit($limit) ->all(); if (empty($list)) { break; } foreach ($list as $item) { $item->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']); $item->save(); } $j++; } } } /** * 迁移文件-统计未结算周期用户团队业绩,修复AwardLog * @return true * @throws Exception */ public static function fixAwardLog() { $mall_list = Mall::getEnableMallList(true); if (!empty($mall_list)) { foreach ($mall_list as $mall) { $isInsall = MallAddons::isInstall($mall['id'], AchievementEnum::ADDONS_NAME); if (!$isInsall) continue; //获取所有未结算周期 $award_log_list = AchievementAwardLog::find()->where(['mall_id' => $mall['id'], 'is_settlement' => 0, 'status' => 1])->all(); if (empty($award_log_list)) continue; $grant_ids = array_column($award_log_list, 'grant_id'); $grant_list = AchievementGrantLog::find()->where(['id' => $grant_ids])->indexBy('id')->all(); foreach ($award_log_list as $award_log) { $grant = $grant_list[$award_log['grant_id']]; $team_achievement_data = AchievementAwardLogExtra::getOne([ ['mall_id' => $award_log['mall_id']], ['user_id' => $award_log['user_id']], ['grant_id' => $award_log['grant_id']], ], true); if (empty($team_achievement_data)) { $team_achievement = self::checkAchievement($award_log['mall_id'], $award_log['grant_id'], $award_log['user_id']); } else { $team_achievement = $team_achievement_data['team_achievement']; } $award_log->team_achievement = $team_achievement; $award_log->achievement_sum = $team_achievement + $award_log->personal_achievement; $award_log->save(); $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; if ($grant['settlement_mode'] == 2) { $award_log->parent_team = AchievementLogic::getParentAchievementUser($award_log['user_id']); } } else { $award_log->parent_team = AchievementLogic::getParentAchievementUser($award_log['user_id']); $award_log->proportion_money = $award['money']; } $is_skip_settlement = self::checkCanSettle($grant, $award_log->user_id); $award_log->is_skip_settlement = $is_skip_settlement; if (!$award_log->save()) throw new \Exception($award_log['user_id'] . "业绩添加父级业绩日志时失败"); } foreach ($grant_list as $grant) { $configs = \Yii::$app->services->setting->addons->get($grant['mall_id'], AddonsEnum::ADDONS_NAME_ACHIEVEMENT, 'basic'); $award_log_list = AchievementAwardLog::find()->where(['mall_id' => $grant['mall_id'], 'grant_id' => $grant['id']])->all(); if ($grant->settlement_mode == 1) self::fixPlanB($grant, $award_log_list);//极差 if ($grant->settlement_mode == 2) self::fixPlanC($grant, $award_log_list, $configs);//极差 $c_equal_type = $configs['equal_type'] ?? 0; if (!empty($c_equal_type)) self::planD($grant, $award_log_list, $configs); self::fixSettleEqual($grant, $award_log_list); self::updateGrant($grant); } } } return true; } /** * 迁移文件-统计未结算周期用户团队业绩,修复planB * * @param $grant * @param $award_log_list * @return int|mixed * @throws Exception */ public static function fixPlanB($grant, $award_log_list) { $user_id_arr = array_column($award_log_list, 'user_id'); $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 ($award_log_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; } /** * 迁移文件-统计未结算周期用户团队业绩,修复planC * * @param $grant * @param $award_log_list * @param $configs * @return void * @throws Exception */ public static function fixPlanC($grant, $award_log_list, $configs) { $c_equal_type = $configs['equal_type'] ?? 0; foreach ($award_log_list as $value) { $first_user_id = $value['user_id']; $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id); $parent_id_arr[] = $first_user_id; $parent_id_arr = array_reverse($parent_id_arr); $award_list = AchievementAwardLog::lists([ 'where' => [ ['mall_id' => $grant['mall_id']], ['grant_id' => $grant['id']], ['user_id' => $parent_id_arr], ], ], false); $award_arr = array_column($award_list, null, 'user_id'); //获取上级团长信息 $team_user_data = AchievementUser::lists([ 'where' => [ ['mall_id' => $grant['mall_id']], ['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED] ], 'index' => 'user_id', ]); foreach ($parent_id_arr as $id) { //获取团队业绩数据 if (empty($award_arr[$id])) { //如果不是团长,则跳过 if (empty($team_user_data[$id])) continue; $item = new AchievementAwardLog(); $item->loadDefaultValues(); $item->mall_id = $grant->mall_id; $item->grant_id = $grant->id; $item->user_id = $id; $item->sub_personal_achievement = 0.00; $item->parent_team = AchievementLogic::getParentAchievementUser($id); //获取当前用户上级 } else { $item = $award_arr[$id]; } //数据操作 $item['team_achievement'] = AchievementLogic::getTeamAchievementByParentTeamC($id, $grant['id']); $item['equal_first'] = AchievementLogic::getEqualFirstByParentTeamC($id, $grant['id']); $item['equal_second'] = AchievementLogic::getEqualSecondByParentTeamC($id, $grant['id']); $item['team_achievement'] = $item['team_achievement'] ?? 0; $item['equal_first'] = $item['equal_first'] ?? 0; $item['equal_second'] = $item['equal_second'] ?? 0; $team_achievement = $achievement_sum = $item['team_achievement']; $achievement_sum += $item['personal_achievement']; $award = AchievementLogic::confirmProportion($grant['award_proportion'], $achievement_sum, $item['personal_achievement'], $grant['settlement_mode'], $grant->is_team_achievement); $item->award_proportion = $award['proportion']; $item->award_money = $award['money']; $item->team_achievement = $team_achievement ?? 0.00; $item->achievement_sum = $achievement_sum; $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; $item->team_equal_first = empty($c_equal_type) ? $item->equal_first : 0; $item->team_equal_second = empty($c_equal_type) ? $item->equal_second : 0; if (!$item->save()) throw new \Exception("业绩添加个人业绩日志时失败"); } } } /** * 迁移文件-统计未结算周期用户团队业绩,修复planD * * @param $grant * @param $award_log_list * @param $config * @return void * @throws Exception */ public static function fixPlanD($grant, $award_log_list, $config) { // 取出所有 $grant_id = $grant['id']; $mall_id = $grant['mall_id']; foreach ($award_log_list as $value) { $current_id = $value['user_id']; $first_user_id = $value['user_id']; $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id); if (!empty($parent_id_arr)) $current_id = current($parent_id_arr); $child_ids = UserPartitionRelationship::getChildIdArr($current_id); $child_ids[] = $current_id; $list = AchievementAwardLog::find() ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $child_ids]) ->all(); /** * @var $item AchievementAwardLog */ foreach ($list as $item) { $item->equal_first = bcmul($item->award_money, bcmul($config['equal_price_first'], 0.01, 3), 3); $item->equal_second = bcmul($item->award_money, bcmul($config['equal_price_second'], 0.01, 3), 3); $item->team_equal_first = 0; $item->team_equal_second = 0; $item->equal_money = 0; // 先将平级奖设置为0 echo "$item->id $item->user_id $item->award_money $item->equal_first $item->equal_first \n"; if (!$item->save()) throw new \Exception("重新计算平级奖失败 {$item->id} !!"); } } } /** * 迁移文件-统计未结算周期用户团队业绩,修复settleEqual * @param $grant * @param $award_log_list * @return true * @throws Exception */ public static function fixSettleEqual($grant, $award_log_list) { foreach ($award_log_list as $value) { $grant_id = $grant['id']; $mall_id = $grant['mall_id']; $user_id = $value['user_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; } }