model = EnterpriseModel::class; $this->selectField = [ 'id', 'name', 'logo', 'contact_name', 'phone', 'address', 'tax_no', 'settle_type', 'price_number', 'status', 'remark', 'created_at', 'updated_at', ]; $this->queryField = [ 'name' => 'like', 'contact_name' => 'like', 'phone' => 'like', 'status' => '=', ]; $this->media = MediaUrlService::getInstance(); } /** * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function list(): array { $result = $this->getPageList(); $ids = array_column($result['items'], 'id'); $counts = empty($ids) ? [] : WxUserModel::whereIn('enterprise_id', $ids) ->where('deleted_at', 0) ->selectRaw('enterprise_id, COUNT(*) as total') ->groupBy('enterprise_id') ->pluck('total', 'enterprise_id') ->all(); foreach ($result['items'] as &$item) { $item['logo'] = $this->media->toPublic($item['logo'] ?? ''); $item['user_count'] = (int) ($counts[$item['id']] ?? 0); } unset($item); return $result; } /** * 下拉:SearchSelect 组件按关键词模糊搜索,所以支持 keyword 入参 */ public function option(): mixed { $keyword = trim((string) request()->get('keyword', '')); $limit = (int) request()->get('limit', 30); $limit = $limit > 0 && $limit <= 100 ? $limit : 30; return EnterpriseModel::where('deleted_at', 0) ->where('status', 0) ->when($keyword !== '', function ($q) use ($keyword) { $q->where(function ($sub) use ($keyword) { $sub->where('name', 'like', "%{$keyword}%") ->orWhere('contact_name', 'like', "%{$keyword}%") ->orWhere('phone', 'like', "%{$keyword}%"); }); }) ->orderBy('id', 'desc') ->limit($limit) ->get(['id', 'name', 'logo', 'contact_name', 'phone', 'price_number']) ->map(function ($row) { $row->logo = $this->media->toPublic($row->logo); return $row; }); } /** * 详情:带企业下的微信用户 * @throws Exception */ public function detail($id): mixed { $info = $this->getDetail($id); $info->logo = $this->media->toPublic($info->logo); $info->users = WxUserModel::where('enterprise_id', $id) ->where('deleted_at', 0) ->orderBy('id', 'desc') ->get(['id', 'nick_name', 'phone', 'is_p', 'show_price', 'price_number', 'created_at']) ->toArray(); $info->user_count = count($info->users); return $info; } public function create($params): mixed { $params = $this->normalize($params); return $this->insert($params); } /** * @throws Exception */ public function update($id, $params): mixed { $params = $this->normalize($params); return $this->save($id, $params); } /** * 删除企业前先解绑用户,否则用户会挂在一个查不到的企业上 * @throws Exception */ public function delete($id): mixed { $ids = array_values(array_filter(array_map('intval', is_array($id) ? $id : [$id]))); if (empty($ids)) { $this->utils->errorThrow('参数错误'); } if (WxUserModel::whereIn('enterprise_id', $ids)->where('deleted_at', 0)->exists()) { $this->utils->errorThrow('该企业下仍有微信用户,请先解绑用户'); } return $this->del($ids); } /** * @throws Exception */ public function status($id, $status): mixed { return $this->save($id, ['status' => (int) $status]); } private function normalize(array $params): array { if (array_key_exists('logo', $params)) { $params['logo'] = $this->media->firstOf($params['logo']); } if (array_key_exists('price_number', $params)) { $number = $params['price_number']; $params['price_number'] = !is_numeric($number) || (float) $number <= 0 ? '1' : (string) $number; } return $params; } }