BuyGoodsUpgrade.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <?php
  2. namespace addons\Boss\common\logic;
  3. use common\enums\AddonsEnum;
  4. use common\enums\OrderStatusEnum;
  5. use common\enums\StatusEnum;
  6. use common\enums\UpgradeEnum;
  7. use common\enums\LevelUpgradeLogEnum;
  8. use common\helpers\FormatHelper;
  9. use common\models\order\OrderDetail;
  10. use common\traits\ErrorTrait;
  11. use Yii;
  12. use Exception;
  13. use yii\helpers\Json;
  14. /**
  15. * 购物升级
  16. * @Author lun
  17. * @DateTime 2021-11-16 19:07:32
  18. * @copyright: Copyright (c) 2020 广东七件事集团
  19. */
  20. class BuyGoodsUpgrade{
  21. use ErrorTrait;
  22. /**
  23. * 购物升级执行
  24. * 样式:execute(AddonsEnum::ADDONS_NAME_BOSS, (new AddonsBoss()), (new AddonsBossLevel()), $order);
  25. * @Author: lun
  26. * @DateTime: 2021/11/18 0018 16:56
  27. * @Copyright: copyright (c) 2021 广东七件事集团
  28. * @param $identity_desc - 插件名称
  29. * @param $identity_obj - 用户身份空对象
  30. * @param $level_obj - 用户等级空对象
  31. * @param $order
  32. * @param string $order_by
  33. * @return bool | int
  34. */
  35. public function execute(string $identity_desc, object $identity_obj, object $level_obj, array $order, $order_by = 'level desc', $upgrade_log_obj = null)
  36. {
  37. $trans = Yii::$app->db->beginTransaction();
  38. try {
  39. $mall_id = $order['mall_id'];
  40. $user_id = $order['user_id'];
  41. $upgrade_uid = 0;
  42. // 获取身份
  43. $model = $identity_obj::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  44. if (empty($model)) {
  45. $model = new $identity_obj;
  46. $model->mall_id = $mall_id;
  47. $model->user_id = $user_id;
  48. $model->level = 0;
  49. $model->upgrade_level_at = 0;
  50. $model->loadDefaultValues();
  51. }
  52. $where = [];
  53. $where[] = ['mall_id' => $mall_id];
  54. $where[] = ['status' => StatusEnum::ENABLED];
  55. $where[] = ['>=', 'level' , $model->level];
  56. $params = [];
  57. $params['where'] = $where;
  58. $params['order'] = $order_by;
  59. // 获取等级
  60. $level_list = $level_obj::lists($params);
  61. $where = [];
  62. $where[] = ['mall_id' => $mall_id];
  63. $where[] = ['order_id' => $order['id']];
  64. $where[] = ['user_id' => $user_id];
  65. $params =[];
  66. $params['where'] = $where;
  67. $order_detail_list = OrderDetail::lists($params);
  68. $buy_goods_id_arr = array_column($order_detail_list, 'goods_id');
  69. $can_upgrade_level = 0;
  70. $upgrade_status = 0;
  71. $flag = false;
  72. //开启购买升级商品
  73. if (!empty($level_list)) {
  74. foreach ($level_list as $level_arr) {
  75. $can_upgrade_level = $level_arr['level'];
  76. //开启购买升级商品
  77. if ($level_arr['upgrade_type_goods']&&$level_arr['is_auto_upgrade']) {
  78. $upgrade_status = UpgradeEnum::UPGRADE_STATUS_GOODS;
  79. $goods_id_arr = Json::decode($level_arr['goods_ids'], true);
  80. $res = UpgradeCondition::buyGoods($level_arr['goods_type'], $buy_goods_id_arr, $goods_id_arr);
  81. if ($res) {
  82. //购买升级商品触发升级:0订单完成 1支付完成
  83. if ($level_arr['buy_goods_type'] == 0 && $order['order_status'] == OrderStatusEnum::ACCOMPLISH) {
  84. $flag = true;
  85. break;
  86. }
  87. if ($level_arr['buy_goods_type'] == 1 && $order['order_status'] == OrderStatusEnum::PAY) {
  88. $flag = true;
  89. break;
  90. }
  91. }
  92. }
  93. }
  94. if ($flag) {
  95. // 记录升级日志
  96. if ($upgrade_log_obj !== null) {
  97. $upgrade_log_obj->mall_id = $mall_id;
  98. $upgrade_log_obj->user_id = $user_id;
  99. $upgrade_log_obj->before_level = $model->level;
  100. $upgrade_log_obj->after_level = $can_upgrade_level;
  101. $upgrade_log_obj->upgrade_type = LevelUpgradeLogEnum::GOODS_UPGRADE;
  102. $upgrade_log_obj->order_id = $order['id'];
  103. $upgrade_log_obj->upgrade_condition = $goods_id_arr ?? [];
  104. $upgrade_log_obj->save();
  105. }
  106. //因支持level==0,股东身份不存在时,upgrade_level_at==0
  107. if($model->level==0){
  108. if($model->upgrade_level_at==0||$can_upgrade_level>$model->level){
  109. $model->level = $can_upgrade_level;
  110. $model->upgrade_status = $upgrade_status;
  111. $model->upgrade_level_at = time();
  112. if (!$model->save()) throw new Exception("{用户ID:$user_id},订单ID:{$order['id']},". AddonsEnum::getAddonsNameMap($identity_desc) ."购物升级失败");
  113. $upgrade_uid = $user_id;
  114. }
  115. }else{
  116. if($model->level!=$can_upgrade_level){
  117. $model->level = $can_upgrade_level;
  118. $model->upgrade_status = $upgrade_status;
  119. $model->upgrade_level_at = time();
  120. if (!$model->save()) throw new Exception("{用户ID:$user_id},订单ID:{$order['id']},". AddonsEnum::getAddonsNameMap($identity_desc) ."购物升级失败");
  121. $upgrade_uid = $user_id;
  122. }
  123. }
  124. }
  125. }
  126. $trans->commit();
  127. return $upgrade_uid;
  128. } catch (Exception $e) {
  129. $trans->rollBack();
  130. $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "购物升级失败");
  131. $this->setError($exception);
  132. return false;
  133. }
  134. }
  135. /**
  136. * 购物升级执行 无等级
  137. * 样式:execute(AddonsEnum::ADDONS_NAME_BOSS, (new AddonsBoss()), (new AddonsBossLevel()), $order);
  138. * @Author: lun
  139. * @DateTime: 2021/11/18 0018 16:56
  140. * @Copyright: copyright (c) 2021 广东七件事集团
  141. * @param $identity_desc - 插件名称
  142. * @param $identity_obj - 用户身份空对象
  143. * @param $level_obj - 用户等级空对象
  144. * @param $order
  145. * @param string $order_by
  146. * @return bool | int
  147. */
  148. public function executeNoLevel(string $identity_desc, object $identity_obj, array $order, $config)
  149. {
  150. $trans = Yii::$app->db->beginTransaction();
  151. try {
  152. $mall_id = $order['mall_id'];
  153. $user_id = $order['user_id'];
  154. $upgrade_uid = 0;
  155. // 获取身份
  156. $model = $identity_obj::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  157. if (empty($model)) {
  158. $model = new $identity_obj;
  159. $model->mall_id = $mall_id;
  160. $model->user_id = $user_id;
  161. $model->loadDefaultValues();
  162. // 获取等级
  163. $where = [];
  164. $where[] = ['mall_id' => $mall_id];
  165. $where[] = ['order_id' => $order['id']];
  166. $where[] = ['user_id' => $user_id];
  167. $params = [];
  168. $params['where'] = $where;
  169. $order_detail_list = OrderDetail::lists($params);
  170. $buy_goods_id_arr = array_column($order_detail_list, 'goods_id');
  171. $flag = false;
  172. //开启购买升级商品
  173. if ($config['upgrade_type_goods'] && $config['is_auto_upgrade']) {
  174. $goods_id_arr = Json::decode($config['goods_ids'], true);
  175. $res = UpgradeCondition::buyGoods($config['goods_type'], $buy_goods_id_arr, $goods_id_arr);
  176. if ($res) {
  177. //购买升级商品触发升级:0订单完成 1支付完成
  178. if ($config['buy_goods_type'] == 0 && $order['order_status'] == OrderStatusEnum::ACCOMPLISH) {
  179. $flag = true;
  180. }
  181. if ($config['buy_goods_type'] == 1 && $order['pay_status'] == OrderStatusEnum::PAY) {
  182. $flag = true;
  183. }
  184. }
  185. }
  186. if ($flag) {
  187. if (!$model->save()) throw new Exception("{用户ID:$user_id},订单ID:{$order['id']}," . AddonsEnum::getAddonsNameMap($identity_desc) . "购物升级失败");
  188. $upgrade_uid = $user_id;
  189. }
  190. }
  191. $trans->commit();
  192. return $upgrade_uid;
  193. } catch (Exception $e) {
  194. $trans->rollBack();
  195. $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "购物升级失败");
  196. $this->setError($exception);
  197. return false;
  198. }
  199. }
  200. }