| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034 |
- <?php
- /**
- * 厦门云联储网络科技有限公司
- * https://www.baokuaiyun.com
- * Copyright (c) 2023 爆块云 All rights reserved.
- */
- namespace app\models;
- use app\constants\OptionSetting;
- use Yii;
- use \app\plugins\scanCodePay\models\Order as ScanOrder;
- use yii\behaviors\TimestampBehavior;
- use yii\db\ActiveRecord;
- use yii\db\Expression;
- use yii\helpers\ArrayHelper;
- use yii\helpers\Json;
- /**
- * This is the model class for table "{{%user_string_code_plus}}".
- *
- * @property integer $id
- * @property integer $store_id
- * @property integer $user_id
- * @property integer $parent_id
- * @property integer $parent_node
- * @property string $recommend_relation
- * @property integer $layer
- * @property string $recommend_relation_node
- * @property integer $layer_node
- * @property integer $team_num
- * @property integer $area_key
- * @property integer $layer_rank
- * @property integer $created_at
- * @property integer $updated_at
- * @property integer $saas_id
- */
- class UserStringCodePlus extends \yii\db\ActiveRecord
- {
- const MODEL_SHOP = 0;
- const MODEL_ALLIANCE = 1;
- const ALLIANCE_STORE_ID = -1;
- const Serial_Code_Collaboration = -99;
- const MODEL_NAME_LIST = array(
- self::MODEL_SHOP => '小模型',
- self::MODEL_ALLIANCE => '大模型',
- );
- /**
- * @inheritdoc
- */
- public static function tableName()
- {
- return '{{%user_string_code_plus}}';
- }
- public function behaviors()
- {
- return [
- [
- 'class' => TimestampBehavior::class,
- 'attributes' => [
- ActiveRecord::EVENT_BEFORE_INSERT => ['created_at'],
- ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at']
- ]
- ]
- ];
- }
- /**
- * @inheritdoc
- */
- public function rules()
- {
- return [
- [['recommend_relation', 'recommend_relation_node'], 'string'],
- [
- [
- 'store_id',
- 'user_id',
- 'parent_id',
- 'layer',
- 'layer_node',
- 'created_at',
- 'updated_at',
- 'parent_node',
- 'team_num',
- 'area_key',
- 'layer_rank',
- 'saas_id'
- ],
- 'integer'
- ],
- ];
- }
- /**
- * @inheritdoc
- */
- public function attributeLabels()
- {
- return [
- 'id' => 'ID',
- 'store_id' => '店铺id',
- 'user_id' => '用户id',
- 'parent_id' => '分销上级id',
- 'parent_node' => '父节点',
- 'recommend_relation_node' => '节点推荐关系',
- 'layer_node' => '节点层级',
- 'recommend_relation' => '分销推荐关系',
- 'layer' => '分销层级',
- 'area_key' => '区域Key',
- 'layer_rank' => '层级排位',
- 'team_num' => '团队人数',
- 'created_at' => '创建时间',
- 'updated_at' => '更新时间',
- 'saas_id' => 'saas用户id',
- ];
- }
- /**
- * @param $store_id
- * @return bool
- */
- public static function checkSettingByStoreId($store_id, $setting)
- {
- if (!$setting) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未配置串码设置"], "app_debug.log");
- return false;
- }
- if (!isset($setting['string_code_store_switch']) || $setting['string_code_store_switch'] != 1) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未开启串码功能"], "app_debug.log");
- return false;
- }
- if (!isset($setting['string_code_model'])) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置串码模式"], "app_debug.log");
- return false;
- }
- if (!is_array($setting['string_code_model'])) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】串码模式配置不是数组"], "app_debug.log");
- return false;
- }
- // if (!isset($setting['string_code_max_layer']) || $setting['string_code_max_layer'] <= 0) {
- // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置串码最大层级"], "app_debug.log");
- // return false;
- // }
- // if (!isset($setting['string_code_condition_value']) || $setting['string_code_condition_value'] <= 0) {
- // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置结点加入金额条件"], "app_debug.log");
- // return false;
- // }
- // if (!isset($setting['string_code_root_user_id']) || $setting['string_code_root_user_id'] <= 0) {
- // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置根结点用户"], "app_debug.log");
- // return false;
- // }
- // if (!isset($setting['string_code_scan_scale_1']) || $setting['string_code_scan_scale_1'] <= 0) {
- // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置当面付比例"], "app_debug.log");
- // return false;
- // }
- // if (!isset($setting['string_code_order_scale_1']) || $setting['string_code_order_scale_1'] <= 0) {
- // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置订单比例"], "app_debug.log");
- // return false;
- // }
- // if (!isset($setting['string_code_pv_scale_1']) || $setting['string_code_pv_scale_1'] <= 0) {
- // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置PV比例"], "app_debug.log");
- // return false;
- // }
- // if ($store_id != self::ALLIANCE_STORE_ID) {
- // if (!isset($setting['string_code_scan_scale_0']) || $setting['string_code_scan_scale_0'] <= 0) {
- // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置当面付比例"], "app_debug.log");
- // return false;
- // }
- // if (!isset($setting['string_code_order_scale_0']) || $setting['string_code_order_scale_0'] <= 0) {
- // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置订单比例"], "app_debug.log");
- // return false;
- // }
- // if (!isset($setting['string_code_pv_scale_0']) || $setting['string_code_pv_scale_0'] <= 0) {
- // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置PV比例"], "app_debug.log");
- // return false;
- // }
- // }
- return true;
- }
- /**
- * 加入节点
- * @param $order
- * @return bool
- */
- public static function joinNode($order, $is_scan = 0)
- {
- $store_id = $order->store_id;
- $user_id = $order->user_id;
- $order_id = $order->id;
- $order_no = $order->order_no;
- $temporder = json_encode($order);
- //debug_log([__METHOD__, __LINE__, "订单信息:【{$temporder}】- $store_id - $user_id - $order_id - $order_no - $is_scan "], "app_debug.log");
- $saas_user_id = SaasUser::findSaasIdByUserId($user_id);
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $check_res = self::checkSettingByStoreId($store_id, $setting);
- if (!$check_res) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log");
- return false;
- }
- //门店模式
- $string_code_shop_value = 0;
- if ($store_id != -1) {
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $string_code_shop_value = $setting['string_code_shop_value'] ? $setting['string_code_shop_value'] : 0;
- }
- //debug_log([__METHOD__, __LINE__, "加入节点 门店模式:{$string_code_shop_value},0品牌模式 1门店模式"], "app_debug.log");
- list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']);
- if ($model_switch_shop) {
- $res = self::joinNodeByShopModel($store_id, $user_id, $setting, self::MODEL_SHOP);
- if ($res) {
- UserStringCodeOrderHistory::sendRedPacket($store_id, $user_id, self::MODEL_SHOP, $order_id, $order_no, $is_scan, $string_code_shop_value);
- }
- }
- if ($model_switch_alliance) {
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, self::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $res = self::joinNodeByAllianceModel(self::ALLIANCE_STORE_ID, $saas_user_id, $setting, self::MODEL_ALLIANCE);
- if ($res) {
- UserStringCodeOrderHistory::sendRedPacket($store_id, $user_id, self::MODEL_ALLIANCE, $order_id, $order_no, $is_scan, $string_code_shop_value);
- }
- }
- return true;
- }
- public static function joinNodeByShopModel($store_id, $user_id, $setting, $model_val, $string_code_shop_value = 0)
- {
- $user = User::findOne($user_id);
- $saas_user_id = SaasUser::findSaasIdByUserId($user_id);
- $model_name = self::MODEL_NAME_LIST[self::MODEL_SHOP];
- $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_SHOP);
- $user_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
- if ($user_string_code) {
- //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id}已加入串码节点"], "app_debug.log");
- return false;
- }
- $root_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]);
- if (!$root_string_code) {
- //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},根节点用户:{$string_code_root_user_id}不存在"], "app_debug.log");
- return false;
- }
- $consume_amount = self::getStoreConsumeAmount($store_id, $user_id);
- // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},消费金额:{$consume_amount}"], "app_debug.log");
- if (bccomp($consume_amount, $setting['string_code_condition_value'], 4) == -1) {
- $msg = "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},消费:{$consume_amount} 未达到 {$setting['string_code_condition_value']} 元,加入串码节点失败";
- //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log");
- return false;
- }
- $parent_id = !$user['parent_id'] ? $root_string_code['user_id'] : $user['parent_id'];
- // 深度优先,从左至右
- list($real_parent_node, $layer_rank, $area_key) = self::getRealParentNodePlus($store_id, $user_id, $parent_id, $setting['string_code_max_layer'], $model_val, $string_code_shop_value);
- if (empty($real_parent_node->recommend_relation_node)) {
- $recommend_relation_node = ',' . $real_parent_node->user_id . ',';
- } else {
- $recommend_relation_node = $real_parent_node->recommend_relation_node . $real_parent_node->user_id . ',';
- }
- $parent_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- if (empty($parent_string_code->recommend_relation)) {
- $recommend_relation = ',' . $parent_string_code->user_id . ',';
- } else {
- $recommend_relation = $real_parent_node->recommend_relation . $parent_string_code->user_id . ',';
- }
- // 保存节点数据
- $user_string_code = new self();
- $user_string_code->store_id = $store_id;
- $user_string_code->user_id = $user_id;
- $user_string_code->parent_id = $parent_id;
- $user_string_code->parent_node = $real_parent_node->user_id;
- $user_string_code->recommend_relation_node = $recommend_relation_node;
- $user_string_code->layer_node = $real_parent_node->layer_node + 1;
- $user_string_code->recommend_relation = $recommend_relation;
- $user_string_code->layer = $parent_string_code->layer + 1;
- $user_string_code->area_key = $area_key;
- $user_string_code->layer_rank = $layer_rank;
- $user_string_code->saas_id = $saas_user_id;
- if (!$user_string_code->save()) {
- $errors = json_encode($user_string_code->getErrors());
- $msg = "加入节点 店铺:【{$store_id}】,用户:{$user_id},保存串码节点失败 {$errors}";
- //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log");
- return false;
- }
- // 所有上级节点 团队人数 + 1
- self::setTeamCountInc($store_id, $user_id);
- return true;
- }
- public static function joinNodeByAllianceModel($store_id, $saas_user_id, $setting, $model_val, $string_code_shop_value = 0)
- {
- $user_id = $saas_user_id;
- $user = SaasUser::findOne($saas_user_id);
- $model_name = self::MODEL_NAME_LIST[self::MODEL_ALLIANCE];
- $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_ALLIANCE);
- $user_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
- if ($user_string_code) {
- //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},用户:{$user_id}已加入串码节点"], "app_debug.log");
- return false;
- }
- $root_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]);
- if (!$root_string_code) {
- //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},用户:{$user_id}根节点不存在"], "app_debug.log");
- return false;
- }
- $consume_amount = self::getStoreConsumeAmount($store_id, $user_id);
- // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name}, 消费金额:{$consume_amount}"], "app_debug.log");
- if (bccomp($consume_amount, $setting['string_code_condition_value'], 4) == -1) {
- $msg = "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},消费:{$consume_amount}未达到{$setting['string_code_condition_value']}元,加入串码节点失败";
- //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log");
- return false;
- }
- $parent_id = !$user['parent_id'] ? $root_string_code['user_id'] : $user['parent_id'];
- // 深度优先,从左至右
- list($real_parent_node, $layer_rank, $area_key) = self::getRealParentNodePlus($store_id, $user_id, $parent_id, $setting['string_code_max_layer'], $model_val, $string_code_shop_value);
- if (empty($real_parent_node['recommend_relation_node'])) {
- $recommend_relation_node = ',' . $real_parent_node->user_id . ',';
- } else {
- $recommend_relation_node = $real_parent_node['recommend_relation_node'] . $real_parent_node->user_id . ',';
- }
- $parent_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- if (empty($parent_string_code['recommend_relation'])) {
- $recommend_relation = ',' . $parent_string_code->user_id . ',';
- } else {
- $recommend_relation = $real_parent_node['recommend_relation'] . $parent_string_code->user_id . ',';
- }
- // 保存节点数据
- $user_string_code = new self();
- $user_string_code->store_id = $store_id;
- $user_string_code->user_id = $user_id;
- $user_string_code->parent_id = $parent_id;
- $user_string_code->parent_node = $real_parent_node['user_id'];
- $user_string_code->recommend_relation_node = $recommend_relation_node;
- $user_string_code->layer_node = $real_parent_node['layer_node'] + 1;
- $user_string_code->recommend_relation = $recommend_relation;
- $user_string_code->layer = $parent_string_code['layer'] + 1;
- $user_string_code->area_key = $area_key;
- $user_string_code->layer_rank = $layer_rank;
- $user_string_code->saas_id = $saas_user_id;
- if (!$user_string_code->save()) {
- $errors = json_encode($user_string_code->getErrors());
- $msg = "加入节点 店铺:【{$store_id}】,用户:{$user_id},保存串码节点失败 {$errors}";
- //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log");
- return false;
- }
- // 所有上级节点 团队人数 + 1
- self::setTeamCountInc($store_id, $user_id);
- return true;
- }
- /**
- * 消费金额
- */
- public static function getStoreConsumeAmount($store_id, $user_id)
- {
- // 订单金额
- // $order_money = Order::find()->where(
- // [
- // 'is_delete' => 0,
- // 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- // ])
- // ->andWhere(['in', 'user_id', $user_ids])
- // ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])
- // ->sum('pay_price');
- // $scan_order_money = ScanOrder::find()->where(
- // [
- // 'is_delete' => 0,
- // 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- // 'is_pay' => 1
- // ])
- // ->andWhere(['in', 'user_id', $user_ids])
- // ->sum('pay_price');
- // $user = SaasUser::findOne(['id' => $saas_user_id]);
- // $order_total = bcadd($order_money, $scan_order_money, 4);
- // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$string_code_model}, 消费金额:{$order_total}"], "app_debug.log");
- // 联盟分
- $user_wallet = UserWallet::getCurrencyWallet($store_id, $user_id, Currency::CURRENCY_COIN);
- return $user_wallet['money_total'] ?: 0;
- }
- /**
- * 赠送贡献积分
- * @param $order
- * @param $is_scan
- * @return false|void
- */
- public static function giveCoin($order, $is_scan)
- {
- $store_id = $order->store_id;
- $order_id = $order->id;
- $user_id = $order->user_id;
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $check_res = self::checkSettingByStoreId($store_id, $setting);
- if (!$check_res) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log");
- return false;
- }
- list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']);
- if ($model_switch_shop) {
- if ($is_scan) {
- $order_pv = $order->pay_price;
- $money = bcmul($order_pv, $setting['string_code_scan_scale_0'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 当面付 联盟PV:【{$order_pv}】比例:【{$setting['string_code_scan_scale_0']}】"], "app_debug.log");
- } else {
- $order_pv_0 = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_0)',
- ])->scalar();
- $money = bcmul($order_pv_0, $setting['string_code_order_scale_0'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 商城单 联盟PV:【{$order_pv_0}】比例:【{$setting['string_code_order_scale_0']}】"], "app_debug.log");
- }
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 店铺:【{$store_id}】分值:【{$money}】"], "app_debug.log");
- $log_type = $is_scan ? UserWallet::TYPE_SCAN : UserWallet::TYPE_ORDER;
- $log_desc = self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . UserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 赠送店铺分";
- $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order";
- $currency = Currency::findOne(['code' => Currency::CURRENCY_COIN]);
- UserWallet::addLog($currency, $store_id, $user_id, $money, $log_desc, $log_type, $source_table, $order_id);
- }
- if ($model_switch_alliance) {
- $store_id = self::ALLIANCE_STORE_ID;
- if ($is_scan) {
- $order_pv = $order->pay_price;
- $money = bcmul($order_pv, $setting['string_code_scan_scale_1'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 当面付 联盟PV:【{$order_pv}】比例:【{$setting['string_code_scan_scale_1']}】"], "app_debug.log");
- } else {
- $order_pv_1 = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_1)',
- ])->scalar();
- $money = bcmul($order_pv_1, $setting['string_code_order_scale_1'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 商城单 联盟PV:【{$order_pv_1}】比例:【{$setting['string_code_order_scale_1']}】"], "app_debug.log");
- }
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 店铺:【{$store_id}】分值:【{$money}】"], "app_debug.log");
- $log_type = $is_scan ? UserWallet::TYPE_SCAN : UserWallet::TYPE_ORDER;
- $log_desc = self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . UserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 赠送联盟分";
- $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order";
- $currency = Currency::findOne(['code' => Currency::CURRENCY_COIN]);
- $saas_user_id = SaasUser::findSaasIdByUserId($order->user_id);
- UserWallet::addLog($currency, $store_id, $saas_user_id, $money, $log_desc, $log_type, $source_table, $order_id);
- }
- }
- /**
- * 门店让利额的用途,门店推荐人4%,合伙人分红6%,会员所属门店10%,用户推荐人20%,串码红包60%(20个点位各3%) 5%区县代理商,3%街道代理商
- * @param $is_scan
- * @return false
- */
- public static function transfer($order, $is_scan = 0)
- {
- //debug_log([__METHOD__, __LINE__, '串码让利 start'], "app_debug.log");
- if (!$order->is_pay) {
- return false;
- }
- $store_id = $order->store_id;
- $store = Store::findOne($store_id);
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $check_res = self::checkSettingByStoreId($store_id, $setting);
- if (!$check_res) {
- return false;
- }
- $t = \Yii::$app->db->beginTransaction();
- try {
- $is_scan = 0;
- if ($order instanceof ScanOrder) {
- $is_scan = 1;
- }
- self::transferByModel($order, $setting, $is_scan);
- $UserStringCodeOrderlist = UserStringCodeOrder::findAll([
- 'order_id' => $order->id,
- 'is_scan' => $is_scan,
- 'type' => [
- UserStringCodeOrder::TYPE_STORE_USER_REFERRER,
- UserStringCodeOrder::TYPE_STORE_USER_AFFILIATED,
- UserStringCodeOrder::TYPE_STORE_REFERRER,
- UserStringCodeOrder::TYPE_BRAND_USER_REFERRER,
- UserStringCodeOrder::TYPE_BRAND_USER_AFFILIATED,
- UserStringCodeOrder::TYPE_BRAND_REFERRER,
- UserStringCodeOrder::TYPE_BRAND_PROVINCE_AGENT
- ] // 用数组指定多个类型
- ]);
- if (count($UserStringCodeOrderlist) > 0) {
- $order->team_reward_status = 1;
- $order->save();
- }
- self::sendDistrictStreetAgentDivvy($order);
- $t->commit();
- } catch (\Exception $e) {
- $t->rollBack();
- //debug_log([__METHOD__, __LINE__, "串码让利 异常" . $e->getMessage()], "app_debug.log");
- }
- //debug_log([__METHOD__, __LINE__, '串码让利 end'], "app_debug.log");
- }
- public static function storeTransferByShopModel($order, $string_code_setting, $model_val)
- {
- $store_id = $order->store_id;
- if ($order instanceof ScanOrder) {
- $order_pv = $order->pay_price;
- } else {
- $order_pv = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_0)',
- ])->scalar();
- }
- $transfer_money = bcmul($order_pv, $string_code_setting['string_code_pv_scale_0'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】门店总待分账金额:{$transfer_money} 订单金额:{$order_pv} pv:{$string_code_setting['string_code_pv_scale_0']}"], "app_debug.log");
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_SALE_SETTING, self::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】店铺推荐人:{$setting['string_code_store_referrer']} 合伙人分红:{$setting['string_code_store_partner']} 会员所属门店:{$setting['string_code_store_user_affiliated']} 用户推荐人:{$setting['string_code_store_user_referrer']}"], "app_debug.log");
- if (isset($setting['string_code_store_referrer']) && $setting['string_code_store_referrer'] > 0) {
- $store_referral = SaasStoreReferral::findOne(['store_id' => $store_id]);
- $saas_id = $store_referral['referral_id'];
- $money = bcmul($transfer_money, $setting['string_code_store_referrer'] / 100, 4);
- $type = UserStringCodeOrder::TYPE_STORE_REFERRER;
- UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
- }
- //debug_log([__METHOD__, __LINE__, "---------------- 开始插入分红池 -------------------" . $setting['string_code_store_partner']], "app_debug.log");
- if (isset($setting['string_code_store_partner']) && $setting['string_code_store_partner'] > 0) {
- $money = bcmul($transfer_money, $setting['string_code_store_partner'] / 100, 4);
- if (bccomp($money, 0, 4) > 0) {
- //debug_log([__METHOD__, __LINE__, "---------------- 开始插入分红池 -------------------"], "app_debug.log");
- $desc = self::MODEL_NAME_LIST[$model_val] . " " . "订单号:【{$order->order_no}】合伙人分红增加";
- PartnerPool::poolPush($order, $money, $desc, $order_pv, $string_code_setting['string_code_pv_scale_0'], $setting['string_code_store_partner'], $model_val);
- } else {
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】门店总待分账金额:{$transfer_money},合伙人分账金额:{$money} 有误"], "app_debug.log");
- }
- }
- if (isset($setting['string_code_store_user_affiliated']) && $setting['string_code_store_user_affiliated'] > 0) {
- $first_store_id = SaasUser::findFirstStoreIdByUserId($order->user_id);
- $store_admin = Admin::findOne(['type' => 'store', 'type_id' => $first_store_id, 'is_delete' => 0]);
- $saas_id = $store_admin['saas_user_id'];
- $money = bcmul($transfer_money, $setting['string_code_store_user_affiliated'] / 100, 4);
- $type = UserStringCodeOrder::TYPE_STORE_USER_AFFILIATED;
- UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
- }
- if (isset($setting['string_code_store_user_referrer']) && $setting['string_code_store_user_referrer'] > 0) {
- $user = User::findOne($order->user_id);
- $saas_id = SaasUser::findSaasParentIdByUserId($user['id']);
- $money = bcmul($transfer_money, $setting['string_code_store_user_referrer'] / 100, 4);
- $type = UserStringCodeOrder::TYPE_STORE_USER_REFERRER;
- UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
- }
- }
- public static function transferByModel($order, $string_code_setting, $is_scan)
- {
- $store_id = $order->store_id;
- //$setting = Option::getShareSaleSetting(self::ALLIANCE_STORE_ID);
- $setting = Option::getShareSaleSetting($store_id);
- if ($order instanceof ScanOrder) {
- $order_pv = $order->pay_price+$order->take_price;
- if (isset($setting['string_code_store_partner']) && $setting['string_code_store_partner'] > 0) {
- //debug_log([__METHOD__, __LINE__, "门店合伙人分红比例 : " . ($string_code_setting['scan_qr_code_percent'])], "app_debug.log");
- self::stringCodeStorPartner($order, $order_pv, $string_code_setting['scan_qr_code_percent'], $setting['string_code_store_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 0);
- }
- self::unionUintFounder($order, $order_pv, $string_code_setting['scan_qr_code_percent'], $setting, $string_code_setting['string_code_model'],$store_id,$is_scan, 0);
- if (isset($setting['string_code_brand_partner']) && $setting['string_code_brand_partner'] > 0) {
- //debug_log([__METHOD__, __LINE__, "品牌合伙人分红比例 : " . ($string_code_setting['alliance_scan_qr_code_percent'])], "app_debug.log");
- self::stringCodeStorPartner($order, $order_pv, $string_code_setting['alliance_scan_qr_code_percent'], $setting['string_code_brand_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 1);
- }
- self::unionUintFounder($order, $order_pv, $string_code_setting['alliance_scan_qr_code_percent'], $setting, $string_code_setting['string_code_model'],$store_id,$is_scan, 1);
- } else {
- $order_pv = OrderDetail::find()->andWhere(['order_id' => $order['id'], 'is_delete' => 0])->select(['sum(pv_0)'])->scalar();
- self::stringCodeStorPartner($order, $order_pv, $string_code_setting['string_code_pv_scale_0'], $setting['string_code_brand_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 0);
- self::unionUintFounder($order, $order_pv, $string_code_setting['string_code_pv_scale_0'], $setting, $string_code_setting['string_code_model'],$store_id,$is_scan, 0);
- $order_pv = OrderDetail::find()->andWhere(['order_id' => $order['id'], 'is_delete' => 0])->select(['sum(pv_1)'])->scalar();
- self::stringCodeStorPartner($order, $order_pv, $string_code_setting['string_code_pv_scale_1'], $setting['string_code_brand_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 1);
- self::unionUintFounder($order, $order_pv, $string_code_setting['string_code_pv_scale_1'], $setting, $string_code_setting['string_code_model'],$store_id,$is_scan, 1);
- }
- //debug_log([__METHOD__, __LINE__, "串码让利 订单金额:{$order_pv} pv:{$string_code_setting['string_code_make_concessions_scan']}"], "app_debug.log");
- //debug_log([__METHOD__, __LINE__, "串码让利 店铺推荐人:{$setting['string_code_store_referrer']} 合伙人分红:{$setting['string_code_make_concessions_scan']} 会员所属门店:{$setting['string_code_store_user_affiliated']} 用户推荐人:{$setting['string_code_store_user_referrer']}"], "app_debug.log");
- }
- public static function stringCodeStorPartner($order, $order_pv, $scan_qr_code_percent, $rate, $setting, $is_scan, $string_code_model, $store_id, $model_val)
- {
- if (in_array($model_val, $string_code_model)) {
- ////debug_log([__METHOD__, __LINE__, "大模型比例 : " . ($scan_qr_code_percent / 100)], "app_debug.log");
- $add_money = bcmul($order_pv, $scan_qr_code_percent / 100, 4);
- $money = bcmul($add_money, $rate / 100, 4);
- ////debug_log([__METHOD__, __LINE__, "大模型:order_pv : " . $order_pv . ',$add_money:' . $add_money . ',$money:' . $money], "app_debug.log");
- if (bccomp($money, 0, 4) > 0) {
- $desc = self::MODEL_NAME_LIST[$model_val] . " " . "订单号:【{$order->order_no}】合伙人分红增加";
- PartnerPool::poolPush($order, $money, $desc, $order_pv, $rate, $scan_qr_code_percent, $model_val, $add_money);
- }
- }
- }
- public static function unionUintFounder($order, $order_pv, $scan_qr_code_percent, $setting, $string_code_model,$store_id,$is_scan, $model_val)
- {
- if (in_array($model_val, $string_code_model)) {
- //debug_log([__METHOD__, __LINE__, "大模型比例 : " . ($scan_qr_code_percent / 100) . ',Store_id:' . $order->store_id, ',order_id:' . $order->id], "app_debug.log");
- $add_money = bcmul($order_pv, $scan_qr_code_percent / 100, 4);
- $money = bcmul($add_money, $setting['string_code_alliance_merchant'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, "大模型:order_pv : " . $order_pv . ',$add_money:' . $add_money . ',$money:' . $money], "app_debug.log");
- $desc = self::MODEL_NAME_LIST[$model_val] . " " . "订单号:【{$order->order_no}】分红增加";
- if (bccomp($money, 0, 4) > 0) {
- StoreUnionPool::poolPush($order, $money, $desc, $order_pv, $setting['string_code_alliance_merchant'], $scan_qr_code_percent, $model_val, $add_money);
- }
- $money = bcmul($add_money, $setting['string_code_brand_cofounder'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, "大模型:order_pv : " . $order_pv . ',$add_money:' . $add_money . ',$money:' . $money], "app_debug.log");
- if (bccomp($money, 0, 4) > 0) {
- UnitFounderPool::poolPush($order, $money, $desc, $order_pv, $setting['string_code_brand_cofounder'], $scan_qr_code_percent, $model_val, $add_money);
- }
- if (bccomp($add_money, 0, 4) > 0) {
- self::hotAwardSend($setting['string_code_hot_district_agent'], $setting['string_code_ad_hot'], $setting['string_code_store_district_agent_divvy'], $add_money, $model_val, $order);
- self::adAwardSend($order->store_id, $add_money, $setting['string_code_ad_brand'], $setting['string_code_expansion_manager'], $model_val, $order,$setting['string_code_store_push_id']);
- self::areaAwardSend($order->store_id, $order, $add_money, $model_val, 1);//品牌区县代理
- self::areaAwardSend($order->store_id, $order, $add_money, $model_val, 2);//品牌市代理
- self::areaAwardSend($order->store_id, $order, $add_money, $model_val, 3);//品牌省代理
- self::stringCodeStoreReferrer($order, $setting, $store_id, $add_money, $model_val);
- self::stringCodeStoreUserAffiliated($order, $setting, $add_money, $model_val);
- self::stringCodeStoreUserReferrer($order, $setting, $add_money, $model_val);
- $store = Store::findOne($store_id);
- self::sendMakeConcessionsScan($order, $setting, $is_scan, $store, $model_val);
- }
- }
- }
- private static function areaAwardSend($store_id, $order, $order_pv, $model, $area_level)
- {
- if ($order_pv <= 0) return false;
- $setting = Option::getShareSaleSetting(OptionSetting::ALLIANCE_STORE_ID);
- $store = Store::find()->where(['id' => $store_id])->select(['salesman_id', 'district_id','city_id','province_id'])->asArray()->one();
- $salesman_id = $store['salesman_id'];
- //debug_log([__METHOD__, __LINE__, "============拓展经理:($salesman_id),,广告推流店铺id:" . $store_id], "app_debug.log");
- $salesman = Salesman::findOne(['id' => $salesman_id, 'is_delete' => 0, 'status' => 1]);
- $admin = Admin::findOne(['id' => $salesman->admin_id, 'is_delete' => 0]);
- $query = Admin::find()->select('saas_user_id')->where(['agent_id' => $salesman->admin_id,'is_enable'=>1,'is_delete'=>0]);
- switch ($area_level) {
- case 1:
- $area = $setting['string_code_brand_district_agent'];
- $type = UserStringCodeOrder::TYPE_BRAND_DISTRICT_AGENT;
- $d_query = clone $query;
- $agent_id = $d_query->andWhere(['district_id' => $store['district_id'], 'area_level' => 1])->scalar() ?: null;
- if ($agent_id) break;
- //debug_log([__METHOD__, __LINE__, "============没找到区县代理" ], "app_debug.log");
- case 2:
- if ($area_level == 2) {
- $type = UserStringCodeOrder::TYPE_BRAND_CITY_AGENT;
- $area = $setting['string_code_brand_city_agent'];
- }
- $c_query = clone $query;
- $agent_id = $c_query->andWhere(['city_id' => $store['city_id'], 'area_level' => 2])->scalar() ?: null;
- if ($agent_id) break;
- //debug_log([__METHOD__, __LINE__, "============没找到市代理" ], "app_debug.log");
- case 3:
- if ($area_level == 3) {
- $type = UserStringCodeOrder::TYPE_BRAND_PROVINCE_AGENT;
- $area = $setting['string_code_brand_province_agent'];
- }
- $p_query = clone $query;
- $agent_id = $p_query->andWhere(['province_id' => $store['province_id'], 'area_level' => 3])->scalar() ?: null;
- break;
- default:
- $area = 0;
- break;
- }
- if ($area && $salesman->admin_id) {
- $area_money = $order_pv * $area / 100;
- $agent_id = $agent_id ?:($admin->advert_push_user_id?:$setting['string_code_store_push_id']);
- //debug_log([__METHOD__, __LINE__, "============区县代理商:".$agent_id."金额 : " . ($area_money)], "app_debug.log");
- if ($agent_id){
- UserStringCodeOrder::transferAddUserWallet($order, $agent_id, $area_money, $type, $model);
- }
- }
- return true;
- }
- public static function stringCodeStoreReferrer($order, $setting, $store_id, $transfer_money, $model_val)
- {
- $referrer = 0;
- if ($order instanceof ScanOrder) {
- if (isset($setting['string_code_store_referrer']) && $setting['string_code_store_referrer'] > 0) {
- $referrer = $setting['string_code_store_referrer'];
- }
- } else {
- if (isset($setting['string_code_brand_referrer']) && $setting['string_code_brand_referrer'] > 0) {
- $referrer = $setting['string_code_brand_referrer'];
- }
- }
- if ($referrer > 0) {
- $store_referral = SaasStoreReferral::findOne(['store_id' => $store_id]);
- $saas_id = $store_referral['referral_id'];
- $money = bcmul($transfer_money, $referrer / 100, 4);
- $type = UserStringCodeOrder::TYPE_STORE_REFERRER;
- UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
- }
- }
- public static function stringCodeStoreUserAffiliated($order, $setting, $transfer_money, $model_val)
- {
- $affiliated = 0;
- if ($order instanceof ScanOrder) {
- if (isset($setting['string_code_store_user_affiliated']) && $setting['string_code_store_user_affiliated'] > 0) {
- $affiliated = $setting['string_code_store_user_affiliated'];
- }
- } else {
- if (isset($setting['string_code_brand_user_affiliated']) && $setting['string_code_brand_user_affiliated'] > 0) {
- $affiliated = $setting['string_code_brand_user_affiliated'];
- }
- }
- if ($affiliated > 0) {
- $first_store_id = SaasUser::findFirstStoreIdByUserId($order->user_id);
- $store_admin = Admin::findOne(['type' => 'store', 'type_id' => $first_store_id, 'is_delete' => 0]);
- $saas_id = $store_admin['saas_user_id'];
- $money = bcmul($transfer_money, $affiliated / 100, 4);
- $type = UserStringCodeOrder::TYPE_STORE_USER_AFFILIATED;
- UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
- }
- }
- public static function stringCodeStoreUserReferrer($order, $setting, $transfer_money, $model_val)
- {
- $referrer = 0;
- if ($order instanceof ScanOrder) {
- if (isset($setting['string_code_store_user_referrer']) && $setting['string_code_store_user_referrer'] > 0) {
- $referrer = $setting['string_code_store_user_referrer'];
- }
- } else {
- if (isset($setting['string_code_brand_user_referrer']) && $setting['string_code_brand_user_referrer'] > 0) {
- $referrer = $setting['string_code_brand_user_referrer'];
- }
- }
- if ($referrer > 0) {
- $user = User::findOne($order->user_id);
- if ($user->id > 0) {
- $saas_id = SaasUser::findSaasParentIdByUserId($order->user_id);
- $money = bcmul($transfer_money, $referrer / 100, 4);
- $type = UserStringCodeOrder::TYPE_STORE_USER_REFERRER;
- UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
- }
- }
- }
- public static function sendDistrictStreetAgentDivvy($order, $model_val = 1, $modelType = '街道代理商')
- {
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_SALE_SETTING, self::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】店铺推荐人:{$setting['string_code_store_referrer']} 合伙人分红:{$setting['string_code_store_partner']} 会员所属门店:{$setting['string_code_store_user_affiliated']} 用户推荐人:{$setting['string_code_store_user_referrer']}"], "app_debug.log");
- $transfer_money = 0;
- if ($order instanceof ScanOrder) {
- $transfer_money = UserStringCodePlus::countOrderPvBonus($order);
- }
- if ($transfer_money <= 0.01) {
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType}总待分账金额:{$transfer_money} 小于0.01不分账"], "app_debug.log");
- return;
- }
- /*if (isset($setting['string_code_store_district_agent_divvy']) && $setting['string_code_store_district_agent_divvy'] > 0) {
- $money = bcmul($transfer_money, $setting['string_code_store_district_agent_divvy'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType}总待分账金额:{$transfer_money} 门店区县代理商待分账金额:{$money}"], "app_debug.log");
- if ($money > 0) {
- self::getAgentSaasIdByOrder($order, UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY, $money, $model_val, $modelType);
- }
- }*/
- if (isset($setting['string_code_store_street_agent_divvy']) && $setting['string_code_store_street_agent_divvy'] > 0) {
- $money = bcmul($transfer_money, $setting['string_code_store_street_agent_divvy'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType}总待分账金额:{$transfer_money} 门店街道代理商待分账金额:{$money}"], "app_debug.log");
- if ($money > 0) {
- self::getAgentSaasIdByOrder($order, UserStringCodeOrder::TYPE_STRING_CODE_STORE_STREET_AGENT_DIVVY, $money, $model_val, $modelType);
- }
- }
- }
- public static function getModelSwitchBySettingArray($string_code_model_arr)
- {
- // 如果是字符串,自动转成数组
- if (!isset($string_code_model_arr) || !is_array($string_code_model_arr)) {
- $string_code_model_arr = is_string($string_code_model_arr)
- ? explode(',', $string_code_model_arr)
- : [];
- }
- $model_switch_shop = in_array(0, $string_code_model_arr) ? 1 : 0;
- $model_switch_alliance = in_array(1, $string_code_model_arr) ? 1 : 0;
- return [$model_switch_shop, $model_switch_alliance];
- }
- /**
- * 获取根结点用户ID
- * @param $store_id
- * @param $string_code_model
- * @return int
- */
- public static function getRootUserId($store_id, $string_code_model)
- {
- if ($string_code_model == self::MODEL_ALLIANCE) {
- $store_id = self::ALLIANCE_STORE_ID;
- }
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- return isset($setting['string_code_root_user_id']) && $setting['string_code_root_user_id'] ? (int)$setting['string_code_root_user_id'] : 0;
- }
- /**
- * 设置根结点用户ID
- * todo 根结点改为后台手选,废弃
- * @param $store_id
- * @param $string_code_model
- * @return int
- */
- public static function setRootUserId($store_id, $user_id)
- {
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $check_res = self::checkSettingByStoreId($store_id, $setting);
- if (!$check_res) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log");
- return false;
- }
- $first_order_user = Order::find()->where(
- [
- 'is_delete' => 0,
- 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- 'store_id' => $store_id
- ]
- )->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->orderBy('pay_time DESC')->select('user_id')->column();
- if ($first_order_user) {
- $setting['string_code_root_user_id'] = $first_order_user;
- $json = json_encode($setting);
- Option::set(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $json, $store_id, OptionSetting::SHARE_GROUP_NAME);
- return true;
- }
- $first_scan_order_user = ScanOrder::find()->where(
- [
- 'is_delete' => 0,
- 'trade_status' => Order::ORDER_FLOW_CONFIRM,
- 'store_id' => $store_id,
- 'is_pay' => 1
- ]
- )->select('user_id')->orderBy('pay_time DESC')->column();
- if ($first_scan_order_user) {
- $setting['string_code_root_user_id'] = $first_scan_order_user;
- $json = json_encode($setting);
- Option::set(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $json, $store_id, OptionSetting::SHARE_GROUP_NAME);
- return true;
- }
- return true;
- }
- /**
- * 发放串码红包
- * @param $order
- * @return bool
- */
- public static function sendRedPacket($order, $is_scan)
- {
- $order_id = $order->id;
- $store_id = $order->store_id;
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $check_res = self::checkSettingByStoreId($store_id, $setting);
- if (!$check_res) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log");
- return false;
- }
- $ids = UserStringCodeOrder::find()
- ->where(['order_id' => $order_id, 'status' => 0])
- ->andWhere(['in', 'type', [UserStringCodeOrder::TYPE_BRAND_RED_PACKET, UserStringCodeOrder::TYPE_STORE_RED_PACKET,
- UserStringCodeOrder::TYPE_BRAND_TEAM_PARTNER, UserStringCodeOrder::TYPE_STORE_TEAM_PARTNER]])
- ->select('id')
- ->column();
- if (!$ids) {
- //debug_log([__METHOD__, __LINE__, "串码红包发放 订单id:【{$order_id}】店铺:【{$store_id}】待发放订单为空"], "app_debug.log");
- return false;
- }
- foreach ($ids as $item_id) {
- $string_code_order = UserStringCodeOrder::findOne($item_id);
- $money = $string_code_order->money;
- $model_val = $string_code_order->model_val;
- if ($string_code_order->store_id == self::ALLIANCE_STORE_ID) {
- $to_user_id = $string_code_order->saas_id;
- } else {
- $to_user_id = $string_code_order->user_id;
- }
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[$model_val] . " " . "串码红包发放 记录:【{$item_id}】,店铺:【{$store_id}】用户:【{$to_user_id}】,红包金额:【{$money}】"], "app_debug.log");
- $log_type = $is_scan ? UserWallet::TYPE_SCAN : UserWallet::TYPE_ORDER;
- $log_desc = self::MODEL_NAME_LIST[$model_val] . " " . UserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 发放串码红包";
- $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order";
- $currency = Currency::findOne(['code' => Currency::CURRENCY_STRING_CODE]);
- UserWallet::addLog($currency, $string_code_order->store_id, $to_user_id, $money, $log_desc, $log_type, $source_table, $order_id,$string_code_order->store_id,$string_code_order->type);
- }
- UserStringCodeOrder::updateAll(
- ['status' => UserStringCodeOrder::STATUS_SUCCESS],
- [
- 'and',
- ['order_id' => $order_id, 'status' => 0],
- ['in', 'type', [UserStringCodeOrder::TYPE_BRAND_RED_PACKET, UserStringCodeOrder::TYPE_STORE_RED_PACKET,
- UserStringCodeOrder::TYPE_BRAND_TEAM_PARTNER, UserStringCodeOrder::TYPE_STORE_TEAM_PARTNER]]
- ]
- );
- return true;
- }
- /**
- * 指定用户上级所有节点团队人数 + 1
- * @param $store_id
- * @param $user_id
- * @return int
- */
- public static function setTeamCountInc($store_id, $user_id)
- {
- $parent_node_ids = self::getAllParentNodeIds($store_id, $user_id);
- if ($parent_node_ids) {
- return self::updateAll(
- ['team_num' => new Expression('team_num + 1')],
- ['in', 'user_id', $parent_node_ids]
- );
- } else {
- return 0;
- }
- }
- /**
- * 获取用户最后一个节点
- * 从上至下,从左至右
- * @param $store_id 店铺ID
- * @param $user_id 下单用户ID
- * @param $parent_id 下单用户上级ID
- * @param $max_layer 限制最大层数
- * @return array
- */
- public static function getRealParentNode($store_id, $order_user_id, $parent_id, $max_layer)
- {
- // 针对父节点对应的区
- $real_area_key = 0;
- // 针对根节点对应的排序
- $real_layer_rank = 0;
- $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- $children_list = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id]);
- // 未有子节点
- if (!$children_list) {
- //debug_log([__METHOD__, __LINE__, "未有子节点"], "app_debug.log");
- $real_parent_node = $parent_node;
- return [$real_parent_node, $real_area_key, $real_layer_rank];
- }
- // 先判断 最大层级下 第一列能否能占位
- $temp_parent_id = $parent_id;
- //debug_log([__METHOD__, __LINE__, "最大层数:{$max_layer}"], "app_debug.log");
- for ($i = 0; $i < $max_layer; $i++) {
- //debug_log([__METHOD__, __LINE__, "第1区循环:{$i},用户ID:{$temp_parent_id}"], "app_debug.log");
- $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $temp_parent_id, 'area_key' => $real_area_key]);
- if (!$temp_node) {
- $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $temp_parent_id]);
- return [$real_parent_node, $real_layer_rank, $real_area_key];
- } else {
- $temp_parent_id = $temp_node['user_id'];
- }
- }
- $queue = [];
- $queue[] = $parent_node;
- while (!empty($queue)) {
- // 当前节点
- $current_node = array_shift($queue);
- // 当前层数
- $current_layer = $current_node['layer_node'] - $parent_node['layer_node'];
- //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},当前层数:{$current_layer}"], "app_debug.log");
- // 判断用户第1区有无落点
- $parent_first_col_auth = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => 0]);
- if (!$parent_first_col_auth) {
- $real_area_key = 0;
- //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},1区没人,落第1区"], "app_debug.log");
- $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]);
- $current_layer_rank = self::find()
- ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1])
- ->max('layer_rank');
- $real_layer_rank = $current_layer_rank + 1;
- return [$real_parent_node, $real_layer_rank, $real_area_key];
- }
- // 判断用户能否开第2区
- $parent_second_col_auth = self::checkSecondColumnAuthPlus($store_id, $order_user_id, $current_node['user_id'], $max_layer);
- if ($parent_second_col_auth) {
- // 判断第2区第一个有无占位
- $real_area_key = 1;
- $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => $real_area_key]);
- if (!$temp_node) {
- //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},可开第2区,落第2区"], "app_debug.log");
- $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]);
- $current_layer_rank = self::find()
- ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1])
- ->max('layer_rank');
- $real_layer_rank = $current_layer_rank + 1;
- return [$real_parent_node, $real_layer_rank, $real_area_key];
- }
- }
- // 判断用户能否开第3区
- $parent_multi_col_auth = self::checkMultiColumnAuth($store_id, $current_node['user_id']);
- if ($parent_multi_col_auth) {
- // 判断第3区第一个有无占位
- $real_area_key = 2;
- $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => $real_area_key]);
- if (!$temp_node) {
- //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},可开第3区,落第3区"], "app_debug.log");
- $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]);
- $current_layer_rank = self::find()
- ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1])
- ->max('layer_rank');
- $real_layer_rank = $current_layer_rank + 1;
- return [$real_parent_node, $real_layer_rank, $real_area_key];
- }
- }
- // 查询当前节点的子节点(假设最多有3个子节点情况,根据实际parent_id关联查询)
- $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->orderBy("area_key ASC")->all();
- if ($children_nodes) {
- foreach ($children_nodes as $node) {
- $queue[] = $node;
- }
- }
- }
- }
- /**
- * 获取用户最后一个节点
- * 深度优先,从左至右 左子树满20层,右子树第一个节点满20层,再层次落点
- * @param $store_id 店铺ID
- * @param $user_id 下单用户ID
- * @param $parent_id 下单用户上级ID
- * @param $max_layer 限制最大层数
- * @param $model_val 0=单店,1=联盟
- * @return array
- */
- public static function getRealParentNodePlus($store_id, $order_user_id, $parent_id, $max_layer, $model_val, $string_code_shop_value = 0)
- {
- // 针对父节点对应的区
- $real_area_key = 0;
- // 针对根节点对应的排序
- $real_layer_rank = 0;
- // $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- // $children_list = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id]);
- $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- if (!$parent_node) { ///推荐人不在点位表中
- $tmepparent_node = $parent_node; //赋初始值
- $whereuser = SaasUser::findOne($parent_id); //找推荐人看一下
- $tempparent_id = $whereuser['parent_id'];
- $parent_id = $tempparent_id;
- while ($tempparent_id != 0 && !$tmepparent_node) {
- $tmepparent_node = self::findOne(['store_id' => $store_id, 'user_id' => $tempparent_id]);
- if (!$tmepparent_node) {
- $whereuser = SaasUser::findOne($tempparent_id);
- $tempparent_id = $whereuser['parent_id'];
- } else {
- $parent_node = $tmepparent_node;
- break;
- }
- //循环加入查找推荐人信息
- $parent_id = $tempparent_id;
- }
- }
- // 小杨新增
- if (!$parent_node) { ///推荐人不在点位表中
- if ($store_id < 0) { // $parent_id ==》 saas_id
- $tmepparent_node = $parent_node; //赋初始值
- $whereuser = SaasUser::findOne($parent_id); //找推荐人看一下
- $tempparent_id = $whereuser['parent_id'];
- $parent_id = $tempparent_id;
- while ($tempparent_id != 0 && !$tmepparent_node) {
- $tmepparent_node = self::findOne(['store_id' => $store_id, 'user_id' => $tempparent_id]);
- if (!$tmepparent_node) {
- $whereuser = SaasUser::findOne($tempparent_id);
- $tempparent_id = $whereuser['parent_id'];
- } else {
- $parent_node = $tmepparent_node;
- break;
- }
- //循环加入查找推荐人信息
- $parent_id = $tempparent_id;
- }
- } else {
- // $parent_id ==》 user_id
- $parentUser = User::findOne($parent_id);
- $parent_id = 0; //查不到节点 $parent_id 置为 0,重新查
- //userid的binding查询SaaSID,通过saasId查询下一级推荐关系
- if (!empty($parentUser) && !empty($parentUser['binding'])) {
- $saasUser = SaasUser::findOne(['mobile' => $parentUser['binding']]);
- if (!empty($saasUser) && !empty($saasUser['parent_id'])) {
- $parentSaasId = $saasUser['parent_id'];
- $parentSaasIdArr = []; //循环的saasId避免推荐人是自己导致死循环
- while (!empty($parentSaasId)) {
- //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,推荐人SaaSID:{$parentSaasId},已查过的推荐人SaaSID:" . json_encode($parentSaasIdArr, JSON_UNESCAPED_UNICODE)], "app_debug.log");
- if (in_array($parentSaasId, $parentSaasIdArr)) break;
- $parentSaasIdArr[] = $parentSaasId;
- $parentSaasUser = SaasUser::findOne($parentSaasId);
- if (!empty($parentSaasUser)) {
- $parentUser = User::findOne(['binding' => $parentSaasUser['mobile'], 'store_id' => $store_id]);
- if (!empty($parentUser)) {
- $childrenList = self::findOne(['store_id' => $store_id, 'parent_node' => $parentUser['id']]);
- if (!empty($childrenList)) {
- $parent_id = $parentUser['id'];
- //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,已查到节点用户推荐人SaaSID:【{$parentSaasId}】,UserID:【{$parentUser['id']}】"], "app_debug.log");
- break;
- } else {
- $parentSaasId = $parentSaasUser['parent_id'];
- }
- } else {
- $parentSaasId = $parentSaasUser['parent_id'];
- }
- }
- }
- }
- }
- //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,父节点:{$parent_id}"], "app_debug.log");
- //都查不到用string_code_root_user_id
- if (empty($parent_id)) {
- $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_SHOP);
- $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]);
- if (!$parent_node) {
- //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,根节点用户:{$string_code_root_user_id}不存在"], "app_debug.log");
- return [null, $real_area_key, $real_layer_rank];
- }
- $parent_id = $parent_node['user_id'];
- //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,根节点用户:{$parent_id}"], "app_debug.log");
- }
- }
- }
- //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,父节点:{$parent_id}"], "app_debug.log");
- $children_list = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id]);
- // 未有子节点
- if (!$children_list) {
- //debug_log([__METHOD__, __LINE__, "{$parent_id} 未有子节点"], "app_debug.log");
- $real_parent_node = $parent_node;
- return [$real_parent_node, $real_area_key, $real_layer_rank];
- }
- //debug_log([__METHOD__, __LINE__, "门店模型{$string_code_shop_value}"], "app_debug.log");
- // 默认品牌模型
- if ($string_code_shop_value == 0) {
- // 先判断 最大层级下 左区是否能占位
- $temp_parent_id = $parent_id;
- //debug_log([__METHOD__, __LINE__, "推荐人:{$parent_id},1-区:{$max_layer} 查找"], "app_debug.log");
- for ($i = 0; $i < $max_layer; $i++) {
- //debug_log([__METHOD__, __LINE__, "1-区 循环:{$i},用户ID:{$temp_parent_id}"], "app_debug.log");
- $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $temp_parent_id, 'area_key' => 0]);
- if (!$temp_node) {
- $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $temp_parent_id]);
- return [$real_parent_node, $real_layer_rank, $real_area_key];
- } else {
- $temp_parent_id = $temp_node['user_id'];
- }
- }
- // 再判断 最大层级下 右区是否能占位
- // 判断推荐人能否开第2区
- $parent_second_col_auth = self::checkSecondColumnAuth($store_id, $order_user_id, $parent_id);
- if ($parent_second_col_auth) {
- // 判断第2-区第一个有无占位
- //debug_log([__METHOD__, __LINE__, "推荐人:{$parent_id},2-区可开"], "app_debug.log");
- $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id, 'area_key' => 1]);
- if (!$temp_node) {
- $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- $current_layer_rank = self::find()
- ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1])
- ->max('layer_rank');
- $real_layer_rank = $current_layer_rank + 1;
- return [$real_parent_node, $real_layer_rank, 1];
- } else {
- // 先判断 最大层级下 右区是否能占位
- $temp_parent_id = $temp_node['user_id'];
- //debug_log([__METHOD__, __LINE__, "推荐人:{$parent_id},2-区:{$max_layer} 查找"], "app_debug.log");
- for ($i = 0; $i < $max_layer - 1; $i++) {
- //debug_log([__METHOD__, __LINE__, "2-区 循环:{$i},用户ID:{$temp_parent_id}"], "app_debug.log");
- $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $temp_parent_id, 'area_key' => 0]);
- if (!$temp_node) {
- $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $temp_parent_id]);
- return [$real_parent_node, $real_layer_rank, 0];
- } else {
- $temp_parent_id = $temp_node['user_id'];
- }
- }
- }
- } else {
- //debug_log([__METHOD__, __LINE__, "推荐人:{$parent_id},2-区不可开"], "app_debug.log");
- }
- $queue = [];
- $queue[] = $parent_node;
- $search_layer = 0; // 搜索层数
- while (!empty($queue)) {
- $n = count($queue);
- // 层序遍历
- for ($i = 0; $i < $n; $i++) {
- // 变量 i 无实际意义,只是为了循环 n 次
- // 当前节点
- $current_node = array_shift($queue);
- //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},搜索层数:{$search_layer}"], "app_debug.log");
- // 判断用户第1-区有无落点
- $parent_first_col_auth = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => 0]);
- if (!$parent_first_col_auth) {
- $real_area_key = 0;
- //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},1-区没人,落第1-区"], "app_debug.log");
- $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]);
- $current_layer_rank = self::find()
- ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1])
- ->max('layer_rank');
- $real_layer_rank = $current_layer_rank + 1;
- return [$real_parent_node, $real_layer_rank, $real_area_key];
- }
- // 大于最大限制层数
- // 查询当前节点的子节点
- $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->orderBy("area_key ASC")->all();
- if ($children_nodes) {
- foreach ($children_nodes as $node) {
- $queue[] = $node;
- }
- }
- $search_layer++;
- }
- }
- }
- // 门店模型
- if ($string_code_shop_value == 1) {
- // 直线推荐关系,逐级查找父节点直到满足条件
- $current_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- // 从父节点开始,逐级向上查找父节点直到满足条件
- while ($current_node) {
- //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']}"], "app_debug.log");
- // 判断左区是否可以占位
- $parent_first_col_auth = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => 0]);
- if (!$parent_first_col_auth) {
- $real_area_key = 0; // 1-区没人,落第1-区
- //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},1-区没人,落第1-区"], "app_debug.log");
- // 查找父节点并返回
- $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]);
- $current_layer_rank = self::find()
- ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1])
- ->max('layer_rank');
- $real_layer_rank = $current_layer_rank + 1;
- return [$real_parent_node, $real_layer_rank, $real_area_key]; // 返回左区的位置
- }
- // 如果左区占位,继续向上查找
- $current_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['parent_node']]);
- }
- }
- }
- /**
- * 获取用户最后一个节点
- * 深度优先,从左至右 落满左区成完全树
- * @param $store_id 店铺ID
- * @param $user_id 下单用户ID
- * @param $parent_id 下单用户上级ID
- * @param $max_layer 限制最大层数
- * @return array
- */
- public static function getRealParentNodeBack($store_id, $order_user_id, $parent_id, $max_layer)
- {
- // 针对父节点对应的区
- $real_area_key = 0;
- // 针对根节点对应的排序
- $real_layer_rank = 0;
- $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- $children_list = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id]);
- // 未有子节点
- if (!$children_list) {
- //debug_log([__METHOD__, __LINE__, "未有子节点"], "app_debug.log");
- $real_parent_node = $parent_node;
- return [$real_parent_node, $real_area_key, $real_layer_rank];
- }
- $queue = [];
- $queue[] = $parent_node;
- $search_layer = 0; // 搜索层数
- while (!empty($queue)) {
- $n = count($queue);
- // 层序遍历
- for ($i = 0; $i < $n; $i++) {
- // 变量 i 无实际意义,只是为了循环 n 次
- // 当前节点
- $current_node = array_shift($queue);
- //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},搜索层数:{$search_layer}"], "app_debug.log");
- if ($search_layer < $max_layer) {
- // 小于最大限制层级
- // 深度优先 $max_layer - $search_layer 控制遍历层次深度
- $res = self::findLastNode($store_id, $order_user_id, $current_node, $max_layer - $search_layer);
- if ($res) {
- return $res;
- }
- }
- // 大于最大限制层数
- // 查询当前节点的子节点
- $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->orderBy("area_key ASC")->all();
- if ($children_nodes) {
- foreach ($children_nodes as $node) {
- $queue[] = $node;
- }
- }
- $search_layer++;
- }
- }
- }
- /**
- * 算法查找最后落点
- * @param $store_id 店铺id
- * @param UserStringCodePlus $node 节点
- * @param $depth 查找深度
- * @param $remain_node
- * @return array
- */
- public static function findLastNode($store_id, $order_user_id, $node, $depth, $remain_node = [])
- {
- //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$node['user_id']},深度层数:{$depth}"], "app_debug.log");
- if ($depth < 0 && !$remain_node) {
- // 还有剩余节点,继续找
- $temp_node = array_shift($remain_node);
- $depth = $temp_node['layer_node'];
- return self::findLastNode($store_id, $order_user_id, $temp_node, $depth, $remain_node);
- }
- if ($depth < 0 && empty($remain_node)) {
- return null;
- }
- // 针对父节点对应的区
- $real_area_key = 0;
- // 针对根节点对应的排序
- $real_layer_rank = 0;
- // 左子树队列 不包括 根节点
- $left_queue = [];
- // 先左子数查满层
- $temp_parent_id = $node['user_id'];
- for ($i = 0; $i < $depth; $i++) {
- $temp_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'parent_node' => $temp_parent_id, 'area_key' => $real_area_key]);
- if (!$temp_node) {
- $real_parent_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'user_id' => $temp_parent_id]);
- //debug_log([__METHOD__, __LINE__, "A区深度查找:节点未占,落点:{$temp_parent_id},深度层数:{$depth},A区循环:{$i}"], "app_debug.log");
- return [$real_parent_node, $real_layer_rank, $real_area_key];
- } else {
- //debug_log([__METHOD__, __LINE__, "A区深度查找:节点被{$temp_node['user_id']}占点,深度层数:{$depth},A区循环:{$i}"], "app_debug.log");
- $temp_parent_id = $temp_node['user_id'];
- $left_queue[] = $temp_node;
- $remain_node[] = $temp_node;
- }
- }
- //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$node['user_id']},A区深度:{$depth} 找不到落点"], "app_debug.log");
- // 除了根结点,深度减 1
- $depth = $depth - 1;
- //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$node['user_id']},深度层数:{$depth}"], "app_debug.log");
- foreach ($left_queue as $index => $item_node) {
- // 判断用户能否开第2区
- $parent_second_col_auth = self::checkSecondColumnAuth($store_id, $order_user_id, $item_node['user_id']);
- if ($parent_second_col_auth) {
- // 判断第2区第一个有无占位
- //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$item_node['user_id']},B区可开"], "app_debug.log");
- $real_area_key = 1;
- $temp_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'parent_node' => $item_node['user_id'], 'area_key' => $real_area_key]);
- if (!$temp_node) {
- $real_parent_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'user_id' => $item_node['user_id']]);
- $current_layer_rank = UserStringCodePlus::find()
- ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1])
- ->max('layer_rank');
- $real_layer_rank = $current_layer_rank + 1;
- return [$real_parent_node, $real_layer_rank, $real_area_key];
- } else {
- return self::findLastNode($store_id, $order_user_id, $temp_node, $depth - $index - 1, $remain_node);
- }
- } else {
- //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$item_node['user_id']},B区不可开"], "app_debug.log");
- }
- }
- // A 区满,又不可开B区
- return null;
- }
- /**
- * 判断用户是否能开第 2 区
- * 条件 直推一个且已排位置 就可开通 2 区
- * @param $store_id
- * @param $user_id
- * @param $max_layer
- * @return bool
- */
- public static function checkSecondColumnAuth($store_id, $order_user_id, $user_id)
- {
- if ($store_id == self::ALLIANCE_STORE_ID) {
- $invite_user_ids = SaasUser::find()
- ->where(['parent_id' => $user_id])
- ->select('id')
- ->column();
- } else {
- $invite_user_ids = User::find()
- ->where(['store_id' => $store_id, 'parent_id' => $user_id])
- ->column();
- }
- $node = self::find()
- ->where(['store_id' => $store_id])
- ->andWhere(['in', 'user_id', $invite_user_ids])
- ->select('id')
- ->one();
- if ($node) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * 深度优先搜索
- * @param $node
- * @return mixed
- */
- public static function findLastNodeDFS($node, $depth, $current_depth = 0)
- {
- // 达到指定深度,退出
- if ($current_depth + 1 >= $depth) {
- return null;
- }
- $last_node = $node;
- $children_nodes = self::find()->where(['store_id' => $last_node['store_id'], 'parent_node' => $last_node['user_id']])->orderBy("area_key ASC")->all();
- // 判断右子树是否有
- // 递归处理所有子树
- foreach ($children_nodes as $children_node) {
- $temp = self::findLastNodeDFS($children_node, $depth, $current_depth + 1);
- if ($temp) {
- $last_node = $temp;
- }
- }
- return $last_node;
- }
- /**
- * 获取用户最后一个节点
- * 从上至下,从左至右
- * @param $store_id 店铺ID
- * @param $parent_id 上级ID
- * @return array
- */
- public static function findLastNodeBFS($store_id, $parent_id)
- {
- $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- $queue = [];
- $queue[] = $parent_node;
- $search_layer = 0; // 搜索层数
- while (!empty($queue)) {
- $n = count($queue);
- // 层序遍历
- for ($i = 0; $i < $n; $i++) {
- // 变量 i 无实际意义,只是为了循环 n 次
- // 当前节点
- $current_node = array_shift($queue);
- // //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},搜索层数:{$search_layer}"], "app_debug.log");
- echo "搜索层数:{$search_layer}:{$current_node['user_id']} \n";
- // 大于最大限制层数
- // 查询当前节点的子节点
- $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->orderBy("area_key ASC")->all();
- if ($children_nodes) {
- foreach ($children_nodes as $node) {
- $queue[] = $node;
- }
- }
- $search_layer++;
- }
- }
- }
- public static function getAllParentIds($user_id)
- {
- $relation = self::findOne(['user_id' => $user_id]);
- $recommon_relation = trim($relation['recommend_relation'], ',');
- if (!$recommon_relation) return [];
- return explode(',', $recommon_relation);
- }
- /**
- * 获取所有上级节点 user_ids
- * @param $store_id
- * @param $user_id
- * @return array|false|string[]
- */
- public static function getAllParentNodeIds($store_id, $user_id)
- {
- $relation = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
- $recommon_relation_node = trim($relation['recommend_relation_node'], ',');
- if (!$recommon_relation_node) return [];
- return explode(',', $recommon_relation_node);
- }
- public static function getAllParentNodeIdsAll($store_id, $user_id,$is_scan=0)
- {
- if($is_scan == 0){
- $users = \Yii::$app->db->createCommand("
- SELECT *
- FROM cyy_user
- WHERE id = :id
- ", [
- ':id' => $user_id
- ])->queryOne();
- $saas_user = \Yii::$app->db->createCommand("
- SELECT *
- FROM cyy_saas_user
- WHERE mobile = :mobile
- ", [
- ':mobile' => $users['binding']
- ])->queryOne();
- if($store_id == -1){
- $saas_user = \Yii::$app->db->createCommand("
- SELECT *
- FROM cyy_saas_user
- WHERE id = :id
- ", [
- ':id' => $user_id
- ])->queryOne();
- }
- $ranking_user = \Yii::$app->db->createCommand("
- SELECT *
- FROM ysdl_ranking_user
- WHERE store_id = :storeId
- AND saas_user_id = :saasUserId
- ", [
- ':storeId' => $store_id,
- ':saasUserId' => $saas_user['id']
- ])->queryOne();
- if ($ranking_user) {
- $ranking_user_list = str_replace(['[', ']'], '', $ranking_user['tree_saas_path']);
- if (!empty($ranking_user_list)) {
- $ranking_user_list_array = explode(',', $ranking_user_list);
- } else {
- $ranking_user_list_array = [];
- }
- $ranking_user_list_array [] = SaasUser::findSaasIdByUserId($user_id);;
- $new_ranking_user_list = [];
- if (!empty($ranking_user_list_array)) {
- foreach ($ranking_user_list_array as $key => &$val) {
- $rank_info = \Yii::$app->db->createCommand("
- SELECT node_valid
- FROM ysdl_ranking_user
- WHERE store_id = :storeId
- AND saas_user_id = :saasUserId
- ", [
- ':storeId' => $store_id,
- ':saasUserId' => $val
- ])->queryOne();
- if ($rank_info['node_valid'] == 1) {
- $mobile = \Yii::$app->db->createCommand("
- SELECT mobile
- FROM cyy_saas_user
- WHERE id = :userId
- ", [
- ':userId' => $val
- ])->queryScalar();
- $new_ranking_user_list[] = \Yii::$app->db->createCommand("
- SELECT id
- FROM cyy_user
- WHERE binding = :binding
- AND store_id = :storeId
- LIMIT 1
- ", [
- ':binding' => $mobile,
- ':storeId' => $store_id
- ])->queryScalar();
- } else {
- unset($ranking_user_list_array[$key]);
- }
- }
- }
- if ($store_id == -1) {
- return $ranking_user_list_array;
- } else {
- return $new_ranking_user_list;
- }
- } else {
- if ($store_id == -1) {
- return [SaasUser::findSaasIdByUserId($user_id)];
- } else {
- return [$user_id];
- }
- }
- } else {
- sleep(1);
- $relation = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
- if ($relation) {
- $recommon_relation_node = trim($relation['recommend_relation_node'], ',');
- $recommon_relation_node =$recommon_relation_node.",".$user_id;
- if (!$recommon_relation_node) return [-1];
- return explode(',', $recommon_relation_node);
- } else {
- return [$user_id];
- }
- $recommon_relation_node = trim($relation['recommend_relation_node'], ',');
- $recommon_relation_node =$recommon_relation_node.",".$user_id;
- if (!$recommon_relation_node) return [$user_id];
- return explode(',', $recommon_relation_node);
- }
- /*$relation = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
- if ($relation) {
- $recommon_relation_node = trim($relation['recommend_relation_node'], ',');
- if (!$recommon_relation_node) return [-1];
- return explode(',', $recommon_relation_node);
- } else {
- return [];
- }*/
- }
- public static function getChildNodeIdsByUserId($user_id, $area_key = '', $level = 0, $scope = 'all')
- {
- $user_node = self::find()->select(['layer_node'])->where(['user_id' => $user_id])->asArray()->one();
- $layer_node = (int)$user_node['layer_node'];
- $query = self::find()->select(['user_id'])->where(['like', 'recommend_relation_node', (',' . $user_id . ',')]);
- if ($area_key) $query->andWhere(['area_key' => $area_key]);
- //查询多N代全部子用户
- if ($level > 0 && $scope == 'all') $query->andWhere(['>=', 'layer_node', $level + $layer_node]);
- //查询指定代子用户
- if ($level > 0 && $scope == 'equal') $query->andWhere(['=', 'layer_node', $level + $layer_node]);
- return $query->asArray()->column();
- }
- /**
- * 查询用户指定部门的所有用户
- * @param $user_id
- * @param $node_key
- * @return array
- */
- public static function getChildNodeIdsByNodeKey($user_id, $department_key)
- {
- // if ($department_key) {
- // // 其他 部门
- // $first_node = self::find()->select(['user_id'])
- // ->where(['parent_id' => $user_id, 'node_key' => $department_key])
- // ->asArray()
- // ->one();
- // if (!$first_node) return [];
- // $res = self::find()->select(['user_id'])
- // ->where(['or', ['user_id' => $first_node['user_id']], ['like', 'recommend_relation_node', (',' . $first_node['user_id'] . ',')]])
- // ->asArray()->column();
- // } else {
- // // A 部门
- // $res = self::find()->select(['user_id'])
- // ->where(['like', 'recommend_relation_node', (',' . $user_id . ',')])
- // ->asArray()->column();
- // }
- $res = UserNodeDepartment::find()->select(['child_id'])
- ->where(['user_id' => $user_id, 'department_key' => $department_key])
- ->asArray()->column();
- return $res;
- }
- public static function getAllParentList($user_id)
- {
- $relation = self::findOne(['user_id' => $user_id]);
- $recommon_relation = trim($relation['recommend_relation'], ',');
- $relation_arr = explode(',', $recommon_relation);
- if (empty($relation_arr)) {
- return [];
- }
- $list = Share::find()->alias('s')->where(array('in', 's.user_id', $relation_arr))
- ->andWhere(['sl.is_delete' => 0])
- ->leftJoin(['sl' => ShareLevel::tableName()], 'sl.level=s.level')
- ->select('s.user_id, sl.order_layer, sl.point_reward')
- ->asArray()
- ->all();
- if (empty($list)) {
- return [];
- }
- $level_list = ArrayHelper::index($list, "user_id");
- $res = [];
- foreach ($relation_arr as $v) {
- $temp = [];
- $temp['user_id'] = $v;
- $temp['order_layer'] = $level_list[$v]['order_layer'] ?? 0;
- $temp['point_reward'] = $level_list[$v]['point_reward'] ?? 0;
- $temp['is_bonus'] = isset($level_list[$v]);
- $res[] = $temp;
- }
- return $res;
- }
- public static function getAllParentNodeList($user_id)
- {
- $relation = self::findOne(['user_id' => $user_id]);
- $recommon_relation_node = trim($relation['recommend_relation_node'], ',');
- $relation_arr = explode(',', $recommon_relation_node);
- if (empty($relation_arr)) {
- return [];
- }
- $list = Share::find()->alias('s')->where(array('in', 's.user_id', $relation_arr))
- ->andWhere(['sl.is_delete' => 0])
- ->leftJoin(['sl' => ShareLevel::tableName()], 'sl.level=s.level')
- ->select('s.user_id, sl.order_layer, sl.point_reward')
- ->asArray()
- ->all();
- if (empty($list)) {
- return [];
- }
- $level_list = ArrayHelper::index($list, "user_id");
- $res = [];
- foreach ($relation_arr as $v) {
- $temp = [];
- $temp['user_id'] = $v;
- $temp['order_layer'] = $level_list[$v]['order_layer'] ?? 0;
- $temp['point_reward'] = $level_list[$v]['point_reward'] ?? 0;
- $temp['is_bonus'] = isset($level_list[$v]);
- $res[] = $temp;
- }
- return $res;
- }
- public static function getRecommendRelationByUserId($user_id)
- {
- $res = "";
- $parentList = [];
- self::getParentList($user_id, $parentList);
- if ($parentList) {
- $res = "," . implode(',', array_reverse($parentList)) . ",";
- }
- return $res;
- }
- public static function getParentList($user_id, &$parentList)
- {
- $user = User::findOne(['id' => $user_id]);
- if ($user['parent_id']) {
- $parentList[] = $user['parent_id'];
- $parent = User::findOne(['id' => $user['parent_id']]);
- if ($parent) {
- return self::getParentList($parent['id'], $parentList);
- }
- }
- return $parentList;
- }
- public static function getLayerByUserId($user_id)
- {
- $res = 1;
- $parentList = [];
- self::getParentList($user_id, $parentList);
- if ($parentList) {
- $res += count($parentList);
- }
- return $res;
- }
- public static function createRootNode($store_id, $user_id)
- {
- $root_node = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
- if (!$root_node) {
- $saas_user_id = SaasUser::findSaasIdByUserId($user_id);
- $root_node = new UserStringCodePlus();
- $root_node->store_id = $store_id;
- $root_node->user_id = $user_id;
- $root_node->area_key = 0;
- $root_node->recommend_relation = "";
- $root_node->recommend_relation_node = "";
- $root_node->saas_id = $saas_user_id;
- if (!$root_node->save()) {
- //debug_log([__METHOD__, __LINE__, "用户:{$user_id},节点信息保存失败"], "app_debug.log");
- }
- }
- return $root_node;
- }
- public static function createUserNode($store_id, $user_id)
- {
- $user_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
- if (!$user_node) {
- $user = User::findOne(['id' => $user_id]);
- $saas_user_id = SaasUser::findSaasIdByUserId($user_id);
- $user_node = new UserStringCodePlus();
- $user_node->store_id = $store_id;
- $user_node->user_id = $user_id;
- $user_node->parent_id = $user['parent_id'];
- $user_node->recommend_relation = self::getRecommendRelationByUserId($user_id);
- $user_node->layer = self::getLayerByUserId($user_id);
- $user_node->recommend_relation_node = "";
- $user_node->layer_node = 0;
- $user_node->created_at = time();
- $user_node->saas_id = $saas_user_id;
- if (!$user_node->save()) {
- //debug_log([__METHOD__, __LINE__, "用户:{$user_id},节点信息保存失败"], "app_debug.log");
- }
- }
- return $user_node;
- }
- public static function getChildNodeCount($store_id, $user_id)
- {
- $node_count = self::find()->select('COUNT(id) as node_count')
- ->where(['store_id' => $store_id])
- ->andWhere(['like', 'recommend_relation_node', (',' . $user_id . ',')])->scalar();
- return (int)$node_count;
- }
- public static function getChildNodeCountNew($store_id, $user_id)
- {
- $storeStringCodeSet = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $storeStringCodeSet = json_decode($storeStringCodeSet['value'], true);
- $string_code_max_layer = $storeStringCodeSet['string_code_max_layer'];
- $max_level = $string_code_max_layer; // 限制最大层级为 20
- $node_count = 0;
- $queue = [];
- // 获取根节点
- $root_node = self::findOne(['store_id' => $store_id, 'parent_node' => $user_id]);
- if (!$root_node) {
- return 0; // 如果没有找到根节点,则返回 0
- }
- // 初始化队列,存储每个节点及其层级
- $queue[] = ['node' => $root_node, 'level' => 0]; // 初始层级为 0
- while (!empty($queue)) {
- $current_item = array_shift($queue); // 获取队列中的第一个节点
- $current_node = $current_item['node'];
- $current_level = $current_item['level'];
- // 如果当前层级大于最大层级,则停止继续查找子节点
- if ($current_level >= $max_level) {
- continue;
- }
- // 查找当前节点的子节点
- $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->all();
- if ($children_nodes) {
- foreach ($children_nodes as $node) {
- // 将子节点及其层级加入队列
- $queue[] = ['node' => $node, 'level' => $current_level + 1];
- }
- }
- // 计数当前节点
- $node_count++;
- }
- return $node_count;
- }
- public static function getTeamNodeOrderPrice($store_id, $user_id)
- {
- $child_ids = self::getChildNodeIdsByUserId($store_id, $user_id);
- $team_ids = array_merge($child_ids, [$user_id]);
- $res = UserWallet::find()
- ->where(['store_id' => $store_id, 'currency_code' => Currency::CURRENCY_COIN])
- ->andWhere(['in', 'user_id', $team_ids])
- ->select('SUM(`money_total`) as node_order_price')
- ->scalar();
- return round($res, 4);
- }
- /**
- * 获取用户部门列表
- * @param $user_id
- * @return array
- */
- public static function getUserDepartmentList($store_id, $user_id)
- {
- $user = User::findOne(['id' => $user_id]);
- $user_share_holder_level = ShareHolder::findOne(['user_id' => $user_id]);
- if ($user['total_coin'] < 50) {
- // 未消费大礼包只有A部门
- $department_key_highest = 0;
- } else {
- // 有消费则有A,B等多部门
- if ($user_share_holder_level['level_id'] < 9) {
- // 股东等级小于V7只有A,B两条线
- $department_key_highest = 1;
- } else {
- // 大于等于V7可开多线
- $department_key_highest = self::getLastNodeKeyByUserId($user_id) + 1;
- }
- }
- $res = [];
- for ($department_key = 0; $department_key <= $department_key_highest; $department_key++) {
- $last_user_id = self::getLastUserByDepartmentKey($user_id, $department_key);
- $last_user = User::findOne(['id' => $last_user_id]);
- $department_name = $department_key + 1;
- $temp = [];
- $temp['id'] = $department_key;
- $temp['department_key'] = $department_key;
- $temp['user_id'] = $last_user_id;
- $temp['department_name'] = "{$department_name}-部门";
- $temp['nickname'] = $last_user['nickname'];
- $temp['mobile'] = $last_user['binding'];
- $res[] = $temp;
- }
- return $res;
- }
- /**
- * 获取指定用户最高部门 node_key
- * @param $user_id
- * @return int|mixed
- */
- public static function getLastNodeKeyByUserId($user_id)
- {
- $last_node_key = 0;
- $node_list = UserStringCodePlus::find()
- ->where(['parent_id' => $user_id])
- ->orderBy('node_key DESC')
- ->asArray()
- ->one();
- if ($node_list) {
- $last_node_key = $node_list['node_key'];
- }
- return $last_node_key;
- }
- /**
- * 获取指定用户的部门最后一个用户
- * @param $user_id
- * @param $department_name
- * @return int
- */
- public static function getLastUserByDepartmentKey($user_id, $department_key)
- {
- // $first_node = self::find()->select(['user_id'])
- // ->where(['parent_id' => $user_id, 'node_key' => $department_key])
- // ->asArray()
- // ->one();
- // if (!$first_node) return (int)$user_id;
- //
- // $last_user_node = UserNode::find()
- // ->where(['or', ['user_id' => $first_node['user_id']], ['like', 'recommend_relation_node', (',' . $first_node['user_id'] . ',')]])
- // ->orderBy('layer_node DESC')
- // ->asArray()
- // ->one();
- //
- // if ($last_user_node) {
- // return (int)$last_user_node['user_id'];
- // } else {
- // return (int)$user_id;
- // }
- $last = UserNodeDepartment::find()
- ->where(['user_id' => $user_id, 'department_key' => $department_key])
- ->orderBy('id DESC')
- ->asArray()
- ->one();
- return $last['user_id'];
- }
- public static function getLastParentNodeLeader($user_id)
- {
- $user_node = self::findOne(['user_id' => $user_id]);
- if ($user_node->parent_id == $user_node->parent_node) {
- return self::findOne(['user_id' => $user_node->parent_id]);
- } else {
- return self::getLastParentNodeLeader($user_node->parent_node);
- }
- }
- /**
- * 查询用户指定部门的所有用户 ids
- * @param $user_id
- * @param $node_key
- * @return array
- */
- public static function getChildNodeIdsByAreaKey($store_id, $user_id, $area_key)
- {
- $child_ids = [];
- $queue = [];
- $root_node = self::findOne(['store_id' => $store_id, 'parent_node' => $user_id, 'area_key' => $area_key]);
- $queue[] = $root_node;
- while (!empty($queue)) {
- $current_node = array_shift($queue);
- $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->all();
- if ($children_nodes) {
- foreach ($children_nodes as $node) {
- $queue[] = $node;
- }
- }
- $child_ids[] = $current_node['user_id'];
- }
- return $child_ids;
- }
- public static function getChildNodeIdsByAreaKeyToMaxLayer($store_id, $user_id, $area_key)
- {
- $child_ids = [];
- $queue = [];
- $root_node = self::findOne(['store_id' => $store_id, 'parent_node' => $user_id, 'area_key' => $area_key]);
- // 初始化队列并设置层级
- $queue[] = ['node' => $root_node, 'level' => 0]; // 添加节点和层级(初始为0)
- $storeStringCodeSet = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $storeStringCodeSet = json_decode($storeStringCodeSet['value'], true);
- $string_code_max_layer = $storeStringCodeSet['string_code_max_layer'];
- $temparr = [];
- while (!empty($queue)) {
- // 从队列中取出当前节点和层级
- $current_item = array_shift($queue);
- $current_node = $current_item['node'];
- $current_level = $current_item['level'];
- // 限制层级最大为 20 层
- // if ($current_level >= 20) {
- if ($current_level >= $string_code_max_layer) {
- continue; // 超过 20 层,不继续查询子节点
- }
- $tempupuser = $current_node['user_id'];
- // 查询当前节点的子节点
- $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->all();
- // 将子节点添加到队列,并增加层级
- if ($children_nodes) {
- foreach ($children_nodes as $node) {
- $queue[] = ['node' => $node, 'level' => $current_level + 1];
- }
- $tempuser = $children_nodes;
- }
- $temparr[] = ['level' => $current_level, 'user_id' => $tempupuser, 'parent_node' => $tempuser];
- // 记录当前节点的 user_id
- $child_ids[] = $current_node['user_id'];
- }
- return [
- 'nodelist' => $temparr,
- 'child_ids' => $child_ids
- ];
- }
- public static function addOrderPvIntegralBonus($order)
- {
- //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利-------- start --------'], "model_pv_integral_bonus_debug.log");
- //debug_log([__METHOD__, __LINE__, json_encode($order, JSON_UNESCAPED_UNICODE)], "model_pv_integral_bonus_debug.log");
- $store_id = $order->store_id;
- $store = Store::findOne($store_id);
- try {
- //获取结算商户信息
- $merchants = ScanCodePayOrderPercent::find()->where(['order_no' => $order->order_no, 'is_type' => 1])->asArray()->all();
- if (!empty($merchants)) {
- foreach ($merchants as $merchant) {
- //店铺汇付配置支付则记录结算信息
- if ($merchant['pay_price'] <= 0) {
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . "串码订单商户支付金额:" . $merchant['pay_price'] . " 0元"], "model_pv_integral_bonus_debug.log");
- continue;
- }
- $subMoney = Store::subStoreMoney($store, $merchant['pay_price'], "扣{$merchant['desc']}奖励", $order->id, $order->user_id);
- if (!$subMoney) {
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . "扣{$merchant['desc']}奖励:" . $merchant['pay_price'] . " 失败"], "model_pv_integral_bonus_debug.log");
- return false;
- }
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . "扣{$merchant['desc']}奖励:" . $merchant['pay_price'] . " 成功"], "model_pv_integral_bonus_debug.log");
- }
- return true;
- }
- //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利:未获取结算商户信息----失败---- end --------'], "model_pv_integral_bonus_debug.log");
- return false;
- } catch (\Exception $e) {
- //debug_log([__METHOD__, __LINE__, $order->order_no . "串码订单店铺让利失败:" . $e->getMessage() . ':' . $e->getLine() . ':' . $e->getFile() . '---- end --------'], "model_pv_integral_bonus_debug.log");
- return false;
- }
- }
- public static function addOrderPvIntegralBonus_back($order)
- {
- //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利-------- start --------'], "model_pv_integral_bonus_debug.log");
- //debug_log([__METHOD__, __LINE__, json_encode($order, JSON_UNESCAPED_UNICODE)], "model_pv_integral_bonus_debug.log");
- $store_id = $order->store_id;
- $store = Store::findOne($store_id);
- if (!in_array($store->store_type, [Store::TYPE_STORE, Store::TYPE_BRAND])) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】类型即不是门店也不是品牌,不进行让利"], "model_pv_integral_bonus_debug.log");
- return false;
- }
- //串码红包设置
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $check_res = self::checkSettingByStoreId($store_id, $setting);
- if (!$check_res) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "model_pv_integral_bonus_debug.log");
- return false;
- }
- $t = \Yii::$app->db->beginTransaction();
- try {
- list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']);
- //大模型
- $bigModelMoney = 0;
- $oldBigModelMoney = $order->big_model_pv_bonus;
- if ($model_switch_alliance) {
- if ($order instanceof ScanOrder) {
- $order_pv = $order->pay_price;
- $order->big_model_pv_integral = bcmul($order_pv, $setting['string_code_scan_scale_1'] / 100, 8);
- //debug_log([__METHOD__, __LINE__, $order->order_no . "大模型扫描订单PV:" . $order_pv . " 大模型pv积分:" . $order->big_model_pv_integral], "model_pv_integral_bonus_debug.log");
- } else {
- $order_pv = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_1)',
- ])->scalar();
- $order->big_model_pv_integral = bcmul($order_pv, $setting['string_code_order_scale_1'] / 100, 8);
- //debug_log([__METHOD__, __LINE__, $order->order_no . "大模型商城订单PV:" . $order_pv . " 大模型pv积分:" . $order->big_model_pv_integral], "model_pv_integral_bonus_debug.log");
- }
- $bigModelMoney = bcmul($order_pv, $setting['string_code_pv_scale_1'] / 100, 8);
- $order->big_model_pv_bonus = $bigModelMoney;
- //debug_log([__METHOD__, __LINE__, $order->order_no . "大模型商城订单PV:" . $order_pv . " 大模型pv奖励:" . $bigModelMoney], "model_pv_integral_bonus_debug.log");
- }
- //小模型
- $smallModelMoney = 0;
- $oldSmallModelMoney = $order->small_model_pv_bonus;
- if ($model_switch_shop) {
- if ($order instanceof ScanOrder) {
- $order_pv = $order->pay_price;
- $order->small_model_pv_integral = bcmul($order_pv, $setting['string_code_scan_scale_0'] / 100, 8);
- //debug_log([__METHOD__, __LINE__, $order->order_no . "小模型扫描订单PV:" . $order_pv . " 小模型pv积分:" . $order->small_model_pv_integral], "model_pv_integral_bonus_debug.log");
- } else {
- $order_pv = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_0)',
- ])->scalar();
- $order->small_model_pv_integral = bcmul($order_pv, $setting['string_code_order_scale_0'] / 100, 8);
- //debug_log([__METHOD__, __LINE__, $order->order_no . "小模型商城订单PV:" . $order_pv . " 小模型pv积分:" . $order->small_model_pv_integral], "model_pv_integral_bonus_debug.log");
- }
- $smallModelMoney = bcmul($order_pv, $setting['string_code_pv_scale_0'] / 100, 8);
- $order->small_model_pv_bonus = $smallModelMoney;
- //debug_log([__METHOD__, __LINE__, $order->order_no . "小模型商城订单PV:" . $order_pv . " 小模型pv奖励:" . $smallModelMoney], "model_pv_integral_bonus_debug.log");
- }
- if ($order->save()) {
- // //汇付支付账号是否平台账号
- // if (is_use_platform_mch_huifu_id($order->huifu_id)) {
- // //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利---使用平台账号支付,汇付ID:' . $order->huifu_id], "model_pv_integral_bonus_debug.log");
- // //小模型
- // if ($oldSmallModelMoney == 0 && $smallModelMoney != 0) {
- // $subMoney = Store::subStoreMoney($store, $smallModelMoney, '扣小模型PV奖励', $order->id, $order->user_id);
- // if (!$subMoney) {
- // $t->rollBack();
- // //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log");
- // return false;
- // }
- // //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log");
- // }
- // //大模型
- // if ($oldBigModelMoney == 0 && $bigModelMoney != 0) {
- // $subMoney = Store::subStoreMoney($store, $bigModelMoney, '扣大模型PV奖励', $order->id, $order->user_id);
- // if (!$subMoney) {
- // $t->rollBack();
- // //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log");
- // return false;
- // }
- // //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log");
- // }
- // }
- //汇付支付账号是否平台账号
- //debug_log([__METHOD__, __LINE__, "$order->order_no 串码订单店铺让利---使用平台账号支付,汇付ID:$order->huifu_id 小模型:$smallModelMoney 大模型:$bigModelMoney"], "model_pv_integral_bonus_debug.log");
- if ($order->pay_type > 2000 && $order->pay_type < 3000) {
- if (!empty($order->is_use_platform_mch)) {
- //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利---使用平台账号支付,汇付ID:' . $order->huifu_id], "model_pv_integral_bonus_debug.log");
- //小模型
- if ($oldSmallModelMoney == 0 && $smallModelMoney > 0) {
- $subMoney = Store::subStoreMoney($store, $smallModelMoney, '扣小模型PV奖励', $order->id, $order->user_id);
- if (!$subMoney) {
- $t->rollBack();
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log");
- return false;
- }
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log");
- }
- //大模型
- if ($oldBigModelMoney == 0 && $bigModelMoney > 0) {
- $subMoney = Store::subStoreMoney($store, $bigModelMoney, '扣大模型PV奖励', $order->id, $order->user_id);
- if (!$subMoney) {
- $t->rollBack();
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log");
- return false;
- }
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log");
- }
- }
- } else {
- //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利---使用平台账号支付,支付类型:' . $order->pay_type], "model_pv_integral_bonus_debug.log");
- //小模型
- if ($smallModelMoney > 0) {
- $subMoney = Store::subStoreMoney($store, $smallModelMoney, '扣小模型PV奖励', $order->id, $order->user_id);
- if (!$subMoney) {
- $t->rollBack();
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $smallModelMoney . " 失败"], "model_pv_integral_bonus_debug.log");
- return false;
- }
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $smallModelMoney . " 成功"], "model_pv_integral_bonus_debug.log");
- }
- //大模型
- if ($bigModelMoney > 0) {
- $subMoney = Store::subStoreMoney($store, $bigModelMoney, '扣大模型PV奖励', $order->id, $order->user_id);
- if (!$subMoney) {
- $t->rollBack();
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log");
- return false;
- }
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log");
- }
- }
- $t->commit();
- //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利----成功---- end --------'], "model_pv_integral_bonus_debug.log");
- return true;
- }
- $t->rollBack();
- //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利:订单保存让利失败----失败---- end --------'], "model_pv_integral_bonus_debug.log");
- return false;
- } catch (\Exception $e) {
- $t->rollBack();
- //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利失败:' . $e->getMessage()], "model_pv_integral_bonus_debug.log");
- return false;
- }
- }
- public static function getAgentSaasIdByOrder($order, $agentType, $money, $model_val, $modelType)
- {
- $commission = 0.00;
- $agent = UserStringCodeOrder::TYPE_LIST[UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY];
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}待分账金额:{$money} 门店:{$order->store_id} ------start-----"], "app_debug.log");
- //获取店铺
- $store = Store::findOne($order->store_id);
- if (empty($store)) {
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}待分账金额:{$money} 门店:{$order->store_id} 不存在"], "app_debug.log");
- return $commission;
- }
- switch ($agentType) {
- case UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY:
- //区县代理商 $store['district_id']
- $where['district_id'] = $store['district_id'];
- $where['area_level'] = 1;
- $order->district_agent_status = 1;
- break;
- case UserStringCodeOrder::TYPE_STRING_CODE_STORE_STREET_AGENT_DIVVY:
- //街道代理商 $store['street_id']
- $where['street_id'] = $store['street_id'];
- $where['area_level'] = 4;
- $order->street_agent_status = 1;
- break;
- default: //所有区县代理商分红 $store['district_id']
- $where['area_level'] = 1;
- $order->all_district_agent_status = 1;
- break;
- }
- $where['is_delete'] = 0;
- $where['is_enable'] = 1;
- $admin = Admin::find()->where($where)->asArray()->all();
- $agentNum = count($admin);
- if ($agentNum > 0) {
- $order->save();
- $commissionMoney = bcdiv($money, $agentNum, 4);
- if ($commissionMoney <= 0) {
- //debug_log([__METHOD__, __LINE__, "代理商平均分红 【{$commissionMoney}】小于0.01不分红"], "app_debug.log");
- }
- foreach ($admin as $item) {
- if ($item['saas_user_id']) {
- $res = UserStringCodeOrder::transferAddUserWallet($order, $item['saas_user_id'], $commissionMoney, $agentType, $model_val);
- if ($res) {
- $commission += $commissionMoney;
- }
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账金额:{$commissionMoney} 门店:{$order->store_id} {{$agent}}ID:{$item['saas_user_id']}"], "app_debug.log");
- } else {
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账金额:{$commissionMoney} 门店:{$order->store_id} {{$agent}}未绑定 SaasId不分红"], "app_debug.log");
- }
- }
- } else {
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}不存在"], "app_debug.log");
- }
- //分红金额小于待分红金额,则分给指定用户
- if ($money > $commission) {
- $commissionMoney = $money - $commission;
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_SALE_SETTING, UserStringCodePlus::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- if ($setting['string_code_store_push_id']) {
- UserStringCodeOrder::transferAddUserWallet($order, $setting['string_code_store_push_id'], $commissionMoney, $agentType, $model_val, true);
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账剩余金额:{$commissionMoney} 代理商剩余让利用户ID:{$setting['string_code_store_push_id']}"], "app_debug.log");
- } else {
- //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账剩余金额:{$commissionMoney} 代理商剩余让利用户不存在不继续分红"], "app_debug.log");
- return $commission;
- }
- }
- return $money;
- }
- //用于重新执行排位 手动执行 用于店铺id
- public static function giveCoinAction($order, $is_scan, $to_store_id)
- {
- $store_id = $order->store_id;
- $order_id = $order->id;
- $user_id = $order->user_id;
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $check_res = self::checkSettingByStoreId($store_id, $setting);
- if (!$check_res) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log");
- return false;
- }
- list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']);
- if ($to_store_id != -1) {
- if ($model_switch_shop) {
- if ($is_scan) {
- $order_pv = $order->pay_price;
- $money = bcmul($order_pv, $setting['string_code_scan_scale_0'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 当面付 联盟PV:【{$order_pv}】比例:【{$setting['string_code_scan_scale_0']}】"], "app_debug.log");
- } else {
- $order_pv_0 = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_0)',
- ])->scalar();
- $money = bcmul($order_pv_0, $setting['string_code_order_scale_0'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 商城单 联盟PV:【{$order_pv_0}】比例:【{$setting['string_code_order_scale_0']}】"], "app_debug.log");
- }
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 店铺:【{$store_id}】分值:【{$money}】"], "app_debug.log");
- $log_type = $is_scan ? TempUserWallet::TYPE_SCAN : TempUserWallet::TYPE_ORDER;
- $log_desc = self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . TempUserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 赠送店铺分";
- $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order";
- $currency = Currency::findOne(['code' => Currency::CURRENCY_COIN]);
- TempUserWallet::addLog($currency, $store_id, $user_id, $money, $log_desc, $log_type, $source_table, $order_id);
- }
- }
- if ($to_store_id == -1) {
- if ($model_switch_alliance) {
- $store_id = self::ALLIANCE_STORE_ID;
- if ($is_scan) {
- $order_pv = $order->pay_price;
- $money = bcmul($order_pv, $setting['string_code_scan_scale_1'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 当面付 联盟PV:【{$order_pv}】比例:【{$setting['string_code_scan_scale_1']}】"], "app_debug.log");
- } else {
- $order_pv_1 = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_1)',
- ])->scalar();
- $money = bcmul($order_pv_1, $setting['string_code_order_scale_1'] / 100, 4);
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 商城单 联盟PV:【{$order_pv_1}】比例:【{$setting['string_code_order_scale_1']}】"], "app_debug.log");
- }
- //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 店铺:【{$store_id}】分值:【{$money}】"], "app_debug.log");
- $log_type = $is_scan ? TempUserWallet::TYPE_SCAN : TempUserWallet::TYPE_ORDER;
- $log_desc = self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . TempUserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 赠送联盟分";
- $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order";
- $currency = Currency::findOne(['code' => Currency::CURRENCY_COIN]);
- $saas_user_id = SaasUser::findSaasIdByUserId($order->user_id);
- TempUserWallet::addLog($currency, $store_id, $saas_user_id, $money, $log_desc, $log_type, $source_table, $order_id);
- }
- }
- }
- //用于重新执行排位 加入排位
- public static function joinNodeAction($order, $is_scan = 0, $to_store_id = -1)
- {
- $store_id = $order->store_id;
- $user_id = $order->user_id;
- $order_id = $order->id;
- $order_no = $order->order_no;
- $temporder = json_encode($order);
- //debug_log([__METHOD__, __LINE__, "订单信息:【{$temporder}】- $store_id - $user_id - $order_id - $order_no - $is_scan "], "app_debug.log");
- $saas_user_id = SaasUser::findSaasIdByUserId($user_id);
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $check_res = self::checkSettingByStoreId($store_id, $setting);
- if (!$check_res) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log");
- return false;
- }
- //门店模式
- $string_code_shop_value = 0;
- if ($store_id != -1) {
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- $string_code_shop_value = $setting['string_code_shop_value'] ? $setting['string_code_shop_value'] : 0;
- }
- //debug_log([__METHOD__, __LINE__, "加入节点 门店模式:{$string_code_shop_value},0品牌模式 1门店模式"], "app_debug.log");
- list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']);
- if ($to_store_id != -1) {
- if ($model_switch_shop) {
- self::joinNodeByShopModelAction($store_id, $user_id, $setting, self::MODEL_SHOP);
- }
- }
- if ($to_store_id == -1) {
- if ($model_switch_alliance) {
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, self::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
- $setting = $setting ? Json::decode($setting['value']) : [];
- self::joinNodeByAllianceModelAction(self::ALLIANCE_STORE_ID, $saas_user_id, $setting, self::MODEL_ALLIANCE);
- }
- }
- return true;
- }
- public static function joinNodeByShopModelAction($store_id, $user_id, $setting, $model_val, $string_code_shop_value = 0)
- {
- $user = User::findOne($user_id);
- $saas_user_id = SaasUser::findSaasIdByUserId($user_id);
- $model_name = self::MODEL_NAME_LIST[self::MODEL_SHOP];
- $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_SHOP);
- $user_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
- if ($user_string_code) {
- //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id}已加入串码节点"], "app_debug.log");
- return false;
- }
- $root_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]);
- if (!$root_string_code) {
- //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},根节点用户:{$string_code_root_user_id}不存在"], "app_debug.log");
- return false;
- }
- $consume_amount = self::getStoreConsumeAmountAction($store_id, $user_id);
- // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},消费金额:{$consume_amount}"], "app_debug.log");
- if (bccomp($consume_amount, $setting['string_code_condition_value'], 4) == -1) {
- $msg = "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},消费:{$consume_amount} 未达到 {$setting['string_code_condition_value']} 元,加入串码节点失败";
- //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log");
- return false;
- }
- $parent_id = !$user['parent_id'] ? $root_string_code['user_id'] : $user['parent_id'];
- // 深度优先,从左至右
- list($real_parent_node, $layer_rank, $area_key) = self::getRealParentNodePlus($store_id, $user_id, $parent_id, $setting['string_code_max_layer'], $model_val, $string_code_shop_value);
- if (empty($real_parent_node['recommend_relation_node'])) {
- $recommend_relation_node = ',' . $real_parent_node->user_id . ',';
- } else {
- $recommend_relation_node = $real_parent_node['recommend_relation_node'] . $real_parent_node->user_id . ',';
- }
- $parent_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- if (empty($parent_string_code['recommend_relation'])) {
- $recommend_relation = ',' . $parent_string_code->user_id . ',';
- } else {
- $recommend_relation = $real_parent_node['recommend_relation'] . $parent_string_code->user_id . ',';
- }
- // 保存节点数据
- $user_string_code = new self();
- $user_string_code->store_id = $store_id;
- $user_string_code->user_id = $user_id;
- $user_string_code->parent_id = $parent_id;
- $user_string_code->parent_node = $real_parent_node['user_id'];
- $user_string_code->recommend_relation_node = $recommend_relation_node;
- $user_string_code->layer_node = $real_parent_node['layer_node'] + 1;
- $user_string_code->recommend_relation = $recommend_relation;
- $user_string_code->layer = $parent_string_code['layer'] + 1;
- $user_string_code->area_key = $area_key;
- $user_string_code->layer_rank = $layer_rank;
- $user_string_code->saas_id = $saas_user_id;
- if (!$user_string_code->save()) {
- $errors = json_encode($user_string_code->getErrors());
- $msg = "加入节点 店铺:【{$store_id}】,用户:{$user_id},保存串码节点失败 {$errors}";
- //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log");
- return false;
- }
- // 所有上级节点 团队人数 + 1
- self::setTeamCountInc($store_id, $user_id);
- return true;
- }
- public static function joinNodeByAllianceModelAction($store_id, $saas_user_id, $setting, $model_val, $string_code_shop_value = 0)
- {
- $user_id = $saas_user_id;
- $user = SaasUser::findOne($saas_user_id);
- $model_name = self::MODEL_NAME_LIST[self::MODEL_ALLIANCE];
- $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_ALLIANCE);
- $user_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
- if ($user_string_code) {
- //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},用户:{$user_id}已加入串码节点"], "app_debug.log");
- return false;
- }
- $root_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]);
- if (!$root_string_code) {
- //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},用户:{$user_id}根节点不存在"], "app_debug.log");
- return false;
- }
- $consume_amount = self::getStoreConsumeAmountAction($store_id, $user_id);
- // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name}, 消费金额:{$consume_amount}"], "app_debug.log");
- if (bccomp($consume_amount, $setting['string_code_condition_value'], 4) == -1) {
- $msg = "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},消费:{$consume_amount}未达到{$setting['string_code_condition_value']}元,加入串码节点失败";
- //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log");
- return false;
- }
- $parent_id = !$user['parent_id'] ? $root_string_code['user_id'] : $user['parent_id'];
- // 深度优先,从左至右
- list($real_parent_node, $layer_rank, $area_key) = self::getRealParentNodePlus($store_id, $user_id, $parent_id, $setting['string_code_max_layer'], $model_val, $string_code_shop_value);
- if (empty($real_parent_node['recommend_relation_node'])) {
- $recommend_relation_node = ',' . $real_parent_node->user_id . ',';
- } else {
- $recommend_relation_node = $real_parent_node['recommend_relation_node'] . $real_parent_node->user_id . ',';
- }
- $parent_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]);
- if (empty($parent_string_code['recommend_relation'])) {
- $recommend_relation = ',' . $parent_string_code->user_id . ',';
- } else {
- $recommend_relation = $real_parent_node['recommend_relation'] . $parent_string_code->user_id . ',';
- }
- // 保存节点数据
- $user_string_code = new self();
- $user_string_code->store_id = $store_id;
- $user_string_code->user_id = $user_id;
- $user_string_code->parent_id = $parent_id;
- $user_string_code->parent_node = $real_parent_node['user_id'];
- $user_string_code->recommend_relation_node = $recommend_relation_node;
- $user_string_code->layer_node = $real_parent_node['layer_node'] + 1;
- $user_string_code->recommend_relation = $recommend_relation;
- $user_string_code->layer = $parent_string_code['layer'] + 1;
- $user_string_code->area_key = $area_key;
- $user_string_code->layer_rank = $layer_rank;
- $user_string_code->saas_id = $saas_user_id;
- if (!$user_string_code->save()) {
- $errors = json_encode($user_string_code->getErrors());
- $msg = "加入节点 店铺:【{$store_id}】,用户:{$user_id},保存串码节点失败 {$errors}";
- //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log");
- return false;
- }
- // 所有上级节点 团队人数 + 1
- self::setTeamCountInc($store_id, $user_id);
- return true;
- }
- public static function getStoreConsumeAmountAction($store_id, $user_id)
- {
- // 联盟分
- $user_wallet = TempUserWallet::getCurrencyWallet($store_id, $user_id, Currency::CURRENCY_COIN);
- return $user_wallet['money_total'] ?: 0;
- }
- public static function countOrderPvBonus($order)
- {
- $store_id = $order->store_id;
- $store = Store::findOne($store_id);
- if (!in_array($store->store_type, [Store::TYPE_STORE, Store::TYPE_BRAND])) {
- // 判断店铺类型 {{ text == 0 ? '默认' : text == 1 ? '品牌' : '门店' }}
- // {{ text == 1 ? '独立运营' : text == 2 ? '平台运营' : text == 3 ? '当面付' : text == 4 ? '点餐' : '' }}
- if ($store->business_model == 3) {
- $store->store_type = 2;
- } else {
- $store->store_type = 1;
- }
- $store->save();
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】类型即不是门店也不是品牌,不进行让利"], "app_debug.log");
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】business_model:【{$store->business_model}】自动变更店铺类型store_type:【{$store->store_type}】"], "app_debug.log");
- // return false;
- }
- if ($order instanceof ScanOrder) {
- $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
- if (empty($setting)) {
- //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】串码红包未设置,不进行让利"], "huifu_payment_debug.log.log");
- return false;
- }
- //串码红包设置
- $setting = Json::decode($setting['value']);
- $bigModelMoney = !empty($setting['string_code_pv_scale_1']) ? bcmul($order->pay_price, $setting['string_code_pv_scale_1'] / 100, 8) : 0;
- $smallModelMoney = !empty($setting['string_code_pv_scale_0']) ? bcmul($order->pay_price, $setting['string_code_pv_scale_0'] / 100, 8) : 0;
- } else {
- $bigModelMoney = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_1)',
- ])->scalar();
- $smallModelMoney = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_0)',
- ])->scalar();
- }
- //大模型
- $order->big_model_pv_bonus = $bigModelMoney ?? 0;
- //小模型
- $order->small_model_pv_bonus = $smallModelMoney ?? 0;
- $order->save();
- return $smallModelMoney + $bigModelMoney;
- }
- //商城让利合伙人
- public static function sendMakeConcessionsByOrder($order, $setting, $is_scan, $store)
- {
- $temp_store = json_encode($setting['string_make_doncessions_userlist']);
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利是否开启:{$setting['string_make_doncessions_switch']} 商城订单是否开启:{$setting['string_make_doncessions_order']} 扫码订单是否开启:{$setting['string_make_doncessions_scan']} 商城让利人员:{$temp_store}"], "app_debug.log");
- list($model_switch_shop, $model_switch_alliance) = UserStringCodePlus::getModelSwitchBySettingArray($setting['string_code_model']);
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城串码模型:{$setting['string_code_model']}"], "app_debug.log");
- if (empty($setting['string_code_make_concessions'])) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 未设置"], "app_debug.log");
- return;
- }
- if ($setting['string_code_make_concessions'] <= 0) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 设置不正确"], "app_debug.log");
- return;
- }
- if ($model_switch_shop) {
- //执行小模型前验证
- if (is_array($setting['string_make_doncessions_userlist']) && !empty($setting['string_make_doncessions_userlist'])) {
- // $dataSource 是有效的非空数组
- self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, 0);
- } else {
- // $dataSource 不是有效的数组或是空数组
- if (empty($setting['string_code_make_concessions_saas_id'])) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 小模型 【商城剩余让利人{$setting['string_code_make_concessions']} 未设置 以及 店铺商城让利合伙人 未设置"], "app_debug.log");
- } else {
- //执行发放逻辑
- self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, 0);
- }
- }
- }
- if ($model_switch_alliance) {
- //执行大模型前验证
- if (is_array($setting['string_make_doncessions_userlist']) && !empty($setting['string_make_doncessions_userlist'])) {
- // $dataSource 是有效的非空数组
- self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, 1);
- } else {
- // $dataSource 不是有效的数组或是空数组
- if (empty($setting['string_code_make_concessions_saas_id'])) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 大模型 【商城剩余让利人{$setting['string_code_make_concessions']} 未设置 以及 店铺商城让利合伙人 未设置"], "app_debug.log");
- } else {
- //执行发放逻辑
- self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, 1);
- }
- }
- }
- //检测是否有发放 有直接更新订单状态
- $UserStringCodeOrderlist = UserStringCodeOrder::findAll([
- 'order_id' => $order->id,
- 'is_scan' => $is_scan,
- 'type' => [UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS]
- ]);
- $temp_count = count($UserStringCodeOrderlist);
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行记录有:{$temp_count}"], "app_debug.log");
- if (count($UserStringCodeOrderlist) > 0) {
- $temp_order = json_encode($order);
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 订单信息:{$temp_order}"], "app_debug.log");
- $order->make_concessions_status = 1;
- if ($order->save()) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 状态修改失败"], "app_debug.log");
- }
- // 计算合并结果的总金额
- $ModelMoney = 0;
- foreach ($UserStringCodeOrderlist as $ordertempr) {
- if ($ordertempr['status'] == 1) {
- $ModelMoney += $ordertempr['money']; // 累加金额
- }
- }
- try {
- if ($order->is_use_platform_mch == 1 && ($order->pay_type == 1 || in_array($order->pay_type, array_keys(Order::HUIFU_PAYMENT_PAY_TYPE)))) {
- //扣除店铺金额
- $subMoney = Store::subStoreMoney($store, $ModelMoney, '扣商城让利合伙人分红', $order->id, $order->user_id);
- if (!$subMoney) {
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 失败"], "app_debug.log");
- }
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 成功"], "app_debug.log");
- } else {
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 已分账,不用扣商城让利合伙人分红 成功"], "app_debug.log");
- }
- } catch (\Exception $e) {
- //debug_log([__METHOD__, __LINE__, "扣商城让利合伙人分红:{$e->getMessage()}"], "app_debug.log");
- }
- }
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行完成"], "app_debug.log");
- }
- //商城让利合伙人
- public static function sendMakeConcessionsScan($order, $setting, $is_scan, $store, $model_val)
- {
- $temp_store = json_encode($setting['string_make_doncessions_userlist']);
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利是否开启:{$setting['string_make_doncessions_switch']} 商城订单是否开启:{$setting['string_make_doncessions_order']} 扫码订单是否开启:{$setting['string_make_doncessions_scan']} 商城让利人员:{$temp_store}"], "app_debug.log");
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城串码模型:{$setting['string_code_model']}"], "app_debug.log");
- if (empty($setting['string_code_make_concessions'])) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 未设置"], "app_debug.log");
- return;
- }
- if ($setting['string_code_make_concessions'] <= 0) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 设置不正确"], "app_debug.log");
- return;
- }
- //执行小模型前验证
- if (is_array($setting['string_make_doncessions_userlist']) && !empty($setting['string_make_doncessions_userlist'])) {
- // $dataSource 是有效的非空数组
- self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, $model_val);
- } else {
- // $dataSource 不是有效的数组或是空数组
- if (empty($setting['string_code_make_concessions_saas_id'])) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 小模型 【商城剩余让利人{$setting['string_code_make_concessions']} 未设置 以及 店铺商城让利合伙人 未设置"], "app_debug.log");
- } else {
- //执行发放逻辑
- self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, $model_val);
- }
- }
- //检测是否有发放 有直接更新订单状态
- $UserStringCodeOrderlist = UserStringCodeOrder::findAll([
- 'order_id' => $order->id,
- 'is_scan' => $is_scan,
- 'type' => [UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS]
- ]);
- $temp_count = count($UserStringCodeOrderlist);
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行记录有:{$temp_count}"], "app_debug.log");
- if (count($UserStringCodeOrderlist) > 0) {
- $temp_order = json_encode($order);
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 订单信息:{$temp_order}"], "app_debug.log");
- $order->make_concessions_status = 1;
- if ($order->save()) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 状态修改失败"], "app_debug.log");
- }
- // 计算合并结果的总金额
- $ModelMoney = 0;
- foreach ($UserStringCodeOrderlist as $ordertempr) {
- if ($ordertempr['status'] == 1) {
- $ModelMoney += $ordertempr['money']; // 累加金额
- }
- }
- try {
- if ($order->is_use_platform_mch == 1 && ($order->pay_type == 1 || in_array($order->pay_type, array_keys(Order::HUIFU_PAYMENT_PAY_TYPE)))) {
- //扣除店铺金额
- $subMoney = Store::subStoreMoney($store, $ModelMoney, '扣商城让利合伙人分红', $order->id, $order->user_id);
- if (!$subMoney) {
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 失败"], "app_debug.log");
- }
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 成功"], "app_debug.log");
- } else {
- //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 已分账,不用扣商城让利合伙人分红 成功"], "app_debug.log");
- }
- } catch (\Exception $e) {
- //debug_log([__METHOD__, __LINE__, "扣商城让利合伙人分红:{$e->getMessage()}"], "app_debug.log");
- }
- }
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行完成"], "app_debug.log");
- }
- // 商城让利合伙人分红
- public static function sendMakeConcessionsByOrderStore($order, $setting, $is_scan, $model_val)
- {
- if (empty($setting['string_make_doncessions_switch'])) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城让利合伙人模式未设置"], "app_debug.log");
- return;
- }
- if ($setting['string_make_doncessions_switch'] == 0) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城让利合伙人模式未开启"], "app_debug.log");
- return;
- }
- if ($is_scan == 0) {
- //商城订单
- if (empty($setting['string_make_doncessions_order']) || $setting['string_make_doncessions_order'] == 0) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城订单商城让利合伙人状态未设置"], "app_debug.log");
- } else {
- //debug_log([__METHOD__, __LINE__, "执行 商城让利人分红"], "app_debug.log");
- /*$order_pv = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_0)',
- ])->scalar();
- self::sendMakeConcessionsByOrderGrant($order, $order_pv, $setting['string_code_make_concessions'], $setting['string_code_make_concessions_saas_id'], $setting['string_make_doncessions_userlist'], 0);
- $order_pv = OrderDetail::find()
- ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
- ->select([
- 'sum(pv_1)',
- ])->scalar();*/
- self::sendMakeConcessionsByOrderGrant($order, $order->pay_price, $setting['string_code_make_concessions'], $setting['string_code_make_concessions_saas_id'], $setting['string_make_doncessions_userlist'], $model_val);
- //debug_log([__METHOD__, __LINE__, "执行 商城让利人分红:" . $setting['string_code_make_concessions'] . '======'], "app_debug.log");
- }
- } else {
- //扫码订单
- if (empty($setting['string_make_doncessions_scan']) || $setting['string_make_doncessions_scan'] == 0) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城订单商城让利合伙人状态未设置"], "app_debug.log");
- } else {
- //debug_log([__METHOD__, __LINE__, "执行 扫码分红"], "app_debug.log");
- self::sendMakeConcessionsByOrderGrant($order, $order->pay_price, $setting['string_code_make_concessions_scan'], $setting['string_code_make_concessions_saas_id'], $setting['string_make_doncessions_userlist'], $model_val);
- }
- }
- }
- // 商城让利合伙人分红
- public static function sendMakeConcessionsByOrderGrant($order, $transfer_money, $string_code_make_concessions, $push_saas_id, $string_make_doncessions_userlist, $model_val)
- {
- $money = bcmul($transfer_money, $string_code_make_concessions / 100, 4);
- if ($string_make_doncessions_userlist) {
- $moneytran_temp = 0;
- if (is_array($string_make_doncessions_userlist)) {
- // 遍历数组
- $string_make_doncessions_userlist = self::NewUserList($string_make_doncessions_userlist);
- foreach ($string_make_doncessions_userlist as $item) {
- $moneytran = 0;
- //debug_log([__METHOD__, __LINE__, "div1===" . bcmul(bcmul($money, $item['percent'], 8), $item['weight'], 8)], "app_debug.log");
- if ($item['total_weight'] > 0 && bcmul(bcmul($money, $item['percent'], 8), $item['weight'], 8) > 0) {
- $moneytran = bcmul(
- bcdiv(
- bcmul($money, $item['percent'], 8),
- $item['total_weight'],
- 8
- ),
- $item['weight'],
- 8
- );
- }
- //debug_log([__METHOD__, __LINE__, "div2====" . $moneytran] . '====' . $item['total_weight'] . '===' . $item['weight'] . '===' . $item['percent'], "app_debug.log");
- $moneytran = sprintf("%.4f", $moneytran);
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 总的{$money} 当前商城没设置参与人员:{$item['saas_id']} 获得:{$moneytran}"], "app_debug.log");
- UserStringCodeOrder::transferAddUserWalletAndStoreid($order, $item['saas_id'], $moneytran, UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS, $model_val, $order->store_id, false);
- $moneytran_temp = bcadd($moneytran_temp, $moneytran, 4);
- }
- }
- $moneytran_sy = $money - $moneytran_temp;
- if ($moneytran_sy > 0) {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 总的{$money} 平分后还有剩余:{$moneytran_sy} 直接给剩余让利人{$push_saas_id} "], "app_debug.log");
- UserStringCodeOrder::transferAddUserWalletAndStoreid($order, $push_saas_id, $moneytran_sy, UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS, $model_val, $order->store_id, true);
- }
- } else {
- //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人总的{$money} 当前商城没设置参与人员 全部给剩余让利人:{$push_saas_id}"], "app_debug.log");
- UserStringCodeOrder::transferAddUserWalletAndStoreid($order, $push_saas_id, $money, UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS, $model_val, $order->store_id, true);
- }
- }
- public static function NewUserList($data)
- {
- foreach ($data as &$value) {
- $level_info = \Yii::$app->db->createCommand('select * from cyy_store_partner_level where id=:id')->bindValue(':id', $value['level_id'])->queryOne();
- $value['percent'] = $level_info['profit_rate'] / 100;
- //debug_log([__METHOD__, __LINE__, "div2====" . $level_info['name'] . '=user_id:' . $value['saas_id']], "app_debug.log");
- }
- $total_weights = [];
- foreach ($data as $item) {
- $level_id = $item['level_id'];
- $weight = (int)$item['weight']; // 确保 weight 是整数
- if (!isset($total_weights[$level_id])) {
- $total_weights[$level_id] = 0;
- }
- $total_weights[$level_id] += $weight;
- }
- // Step 2: 将 total_weight 添加到每个数组元素中
- foreach ($data as &$item) {
- $level_id = $item['level_id'];
- $item['total_weight'] = $total_weights[$level_id];
- }
- // 释放引用
- unset($item);
- return $data;
- }
- private static function adAwardSend($store_id, $order_pv, $rate, $manager, $model, $order, $string_code_store_push_id)
- {
- $store = Store::find()->where(['id' => $store_id])->select(['salesman_id', 'district_id'])->asArray()->one();
- $salesman_id = $store['salesman_id'];
- //debug_log([__METHOD__, __LINE__, "============拓展经理:($salesman_id),广告推流店铺id:" . $store_id], "app_debug.log");
- if ($order_pv <= 0) return false;
- $salesman = Salesman::findOne(['id' => $salesman_id, 'is_delete' => 0, 'status' => 1]);
- $admin = Admin::findOne(['id' => $salesman->admin_id, 'is_delete' => 0]);
- $manager_money = $order_pv * $manager / 100;
- if ($manager && $salesman->saas_user_id) {
- //debug_log([__METHOD__, __LINE__, "============拓展经理金额 : " . ($manager_money)], "app_debug.log");
- UserStringCodeOrder::transferAddUserWallet($order, $salesman->saas_user_id, $manager_money, UserStringCodeOrder::TYPE_EXPAND_MANAGER, $model);
- }else{
- if ($string_code_store_push_id){
- UserStringCodeOrder::transferAddUserWallet($order, $string_code_store_push_id, $manager_money, UserStringCodeOrder::TYPE_EXPAND_MANAGER, $model);
- }
- }
- if ($rate){
- $money = $order_pv * $rate / 100;
- if ($admin->advert_push_user_id) {
- //debug_log([__METHOD__, __LINE__, "============广告推流金额 : " . ($money)], "app_debug.log");
- UserStringCodeOrder::transferAddUserWallet($order, $admin->advert_push_user_id, $money, UserStringCodeOrder::TYPE_BD_AGENT, $model);
- }else{
- if ($string_code_store_push_id){
- UserStringCodeOrder::transferAddUserWallet($order, $string_code_store_push_id, $money, UserStringCodeOrder::TYPE_BD_AGENT, $model);
- }
- }
- }
- return true;
- }
- private static function hotAwardSend($saas_id, $rate, $founder, $order_pv, $model, $order)
- {
- $money = $order_pv * $rate / 100;
- //debug_log([__METHOD__, __LINE__, "============热动代理人金额 : " . ($money)], "app_debug.log");
- if ($saas_id && $money > 0) {
- UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, UserStringCodeOrder::TYPE_AD_HOT, $model);
- }
- $money = $order_pv * $founder / 100;
- //debug_log([__METHOD__, __LINE__, "============热动广告推流金额 : " . ($money)], "app_debug.log");
- if ($saas_id && $money > 0) {
- UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY, $model);
- }
- }
- }
|