SupplierOrderEvent.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\events;
  8. use app\models\Admin;
  9. use app\models\Option;
  10. use app\models\Order;
  11. use app\models\OrderDetail;
  12. use app\models\OrderTransit;
  13. use app\models\Purchase;
  14. use app\models\PurchaseOrder;
  15. use app\models\SaasUser;
  16. use app\models\Store;
  17. use app\models\StoreCloud;
  18. use app\models\StoreShareMoney;
  19. use app\models\Supplier;
  20. use app\models\SaasUserPriceLog;
  21. use app\models\SaasSupplierReferral;
  22. use app\constants\OptionSetting;
  23. /**
  24. * 事件类
  25. * Class TestEvent
  26. * @package app\events
  27. */
  28. class SupplierOrderEvent
  29. {
  30. public $supplier_id = 1;
  31. public function onLoad() {
  32. // 处理过了售后期且没有售后的订单
  33. $this->orderSend();
  34. //处理转单
  35. $this->orderTransitSend();
  36. }
  37. public function orderTransitSend() {
  38. try {
  39. //代理佣金抽取
  40. $time = time();
  41. $supplier_id = $this->supplier_id;
  42. $supplier = Supplier::findOne(['cloud_supplier_id' => $supplier_id]);
  43. $after_sale_time = $supplier->sale_day;
  44. $sale_time = $time - ($after_sale_time * 86400);
  45. $order_list = OrderTransit::find()->alias('o')
  46. ->where([
  47. 'and',
  48. ['o.cloud_supplier_id' => $supplier_id],
  49. ['o.is_delete' => 0, 'o.status' => 2, 'o.is_sale' => 0],
  50. ['<=', 'o.confirm_time', $sale_time],
  51. ['o.cancel_examine' => 0],
  52. ])->andWhere(['<>', 'status', -1])
  53. ->select(['o.*'])->groupBy('o.id')
  54. ->offset(0)->limit(10)->asArray()->all();
  55. foreach ($order_list as $index => $value) {
  56. $OrderTransit = OrderTransit::find()->where(['order_id' => $value['order_id'], 'is_sale' => 0])->select('id')->asArray()->all();
  57. $order_detail = OrderDetail::find()->where(['order_id' => $value['order_id']])->count();
  58. if ((int)$order_detail === (int)count($OrderTransit)) {
  59. foreach ($OrderTransit as $item) {
  60. $this->PurchaseOrderAgencyPrice($item['id']);
  61. $order = OrderTransit::findOne($item['id']);
  62. $order->is_sale = 1;
  63. $order->save();
  64. }
  65. }
  66. }
  67. } catch (\Exception $e) {
  68. }
  69. }
  70. /**
  71. * 处理过了售后期且没有售后的订单
  72. */
  73. private function orderSend() {
  74. $time = time();
  75. $supplier_id = $this->supplier_id;
  76. $supplier = Supplier::findOne(['cloud_supplier_id' => $supplier_id]);
  77. $after_sale_time = $supplier->sale_day;
  78. $sale_time = $time - ($after_sale_time * 86400);
  79. $order_list = PurchaseOrder::find()->alias('o')
  80. ->where([
  81. 'and',
  82. ['o.supplier_id' => $supplier_id],
  83. ['o.is_delete' => 0, 'o.trade_status' => Order::ORDER_FLOW_CONFIRM, 'o.is_sale' => 0],
  84. ['<=', 'o.confirm_time', $sale_time],
  85. ['o.cancel_examine' => 0],
  86. ])->andWhere(['<>', 'trade_status', Order::ORDER_FLOW_CANCEL])
  87. ->select(['o.*'])->groupBy('o.id')
  88. ->offset(0)->limit(10)->asArray()->all();
  89. foreach ($order_list as $index => $value) {
  90. $this->agencyPrice($value['id']);
  91. $order = PurchaseOrder::findOne($value['id']);
  92. $order->is_sale = 1;
  93. $order->save();
  94. }
  95. }
  96. //转单订单抽佣
  97. private function PurchaseOrderAgencyPrice($order_id){
  98. $supplier_id = $this->supplier_id;
  99. $order = OrderTransit::find()->where(['id' => $order_id, 'is_sale' => 0])->asArray()->one();
  100. $price = $order['order_price'];
  101. $supplier = Supplier::findOne(['cloud_supplier_id' => $supplier_id]);
  102. $this->supplierParentPrice($supplier, $order);
  103. $old_order = Order::findOne($order['order_id']);
  104. $store = Store::findOne($old_order->store_id);
  105. $option = Option::get('agency_price_config', 0, 'saas', [])['value'];
  106. if ($option) {
  107. $option = json_decode($option, true);
  108. }
  109. $province_percent = $option['supplier_province_percent'] ?? 0;
  110. $city_percent = $option['supplier_city_percent'] ?? 0;
  111. $district_percent = $option['supplier_district_percent'] ?? 0;
  112. $admin_list = Admin::find()->where(['province_id' => $supplier->province_id, 'is_delete' => 0, 'type' => 'admin'])->andWhere(['>', 'area_level', 0])->asArray()->all();
  113. foreach ($admin_list as $item) {
  114. $ag_rebate = 0;
  115. $rate = 0;
  116. $desc = '';
  117. //省
  118. if ((int)$item['area_level'] === 3) {
  119. $ag_rebate = $price * ($province_percent / 100) * ($supplier->rate / 100);
  120. $ag_rebate = sprintf("%.2f", $ag_rebate);
  121. $rate = $province_percent;
  122. $desc = '商户'. $store->name .'订单'. $old_order->order_no .'转单-发放 '. $ag_rebate .'元省代佣金';
  123. }
  124. //市
  125. if ((int)$item['area_level'] === 2 && (int)$item['city_id'] === (int)$supplier->city_id) {
  126. $ag_rebate = $price * ($city_percent / 100) * ($supplier->rate / 100);
  127. $ag_rebate = sprintf("%.2f", $ag_rebate);
  128. $rate = $city_percent;
  129. $desc = '商户'. $store->name .'订单'. $old_order->order_no .'转单-发放 '. $ag_rebate .'元市代佣金';
  130. }
  131. //区
  132. if ((int)$item['area_level'] === 1 && (int)$item['city_id'] === (int)$supplier->city_id && (int)$item['district_id'] === (int)$supplier->district_id) {
  133. $ag_rebate = $price * ($district_percent / 100) * ($supplier->rate / 100);
  134. $ag_rebate = sprintf("%.2f", $ag_rebate);
  135. $rate = $district_percent;
  136. $desc = '商户'. $store->name .'订单'. $old_order->order_no .'转单-发放 '. $ag_rebate .'元区代佣金';
  137. }
  138. if ($ag_rebate <= 0) {
  139. continue;
  140. }
  141. $SaasUser = SaasUser::findOne($item['saas_user_id']);
  142. if ($SaasUser) {
  143. $SaasUser->share_profit = ($SaasUser->share_profit * 1) + ($ag_rebate * 1);
  144. $res = $SaasUser->save();
  145. if ($res) {
  146. $form = new StoreShareMoney();
  147. $form->user_id = $item['saas_user_id'];
  148. $form->store_id = $order->store_id ?? get_store_id();
  149. $form->profit = $rate;
  150. $form->total_price = $price;
  151. $form->desc = $desc;
  152. $form->order_id = $order['order_id'];
  153. $form->created_at = time();
  154. $form->status = StoreShareMoney::STATUS_STORE_ORDER;
  155. $form->type = StoreShareMoney::TYPE_AREA_AGENT;
  156. $form->commission = $ag_rebate;
  157. $form->cloud_type = 1;
  158. $form->is_send = 1;
  159. $form->save();
  160. } else {
  161. debug_log(json_encode($SaasUser->errors));
  162. }
  163. }
  164. }
  165. }
  166. //采购商抽佣
  167. private function agencyPrice($order_id){
  168. try {
  169. $order = PurchaseOrder::find()->where(['id' => $order_id, 'is_sale' => 0])->asArray()->one();
  170. $supplier = Supplier::findOne(['cloud_supplier_id' => $order['supplier_id']]);
  171. $this->supplierParentPrice($supplier, $order);
  172. $option = Option::get('agency_price_config', 0, 'saas');
  173. if ($option['value']) {
  174. $option = json_decode($option['value'], true);
  175. }
  176. $province_id = $supplier->province_id;
  177. $city_id = $supplier->city_id;
  178. $district_id = $supplier->district_id;
  179. $city_percent = $option['supplier_city_percent'] ?? 0;
  180. $district_percent = $option['supplier_district_percent'] ?? 0;
  181. $province_percent = $option['supplier_province_percent'] ?? 0;
  182. $rate = 0;
  183. $admin_list = Admin::find()->where(['is_delete' => 0, 'province_id' => $province_id])->andWhere(['>', 'area_level', 0])->asArray()->all();
  184. $store_user = StoreCloud::findOne(['saas_user_id' => $order['saas_id']]);
  185. foreach ($admin_list as $item) {
  186. $price = 0;
  187. $desc = '';
  188. if ((int)$item['area_level'] === 3) {
  189. $price = $order['pay_price'] * ($province_percent / 100) * ($supplier->rate / 100);
  190. $price = sprintf("%.2f", $price);
  191. $desc = '商户'. $store_user->name .'订单'. $order['order_no'] .'采购订单-发放 '. $price .'元省代佣金';
  192. }
  193. if ((int)$item['area_level'] === 2 && (int)$item['city_id'] === $city_id) {
  194. $price = $order['pay_price'] * ($city_percent / 100) * ($supplier->rate / 100);
  195. $price = sprintf("%.2f", $price);
  196. $desc = '商户'. $store_user->name .'订单'. $order['order_no'] .'采购订单-发放 '. $price .'元市代佣金';
  197. }
  198. if ((int)$item['area_level'] === 1 && (int)$item['city_id'] === (int)$city_id && (int)$item['district_id'] === (int)$district_id) {
  199. $price = $order['pay_price'] * ($district_percent / 100) * ($supplier->rate / 100);
  200. $price = sprintf("%.2f", $price);
  201. $desc = '商户'. $store_user->name .'订单'. $order['order_no'] .'采购订单-发放 '. $price .'元区代佣金';
  202. }
  203. if ($price <= 0) {
  204. continue;
  205. }
  206. //给用户增加佣金
  207. $SaasUser = SaasUser::find()->where(['id' => $item['saas_user_id']])->one();
  208. if ($SaasUser) {
  209. $SaasUser->share_profit = ($SaasUser->share_profit * 1) + ($price * 1);
  210. $res = $SaasUser->save();
  211. //增加记录
  212. if ($res) {
  213. $form = new StoreShareMoney();
  214. $form->user_id = $item['saas_user_id'];
  215. $form->store_id = $order['store_id'];
  216. $form->profit = $rate;
  217. $form->total_price = $order['pay_price'];
  218. $form->desc = $desc;
  219. $form->order_id = $order_id;
  220. $form->created_at = time();
  221. $form->status = StoreShareMoney::STATUS_STORE_ORDER;
  222. $form->commission = $price;
  223. $form->order_type = 1;
  224. $form->cloud_type = 1;
  225. $form->type = StoreShareMoney::TYPE_AREA_AGENT;
  226. $form->is_send = 1;
  227. $form->save();
  228. }
  229. }
  230. }
  231. } catch (\Exception $e) {
  232. debug_log('抽佣' . $e->getMessage() . $e->getLine());
  233. \Yii::error($e->getMessage());
  234. }
  235. }
  236. private function supplierParentPrice($supplier, $order) {
  237. try {
  238. $saasSupplierReferral = SaasSupplierReferral::findOne(['supplier_id' => $supplier['id'], 'is_enable' => 1]);
  239. if(!$saasSupplierReferral){
  240. return;
  241. }
  242. $log_type = SaasUserPriceLog::LOG_TYPE_INCOME;
  243. $amount_type = SaasUserPriceLog::AMOUNT_TYPE_SUPPLIER_PARENT;
  244. $desc = '供货商推荐人分佣';
  245. $defaultSet = Option::get(OptionSetting::SHARE_SAAS_SUPPLIER_REFERRAL_DEFAULT_SETTING, -1, OptionSetting::SHARE_GROUP_NAME, '{}')['value'];
  246. $defaultSet = json_decode($defaultSet, true);
  247. if(($saasSupplierReferral['referral_rebate'] == 0) &&
  248. (!empty($defaultSet['is_enable']) && !empty($defaultSet['referral_rebate']))){
  249. $saasSupplierReferral['referral_rebate'] = $defaultSet['referral_rebate'];
  250. }
  251. $saas_id = $saasSupplierReferral['referral_id'];
  252. $price = $order['pay_price'] * ($saasSupplierReferral['referral_rebate'] / 100) * ($supplier['rate'] / 100);
  253. $saveLog = SaasUserPriceLog::saveLog($saas_id, $price, $amount_type, $log_type, $order['order_no'], $desc, $supplier['id']);
  254. \Yii::warning(['---- supplierParentPrice ----', $saveLog, $saas_id, $price, $amount_type, $log_type, $order['order_no'], $desc]);
  255. } catch (\Exception $e) {
  256. \Yii::warning('---- supplierParentPrice Err ----' . __LINE__, $e);
  257. }
  258. }
  259. }