LevelTwoOrdersJobs.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. namespace App\Jobs\Api\Promoter;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Contracts\Queue\ShouldBeUnique;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Foundation\Bus\Dispatchable;
  7. use Illuminate\Queue\InteractsWithQueue;
  8. use Illuminate\Queue\SerializesModels;
  9. use App\Servers\DB\DbService;
  10. use App\Models\OpenWork\job\Records;
  11. use App\Facades\Servers\Logs\Log;
  12. use Illuminate\Support\Facades\DB;
  13. use App\Models\Manager\Promoter\Users as UsersModel;
  14. use App\Models\Manager\OrdersProduct;
  15. use App\Models\Manager\Orders as OrdersModel;
  16. use App\Models\Api\Promoter\Configuration as ConfigurationModel;
  17. use App\Models\Manager\Promoter\CommonProduct as CommonProductModel;
  18. use App\Models\Manager\Promoter\EarningsRecord as EarningsRecordModel;
  19. use App\Jobs\Api\Promoter\LevelThreeOrdersJobs;
  20. /**
  21. * 二级推广员订单收益
  22. * @author 唐远望
  23. * @version 2.0
  24. * @date 2025-11-19
  25. */
  26. class LevelTwoOrdersJobs implements ShouldQueue
  27. {
  28. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  29. protected $message_data;
  30. protected $Records;
  31. /**
  32. * Create a new job instance.
  33. *
  34. * @return void
  35. */
  36. public function __construct(array $message_data)
  37. {
  38. $this->message_data = $message_data;
  39. }
  40. /**
  41. * 订单下定-推广员推广订单处理
  42. * @author 唐远望
  43. * @version 1.0
  44. * @date 2025-11-19
  45. * @return void
  46. */
  47. public function handle()
  48. {
  49. try {
  50. $company_id = $this->message_data['company_id'];
  51. (new DbService())->getConnectionNameByCompanyId($company_id);
  52. DB::connection('company')->beginTransaction();
  53. // 创建任务记录
  54. $this->Records = Records::create([
  55. 'job_id' => 'SASS_' . $company_id . '_OrdersJobs',
  56. 'name' => static::class,
  57. 'payload' => json_encode($this->message_data),
  58. 'status' => 'processing',
  59. 'started_at' => now()
  60. ]);
  61. $uid = $this->message_data['uid'];
  62. $order_id = $this->message_data['order_id'];
  63. $custom_uid = $this->message_data['custom_uid']; //推广员用户ID
  64. $before_revenue_amount = 0;
  65. $UsersModel = new UsersModel();
  66. $OrdersProductModel = new OrdersProduct();
  67. $orderModel = new OrdersModel();
  68. $CommonProductModel = new CommonProductModel();
  69. $EarningsRecordModel = new EarningsRecordModel();
  70. //查询一级推广员状态
  71. $one_promoter_info = $UsersModel->where('custom_uid', $custom_uid)->first();
  72. if (!$one_promoter_info || $one_promoter_info['status'] == 0) {
  73. $this->Records->delete();
  74. return true; //不存在推广员或不是推广员状态,不赠送奖励
  75. }
  76. //查询二级推广员状态
  77. $promoter_info = $UsersModel->where('custom_uid', $one_promoter_info->superior_custom_uid)->first();
  78. if (!$promoter_info || $promoter_info['status'] == 0) {
  79. $this->Records->delete();
  80. return true; //不存在二级推广员或不是二级推广员状态,不赠送奖励
  81. }
  82. $before_revenue_amount = $promoter_info->total_commission_amount;
  83. $promoter_userid = $promoter_info->custom_uid;
  84. //查询推广员配置信息
  85. $ConfigurationModel = new ConfigurationModel();
  86. //获取应用配置开关状态
  87. $application_switch_status_data = $ConfigurationModel->where(['code_name' => 'application_switch_status', 'company_id' => $company_id])->first();
  88. if (!$application_switch_status_data) {
  89. $this->Records->delete();
  90. return true; //推广员开关信息未配置
  91. }
  92. if ($application_switch_status_data->content == 0) {
  93. $this->Records->delete();
  94. return true; //推广员功能未开启
  95. }
  96. //查询订单信息
  97. $order_info = $orderModel->where('custom_uid', $uid)->where('id', $order_id)->first();
  98. if (!$order_info) {
  99. $this->Records->delete();
  100. return true; //订单不存在
  101. }
  102. $product_data = $OrdersProductModel->where('order_id', $order_id)->get(['product_id', 'product_name', 'shop_id', 'terminal_type', 'pay_total', 'buy_num'])->toArray();
  103. if (empty($product_data)) {
  104. $this->Records->delete();
  105. return true; //订单商品不存在
  106. }
  107. //获取佣金配置信息
  108. $promotion_product_config = $ConfigurationModel->where(['code_name' => 'promotion_product_config', 'company_id' => $company_id])->first();
  109. if (!$promotion_product_config) {
  110. $this->Records->delete();
  111. return true; //佣金配置信息未配置
  112. }
  113. $promotion_product_config_data = $promotion_product_config->content;
  114. $insert_data = [];
  115. foreach ($product_data as $key => $value) {
  116. $product_id = $value['product_id'];
  117. $commission_rate = 0;
  118. $reward_amount = 0;
  119. if ($promotion_product_config_data['store_type'] == 1) { //推广店铺类型1=全部店铺2=指定店铺
  120. if ($promotion_product_config_data['product_type'] == 1) { //推广商品类型1=全部商品2=指定商品
  121. if ($value['terminal_type'] == 1) { //终端类型1=小程序 2=H5 3=直播间 4=PC
  122. $commission_rate = isset($promotion_product_config_data['mini_two_commission_rate']) ? $promotion_product_config_data['mini_two_commission_rate'] : 0;
  123. $reward_amount = $commission_rate > 0 ? round($value['pay_total'] * $commission_rate / 100, 2) : 0;
  124. }
  125. if ($value['terminal_type'] == 3) { //终端类型1=小程序 2=H5 3=直播间 4=PC
  126. $commission_rate = isset($promotion_product_config_data['live_two_commission_rate']) ? $promotion_product_config_data['live_two_commission_rate'] : 0;
  127. $reward_amount = $commission_rate > 0 ? round($value['pay_total'] * $commission_rate / 100, 2) : 0;
  128. }
  129. } else {
  130. $product_info = $CommonProductModel->where(['company_id' => $company_id, 'status' => 1, 'product_id' => $product_id])->first();
  131. if (!$product_info) {
  132. continue;
  133. }
  134. $product_info = $product_info->toArray();
  135. if ($value['terminal_type'] == 1) { //终端类型1=小程序 2=H5 3=直播间 4=PC
  136. $commission_rate = isset($product_info['mini_two_commission_rate']) ? $product_info['mini_two_commission_rate'] : 0;
  137. $reward_amount = round($value['pay_total'] * $commission_rate / 100, 2);
  138. }
  139. if ($value['terminal_type'] == 3) { //终端类型1=小程序 2=H5 3=直播间 4=PC
  140. $commission_rate = isset($product_info['live_two_commission_rate']) ? $product_info['live_two_commission_rate'] : 0;
  141. $reward_amount = round($value['pay_total'] * $commission_rate / 100, 2);
  142. }
  143. if ($commission_rate < 0.01 || $reward_amount < 0.01) {
  144. continue;
  145. }
  146. }
  147. }
  148. if ($promotion_product_config_data['store_type'] == 2) { //推广店铺类型1=全部店铺2=指定店铺
  149. //校验店铺是否在配置范围内
  150. $shopid_list = explode(',', $promotion_product_config_data['shopid_list']);
  151. if (!in_array($value['shop_id'], $shopid_list)) {
  152. continue;
  153. }
  154. if ($promotion_product_config_data['product_type'] == 1) { //推广商品类型1=全部商品2=指定商品
  155. if ($value['terminal_type'] == 1) { //终端类型1=小程序 2=H5 3=直播间 4=PC
  156. $commission_rate = isset($promotion_product_config_data['mini_two_commission_rate']) ? $promotion_product_config_data['mini_two_commission_rate'] : 0;
  157. $reward_amount = $commission_rate > 0 ? round($value['pay_total'] * $commission_rate / 100, 2) : 0;
  158. }
  159. if ($value['terminal_type'] == 3) { //终端类型1=小程序 2=H5 3=直播间 4=PC
  160. $commission_rate = isset($promotion_product_config_data['live_two_commission_rate']) ? $promotion_product_config_data['live_two_commission_rate'] : 0;
  161. $reward_amount = $commission_rate > 0 ? round($value['pay_total'] * $commission_rate / 100, 2) : 0;
  162. }
  163. } else {
  164. $product_info = $CommonProductModel->where(['company_id' => $company_id, 'status' => 1, 'product_id' => $product_id])->first();
  165. if (!$product_info) {
  166. continue;
  167. }
  168. $product_info = $product_info->toArray();
  169. if ($value['terminal_type'] == 1) { //终端类型1=小程序 2=H5 3=直播间 4=PC
  170. $commission_rate = isset($product_info['mini_two_commission_rate']) ? $product_info['mini_two_commission_rate'] : 0;
  171. $reward_amount = round($value['pay_total'] * $commission_rate / 100, 2);
  172. }
  173. if ($value['terminal_type'] == 3) { //终端类型1=小程序 2=H5 3=直播间 4=PC
  174. $commission_rate = isset($product_info['live_two_commission_rate']) ? $product_info['live_two_commission_rate'] : 0;
  175. $reward_amount = round($value['pay_total'] * $commission_rate / 100, 2);
  176. }
  177. if ($commission_rate < 0.01 || $reward_amount < 0.01) {
  178. continue;
  179. }
  180. }
  181. }
  182. if ($commission_rate < 0.01 || $reward_amount < 0.01) {
  183. continue;
  184. }
  185. $after_revenue_amount = round($before_revenue_amount + $reward_amount, 2);
  186. $insert_data[] = [
  187. 'company_id' => $company_id,
  188. 'order_id' => $order_id,
  189. 'product_id' => $product_id,
  190. 'is_first_order' => '0',
  191. 'product_name' => $value['product_name'],
  192. 'shop_id' => $value['shop_id'],
  193. 'pay_total' => $value['pay_total'],
  194. 'custom_uid' => $uid,
  195. 'promoter_userid' => $promoter_userid,
  196. 'commission_rate' => $commission_rate,
  197. 'reward_amount' => $reward_amount,
  198. 'before_revenue_amount' => $before_revenue_amount,
  199. 'after_revenue_amount' => $after_revenue_amount,
  200. 'revenue_type' => 1, //收益类型1=产品收益2=注册收益
  201. 'commission_level' => '2', //推广等级1=一级推广员2=二级推广员3=三级推广员
  202. 'insert_time' => time(),
  203. 'status' => 1, //状态1=预计收益2=结算中3=审核中4=已转到余额
  204. ];
  205. }
  206. $EarningsRecordModel->insert($insert_data);
  207. //统计非首单奖励金额
  208. $UsersModel->where('custom_uid', $promoter_userid)->update([
  209. 'product_commission_amount' => DB::raw('product_commission_amount+' . $reward_amount)
  210. ]);
  211. DB::connection('company')->commit();
  212. // 开启三级推广员订单处理队列
  213. LevelThreeOrdersJobs::dispatch(['uid'=>$uid,'custom_uid'=>$promoter_userid,'company_id'=>$company_id,'order_id'=>$order_id]);
  214. //删除任务记录
  215. $this->Records->delete();
  216. // 成功处理...
  217. } catch (\Exception $e) {
  218. DB::rollBack();
  219. // 失败处理...
  220. if ($this->Records) {
  221. $this->Records->delete();
  222. }
  223. Log::info('job_error', '二级推广员订单收益队列运行失败', ['data' => $this->message_data, 'error' => $e->getMessage()]);
  224. }
  225. }
  226. public function failed(\Throwable $exception)
  227. {
  228. Log::info('job_error', '二级推广员订单收益队列彻底失败', ['data' => $this->message_data, 'error' => $exception]);
  229. // 失败处理...
  230. if ($this->Records) {
  231. $this->Records->delete();
  232. }
  233. }
  234. }