AchievementOrderLogic.php 72 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484
  1. <?php
  2. namespace addons\Achievement\common\logic;
  3. use addons\Achievement\common\enums\AchievementEnum;
  4. use addons\Achievement\common\models\AchievementAwardLog;
  5. use addons\Achievement\common\models\AchievementAwardLogExtra;
  6. use addons\Achievement\common\models\AchievementCommissionItemSetting;
  7. use addons\Achievement\common\models\AchievementFirstOrder;
  8. use addons\Achievement\common\models\AchievementGrantLog;
  9. use addons\Achievement\common\models\AchievementOrderLog;
  10. use addons\Achievement\common\models\AchievementUser;
  11. use addons\CloudStock\common\models\CloudStockGoods;
  12. use common\enums\AddonsEnum;
  13. use common\enums\StatusEnum;
  14. use common\models\mall\Mall;
  15. use common\models\mall\MallAddons;
  16. use common\models\order\Order;
  17. use common\models\order\OrderDetail;
  18. use common\models\user\UserPartitionRelationship;
  19. use Exception;
  20. class AchievementOrderLogic
  21. {
  22. public static function orderStatistics($order)
  23. {
  24. $t = \Yii::$app->db->beginTransaction();
  25. try {
  26. $mall_id = $order['mall_id'];
  27. if (empty(MallAddons::isInstall($order['mall_id'], AchievementEnum::ADDONS_NAME))) {
  28. throw new \Exception(false);
  29. }
  30. //判断业绩奖励是否开启
  31. $configs = \Yii::$app->services->setting->addons->get($order['mall_id'], AddonsEnum::ADDONS_NAME_ACHIEVEMENT, 'basic');
  32. if (empty($configs['status'])) throw new \Exception(false);
  33. $order_detail_list = OrderDetail::findAll(['order_id' => $order['id']]);
  34. if (empty($order_detail_list)) throw new \Exception(false);
  35. $goods_id_arr = array_column($order_detail_list, 'goods_id');
  36. //判断云库存 todo
  37. if (MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_CLOUD_STOCK)) {
  38. $setting = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
  39. if (!empty($setting['is_enable'])) {// 判断云库存是否开启(如果云库存未开启则不过滤掉商品)
  40. //过滤掉,由云库存补货,平台扣库存触发
  41. $cloud_stock_goods_list = CloudStockGoods::lists(['where' => [['goods_id' => $goods_id_arr], ['status' => StatusEnum::ENABLED]], 'select' => 'goods_id']);
  42. $cloud_stock_goods_id_arr = array_column($cloud_stock_goods_list, 'goods_id');
  43. foreach ($order_detail_list as $k => &$item) {
  44. if (in_array($item['goods_id'], $cloud_stock_goods_id_arr)) unset($order_detail_list[$k]);
  45. }
  46. }
  47. }
  48. if (empty($order_detail_list)) throw new \Exception(false);
  49. $grant = AchievementGrantLog::findOne(['mall_id' => $mall_id, 'status' => 1, 'is_wait' => 0, 'is_create' => 0]);
  50. if (empty($grant)) throw new \Exception(false);
  51. if ($grant['statistical_methods'] == 0 && $order['order_status'] != 4) {
  52. //订单完成
  53. throw new \Exception(false);
  54. }
  55. if ($grant['statistical_methods'] == 1 && ($order['pay_status'] != 1 || $order['order_status'] != 1)) {
  56. //支付完成
  57. throw new \Exception(false);
  58. }
  59. $user_id = self::addData($mall_id, $order['order_no'], $order['user_id'], $grant['id'], $order['created_at'], 0, $goods_id_arr, $order_detail_list, $grant, $configs['equal_type'] ?? 0, $configs);
  60. $t->commit();
  61. return ['user_id' => $user_id, 'mall_id' => $mall_id, 'grant_id' => $grant['id'], 'settlement_mode' => $grant['settlement_mode']];
  62. } catch (\Exception $e) {
  63. $t->rollBack();
  64. \Yii::error('AchievementOrderLogic:orderStatistics::::order_id:' . $order['id'] . '::::' . $e->getMessage() . $e->getLine() . $e->getFile());
  65. echo $e->getMessage() . $e->getLine() . $e->getFile();
  66. return false;
  67. }
  68. }
  69. //生成统计业绩数据
  70. public static function addData($mall_id, $order_no, $user_id, $grant_id, $created_at, $is_cloud, $goods_id_arr, $order_detail_list, $grant, $c_equal_type, $config)
  71. {
  72. $extra_user_id = $user_id;
  73. if ($is_cloud) {
  74. $res = AchievementOrderLog::findone(['order_no' => $order_no, 'order_detail_id' => array_column($order_detail_list, 'id')]);
  75. if (!empty($res)) throw new \Exception(false);
  76. } else {
  77. $res = AchievementorderLog::findone(['order_no' => $order_no]);
  78. if (!empty($res)) throw new \Exception(false);
  79. }
  80. $is_self = true;
  81. if (!$is_cloud) {
  82. //关闭后,购买团长升级礼包,首单不计算自身业绩。
  83. $configs = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_ACHIEVEMENT, 'basic');
  84. // 根据新需求。团长如果是后台手动添加。则首单也要计算自身业绩
  85. $is_manual = AchievementUser::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED, 'is_manual' => 1])->exists();
  86. if (isset($configs['first_order']) && $configs['first_order'] == 0 && !$is_manual) {
  87. $configs_goods_ids = [];
  88. if (!empty($configs['goods_ids'])) {
  89. $configs_goods_ids = json_decode($configs['goods_ids'], true);
  90. }
  91. if ($configs['goods_type'] == 1 || ($configs['goods_type'] == 2 && array_intersect($configs_goods_ids, $goods_id_arr))) {
  92. $where = [
  93. ['mall_id' => $mall_id],
  94. ['user_id' => $user_id],
  95. ['status' => StatusEnum::ENABLED],
  96. ];
  97. if ($configs['goods_type'] == 2) {
  98. $where [] = ['goods_id' => $configs_goods_ids];
  99. }
  100. $res = AchievementFirstOrder::lists(['where' => $where]);
  101. if (empty($res)) {
  102. $achievement_user = null;
  103. $is_self = false;
  104. foreach ($order_detail_list as $order_detail) {
  105. $add_data = [
  106. 'mall_id' => $mall_id,
  107. 'user_id' => $user_id,
  108. 'order_id' => $order_detail['order_id'],
  109. 'order_detail_id' => $order_detail['id'],
  110. 'goods_id' => $order_detail['goods_id'],
  111. ];
  112. $res = AchievementFirstOrder::setData($add_data);
  113. if (empty($res)) throw new \Exception(AchievementFirstOrder::getStaticError());
  114. }
  115. }
  116. }
  117. }
  118. }
  119. if ($is_self) $achievement_user = AchievementUser::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  120. if (empty($achievement_user)) {
  121. //如果下单用户没有团长身份,则为true
  122. //订单付款者不是团长身份,就往他的上级找
  123. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  124. $parent_id_arr = array_reverse($parent_id_arr);
  125. $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']);
  126. foreach ($parent_id_arr as $user_id) {
  127. if (isset($parent_achievement_user_list[$user_id])) {
  128. $achievement_user = $parent_achievement_user_list[$user_id];
  129. break;
  130. }
  131. }
  132. }
  133. if (empty($achievement_user)) return false;
  134. $price = 0;
  135. $insert = [];
  136. $time = time();
  137. $order = Order::findOne(['order_no' => $order_no]);
  138. if ($order['mch_id'] > 0 || $order['store_id'] > 0) {
  139. $item_setting_list = [];
  140. } else {
  141. $item_setting_list = AchievementCommissionItemSetting::lists(
  142. [
  143. 'where' => [
  144. ['item_id' => $goods_id_arr],
  145. ['status' => StatusEnum::ENABLED]
  146. ],
  147. 'index' => 'item_id'
  148. ]);
  149. }
  150. $order_detail_id_arr = array_column($order_detail_list, 'id');
  151. $where = [
  152. ['order_detail_id' => $order_detail_id_arr],
  153. ['is_cloud' => $is_cloud]
  154. ];
  155. $log_list = AchievementOrderLog::lists(['where' => $where, 'select' => 'id,goods_id']);
  156. $have_add_order_detail_id_arr = array_column($log_list, 'id');
  157. //独立平级奖励
  158. $user_equal_first = 0;
  159. $user_equal_second = 0;
  160. foreach ($order_detail_list as $item) {
  161. if (in_array($item['id'], $have_add_order_detail_id_arr)) continue;
  162. $goods_id = $item["goods_id"];
  163. $total_price = $item['goods_price'];
  164. $is_alone_equal = 0;
  165. $equal_first = 0;
  166. $equal_second = 0;
  167. //查询订单商品是否设置单独的商品业绩奖励
  168. if (isset($item_setting_list[$goods_id])) {
  169. //是否参与业绩奖励
  170. if (!empty($item_setting_list[$goods_id]['is_join'])) {
  171. if (!empty($item_setting_list[$goods_id]['is_enable'])) {
  172. if ($item_setting_list[$goods_id]['is_percent'] == 0) {
  173. $total_price = $item_setting_list[$goods_id]['price'] * $total_price / 100;
  174. }
  175. if ($item_setting_list[$goods_id]['is_percent'] == 1) {
  176. $total_price = $item_setting_list[$goods_id]['price'] * $item['num'];
  177. }
  178. }
  179. //独立平级奖励
  180. if ($grant->is_equal == 1 && !empty($item_setting_list[$goods_id]['is_alone_equal'])) {
  181. if ($item_setting_list[$goods_id]['is_alone_equal_percent'] == 0) {
  182. $equal_first = $item_setting_list[$goods_id]['alone_equal_first'] * $total_price / 100;
  183. $equal_second = $item_setting_list[$goods_id]['alone_equal_second'] * $total_price / 100;
  184. }
  185. if ($item_setting_list[$goods_id]['is_alone_equal_percent'] == 1) {
  186. $equal_first = $item_setting_list[$goods_id]['alone_equal_first'] * $item['num'];
  187. $equal_second = $item_setting_list[$goods_id]['alone_equal_second'] * $item['num'];
  188. }
  189. $is_alone_equal = $item_setting_list[$goods_id]['is_alone_equal'];
  190. $user_equal_first += $equal_first;
  191. $user_equal_second += $equal_second;
  192. }
  193. } else {
  194. $total_price = 0;
  195. }
  196. }
  197. //平级奖励
  198. if ($grant->is_equal == 1 && empty($is_alone_equal)) {
  199. $equal_first = $grant->equal_price_first * $total_price / 100;
  200. $equal_second = $grant->equal_price_second * $total_price / 100;
  201. $user_equal_first += $equal_first;
  202. $user_equal_second += $equal_second;
  203. }
  204. $insert[] = [
  205. $mall_id,
  206. $item['user_id'],
  207. $grant_id,
  208. $goods_id,
  209. $order_no,
  210. $item['id'],
  211. $user_id,
  212. $total_price,
  213. $is_cloud,
  214. $created_at,
  215. $time,
  216. $time,
  217. StatusEnum::ENABLED,
  218. $is_alone_equal,
  219. $equal_first,
  220. $equal_second,
  221. ];
  222. $price += $total_price;
  223. }
  224. if (empty($insert)) throw new \Exception('insert数组为空');
  225. $field = ['mall_id', 'user_id', 'grant_id', 'goods_id', 'order_no', 'order_detail_id',
  226. 'chief_user_id', 'price', 'is_cloud', 'order_create_time', 'created_at', 'updated_at', 'status', 'is_alone_equal', 'equal_first', 'equal_second'];
  227. // 批量插入数据
  228. $res = \Yii::$app->db->createCommand()->batchInsert(AchievementOrderLog::tableName(), $field, $insert)->execute();
  229. if (empty($res)) throw new \Exception('添加业绩订单日志失败');
  230. $list = [];
  231. $user_id_arr = [];
  232. self::handleSelf($achievement_user['user_id'], $price, $grant, $list, $user_id_arr, $user_equal_first, $user_equal_second);
  233. //如果团队业绩按钮没有开启,或者不存在数据则计算个人业绩
  234. //is_team_achievement, 如果开启了团队业绩按钮,且下单用户没有团长身份,则需要为user_id也计算团队业绩,该字段为true
  235. //累计上级团队业绩
  236. $parent_id_arr = UserPartitionRelationship::getParentIdArr($achievement_user['user_id']);
  237. $parent_id_arr = array_reverse($parent_id_arr);
  238. self::staticTeamAchievement($mall_id, $grant, $parent_id_arr, $price, $equal_first, $equal_second);
  239. if ($grant->settlement_mode != 2) self::handleParent($user_id, $grant, $list, $user_id_arr);
  240. if ($grant->settlement_mode == 1) self::planB($grant, $list, $user_id_arr);//极差
  241. if ($grant->settlement_mode == 2) self::planCTwo($grant, $list, $achievement_user['user_id'], $price, $c_equal_type, $order_no);//业绩极差
  242. if (!empty($c_equal_type)) self::planD($grant, $achievement_user['user_id'], $config);
  243. //平级奖
  244. self::settleEqual($grant, $achievement_user['user_id']);
  245. self::updateGrant($grant);
  246. return $user_id;
  247. }
  248. //累计下单用户所有上级团队业绩
  249. public static function staticTeamAchievement($mall_id, $grant, $parent_id_arr = [], $price = 0, $equal_first = 0.00, $equal_second = 0.00)
  250. {
  251. if (!empty($parent_id_arr)) {
  252. foreach ($parent_id_arr as $key => $value) {
  253. //获取用户是否存在数据
  254. $extra_info = AchievementAwardLogExtra::getOne([
  255. ['mall_id' => $mall_id],
  256. ['user_id' => $value],
  257. ['grant_id' => $grant['id']]
  258. ]);
  259. if (empty($extra_info)) {
  260. $extra_info = new AchievementAwardLogExtra();
  261. $extra_info->loadDefaultValues();
  262. $extra_info->mall_id = $mall_id;
  263. $extra_info->user_id = $value;
  264. $extra_info->grant_id = $grant['id'];
  265. }
  266. $extra_info->team_achievement += $price;
  267. $extra_info->equal_first += $equal_first;
  268. $extra_info->equal_second += $equal_second;
  269. if (!$extra_info->save()) throw new Exception('累计团队业绩失败');
  270. }
  271. }
  272. }
  273. public static function reWriteEqual($award_log, $user_equal_first, $user_equal_second)
  274. {
  275. // 需要重新计算 平级奖 - 每个商品不一样?
  276. $award_log->equal_first += $user_equal_first;
  277. $award_log->equal_second += $user_equal_second;
  278. $flag = $award_log->save();
  279. if (!$flag) throw new \Exception("重写平级奖失败");
  280. }
  281. public static function planB($grant, $list, $user_id_arr)
  282. {
  283. $sum_award = 0;
  284. $achievement_award_log_list = AchievementAwardLog::lists([
  285. 'where' => [
  286. ['parent_team' => $user_id_arr],
  287. ['mall_id' => $grant['mall_id']],
  288. ['grant_id' => $grant['id']],
  289. ['status' => StatusEnum::ENABLED],
  290. ],
  291. 'index' => 'parent_team',
  292. 'group' => 'parent_team',
  293. 'select' => 'sum(proportion_money) as money,parent_team',
  294. ]);
  295. $achievement_award_log_list_end = AchievementAwardLog::lists([
  296. 'where' => [
  297. ['parent_team' => $user_id_arr],
  298. ['mall_id' => $grant['mall_id']],
  299. ['status' => StatusEnum::ENABLED],
  300. ['is_end' => 1],
  301. ],
  302. 'index' => 'user_id',
  303. 'group' => 'user_id',
  304. 'select' => 'sum(proportion_money+equal_money) as money,user_id',
  305. ]);
  306. foreach ($list as $k => $v) {
  307. //查看所有下级的结算金额
  308. $money = 0;
  309. if (isset($achievement_award_log_list[$v['user_id']])) $money = $achievement_award_log_list[$v['user_id']]['money'];
  310. var_dump($money);
  311. $award_money = $v['proportion_money'] - $money > 0 ? $v['proportion_money'] - $money : 0;
  312. var_dump($v['user_id'] . '::::' . $award_money);
  313. $v->award_money = $award_money;
  314. //总计
  315. $sum_money = 0;
  316. $sum_money += $award_money;
  317. if (isset($achievement_award_log_list_end[$v['user_id']])) $sum_money += $achievement_award_log_list_end[$v['user_id']]['money'];
  318. $v->award_sum = $sum_money;
  319. if (!$v->save()) throw new \Exception("业绩修改奖励日志失败");
  320. $sum_award += $v->award_money;
  321. }
  322. return $sum_award;
  323. }
  324. public static function handleSelf($user_id, $price, $grant, &$list, &$user_id_arr, $user_equal_first, $user_equal_second)
  325. {
  326. $grant_id = $grant['id'];
  327. $mall_id = $grant['mall_id'];
  328. $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $user_id]);
  329. if (empty($award_log)) {
  330. $award_log = new AchievementAwardLog();
  331. $award_log->mall_id = $mall_id;
  332. $award_log->grant_id = $grant_id;
  333. $award_log->user_id = $user_id;
  334. $award_log->team_achievement = 0.00;
  335. $award_log->sub_personal_achievement = 0.00;
  336. }
  337. //开启团队奖励按钮,需排除本身的个人业绩
  338. if (empty($grant->is_team_achievement)) {
  339. $award_log->personal_achievement += $price;
  340. }
  341. $team_achievement = $award_log->team_achievement;
  342. if ($grant['settlement_mode'] != 2) {
  343. $team_achievement_data = AchievementAwardLogExtra::getOne([
  344. ['mall_id' => $grant['mall_id']],
  345. ['user_id' => $user_id],
  346. ['grant_id' => $grant['id']],
  347. ], true);
  348. if (empty($team_achievement_data)) {
  349. $team_achievement = self::checkAchievement($grant['mall_id'], $grant['id'], $user_id);
  350. } else {
  351. $team_achievement = $team_achievement_data['team_achievement'];
  352. }
  353. }
  354. $award_log->team_achievement = $team_achievement;
  355. $award_log->achievement_sum = $team_achievement + $award_log->personal_achievement;
  356. $award_log->equal_first += $user_equal_first;
  357. $award_log->equal_second += $user_equal_second;
  358. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']);
  359. $sum_list = AchievementAwardLog::lists([
  360. 'where' => [
  361. ['user_id' => $user_id],
  362. ['mall_id' => $grant['mall_id']],
  363. ['status' => StatusEnum::ENABLED],
  364. ['is_end' => 1]
  365. ],
  366. 'index' => 'user_id',
  367. 'group' => 'user_id',
  368. 'select' => 'sum(award_money+equal_money) as money,user_id'
  369. ]);
  370. $award_log->award_proportion = $award['proportion'];
  371. if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差
  372. if ($grant['settlement_mode'] == 2) {
  373. $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id);
  374. } else {
  375. $award_log->award_money = $award['money'];
  376. $sum_money = 0;
  377. if (isset($sum_list[$award_log['user_id']])) $sum_money = $sum_list[$award_log['user_id']]['money'];
  378. $sum_money = $sum_money + $award['money'];
  379. $award_log->award_sum = $sum_money;
  380. }
  381. } else {
  382. $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id);
  383. $award_log->proportion_money = $award['money'];
  384. }
  385. $is_skip_settlement = self::checkCanSettle($grant, $award_log->user_id);
  386. $award_log->is_skip_settlement = $is_skip_settlement;
  387. if (!$award_log->save()) throw new \Exception("业绩添加个人业绩日志时失败");
  388. $list[] = $award_log;
  389. $user_id_arr[] = $award_log['user_id'];
  390. return $award_log;
  391. }
  392. /**
  393. * @desc:更新父级团长id,因在同周期内
  394. * 例如 a -> b -> c(团长) -> d->e -> f(团长),f下单,e,d不是团长,f的parent_team记录为c,当e在周期内成为团队,且下单时,需要更新f的parent_team为e
  395. * @Author: hua
  396. * @Date: 2021/11/12
  397. * @Time: 9:30
  398. * @param $mall_id
  399. * @param $grant_id
  400. * @param $user_id
  401. * @return void
  402. */
  403. public static function updateParentTeam($mall_id, $grant_id, $user_id)
  404. {
  405. $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'grant_id' => $grant_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  406. if (empty($award_log)) {
  407. $del_award_log = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'grant_id' => $grant_id, 'user_id' => $user_id, 'status' => StatusEnum::DELETE])
  408. ->select('personal_achievement')->orderBy('id desc')->one();
  409. $award_log = new AchievementAwardLog();
  410. $award_log->loadDefaultValues();
  411. $award_log->mall_id = $mall_id;
  412. $award_log->grant_id = $grant_id;
  413. $award_log->personal_achievement = $del_award_log['personal_achievement'] ?? 0;
  414. $award_log->user_id = $user_id;
  415. $award_log->sub_personal_achievement = 0.00;
  416. $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id);
  417. $award_log->save();
  418. }
  419. $list = AchievementAwardLog::lists([
  420. 'where' => [
  421. ['mall_id' => $mall_id],
  422. ['grant_id' => $grant_id],
  423. ['parent_team' => $award_log['parent_team']],
  424. ['status' => StatusEnum::ENABLED]
  425. ]
  426. ], false);
  427. if (empty($list)) {
  428. return true;
  429. }
  430. //获取规则数据
  431. $grant = AchievementGrantLog::getOne([
  432. ['mall_id' => $mall_id],
  433. ['id' => $grant_id],
  434. ], true);
  435. if (!empty($grant['award_proportion'])) $grant['award_proportion'] = json_decode($grant['award_proportion'], true);
  436. foreach ($list as $item) {
  437. $is_add = true;
  438. $parent_id_arr = UserPartitionRelationship::getParentIdArr($item['user_id']);
  439. if (in_array($user_id, $parent_id_arr)) {
  440. $item->parent_team = $user_id;
  441. $item->save();
  442. if (!empty($item->parent_team)) {
  443. $achievement_sum = $item['team_achievement'] + $item['personal_achievement'];
  444. $is_add = true;
  445. foreach ($grant['award_proportion'] as $key => $value) {
  446. if ($value['money'] <= $achievement_sum) {
  447. $is_add = false;
  448. }
  449. }
  450. if ($is_add) {
  451. //获取上级团长数据
  452. $parent_achievement = AchievementAwardLog::getOne([
  453. ['mall_id' => $mall_id],
  454. ['grant_id' => $grant_id],
  455. ['user_id' => $item->parent_team],
  456. ['status' => StatusEnum::ENABLED]
  457. ]);
  458. $parent_achievement->team_achievement += $achievement_sum;
  459. $parent_achievement->achievement_sum += $achievement_sum;
  460. if (!$parent_achievement->save()) var_dump('保存上级团长数据失败user_id:' . $item->parent_team);
  461. //查看是否需要更改所有上级团队业绩
  462. self::changeParentAchievement($grant, $item->parent_team);
  463. }
  464. }
  465. }
  466. }
  467. return true;
  468. }
  469. //查看是否需要更改所有上级团队业绩
  470. public static function changeParentAchievement($grant, $first_user_id)
  471. {
  472. $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id);
  473. $parent_id_arr[] = $first_user_id;
  474. $parent_id_arr = array_reverse($parent_id_arr);
  475. $list = [];
  476. $award_list = AchievementAwardLog::lists([
  477. 'where' => [
  478. ['mall_id' => $grant['mall_id']],
  479. ['grant_id' => $grant['id']],
  480. ['user_id' => $parent_id_arr],
  481. ]
  482. ], false);
  483. $award_arr = array_column($award_list, null, 'user_id');
  484. foreach ($parent_id_arr as $parent_id) {
  485. if (isset($award_arr[$parent_id])) {
  486. $list[] = $award_arr[$parent_id];
  487. }
  488. // foreach ($award_list as $award_log) {
  489. // if ($parent_id == $award_log->user_id) {
  490. // $list[] = $award_log;
  491. // }
  492. // }
  493. }
  494. // $sub_team_achievemment = [];
  495. $award_proportion = $grant['award_proportion'];
  496. $grant['award_proportion'] = json_encode($grant['award_proportion']);
  497. $change_team_achievemment = [];
  498. // print_r($list);exit;
  499. foreach ($list as $item) {
  500. // print_r($change_team_achievemment);
  501. // $item = self::checkAchievementPlanC($item, $award_proportion, $first_user_id, 0, $change_team_achievemment);
  502. $item['team_achievement'] = AchievementLogic::getTeamAchievementByParentTeamC($item['user_id'], $grant['id']);
  503. $item['equal_first'] = AchievementLogic::getEqualFirstByParentTeamC($item['user_id'], $grant['id']);
  504. $item['equal_second'] = AchievementLogic::getEqualSecondByParentTeamC($item['user_id'], $grant['id']);
  505. $item['team_achievement'] = $item['team_achievement'] ?? 0;
  506. $item['equal_first'] = $item['equal_first'] ?? 0;
  507. $item['equal_second'] = $item['equal_second'] ?? 0;
  508. var_dump('user_id:' . $item['user_id'] . '---team_achievement:' . $item['team_achievement']);
  509. //获取团队业绩数据
  510. $team_achievement = $achievement_sum = $item['team_achievement'];
  511. $achievement_sum += $item['personal_achievement'];
  512. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $achievement_sum, $item['personal_achievement'], $grant['settlement_mode'], $grant['is_team_achievement']);
  513. $item->award_proportion = $award['proportion'];
  514. $item->award_money = $award['money'];
  515. $item->team_achievement = $team_achievement ?? 0.00;
  516. $item->achievement_sum = $achievement_sum;
  517. $sum_money = 0;
  518. $sum_list = AchievementAwardLog::lists([
  519. 'where' => [
  520. ['user_id' => $item['user_id']],
  521. ['mall_id' => $grant['mall_id']],
  522. ['status' => StatusEnum::ENABLED],
  523. ['is_end' => 1]
  524. ],
  525. 'index' => 'user_id',
  526. 'group' => 'user_id',
  527. 'select' => 'sum(award_money+equal_money) as money,user_id'
  528. ]);
  529. if (isset($sum_list[$item['user_id']])) $sum_money = $sum_list[$item['user_id']]['money'];
  530. $sum_money = $sum_money + $award['money'];
  531. $item->award_sum = $sum_money;
  532. $item->team_equal_first = empty($c_equal_type) ? $item->equal_first : 0;
  533. $item->team_equal_second = empty($c_equal_type) ? $item->equal_second : 0;
  534. // print_r($item);
  535. if (!$item->save()) var_dump('业绩添加个人业绩日志时失败');
  536. // if (empty($sub_team_achievemment)) break;
  537. //总业绩达标,且奖励金额不为0时,只累计当前团长数据
  538. // if ($is_add == false) break;
  539. }
  540. // print_r($list);exit;
  541. }
  542. protected static function changeParentTeam($mall_id, $grant_id, $user_id)
  543. {
  544. $award_log = AchievementAwardLog::find()
  545. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $user_id])
  546. ->one();
  547. if ($award_log) {
  548. $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id);
  549. $award_log->save();
  550. }
  551. }
  552. public static function handleParent($user_id, $grant, &$list, &$user_id_arr)
  553. {
  554. $grant_id = $grant['id'];
  555. $mall_id = $grant['mall_id'];
  556. //給所有的上级加上日志,就算为空也加
  557. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  558. //开启了团队业绩按钮,如果user_id 不是下单用户本人,则需要给user_id 也累计团队业绩
  559. $parent_id_arr = array_reverse($parent_id_arr);
  560. $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']);
  561. //给父级团队业绩
  562. $sum_list = AchievementAwardLog::lists([
  563. 'where' => [
  564. ['user_id' => $parent_id_arr],
  565. ['mall_id' => $mall_id],
  566. ['status' => StatusEnum::ENABLED],
  567. ['is_end' => 1]
  568. ],
  569. 'index' => 'user_id',
  570. 'group' => 'user_id',
  571. 'select' => 'sum(award_money+equal_money) as money,user_id'
  572. ]);
  573. $awards = [];
  574. foreach ($parent_achievement_user_list as $k => $item) {
  575. $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $item['user_id']]);
  576. if (empty($award_log)) {
  577. $award_log = new AchievementAwardLog();
  578. $award_log->mall_id = $mall_id;
  579. $award_log->grant_id = $grant_id;
  580. $award_log->user_id = $item['user_id'];
  581. $award_log->team_achievement = 0.00;
  582. $award_log->personal_achievement = 0.00;
  583. $award_log->sub_personal_achievement = 0.00;
  584. }
  585. $team_achievement_data = AchievementAwardLogExtra::getOne([
  586. ['mall_id' => $grant['mall_id']],
  587. ['user_id' => $item['user_id']],
  588. ['grant_id' => $grant['id']],
  589. ], true);
  590. if (empty($team_achievement_data)) {
  591. $team_achievement = self::checkAchievement($grant['mall_id'], $grant['id'], $item['user_id']);
  592. } else {
  593. $team_achievement = $team_achievement_data['team_achievement'];
  594. }
  595. $award_log->team_achievement = $team_achievement;
  596. $award_log->achievement_sum = $team_achievement + $award_log->personal_achievement;
  597. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']);
  598. $award_log->award_proportion = $award['proportion'];
  599. if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差
  600. $award_log->award_money = $award['money'];
  601. $sum_money = 0;
  602. if (isset($sum_list[$award_log['user_id']])) $sum_money = $sum_list[$award_log['user_id']]['money'];
  603. $sum_money = $sum_money + $award['money'];
  604. $award_log->award_sum = $sum_money;
  605. $awards[] = [
  606. 'user_id' => $award_log->user_id,
  607. 'money' => $award['money']
  608. ];
  609. if ($grant['settlement_mode'] == 2) {
  610. $award_log->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']);
  611. }
  612. } else {
  613. $award_log->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']);
  614. $award_log->proportion_money = $award['money'];
  615. }
  616. $is_skip_settlement = self::checkCanSettle($grant, $award_log->user_id);
  617. $award_log->is_skip_settlement = $is_skip_settlement;
  618. if (!$award_log->save()) throw new \Exception($item['user_id'] . "业绩添加父级业绩日志时失败");
  619. $list[] = $award_log;
  620. $user_id_arr[] = $award_log['user_id'];
  621. }
  622. return $awards;
  623. }
  624. public static function updateGrant($grant)
  625. {
  626. $grant_id = $grant['id'];
  627. $mall_id = $grant['mall_id'];
  628. $total_performance = AchievementOrderLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('price');
  629. $sum_award = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('award_money');
  630. $user_num = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->count();
  631. $sum_equal = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('equal_money');
  632. if (!isset($total_performance)) $total_performance = 0;
  633. if (!isset($sum_award)) $sum_award = 0;
  634. if (!isset($user_num)) $user_num = 0;
  635. $grant->total_performance = $total_performance;
  636. $grant->user_num = $user_num;
  637. $grant->award_money = $sum_award + $sum_equal;
  638. $grant->equal_money = $sum_equal ?? 0;
  639. if (!$grant->save()) throw new \Exception("业绩修改规则日志失败");
  640. }
  641. public static function settleEqual($grant, $user_id)
  642. {
  643. $grant_id = $grant['id'];
  644. $mall_id = $grant['mall_id'];
  645. $current_id = $user_id;
  646. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  647. if (!empty($parent_id_arr)) $current_id = current($parent_id_arr);
  648. $child_ids = UserPartitionRelationship::getChildIdArr($current_id);
  649. $list = AchievementAwardLog::find()
  650. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $child_ids])
  651. ->andWhere(['>', 'award_money', 0])
  652. ->all();
  653. $is_send_ids = [];
  654. foreach ($list as $item) {
  655. $parent_id_arr = UserPartitionRelationship::getParentIdArr($item['user_id']);
  656. $parent_id_arr = array_reverse($parent_id_arr);
  657. $deep = 1;
  658. $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id'], false);
  659. foreach ($parent_id_arr as $user_id) {
  660. if (isset($parent_achievement_user_list[$user_id])) {
  661. $parent_award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $user_id]);
  662. if (empty($parent_award_log)) {
  663. $parent_award_log = new AchievementAwardLog();
  664. $parent_award_log->mall_id = $mall_id;
  665. $parent_award_log->grant_id = $grant_id;
  666. $parent_award_log->user_id = $user_id;
  667. }
  668. if ($deep == 1) {
  669. $equal_money = $item['equal_first'] + $item['team_equal_first'];
  670. } elseif ($deep == 2) {
  671. $equal_money = $item['equal_second'] + $item['team_equal_second'];
  672. }
  673. if ($equal_money > 0) {
  674. //首次添加重置平级奖
  675. if (!in_array($user_id, $is_send_ids)) {
  676. $parent_award_log->equal_money = 0;
  677. }
  678. $parent_award_log->equal_money += $equal_money;
  679. if (!$parent_award_log->save()) throw new \Exception($parent_award_log['user_id'] . '平级奖励发放异常:' . AchievementAwardLog::getStaticError());
  680. $is_send_ids[] = $user_id;
  681. }
  682. if ($deep == 2) break;
  683. $deep++;
  684. }
  685. }
  686. }
  687. return true;
  688. }
  689. public static function planD($grant, $first_user_id, $config)
  690. {
  691. // 取出所有
  692. $grant_id = $grant['id'];
  693. $mall_id = $grant['mall_id'];
  694. $current_id = $first_user_id;
  695. $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id);
  696. if (!empty($parent_id_arr)) $current_id = current($parent_id_arr);
  697. $child_ids = UserPartitionRelationship::getChildIdArr($current_id);
  698. $child_ids[] = $current_id;
  699. $list = AchievementAwardLog::find()
  700. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $child_ids])
  701. ->all();
  702. /**
  703. * @var $item AchievementAwardLog
  704. */
  705. foreach ($list as $item) {
  706. $item->equal_first = bcmul($item->award_money, bcmul($config['equal_price_first'], 0.01, 3), 3);
  707. $item->equal_second = bcmul($item->award_money, bcmul($config['equal_price_second'], 0.01, 3), 3);
  708. $item->team_equal_first = 0;
  709. $item->team_equal_second = 0;
  710. $item->equal_money = 0; // 先将平级奖设置为0
  711. echo "$item->id $item->user_id $item->award_money $item->equal_first $item->equal_first \n";
  712. if (!$item->save()) throw new \Exception("重新计算平级奖失败 {$item->id} !!");
  713. }
  714. }
  715. public static function planCTwo($grant, $award_list, $first_user_id, $price, $c_equal_type, $order_no)
  716. {
  717. $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id);
  718. $parent_id_arr[] = $first_user_id;
  719. $parent_id_arr = array_reverse($parent_id_arr);
  720. $award_list = AchievementAwardLog::lists([
  721. 'where' => [
  722. ['mall_id' => $grant['mall_id']],
  723. ['grant_id' => $grant['id']],
  724. ['user_id' => $parent_id_arr],
  725. ],
  726. ], false);
  727. $list = [];
  728. $award_arr = array_column($award_list, null, 'user_id');
  729. // foreach ($parent_id_arr as $parent_id) {
  730. // if (isset($award_arr[$parent_id])) {
  731. // $list[] = $award_arr[$parent_id];
  732. // }
  733. // }
  734. //获取上级团长信息
  735. $team_user_data = AchievementUser::lists([
  736. 'where' => [
  737. ['mall_id' => $grant['mall_id']],
  738. ['user_id' => $parent_id_arr],
  739. ['status' => StatusEnum::ENABLED]
  740. ],
  741. 'index' => 'user_id',
  742. ]);
  743. $change_team_achievemment = [];
  744. foreach ($parent_id_arr as $id) {
  745. $is_add = true;
  746. //获取团队业绩数据
  747. if (empty($award_arr[$id])) {
  748. //如果不是团长,则跳过
  749. if (empty($team_user_data[$id])) continue;
  750. $item = new AchievementAwardLog();
  751. $item->loadDefaultValues();
  752. $item->mall_id = $grant->mall_id;
  753. $item->grant_id = $grant->id;
  754. $item->user_id = $id;
  755. $item->sub_personal_achievement = 0.00;
  756. $item->parent_team = AchievementLogic::getParentAchievementUser($id);
  757. //获取当前用户上级
  758. } else {
  759. $item = $award_arr[$id];
  760. }
  761. $award_proportion = json_decode($grant['award_proportion'], true);
  762. // print_r($change_team_achievemment);
  763. var_dump('user_id:' . $item['user_id'] . ',order_no:' . $order_no . 'change_team_achievemment:' . json_encode($change_team_achievemment));
  764. //数据操作
  765. // $item = self::checkAchievementPlanC($item, $award_proportion, $first_user_id, $price, $change_team_achievemment);
  766. $item['team_achievement'] = AchievementLogic::getTeamAchievementByParentTeamC($id, $grant['id']);
  767. $item['equal_first'] = AchievementLogic::getEqualFirstByParentTeamC($id, $grant['id']);
  768. $item['equal_second'] = AchievementLogic::getEqualSecondByParentTeamC($id, $grant['id']);
  769. $item['team_achievement'] = $item['team_achievement'] ?? 0;
  770. $item['equal_first'] = $item['equal_first'] ?? 0;
  771. $item['equal_second'] = $item['equal_second'] ?? 0;
  772. // print_r($item);
  773. $team_achievement = $achievement_sum = $item['team_achievement'];
  774. $achievement_sum += $item['personal_achievement'];
  775. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $achievement_sum, $item['personal_achievement'], $grant['settlement_mode'], $grant->is_team_achievement);
  776. $item->award_proportion = $award['proportion'];
  777. $item->award_money = $award['money'];
  778. $item->team_achievement = $team_achievement ?? 0.00;
  779. $item->achievement_sum = $achievement_sum;
  780. $sum_money = 0;
  781. $sum_list = AchievementAwardLog::lists([
  782. 'where' => [
  783. ['user_id' => $item['user_id']],
  784. ['mall_id' => $grant['mall_id']],
  785. ['status' => StatusEnum::ENABLED],
  786. ['is_end' => 1]
  787. ],
  788. 'index' => 'user_id',
  789. 'group' => 'user_id',
  790. 'select' => 'sum(award_money+equal_money) as money,user_id'
  791. ]);
  792. if (isset($sum_list[$item['user_id']])) $sum_money = $sum_list[$item['user_id']]['money'];
  793. $sum_money = $sum_money + $award['money'];
  794. $item->award_sum = $sum_money;
  795. $item->team_equal_first = empty($c_equal_type) ? $item->equal_first : 0;
  796. $item->team_equal_second = empty($c_equal_type) ? $item->equal_second : 0;
  797. if (!$item->save()) throw new \Exception("业绩添加个人业绩日志时失败");
  798. //总业绩达标,且奖励金额不为0时,只累计当前团长数据
  799. if ($is_add == false) break;
  800. }
  801. // print_r($list);exit;
  802. }
  803. //planC检查团队业绩
  804. public static function checkAchievementPlanC($item, $award_proportion, $first_user_id, $price, &$change_team_achievemment)
  805. {
  806. $team_achievement_data = [];
  807. $team_achievement = $item['team_achievement'];
  808. $equal_first = $item['equal_first'];
  809. $equal_second = $item['equal_second'];
  810. $achievement_sum = $item['team_achievement'] + $item['personal_achievement'];
  811. if (empty($change_team_achievemment) && $item['user_id'] != $first_user_id) return $item;
  812. if (!empty($change_team_achievemment[$item['user_id']])) {
  813. $team_achievement_data = $change_team_achievemment[$item['user_id']];
  814. }
  815. //根据数据类型,进行数据操作
  816. if (!empty($team_achievement_data)) {
  817. if ($team_achievement_data['type'] == 'add') {
  818. $team_achievement += $team_achievement_data['team_achievement'];
  819. $achievement_sum += $team_achievement_data['team_achievement'];
  820. $equal_first += $team_achievement_data['equal_first'];
  821. $equal_second += $team_achievement_data['equal_second'];
  822. } else {
  823. $team_achievement -= $team_achievement_data['team_achievement'];
  824. $achievement_sum -= $team_achievement_data['team_achievement'];
  825. $equal_first -= $team_achievement_data['equal_first'];
  826. $equal_second -= $team_achievement_data['equal_second'];
  827. }
  828. }
  829. //判断是否达标
  830. $is_sub = false;
  831. foreach ($award_proportion as $key => $value) {
  832. if ($value['money'] <= $achievement_sum) {
  833. $is_sub = true;
  834. break;
  835. }
  836. }
  837. if ($is_sub) {//业绩达标,扣减上级团长团队业绩
  838. $team_achievement_data = [
  839. 'type' => 'sub',
  840. 'team_achievement' => $achievement_sum,
  841. 'equal_first' => $equal_first,
  842. 'equal_second' => $equal_second,
  843. 'is_team' => true,
  844. ];
  845. if ($item['award_money'] == 0) { //第一次达标时,将当前订单金额从总业绩内扣除
  846. $team_achievement_data['team_achievement'] -= $price;
  847. } else {
  848. $team_achievement_data = [];
  849. }
  850. } else {
  851. //曾经达标,需重新为上级增加团队业绩
  852. if ($item['award_money'] > 0) {
  853. $team_achievement_data = [
  854. 'type' => 'add',
  855. 'team_achievement' => $achievement_sum,
  856. 'equal_first' => $equal_first,
  857. 'equal_second' => $equal_second,
  858. 'is_team' => true,
  859. ];
  860. } else {//未达标过,则累加当前订单金额
  861. if (empty($team_achievement_data['is_team'])) {
  862. if ($price > 0) {
  863. $team_achievement_data = [
  864. 'type' => 'add',
  865. 'team_achievement' => $price,
  866. 'equal_first' => $equal_first,
  867. 'equal_second' => $equal_second,
  868. ];
  869. }
  870. }
  871. }
  872. }
  873. $change_team_achievemment = [];
  874. $change_team_achievemment[$item['parent_team']] = $team_achievement_data;
  875. $item['team_achievement'] = $team_achievement;
  876. $item['equal_first'] = $equal_first;
  877. $item['equal_second'] = $equal_second;
  878. // $return = ['team_achievement' => $team_achievement, 'equal_first' => $equal_first, 'equal_second' => $equal_second, 'user_id' => $item['user_id']];
  879. return $item;
  880. }
  881. /**
  882. * 检查团队业绩
  883. *
  884. * @param $mall_id
  885. * @param $grant_id
  886. * @param $user_id
  887. * @return int|mixed
  888. */
  889. public static function checkAchievement($mall_id, $grant_id, $user_id)
  890. {
  891. //获取下级团长数据
  892. $my_team_data = AchievementAwardLog::lists([
  893. 'where' => [
  894. ['mall_id' => $mall_id],
  895. ['grant_id' => $grant_id],
  896. ['parent_team' => $user_id]
  897. ],
  898. ]);
  899. $team_achievement = 0;
  900. if (!empty($my_team_data)) {
  901. $user_ids = array_column($my_team_data, 'user_id');
  902. //获取下级团长团队数据
  903. $team_achievement_data = AchievementAwardLogExtra::lists([
  904. 'where' => [
  905. ['mall_id' => $mall_id],
  906. ['user_id' => $user_ids],
  907. ['grant_id' => $grant_id],
  908. ],
  909. 'index' => 'user_id',
  910. ]);
  911. foreach ($my_team_data as $value) {
  912. $temp_team_achievement = $team_achievement_data[$value['user_id']]['team_achievement'] ?? 0;
  913. $team_achievement += $value['personal_achievement'] + $temp_team_achievement;
  914. }
  915. }
  916. return $team_achievement;
  917. }
  918. /**
  919. * 因为升级,需要修复parent_team=='',parent_team字段
  920. * @param $mall_id
  921. * @param $grant_id
  922. * @param $settlement_mode
  923. * @return string|void
  924. */
  925. public static function fillParentTeamByEmpty($mall_id, $grant_id, $settlement_mode)
  926. {
  927. if ($settlement_mode == 0) {
  928. return '';
  929. }
  930. //获取规则数据
  931. $grant = AchievementGrantLog::getOne([
  932. ['mall_id' => $mall_id],
  933. ['id' => $grant_id],
  934. ], true);
  935. if (!empty($grant['award_proportion'])) $grant['award_proportion'] = json_decode($grant['award_proportion'], true);
  936. $j = 1;
  937. while (true) {
  938. $limit = 1000;
  939. $offset = ($j - 1) * $limit;
  940. $list = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])
  941. ->andWhere(['parent_team' => ''])
  942. ->offset($offset)
  943. ->limit($limit)
  944. ->all();
  945. if (empty($list)) {
  946. break;
  947. }
  948. foreach ($list as $item) {
  949. $item->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']);
  950. $item->save();
  951. if (!empty($item->parent_team)) {
  952. $achievement_sum = $item['team_achievement'] + $item['personal_achievement'];
  953. $is_add = true;
  954. foreach ($grant['award_proportion'] as $key => $value) {
  955. if ($value['money'] <= $achievement_sum) {
  956. $is_add = false;
  957. }
  958. }
  959. if ($is_add) {
  960. //获取上级团长数据
  961. $parent_achievement = AchievementAwardLog::getOne([
  962. ['mall_id' => $mall_id],
  963. ['grant_id' => $grant_id],
  964. ['status' => StatusEnum::ENABLED],
  965. ['user_id' => $item->parent_team]
  966. ]);
  967. if (empty($parent_achievement)) {
  968. $del_award_log = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'grant_id' => $grant_id, 'user_id' => $item->parent_team, 'status' => StatusEnum::DELETE])
  969. ->select('personal_achievement')->orderBy('id desc')->one();
  970. $parent_achievement = new AchievementAwardLog();
  971. $parent_achievement->loadDefaultValues();
  972. $parent_achievement->mall_id = $mall_id;
  973. $parent_achievement->grant_id = $grant_id;
  974. $parent_achievement->personal_achievement = $del_award_log['personal_achievement'] ?? 0;
  975. $parent_achievement->user_id = $item->parent_team;
  976. $parent_achievement->sub_personal_achievement = 0.00;
  977. $parent_achievement->parent_team = AchievementLogic::getParentAchievementUser($item->parent_team);
  978. }
  979. $parent_achievement->team_achievement += $achievement_sum;
  980. $parent_achievement->achievement_sum += $achievement_sum;
  981. if (!$parent_achievement->save()) var_dump('保存上级团长数据失败user_id:' . $item->parent_team);
  982. }
  983. }
  984. }
  985. $j++;
  986. }
  987. }
  988. //迁移文件-统计未结算周期用户团队业绩
  989. public function statisAward($data)
  990. {
  991. $mall_list = Mall::getEnableMallList(true);
  992. if (!empty($mall_list)) {
  993. foreach ($mall_list as $mall) {
  994. $isInsall = MallAddons::isInstall($mall['id'], AchievementEnum::ADDONS_NAME);
  995. if (!$isInsall) continue;
  996. //获取所有未结算周期
  997. $grant_list = AchievementAwardLog::find()->where(['mall_id' => $mall['id'], 'is_settlement' => 0, 'status' => 1])->asArray()->all();
  998. if (empty($grant_list)) {
  999. continue;
  1000. }
  1001. $grant_ids = array_column($grant_list, 'grant_id', 'grant_id');
  1002. foreach ($grant_ids as $key => $value) {
  1003. //查找对应周期的订单
  1004. $grant_order_list = AchievementOrderLog::lists([
  1005. 'where' => [
  1006. ['mall_id' => $mall['id']],
  1007. ['status' => StatusEnum::ENABLED],
  1008. ['grant_id' => $value],
  1009. ]
  1010. ]);
  1011. if (empty($grant_order_list)) continue;
  1012. foreach ($grant_order_list as $k => $val) {
  1013. $parent_id_arr = UserPartitionRelationship::getParentIdArr($val['user_id']);
  1014. if (empty($parent_id_arr)) continue;
  1015. $parent_id_arr = array_reverse($parent_id_arr);
  1016. $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']);
  1017. //找到上级最近的一个团长
  1018. foreach ($parent_id_arr as $user_id) {
  1019. if (isset($parent_achievement_user_list[$user_id])) {
  1020. $achievement_user = $parent_achievement_user_list[$user_id];
  1021. break;
  1022. }
  1023. }
  1024. //没有团长则跳过
  1025. if (empty($achievement_user)) continue;
  1026. //获取团长的上级
  1027. $parent_id_arr = UserPartitionRelationship::getParentIdArr($achievement_user['user_id']);
  1028. if (empty($parent_id_arr)) continue;
  1029. $parent_id_arr = array_reverse($parent_id_arr);
  1030. //处理拓展表数据
  1031. foreach ($parent_id_arr as $uk => $uv) {
  1032. //实例化拓展表
  1033. $extra_info = AchievementAwardLogExtra::getOne([
  1034. ['mall_id' => $mall['id']],
  1035. ['user_id' => $uv],
  1036. ['grant_id' => $value],
  1037. ]);
  1038. if (empty($extra_info)) {
  1039. $extra_info = new AchievementAwardLogExtra();
  1040. $extra_info->mall_id = $mall['id'];
  1041. $extra_info->user_id = $uv;
  1042. $extra_info->grant_id = $value;
  1043. $extra_info->equal_first = 0.00;
  1044. $extra_info->equal_second = 0.00;
  1045. }
  1046. if ($val['price'] <= 0) continue;
  1047. $extra_info->team_achievement += $val['price'];
  1048. $extra_info->save();
  1049. if (!$extra_info->save()) echo 'user_id:' . $uv . 'order_detail_id:' . $val['order_detail_id'] . '写入失败';
  1050. }
  1051. }
  1052. }
  1053. }
  1054. }
  1055. return true;
  1056. }
  1057. public static function checkCanSettle($grant, $user_id)
  1058. {
  1059. $is_skip_settlement = 0;
  1060. //判断周期是否开启了 团长首页不发放奖励
  1061. if (empty($grant['is_leader_first_month_no_award']) || $grant['cycle'] !== 1) {
  1062. return $is_skip_settlement;
  1063. }
  1064. //判断团长是否首月
  1065. $achievement_user = AchievementUser::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  1066. $is_current_month = self::isCurrentMonth($achievement_user['created_at']);
  1067. return $is_current_month ? 1 : 0;
  1068. }
  1069. public static function isCurrentMonth($timestamp)
  1070. {
  1071. //判断是否时间戳是否是当月的
  1072. // 获取时间戳对应的年月
  1073. $targetYear = date('Y', $timestamp);
  1074. $targetMonth = date('m', $timestamp);
  1075. // 获取当前年月
  1076. $currentYear = date('Y');
  1077. $currentMonth = date('m');
  1078. return ($targetYear == $currentYear) && ($targetMonth == $currentMonth);
  1079. }
  1080. public static function fillParentTeam($mall_id, $grant)
  1081. {
  1082. $j = 1;
  1083. if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差
  1084. } else {
  1085. $grant_id = $grant['id'];
  1086. while (true) {
  1087. $limit = 1000;
  1088. $offset = ($j - 1) * $limit;
  1089. $list = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])
  1090. ->andWhere(['parent_team' => ''])
  1091. ->offset($offset)
  1092. ->limit($limit)
  1093. ->all();
  1094. if (empty($list)) {
  1095. break;
  1096. }
  1097. foreach ($list as $item) {
  1098. $item->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']);
  1099. $item->save();
  1100. }
  1101. $j++;
  1102. }
  1103. }
  1104. }
  1105. /**
  1106. * 迁移文件-统计未结算周期用户团队业绩,修复AwardLog
  1107. * @return true
  1108. * @throws Exception
  1109. */
  1110. public static function fixAwardLog()
  1111. {
  1112. $mall_list = Mall::getEnableMallList(true);
  1113. if (!empty($mall_list)) {
  1114. foreach ($mall_list as $mall) {
  1115. $isInsall = MallAddons::isInstall($mall['id'], AchievementEnum::ADDONS_NAME);
  1116. if (!$isInsall) continue;
  1117. //获取所有未结算周期
  1118. $award_log_list = AchievementAwardLog::find()->where(['mall_id' => $mall['id'], 'is_settlement' => 0, 'status' => 1])->all();
  1119. if (empty($award_log_list)) continue;
  1120. $grant_ids = array_column($award_log_list, 'grant_id');
  1121. $grant_list = AchievementGrantLog::find()->where(['id' => $grant_ids])->indexBy('id')->all();
  1122. foreach ($award_log_list as $award_log) {
  1123. $grant = $grant_list[$award_log['grant_id']];
  1124. $team_achievement_data = AchievementAwardLogExtra::getOne([
  1125. ['mall_id' => $award_log['mall_id']],
  1126. ['user_id' => $award_log['user_id']],
  1127. ['grant_id' => $award_log['grant_id']],
  1128. ], true);
  1129. if (empty($team_achievement_data)) {
  1130. $team_achievement = self::checkAchievement($award_log['mall_id'], $award_log['grant_id'], $award_log['user_id']);
  1131. } else {
  1132. $team_achievement = $team_achievement_data['team_achievement'];
  1133. }
  1134. $award_log->team_achievement = $team_achievement;
  1135. $award_log->achievement_sum = $team_achievement + $award_log->personal_achievement;
  1136. $award_log->save();
  1137. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']);
  1138. $award_log->award_proportion = $award['proportion'];
  1139. if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差
  1140. $award_log->award_money = $award['money'];
  1141. $sum_money = 0;
  1142. if (isset($sum_list[$award_log['user_id']])) $sum_money = $sum_list[$award_log['user_id']]['money'];
  1143. $sum_money = $sum_money + $award['money'];
  1144. $award_log->award_sum = $sum_money;
  1145. if ($grant['settlement_mode'] == 2) {
  1146. $award_log->parent_team = AchievementLogic::getParentAchievementUser($award_log['user_id']);
  1147. }
  1148. } else {
  1149. $award_log->parent_team = AchievementLogic::getParentAchievementUser($award_log['user_id']);
  1150. $award_log->proportion_money = $award['money'];
  1151. }
  1152. $is_skip_settlement = self::checkCanSettle($grant, $award_log->user_id);
  1153. $award_log->is_skip_settlement = $is_skip_settlement;
  1154. if (!$award_log->save()) throw new \Exception($award_log['user_id'] . "业绩添加父级业绩日志时失败");
  1155. }
  1156. foreach ($grant_list as $grant) {
  1157. $configs = \Yii::$app->services->setting->addons->get($grant['mall_id'], AddonsEnum::ADDONS_NAME_ACHIEVEMENT, 'basic');
  1158. $award_log_list = AchievementAwardLog::find()->where(['mall_id' => $grant['mall_id'], 'grant_id' => $grant['id']])->all();
  1159. if ($grant->settlement_mode == 1) self::fixPlanB($grant, $award_log_list);//极差
  1160. if ($grant->settlement_mode == 2) self::fixPlanC($grant, $award_log_list, $configs);//极差
  1161. $c_equal_type = $configs['equal_type'] ?? 0;
  1162. if (!empty($c_equal_type)) self::planD($grant, $award_log_list, $configs);
  1163. self::fixSettleEqual($grant, $award_log_list);
  1164. self::updateGrant($grant);
  1165. }
  1166. }
  1167. }
  1168. return true;
  1169. }
  1170. /**
  1171. * 迁移文件-统计未结算周期用户团队业绩,修复planB
  1172. *
  1173. * @param $grant
  1174. * @param $award_log_list
  1175. * @return int|mixed
  1176. * @throws Exception
  1177. */
  1178. public static function fixPlanB($grant, $award_log_list)
  1179. {
  1180. $user_id_arr = array_column($award_log_list, 'user_id');
  1181. $sum_award = 0;
  1182. $achievement_award_log_list = AchievementAwardLog::lists([
  1183. 'where' => [
  1184. ['parent_team' => $user_id_arr],
  1185. ['mall_id' => $grant['mall_id']],
  1186. ['grant_id' => $grant['id']],
  1187. ['status' => StatusEnum::ENABLED],
  1188. ],
  1189. 'index' => 'parent_team',
  1190. 'group' => 'parent_team',
  1191. 'select' => 'sum(proportion_money) as money,parent_team',
  1192. ]);
  1193. $achievement_award_log_list_end = AchievementAwardLog::lists([
  1194. 'where' => [
  1195. ['parent_team' => $user_id_arr],
  1196. ['mall_id' => $grant['mall_id']],
  1197. ['status' => StatusEnum::ENABLED],
  1198. ['is_end' => 1],
  1199. ],
  1200. 'index' => 'user_id',
  1201. 'group' => 'user_id',
  1202. 'select' => 'sum(proportion_money+equal_money) as money,user_id',
  1203. ]);
  1204. foreach ($award_log_list as $k => $v) {
  1205. //查看所有下级的结算金额
  1206. $money = 0;
  1207. if (isset($achievement_award_log_list[$v['user_id']])) $money = $achievement_award_log_list[$v['user_id']]['money'];
  1208. var_dump($money);
  1209. $award_money = $v['proportion_money'] - $money > 0 ? $v['proportion_money'] - $money : 0;
  1210. var_dump($v['user_id'] . '::::' . $award_money);
  1211. $v->award_money = $award_money;
  1212. //总计
  1213. $sum_money = 0;
  1214. $sum_money += $award_money;
  1215. if (isset($achievement_award_log_list_end[$v['user_id']])) $sum_money += $achievement_award_log_list_end[$v['user_id']]['money'];
  1216. $v->award_sum = $sum_money;
  1217. if (!$v->save()) throw new \Exception("业绩修改奖励日志失败");
  1218. $sum_award += $v->award_money;
  1219. }
  1220. return $sum_award;
  1221. }
  1222. /**
  1223. * 迁移文件-统计未结算周期用户团队业绩,修复planC
  1224. *
  1225. * @param $grant
  1226. * @param $award_log_list
  1227. * @param $configs
  1228. * @return void
  1229. * @throws Exception
  1230. */
  1231. public static function fixPlanC($grant, $award_log_list, $configs)
  1232. {
  1233. $c_equal_type = $configs['equal_type'] ?? 0;
  1234. foreach ($award_log_list as $value) {
  1235. $first_user_id = $value['user_id'];
  1236. $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id);
  1237. $parent_id_arr[] = $first_user_id;
  1238. $parent_id_arr = array_reverse($parent_id_arr);
  1239. $award_list = AchievementAwardLog::lists([
  1240. 'where' => [
  1241. ['mall_id' => $grant['mall_id']],
  1242. ['grant_id' => $grant['id']],
  1243. ['user_id' => $parent_id_arr],
  1244. ],
  1245. ], false);
  1246. $award_arr = array_column($award_list, null, 'user_id');
  1247. //获取上级团长信息
  1248. $team_user_data = AchievementUser::lists([
  1249. 'where' => [
  1250. ['mall_id' => $grant['mall_id']],
  1251. ['user_id' => $parent_id_arr],
  1252. ['status' => StatusEnum::ENABLED]
  1253. ],
  1254. 'index' => 'user_id',
  1255. ]);
  1256. foreach ($parent_id_arr as $id) {
  1257. //获取团队业绩数据
  1258. if (empty($award_arr[$id])) {
  1259. //如果不是团长,则跳过
  1260. if (empty($team_user_data[$id])) continue;
  1261. $item = new AchievementAwardLog();
  1262. $item->loadDefaultValues();
  1263. $item->mall_id = $grant->mall_id;
  1264. $item->grant_id = $grant->id;
  1265. $item->user_id = $id;
  1266. $item->sub_personal_achievement = 0.00;
  1267. $item->parent_team = AchievementLogic::getParentAchievementUser($id);
  1268. //获取当前用户上级
  1269. } else {
  1270. $item = $award_arr[$id];
  1271. }
  1272. //数据操作
  1273. $item['team_achievement'] = AchievementLogic::getTeamAchievementByParentTeamC($id, $grant['id']);
  1274. $item['equal_first'] = AchievementLogic::getEqualFirstByParentTeamC($id, $grant['id']);
  1275. $item['equal_second'] = AchievementLogic::getEqualSecondByParentTeamC($id, $grant['id']);
  1276. $item['team_achievement'] = $item['team_achievement'] ?? 0;
  1277. $item['equal_first'] = $item['equal_first'] ?? 0;
  1278. $item['equal_second'] = $item['equal_second'] ?? 0;
  1279. $team_achievement = $achievement_sum = $item['team_achievement'];
  1280. $achievement_sum += $item['personal_achievement'];
  1281. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $achievement_sum, $item['personal_achievement'], $grant['settlement_mode'], $grant->is_team_achievement);
  1282. $item->award_proportion = $award['proportion'];
  1283. $item->award_money = $award['money'];
  1284. $item->team_achievement = $team_achievement ?? 0.00;
  1285. $item->achievement_sum = $achievement_sum;
  1286. $sum_money = 0;
  1287. $sum_list = AchievementAwardLog::lists([
  1288. 'where' => [
  1289. ['user_id' => $item['user_id']],
  1290. ['mall_id' => $grant['mall_id']],
  1291. ['status' => StatusEnum::ENABLED],
  1292. ['is_end' => 1]
  1293. ],
  1294. 'index' => 'user_id',
  1295. 'group' => 'user_id',
  1296. 'select' => 'sum(award_money+equal_money) as money,user_id'
  1297. ]);
  1298. if (isset($sum_list[$item['user_id']])) $sum_money = $sum_list[$item['user_id']]['money'];
  1299. $sum_money = $sum_money + $award['money'];
  1300. $item->award_sum = $sum_money;
  1301. $item->team_equal_first = empty($c_equal_type) ? $item->equal_first : 0;
  1302. $item->team_equal_second = empty($c_equal_type) ? $item->equal_second : 0;
  1303. if (!$item->save()) throw new \Exception("业绩添加个人业绩日志时失败");
  1304. }
  1305. }
  1306. }
  1307. /**
  1308. * 迁移文件-统计未结算周期用户团队业绩,修复planD
  1309. *
  1310. * @param $grant
  1311. * @param $award_log_list
  1312. * @param $config
  1313. * @return void
  1314. * @throws Exception
  1315. */
  1316. public static function fixPlanD($grant, $award_log_list, $config)
  1317. {
  1318. // 取出所有
  1319. $grant_id = $grant['id'];
  1320. $mall_id = $grant['mall_id'];
  1321. foreach ($award_log_list as $value) {
  1322. $current_id = $value['user_id'];
  1323. $first_user_id = $value['user_id'];
  1324. $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id);
  1325. if (!empty($parent_id_arr)) $current_id = current($parent_id_arr);
  1326. $child_ids = UserPartitionRelationship::getChildIdArr($current_id);
  1327. $child_ids[] = $current_id;
  1328. $list = AchievementAwardLog::find()
  1329. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $child_ids])
  1330. ->all();
  1331. /**
  1332. * @var $item AchievementAwardLog
  1333. */
  1334. foreach ($list as $item) {
  1335. $item->equal_first = bcmul($item->award_money, bcmul($config['equal_price_first'], 0.01, 3), 3);
  1336. $item->equal_second = bcmul($item->award_money, bcmul($config['equal_price_second'], 0.01, 3), 3);
  1337. $item->team_equal_first = 0;
  1338. $item->team_equal_second = 0;
  1339. $item->equal_money = 0; // 先将平级奖设置为0
  1340. echo "$item->id $item->user_id $item->award_money $item->equal_first $item->equal_first \n";
  1341. if (!$item->save()) throw new \Exception("重新计算平级奖失败 {$item->id} !!");
  1342. }
  1343. }
  1344. }
  1345. /**
  1346. * 迁移文件-统计未结算周期用户团队业绩,修复settleEqual
  1347. * @param $grant
  1348. * @param $award_log_list
  1349. * @return true
  1350. * @throws Exception
  1351. */
  1352. public static function fixSettleEqual($grant, $award_log_list)
  1353. {
  1354. foreach ($award_log_list as $value) {
  1355. $grant_id = $grant['id'];
  1356. $mall_id = $grant['mall_id'];
  1357. $user_id = $value['user_id'];
  1358. $current_id = $user_id;
  1359. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  1360. if (!empty($parent_id_arr)) $current_id = current($parent_id_arr);
  1361. $child_ids = UserPartitionRelationship::getChildIdArr($current_id);
  1362. $list = AchievementAwardLog::find()
  1363. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $child_ids])
  1364. ->andWhere(['>', 'award_money', 0])
  1365. ->all();
  1366. $is_send_ids = [];
  1367. foreach ($list as $item) {
  1368. $parent_id_arr = UserPartitionRelationship::getParentIdArr($item['user_id']);
  1369. $parent_id_arr = array_reverse($parent_id_arr);
  1370. $deep = 1;
  1371. $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id'], false);
  1372. foreach ($parent_id_arr as $user_id) {
  1373. if (isset($parent_achievement_user_list[$user_id])) {
  1374. $parent_award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $user_id]);
  1375. if (empty($parent_award_log)) {
  1376. $parent_award_log = new AchievementAwardLog();
  1377. $parent_award_log->mall_id = $mall_id;
  1378. $parent_award_log->grant_id = $grant_id;
  1379. $parent_award_log->user_id = $user_id;
  1380. }
  1381. if ($deep == 1) {
  1382. $equal_money = $item['equal_first'] + $item['team_equal_first'];
  1383. } elseif ($deep == 2) {
  1384. $equal_money = $item['equal_second'] + $item['team_equal_second'];
  1385. }
  1386. if ($equal_money > 0) {
  1387. //首次添加重置平级奖
  1388. if (!in_array($user_id, $is_send_ids)) {
  1389. $parent_award_log->equal_money = 0;
  1390. }
  1391. $parent_award_log->equal_money += $equal_money;
  1392. if (!$parent_award_log->save()) throw new \Exception($parent_award_log['user_id'] . '平级奖励发放异常:' . AchievementAwardLog::getStaticError());
  1393. $is_send_ids[] = $user_id;
  1394. }
  1395. if ($deep == 2) break;
  1396. $deep++;
  1397. }
  1398. }
  1399. }
  1400. }
  1401. return true;
  1402. }
  1403. }