ShareMoneyForm.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\alliance\models;
  8. use app\models\common\CommonGoods;
  9. use app\models\Goods;
  10. use app\models\GoodsShare;
  11. use app\models\MchSetting;
  12. use app\models\Option;
  13. use app\models\Order;
  14. use app\models\OrderDetail;
  15. use app\models\OrderShare;
  16. use app\models\ShareHolder;
  17. use app\models\ShareHolderLevel;
  18. use app\models\User;
  19. use app\models\UserBindLog;
  20. use app\models\UserShareLog;
  21. use yii\base\BaseObject;
  22. use yii\base\Model;
  23. use yii\helpers\Json;
  24. class ShareMoneyForm extends Model
  25. {
  26. /**
  27. * @var $order Order
  28. */
  29. public $order;
  30. public $order_type;
  31. public $share_send_type = 1;
  32. public $order_share_rate = 0;
  33. public $integral = 0;
  34. public function setData()
  35. {
  36. \Yii::warning('=== 分销计算:订单id:' . $this->order->id . ',计算分销开始 ===');
  37. $setting = Option::get('share_money_setting', get_store_id());
  38. $setting = $setting ? Json::decode($setting['value']) : [];
  39. if (!$setting) {
  40. \Yii::warning('未开启分销设置1');
  41. return false;
  42. }
  43. // if (!is_array($setting['commission_type']) || empty($setting['commission_type'])) {
  44. // \Yii::warning('未开启分销设置2');
  45. // return false;
  46. // }
  47. // 获取到当前到订单佣金发放类型 1: 佣金 2:积分, 3:余额
  48. // if (!empty($setting['giveType'])) {
  49. // $this->share_send_type = $setting['giveType'];
  50. // }
  51. $this->share_send_type = $setting['giveType'] ?? 1;
  52. // 获取积分和佣金的兑换比例
  53. $integral = Option::get('integral', $this->order->store_id, 'store')['value'];
  54. if (!$integral && $this->share_send_type == 2) {
  55. \Yii::warning('发放积分佣金类型比例未设置');
  56. return false;
  57. }
  58. $this->integral = $integral;
  59. // $commission_type = $setting['commission_type'];
  60. // 订单分销 2
  61. // if (in_array(2, $commission_type) && $setting['scale'] > 0) {
  62. $this->order_share_rate = $setting['scale'] ?: 0;
  63. $this->setOrderProfit();
  64. $this->setLimitProfit($setting);
  65. // } else {
  66. // \Yii::warning('未开启订单佣金分销');
  67. // }
  68. // if (!in_array(1, $commission_type)) {
  69. // \Yii::warning('未开启会员佣金分销');
  70. // return false;
  71. // }
  72. $order = $this->order;
  73. /* @var $orderShare Order */
  74. $orderShare = $this->order;
  75. $orderShare->share_send_type = $this->share_send_type;
  76. $orderDetail = $this->getOrderDetail();
  77. if (!$orderDetail) {
  78. \Yii::warning('订单详情不存在');
  79. return false;
  80. }
  81. $user = User::findOne($this->order->user_id);
  82. if (!$user) {
  83. \Yii::warning('订单用户不存在');
  84. return false;
  85. }
  86. $cParent1 = $user->parent_id;
  87. $orderShare->parent_id = $cParent1;
  88. if ($user->parent_id) {
  89. $parent = User::findOne($user->parent_id);//上级
  90. $cParent2 = $parent->parent_id;
  91. $orderShare->parent_id_1 = $cParent2;
  92. if ($parent->parent_id) {
  93. $parent_1 = User::findOne($parent->parent_id);//上上级
  94. $cParent3 = $parent_1->parent_id;
  95. $orderShare->parent_id_2 = $cParent3;
  96. } else {
  97. $orderShare->parent_id_2 = -1;
  98. }
  99. } else {
  100. $orderShare->parent_id_1 = -1;
  101. $orderShare->parent_id_2 = -1;
  102. }
  103. // 旧关系记录
  104. if ($user->old_parent_id > 0) {
  105. $old_parent = User::findOne($user->old_parent_id);//上级
  106. $orderShare->old_parent_id = $old_parent->id;
  107. if ($old_parent->old_parent_id > 0) {
  108. $old_parent_1 = User::findOne($old_parent->old_parent_id);//上上级
  109. $orderShare->old_parent_id_1 = $old_parent_1->id;
  110. if ($old_parent_1->old_parent_id > 0) {
  111. $old_parent_2 = User::findOne($old_parent_1->old_parent_id);//上上级
  112. $orderShare->old_parent_id_2 = $old_parent_2->id;
  113. }
  114. }
  115. }
  116. $share_commission_money_first = 0;//一级分销总佣金
  117. $share_commission_money_second = 0;//二级分销总佣金
  118. $share_commission_money_third = 0;//三级分销总佣金
  119. foreach ($orderDetail as $item) {
  120. // TODO: 价格
  121. $item_price = doubleval($item['price']);
  122. // $item_price = doubleval($orderShare->pay_price);
  123. if ($item['individual_share'] == 1) {
  124. $rate_first = doubleval($item['share_commission_first']);
  125. $rate_second = doubleval($item['share_commission_second']);
  126. $rate_third = doubleval($item['share_commission_third']);
  127. $shareType = $item['share_type'];
  128. } else {
  129. $setting_shara = Option::get('share_money_setting', $order->store_id, 'share');
  130. $setting_shara = $setting_shara ? Json::decode($setting_shara['value']) : [];
  131. $rate_first = doubleval($setting_shara['level_one']['value']);
  132. $rate_second = doubleval($setting_shara['level_two']['value']);
  133. $rate_third = doubleval($setting_shara['level_three']['value']);
  134. $shareType = isset($setting_shara['price_type']) ? $setting_shara['price_type'] : 0;
  135. }
  136. if ($shareType == 1) { // 金钱
  137. if ($this->share_send_type == 2) {
  138. // 兑换比例
  139. $share_commission_money_first += round($rate_first * $integral) * $item['num'];
  140. $share_commission_money_second += round($rate_second * $integral) * $item['num'];
  141. $share_commission_money_third += round($rate_third * $integral) * $item['num'];
  142. } else {
  143. $share_commission_money_first += $rate_first * $item['num'];
  144. $share_commission_money_second += $rate_second * $item['num'];
  145. $share_commission_money_third += $rate_third * $item['num'];
  146. }
  147. } else { // 比例
  148. if ($this->share_send_type == 2) {
  149. $share_commission_money_first += round($item_price * ($rate_first / 100) * $integral);
  150. $share_commission_money_second += round($item_price * ($rate_second / 100) * $integral);
  151. $share_commission_money_third += round($item_price * ($rate_third / 100 ) * $integral);
  152. } else {
  153. $share_commission_money_first += $item_price * $rate_first / 100;
  154. $share_commission_money_second += $item_price * $rate_second / 100;
  155. $share_commission_money_third += $item_price * $rate_third / 100;
  156. }
  157. }
  158. }
  159. $share_setting = Option::get('share_basic_setting', get_store_id());
  160. $share_setting = $share_setting ? Json::decode($share_setting['value']) : [];
  161. // 如果开启自购返利 一级是自己
  162. if ($share_setting['is_rebate']['value'] == 1 && $user->is_distributor == 1) {
  163. $orderShare->rebate = $share_commission_money_first < 0.01 ? 0 : $share_commission_money_first;
  164. $orderShare->first_price = $share_commission_money_second < 0.01 ? 0 : $share_commission_money_second;
  165. $orderShare->second_price = $share_commission_money_third < 0.01 ? 0 : $share_commission_money_third;
  166. $orderShare->third_price = 0;
  167. } else {
  168. $orderShare->rebate = 0;
  169. $orderShare->first_price = $share_commission_money_first < 0.01 ? 0 : $share_commission_money_first;
  170. $orderShare->second_price = $share_commission_money_second < 0.01 ? 0 : $share_commission_money_second;
  171. $orderShare->third_price = $share_commission_money_third < 0.01 ? 0 : $share_commission_money_third;
  172. }
  173. // 计算股东分销
  174. // 一级分销
  175. if ($orderShare->parent_id > 0) {
  176. $share_holder_1 = ShareHolder::findOne(['store_id' => $orderShare->store_id, 'user_id' => $orderShare->parent_id, 'is_delete' => 0, 'status' => 1]);
  177. if ($share_holder_1) {
  178. $level_id_1 = $share_holder_1->level_id;
  179. $one_rate = ShareHolderLevel::findOne($level_id_1)->share_rate_one;
  180. if ($one_rate > 0) {
  181. $orderShare->holder_first_price = $orderShare->profit * doubleval($one_rate) / 100;
  182. }
  183. }
  184. }
  185. // 二级分销
  186. if ($orderShare->parent_id_1 > 0) {
  187. $share_holder_2 = ShareHolder::findOne(['store_id' => $orderShare->store_id, 'user_id' => $orderShare->parent_id_1, 'is_delete' => 0, 'status' => 1]);
  188. if ($share_holder_2) {
  189. $level_id_2 = $share_holder_2->level_id;
  190. $two_rate = ShareHolderLevel::findOne($level_id_2)->share_rate_two;
  191. if ($two_rate > 0) {
  192. $orderShare->holder_second_price = $orderShare->profit * doubleval($two_rate) / 100;
  193. }
  194. }
  195. }
  196. // 三级分销
  197. if ($orderShare->parent_id_2 > 0) {
  198. $share_holder_3 = ShareHolder::findOne(['store_id' => $orderShare->store_id, 'user_id' => $orderShare->parent_id_2, 'is_delete' => 0, 'status' => 1]);
  199. if ($share_holder_3) {
  200. $level_id_3 = $share_holder_3->level_id;
  201. $three_rate = ShareHolderLevel::findOne($level_id_3)->share_rate_three;
  202. if ($three_rate > 0) {
  203. $orderShare->holder_third_price = $orderShare->profit * doubleval($three_rate) / 100;
  204. }
  205. }
  206. }
  207. // 计算股东分销(旧关系)
  208. // 一级分销
  209. if ($orderShare->old_parent_id > 0) {
  210. $share_holder_1 = ShareHolder::findOne(['store_id' => $orderShare->store_id, 'user_id' => $orderShare->old_parent_id, 'is_delete' => 0, 'status' => 1]);
  211. if ($share_holder_1) {
  212. $level_id_1 = $share_holder_1->level_id;
  213. $one_rate = ShareHolderLevel::findOne($level_id_1)->old_share_rate_one;
  214. if ($one_rate > 0) {
  215. $orderShare->old_holder_first_price = $orderShare->profit * doubleval($one_rate) / 100;
  216. }
  217. }
  218. }
  219. // 二级分销
  220. if ($orderShare->old_parent_id_1 > 0) {
  221. $share_holder_2 = ShareHolder::findOne(['store_id' => $orderShare->store_id, 'user_id' => $orderShare->old_parent_id_1, 'is_delete' => 0, 'status' => 1]);
  222. if ($share_holder_2) {
  223. $level_id_2 = $share_holder_2->level_id;
  224. $two_rate = ShareHolderLevel::findOne($level_id_2)->old_share_rate_two;
  225. if ($two_rate > 0) {
  226. $orderShare->old_holder_second_price = $orderShare->profit * doubleval($two_rate) / 100;
  227. }
  228. }
  229. }
  230. // 三级分销
  231. if ($orderShare->old_parent_id_2 > 0) {
  232. $share_holder_3 = ShareHolder::findOne(['store_id' => $orderShare->store_id, 'user_id' => $orderShare->old_parent_id_2, 'is_delete' => 0, 'status' => 1]);
  233. if ($share_holder_3) {
  234. $level_id_3 = $share_holder_3->level_id;
  235. $three_rate = ShareHolderLevel::findOne($level_id_3)->old_share_rate_three;
  236. if ($three_rate > 0) {
  237. $orderShare->old_holder_third_price = $orderShare->profit * doubleval($three_rate) / 100;
  238. }
  239. }
  240. }
  241. $res = $orderShare->save();
  242. if (!$res) {
  243. \Yii::warning('=== 分销计算:订单id:' . $this->order->id . '分销订单生成失败 ===');
  244. }
  245. \Yii::warning('=== 分销计算:订单id:' . $this->order->id . '分销订单生成成功 ===');
  246. return $res;
  247. }
  248. public function setScanCodePayData()
  249. {
  250. \Yii::error('===========================================');
  251. $setting = Option::get('share_money_setting', get_store_id());
  252. $setting = $setting ? Json::decode($setting['value']) : [];
  253. if (!$setting) {
  254. \Yii::warning('未开启分销设置1');
  255. return false;
  256. }
  257. if (!is_array($setting['commission_type']) || empty($setting['commission_type'])) {
  258. \Yii::warning('未开启分销设置2');
  259. return false;
  260. }
  261. // 获取到当前到订单佣金发放类型 1: 佣金 2:积分, 3:余额
  262. if (!empty($setting['giveType'])) {
  263. $this->share_send_type = $setting['giveType'];
  264. }
  265. // 获取积分和佣金的兑换比例
  266. $integral = Option::get('integral', $this->order->store_id, 'store')['value'];
  267. if (!$integral && $this->share_send_type == 2) {
  268. \Yii::warning('发放积分佣金类型比例未设置');
  269. return false;
  270. }
  271. // $commission_type = $setting['commission_type'];
  272. // // 订单分销 2
  273. // if (in_array(2, $commission_type) && $setting['scale'] > 0) {
  274. $this->order_share_rate = $setting['scale'];
  275. $this->setOrderProfit();
  276. // } else {
  277. // \Yii::warning('未开启订单佣金分销');
  278. // }
  279. // if (!in_array(1, $commission_type)) {
  280. // \Yii::warning('未开启会员佣金分销');
  281. // return false;
  282. // }
  283. $user = User::findOne($this->order->user_id);
  284. if (!$user) {
  285. \Yii::warning('订单用户不存在');
  286. return false;
  287. }
  288. /* @var $orderShare \app\plugins\scanCodePay\models\Order */
  289. $orderShare = $this->order;
  290. $cParent1 = $user->parent_id;
  291. $orderShare->parent_id = $cParent1;
  292. if ($user->parent_id) {
  293. $parent = User::findOne($user->parent_id);//上级
  294. $cParent2 = $parent->parent_id;
  295. $orderShare->parent_id_1 = $cParent2;
  296. if ($parent->parent_id) {
  297. $parent_1 = User::findOne($parent->parent_id);//上上级
  298. $cParent3 = $parent_1->parent_id;
  299. $orderShare->parent_id_2 = $cParent3;
  300. } else {
  301. $orderShare->parent_id_2 = -1;
  302. }
  303. } else {
  304. $orderShare->parent_id_1 = -1;
  305. $orderShare->parent_id_2 = -1;
  306. }
  307. $res = $orderShare->save();
  308. if (!$res) {
  309. \Yii::error('分销订单生成失败');
  310. }
  311. \Yii::error('分销订单生成成功');
  312. return $res;
  313. }
  314. /**
  315. * 普通订单
  316. * @return array
  317. */
  318. private function getOrderDetail()
  319. {
  320. /* @var $order Order */
  321. $order = $this->order;
  322. /* @var $list OrderDetail */
  323. $list = OrderDetail::find()->where(['is_delete' => 0, 'order_id' => $order->id])->all();
  324. $newList = [];
  325. foreach ($list as $value) {
  326. $goods = $value->goods;
  327. $buyAttrList = Json::decode($value['attr']);
  328. if ($goods['attr_setting_type'] === 1) {
  329. $attrIdArr2 = [];
  330. foreach ($buyAttrList as $attrListItem2) {
  331. $attrIdArr2[] = $attrListItem2['attr_id'];
  332. }
  333. $goodsData = [
  334. 'attr' => $goods['attr'],
  335. 'price' => $goods['price'],
  336. 'is_level' => $goods['is_level'],
  337. ];
  338. $res = CommonGoods::currentGoodsAttr($goodsData, $attrIdArr2);
  339. $newItem = [
  340. 'individual_share' => $goods['individual_share'],
  341. 'share_commission_first' => $res['share_commission_first'],
  342. 'share_commission_second' => $res['share_commission_second'],
  343. 'share_commission_third' => $res['share_commission_third'],
  344. 'share_type' => $goods['share_type'],
  345. 'num' => $value['num'],
  346. 'price' => $value['total_price'],
  347. 'mch_id' => $goods['mch_id']
  348. ];
  349. } else {
  350. $newItem = [
  351. 'individual_share' => $goods['individual_share'],
  352. 'share_commission_first' => $goods['share_commission_first'],
  353. 'share_commission_second' => $goods['share_commission_second'],
  354. 'share_commission_third' => $goods['share_commission_third'],
  355. 'share_type' => $goods['share_type'],
  356. 'num' => $value['num'],
  357. 'price' => $value['total_price'],
  358. 'mch_id' => $goods['mch_id']
  359. ];
  360. }
  361. array_push($newList, $newItem);
  362. }
  363. return $newList;
  364. }
  365. /**
  366. * 订单佣金计算
  367. */
  368. private function setOrderProfit() {
  369. $price = $this->order->pay_price;
  370. $profit = 0;
  371. // 积分
  372. if ($this->share_send_type == 2) {
  373. $profit = round($price * ($this->order_share_rate / 100) * $this->integral);
  374. } else {
  375. $profit = round($price * ($this->order_share_rate / 100), 2);
  376. }
  377. if ($profit < 0.01) {
  378. \Yii::warning('订单佣金分销计算:订单id:' . $this->order->id . '订单分销佣金计算为0');
  379. return false;
  380. }
  381. $this->order->share_order_profit = $profit;
  382. $this->order->share_send_type = $this->share_send_type;
  383. if ($this->order->save()) {
  384. \Yii::warning('订单佣金分销计算:订单id:' . $this->order->id . '订单分销佣金计算完成');
  385. return true;
  386. }
  387. \Yii::warning(['订单佣金分销计算:订单id:' . $this->order->id . '订单分销佣金计算失败', $this->order->errors]);
  388. return false;
  389. }
  390. /**
  391. * 临时绑定关系佣金计算
  392. */
  393. private function setLimitProfit($setting){
  394. $price = $this->order->pay_price;
  395. $profit = $price * ($setting['scale']/100);
  396. //临时绑定关系发放佣金
  397. $bind_log = UserBindLog::find()->where(['user_id' => get_user_id()])->select('id, bind_time')->orderBy('id desc')->asArray()->one();
  398. if ($bind_log['bind_time'] + ($setting['expire_day'] * 24 * 60 * 60) >= time()) {
  399. $this->order->limit_price = $profit;
  400. $this->order->limit_id = $bind_log['id'];
  401. if ($this->order->save()) {
  402. return true;
  403. }
  404. }
  405. return false;
  406. }
  407. }