query() ->field($this->fields()) ->limit($this->limitOffset, $this->limitLength) ->order('l.id', 'desc') ->select() ->toArray(); foreach ($rows as &$row) { foreach ([ 'local_medicine_id', 'local_status', 'mapping_id', 'mapping_status', 'operator_id', 'mapping_update_time', 'catalog_version', 'remote_status', 'remote_deleted', ] as $field) { if ($row[$field] !== null) { $row[$field] = (int) $row[$field]; } } } unset($row); return $rows; } public function count(): int { return (int) $this->query()->count('l.id'); } private function query() { $query = Db::name('doctor_medicine')->alias('l') ->leftJoin( 'ej_medicine_mapping m', 'm.local_medicine_id = l.id AND m.status = 1 AND m.delete_time IS NULL' ) ->leftJoin('ej_medicine_catalog c', 'c.medicine_code = m.medicine_code') ->whereNull('l.delete_time'); $localName = trim((string) ($this->params['local_name'] ?? '')); if ($localName !== '') { $query->where('l.name', 'like', '%' . $localName . '%'); } $remoteKeyword = trim((string) ($this->params['remote_keyword'] ?? '')); if ($remoteKeyword !== '') { $query->where(function ($nested) use ($remoteKeyword): void { $nested->where('c.name', 'like', '%' . $remoteKeyword . '%') ->whereOr('c.medicine_code', 'like', '%' . $remoteKeyword . '%'); }); } $mappingStatus = trim((string) ($this->params['mapping_status'] ?? '')); if ($mappingStatus === 'mapped') { $query->whereNotNull('m.id')->where('c.status', 1)->where('c.remote_deleted', 0); } elseif ($mappingStatus === 'unmapped') { $query->whereNull('m.id'); } elseif ($mappingStatus === 'invalid') { $query->whereNotNull('m.id') ->where(function ($nested): void { $nested->whereNull('c.id') ->whereOr('c.status', '<>', 1) ->whereOr('c.remote_deleted', 1); }); } return $query; } private function fields(): string { return implode(',', [ 'l.id AS local_medicine_id', 'l.name AS local_name', 'l.unit AS local_unit', 'l.status AS local_status', 'm.id AS mapping_id', 'm.medicine_code', 'm.operator_id', 'm.operator_name', 'm.update_time AS mapping_update_time', 'c.name AS remote_name', 'c.brand AS remote_brand', 'c.unit AS remote_unit', 'c.settlement_price', 'c.retail_price', 'c.catalog_version', 'c.status AS remote_status', 'c.remote_deleted', "CASE WHEN m.id IS NULL THEN 0 " . "WHEN c.id IS NULL OR c.status <> 1 OR c.remote_deleted = 1 THEN 2 ELSE 1 END AS mapping_status", ]); } }