UpgradeCondition.php 75 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812
  1. <?php
  2. namespace addons\Boss\common\logic;
  3. use addons\Boss\common\models\AddonsBoss;
  4. use addons\Boss\common\models\BossGoodsStatistics;
  5. use addons\FastMode\common\enums\FastModeEnum;
  6. use addons\FastMode\common\models\common\FastModeUpgradeCondition;
  7. use addons\FastMode\common\models\FastModeCommissionItemSetting;
  8. use addons\UpgradeGift\common\enums\GiftEnum;
  9. use addons\UpgradeGift\common\listeners\UpgradeGiftListener;
  10. use addons\ZaoDoubleCopy\common\models\ZaoDoubleCopyAchievement;
  11. use addons\ZaoDoubleCopy\common\models\ZaoDoubleCopyUser;
  12. use common\enums\AddonsEnum;
  13. use common\enums\OrderStatusEnum;
  14. use common\enums\PayTypeEnum;
  15. use common\enums\RabbitMqEnum;
  16. use common\enums\StatusEnum;
  17. use common\events\census\UserUpgradeAfterEvent;
  18. use common\helpers\ArrayHelper;
  19. use common\models\common\CapitalLog;
  20. use common\models\goods\GoodsCate;
  21. use common\models\goods\GoodsCateRelate;
  22. use common\models\mall\MallAddons;
  23. use common\models\order\Order;
  24. use common\models\order\OrderDetail;
  25. use common\models\statistics\UserAchievementStatisticsTotal;
  26. use common\models\statistics\UserStatisticsTotal;
  27. use common\models\statistics\UserTeamAchievementStatistics;
  28. use common\models\user\User;
  29. use common\models\user\UserLevel;
  30. use common\models\user\UserPartitionRelationship;
  31. use common\models\user\UserStatisticsTotalCopy1;
  32. use common\models\user\UserTeamProfitStatistics;
  33. use common\models\user\UserTeamStatistics;
  34. use services\common\UserWalletService;
  35. use Yii;
  36. use yii\helpers\Json;
  37. /**
  38. * Class UpgradeCondition
  39. * @Author: lun
  40. * @DateTime: 2022/9/12 0012 16:29
  41. * @Copyright: copyright (c) 2021 广东七件事集团
  42. * @package addons\Boss\common\logic
  43. */
  44. class UpgradeCondition
  45. {
  46. public static $boss_condition_ids = [8, 9, 10, 11, 12, 18, 19, 20, 21, 22, 23, 55, 56, 64, 65,73, 102, 110, 111, 96, 105, 500,118, 121];//股东升级条件可显示的条件id
  47. public static $zao_double_copy_condition_ids = [61,62,63];//藻知道二二复制增加 股东升级条件可显示的条件id
  48. public static $data = [
  49. 8 => [
  50. 'id' => 8,
  51. 'content' => '购买商品升级',
  52. 'remark' => '',
  53. 'type' => 'buy_goods',
  54. 'setting' => []
  55. ],
  56. 9 => [
  57. 'id' => 9,
  58. 'content' => '直推客户消费满____元的人数满____个,间推客户消费满____元的人数满____个',
  59. 'remark' => '',
  60. 'type' => 'default',
  61. 'setting' => [
  62. ['type' => 'text', 'name' => 'direct_user_consume', 'default_val' => 0],
  63. ['type' => 'text', 'name' => 'direct_user_consume_num', 'default_val' => 0],
  64. ['type' => 'text', 'name' => 'indirect_user_consume', 'default_val' => 0],
  65. ['type' => 'text', 'name' => 'indirect_user_consume_num', 'default_val' => 0],
  66. ]
  67. ],
  68. 10 => [
  69. 'id' => 10,
  70. 'content' => '直推____人,并且直推中购买商品ID____的人数____个',
  71. 'remark' => '',
  72. 'type' => 'default',
  73. 'setting' => [
  74. ['type' => 'text', 'name' => 'direct_user_num', 'default_val' => 0],
  75. ['type' => 'text', 'name' => 'direct_user_buy_goods_id', 'default_val' => 0],
  76. ['type' => 'text', 'name' => 'direct_user_buy_goods_id_num', 'default_val' => 0],
  77. ]
  78. ],
  79. 11 => [
  80. 'id' => 11,
  81. 'content' => "个人业绩____元,所有下级业绩____元",
  82. 'remark' => '统计的业绩包含平台+多商户',
  83. 'type' => 'default',
  84. 'setting' => [
  85. ['type' => 'text', 'name' => 'personal_achievement', 'default_val' => 0],
  86. ['type' => 'text', 'name' => 'subordinates_achievement', 'default_val' => 0],
  87. ]
  88. ],
  89. 12 => [
  90. 'id' => 12,
  91. 'content' => '间推客户数量____个,间推客户订单金额____元',
  92. 'remark' => '',
  93. 'type' => 'default',
  94. 'setting' => [
  95. ['type' => 'text', 'name' => 'indirect_user_num', 'default_val' => 0],
  96. ['type' => 'text', 'name' => 'indirect_user_order_price', 'default_val' => 0],
  97. ]
  98. ],
  99. 18 => [
  100. 'id' => 18,
  101. 'content' => '直推股东等级>=____数量____个',
  102. 'remark' => '',
  103. 'type' => 'default',
  104. 'setting' => [
  105. ['type' => 'select', 'name' => 'direct_boss_level', 'default_val' => 0, 'source' => ['class' => 'addons\Boss\common\models\AddonsBossLevel', 'method' => 'getListByUpgrade', 'key' => 'source_list']],
  106. ['type' => 'text', 'name' => 'direct_boss_level_num', 'default_val' => 0],
  107. ]
  108. ],
  109. 19 => [
  110. 'id' => 19,
  111. 'content' => '间推股东等级>=____数量____个',
  112. 'remark' => '',
  113. 'type' => 'default',
  114. 'setting' => [
  115. ['type' => 'select', 'name' => 'indirect_boss_level', 'default_val' => 0, 'source' => ['class' => 'addons\Boss\common\models\AddonsBossLevel', 'method' => 'getListByUpgrade', 'key' => 'source_list']],
  116. ['type' => 'text', 'name' => 'indirect_boss_level_num', 'default_val' => 0],
  117. ]
  118. ],
  119. 20 => [
  120. 'id' => 20,
  121. 'content' => '团队股东等级>=____数量____个',
  122. 'remark' => '',
  123. 'type' => 'default',
  124. 'setting' => [
  125. ['type' => 'select', 'name' => 'team_boss_level', 'default_val' => 0, 'source' => ['class' => 'addons\Boss\common\models\AddonsBossLevel', 'method' => 'getListByUpgrade', 'key' => 'source_list']],
  126. ['type' => 'text', 'name' => 'team_boss_level_num', 'default_val' => 0],
  127. ]
  128. ],
  129. 21 => [
  130. 'id' => 21,
  131. 'content' => '直推客户消费满____元',
  132. 'remark' => '',
  133. 'type' => 'default',
  134. 'setting' => [
  135. ['type' => 'text', 'name' => 'direct_user_consume', 'default_val' => 0],
  136. ]
  137. ],
  138. 22 => [
  139. 'id' => 22,
  140. 'content' => '本人购买指定商品____ 所需购买____件',
  141. 'remark' => '可设置多个ID英文逗号隔开,并且是计算订单完成的订单',
  142. 'type' => 'default',
  143. 'setting' => [
  144. ['type' => 'text', 'name' => 'goods_ids', 'default_val' => '', 'width' => 200],
  145. ['type' => 'text', 'name' => 'buy_num', 'default_val' => 0],
  146. ]
  147. ],
  148. 23 => [
  149. 'id' => 23,
  150. 'content' => '在____天内,直推____人每人购买商品ID____ 所需购买____件',
  151. 'remark' => '可设置多个ID英文逗号隔开,并且是计算订单完成的订单',
  152. 'type' => 'default',
  153. 'setting' => [
  154. ['type' => 'text', 'name' => 'day', 'default_val' => 0],
  155. ['type' => 'text', 'name' => 'direct_num', 'default_val' => 0],
  156. ['type' => 'text', 'name' => 'goods_ids', 'default_val' => '', 'width' => 200],
  157. ['type' => 'text', 'name' => 'order_num', 'default_val' => 0],
  158. ]
  159. ],
  160. 55 => [
  161. 'id' => 55,
  162. 'content' => '个人订单满____笔,个人订单满____元',
  163. 'remark' => '注意:当个人支付订单满N笔,且个人支付订单金额满N元即可,售后不影响等级。(此条件仅计算平台订单)',
  164. 'type' => 'default',
  165. 'setting' => [
  166. ['type' => 'text', 'name' => 'personal_order_num', 'default_val' => 0],
  167. ['type' => 'text', 'name' => 'personal_order_achievement', 'default_val' => 0],
  168. ]
  169. ],
  170. 56 => [
  171. 'id' => 56,
  172. 'content' => '个人订单满____笔,个人订单满____元
  173. <input type="checkbox" name="personal_order_checkbox_56[]" checked value="1">平台</input>
  174. <input type="checkbox" name="personal_order_checkbox_56[]" value="2">多商户</input>
  175. ',
  176. 'remark' => '注意:当个人支付订单满N笔,且个人支付订单金额满N元即可,售后不影响等级。',
  177. 'type' => 'default',
  178. 'is_html' => true,
  179. 'setting' => [
  180. ['type' => 'text', 'name' => 'personal_order_num_56', 'default_val' => 0],
  181. ['type' => 'text', 'name' => 'personal_order_achievement_56', 'default_val' => 0],
  182. [
  183. 'type' => 'checkbox', 'name' => 'personal_order_checkbox_56', 'is_checkbox' => true, 'default_val' => [1],
  184. 'source' => ['class' => self::class, 'method' => 'getPersonalCheckbox56', 'key' => 'personal_checkbox_56']
  185. ],
  186. ]
  187. ],
  188. 61 => [
  189. 'id' => 61,
  190. 'content' => '链动一二号市场总业绩达____元,且单个市场业绩达____元',
  191. 'remark' => '',
  192. 'type' => 'default',
  193. 'setting' => [
  194. ['type' => 'text', 'name' => 'achievement', 'default_val' => 0],
  195. ['type' => 'text', 'name' => 'single_market', 'default_val' => 0],
  196. ]
  197. ],
  198. 62 => [
  199. 'id' => 62,
  200. 'content' => '链动一二号市场购买链动商品订单数达____件,且单个市场订单数达____件',
  201. 'remark' => '',
  202. 'type' => 'default',
  203. 'setting' => [
  204. ['type' => 'text', 'name' => 'achievement_order_num', 'default_val' => 0],
  205. ['type' => 'text', 'name' => 'single_market_order_num', 'default_val' => 0],
  206. ]
  207. ],
  208. 63 => [
  209. 'id' => 63,
  210. 'content' => '链动团队除最大市场外(即业绩最高市场)的团队小市场业绩总和达(不含复购链动商品)达____元',
  211. 'remark' => '',
  212. 'type' => 'default',
  213. 'setting' => [
  214. ['type' => 'text', 'name' => 'achievement_small', 'default_val' => 0],
  215. ]
  216. ],
  217. 64 => [
  218. 'id' => 64,
  219. 'content' => '团队总业绩____达到____元,业绩最高的前____个部门,每个部门的业绩不能低于____元',
  220. 'remark' => '',
  221. 'type' => 'default',
  222. 'setting' => [
  223. ['type' => 'select', 'name' => 'achievement_type', 'default_val' => 0, 'source' => ['class' => 'common\models\common\UpgradeCondition', 'method' => 'getAchievementType', 'key' => 'achievement_type_list']],
  224. ['type' => 'text', 'name' => 'team_achievement', 'default_val' => 0],
  225. ['type' => 'text', 'name' => 'direct_num', 'default_val' => 0],
  226. ['type' => 'text', 'name' => 'direct_achievement', 'default_val' => 0],
  227. ]
  228. ],
  229. 65 => [
  230. 'id' => 65,
  231. 'content' => '直推____人,当中____个团队的订单大于等于____单,团队总订单____单,商品类目ID组',
  232. 'remark' => '指定商品类目中的订单且为支付后才会进行计算',
  233. 'type' => 'default',
  234. 'setting' => [
  235. ['type' => 'text', 'name' => 'team_achievement', 'default_val' => 0],
  236. ['type' => 'text', 'name' => 'team_achievement_people_num', 'default_val' => 0],
  237. ['type' => 'text', 'name' => 'team_achievement_order_num', 'default_val' => 0],
  238. ['type' => 'text', 'name' => 'team_total_order_num', 'default_val' => 0],
  239. ['type' => 'selectGoodsCats', 'name' => 'team_goods_cats', 'default_val' => ''],
  240. ]
  241. ],
  242. 73 => [
  243. 'id' => 73,
  244. 'content' => '____等级,直推____等级数量____个,同时直推业绩____元',
  245. 'remark' => '',
  246. 'type' => 'default',
  247. 'setting' => [
  248. ['type' => 'select', 'name' => 'user_level', 'default_val' => '', 'source' => ['class' => 'addons\Boss\common\models\AddonsBossLevel', 'method' => 'getListByUpgrade', 'key' => 'source_list']],
  249. ['type' => 'select', 'name' => 'child_level', 'default_val' => '', 'source' => ['class' => 'addons\Boss\common\models\AddonsBossLevel', 'method' => 'getListByUpgrade', 'key' => 'source_list']],
  250. ['type' => 'text', 'name' => 'rec_num', 'default_val' => 0],
  251. ['type' => 'text', 'name' => 'direct_performance', 'default_val' => 0],
  252. ]
  253. ],
  254. 102 => [
  255. 'id' => 102,
  256. 'content' => '指定商品ID____,并且单笔订单金额满____元',
  257. 'remark' => '注意:可填写多个商品每个商品间用英文逗号隔开,订单金额必须是订单完成的金额',
  258. 'type' => 'default',
  259. 'setting' => [
  260. ['type' => 'text', 'name' => 'goods_ids', 'default_val' => ''],
  261. ['type' => 'text', 'name' => 'finish_order_money', 'default_val' => 0],
  262. ]
  263. ],
  264. 121 => [
  265. 'id' => 121,
  266. 'content' => "个人业绩____元",
  267. 'remark' => '统计的业绩包含平台+多商户',
  268. 'type' => 'default',
  269. 'setting' => [
  270. ['type' => 'text', 'name' => 'personal_achievement', 'default_val' => 0],
  271. ]
  272. ],
  273. 110 => [
  274. 'id' => 110,
  275. 'content' => '简速模式累计收益金额____元',
  276. 'remark' => '累计收益金额指的是简速模式插件中的累计收益金额',
  277. 'type' => 'default',
  278. 'setting' => [
  279. ['type' => 'text', 'name' => 'commission', 'default_val' => 0]
  280. ]
  281. ],
  282. 111 => [
  283. 'id' => 111,
  284. 'content' => '个人购买简速模式指定商品金额____元',
  285. 'remark' => '指定商品为简速模式插件中指定的商品',
  286. 'type' => 'default',
  287. 'setting' => [
  288. ['type' => 'text', 'name' => 'order_price', 'default_val' => 0]
  289. ]
  290. ],
  291. 96 => [
  292. 'id' => 96,
  293. 'content' => '个人团队业绩-直推下级最高团队业绩 >= ____元',
  294. 'remark' => '统计的业绩包含平台+多商户',
  295. 'type' => 'default',
  296. 'setting' => [
  297. ['type' => 'text', 'name' => 'money', 'default_val' => 0],
  298. ]
  299. ],
  300. 105 => [
  301. 'id' => 105,
  302. 'content' => "群组(团队包含本人)商品售价业绩____达到____元",
  303. 'remark' => '统计的业绩包含平台+多商户',
  304. 'type' => 'default',
  305. 'setting' => [
  306. ['type' => 'radio', 'name' => 'is_when_settlement', 'default_val' => 0, 'source' => ['class' => self::class, 'method' => 'getWhenSettlement', 'key' => 'radio_when_settlement_list']],
  307. ['type' => 'text', 'name' => 'money', 'default_val' => 0],
  308. ]
  309. ],
  310. 500 => [
  311. 'id' => 500,
  312. 'content' => "指定商品<el-tooltip class='item' effect='dark' content='设置>订单设置>业绩设置。请根据以上指引路径进行设置' placement='top'>
  313. <i class='el-icon-info'></i></el-tooltip>,<span>总团队业绩</span>
  314. <span class='radio-inline' v-if='is_set_condition'>(<input type='radio' id='include_yourself_1' name='is_include_yourself' value='0'>
  315. <label for='include_yourself_1'>包含自己</label>
  316. <input type='radio' id='include_yourself_0' name='is_include_yourself' value='0' checked>
  317. <label for='include_yourself_0'>不包含自己</label>)</span><span style='display:none;'>____</span>
  318. <span>达到____元,大市场业绩达到____元,小市场业绩达到____元<el-tooltip class='item' effect='dark' content='统计的业绩包含平台+多商户' placement='top'>
  319. <i class='el-icon-info'></i></el-tooltip> (</span>
  320. <span class='radio-inline' v-if='is_set_condition'><input type='radio' id='is_when_settlement_500_1' name='is_when_settlement_500' value='0'>
  321. <label for='is_when_settlement_500_1'>订单支付</label>
  322. <input type='radio' id='is_when_settlement_500_0' name='is_when_settlement_500' value='0' checked>
  323. <label for='is_when_settlement_500_0'>订单完成</label></span><span style='display:none;'>____</span>
  324. <span>) 业绩计算类型(</span>
  325. <span class='radio-inline' v-if='is_set_condition'><input type='radio' id='settle_achievement_500_0' name='settle_achievement_500' value='0' checked>
  326. <label for='settle_achievement_500_0'>商品利润</label>
  327. <input type='radio' id='settle_achievement_500_1' name='settle_achievement_500' value='0'>
  328. <label for='settle_achievement_500_1'>实付金额</label>)</span><span style='display:none;'>____</span>
  329. <span>)</span>",
  330. 'remark' => '',
  331. 'type' => 'default',
  332. 'is_html' => 1,
  333. 'setting' => [
  334. ['type' => 'radio', 'name' => 'is_include_yourself', 'default_val' => 0, 'source' => ['class' => self::class, 'method' => 'getIsIncludesSelf', 'key' => 'radio_includes_self_list']],
  335. ['type' => 'text', 'name' => 'total_performance', 'default_val' => 0],
  336. ['type' => 'text', 'name' => 'max_performance', 'default_val' => 0],
  337. ['type' => 'text', 'name' => 'min_performance', 'default_val' => 0],
  338. ['type' => 'radio', 'name' => 'is_when_settlement', 'default_val' => 0, 'source' => ['class' => self::class, 'method' => 'getWhenSettlement', 'key' => 'radio_when_settlement_list']],
  339. ['type' => 'radio', 'name' => 'settle_achievement', 'default_val' => 0, 'source' => ['class' => self::class, 'method' => 'getSettleAchievement', 'key' => 'radio_settle_achievement_list']],
  340. ]
  341. ],
  342. 118 => [
  343. 'id' => 118,
  344. 'content' => '团队____条线,出现____个____等级',
  345. 'remark' => '',
  346. 'type' => 'default',
  347. 'setting' => [
  348. ['type' => 'text', 'name' => 'team_num', 'default_val' => 0],
  349. ['type' => 'text', 'name' => 'level_num', 'default_val' => 0],
  350. ['type' => 'select', 'name' => 'agent_level', 'default_val' => 0, 'source' => ['class' => 'addons\Boss\common\models\AddonsBossLevel', 'method' => 'getListByUpgrade', 'key' => 'source_list']],
  351. ]
  352. ],
  353. ];
  354. public static function getData($ids = [])
  355. {
  356. $rows = self::$data;
  357. $arr = [];
  358. if (empty($ids)) return $rows;
  359. foreach ($ids as $id) {
  360. $arr[] = $rows[$id];
  361. }
  362. $arr = array_values(ArrayHelper::arraySort($arr, 'id', 'asc'));
  363. return $arr;
  364. }
  365. /**
  366. * 获取升级条件模板数据
  367. * @param $obj
  368. * @param $mall_id
  369. * @param $rules
  370. * @return array
  371. */
  372. public static function getUpgradeConditionData($obj, $mall_id, $rules)
  373. {
  374. $rule_list = [];
  375. $is_buy_goods = 0;
  376. $source_list = [];
  377. $key_arr = [];
  378. $checkbox_list = [];
  379. foreach ($rules as $k => $item) {
  380. if(!$item) continue;
  381. if ($item['type'] == 'buy_goods') {
  382. $is_buy_goods = 1;
  383. continue;
  384. }
  385. $rule_list[] = $item;
  386. $row = [];
  387. $row['key'] = $item['id'];
  388. foreach ($item['setting'] as $value) {
  389. $row['value'][$value['name']] = '';
  390. if ($value['is_checkbox']) {
  391. $row['value'][$value['name']] = [];
  392. if (!empty($value['default_val'])) {
  393. $row['value'][$value['name']] = $value['default_val'];
  394. }
  395. }
  396. if (!empty($value['source']['class']) && !empty($value['source']['method'])) {
  397. $class = $value['source']['class'];
  398. $method = $value['source']['method'];
  399. $rows = $class::$method(['mall_id' => $mall_id]);
  400. $source_list[$value['source']['key']] = $rows;
  401. if ($value['type'] == 'checkbox') {
  402. $checkbox_list[$value['source']['key']] = $rows;
  403. } else {
  404. $source_list[$value['source']['key']] = $rows;
  405. }
  406. }
  407. }
  408. $key_arr[] = $row;
  409. }
  410. $source_list = json_encode($source_list, JSON_NUMERIC_CHECK);
  411. $checkbox_list = json_encode($checkbox_list, JSON_NUMERIC_CHECK);
  412. $key_arr = json_encode($key_arr, JSON_NUMERIC_CHECK);
  413. $tpl = $obj->renderPartial('@backend/modules/mall/views/upgrade-condition/tpl/tpl.php', ['rules' => $rule_list, 'is_buy_goods' => $is_buy_goods, 'mall_id' => $mall_id]);
  414. $cats = Json::encode(GoodsCate::getTreeCate(GoodsCate::lists([
  415. 'where' => [
  416. ['mall_id' => $mall_id],
  417. ['status' => StatusEnum::ENABLED]
  418. ],
  419. 'select'=> 'id, name, parent_id'
  420. ])));
  421. return ['tpl' => $tpl, 'source_list' => $source_list, 'key_arr' => $key_arr, 'cat_list' => $cats, 'checkbox_list' => $checkbox_list];
  422. }
  423. /**
  424. * @desc:校验
  425. * @Author: hua
  426. * @Date: 2021/10/19
  427. * @Time: 14:26
  428. * @Copyright: copyright (c) 2021 广东七件事集团
  429. * @param $user_id
  430. * @param $agent_level_arr
  431. * @return bool
  432. */
  433. public static function check($user_id, $agent_level_arr,$order_id = 0, $mall_id = 0)
  434. {
  435. if (empty($agent_level_arr['condition_type'])) return false;
  436. $condition_type = $agent_level_arr['condition_type'];
  437. $keys_arr = json_decode($agent_level_arr['checked_condition_keys'], true);
  438. $values_arr = json_decode($agent_level_arr['checked_condition_values'], true);
  439. if(empty($values_arr)) return false;
  440. $arr = [];//升级条件
  441. foreach ($values_arr as $K => $v) {
  442. $arr[$v['key']] = $v;
  443. }
  444. $is_return = false;
  445. sort($keys_arr);
  446. foreach ($keys_arr as $id) {
  447. $function = 'condition' . $id;
  448. $params['condition_data'] = self::$data;
  449. $params['user_id'] = $user_id;
  450. $params['arr'] = $arr;
  451. $params['key'] = $id;
  452. $params['children_id_arr1'] = [];
  453. $params['children_id_arr2'] = [];
  454. $params['user_id_arr'] = [];
  455. $params['children_id_arr'] = [];
  456. $params['name1'] = '';
  457. $params['name2'] = '';
  458. $params['mall_id'] = $mall_id;
  459. $params['model_class'] = '';
  460. $params['order_id'] = $order_id;
  461. if (!method_exists(self::class, $function)) continue;
  462. $is_bool = self::$function($params);
  463. //满足其一
  464. if ($condition_type == 1) {
  465. if ($is_bool) {
  466. $is_return = true;
  467. break;
  468. } else {
  469. $is_return = false;
  470. }
  471. }
  472. //满足所有
  473. if ($condition_type == 2) {
  474. if ($is_bool) {
  475. $is_return = true;
  476. } else {
  477. $is_return = false;
  478. break;
  479. }
  480. }
  481. }
  482. return $is_return;
  483. }
  484. /**
  485. * @desc:购买商品升级
  486. * @Author: hua
  487. * @Date: 2021/10/19
  488. * @Time: 14:51
  489. * @Copyright: copyright (c) 2021 广东七件事集团
  490. * @param $user_id
  491. * @param $goods_type
  492. * @param $buy_goods_id
  493. * @param $goods_id_arr
  494. * @return bool
  495. */
  496. public static function buyGoods($goods_type, $buy_goods_id, $goods_id_arr)
  497. {
  498. //任意商品
  499. if ($goods_type == 1) return true;
  500. //购买指定商品
  501. if ($goods_type == 2) if (array_intersect($buy_goods_id, $goods_id_arr)) return true;
  502. return false;
  503. }
  504. /**
  505. * @desc:条件9
  506. * 直推客户消费满____元的人数满____个,间推客户消费满____元的人数满____个
  507. * @Author: hua
  508. * @Date: 2021/10/23
  509. * @Time: 11:37
  510. * @Copyright: copyright (c) 2021 广东七件事集团
  511. * @param $params
  512. * @return bool
  513. */
  514. private static function condition9($params)
  515. {
  516. $children_id_arr1 = UserPartitionRelationship::getChildIdArr($params['user_id'], 1);
  517. $children_id_arr2 = UserPartitionRelationship::getChildIdArr($params['user_id'], 2);
  518. return self::upgrade9(
  519. $params['condition_data'][$params['key']]['setting'][0]['name'],
  520. $params['condition_data'][$params['key']]['setting'][1]['name'],
  521. $params['condition_data'][$params['key']]['setting'][2]['name'],
  522. $params['condition_data'][$params['key']]['setting'][3]['name'],
  523. $children_id_arr1,
  524. $children_id_arr2, $params['arr'], $params['key']);
  525. }
  526. /**
  527. * @desc:条件10
  528. * 直推____人,并且直推中购买商品ID____的人数____个
  529. * @Author: hua
  530. * @Date: 2021/10/23
  531. * @Time: 11:37
  532. * @Copyright: copyright (c) 2021 广东七件事集团
  533. * @param $params
  534. * @return bool
  535. */
  536. private static function condition10($params)
  537. {
  538. $children_id_arr1 = UserPartitionRelationship::getChildIdArr($params['user_id'], 1);
  539. return self::upgrade10(
  540. $params['condition_data'][$params['key']]['setting'][0]['name'],
  541. $params['condition_data'][$params['key']]['setting'][1]['name'],
  542. $params['condition_data'][$params['key']]['setting'][2]['name'],
  543. $children_id_arr1,
  544. $params['arr'], $params['key']);
  545. }
  546. /**
  547. * @desc:条件11
  548. * 个人业绩____元,所有下级业绩____元
  549. * @Author: hua
  550. * @Date: 2021/10/23
  551. * @Time: 14:16
  552. * @Copyright: copyright (c) 2021 广东七件事集团
  553. * @param $params
  554. * @return bool
  555. */
  556. private static function condition11($params)
  557. {
  558. return self::upgrade11(
  559. $params['condition_data'][$params['key']]['setting'][0]['name'],
  560. $params['condition_data'][$params['key']]['setting'][1]['name'],
  561. $params['user_id'],
  562. $params['arr'],
  563. $params['key']
  564. );
  565. }
  566. /**
  567. * @desc:条件12
  568. * 间推客户数量____个,间推客户订单金额____元
  569. * @Author: hua
  570. * @Date: 2021/10/23
  571. * @Time: 14:16
  572. * @Copyright: copyright (c) 2021 广东七件事集团
  573. * @param $params
  574. * @return bool
  575. */
  576. private static function condition12($params)
  577. {
  578. $user_id_arr = UserPartitionRelationship::getChildIdArr($params['user_id'], 2);
  579. return self:: upgrade12(
  580. $params['condition_data'][$params['key']]['setting'][0]['name'],
  581. $params['condition_data'][$params['key']]['setting'][1]['name'],
  582. $user_id_arr,
  583. $params['arr'],
  584. $params['key']
  585. );
  586. }
  587. /**
  588. * @desc:条件18
  589. * 直推股东等级____数量____个
  590. * @Author: hua
  591. * @Date: 2021/10/23
  592. * @Time: 14:16
  593. * @Copyright: copyright (c) 2021 广东七件事集团
  594. * @param $params
  595. * @return bool
  596. */
  597. private static function condition18($params)
  598. {
  599. $user_id_arr = UserPartitionRelationship::getChildIdArr($params['user_id'], 1);
  600. return self::upgrade14(
  601. $params['condition_data'][$params['key']]['setting'][0]['name'],
  602. $params['condition_data'][$params['key']]['setting'][1]['name'],
  603. 'addons\Boss\common\models\AddonsBoss',
  604. $user_id_arr,
  605. $params['arr'],
  606. $params['key']
  607. );
  608. }
  609. /**
  610. * @desc:条件19
  611. * 间推股东等级____数量____个
  612. * @Author: hua
  613. * @Date: 2021/10/23
  614. * @Time: 14:16
  615. * @Copyright: copyright (c) 2021 广东七件事集团
  616. * @param $params
  617. * @return bool
  618. */
  619. private static function condition19($params)
  620. {
  621. $user_id_arr = UserPartitionRelationship::getChildIdArr($params['user_id'], 2);
  622. return self::upgrade14(
  623. $params['condition_data'][$params['key']]['setting'][0]['name'],
  624. $params['condition_data'][$params['key']]['setting'][1]['name'],
  625. 'addons\Boss\common\models\AddonsBoss',
  626. $user_id_arr,
  627. $params['arr'],
  628. $params['key']
  629. );
  630. }
  631. /**
  632. * @desc:条件20
  633. * 团队股东等级____数量____个
  634. * @Author: hua
  635. * @Date: 2021/10/23
  636. * @Time: 14:16
  637. * @Copyright: copyright (c) 2021 广东七件事集团
  638. * @param $params
  639. * @return bool
  640. */
  641. private static function condition20($params)
  642. {
  643. return self::upgrade15(
  644. $params['condition_data'][$params['key']]['setting'][0]['name'],
  645. $params['condition_data'][$params['key']]['setting'][1]['name'],
  646. 'addons\Boss\common\models\AddonsBoss',
  647. $params['user_id'],
  648. $params['arr'],
  649. $params['key']
  650. );
  651. }
  652. /**
  653. * @desc:条件21
  654. * 直推客户消费满____元
  655. * @Author: hua
  656. * @Date: 2021/10/23
  657. * @Time: 15:03
  658. * @Copyright: copyright (c) 2021 广东七件事集团
  659. * @param $params
  660. * @return bool
  661. */
  662. private static function condition21($params)
  663. {
  664. $user_id_arr = UserPartitionRelationship::getChildIdArr($params['user_id'], 1);
  665. return self::upgrade21(
  666. $params['condition_data'][$params['key']]['setting'][0]['name'],
  667. $user_id_arr, $params['arr'],
  668. $params['key']);
  669. }
  670. /**
  671. * @desc:条件22
  672. * 本人购买指定商品____ 所需购买____件
  673. * @Author: lun
  674. * @DateTime: 2022/9/12 0012 17:07
  675. * @Copyright: copyright (c) 2021 广东七件事集团
  676. * @param $params
  677. * @return bool
  678. */
  679. public static function condition22($params)
  680. {
  681. $goods_ids = explode(',', $params['arr'][$params['key']]['value']['goods_ids']);// 商品ids
  682. $buy_num = Json::decode($params['arr'][$params['key']]['value']['buy_num']) ?? 0;// 购买数量
  683. if (empty($goods_ids)) return false;
  684. // 查询当前用户购商品数量
  685. $user_buy_num = BossGoodsStatistics::find()->where(['user_id' => $params['user_id'], 'goods_id' => $goods_ids, 'status' => StatusEnum::ENABLED])->sum('buy_num') ?? 0;
  686. return $user_buy_num >= $buy_num ? true : false;
  687. }
  688. /**
  689. * @desc:条件23
  690. * 在____天内,直推____人每人购买商品ID____ 所需购买____件
  691. * @Author: lun
  692. * @DateTime: 2022/9/12 0012 17:54
  693. * @Copyright: copyright (c) 2021 广东七件事集团
  694. * @param $params
  695. * @return bool
  696. */
  697. public static function condition23($params)
  698. {
  699. $day = $params['arr'][$params['key']]['value']['day'] ?? 0;// 天数
  700. $direct_num = $params['arr'][$params['key']]['value']['direct_num'] ?? 0;// 直推数量
  701. $goods_ids = explode(',', $params['arr'][$params['key']]['value']['goods_ids']);// 商品ids
  702. $buy_num = $params['arr'][$params['key']]['value']['order_num'] ?? 0;// 购买数量
  703. if (empty($goods_ids)) return false;
  704. // 获取用户N天前的日期
  705. $before_day = date('Ymd', strtotime("-{$day} day"));
  706. // 获取当前用户的直推用户id
  707. $direct_uids = User::find()->select('id')->where(['parent_id' => $params['user_id'], 'status' => StatusEnum::ENABLED])->column();
  708. if (count($direct_uids) < $direct_num) return false;
  709. // 查询当前用户购商品数量
  710. $buy_num_arr = BossGoodsStatistics::find()->select("user_id,sum(buy_num) user_buy_num")
  711. ->where(['user_id' => $direct_uids, 'goods_id' => $goods_ids, 'status' => StatusEnum::ENABLED])
  712. ->andWhere(['>', 'date', $before_day])
  713. ->groupBy('user_id')
  714. ->asArray()->all();
  715. if (count($buy_num_arr) < $direct_num) return false;// 直推购买人数不够退出
  716. $temp_buy_num = 0;
  717. foreach ($buy_num_arr as $user_id => $item) {
  718. // 购买的商品个数大于设置个数直接
  719. if ($item['user_buy_num'] >= $buy_num) $temp_buy_num++;
  720. }
  721. return $temp_buy_num >= $direct_num ? true : false;
  722. }
  723. /**
  724. * 当前用户下单笔数与下单金额
  725. * @param $params
  726. * @return bool
  727. */
  728. private static function condition55($params)
  729. {
  730. $user_id = $params['user_id'];
  731. // 积分是否不累计
  732. $scoreSettingStr = Yii::$app->services->setting->mall->get($params['mall_id'], 'pay.score');
  733. $isNotCumulative = !empty(json_decode($scoreSettingStr, true)['is_not_cumulative']);
  734. $orderQuery = Order::find()
  735. ->where(['user_id' => $user_id, 'pay_status' => StatusEnum::ENABLED])
  736. ->andWhere(['mch_id' => StatusEnum::DISABLED, 'store_id' => StatusEnum::DISABLED]);
  737. if (!empty($isNotCumulative)) {
  738. // 如果开启积分支付不计入
  739. $orderQuery->andWhere(['<>', 'payment_type', PayTypeEnum::SCORE]);
  740. }
  741. $orderList = $orderQuery->select('pay_money')->asArray()->all();
  742. if (empty($orderList)) return false; // 订单为空直接返回false
  743. // 计算订单金额
  744. $orderMoneySum = array_sum(array_column($orderList, 'pay_money'));
  745. $order_cnt_name = $params['condition_data'][$params['key']]['setting'][0]['name'];
  746. $order_amount_name = $params['condition_data'][$params['key']]['setting'][1]['name'];
  747. $arr = $params['arr'];
  748. $key = $params['key'];
  749. return count($orderList) >= $arr[$key]['value'][$order_cnt_name] && $orderMoneySum >= $arr[$key]['value'][$order_amount_name];
  750. }
  751. /**
  752. * @desc: 条件56
  753. * 备注:因为新需求根据用户选择条件进行订单查询
  754. * 个人订单满____笔,个人订单满____元 (1 平台 2 多商户 3 门店) 备注:括号中为多选。按插件订单进行数据查询
  755. * @param $params
  756. * @return bool
  757. */
  758. public static function condition56($params)
  759. {
  760. $user_id = $params['user_id'];
  761. // 获取积分支付配置
  762. $scorePaySetting = Yii::$app->services->setting->mall->get($params['mall_id'], 'pay.score');
  763. $scorePaySetting = !empty($scorePaySetting) ? json_decode($scorePaySetting, true) : [];
  764. $orderQuery = Order::find()
  765. ->where(['user_id' => $user_id, 'pay_status' => StatusEnum::ENABLED, 'mall_id' => $params['mall_id']]);
  766. if (!empty($scorePaySetting) && !empty($scorePaySetting['is_not_cumulative'])) {
  767. // 如果开启积分支付不计入
  768. $orderQuery->andWhere(['<>', 'payment_type', PayTypeEnum::SCORE]);
  769. }
  770. // 获取勾选订单插件
  771. $checkboxKey = $params['condition_data'][$params['key']]['setting'][2]['name'];
  772. $checkboxList = $params['arr'][$params['key']]['value'][$checkboxKey];
  773. if (!empty($checkboxList)) { // 判断是否勾选
  774. // 判断是否勾选平台
  775. if (!in_array(1, $checkboxList)) {
  776. $orderQuery->andWhere(['>', 'mch_id', 0]);
  777. }
  778. if (!in_array(2, $checkboxList)) { // 没有勾选多商户
  779. $orderQuery->andWhere(['mch_id' => 0]);
  780. }
  781. if (!in_array(3, $checkboxList)) { // 没有勾选门店
  782. $orderQuery->andWhere(['store_id' => 0]);
  783. }
  784. }
  785. $orderList = $orderQuery->select('pay_money')->asArray()->all();
  786. if (empty($orderList)) return false; // 订单为空直接返回false
  787. // 计算订单金额
  788. $orderMoneySum = array_sum(array_column($orderList, 'pay_money'));
  789. // 获取设置的订单数量和金额
  790. $systemCountKey = $params['condition_data'][$params['key']]['setting'][0]['name'];
  791. $systemCount = $params['arr'][$params['key']]['value'][$systemCountKey];
  792. $systemMoneyKey = $params['condition_data'][$params['key']]['setting'][1]['name'];
  793. $systemMoney = $params['arr'][$params['key']]['value'][$systemMoneyKey];
  794. return count($orderList) >= $systemCount && $orderMoneySum >= $systemMoney;
  795. }
  796. /**
  797. * 链一二号市场总业绩达xx元,且单个市场业绩达xxx元
  798. * @param $params
  799. * @return bool
  800. */
  801. private static function condition61($params)
  802. {
  803. $user_id = $params['user_id'];
  804. $user = User::findOne(['id' => $user_id]);
  805. $mall_id = $user->mall_id;
  806. if (!MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_ZAO_DOUBLE_COPY)) return false;
  807. $total_achievement = $params['condition_data'][$params['key']]['setting'][0]['name'];
  808. $single_market = $params['condition_data'][$params['key']]['setting'][1]['name'];
  809. $arr = $params['arr'];
  810. $key = $params['key'];
  811. $total_achievement = $arr[$key]['value'][$total_achievement];
  812. $single_market = $arr[$key]['value'][$single_market];
  813. $is_bool = false;
  814. $team = ZaoDoubleCopyUser::find()->select('achievement')->where(['pid' => $user_id])->andWhere(['<=', 'pos', 2])->asArray()->all();
  815. $achievement = 0;
  816. $is_single = true;
  817. foreach ($team as $info) {
  818. // 判断单个市场是否及格
  819. if ($info['achievement'] < $single_market) {
  820. $is_single = false;
  821. break;
  822. }
  823. $achievement += $info['achievement'];
  824. }
  825. if ($is_single && $achievement >= $total_achievement) {
  826. $is_bool = true;
  827. }
  828. return $is_bool;
  829. }
  830. /**
  831. * 链一二号市场购买链动商品订单数达xx件,且单个市场订单数达xx件
  832. * @param $params
  833. * @return bool
  834. */
  835. private static function condition62($params)
  836. {
  837. $user_id = $params['user_id'];
  838. $user = User::findOne(['id' => $user_id]);
  839. $mall_id = $user->mall_id;
  840. if (!MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_ZAO_DOUBLE_COPY)) return false;
  841. $total_order_num = $params['condition_data'][$params['key']]['setting'][0]['name'];
  842. $single_market_num = $params['condition_data'][$params['key']]['setting'][1]['name'];
  843. $arr = $params['arr'];
  844. $key = $params['key'];
  845. $total_order_num = $arr[$key]['value'][$total_order_num];
  846. $single_market_num = $arr[$key]['value'][$single_market_num];
  847. $is_bool = false;
  848. $team = ZaoDoubleCopyUser::find()->select('user_id')->where(['pid' => $user_id])->andWhere(['<=', 'pos', 2])->asArray()->all();
  849. $total_num = 0;
  850. $is_single = true;
  851. foreach ($team as $info) {
  852. //获取用户下级购买订单数量
  853. $copy_user_id = $info['user_id'];
  854. $relation_arr = UserPartitionRelationship::getChildIdArrOrderBy($copy_user_id);
  855. array_push($relation_arr, $copy_user_id);
  856. $order_num = ZaoDoubleCopyAchievement::find()->where(['buy_user_id' => $relation_arr,'status' => StatusEnum::ENABLED])->groupBy('order_id')->count();
  857. if($order_num < $single_market_num){
  858. $is_single = false;
  859. break;
  860. }
  861. $total_num += $order_num;
  862. }
  863. if ($is_single && $total_num >= $total_order_num) {
  864. $is_bool = true;
  865. }
  866. return $is_bool;
  867. }
  868. /**
  869. * 链动团队除最大市场外(即业绩最高市场)的团队小市场业绩总和达(不含复购链动商品)元
  870. * @param $params
  871. * @return bool
  872. */
  873. private static function condition63($params)
  874. {
  875. $user_id = $params['user_id'];
  876. $user = User::findOne(['id' => $user_id]);
  877. $mall_id = $user->mall_id;
  878. if (!MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_ZAO_DOUBLE_COPY)) return false;
  879. $total_achievement = $params['condition_data'][$params['key']]['setting'][0]['name'];
  880. $arr = $params['arr'];
  881. $key = $params['key'];
  882. $total_achievement = $arr[$key]['value'][$total_achievement];
  883. $is_bool = false;
  884. $team = ZaoDoubleCopyUser::find()->select('achievement')->where(['pid' => $user_id])->asArray()->all();
  885. $achievement_arr = array_column($team,'achievement');
  886. if(empty($achievement_arr)) return $is_bool;
  887. $max = max($achievement_arr);
  888. $total = array_sum($achievement_arr);
  889. $diff = bcsub($total,$max,2);
  890. if ($diff >= $total_achievement) {
  891. $is_bool = true;
  892. }
  893. return $is_bool;
  894. }
  895. /**
  896. * @desc:条件64
  897. * 团队总业绩____达到____元,业绩最高的前____个部门,每个部门的业绩不能低于____元
  898. * @Author: hua
  899. * @Date: 2021/10/23
  900. * @Time: 14:16
  901. * @Copyright: copyright (c) 2021 广东七件事集团
  902. * @param $params
  903. * @return bool
  904. */
  905. private static function condition64($params)
  906. {
  907. return self::upgrade64(
  908. $params['condition_data'][$params['key']]['setting'][0]['name'],
  909. $params['condition_data'][$params['key']]['setting'][1]['name'],
  910. $params['condition_data'][$params['key']]['setting'][2]['name'],
  911. $params['condition_data'][$params['key']]['setting'][3]['name'],
  912. $params['user_id'],
  913. $params['arr'],
  914. $params['key']
  915. );
  916. }
  917. /**
  918. * @desc:条件65
  919. * 直推___人,当中___人团队订单大于等于___单,团队总订单___单
  920. * @Author: hua
  921. * @Date: 2021/10/23
  922. * @Time: 14:16
  923. * @Copyright: copyright (c) 2021 广东七件事集团
  924. * @param $params
  925. * @return bool
  926. */
  927. private static function condition65($params)
  928. {
  929. $team_achievement_name = $params['condition_data'][$params['key']]['setting'][0]['name'];
  930. $team_achievement_people_num_name = $params['condition_data'][$params['key']]['setting'][1]['name'];
  931. $team_achievement_order_num_name = $params['condition_data'][$params['key']]['setting'][2]['name'];
  932. $team_total_order_num_name = $params['condition_data'][$params['key']]['setting'][3]['name'];
  933. $team_goods_cats_name = $params['condition_data'][$params['key']]['setting'][4]['name'];
  934. $arr = $params['arr'];
  935. $key = $params['key'];
  936. $team_achievement_value = $arr[$key]['value'][$team_achievement_name] ?? 0;
  937. $team_achievement_people_num_value = $arr[$key]['value'][$team_achievement_people_num_name] ?? 0;
  938. $team_achievement_order_num_value = $arr[$key]['value'][$team_achievement_order_num_name] ?? 0;
  939. $team_total_order_num_value = $arr[$key]['value'][$team_total_order_num_name] ?? 0;
  940. $team_goods_cats_value = !empty($arr[$key]['value'][$team_goods_cats_name]) ? Json::decode($arr[$key]['value'][$team_goods_cats_name]) : [];
  941. // 好友人数
  942. $team_achievement = User::find()->where(['parent_id' => $params['user_id']])
  943. ->andWhere(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])->select('id')->column();
  944. if (count($team_achievement) < $team_achievement_value) {
  945. return false;
  946. }
  947. // 取出商品ID
  948. $cat_ids = [];
  949. $goods_ids = [];
  950. $cat_goods_ids = [];
  951. if (!empty($team_goods_cats_value)) {
  952. foreach ($team_goods_cats_value as $cat) {
  953. $cat_ids[] = array_pop($cat);
  954. }
  955. foreach ($cat_ids as $cat_id) {
  956. $goods_ids = GoodsCateRelate::find()->where(['cate_id' => $cat_id])->select('goods_id')->column();
  957. $cat_goods_ids[$cat_id] = $goods_ids;
  958. }
  959. $goods_ids = array_unique($goods_ids);
  960. }
  961. // 必须N个团队N笔订单
  962. // 取出指定类目团队下单笔数
  963. $o_cnt_arr = [];
  964. $o_cnt_total = 0;
  965. $cat_goods_arr = [];
  966. foreach ($team_achievement as $user_id) {
  967. $child_user_ids = UserPartitionRelationship::getChildIdArr($user_id);
  968. $child_user_ids[] = $user_id;
  969. $o_cnt = 0;
  970. foreach ($child_user_ids as $item_user_id) {
  971. $order_list = OrderDetail::lists([
  972. 'where' => [
  973. ['user_id' => $item_user_id],
  974. ['goods_id'=> $goods_ids],
  975. ['order_status' =>
  976. [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING,
  977. OrderStatusEnum::ACCOMPLISH, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH]
  978. ],
  979. ],
  980. 'select'=> 'order_id, goods_id',
  981. // 'index' => 'goods_id'
  982. ]);
  983. if (!empty($order_list)) {
  984. foreach ($order_list as $value) {
  985. foreach ($cat_goods_ids as $cid => $cat_goods) {
  986. if (in_array($value['goods_id'], $cat_goods) && empty($cat_goods_arr["{$user_id}_{$item_user_id}_{$cid}"])) {
  987. $o_cnt_total += 1;
  988. $o_cnt += 1;
  989. $cat_goods_arr["{$user_id}_{$item_user_id}_{$cid}"] = 1;
  990. }
  991. }
  992. }
  993. }
  994. // $o_cnt_total += count($order_list);
  995. // $o_cnt += count($order_list);
  996. // $o_cnt += count(array_column($order_list, 'order_id', 'goods_id'));
  997. }
  998. if ($o_cnt >= $team_achievement_order_num_value) { // 只有当当前团队总订单数量符合条件才能放入团队订单栈中
  999. $o_cnt_arr[] = StatusEnum::ENABLED;
  1000. }
  1001. }
  1002. // 判断团队下单数量
  1003. if (count($o_cnt_arr) < $team_achievement_people_num_value) return false;
  1004. // 取出当前用户的订单
  1005. $order_list = OrderDetail::lists([
  1006. 'where' => [
  1007. ['user_id' => $params['user_id']],
  1008. ['goods_id'=> $goods_ids],
  1009. ['order_status' =>
  1010. [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING,
  1011. OrderStatusEnum::ACCOMPLISH, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH]
  1012. ],
  1013. ],
  1014. 'select'=> 'order_id, goods_id',
  1015. // 'index' => 'goods_id'
  1016. ]);
  1017. if (!empty($order_list)) {
  1018. foreach ($order_list as $value) {
  1019. foreach ($cat_goods_ids as $cid => $cat_goods) {
  1020. if (in_array($value['goods_id'], $cat_goods) && empty($cat_goods_arr["{$params['user_id']}_{$cid}"])) {
  1021. $o_cnt_total += 1;
  1022. $cat_goods_arr["{$params['user_id']}_{$cid}"] = 1;
  1023. }
  1024. }
  1025. }
  1026. }
  1027. // 校验当前团队所有订单数量
  1028. return $o_cnt_total >= $team_total_order_num_value;
  1029. }
  1030. /**
  1031. * ____等级,直推____等级数量____个,同时直推业绩____元
  1032. */
  1033. private static function condition73($params)
  1034. {
  1035. $cond = $params['arr'][$params['key']];
  1036. $user_level = $cond['value']['user_level'];
  1037. $child_level = $cond['value']['child_level'];
  1038. $rec_num = $cond['value']['rec_num'];
  1039. $direct_performance = $cond['value']['direct_performance'];
  1040. $user_id = $params['user_id'];
  1041. $current_user_level = AddonsBoss::find()->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED])->select('level')->scalar() ?? 0;
  1042. if($current_user_level < $user_level) {
  1043. return false;
  1044. }
  1045. $direct_child_ids = UserPartitionRelationship::getChildIdArr($user_id, 1);
  1046. $user_child_list = AddonsBoss::find()->where(['and', ['user_id' => $direct_child_ids], ['status' => StatusEnum::ENABLED]])->andWhere(['>=', 'level', $child_level])->select('user_id')->asArray()->all() ?? [];
  1047. if(count($user_child_list) < $rec_num){
  1048. return false;
  1049. }
  1050. $order_performance = Order::find()->where(['and', ['user_id' => array_column($user_child_list, 'user_id')], ['order_status' => OrderStatusEnum::ACCOMPLISH]])
  1051. ->sum('pay_money') ?? 0;
  1052. if($order_performance < $direct_performance){
  1053. return false;
  1054. }
  1055. return true;
  1056. }
  1057. public static function upgrade9($name1, $name2, $name3, $name4, $children_id_arr1, $children_id_arr2, $arr, $key)
  1058. {
  1059. $is_bool = false;
  1060. $num1 = self::consumeNum($arr, $key, $name1, $children_id_arr1);//直推会员消费满多少元的累计人数
  1061. if ($num1 >= $arr[$key]['value'][$name2]) {
  1062. $num2 = self::consumeNum($arr, $key, $name3, $children_id_arr2);//间推会员消费满多少元的累计人数
  1063. if ($num2 >= $arr[$key]['value'][$name4]) $is_bool = true;
  1064. }
  1065. return $is_bool;
  1066. }
  1067. public static function upgrade10($name1, $name2, $name3, $children_id_arr1, $arr, $key)
  1068. {
  1069. $is_bool = false;
  1070. $num = count($children_id_arr1);//直推会员人数
  1071. if ($num >= $arr[$key]['value'][$name1]) {
  1072. $goods_id = $arr[$key]['value'][$name2];
  1073. $direct_user_buy_goods_id_num = $arr[$key]['value'][$name3];
  1074. $where = ['user_id' => $children_id_arr1, 'goods_id' => $goods_id,
  1075. 'order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH]];
  1076. $list = OrderDetail::find()->where($where)
  1077. ->groupBy('user_id')
  1078. ->select('user_id,count("user_id") as counts')
  1079. ->all();
  1080. $count = count($list);
  1081. if ($count >= $direct_user_buy_goods_id_num) $is_bool = true;
  1082. }
  1083. return $is_bool;
  1084. }
  1085. public static function upgrade11($name1, $name2, $user_id, $arr, $key)
  1086. {
  1087. $is_bool = false;
  1088. list($personal_counts, $personal_achievement) = self::getOrderData($user_id);//个人业绩
  1089. if ($personal_achievement >= $arr[$key]['value'][$name1]) {
  1090. $offset = 1;
  1091. $limit = 1000;
  1092. $params['select'] = 'user_id';
  1093. $total_subordinates_achievement = 0;//所有下级业绩
  1094. self::batchFunc($params,$user_id,$offset,$limit,function ($user_id_arr){
  1095. $query = Order::find()->where(['user_id' => $user_id_arr, 'pay_status' => 1]);
  1096. return $query->sum('pay_money');
  1097. },$total_subordinates_achievement);
  1098. if ($total_subordinates_achievement >= $arr[$key]['value'][$name2]) $is_bool = true;
  1099. }
  1100. return $is_bool;
  1101. }
  1102. public static function upgrade12($name1, $name2, $user_id_arr, $arr, $key)
  1103. {
  1104. $is_bool = false;
  1105. $num = count($user_id_arr);//间推会员人数
  1106. if ($num >= $arr[$key]['value'][$name1]) {
  1107. list($indirect_user_order, $indirect_user_order_price) = self::getOrderData($user_id_arr);//间推客户的订单金额
  1108. if ($indirect_user_order_price >= $arr[$key]['value'][$name2]) $is_bool = true;
  1109. }
  1110. return $is_bool;
  1111. }
  1112. public static function upgrade14($name1, $name2, $model_class, $user_id_arr, $arr, $key)
  1113. {
  1114. $is_bool = false;
  1115. $level = $arr[$key]['value'][$name1];
  1116. $counts = $model_class::find()->where(['user_id' => $user_id_arr,'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  1117. ->andWhere(['>=','level',$level])
  1118. ->count();
  1119. if ($counts >= $arr[$key]['value'][$name2]) $is_bool = true;
  1120. return $is_bool;
  1121. }
  1122. public static function upgrade15($name1, $name2, $model_class, $user_id, $arr, $key)
  1123. {
  1124. $is_bool = false;
  1125. $level = $arr[$key]['value'][$name1];
  1126. $offset = 1;
  1127. $limit = 1000;
  1128. $total_counts = 0;
  1129. $params['select'] = 'user_id';
  1130. self::batchFunc($params,$user_id,$offset,$limit,function ($user_id_arr)use($model_class,$level){
  1131. return $model_class::find()->where(['user_id' => $user_id_arr,'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  1132. ->andWhere(['>=','level',$level])
  1133. ->count();
  1134. },$total_counts);
  1135. if ($total_counts >= $arr[$key]['value'][$name2]) $is_bool = true;
  1136. return $is_bool;
  1137. }
  1138. public static function upgrade21($name1, $user_id_arr, $arr, $key)
  1139. {
  1140. $is_bool = false;
  1141. list($order_num, $pay_money) = self::getOrderData($user_id_arr);//消费
  1142. if ($pay_money >= $arr[$key]['value'][$name1]) $is_bool = true;
  1143. return $is_bool;
  1144. }
  1145. public static function upgrade64($name1, $name2,$name3, $name4, $user_id, $arr, $key)
  1146. {
  1147. $is_bool = false;
  1148. //个人业绩
  1149. $personal_achievement = 0;
  1150. if($arr[$key]['value'][$name1] == 0){
  1151. $personal_achievement = Order::find()->where(['user_id' => $user_id, 'pay_status' => 1])->sum('pay_money') ?? 0;
  1152. }
  1153. $achievement_arr = [];
  1154. $children_id_arr1 = UserPartitionRelationship::getChildIdArr($user_id, 1);
  1155. foreach($children_id_arr1 as $children_user_id){
  1156. $offset = 1;
  1157. $limit = 1000;
  1158. $params['select'] = 'user_id';
  1159. $total_subordinates_achievement = 0;//所有下级业绩
  1160. self::batchFunc($params,$children_user_id,$offset,$limit,function ($user_id_arr) use ($children_user_id){
  1161. $user_id_arr[] = $children_user_id;
  1162. $query = Order::find()->where(['user_id' => $user_id_arr, 'pay_status' => 1]);
  1163. return $query->sum('pay_money');
  1164. },$total_subordinates_achievement);
  1165. $children_personal_achievement = Order::find()->where(['user_id' => $children_user_id, 'pay_status' => 1])->sum('pay_money') ?? 0;
  1166. $total_subordinates_achievement += $children_personal_achievement;
  1167. $achievement_arr[] = $total_subordinates_achievement;
  1168. }
  1169. if($arr[$key]['value'][$name2] > $personal_achievement + array_sum($achievement_arr)) return $is_bool;
  1170. if($arr[$key]['value'][$name3] > count($achievement_arr)) return $is_bool;
  1171. rsort($achievement_arr);
  1172. if(!empty($arr[$key]['value'][$name4]) && $arr[$key]['value'][$name4] > $achievement_arr[$arr[$key]['value'][$name3]-1]) return $is_bool;
  1173. $is_bool = true;
  1174. return $is_bool;
  1175. }
  1176. /**
  1177. * @desc:条件120
  1178. * 个人业绩____元
  1179. * @Author: hua
  1180. * @Date: 2021/10/23
  1181. * @Time: 14:16
  1182. * @Copyright: copyright (c) 2021 广东七件事集团
  1183. * @param $params
  1184. * @return bool
  1185. */
  1186. protected static function condition121($params)
  1187. {
  1188. return static::upgrade121(
  1189. $params['condition_data'][$params['key']]['setting'][0]['name'],
  1190. $params['condition_data'][$params['key']]['setting'][1]['name'],
  1191. $params['user_id'],
  1192. $params['arr'],
  1193. $params['key'],
  1194. $params['mall_id']
  1195. );
  1196. }
  1197. /**
  1198. * 条件120查询
  1199. *
  1200. * @param string $name1
  1201. * @param string $name2
  1202. * @param int $user_id
  1203. * @param array $arr
  1204. * @param int $key
  1205. * @param int $mall_id
  1206. * @return boolean
  1207. */
  1208. public static function upgrade121($name1, $name2, $user_id, $arr, $key, $mall_id)
  1209. {
  1210. // 结算方式
  1211. $compute_type = \Yii::$app->services->setting->mall->get($mall_id, 'upgrade_condition.compute_type');
  1212. $field = 'id,mall_id,user_id';
  1213. if (empty($compute_type)) $compute_type = 1;
  1214. if ($compute_type == 1) {
  1215. $field .= ',pay_money as personal_achievement';
  1216. } else {
  1217. $field .= ',finish_order_money as personal_achievement';
  1218. }
  1219. $personal_data = UserStatisticsTotal::find()->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED])->select($field)->asArray()->one();
  1220. $personal_achievement = $personal_data['personal_achievement'] ?? 0;
  1221. $personal_data_old = UserStatisticsTotalCopy1::find()->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED])->select($field)->asArray()->one();
  1222. $personal_achievement = bcadd($personal_achievement, $personal_data_old['personal_achievement'], 2);
  1223. $is_bool = false;
  1224. // list($personal_counts, $personal_achievement) = static::getOrderData1($user_id, $where); //个人业绩
  1225. if ($personal_achievement >= $arr[$key]['value'][$name1]) {
  1226. // 团队业绩为0则认为达标
  1227. // if (!isset($arr[$key]['value'][$name2]) || $arr[$key]['value'][$name2] <= 0) {
  1228. // return true;
  1229. // }
  1230. $is_bool = true;
  1231. // $offset = 1;
  1232. // $limit = 1000;
  1233. // $params['select'] = 'user_id';
  1234. // $total_subordinates_achievement = 0; //所有下级业绩
  1235. // static::batchFunc($params, $user_id, $offset, $limit, function ($user_id_arr) use ($where) {
  1236. // $where = array_merge($where, ['user_id' => $user_id_arr]);
  1237. // $query = Order::find()->where($where);
  1238. // return $query->sum('pay_money');
  1239. // }, $total_subordinates_achievement);
  1240. // if ($total_subordinates_achievement >= $arr[$key]['value'][$name2]) {
  1241. // $is_bool = true;
  1242. // }
  1243. }
  1244. return $is_bool;
  1245. }
  1246. /**
  1247. * 个人团队业绩-直推下级最高团队业绩>=N元
  1248. */
  1249. protected static function condition96($params)
  1250. {
  1251. $cond = $params['arr'][$params['key']];
  1252. $money = $cond['value']['money'];
  1253. if ($money <=0 ) {
  1254. return false;
  1255. }
  1256. $self_user_team_order_price_total = 0;
  1257. $user_id = $params['user_id'];
  1258. $user_team_statistics_model = UserTeamStatistics::find()->where(['user_id'=>$user_id])->one();
  1259. $child_ids = UserPartitionRelationship::getChildIdArr($user_id,1);
  1260. if(!empty($user_team_statistics_model)) {
  1261. $self_user_team_order_price_total = $user_team_statistics_model['team_finish_order_price_total'];
  1262. }
  1263. $field = "sum(uts.team_finish_order_price_total+ust.finish_order_money) as total_money";
  1264. $one = \common\models\user\UserTeamStatistics::find()->alias('uts')
  1265. ->leftJoin(UserStatisticsTotal::tableName().' as ust','uts.user_id=ust.user_id')
  1266. ->where(['uts.user_id'=>$child_ids])
  1267. ->select("uts.user_id,{$field}")
  1268. ->orderBy('total_money desc')
  1269. ->groupBy('uts.user_id')
  1270. ->asArray()
  1271. ->one();
  1272. $total_money = $one['total_money']??0;
  1273. $cha = $self_user_team_order_price_total - $total_money;
  1274. return $cha >= $money;
  1275. }
  1276. // 群组(团队包含本人)商品售价业绩(支付完成/订单完成)达到N元
  1277. protected static function condition105($params)
  1278. {
  1279. $user_id = $params['user_id'];
  1280. $cond = $params['arr'][$params['key']];
  1281. $is_when_settlement = $cond['value']['is_when_settlement'] ?? null;
  1282. $money = $cond['value']['money'] ?? null;
  1283. if (!isset($is_when_settlement) || !isset($money)) {
  1284. return false;
  1285. }
  1286. $where = ['user_id' => $user_id];
  1287. // 个人商品售价
  1288. $userTotal = 0;
  1289. $userStatisticsTotalField = [
  1290. 0 => 'finish_selling_price',
  1291. 1 => 'pay_selling_price',
  1292. ];
  1293. if (isset($userStatisticsTotalField[$is_when_settlement])) {
  1294. $userTotal = UserAchievementStatisticsTotal::find()
  1295. ->where($where)
  1296. ->select($userStatisticsTotalField[$is_when_settlement])
  1297. ->scalar() ?: 0;
  1298. }
  1299. // 团队商品售价
  1300. $teamTotal = 0;
  1301. $userTeamStatisticsField = [
  1302. 0 => 'team_finish_selling_price',
  1303. 1 => 'team_pay_selling_price',
  1304. ];
  1305. if (isset($userTeamStatisticsField[$is_when_settlement])) {
  1306. $teamTotal = UserTeamAchievementStatistics::find()
  1307. ->where($where)
  1308. ->select($userTeamStatisticsField[$is_when_settlement])
  1309. ->scalar() ?: 0;
  1310. }
  1311. return ($userTotal + $teamTotal) >= $money;
  1312. }
  1313. /**
  1314. * TODO 后续优化查询
  1315. * @desc:获取订单数据
  1316. * @Author: hua
  1317. * @Date: 2021/10/19
  1318. * @Time: 10:58
  1319. * @Copyright: copyright (c) 2021 广东七件事集团
  1320. * @param $user_ids
  1321. * @return array
  1322. */
  1323. private static function getOrderData($user_ids)
  1324. {
  1325. $query = Order::find()->where(['user_id' => $user_ids, 'pay_status' => 1]);
  1326. $counts = $query->count();
  1327. $sum = $query->sum('pay_money');
  1328. return [$counts ?? 0, $sum ?? 0];
  1329. }
  1330. /**
  1331. * TODO 后续优化查询
  1332. * @desc:分组数据
  1333. * @Author: hua
  1334. * @Date: 2021/10/23
  1335. * @Time: 11:43
  1336. * @Copyright: copyright (c) 2021 广东七件事集团
  1337. * @param $user_ids
  1338. * @return array|\yii\db\ActiveRecord[]
  1339. */
  1340. private static function getOrderDataGroupByUserId($user_ids)
  1341. {
  1342. $query = Order::find()->where(['user_id' => $user_ids, 'pay_status' => 1]);
  1343. $query->select('user_id,sum(pay_money) as pay_money');
  1344. return $query->groupBy('user_id')->all();
  1345. }
  1346. /**
  1347. * @desc:设置升级条件时,处理与之相关的条件
  1348. * @Author: hua
  1349. * @Date: 2021/10/20
  1350. * @Time: 18:17
  1351. * @Copyright: copyright (c) 2021 广东七件事集团
  1352. * @param $checked_condition_keys
  1353. * @param $handle_class
  1354. * @param $mall_id
  1355. */
  1356. public static function clear($checked_condition_keys, $handle_class, $mall_id)
  1357. {
  1358. $list = $handle_class::findAll(['mall_id' => $mall_id]);
  1359. sort($checked_condition_keys);
  1360. $rows = self::$data;
  1361. foreach ($list as $agent) {
  1362. $checked_condition_values = json_decode($agent['checked_condition_values'], true);//升级条件
  1363. $condition_keys = json_decode($agent['checked_condition_keys'], true);
  1364. $checked_condition_values_arr = [];
  1365. if ($checked_condition_values) {
  1366. $condition_values_arr = [];
  1367. foreach ($checked_condition_values as $v) {
  1368. $condition_values_arr[$v['key']] = $v;
  1369. }
  1370. foreach ($checked_condition_keys as $k) {
  1371. if (!empty($condition_values_arr[$k])) {
  1372. if ($condition_values_arr[$k]['type'] != 'buy_goods') $checked_condition_values_arr[] = $condition_values_arr[$k];
  1373. } else {
  1374. //新添加,顺序有关,所以一条条取
  1375. $row = $rows[$k] ?? [];
  1376. if (!empty($row) && $row['type'] != 'buy_goods') {
  1377. $arr = ['key' => $row['id']];
  1378. foreach ($row['setting'] as $set) {
  1379. $arr['value'][$set['name']] = $set['default_val'];
  1380. }
  1381. $checked_condition_values_arr[] = $arr;
  1382. }
  1383. }
  1384. }
  1385. $agent->checked_condition_values = json_encode($checked_condition_values_arr);
  1386. }
  1387. $condition_keys_arr = [];
  1388. if ($condition_keys) {
  1389. foreach ($condition_keys as $k => $value) {
  1390. if (!in_array($value, $checked_condition_keys)) continue;
  1391. $condition_keys_arr[] = $value;
  1392. }
  1393. $agent->checked_condition_keys = json_encode($condition_keys_arr);
  1394. }
  1395. $agent->save();
  1396. }
  1397. }
  1398. protected static function consumeNum($arr, $key, $name, $user_id_arr)
  1399. {
  1400. $list = self::getOrderDataGroupByUserId($user_id_arr);
  1401. $num = 0;
  1402. foreach ($list as $v) {
  1403. if ($v['pay_money'] >= $arr[$key]['value'][$name]) {
  1404. $num++;
  1405. }
  1406. }
  1407. return $num;
  1408. }
  1409. public static function batchFunc($params,$user_id,$offset,$limit,$callback,&$num){
  1410. list($tree, $parent_deep, $all_tree, $all_tree_arr) = UserPartitionRelationship::getTree($user_id);
  1411. while ($list = UserPartitionRelationship::batchGetTeamData($offset,$limit,$tree,$params)){
  1412. $user_id_arr = array_column($list,'user_id');
  1413. $result = call_user_func($callback,$user_id_arr);
  1414. if(empty($result)) $result = 0;
  1415. $num+=$result;
  1416. $offset++;
  1417. }
  1418. }
  1419. //购买指定商品
  1420. public static function buyGoodsUpgrade($mall_id, $order, $user_id, $order_by,$buy_type,$order_status){
  1421. $order_id = $order['id'];
  1422. $user = User::findOne($user_id);
  1423. $params = [];
  1424. $where = [];
  1425. $where[] = ['mall_id' => $mall_id];
  1426. $where[] = ['order_id' => $order_id];
  1427. $where[] = ['user_id' => $user_id];
  1428. $params['where'] = $where;
  1429. $order_detail_list = OrderDetail::lists($params);
  1430. $buy_goods_id_arr = array_column($order_detail_list, 'goods_id');
  1431. $before_level = $user['level'];
  1432. $params = [];
  1433. $where = [];
  1434. $where[] = ['mall_id' => $mall_id];
  1435. $where[] = ['status' => StatusEnum::ENABLED];
  1436. $where[] = ['>', 'level', $user->level];
  1437. $params['where'] = $where;
  1438. $params['order'] = $order_by;
  1439. $params['with'] = ['upgradeCondition'=>function($query){
  1440. $query->where(['status' => StatusEnum::ENABLED]);
  1441. }];
  1442. $user_level_list = UserLevel::lists($params);
  1443. $can_upgrade_level = $upgrade_user_id = 0;
  1444. $flag = false;
  1445. //开启购买升级商品
  1446. if (!empty($user_level_list)) {
  1447. foreach ($user_level_list as $level_arr) {
  1448. $can_upgrade_level = $level_arr['level'];
  1449. //开启购买升级商品
  1450. if ($level_arr['upgradeCondition']['upgrade_type_goods']&&$level_arr['upgradeCondition']['is_auto_upgrade']) {
  1451. $goods_id_arr = json_decode($level_arr['upgradeCondition']['goods_ids'], true);
  1452. $res = UpgradeCondition::buyGoods($level_arr['upgradeCondition']['goods_type'], $buy_goods_id_arr, $goods_id_arr);
  1453. if ($res) {
  1454. //购买升级商品触发升级:0订单完成 1下单完成
  1455. if ($level_arr['upgradeCondition']['buy_goods_type'] == $buy_type&&$order['order_status'] == $order_status) {
  1456. $flag = true;
  1457. break;
  1458. }
  1459. }
  1460. }
  1461. }
  1462. if ($flag) {
  1463. \Yii::$app->services->statistics->global->set($mall_id, ['upgrade_level'=>[$can_upgrade_level=>1]]);
  1464. $user->level = $can_upgrade_level;
  1465. $user->upgrade_level_at = time();
  1466. if (!$user->save()) {
  1467. \Yii::error("{user_id:$user_id}-{order_id:$order_id}" . ',会员升级,失败');
  1468. return false;
  1469. }
  1470. // 触发升级礼包
  1471. if (MallAddons::isInstall($mall_id,AddonsEnum::ADDONS_NAME_UPGRADEGIFT)) {
  1472. $gift['mall_id'] = $mall_id;
  1473. $gift['user_ids'] = $user_id;
  1474. $gift['gift_type'] = GiftEnum::GIFT_TYPE_USER;
  1475. // 事件触发会导致重发发送礼包(原因不明),所以改为直接异步队列处理
  1476. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $gift, UpgradeGiftListener::class, 'async_handle');
  1477. }
  1478. // 升级成功后
  1479. $event = new UserUpgradeAfterEvent($mall_id);
  1480. $data = ['after_level' => $can_upgrade_level, 'before_level' => $before_level,'mall_id'=>$mall_id];
  1481. \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  1482. }
  1483. }
  1484. }
  1485. /**
  1486. * @desc: 条件1
  1487. * 个人订单数量满____笔,个人订单满____元
  1488. * @Author: hua
  1489. * @Date: 2021/10/19
  1490. * @Time: 11:41
  1491. * @Copyright: copyright (c) 2021 广东七件事集团
  1492. * @param $params
  1493. * @return bool
  1494. */
  1495. protected static function condition110($params)
  1496. {
  1497. if (MallAddons::isInstall($params['mall_id'], AddonsEnum::ADDONS_NAME_FAST_MODE)) {
  1498. $params['data'] = [];
  1499. return FastModeUpgradeCondition::upgrade0($params,
  1500. $params['user_id'],
  1501. $params['arr'],
  1502. $params['key']);
  1503. }
  1504. return false;
  1505. }
  1506. protected static function condition111($params)
  1507. {
  1508. if (MallAddons::isInstall($params['mall_id'], AddonsEnum::ADDONS_NAME_FAST_MODE)) {
  1509. $params['data'] = [];
  1510. return FastModeUpgradeCondition::upgrade1($params,
  1511. $params['user_id'],
  1512. $params['arr'],
  1513. $params['key']);
  1514. }
  1515. return false;
  1516. }
  1517. // 指定商品ID____,并且单笔订单金额满____元
  1518. protected static function condition102($params)
  1519. {
  1520. if (empty($params['order_id'])) return false;
  1521. $user_id = $params['user_id'];
  1522. $cond = $params['arr'][$params['key']];
  1523. $goods_ids = $cond['value']['goods_ids'];
  1524. $finish_order_money = $cond['value']['finish_order_money'];
  1525. $total_money = OrderDetail::find()->select('goods_price')->where(['user_id' => $user_id, 'goods_id' => explode(',', $goods_ids), 'order_status' => OrderStatusEnum::ACCOMPLISH, 'status' => StatusEnum::ENABLED])->sum('goods_price') ?? 0;
  1526. if ($total_money >= $finish_order_money) return true;
  1527. return false;
  1528. }
  1529. protected static function condition500($params)
  1530. {
  1531. $cond = $params['arr'][$params['key']];
  1532. $is_include_yourself = $cond['value']['is_include_yourself'];
  1533. $is_when_settlement = $cond['value']['is_when_settlement'];
  1534. $settle_achievement = $cond['value']['settle_achievement'] ?? 0;
  1535. $total_performance = $cond['value']['total_performance'];
  1536. $target_big_performance = $cond['value']['max_performance'];
  1537. $target_small_performance = $cond['value']['min_performance'];
  1538. $user_id = $params['user_id'];
  1539. $statistics = UserTeamProfitStatistics::getOne([
  1540. ['user_id' => $user_id]
  1541. ], true);
  1542. if (empty($statistics)) return false;
  1543. //判断用户总业绩
  1544. $real_total_performance = 0;
  1545. $orderBy = 'children_order_finish_profit desc';
  1546. $field = 'id,user_id';
  1547. $field_str = '';
  1548. if ($is_when_settlement == 1) {
  1549. if ($is_include_yourself == 1) {
  1550. $field_str = 'team_order_pay';
  1551. } else {
  1552. $field_str = 'children_order_pay';
  1553. }
  1554. } else {
  1555. if ($is_include_yourself == 1) {
  1556. $field_str = 'team_order_finish';
  1557. } else {
  1558. $field_str = 'children_order_finish';
  1559. }
  1560. }
  1561. if ($settle_achievement == 1) {
  1562. $field_str .= '_achievement';
  1563. } else {
  1564. $field_str .= '_profit';
  1565. }
  1566. $real_total_performance = $statistics[$field_str];
  1567. $orderBy = $field_str . ' desc';
  1568. $field .= ','.$field_str.' as real_performance';
  1569. //判断总业绩是否达标
  1570. if ($real_total_performance < $total_performance) return false;
  1571. //获取直推用户id
  1572. $direct_child_ids = UserPartitionRelationship::getChildIdArr($user_id, 1);
  1573. $real_big_performance = 0;
  1574. $real_small_performance = 0;
  1575. if (!empty($direct_child_ids)) {
  1576. //获取大小市场业绩
  1577. $team_profit_statistics = UserTeamProfitStatistics::lists([
  1578. 'where' => [
  1579. ['user_id' => $direct_child_ids],
  1580. ],
  1581. 'select' => $field,
  1582. 'order' => $orderBy,
  1583. ]);
  1584. if (!empty($team_profit_statistics)) {
  1585. //获取大市场业绩
  1586. $real_big_performance = $team_profit_statistics[0]['real_performance'];
  1587. unset($team_profit_statistics[0]);
  1588. //统计小市场业绩
  1589. if (!empty($team_profit_statistics)) {
  1590. $real_small_performance = array_sum(array_column($team_profit_statistics, 'real_performance'));
  1591. }
  1592. }
  1593. }
  1594. // $real_big_performance = $is_when_settlement == 0 ? $statistics['accomplish_big_market_performance'] : $statistics['pay_big_market_performance'];
  1595. if ($real_big_performance < $target_big_performance) return false;
  1596. // $real_total_performance = $is_when_settlement == 0 ? $statistics['accomplish_team_performance'] : $statistics['pay_team_performance'];
  1597. // $real_small_performance = 0;
  1598. if ($real_small_performance < $target_small_performance) return false;
  1599. return true;
  1600. }
  1601. public static function getWhenSettlement()
  1602. {
  1603. return [
  1604. ['key' => 0, 'value' => '订单完成'],
  1605. ['key' => 1, 'value' => '订单支付'],
  1606. ];
  1607. }
  1608. public static function getSettleAchievement()
  1609. {
  1610. return [
  1611. ['key' => 0, 'value' => '商品利润'],
  1612. ['key' => 1, 'value' => '实付金额'],
  1613. ];
  1614. }
  1615. public static function getIsIncludesSelf()
  1616. {
  1617. return [
  1618. ['key' => 0, 'value' => '不包含自己'],
  1619. ['key' => 1, 'value' => '包含自己'],
  1620. ];
  1621. }
  1622. /**
  1623. * @desc:条件118
  1624. * 团队下____条____个____等级
  1625. * @Author: whq
  1626. * @Date: 2025/6/27
  1627. * @Time: 12:30
  1628. * @param $params
  1629. * @return bool
  1630. */
  1631. protected static function condition118($params)
  1632. {
  1633. return static::upgrade118(
  1634. $params['condition_data'][$params['key']]['setting'][0]['name'],
  1635. $params['condition_data'][$params['key']]['setting'][1]['name'],
  1636. $params['condition_data'][$params['key']]['setting'][2]['name'],
  1637. $params['user_id'],
  1638. $params['arr'],
  1639. $params['key']
  1640. );
  1641. }
  1642. /**
  1643. * 团队下____条____个____等级 条件118
  1644. * @param $team_num
  1645. * @param $level_num
  1646. * @param $agent_level
  1647. * @param $user_id
  1648. * @param array $arr
  1649. * @param string $key
  1650. * @return bool
  1651. */
  1652. public static function upgrade118($team_num, $level_num,$agent_level, $user_id, $arr = [], $key = '')
  1653. {
  1654. $direct_child_ids = UserPartitionRelationship::getChildIdArr($user_id, 1); //查询直推下级
  1655. $teamNum = $arr[$key]['value'][$team_num];//N条
  1656. if (count($direct_child_ids) < $teamNum) return false;
  1657. $levelNum = $arr[$key]['value'][$level_num]; //N个
  1658. $level = $arr[$key]['value'][$agent_level];
  1659. $isNums = 0;
  1660. foreach ($direct_child_ids as $direct_child_id) {
  1661. $count = 0;
  1662. $bossInfo = AddonsBoss::getOne([['user_id' => $direct_child_id]], true); //直推自己
  1663. if($bossInfo['level'] == $level){
  1664. $count++;
  1665. if($count >= $levelNum) {
  1666. $isNums++;
  1667. continue;
  1668. }
  1669. }
  1670. $count += AddonsBoss::getTeamlevelCount($direct_child_id,$level);
  1671. if($count < $levelNum) continue;
  1672. $isNums++;
  1673. if($isNums >= $teamNum) return true;
  1674. }
  1675. if ($isNums >= $teamNum) return true;
  1676. return false;
  1677. }
  1678. /**
  1679. * key 为56 的配置参数
  1680. * @return array[]
  1681. */
  1682. public static function getPersonalCheckbox56() {
  1683. return [
  1684. ['value' => 1, 'label' => '平台'],
  1685. ['value' => 2, 'label' => '多商户'],
  1686. ];
  1687. }
  1688. }