| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604 |
- <?php
- // +----------------------------------------------------------------------
- // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
- // +----------------------------------------------------------------------
- // | 版权所有 2017~2021 LARAVEL研发中心
- // +----------------------------------------------------------------------
- // | 官方网站: http://www.laravel.cn
- // +----------------------------------------------------------------------
- // | Author: laravel开发员 <laravel.qq.com>
- // +----------------------------------------------------------------------
- namespace App\Services\Common;
- use App\Models\GoodsModel;
- use App\Models\StoreModel;
- use App\Models\UserModel;
- use App\Models\MemberModel;
- use App\Services\BaseService;
- use App\Services\RedisService;
- use Illuminate\Support\Facades\DB;
- /**
- * 商家店铺管理-服务类
- * @author laravel开发员
- * @since 2020/11/11
- * @package App\Services\Common
- */
- class StoreService extends BaseService
- {
- /**
- * 构造函数
- * @author laravel开发员
- * @since 2020/11/11
- * AdService constructor.
- */
- public function __construct()
- {
- $this->model = new StoreModel();
- }
- /**
- * 列表
- * @param $params
- * @param int $pageSize
- * @return array
- */
- public function getDataList($params, $pageSize = 15)
- {
- // 分页查询
- $list = $this->model
- ->where('mark', 1)
- ->where(function ($query) use ($params) {
- // 商家ID筛选
- if (isset($params['store_id']) && $params['store_id'] > 0) {
- $query->where('id', $params['store_id']);
- }
- // 状态筛选
- if (isset($params['status']) && $params['status'] > 0) {
- $query->where('status', $params['status']);
- }
- // 分类筛选
- if (isset($params['category_id']) && $params['category_id'] > 0) {
- $query->where('category_id', $params['category_id']);
- }
- // 用户状态筛选
- if (isset($params['user_status']) && $params['user_status'] > 0) {
- $query->whereHas('member', function ($q) use ($params) {
- $q->where('status', $params['user_status'])->where('mark', 1);
- });
- }
- // 管理员状态筛选
- if (isset($params['admin_status']) && $params['admin_status'] > 0) {
- $query->whereHas('user', function ($q) use ($params) {
- $q->where('status', $params['admin_status'])->where('mark', 1);
- });
- }
- // 店铺名称搜索
- if (isset($params['name']) && $params['name']) {
- $query->where(function ($q) use ($params) {
- $q->where('name', 'like', "%{$params['name']}%")
- ->orWhere('phone', 'like', "%{$params['name']}%");
- });
- }
- // 联系电话搜索
- if (isset($params['phone']) && $params['phone']) {
- $query->where('phone', 'like', "%{$params['phone']}%");
- }
- // 姓名搜索
- if (isset($params['real_name']) && $params['real_name']) {
- $query->where('real_name', 'like', "%{$params['real_name']}%");
- }
- })
- ->with(['user', 'member', 'category'])
- ->orderBy('create_time', 'desc')
- ->orderBy('id', 'desc')
- ->paginate($pageSize > 0 ? $pageSize : 9999999);
- $list = $list->toArray();
- // 格式化数据
- if (isset($list['data']) && !empty($list['data'])) {
- foreach ($list['data'] as &$item) {
- $item['create_time'] = $item['create_time'] ? datetime($item['create_time'], 'Y-m-d H:i:s') : '';
- $item['status_text'] = $this->getStatusText($item['status']);
- $item['user_status'] = isset($item['user']['status']) ? $item['user']['status'] : 1;
- $item['member_status'] = isset($item['member']['status']) ? $item['member']['status'] : 1;
- $item['category_name'] = isset($item['category']['name']) ? $item['category']['name'] : '未分类';
- // 处理门头照图片
- if (isset($item['logo']) && $item['logo']) {
- $item['logo'] = get_image_url($item['logo']);
- }
- // 添加余额信息
- $item['balance'] = isset($item['member']['balance']) ? $item['member']['balance'] : 0;
- // 添加会员状态信息
- $item['member_user_status'] = isset($item['member']['status']) ? $item['member']['status'] : 1;
- }
- }
- return [
- 'msg' => '操作成功',
- 'code' => 0,
- 'data' => $list['data'],
- 'count' => $list['total']
- ];
- }
- /**
- * 获取状态文本
- * @param int $status
- * @return string
- */
- private function getStatusText($status)
- {
- $statusMap = [
- 1 => '已审核(营业中)',
- 2 => '待审核',
- 3 => '审核失败'
- ];
- return isset($statusMap[$status]) ? $statusMap[$status] : '未知';
- }
- /**
- * 查询
- * @param $params
- * @return \Illuminate\Database\Eloquent\Builder
- */
- public function getQuery($params)
- {
- $where = ['mark' => 1];
- $status = isset($params['status']) ? $params['status'] : 0;
- if ($status > 0) {
- $where['status'] = $status;
- }
- // 分类筛选
- $categoryId = isset($params['category_id']) ? intval($params['category_id']) : 0;
- if ($categoryId > 0) {
- $where['category_id'] = $categoryId;
- }
- // 用户状态筛选(member表)
- $userStatus = isset($params['user_status']) ? intval($params['user_status']) : 0;
- // 管理员状态筛选(user表)
- $adminStatus = isset($params['admin_status']) ? intval($params['admin_status']) : 0;
- $model = $this->model
- ->with(['user', 'member', 'category'])
- ->select('stores.*')
- ->where($where);
- // 如果筛选用户状态,使用 whereHas 关联 member 表
- if ($userStatus > 0) {
- $model->whereHas('member', function ($query) use ($userStatus) {
- $query->where('status', $userStatus)->where('mark', 1);
- });
- }
- // 如果筛选管理员状态,使用 whereHas 关联 user 表
- if ($adminStatus > 0) {
- $model->whereHas('user', function ($query) use ($adminStatus) {
- $query->where('status', $adminStatus)->where('mark', 1);
- });
- }
- // 搜索条件
- $model->where(function ($query) use ($params) {
- // 店铺名称搜索
- $name = isset($params['name']) ? trim($params['name']) : '';
- if ($name) {
- $query->where('name', 'like', "%{$name}%");
- }
- // 联系电话搜索
- $phone = isset($params['phone']) ? trim($params['phone']) : '';
- if ($phone) {
- $query->where('phone', 'like', "%{$phone}%");
- }
- // 姓名搜索
- $realName = isset($params['real_name']) ? trim($params['real_name']) : '';
- if ($realName) {
- $query->where('real_name', 'like', "%{$realName}%");
- }
- });
- return $model;
- }
- /**
- * 添加或编辑
- * @return array
- * @since 2020/11/11
- * @author laravel开发员
- */
- public function edit()
- {
- $data = request()->all();
- // 图片处理
- if (isset($data['logo'])) {
- $data['logo'] = get_image_path($data['logo']);
- }
- if (empty($data['name'])) {
- return message('请填写店铺名称', false);
- }
- if (empty($data['address'])) {
- $data['address'] = '';
- }
- return parent::edit($data);
- }
- /**
- * 审核商家
- * @param int $userId 操作人ID
- * @param array $params 审核参数
- * @return array
- */
- public function confirm($userId, $params)
- {
- $id = isset($params['id']) ? intval($params['id']) : 0;
- $status = isset($params['status']) ? intval($params['status']) : 0;
- $remark = isset($params['remark']) ? trim($params['remark']) : '';
- if (!$id) {
- $this->error = '商家ID不能为空';
- return false;
- }
- $info = $this->model->where(['id' => $id, 'mark' => 1])->first();
- if (!$info) {
- $this->error = '商家信息不存在';
- return false;
- }
- // 审核通过
- if ($status == 1) {
- // 使用事务确保数据一致性
- DB::beginTransaction();
- try {
- // 生成随机密码(8位数字字母组合)
- $password = $this->generatePassword();
-
- // 生成管理账号用户名(使用商家手机号或店铺名称拼音)
- $username = $this->generateUsername($info);
-
- // 检查用户名是否已存在
- $existingUser = UserModel::where('username', $username)
- ->where('mark', 1)
- ->first();
-
- if ($existingUser) {
- // 如果用户名已存在,添加随机后缀
- $username = $username . mt_rand(100, 999);
- }
-
- // 创建管理账户
- $adminUserId = 0;
- if ($info->user_id > 0) {
- // 如果商家已关联用户,更新用户信息
- $adminUserId = $info->user_id;
- UserModel::where('id', $info->user_id)->update([
- 'username' => $username,
- 'password' => get_password($password . $username),
- 'realname' => $info->real_name,
- 'mobile' => $info->phone,
- 'status' => 1,
- 'update_user' => $userId,
- 'update_time' => time()
- ]);
- } else {
- // 创建新的管理账户
- $userData = [
- 'user_id' => $info->user_id, // 绑定商户用户ID(member表的ID)
- 'username' => $username,
- 'password' => get_password($password . $username),
- 'realname' => $info->real_name,
- 'mobile' => $info->phone,
- 'status' => 1,
- 'create_user' => $userId,
- 'create_time' => time(),
- 'update_user' => $userId,
- 'update_time' => time(),
- 'mark' => 1
- ];
-
- $adminUserId = UserModel::insertGetId($userData);
-
- // 更新商家表的user_id字段
- $info->user_id = $adminUserId;
- }
-
- // 删除已存在的用户角色关系
- \App\Models\UserRoleModel::where('user_id', $adminUserId)->delete();
-
- // 创建用户角色关系(role_id = 6)
- \App\Models\UserRoleModel::insert([
- 'user_id' => $adminUserId,
- 'role_id' => 6
- ]);
-
- // 更新商家状态为已审核
- $updateData = [
- 'status' => 1,
- 'user_id' => $adminUserId,
- 'confirm_remark' => $remark ?: '审核通过',
- 'update_time' => time()
- ];
-
- $this->model->where('id', $id)->update($updateData);
-
- DB::commit();
-
- $this->error = '审核通过,管理账号:' . $username . ',密码:' . $password;
- return true;
- } catch (\Exception $e) {
- DB::rollBack();
- $this->error = '审核失败:' . $e->getMessage();
- return false;
- }
- }
- // 审核驳回
- elseif ($status == 3) {
- if (empty($remark)) {
- $this->error = '驳回理由不能为空';
- return false;
- }
- $this->model->where('id', $id)->update([
- 'status' => 3,
- 'confirm_remark' => $remark,
- 'update_time' => time()
- ]);
- $this->error = '审核驳回成功';
- return true;
- } else {
- $this->error = '审核状态参数错误';
- return false;
- }
- }
- /**
- * 生成随机密码
- * @param int $length 密码长度
- * @return string
- */
- private function generatePassword($length = 8)
- {
- $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
- $password = '';
- for ($i = 0; $i < $length; $i++) {
- $password .= $chars[mt_rand(0, strlen($chars) - 1)];
- }
- return $password;
- }
- /**
- * 生成管理账号用户名
- * @param object $storeInfo 商家信息
- * @return string
- */
- private function generateUsername($storeInfo)
- {
- // 优先使用手机号作为用户名
- if (!empty($storeInfo->phone)) {
- return $storeInfo->phone;
- }
-
- // 如果没有手机号,使用店铺名称 + 随机数
- if (!empty($storeInfo->name)) {
- // 移除特殊字符,只保留字母数字
- $name = preg_replace('/[^a-zA-Z0-9]/', '', $storeInfo->name);
- if (strlen($name) > 20) {
- $name = substr($name, 0, 20);
- }
- return $name . mt_rand(1000, 9999);
- }
-
- // 如果都没有,生成随机用户名
- return 'store_' . mt_rand(100000, 999999);
- }
- /**
- * 获取当前登录商家信息
- * @return array
- */
- public function getCurrentStoreInfo($storeId)
- {
- try {
- // 查询商家信息
- $store = StoreModel::where('id', $storeId)
- ->where('mark', 1)
- ->with(['member'])
- ->first();
- if (!$store) {
- return ['code' => 1, 'msg' => '商家信息不存在'];
- }
- // 检查商家状态
- if ($store->status !== 1) {
- return ['code' => 1, 'msg' => '商家已被禁用'];
- }
- // 获取会员信息
- $member = MemberModel::find($store->user_id);
- if (!$member) {
- return ['code' => 1, 'msg' => '商家关联的会员信息不存在'];
- }
- $data = [
- 'user_id' => $store->user_id,
- 'name' => $store->name,
- 'real_name' => $store->real_name,
- 'phone' => $store->phone,
- 'balance' => $member->balance,
- 'status' => $store->status
- ];
- return ['code' => 0, 'msg' => '获取成功', 'data' => $data];
- } catch (\Exception $e) {
- return ['code' => 1, 'msg' => '获取失败:' . $e->getMessage()];
- }
- }
- /**
- * 获取商家详情(重写父类方法)
- * @return array
- */
- public function info()
- {
- // 记录ID
- $id = request()->input("id", 0);
- $info = [];
- if ($id) {
- // 获取商家基本信息(使用关联查询)
- $store = $this->model->with(['user', 'member', 'category'])
- ->where(['id' => $id, 'mark' => 1])
- ->first();
- if ($store) {
- $info = $store->toArray();
- // 处理图片
- if (isset($info['logo'])) {
- $info['logo'] = get_image_url($info['logo']);
- }
- if (isset($info['business_license'])) {
- $info['business_license'] = get_image_url($info['business_license']);
- }
- if (isset($info['other_photo'])) {
- $info['other_photo'] = get_image_url($info['other_photo']);
- }
- // 处理时间
- if (isset($info['create_time'])) {
- $info['create_time'] = $info['create_time'] ? datetime($info['create_time'], 'Y-m-d H:i:s') : '';
- }
- if (isset($info['update_time'])) {
- $info['update_time'] = $info['update_time'] ? datetime($info['update_time'], 'Y-m-d H:i:s') : '';
- }
- // 获取分类信息
- if (isset($info['category']) && !empty($info['category'])) {
- $info['category_name'] = $info['category']['name'] ?? '未分类';
- $info['category_status'] = $info['category']['status'] ?? 1;
- } else {
- $info['category_name'] = '未分类';
- $info['category_status'] = 1;
- }
- // 获取用户信息(user表)
- if (isset($info['user']) && !empty($info['user'])) {
- $info['user_realname'] = $info['user']['realname'] ?? '';
- $info['user_nickname'] = $info['user']['nickname'] ?? '';
- $info['user_status'] = $info['user']['status'] ?? 1;
- } else {
- $info['user_realname'] = '';
- $info['user_nickname'] = '';
- $info['user_status'] = 1;
- }
- // 获取会员信息(member表)
- if (isset($info['member']) && !empty($info['member'])) {
- $info['member_realname'] = $info['member']['realname'] ?? '';
- $info['member_nickname'] = $info['member']['nickname'] ?? '';
- $info['member_mobile'] = $info['member']['mobile'] ?? '';
- $info['member_status'] = $info['member']['status'] ?? 1;
- } else {
- $info['member_realname'] = '';
- $info['member_nickname'] = '';
- $info['member_mobile'] = '';
- $info['member_status'] = 1;
- }
- // 添加状态文本
- $info['status_text'] = $this->getStatusText($info['status'] ?? 0);
- }
- }
- return message(MESSAGE_OK, true, $info);
- }
- /**
- * 设置状态(禁用/启用)
- * @param array $params
- * @return array
- */
- public function setStatus($params)
- {
- $id = isset($params['id']) ? intval($params['id']) : 0;
- $status = isset($params['status']) ? intval($params['status']) : 0;
- if (!$id) {
- $this->error = '商家ID不能为空';
- return false;
- }
- // status: 1-启用, 0-禁用
- // user表: status 1-正常 2-禁用
- // member表: status 1-正常 2-冻结(不可登录)
- $info = $this->model->where(['id' => $id, 'mark' => 1])->first();
- if (!$info) {
- $this->error = '商家信息不存在';
- return false;
- }
- // 如果商家关联了用户,同时禁用/启用用户和会员
- if ($info->user_id > 0) {
- // 转换状态:前端传入 1-启用 0-禁用
- // user表需要:1-正常 2-禁用
- // member表需要:1-正常 2-冻结
- $userStatus = $status == 1 ? 1 : 2;
- $memberStatus = $status == 1 ? 1 : 2;
- // 使用事务确保数据一致性
- DB::beginTransaction();
- try {
- // 更新 user 表状态(stores.user_id = user.id)
- UserModel::where('id', $info->user_id)->update([
- 'status' => $userStatus,
- 'update_time' => time()
- ]);
- // 更新 member 表状态(user.id = member.id)
- MemberModel::where('id', $info->user_id)->update([
- 'status' => $memberStatus,
- 'update_time' => time()
- ]);
- DB::commit();
- } catch (\Exception $e) {
- DB::rollBack();
- $this->error = '操作失败:' . $e->getMessage();
- return false;
- }
- }
- $this->error = $status == 1 ? '启用成功' : '禁用成功';
- return true;
- }
- /**
- * 获取店铺选项列表(用于下拉选择)
- * @return array
- */
- public function options()
- {
- $list = $this->model
- ->where('mark', 1)
- ->where('status', 1) // 只返回启用状态的店铺
- ->orderBy('sort', 'desc')
- ->orderBy('id', 'asc')
- ->select(['id', 'name', 'user_id'])
- ->get()
- ->toArray();
- return $list;
- }
- }
|