Send.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <?php
  2. namespace addons\IssueCoupons\common\logic;
  3. use addons\Coupon\common\models\AddonsCouponUserRelate;
  4. use addons\ElectronCoupon\common\models\ElectronCouponUserCoupon;
  5. use addons\IssueCoupons\common\enums\IssueCouponsEnum;
  6. use addons\IssueCoupons\common\models\IssueCouponsRule;
  7. use addons\IssueCoupons\common\models\IssueCouponsSendLog;
  8. use addons\IssueCoupons\common\models\IssueCouponsStatistics;
  9. use addons\IssueCoupons\common\models\IssueCouponsUser;
  10. use addons\Redpack\common\models\Redpack;
  11. use addons\Redpack\common\models\RedpackWallet;
  12. use common\enums\RabbitMqEnum;
  13. use common\enums\RedisKeyEnum;
  14. use common\enums\StatusEnum;
  15. use common\enums\UserWalletEnum;
  16. use common\helpers\LockHelper;
  17. use common\helpers\StringHelper;
  18. use common\models\mall\MallAddons;
  19. use common\models\user\User;
  20. use common\models\user\UserLabel;
  21. use common\models\user\UserLabelRelationship;
  22. use common\models\user\UserWallet;
  23. use common\traits\ErrorTrait;
  24. use Faker\Provider\Address;
  25. use PHPUnit\Util\Exception;
  26. use services\common\UserWalletService;
  27. use yii;
  28. /**
  29. * Class LotteryLogic
  30. * @Author: ltm
  31. * @DateTime: 2021/12/23 0023 10:21
  32. * @Copyright: copyright (c) 2021 广东七件事集团
  33. * @package addons\Sudoku\common\logic
  34. */
  35. class Send
  36. {
  37. use ErrorTrait;
  38. /**
  39. * @Author: ltm
  40. * @DateTime: 2021/12/23 0023 10:21
  41. * @Copyright: copyright (c) 2021 广东七件事集团
  42. * @param $data['score'] 积分
  43. * @param $data['user_id'] 会员ID
  44. * @return bool
  45. */
  46. //自动执行
  47. public function execute()
  48. {
  49. //handsend
  50. try {
  51. $IssueCoupons = IssueCouponsRule::find()->where(['status' => StatusEnum::ENABLED,'is_grant'=>'0']);
  52. $new_time = time();
  53. foreach ($IssueCoupons->batch(200) as $detail){//分批查询标签
  54. foreach ($detail as $k=>$v){
  55. if($v['timing_time'] && $v['timing_time']<$new_time){
  56. //var_dump($v['id']);
  57. $this->executesend($v);
  58. }
  59. }
  60. }
  61. } catch (Exception $e) {
  62. self::$static_error = $e->getMessage();
  63. return false;
  64. }
  65. }
  66. //手动执行
  67. public function handsend($params){
  68. if($params['id']){
  69. $where[] = ['=','id',$params['id']];
  70. $where[] = ['=','is_grant','0'];
  71. $rule = IssueCouponsRule::getOne($where,true);
  72. if($rule){
  73. $this->executesend($rule);
  74. }
  75. }
  76. }
  77. //执行发送
  78. public function executesend($rule){
  79. if($rule){
  80. //更新是否已经执行
  81. $rule = IssueCouponsRule::findOne(['id'=>$rule['id']]);
  82. $rule->is_grant = 1;
  83. $rule->save();
  84. switch ($rule['grant_object']){
  85. case 1://发放全部会员
  86. $user_data = User::find()->where(['status' => StatusEnum::ENABLED,'mall_id'=>$rule['mall_id']]);
  87. break;
  88. case 2://发放指定等级会员
  89. $level_user = json_decode($rule['grant_object_content']);
  90. $user_data = User::find()->where(['status' => StatusEnum::ENABLED,'mall_id'=>$rule['mall_id']])->andWhere(['in','level',$level_user]);
  91. break;
  92. case 3://发放指定标签会员
  93. $level_user = json_decode($rule['grant_object_content']);
  94. $user_label = UserLabelRelationship::find()->where(['status' => StatusEnum::ENABLED,'mall_id'=>$rule['mall_id']])->andWhere(['in','label_id',$level_user]);
  95. //var_dump($user_label);die;
  96. foreach ($user_label->batch(200) as $label){//分批查询标签
  97. $user_ids = [];
  98. foreach ($label as $k=>$v){
  99. $user_ids[] = $v['user_id'];
  100. }
  101. $user_data = User::find()->where(['status' => StatusEnum::ENABLED,'mall_id'=>$rule['mall_id']])->andWhere(['in','id',$user_ids]);
  102. }
  103. break;
  104. case 4://发放指定会员
  105. $level_user = json_decode($rule['grant_object_content']);
  106. $user_data = User::find()->where(['status' => StatusEnum::ENABLED,'mall_id'=>$rule['mall_id']])->andWhere(['in','id',$level_user]);
  107. break;
  108. }
  109. $this->sendData($user_data,$rule);
  110. }
  111. }
  112. //发送优惠卷
  113. public function sendData($user_data,$data){
  114. $send['score'] = 0;
  115. $send['balance'] = 0;
  116. $send['redpack'] = 0;
  117. $send['coupon'] = 0;
  118. $send['e_coupon'] = 0;
  119. foreach ($user_data->batch(200) as $user_data){
  120. $insert_score_wallet = [];
  121. foreach ($user_data as $k=>$v){
  122. if(isset($data['score']) && $data['score']){//充值积分
  123. $wallet['user_id'] = $v['id'];
  124. $wallet['mall_id'] = $v['mall_id'];
  125. $send['score'] += $data['score'];
  126. $insert_score_wallet [] = ['mall_id' => $data['mall_id'], 'user_id' => $v['id'],
  127. 'is_frozen' => false,
  128. 'wallet_type' => UserWalletService::WALLET_TYPE_SCORE,
  129. 'money' => $data['score'],
  130. 'desc' => '发券宝充值积分',
  131. 'source_table' => IssueCouponsEnum::ADDONSNAME,
  132. 'source_table_id' => $v['id'],
  133. 'from_type' => UserWalletEnum::REWARD,
  134. 'capital_type' => UserWalletEnum::GIVE,
  135. ];
  136. }
  137. if(isset($data['balance']) && $data['balance']){//送余额
  138. $wallet['user_id'] = $v['id'];
  139. $wallet['mall_id'] = $v['mall_id'];
  140. $send['balance'] += $data['balance'];
  141. $insert_balance_wallet [] = ['mall_id' => $data['mall_id'], 'user_id' => $v['id'],
  142. 'is_frozen' => false,
  143. 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
  144. 'money' => $data['balance'],
  145. 'desc' => '发券宝充值余额',
  146. 'source_table' => IssueCouponsEnum::ADDONSNAME,
  147. 'source_table_id' => $v['id'],
  148. 'from_type' => UserWalletEnum::REWARD,
  149. 'capital_type' => UserWalletEnum::GIVE,
  150. ];
  151. }
  152. if(isset($data['redpack']) && $data['redpack']){//发红包
  153. $redpack['mall_id'] = $v['mall_id'];
  154. $redpack['user_id'] = $v['id'];
  155. $redpack['is_frozen'] = false;
  156. $redpack['money'] = $data['redpack'];
  157. $redpack['from_type'] = 1;
  158. $redpack['source_table'] = IssueCouponsEnum::ADDONSNAME;
  159. $redpack['source_table_id'] = $v['id'];
  160. $has_redpack = MallAddons::isInstall($v['mall_id'],IssueCouponsEnum::ADDONSREDPACK);
  161. if($has_redpack){
  162. RedpackWallet::setData($redpack);
  163. $send['redpack'] += $data['redpack'];
  164. }else{
  165. $msg['msg'][0] = "红包插件未安装";
  166. }
  167. }
  168. if(isset($data['coupon']) && $data['coupon']){//送优惠卷
  169. $coupon = json_decode($data['coupon'],true);
  170. if($coupon){
  171. foreach ($coupon as $key=>$value){
  172. $coupon_data = [];
  173. $coupon_data[$value['id']] = $value['num'];
  174. $has = MallAddons::isInstall($v['mall_id'],IssueCouponsEnum::ADDONSCOUPON);
  175. if($has){
  176. AddonsCouponUserRelate::giveCoupon($v['mall_id'],$v['id'],$coupon_data,1);
  177. //var_dump(AddonsCouponUserRelate::getStaticError());
  178. $send['coupon'] += $value['num'];
  179. }else{
  180. $msg['msg'][1] = "优惠卷插件未安装";
  181. }
  182. }
  183. }
  184. }
  185. if(isset($data['e_coupon']) && $data['e_coupon']){//送电子卷
  186. $coupon = json_decode($data['e_coupon'],true);
  187. if($coupon){
  188. foreach ($coupon as $key=>$value){
  189. $coupon_data['user_id'] = $v['id'];
  190. $coupon_data['e_coupon_id'] = $value['id'];
  191. $coupon_data['pieces_amount'] = $value['num'];
  192. $coupon_data['get_type'] = 3;
  193. $coupon_data['mall_id'] = $v['mall_id'];
  194. $has = MallAddons::isInstall($v['mall_id'],IssueCouponsEnum::ADDONSELETRONCOUPON);
  195. if($has){
  196. $res = ElectronCouponUserCoupon::userReceiveCoupon($coupon_data);
  197. //var_dump(ElectronCouponUserCoupon::getStaticError());
  198. $send['e_coupon'] += $value['num'];
  199. }else{
  200. $msg['msg'][2] = "电子券插件未安装";
  201. }
  202. }
  203. }
  204. }
  205. //添加会员记录
  206. $this->adduUserLog($v,$data);
  207. }
  208. //发送积分
  209. if($insert_score_wallet){
  210. $res_score = UserWalletService::batchHandleByQueue($insert_score_wallet);
  211. if ($res_score === false) return $this->error(UserWallet::getStaticError());
  212. }
  213. //发送余额
  214. if($insert_balance_wallet){
  215. $res_balance = UserWalletService::batchHandleByQueue($insert_balance_wallet);
  216. if ($res_balance === false) return $this->error(UserWallet::getStaticError());
  217. }
  218. }
  219. //进行统计发放
  220. //var_dump($send);die;
  221. $this->statistics($data,$send);
  222. return $send;
  223. }
  224. //进行统计
  225. public function statistics($data,$send){
  226. $statistics_data = [
  227. 'rule_id' => $data['id'],
  228. 'mall_id' => $data['mall_id'],
  229. 'e_coupon_num' => $send['e_coupon'],
  230. 'coupon_num' => $send['coupon'],
  231. 'redpack_num' => $send['redpack'],
  232. 'balance_num' => $send['balance'],
  233. 'score_num' => $send['score'],
  234. 'grant_object' => $data['grant_object'],
  235. 'grant_object_content' => $data['grant_object_content'],
  236. 'send_times' => 1,
  237. ];
  238. $resadd = IssueCouponsStatistics::setData($statistics_data);
  239. //添加发送记录
  240. $res_log = IssueCouponsSendLog::setData($statistics_data);
  241. }
  242. //添加会员记录
  243. public function adduUserLog($add_log,$data){
  244. //添加会员记录
  245. $add_log = [
  246. 'rule_id' => $data['id'],
  247. 'user_id' => $add_log['id'],
  248. 'mall_id' => $add_log['mall_id'],
  249. 'grant_object' => $data['grant_object'],
  250. //'grant_object_content' => $data['grant_object_content'],
  251. ];
  252. $resadd = IssueCouponsUser::setData($add_log);
  253. //var_dump(IssueCouponsUser::getStaticError());
  254. }
  255. }