UserForm.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. /**
  3. * UserForm.php
  4. * 手机端收银台--会员用户管理模型
  5. * Created on 2024/11/29 下午2:16
  6. * @author: hankaige
  7. */
  8. namespace app\modules\client\models\v1\cashier;
  9. use app\models\CashierActionLog;
  10. use app\models\Level;
  11. use app\models\Order;
  12. use app\models\SaasUser;
  13. use app\models\User;
  14. use yii\base\Model;
  15. class UserForm extends Model
  16. {
  17. public int $store_id;
  18. public $md_id;
  19. public $keyword;
  20. public $id;
  21. public $nickname;
  22. public $binding;
  23. public $user_remark;
  24. public $level;
  25. // 验证场景
  26. const USER_SEARCH = 'user_search';
  27. const USER_LIST = 'user_list';
  28. const USER_ADD = 'user_add';
  29. const USER_EDIT = 'user_edit';
  30. const USER_DELETE = 'user_delete';
  31. public function rules(): array
  32. {
  33. return [
  34. [['store_id'], 'required', 'on' => [self::USER_SEARCH, self::USER_LIST]],
  35. [['keyword'], 'string', 'on' => [self::USER_LIST]],
  36. [['keyword'], 'required', 'on' => [self::USER_SEARCH]],
  37. [['id'], 'required', 'on' => [self::USER_EDIT]],
  38. [['id', 'level'], 'integer', 'on' => [self::USER_ADD, self::USER_EDIT]],
  39. [['nickname', 'binding'], 'required', 'on' => [self::USER_ADD, self::USER_EDIT]],
  40. [['nickname', 'binding', 'user_remark'], 'string', 'on' => [self::USER_ADD, self::USER_EDIT]],
  41. [['md_id'], 'safe']
  42. ];
  43. }
  44. public function attributeLabels(): array
  45. {
  46. return [
  47. 'store_id' => '商城ID',
  48. 'keyword' => '搜索内容',
  49. 'id' => '用户ID',
  50. 'nickname' => '用户昵称',
  51. 'binding' => '用户手机号',
  52. 'level' => '会员等级',
  53. 'user_remark' => '用户备注'
  54. ];
  55. }
  56. public function searchUser(): array
  57. {
  58. if (!$this->validate()) {
  59. return ['code' => 1, 'msg' => $this->getErrorSummary(FALSE)[0]];
  60. }
  61. $query = User::find()->alias('u')->leftjoin(['l' => Level::tableName()], 'u.level=l.level')->where(['u.store_id' => $this->store_id, 'u.is_delete' => 0]);
  62. // 更具用户昵称 手机号 搜索用户
  63. $query->andWhere(['or', ['like', 'u.nickname', $this->keyword], ['=', 'u.binding', $this->keyword]])->select(['u.id', 'u.avatar_url', 'u.nickname', 'u.binding', 'level_name' => 'l.name']);
  64. $result['list'] = $query->orderBy('u.created_at DESC')->asArray()->all();
  65. foreach ($result['list'] as &$item) {
  66. $item['level_name'] = empty($item['level_name']) ? '普通会员' : $item['level_name'];
  67. }
  68. // 获取搜索结果集
  69. return ['code' => 0, 'msg' => '搜索成功', 'data' => $result];
  70. }
  71. public function getUserList(): array
  72. {
  73. if (!$this->validate()) {
  74. return ['code' => 1, 'msg' => $this->getErrorSummary(FALSE)[0]];
  75. }
  76. $query = User::find()->alias('u')->where(['u.store_id' => $this->store_id, 'u.is_delete' => 0]);
  77. $query->select(['u.id', 'u.nickname', 'u.avatar_url', 'u.binding', 'u.integral', 'u.money', 'u.user_remark', 'u.created_at', 'u.level']);
  78. if (!empty($this->keyword)) {
  79. $query->andWhere(['or', ['like', 'u.nickname', $this->keyword], ['u.binding' => $this->keyword]]);
  80. }
  81. $result = pagination_make($query, TRUE, 'u.created_at DESC');
  82. foreach ($result['list'] as &$item) {
  83. $item['level_name'] = Level::find()->where(['level' => $item['level'], 'is_delete' => 0, 'store_id' => $this->store_id])->one()['name'] ?? '普通会员';
  84. $item['user_remark'] = empty($item['user_remark']) ? '' : $item['user_remark'];
  85. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  86. // 计算用户订单数量和订单支付金额
  87. $orderQuery = Order::find()->where(['user_id' => $item['id'], 'trade_status' => [Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM]]);
  88. $item['order_count'] = $orderQuery->count();
  89. $item['order_price'] = $orderQuery->select('SUM(total_price)')->scalar();
  90. if (!empty($item['binding'])) {
  91. $saasUser = SaasUser::findOne(['mobile' => $item['binding']]);
  92. if ($saasUser) {
  93. $item['nickname'] = $saasUser->name;
  94. $item['avatar_url'] = $saasUser->avatar;
  95. }
  96. }
  97. }
  98. return ['code' => 0, 'data' => $result];
  99. }
  100. public function editUser(): array
  101. {
  102. try {
  103. if (!$this->validate()) {
  104. return ['code' => 1, 'msg' => $this->getErrorSummary(FALSE)[0]];
  105. }
  106. $user = User::findOne(['id' => $this->id, 'is_delete' => User::USER_NOT_DELETE]);
  107. if (empty($user)) {
  108. return ['code' => 1, 'msg' => '用户不存在'];
  109. }
  110. // 商城用户手机号与当前手机号不一样的话要把所有的手机号都改一下
  111. if ($user->binding != $this->binding) {
  112. $t = \Yii::$app->db->beginTransaction();
  113. try {
  114. $usingBinding = User::findOne(['binding' => $this->binding, 'is_delete' => User::USER_NOT_DELETE]);
  115. if ($usingBinding) {
  116. throw new \Exception('该手机号已被使用');
  117. }
  118. $allUser = User::find()->where(['binding' => $user->binding, 'is_delete' => User::USER_NOT_DELETE])->all();
  119. foreach ($allUser as $userItem) {
  120. $userItem->binding = $this->binding;
  121. $userItem->save();
  122. }
  123. $saasUser = SaasUser::findOne(['mobile' => $user->binding, 'is_delete' => SaasUser::DELETE_STATUS_FALSE]);
  124. if ($saasUser) {
  125. $saasUser->mobile = $this->binding;
  126. $saasUser->save();
  127. }
  128. $t->commit();
  129. } catch (\Exception $e) {
  130. $t->rollBack();
  131. return [
  132. 'code' => 1,
  133. 'msg' => $e->getMessage(),
  134. ];
  135. }
  136. }
  137. $user->nickname = $this->nickname;
  138. $user->binding = $this->binding;
  139. $user->level = $this->level;
  140. $user->user_remark = $this->user_remark;
  141. if ($user->save()) {
  142. // 生成操作记录
  143. CashierActionLog::setLog($this->store_id, get_user_id(), CashierActionLog::EDIT_USER, '编辑' . $user->nickname . '用户资料', $this->md_id);
  144. return ['code' => 0, 'msg' => '保存成功'];
  145. } else {
  146. return ['code' => 1, 'msg' => '保存失败'];
  147. }
  148. } catch (\Exception $e) {
  149. return ['code' => 1, 'msg' => $e->getMessage()];
  150. }
  151. }
  152. public function addUser(): array
  153. {
  154. try {
  155. if (!$this->validate()) {
  156. return ['code' => 1, 'msg' => $this->getErrorSummary(FALSE)[0]];
  157. }
  158. $t = \Yii::$app->db->beginTransaction();
  159. $user = User::findOne(['binding' => $this->binding, 'is_delete' => User::USER_NOT_DELETE]);
  160. if ($user) {
  161. throw new \Exception('该手机号已被其他用户使用过');
  162. }
  163. $newUser = new User();
  164. $newUser->store_id = $this->store_id;
  165. $newUser->type = User::USER_TYPE_NORMAL;
  166. $newUser->binding = $this->binding;
  167. $newUser->username = $this->nickname;
  168. $newUser->nickname = $this->nickname;
  169. $newUser->password = \Yii::$app->security->generatePasswordHash(\Yii::$app->security->generateRandomString(), 5);
  170. $newUser->auth_key = \Yii::$app->security->generateRandomString();
  171. $newUser->access_token = \Yii::$app->security->generateRandomString();
  172. $newUser->is_delete = User::USER_NOT_DELETE;
  173. $newUser->wechat_open_id = '';
  174. $newUser->wechat_union_id = '';
  175. $newUser->platform = User::USER_FROM_CASHIER; // 收银台注册
  176. isset($this->level) && $newUser->level = $this->level;
  177. $newUser->user_remark = $this->user_remark;
  178. if (!$newUser->save()) {
  179. $t->rollBack();
  180. return ['code' => 1, 'msg' => '添加失败'];
  181. }
  182. // 创建saas_user表对应数据
  183. $saas_user = SaasUser::find()->where(['mobile' => $this->binding, 'is_delete' => SaasUser::DELETE_STATUS_FALSE])->one();
  184. if (!$saas_user) {
  185. $saas_user = new SaasUser();
  186. $saas_user->mobile = $this->binding;
  187. $saas_user->store_id = $this->store_id;
  188. $saas_user->name = $this->nickname;
  189. if (!$saas_user->save()) {
  190. $t->rollBack();
  191. throw new \Exception('平台账号创建失败');
  192. }
  193. }
  194. // 生成操作记录
  195. CashierActionLog::setLog($this->store_id, get_user_id(), CashierActionLog::ADD_USER, '新增' . $newUser->nickname . '用户', $this->md_id);
  196. $t->commit();
  197. return ['code' => 0, 'msg' => '用户创建成功'];
  198. } catch (\Exception $e) {
  199. return ['code' => 1, 'msg' => $e->getMessage()];
  200. }
  201. }
  202. public function getLevelList()
  203. {
  204. $level = Level::find()->where(['store_id' => $this->store_id, 'is_delete' => 0])->orderBy('level asc')->asArray()->select(['id', 'level', 'name'])->all();
  205. // 在数组第一位添加一个['id'=>-1,'level'=>-1,'name'=>'普通会员']
  206. array_unshift($level, ['id' => -1, 'level' => -1, 'name' => '普通会员']);
  207. return ['code' => 0, 'data' => $level ?? []];
  208. }
  209. }