| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- namespace app\utils\Share;
- use app\events\OrderEvent;
- use app\models\AgentGoodsInstallLog;
- use app\models\BonusPool as ModelsBonusPool;
- use app\models\BonusPoolDetail;
- use app\models\BonusPoolLevel;
- use app\models\Goods;
- use app\models\Order;
- use app\models\OrderDetail;
- use app\models\PtActivityOrder;
- use app\models\ReOrder;
- use app\models\SaasUser;
- use app\models\ShareDetail;
- use app\models\ShareHolder;
- use app\models\ShareHolderFrostLog;
- use app\models\ShareHolderLevelLog;
- use app\models\ShareHolderOutLog;
- use app\models\ShareHolderLevel;
- use app\models\ShareHolderParentOutLog;
- use app\models\ShareHolderProfitGoodsLog;
- use app\models\ShareHolderSlippedLog;
- use app\models\User;
- use app\models\UserTreePath;
- use app\models\OldUserTreePath;
- use app\models\Option;
- use app\constants\OptionSetting;
- use app\models\AccountLog;
- use Exception;
- use yii\base\BaseObject;
- use yii\helpers\Json;
- use app\models\GoodsChainLevel;
- use app\utils\FuGou;
- use app\models\ShareHolderFugouFrostLog;
- /**
- * 股东分红
- * Class CloudPrint
- * @package app\utils\Share
- */
- class BonusPool
- {
- // 根据商品id获取订单股东分红基数
- // $goodsList = [['id' => 1, 'num' => 2, 'pay_price' => 100], ['id' => 2, 'num' => 3, 'pay_price' => 100]];
- public static function getOrderLevelProfit($store_id, array $goodsList)
- {
- $levels = ShareHolderLevel::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'status' => 1])->select(['id'])->asArray()->all();
- $profit = [];
- foreach ($levels as $level) {
- foreach ($goodsList as $goods) {
- $chainLevel = GoodsChainLevel::find()->where(['goods_id' => $goods['id']])->asArray()->one();
- if ($chainLevel && (bool)$chainLevel['is_open'] && $chainLevelValue = \json_decode($chainLevel['value'], true)) {
- if (isset($chainLevelValue[$level['id']])) {
- if ($chainLevel['type'] == 1) { // 固定金额
- $profit[$level['id']]['direct'] += $chainLevelValue[$level['id']][0] * $goods['num'];
- $profit[$level['id']]['indirect'] += $chainLevelValue[$level['id']][1] * $goods['num'];
- } else {
- // 百分比
- $profit[$level['id']]['direct'] += ($chainLevelValue[$level['id']][0] * $goods['pay_price'] / 100);
- $profit[$level['id']]['indirect'] += ($chainLevelValue[$level['id']][1] * $goods['pay_price'] / 100);
- }
- } else {
- $profit[$level['id']]['direct'] += 0;
- $profit[$level['id']]['indirect'] += 0;
- }
- } else {
- $profit[$level['id']]['direct'] += 0;
- $profit[$level['id']]['indirect'] += 0;
- }
- }
- }
- return $profit;
- }
- public static function checkFrost($user_id)
- {
- $parent = ShareHolderOutLog::findOne(['parent_user_id' => $user_id]);
- if (!$parent) {
- return false;
- }
- $is = ShareHolderOutLog::findOne(['parent_user_id' => $user_id, 'status' => 0]);
- return $is ? false : true;
- }
- /**
- * 在发放 链动极差佣金的时候,判断一下购买人的升级产品金额和获得佣金人的升级产品金额,如果获得佣金人的购物金额小于了购买人购物金额,
- * 按照获得佣金人购买升级产品的金额进行返佣。
- * @param $base_price
- * @param $parent_user_id
- * @return int|mixed
- */
- public static function getBasePrice($base_price, $parent_user_id, $store_id, $order_id) {
- $shareHolderProfitSwitch = Option::get('shareHolderProfitSwitch', $store_id, 'bonus_pool', 0)['value'];
- //当购买低价格产品成为代理后,再推荐高价格代理时,代理可以获取到高价格产品佣金*佣金折扣比例作为分红基数
- $shareHolderHighProfit = Option::get('shareHolderHighProfit', $store_id, 'bonus_pool', 0)['value'];
- //如果未开启 则系统中的参数比例判定为0
- if (!intval($shareHolderProfitSwitch)) {
- $shareHolderHighProfit = 0;
- }
- //获取父级购买的升级最高价产品金额 与当前订单中的最高价商品进行比对 确认是否是小推大
- $order_log = ShareHolderProfitGoodsLog::find()->alias('l')->where(['l.user_id' => $parent_user_id, 'l.is_switch' => 1])
- ->leftJoin(['o' => Order::tableName()], 'l.order_id = o.id')->andWhere(['o.is_sale' => 1])
- ->orderBy('l.goods_price desc')->select('l.order_id, l.goods_id, l.goods_price')->asArray()->one();
- if ($order_log) {
- //父级购买的升级最高价产品金额
- $old_price = $order_log['goods_price'];
- } else {
- /**
- * 如果没有记录就获取父级首次升级成为股东的订单记录
- * 获取该订单中最高金额的产品与当前订单中的最高金额商品进行比较
- * 如果小于当前订单中的商品金额
- * 就表示满足小推大条件
- **/
- $level_log = ShareHolderLevelLog::find()->where(['AND', ['user_id' => $parent_user_id], ['>', 'order_id', 0]])
- ->orderBy('id ASC')->select('order_id')->asArray()->one();
- if (!$level_log) {
- return $base_price;
- }
- $old_order_detail_arr = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()], 'od.goods_id = g.id')
- ->where(['od.order_id' => $level_log['order_id'], 'od.is_delete' => 0])
- ->select('od.goods_info, od.attr, g.share_holder_profit_switch, g.share_holder_high_profit, g.id, od.total_price, od.num')->asArray()->all();
- $old_price = 0;
- /**
- * 判断原来的商品是否开启分红 或者 开启独立链动 (防止下单多个大额商品但是非股东分红产品,容易对比失败)
- * 因为原来下单时候没有将GoodsChainLevel添加在订单详情表商品信息中的 所以可能会有问题
- * 假如一个商品原来没有设置分红也没有开启独立链动 后来才开启独立链动的 从订单详情商品信息中查询不到GoodsChainLevel
- * 可能会使用后来添加的独立链动 就判定$open为true了
- **/
- foreach ($old_order_detail_arr as $order_detail_item) {
- $open = false;
- $old_goods_info = json_decode($order_detail_item['goods_info'], true);
- if (!empty($old_goods_info)) {
- //原订单商品开启分红
- if ($old_goods_info['rate'] > 0) {
- $open = true;
- } else {
- //未开启分红但是订单信息中存储的有商品独立链动数据
- if (!empty($old_goods_info['goods_chain_level'])) {
- $goodsChainLevel = $old_goods_info['goods_chain_level'];
- if (intval($goodsChainLevel['is_open'])) {
- if (!empty($goodsChainLevel['value'])) {
- $open = true;
- }
- }
- } else {
- //异常情况 假设没有存储商品独立链动数据 就只能使用最新的独立链动数据 来确认是否满足小推大条件
- $goodsChainLevel = GoodsChainLevel::findOne(['goods_id' => $order_detail_item['id']]);
- if (!empty($goodsChainLevel)) {
- if (intval($goodsChainLevel->is_open)) {
- $chainLevelValue = json_decode($goodsChainLevel->value, true);
- if (!empty($chainLevelValue)) {
- $open = true;
- }
- }
- }
- }
- }
- }
- //如果满足条件 就选出金额最大的一个商品单价
- if ($open) {
- $old_price_ = bcdiv($order_detail_item['total_price'], $order_detail_item['num'], 2);
- if ($old_price_ > $old_price) {
- $old_price = $old_price_;
- }
- }
- }
- }
- //获取当前订单中的信息
- $order_detail_arr = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()], 'od.goods_id = g.id')
- ->where(['od.order_id' => $order_id, 'od.is_delete' => 0])
- ->select('od.goods_info, od.attr, g.share_holder_profit_switch, g.share_holder_high_profit, g.id, od.total_price, od.num')->asArray()->all();
- $new_price = 0;
- foreach ($order_detail_arr as $order_detail_item) {
- //获取当前订单中的商品分红
- $goods = Goods::findOne($order_detail_item['id']);
- $open = false;
- if ($goods->rate > 0) {
- $open = true;
- } else {
- //如果没开启分红就判断是否开启独立链动
- $goodsChainLevel = GoodsChainLevel::findOne(['goods_id' => $order_detail_item['id']]);
- if (!empty($goodsChainLevel)) {
- if (intval($goodsChainLevel->is_open)) {
- $chainLevelValue = json_decode($goodsChainLevel->value, true);
- if (!empty($chainLevelValue)) {
- $open = true;
- }
- }
- }
- }
- if ($open) {
- //如果开启就判断当前订单商品是否开启独立的小推大开关以及设置比例
- $goods_info = json_decode($order_detail_item['goods_info'], true);
- $is_use_goods_profit = 0;
- if (isset($goods_info['share_holder_profit_switch']) &&
- intval($goods_info['share_holder_profit_switch']) &&
- isset($goods_info['share_holder_high_profit']) &&
- floatval($goods_info['share_holder_high_profit']) > 0
- ) {
- $is_use_goods_profit = 1;
- }
- $new_price_ = bcdiv($order_detail_item['total_price'], $order_detail_item['num'], 2);
- //选出金额最大的 如果开启独立的小推大 就使用独立小推大比例否则就使用系统默认的小推大比例
- if ($new_price_ > $new_price) {
- $new_price = $new_price_;
- if ($is_use_goods_profit) {
- $shareHolderHighProfit = floatval($goods_info['share_holder_high_profit']);
- } else {
- $shareHolderHighProfit = Option::get('shareHolderHighProfit', $store_id, 'bonus_pool', 0)['value'];
- $shareHolderProfitSwitch = Option::get('shareHolderProfitSwitch', $store_id, 'bonus_pool', 0)['value'];
- if (!intval($shareHolderProfitSwitch)) {
- $shareHolderHighProfit = 0;
- }
- }
- }
- }
- }
- //判断小推大是否成立
- if ($old_price < $new_price) {
- if ($shareHolderHighProfit <= 0) {
- return $base_price;
- }
- $base_price *= ($shareHolderHighProfit / 100);
- }
- return $base_price;
- }
- // 获取商品等级佣金
- public static function getProfitByOrder($chainLevelValue, $level_id, $back, $is_direct = false, $shareHolderProfit = 0, $isFrost = false, $other_params = [])
- {
- if ($isFrost && $shareHolderProfit <= 0) {
- $back = 0;
- }
- if (!$chainLevelValue) {
- return $back;
- }
- if (!isset($chainLevelValue[$level_id])) {
- return $back;
- }
- if ($is_direct) {
- $basePrice = isset($chainLevelValue[$level_id]['direct']) ? $chainLevelValue[$level_id]['direct'] : 0;
- } else {
- $basePrice = isset($chainLevelValue[$level_id]['indirect']) ? $chainLevelValue[$level_id]['indirect'] : 0;
- }
- if ($basePrice > 0) {
- if ($other_params) {
- $basePrice = self::getBasePrice($basePrice, $other_params['parent_id'], $other_params['store_id'], $other_params['order_id']);
- }
- if ($isFrost) {
- return $shareHolderProfit > 0 ? \round(($shareHolderProfit / 100) * $basePrice, 2) : 0;
- }
- return $shareHolderProfit > 0 ? \round(((100 - $shareHolderProfit) / 100) * $basePrice, 2) : $basePrice;
- }
- return $back;
- }
- /**
- * 级差分红
- * @param $order_id
- * @param $is_send 0 添加未发放 1 发放佣金
- * @param $order_type
- */
- public static function levelShare($order_id, $order_type = 0)
- {
- if ($order_type == 0) {
- $order = Order::findOne($order_id);
- }
- \Yii::warning('---------------- 级差分红计算开始 -------------------');
- // 判断是否开启奖金池
- $setting = [
- 'cycle' => Option::get('cycle', $order->store_id, 'bonus_pool', 0)['value'],
- // 'is_open_share' => Option::get('is_open_share', $order->store_id, 'bonus_pool', 0)['value'],
- // 'is_open_range' => Option::get('is_open_range', $order->store_id, 'bonus_pool', 0)['value'],
- 'team_num' => Option::get('team_num', $order->store_id, 'bonus_pool', 0)['value']
- ];
- // if (!$setting['is_open_range']) {
- // \Yii::warning('---------------- 未开启级差分红 -------------------');
- // return;
- // }
- self::oldLevelShare($order);
- $base_price = $order->profit;
- $user_parent = OldUserTreePath::find()->alias('ut')
- ->where(['ut.child_id' => $order->user_id])
- // ->leftJoin(['h' => ShareHolder::tableName()], 'ut.parent_id=h.user_id')
- // ->andWhere('h.id is not null')
- ->andWhere('ut.child_id != ut.parent_id')
- // ->andWhere(['h.is_delete' => 0, 'h.status' => 1])
- ->orderBy(['ut.parent_level' => SORT_DESC])
- ->asArray()
- ->select(['ut.*'])
- ->all();
- // 已分销比例
- $share_num = 0;
- $level_id = 0;
- $shareHolderProfit = Option::get('shareHolderProfit', $order->store_id, 'bonus_pool', 0)['value'];
- //冻结层级(等级)
- $shareHolderLevel = Option::get('shareHolderLevel', $order->store_id, 'bonus_pool', 0)['value'];
- //冻结团队佣金(层数)
- $shareHolderNumber = Option::get('shareHolderNumber', $order->store_id, 'bonus_pool', [])['value'];
- if (is_string($shareHolderNumber)) {
- if (strpos($shareHolderNumber, ',') !== false) {
- $shareHolderNumber = explode(',', $shareHolderNumber);
- } else {
- $shareHolderNumber = [];
- }
- }
- if ($shareHolderLevel > 0 && is_array($shareHolderNumber) && count($shareHolderNumber) == 2) {
- $shareHolderNumber = range($shareHolderNumber[0], $shareHolderNumber[1]);
- } else {
- $shareHolderNumber = [];
- }
- $t = \Yii::$app->db->beginTransaction();
- $level_price = $order->pay_price - $order->express_price;
- $user = User::findOne($order->user_id);
- if ($order->level_price_json) {
- $level_price_arr = json_decode($order->level_price_json, true);
- if (!empty($level_price_arr)) {
- if (isset($level_price_arr['member' . $user->level])) {
- $level_price = $level_price_arr['member' . $user->level];
- }
- }
- }
- foreach($user_parent as $val) {
- $shareHolder = ShareHolder::findOne(['user_id' => $val['parent_id'], 'is_delete' => 0, 'status' => 1]);
- if (!$shareHolder) {
- continue;
- }
- $level = ShareHolderLevel::findOne(['id' => $shareHolder->level_id, 'is_delete' => 0]);
- if ($level) {
- $teamParent = User::findOne($val['parent_id']);
- if (!empty($level_price_arr) && intval($level->range_rate_type) === 1) {
- if ($level_price_arr['member' . $teamParent->level] > 0 && $level_price > $level_price_arr['member' . $teamParent->level] && $level->is_user_level_range_rate == 1) {
- $equal_price = sprintf("%.2f", ($level_price - $level_price_arr['member' . $teamParent->level]));
- $level_price = $level_price_arr['member' . $teamParent->level];
- $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL, 'user_id' => $val['parent_id']]);
- if (!$detail) {
- $detail = new ShareDetail();
- $detail->store_id = $order->store_id;
- $detail->type_id = $order_id;
- $detail->type = ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL;
- $detail->user_id = $val['parent_id'];
- $detail->desc = '订单号:' . $order->order_no . '极差分红_会员(原关系)';
- }
- $detail->money = $equal_price;
- $detail->is_send = 0;
- if (!$detail->save()) {
- $t->rollBack();
- \Yii::warning(['---------------- 极差分红_会员分红奖励计算入库失败 -------------------', $detail->errors]);
- return;
- }
- }
- continue;
- }
- if ($level_id == $level->id) {
- // 同级别奖励
- //计算冻结后金额
- $equal_price = round($base_price * $level->equal_rate / 100, 2);
- if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) {
- if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) {
- if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) {
- $equal_price = round(((100 - $shareHolderProfit) / 100) * $base_price * $level->equal_rate / 100, 2);
- }
- } else {
- $equal_price = round(((100 - $shareHolderProfit) / 100) * $base_price * $level->equal_rate / 100, 2);
- }
- }
- if ($equal_price > 0) {
- $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_RANGE_PROFIT_OLD, 'user_id' => $val['parent_id']]);
- if (!$detail) {
- $detail = new ShareDetail();
- $detail->store_id = $order->store_id;
- $detail->type_id = $order_id;
- $detail->type = ShareDetail::TYPE_RANGE_PROFIT_OLD;
- $detail->user_id = $val['parent_id'];
- $detail->desc = '订单号:' . $order->order_no . '同等级奖励分红(原关系)';
- }
- $detail->money = $equal_price;
- $detail->is_send = 0;
- if (!$detail->save()) {
- $t->rollBack();
- \Yii::warning(['---------------- 同等级分红奖励计算入库失败 -------------------', $detail->errors]);
- return;
- }
- }
- //计算冻结金额
- if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) {
- $open = false;
- if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) {
- if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) {
- $open = true;
- }
- } else {
- $open = true;
- }
- if ($open) {
- $frost_price = round(($shareHolderProfit / 100) * $base_price * $level->equal_rate / 100, 2);
- if ($frost_price > 0) {
- $model = new ShareHolderFrostLog();
- $model->parent_user_id = $val['parent_id'];
- $model->child_user_id = $order->user_id;
- $model->amount = $frost_price;
- $model->status = 0;
- $model->order_id = $order_id;
- if (!$model->save()) {
- $t->rollBack();
- \Yii::warning(['---------------- 级差分红发放冻结佣金失败 -------------------', $model->errors]);
- return;
- };
- }
- }
- }
- // 链动直推团队收益奖励(同等级)
- // $min_team_price = Option::get('shareHolderPriceMin', $order->store_id, 'bonus_pool', 0)['value'];
- // $remark = '链动直推团队同等级收益奖励分红';
- // $team_price = round($base_price * $level->equal_rate / 100, 2);
- // $type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD;
- // $setShareDetail = self::setShareDetail(null, $order, $team_price, $teamParent, $min_team_price, $remark, $type);
- // if (!$setShareDetail) {
- // $t->rollBack();
- // \Yii::error([__METHOD__, '递归分红失败,回滚']);
- // return;
- // }
- // if ($teamParent && $teamParent->old_parent_id > 0) {
- // $teamShareHolderSelf = ShareHolder::findOne(['user_id' => $teamParent->id, 'is_delete' => 0, 'status' => 1]);
- // $teamShareHolder = ShareHolder::findOne(['user_id' => $teamParent->old_parent_id, 'is_delete' => 0, 'status' => 1]);
- //
- // if ($teamShareHolder && $teamShareHolder->is_out == 1 && $teamShareHolderSelf->is_out == 1) {
- // $teamShareHolderLevel = ShareHolderLevel::findOne(['id' => $teamShareHolder->level_id, 'is_delete' => 0]);
- // if ($teamShareHolderLevel && $teamShareHolderLevel->team_reward_rate > 0) {
- // //计算冻结后金额
- // $team_price = round(round($base_price * $level->equal_rate / 100, 2) * $teamShareHolderLevel->team_reward_rate / 100, 2);
- //
- // if ($team_price > 0) {
- // $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, 'user_id' => $teamParent->old_parent_id]);
- // if (!$detail) {
- // $detail = new ShareDetail();
- // $detail->store_id = $order->store_id;
- // $detail->type_id = $order_id;
- // $detail->type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD;
- // $detail->user_id = $teamParent->old_parent_id;
- // $detail->desc = '订单号:' . $order->order_no . '链动直推团队同等级收益奖励分红';
- // }
- // $detail->money = $team_price;
- // $detail->is_send = 0;
- // if (!$detail->save()) {
- // $t->rollBack();
- // return;
- // }
- // }
- // }
- // }
- // }
- // }
- $level_id = 0;
- }
- if ($level->range_rate >= $share_num) {
- $range_rate = $level->range_rate - $share_num;
- $share_num = $level->range_rate;
- $price = round($base_price * $range_rate / 100, 2);
- if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) {
- if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) {
- if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) {
- $price = round(((100 - $shareHolderProfit) / 100) * $base_price * $range_rate / 100, 2);
- }
- } else {
- $price = round(((100 - $shareHolderProfit) / 100) * $base_price * $range_rate / 100, 2);
- }
- }
- if ($price > 0) {
- $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_RANGE_PROFIT_OLD, 'user_id' => $val['parent_id']]);
- if (!$detail) {
- $old_range_name = Option::get('old_range_name', $order->store_id, 'bonus_pool', '')['value'];
- $detail = new ShareDetail();
- $detail->store_id = $order->store_id;
- $detail->type_id = $order_id;
- $detail->type = ShareDetail::TYPE_RANGE_PROFIT_OLD;
- $detail->user_id = $val['parent_id'];
- $detail->desc = '订单号:'.$order->order_no. ($old_range_name ?: '级差分红(原关系)');////////////
- }
- $level_id = $level->id;
- $detail->money = $price;
- $detail->is_send = 0;
- if (!$detail->save()) {
- $t->rollBack();
- \Yii::warning(['---------------- 级差分红计算入库失败 -------------------', $detail->errors]);
- return;
- }
- }
- if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) {
- $open = false;
- if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) {
- if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) {
- $open = true;
- }
- } else {
- $open = true;
- }
- if ($open) {
- $frost_price = round(round($base_price * $range_rate / 100, 2) * ($shareHolderProfit / 100), 2);
- if ($frost_price > 0) {
- $model = new ShareHolderFrostLog();
- $model->parent_user_id = $val['parent_id'];
- $model->child_user_id = $order->user_id;
- $model->amount = $frost_price;
- $model->status = 0;
- $model->order_id = $order->id;
- if (!$model->save()) {
- $t->rollBack();
- \Yii::warning(['---------------- 级差分红发放冻结佣金失败 -------------------', $model->errors]);
- return;
- };
- }
- }
- }
- // 链动直推团队收益奖励
- // $min_team_price = Option::get('shareHolderPriceMin', $order->store_id, 'bonus_pool', 0)['value'];
- // $direct_range_name = Option::get('old_add_holder_name', $order->store_id, 'bonus_pool', '')['value'];
- // $remark = $direct_range_name ? $direct_range_name : '链动直推团队级差收益奖励分红';
- // $team_price = round($base_price * $range_rate / 100, 2);
- // $type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD;
- // $setShareDetail = self::setShareDetail(null, $order, $team_price, $teamParent, $min_team_price, $remark, $type);
- // if (!$setShareDetail) {
- // $t->rollBack();
- // \Yii::error([__METHOD__, '递归分红失败,回滚']);
- // return;
- // }
- // if ($teamParent && $teamParent->old_parent_id > 0) {
- // $teamShareHolderSelf = ShareHolder::findOne(['user_id' => $teamParent->id, 'is_delete' => 0, 'status' => 1]);
- // $teamShareHolder = ShareHolder::findOne(['user_id' => $teamParent->old_parent_id, 'is_delete' => 0, 'status' => 1]);
- // if ($teamShareHolder && $teamShareHolder->is_out == 1 && $teamShareHolderSelf->is_out == 1) {
- // $teamShareHolderLevel = ShareHolderLevel::findOne(['id' => $teamShareHolder->level_id, 'is_delete' => 0]);
- // if ($teamShareHolderLevel && $teamShareHolderLevel->team_reward_rate > 0) {
- // $team_price = round(round($base_price * $range_rate / 100, 2) * $teamShareHolderLevel->team_reward_rate / 100, 2);
- //
- // if ($team_price > 0) {
- // $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, 'user_id' => $teamParent->old_parent_id]);
- // if (!$detail) {
- // $detail = new ShareDetail();
- // $detail->store_id = $order->store_id;
- // $detail->type_id = $order_id;
- // $detail->type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD;
- // $detail->user_id = $teamParent->old_parent_id;
- // $detail->desc = '订单号:' . $order->order_no . '链动直推团队级差收益奖励分红';
- // }
- // $detail->money = $team_price;
- // $detail->is_send = 0;
- // if (!$detail->save()) {
- // $t->rollBack();
- // return;
- // }
- // }
- // }
- // }
- // }
- // }
- }
- }
- }
- $t->commit();
- \Yii::warning('---------------- 级差分红计算结束 -------------------');
- }
- // 链动关系级差分红
- public static function oldLevelShare($order)
- {
- $base_price = $order->chain_profit;
- $user_parent = UserTreePath::find()->alias('ut')
- ->where(['ut.child_id' => $order->user_id])
- ->leftJoin(['h' => ShareHolder::tableName()], 'ut.parent_id=h.user_id')
- ->andWhere('h.id is not null')
- ->andWhere('ut.child_id != ut.parent_id')
- ->andWhere(['h.is_delete' => 0, 'h.status' => 1])
- ->orderBy(['ut.parent_level' => SORT_DESC])
- ->asArray()
- ->select(['ut.*', 'h.level_id'])
- ->all();
- $share_num = 0;
- $level_id = 0;
- $shareHolderTeamRewardPlatformBears = Option::get('shareHolderTeamRewardPlatformBears', $order->store_id, 'bonus_pool', 1)['value'];
- $shareHolderProfit = Option::get('shareHolderProfit', $order->store_id, 'bonus_pool', 0)['value'];
- //冻结层级(等级)
- $shareHolderLevel = Option::get('shareHolderLevel', $order->store_id, 'bonus_pool', 0)['value'];
- //冻结团队佣金(层数)//得到层数如 3-8层冻结佣金
- $shareHolderNumber = Option::get('shareHolderNumber', $order->store_id, 'bonus_pool', [])['value'];
- if (is_string($shareHolderNumber)) {
- if (strpos($shareHolderNumber, ',') !== false) {
- $shareHolderNumber = explode(',', $shareHolderNumber);
- } else {
- $shareHolderNumber = [];
- }
- }
- if (is_array($shareHolderNumber) && count($shareHolderNumber) == 2) {
- $shareHolderNumber = range($shareHolderNumber[0], $shareHolderNumber[1]);
- } else {
- $shareHolderNumber = [];
- }
- $chainLevelValue = \json_decode($order->chain_level_value, true);
- $shareHolderJiandian = Option::get('shareHolderJiandian', $order->store_id, 'bonus_pool', 0)['value'];
- $t = \Yii::$app->db->beginTransaction();
- $ii = 0; // 层级
- foreach($user_parent as $index => $val) {
- $ii++;
- if ($shareHolderJiandian > 0 && $ii > 1) {
- if ($ii != $shareHolderJiandian) {
- continue;
- }
- $shareHolder = ShareHolder::findOne(['user_id' => $val['parent_id'], 'is_delete' => 0, 'status' => 1]);
- if (!$shareHolder) {
- $t->commit();
- return;
- }
- if ($shareHolder->is_out == 0) {
- $t->commit();
- return;
- }
- }
- $base_price = self::getBasePrice($base_price, $val['parent_id'], $order->store_id, $order->id);
- $level = ShareHolderLevel::findOne(['id' => $val['level_id'], 'is_delete' => 0]);
- if ($level) {
- $teamParent = User::findOne($val['parent_id']);
- //检测是否复购
- $order_d = OrderDetail::find()->alias('od')->where(['o.store_id' => $order->store_id, 'o.is_pay' => 1, 'o.user_id' => $order->user_id])
- ->leftJoin(['o' => Order::tableName()], 'o.id = od.order_id')
- ->leftJoin(['g' => Goods::tableName()], 'g.id = od.goods_id')
- ->andWhere(['<', 'order_id', $order->id])->select('od.id')
- ->orderBy('od.id desc')->asArray()->one();
- $old_range_rate = $level->old_range_rate;
- if ($order_d && $level->old_repeat_range_rate > 0) {
- $old_range_rate = $level->old_repeat_range_rate;
- }
- if ($old_range_rate >= $share_num) {
- $range_rate = $old_range_rate - $share_num;
- $share_num = $old_range_rate;
- $price = round($base_price * $range_rate / 100, 2);
- $params = [
- 'parent_id' => $val['parent_id'],
- 'store_id' => $order->store_id,
- 'order_id' => $order->id
- ];
- $price = self::getProfitByOrder($chainLevelValue, $val['level_id'], $price, $index == 0, 0, false, $params);
- if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) {
- if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) {
- if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) {
- $price = round(((100 - $shareHolderProfit) / 100) * $base_price * $range_rate / 100, 2);
- $price = self::getProfitByOrder($chainLevelValue, $val['level_id'], $price, $index == 0, $shareHolderProfit, false, $params);
- }
- } else {
- $price = round(((100 - $shareHolderProfit) / 100) * $base_price * $range_rate / 100, 2);
- $price = self::getProfitByOrder($chainLevelValue, $val['level_id'], $price, $index == 0, $shareHolderProfit, false, $params);
- }
- }
- $detail = null;
- if ($price > 0) {
- $fuGouSetting = FuGou::getSetting($order->store_id);
- $isFugou = $fuGouSetting['fugou_switch'] > 0 && FuGou::isFugou($val['parent_id'], $order->store_id, $fuGouSetting);
- $fugou = false;
- if ($isFugou) {
- $fugouOpen = true;
- $fugouRand = \range($fuGouSetting['fugou_freeze_rand'][0], $fuGouSetting['fugou_freeze_rand'][1]);
- if ($fuGouSetting['fugou_freeze_level'] > 0) {
- if (
- (int)$fuGouSetting['fugou_freeze_level'] === (int)$level['id'] &&
- false === \in_array($val['parent_level'], $fugouRand)
- ) {
- // 如果选了指定等级并且没在范围内, 就不冻结
- $fugouOpen = false;
- }
- }
- if ($fugouOpen) {
- $fugou = true;
- $frostLog = new ShareHolderFugouFrostLog();
- $frostLog->user_id = $val['parent_id'];
- $frostLog->amount = $price;
- $frostLog->status = 0;
- $frostLog->order_id = $order->id;
- $frostLog->save();
- }
- }
- $detail = ShareDetail::findOne(['type_id' => $order->id, 'type' => ShareDetail::TYPE_RANGE_PROFIT, 'user_id' => $val['parent_id']]);
- if (!$detail) {
- $range_name = Option::get('range_name', $order->store_id, 'bonus_pool', '')['value'];
- $detail = new ShareDetail();
- $detail->store_id = $order->store_id;
- $detail->type_id = $order->id;
- $detail->type = ShareDetail::TYPE_RANGE_PROFIT;
- $detail->user_id = $val['parent_id'];
- $detail->desc = '订单号:'.$order->order_no. ($range_name ?: '级差分红');/////////////////
- }
- $detail->is_fugou = $fugou ? 1 : 0;
- $detail->money = $price;
- $detail->is_send = 0;
- if (!$detail->save()) {
- $t->rollBack();
- \Yii::warning(['---------------- (原关系)级差分红计算入库失败 -------------------', $detail->errors]);
- return;
- }
- }
- if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) {
- $open = false;
- if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) {
- if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) {
- $open = true;
- }
- } else {
- $open = true;
- }
- if ($open) {
- $frost_price = round(round($base_price * $range_rate / 100, 2) * ($shareHolderProfit / 100), 2);
- $frost_price = self::getProfitByOrder($chainLevelValue, $val['level_id'], $frost_price, $index == 0, $shareHolderProfit, true, $params);
- if ($frost_price > 0) {
- $model = new ShareHolderFrostLog();
- $model->parent_user_id = $val['parent_id'];
- $model->child_user_id = $order->user_id;
- $model->amount = $frost_price;
- $model->status = 0;
- $model->order_id = $order->id;
- if (!$model->save()) {
- $t->rollBack();
- \Yii::warning(['---------------- 级差分红发放冻结佣金失败 -------------------', $model->errors]);
- return;
- };
- }
- }
- }
- // 链动直推团队收益奖励
- $min_team_price = Option::get('shareHolderPriceMin', $order->store_id, 'bonus_pool', 0)['value'];
- $shareHolderPriceLevel = Option::get('shareHolderPriceLevel', $order->store_id, 'bonus_pool', 0)['value'];
- $direct_range_name = Option::get('direct_range_name', $order->store_id, 'bonus_pool', '')['value'];
- $remark = $direct_range_name ? $direct_range_name : '链动直推团队级差收益奖励分红';
- $team_price = $price;
- $type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT;
- // 判断当前直推层级是否在后台设置的直推团队收益发放层级之内
- // if ($shareHolderPriceLevel == 0 || $ii <= (int)$shareHolderPriceLevel) {
- $setShareDetail = self::setShareDetail($shareHolderTeamRewardPlatformBears ? null : $detail, $order, $team_price, $teamParent, $min_team_price, $remark, $type);
- if (!$setShareDetail) {
- $t->rollBack();
- \Yii::error([__METHOD__, '递归分红失败,回滚']);
- return;
- }
- // }
- }
- }
- }
- $t->commit();
- }
- public static function setJiandian($teamParent, $level, $currentLevel = 1)
- {
- // 递归获取上级信息
- if ($level == $currentLevel) {
- return $teamParent;
- }
- if ($teamParent->old_parent_id == 0) {
- return null;
- }
- $teamParent = User::findOne($teamParent->old_parent_id);
- return self::setJiandian($teamParent, $level, $currentLevel + 1);
- }
- // 链动直推团队收益奖励
- public static function setShareDetail($shareDetail = null, $order, $team_price, $teamParent, $min_team_price = 10, $remark = '', $type = 0) {
- $shareHolderPriceLevel = Option::get('shareHolderPriceLevel', $order->store_id, 'bonus_pool', 0)['value'];
- $detailCount = ShareDetail::find()->where(['type_id' => $order->id, 'type' => $type])->count() ?: 0;
- if ($shareHolderPriceLevel > 0 && $detailCount >= $shareHolderPriceLevel) {
- return true;
- }
- if ($teamParent && $teamParent->old_parent_id > 0) {
- $teamShareHolderSelf = ShareHolder::findOne(['user_id' => $teamParent->id, 'is_delete' => 0, 'status' => 1]);
- $teamShareHolder = ShareHolder::findOne(['user_id' => $teamParent->old_parent_id, 'is_delete' => 0, 'status' => 1]);
- if ($teamShareHolder && $teamShareHolder->is_out == 1 && $teamShareHolderSelf->is_out == 1) {
- $teamShareHolderUser = User::findOne($teamShareHolder->user_id);
- if ($teamShareHolderUser->parent_id > 0) {
- return true;
- }
- // \Yii::error(['--setShareDetail--', $teamShareHolder]);
- // if ($teamShareHolder) {
- $teamShareHolderLevel = ShareHolderLevel::findOne(['id' => $teamShareHolder->level_id, 'is_delete' => 0]);
- // \Yii::error(['--setShareDetail--', $teamShareHolderLevel]);
- if ($teamShareHolderLevel && $teamShareHolderLevel->team_reward_rate > 0) {
- $team_price = round($team_price * $teamShareHolderLevel->team_reward_rate / 100, 2);
- //小于最小分红金额,退出
- if ($team_price <= $min_team_price) {
- return true;
- }
- if ($team_price > 0) {
- $detail = ShareDetail::findOne(['type_id' => $order->id, 'type' => $type, 'user_id' => $teamParent->old_parent_id]);
- if (!$detail) {
- $detail = new ShareDetail();
- $detail->store_id = $order->store_id;
- $detail->type_id = $order->id;
- $detail->type = $type;
- $detail->user_id = $teamParent->old_parent_id;
- $detail->desc = '订单号:' . $order->order_no . $remark;
- }
- $detail->money = $team_price;
- $detail->is_send = 0;
- if (!$detail->save()) {
- \Yii::error([__METHOD__, array_shift($detail->getFirstErrors())]);
- return false;
- }
- if($shareDetail){
- $shareDetail->money -= $detail->money;
- $shareDetail->desc .= '-[感恩上级:¥' . $detail->money . '('. $detail->id . ')]';
- if (!$shareDetail->save()) {
- \Yii::error([__METHOD__, array_shift($shareDetail->getFirstErrors())]);
- return false;
- }
- $shareDetail = $detail;
- }
- }
- }
- $teamParent = User::findOne($teamParent['old_parent_id']);
- return self::setShareDetail($shareDetail, $order, $team_price, $teamParent, $min_team_price, $remark, $type);
- }
- }
- return true;
- }
- public static function sendRangePoint($user, $share_detail, $shareHolderRewardPointRate, $STORE_INTEGRAL) {
- $money = $share_detail->money;
- $point = round($money * $shareHolderRewardPointRate / 100, 2);
- $money -= $point;
- $integral = $point * $STORE_INTEGRAL;
- $user->updateCounters(['total_price' => $money, 'price' => $money]);
- $share_detail->desc .= '{[积分占比:'. $shareHolderRewardPointRate .'%][发放佣金:¥'. $money .'][发放积分:'. $integral .'('. $point .'*'. $STORE_INTEGRAL .')]}';
- AccountLog::saveLog($user->id, $integral, AccountLog::TYPE_INTEGRAL, AccountLog::LOG_TYPE_INCOME, 0, 0, $share_detail->desc);
- }
- /**
- * 发放级差分红
- */
- public static function sendRange($order_id) {
- \Yii::warning(['------------ 发放级差分红开始, 订单id:' . $order_id .'-------------']);
- $list = ShareDetail::find()->where(['type_id' => $order_id, 'is_fugou' => 0, 'type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL], 'is_send' => 0, 'is_delete' => 0])->all();
- if ($list) {
- $t = \Yii::$app->db->beginTransaction();
- $store_id = $list[0]['store_id'];
- $STORE_INTEGRAL = Option::get(OptionSetting::STORE_INTEGRAL, $store_id, 'gift', Option::get(OptionSetting::STORE_INTEGRAL, $store_id, 'store', 100)['value'])['value'];
- $shareHolderRewardPointRate = Option::get('shareHolderRewardPointRate', $store_id, 'bonus_pool', 0)['value'];
- foreach ($list as $share_detail) {
- /**
- * @var $share_detail ShareDetail
- */
- $user = User::findOne($share_detail->user_id);
- if($shareHolderRewardPointRate && in_array($share_detail->type, [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT])){
- self::sendRangePoint($user, $share_detail, $shareHolderRewardPointRate, $STORE_INTEGRAL);
- }else{
- $user->updateCounters(['total_price' => $share_detail->money, 'price' => $share_detail->money]);
- }
- $share_detail->is_send = 1;
- $share_detail->send_time = time();
- if (!$share_detail->save()) {
- $t->rollBack();
- \Yii::warning(['------------ 发放级差分红状态更改失败:-------------', $share_detail->errors]);
- return;
- }
- }
- $t->commit();
- \Yii::warning(['------------ 发放级差分红成功, 订单id:' . $order_id .'-------------']);
- }
- }
- /**
- * 发放2+1股东团队分红
- */
- public static function sendTwoPlusOneTeamLevelShare($order_id) {
- \Yii::warning(['------------ 发放2+1团队分红开始, 订单id:' . $order_id .'-------------']);
- $list = ShareDetail::find()->where(['type_id' => $order_id, 'type' => [ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL], 'is_send' => 0, 'is_delete' => 0])->all();
- if ($list) {
- $t = \Yii::$app->db->beginTransaction();
- $store_id = $list[0]['store_id'];
- $STORE_INTEGRAL = Option::get(OptionSetting::STORE_INTEGRAL, $store_id, 'gift', Option::get(OptionSetting::STORE_INTEGRAL, $store_id, 'store', 100)['value'])['value'];
- $shareHolderRewardPointRate = Option::get('shareHolderRewardPointRate', $store_id, 'bonus_pool', 0)['value'];
- foreach ($list as $share_detail) {
- /**
- * @var $share_detail ShareDetail
- */
- $user = User::findOne($share_detail->user_id);
- if($shareHolderRewardPointRate && in_array($share_detail->type, [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT])){
- self::sendRangePoint($user, $share_detail, $shareHolderRewardPointRate, $STORE_INTEGRAL);
- }else{
- $user->updateCounters(['total_price' => $share_detail->money, 'price' => $share_detail->money]);
- }
- $share_detail->is_send = 1;
- $share_detail->send_time = time();
- if (!$share_detail->save()) {
- $t->rollBack();
- \Yii::warning(['------------ 发放2+1团队分红状态更改失败:-------------', $share_detail->errors]);
- return;
- }
- }
- $t->commit();
- \Yii::warning(['------------ 发放2+1团队分红成功, 订单id:' . $order_id .'-------------']);
- }
- }
- /**
- * 发放区域分红
- */
- public static function sendArea($order_id) {
- \Yii::warning(['------------ 发放代理分红开始, 订单id:' . $order_id .'-------------']);
- $list = ShareDetail::find()->where(['type_id' => $order_id, 'type' => ShareDetail::TYPE_AREA_PROFIT, 'is_send' => 0, 'is_delete' => 0])->all();
- if ($list) {
- $t = \Yii::$app->db->beginTransaction();
- foreach ($list as $share_detail) {
- /**
- * @var $share_detail ShareDetail
- */
- $user = User::findOne($share_detail->user_id);
- $user->updateCounters(['total_price' => $share_detail->money, 'price' => $share_detail->money]);
- $share_detail->is_send = 1;
- $share_detail->send_time = time();
- if (!$share_detail->save()) {
- $t->rollBack();
- \Yii::warning(['------------ 发放代理分红状态更改失败:-------------', $share_detail->errors]);
- return;
- }
- }
- $t->commit();
- \Yii::warning(['------------ 发放代理分红成功, 订单id:' . $order_id .'-------------']);
- }
- }
- public static function poolUserMoney($pool_level, $user_ids) {
- $store_id = $pool_level->store_id;
- $pool_level_id = $pool_level->id;
- $pool_level_money = $pool_level->money;
- $dividends_method = Option::get('dividends_method', $store_id, 'bonus_pool', 0)['value']; //分红方式 0平均分红 1团队业绩加权分红
- if($dividends_method){
- $pay_price_all = BonusPoolDetail::find()->alias('b')->leftJoin(['o' => Order::tableName()], 'b.order_id = o.id AND b.order_type=0')
- ->leftJoin(['sco' => \app\plugins\scanCodePay\models\Order::tableName()], 'b.order_id = sco.id AND b.order_type=6')
- ->andWhere(['pool_level_id' => $pool_level_id])
- ->andWhere(['or', ['in', 'o.user_id', $user_ids], ['in', 'sco.user_id', $user_ids]])
- ->select('SUM(o.pay_price) o_pay_price, SUM(sco.pay_price) sco_pay_price')
- ->asArray()->one();
- $money_all_order = 0;
- if($pay_price_all){
- $money_all_order = array_sum($pay_price_all);
- }
- $res = [];
- foreach ($user_ids as $uid) {
- if($money_all_order == 0){
- $res[$uid] = 0;
- continue;
- }
- $pay_price_all_user = BonusPoolDetail::find()->alias('b')->leftJoin(['o' => Order::tableName()], 'b.order_id = o.id AND b.order_type=0')
- ->leftJoin(['sco' => \app\plugins\scanCodePay\models\Order::tableName()], 'b.order_id = sco.id AND b.order_type=6')
- ->andWhere(['pool_level_id' => $pool_level_id])
- ->andWhere(['or', ['o.user_id' => $uid], ['sco.user_id' => $uid]])
- ->select('SUM(o.pay_price) o_pay_price, SUM(sco.pay_price) sco_pay_price')
- ->asArray()->one();
- $money_all_order_user = 0;
- if($pay_price_all_user){
- $money_all_order_user = array_sum($pay_price_all_user);
- }
- $res[$uid] = round($pool_level_money * ($money_all_order_user / $money_all_order), 2);
- }
- return $res;
- }
- return null;
- }
- /**
- * 股东分红,发放奖金池
- * @param $bool_id 奖金池ID
- */
- public static function poolShare($id)
- {
- $t = \Yii::$app->db->beginTransaction();
- try {
- $pool_level = BonusPoolLevel::findOne($id);
- $price = $pool_level->money;
- $shareHolderLevel = $pool_level->level_id;
- $high_level_join_average = Option::get('high_level_join_average', $pool_level->store_id,
- 'bonus_pool', 0)['value'];
- if (intval($high_level_join_average)) {
- $shareHolderLevelOnce = ShareHolderLevel::findOne(['is_delete' => 0, 'id' => $pool_level->level_id]);
- $shareHolderLevel = ShareHolderLevel::find()->where(['store_id' => $shareHolderLevelOnce->store_id, 'is_delete' => 0])
- ->andWhere(['>=', 'level', $shareHolderLevelOnce->level])->select('id')->column();
- }
- // 获取所有对应等级的股东
- $holder = ShareHolder::find()->where([
- 'store_id' => get_store_id(),
- 'level_id' => $shareHolderLevel,
- 'is_delete' => 0,
- 'status' => 1
- ])->asArray()->all();
- $holder_count = count($holder);
- if ($holder_count < 1) {
- $t->rollBack();
- return [
- 'code' => 1,
- 'msg' => '没有可发放的股东'
- ];
- }
- $user_ids = [];
- foreach ($holder as $item) {
- $bonus_pool = \app\models\BonusPool::findOne($pool_level->pool_id);
- $pay_price_arr = BonusPoolDetail::find()->alias('b')->leftJoin(['o' => Order::tableName()], 'b.order_id = o.id')
- ->where(['o.user_id' => $item['user_id']])
- ->andWhere(['and', ['>=', 'b.created_at', $bonus_pool->start_time], ['<', 'b.created_at', $bonus_pool->end_time]])
- ->select('o.pay_price')->groupBy('o.id')->column();
- $pay_price = array_sum($pay_price_arr);
- //
- //判断是否达标
- $dividends_condition = Option::get('dividends_condition', get_store_id(), 'bonus_pool', 0)['value'];
- if ($dividends_condition <= $pay_price) {
- $user_ids = array_merge($user_ids, [$item['user_id']]);
- }
- }
- $holder_count = count($user_ids);
- if ($holder_count < 1) {
- $t->rollBack();
- return [
- 'code' => 1,
- 'msg' => '没有可发放的股东'
- ];
- }
- $share_price = round($price / $holder_count, 2);
- // $user_ids = array_column($holder, 'user_id');
- $pool_level->user_id = Json::encode($user_ids);
- if (!$pool_level->save()) {
- $t->rollBack();
- return [
- 'code' => 1,
- 'msg' => '发放失败1'
- ];
- }
- $dividends_method = intval(Option::get('dividends_method', $pool_level->store_id, 'bonus_pool', 0)['value']); //分红方式 0平均分红 1团队业绩加权分红
- $poolUserMoney = self::poolUserMoney($pool_level, $user_ids);
- if ($dividends_method === BonusPoolLevel::SHARE_TYPE_WEIGHT) {
- if (empty($poolUserMoney)) {
- $user_ids = [];
- $pool_level->user_id = Json::encode([]);
- } else {
- $user_ids_ = [];
- foreach ($poolUserMoney as $poolUserIndex => $poolUserItem) {
- if ($poolUserItem > 0) {
- $user_ids_[] = $poolUserIndex;
- }
- }
- $user_ids = $user_ids_;
- $pool_level->user_id = Json::encode($user_ids);
- }
- }
- foreach ($user_ids as $val_2) {
- $user = User::findOne($val_2);
- if ($user) {
- if($poolUserMoney){
- $share_price = $poolUserMoney[$val_2] ?: 0;
- }
- $user->updateCounters(['total_price' => $share_price, 'price' => $share_price]);
- $holder_name = Option::get('holder_name', get_store_id(), 'bonus_pool', '')['value'];
- $detail = new ShareDetail();
- $detail->store_id = get_store_id();
- $detail->type_id = $pool_level->id;
- $detail->type = ShareDetail::TYPE_HOLDER_PROFIT;
- $detail->user_id = $val_2;
- $detail->desc = date('Y-m-d H:i:s', time()) . ($holder_name ?: '股东分红');
- $detail->is_send = 1;
- $detail->send_time = time();
- $detail->money = $share_price;
- if (!$detail->save()) {
- $t->rollBack();
- return [
- 'code' => 1,
- 'msg' => '发放失败2'
- ];
- }
- }
- }
- $pool_level->share_type = $dividends_method;
- $pool_level->is_send = 1;
- $pool_level->send_time = time();
- if (!$pool_level->save()) {
- $t->rollBack();
- return [
- 'code' => 1,
- 'msg' => '发放失败4'
- ];
- }
- } catch (\Exception $e) {
- $t->commit();
- return [
- 'code' => 1,
- 'line' => $e->getLine(),
- 'msg' => $e->getMessage(),
- 'file' => $e->getFile(),
- ];
- }
- $t->commit();
- return [
- 'code' => 0,
- 'msg' => '发放成功'
- ];
- }
- /**
- * 增加奖金池
- * @param $order_id
- * @param $order_type
- */
- public static function poolPush($order_id, $order_type = 0)
- {
- \Yii::warning(['---------------- 奖金池增加开始 -------------------']);
- if(isset($order_id->id)){
- $order = $order_id;
- }else{
- if ($order_type == 6) {
- $order = \app\plugins\scanCodePay\models\Order::findOne($order_id);
- }else{
- $order = Order::findOne($order_id);
- }
- }
- $order_id = $order->id;
- // 判断是否开启奖金池
- $setting = [
- 'cycle' => Option::get('cycle', $order->store_id, 'bonus_pool', 0)['value'],
- // 'is_open_share' => Option::get('is_open_share', $order->store_id, 'bonus_pool', 0)['value'],
- // 'is_open_range' => Option::get('is_open_range', $order->store_id, 'bonus_pool', 0)['value'],
- 'team_num' => Option::get('team_num', $order->store_id, 'bonus_pool', 0)['value']
- ];
- if (!$setting['cycle'] > 0) {// || !$setting['is_open_share']
- \Yii::warning('---------------- 未开启股东分红 -------------------');
- return;
- }
- $t = \Yii::$app->db->beginTransaction();
- $tool = ModelsBonusPool::find()->where([
- 'and',
- [
- '<',
- 'start_time',
- time()
- ],
- [
- '>=',
- 'end_time',
- time()
- ]
- ])->andWhere(['store_id' => $order->store_id])->orderBy(['id' => SORT_DESC])->one();
- // 如果没有奖金池,重新创建奖金池
- if (!$tool) {
- // 获取最后一个奖金池的结束时间
- // $last_tool = ModelsBonusPool::find()->where([
- // 'store_id' => $order->store_id
- // ])->orderBy(['id' => SORT_DESC])
- // ->one();
- if (false && isset($last_tool) && $last_tool) {
- $start_time = $last_tool->end_time;
- } else {
- $start_time = strtotime(date('Y-m-d', time()));
- }
- $tool = new ModelsBonusPool();
- $tool->store_id = $order->store_id;
- $tool->start_time = $start_time;
- $end_time = $start_time + ($setting['cycle'] * 24 * 3600);
- $tool->end_time = $end_time;
- if (!$tool->save()) {
- $t->rollBack();
- \Yii::warning('---------------- 创建奖金池失败 -------------------');
- return;
- }
- }
- // 根据会员等级,添加奖金池佣金
- $bonus_pool_level = ShareHolderLevel::find()
- ->where([
- 'store_id' => $order->store_id,
- 'is_delete' => 0
- ])->all();
- if($order_type == 6){
- $rate = Option::get('face_rate', $order->store_id, 'store')['value'];
- $rate_type = Option::get('face_rate_type', $order->store_id, 'store')['value'];
- $base_price = $rate_type == 0 ? (($order->total_price + $order->take_price) * $rate / 100) : $rate;
- }else{
- $base_price = $order->profit;
- }
- foreach($bonus_pool_level as $level) {
- $level_model = BonusPoolLevel::findOne(['pool_id' => $tool->id, 'level_id' => $level->id]);
- $price = round($base_price * $level->holder_rate / 100, 2);
- if ($price <= 0) {
- continue;
- }
- if (!$level_model) {
- $level_model = new BonusPoolLevel();
- $level_model->store_id = $order->store_id;
- $level_model->pool_id = $tool->id;
- $level_model->level_id = $level->id;
- $level_model->money = $price;
- $level_model->user_id = '[]';
- $level_model->is_send = 0;
- $level_model->send_time = 0;
- } else {
- $BonusPoolDetail = BonusPoolDetail::findOne(['order_id' => $order_id, 'pool_level_id' => $level_model->id, 'order_type' => $order_type]);
- if ($BonusPoolDetail) {
- continue;
- }
- $level_model->money += $price;
- }
- if (!$level_model->save()) {
- $t->rollBack();
- \Yii::warning(['---------------- 创建等级奖金池失败 -------------------', $level_model->errors]);
- return;
- } else {
- $level_log = new BonusPoolDetail();
- $level_log->store_id = $order->store_id;
- $level_log->order_id = $order_id;
- $level_log->order_type = (int)$order_type;
- $level_log->money = $price;
- $level_log->pool_level_id = $level_model->id;
- $level_log->desc = '订单号:'.$order->order_no.'追加';
- if (!$level_log->save()) {
- $t->rollBack();
- \Yii::warning(['---------------- 奖金池订单入库失败 -------------------', $level_log->errors]);
- return;
- }
- }
- }
- $t->commit();
- \Yii::warning(['---------------- 奖金池增加成功 -------------------', $base_price]);
- }
- public static function ShareHolderLevelJob($store_id = 1, $type = 0, $user_id = 0){
- if(!cache_lock(['ShareHolderLevelJob', $store_id, $type, $user_id], 30)){
- \queue_push(new \app\jobs\ShareHolderLevelJob(['store_id' => $store_id, 'type' => $type, 'user_id' => $user_id]), 30);
- }
- }
- /**
- * @return array|void
- */
- public static function checkLevel($store_id = 1, $type = 0, $user_id = 0) {
- \Yii::warning('----------------- HANDLE SHARE HOLDER LEVEL START -----------------' . time());
- $query = ShareHolder::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $store_id]);
- if($user_id){
- // $query->andWhere(['!=', 'user_id', $user_id]);
- $queryUserTree = OldUserTreePath::find()->where(['child_id' => $user_id])->select('parent_id');
- $query->andWhere([
- 'user_id' => $queryUserTree,
- ]);
- }
- $share_holder = $query->select('store_id, user_id, level_id')->asArray()->all();
- if (empty($share_holder)) {
- \Yii::warning('可处理数据为空');
- return;
- }
- foreach ($share_holder as $share) {
- $current_level_id = $share['level_id'];
- $level = ShareHolderLevel::findOne($current_level_id)->level;
- $share_holder_level = ShareHolderLevel::find()->where(['store_id' => $share['store_id'], 'is_delete' => 0, 'status' => 1])->andWhere(['>', 'level', $level])->orderBy('level desc')->all();
- // \Yii::warning(['用户' . $share['user_id'] . '可升等级', ShareHolderLevel::find()->where(['store_id' => $share['store_id'], 'is_delete' => 0, 'status' => 1])->andWhere(['>', 'level', $level])->orderBy('level desc')->asArray()->all()]);
- foreach ($share_holder_level as $value) {
- $is_level = true;
- /**
- * @var $value ShareHolderLevel
- */
- //TODO 股东人数以及金额
- $condition = Json::decode($value->condition);
- // 团队人数
- $man = $condition['man'];
- if ((bool)$man['is_open']) {
- $share_user_parent_tree = OldUserTreePath::findOne(['parent_id' => $share['user_id']]);//获取当前购买用户的当前等级
- foreach ($man['value'] as $m) {
- // $man_data = User::find()->childs($share['user_id'], false, $m['level'])->where(['store_id' => $value->store_id])->asArray()->all();
- $man_data = OldUserTreePath::find()->where([
- 'parent_id' => $share['user_id']
- ])->andWhere([
- '!=',
- 'child_id',
- $share['user_id']
- ])->andWhere([
- 'AND', [
- '>', 'child_level', $share_user_parent_tree->parent_level
- ], [
- '<=', 'child_level', ($share_user_parent_tree->parent_level + (int)$m['level'])
- ]
- ])->asArray()->all();
- if (count($man_data) < $m['count']) {
- $msg = '团队人数:' . $m['level'] . '级团队人数未达到' . $m['count'];
- \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- $is_level = false;
- continue;
- } else {
- if (isset($m['money'])) {
- //消费达到$m['money']以上允许升级
- $child_id = array_column($man_data, 'child_id');
- $pay_price = Order::find()->where(
- [
- 'store_id' => $value->store_id,
- 'is_delete' => 0,
- 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- 'user_id' => $child_id
- ])
- ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price');
- if ($m['money'] > $pay_price) {
- $msg = '团队人数:' . $m['level'] . '级团队人数下单金额未达到' . $m['money'];
- \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- $is_level = false;
- continue;
- }
- }
- }
- }
- if (!$is_level) {
- continue;
- }
- }
- // 团队消费金额
- $team_order = $condition['order'];
- if ((bool)$team_order['is_open']) {
- $share_user_parent_tree = OldUserTreePath::findOne(['parent_id' => $share['user_id']]);//获取当前购买用户的当前等级
- foreach ($team_order['value'] as $o) {
- $man_data = OldUserTreePath::find()->where([
- 'parent_id' => $share['user_id']
- ])->andWhere([
- '!=',
- 'child_id',
- $share['user_id']
- ])->andWhere([
- 'AND', [
- '>=', 'child_level', $share_user_parent_tree->parent_level
- ], [
- '<=', 'child_level', ($share_user_parent_tree->parent_level + ($o['level'] ?: 0))
- ]
- ])->asArray()->all();
- // if (count($man_data) < 1) {
- // $msg = '团队金额:' . $o['level'] . '级团队人数为空';
- // \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- // $is_level = false;
- // break;
- // }
- // $man_user_id = array_column($man_data, 'id');
- $man_user_id = [];
- $man_user_id[] = $share['user_id'];
- foreach($man_data as $val) {
- $man_user_id[] = $val['child_id'];
- }
- $order_money = Order::find()->where(
- [
- 'store_id' => $store_id,
- 'is_delete' => 0,
- 'trade_status' => Order::ORDER_FLOW_CONFIRM
- ])
- ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])
- ->andWhere(['in', 'user_id', $man_user_id])->sum('pay_price');
- if ($order_money < $o['count']) {
- $msg = '团队金额:' . $o['level'] . '级团队消费金额未达到' . $o['count'].'|'.$order_money;
- \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- $is_level = false;
- continue;
- }
- }
- if (!$is_level) {
- continue;
- }
- }
- // 自身消费金额
- $self = $condition['self'];
- if ((bool)$self['is_open']) {
- // 兼容老版本
- if (!isset($self['value']['order_number'])) {
- $self_price = $self['value'];
- $self['value'] = [];
- $self['value']['order_number'] = 0;
- $self['value']['price'] = $self_price;
- }
- if ($self['value']['order_number'] == 1) {
- $order = Order::find()->where(
- [
- 'store_id' => $value->store_id,
- 'is_delete' => 0,
- 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- 'user_id' => $share['user_id']
- ])
- ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])
- ->andWhere(['>=' , 'pay_price', $self['value']['price']])->one();
- if (!$order) {
- $msg = '您在本商城单笔消费未达到' . $self['value']['price'] . '元';
- \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- $is_level = false;
- }
- if (!$is_level) {
- continue;
- }
- } else{
- $order_money = Order::find()->where(
- [
- 'store_id' => $value->store_id,
- 'is_delete' => 0,
- 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- 'user_id' => $share['user_id']
- ])->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price');
- if ($order_money < $self['value']['price']) {
- $msg = '您在本商城消费未达到' . $self['value']['price'] . '元';
- \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- $is_level = false;
- }
- if (!$is_level) {
- continue;
- }
- }
- }
- // 自身充值金额
- $recharge = $condition['recharge'];
- if ((bool)$recharge['is_open']) {
- $recharge_money = ReOrder::find()->where(['store_id' => $value->store_id, 'user_id' => $share['user_id'], 'is_pay' => 1])->sum('pay_price');
- if ($recharge_money < $recharge['value']) {
- $msg = '您在本商城充值未达到' . $recharge['value'] . '元';
- \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- $is_level = false;
- }
- if (!$is_level) {
- continue;
- }
- }
- // 购买指定商品
- $goods = $condition['goods'];
- $shareholder = $condition['shareholder'];
- if ((bool)$shareholder['is_open'] && (bool)$shareholder['independent_team'] === false) {
- $goods['is_open'] = false;
- //'u.parent_id' => $parent_user->id,
- //// 'h.level_id' => $user_holder_level_id,
- //// 'h.status' => 1,
- //// 'h.is_delete' => 0
- $user_ids = User::find()->alias('u')
- ->leftJoin(['h' => ShareHolder::tableName()], 'h.user_id = u.id')
- ->where([
- 'u.old_parent_id' => $share['user_id'],
- 'h.level_id' => $shareholder['to_level_id'],
- 'h.status' => 1,
- 'h.is_delete' => 0
- ])
- ->limit($shareholder['num'])
- ->select('u.id')
- ->column();
- if (count($user_ids) < $shareholder['num']) {
- $is_level = false;
- }
- }
- if ((bool)$goods['is_open']) {
- // 查找该用户是否买过此商品
- $goods_model = Order::find()->alias('o')
- ->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id')
- ->where(
- [
- 'o.store_id' => $value->store_id,
- 'o.user_id' => $share['user_id'],
- 'o.is_delete' => 0,
- 'o.trade_status' => Order::ORDER_FLOW_CONFIRM
- ])
- ->andWhere(['or', ['o.is_pay' => 1], ['o.pay_type' => 2]])
- ->andWhere(['od.goods_id' => $goods['value']['id']])->one();
- if (!$goods_model) {
- $msg = '未购买过指定商品, 商品id' . (is_array($goods['value']['id']) ? implode(',', $goods['value']['id']) : $goods['value']['id']);
- \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- $is_level = false;
- }
- if (!$is_level) {
- continue;
- }
- // 是否过了售后期
- $pay_time = $goods_model->pay_time;
- if (time() < ($pay_time + $goods['day'] * 24 * 3600)) {
- $msg = '购买过的指定商品未过售后期, 商品id' . (is_array($goods['value']['id']) ? implode(',', $goods['value']['id']) : $goods['value']['id']);
- \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- $is_level = false;
- }
- if (!$is_level) {
- continue;
- }
- }
- // 累计佣金金额
- $amount_total = $condition['amount_total'];
- if ((bool)$amount_total['is_open']) {
- $user = User::findOne($share['user_id']);
- if ($user->total_price < $amount_total['value']) {
- $msg = '您在本商城的佣金未达到' . $amount_total['value'] . '元';
- \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]);
- $is_level = false;
- }
- if (!$is_level) {
- continue;
- }
- }
- if (($is_level) && (
- (bool)$goods['is_open'] ||
- (bool)$team_order['is_open'] ||
- (bool)$man['is_open'] ||
- (bool)$self['is_open'] ||
- (bool)$recharge['is_open'] ||
- (bool)$amount_total['is_open'] ||
- (
- (bool)$shareholder['is_open']) &&
- (bool)$shareholder['independent_team'] === false
- )
- ) {
- $t = \Yii::$app->db->beginTransaction();
- $holderSave = 0;
- try {
- $holder = ShareHolder::findOne(['status' => 1, 'is_delete' => 0, 'store_id' => $value->store_id, 'user_id' => $share['user_id']]);
- if ($holder) {
- //添加股东升级记录
- //查询等级(旧)
- $before_level = ShareHolderLevel::findOne($holder->level_id);
- //查询等级(新)
- $after_level = ShareHolderLevel::findOne($value->id);
- //添加股东升级记录
- $level_log = new ShareHolderLevelLog();
- $level_log->before_level = $before_level->level;
- $level_log->after_level = $after_level->level;
- $level_log->user_id = $share['user_id'];
- $level_log->store_id = $value->store_id;
- $level_log->desc = $type ? '后台修改数据使其达到升级条件' : "用户达到升级条件";
- if (!$level_log->save()) {
- throw new Exception('等级更新失败');
- }
- $holder->level_id = $value->id;
- if (!$holder->save()) {
- $t->rollBack();
- \Yii::warning(['------------ 等级更新失败 ------------', $holder->errors]);
- } else {
- $user_info = User::findOne($share['user_id']);
- if (!empty($value->member_level) && $value->member_level > $user_info->level){
- $user_info->level = $value->member_level;
- if (!$user_info->save()) {
- $t->rollBack();
- \Yii::warning(['------------ 等级更新成功自动更新等级对应会员等级更新失败 ------------', $user_info->errors]);
- }else{
- \Yii::warning(['------------ 等级更新成功自动更新等级对应会员等级 ------------', [
- '之前等级' . $user_info->level,
- '之后等级' . $value->member_level,
- ]]);
- $holderSave = 1;
- }
- }
- \Yii::warning(['------------ 等级更新成功 ------------', [
- '之前等级' . $current_level_id,
- '之后等级' . $value->id,
- ]]);
- }
- }
- $t->commit();
- } catch (\Throwable $e) {
- $t->rollBack();
- \Yii::warning(['------------ 等级更新失败 ------------', $e->getMessage()]);
- }
- if($user_id && $holder && $holderSave){
- return self::checkLevel($store_id, $type, $holder['user_id']);
- }
- }
- BonusPool::checkChildHolderUpdateLevel($share['user_id'], $value->id, $type);
- }
- }
- \Yii::warning('----------------- HANDLE SHARE HOLDER LEVEL END -----------------' . time());
- }
- // 获取指定等级的上级
- public static function getParentByLevel($user_id, ShareHolderLevel $level)
- {
- if ($user_id == 0) {
- return 0;
- }
- $user = User::findOne($user_id);
- $parentHolder = ShareHolder::find()->alias('sh')
- ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'sh.level_id = shl.id')
- ->where(['sh.user_id' => $user->parent_id])
- ->andWhere(['>=', 'shl.level', $level->level])
- ->select('sh.user_id')
- ->orderBy('shl.level ASC')
- ->one();
- if ($parentHolder) {
- return $parentHolder->user_id;
- }
- return static::getParentByLevel($user->parent_id, $level);
- }
- /**
- * 检查下级股东升级
- * @param int $user_id
- * @return void
- * @author Syan mzsongyan@gmail.com
- * @date 2022-07-28
- */
- public static function checkChildHolderUpdateLevel($user_id, $user_holder_level_id = 0, $type = 0)
- {
- debug_log('检查下级股东升级=' . $user_id, 'team.log');
- $user = User::findOne($user_id);
- if (!$user) {
- return;
- }
- $holder_level_list = ShareHolderLevel::find()->where([
- 'is_delete' => 0,
- 'status' => 1,
- 'store_id' => $user->store_id,
- ])->all();
- // 找出符合条件的等级
- $current_level = null;
- // foreach ($holder_level_list as $holder_level) {
- // $condition = json_decode($holder_level->condition);
- // if ((bool)$condition->shareholder->is_open === false || (bool)$condition->shareholder->num == 0) {
- // continue;
- // }
- // if ($condition->shareholder->to_level_id == $user_holder_level_id) {
- // $current_level = $holder_level;
- // }
- // }
- foreach ($holder_level_list as $holder_level) {
- $condition = json_decode($holder_level->condition);
- if ((bool)$condition->shareholder->is_open &&
- (int)$condition->shareholder->num > 0 &&
- (bool)$condition->shareholder->independent_team
- ) {
- $current_level = $holder_level;
- break;
- }
- }
- if ($current_level == null) {
- return;
- }
- // 升级代理后直接改当前用户parent_id为链动关系往上的老板等级的用户
- // $parent_id = static::getParentByLevel($user_id, $current_level);
- // $user->parent_id = $parent_id;
- // $user->save();
- $parent_user = User::findOne($user->parent_id);
- if (!$parent_user) {
- return;
- }
- $parent_holder = ShareHolder::findOne(['status' => 1, 'is_delete' => 0, 'is_out' => 0, 'store_id' => $user->store_id, 'user_id' => $parent_user->id]);
- if (!$parent_holder) {
- return;
- }
- $parent_holder_level = ShareHolderLevel::findOne($parent_holder->level_id);
- if (!$parent_holder_level) {
- return;
- }
- if ($parent_holder_level->level >= $current_level->level) {
- return;
- }
- $condition = json_decode($current_level->condition);
- // 查找父级的直属下级股东
- $user_ids = User::find()->alias('u')
- ->leftJoin(['h' => ShareHolder::tableName()], 'h.user_id = u.id')
- ->where([
- 'u.old_parent_id' => $parent_user->id,
- // 'h.level_id' => $user_holder_level_id,
- 'h.status' => 1,
- 'h.is_delete' => 0,
- ])
- ->andWhere(['>=', 'h.level_id', $condition->shareholder->to_level_id])
- ->limit($condition->shareholder->num)//感觉不用加这个 下面有数组截取 但是不加怕查询太慢
- ->orderBy('h.created_at ASC')
- ->select('u.id')
- ->column();
- //去重父级的直属下级股东以及滑落记录 两个数组 满足条件人数以及等级条件上级就出局
- //查询滑落记录
- $slippedUserLog = ShareHolderSlippedLog::getSlippedUserLog($parent_user->id);
- //查询滑落记录的达到条件的股东
- $slippedUserLog = User::find()->alias('u')
- ->leftJoin(['h' => ShareHolder::tableName()], 'h.user_id = u.id')
- ->where([
- 'u.id' => $slippedUserLog,
- // 'h.level_id' => $user_holder_level_id,
- 'h.status' => 1,
- 'h.is_delete' => 0,
- ])
- ->andWhere(['>=', 'h.level_id', $condition->shareholder->to_level_id])
- ->orderBy('h.created_at ASC')
- ->limit($condition->shareholder->num)//感觉不用加这个 下面有数组截取 但是不加怕查询太慢
- ->select('u.id')
- ->column();
- debug_log($slippedUserLog, 'slipped.log');
- debug_log($user_ids, 'slipped.log');
- //将滑落记录跟下级记录合并 再去重
- if (!empty($slippedUserLog)) {
- $user_ids = array_values(array_unique(array_merge($user_ids, $slippedUserLog)));
- }
- $old_user_ids = $user_ids;
- //截取数组
- $user_ids = array_slice($user_ids, 0, $condition->shareholder->num); //得截取一下 怕合并后人数太多 得改动下级的上级ID
- $other_user_ids = array_slice($old_user_ids, $condition->shareholder->num);
- //判断是否满足条件
- if (count($user_ids) >= $condition->shareholder->num) {
- $t = \Yii::$app->db->beginTransaction();
- try {
- //添加股东升级记录
- //查询股东等级(旧)
- $before_level = $parent_holder_level;
- //查询股东等级(新)
- $after_level = $current_level;
- //添加股东升级记录
- $level_log = new ShareHolderLevelLog();
- $level_log->before_level = $before_level->level;
- $level_log->after_level = $after_level->level;
- $level_log->user_id = $parent_holder->user_id;
- $level_log->store_id = $user->store_id;
- $level_log->desc = $type ? "后台修改使下级助力出局升级" : "下级助力出局升级";
- if (!$level_log->save()) {
- throw new Exception('股东等级更新失败');
- }
- $parent_holder->level_id = $current_level->id;
- //将出局的标记为出局状态
- $parent_holder->is_out = 1;
- if (!$parent_holder->save()) {
- throw new Exception('等级更新失败');
- }
- // 更改出局状态表
- $out_log = ShareHolderOutLog::findOne(['child_user_id' => $parent_user->id]);
- if ($out_log) {
- ShareHolderOutLog::updateAll(['status' => 1], ['child_user_id' => $parent_user->id]);
- // $out_log->status = 1;
- // $out_log->save();
- }
- static::sendFrostMoney($parent_user->id, $parent_user->store_id);
- // 升级对应等级的会员等级
- if ($current_level->member_level > $parent_user->level) {
- $parent_user->level = $current_level->member_level;
- if (!$parent_user->save()) {
- throw new Exception('股东升级到对应的等级后,升级绑定的会员等级失败');
- }
- }
- // if ($parent_user->parent_id > 0) {
- // 出局独立团队
- // if ((bool)$condition->shareholder->independent_team) {
- $parent_user_old_parent_id = $parent_user->parent_id;
- $parent_user->parent_id = 0;
- if (!$parent_user->save()) {
- throw new Exception('出局独立团队失败');
- }
- self::addShareHolderParentOutLog($parent_user, $parent_user_old_parent_id, '链动出局');
- foreach ($user_ids as $user_item_id) {
- $user_item = User::findOne($user_item_id);
- if ($user_item) {
- $shareHolder = ShareHolder::findOne(['user_id' => $user_item_id, 'is_delete' => 0]);
- if ($shareHolder && intval($shareHolder->is_out)) {
- continue;
- }
- $beforeParentId = $user_item->parent_id;
- $user_item->parent_id = $parent_user_old_parent_id;
- if (!$user_item->save()) {
- throw new Exception('助力出局的股东改变关系失败');
- }
- $desc = $type ? "后台修改数据使股东上级出局" : "股东上级出局";
- self::addShareHolderParentOutLog($user_item, $beforeParentId, $desc);
- //记录出局关系
- $out = new ShareHolderOutLog();
- $out->parent_user_id = $parent_user->id;
- $out->child_user_id = $user_item->id;
- $out->save();
- }
- }
- foreach ($other_user_ids as $other_user_id) {
- $other_user_item = User::findOne($other_user_id);
- if ($other_user_item) {
- //判断滑落
- $share_detail_arr = [
- ShareDetail::TYPE_HOLDER_PROFIT,
- ShareDetail::TYPE_RANGE_PROFIT,
- ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_PROFIT,
- ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT,
- ShareDetail::TYPE_RANGE_PROFIT_OLD,
- ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD,
- ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL
- ];
- $share_detail = ShareDetail::find()->alias('sd')
- ->leftJoin(['o' => Order::tableName()], 'o.id = sd.type_id')
- ->where(['o.user_id' => $other_user_id, 'sd.type' => $share_detail_arr, 'sd.user_id' => $parent_user->id])
- ->asArray()->one();
- if ($share_detail) {
- ShareDetail::handleChildData($share_detail['id']);
- }
- }
- }
- // }
- // }
- $t->commit();
- } catch (\Throwable $e) {
- debug_log($e->getMessage(), 'team.log');
- $t->rollBack();
- }
- }
- }
- //上级关系变化
- public static function addShareHolderParentOutLog($user, $beforeParentId, $desc = '', $type = 0, $change_type = ShareHolderParentOutLog::CHANGE_TYPE_NORMAL) {
- if($type == 0){
- $parent_id = $user->parent_id;
- }
- if($type == 1){
- $parent_id = $user->old_parent_id;
- }
- if($beforeParentId == $parent_id){
- \Yii::error('$beforeParentId == $parent_id');
- return [
- 'code' => 0,
- 'msg' => 'ok,$beforeParentId == $parent_id',
- ];
- }
- // if($type == 0){
- // $shareHolder = ShareHolder::findOne(['user_id' => $user->id, 'is_delete' => 0, 'status' => 1]);
- // if(!$shareHolder){
- // \Yii::error('!$shareHolder');
- // return [
- // 'code' => 0,
- // 'msg' => 'ok,!$shareHolder',
- // ];
- // }
- // }
- $parent_out_log = new ShareHolderParentOutLog();
- $parent_out_log->user_id = $user->id;
- $parent_out_log->old_parent_user_id = $beforeParentId;
- $parent_out_log->parent_user_id = $parent_id;
- $parent_out_log->store_id = $user->store_id;
- $parent_out_log->desc = $desc;
- $parent_out_log->type = $type;
- $parent_out_log->change_type = $change_type;
- if (!$parent_out_log->save()) {
- \Yii::error($parent_out_log->getFirstErrors());
- return [
- 'code' => 1,
- 'msg' => 'ShareHolderParentOutLog保存失败' . array_shift($parent_out_log->getFirstErrors()),
- ];
- }
- return [
- 'code' => 0,
- 'msg' => 'ok',
- ];
- }
- // 检查普通用户充值金额是否达到成为股东的条件
- public static function generalUserRecharge($user_id, $store_id)
- {
- //查找股东是否存在或被拒绝或审核中
- $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $store_id, 'status' => 1]);
- if ($shareHolder) {
- return;
- }
- $user = User::findOne($user_id);
- if (!$user) {
- return;
- }
- // 获取所有等级消费金额条件
- $share_holder_level = ShareHolderLevel::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $store_id])->orderBy('level desc')->all();
- $upgrade_level = 0;
- $member_level = 0;
- foreach ($share_holder_level as $holder_level) {
- $condition = Json::decode($holder_level->condition);
- $recharge = $condition['recharge'];
- if ((bool)$recharge['is_open']) {
- $recharge_money = ReOrder::find()->where(['store_id' => $store_id, 'user_id' => $user_id, 'is_pay' => 1])->sum('pay_price');
- if ($recharge_money >= $recharge['value']) {
- $upgrade_level = $holder_level->id;
- $member_level = $holder_level->member_level;
- break;
- }
- }
- }
- if ($upgrade_level > 0) {
- $t = \Yii::$app->db->beginTransaction();
- try {
- $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
- $model = new ShareHolder();
- $model->level_id = $upgrade_level;
- $model->store_id = $store_id;
- $model->user_id = $user_id;
- $model->name = $saas_user->name;
- $model->address = '';
- $model->mobile = $saas_user->mobile;
- $model->province = 0;
- $model->city = 0;
- $model->district = 0;
- $model->province_name = '';
- $model->city_name = '';
- $model->district_name = '';
- $model->status = 1;
- $model->audit_time = time();
- if (!$model->save()) {
- throw new \Exception(json_encode($model->errors));
- }
- self::checkChildHolderUpdateLevel($user_id, $upgrade_level);
- self::checkLevel($store_id, 0, $user_id);
- if ($member_level > (int)$user->level) {
- $user->level = $member_level;
- }
- $user->is_holder = 1;
- if (!$user->save()) {
- throw new \Exception(json_encode($user->errors));
- }
- $level_log = new ShareHolderLevelLog();
- $level_log->before_level = 0;
- $level_log->after_level = $upgrade_level;
- $level_log->user_id = $user_id;
- $level_log->store_id = $store_id;
- $level_log->order_id = 0;
- $level_log->desc = "用户累计充值升级为股东";
- if (!$level_log->save()) {
- throw new Exception('等级更新失败');
- }
- $t->commit();
- } catch (\Throwable $e) {
- $t->rollBack();
- }
- }
- }
- // 检查普通用户消费金额是否达到成为股东的条件
- public static function generalUserConsume($user_id, $store_id)
- {
- \Yii::warning(['----------------- 检查普通用户消费金额是否达到成为股东的条件 --------' . $user_id, $store_id]);
- //查找股东是否存在或被拒绝或审核中
- $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $store_id, 'status' => 1]);
- if ($shareHolder) {
- return;
- }
- $user = User::findOne($user_id);
- if (!$user) {
- return;
- }
- // 获取所有等级消费金额条件
- $share_holder_level = ShareHolderLevel::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $store_id])->orderBy('level desc')->all();
- $upgrade_level = 0;
- $member_level = 0;
- $order_id = 0;
- foreach ($share_holder_level as $holder_level) {
- $condition = Json::decode($holder_level->condition);
- $self = $condition['self'];
- if ((bool)$self['is_open']) {
- // 兼容老版本
- if (!isset($self['value']['order_number'])) {
- $self_price = $self['value'];
- $self['value'] = [];
- $self['value']['order_number'] = 0;
- $self['value']['price'] = $self_price;
- }
- if ($self['value']['order_number'] == 1) {
- $order = Order::find()->where(
- [
- 'store_id' => $store_id,
- 'is_delete' => 0,
- 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- 'user_id' => $user_id
- ])
- ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])
- ->andWhere(['>=' , 'pay_price', $self['value']['price']])->one();
- if ($order) {
- $upgrade_level = $holder_level->id;
- $member_level = $holder_level->member_level;
- $order_id = $order->id;
- break;
- }
- } else{
- $order_money = Order::find()->where(
- [
- 'store_id' => $store_id,
- 'is_delete' => 0,
- 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- 'user_id' => $user_id
- ])->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price');
- if ($order_money >= $self['value']['price']) {
- $upgrade_level = $holder_level->id;
- $member_level = $holder_level->member_level;
- break;
- }
- }
- }
- }
- if ($upgrade_level > 0) {
- $t = \Yii::$app->db->beginTransaction();
- try {
- $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
- $model = new ShareHolder();
- $model->level_id = $upgrade_level;
- $model->store_id = $store_id;
- $model->user_id = $user_id;
- $model->name = $saas_user->name;
- $model->address = '';
- $model->mobile = $saas_user->mobile;
- $model->province = 0;
- $model->city = 0;
- $model->district = 0;
- $model->province_name = '';
- $model->city_name = '';
- $model->district_name = '';
- $model->status = 1;
- $model->audit_time = time();
- if (!$model->save()) {
- throw new \Exception(json_encode($model->errors));
- }
- self::checkChildHolderUpdateLevel($user_id, $upgrade_level);
- self::checkLevel($store_id, 0, $user_id);
- if ($member_level > (int)$user->level) {
- $user->level = $member_level;
- }
- $user->is_holder = 1;
- if (!$user->save()) {
- throw new \Exception(json_encode($user->errors));
- }
- $level_log = new ShareHolderLevelLog();
- $level_log->before_level = 0;
- $level_log->after_level = $upgrade_level;
- $level_log->user_id = $user_id;
- $level_log->store_id = $store_id;
- $level_log->order_id = $order_id;
- $level_log->desc = "用户消费升级为股东";
- if (!$level_log->save()) {
- throw new Exception('等级更新失败');
- }
- $t->commit();
- } catch (\Throwable $e) {
- \Yii::error($e);
- $t->rollBack();
- }
- }
- }
- public static function handleGoods($store_id = 1) {
- // \Yii::warning(['----------------- 股东会员等级 商品订单自动确认机制开始 --------' . microtime(true)]);
- $share_holder_level = ShareHolderLevel::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $store_id])->orderBy('level desc')->all();
- foreach ($share_holder_level as $value) {
- /**
- * @var $value ShareHolderLevel
- */
- $condition = Json::decode($value->condition);
- // 购买指定商品
- $goods = $condition['goods'];
- if ((bool)$goods['is_open'] && !empty($goods['value']['id'])) {
- // 查找买过此商品订单
- $order_model = Order::find()->alias('o')->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id')->where(['o.store_id' => $value->store_id, 'o.is_delete' => 0, 'o.is_pay' => 1])
- ->andWhere(['od.goods_id' => $goods['value']['id']])->select('o.id order_id');
- if ($goods['value']['is_send']) {
- $order_ids = (clone $order_model)->andWhere(['o.trade_status' => 0])->asArray()->all();
- $order_id = array_column($order_ids, 'order_id');
- if (!empty($order_id)) {
- \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动发货机制--------' . microtime(true), $goods['value']['is_send'], count($order_id), implode(',', $order_id)]);
- Order::updateAll(['trade_status' => Order::ORDER_FLOW_SEND, 'send_time' => time()], ['AND', ['in', 'id', $order_id], ['trade_status' => 0]]);
- }
- }
- if ($goods['value']['is_confirm']) {
- // //如果是代理配送 且上门安装,用户没有对商品确认收货则不可确认收货
- // $order_detail = OrderDetail::findAll(['order_id' => $order_id]);
- $is_can_confirm = true;
- // foreach ($order_detail as $detail) {
- // $is_can_confirm_sub = (AgentGoodsInstallLog::findOne(['order_detail_id' => $detail->id, 'status' => [0, 1], 'is_need_install' => 1]));
- // if ($is_can_confirm_sub) {
- // $is_can_confirm = false;
- // }
- // }
- $order_ids = (clone $order_model)->andWhere(['o.trade_status' => Order::ORDER_FLOW_SEND])->asArray()->all();
- $order_id = array_column($order_ids, 'order_id');
- if ($is_can_confirm && !empty($order_id)) {
- \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动收货机制--------' . microtime(true), $goods['value']['is_confirm'], count($order_id), implode(',', $order_id)]);
- Order::updateAll(['trade_status' => Order::ORDER_FLOW_CONFIRM, 'confirm_time' => time()], ['and', ['in', 'id', $order_id], ['trade_status' => Order::ORDER_FLOW_SEND]]);
- }
- }
- $order_ids = (clone $order_model)->andWhere(['o.trade_status' => Order::ORDER_FLOW_CONFIRM, 'o.is_sale' => 0])->asArray()->all();
- $order_id = array_column($order_ids, 'order_id');
- if (!empty($order_id)) {
- $after_sale_time = (int)$goods['value']['day'];
- $order_event = new OrderEvent();
- \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动售后机制--------' . microtime(true), $goods['value']['day'], count($order_id), implode(',', $order_id)]);
- $order_event->orderSend(1, $order_id, $value->store_id, $after_sale_time);
- }
- }
- }
- // \Yii::warning(['----------------- 股东会员等级 商品订单自动确认机制结束 --------' . microtime(true)]);
- }
- //股东会员等级 商品订单自动确认机制
- public static function handleOrderAuto($order) {
- try {
- if(is_numeric($order)){
- $order = PtActivityOrder::findOne($order);
- }
- if(!$order || $order->is_sale || !$order->user_id || !$order->is_pay){
- return;
- }
- $share_holder_level = ShareHolderLevel::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $order->store_id])->orderBy('level desc')->all();
- foreach ($share_holder_level as $value) {
- /**
- * @var $value ShareHolderLevel
- */
- $condition = Json::decode($value->condition);
- // 购买指定商品
- $goods = $condition['goods'];
- if ((bool)$goods['is_open'] && !empty($goods['value']['id'])) {
- // 查找买过此商品订单
- $order_model = Order::find()->alias('o')->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id')->where(['o.id' => $order->id, 'o.is_delete' => 0, 'o.is_pay' => 1])
- ->andWhere(['od.goods_id' => $goods['value']['id']])->select('o.id order_id');
- if ($goods['value']['is_send']) {
- $order_ids = (clone $order_model)->andWhere(['o.trade_status' => 0])->asArray()->all();
- $order_id = array_column($order_ids, 'order_id');
- if (!empty($order_id) && $order->trade_status == 0) {
- \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动发货机制--------' . microtime(true), $goods['value']['is_send'], count($order_id), implode(',', $order_id)]);
- // Order::updateAll(['trade_status' => Order::ORDER_FLOW_SEND, 'send_time' => time()], ['AND', ['in', 'id', $order_id], ['trade_status' => 0]]);
- $order->trade_status = Order::ORDER_FLOW_SEND;
- $order->send_time = time();
- $order->save();
- }
- }
- if ($goods['value']['is_confirm']) {
- // //如果是代理配送 且上门安装,用户没有对商品确认收货则不可确认收货
- // $order_detail = OrderDetail::findAll(['order_id' => $order_id]);
- $is_can_confirm = true;
- // foreach ($order_detail as $detail) {
- // $is_can_confirm_sub = (AgentGoodsInstallLog::findOne(['order_detail_id' => $detail->id, 'status' => [0, 1], 'is_need_install' => 1]));
- // if ($is_can_confirm_sub) {
- // $is_can_confirm = false;
- // }
- // }
- $order_ids = (clone $order_model)->andWhere(['o.trade_status' => Order::ORDER_FLOW_SEND])->asArray()->all();
- $order_id = array_column($order_ids, 'order_id');
- if ($is_can_confirm && !empty($order_id) && $order->trade_status == Order::ORDER_FLOW_SEND) {
- \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动收货机制--------' . microtime(true), $goods['value']['is_confirm'], count($order_id), implode(',', $order_id)]);
- // Order::updateAll(['trade_status' => Order::ORDER_FLOW_CONFIRM, 'confirm_time' => time()], ['and', ['in', 'id', $order_id], ['trade_status' => Order::ORDER_FLOW_SEND]]);
- $order->trade_status = Order::ORDER_FLOW_CONFIRM;
- $order->confirm_time = time();
- $order->save();
- }
- }
- $order_ids = (clone $order_model)->andWhere(['o.trade_status' => Order::ORDER_FLOW_CONFIRM, 'o.is_sale' => 0])->asArray()->all();
- $order_id = array_column($order_ids, 'order_id');
- if (!empty($order_id)) {
- $after_sale_time = (int)$goods['value']['day'];
- // $order_event = new OrderEvent();
- \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动售后机制--------' . microtime(true), $goods['value']['day'], count($order_id), implode(',', $order_id)]);
- // $order_event->orderSend(1, $order_id, $value->store_id, $after_sale_time);
- $delay = $after_sale_time * 86400;
- $order_ = Order::findOne($order->id);
- $order_->future_sales_time = bcadd(time(), $delay);
- $order_->save();
- if ($delay == 0) {
- $delay = 60;
- }
- \queue_push(new \app\jobs\order\NoAfterSalesOrderJob(['store_id' => $order->store_id, 'order_id' => $order->id]), $delay);
- }
- }
- }
- } catch (\Exception $e) {
- \Yii::error($e);
- debug_log($e->getMessage(), __CLASS__ . '.log');
- }
- // \Yii::warning(['----------------- 股东会员等级 商品订单自动确认机制结束 --------' . microtime(true)]);
- }
- /**
- * 检查是否可以申请股东
- * @param $store_id
- * @param $user_id
- * @return array
- */
- public static function checkApply($store_id, $user_id) {
- $share_level = ShareHolderLevel::findOne(['is_default' => 1, 'store_id' => $store_id, 'is_delete' => 0, 'status' => 1]);
- if (!$share_level) {
- return [
- 'code' => 1,
- 'msg' => '未找到相应等级'
- ];
- }
- //TODO 股东人数以及金额
- $condition = Json::decode($share_level->condition);
- // 团队人数
- $man = $condition['man'];
- if ((bool)$man['is_open']) {
- foreach ((array)$man['value'] as $m) {
- $man_data = User::find()->childs($user_id, false, $m['level'])->where(['store_id' => $store_id])->asArray()->all();
- if (count($man_data) < $m['count']) {
- return [
- 'code' => 1,
- 'msg' => '团队人数:' . $m['level'] . '级团队人数未达到' . $m['count']
- ];
- } else {
- if (isset($m['money'])) {
- //消费达到$m['money']以上允许升级
- $man_user_id = array_column($man_data, 'id');
- $pay_price = Order::find()->where(
- [
- 'store_id' => $store_id,
- 'is_delete' => 0,
- 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- 'user_id' => $man_user_id
- ])
- ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price');
- if ($m['money'] > $pay_price) {
- return [
- 'code' => 1,
- 'msg' => '团队金额:' . $m['level'] . '级团队消费金额未达到' . $m['money']
- ];
- }
- }
- }
- }
- }
- // 团队消费金额
- $order = $condition['order'];
- if ((bool)$order['is_open']) {
- foreach ($order['value'] as $o) {
- $man_data = User::find()->childs($user_id, false, $o['level'])->where(['store_id' => $store_id])->select('id')->asArray()->all();
- if (count($man_data) < 1) {
- return [
- 'code' => 1,
- 'msg' => '团队金额:' . $o['level'] . '级团队人数为空'
- ];
- }
- $man_user_id = array_column($man_data, 'id');
- $order_money = Order::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM])->andWhere(['in', 'user_id', $man_user_id])->sum('pay_price');
- if ($order_money < $o['count']) {
- return [
- 'code' => 1,
- 'msg' => '团队金额:' . $o['level'] . '级团队消费金额未达到' . $o['count']
- ];
- }
- }
- }
- // 自身消费金额
- $self = $condition['self'];
- if ((bool)$self['is_open']) {
- // 兼容老版本
- if (!isset($self['value']['order_number'])) {
- $self_price = $self['value'];
- $self['value'] = [];
- $self['value']['order_number'] = 0;
- $self['value']['price'] = $self_price;
- }
- if ($self['value']['order_number'] == 1) {
- //单笔
- $order = Order::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $user_id])
- ->andWhere(['>=' , 'pay_price', $self['value']['price']])->one();
- if (!$order) {
- return [
- 'code' => 1,
- 'msg' => '您在本商城单笔消费未达到' . $self['value']['price'] . '元'
- ];
- }
- } else{
- //多笔
- $order_money = Order::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $user_id])->sum('pay_price');
- if ($order_money < $self['value']['price']) {
- return [
- 'code' => 1,
- 'msg' => '您在本商城消费未达到' . $self['value']['price'] . '元'
- ];
- }
- }
- }
- // 自身充值金额
- $recharge = $condition['recharge'];
- if ((bool)$recharge['is_open']) {
- $recharge_money = ReOrder::find()->where(['store_id' => $store_id, 'user_id' => $user_id, 'is_pay' => 1])->sum('pay_price');
- if ($recharge_money < $recharge['value']) {
- return [
- 'code' => 1,
- 'msg' => '您在本商城充值未达到' . $recharge['value'] . '元'
- ];
- }
- }
- // 购买指定商品
- $goods = $condition['goods'];
- if ((bool)$goods['is_open']) {
- // 查找该用户是否买过此商品
- $order_goods = Order::find()->alias('o')->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id')->where(['o.store_id' => $store_id, 'o.user_id' => $user_id, 'o.is_delete' => 0, 'o.is_pay' => 1, 'o.trade_status' => Order::ORDER_FLOW_CONFIRM])
- ->andWhere(['od.goods_id' => $goods['value']['id']])->one();
- if (!$order_goods) {
- return [
- 'code' => 1,
- 'msg' => '您未购买过指定商品'
- ];
- }
- // 是否过了售后期
- $pay_time = $order_goods->pay_time;
- if (time() < ($pay_time + $goods['day'] * 24 * 3600)) {
- return [
- 'code' => 1,
- 'msg' => '购买过的指定商品未过售后期'
- ];
- }
- }
- return [
- 'code' => 0,
- 'msg' => 'success'
- ];
- }
- // 用户自己购买指定商品成为股东(已经是股东)
- public static function userSelfBuyGoods2ShareHolder($order_id, $pay_up = 0)
- {
- if ($pay_up) {
- debug_log(['pay_up' => $pay_up, 'order_id' => $order_id->id, 'userSelfBuyGoods2ShareHolder'], 'userAuto2ShareHolder.log');
- }
- $t = \Yii::$app->db->beginTransaction();
- try {
- if (!$order_id) {
- throw new \Exception("订单id为空");
- }
- if(isset($order_id->id)){
- $order = $order_id;
- }else{
- $order = Order::findOne($order_id);
- }
- $order_id = $order->id;
- $user_id = $order->user_id;
- $user = User::findOne($user_id);
- $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $order->store_id, 'status' => 1]);
- if ($shareHolder) {
- $level = ShareHolderLevel::findOne($shareHolder->level_id)->level;
- //查找最高等级
- $shareHolderLevelList = ShareHolderLevel::find()
- ->where(['store_id' => $order->store_id, 'status' => 1, 'is_delete' => 0])
- ->andWhere(['>', 'level', $level])
- ->select('condition, id, level, member_level')
- ->orderBy(['level' => SORT_DESC])->asArray()->all();
- if (empty($shareHolderLevelList)) {
- throw new \Exception("等级为空");
- }
- $level_id = 0;
- $member_level = 0;
- if ($pay_up) {
- debug_log(['shareHolderLevelList' => $shareHolderLevelList], 'userAuto2ShareHolder.log');
- }
- foreach ($shareHolderLevelList as $item) {
- $condition = json_decode($item['condition'], true);
- if ((int)$condition['goods']['is_open'] === 1 && !empty($condition['goods']['value']['id'])) {
- if($pay_up && ($condition['goods']['pay_up'] != 1)){
- continue;
- }
- if($order->share_hold_pay_up == 1){
- continue;
- }
- $order_detail = OrderDetail::find()->where(['order_id' => $order_id, 'goods_id' => $condition['goods']['value']['id']])->select('goods_id')->one();
- if (!empty($order_detail)) {
- $level_id = $item['id'];
- $member_level = $item['member_level'];
- break;
- }
- }
- }
- if ($level_id > 0) {
- $old_level_id = $shareHolder->level_id;
- $shareHolder->level_id = $level_id;
- if ((int)$member_level > (int)$user->level) {
- $user->level = $member_level;
- $user->save();
- }
- $shareHolder->save();
- if($pay_up){
- $order->share_hold_pay_up = 1;
- $order->save();
- }
- self::checkChildHolderUpdateLevel($user_id, $level_id);
- self::checkLevel($order->store_id, 0, $user_id);
- $level_log = new ShareHolderLevelLog();
- $level_log->before_level = $old_level_id;
- $level_log->after_level = $level_id;
- $level_log->user_id = $user_id;
- $level_log->store_id = $order->store_id;
- $level_log->order_id = $order->id;
- $level_log->desc = "用户购买指定商品升级更高等级股东";
- if (!$level_log->save()) {
- throw new Exception('等级更新失败');
- }
- }
- }
- $t->commit();
- } catch (\Exception $e) {
- $t->rollBack();
- debug_log($e->getMessage(), 'userSelfBuyGoods2ShareHolder.log');
- return [
- 'code' => 1,
- 'msg' => $e->getMessage()
- ];
- }
- }
- //用户购买指定商品成为股东
- public static function userAuto2ShareHolder($order_id, $pay_up = 0)
- {
- if ($pay_up) {
- debug_log(['pay_up' => $pay_up, 'order_id' => $order_id->id, 'userAuto2ShareHolder'], 'userAuto2ShareHolder.log');
- }
- $t = \Yii::$app->db->beginTransaction();
- try {
- if (!$order_id) {
- throw new \Exception("订单id为空");
- }
- if(isset($order_id->id)){
- $order = $order_id;
- }else{
- $order = Order::findOne($order_id);
- }
- $order_id = $order->id;
- $user_id = $order->user_id;
- $user = User::findOne($user_id);
- $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $order->store_id, 'status' => 1]);
- if (empty($shareHolder)) {
- //查找最高等级
- $shareHolderLevelList = ShareHolderLevel::find()->where(['store_id' => $order->store_id, 'status' => 1, 'is_delete' => 0])->select('condition, id, level, member_level, store_id')->asArray()->all();
- $id = [];
- $num = 0;
- if ($pay_up) {
- debug_log(['shareHolderLevelList' => $shareHolderLevelList, 'store_id' => $order->store_id], 'userAuto2ShareHolder.log');
- }
- foreach ($shareHolderLevelList as $item) {
- $condition = json_decode($item['condition'], true);
- if ((int)$condition['goods']['is_open'] === 1 && !empty($condition['goods']['value']['id'])) {
- if($pay_up && ($condition['goods']['pay_up'] != 1)){
- continue;
- }
- if($order->share_hold_pay_up == 1){
- continue;
- }
- //给首次升级成功股东的产品购买记录修改成标识为升级产品。 会在链动列表展示 升级产品 并在链动小推大逻辑中使用到。
- $ShareHolderProfitGoodsLog = ShareHolderProfitGoodsLog::findOne(['order_id' => $order_id, 'goods_id' => $condition['goods']['value']['id']]);
- if (!empty($ShareHolderProfitGoodsLog)) {
- $ShareHolderProfitGoodsLog->is_switch = 1;
- $ShareHolderProfitGoodsLog->save();
- }
- $order_detail = OrderDetail::find()->where(['order_id' => $order_id, 'goods_id' => $condition['goods']['value']['id']])->select('goods_id')->one();
- if (!empty($order_detail)) {
- $id[$num]['id'] = $item['id'];
- $id[$num]['level'] = $item['level'];
- $id[$num]['id'] = $item['id'];
- $id[$num]['member_level'] = $item['member_level'];
- $num++;
- }
- }
- }
- $last_names = array_column($id, 'level');
- array_multisort($last_names, SORT_DESC, $id);
- //查找用户是否存在或被拒绝或审核中
- $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $order->store_id]);
- //不存在
- if (empty($shareHolder) && empty($user->is_holder)) {
- $last_names = array_column($id, 'level');
- array_multisort($last_names, SORT_DESC, $id);
- if (!empty($id)) {
- $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
- $model = new ShareHolder();
- $model->level_id = $id[0]['id'];
- $model->store_id = $order->store_id;
- $model->user_id = $user_id;
- $model->name = $saas_user->name;
- $model->address = '';
- $model->mobile = $saas_user->mobile;
- $model->province = 0;
- $model->city = 0;
- $model->district = 0;
- $model->province_name = '';
- $model->city_name = '';
- $model->district_name = '';
- $model->status = 1;
- $model->audit_time = time();
- $result = $model->save();
- if (!$result) {
- throw new \Exception(json_encode($model->errors));
- }
- if($pay_up){
- $order->share_hold_pay_up = 1;
- $order->save();
- }
- self::checkChildHolderUpdateLevel($user_id, $id[0]['id']);
- self::checkLevel($order->store_id, 0, $model->user_id);
- if ((int)$id[0]['member_level'] > (int)$user->level) {
- $user->level = $id[0]['member_level'];
- }
- $user->is_holder = 1;
- $result = $user->save();
- if (!$result) {
- throw new \Exception(json_encode($user->errors));
- }
- }
- }
- if (!empty($id) && !empty($shareHolder) && in_array($shareHolder->status, [0, 2])) {
- $shareHolder->level_id = $id[0]['id'];
- $shareHolder->status = 1;
- $result = $shareHolder->save();
- if (!$result) {
- throw new \Exception(json_encode($shareHolder->errors));
- }
- self::checkLevel($order->store_id, 0, $shareHolder->user_id);
- // self::checkChildHolderUpdateLevel($user->id, $shareHolder->level_id);
- $user->level = $id[0]['member_level'];
- $user->is_holder = 1;
- $result = $user->save();
- if (!$result) {
- throw new \Exception(json_encode($user->errors));
- }
- }
- //添加股东升级记录
- if (!empty($id)) {
- //添加股东升级记录
- $level_log = new ShareHolderLevelLog();
- $level_log->before_level = 0;
- $level_log->after_level = $id[0]['level'];
- $level_log->user_id = $user_id;
- $level_log->store_id = $order->store_id;
- $level_log->order_id = $order->id;
- $level_log->desc = "用户购买指定商品升级为股东";
- if (!$level_log->save()) {
- throw new Exception('等级更新失败');
- }
- }
- }
- $t->commit();
- } catch (\Exception $e) {
- \Yii::error($e);
- $t->rollBack();
- return [
- 'code' => 1,
- 'msg' => $e->getMessage(),
- 'line' => $e->getLine(),
- ];
- }
- }
- public static function sendFrostMoney($child_id, $store_id)
- {
- $parent_log = ShareHolderOutLog::findOne(['child_user_id' => $child_id]);
- if (!$parent_log) {
- return;
- }
- $count = ShareHolderOutLog::find()->where([
- 'parent_user_id' => $parent_log->parent_user_id,
- 'status' => 0,
- ])->count();
- if ($count > 0) {
- return;
- }
- $shareHolderFrostSendCond = Option::get('shareHolderFrostSendCond', $store_id, 'bonus_pool', 0)['value'];
- if($shareHolderFrostSendCond){
- $child_data = ShareHolderOutLog::find()->where([
- 'parent_user_id' => $parent_log->parent_user_id,
- 'status' => 1,
- ])->asArray()->all();
- foreach($child_data as $child){
- $child_out = ShareHolderOutLog::findOne(['parent_user_id' => $child_id, 'status' => 1]);
- if (!$child_out) {
- return;
- }
- $count = ShareHolderOutLog::find()->where([
- 'parent_user_id' => $child['child_user_id'],
- 'status' => 0,
- ])->count();
- if ($count > 0) {
- return;
- }
- }
- }
- $t = \Yii::$app->db->beginTransaction();
- try {
- $frost_log_amout = ShareHolderFrostLog::find()->where([
- 'parent_user_id' => $parent_log->parent_user_id,
- 'status' => 0,
- ])->sum('amount');
- ShareHolderFrostLog::updateAll([
- 'status' => 1,
- 'updated_at' => time(),
- ], [
- 'parent_user_id' => $parent_log->parent_user_id,
- 'status' => 0,
- ]);
- $detail = new ShareDetail();
- $detail->store_id = $store_id;
- $detail->type_id = 0;
- $detail->type = ShareDetail::TYPE_FROST_PROFIT;
- $detail->user_id = $parent_log->parent_user_id;
- $detail->desc = '冻结佣金释放';
- $detail->money = $frost_log_amout;
- $detail->is_send = 1;
- $detail->save();
- $user = User::findOne($parent_log->parent_user_id);
- $user->updateCounters(['total_price' => $frost_log_amout, 'price' => $frost_log_amout]);
- $t->commit();
- } catch (\Exception $e) {
- $t->rollBack();
- }
- }
- public static function getShareHolderLevelOption($store_id)
- {
- try {
- $list = ShareHolderLevel::find()->where(['store_id' => $store_id, 'is_delete' => 0])->asArray()->all();
- $new_list = [];
- foreach ($list as $item) {
- if ($item['condition']) {
- $condition = json_decode($item['condition'], true);
- if ($condition['goods']['is_open'] == 1 && count($condition['goods']['value']['id']) > 0) {
- $new_list[] = [
- 'goods_ids' => $condition['goods']['value']['id'],
- 'day' => (int)$condition['goods']['value']['day'],
- ];
- }
- }
- }
- return $new_list;
- } catch (\Throwable $e) {
- return [];
- }
- }
- // 取消订单后删除股东分红记录
- public static function cancelOrderShareDetail($order_id)
- {
- try {
- ShareDetail::updateAll(['is_delete' => 1], ['type_id' => $order_id]);
- } catch (\Throwable $e) {
- // Todo
- }
- }
- public static function userSlide($order) {
- $t = \Yii::$app->db->beginTransaction();
- try {
- $list = ShareDetail::find()->where(['type_id' => $order->id, 'type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL], 'is_delete' => 0])->all();
- if ($list) {
- foreach ($list as $share_detail) {
- $handle_child_data_order_id = cache()->get('handle_child_data_order_id' . $order->id);
- if (!$handle_child_data_order_id) {
- ShareDetail::handleChildData($share_detail->id);
- cache()->set('handle_child_data_order_id' . $order->id, 1);
- }
- }
- }
- $t->commit();
- } catch (\Exception $e) {
- $t->rollBack();
- }
- }
- }
|