RepurchaseLogic.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. namespace addons\CircleDistribution\common\logic;
  3. use addons\CircleDistribution\common\enums\DistributionEnum;
  4. use addons\CircleDistribution\common\enums\ComputingEnum;
  5. use addons\CircleDistribution\common\models\DistributionCommissionBasisLog;
  6. use addons\CircleDistribution\common\models\DistributionCommissionItemSetting;
  7. use common\enums\GoodsTypeEnum;
  8. use common\enums\OrderStatusEnum;
  9. use common\enums\StatusEnum;
  10. use common\models\common\CapitalLog;
  11. use common\models\goods\Goods;
  12. use common\models\mall\MallAddons;
  13. use common\models\order\OrderDetail;
  14. use common\models\user\UserPartitionRelationship;
  15. use services\common\UserWalletService;
  16. /**
  17. * @desc 复购逻辑
  18. * Class RepurchaseLogic
  19. * @package addons\CircleDistribution\common\logic
  20. */
  21. class RepurchaseLogic
  22. {
  23. /**
  24. * 检测订单是否属于复购商品订单,是的话解冻
  25. * @param $order
  26. * @return bool|void
  27. */
  28. public static function checkOrder($order)
  29. {
  30. $user_id = $order['user_id'];
  31. $mall_id = $order['mall_id'];
  32. $order_id = $order['id'];
  33. if (MallAddons::isInstall($mall_id, DistributionEnum::ADDONS_NAME) == 0) return true;
  34. $setting = \Yii::$app->services->setting->addons->get($mall_id, DistributionEnum::ADDONS_NAME, 'basic');
  35. if(!$setting['is_circle_repurchase']) return true;
  36. $compute_type = $order['order_status'] == OrderStatusEnum::ACCOMPLISH ? ComputingEnum::ORDER_FINISH : ComputingEnum::COMPUTE_TYPE_PAY;
  37. if ($setting['repurchase_compute_type'] != $compute_type) return;
  38. $thaw_goods_list = $setting['thaw_goods_ids'] ? json_decode($setting['thaw_goods_ids'], true) : [];
  39. if(!$thaw_goods_list) return true;
  40. $params = [];
  41. $params['select'] = 'goods_id';
  42. $params['where'] = [
  43. ['order_id' => $order_id],
  44. ['user_id' => $user_id], ['mall_id' => $mall_id],
  45. ];
  46. $order_detail_list = OrderDetail::lists($params);
  47. if (empty($order_detail_list)) return;
  48. $goods_ids = array_column($order_detail_list,'goods_id');
  49. $intersect = array_intersect($thaw_goods_list,$goods_ids);
  50. if(empty($intersect)) return;
  51. //符合解冻条件,解冻一个循环内的待结算佣金
  52. self::unfrozen($mall_id,$user_id);
  53. }
  54. /**
  55. * 解冻用户一个周期内的待结算佣金
  56. * @param $mall_id
  57. * @param $user_id
  58. * @param $all 释放全部
  59. */
  60. public static function unfrozen($mall_id,$user_id,$all = false)
  61. {
  62. $log_list = DistributionCommissionBasisLog::find()->where(['mall_id' => $mall_id,'user_id' => $user_id,'need_repurchase' => 1])->orderBy('id asc')->all();
  63. $circle_num = 0;
  64. $log_ids = [];
  65. $source_table_id_arr = [];
  66. foreach($log_list as $log){
  67. if($log->sequence >= $circle_num || $all){
  68. $circle_num = $log->sequence;
  69. $log_ids[] = $log->id;
  70. if($log->source_table == 'order_detail'){
  71. $source_table_id_arr[] = $log->source_table_id;
  72. }
  73. }else{
  74. break;
  75. }
  76. }
  77. if($source_table_id_arr){
  78. $where =
  79. [
  80. ['source_table' => 'order_detail'],
  81. ['source_table_id' => $source_table_id_arr],
  82. ['from_type' => DistributionEnum::ADDONS_NAME],
  83. ['status' => CapitalLog::STATUS_WAIT_SEND]
  84. ];
  85. $params['where'] = $where;
  86. $wallet_type = 'commission';
  87. CapitalLog::$capitalType = "{$wallet_type}_frozen";
  88. $commission_list = CapitalLog::lists($params);
  89. if ($commission_list) {
  90. foreach ($commission_list as $item) {
  91. $res = UserWalletService::unfrozen($item['id'], $wallet_type);
  92. }
  93. }
  94. $wallet_type = 'score';
  95. CapitalLog::$capitalType = "{$wallet_type}_frozen";
  96. $score_list = CapitalLog::lists($params);
  97. if ($score_list) {
  98. foreach ($score_list as $item) {
  99. $res = UserWalletService::unfrozen($item['id'], $wallet_type);
  100. }
  101. }
  102. //修改状态
  103. $res = DistributionCommissionBasisLog::updateAll(['need_repurchase' => 0], ['id' => $log_ids]);
  104. if(!$res){
  105. \Yii::error('DistributionCommissionBasisLog updateAll error,ids='.implode(',',$log_ids));
  106. }
  107. }
  108. }
  109. }