TeamForm.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. <?php
  2. namespace app\modules\admin\models\team_grades;
  3. use app\models\District;
  4. use app\models\Option;
  5. use app\models\SaasUser;
  6. use app\models\TeamGrades;
  7. use app\models\TeamGradesAudit;
  8. use app\models\TeamGradesLevel;
  9. use app\models\TeamGradesPool;
  10. use app\models\TeamGradesPoolDetail;
  11. use app\models\User;
  12. use yii\base\Model;
  13. use yii\helpers\ArrayHelper;
  14. class TeamForm extends Model
  15. {
  16. public $nickname;
  17. public $mobile;
  18. public $start_time;
  19. public $end_time;
  20. public $id;
  21. public $store_id;
  22. public $status;
  23. public $user_id;
  24. public $team_grades_level;
  25. //分红设置
  26. public $team_start_num;//团队统计层级初始等级
  27. public $team_end_num;//团队统计层级最高等级
  28. public $filter_high_level;//统计扣除高等级开关
  29. public $team_cycle_type;//统计周期类型
  30. public $team_cycle;//统计周期
  31. public $amount_rule_type;//业绩统计规则
  32. public $is_send;
  33. public $bonus_type;
  34. public function rules()
  35. {
  36. return [
  37. [['id', 'store_id', 'status', 'user_id', 'team_grades_level', 'team_start_num', 'team_end_num',
  38. 'filter_high_level', 'team_cycle_type', 'team_cycle', 'is_send', 'amount_rule_type', 'bonus_type'], 'integer'],
  39. [['nickname', 'mobile', 'start_time', 'end_time'], 'string']
  40. ];
  41. }
  42. //审核列表
  43. public function auditList() {
  44. $store_id = $this->store_id;
  45. $nickname = $this->nickname;
  46. $mobile = $this->mobile;
  47. $start_time = $this->start_time;
  48. $end_time = $this->end_time;
  49. $status = $this->status;
  50. $query = TeamGradesAudit::find()->alias('tg')->leftJoin(['u' => User::tableName()], 'tg.user_id = u.id')
  51. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  52. ->where(['tg.store_id' => $store_id, 'tg.is_delete' => 0, 'u.is_delete' => 0, 'su.is_delete' => 0])
  53. ->andWhere(['<>', 'u.binding', '']);
  54. if (isset($status) && in_array($status, TeamGradesAudit::STATUS_ARR)) {
  55. $query->andWhere(['status' => $status]);
  56. }
  57. if (!empty(trim($nickname))) {
  58. $query->andWhere(['OR', ['LIKE', 'su.name', $nickname], ['LIKE', 'tg.name', $nickname]]);
  59. }
  60. if (!empty(trim($mobile))) {
  61. $query->andWhere(['OR', ['LIKE', 'su.mobile', $mobile], ['LIKE', 'tg.mobile', $mobile]]);
  62. }
  63. if (!empty(trim($start_time))) {
  64. $start_time = strtotime($start_time);
  65. if ($start_time) {
  66. $query->andWhere(['>=', 'tg.created_at', $start_time]);
  67. }
  68. }
  69. if (!empty(trim($end_time))) {
  70. $end_time = strtotime($end_time);
  71. if ($end_time) {
  72. $query->andWhere(['<=', 'tg.created_at', $end_time]);
  73. }
  74. }
  75. $query->select('tg.id, tg.name, tg.mobile, tg.created_at, tg.audit_time, tg.team_grades_level, tg.province_id,
  76. tg.city_id, tg.district_id, tg.address, tg.status, su.avatar, su.name as nickname')
  77. ->orderBy('tg.id DESC');
  78. $pagination = pagination_make($query);
  79. foreach ($pagination['list'] as &$list) {
  80. $list['created_at'] = date('Y-m-d H:i:s', $list['created_at']);
  81. if ($list['audit_time']) {
  82. $list['audit_time'] = date('Y-m-d H:i:s', $list['audit_time']);
  83. }
  84. $list['status'] = intval($list['status']);
  85. $list['level_name'] = TeamGradesLevel::getLevelInfo($list['team_grades_level'], $store_id, 'level_name');
  86. //拼接省市区以及详细地址数据
  87. $address = '';
  88. $district = District::find()->where(['id' => [$list['province_id'], $list['city_id'], $list['district_id']]])
  89. ->select('name')->column();
  90. if ($district) {
  91. $address = implode('', $district);
  92. }
  93. $address .= $list['address'];
  94. $list['address'] = $address;
  95. }
  96. return [
  97. 'code' => 0,
  98. 'msg' => 'success',
  99. 'data' => [
  100. 'data' => $pagination['list'],
  101. 'pageNo' => $pagination['pageNo'],
  102. 'totalCount' => $pagination['totalCount'],
  103. ]
  104. ];
  105. }
  106. //列表
  107. public function list() {
  108. $store_id = $this->store_id;
  109. $nickname = $this->nickname;
  110. $mobile = $this->mobile;
  111. $start_time = $this->start_time;
  112. $end_time = $this->end_time;
  113. $query = TeamGrades::find()->alias('tg')->leftJoin(['u' => User::tableName()], 'tg.user_id = u.id')
  114. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  115. ->where(['tg.store_id' => $store_id, 'tg.is_delete' => 0, 'u.is_delete' => 0, 'su.is_delete' => 0])
  116. ->andWhere(['<>', 'u.binding', '']);
  117. if (!empty(trim($nickname))) {
  118. $query->andWhere(['OR', ['LIKE', 'su.name', $nickname], ['LIKE', 'tg.name', $nickname]]);
  119. }
  120. if (!empty(trim($mobile))) {
  121. $query->andWhere(['OR', ['LIKE', 'su.mobile', $mobile], ['LIKE', 'tg.mobile', $mobile]]);
  122. }
  123. if (!empty(trim($start_time))) {
  124. $start_time = strtotime($start_time);
  125. if ($start_time) {
  126. $query->andWhere(['>=', 'tg.created_at', $start_time]);
  127. }
  128. }
  129. if (!empty(trim($end_time))) {
  130. $end_time = strtotime($end_time);
  131. if ($end_time) {
  132. $query->andWhere(['<=', 'tg.created_at', $end_time]);
  133. }
  134. }
  135. $query->select('tg.id, tg.name, tg.mobile, tg.created_at, tg.team_grades_level, tg.province_id,
  136. tg.city_id, tg.district_id, tg.address, su.avatar, su.name as nickname, tg.total_price, tg.user_id')
  137. ->orderBy('tg.id DESC');
  138. $pagination = pagination_make($query);
  139. foreach ($pagination['list'] as &$list) {
  140. $list['created_at'] = date('Y-m-d H:i:s', $list['created_at']);
  141. $list['level_name'] = TeamGradesLevel::getLevelInfo($list['team_grades_level'], $store_id, 'level_name');
  142. }
  143. return [
  144. 'code' => 0,
  145. 'msg' => 'success',
  146. 'data' => [
  147. 'level' => TeamGradesLevel::getLevelList($store_id),
  148. 'data' => $pagination['list'],
  149. 'pageNo' => $pagination['pageNo'],
  150. 'totalCount' => $pagination['totalCount'],
  151. ]
  152. ];
  153. }
  154. //处理同意拒绝 删除
  155. public function handle() {
  156. $t = \Yii::$app->db->beginTransaction();
  157. try {
  158. $id = $this->id ?? 0;
  159. $status = $this->status;
  160. $teamGradesAudit = TeamGradesAudit::findOne($id);
  161. if (!$teamGradesAudit) {
  162. throw new \Exception('数据查询失败');
  163. }
  164. if ($teamGradesAudit->is_delete) {
  165. throw new \Exception('数据已经删除');
  166. }
  167. if (!isset($status)) {
  168. throw new \Exception('参数错误');
  169. }
  170. //同意/拒绝
  171. if (in_array($status, [TeamGradesAudit::STATUS_AGREE, TeamGradesAudit::STATUS_REFUSE])) {
  172. if ($teamGradesAudit->status) {
  173. throw new \Exception('数据已经处理');
  174. }
  175. $teamGradesAudit->status = $status;
  176. $teamGradesAudit->audit_time = time();
  177. }
  178. //同意/拒绝
  179. if (intval($status) === 3) {
  180. $teamGradesAudit->is_delete = 1;
  181. }
  182. if (!$teamGradesAudit->save()) {
  183. throw new \Exception(json_encode($teamGradesAudit->errors, JSON_UNESCAPED_UNICODE));
  184. }
  185. if (intval($status) === TeamGradesAudit::STATUS_AGREE) {
  186. $teamGradesAuditAttribution = ArrayHelper::toArray($teamGradesAudit->attributes);
  187. unset($teamGradesAuditAttribution['id'], $teamGradesAuditAttribution['status'], $teamGradesAuditAttribution['audit_time'], $teamGradesAuditAttribution['created_at'], $teamGradesAuditAttribution['updated_at']);
  188. $teamGrades = TeamGrades::findOne(['user_id' => $teamGradesAudit->user_id, 'is_delete' => 0]) ?: new TeamGrades();
  189. $teamGrades->attributes = $teamGradesAuditAttribution;
  190. $teamGrades->total_price = 0;
  191. $teamGrades->price = 0;
  192. if (!$teamGrades->save()) {
  193. throw new \Exception(json_encode($teamGrades->errors, JSON_UNESCAPED_UNICODE));
  194. }
  195. }
  196. $t->commit();
  197. return [
  198. 'code' => 0,
  199. 'msg' => '操作成功'
  200. ];
  201. } catch (\Exception $e) {
  202. $t->rollBack();
  203. return [
  204. 'code' => 1,
  205. 'msg' => $e->getMessage()
  206. ];
  207. }
  208. }
  209. //添加分红团队
  210. public function addTeam() {
  211. try {
  212. //设置分红团队
  213. $id = $this->id;
  214. //设置分红团队用户
  215. $user_id = $this->user_id;
  216. //获取店铺id
  217. $store_id = $this->store_id;
  218. //设置分红团队等级
  219. $team_grades_level = $this->team_grades_level;
  220. $user = User::findOne(['id' => $user_id, 'is_delete' => 0]);
  221. if (!$user) {
  222. throw new \Exception('用户不存在');
  223. }
  224. $teamGradesAudit = TeamGradesAudit::findOne(['user_id' => $user_id, 'status' => TeamGradesAudit::STATUS_APPLY, 'is_delete' => 0]);
  225. if ($teamGradesAudit) {
  226. throw new \Exception('该用户已经申请过分红团队, 请前往审核');
  227. }
  228. $teamGradesLevel = TeamGradesLevel::findOne(['level' => $team_grades_level, 'store_id' => $store_id, 'is_delete' => 0]);
  229. if (!$teamGradesLevel) {
  230. throw new \Exception('分红等级不存在');
  231. }
  232. $saas_user = SaasUser::findOne(['mobile' => $user->binding, 'is_delete' => 0]);
  233. if (!$saas_user) {
  234. throw new \Exception('用户信息不存在');
  235. }
  236. $teamGrades = TeamGrades::findOne($id);
  237. $is_open = true;
  238. if ($teamGrades) {
  239. if (intval($teamGrades->user_id) === intval($user_id)) {
  240. $is_open = false;
  241. }
  242. }
  243. if ($is_open) {
  244. $teamGrades_ = TeamGrades::findOne(['user_id' => $user_id, 'is_delete' => 0]);
  245. if ($teamGrades_) {
  246. throw new \Exception('该用户已经设置过分红团队');
  247. }
  248. }
  249. $teamGrades = $teamGrades ?: new TeamGrades();
  250. $teamGrades->user_id = $user_id;
  251. $teamGrades->store_id = $store_id;
  252. $teamGrades->name = $saas_user->name;
  253. $teamGrades->mobile = $saas_user->mobile;
  254. $teamGrades->team_grades_level = $team_grades_level;
  255. $teamGrades->province_id = 0;
  256. $teamGrades->city_id = 0;
  257. $teamGrades->district_id = 0;
  258. if (!$teamGrades->save()) {
  259. throw new \Exception(json_encode($teamGrades->errors, JSON_UNESCAPED_UNICODE));
  260. }
  261. return [
  262. 'code' => 0,
  263. 'msg' => '操作成功'
  264. ];
  265. } catch (\Exception $e) {
  266. return [
  267. 'code' => 1,
  268. 'msg' => $e->getMessage()
  269. ];
  270. }
  271. }
  272. //删除团队人员
  273. public function delTeam() {
  274. try {
  275. $id = $this->id ?? 0;
  276. $teamGrades = TeamGrades::findOne($id);
  277. if (!$teamGrades) {
  278. throw new \Exception('数据查询失败');
  279. }
  280. if ($teamGrades->is_delete) {
  281. throw new \Exception('数据已经删除');
  282. }
  283. $teamGrades->is_delete = 1;
  284. if (!$teamGrades->save()) {
  285. throw new \Exception(json_encode($teamGrades->errors, JSON_UNESCAPED_UNICODE));
  286. }
  287. return [
  288. 'code' => 0,
  289. 'msg' => '操作成功'
  290. ];
  291. } catch (\Exception $e) {
  292. return [
  293. 'code' => 1,
  294. 'msg' => $e->getMessage()
  295. ];
  296. }
  297. }
  298. //设置分红
  299. public function setDividends() {
  300. try {
  301. $store_id = $this->store_id;
  302. if (\Yii::$app->request->isPost) {
  303. if (!$this->validate()) {
  304. throw new \Exception($this->getErrorSummary(false)[0]);
  305. }
  306. $team_start_num = $this->team_start_num;
  307. $team_end_num = $this->team_end_num;
  308. $filter_high_level = $this->filter_high_level;
  309. $team_cycle_type = $this->team_cycle_type;
  310. $team_cycle = $this->team_cycle;
  311. $amount_rule_type = $this->amount_rule_type;
  312. $bonus_type = $this->bonus_type;
  313. $data = [
  314. 'team_start_num' => $team_start_num ?: 0,
  315. 'team_end_num' => $team_end_num ?: 0,
  316. 'filter_high_level' => $filter_high_level ?: 0,
  317. 'team_cycle_type' => $team_cycle_type ?: 0,
  318. 'team_cycle' => $team_cycle ?: 0,
  319. 'amount_rule_type' => $amount_rule_type,
  320. 'bonus_type' => $bonus_type,
  321. ];
  322. /* begin 2025/04/27 14:42:03 当改变奖励方式时,判断是否有为结算的奖金池,如果有就不能改变 WPing丶 */
  323. $setting = Option::get('team_grades_setting', $this->store_id, 'team_grades_setting')['value'];
  324. $setting = json_decode($setting, true);
  325. $old_bonus_type = $setting['bonus_type'];
  326. if($bonus_type != $old_bonus_type) {
  327. $is_exist = TeamGradesPool::find()->where(['store_id' => $this->store_id, 'is_send' => 0, 'is_delete' => 0])->exists();
  328. if($is_exist) {
  329. throw new \Exception('当前商城有已生成但未结算的奖金池,不能修改奖励方式');
  330. }
  331. }
  332. /* end */
  333. //验证数据
  334. if (!in_array($data['team_cycle_type'], [
  335. TeamGrades::TEAM_CYCLE_TYPE_DAY,
  336. TeamGrades::TEAM_CYCLE_TYPE_WEEK,
  337. TeamGrades::TEAM_CYCLE_TYPE_MONTH,
  338. ])) {
  339. throw new \Exception('统计周期数据错误');
  340. }
  341. if (!in_array($data['amount_rule_type'], [
  342. TeamGrades::TEAM_AMOUNT_RULE_TYPE_GOODS,
  343. TeamGrades::TEAM_AMOUNT_RULE_TYPE_ORDER
  344. ])) {
  345. throw new \Exception('业绩统计规则枚举值错误');
  346. }
  347. if (!in_array($data['bonus_type'], [
  348. TeamGrades::TEAM_BONUS_TYPE_LADDER,
  349. TeamGrades::TEAM_BONUS_TYPE_DIFF
  350. ])) {
  351. throw new \Exception('奖励类型枚举值错误');
  352. }
  353. if ($data['team_start_num'] > $data['team_end_num']) {
  354. throw new \Exception('团队人数范围数据错误');
  355. }
  356. $result = Option::set('team_grades_setting', json_encode($data), $store_id, 'team_grades_setting');
  357. if (!$result) {
  358. throw new \Exception('数据保存失败');
  359. }
  360. return [
  361. 'code' => 0,
  362. 'msg' => '操作成功'
  363. ];
  364. }
  365. $team_grades_setting = Option::get('team_grades_setting', $store_id, 'team_grades_setting')['value'];
  366. if (!$team_grades_setting) {
  367. $team_grades_setting = json_encode([
  368. 'team_start_num' => 0,
  369. 'team_end_num' => 0,
  370. 'filter_high_level' => 1,
  371. 'team_cycle_type' => TeamGrades::TEAM_CYCLE_TYPE_DAY,
  372. 'team_cycle' => 0,
  373. 'amount_rule_type' => 0,
  374. 'bonus_type' => TeamGrades::TEAM_BONUS_TYPE_LADDER
  375. ]);
  376. }
  377. $team_grades_setting = json_decode($team_grades_setting, true);
  378. $team_grades_setting['team_cycle_type'] = intval($team_grades_setting['team_cycle_type']);
  379. $team_grades_setting['amount_rule_type'] = intval($team_grades_setting['amount_rule_type']);
  380. return [
  381. 'code' => 0,
  382. 'msg' => '获取成功',
  383. 'data' => $team_grades_setting
  384. ];
  385. } catch (\Exception $e) {
  386. return [
  387. 'code' => 1,
  388. 'msg' => $e->getMessage()
  389. ];
  390. }
  391. }
  392. /**
  393. * 获取团队人员分红明细
  394. */
  395. public function getTeamDividendsList() {
  396. try {
  397. $id = $this->id;
  398. $is_send = $this->is_send;
  399. $store_id = $this->store_id;
  400. $team_grades = TeamGrades::findOne($id);
  401. if (!$team_grades) {
  402. throw new \Exception('数据查询失败');
  403. }
  404. $user_id = $team_grades->user_id;
  405. $query = TeamGradesPoolDetail::find()->where(['user_id' => $user_id, 'is_delete' => 0]);
  406. if ($is_send !== null && in_array($is_send, [TeamGradesPoolDetail::SEND_STATUS_NO, TeamGradesPoolDetail::SEND_STATUS_YES])) {
  407. $query->andWhere(['is_send' => $is_send]);
  408. }
  409. $query->select('id, user_id, price, amount, is_send, level, created_at, send_time');
  410. $pagination = pagination_make($query);
  411. foreach ($pagination['list'] as &$item) {
  412. $item['team_grades_level'] = TeamGradesLevel::getLevelInfo($item['level'], $store_id, 'level_name');
  413. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  414. $item['send_time'] = $item['send_time'] ? date('Y-m-d H:i:s', $item['send_time']) : '';
  415. $item['is_send'] = intval($item['is_send']);
  416. }
  417. return [
  418. 'code' => 0,
  419. 'msg' => 'success',
  420. 'data' => [
  421. 'data' => $pagination['list'],
  422. 'pageNo' => $pagination['pageNo'],
  423. 'totalCount' => $pagination['totalCount'],
  424. ]
  425. ];
  426. } catch (\Exception $e) {
  427. return [
  428. 'code' => 1,
  429. 'msg' => $e->getMessage()
  430. ];
  431. }
  432. }
  433. }