You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

284 lines
14 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. <?php
  2. namespace App\Service\v3\Implementations;
  3. use App\Constants\v3\OrderState;
  4. use App\Service\v3\Interfaces\BadgeServiceInterface;
  5. use Hyperf\Redis\Redis;
  6. use Hyperf\Utils\ApplicationContext;
  7. class BadgeService implements BadgeServiceInterface
  8. {
  9. /**
  10. * @inheritDoc
  11. */
  12. public function doByOrder($userId, $storeIds, $globalOrderId, $orderState)
  13. {
  14. switch ($orderState) {
  15. case OrderState::UNPAID: # 待付款(用户)
  16. $this->sAddUserOrder('unpaid', $userId, $globalOrderId);
  17. break;
  18. case OrderState::CANCELED: # 订单取消(用户)
  19. $this->sAddUserOrder('canceled', $userId, $globalOrderId);
  20. foreach ($storeIds as $key => &$storeId) {
  21. $this->sAddStoreOrder('canceled', $storeId, $globalOrderId);
  22. }
  23. break;
  24. case OrderState::PAID: # 已付款(用户)
  25. $this->sAddUserOrder('receiving', $userId, $globalOrderId);
  26. foreach ($storeIds as $key => &$storeId) {
  27. $this->sAddStoreOrder('paid', $storeId, $globalOrderId);
  28. }
  29. break;
  30. case OrderState::REFUNDING: # 用户申请退款
  31. case OrderState::REFUNDED: # 后台同意退款
  32. case OrderState::REFUND_REFUSE: # 后台拒绝退款
  33. $this->sAddUserOrder('refund', $userId, $globalOrderId);
  34. foreach ($storeIds as $key => &$storeId) {
  35. $this->sAddStoreOrder('refund', $storeId, $globalOrderId);
  36. }
  37. break;
  38. case OrderState::REJECTION: # 后台拒单(后台)
  39. $this->sAddUserOrder('rejection', $userId, $globalOrderId);
  40. foreach ($storeIds as $key => &$storeId) {
  41. $this->sAddStoreOrder('rejection', $storeId, $globalOrderId);
  42. }
  43. break;
  44. case OrderState::DELIVERY: # 后台接单(后台)
  45. $this->sAddUserOrder('receiving', $userId, $globalOrderId);
  46. foreach ($storeIds as $key => &$storeId) {
  47. $this->sAddStoreOrder('delivery', $storeId, $globalOrderId);
  48. }
  49. break;
  50. case OrderState::COMPLETED: # 订单完成(用户或后台操作)
  51. case OrderState::EVALUATED: # 订单评价(用户)
  52. $this->sAddUserOrder('finish', $userId, $globalOrderId);
  53. foreach ($storeIds as $key => &$storeId) {
  54. $this->sAddStoreOrder('finish', $storeId, $globalOrderId);
  55. }
  56. break;
  57. }
  58. }
  59. public function allByUserOrder($userId)
  60. {
  61. $redis = ApplicationContext::getContainer()->get(Redis::class);
  62. $redisHName = 'badge:user';
  63. $redisHKey = 'user_id_'.$userId;
  64. // 取出当前用户的key的badge(key=>value json串)
  65. $userBadges = $redis->hGet($redisHName, $redisHKey);
  66. $userBadges = json_decode($userBadges, true);
  67. return [
  68. 'unpaid' => isset($userBadges['unpaid']) ? count($userBadges['unpaid']) : 0,
  69. 'receiving' => isset($userBadges['receiving']) ? count($userBadges['receiving']) : 0,
  70. 'finish' => isset($userBadges['finish']) ? count($userBadges['finish']) : 0,
  71. 'refund' => isset($userBadges['refund']) ? count($userBadges['refund']) : 0,
  72. 'canceled' => isset($userBadges['canceled']) ? count($userBadges['canceled']) : 0,
  73. 'rejection' => isset($userBadges['rejection']) ? count($userBadges['rejection']) : 0,
  74. 'unpaid_arr' => $userBadges['unpaid'] ?? [],
  75. 'receiving_arr' => $userBadges['receiving'] ?? [],
  76. 'finish_arr' => $userBadges['finish'] ?? [],
  77. 'refund_arr' => $userBadges['refund'] ?? [],
  78. 'canceled_arr' => $userBadges['canceled'] ?? [],
  79. 'rejection_arr' => $userBadges['rejection'] ?? [],
  80. ];
  81. // return [
  82. // 'unpaid' => count($redis->sMembers('badge_unpaid_user_'.$userId)),
  83. // 'receiving' => count($redis->sMembers('badge_receiving_user_'.$userId)),
  84. // 'finish' => count($redis->sMembers('badge_finish_user_'.$userId)),
  85. // 'refund' => count($redis->sMembers('badge_refund_user_'.$userId)),
  86. // 'canceled' => count($redis->sMembers('badge_canceled_user_'.$userId)),
  87. // 'rejection' => count($redis->sMembers('badge_rejection_store_'.$userId)),
  88. // ];
  89. }
  90. /**
  91. * @inheritDoc
  92. */
  93. public function allByStoreOrder($storeId)
  94. {
  95. $redis = ApplicationContext::getContainer()->get(Redis::class);
  96. $redisHName = 'badge:store';
  97. $redisHKey = 'store_id_'.$storeId;
  98. // 取出当前用户的key的badge(key=>value json串)
  99. $storeBadges = $redis->hGet($redisHName, $redisHKey);
  100. $storeBadges = json_decode($storeBadges, true);
  101. return [
  102. 'paid' => isset($storeBadges['paid']) ? count($storeBadges['paid']) : 0,
  103. 'delivery' => isset($storeBadges['delivery']) ? count($storeBadges['delivery']) : 0,
  104. 'finish' => isset($storeBadges['finish']) ? count($storeBadges['finish']) : 0,
  105. 'refund' => isset($storeBadges['refund']) ? count($storeBadges['refund']) : 0,
  106. 'canceled' => isset($storeBadges['canceled']) ? count($storeBadges['canceled']) : 0,
  107. 'rejection' => isset($storeBadges['rejection']) ? count($storeBadges['rejection']) : 0,
  108. 'paid_arr' => $storeBadges['paid'] ?? [],
  109. 'delivery_arr' => $storeBadges['delivery'] ?? [],
  110. 'finish_arr' => $storeBadges['finish'] ?? [],
  111. 'refund_arr' => $storeBadges['refund'] ?? [],
  112. 'canceled_arr' => $storeBadges['canceled'] ?? [],
  113. 'rejection_arr' => $storeBadges['rejection'] ?? [],
  114. ];
  115. // return [
  116. // 'paid' => count($redis->sMembers('badge_paid_store_'.$storeId)),
  117. // 'delivery' => count($redis->sMembers('badge_delivery_store_'.$storeId)),
  118. // 'finish' => count($redis->sMembers('badge_finish_store_'.$storeId)),
  119. // 'refund' => count($redis->sMembers('badge_refund_store_'.$storeId)),
  120. // 'canceled' => count($redis->sMembers('badge_canceled_store_'.$storeId)),
  121. // 'rejection' => count($redis->sMembers('badge_rejection_store_'.$storeId)),
  122. // ];
  123. }
  124. /**
  125. * @inheritDoc
  126. */
  127. public function sAddUserOrder($badge, $userId, $globalOrderId)
  128. {
  129. $redis = ApplicationContext::getContainer()->get(Redis::class);
  130. $redisHName = 'badge:user';
  131. $redisHKey = 'user_id_'.$userId;
  132. // 取出当前用户的key的badge(key=>value json串)
  133. $userBadges = $redis->hGet($redisHName, $redisHKey);
  134. $userBadges = json_decode($userBadges, true);
  135. $userBadges['unpaid'] = isset($userBadges['unpaid']) ? array_diff($userBadges['unpaid'], [$globalOrderId]) : []; # 移除用户待付款
  136. $userBadges['receiving'] = isset($userBadges['receiving']) ? array_diff($userBadges['receiving'], [$globalOrderId]) : []; # 移除用户待收货
  137. $userBadges['finish'] = isset($userBadges['finish']) ? array_diff($userBadges['finish'], [$globalOrderId]) : []; # 移除用户已完成
  138. $userBadges['canceled'] = isset($userBadges['canceled']) ? array_diff($userBadges['canceled'], [$globalOrderId]) : []; # 移除用户已取消
  139. $userBadges['refund'] = isset($userBadges['refund']) ? array_diff($userBadges['refund'], [$globalOrderId]) : []; # 移除用户退款售后
  140. $userBadges['rejection'] = isset($userBadges['rejection']) ? array_diff($userBadges['rejection'], [$globalOrderId]) : []; # 移除用户拒单
  141. $userBadges[$badge] = array_merge($userBadges[$badge], [$globalOrderId]); # 新增用户当前状态的值
  142. $redis->hSet($redisHName,$redisHKey,json_encode($userBadges));
  143. // $redis->sRem('badge_unpaid_user_'.$userId, $globalOrderId); # 移除用户待付款
  144. // $redis->sRem('badge_receiving_user_'.$userId, $globalOrderId); # 移除用户待收货
  145. // $redis->sRem('badge_finish_user_'.$userId, $globalOrderId); # 移除用户已完成
  146. // $redis->sRem('badge_canceled_user_'.$userId, $globalOrderId); # 移除用户已取消
  147. // $redis->sRem('badge_refund_user_'.$userId, $globalOrderId); # 移除用户退款售后
  148. // $redis->sRem('badge_rejection_store_', $userId, $globalOrderId); # 移除用户拒单
  149. // $redis->sAdd('badge_'.$badge.'_user_'.$userId, $globalOrderId); # 新增用户当前状态的值
  150. }
  151. /**
  152. * @inheritDoc
  153. */
  154. public function sAddStoreOrder($badge, $storeId, $globalOrderId)
  155. {
  156. $redis = ApplicationContext::getContainer()->get(Redis::class);
  157. $redisHName = 'badge:store';
  158. $redisHKey = 'store_id_'.$storeId;
  159. // 取出当前用户的key的badge(key=>value json串)
  160. $storeBadges = $redis->hGet($redisHName, $redisHKey);
  161. $storeBadges = json_decode($storeBadges, true);
  162. $storeBadges['paid'] = isset($storeBadges['paid']) ? array_diff($storeBadges['paid'], [$globalOrderId]) : []; # 移除商户待接单
  163. $storeBadges['delivery'] = isset($storeBadges['delivery']) ? array_diff($storeBadges['delivery'], [$globalOrderId]) : []; # 移除商户待送达
  164. $storeBadges['finish'] = isset($storeBadges['finish']) ? array_diff($storeBadges['finish'], [$globalOrderId]) : []; # 移除商户已完成
  165. $storeBadges['canceled'] = isset($storeBadges['canceled']) ? array_diff($storeBadges['canceled'], [$globalOrderId]) : []; # 移除商户已取消
  166. $storeBadges['refund'] = isset($storeBadges['refund']) ? array_diff($storeBadges['refund'], [$globalOrderId]) : []; # 移除商户退款售后
  167. $storeBadges['rejection'] = isset($storeBadges['rejection']) ? array_diff($storeBadges['rejection'], [$globalOrderId]) : []; # 移除商户拒单
  168. $storeBadges[$badge] = array_merge($storeBadges[$badge], [$globalOrderId]); # 新增商户当前状态的值
  169. $redis->hSet($redisHName,$redisHKey,json_encode($storeBadges));
  170. // $redis->sRem('badge_paid_store_'.$storeId, $globalOrderId); # 移除商户待接单
  171. // $redis->sRem('badge_delivery_store_'.$storeId, $globalOrderId); # 移除商户待送达
  172. // $redis->sRem('badge_finish_store_'.$storeId, $globalOrderId); # 移除商户已完成
  173. // $redis->sRem('badge_canceled_store_'.$storeId, $globalOrderId); # 移除商户已取消
  174. // $redis->sRem('badge_refund_store_'.$storeId, $globalOrderId); # 移除商户退款售后
  175. // $redis->sRem('badge_rejection_store_', $storeId, $globalOrderId); # 移除商户拒单
  176. // $redis->sAdd('badge_'.$badge.'_store_'.$storeId, $globalOrderId); # 新增用户当前状态的值
  177. }
  178. /**
  179. * @inheritDoc
  180. */
  181. public function clearUserOrder($userId, $badge = 'all', $globalOrderId = '')
  182. {
  183. $redis = ApplicationContext::getContainer()->get(Redis::class);
  184. $redisHName = 'badge:user';
  185. $redisHKey = 'user_id_'.$userId;
  186. // 取出当前用户的key的badge(key=>value json串)
  187. $userBadges = $redis->hGet($redisHName, $redisHKey);
  188. $userBadges = json_decode($userBadges, true);
  189. if ($badge == 'all') {
  190. $redis->hDel($redisHName, $redisHKey);
  191. // $redis->del('badge_unpaid_user_'.$userId); # 移除用户待付款
  192. // $redis->del('badge_receiving_user_'.$userId); # 移除用户待收货
  193. // $redis->del('badge_finish_user_'.$userId); # 移除用户已完成
  194. // $redis->del('badge_canceled_user_'.$userId); # 移除用户已取消
  195. // $redis->del('badge_refund_user_'.$userId); # 移除用户退款售后
  196. // $redis->del('badge_rejection_store_', $userId); # 移除用户拒单
  197. } else {
  198. if ($globalOrderId) {
  199. $userBadges[$badge] = isset($userBadges[$badge]) ? array_diff($userBadges[$badge], [$globalOrderId]) : []; # 移除当前状态里的某个值
  200. } else {
  201. unset($userBadges[$badge]);
  202. }
  203. $redis->hSet($redisHName,$redisHKey,json_encode($userBadges));
  204. // $redis->del('badge_'.$badge.'_user_'.$userId);
  205. }
  206. }
  207. /**
  208. * @inheritDoc
  209. */
  210. public function clearStoreOrder($storeId, $badge = 'all', $globalOrderId = '')
  211. {
  212. $redis = ApplicationContext::getContainer()->get(Redis::class);
  213. $redisHName = 'badge:store';
  214. $redisHKey = 'store_id_'.$storeId;
  215. // 取出当前用户的key的badge(key=>value json串)
  216. $storeBadges = $redis->hGet($redisHName, $redisHKey);
  217. $storeBadges = json_decode($storeBadges, true);
  218. if ($badge == 'all') {
  219. $redis->hDel($redisHName, $redisHKey);
  220. // $redis->del('badge_paid_store_'.$storeId); # 移除商户待付款
  221. // $redis->del('badge_delivery_store_'.$storeId); # 移除商户待收货
  222. // $redis->del('badge_finish_store_'.$storeId); # 移除商户已完成
  223. // $redis->del('badge_canceled_store_'.$storeId); # 移除商户已取消
  224. // $redis->del('badge_refund_store_'.$storeId); # 移除商户退款售后
  225. // $redis->del('badge_rejection_store_', $storeId); # 移除商户拒单
  226. } else {
  227. if ($globalOrderId) {
  228. $storeBadges[$badge] = isset($storeBadges[$badge]) ? array_diff($storeBadges[$badge], [$globalOrderId]) : []; # 移除当前状态里的某个值
  229. } else {
  230. unset($storeBadges[$badge]);
  231. }
  232. $redis->hSet($redisHName,$redisHKey,json_encode($storeBadges));
  233. // $redis->del('badge_'.$badge.'_store_'.$storeId);
  234. }
  235. }
  236. }