UpgradeService.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <?php
  2. namespace addons\OperationCenter\common\services;
  3. use addons\OperationCenter\common\models\Level;
  4. use addons\OperationCenter\common\models\MallOrder;
  5. use addons\OperationCenter\common\models\UpgradeLog;
  6. use addons\OperationCenter\common\models\UserCenter;
  7. use common\enums\AddonsEnum;
  8. use common\logic\common\BuyGoodsUpgrade;
  9. use common\logic\common\ConditionUpgrade;
  10. use Exception;
  11. use Yii;
  12. /**
  13. * UpgradeService
  14. * @package addons\OperationCenter\common\services
  15. */
  16. class UpgradeService extends BaseService
  17. {
  18. /**
  19. * 支付完成
  20. */
  21. const PAY = 0;
  22. /**
  23. * 订单完成
  24. */
  25. const FINISH = 1;
  26. /**
  27. * @var MallOrder
  28. */
  29. protected $order;
  30. /**
  31. * @var array
  32. */
  33. protected $upgradeLevel;
  34. /**
  35. * @var int
  36. */
  37. protected $isFinish;
  38. /**
  39. * @var array[Level]
  40. */
  41. protected $levelLists;
  42. /**
  43. * @return void
  44. */
  45. public function initLevel(MallOrder $order, int $is_finish)
  46. {
  47. $this->order = $order;
  48. $this->isFinish = $is_finish;
  49. }
  50. /**
  51. * 检测升级
  52. *
  53. * @param MallOrder $order
  54. * @return void
  55. */
  56. public function checkUpgrade(MallOrder $order, int $is_finish = 0)
  57. {
  58. /* // 触发购物升级
  59. $order = $order->toArray();
  60. $upgrade = new BuyGoodsUpgrade();
  61. $buy_uid = $upgrade->execute(
  62. AddonsEnum::ADDONS_NAME_OPERATION_CENTER, (new UserCenter()), (new Level()), $order
  63. );
  64. if (!empty($buy_uid)) $upgrade_uids[] = $buy_uid;
  65. // 触发条件升级
  66. $cond_upgrade = new ConditionUpgrade();
  67. $cond_uids = $cond_upgrade->execute(
  68. AddonsEnum::ADDONS_NAME_OPERATION_CENTER, (new UserCenter()), (new Level()), $order
  69. ); */
  70. $this->initLevel($order, $is_finish);
  71. // 购买商品升级
  72. $this->setUpgradeLevel(
  73. $this->checkBuyGoodsUpgrade(),
  74. UpgradeLog::GOODS
  75. );
  76. // 满足条件升级
  77. $this->setUpgradeLevel(
  78. $this->checkConditionUpgrade(),
  79. UpgradeLog::CONDITION
  80. );
  81. $this->upgradeLevel();
  82. }
  83. /**
  84. * 购买商品
  85. *
  86. * @return Level|false
  87. */
  88. public function checkBuyGoodsUpgrade()
  89. {
  90. $center = $this->order->center;
  91. if (empty($center)) return false;
  92. // 等级
  93. $levels = $this->getLevels($center);
  94. // 订单详情
  95. $details = $this->order->detail;
  96. foreach ($details as $detail) {
  97. foreach ($levels as $item) {
  98. /**
  99. * @var Level
  100. */
  101. $item = $item;
  102. if (
  103. // 开启自动升级
  104. $item->hasUpgrade() &&
  105. // 开启购物升级
  106. $item->openGoodsUpgrade() &&
  107. // 是否订单完成 或者支付完成
  108. $item->buyGoodsType($this->isFinish) &&
  109. // 是否指定商品
  110. $item->isUpgradeGoods($detail->goods_id)
  111. ) {
  112. return $item;
  113. }
  114. }
  115. }
  116. return false;
  117. }
  118. /**
  119. * 条件
  120. *
  121. * @return Level|false
  122. */
  123. public function checkConditionUpgrade()
  124. {
  125. return false;
  126. }
  127. /**
  128. * @param UserCenter $center
  129. * @return array
  130. */
  131. protected function getLevels(UserCenter $center)
  132. {
  133. if (!empty($this->levelList)) return $this->levelList;
  134. return Level::getLevelByGtLevel($this->mall_id, $center->level);
  135. }
  136. /**
  137. * 设置Level
  138. *
  139. * @param Level|false $level
  140. * @return void
  141. */
  142. protected function setUpgradeLevel($level, int $type)
  143. {
  144. $this->upgradeLevel[$type] = $level;
  145. }
  146. /**
  147. * 获取升级
  148. *
  149. * @return array
  150. */
  151. protected function getUpgradeLevel()
  152. {
  153. $level = null;
  154. $type = null;
  155. foreach ($this->upgradeLevel as $level1) {
  156. foreach ($this->upgradeLevel as $type => $level2) {
  157. if ($level2 && ($level1 == false)) {
  158. $level = $level2;
  159. $type = $type;
  160. }
  161. if ($level2 && $level1 && $level2->level > $level1->level) {
  162. $level = $level2;
  163. $type = $type;
  164. }
  165. }
  166. }
  167. return [$level, $type];
  168. }
  169. /**
  170. * 升级
  171. *
  172. * @return void
  173. */
  174. protected function upgradeLevel()
  175. {
  176. list($level, $type) = $this->getUpgradeLevel();
  177. if ($level) {
  178. /**
  179. * @var UserCenter
  180. */
  181. $center = $this->order->center;
  182. $t = Yii::$app->db->beginTransaction();
  183. try {
  184. $center->setLevel($level);
  185. UpgradeLog::addUpgradeLog(
  186. $this->mall_id, $center->user_id, $level->id, $type
  187. );
  188. } catch (Exception $e) {
  189. $t->rollBack();
  190. Yii::error('升级失败, 订单ID: %s', $this->order->id);
  191. }
  192. $t->commit();
  193. }
  194. }
  195. }