// +---------------------------------------------------------------------- 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; use Illuminate\Support\Facades\Log; /** * 商家店铺管理-服务类 * @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'] = ''; } $result = parent::edit($data); // 编辑成功后清除商家缓存 if ($result['code'] == 0) { RedisService::keyDel("caches:storeId:id*"); } return $result; } /** * 审核商家 * @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; } $storesModel = $this->model->where(['id' => $id, 'mark' => 1])->first(); if (!$storesModel) { $this->error = '商家信息不存在'; return false; } // 审核通过 if ($status == 1) { // 使用事务确保数据一致性 DB::beginTransaction(); try { // 密码使用手机号后6位 $password = substr($storesModel->phone, -6); // 使用商家手机号作为管理账号用户名 $username = $this->generateUsername($storesModel); // 保存原始的member ID(shop.user_id应该指向member.id) $memberId = $storesModel->user_id; // 检查是否已存在相同手机号的管理员账号 $existingUser = UserModel::where('mobile', $storesModel->phone) ->where('mark', 1) ->first(); if ($existingUser) { // 如果存在相同手机号的账号,更新该账号 $adminUserId = $existingUser->id; UserModel::where('id', $adminUserId)->update([ 'user_id' => $memberId, // 确保user.user_id指向member.id 'username' => $username, 'password' => get_password($password . $username), 'realname' => $storesModel->real_name, 'mobile' => $storesModel->phone, 'status' => 1, 'update_user' => $userId, 'update_time' => time() ]); } else { // 创建新的管理账户 $userData = [ 'user_id' => $memberId, // 绑定会员ID(member表的ID) 'username' => $username, 'nickname' => $username, 'password' => get_password($password . $username), 'realname' => $storesModel->real_name, 'mobile' => $storesModel->phone, 'status' => 1, 'create_user' => $userId, 'create_time' => time(), 'update_user' => $userId, 'update_time' => time(), 'mark' => 1 ]; $adminUserId = UserModel::insertGetId($userData); } // 删除已存在的用户角色关系 DB::table('user_role')->where('user_id', $adminUserId)->delete(); // 创建用户角色关系(role_id = 6,商家角色) DB::table('user_role')->insert([ 'user_id' => $adminUserId, 'role_id' => 6 ]); // 更新商家状态为已审核,保持user_id为member ID $updateData = [ 'status' => 1, 'user_id' => $memberId, // 保持shop.user_id指向member.id 'confirm_remark' => $remark ?: '审核通过', 'update_time' => time() ]; $this->model->where('id', $id)->update($updateData); // 清除商家缓存 RedisService::keyDel("caches:storeId:id*"); DB::commit(); $this->error = '审核通过,管理账号:' . $username . ',密码:' . $password; return true; } catch (\Exception $e) { DB::rollBack(); Log::error('商家审核失败,创建管理员账号出错:' . $e->getMessage(), [ 'store_id' => $id, 'store_name' => $storesModel->name, 'phone' => $storesModel->phone, 'exception' => $e->getTraceAsString() ]); $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) { // 直接使用手机号作为用户名 return $storeInfo->phone; } /** * 获取当前登录商家信息 * @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' => '商家已被禁用']; } $data = [ 'user_id' => $store->user_id, 'name' => $store->name, 'real_name' => $store->real_name, 'phone' => $store->phone, 'balance' => $store->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 表状态(通过 user.user_id = shop.user_id 查找) UserModel::where('user_id', $info->user_id)->update([ 'status' => $userStatus, 'update_time' => time() ]); // 更新 member 表状态(通过 member.id = shop.user_id 查找) MemberModel::where('id', $info->user_id)->update([ 'status' => $memberStatus, 'update_time' => time() ]); // 清除商家缓存 RedisService::keyDel("caches:storeId:id*"); 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; } /** * 删除商家(重写父类方法以清除缓存) * @return array */ public function delete() { $result = parent::delete(); // 删除成功后清除商家缓存 if ($result['code'] == 0) { RedisService::keyDel("caches:storeId:id*"); } return $result; } }