DelayUnfrozen.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace addons\CloudStock\common\logic\reward;
  3. use addons\CloudStock\common\models\CloudStockAgent;
  4. use addons\CloudStock\common\models\CloudStockBuyingOrder;
  5. use addons\CloudStock\common\models\CloudStockDeductionDetail;
  6. use addons\CloudStock\common\models\CloudStockDelayLog;
  7. use addons\CloudStock\common\models\CloudStockGoodsStockLog;
  8. use addons\CloudStock\common\models\CloudStockPaymentLog;
  9. use addons\CloudStock\common\services\PriceDifferenceProfitService;
  10. use addons\CloudStock\common\services\WithdrawService;
  11. use common\enums\StatusEnum;
  12. use common\enums\UserWalletEnum;
  13. use common\models\common\CapitalLog;
  14. use common\models\user\User;
  15. use services\common\UserWalletService;
  16. /**
  17. * TODO: 云库存延时结算
  18. * Class DelayUnfrozen
  19. */
  20. class DelayUnfrozen
  21. {
  22. /**
  23. * 执行延时结算队列任务
  24. * @param array $data
  25. * @return true|void
  26. */
  27. public function handle(array $data)
  28. {
  29. if (empty($data)) return true;
  30. $is_true = false;
  31. if(empty($data['type'])){
  32. $wallet_type = 'commission';
  33. CapitalLog::$capitalType = "{$wallet_type}_frozen";
  34. $commission_list = CapitalLog::lists($data['params']);
  35. if ($commission_list) {
  36. $user_ids = array_column($commission_list,'user_id');
  37. $user_arr = User::lists(['where'=>[['id'=>$user_ids]],'select'=>'id,mobile','index'=>'id']);
  38. $obj = new CloudStockAgent();
  39. foreach ($commission_list as $item) {
  40. if ($item['capital_type'] == UserWalletEnum::PAYMENT_FOR_GOODS_FILL) {
  41. $is_true = true;
  42. }
  43. $res = UserWalletService::unfrozen($item['id'], $wallet_type);
  44. if($res){
  45. try {
  46. $cloud_stock_agent_model = CloudStockAgent::findOne(['user_id'=>$item['user_id'],'status'=>StatusEnum::ENABLED]);
  47. $cloud_stock_agent_model->frozen_price-=$item['change_num'];
  48. if($cloud_stock_agent_model->frozen_price<0) $cloud_stock_agent_model->frozen_price = 0;
  49. if (in_array($item['capital_type'], ['equal', 'price_difference_equal'])) {
  50. $cloud_stock_agent_model->equal_award_frozen_price -= $item['change_num'];
  51. $cloud_stock_agent_model->equal_award_price += $item['change_num'];
  52. }
  53. $cloud_stock_agent_model->save();
  54. $obj->sendGoodsMoneyMessage($user_arr,$item);
  55. }catch (\Exception $e){
  56. \Yii::error('云库存延时结算代理商结算资金增加失败,ID:'. $item['id'] .',USER_ID: '. $item['user_id'].',原因:'. $e->getMessage());
  57. }
  58. }
  59. }
  60. }
  61. }else{
  62. $payment_log_list = CloudStockPaymentLog::lists($data['params'],false);
  63. if(!empty($payment_log_list)){
  64. $is_true = true;
  65. $money_arr = [];
  66. foreach ($payment_log_list as $item) {
  67. if(isset($money_arr[$item['user_id']])){
  68. $money_arr[$item['user_id']] += $item['money'];
  69. }else{
  70. $money_arr[$item['user_id']] = $item['money'];
  71. }
  72. $item->status = StatusEnum::ENABLED;
  73. $item->save();
  74. }
  75. foreach ($money_arr as $user_id => $money) {
  76. WithdrawService::handle([
  77. 'user_id'=>$user_id,
  78. 'money'=>$money,
  79. 'is_frozen'=>false,
  80. ]);
  81. }
  82. }
  83. }
  84. if ($is_true) {
  85. //开启延时结算货款
  86. (new PriceDifferenceProfitService(['mall_id' => $data['mall_id']]))->computeProfitByDelayBuy(1, $data['order_no']);//会员买货触发差价利润金额
  87. }
  88. // 更新延时结算日志状态
  89. if (!empty($data['mall_id']) && !empty($data['order_no'])) {
  90. try {
  91. CloudStockDelayLog::updateAll(['status' => CapitalLog::STATUS_SEND, 'agented_at' => time()], ['mall_id' => $data['mall_id'], 'order_no' => $data['order_no']]);
  92. }catch (\Exception $e){
  93. return false;
  94. }
  95. }
  96. }
  97. /**
  98. * 写入延时结算任务
  99. * @param int $sec
  100. * @param array $order_detail_ids // 结算订单详情ids
  101. * @param array $logs_data // 延时结算日志数据
  102. * @return bool
  103. */
  104. public static function task(int $sec = 0, array $queue_data = [], array $logs_data = [])
  105. {
  106. if (empty($queue_data['params'])) return true;
  107. try {
  108. // 写入延时结算日志
  109. CloudStockDelayLog::batchSave($logs_data);
  110. // 加入延时队列执行
  111. \Yii::$app->services->rabbitMq->delay($sec, $queue_data, self::class, 'handle');
  112. return true;
  113. }catch (\Exception $e){
  114. return true;
  115. }
  116. }
  117. }