DoubleCopyOrderLogic.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <?php
  2. namespace addons\CloudStock\common\logic\order;
  3. use addons\CloudStock\common\enums\CloudStockEnum;
  4. use addons\CloudStock\common\logic\gift_bag\GiftBagLogic;
  5. use addons\CloudStock\common\models\CloudStockAgent;
  6. use addons\CloudStock\common\models\CloudStockAgentGoods;
  7. use addons\CloudStock\common\models\CloudStockDeductionDetail;
  8. use addons\CloudStock\common\sms\SmsConfig;
  9. use addons\CloudStock\common\sms\TimeLimitFillMessage;
  10. use addons\DoubleCopy\common\models\DoubleCopyLevel;
  11. use common\enums\AddonsEnum;
  12. use common\enums\StatusEnum;
  13. use common\helpers\sms\Sms;
  14. use common\models\mall\MallAddons;
  15. use common\models\order\Order;
  16. use common\models\order\OrderDetail;
  17. use common\models\user\User;
  18. use Overtrue\EasySms\EasySms;
  19. use Overtrue\EasySms\Exceptions\NoGatewayAvailableException;
  20. class DoubleCopyOrderLogic
  21. {
  22. public function handle($data)
  23. {
  24. $order_id = $data['order_id'] ?? 0;
  25. $commission_arr = $data['commission_arr'] ?? [];
  26. $order = Order::findOne(['id' => $order_id]);
  27. if (empty($order)) return true;
  28. $order_detail_list = OrderDetail::lists([
  29. 'where' => [
  30. ['order_id' => $order_id]
  31. ],
  32. ]);
  33. if (empty($order_detail_list)) return true;
  34. $mall_id = $order['mall_id'];
  35. $buy_user_id = $order['user_id'];
  36. if (!MallAddons::isInstall($mall_id, 'DoubleCopy')) {
  37. var_dump("order_id:{$order_id}:二二复制插件未安装");
  38. return true;
  39. }
  40. $double_copy_level_model = DoubleCopyLevel::getOne([['mall_id' => $mall_id], ['level' => 1], ['status' => [StatusEnum::ENABLED]]], true);
  41. if (empty($double_copy_level_model)) {
  42. var_dump("order_id:{$order_id}:二二复制等级1未设置");
  43. return true;
  44. }
  45. if (empty($double_copy_level_model['is_auto_upgrade'])) {
  46. var_dump("order_id:{$order_id}:二二复制是否启用自动升级未开启");
  47. return true;
  48. }
  49. if (empty($double_copy_level_model['upgrade_type_goods'])) {
  50. var_dump("order_id:{$order_id}:二二复制购买商品升级未开启");
  51. return true;
  52. }
  53. if (empty($double_copy_level_model['buy_goods_type'])) {
  54. var_dump("order_id:{$order_id}:二二复制购买商品升级必须是支付完成");
  55. return true;
  56. }
  57. if (empty($double_copy_level_model['goods_type']) || $double_copy_level_model['goods_type'] != 2) {
  58. var_dump("order_id:{$order_id}:二二复制购买商品升级必须是指定商品");
  59. return true;
  60. }
  61. $double_copy_level_model['goods_list'] = json_decode($double_copy_level_model['goods_list'], true);
  62. if (empty($double_copy_level_model['goods_list'])) {
  63. var_dump("order_id:{$order_id}:二二复制商品未设置");
  64. return true;
  65. }
  66. $double_copy_goods_ids = array_column($double_copy_level_model['goods_list'], 'id');
  67. $cloud_stock_double_copy_goods = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'double_copy_goods');
  68. $cloud_stock_double_copy_goods_list = json_decode($cloud_stock_double_copy_goods['goods_list'], true);
  69. if (empty($cloud_stock_double_copy_goods_list)) return true;
  70. $cloud_stock_double_copy_goods_list = array_column($cloud_stock_double_copy_goods_list, null, 'id');
  71. $configs = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
  72. $deduction_commission_arr = [];
  73. if (!empty($configs['deduction_commission_arr'])) {
  74. $deduction_commission_arr = json_decode($configs['deduction_commission_arr'], true);
  75. }
  76. foreach ($order_detail_list as $detail) {
  77. if (!in_array($detail['goods_id'], $double_copy_goods_ids)) continue;
  78. if (!isset($cloud_stock_double_copy_goods_list[$detail['goods_id']])) continue;
  79. if (empty($cloud_stock_double_copy_goods_list[$detail['goods_id']]['num'])) continue;
  80. $cloud_stock_goods_id = $cloud_stock_double_copy_goods_list[$detail['goods_id']]['cloud_stock_goods_id'];
  81. $num = $cloud_stock_double_copy_goods_list[$detail['goods_id']]['num'];
  82. if(!empty($configs['buy_double_copy_goods_dec_cloud_stock_goods'])){
  83. $num = $detail['num'];
  84. }
  85. $commission = 0;
  86. foreach ($deduction_commission_arr as $addons => $v) {
  87. if (!empty($v['is_open'])) {
  88. if (isset($commission_arr[$detail['id']][$addons])) {
  89. $commission += $commission_arr[$detail['id']][$addons]['commission'];
  90. }
  91. }
  92. }
  93. var_dump("扣除佣金{$commission},order_detail_id:" . $detail['id']);
  94. $goods_price = $detail['goods_price'];
  95. $payment_for_goods = $goods_price - $commission;
  96. $res = self::checkDeductionStock($mall_id, $order_id,$detail['id'], $buy_user_id, 0, $cloud_stock_goods_id, $num, $payment_for_goods);
  97. var_dump($res);
  98. if (!empty($res['is_sub_stock'])) {
  99. $give_arr = [$cloud_stock_goods_id => $num];
  100. self::deductionStock($mall_id, $res['sub_user_id'] ?? 0, $order_id, $detail['id'], $give_arr, $payment_for_goods);
  101. }
  102. }
  103. }
  104. public static function checkDeductionStock($mall_id, $order_id, $order_detail_id, $buy_user_id, $level, $cloud_stock_goods_id, $num, $payment_for_goods)
  105. {
  106. $p_cloud_stock_agent_arr = GiftBagLogic::getParentCloudStockAgent($mall_id, $level, $buy_user_id);
  107. $is_sub_stock = 1;
  108. $sub_user_id = 0;
  109. if (!empty($p_cloud_stock_agent_arr)) {
  110. $configs = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
  111. if (!empty($configs['is_time_limit_fill'])) {
  112. //开启延时补货
  113. $first_parent = $p_cloud_stock_agent_arr[0];
  114. $agent_goods_list = CloudStockAgentGoods::lists([
  115. 'where' => [
  116. ['mall_id' => $mall_id],
  117. ['user_id' => $first_parent['user_id']],
  118. ['goods_id' => $cloud_stock_goods_id],
  119. ],
  120. 'index' => 'goods_id',
  121. ]);
  122. $goods_ids = '';
  123. $num_s = '';
  124. if (!isset($agent_goods_list[$cloud_stock_goods_id]) || $agent_goods_list[$cloud_stock_goods_id]['num'] < $num) {
  125. //延时补货
  126. $goods_ids = $cloud_stock_goods_id;
  127. $num_s = $num;
  128. $is_sub_stock = 0;
  129. $send_user_id = $first_parent['user_id'];
  130. }
  131. if ($is_sub_stock == 1) {
  132. $sub_user_id = $first_parent['user_id'];
  133. }
  134. if ($is_sub_stock == 0) {
  135. //投入延时队列
  136. $post_data = [
  137. 'mall_id' => $mall_id,
  138. 'order_id' => $order_id,
  139. 'order_detail_id' => $order_detail_id,
  140. 'give_arr' => [$cloud_stock_goods_id => $num],
  141. 'payment_for_goods' => $payment_for_goods,
  142. 'buy_user_id' => $buy_user_id,
  143. 'level' => $level
  144. ];
  145. var_dump('DoubleCopyOrderLogic:checkDeductionStock投入延时队列数据:' . json_encode($post_data));
  146. $fill_hour = $configs['fill_hour'] ?? 0;
  147. \Yii::$app->services->rabbitMq->delay($fill_hour * 3600, $post_data, self::class, 'delayDeductionStock');
  148. if (!empty($send_user_id)) {
  149. //补货通知
  150. try {
  151. $SmsConfig = new Sms($mall_id);
  152. $easy_sms = $SmsConfig->easySms;
  153. $message = new TimeLimitFillMessage($mall_id, $fill_hour, trim($goods_ids, ','), trim($num_s, ','));
  154. $user = User::findOne(['id' => $send_user_id]);
  155. $easy_sms->send($user['mobile'], $message);
  156. } catch (NoGatewayAvailableException $e) {
  157. $res = $e->getExceptions();
  158. if (!empty($res)) {
  159. foreach ($res as $exception) {
  160. if (is_string($exception->getMessage())) {
  161. var_dump('云库存购买二二复制商品补货通知短信发送失败:' . $exception->getMessage());
  162. }
  163. }
  164. }
  165. } catch (\Exception $e) {
  166. var_dump('云库存购买二二复制商品补货通知短信发送失败:' . $e->getMessage());
  167. }
  168. }
  169. }
  170. } else {
  171. $give_arr = [$cloud_stock_goods_id => $num];
  172. $sub_user_id = GiftBagLogic::checkDeductionStockNoDelay($mall_id, $buy_user_id, $level, $give_arr);
  173. }
  174. }
  175. return ['is_sub_stock' => $is_sub_stock, 'sub_user_id' => $sub_user_id];
  176. }
  177. public function delayDeductionStock($data)
  178. {
  179. try {
  180. $mall_id = $data['mall_id'];
  181. $order_id = $data['order_id'];
  182. $order_detail_id = $data['order_detail_id'];
  183. $give_arr = $data['give_arr'];
  184. $payment_for_goods = $data['payment_for_goods'];
  185. $buy_user_id = $data['buy_user_id'];
  186. $level = $data['level'];
  187. $sub_user_id = GiftBagLogic::checkDeductionStockNoDelay($mall_id, $buy_user_id, $level, $give_arr);
  188. self::deductionStock($mall_id, $sub_user_id, $order_id, $order_detail_id, $give_arr, $payment_for_goods);
  189. } catch (\Exception $e) {
  190. var_dump('DoubleCopyOrderLogic:delayDeductionStock:' . $e->getMessage() . $e->getFile() . $e->getLine());
  191. }
  192. }
  193. public static function deductionStock($mall_id, $sub_user_id, $order_id, $order_detail_id, $give_arr, $payment_for_goods)
  194. {
  195. if (!empty($give_arr)) {
  196. if ($sub_user_id > 0) {
  197. foreach ($give_arr as $goods_id => $num) {
  198. if (empty($num)) continue;
  199. $params = [
  200. 'mall_id' => $mall_id,
  201. 'user_id' => $sub_user_id,
  202. 'goods_id' => $goods_id,
  203. 'num' => $num,
  204. 'order_id' => $order_id,
  205. 'changes_type' => CloudStockEnum::STOCK_CHANGE_TYPE206,
  206. 'changes_dir' => CloudStockEnum::STOCK_CHANGE_SUB,
  207. 'order_type' => CloudStockEnum::STOCK_ORDER_TYPE_USER,
  208. ];
  209. $res = CloudStockAgentGoods::subData($params);
  210. if (!$res) throw new \Exception(CloudStockAgentGoods::getStaticError());
  211. var_dump('扣减库存成功');
  212. }
  213. var_dump('货款' . $payment_for_goods);
  214. if ($payment_for_goods > 0) {
  215. $source_table = OrderDetail::tableName();
  216. $source_table_id = $order_detail_id;
  217. $insert_wallet[] = [
  218. 'mall_id' => $mall_id,
  219. 'user_id' => $sub_user_id,
  220. 'is_frozen' => false,
  221. 'wallet_type' => 'commission',
  222. 'money' => $payment_for_goods,
  223. 'desc' => '会员购买二二复制商品扣库存的货款',
  224. 'source_table' => $source_table,
  225. 'source_table_id' => $source_table_id,
  226. 'from_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK,
  227. 'capital_type' => 'payment_for_double_copy_goods_buy',
  228. ];
  229. if (!empty($insert_wallet)) CloudStockAgent::sendUserWalletQueue($insert_wallet);
  230. }
  231. } else {
  232. foreach ($give_arr as $goods_id => $num) {
  233. $params = [
  234. 'stock_log_id' => 0,
  235. 'user_id' => 0,
  236. 'num' => $num,
  237. 'not_yet_num' => 0,
  238. 'changes_type' => CloudStockEnum::STOCK_CHANGE_TYPE206,
  239. 'order_id' => $order_id,
  240. 'goods_id' => $goods_id,
  241. 'mall_id' => $mall_id,
  242. ];
  243. $res = CloudStockDeductionDetail::setData($params);
  244. }
  245. }
  246. }
  247. }
  248. }