| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484 |
- <?php
- namespace addons\Achievement\common\logic;
- use addons\Achievement\common\enums\AchievementEnum;
- use addons\Achievement\common\models\AchievementAwardLog;
- use addons\Achievement\common\models\AchievementAwardLogExtra;
- use addons\Achievement\common\models\AchievementCommissionItemSetting;
- use addons\Achievement\common\models\AchievementFirstOrder;
- use addons\Achievement\common\models\AchievementGrantLog;
- use addons\Achievement\common\models\AchievementOrderLog;
- use addons\Achievement\common\models\AchievementUser;
- use addons\CloudStock\common\models\CloudStockGoods;
- use common\enums\AddonsEnum;
- use common\enums\StatusEnum;
- use common\models\mall\Mall;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\user\UserPartitionRelationship;
- use Exception;
- class AchievementOrderLogic
- {
- public static function orderStatistics($order)
- {
- $t = \Yii::$app->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;
- }
- }
|