BusinessBonusUpgradeCondition.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <?php
  2. namespace addons\BusinessBonus\common\models;
  3. use addons\BusinessBonus\common\enums\BusinessBonusEnums;
  4. use addons\BusinessBonus\common\events\user\UpgradeUserEvent;
  5. use common\enums\StatusEnum;
  6. use common\models\goods\Goods;
  7. use Yii;
  8. use yii\db\Exception;
  9. /**
  10. * This is the model class for table "{{%addons_business_bonus_upgrade_condition}}".
  11. *
  12. * @property int $id
  13. * @property int|null $mall_id 商城ID
  14. * @property int|null $business_bonus_level 招商员等级ID
  15. * @property int|null $upgrade_type 升级方式:0未知,1无条件,2前端申请,3购买知道商品,4后台添加,5后台调整
  16. * @property string|null $goods_id 指定的商品ID,多个用英文逗号隔开
  17. * @property int|null $goods_buy_number 购买商品数量:0全部商品,1任一商品,2其二商品, 以此类推
  18. * @property int|null $is_audit 前端申请时,是否需要审核,0否,1是
  19. * @property int|null $status 状态:-1删除,0禁用,1启用
  20. * @property int|null $created_at 创建时间
  21. * @property int|null $updated_at 更新时间
  22. */
  23. class BusinessBonusUpgradeCondition extends \common\models\base\BaseActiveRecord
  24. {
  25. /**
  26. * {@inheritdoc}
  27. */
  28. public static function tableName()
  29. {
  30. return '{{%addons_business_bonus_upgrade_condition}}';
  31. }
  32. /**
  33. * {@inheritdoc}
  34. */
  35. public function rules()
  36. {
  37. return [
  38. [['mall_id', 'business_bonus_level', 'upgrade_type', 'goods_buy_number', 'is_audit', 'status', 'created_at', 'updated_at','is_condition_upgrade','is_buy_goods_upgrade','buy_goods_upgrade_type', 'buy_goods_upgrade_method'], 'integer'],
  39. [['goods_id', 'upgrade_store_goods_list'], 'string'],
  40. [['checked_condition_values', 'checked_condition_keys'], 'safe'],
  41. ];
  42. }
  43. /**
  44. * {@inheritdoc}
  45. */
  46. public function attributeLabels()
  47. {
  48. return [
  49. 'id' => 'ID',
  50. 'mall_id' => '商城ID',
  51. 'business_bonus_level' => '招商员等级',
  52. 'upgrade_type' => '升级方式:0未知,1无条件,2前端申请,3购买指定商品,4后台添加,5后台调整, 6购买门店商品',
  53. 'goods_id' => '指定的商品ID,多个用英文逗号隔开',
  54. 'goods_buy_number' => '购买商品数量:0全部商品,1任一商品,2其二商品, 以此类推',
  55. 'upgrade_store_goods_list' => '门店商品升级条件',
  56. 'is_audit' => '前端申请时,是否需要审核,0否,1是',
  57. 'status' => '状态:-1删除,0禁用,1启用',
  58. 'created_at' => '创建时间',
  59. 'updated_at' => '更新时间',
  60. ];
  61. }
  62. /**
  63. * 获取指定等级的条件
  64. */
  65. public static function getLevelCondition($mall_id, $business_bonus_level)
  66. {
  67. $cond = self::getOne([
  68. ['=', 'mall_id', $mall_id],
  69. ['=', 'business_bonus_level', $business_bonus_level],
  70. ['=', 'status', StatusEnum::ENABLED],
  71. ], true);
  72. if ($cond) {
  73. $goods_id = $cond['goods_id'] ? explode(',', $cond['goods_id']) : [];
  74. if ($goods_id) {
  75. $cond['goods_list'] = Goods::find()
  76. ->select('id as goods_id,goods_name,cover_pic')
  77. ->andWhere(['>=', 'status', StatusEnum::DISABLED])
  78. ->andWhere(['=', 'mall_id', $mall_id])
  79. ->andWhere(['in', 'id', $goods_id])
  80. ->asArray()
  81. ->all();
  82. } else {
  83. $cond['goods_list'] = [];
  84. }
  85. }
  86. return $cond;
  87. }
  88. /**
  89. * 数据设置
  90. */
  91. public static function setData(array $params)
  92. {
  93. try{
  94. if (!isset($params['mall_id']) || empty($params['mall_id'])) throw new Exception('缺少商城ID');
  95. if (isset($params['business_bonus_level']) && !empty($params['business_bonus_level'])) {
  96. $model = self::findOne(['mall_id' => $params['mall_id'], 'business_bonus_level' => $params['business_bonus_level'], 'status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]]);
  97. }
  98. if (!isset($model) || empty($model)) {
  99. $model = new self();
  100. $model->loadDefaultValues();
  101. $model->mall_id = $params['mall_id'];
  102. }
  103. if (!$model->load($params,'') || !$model->save()) throw new Exception($model->getErrorMessage());
  104. return $model;
  105. }catch(Exception $e){
  106. self::setStaticError($e->getMessage());
  107. return false;
  108. }
  109. }
  110. /**
  111. * 购买指定商品检测升级
  112. * $order_detail 必须包含参数 'order_id,goods_id,goods_name,pic_url,price,num'
  113. */
  114. public static function checkingUpgradeByOrder($order_detail, $mall_id, $user_id)
  115. {
  116. $prefix = Yii::$app->getDb()->tablePrefix;
  117. $enable = StatusEnum::ENABLED;
  118. $upgrade_type = BusinessBonusEnums::UPGRADE_TYPE_SHOPPING;
  119. $level = 0;
  120. $upgrade_item = [];
  121. $goods_item = [];
  122. foreach ($order_detail as $goods) {
  123. // $sql = "select * from {$prefix}addons_business_bonus_upgrade_condition
  124. // where mall_id = {$mall_id} and status = {$enable} and upgrade_type = {$upgrade_type} and FIND_IN_SET({$goods['goods_id']}, goods_id)";
  125. $sql = "SELECT * FROM {$prefix}addons_business_bonus_upgrade_condition
  126. WHERE mall_id = {$mall_id}
  127. AND status = {$enable}
  128. AND is_buy_goods_upgrade = 1
  129. AND buy_goods_upgrade_type = 1
  130. AND ((FIND_IN_SET({$goods['goods_id']}, goods_id)
  131. AND buy_goods_upgrade_method = 2) OR buy_goods_upgrade_method = 1)";
  132. $condition = Yii::$app->getDb()->createCommand($sql)->queryAll();
  133. if ($condition) {
  134. foreach ($condition as $cond) {
  135. if ($cond['business_bonus_level'] > $level) {
  136. $level = $cond['business_bonus_level'];
  137. $upgrade_item = $cond;
  138. $goods_item = $goods;
  139. }
  140. }
  141. }
  142. }
  143. if (!$goods_item || $level == 0 || !$upgrade_item) {
  144. return true;
  145. }
  146. // 当前用户的等级是否大于预升等级
  147. $business_user = BusinessBonusUser::getOne([
  148. ['=', 'mall_id', $mall_id],
  149. ['=', 'user_id', $user_id],
  150. ['>=', 'status', StatusEnum::DISABLED],
  151. ], true);
  152. if ($business_user && $business_user['business_bonus_level'] >= $upgrade_item['business_bonus_level']) {
  153. return true;
  154. }
  155. $user_data = [
  156. 'user_id' => $user_id,
  157. 'business_bonus_level' => $upgrade_item['business_bonus_level'],
  158. 'mall_id' => $mall_id
  159. ];
  160. if ($business_user) {
  161. $user_data['id'] = $business_user['id'];
  162. } else {
  163. $user_data['status'] = StatusEnum::ENABLED;
  164. $user_data['register_time'] = time();
  165. }
  166. // 对应等级信息
  167. $level_info = BusinessBonusLevel::getOne([
  168. ['=', 'mall_id', $mall_id],
  169. ['=', 'level', $user_data['business_bonus_level']],
  170. ['>=', 'status', StatusEnum::DISABLED],
  171. ], true);
  172. $goods_item['mark'] = '购买指定商品';
  173. $record = [
  174. 'mall_id' => $mall_id,
  175. 'user_id' => $user_id,
  176. 'business_bonus_level' => $user_data['business_bonus_level'],
  177. 'bonus_rate' => $level_info['bonus_rate'] ?? 0,
  178. 'upgrade_time' => time(),
  179. 'status' => StatusEnum::ENABLED,
  180. 'upgrade_type' => BusinessBonusEnums::UPGRADE_TYPE_SHOPPING,
  181. 'extra_data' => json_encode($goods_item, JSON_UNESCAPED_UNICODE)
  182. ];
  183. $trans = Yii::$app->db->beginTransaction();
  184. try {
  185. $res = BusinessBonusUpgradeRecord::setData($record);
  186. if ($res == false) throw new Exception(BusinessBonusUpgradeRecord::getStaticError());
  187. $res = BusinessBonusUser::setData($user_data);
  188. if ($res == false) throw new Exception(BusinessBonusUser::getStaticError());
  189. $trans->commit();
  190. } catch (Exception $e) {
  191. $trans->rollBack();
  192. self::setStaticError($e->getMessage());
  193. return false;
  194. }
  195. //触发用户条件升级
  196. $event = new UpgradeUserEvent($mall_id);
  197. $data = ['mall_id' => $mall_id, 'user_id' => $user_id];
  198. \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  199. return true;
  200. }
  201. /**
  202. * 购买指定门店商品检测升级
  203. * $order_detail 必须包含参数 'order_id,goods_id,goods_name,pic_url,price,num'
  204. */
  205. public static function checkingUpgradeByStoreOrder($order_detail, $mall_id, $user_id)
  206. {
  207. $prefix = Yii::$app->getDb()->tablePrefix;
  208. $enable = StatusEnum::ENABLED;
  209. $upgrade_type = BusinessBonusEnums::UPGRADE_TYPE_STORE_SHOPPING;
  210. $level = 0;
  211. $upgrade_item = [];
  212. $goods_item = [];
  213. foreach ($order_detail as $goods) {
  214. // $sql = "select * from {$prefix}addons_business_bonus_upgrade_condition
  215. // where mall_id = {$mall_id} and status = {$enable} and upgrade_type = {$upgrade_type} order by business_bonus_level desc";
  216. $sql = "select * from {$prefix}addons_business_bonus_upgrade_condition
  217. where mall_id = {$mall_id} and status = {$enable} and is_buy_goods_upgrade = 1 and buy_goods_upgrade_type = 2 order by business_bonus_level desc";
  218. $condition = Yii::$app->getDb()->createCommand($sql)->queryAll();
  219. if ($condition) {
  220. foreach ($condition as $cond) {
  221. $upgrade_store_goods_list = json_decode($cond['upgrade_store_goods_list'], true);
  222. // if ($upgrade_store_goods_list['store_goods_type'] == 1) {
  223. if ($cond['buy_goods_upgrade_method'] == 1) {
  224. $level = $cond['business_bonus_level'];
  225. $upgrade_item = $cond;
  226. $goods_item = $goods;
  227. break;
  228. // } elseif ($upgrade_store_goods_list['store_goods_type'] == 2) {
  229. } elseif ($cond['buy_goods_upgrade_method'] == 2) {
  230. if (in_array($goods['goods_id'], $upgrade_store_goods_list['store_goods_ids'])) {
  231. $level = $cond['business_bonus_level'];
  232. $upgrade_item = $cond;
  233. $goods_item = $goods;
  234. break;
  235. }
  236. }
  237. }
  238. }
  239. }
  240. if (!$goods_item || $level == 0 || !$upgrade_item) {
  241. return true;
  242. }
  243. // 当前用户的等级是否大于预升等级
  244. $business_user = BusinessBonusUser::getOne([
  245. ['=', 'mall_id', $mall_id],
  246. ['=', 'user_id', $user_id],
  247. ['>=', 'status', StatusEnum::DISABLED],
  248. ], true);
  249. if ($business_user && $business_user['business_bonus_level'] >= $upgrade_item['business_bonus_level']) {
  250. return true;
  251. }
  252. $user_data = [
  253. 'user_id' => $user_id,
  254. 'business_bonus_level' => $upgrade_item['business_bonus_level'],
  255. 'mall_id' => $mall_id
  256. ];
  257. if ($business_user) {
  258. $user_data['id'] = $business_user['id'];
  259. } else {
  260. $user_data['status'] = StatusEnum::ENABLED;
  261. $user_data['register_time'] = time();
  262. }
  263. // 对应等级信息
  264. $level_info = BusinessBonusLevel::getOne([
  265. ['=', 'mall_id', $mall_id],
  266. ['=', 'level', $user_data['business_bonus_level']],
  267. ['>=', 'status', StatusEnum::DISABLED],
  268. ], true);
  269. $goods_item['mark'] = '购买指定门店商品';
  270. $record = [
  271. 'mall_id' => $mall_id,
  272. 'user_id' => $user_id,
  273. 'business_bonus_level' => $user_data['business_bonus_level'],
  274. 'bonus_rate' => $level_info['bonus_rate'] ?? 0,
  275. 'upgrade_time' => time(),
  276. 'status' => StatusEnum::ENABLED,
  277. 'upgrade_type' => BusinessBonusEnums::UPGRADE_TYPE_STORE_SHOPPING,
  278. 'extra_data' => json_encode($goods_item, JSON_UNESCAPED_UNICODE)
  279. ];
  280. $trans = Yii::$app->db->beginTransaction();
  281. try {
  282. $res = BusinessBonusUpgradeRecord::setData($record);
  283. if ($res == false) throw new Exception(BusinessBonusUpgradeRecord::getStaticError());
  284. $res = BusinessBonusUser::setData($user_data);
  285. if ($res == false) throw new Exception(BusinessBonusUser::getStaticError());
  286. $trans->commit();
  287. } catch (Exception $e) {
  288. $trans->rollBack();
  289. self::setStaticError($e->getMessage());
  290. return false;
  291. }
  292. //触发用户条件升级
  293. $event = new UpgradeUserEvent($mall_id);
  294. $data = ['mall_id' => $mall_id, 'user_id' => $user_id];
  295. \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  296. return true;
  297. }
  298. }