--- a/application/api/service/Card.php +++ b/application/api/service/Card.php @@ -91,6 +91,8 @@ ->toArray(); if (!empty($paginator['data'])) { foreach ($paginator['data'] as $key => $item) { + $item = $this->normalizeCardListResponseRow($item); + $paginator['data'][$key] = $item; $staffDepartments = Db::name('staff_department')->alias('sd') ->join('department d', 'd.uuid = sd.department_uuid') ->where('sd.staff_uuid', $item['staff_uuid']) @@ -541,11 +543,50 @@ ->toArray(); if (!empty($paginator['data'])) { foreach ($paginator['data'] as $key => $item) { + $item = $this->normalizeCardLogResponseRow($item); + $paginator['data'][$key] = $item; $paginator['data'][$key]['operateTypeDesc'] = $this->getOperateDesc(intval($item['operate_type'])); } } return $paginator; + } + + /** Preserve the proven MySQL IFNULL(uint8,5) text and DATETIME(0) list contract. */ + private function normalizeCardListResponseRow(array $row): array + { + if (ltrim((string)\think\Config::get('database.type'), '\\') !== \app\cores\database\Dm::class) { + return $row; + } + if (isset($row['card_status']) && is_int($row['card_status']) + && $row['card_status'] >= 0 && $row['card_status'] <= 255) { + $row['card_status'] = (string)$row['card_status']; + } + if (array_key_exists('issue_time', $row)) { + $row['issue_time'] = $this->normalizeCardResponseDateTime($row['issue_time']); + } + return $row; + } + + private function normalizeCardLogResponseRow(array $row): array + { + if (ltrim((string)\think\Config::get('database.type'), '\\') === \app\cores\database\Dm::class + && array_key_exists('operate_time', $row)) { + $row['operate_time'] = $this->normalizeCardResponseDateTime($row['operate_time']); + } + return $row; + } + + /** Only valid MySQL-second timestamps with an all-zero DM fractional suffix. */ + private function normalizeCardResponseDateTime($value) + { + if (is_string($value) + && preg_match('/^((\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}))\.0{1,6}$/D', $value, $match) + && (int)$match[2] >= 1000 && checkdate((int)$match[3], (int)$match[4], (int)$match[2]) + && (int)$match[5] <= 23 && (int)$match[6] <= 59 && (int)$match[7] <= 59) { + return $match[1]; + } + return $value; } /**