AchievementOrderLogic1.php 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  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\AchievementCommissionItemSetting;
  6. use addons\Achievement\common\models\AchievementFirstOrder;
  7. use addons\Achievement\common\models\AchievementGrantLog;
  8. use addons\Achievement\common\models\AchievementOrderLog;
  9. use addons\Achievement\common\models\AchievementUser;
  10. use addons\CloudStock\common\models\CloudStockGoods;
  11. use common\enums\AddonsEnum;
  12. use common\enums\StatusEnum;
  13. use common\models\mall\MallAddons;
  14. use common\models\order\Order;
  15. use common\models\order\OrderDetail;
  16. use common\models\user\UserPartitionRelationship;
  17. class AchievementOrderLogic1
  18. {
  19. public static function orderStatistics($order)
  20. {
  21. $t = \Yii::$app->db->beginTransaction();
  22. try {
  23. $mall_id = $order['mall_id'];
  24. if (empty(MallAddons::isInstall($order['mall_id'], AchievementEnum::ADDONS_NAME))){
  25. throw new \Exception(false);
  26. }
  27. //判断业绩奖励是否开启
  28. $configs = \Yii::$app->services->setting->addons->get($order['mall_id'], AddonsEnum::ADDONS_NAME_ACHIEVEMENT, 'basic');
  29. if (empty($configs['status'])) throw new \Exception(false);
  30. $order_detail_list = OrderDetail::findAll(['order_id' => $order['id']]);
  31. if (empty($order_detail_list)) throw new \Exception(false);
  32. $goods_id_arr = array_column($order_detail_list, 'goods_id');
  33. //判断云库存 todo
  34. if (MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_CLOUD_STOCK)) {
  35. //过滤掉,由云库存补货,平台扣库存触发
  36. $cloud_stock_goods_list = CloudStockGoods::lists(['where' => [['goods_id' => $goods_id_arr], ['status' => StatusEnum::ENABLED]], 'select' => 'goods_id']);
  37. $cloud_stock_goods_id_arr = array_column($cloud_stock_goods_list, 'goods_id');
  38. foreach ($order_detail_list as $k => &$item) {
  39. if (in_array($item['goods_id'], $cloud_stock_goods_id_arr)) unset($order_detail_list[$k]);
  40. }
  41. }
  42. if (empty($order_detail_list)) throw new \Exception(false);
  43. $grant = AchievementGrantLog::findOne(['mall_id' => $mall_id, 'status' => 1, 'is_wait' => 0, 'is_create' => 0,
  44. // 'id' => 179
  45. ]);
  46. if (empty($grant)) throw new \Exception(false);
  47. if ($grant['statistical_methods'] == 0 && $order['order_status'] != 4) {
  48. //订单完成
  49. throw new \Exception(false);
  50. }
  51. if ($grant['statistical_methods'] == 1 && ($order['pay_status'] != 1|| $order['order_status'] != 1)) {
  52. //支付完成
  53. throw new \Exception(false);
  54. }
  55. self::addData($mall_id, $order['order_no'], $order['user_id'], $grant['id'], $order['created_at'], 0,
  56. $goods_id_arr, $order_detail_list, $grant, $configs['equal_type'] ?? 0, $configs);
  57. $t->commit();
  58. return true;
  59. } catch (\Exception $e) {
  60. $t->rollBack();
  61. if($e->getMessage()){
  62. var_dump('AchievementOrderLogic:orderStatistics::::order_id:'.$order['id'].':::: '. $e->getMessage() .' -> '. $e->getLine() .' -> '. $e->getFile());
  63. }
  64. return true;
  65. }
  66. }
  67. //生成统计业绩数据
  68. 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)
  69. {
  70. $res = AchievementOrderLog::findOne(['order_no' => $order_no]);
  71. if (!empty($res)) throw new \Exception(false);
  72. $is_self = true;
  73. if(!$is_cloud){
  74. //关闭后,购买团长升级礼包,首单不计算自身业绩。
  75. $configs = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_ACHIEVEMENT, 'basic');
  76. if(isset($configs['first_order'])&&$configs['first_order']==0){
  77. $configs_goods_ids = [];
  78. if(!empty($configs['goods_ids'])){
  79. $configs_goods_ids = json_decode($configs['goods_ids'],true);
  80. }
  81. if(array_intersect($configs_goods_ids,$goods_id_arr)){
  82. $res = AchievementFirstOrder::lists([
  83. 'where'=>[
  84. ['mall_id'=>$mall_id],
  85. ['user_id'=>$user_id],
  86. ['goods_id'=>$goods_id_arr],
  87. ['status'=>StatusEnum::ENABLED],
  88. ],
  89. ]);
  90. if(empty($res)){
  91. $achievement_user = null;
  92. $is_self = false;
  93. foreach ($order_detail_list as $order_detail){
  94. $add_data = [
  95. 'mall_id'=>$mall_id,
  96. 'user_id'=>$user_id,
  97. 'order_id'=>$order_detail['order_id'],
  98. 'order_detail_id'=>$order_detail['id'],
  99. 'goods_id'=>$order_detail['goods_id'],
  100. ];
  101. $res = AchievementFirstOrder::setData($add_data);
  102. if(empty($res)) throw new \Exception(AchievementFirstOrder::getStaticError());
  103. }
  104. }
  105. }
  106. }
  107. }
  108. if($is_self) $achievement_user = AchievementUser::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  109. if (empty($achievement_user)) {
  110. //订单付款者不是团长身份,就往他的上级找
  111. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  112. $parent_id_arr = array_reverse($parent_id_arr);
  113. $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']);
  114. foreach ($parent_id_arr as $user_id) {
  115. if (isset($parent_achievement_user_list[$user_id])) {
  116. $achievement_user = $parent_achievement_user_list[$user_id];
  117. break;
  118. }
  119. }
  120. }
  121. if (empty($achievement_user)) throw new \Exception(false);
  122. $price = 0;
  123. $insert = [];
  124. $time = time();
  125. $order = Order::findOne(['order_no' => $order_no]);
  126. if ($order['mch_id'] > 0 || $order['store_id'] > 0) {
  127. $item_setting_list = [];
  128. } else {
  129. $item_setting_list = AchievementCommissionItemSetting::lists(
  130. [
  131. 'where' => [
  132. ['item_id' => $goods_id_arr],
  133. ['status' => StatusEnum::ENABLED]
  134. ],
  135. 'index' => 'item_id'
  136. ]);
  137. }
  138. $order_detail_id_arr = array_column($order_detail_list, 'id');
  139. $where = [
  140. ['order_detail_id' => $order_detail_id_arr],
  141. ['is_cloud'=>$is_cloud]
  142. ];
  143. $log_list = AchievementOrderLog::lists(['where' =>$where, 'select' => 'id,goods_id']);
  144. $have_add_order_detail_id_arr = array_column($log_list, 'id');
  145. //独立平级奖励
  146. $user_equal_first = 0;
  147. $user_equal_second = 0;
  148. foreach ($order_detail_list as $item) {
  149. if (in_array($item['id'], $have_add_order_detail_id_arr)) continue;
  150. $goods_id = $item["goods_id"];
  151. $total_price = $item['goods_price'];
  152. $is_alone_equal = 0;
  153. $equal_first = 0;
  154. $equal_second = 0;
  155. //查询订单商品是否设置单独的商品业绩奖励
  156. if (isset($item_setting_list[$goods_id])) {
  157. //是否参与业绩奖励
  158. if (!empty($item_setting_list[$goods_id]['is_join'])) {
  159. if (!empty($item_setting_list[$goods_id]['is_enable'])) {
  160. if ($item_setting_list[$goods_id]['is_percent'] == 0) {
  161. $total_price = $item_setting_list[$goods_id]['price'] * $total_price / 100; // 业绩 百分比
  162. }
  163. if ($item_setting_list[$goods_id]['is_percent'] == 1) {
  164. $total_price = $item_setting_list[$goods_id]['price'] * $item['num']; // 业绩 固定
  165. }
  166. }
  167. //独立平级奖励 基础设置开启了平级奖 并且 商品独立设置也开启了平级奖
  168. if ($grant->is_equal == 1 && !empty($item_setting_list[$goods_id]['is_alone_equal'])) {
  169. if ($item_setting_list[$goods_id]['is_alone_equal_percent'] == 0) {
  170. $equal_first = $item_setting_list[$goods_id]['alone_equal_first'] * $total_price / 100; // 平级一 百分比
  171. $equal_second = $item_setting_list[$goods_id]['alone_equal_second'] * $total_price / 100; // 平级二 百分比
  172. }
  173. if ($item_setting_list[$goods_id]['is_alone_equal_percent'] == 1) {
  174. $equal_first = $item_setting_list[$goods_id]['alone_equal_first'] * $item['num']; // 平级一 固定
  175. $equal_second = $item_setting_list[$goods_id]['alone_equal_second'] * $item['num'];// 平级二 固定
  176. }
  177. $is_alone_equal = $item_setting_list[$goods_id]['is_alone_equal'];
  178. $user_equal_first += $equal_first;
  179. $user_equal_second += $equal_second;
  180. }
  181. } else {
  182. $total_price = 0;
  183. }
  184. //平级奖励 平台开启平级奖并且商品独立设置没有开启平级奖
  185. if($grant->is_equal == 1 && empty($is_alone_equal)){
  186. $equal_first = $grant->equal_price_first * $total_price / 100; // 一级百分比 比例 * 业绩 / 100
  187. $equal_second = $grant->equal_price_second * $total_price / 100; // 二级百分比 比例 * 业绩 / 100
  188. $user_equal_first += $equal_first;
  189. $user_equal_second += $equal_second;
  190. }
  191. }
  192. $insert[] = [
  193. $mall_id,
  194. $item['user_id'],
  195. $grant_id,
  196. $goods_id,
  197. $order_no,
  198. $item['id'],
  199. $user_id,
  200. $total_price,
  201. $is_cloud,
  202. $created_at,
  203. $time,
  204. $time,
  205. StatusEnum::ENABLED,
  206. $is_alone_equal,
  207. $equal_first,
  208. $equal_second,
  209. ];
  210. $price += $total_price;
  211. }
  212. if(empty($insert)) throw new \Exception('insert数组为空');
  213. $field = ['mall_id', 'user_id', 'grant_id', 'goods_id', 'order_no', 'order_detail_id',
  214. 'chief_user_id', 'price', 'is_cloud', 'order_create_time', 'created_at', 'updated_at', 'status','is_alone_equal','equal_first','equal_second'];
  215. // 批量插入数据
  216. $res = \Yii::$app->db->createCommand()->batchInsert(AchievementOrderLog::tableName(), $field, $insert)->execute();
  217. if (empty($res)) throw new \Exception('添加业绩订单日志失败');
  218. $list = [];
  219. $user_id_arr = [];
  220. [$award_log, $old_personal_achievement, $old_achievement_sum] = self::handleSelf($achievement_user['user_id'], $price, $grant, $list,
  221. $user_id_arr,$user_equal_first,$user_equal_second, $c_equal_type, $config);
  222. $awards = self::handleParent($user_id, $grant, $list, $user_id_arr);
  223. // if (!empty($c_equal_type)) { // 有可能有的业绩已经清0了 那么就需要将平级奖去掉
  224. // self::reWriteEqual($award_log,
  225. // bcmul($awards[0]['money'] ?? 0, bcmul($config['equal_price_first'], 0.01, 3), 3),
  226. // bcmul($awards[1]['money'] ?? 0, bcmul($config['equal_price_second'], 0.01, 3), 3));
  227. // foreach ($awards as $t_award) {
  228. // $_awards = self::_handleParent($t_award['user_id'], $grant);
  229. // $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $t_award['user_id']]);
  230. // $__ = $_awards[0]['money'] ?? 0;
  231. // $___ = $_awards[1]['money'] ?? 0;
  232. // \Yii::error("_handleParent -> {$award_log['id']}, {$__}, {$___}");
  233. // self::reWriteEqual($award_log,
  234. // bcmul($_awards[0]['money'] ?? 0, bcmul($config['equal_price_first'], 0.01, 3), 3),
  235. // bcmul($_awards[1]['money'] ?? 0, bcmul($config['equal_price_second'], 0.01, 3), 3));
  236. // }
  237. // unset($award_log);
  238. // }
  239. if ($grant->settlement_mode == 1) self::planB($grant, $list, $user_id_arr);//极差
  240. if ($grant->settlement_mode == 2) {
  241. self::planC($grant, $list, $achievement_user['user_id'], $c_equal_type, $config);
  242. }//业绩极差 - 团队平级奖这里面有处理
  243. //平级奖
  244. self::settleEqual($grant, $achievement_user['user_id'], $c_equal_type, $config);
  245. // }
  246. self::updateGrant($grant);
  247. //
  248. }
  249. public static function planB($grant, $list, $user_id_arr)
  250. {
  251. $sum_award = 0;
  252. $achievement_award_log_list = AchievementAwardLog::lists([
  253. 'where' => [
  254. ['parent_team' => $user_id_arr],
  255. ['mall_id' => $grant['mall_id']],
  256. ['grant_id' => $grant['id']],
  257. ['status' => StatusEnum::ENABLED],
  258. ],
  259. 'index' => 'parent_team',
  260. 'group' => 'parent_team',
  261. 'select' => 'sum(proportion_money) as money,parent_team',
  262. ]);
  263. $achievement_award_log_list_end = AchievementAwardLog::lists([
  264. 'where' => [
  265. ['parent_team' => $user_id_arr],
  266. ['mall_id' => $grant['mall_id']],
  267. ['status' => StatusEnum::ENABLED],
  268. ['is_end' => 1],
  269. ],
  270. 'index' => 'user_id',
  271. 'group' => 'user_id',
  272. 'select' => 'sum(proportion_money+equal_money) as money,user_id',
  273. ]);
  274. foreach ($list as $k => $v) {
  275. //查看所有下级的结算金额
  276. $money = 0;
  277. if (isset($achievement_award_log_list[$v['user_id']])) $money = $achievement_award_log_list[$v['user_id']]['money'];
  278. var_dump($money);
  279. $award_money = $v['proportion_money'] - $money > 0 ? $v['proportion_money'] - $money : 0;
  280. var_dump($v['user_id'] . '::::' . $award_money);
  281. $v->award_money = $award_money;
  282. //总计
  283. $sum_money = 0;
  284. $sum_money += $award_money;
  285. if (isset($achievement_award_log_list_end[$v['user_id']])) $sum_money += $achievement_award_log_list_end[$v['user_id']]['money'];
  286. $v->award_sum = $sum_money;
  287. if (!$v->save()) throw new \Exception("业绩修改奖励日志失败");
  288. $sum_award += $v->award_money;
  289. }
  290. return $sum_award;
  291. }
  292. public static function reWriteEqual($award_log, $user_equal_first,$user_equal_second)
  293. {
  294. // 需要重新计算 平级奖 - 每个商品不一样?
  295. $award_log->equal_first += $user_equal_first;
  296. $award_log->equal_second += $user_equal_second;
  297. $flag = $award_log->save();
  298. echo "reWriteEqual -> $award_log->id, $user_equal_first,$user_equal_second \n";
  299. if (!$flag) throw new \Exception("重写平级奖失败");
  300. }
  301. public static function _rewriteEqual($grant, $award_list, $first_user_id)
  302. {
  303. // 上级有业绩,那么 平级奖写在我这里
  304. $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id);
  305. $parent_id_arr = array_reverse($parent_id_arr);
  306. $list = [];
  307. foreach($parent_id_arr as $parent_id){
  308. foreach($award_list as $award_log){
  309. if($parent_id == $award_log->user_id){
  310. $list[] = $award_log;
  311. }
  312. }
  313. }
  314. $grant_id = $grant['id'];
  315. $mall_id = $grant['mall_id'];
  316. //同一条关系链,已给最近上级计算团队业绩,再往上上级不再计算对应团队业绩
  317. $achievement_child_ids = [];
  318. $team_user_ids = AchievementAwardLog::find()->where(['grant_id'=>$grant_id,'mall_id'=>$mall_id,'status'=>StatusEnum::ENABLED])->select('user_id')->column();
  319. foreach($list as $item){
  320. $child_ids = UserPartitionRelationship::getChildIdArr($item['user_id']);
  321. //$child_ids = array_diff($child_ids, $achievement_child_ids);
  322. //找到最下层团队长
  323. foreach($child_ids as $key => $child_id){
  324. $child_child_ids = UserPartitionRelationship::getChildIdArr($child_id);
  325. if(!empty(array_intersect($child_child_ids,$team_user_ids))){
  326. unset($child_ids[$key]);
  327. }
  328. }
  329. $last_childs = AchievementAwardLog::find()
  330. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$child_ids,'team_achievement'=>0])
  331. ->all();
  332. $total_personal_achievement = 0;
  333. $equal_first = 0;
  334. $equal_second = 0;
  335. //$last_child_ids = [];
  336. foreach($last_childs as $child){
  337. $user_id = $child['user_id'];
  338. //$last_child_ids[] = $user_id;
  339. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  340. $parent_id_arr = array_reverse($parent_id_arr);
  341. $log = null;
  342. $parent_achievement = 0;
  343. $parent_equal_first = 0;
  344. $parent_equal_second = 0;
  345. foreach($parent_id_arr as $parent_id){
  346. $log = AchievementAwardLog::find()
  347. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$parent_id])
  348. //->andWhere(['>','award_money',0])
  349. ->one();
  350. if(($log && $log->award_money > 0) || empty($log)) break;
  351. if($parent_id == $item['user_id']) break;
  352. $parent_achievement += $log['personal_achievement'];
  353. $parent_equal_first += $log['equal_first'];
  354. $parent_equal_second += $log['equal_second'];
  355. }
  356. if($log && $log['user_id'] != $item['user_id']) continue;
  357. $total_personal_achievement += $parent_achievement;
  358. $equal_first += $parent_equal_first;
  359. $equal_second += $parent_equal_second;
  360. if($child['award_money'] > 0) continue;
  361. $total_personal_achievement += $child['personal_achievement'];
  362. $equal_first += $child['equal_first'];
  363. $equal_second += $child['equal_second'];
  364. }
  365. $total_personal_achievement += $item['personal_achievement'];
  366. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $total_personal_achievement, $item['personal_achievement'], $grant['settlement_mode']);
  367. foreach ($last_childs as $child) {
  368. $user_id = $child['user_id'];
  369. //$last_child_ids[] = $user_id;
  370. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  371. $parent_id_arr = array_reverse($parent_id_arr);
  372. $log = null;
  373. foreach($parent_id_arr as $parent_id){
  374. }
  375. }
  376. // $item->award_money = $award['money'];
  377. echo "$item->id, $equal_first, $equal_second \n";
  378. $item->team_equal_first = $equal_first;
  379. $item->team_equal_second = $equal_second;
  380. if (!$item->save()) throw new \Exception("业绩添加个人业绩日志时失败");
  381. //if($item->award_money <= 0) $achievement_child_ids = array_merge($achievement_child_ids,$last_child_ids);
  382. }
  383. }
  384. public static function handleSelf($user_id, $price, $grant, &$list, &$user_id_arr,$user_equal_first,$user_equal_second, $c_equal_type, $config)
  385. {
  386. $grant_id = $grant['id'];
  387. $mall_id = $grant['mall_id'];
  388. $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $user_id]);
  389. if (empty($award_log)) {
  390. $award_log = new AchievementAwardLog();
  391. $award_log->mall_id = $mall_id;
  392. $award_log->grant_id = $grant_id;
  393. $award_log->user_id = $user_id;
  394. }
  395. // 旧的
  396. $_award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']);
  397. $old_personal_achievement = $award_log->personal_achievement;
  398. $old_achievement_sum = $award_log->achievement_sum;
  399. $award_log->personal_achievement += $price;
  400. $award_log->achievement_sum += $price;
  401. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']);
  402. // 需要重新计算 平级奖 - 每个商品不一样?
  403. // $old_
  404. $award_log->equal_first += empty($c_equal_type) ? $user_equal_first :
  405. bcmul(bcsub($award['money'], $_award['money'], 3), bcmul($config['equal_price_first'], 0.01, 3), 3); // 获得的收益比例
  406. $award_log->equal_second += empty($c_equal_type) ? $user_equal_second :
  407. bcmul(bcsub($award['money'], $_award['money'], 3), bcmul($config['equal_price_second'], 0.01, 3), 3);
  408. \Yii::error("handleSelf-> {$c_equal_type} {$award_log->id} $grant_id $user_id -> {$award['money']}, {$_award['money']}, {$config['equal_price_first']}, {$config['equal_price_second']}, $award_log->equal_first, $award_log->equal_second");
  409. $sum_list = AchievementAwardLog::lists([
  410. 'where' => [
  411. ['user_id' => $user_id],
  412. ['mall_id' => $grant['mall_id']],
  413. ['status' => StatusEnum::ENABLED],
  414. ['is_end' => 1]
  415. ],
  416. 'index' => 'user_id',
  417. 'group' => 'user_id',
  418. 'select' => 'sum(award_money+equal_money) as money,user_id'
  419. ]);
  420. $award_log->award_proportion = $award['proportion'];
  421. if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差
  422. $award_log->award_money = $award['money'];
  423. $sum_money = 0;
  424. if (isset($sum_list[$award_log['user_id']])) $sum_money = $sum_list[$award_log['user_id']]['money'];
  425. $sum_money = $sum_money + $award['money'];
  426. $award_log->award_sum = $sum_money;
  427. } else {
  428. $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id);
  429. $award_log->proportion_money = $award['money'];
  430. }
  431. if (!$award_log->save()) throw new \Exception("业绩添加个人业绩日志时失败");
  432. $list[] = $award_log;
  433. $user_id_arr[] = $award_log['user_id'];
  434. return [
  435. $award_log,
  436. $old_personal_achievement,
  437. $old_achievement_sum
  438. ];
  439. }
  440. public static function _handleParent($user_id, $grant)
  441. {
  442. $grant_id = $grant['id'];
  443. $mall_id = $grant['mall_id'];
  444. //給所有的上级加上日志,就算为空也加
  445. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  446. $parent_id_arr = array_reverse($parent_id_arr);
  447. $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']);
  448. //给父级团队业绩
  449. $sum_list = AchievementAwardLog::lists([
  450. 'where' => [
  451. ['user_id' => $parent_id_arr],
  452. ['mall_id' => $mall_id],
  453. ['status' => StatusEnum::ENABLED],
  454. ['is_end' => 1]
  455. ],
  456. 'index' => 'user_id',
  457. 'group' => 'user_id',
  458. 'select' => 'sum(award_money+equal_money) as money,user_id'
  459. ]);
  460. $awards = [];
  461. foreach ($parent_achievement_user_list as $k => $item) {
  462. $child_ids = UserPartitionRelationship::getChildIdArr($item['user_id']);
  463. $personal_achievement = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$child_ids])
  464. ->sum('personal_achievement');
  465. if(!isset($personal_achievement)) $personal_achievement = 0;
  466. $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $item['user_id']]);
  467. if (empty($award_log)) {
  468. $award_log = new AchievementAwardLog();
  469. $award_log->mall_id = $mall_id;
  470. $award_log->grant_id = $grant_id;
  471. $award_log->user_id = $item['user_id'];
  472. }
  473. $award_log->personal_achievement += 0;
  474. $award_log->team_achievement = $personal_achievement;
  475. $award_log->achievement_sum = $personal_achievement+$award_log->personal_achievement;
  476. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']);
  477. $award_log->award_proportion = $award['proportion'];
  478. if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差
  479. $award_log->award_money = $award['money'];
  480. $sum_money = 0;
  481. if (isset($sum_list[$award_log['user_id']])) $sum_money = $sum_list[$award_log['user_id']]['money'];
  482. $sum_money = $sum_money + $award['money'];
  483. $award_log->award_sum = $sum_money;
  484. $awards[] = $award_log;
  485. } else {
  486. $award_log->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']);
  487. $award_log->proportion_money = $award['money'];
  488. }
  489. }
  490. return $awards;
  491. }
  492. public static function handleParent($user_id, $grant, &$list, &$user_id_arr)
  493. {
  494. $grant_id = $grant['id'];
  495. $mall_id = $grant['mall_id'];
  496. //給所有的上级加上日志,就算为空也加
  497. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  498. $parent_id_arr = array_reverse($parent_id_arr);
  499. $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']);
  500. //给父级团队业绩
  501. $sum_list = AchievementAwardLog::lists([
  502. 'where' => [
  503. ['user_id' => $parent_id_arr],
  504. ['mall_id' => $mall_id],
  505. ['status' => StatusEnum::ENABLED],
  506. ['is_end' => 1]
  507. ],
  508. 'index' => 'user_id',
  509. 'group' => 'user_id',
  510. 'select' => 'sum(award_money+equal_money) as money,user_id'
  511. ]);
  512. $awards = [];
  513. foreach ($parent_achievement_user_list as $k => $item) {
  514. $child_ids = UserPartitionRelationship::getChildIdArr($item['user_id']);
  515. $personal_achievement = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$child_ids])
  516. ->sum('personal_achievement');
  517. if(!isset($personal_achievement)) $personal_achievement = 0;
  518. $award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $item['user_id']]);
  519. if (empty($award_log)) {
  520. $award_log = new AchievementAwardLog();
  521. $award_log->mall_id = $mall_id;
  522. $award_log->grant_id = $grant_id;
  523. $award_log->user_id = $item['user_id'];
  524. }
  525. $award_log->personal_achievement += 0;
  526. $award_log->team_achievement = $personal_achievement;
  527. $award_log->achievement_sum = $personal_achievement+$award_log->personal_achievement;
  528. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $award_log['achievement_sum'], $award_log['personal_achievement'], $grant['settlement_mode']);
  529. $award_log->award_proportion = $award['proportion'];
  530. if ($grant['settlement_mode'] == 0 || $grant['settlement_mode'] == 2) { //不含极差/业绩极差
  531. $award_log->award_money = $award['money'];
  532. $awards[] = [
  533. 'user_id' => $award_log->user_id,
  534. 'money' => $award['money']
  535. ];
  536. $sum_money = 0;
  537. if (isset($sum_list[$award_log['user_id']])) $sum_money = $sum_list[$award_log['user_id']]['money'];
  538. $sum_money = $sum_money + $award['money'];
  539. $award_log->award_sum = $sum_money;
  540. } else {
  541. $award_log->parent_team = AchievementLogic::getParentAchievementUser($item['user_id']);
  542. $award_log->proportion_money = $award['money'];
  543. }
  544. if (!$award_log->save()) throw new \Exception("业绩添加父级业绩日志时失败");
  545. $list[] = $award_log;
  546. $user_id_arr[] = $award_log['user_id'];
  547. }
  548. return $awards;
  549. }
  550. public static function updateGrant($grant)
  551. {
  552. $grant_id = $grant['id'];
  553. $mall_id = $grant['mall_id'];
  554. $total_performance = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('personal_achievement');
  555. $sum_award = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('award_money');
  556. $user_num = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->count();
  557. $sum_equal = AchievementAwardLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id])->sum('equal_money');
  558. if (!isset($total_performance)) $total_performance = 0;
  559. if (!isset($sum_award)) $sum_award = 0;
  560. if (!isset($user_num)) $user_num = 0;
  561. $grant->total_performance = $total_performance;
  562. $grant->user_num = $user_num;
  563. $grant->award_money = $sum_award + $sum_equal;
  564. $grant->equal_money = $sum_equal;
  565. if (!$grant->save()) throw new \Exception("业绩修改规则日志失败");
  566. }
  567. public static function settleEqual($grant,$user_id, $c_equal_type, $config){
  568. $grant_id = $grant['id'];
  569. $mall_id = $grant['mall_id'];
  570. $current_id = $user_id;
  571. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  572. if(!empty($parent_id_arr)) $current_id = current($parent_id_arr);
  573. $child_ids = UserPartitionRelationship::getChildIdArr($current_id);
  574. $list = AchievementAwardLog::find()
  575. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $child_ids])
  576. ->andWhere(['>','award_money',0])
  577. ->all();
  578. $is_send_ids = [];
  579. foreach($list as $item){
  580. $parent_id_arr = UserPartitionRelationship::getParentIdArr($item['user_id']);
  581. $parent_id_arr = array_reverse($parent_id_arr);
  582. $deep = 1;
  583. $parent_achievement_user_list = AchievementUser::lists(['where' => [['user_id' => $parent_id_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id'],false);
  584. foreach ($parent_id_arr as $user_id) {
  585. if (isset($parent_achievement_user_list[$user_id])) {
  586. $parent_award_log = AchievementAwardLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' => $user_id]);
  587. if (empty($parent_award_log)) {
  588. $parent_award_log = new AchievementAwardLog();
  589. $parent_award_log->mall_id = $mall_id;
  590. $parent_award_log->grant_id = $grant_id;
  591. $parent_award_log->user_id = $user_id;
  592. }
  593. if($deep == 1){
  594. $equal_money = $item['equal_first'] + $item['team_equal_first'];
  595. }elseif($deep == 2){
  596. $equal_money = $item['equal_second'] + $item['team_equal_second'];
  597. }
  598. if($equal_money > 0){
  599. //首次添加重置平级奖
  600. if(!in_array($user_id,$is_send_ids)){
  601. $parent_award_log->equal_money = 0;
  602. }
  603. $parent_award_log->equal_money += $equal_money;
  604. if(!$parent_award_log->save()) throw new \Exception($parent_award_log['user_id'].'平级奖励发放异常:'.AchievementAwardLog::getStaticError());
  605. $is_send_ids[] = $user_id;
  606. }
  607. if($deep == 2) break;
  608. $deep++;
  609. }
  610. }
  611. }
  612. return true;
  613. }
  614. protected static function _($log, $grant)
  615. {
  616. self::_handleParent($log->user_id, $grant);
  617. }
  618. public static function planC($grant,$award_list,$first_user_id, $c_equal_type, $configs){
  619. $parent_id_arr = UserPartitionRelationship::getParentIdArr($first_user_id);
  620. $parent_id_arr = array_reverse($parent_id_arr);
  621. $list = [];
  622. foreach($parent_id_arr as $parent_id){
  623. foreach($award_list as $award_log){
  624. if($parent_id == $award_log->user_id){
  625. $list[] = $award_log;
  626. }
  627. }
  628. }
  629. $grant_id = $grant['id'];
  630. $mall_id = $grant['mall_id'];
  631. //同一条关系链,已给最近上级计算团队业绩,再往上上级不再计算对应团队业绩
  632. $achievement_child_ids = [];
  633. $team_user_ids = AchievementAwardLog::find()->where(['grant_id'=>$grant_id,'mall_id'=>$mall_id,'status'=>StatusEnum::ENABLED])->select('user_id')->column();
  634. foreach($list as $item){
  635. $child_ids = UserPartitionRelationship::getChildIdArr($item['user_id']);
  636. //$child_ids = array_diff($child_ids, $achievement_child_ids);
  637. //找到最下层团队长
  638. foreach($child_ids as $key => $child_id){
  639. $child_child_ids = UserPartitionRelationship::getChildIdArr($child_id);
  640. if(!empty(array_intersect($child_child_ids,$team_user_ids))){
  641. unset($child_ids[$key]);
  642. }
  643. }
  644. $last_childs = AchievementAwardLog::find()
  645. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$child_ids,'team_achievement'=>0])
  646. ->all();
  647. $total_personal_achievement = 0;
  648. $equal_first = 0;
  649. $equal_second = 0;
  650. //$last_child_ids = [];
  651. foreach($last_childs as $child){
  652. $user_id = $child['user_id'];
  653. //$last_child_ids[] = $user_id;
  654. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  655. $parent_id_arr = array_reverse($parent_id_arr);
  656. $log = null;
  657. $parent_achievement = 0;
  658. $parent_equal_first = 0;
  659. $parent_equal_second = 0;
  660. $is_set_equal = false;
  661. foreach($parent_id_arr as $parent_id){
  662. $log = AchievementAwardLog::find()
  663. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'grant_id' => $grant_id, 'user_id' =>$parent_id])
  664. //->andWhere(['>','award_money',0])
  665. ->one();
  666. if(($log && $log->award_money > 0)) {
  667. if (!empty($c_equal_type) && !empty($log)) {
  668. $log->equal_first = bcmul($log['award_money'], bcmul($configs['equal_price_first'], 0.01, 3), 3);
  669. $log->equal_second = bcmul($log['award_money'], bcmul($configs['equal_price_second'], 0.01, 3), 3);
  670. $log->team_equal_first = 0;
  671. $log->team_equal_second = 0;
  672. if (!$log->save()) throw new \Exception("重写计算业绩奖错误 -> log -> $log->id");
  673. }
  674. // break;
  675. } else {
  676. if ($parent_id == $item['user_id']) continue;
  677. if (!$is_set_equal) {
  678. $is_set_equal = true;
  679. $parent_achievement += $log['personal_achievement'];
  680. $parent_equal_first += $log['equal_first'];
  681. $parent_equal_second += $log['equal_second'];
  682. }
  683. }
  684. }
  685. if($log && $log['user_id'] != $item['user_id']) continue;
  686. $total_personal_achievement += $parent_achievement;
  687. $equal_first += $parent_equal_first;
  688. $equal_second += $parent_equal_second;
  689. if($child['award_money'] > 0) {
  690. if (!empty($c_equal_type)) {
  691. $child->equal_first = bcmul($child['award_money'], bcmul($configs['equal_price_first'], 0.01, 3), 3);
  692. $child->equal_second = bcmul($child['award_money'], bcmul($configs['equal_price_second'], 0.01, 3), 3);
  693. $child->team_equal_first = 0;
  694. $child->team_equal_second = 0;
  695. if (!$child->save()) throw new \Exception("重写计算业绩奖错误 -> child -> $child->id");
  696. }
  697. continue;
  698. }
  699. $total_personal_achievement += $child['personal_achievement'];
  700. $equal_first += $child['equal_first'];
  701. $equal_second += $child['equal_second'];
  702. }
  703. $team_achievement = $total_personal_achievement;
  704. $total_personal_achievement += $item['personal_achievement'];
  705. $equal_first += $item['equal_first'];
  706. $equal_second += $item['equal_second'];
  707. $award = AchievementLogic::confirmProportion($grant['award_proportion'], $total_personal_achievement, $item['personal_achievement'], $grant['settlement_mode']);
  708. $item->award_proportion = $award['proportion'];
  709. $item->award_money = $award['money'];
  710. if (!empty($c_equal_type)) {
  711. $item->equal_first = bcmul($award['money'], bcmul($configs['equal_price_first'], 0.01, 3), 3);
  712. $item->equal_second = bcmul($award['money'], bcmul($configs['equal_price_second'], 0.01, 3), 3);
  713. }
  714. // echo ("====================== $item->id, {$award['money']} $equal_first $equal_second {$item['equal_first']} {$item['equal_second']} \n");
  715. $item->team_achievement = $team_achievement;
  716. $item->achievement_sum = $total_personal_achievement;
  717. $sum_money = 0;
  718. $sum_list = AchievementAwardLog::lists([
  719. 'where' => [
  720. ['user_id' => $item['user_id']],
  721. ['mall_id' => $grant['mall_id']],
  722. ['status' => StatusEnum::ENABLED],
  723. ['is_end' => 1]
  724. ],
  725. 'index' => 'user_id',
  726. 'group' => 'user_id',
  727. 'select' => 'sum(award_money+equal_money) as money,user_id'
  728. ]);
  729. if (isset($sum_list[$item['user_id']])) $sum_money = $sum_list[$item['user_id']]['money'];
  730. $sum_money = $sum_money + $award['money'];
  731. $item->award_sum = $sum_money;
  732. // if($item->award_money > 0){
  733. // $item->total_personal_achievement = $total_personal_achievement;
  734. // }else{
  735. // $item->total_personal_achievement = 0;
  736. // }
  737. echo "$item->id, $equal_first, $equal_second \n";
  738. $item->team_equal_first = empty($c_equal_type) ? $equal_first : 0;
  739. $item->team_equal_second = empty($c_equal_type) ? $equal_second : 0;
  740. if (!$item->save()) throw new \Exception("业绩添加个人业绩日志时失败");
  741. //if($item->award_money <= 0) $achievement_child_ids = array_merge($achievement_child_ids,$last_child_ids);
  742. }
  743. }
  744. }