TeamUserLevelForm.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. <?php
  2. namespace app\modules\client\models\v1\team_grades;
  3. use app\models\Goods;
  4. use app\models\OldUserTreePath;
  5. use app\models\Order;
  6. use app\models\OrderDetail;
  7. use app\models\ReOrder;
  8. use app\models\TeamGrades;
  9. use app\models\TeamGradesAudit;
  10. use app\models\TeamGradesLevel;
  11. use yii\base\Model;
  12. class TeamUserLevelForm extends Model
  13. {
  14. public $store_id;
  15. public $user_id;
  16. public $name;
  17. public $mobile;
  18. public $province_id;
  19. public $city_id;
  20. public $district_id;
  21. public $address;
  22. public function rules() {
  23. return [
  24. [['store_id', 'user_id', 'province_id', 'city_id', 'district_id'], 'integer'],
  25. [['name', 'mobile', 'address'], 'string'],
  26. [['name', 'mobile', 'province_id', 'city_id', 'district_id', 'address'], 'required'],
  27. [['mobile'], 'string', 'max' => 11],
  28. [['mobile'], 'match', 'pattern' => '/^1[3456789]\d{9}$/'],
  29. [['address'], 'string', 'max' => 255]
  30. ];
  31. }
  32. public function attributeLabels()
  33. {
  34. return [
  35. 'name' => '姓名',
  36. 'mobile' => '手机号',
  37. 'province_id' => '省份',
  38. 'city_id' => '城市',
  39. 'district_id' => '地区',
  40. 'address' => '详细地址'
  41. ];
  42. }
  43. /**
  44. * 获取升级条件
  45. */
  46. public function getUpgradeCondition() {
  47. try {
  48. $user_id = $this->user_id;
  49. $store_id = $this->store_id;
  50. //获取当前设置的团队分红等级
  51. $user_team_grades = TeamGrades::getUserTeamGrades($user_id);
  52. $curr_experience = 0;
  53. //获取下一等级信息
  54. $next_level_info_arr = TeamGradesLevel::find()->where([
  55. 'store_id' => $store_id,
  56. 'status' => TeamGradesLevel::STATUS_TRUE,
  57. 'is_delete' => 0
  58. ])->select('id, level, level_name, level_conditions, desc, is_open_apply')->orderBy('level ASC')->asArray()->all();
  59. $level_info_arr = [
  60. ];
  61. $next_level_info = [
  62. 'id' => '',
  63. 'level' => 0,
  64. 'level_name' => '',
  65. 'level_conditions' => null,
  66. 'desc' => '',
  67. 'is_open_apply' => 0,
  68. 'is_finished' => false
  69. ];
  70. foreach ($next_level_info_arr as $next_level_info_index => $next_level_info_item) {
  71. $level_info_arr[$next_level_info_index] = [
  72. 'level' => $next_level_info_item['level'],
  73. 'level_name' => $next_level_info_item['level_name'],
  74. 'experience' => 0,
  75. 'is_current' => false
  76. ];
  77. //获取下一等级信息
  78. if (empty($next_level_info['id'])) {
  79. if ($next_level_info_item['level'] > $user_team_grades['team_grades_level']) {
  80. $next_level_info = $next_level_info_item;
  81. }
  82. }
  83. //获取任务点数
  84. $level_info_conditions = json_decode($next_level_info_item['level_conditions'], true);
  85. foreach ($level_info_conditions as $level_info_conditions_item) {
  86. if (intval($level_info_conditions_item['is_open'])) {
  87. $level_info_arr[$next_level_info_index]['experience']++;
  88. }
  89. }
  90. if ($next_level_info_item['level'] <= $user_team_grades['team_grades_level']) {
  91. $curr_experience += $level_info_arr[$next_level_info_index]['experience'];
  92. }
  93. if (intval($next_level_info_item['level']) <= intval($user_team_grades['team_grades_level'])) {
  94. $level_info_arr[$next_level_info_index]['is_current'] = true;
  95. }
  96. }
  97. if (!empty($next_level_info['id'])) {
  98. $next_level_info['is_open_apply'] = intval($next_level_info['is_open_apply']);
  99. $next_level_info['is_finished'] = true;
  100. $level_conditions = json_decode($next_level_info['level_conditions'], true);
  101. foreach ($level_conditions as $level_conditions_index => &$level_conditions_item) {
  102. $level_conditions_item['is_open'] = intval($level_conditions_item['is_open']);
  103. if (intval($level_conditions_item['is_open'])) {
  104. //获取团队人数
  105. $man_data = OldUserTreePath::find()->where([
  106. 'parent_id' => $user_id
  107. ])->andWhere([
  108. '!=',
  109. 'child_id',
  110. $user_id
  111. ])->asArray()->all();
  112. $child_id = array_column($man_data, 'child_id');
  113. //判断团队人数以及消费金额
  114. if ($level_conditions_index === 'man') {
  115. foreach ($level_conditions_item['value'] as $man_index => &$man_item) {
  116. // 团队人数是否达到条件
  117. $man_item['money_finished'] = false;
  118. if (count($child_id) >= $man_item['count']) {
  119. // ++$curr_experience;
  120. // 团队人数消费金额是否达到条件
  121. $pay_price = Order::find()->where(
  122. [
  123. 'is_delete' => 0,
  124. 'trade_status' => Order::ORDER_FLOW_CONFIRM,
  125. 'user_id' => $child_id
  126. ])
  127. ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price');
  128. $man_item['money_finished'] = false;
  129. if ($pay_price >= $man_item['money']) {
  130. $man_item['money_finished'] = true;
  131. ++$curr_experience;
  132. } else {
  133. $next_level_info['is_finished'] = false;
  134. }
  135. }
  136. }
  137. }
  138. //判断团队消费金额
  139. if ($level_conditions_index === 'order') {
  140. if (is_array($level_conditions_item['value'])) {
  141. foreach ($level_conditions_item['value'] as $order_index => &$order_item) {
  142. $order_money = Order::find()->where(
  143. [
  144. 'store_id' => $store_id,
  145. 'is_delete' => 0,
  146. 'trade_status' => Order::ORDER_FLOW_CONFIRM
  147. ])
  148. ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])
  149. ->andWhere(['in', 'user_id', $child_id])->sum('pay_price');
  150. $order_item['count_finished'] = false;
  151. if ($order_money >= $order_item['count']) {
  152. $order_item['count_finished'] = true;
  153. ++$curr_experience;
  154. } else {
  155. $next_level_info['is_finished'] = false;
  156. }
  157. }
  158. } else {
  159. $order_money = Order::find()->where(
  160. [
  161. 'store_id' => $store_id,
  162. 'is_delete' => 0,
  163. 'trade_status' => Order::ORDER_FLOW_CONFIRM
  164. ])
  165. ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])
  166. ->andWhere(['in', 'user_id', $child_id])->sum('pay_price');
  167. $level_conditions_item['value_finished'] = false;
  168. if ($order_money >= $level_conditions_item['value']) {
  169. $level_conditions_item['value_finished'] = true;
  170. ++$curr_experience;
  171. } else {
  172. $next_level_info['is_finished'] = false;
  173. }
  174. }
  175. }
  176. //判断充值金额
  177. if ($level_conditions_index === 'recharge') {
  178. $recharge_money = ReOrder::find()->where(['user_id' => $user_id, 'is_pay' => 1])->sum('pay_price');
  179. $level_conditions_item['value_finished'] = false;
  180. if ($recharge_money >= $level_conditions_item['value']) {
  181. $level_conditions_item['value_finished'] = true;
  182. ++$curr_experience;
  183. } else {
  184. $next_level_info['is_finished'] = false;
  185. }
  186. }
  187. //判断自身消费金额
  188. if ($level_conditions_index === 'self') {
  189. $level_conditions_item['value_finished'] = false;
  190. $level_conditions_item['value']['order_number'] = intval($level_conditions_item['value']['order_number']);
  191. if (intval($level_conditions_item['value']['order_number'])) {
  192. // 订单单笔金额
  193. $order = Order::find()->where(
  194. [
  195. 'is_delete' => 0,
  196. 'trade_status' => Order::ORDER_FLOW_CONFIRM,
  197. 'user_id' => $user_id
  198. ])
  199. ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])
  200. ->andWhere(['>=' , 'pay_price', $level_conditions_item['value']['price']])->one();
  201. if (!empty($order)) {
  202. $level_conditions_item['value_finished'] = true;
  203. ++$curr_experience;
  204. } else {
  205. $next_level_info['is_finished'] = false;
  206. }
  207. } else {
  208. // 订单累计金额
  209. $order_money = Order::find()->where(
  210. [
  211. 'is_delete' => 0,
  212. 'trade_status' => Order::ORDER_FLOW_CONFIRM,
  213. 'user_id' => $user_id
  214. ])->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price');
  215. if ($order_money >= $level_conditions_item['value']['price']) {
  216. $level_conditions_item['value_finished'] = true;
  217. ++$curr_experience;
  218. } else {
  219. $next_level_info['is_finished'] = false;
  220. }
  221. }
  222. }
  223. //判断是否购买指定商品
  224. if ($level_conditions_index === 'goods') {
  225. $level_conditions_item['value_finished'] = empty($level_conditions_item['value']);
  226. if (!$level_conditions_item['value_finished']) {
  227. // 查找该用户是否买过此商品
  228. $goods_model = Order::find()->alias('o')
  229. ->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id')
  230. ->where(
  231. [
  232. 'o.user_id' => $user_id,
  233. 'o.is_delete' => 0,
  234. 'o.trade_status' => Order::ORDER_FLOW_CONFIRM
  235. ])
  236. ->andWhere(['or', ['o.is_pay' => 1], ['o.pay_type' => 2]])
  237. ->andWhere(['od.goods_id' => $level_conditions_item['value']['id']])->one();
  238. if (!empty($goods_model)) {
  239. $level_conditions_item['value_finished'] = true;
  240. ++$curr_experience;
  241. } else {
  242. $next_level_info['is_finished'] = false;
  243. }
  244. }
  245. }
  246. }
  247. }
  248. $next_level_info['level_conditions'] = $level_conditions;
  249. }
  250. //调用自动升级判断一下
  251. TeamGradesLevel::auto_upgrade($user_id, $store_id);
  252. return [
  253. 'code' => 0,
  254. 'message' => '获取成功',
  255. 'data' => [
  256. 'experience' => $curr_experience,
  257. 'next_level_info' => $next_level_info,
  258. 'level_list' => $level_info_arr,
  259. 'user_team_grades' => $user_team_grades
  260. ]
  261. ];
  262. } catch (\Exception $e) {
  263. return [
  264. 'code' => 1,
  265. 'message' => $e->getMessage()
  266. ];
  267. }
  268. }
  269. /**
  270. * 提交升级申请
  271. */
  272. public function applySubmit()
  273. {
  274. try {
  275. if (!$this->validate()) {
  276. throw new \Exception($this->getErrorSummary(false)[0]);
  277. }
  278. $user_id = $this->user_id;
  279. $store_id = $this->store_id;
  280. // $team_grades_level = $this->team_grades_level;
  281. $name = $this->name;
  282. $mobile = $this->mobile;
  283. $province_id = $this->province_id;
  284. $city_id = $this->city_id;
  285. $district_id = $this->district_id;
  286. $address = $this->address;
  287. $user_team_grades = TeamGrades::getUserTeamGrades($user_id);
  288. //获取下一等级信息
  289. $next_level_info = TeamGradesLevel::find()->where([
  290. 'store_id' => $store_id,
  291. 'status' => TeamGradesLevel::STATUS_TRUE,
  292. 'is_delete' => 0
  293. ])->andWhere(['>', 'level', $user_team_grades['team_grades_level']])->select('id, level, level_name, level_conditions, is_open_apply')
  294. ->orderBy('level ASC')->asArray()->one();
  295. if (empty($next_level_info)) {
  296. throw new \Exception('当前等级未查询到');
  297. }
  298. if (!intval($next_level_info['is_open_apply'])) {
  299. throw new \Exception('当前等级未开启申请');
  300. }
  301. $teamGradesAudit = TeamGradesAudit::findOne([
  302. 'user_id' => $user_id,
  303. 'status' => TeamGradesAudit::STATUS_APPLY,
  304. 'is_delete' => 0,
  305. 'team_grades_level' => $next_level_info['level']
  306. ]);
  307. if ($teamGradesAudit) {
  308. throw new \Exception('您已提交过申请,请等待审核');
  309. }
  310. //判断是否达到条件
  311. if (!TeamGradesLevel::getIsApply($next_level_info, $user_id, $store_id)) {
  312. throw new \Exception('条件未达到,不可申请成为' . $next_level_info['level_name']);
  313. }
  314. $model = new TeamGradesAudit();
  315. $model->store_id = $store_id;
  316. $model->user_id = $user_id;
  317. $model->team_grades_level = $next_level_info['level'];
  318. $model->name = $name;
  319. $model->mobile = $mobile;
  320. $model->address = $address;
  321. $model->province_id = $province_id;
  322. $model->city_id = $city_id;
  323. $model->district_id = $district_id;
  324. $model->status = TeamGradesAudit::STATUS_APPLY;
  325. if (!$model->save()) {
  326. throw new \Exception(json_encode($model, JSON_UNESCAPED_UNICODE));
  327. }
  328. return [
  329. 'code' => 0,
  330. 'msg' => '提交成功 开始审核'
  331. ];
  332. } catch (\Exception $e) {
  333. return [
  334. 'code' => 1,
  335. 'msg' => $e->getMessage()
  336. ];
  337. }
  338. }
  339. /**
  340. * 获取审核信息
  341. * 如果满足条件 就跳转到申请页面 审核中就跳转到审核中 拒绝或未提交审核都返回到申请页面
  342. *
  343. */
  344. public function getAuditInfo()
  345. {
  346. try {
  347. $user_id = $this->user_id;
  348. $store_id = $this->store_id;
  349. $is_apply = 0;
  350. $is_fail = 0;
  351. $status = 0;//任务界面0 申请页面1 审核界面2
  352. //正在审核的
  353. $teamGradesAudit = TeamGradesAudit::getUserTeamGrades($user_id, TeamGradesAudit::STATUS_APPLY);
  354. if ($teamGradesAudit) {
  355. $is_apply = 1;
  356. }
  357. if (!$is_apply) {
  358. //未通过审核的
  359. $teamGradesAudit = TeamGradesAudit::getUserTeamGrades($user_id, TeamGradesAudit::STATUS_REFUSE);
  360. if ($teamGradesAudit) {
  361. $is_fail = 1;
  362. }
  363. }
  364. //已经通过或未申请
  365. if (!$is_fail && !$is_apply) {
  366. $user_team_grades = TeamGrades::getUserTeamGrades($user_id);
  367. //获取下一等级信息
  368. $next_level_info = TeamGradesLevel::find()->where([
  369. 'store_id' => $store_id,
  370. 'status' => TeamGradesLevel::STATUS_TRUE,
  371. 'is_delete' => 0
  372. ])->andWhere(['>', 'level', $user_team_grades['team_grades_level']])->select('id, level, level_name, level_conditions, is_open_apply')
  373. ->orderBy('level ASC')->asArray()->one();
  374. //存在下一等级
  375. if (!empty($next_level_info)) {
  376. // throw new \Exception('当前等级未查询到');
  377. //跳转到任务升级页面
  378. //判断当前等级是否开启申请
  379. if (intval($next_level_info['is_open_apply'])) {
  380. //判断是否达到条件
  381. if (TeamGradesLevel::getIsApply($next_level_info, $user_id, $store_id)) {
  382. //已经达到升级条件 且 当前等级可以申请
  383. $status = 1;
  384. }
  385. }
  386. }
  387. // else 当前已到最高等级 或者后端没有设置等级 就跳转到任务页面
  388. }
  389. //正在审核 跳转到审核中页面
  390. if ($is_apply) {
  391. $status = 2;
  392. }
  393. //未通过审核 跳转到申请页面
  394. if ($is_fail) {
  395. $status = 1;
  396. }
  397. return [
  398. 'code' => 0,
  399. 'msg' => '',
  400. 'data' => [
  401. 'status' => $status,
  402. 'audit_info' => TeamGradesAudit::getUserTeamGrades($user_id,TeamGradesAudit::STATUS_REFUSE) ?: [
  403. 'name' => '',
  404. 'mobile' => '',
  405. 'province_id' => '',
  406. 'city_id' => '',
  407. 'district_id' => '',
  408. 'address' => '',
  409. 'province_name' => '',
  410. 'city_name' => '',
  411. 'district_name' => ''
  412. ]
  413. ]
  414. ];
  415. } catch (\Exception $e) {
  416. return [
  417. 'code' => 1,
  418. 'msg' => $e->getMessage()
  419. ];
  420. }
  421. }
  422. }