SaasUsersForm.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. <?php
  2. /**
  3. * 厦门云联储网络科技有限公司
  4. * https://www.baokuaiyun.com
  5. * Copyright (c) 2023 爆块云 All rights reserved.
  6. */
  7. namespace app\modules\admin\models;
  8. use app\models\AccountLog;
  9. use app\models\Address;
  10. use app\models\CloudInventory;
  11. use app\models\CloudInventoryLevel;
  12. use app\models\Currency;
  13. use app\models\Order;
  14. use app\models\OrderDetail;
  15. use app\models\UserWallet;
  16. use app\models\WalletLogCoin;
  17. use app\models\WalletLogStringCode;
  18. use Yii;
  19. use app\models\Store;
  20. use yii\base\Model;
  21. use app\models\User;
  22. use app\models\Option;
  23. use app\models\SaasUser;
  24. use Exception;
  25. use app\models\Admin;
  26. use app\models\SaasStoreReferral;
  27. use app\models\BusinessRightDuration;
  28. use yii\data\Pagination;
  29. class SaasUsersForm extends Model
  30. {
  31. public $saas_id;
  32. public $log_type;
  33. public function rules()
  34. {
  35. return [
  36. [['saas_id', 'log_type'], 'integer']
  37. ];
  38. }
  39. public function getList($params)
  40. {
  41. $query = SaasUser::find()->alias('su')
  42. ->leftJoin(['s' => Store::tableName()], 'su.store_id = s.id')
  43. ->where([
  44. 'su.is_delete' => 0,
  45. ])->andWhere(['and', ['<>', 'su.name', ''], ['<>', 'su.avatar', '']]);
  46. if (isset($params['store_name']) && $params['store_name']) {
  47. $query->andWhere(['like', 's.name', $params['store_name']]);
  48. }
  49. if (isset($params['nickname']) && $params['nickname']) {
  50. $query->andWhere(['like', 'su.name', $params['nickname']]);
  51. }
  52. if (isset($params['mobile']) && $params['mobile']) {
  53. $query->andWhere(['like', 'su.mobile', $params['mobile']]);
  54. }
  55. if (isset($params['is_cloud_inventory']) && $params['is_cloud_inventory']) {
  56. $query->andWhere(['=', 'su.is_cloud_inventory', $params['is_cloud_inventory']]);
  57. }
  58. $query->select('su.*, s.name as store_name')->orderBy('su.id desc');
  59. $pagination = pagination_make($query);
  60. $list = $pagination['list'];
  61. $address = Address::find()->where(['is_delete' => 0])->asArray()->all();
  62. foreach ($list as &$item) {
  63. if ($item['mobile']) {
  64. $user_list = User::find()->select(['id', 'nickname', 'avatar_url', 'store_id'])->where(['is_delete' => 0, 'binding' => $item['mobile']])->asArray()->all();
  65. foreach ($user_list as $key => $value) {
  66. $user_list[$key]['store_name'] = Option::get('name', $value['store_id'], 'store', '-')['value'];
  67. }
  68. } else {
  69. $user_list = [];
  70. }
  71. $item['user_list'] = $user_list;
  72. $item['parent_user_list'] = [];
  73. if ($item['parent_id'] > 0) {
  74. $parent = SaasUser::find()->select('mobile, avatar, name')->where(['is_delete' => 0, 'id' => $item['parent_id']])->asArray()->one();
  75. // if ($parent) {
  76. // $parent_user_list = User::find()->select(['id', 'nickname', 'avatar_url', 'store_id'])->where(['is_delete' => 0, 'binding' => $parent['mobile']])->asArray()->all();
  77. // foreach ($parent_user_list as $key => $value) {
  78. // $parent_user_list[$key]['store_name'] = Option::get('name', $value['store_id'], 'store', '-')['value'];
  79. // }
  80. // $item['parent_user_list'] = $parent_user_list;
  81. // }
  82. if ($parent) {
  83. $parent_user_list = User::find()->select(['id', 'nickname', 'avatar_url', 'store_id','binding'])->where(['is_delete' => 0, 'binding' => $parent['mobile']])->asArray()->all();
  84. foreach ($parent_user_list as $key => $value) {
  85. $parent_user_list[$key]['store_name'] = Option::get('name', $value['store_id'], 'store', '-')['value'];
  86. }
  87. $item['parent_user_list'] = $parent_user_list;
  88. }
  89. if($item['parent_user_list']==[]){
  90. $parenttemp = SaasUser::find()->select([
  91. 'id', // 给 mobile 字段起别名
  92. 'avatar AS avatar_url', // 给 avatar 字段起别名
  93. 'mobile AS nickname', // 给 name 字段起别名
  94. 'store_id AS store_id' // 给 store_id 字段起别名
  95. ])->where(['is_delete' => 0, 'id' => $item['parent_id']])->asArray()->all();
  96. $item['parent_user_list'] = $parenttemp;
  97. }
  98. $item['parent'] = $parent;
  99. }
  100. }
  101. return [
  102. 'code' => 0,
  103. 'msg' => 'success',
  104. 'data' => [
  105. 'data' => $list,
  106. 'address' => $address,
  107. 'pageNo' => $pagination['pageNo'],
  108. 'totalCount' => $pagination['totalCount'],
  109. ],
  110. ];
  111. }
  112. //平台用户头部信息显示
  113. public function getUserInfo($params)
  114. {
  115. $saas_user_id = $params['id'];
  116. $query = SaasUser::find()->alias('su')
  117. ->leftJoin(['s' => Store::tableName()], 'su.store_id = s.id')
  118. ->where([
  119. 'su.is_delete' => 0,
  120. 'su.id' => $saas_user_id
  121. ])->andWhere(['and', ['<>', 'su.name', ''], ['<>', 'su.avatar', '']]);
  122. $info = $query->select('su.*, s.name as store_name')->asArray()->one();
  123. if ($info) {
  124. $info['created_at'] = date('Y-m-d H:i:s', $info['created_at']);
  125. if ($info['mobile']) {
  126. $user_list = User::find()->select(['id', 'nickname', 'avatar_url', 'store_id'])->where(['is_delete' => 0, 'binding' => $info['mobile']])->asArray()->all();
  127. foreach ($user_list as $key => $value) {
  128. $user_list[$key]['store_name'] = Option::get('name', $value['store_id'], 'store', '-')['value'];
  129. }
  130. } else {
  131. $user_list = [];
  132. }
  133. $info['user_list'] = $user_list;
  134. $info['parent_user_list'] = [];
  135. if ($info['parent_id'] > 0) {
  136. $parent = SaasUser::find()->select('mobile, avatar, name')->where(['is_delete' => 0, 'id' => $info['parent_id']])->asArray()->one();
  137. if ($parent) {
  138. $parent_user_list = User::find()->select(['id', 'nickname', 'avatar_url', 'store_id'])->where(['is_delete' => 0, 'binding' => $parent['mobile']])->asArray()->all();
  139. foreach ($parent_user_list as $key => $value) {
  140. $parent_user_list[$key]['store_name'] = Option::get('name', $value['store_id'], 'store', '-')['value'];
  141. }
  142. $info['parent_user_list'] = $parent_user_list;
  143. }
  144. $info['parent'] = $parent;
  145. }
  146. }
  147. $info['coin'] = UserWallet::getCurrencyWalletBalance($saas_user_id, Currency::CURRENCY_COIN);
  148. $info['string_code'] = UserWallet::getCurrencyWalletBalance($saas_user_id, Currency::CURRENCY_STRING_CODE);
  149. $pv_0 = OrderDetail::find()
  150. ->alias('od')
  151. ->leftJoin(['o' => Order::tableName()], 'od.order_id = o.id')
  152. ->where(['o.saas_id' => $saas_user_id, 'o.is_pay' => 1])
  153. ->select([
  154. 'sum(pv_0)',
  155. ])->scalar();
  156. $info['pv_0'] = $pv_0 > 0 ? $pv_0 : 0;
  157. $pv_1 = OrderDetail::find()
  158. ->alias('od')
  159. ->leftJoin(['o' => Order::tableName()], 'od.order_id = o.id')
  160. ->where(['o.saas_id' => $saas_user_id, 'o.is_pay' => 1])
  161. ->select([
  162. 'sum(pv_1)',
  163. ])->scalar();
  164. $info['pv_1'] = $pv_1 > 0 ? $pv_1 : 0;
  165. return [
  166. 'code' => 0,
  167. 'msg' => 'success',
  168. 'data' => $info,
  169. ];
  170. }
  171. public function getRightList($params)
  172. {
  173. $query = SaasUser::find()->alias('su')
  174. ->where([
  175. 'su.is_delete' => 0,
  176. ])->andWhere(['and', ['<>', 'su.name', ''], ['<>', 'su.avatar', '']]);
  177. if (isset($params['nickname']) && $params['nickname']) {
  178. $query->andWhere(['like', 'su.name', $params['nickname']]);
  179. }
  180. if (isset($params['mobile']) && $params['mobile']) {
  181. $query->andWhere(['like', 'su.mobile', $params['mobile']]);
  182. }
  183. if (isset($params['id']) && $params['id']) {
  184. $query->andWhere(['id' => $params['id']]);
  185. }
  186. $query->select('id, mobile, store_id, name, avatar,can_open_store');
  187. $pagination = pagination_make($query);
  188. $list = $pagination['list'];
  189. foreach ($list as &$item) {
  190. $item['has_store'] = 0;
  191. $item['store_referral'] = 0;
  192. $item['right1'] = 0;
  193. $item['right2'] = 0;
  194. $item['right3'] = 0;
  195. // $item['can_open_store'] = 100;//yeyuan
  196. $store_admin = Admin::findOne(['saas_user_id' => $item['id'], 'is_delete' => 0, 'type' => 'store']);
  197. if($store_admin){
  198. $item['has_store'] = 1;
  199. }
  200. $ref = SaasStoreReferral::findOne(['referral_id' => $item['id']]);
  201. if($ref){
  202. $item['store_referral'] = 1;
  203. }
  204. $right1 = BusinessRightDuration::find()->where(['and', ['saas_id'=>$item['id'], 'right_id'=>1, 'is_delete' => 0], ['or', 'expire_time=0', 'expire_time>'.time()]])->one();
  205. if($right1){
  206. $item['right1'] = 1;
  207. $item['right1_from'] = $right1['from'];
  208. }
  209. $right2 = BusinessRightDuration::find()->where(['and', ['saas_id'=>$item['id'], 'right_id'=>2, 'is_delete' => 0], ['or', 'expire_time=0', 'expire_time>'.time()]])->one();
  210. if($right2){
  211. $item['right2'] = 1;
  212. $item['right2_from'] = $right2['from'];
  213. }
  214. $right3 = BusinessRightDuration::find()->where(['and', ['saas_id'=>$item['id'], 'right_id'=>3, 'is_delete' => 0], ['or', 'expire_time=0', 'expire_time>'.time()]])->one();
  215. if($right3){
  216. $item['right3'] = 1;
  217. $item['right3_from'] = $right3['from'];
  218. }
  219. }
  220. return [
  221. 'code' => 0,
  222. 'msg' => 'success',
  223. 'data' => [
  224. 'data' => $list,
  225. 'pageNo' => $pagination['pageNo'],
  226. 'totalCount' => $pagination['totalCount'],
  227. ],
  228. ];
  229. }
  230. public function getSaasIntegral() {
  231. $saas_id = $this->saas_id;
  232. $log_type = $this->log_type;
  233. $query = AccountLog::find()->where(['store_id' => [0, -1], 'saas_id' => $saas_id, 'type' => AccountLog::TYPE_INTEGRAL])->orderBy('created_at desc');
  234. if (in_array($log_type, [1, 2])) {
  235. $query->andWhere(['log_type' => $log_type])->asArray()->all();
  236. }
  237. $list = pagination_make($query);
  238. foreach ($list['list'] as &$item) {
  239. $item['log_type'] = (int)$item['log_type'];
  240. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  241. }
  242. return [
  243. 'code' => 0,
  244. 'msg' => 'success',
  245. 'data' => [
  246. 'data' => $list['list'],
  247. 'pageNo' => $list['pageNo'],
  248. 'totalCount' => $list['totalCount'],
  249. ]
  250. ];
  251. }
  252. public function getSaasStringCode() {
  253. $saas_id = $this->saas_id;
  254. $query = WalletLogStringCode::find()->where(['saas_id' => $saas_id])->orderBy('created_at desc');
  255. $list = pagination_make($query);
  256. foreach ($list['list'] as &$item) {
  257. $item['money'] = sprintf('%.2f', $item['money']);
  258. $item['before_money'] = sprintf('%.2f', $item['before_money']);
  259. $item['after_money'] = bcadd($item['money'], $item['before_money'], 2);
  260. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  261. }
  262. return [
  263. 'code' => 0,
  264. 'msg' => 'success',
  265. 'data' => [
  266. 'data' => $list['list'],
  267. 'pageNo' => $list['pageNo'],
  268. 'totalCount' => $list['totalCount'],
  269. ]
  270. ];
  271. }
  272. public function getSaasCoin() {
  273. $saas_id = $this->saas_id;
  274. $query = WalletLogCoin::find()->where(['saas_id' => $saas_id])->orderBy('created_at desc');
  275. $list = pagination_make($query);
  276. foreach ($list['list'] as &$item) {
  277. $item['money'] = sprintf('%.2f', $item['money']);
  278. $item['before_money'] = sprintf('%.2f', $item['before_money']);
  279. $item['after_money'] = bcadd($item['money'], $item['before_money'], 2);
  280. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  281. }
  282. return [
  283. 'code' => 0,
  284. 'msg' => 'success',
  285. 'data' => [
  286. 'data' => $list['list'],
  287. 'pageNo' => $list['pageNo'],
  288. 'totalCount' => $list['totalCount'],
  289. ]
  290. ];
  291. }
  292. public function getCloudInventoryUser($params)
  293. {
  294. $query = SaasUser::find()->alias('su')
  295. ->leftJoin(['s' => Store::tableName()], 'su.store_id = s.id')
  296. ->where([
  297. 'su.is_delete' => 0,
  298. ])->andWhere(['and', ['<>', 'su.name', ''], ['<>', 'su.avatar', '']]);
  299. if (isset($params['store_name']) && $params['store_name']) {
  300. $query->andWhere(['like', 's.name', $params['store_name']]);
  301. }
  302. if (isset($params['name']) && $params['name']) {
  303. $query->andWhere(['like', 'su.name', $params['name']]);
  304. }
  305. if (isset($params['tel']) && $params['tel']) {
  306. $query->andWhere(['like', 'su.mobile', $params['tel']]);
  307. }
  308. if (isset($params['level']) && $params['level']) {
  309. $query->andWhere(['=', 'su.cloud_inventory_level', $params['level']]);
  310. }
  311. if (isset($params['is_cloud_inventory']) && $params['is_cloud_inventory'] != -1) {
  312. $query->andWhere(['=', 'su.is_cloud_inventory', $params['is_cloud_inventory']]);
  313. }
  314. $query->select('su.*, s.name as store_name')->orderBy('su.id desc');
  315. $pagination = pagination_make($query);
  316. $list = $pagination['list'];
  317. foreach ($list as &$item) {
  318. if ($item['mobile']) {
  319. $user_list = User::find()->select(['id', 'nickname', 'avatar_url', 'store_id'])->where(['is_delete' => 0, 'binding' => $item['mobile']])->asArray()->all();
  320. foreach ($user_list as $key => $value) {
  321. $user_list[$key]['store_name'] = Option::get('name', $value['store_id'], 'store', '-')['value'];
  322. }
  323. } else {
  324. $user_list = [];
  325. }
  326. $item['user_list'] = $user_list;
  327. $item['parent_user_list'] = [];
  328. if ($item['parent_id'] > 0) {
  329. $parent = SaasUser::find()->select('mobile, avatar, name')->where(['is_delete' => 0, 'id' => $item['parent_id']])->asArray()->one();
  330. if ($parent) {
  331. $parent_user_list = User::find()->select(['id', 'nickname', 'avatar_url', 'store_id'])->where(['is_delete' => 0, 'binding' => $parent['mobile']])->asArray()->all();
  332. foreach ($parent_user_list as $key => $value) {
  333. $parent_user_list[$key]['store_name'] = Option::get('name', $value['store_id'], 'store', '-')['value'];
  334. }
  335. $item['parent_user_list'] = $parent_user_list;
  336. }
  337. $item['parent'] = $parent;
  338. }
  339. $item['is_cloud_inventory_name'] = $item['is_cloud_inventory'] == 1 ?'是':'否';
  340. if (!empty($item['cloud_inventory_level'])){
  341. $cloudInventoryLevel = CloudInventoryLevel::findOne(['level' => $item['cloud_inventory_level']]);
  342. $item['cloud_inventory_level_name'] = $cloudInventoryLevel['name'];
  343. }
  344. $item['cloud_inventory_num'] = CloudInventory::find()->where(['saas_id' => $item['id'], 'is_delete' => 0])
  345. ->select('num')->sum('num') ?? 0;
  346. }
  347. return [
  348. 'code' => 0,
  349. 'msg' => 'success',
  350. 'data' => [
  351. 'data' => $list,
  352. 'pageNo' => $pagination['pageNo'],
  353. 'totalCount' => $pagination['totalCount'],
  354. ],
  355. ];
  356. }
  357. public function setUser($params)
  358. {
  359. $user = SaasUser::findOne($params['id']);
  360. if (empty($user)) {
  361. return [
  362. 'code' => 1,
  363. 'msg' => '未选择任何数据'
  364. ];
  365. }
  366. $user->is_cloud_inventory = !isset($params['is_cloud_inventory']) ? $user->is_cloud_inventory:$params['is_cloud_inventory'];
  367. $user->cloud_inventory_level = !isset($params['cloud_inventory_level']) ? $user->cloud_inventory_level:$params['cloud_inventory_level'];
  368. if (!$user->save()) {
  369. return [
  370. 'code' => 1,
  371. 'msg' => '操作失败' . $user->errors
  372. ];
  373. }
  374. return [
  375. 'code' => 0,
  376. 'msg' => '操作成功'
  377. ];
  378. }
  379. public function getUserPurchaseMoney($accessToken)
  380. {
  381. $user = SaasUser::findOne(['access_token'=>$accessToken]);
  382. if (empty($user)) {
  383. return [
  384. 'code' => 1,
  385. 'msg' => '未选择任何数据'
  386. ];
  387. }
  388. $page = get_params('page') ?? 1;
  389. $limit = get_params('limit') ?? 10;
  390. $query = AccountLog::find()->where(['user_id' => $user->id,'order_type'=>AccountLog::TYPE_CLOUD_INVENTORY_PURCHASE_MONEY]);
  391. $log_type = get_params('log_type');
  392. if (!empty($log_type) && $log_type != -1) {
  393. $query->andWhere(['log_type' => $log_type]);
  394. }
  395. $count = $query->count();
  396. $pagination = new Pagination(['totalCount' => $count, 'page' => $page - 1, 'pageSize' => $limit]);
  397. $list = $query->limit($pagination->limit)->offset($pagination->offset)->asArray()->orderBy('id DESC')->all();
  398. return [
  399. 'code' => 0,
  400. 'msg' => '操作成功',
  401. 'data'=> [
  402. 'purchase_money'=> $user['purchase_money'],
  403. 'list'=> $list,
  404. 'count'=> $count
  405. ]
  406. ];
  407. }
  408. public function getRelatedMall($params)
  409. {
  410. $query = User::find()->select(['id', 'nickname', 'avatar_url', 'store_id'])->where([
  411. 'is_delete' => 0,
  412. ]);
  413. if (isset($params['mobile']) && $params['mobile']) {
  414. $query->andWhere(['=', 'binding', $params['mobile']]);
  415. } else {
  416. return [
  417. 'code' => 1,
  418. 'msg' => '未选择任何数据'
  419. ];
  420. }
  421. $list = $query->asArray()->all();
  422. $storeIds = array_unique(array_column($list, 'store_id'));
  423. $storeDetails = [];
  424. if (!empty($storeIds)) {
  425. $storeDetails = Store::find()
  426. ->andWhere(['id'=>$storeIds,'business_model' => 1, 'is_delete' => 0]) // 其他条件
  427. ->indexBy('id') // 按 id 索引
  428. ->asArray()
  429. ->all();
  430. }
  431. foreach ($list as $key => $value) {
  432. if (isset($storeDetails[$value['store_id']])) {
  433. $list[$key]['store_name'] = \Yii::$app->db->createCommand("SELECT `name` FROM cyy_store WHERE id =:id")
  434. ->bindValue(':id',$value['store_id'])
  435. ->queryScalar();//Option::get('name', $value['store_id'], 'store', '-')['value'];
  436. } else {
  437. // 去除运营模式为非独立小程序的店铺
  438. unset($list[$key]);
  439. }
  440. }
  441. return [
  442. 'code' => 0,
  443. 'msg' => 'success',
  444. 'data' => [
  445. 'data' => $list,
  446. ],
  447. ];
  448. }
  449. }