Keep test definition responses focused on core fields and update test-map OpenAPI contracts/tests to match the new mapping flow.
8419 lines
233 KiB
YAML
8419 lines
233 KiB
YAML
openapi: 3.1.0
|
|
info:
|
|
title: CLQMS - Clinical Laboratory Quality Management System API
|
|
description: |
|
|
API for Clinical Laboratory Quality Management System supporting patient management,
|
|
specimen tracking, test ordering, instrument integration, and laboratory operations.
|
|
|
|
**IMPORTANT:** For OpenAPI tools (Swagger UI, Redoc, Postman, etc.), use the bundled file:
|
|
`api-docs.bundled.yaml` which contains all paths and schemas merged into one file.
|
|
|
|
This file (api-docs.yaml) contains schema references and is meant for development.
|
|
The paths are defined in separate files in the `paths/` directory.
|
|
version: 1.0.0
|
|
contact:
|
|
name: CLQMS API Support
|
|
license:
|
|
name: Proprietary
|
|
servers:
|
|
- url: http://localhost/clqms01/
|
|
description: Local development server
|
|
- url: https://clqms01-api.services-summit.my.id/
|
|
description: Production server
|
|
tags:
|
|
- name: Authentication
|
|
description: User authentication and session management
|
|
- name: Patient
|
|
description: Patient registration and management
|
|
- name: Patient Visit
|
|
description: Patient visit/encounter management
|
|
- name: Organization
|
|
description: Organization structure (accounts, sites, disciplines, departments, workstations)
|
|
- name: Location
|
|
description: Location management (rooms, wards, buildings)
|
|
- name: Equipment
|
|
description: Laboratory equipment and instrument management
|
|
- name: Specimen
|
|
description: Specimen and container management
|
|
- name: Test
|
|
description: Test definitions and test catalog
|
|
- name: Rule
|
|
description: Rule engine - rules can be linked to multiple tests via testrule mapping table
|
|
- name: Calculation
|
|
description: Lightweight calculator endpoint for retrieving computed values by code or name
|
|
- name: Order
|
|
description: Laboratory order management
|
|
- name: Result
|
|
description: Patient results reporting with auto-validation
|
|
- name: Report
|
|
description: Lab report generation (HTML view)
|
|
- name: Edge API
|
|
description: Instrument integration endpoints
|
|
- name: Contact
|
|
description: Contact management (doctors, practitioners, etc.)
|
|
- name: ValueSet
|
|
description: Value set definitions and items
|
|
- name: User
|
|
description: User management and administration
|
|
- name: Demo
|
|
description: Demo/test endpoints (no authentication)
|
|
- name: Audit
|
|
description: Audit log retrieval and filtering
|
|
paths:
|
|
/api/audit-logs:
|
|
get:
|
|
tags:
|
|
- Audit
|
|
summary: Retrieve audit log entries for a table
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: table
|
|
in: query
|
|
required: true
|
|
schema:
|
|
type: string
|
|
description: Table alias for the audit data (logpatient, logorder, logmaster, logsystem)
|
|
- name: rec_id
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Primary record identifier (RecID) to filter audit rows
|
|
- name: event_id
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Canonical EventID (case insensitive)
|
|
- name: activity_id
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Canonical ActivityID (case insensitive)
|
|
- name: from
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
description: Lower bound for LogDate inclusive
|
|
- name: to
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
description: Upper bound for LogDate inclusive
|
|
- name: search
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Search term that matches user, reason, field names, or values
|
|
- name: page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 1
|
|
description: Page number
|
|
- name: perPage
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 20
|
|
description: Items per page (max 100)
|
|
responses:
|
|
'200':
|
|
description: Audit log results
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AuditLogsEnvelope'
|
|
'400':
|
|
description: Validation failure (missing table or invalid filters)
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AuditLogsErrorResponse'
|
|
'500':
|
|
description: Internal error when retrieving audit logs
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AuditLogsErrorResponse'
|
|
/api/auth/login:
|
|
post:
|
|
tags:
|
|
- Authentication
|
|
summary: User login
|
|
description: Authenticate user and receive JWT token via HTTP-only cookie
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginRequest'
|
|
responses:
|
|
'200':
|
|
description: Login successful
|
|
headers:
|
|
Set-Cookie:
|
|
description: JWT token in HTTP-only cookie
|
|
schema:
|
|
type: string
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginResponse'
|
|
'400':
|
|
description: Missing username
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
'401':
|
|
description: Invalid credentials
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
/api/auth/logout:
|
|
post:
|
|
tags:
|
|
- Authentication
|
|
summary: User logout
|
|
description: Clear JWT token cookie
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: Logout successful
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
/api/auth/check:
|
|
get:
|
|
tags:
|
|
- Authentication
|
|
summary: Check authentication status
|
|
security:
|
|
- bearerAuth: []
|
|
- cookieAuth: []
|
|
responses:
|
|
'200':
|
|
description: Authenticated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
authenticated:
|
|
type: boolean
|
|
user:
|
|
type: object
|
|
'401':
|
|
description: Not authenticated
|
|
/api/auth/register:
|
|
post:
|
|
tags:
|
|
- Authentication
|
|
summary: Register new user
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RegisterRequest'
|
|
responses:
|
|
'201':
|
|
description: User created
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
/api/auth/change_pass:
|
|
post:
|
|
tags:
|
|
- Authentication
|
|
summary: Change password
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- current_password
|
|
- new_password
|
|
properties:
|
|
current_password:
|
|
type: string
|
|
format: password
|
|
new_password:
|
|
type: string
|
|
format: password
|
|
responses:
|
|
'200':
|
|
description: Password changed successfully
|
|
/v2/auth/login:
|
|
post:
|
|
tags:
|
|
- Authentication
|
|
summary: V2 User login
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginRequest'
|
|
responses:
|
|
'200':
|
|
description: Login successful
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginResponse'
|
|
/v2/auth/logout:
|
|
post:
|
|
tags:
|
|
- Authentication
|
|
summary: V2 User logout
|
|
responses:
|
|
'200':
|
|
description: Logout successful
|
|
/v2/auth/check:
|
|
get:
|
|
tags:
|
|
- Authentication
|
|
summary: V2 Check authentication
|
|
responses:
|
|
'200':
|
|
description: Auth check result
|
|
/v2/auth/register:
|
|
post:
|
|
tags:
|
|
- Authentication
|
|
summary: V2 Register new user
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RegisterRequest'
|
|
responses:
|
|
'201':
|
|
description: User created
|
|
/api/calc/testcode/{codeOrName}:
|
|
post:
|
|
tags:
|
|
- Calculation
|
|
summary: Evaluate a configured calculation by test code or name and return the raw result map.
|
|
security: []
|
|
parameters:
|
|
- name: codeOrName
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
description: TestSiteCode or TestSiteName of the calculated test (case-insensitive).
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
description: Key-value pairs where keys match member tests used in the formula.
|
|
additionalProperties:
|
|
type: number
|
|
example:
|
|
TBIL: 5
|
|
DBIL: 3
|
|
responses:
|
|
'200':
|
|
description: Returns a single key/value pair with the canonical TestSiteCode or an empty object when the calculation is incomplete or missing.
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
examples:
|
|
success:
|
|
value:
|
|
IBIL: 2
|
|
incomplete:
|
|
value: {}
|
|
/api/calc/testsite/{testSiteID}:
|
|
post:
|
|
tags:
|
|
- Calculation
|
|
summary: Evaluate a calculation defined for a test site and return a structured result.
|
|
security: []
|
|
parameters:
|
|
- name: testSiteID
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Identifier for the test site whose definition should be evaluated.
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
description: Variable assignments required by the test site formula.
|
|
additionalProperties:
|
|
type: number
|
|
example:
|
|
result: 85
|
|
gender: female
|
|
age: 30
|
|
responses:
|
|
'200':
|
|
description: Returns the calculated result, testSiteID, formula code, and echoed variables.
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
data:
|
|
type: object
|
|
properties:
|
|
result:
|
|
type: number
|
|
testSiteID:
|
|
type: integer
|
|
formula:
|
|
type: string
|
|
variables:
|
|
type: object
|
|
additionalProperties:
|
|
type: number
|
|
examples:
|
|
success:
|
|
value:
|
|
status: success
|
|
data:
|
|
result: 92.4
|
|
testSiteID: 123
|
|
formula: '{result} * {factor} + {age}'
|
|
variables:
|
|
result: 85
|
|
gender: female
|
|
age: 30
|
|
'404':
|
|
description: No calculation defined for the requested test site.
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: failed
|
|
message:
|
|
type: string
|
|
example: No calculation defined for this test site
|
|
/api/contact:
|
|
get:
|
|
tags:
|
|
- Contact
|
|
summary: List contacts
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: ContactName
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by contact name (searches in NameFirst and NameLast)
|
|
- name: Specialty
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by medical specialty code
|
|
responses:
|
|
'200':
|
|
description: List of contacts
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Contact'
|
|
post:
|
|
tags:
|
|
- Contact
|
|
summary: Create new contact
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- NameFirst
|
|
properties:
|
|
NameFirst:
|
|
type: string
|
|
description: First name
|
|
NameLast:
|
|
type: string
|
|
description: Last name
|
|
Title:
|
|
type: string
|
|
description: Title (e.g., Dr, Mr, Mrs)
|
|
Initial:
|
|
type: string
|
|
description: Middle initial
|
|
Birthdate:
|
|
type: string
|
|
format: date-time
|
|
description: Date of birth
|
|
EmailAddress1:
|
|
type: string
|
|
format: email
|
|
description: Primary email address
|
|
EmailAddress2:
|
|
type: string
|
|
format: email
|
|
description: Secondary email address
|
|
Phone:
|
|
type: string
|
|
description: Primary phone number
|
|
MobilePhone1:
|
|
type: string
|
|
description: Primary mobile number
|
|
MobilePhone2:
|
|
type: string
|
|
description: Secondary mobile number
|
|
Specialty:
|
|
type: string
|
|
description: Medical specialty code
|
|
SubSpecialty:
|
|
type: string
|
|
description: Sub-specialty code
|
|
responses:
|
|
'201':
|
|
description: Contact created successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
'422':
|
|
description: Validation error
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
delete:
|
|
tags:
|
|
- Contact
|
|
summary: Delete contact
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- ContactID
|
|
properties:
|
|
ContactID:
|
|
type: integer
|
|
description: Contact ID to delete
|
|
responses:
|
|
'200':
|
|
description: Contact deleted successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
/api/contact/{id}:
|
|
get:
|
|
tags:
|
|
- Contact
|
|
summary: Get contact by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Contact ID
|
|
responses:
|
|
'200':
|
|
description: Contact details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/Contact'
|
|
patch:
|
|
tags:
|
|
- Contact
|
|
summary: Update contact
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Contact ID to update
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- NameFirst
|
|
properties:
|
|
NameFirst:
|
|
type: string
|
|
description: First name
|
|
NameLast:
|
|
type: string
|
|
description: Last name
|
|
Title:
|
|
type: string
|
|
description: Title (e.g., Dr, Mr, Mrs)
|
|
Initial:
|
|
type: string
|
|
description: Middle initial
|
|
Birthdate:
|
|
type: string
|
|
format: date-time
|
|
description: Date of birth
|
|
EmailAddress1:
|
|
type: string
|
|
format: email
|
|
description: Primary email address
|
|
EmailAddress2:
|
|
type: string
|
|
format: email
|
|
description: Secondary email address
|
|
Phone:
|
|
type: string
|
|
description: Primary phone number
|
|
MobilePhone1:
|
|
type: string
|
|
description: Primary mobile number
|
|
MobilePhone2:
|
|
type: string
|
|
description: Secondary mobile number
|
|
Specialty:
|
|
type: string
|
|
description: Medical specialty code
|
|
SubSpecialty:
|
|
type: string
|
|
description: Sub-specialty code
|
|
responses:
|
|
'201':
|
|
description: Contact updated successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
'422':
|
|
description: Validation error
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
/api/demo/hello:
|
|
get:
|
|
tags:
|
|
- Demo
|
|
summary: Hello world endpoint
|
|
description: Simple test endpoint that returns a greeting message
|
|
responses:
|
|
'200':
|
|
description: Successful response
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: Hello, World!
|
|
/api/demo/ping:
|
|
get:
|
|
tags:
|
|
- Demo
|
|
summary: Ping endpoint
|
|
description: Health check endpoint to verify API is running
|
|
responses:
|
|
'200':
|
|
description: API is running
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: pong
|
|
timestamp:
|
|
type: string
|
|
format: date-time
|
|
/api/edge/result:
|
|
post:
|
|
tags:
|
|
- Edge API
|
|
summary: Receive results from instrument (tiny-edge)
|
|
description: |
|
|
Receives instrument results and stores them in the edgeres table for processing.
|
|
This endpoint is typically called by the tiny-edge middleware connected to laboratory analyzers.
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EdgeResultRequest'
|
|
responses:
|
|
'201':
|
|
description: Result received and queued
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/EdgeResultResponse'
|
|
'400':
|
|
description: Invalid JSON payload
|
|
/api/edge/order:
|
|
get:
|
|
tags:
|
|
- Edge API
|
|
summary: Fetch pending orders for instruments
|
|
description: Returns orders that need to be sent to laboratory instruments for testing
|
|
parameters:
|
|
- name: instrument_id
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by instrument
|
|
- name: status
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum:
|
|
- pending
|
|
- acknowledged
|
|
description: Filter by status
|
|
responses:
|
|
'200':
|
|
description: List of orders
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/EdgeOrder'
|
|
/api/edge/order/{orderId}/ack:
|
|
post:
|
|
tags:
|
|
- Edge API
|
|
summary: Acknowledge order delivery
|
|
description: Mark order as acknowledged by the instrument
|
|
parameters:
|
|
- name: orderId
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Edge order ID
|
|
responses:
|
|
'200':
|
|
description: Order acknowledged
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
/api/edge/status:
|
|
post:
|
|
tags:
|
|
- Edge API
|
|
summary: Log instrument status update
|
|
description: Receive status updates from laboratory instruments
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- instrument_id
|
|
- status
|
|
properties:
|
|
instrument_id:
|
|
type: string
|
|
status:
|
|
type: string
|
|
enum:
|
|
- online
|
|
- offline
|
|
- error
|
|
- maintenance
|
|
message:
|
|
type: string
|
|
timestamp:
|
|
type: string
|
|
format: date-time
|
|
responses:
|
|
'200':
|
|
description: Status logged
|
|
/api/equipmentlist:
|
|
get:
|
|
tags:
|
|
- Equipment
|
|
summary: List equipment
|
|
description: Get list of equipment with optional filters
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: IEID
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by IEID
|
|
- name: InstrumentName
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by instrument name
|
|
- name: DepartmentID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by department ID
|
|
- name: WorkstationID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by workstation ID
|
|
- name: Enable
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
enum:
|
|
- 0
|
|
- 1
|
|
description: Filter by enable status
|
|
responses:
|
|
'200':
|
|
description: List of equipment
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/EquipmentList'
|
|
post:
|
|
tags:
|
|
- Equipment
|
|
summary: Create equipment
|
|
description: Create a new equipment entry
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- IEID
|
|
- DepartmentID
|
|
- Enable
|
|
- EquipmentRole
|
|
properties:
|
|
IEID:
|
|
type: string
|
|
maxLength: 50
|
|
DepartmentID:
|
|
type: integer
|
|
InstrumentID:
|
|
type: string
|
|
maxLength: 150
|
|
InstrumentName:
|
|
type: string
|
|
maxLength: 150
|
|
WorkstationID:
|
|
type: integer
|
|
Enable:
|
|
type: integer
|
|
enum:
|
|
- 0
|
|
- 1
|
|
EquipmentRole:
|
|
type: string
|
|
maxLength: 1
|
|
responses:
|
|
'201':
|
|
description: Equipment created
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: integer
|
|
delete:
|
|
tags:
|
|
- Equipment
|
|
summary: Delete equipment
|
|
description: Soft delete an equipment entry
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- EID
|
|
properties:
|
|
EID:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Equipment deleted
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
/api/equipmentlist/{id}:
|
|
get:
|
|
tags:
|
|
- Equipment
|
|
summary: Get equipment by ID
|
|
description: Get a single equipment entry by its EID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Equipment ID
|
|
responses:
|
|
'200':
|
|
description: Equipment details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/EquipmentList'
|
|
patch:
|
|
tags:
|
|
- Equipment
|
|
summary: Update equipment
|
|
description: Update an existing equipment entry
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Equipment ID
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
IEID:
|
|
type: string
|
|
maxLength: 50
|
|
DepartmentID:
|
|
type: integer
|
|
InstrumentID:
|
|
type: string
|
|
maxLength: 150
|
|
InstrumentName:
|
|
type: string
|
|
maxLength: 150
|
|
WorkstationID:
|
|
type: integer
|
|
Enable:
|
|
type: integer
|
|
enum:
|
|
- 0
|
|
- 1
|
|
EquipmentRole:
|
|
type: string
|
|
maxLength: 1
|
|
responses:
|
|
'200':
|
|
description: Equipment updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: integer
|
|
/api/location:
|
|
get:
|
|
tags:
|
|
- Location
|
|
summary: List locations
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: LocCode
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by location code
|
|
- name: LocName
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by location name (searches in LocFull)
|
|
responses:
|
|
'200':
|
|
description: List of locations
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Location'
|
|
post:
|
|
tags:
|
|
- Location
|
|
summary: Create location
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- LocCode
|
|
- LocFull
|
|
properties:
|
|
SiteID:
|
|
type: integer
|
|
description: Reference to site
|
|
LocCode:
|
|
type: string
|
|
maxLength: 6
|
|
description: Location code (short identifier)
|
|
Parent:
|
|
type: integer
|
|
nullable: true
|
|
description: Parent location ID for hierarchical locations
|
|
LocFull:
|
|
type: string
|
|
maxLength: 255
|
|
description: Full location name
|
|
Description:
|
|
type: string
|
|
maxLength: 255
|
|
description: Location description
|
|
LocType:
|
|
type: string
|
|
description: Location type code (e.g., ROOM, WARD, BUILDING)
|
|
responses:
|
|
'201':
|
|
description: Location created successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
'422':
|
|
description: Validation error
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
delete:
|
|
tags:
|
|
- Location
|
|
summary: Delete location
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- LocationID
|
|
properties:
|
|
LocationID:
|
|
type: integer
|
|
description: Location ID to delete
|
|
responses:
|
|
'200':
|
|
description: Location deleted successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
/api/location/{id}:
|
|
get:
|
|
tags:
|
|
- Location
|
|
summary: Get location by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Location ID
|
|
responses:
|
|
'200':
|
|
description: Location details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/Location'
|
|
patch:
|
|
tags:
|
|
- Location
|
|
summary: Update location
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Location ID to update
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
SiteID:
|
|
type: integer
|
|
description: Reference to site
|
|
LocCode:
|
|
type: string
|
|
maxLength: 6
|
|
description: Location code (short identifier)
|
|
Parent:
|
|
type: integer
|
|
nullable: true
|
|
description: Parent location ID for hierarchical locations
|
|
LocFull:
|
|
type: string
|
|
maxLength: 255
|
|
description: Full location name
|
|
Description:
|
|
type: string
|
|
maxLength: 255
|
|
description: Location description
|
|
LocType:
|
|
type: string
|
|
description: Location type code (e.g., ROOM, WARD, BUILDING)
|
|
responses:
|
|
'201':
|
|
description: Location updated successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
'422':
|
|
description: Validation error
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
/api/ordertest:
|
|
get:
|
|
tags:
|
|
- Order
|
|
summary: List orders
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: perPage
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: InternalPID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by internal patient ID
|
|
- name: OrderStatus
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum:
|
|
- ORD
|
|
- SCH
|
|
- ANA
|
|
- VER
|
|
- REV
|
|
- REP
|
|
description: |
|
|
ORD: Ordered
|
|
SCH: Scheduled
|
|
ANA: Analysis
|
|
VER: Verified
|
|
REV: Reviewed
|
|
REP: Reported
|
|
responses:
|
|
'200':
|
|
description: List of orders
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/OrderTestList'
|
|
post:
|
|
tags:
|
|
- Order
|
|
summary: Create order with specimens and tests
|
|
description: Creates an order with associated specimens and patres records. Tests are grouped by container type to minimize specimen creation.
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- InternalPID
|
|
- Tests
|
|
properties:
|
|
OrderID:
|
|
type: string
|
|
description: Optional custom order ID (auto-generated if not provided)
|
|
InternalPID:
|
|
type: integer
|
|
description: Patient internal ID
|
|
PatVisitID:
|
|
type: integer
|
|
description: Visit ID
|
|
SiteID:
|
|
type: integer
|
|
default: 1
|
|
PlacerID:
|
|
type: string
|
|
Priority:
|
|
type: string
|
|
enum:
|
|
- R
|
|
- S
|
|
- U
|
|
default: R
|
|
description: |
|
|
R: Routine
|
|
S: Stat
|
|
U: Urgent
|
|
ReqApp:
|
|
type: string
|
|
description: Requesting application
|
|
Comment:
|
|
type: string
|
|
Tests:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required:
|
|
- TestSiteID
|
|
properties:
|
|
TestSiteID:
|
|
type: integer
|
|
description: Test definition site ID
|
|
TestID:
|
|
type: integer
|
|
description: Alias for TestSiteID
|
|
responses:
|
|
'201':
|
|
description: Order created successfully with specimens and tests
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/OrderTest'
|
|
'400':
|
|
description: Validation error
|
|
'500':
|
|
description: Server error
|
|
delete:
|
|
tags:
|
|
- Order
|
|
summary: Delete order
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- OrderID
|
|
properties:
|
|
OrderID:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Order deleted
|
|
/api/ordertest/status:
|
|
post:
|
|
tags:
|
|
- Order
|
|
summary: Update order status
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- OrderID
|
|
- OrderStatus
|
|
properties:
|
|
OrderID:
|
|
type: string
|
|
OrderStatus:
|
|
type: string
|
|
enum:
|
|
- ORD
|
|
- SCH
|
|
- ANA
|
|
- VER
|
|
- REV
|
|
- REP
|
|
description: |
|
|
ORD: Ordered
|
|
SCH: Scheduled
|
|
ANA: Analysis
|
|
VER: Verified
|
|
REV: Reviewed
|
|
REP: Reported
|
|
responses:
|
|
'200':
|
|
description: Order status updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/OrderTest'
|
|
/api/ordertest/{id}:
|
|
get:
|
|
tags:
|
|
- Order
|
|
summary: Get order by ID
|
|
description: Returns order details with associated specimens and tests
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
description: Order ID (e.g., 0025030300001)
|
|
responses:
|
|
'200':
|
|
description: Order details with specimens and tests
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/OrderTest'
|
|
patch:
|
|
tags:
|
|
- Order
|
|
summary: Update order
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
description: Order ID
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
Priority:
|
|
type: string
|
|
enum:
|
|
- R
|
|
- S
|
|
- U
|
|
OrderStatus:
|
|
type: string
|
|
enum:
|
|
- ORD
|
|
- SCH
|
|
- ANA
|
|
- VER
|
|
- REV
|
|
- REP
|
|
OrderingProvider:
|
|
type: string
|
|
DepartmentID:
|
|
type: integer
|
|
WorkstationID:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Order updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/OrderTest'
|
|
/api/organization/account/{id}:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: Get account by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Account details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Account'
|
|
/api/organization/site:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: List sites
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of sites
|
|
post:
|
|
tags:
|
|
- Organization
|
|
summary: Create site
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Site'
|
|
responses:
|
|
'201':
|
|
description: Site created
|
|
delete:
|
|
tags:
|
|
- Organization
|
|
summary: Delete site
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- id
|
|
properties:
|
|
id:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Site deleted
|
|
/api/organization/site/{id}:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: Get site by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Site details
|
|
patch:
|
|
tags:
|
|
- Organization
|
|
summary: Update site
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
SiteName:
|
|
type: string
|
|
SiteCode:
|
|
type: string
|
|
AccountID:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Site updated
|
|
/api/organization/discipline:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: List disciplines
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of disciplines
|
|
post:
|
|
tags:
|
|
- Organization
|
|
summary: Create discipline
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Discipline'
|
|
responses:
|
|
'201':
|
|
description: Discipline created
|
|
delete:
|
|
tags:
|
|
- Organization
|
|
summary: Delete discipline
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- id
|
|
properties:
|
|
id:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Discipline deleted
|
|
/api/organization/discipline/{id}:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: Get discipline by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Discipline details
|
|
patch:
|
|
tags:
|
|
- Organization
|
|
summary: Update discipline
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
DisciplineName:
|
|
type: string
|
|
DisciplineCode:
|
|
type: string
|
|
SeqScr:
|
|
type: integer
|
|
description: Display order on screen
|
|
SeqRpt:
|
|
type: integer
|
|
description: Display order in reports
|
|
responses:
|
|
'200':
|
|
description: Discipline updated
|
|
/api/organization/department:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: List departments
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of departments
|
|
post:
|
|
tags:
|
|
- Organization
|
|
summary: Create department
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Department'
|
|
responses:
|
|
'201':
|
|
description: Department created
|
|
delete:
|
|
tags:
|
|
- Organization
|
|
summary: Delete department
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- id
|
|
properties:
|
|
id:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Department deleted
|
|
/api/organization/department/{id}:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: Get department by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Department details
|
|
patch:
|
|
tags:
|
|
- Organization
|
|
summary: Update department
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
DeptName:
|
|
type: string
|
|
DeptCode:
|
|
type: string
|
|
SiteID:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Department updated
|
|
/api/organization/workstation:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: List workstations
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of workstations
|
|
post:
|
|
tags:
|
|
- Organization
|
|
summary: Create workstation
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Workstation'
|
|
responses:
|
|
'201':
|
|
description: Workstation created
|
|
delete:
|
|
tags:
|
|
- Organization
|
|
summary: Delete workstation
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- id
|
|
properties:
|
|
id:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Workstation deleted
|
|
/api/organization/workstation/{id}:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: Get workstation by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Workstation details
|
|
patch:
|
|
tags:
|
|
- Organization
|
|
summary: Update workstation
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
WorkstationName:
|
|
type: string
|
|
WorkstationCode:
|
|
type: string
|
|
SiteID:
|
|
type: integer
|
|
DepartmentID:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Workstation updated
|
|
/api/organization/hostapp:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: List host applications
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: HostAppID
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: HostAppName
|
|
in: query
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: List of host applications
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/HostApp'
|
|
post:
|
|
tags:
|
|
- Organization
|
|
summary: Create host application
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/HostApp'
|
|
responses:
|
|
'201':
|
|
description: Host application created
|
|
delete:
|
|
tags:
|
|
- Organization
|
|
summary: Delete host application (soft delete)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- HostAppID
|
|
properties:
|
|
HostAppID:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Host application deleted
|
|
/api/organization/hostapp/{id}:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: Get host application by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Host application details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/HostApp'
|
|
patch:
|
|
tags:
|
|
- Organization
|
|
summary: Update host application
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
HostAppName:
|
|
type: string
|
|
SiteID:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Host application updated
|
|
/api/organization/hostcompara:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: List host communication parameters
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: HostAppID
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: HostIP
|
|
in: query
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: List of host communication parameters
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/HostComPara'
|
|
post:
|
|
tags:
|
|
- Organization
|
|
summary: Create host communication parameters
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/HostComPara'
|
|
responses:
|
|
'201':
|
|
description: Host communication parameters created
|
|
delete:
|
|
tags:
|
|
- Organization
|
|
summary: Delete host communication parameters (soft delete)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- HostAppID
|
|
properties:
|
|
HostAppID:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Host communication parameters deleted
|
|
/api/organization/hostcompara/{id}:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: Get host communication parameters by HostAppID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Host communication parameters details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/HostComPara'
|
|
patch:
|
|
tags:
|
|
- Organization
|
|
summary: Update host communication parameters
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
HostIP:
|
|
type: string
|
|
HostPort:
|
|
type: string
|
|
HostPwd:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Host communication parameters updated
|
|
/api/organization/codingsys:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: List coding systems
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: CodingSysAbb
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: FullText
|
|
in: query
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: List of coding systems
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/CodingSys'
|
|
post:
|
|
tags:
|
|
- Organization
|
|
summary: Create coding system
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CodingSys'
|
|
responses:
|
|
'201':
|
|
description: Coding system created
|
|
delete:
|
|
tags:
|
|
- Organization
|
|
summary: Delete coding system (soft delete)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- CodingSysID
|
|
properties:
|
|
CodingSysID:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Coding system deleted
|
|
/api/organization/codingsys/{id}:
|
|
get:
|
|
tags:
|
|
- Organization
|
|
summary: Get coding system by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Coding system details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CodingSys'
|
|
patch:
|
|
tags:
|
|
- Organization
|
|
summary: Update coding system
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
CodingSysAbb:
|
|
type: string
|
|
FullText:
|
|
type: string
|
|
Description:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Coding system updated
|
|
/api/patvisit:
|
|
get:
|
|
tags:
|
|
- Patient Visit
|
|
summary: List patient visits
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: InternalPID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by internal patient ID (exact match)
|
|
- name: PVID
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by visit ID (partial match)
|
|
- name: PatientID
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by patient ID (partial match)
|
|
- name: PatientName
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Search by patient name (searches in both first and last name)
|
|
- name: CreateDateFrom
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
description: Filter visits created on or after this date
|
|
- name: CreateDateTo
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
description: Filter visits created on or before this date
|
|
- name: page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: perPage
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: List of patient visits
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PatientVisit'
|
|
total:
|
|
type: integer
|
|
description: Total number of records
|
|
page:
|
|
type: integer
|
|
description: Current page number
|
|
per_page:
|
|
type: integer
|
|
description: Number of records per page
|
|
post:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Create patient visit
|
|
description: |
|
|
Creates a new patient visit. PVID is auto-generated with 'DV' prefix if not provided.
|
|
Can optionally include PatDiag (diagnosis) and PatVisitADT (ADT information).
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- InternalPID
|
|
properties:
|
|
PVID:
|
|
type: string
|
|
description: Visit ID (auto-generated with DV prefix if not provided)
|
|
InternalPID:
|
|
type: integer
|
|
description: Patient ID (required)
|
|
EpisodeID:
|
|
type: string
|
|
description: Episode identifier
|
|
SiteID:
|
|
type: integer
|
|
description: Site reference
|
|
PatDiag:
|
|
type: object
|
|
description: Optional diagnosis information
|
|
properties:
|
|
DiagCode:
|
|
type: string
|
|
Diagnosis:
|
|
type: string
|
|
PatVisitADT:
|
|
type: object
|
|
description: Optional ADT information
|
|
properties:
|
|
ADTCode:
|
|
type: string
|
|
enum:
|
|
- A01
|
|
- A02
|
|
- A03
|
|
- A04
|
|
- A08
|
|
LocationID:
|
|
type: integer
|
|
AttDoc:
|
|
type: integer
|
|
RefDoc:
|
|
type: integer
|
|
AdmDoc:
|
|
type: integer
|
|
CnsDoc:
|
|
type: integer
|
|
responses:
|
|
'201':
|
|
description: Visit created successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: object
|
|
properties:
|
|
PVID:
|
|
type: string
|
|
InternalPVID:
|
|
type: integer
|
|
delete:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Delete patient visit
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: Visit deleted successfully
|
|
/api/patvisit/{id}:
|
|
get:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Get visit by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
description: PVID (visit identifier like DV00001)
|
|
responses:
|
|
'200':
|
|
description: Visit details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/PatientVisit'
|
|
patch:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Update patient visit
|
|
description: |
|
|
Updates an existing patient visit. InternalPVID is required.
|
|
Can update main visit data, PatDiag, and add new PatVisitADT records.
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Internal visit ID (InternalPVID)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
PVID:
|
|
type: string
|
|
InternalPID:
|
|
type: integer
|
|
EpisodeID:
|
|
type: string
|
|
SiteID:
|
|
type: integer
|
|
PatDiag:
|
|
type: object
|
|
description: Diagnosis information (will update if exists)
|
|
properties:
|
|
DiagCode:
|
|
type: string
|
|
Diagnosis:
|
|
type: string
|
|
PatVisitADT:
|
|
type: array
|
|
description: Array of ADT records to add (new records only)
|
|
items:
|
|
type: object
|
|
properties:
|
|
ADTCode:
|
|
type: string
|
|
enum:
|
|
- A01
|
|
- A02
|
|
- A03
|
|
- A04
|
|
- A08
|
|
LocationID:
|
|
type: integer
|
|
AttDoc:
|
|
type: integer
|
|
RefDoc:
|
|
type: integer
|
|
AdmDoc:
|
|
type: integer
|
|
CnsDoc:
|
|
type: integer
|
|
sequence:
|
|
type: integer
|
|
description: Used for ordering multiple ADT records
|
|
responses:
|
|
'200':
|
|
description: Visit updated successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: object
|
|
properties:
|
|
PVID:
|
|
type: string
|
|
InternalPVID:
|
|
type: integer
|
|
/api/patvisit/patient/{patientId}:
|
|
get:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Get visits by patient ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: patientId
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Internal Patient ID (InternalPID)
|
|
responses:
|
|
'200':
|
|
description: Patient visits list
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PatientVisit'
|
|
/api/patvisitadt:
|
|
post:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Create ADT record
|
|
description: Create a new Admission/Discharge/Transfer record
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatVisitADT'
|
|
responses:
|
|
'201':
|
|
description: ADT record created successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
delete:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Delete ADT visit (soft delete)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- PVADTID
|
|
properties:
|
|
PVADTID:
|
|
type: integer
|
|
description: ADT record ID to delete
|
|
responses:
|
|
'200':
|
|
description: ADT visit deleted successfully
|
|
/api/patvisitadt/visit/{visitId}:
|
|
get:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Get ADT history by visit ID
|
|
description: Retrieve the complete Admission/Discharge/Transfer history for a visit, including all locations and doctors
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: visitId
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Internal Visit ID (InternalPVID)
|
|
responses:
|
|
'200':
|
|
description: ADT history retrieved successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: ADT history retrieved
|
|
data:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
PVADTID:
|
|
type: integer
|
|
InternalPVID:
|
|
type: integer
|
|
ADTCode:
|
|
type: string
|
|
enum:
|
|
- A01
|
|
- A02
|
|
- A03
|
|
- A04
|
|
- A08
|
|
LocationID:
|
|
type: integer
|
|
LocationName:
|
|
type: string
|
|
AttDoc:
|
|
type: integer
|
|
AttDocFirstName:
|
|
type: string
|
|
AttDocLastName:
|
|
type: string
|
|
RefDoc:
|
|
type: integer
|
|
RefDocFirstName:
|
|
type: string
|
|
RefDocLastName:
|
|
type: string
|
|
AdmDoc:
|
|
type: integer
|
|
AdmDocFirstName:
|
|
type: string
|
|
AdmDocLastName:
|
|
type: string
|
|
CnsDoc:
|
|
type: integer
|
|
CnsDocFirstName:
|
|
type: string
|
|
CnsDocLastName:
|
|
type: string
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
/api/patvisitadt/{id}:
|
|
get:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Get ADT record by ID
|
|
description: Retrieve a single ADT record by its ID, including location and doctor details
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: ADT record ID (PVADTID)
|
|
responses:
|
|
'200':
|
|
description: ADT record retrieved successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: ADT record retrieved
|
|
data:
|
|
type: object
|
|
properties:
|
|
PVADTID:
|
|
type: integer
|
|
InternalPVID:
|
|
type: integer
|
|
ADTCode:
|
|
type: string
|
|
enum:
|
|
- A01
|
|
- A02
|
|
- A03
|
|
- A04
|
|
- A08
|
|
LocationID:
|
|
type: integer
|
|
LocationName:
|
|
type: string
|
|
AttDoc:
|
|
type: integer
|
|
AttDocFirstName:
|
|
type: string
|
|
AttDocLastName:
|
|
type: string
|
|
RefDoc:
|
|
type: integer
|
|
RefDocFirstName:
|
|
type: string
|
|
RefDocLastName:
|
|
type: string
|
|
AdmDoc:
|
|
type: integer
|
|
AdmDocFirstName:
|
|
type: string
|
|
AdmDocLastName:
|
|
type: string
|
|
CnsDoc:
|
|
type: integer
|
|
CnsDocFirstName:
|
|
type: string
|
|
CnsDocLastName:
|
|
type: string
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
patch:
|
|
tags:
|
|
- Patient Visit
|
|
summary: Update ADT record
|
|
description: Update an existing ADT record
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: ADT record ID (PVADTID)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatVisitADT'
|
|
responses:
|
|
'200':
|
|
description: ADT record updated successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
/api/patient:
|
|
get:
|
|
tags:
|
|
- Patient
|
|
summary: List patients
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 1
|
|
- name: perPage
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 20
|
|
- name: InternalPID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by internal patient ID
|
|
- name: PatientID
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by patient ID
|
|
- name: Name
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Search by patient name
|
|
- name: Birthdate
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter by birthdate (YYYY-MM-DD)
|
|
responses:
|
|
'200':
|
|
description: List of patients
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatientListResponse'
|
|
post:
|
|
tags:
|
|
- Patient
|
|
summary: Create new patient
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Patient'
|
|
responses:
|
|
'201':
|
|
description: Patient created successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
'422':
|
|
description: Validation error
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
delete:
|
|
tags:
|
|
- Patient
|
|
summary: Delete patient (soft delete)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- InternalPID
|
|
properties:
|
|
InternalPID:
|
|
type: integer
|
|
description: Internal patient record ID
|
|
responses:
|
|
'200':
|
|
description: Patient deleted successfully
|
|
/api/patient/check:
|
|
get:
|
|
tags:
|
|
- Patient
|
|
summary: Check if patient exists
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: PatientID
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Patient ID to check
|
|
- name: EmailAddress1
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: email
|
|
description: Email address to check
|
|
responses:
|
|
'200':
|
|
description: Patient check result
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
exists:
|
|
type: boolean
|
|
data:
|
|
$ref: '#/components/schemas/Patient'
|
|
/api/patient/{id}:
|
|
get:
|
|
tags:
|
|
- Patient
|
|
summary: Get patient by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Internal patient record ID
|
|
responses:
|
|
'200':
|
|
description: Patient details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/Patient'
|
|
patch:
|
|
tags:
|
|
- Patient
|
|
summary: Update patient
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Internal patient record ID
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Patient'
|
|
responses:
|
|
'200':
|
|
description: Patient updated successfully
|
|
/api/report/{orderID}:
|
|
get:
|
|
tags:
|
|
- Report
|
|
summary: Generate lab report
|
|
description: Generate an HTML lab report for a specific order. Returns HTML content that can be viewed in browser or printed to PDF.
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: orderID
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Internal Order ID
|
|
responses:
|
|
'200':
|
|
description: HTML lab report
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
description: HTML content of the lab report
|
|
'404':
|
|
description: Order or patient not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
'500':
|
|
description: Failed to generate report
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
/api/result:
|
|
get:
|
|
tags:
|
|
- Result
|
|
summary: List results
|
|
description: Retrieve patient test results with optional filters by order or patient
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: order_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by internal order ID
|
|
- name: patient_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by internal patient ID (returns cumulative results)
|
|
- name: page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 1
|
|
description: Page number for pagination
|
|
- name: per_page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 20
|
|
description: Number of results per page
|
|
responses:
|
|
'200':
|
|
description: List of results
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
ResultID:
|
|
type: integer
|
|
OrderID:
|
|
type: integer
|
|
TestSiteID:
|
|
type: integer
|
|
TestSiteCode:
|
|
type: string
|
|
Result:
|
|
type: string
|
|
nullable: true
|
|
ResultDateTime:
|
|
type: string
|
|
format: date-time
|
|
RefNumID:
|
|
type: integer
|
|
nullable: true
|
|
RefTxtID:
|
|
type: integer
|
|
nullable: true
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
TestSiteName:
|
|
type: string
|
|
nullable: true
|
|
Unit1:
|
|
type: string
|
|
nullable: true
|
|
Unit2:
|
|
type: string
|
|
nullable: true
|
|
Low:
|
|
type: number
|
|
nullable: true
|
|
High:
|
|
type: number
|
|
nullable: true
|
|
LowSign:
|
|
type: string
|
|
nullable: true
|
|
HighSign:
|
|
type: string
|
|
nullable: true
|
|
RefDisplay:
|
|
type: string
|
|
nullable: true
|
|
/api/result/{id}:
|
|
get:
|
|
tags:
|
|
- Result
|
|
summary: Get result by ID
|
|
description: Retrieve a specific result entry with all related data
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Result ID
|
|
responses:
|
|
'200':
|
|
description: Result details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
type: object
|
|
properties:
|
|
ResultID:
|
|
type: integer
|
|
SiteID:
|
|
type: integer
|
|
OrderID:
|
|
type: integer
|
|
InternalSID:
|
|
type: integer
|
|
SID:
|
|
type: string
|
|
SampleID:
|
|
type: string
|
|
TestSiteID:
|
|
type: integer
|
|
TestSiteCode:
|
|
type: string
|
|
AspCnt:
|
|
type: integer
|
|
Result:
|
|
type: string
|
|
nullable: true
|
|
SampleType:
|
|
type: string
|
|
nullable: true
|
|
ResultDateTime:
|
|
type: string
|
|
format: date-time
|
|
WorkstationID:
|
|
type: integer
|
|
nullable: true
|
|
EquipmentID:
|
|
type: integer
|
|
nullable: true
|
|
RefNumID:
|
|
type: integer
|
|
nullable: true
|
|
RefTxtID:
|
|
type: integer
|
|
nullable: true
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
TestSiteName:
|
|
type: string
|
|
nullable: true
|
|
Unit1:
|
|
type: string
|
|
nullable: true
|
|
Unit2:
|
|
type: string
|
|
nullable: true
|
|
Low:
|
|
type: number
|
|
nullable: true
|
|
High:
|
|
type: number
|
|
nullable: true
|
|
LowSign:
|
|
type: string
|
|
nullable: true
|
|
HighSign:
|
|
type: string
|
|
nullable: true
|
|
RefDisplay:
|
|
type: string
|
|
nullable: true
|
|
OrderNumber:
|
|
type: string
|
|
nullable: true
|
|
InternalPID:
|
|
type: integer
|
|
'404':
|
|
description: Result not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
patch:
|
|
tags:
|
|
- Result
|
|
summary: Update result
|
|
description: Update a result value with automatic validation against reference ranges. Returns calculated flag (L/H) in response but does not store it.
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Result ID
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
Result:
|
|
type: string
|
|
description: The result value
|
|
RefNumID:
|
|
type: integer
|
|
description: Reference range ID to validate against
|
|
SampleType:
|
|
type: string
|
|
nullable: true
|
|
WorkstationID:
|
|
type: integer
|
|
nullable: true
|
|
EquipmentID:
|
|
type: integer
|
|
nullable: true
|
|
responses:
|
|
'200':
|
|
description: Result updated successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
type: object
|
|
properties:
|
|
result:
|
|
type: object
|
|
flag:
|
|
type: string
|
|
nullable: true
|
|
enum:
|
|
- L
|
|
- H
|
|
description: Calculated flag - L for Low, H for High, null for normal
|
|
'400':
|
|
description: Validation failed
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
'404':
|
|
description: Result not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
delete:
|
|
tags:
|
|
- Result
|
|
summary: Delete result
|
|
description: Soft delete a result entry by setting DelDate
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Result ID
|
|
responses:
|
|
'200':
|
|
description: Result deleted successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SuccessResponse'
|
|
'404':
|
|
description: Result not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
/api/rule:
|
|
get:
|
|
tags:
|
|
- Rule
|
|
summary: List rules
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: EventCode
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Filter by event code
|
|
- name: TestSiteID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by TestSiteID (returns rules linked to this test). Rules are only returned when attached to tests.
|
|
- name: search
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Search by rule code or name
|
|
responses:
|
|
'200':
|
|
description: List of rules
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/RuleDef'
|
|
post:
|
|
tags:
|
|
- Rule
|
|
summary: Create rule
|
|
description: |
|
|
Create a new rule. Rules must be linked to at least one test via TestSiteIDs.
|
|
A single rule can be linked to multiple tests. Rules are active only when attached to tests.
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
RuleCode:
|
|
type: string
|
|
example: AUTO_SET_RESULT
|
|
RuleName:
|
|
type: string
|
|
example: Automatically Set Result
|
|
Description:
|
|
type: string
|
|
EventCode:
|
|
type: string
|
|
example: test_created
|
|
TestSiteIDs:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
description: Array of TestSiteIDs to link this rule to (required)
|
|
example:
|
|
- 1
|
|
- 2
|
|
- 3
|
|
ConditionExpr:
|
|
type: string
|
|
nullable: true
|
|
description: Raw DSL expression. Compile it first and persist the compiled JSON in ConditionExprCompiled.
|
|
example: if(sex('M'); result_set(0.5); result_set(0.6))
|
|
ConditionExprCompiled:
|
|
type: string
|
|
nullable: true
|
|
description: Compiled JSON payload from POST /api/rule/compile
|
|
required:
|
|
- RuleCode
|
|
- RuleName
|
|
- EventCode
|
|
- TestSiteIDs
|
|
responses:
|
|
'201':
|
|
description: Rule created
|
|
/api/rule/{id}:
|
|
get:
|
|
tags:
|
|
- Rule
|
|
summary: Get rule with linked tests
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: RuleID
|
|
responses:
|
|
'200':
|
|
description: Rule details with linked test sites
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/RuleWithDetails'
|
|
'404':
|
|
description: Rule not found
|
|
patch:
|
|
tags:
|
|
- Rule
|
|
summary: Update rule
|
|
description: |
|
|
Update a rule. TestSiteIDs can be provided to update which tests the rule is linked to.
|
|
Tests not in the new list will be unlinked, and new tests will be linked.
|
|
Rules are active only when attached to tests.
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: RuleID
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
RuleCode:
|
|
type: string
|
|
RuleName:
|
|
type: string
|
|
Description:
|
|
type: string
|
|
EventCode:
|
|
type: string
|
|
TestSiteIDs:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
description: Array of TestSiteIDs to link this rule to
|
|
ConditionExpr:
|
|
type: string
|
|
nullable: true
|
|
responses:
|
|
'200':
|
|
description: Rule updated
|
|
'404':
|
|
description: Rule not found
|
|
delete:
|
|
tags:
|
|
- Rule
|
|
summary: Soft delete rule
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: RuleID
|
|
responses:
|
|
'200':
|
|
description: Rule deleted
|
|
'404':
|
|
description: Rule not found
|
|
/api/rule/validate:
|
|
post:
|
|
tags:
|
|
- Rule
|
|
summary: Validate/evaluate an expression
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
expr:
|
|
type: string
|
|
context:
|
|
type: object
|
|
additionalProperties: true
|
|
required:
|
|
- expr
|
|
responses:
|
|
'200':
|
|
description: Validation result
|
|
/api/rule/compile:
|
|
post:
|
|
tags:
|
|
- Rule
|
|
summary: Compile DSL expression to engine-compatible structure
|
|
description: |
|
|
Compile a DSL expression to the engine-compatible JSON structure.
|
|
Frontend calls this when user clicks "Compile" button.
|
|
Returns compiled structure that can be saved to ConditionExprCompiled field.
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
expr:
|
|
type: string
|
|
description: Raw DSL expression
|
|
example: if(sex('M'); result_set(0.5); result_set(0.6))
|
|
required:
|
|
- expr
|
|
responses:
|
|
'200':
|
|
description: Compilation successful
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
data:
|
|
type: object
|
|
properties:
|
|
raw:
|
|
type: string
|
|
description: Original DSL expression
|
|
compiled:
|
|
type: object
|
|
description: Parsed structure with conditionExpr, valueExpr, then, else
|
|
conditionExprCompiled:
|
|
type: string
|
|
description: JSON string to save to ConditionExprCompiled field
|
|
'400':
|
|
description: Compilation failed (invalid syntax)
|
|
/api/specimen:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: List specimens
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of specimens
|
|
post:
|
|
tags:
|
|
- Specimen
|
|
summary: Create specimen
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Specimen'
|
|
responses:
|
|
'201':
|
|
description: Specimen created
|
|
/api/specimen/{id}:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: Get specimen by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Specimen details
|
|
patch:
|
|
tags:
|
|
- Specimen
|
|
summary: Update specimen
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Specimen ID (SID)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Specimen'
|
|
responses:
|
|
'200':
|
|
description: Specimen updated
|
|
delete:
|
|
tags:
|
|
- Specimen
|
|
summary: Delete specimen (soft delete)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Specimen ID (SID)
|
|
responses:
|
|
'200':
|
|
description: Specimen deleted successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: Specimen deleted successfully
|
|
data:
|
|
type: object
|
|
properties:
|
|
SID:
|
|
type: integer
|
|
'404':
|
|
description: Specimen not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: failed
|
|
message:
|
|
type: string
|
|
example: Specimen not found
|
|
data:
|
|
type: null
|
|
'500':
|
|
description: Server error
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: failed
|
|
message:
|
|
type: string
|
|
example: Failed to delete specimen
|
|
data:
|
|
type: null
|
|
/api/specimen/container:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: List container definitions
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of container definitions
|
|
post:
|
|
tags:
|
|
- Specimen
|
|
summary: Create container definition
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ContainerDef'
|
|
responses:
|
|
'201':
|
|
description: Container definition created
|
|
/api/specimen/container/{id}:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: Get container definition by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Container definition details
|
|
patch:
|
|
tags:
|
|
- Specimen
|
|
summary: Update container definition
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Container definition ID (ConDefID)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ContainerDef'
|
|
responses:
|
|
'200':
|
|
description: Container definition updated
|
|
/api/specimen/containerdef:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: List container definitions (alias)
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of container definitions
|
|
post:
|
|
tags:
|
|
- Specimen
|
|
summary: Create container definition (alias)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ContainerDef'
|
|
responses:
|
|
'201':
|
|
description: Container definition created
|
|
/api/specimen/containerdef/{id}:
|
|
patch:
|
|
tags:
|
|
- Specimen
|
|
summary: Update container definition (alias)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Container definition ID (ConDefID)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ContainerDef'
|
|
responses:
|
|
'200':
|
|
description: Container definition updated
|
|
/api/specimen/prep:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: List specimen preparations
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of specimen preparations
|
|
post:
|
|
tags:
|
|
- Specimen
|
|
summary: Create specimen preparation
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpecimenPrep'
|
|
responses:
|
|
'201':
|
|
description: Specimen preparation created
|
|
/api/specimen/prep/{id}:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: Get specimen preparation by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Specimen preparation details
|
|
patch:
|
|
tags:
|
|
- Specimen
|
|
summary: Update specimen preparation
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Specimen preparation ID (SpcPrpID)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpecimenPrep'
|
|
responses:
|
|
'200':
|
|
description: Specimen preparation updated
|
|
/api/specimen/status:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: List specimen statuses
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of specimen statuses
|
|
post:
|
|
tags:
|
|
- Specimen
|
|
summary: Create specimen status
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpecimenStatus'
|
|
responses:
|
|
'201':
|
|
description: Specimen status created
|
|
/api/specimen/status/{id}:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: Get specimen status by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Specimen status details
|
|
patch:
|
|
tags:
|
|
- Specimen
|
|
summary: Update specimen status
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Specimen status ID (SpcStaID)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpecimenStatus'
|
|
responses:
|
|
'200':
|
|
description: Specimen status updated
|
|
/api/specimen/collection:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: List specimen collection methods
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of collection methods
|
|
post:
|
|
tags:
|
|
- Specimen
|
|
summary: Create specimen collection method
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpecimenCollection'
|
|
responses:
|
|
'201':
|
|
description: Collection method created
|
|
/api/specimen/collection/{id}:
|
|
get:
|
|
tags:
|
|
- Specimen
|
|
summary: Get specimen collection method by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Collection method details
|
|
patch:
|
|
tags:
|
|
- Specimen
|
|
summary: Update specimen collection method
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Specimen collection ID (SpcColID)
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpecimenCollection'
|
|
responses:
|
|
'200':
|
|
description: Collection method updated
|
|
/api/test/testmap:
|
|
get:
|
|
tags:
|
|
- Test
|
|
summary: List all test mappings
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of test mappings
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
TestMapID:
|
|
type: integer
|
|
HostType:
|
|
type: string
|
|
HostID:
|
|
type: string
|
|
HostName:
|
|
type: string
|
|
ClientType:
|
|
type: string
|
|
ClientID:
|
|
type: string
|
|
ClientName:
|
|
type: string
|
|
post:
|
|
tags:
|
|
- Test
|
|
summary: Create test mapping (header only)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
HostType:
|
|
type: string
|
|
description: Host type code
|
|
HostID:
|
|
type: string
|
|
description: Host identifier
|
|
ClientType:
|
|
type: string
|
|
description: Client type code
|
|
ClientID:
|
|
type: string
|
|
description: Client identifier
|
|
details:
|
|
type: array
|
|
description: Optional detail records to create
|
|
items:
|
|
type: object
|
|
properties:
|
|
HostTestCode:
|
|
type: string
|
|
HostTestName:
|
|
type: string
|
|
ConDefID:
|
|
type: integer
|
|
ClientTestCode:
|
|
type: string
|
|
ClientTestName:
|
|
type: string
|
|
responses:
|
|
'201':
|
|
description: Test mapping created
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
type: integer
|
|
description: Created TestMapID
|
|
delete:
|
|
tags:
|
|
- Test
|
|
summary: Soft delete test mapping (cascades to details)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
TestMapID:
|
|
type: integer
|
|
description: Test Map ID to delete (required)
|
|
required:
|
|
- TestMapID
|
|
responses:
|
|
'200':
|
|
description: Test mapping deleted successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
type: integer
|
|
description: Deleted TestMapID
|
|
'404':
|
|
description: Test mapping not found or already deleted
|
|
/api/test/testmap/{id}:
|
|
get:
|
|
tags:
|
|
- Test
|
|
summary: Get test mapping by ID with details
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Test Map ID
|
|
responses:
|
|
'200':
|
|
description: Test mapping details with nested detail records
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/TestMap'
|
|
'404':
|
|
description: Test mapping not found
|
|
patch:
|
|
tags:
|
|
- Test
|
|
summary: Update test mapping
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Test Map ID
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
HostType:
|
|
type: string
|
|
HostID:
|
|
type: string
|
|
ClientType:
|
|
type: string
|
|
ClientID:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Test mapping updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
type: integer
|
|
description: Updated TestMapID
|
|
/api/test/testmap/by-testcode/{testCode}:
|
|
get:
|
|
tags:
|
|
- Test
|
|
summary: Get test mappings by test code with details
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: testCode
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
description: Test Code (matches HostTestCode or ClientTestCode)
|
|
responses:
|
|
'200':
|
|
description: List of test mappings with details for the test code
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TestMap'
|
|
/api/test/testmap/detail:
|
|
get:
|
|
tags:
|
|
- Test
|
|
summary: List test mapping details
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: TestMapID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by TestMapID
|
|
responses:
|
|
'200':
|
|
description: List of test mapping details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TestMapDetail'
|
|
post:
|
|
tags:
|
|
- Test
|
|
summary: Create test mapping detail
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
TestMapID:
|
|
type: integer
|
|
description: Test Map ID (required)
|
|
HostTestCode:
|
|
type: string
|
|
HostTestName:
|
|
type: string
|
|
ConDefID:
|
|
type: integer
|
|
ClientTestCode:
|
|
type: string
|
|
ClientTestName:
|
|
type: string
|
|
required:
|
|
- TestMapID
|
|
responses:
|
|
'201':
|
|
description: Test mapping detail created
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: integer
|
|
description: Created TestMapDetailID
|
|
delete:
|
|
tags:
|
|
- Test
|
|
summary: Soft delete test mapping detail
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
TestMapDetailID:
|
|
type: integer
|
|
description: Test Map Detail ID to delete (required)
|
|
required:
|
|
- TestMapDetailID
|
|
responses:
|
|
'200':
|
|
description: Test mapping detail deleted
|
|
/api/test/testmap/detail/{id}:
|
|
get:
|
|
tags:
|
|
- Test
|
|
summary: Get test mapping detail by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Test Map Detail ID
|
|
responses:
|
|
'200':
|
|
description: Test mapping detail
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/TestMapDetail'
|
|
patch:
|
|
tags:
|
|
- Test
|
|
summary: Update test mapping detail
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Test Map Detail ID
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
TestMapID:
|
|
type: integer
|
|
HostTestCode:
|
|
type: string
|
|
HostTestName:
|
|
type: string
|
|
ConDefID:
|
|
type: integer
|
|
ClientTestCode:
|
|
type: string
|
|
ClientTestName:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Test mapping detail updated
|
|
/api/test/testmap/detail/by-testmap/{testMapID}:
|
|
get:
|
|
tags:
|
|
- Test
|
|
summary: Get test mapping details by test map ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: testMapID
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Test Map ID
|
|
responses:
|
|
'200':
|
|
description: List of test mapping details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TestMapDetail'
|
|
/api/test/testmap/detail/batch:
|
|
post:
|
|
tags:
|
|
- Test
|
|
summary: Batch create test mapping details
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
TestMapID:
|
|
type: integer
|
|
HostTestCode:
|
|
type: string
|
|
HostTestName:
|
|
type: string
|
|
ConDefID:
|
|
type: integer
|
|
ClientTestCode:
|
|
type: string
|
|
ClientTestName:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Batch create results
|
|
patch:
|
|
tags:
|
|
- Test
|
|
summary: Batch update test mapping details
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
TestMapDetailID:
|
|
type: integer
|
|
TestMapID:
|
|
type: integer
|
|
HostTestCode:
|
|
type: string
|
|
HostTestName:
|
|
type: string
|
|
ConDefID:
|
|
type: integer
|
|
ClientTestCode:
|
|
type: string
|
|
ClientTestName:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Batch update results
|
|
delete:
|
|
tags:
|
|
- Test
|
|
summary: Batch delete test mapping details
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
description: TestMapDetailIDs to delete
|
|
responses:
|
|
'200':
|
|
description: Batch delete results
|
|
/api/test:
|
|
get:
|
|
tags:
|
|
- Test
|
|
summary: List test definitions
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 1
|
|
description: Page number for pagination
|
|
- name: perPage
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 20
|
|
description: Number of items per page
|
|
- name: SiteID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by site ID
|
|
- name: TestType
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum:
|
|
- TEST
|
|
- PARAM
|
|
- CALC
|
|
- GROUP
|
|
- TITLE
|
|
description: Filter by test type
|
|
- name: isVisibleScr
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
enum:
|
|
- 0
|
|
- 1
|
|
description: Filter by screen visibility (0=hidden, 1=visible)
|
|
- name: isVisibleRpt
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
enum:
|
|
- 0
|
|
- 1
|
|
description: Filter by report visibility (0=hidden, 1=visible)
|
|
- name: search
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Search by test code or name
|
|
responses:
|
|
'200':
|
|
description: List of test definitions
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TestDefinitionListItem'
|
|
pagination:
|
|
type: object
|
|
properties:
|
|
total:
|
|
type: integer
|
|
description: Total number of records matching the query
|
|
examples:
|
|
list_flat:
|
|
summary: Flat list response from testdefsite
|
|
value:
|
|
status: success
|
|
message: Data fetched successfully
|
|
data:
|
|
- TestSiteID: 21
|
|
TestSiteCode: GLU
|
|
TestSiteName: Glucose
|
|
TestType: TEST
|
|
SeqScr: 11
|
|
SeqRpt: 11
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
StartDate: '2026-01-01 00:00:00'
|
|
EndDate: null
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
DisciplineName: Clinical Chemistry
|
|
DepartmentName: Laboratory
|
|
- TestSiteID: 22
|
|
TestSiteCode: CREA
|
|
TestSiteName: Creatinine
|
|
TestType: TEST
|
|
SeqScr: 12
|
|
SeqRpt: 12
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
StartDate: '2026-01-01 00:00:00'
|
|
EndDate: null
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
DisciplineName: Clinical Chemistry
|
|
DepartmentName: Laboratory
|
|
post:
|
|
tags:
|
|
- Test
|
|
summary: Create test definition
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
SiteID:
|
|
type: integer
|
|
description: Site ID (required)
|
|
TestSiteCode:
|
|
type: string
|
|
description: Test code (required)
|
|
TestSiteName:
|
|
type: string
|
|
description: Test name (required)
|
|
TestType:
|
|
type: string
|
|
enum:
|
|
- TEST
|
|
- PARAM
|
|
- CALC
|
|
- GROUP
|
|
- TITLE
|
|
description: Test type (required)
|
|
Description:
|
|
type: string
|
|
DisciplineID:
|
|
type: integer
|
|
DepartmentID:
|
|
type: integer
|
|
ResultType:
|
|
type: string
|
|
enum:
|
|
- NMRIC
|
|
- RANGE
|
|
- TEXT
|
|
- VSET
|
|
- NORES
|
|
RefType:
|
|
type: string
|
|
enum:
|
|
- RANGE
|
|
- THOLD
|
|
- VSET
|
|
- TEXT
|
|
- NOREF
|
|
VSet:
|
|
type: integer
|
|
ReqQty:
|
|
type: number
|
|
format: decimal
|
|
ReqQtyUnit:
|
|
type: string
|
|
Unit1:
|
|
type: string
|
|
Factor:
|
|
type: number
|
|
format: decimal
|
|
Unit2:
|
|
type: string
|
|
Decimal:
|
|
type: integer
|
|
CollReq:
|
|
type: string
|
|
Method:
|
|
type: string
|
|
ExpectedTAT:
|
|
type: integer
|
|
SeqScr:
|
|
type: integer
|
|
SeqRpt:
|
|
type: integer
|
|
IndentLeft:
|
|
type: integer
|
|
FontStyle:
|
|
type: string
|
|
isVisibleScr:
|
|
type: integer
|
|
isVisibleRpt:
|
|
type: integer
|
|
isCountStat:
|
|
type: integer
|
|
testdefcal:
|
|
type: object
|
|
description: Calculated test metadata persisted in the `testdefcal` table.
|
|
properties:
|
|
FormulaCode:
|
|
type: string
|
|
description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}")
|
|
testdefgrp:
|
|
type: object
|
|
description: Group definition wrapper for CALC/GROUP member assignments.
|
|
properties:
|
|
members:
|
|
type: array
|
|
description: Array of member TestSiteIDs for CALC/GROUP definitions.
|
|
items:
|
|
type: object
|
|
properties:
|
|
TestSiteID:
|
|
type: integer
|
|
description: Foreign key referencing the member test's TestSiteID.
|
|
required:
|
|
- TestSiteID
|
|
refnum:
|
|
type: array
|
|
items:
|
|
type: object
|
|
reftxt:
|
|
type: array
|
|
items:
|
|
type: object
|
|
testmap:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
HostType:
|
|
type: string
|
|
HostID:
|
|
type: string
|
|
HostTestCode:
|
|
type: string
|
|
HostTestName:
|
|
type: string
|
|
ClientType:
|
|
type: string
|
|
ClientID:
|
|
type: string
|
|
ClientTestCode:
|
|
type: string
|
|
ClientTestName:
|
|
type: string
|
|
ConDefID:
|
|
type: integer
|
|
nullable: true
|
|
required:
|
|
- SiteID
|
|
- TestSiteCode
|
|
- TestSiteName
|
|
- TestType
|
|
examples:
|
|
TEST_no_ref:
|
|
summary: Technical test without reference or map
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_NREF
|
|
TestSiteName: Numeric Test
|
|
TestType: TEST
|
|
SeqScr: 500
|
|
SeqRpt: 500
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
Unit1: mg/dL
|
|
Method: CBC Analyzer
|
|
PARAM_no_ref:
|
|
summary: Parameter without reference or map
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: PARAM_NRF
|
|
TestSiteName: Clinical Parameter
|
|
TestType: PARAM
|
|
SeqScr: 10
|
|
SeqRpt: 10
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 0
|
|
isCountStat: 0
|
|
DisciplineID: 10
|
|
DepartmentID: 0
|
|
Unit1: cm
|
|
Method: Manual entry
|
|
TEST_range_single:
|
|
summary: Technical test with numeric range reference (single)
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_RANGE
|
|
TestSiteName: Glucose Range
|
|
TestType: TEST
|
|
SeqScr: 105
|
|
SeqRpt: 105
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
refnum:
|
|
- NumRefType: NMRC
|
|
RangeType: REF
|
|
Sex: '2'
|
|
LowSign: GE
|
|
Low: 70
|
|
HighSign: LE
|
|
High: 100
|
|
AgeStart: 6570
|
|
AgeEnd: 36135
|
|
Flag: 'N'
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
ResultType: NMRIC
|
|
RefType: RANGE
|
|
Unit1: mg/dL
|
|
Method: Hexokinase
|
|
TEST_range_multiple_map:
|
|
summary: Numeric reference with multiple ranges and test map
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_RMAP
|
|
TestSiteName: Glucose Panic Range
|
|
TestType: TEST
|
|
SeqScr: 110
|
|
SeqRpt: 110
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
refnum:
|
|
- NumRefType: NMRC
|
|
RangeType: REF
|
|
Sex: '2'
|
|
LowSign: GE
|
|
Low: 70
|
|
HighSign: LE
|
|
High: 100
|
|
AgeStart: 6570
|
|
AgeEnd: 36135
|
|
Flag: 'N'
|
|
- NumRefType: NMRC
|
|
RangeType: REF
|
|
Sex: '1'
|
|
LowSign: '>'
|
|
Low: 75
|
|
HighSign: <
|
|
High: 105
|
|
AgeStart: 6570
|
|
AgeEnd: 36135
|
|
Flag: 'N'
|
|
testmap:
|
|
- HostType: SITE
|
|
HostID: '1'
|
|
HostTestCode: GLU
|
|
HostTestName: Glucose
|
|
ClientType: WST
|
|
ClientID: '1'
|
|
ClientTestCode: GLU_C
|
|
ClientTestName: Glucose Client
|
|
ConDefID: 1
|
|
- HostType: SITE
|
|
HostID: '1'
|
|
HostTestCode: CREA
|
|
HostTestName: Creatinine
|
|
ClientType: WST
|
|
ClientID: '1'
|
|
ClientTestCode: CREA_C
|
|
ClientTestName: Creatinine Client
|
|
ConDefID: 2
|
|
- HostType: WST
|
|
HostID: '3'
|
|
HostTestCode: HB
|
|
HostTestName: Hemoglobin
|
|
ClientType: INST
|
|
ClientID: '2'
|
|
ClientTestCode: HB_C
|
|
ClientTestName: Hemoglobin Client
|
|
ConDefID: 3
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
ResultType: NMRIC
|
|
RefType: RANGE
|
|
Unit1: mg/dL
|
|
Method: Hexokinase
|
|
TEST_threshold:
|
|
summary: Technical test with threshold reference
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_THLD
|
|
TestSiteName: Sodium Threshold
|
|
TestType: TEST
|
|
SeqScr: 115
|
|
SeqRpt: 115
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
refnum:
|
|
- NumRefType: THOLD
|
|
RangeType: PANIC
|
|
Sex: '2'
|
|
LowSign: LT
|
|
Low: 120
|
|
AgeStart: 0
|
|
AgeEnd: 45625
|
|
Flag: H
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
ResultType: NMRIC
|
|
RefType: THOLD
|
|
Unit1: mmol/L
|
|
Method: Auto Analyzer
|
|
TEST_threshold_map:
|
|
summary: Threshold reference plus test map
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_TMAP
|
|
TestSiteName: Potassium Panic
|
|
TestType: TEST
|
|
SeqScr: 120
|
|
SeqRpt: 120
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
refnum:
|
|
- NumRefType: THOLD
|
|
RangeType: PANIC
|
|
Sex: '2'
|
|
LowSign: LT
|
|
Low: 120
|
|
AgeStart: 0
|
|
AgeEnd: 45625
|
|
Flag: H
|
|
- NumRefType: THOLD
|
|
RangeType: PANIC
|
|
Sex: '1'
|
|
LowSign: <
|
|
Low: 121
|
|
AgeStart: 0
|
|
AgeEnd: 45625
|
|
Flag: H
|
|
testmap:
|
|
- HostType: SITE
|
|
HostID: '1'
|
|
ClientType: WST
|
|
ClientID: '1'
|
|
details:
|
|
- HostTestCode: HB
|
|
HostTestName: Hemoglobin
|
|
ConDefID: 3
|
|
ClientTestCode: HB_C
|
|
ClientTestName: Hemoglobin Client
|
|
- HostTestCode: GLU
|
|
HostTestName: Glucose
|
|
ConDefID: 1
|
|
ClientTestCode: GLU_C
|
|
ClientTestName: Glucose Client
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
ResultType: NMRIC
|
|
RefType: THOLD
|
|
Unit1: mmol/L
|
|
Method: Auto Analyzer
|
|
TEST_text:
|
|
summary: Technical test with text reference
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_TEXT
|
|
TestSiteName: Disease Stage
|
|
TestType: TEST
|
|
SeqScr: 130
|
|
SeqRpt: 130
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
reftxt:
|
|
- SpcType: GEN
|
|
TxtRefType: TEXT
|
|
Sex: '2'
|
|
AgeStart: 6570
|
|
AgeEnd: 36135
|
|
RefTxt: NORM=Normal;HIGH=High
|
|
Flag: 'N'
|
|
DisciplineID: 1
|
|
DepartmentID: 1
|
|
ResultType: TEXT
|
|
RefType: TEXT
|
|
Method: Morphology
|
|
TEST_text_map:
|
|
summary: Text reference plus test map
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_TXM
|
|
TestSiteName: Disease Stage (Map)
|
|
TestType: TEST
|
|
SeqScr: 135
|
|
SeqRpt: 135
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
reftxt:
|
|
- SpcType: GEN
|
|
TxtRefType: TEXT
|
|
Sex: '2'
|
|
AgeStart: 6570
|
|
AgeEnd: 36135
|
|
RefTxt: NORM=Normal
|
|
Flag: 'N'
|
|
- SpcType: GEN
|
|
TxtRefType: TEXT
|
|
Sex: '1'
|
|
AgeStart: 6570
|
|
AgeEnd: 36135
|
|
RefTxt: ABN=Abnormal
|
|
Flag: 'N'
|
|
testmap:
|
|
- HostType: SITE
|
|
HostID: '1'
|
|
ClientType: WST
|
|
ClientID: '1'
|
|
details:
|
|
- HostTestCode: STAGE
|
|
HostTestName: Disease Stage
|
|
ConDefID: 4
|
|
ClientTestCode: STAGE_C
|
|
ClientTestName: Disease Stage Client
|
|
DisciplineID: 1
|
|
DepartmentID: 1
|
|
ResultType: TEXT
|
|
RefType: TEXT
|
|
TEST_valueset:
|
|
summary: Technical test using a value set result
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_VSET
|
|
TestSiteName: Urine Color
|
|
TestType: TEST
|
|
SeqScr: 140
|
|
SeqRpt: 140
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
reftxt:
|
|
- SpcType: GEN
|
|
TxtRefType: VSET
|
|
Sex: '2'
|
|
AgeStart: 0
|
|
AgeEnd: 43800
|
|
RefTxt: NORM=Normal;MACRO=Macro
|
|
Flag: 'N'
|
|
DisciplineID: 4
|
|
DepartmentID: 4
|
|
ResultType: VSET
|
|
RefType: VSET
|
|
Method: Visual
|
|
TEST_valueset_map:
|
|
summary: Value set reference with test map
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_VMAP
|
|
TestSiteName: Urine Color (Map)
|
|
TestType: TEST
|
|
SeqScr: 145
|
|
SeqRpt: 145
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
reftxt:
|
|
- SpcType: GEN
|
|
TxtRefType: VSET
|
|
Sex: '2'
|
|
AgeStart: 0
|
|
AgeEnd: 43800
|
|
RefTxt: NORM=Normal;ABN=Abnormal
|
|
Flag: 'N'
|
|
testmap:
|
|
- HostType: SITE
|
|
HostID: '1'
|
|
ClientType: WST
|
|
ClientID: '8'
|
|
details:
|
|
- HostTestCode: UCOLOR
|
|
HostTestName: Urine Color
|
|
ConDefID: 12
|
|
ClientTestCode: UCOLOR_C
|
|
ClientTestName: Urine Color Client
|
|
DisciplineID: 4
|
|
DepartmentID: 4
|
|
ResultType: VSET
|
|
RefType: VSET
|
|
TEST_valueset_map_no_reftxt:
|
|
summary: Value set result with mapping but without explicit text reference entries
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: TEST_VSETM
|
|
TestSiteName: Urine Result Map
|
|
TestType: TEST
|
|
SeqScr: 150
|
|
SeqRpt: 150
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
testmap:
|
|
- HostType: SITE
|
|
HostID: '1'
|
|
ClientType: WST
|
|
ClientID: '8'
|
|
details:
|
|
- HostTestCode: UGLUC
|
|
HostTestName: Urine Glucose
|
|
ConDefID: 12
|
|
ClientTestCode: UGLUC_C
|
|
ClientTestName: Urine Glucose Client
|
|
DisciplineID: 4
|
|
DepartmentID: 4
|
|
ResultType: VSET
|
|
RefType: VSET
|
|
CALC_basic:
|
|
summary: Calculated test with members (no references)
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: CALC_BASE
|
|
TestSiteName: Estimated GFR
|
|
TestType: CALC
|
|
SeqScr: 190
|
|
SeqRpt: 190
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 0
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
testdefcal:
|
|
FormulaCode: CKD_EPI(CREA,AGE,GENDER)
|
|
testdefgrp:
|
|
members:
|
|
- TestSiteID: 21
|
|
- TestSiteID: 22
|
|
CALC_full:
|
|
summary: Calculated test with numeric reference ranges and map
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: CALC_FULL
|
|
TestSiteName: Estimated GFR (Map)
|
|
TestType: CALC
|
|
SeqScr: 195
|
|
SeqRpt: 195
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 0
|
|
refnum:
|
|
- NumRefType: NMRC
|
|
RangeType: REF
|
|
Sex: '2'
|
|
LowSign: GE
|
|
Low: 10
|
|
HighSign: LE
|
|
High: 20
|
|
AgeStart: 6570
|
|
AgeEnd: 43800
|
|
Flag: 'N'
|
|
testmap:
|
|
- HostType: SITE
|
|
HostID: '1'
|
|
ClientType: WST
|
|
ClientID: '3'
|
|
details:
|
|
- HostTestCode: EGFR
|
|
HostTestName: eGFR
|
|
ConDefID: 1
|
|
ClientTestCode: EGFR_C
|
|
ClientTestName: eGFR Client
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
testdefcal:
|
|
FormulaCode: CKD_EPI(CREA,AGE,GENDER)
|
|
testdefgrp:
|
|
members:
|
|
- TestSiteID: 21
|
|
- TestSiteID: 22
|
|
GROUP_with_members:
|
|
summary: Group/profile test with members and mapping
|
|
value:
|
|
SiteID: 1
|
|
TestSiteCode: GROUP_PNL
|
|
TestSiteName: Lipid Profile
|
|
TestType: GROUP
|
|
SeqScr: 10
|
|
SeqRpt: 10
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
testmap:
|
|
- HostType: SITE
|
|
HostID: '1'
|
|
ClientType: WST
|
|
ClientID: '3'
|
|
details:
|
|
- HostTestCode: LIPID
|
|
HostTestName: Lipid Profile
|
|
ConDefID: 1
|
|
ClientTestCode: LIPID_C
|
|
ClientTestName: Lipid Client
|
|
testdefgrp:
|
|
members:
|
|
- TestSiteID: 169
|
|
- TestSiteID: 170
|
|
responses:
|
|
'201':
|
|
description: Test definition created
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: created
|
|
message:
|
|
type: string
|
|
data:
|
|
type: object
|
|
properties:
|
|
TestSiteId:
|
|
type: integer
|
|
'400':
|
|
description: Validation error (e.g., invalid member TestSiteID)
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: failed
|
|
message:
|
|
type: string
|
|
example: 'Invalid member TestSiteID(s): 185, 186. Make sure to use TestSiteID, not SeqScr or other values.'
|
|
/api/test/{id}:
|
|
get:
|
|
tags:
|
|
- Test
|
|
summary: Get test definition by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Test Site ID
|
|
responses:
|
|
'200':
|
|
description: Test definition details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/TestDefinition'
|
|
'404':
|
|
description: Test not found
|
|
patch:
|
|
tags:
|
|
- Test
|
|
summary: Update test definition
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Test Site ID
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
TestSiteID:
|
|
type: integer
|
|
description: Test Site ID (required)
|
|
TestSiteCode:
|
|
type: string
|
|
TestSiteName:
|
|
type: string
|
|
TestType:
|
|
type: string
|
|
enum:
|
|
- TEST
|
|
- PARAM
|
|
- CALC
|
|
- GROUP
|
|
- TITLE
|
|
Description:
|
|
type: string
|
|
DisciplineID:
|
|
type: integer
|
|
DepartmentID:
|
|
type: integer
|
|
ResultType:
|
|
type: string
|
|
enum:
|
|
- NMRIC
|
|
- RANGE
|
|
- TEXT
|
|
- VSET
|
|
- NORES
|
|
RefType:
|
|
type: string
|
|
enum:
|
|
- RANGE
|
|
- THOLD
|
|
- VSET
|
|
- TEXT
|
|
- NOREF
|
|
VSet:
|
|
type: integer
|
|
ReqQty:
|
|
type: number
|
|
format: decimal
|
|
ReqQtyUnit:
|
|
type: string
|
|
Unit1:
|
|
type: string
|
|
Factor:
|
|
type: number
|
|
format: decimal
|
|
Unit2:
|
|
type: string
|
|
Decimal:
|
|
type: integer
|
|
CollReq:
|
|
type: string
|
|
Method:
|
|
type: string
|
|
ExpectedTAT:
|
|
type: integer
|
|
SeqScr:
|
|
type: integer
|
|
SeqRpt:
|
|
type: integer
|
|
IndentLeft:
|
|
type: integer
|
|
FontStyle:
|
|
type: string
|
|
isVisibleScr:
|
|
type: integer
|
|
isVisibleRpt:
|
|
type: integer
|
|
isCountStat:
|
|
type: integer
|
|
testdefcal:
|
|
type: object
|
|
description: Calculated test metadata persisted in the `testdefcal` table.
|
|
properties:
|
|
FormulaCode:
|
|
type: string
|
|
description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}")
|
|
testdefgrp:
|
|
type: object
|
|
description: Group definition wrapper for CALC/GROUP member assignments.
|
|
properties:
|
|
members:
|
|
type: array
|
|
description: Array of member TestSiteIDs for CALC/GROUP definitions.
|
|
items:
|
|
type: object
|
|
properties:
|
|
TestSiteID:
|
|
type: integer
|
|
description: Foreign key referencing the member test's TestSiteID.
|
|
required:
|
|
- TestSiteID
|
|
refnum:
|
|
type: array
|
|
items:
|
|
type: object
|
|
reftxt:
|
|
type: array
|
|
items:
|
|
type: object
|
|
testmap:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
HostType:
|
|
type: string
|
|
HostID:
|
|
type: string
|
|
HostTestCode:
|
|
type: string
|
|
HostTestName:
|
|
type: string
|
|
ClientType:
|
|
type: string
|
|
ClientID:
|
|
type: string
|
|
ClientTestCode:
|
|
type: string
|
|
ClientTestName:
|
|
type: string
|
|
ConDefID:
|
|
type: integer
|
|
nullable: true
|
|
required:
|
|
- TestSiteID
|
|
responses:
|
|
'200':
|
|
description: Test definition updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
type: object
|
|
properties:
|
|
TestSiteId:
|
|
type: integer
|
|
'400':
|
|
description: Validation error (e.g., invalid member TestSiteID)
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: failed
|
|
message:
|
|
type: string
|
|
example: 'Invalid member TestSiteID(s): 185, 186. Make sure to use TestSiteID, not SeqScr or other values.'
|
|
delete:
|
|
tags:
|
|
- Test
|
|
summary: Soft delete test definition
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: Test Site ID to delete
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
TestSiteID:
|
|
type: integer
|
|
description: Optional - can be provided in body instead of path
|
|
responses:
|
|
'200':
|
|
description: Test disabled successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
data:
|
|
type: object
|
|
properties:
|
|
TestSiteId:
|
|
type: integer
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
'404':
|
|
description: Test not found
|
|
'422':
|
|
description: Test already disabled
|
|
/api/user:
|
|
get:
|
|
tags:
|
|
- User
|
|
summary: List users with pagination and search
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 1
|
|
description: Page number
|
|
- name: per_page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 20
|
|
description: Items per page
|
|
- name: search
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Search term for username, email, or name
|
|
responses:
|
|
'200':
|
|
description: List of users with pagination
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: Users retrieved successfully
|
|
data:
|
|
type: object
|
|
properties:
|
|
users:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/User'
|
|
pagination:
|
|
type: object
|
|
properties:
|
|
current_page:
|
|
type: integer
|
|
per_page:
|
|
type: integer
|
|
total:
|
|
type: integer
|
|
total_pages:
|
|
type: integer
|
|
'500':
|
|
description: Server error
|
|
post:
|
|
tags:
|
|
- User
|
|
summary: Create new user
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserCreate'
|
|
responses:
|
|
'201':
|
|
description: User created successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: User created successfully
|
|
data:
|
|
type: object
|
|
properties:
|
|
UserID:
|
|
type: integer
|
|
Username:
|
|
type: string
|
|
Email:
|
|
type: string
|
|
'400':
|
|
description: Validation failed
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: failed
|
|
message:
|
|
type: string
|
|
example: Validation failed
|
|
data:
|
|
type: object
|
|
'500':
|
|
description: Server error
|
|
/api/user/{id}:
|
|
get:
|
|
tags:
|
|
- User
|
|
summary: Get user by ID
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: User ID
|
|
responses:
|
|
'200':
|
|
description: User details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/User'
|
|
'404':
|
|
description: User not found
|
|
'500':
|
|
description: Server error
|
|
patch:
|
|
tags:
|
|
- User
|
|
summary: Update existing user
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: User ID
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserUpdate'
|
|
responses:
|
|
'200':
|
|
description: User updated successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: User updated successfully
|
|
data:
|
|
type: object
|
|
properties:
|
|
UserID:
|
|
type: integer
|
|
updated_fields:
|
|
type: array
|
|
items:
|
|
type: string
|
|
'400':
|
|
description: UserID is required
|
|
'404':
|
|
description: User not found
|
|
'500':
|
|
description: Server error
|
|
delete:
|
|
tags:
|
|
- User
|
|
summary: Delete user (soft delete)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
description: User ID
|
|
responses:
|
|
'200':
|
|
description: User deleted successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: User deleted successfully
|
|
data:
|
|
type: object
|
|
properties:
|
|
UserID:
|
|
type: integer
|
|
'404':
|
|
description: User not found
|
|
'500':
|
|
description: Server error
|
|
/api/valueset:
|
|
get:
|
|
tags:
|
|
- ValueSet
|
|
summary: List lib value sets
|
|
description: List all library/system value sets from JSON files with item counts. Returns an array of objects with value, label, and count properties.
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: search
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Optional search term to filter value set names or labels
|
|
responses:
|
|
'200':
|
|
description: List of lib value sets with item counts
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ValueSetListItem'
|
|
example:
|
|
- value: sex
|
|
label: Sex
|
|
count: 3
|
|
- value: marital_status
|
|
label: Marital Status
|
|
count: 6
|
|
- value: order_status
|
|
label: Order Status
|
|
count: 6
|
|
/api/valueset/{key}:
|
|
get:
|
|
tags:
|
|
- ValueSet
|
|
summary: Get lib value set by key
|
|
description: |
|
|
Get a specific library/system value set from JSON files.
|
|
|
|
**Available value set keys:**
|
|
- `activity_result` - Activity Result
|
|
- `additive` - Additive
|
|
- `adt_event` - ADT Event
|
|
- `area_class` - Area Class
|
|
- `body_site` - Body Site
|
|
- `collection_method` - Collection Method
|
|
- `container_cap_color` - Container Cap Color
|
|
- `container_class` - Container Class
|
|
- `container_size` - Container Size
|
|
- `country` - Country
|
|
- `death_indicator` - Death Indicator
|
|
- `did_type` - DID Type
|
|
- `enable_disable` - Enable/Disable
|
|
- `entity_type` - Entity Type
|
|
- `ethnic` - Ethnic
|
|
- `fasting_status` - Fasting Status
|
|
- `formula_language` - Formula Language
|
|
- `generate_by` - Generate By
|
|
- `identifier_type` - Identifier Type
|
|
- `location_type` - Location Type
|
|
- `marital_status` - Marital Status
|
|
- `math_sign` - Math Sign
|
|
- `numeric_ref_type` - Numeric Reference Type
|
|
- `operation` - Operation (CRUD)
|
|
- `order_priority` - Order Priority
|
|
- `order_status` - Order Status
|
|
- `race` - Race (Ethnicity)
|
|
- `range_type` - Range Type
|
|
- `reference_type` - Reference Type
|
|
- `religion` - Religion
|
|
- `requested_entity` - Requested Entity
|
|
- `result_type` - Result Type
|
|
- `result_unit` - Result Unit
|
|
- `sex` - Sex
|
|
- `site_class` - Site Class
|
|
- `site_type` - Site Type
|
|
- `specimen_activity` - Specimen Activity
|
|
- `specimen_condition` - Specimen Condition
|
|
- `specimen_role` - Specimen Role
|
|
- `specimen_status` - Specimen Status
|
|
- `specimen_type` - Specimen Type
|
|
- `test_activity` - Test Activity
|
|
- `test_type` - Test Type
|
|
- `text_ref_type` - Text Reference Type
|
|
- `unit` - Unit
|
|
- `v_category` - VCategory
|
|
- `ws_type` - Workstation Type
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: key
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
enum:
|
|
- activity_result
|
|
- additive
|
|
- adt_event
|
|
- area_class
|
|
- body_site
|
|
- collection_method
|
|
- container_cap_color
|
|
- container_class
|
|
- container_size
|
|
- country
|
|
- death_indicator
|
|
- did_type
|
|
- enable_disable
|
|
- entity_type
|
|
- ethnic
|
|
- fasting_status
|
|
- formula_language
|
|
- generate_by
|
|
- identifier_type
|
|
- location_type
|
|
- marital_status
|
|
- math_sign
|
|
- numeric_ref_type
|
|
- operation
|
|
- order_priority
|
|
- order_status
|
|
- race
|
|
- range_type
|
|
- reference_type
|
|
- religion
|
|
- requested_entity
|
|
- result_type
|
|
- result_unit
|
|
- sex
|
|
- site_class
|
|
- site_type
|
|
- specimen_activity
|
|
- specimen_condition
|
|
- specimen_role
|
|
- specimen_status
|
|
- specimen_type
|
|
- test_activity
|
|
- test_type
|
|
- text_ref_type
|
|
- unit
|
|
- v_category
|
|
- ws_type
|
|
description: Value set key name
|
|
responses:
|
|
'200':
|
|
description: Lib value set details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ValueSetLibItem'
|
|
/api/valueset/refresh:
|
|
post:
|
|
tags:
|
|
- ValueSet
|
|
summary: Refresh lib ValueSet cache
|
|
description: Clear and reload the library/system ValueSet cache from JSON files. Call this after modifying JSON files in app/Libraries/Data/.
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: Lib ValueSet cache refreshed
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: Cache cleared
|
|
/api/valueset/user/items:
|
|
get:
|
|
tags:
|
|
- ValueSet
|
|
summary: List user value set items
|
|
description: List value set items from database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: VSetID
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
description: Filter by ValueSet ID
|
|
- name: search
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Search term to filter by VValue, VDesc, or VSName
|
|
- name: param
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Alternative search parameter (alias for search)
|
|
responses:
|
|
'200':
|
|
description: List of user value set items
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ValueSetItem'
|
|
post:
|
|
tags:
|
|
- ValueSet
|
|
summary: Create user value set item
|
|
description: Create value set item in database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- VSetID
|
|
properties:
|
|
SiteID:
|
|
type: integer
|
|
description: Site reference (default 1)
|
|
VSetID:
|
|
type: integer
|
|
description: Reference to value set definition (required)
|
|
VOrder:
|
|
type: integer
|
|
description: Display order (default 0)
|
|
VValue:
|
|
type: string
|
|
description: The value code
|
|
VDesc:
|
|
type: string
|
|
description: The display description/label
|
|
responses:
|
|
'201':
|
|
description: User value set item created
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/ValueSetItem'
|
|
/api/valueset/user/items/{id}:
|
|
get:
|
|
tags:
|
|
- ValueSet
|
|
summary: Get user value set item by ID
|
|
description: Get value set item from database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: User value set item details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/ValueSetItem'
|
|
put:
|
|
tags:
|
|
- ValueSet
|
|
summary: Update user value set item
|
|
description: Update value set item in database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
SiteID:
|
|
type: integer
|
|
description: Site reference
|
|
VSetID:
|
|
type: integer
|
|
description: Reference to value set definition
|
|
VOrder:
|
|
type: integer
|
|
description: Display order
|
|
VValue:
|
|
type: string
|
|
description: The value code
|
|
VDesc:
|
|
type: string
|
|
description: The display description/label
|
|
responses:
|
|
'200':
|
|
description: User value set item updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/ValueSetItem'
|
|
delete:
|
|
tags:
|
|
- ValueSet
|
|
summary: Delete user value set item
|
|
description: Delete value set item from database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: User value set item deleted
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
/api/valueset/user/def:
|
|
get:
|
|
tags:
|
|
- ValueSet
|
|
summary: List user value set definitions
|
|
description: List value set definitions from database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: search
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Optional search term to filter definitions
|
|
- name: page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 1
|
|
description: Page number for pagination
|
|
- name: limit
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 100
|
|
description: Number of items per page
|
|
responses:
|
|
'200':
|
|
description: List of user value set definitions
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ValueSetDef'
|
|
meta:
|
|
type: object
|
|
properties:
|
|
total:
|
|
type: integer
|
|
page:
|
|
type: integer
|
|
limit:
|
|
type: integer
|
|
post:
|
|
tags:
|
|
- ValueSet
|
|
summary: Create user value set definition
|
|
description: Create value set definition in database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
SiteID:
|
|
type: integer
|
|
description: Site reference (default 1)
|
|
VSName:
|
|
type: string
|
|
description: Value set name
|
|
VSDesc:
|
|
type: string
|
|
description: Value set description
|
|
responses:
|
|
'201':
|
|
description: User value set definition created
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/ValueSetDef'
|
|
/api/valueset/user/def/{id}:
|
|
get:
|
|
tags:
|
|
- ValueSet
|
|
summary: Get user value set definition by ID
|
|
description: Get value set definition from database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: User value set definition details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/ValueSetDef'
|
|
put:
|
|
tags:
|
|
- ValueSet
|
|
summary: Update user value set definition
|
|
description: Update value set definition in database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
SiteID:
|
|
type: integer
|
|
description: Site reference
|
|
VSName:
|
|
type: string
|
|
description: Value set name
|
|
VSDesc:
|
|
type: string
|
|
description: Value set description
|
|
responses:
|
|
'200':
|
|
description: User value set definition updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/ValueSetDef'
|
|
delete:
|
|
tags:
|
|
- ValueSet
|
|
summary: Delete user value set definition
|
|
description: Delete value set definition from database (user-defined)
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: User value set definition deleted
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
components:
|
|
securitySchemes:
|
|
bearerAuth:
|
|
type: http
|
|
scheme: bearer
|
|
bearerFormat: JWT
|
|
description: JWT token from login endpoint
|
|
cookieAuth:
|
|
type: apiKey
|
|
in: cookie
|
|
name: token
|
|
description: JWT token stored in HTTP-only cookie
|
|
schemas:
|
|
SuccessResponse:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
code:
|
|
type: integer
|
|
example: 200
|
|
ErrorResponse:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: error
|
|
message:
|
|
type: string
|
|
errors:
|
|
type: object
|
|
DashboardSummary:
|
|
type: object
|
|
properties:
|
|
pendingOrders:
|
|
type: integer
|
|
todayResults:
|
|
type: integer
|
|
criticalResults:
|
|
type: integer
|
|
activePatients:
|
|
type: integer
|
|
LoginRequest:
|
|
type: object
|
|
required:
|
|
- username
|
|
- password
|
|
properties:
|
|
username:
|
|
type: string
|
|
example: labuser01
|
|
password:
|
|
type: string
|
|
format: password
|
|
example: secret123
|
|
LoginResponse:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
code:
|
|
type: integer
|
|
example: 200
|
|
message:
|
|
type: string
|
|
example: Login successful
|
|
RegisterRequest:
|
|
type: object
|
|
required:
|
|
- username
|
|
- password
|
|
- email
|
|
properties:
|
|
username:
|
|
type: string
|
|
password:
|
|
type: string
|
|
format: password
|
|
email:
|
|
type: string
|
|
format: email
|
|
full_name:
|
|
type: string
|
|
Patient:
|
|
type: object
|
|
required:
|
|
- PatientID
|
|
- Sex
|
|
- NameFirst
|
|
- Birthdate
|
|
properties:
|
|
PatientID:
|
|
type: string
|
|
maxLength: 30
|
|
pattern: ^[A-Za-z0-9]+$
|
|
description: Internal patient identifier
|
|
AlternatePID:
|
|
type: string
|
|
maxLength: 30
|
|
pattern: ^[A-Za-z0-9]+$
|
|
Prefix:
|
|
type: string
|
|
maxLength: 10
|
|
enum:
|
|
- Mr
|
|
- Mrs
|
|
- Ms
|
|
- Dr
|
|
- Prof
|
|
Sex:
|
|
type: string
|
|
enum:
|
|
- '1'
|
|
- '2'
|
|
description: '1: Female, 2: Male'
|
|
NameFirst:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 60
|
|
pattern: ^[A-Za-z'\. ]+$
|
|
NameMiddle:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 60
|
|
NameMaiden:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 60
|
|
NameLast:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 60
|
|
Suffix:
|
|
type: string
|
|
maxLength: 10
|
|
Birthdate:
|
|
type: string
|
|
format: date-time
|
|
description: ISO 8601 UTC datetime
|
|
PlaceOfBirth:
|
|
type: string
|
|
maxLength: 100
|
|
Citizenship:
|
|
type: string
|
|
maxLength: 100
|
|
Street_1:
|
|
type: string
|
|
maxLength: 255
|
|
Street_2:
|
|
type: string
|
|
maxLength: 255
|
|
Street_3:
|
|
type: string
|
|
maxLength: 255
|
|
ZIP:
|
|
type: string
|
|
maxLength: 10
|
|
pattern: ^[0-9]+$
|
|
Phone:
|
|
type: string
|
|
pattern: ^\+?[0-9]{8,15}$
|
|
MobilePhone:
|
|
type: string
|
|
pattern: ^\+?[0-9]{8,15}$
|
|
EmailAddress1:
|
|
type: string
|
|
format: email
|
|
maxLength: 100
|
|
EmailAddress2:
|
|
type: string
|
|
format: email
|
|
maxLength: 100
|
|
PatIdt:
|
|
$ref: '#/components/schemas/PatientIdentifier'
|
|
LinkTo:
|
|
type: array
|
|
description: Array of linked patient references
|
|
items:
|
|
$ref: '#/components/schemas/LinkedPatient'
|
|
Custodian:
|
|
$ref: '#/components/schemas/Custodian'
|
|
isDead:
|
|
type: string
|
|
enum:
|
|
- '0'
|
|
- '1'
|
|
description: '0: No (alive), 1: Yes (deceased)'
|
|
TimeOfDeath:
|
|
type: string
|
|
format: date-time
|
|
description: ISO 8601 UTC datetime of death
|
|
PatCom:
|
|
type: string
|
|
description: Patient comment/notes
|
|
PatAtt:
|
|
type: array
|
|
description: Patient address entries
|
|
items:
|
|
$ref: '#/components/schemas/PatAttEntry'
|
|
Province:
|
|
type: integer
|
|
description: Province AreaGeoID (foreign key to areageo table)
|
|
ProvinceLabel:
|
|
type: string
|
|
description: Province name (resolved from areageo)
|
|
City:
|
|
type: integer
|
|
description: City AreaGeoID (foreign key to areageo table)
|
|
CityLabel:
|
|
type: string
|
|
description: City name (resolved from areageo)
|
|
Country:
|
|
type: string
|
|
maxLength: 10
|
|
description: Country ISO 3-letter code (e.g., IDN, USA)
|
|
CountryLabel:
|
|
type: string
|
|
description: Country name (resolved from valueset)
|
|
Race:
|
|
type: string
|
|
maxLength: 100
|
|
MaritalStatus:
|
|
type: string
|
|
enum:
|
|
- A
|
|
- B
|
|
- D
|
|
- M
|
|
- S
|
|
- W
|
|
description: 'A: Annulled, B: Separated, D: Divorced, M: Married, S: Single, W: Widowed'
|
|
Religion:
|
|
type: string
|
|
maxLength: 100
|
|
Ethnic:
|
|
type: string
|
|
maxLength: 100
|
|
PatientIdentifier:
|
|
type: object
|
|
properties:
|
|
IdentifierType:
|
|
type: string
|
|
enum:
|
|
- KTP
|
|
- PASS
|
|
- SSN
|
|
- SIM
|
|
- KTAS
|
|
description: |
|
|
KTP: 16 digit numeric
|
|
PASS: alphanumeric max 9
|
|
SSN: 9 digit numeric
|
|
SIM: 19-20 digit numeric
|
|
KTAS: 11 digit numeric
|
|
Identifier:
|
|
type: string
|
|
maxLength: 255
|
|
LinkedPatient:
|
|
type: object
|
|
description: Linked patient reference
|
|
properties:
|
|
InternalPID:
|
|
type: integer
|
|
description: Internal patient ID of the linked patient
|
|
PatientID:
|
|
type: string
|
|
description: Patient ID of the linked patient
|
|
Custodian:
|
|
type: object
|
|
description: Patient custodian/guardian
|
|
properties:
|
|
InternalPID:
|
|
type: integer
|
|
description: Internal patient ID of the custodian
|
|
PatientID:
|
|
type: string
|
|
description: Patient ID of the custodian
|
|
PatAttEntry:
|
|
type: object
|
|
description: Patient address/attorney entry
|
|
properties:
|
|
Address:
|
|
type: string
|
|
description: Address text
|
|
PatientListResponse:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Patient'
|
|
pagination:
|
|
type: object
|
|
properties:
|
|
page:
|
|
type: integer
|
|
perPage:
|
|
type: integer
|
|
total:
|
|
type: integer
|
|
PatientVisit:
|
|
type: object
|
|
properties:
|
|
InternalPVID:
|
|
type: integer
|
|
description: Primary key (auto-generated)
|
|
PVID:
|
|
type: string
|
|
description: Visit ID (auto-generated with DV prefix if not provided)
|
|
InternalPID:
|
|
type: integer
|
|
description: Reference to patient
|
|
EpisodeID:
|
|
type: string
|
|
description: Episode identifier
|
|
SiteID:
|
|
type: integer
|
|
description: Site reference
|
|
LastLocation:
|
|
type: string
|
|
description: Full name of the last/current location from patvisitadt
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
ArchivedDate:
|
|
type: string
|
|
format: date-time
|
|
DelDate:
|
|
type: string
|
|
format: date-time
|
|
PatDiag:
|
|
type: object
|
|
description: Diagnosis information (optional)
|
|
properties:
|
|
DiagCode:
|
|
type: string
|
|
Diagnosis:
|
|
type: string
|
|
PatVisitADT:
|
|
type: object
|
|
description: ADT (Admission/Discharge/Transfer) information (optional)
|
|
properties:
|
|
ADTCode:
|
|
type: string
|
|
enum:
|
|
- A01
|
|
- A02
|
|
- A03
|
|
- A04
|
|
- A08
|
|
LocationID:
|
|
type: integer
|
|
AttDoc:
|
|
type: integer
|
|
description: Attending physician ContactID
|
|
RefDoc:
|
|
type: integer
|
|
description: Referring physician ContactID
|
|
AdmDoc:
|
|
type: integer
|
|
description: Admitting physician ContactID
|
|
CnsDoc:
|
|
type: integer
|
|
description: Consulting physician ContactID
|
|
PatVisitADT:
|
|
type: object
|
|
properties:
|
|
PVADTID:
|
|
type: integer
|
|
description: Primary key (auto-generated)
|
|
InternalPVID:
|
|
type: integer
|
|
description: Reference to patient visit
|
|
ADTCode:
|
|
type: string
|
|
enum:
|
|
- A01
|
|
- A02
|
|
- A03
|
|
- A04
|
|
- A08
|
|
description: |
|
|
A01: Admit
|
|
A02: Transfer
|
|
A03: Discharge
|
|
A04: Register
|
|
A08: Update
|
|
LocationID:
|
|
type: integer
|
|
description: Location/ward reference
|
|
AttDoc:
|
|
type: integer
|
|
description: Attending physician ContactID
|
|
RefDoc:
|
|
type: integer
|
|
description: Referring physician ContactID
|
|
AdmDoc:
|
|
type: integer
|
|
description: Admitting physician ContactID
|
|
CnsDoc:
|
|
type: integer
|
|
description: Consulting physician ContactID
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
ArchivedDate:
|
|
type: string
|
|
format: date-time
|
|
DelDate:
|
|
type: string
|
|
format: date-time
|
|
Account:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
AccountName:
|
|
type: string
|
|
AccountCode:
|
|
type: string
|
|
AccountType:
|
|
type: string
|
|
Site:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
SiteName:
|
|
type: string
|
|
SiteCode:
|
|
type: string
|
|
maxLength: 2
|
|
pattern: ^[A-Z0-9]{2}$
|
|
AccountID:
|
|
type: integer
|
|
Discipline:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
DisciplineName:
|
|
type: string
|
|
DisciplineCode:
|
|
type: string
|
|
SeqScr:
|
|
type: integer
|
|
description: Display order on screen
|
|
SeqRpt:
|
|
type: integer
|
|
description: Display order in reports
|
|
Department:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
DeptName:
|
|
type: string
|
|
DeptCode:
|
|
type: string
|
|
SiteID:
|
|
type: integer
|
|
Workstation:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
WorkstationName:
|
|
type: string
|
|
WorkstationCode:
|
|
type: string
|
|
SiteID:
|
|
type: integer
|
|
DepartmentID:
|
|
type: integer
|
|
HostApp:
|
|
type: object
|
|
properties:
|
|
HostAppID:
|
|
type: string
|
|
maxLength: 5
|
|
HostAppName:
|
|
type: string
|
|
SiteID:
|
|
type: integer
|
|
SiteName:
|
|
type: string
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
HostComPara:
|
|
type: object
|
|
properties:
|
|
HostAppID:
|
|
type: string
|
|
maxLength: 5
|
|
HostAppName:
|
|
type: string
|
|
HostIP:
|
|
type: string
|
|
maxLength: 15
|
|
HostPort:
|
|
type: string
|
|
maxLength: 6
|
|
HostPwd:
|
|
type: string
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
CodingSys:
|
|
type: object
|
|
properties:
|
|
CodingSysID:
|
|
type: integer
|
|
CodingSysAbb:
|
|
type: string
|
|
maxLength: 6
|
|
FullText:
|
|
type: string
|
|
Description:
|
|
type: string
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
Specimen:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
SpecimenID:
|
|
type: string
|
|
PatientID:
|
|
type: string
|
|
SpecimenType:
|
|
type: string
|
|
description: Specimen type code
|
|
SpecimenTypeLabel:
|
|
type: string
|
|
description: Specimen type display text
|
|
CollectionDate:
|
|
type: string
|
|
format: date-time
|
|
CollectionMethod:
|
|
type: string
|
|
description: Collection method code
|
|
CollectionMethodLabel:
|
|
type: string
|
|
description: Collection method display text
|
|
ContainerID:
|
|
type: integer
|
|
SpecimenStatus:
|
|
type: string
|
|
description: Specimen status code
|
|
SpecimenStatusLabel:
|
|
type: string
|
|
description: Specimen status display text
|
|
BodySite:
|
|
type: string
|
|
description: Body site code
|
|
BodySiteLabel:
|
|
type: string
|
|
description: Body site display text
|
|
ContainerDef:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
ContainerCode:
|
|
type: string
|
|
ContainerName:
|
|
type: string
|
|
ConCategory:
|
|
type: string
|
|
description: Container category code
|
|
ConCategoryLabel:
|
|
type: string
|
|
description: Container category display text
|
|
ConSize:
|
|
type: string
|
|
description: Container size code
|
|
ConSizeLabel:
|
|
type: string
|
|
description: Container size display text
|
|
CapColor:
|
|
type: string
|
|
description: Cap color code
|
|
CapColorLabel:
|
|
type: string
|
|
description: Cap color display text
|
|
SpecimenPrep:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
PrepCode:
|
|
type: string
|
|
PrepName:
|
|
type: string
|
|
Description:
|
|
type: string
|
|
SpecimenStatus:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
StatusCode:
|
|
type: string
|
|
StatusName:
|
|
type: string
|
|
Description:
|
|
type: string
|
|
Status:
|
|
type: string
|
|
description: Status code
|
|
StatusLabel:
|
|
type: string
|
|
description: Status display text
|
|
Activity:
|
|
type: string
|
|
description: Activity code
|
|
ActivityLabel:
|
|
type: string
|
|
description: Activity display text
|
|
SpecimenCollection:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
CollectionCode:
|
|
type: string
|
|
CollectionName:
|
|
type: string
|
|
Description:
|
|
type: string
|
|
CollectionMethod:
|
|
type: string
|
|
description: Collection method code
|
|
CollectionMethodLabel:
|
|
type: string
|
|
description: Collection method display text
|
|
Additive:
|
|
type: string
|
|
description: Additive code
|
|
AdditiveLabel:
|
|
type: string
|
|
description: Additive display text
|
|
SpecimenRole:
|
|
type: string
|
|
description: Specimen role code
|
|
SpecimenRoleLabel:
|
|
type: string
|
|
description: Specimen role display text
|
|
TestDefinition:
|
|
type: object
|
|
properties:
|
|
TestSiteID:
|
|
type: integer
|
|
SiteID:
|
|
type: integer
|
|
TestSiteCode:
|
|
type: string
|
|
TestSiteName:
|
|
type: string
|
|
TestType:
|
|
type: string
|
|
enum:
|
|
- TEST
|
|
- PARAM
|
|
- CALC
|
|
- GROUP
|
|
- TITLE
|
|
description: |
|
|
TEST: Technical test
|
|
PARAM: Parameter
|
|
CALC: Calculated
|
|
GROUP: Panel/Profile
|
|
TITLE: Section header
|
|
Description:
|
|
type: string
|
|
DisciplineID:
|
|
type: integer
|
|
DisciplineName:
|
|
type: string
|
|
DepartmentID:
|
|
type: integer
|
|
DepartmentName:
|
|
type: string
|
|
ResultType:
|
|
type: string
|
|
enum:
|
|
- NMRIC
|
|
- RANGE
|
|
- TEXT
|
|
- VSET
|
|
- NORES
|
|
description: |
|
|
Result type determines the format of test results:
|
|
- NMRIC: Single numeric value
|
|
- RANGE: Numeric range (min-max)
|
|
- TEXT: Free text result
|
|
- VSET: Value set/enum result
|
|
- NORES: No result (for GROUP and TITLE types)
|
|
|
|
TestType to ResultType mapping:
|
|
- TEST: NMRIC | RANGE | TEXT | VSET
|
|
- PARAM: NMRIC | RANGE | TEXT | VSET
|
|
- CALC: NMRIC (calculated result is always numeric)
|
|
- GROUP: NORES (no result, container only)
|
|
- TITLE: NORES (no result, header only)
|
|
RefType:
|
|
type: string
|
|
enum:
|
|
- RANGE
|
|
- THOLD
|
|
- VSET
|
|
- TEXT
|
|
- NOREF
|
|
description: |
|
|
Reference type determines which reference range table to use:
|
|
- RANGE: Numeric reference range
|
|
- THOLD: Threshold/panic range
|
|
- VSET: Value set reference
|
|
- TEXT: Free text reference
|
|
- NOREF: No reference (for NORES result type)
|
|
|
|
ResultType to RefType mapping:
|
|
- NMRIC: RANGE | THOLD → refnum table
|
|
- RANGE: RANGE | THOLD → refnum table
|
|
- VSET: VSET → reftxt table
|
|
- TEXT: TEXT → reftxt table
|
|
- NORES: NOREF → (no reference table)
|
|
VSet:
|
|
type: integer
|
|
description: Value set ID for VSET result type
|
|
ReqQty:
|
|
type: number
|
|
format: decimal
|
|
description: Required sample quantity
|
|
ReqQtyUnit:
|
|
type: string
|
|
description: Unit for required quantity
|
|
Unit1:
|
|
type: string
|
|
description: Primary unit
|
|
Factor:
|
|
type: number
|
|
format: decimal
|
|
description: Conversion factor
|
|
Unit2:
|
|
type: string
|
|
description: Secondary unit (after conversion)
|
|
Decimal:
|
|
type: integer
|
|
description: Number of decimal places
|
|
CollReq:
|
|
type: string
|
|
description: Collection requirements
|
|
Method:
|
|
type: string
|
|
description: Test method
|
|
ExpectedTAT:
|
|
type: integer
|
|
description: Expected turnaround time
|
|
SeqScr:
|
|
type: integer
|
|
description: Screen sequence
|
|
SeqRpt:
|
|
type: integer
|
|
description: Report sequence
|
|
IndentLeft:
|
|
type: integer
|
|
default: 0
|
|
FontStyle:
|
|
type: string
|
|
isVisibleScr:
|
|
type: integer
|
|
default: 1
|
|
description: Screen visibility (0=hidden, 1=visible)
|
|
isVisibleRpt:
|
|
type: integer
|
|
default: 1
|
|
description: Report visibility (0=hidden, 1=visible)
|
|
isCountStat:
|
|
type: integer
|
|
default: 1
|
|
Level:
|
|
type: integer
|
|
isRequestable:
|
|
type: integer
|
|
default: 1
|
|
description: Flag indicating if test can be requested (1=yes, 0=no)
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
StartDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
FormulaCode:
|
|
type: string
|
|
description: Formula expression for calculated tests
|
|
testdefcal:
|
|
type: array
|
|
description: Calculated test details (only for CALC type)
|
|
items:
|
|
type: object
|
|
testdefgrp:
|
|
type: object
|
|
description: Group definition payload for GROUP and CALC types.
|
|
properties:
|
|
members:
|
|
type: array
|
|
description: |
|
|
Group members (for GROUP and CALC types).
|
|
When creating or updating, provide members in testdefgrp.members with TestSiteID field.
|
|
Do NOT use Member, SeqScr, or Members fields when creating/updating.
|
|
items:
|
|
type: object
|
|
properties:
|
|
TestGrpID:
|
|
type: integer
|
|
description: Group membership record ID
|
|
TestSiteID:
|
|
type: integer
|
|
description: Parent group TestSiteID
|
|
Member:
|
|
type: integer
|
|
description: |
|
|
Member TestSiteID (foreign key to testdefsite).
|
|
**Note**: This field is in the response. When creating/updating, use TestSiteID in testdefgrp.members instead.
|
|
TestSiteCode:
|
|
type: string
|
|
description: Member test code
|
|
TestSiteName:
|
|
type: string
|
|
description: Member test name
|
|
TestType:
|
|
type: string
|
|
description: Member test type
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
testmap:
|
|
type: array
|
|
description: Flat test mapping payload for /api/test create/update
|
|
items:
|
|
type: object
|
|
properties:
|
|
HostType:
|
|
type: string
|
|
HostID:
|
|
type: string
|
|
HostTestCode:
|
|
type: string
|
|
HostTestName:
|
|
type: string
|
|
ClientType:
|
|
type: string
|
|
ClientID:
|
|
type: string
|
|
ClientTestCode:
|
|
type: string
|
|
ClientTestName:
|
|
type: string
|
|
ConDefID:
|
|
type: integer
|
|
nullable: true
|
|
refnum:
|
|
type: array
|
|
description: Numeric reference ranges (optional). Mutually exclusive with reftxt - a test can only have ONE reference type.
|
|
items:
|
|
type: object
|
|
properties:
|
|
RefNumID:
|
|
type: integer
|
|
NumRefType:
|
|
type: string
|
|
enum:
|
|
- NMRC
|
|
- THOLD
|
|
description: NMRC=Numeric range, THOLD=Threshold
|
|
NumRefTypeLabel:
|
|
type: string
|
|
RangeType:
|
|
type: string
|
|
RangeTypeLabel:
|
|
type: string
|
|
SpcType:
|
|
type: string
|
|
description: Specimen type code (e.g., GEN, EDTA)
|
|
Sex:
|
|
type: string
|
|
SexLabel:
|
|
type: string
|
|
LowSign:
|
|
type: string
|
|
LowSignLabel:
|
|
type: string
|
|
HighSign:
|
|
type: string
|
|
HighSignLabel:
|
|
type: string
|
|
High:
|
|
type: number
|
|
format: float
|
|
Low:
|
|
type: number
|
|
format: float
|
|
AgeStart:
|
|
type: integer
|
|
description: Minimum patient age in days
|
|
AgeEnd:
|
|
type: integer
|
|
description: Maximum patient age in days
|
|
Flag:
|
|
type: string
|
|
Interpretation:
|
|
type: string
|
|
Notes:
|
|
type: string
|
|
description: Optional note attached to the numeric reference range
|
|
reftxt:
|
|
type: array
|
|
description: Text reference ranges (optional). Mutually exclusive with refnum - a test can only have ONE reference type.
|
|
items:
|
|
type: object
|
|
properties:
|
|
RefTxtID:
|
|
type: integer
|
|
TxtRefType:
|
|
type: string
|
|
enum:
|
|
- TEXT
|
|
- VSET
|
|
description: TEXT=Free text, VSET=Value set
|
|
TxtRefTypeLabel:
|
|
type: string
|
|
Sex:
|
|
type: string
|
|
SexLabel:
|
|
type: string
|
|
AgeStart:
|
|
type: integer
|
|
description: Minimum patient age in days
|
|
AgeEnd:
|
|
type: integer
|
|
description: Maximum patient age in days
|
|
RefTxt:
|
|
type: string
|
|
Flag:
|
|
type: string
|
|
examples:
|
|
TEST_numeric:
|
|
summary: Technical test with numeric reference
|
|
value:
|
|
TestSiteID: 1
|
|
SiteID: 1
|
|
TestSiteCode: GLU
|
|
TestSiteName: Glucose
|
|
TestType: TEST
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
ResultType: NMRIC
|
|
RefType: NMRC
|
|
Unit1: mg/dL
|
|
ReqQty: 300
|
|
ReqQtyUnit: uL
|
|
Decimal: 0
|
|
Method: Hexokinase
|
|
SeqScr: 11
|
|
SeqRpt: 11
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
refnum:
|
|
- RefNumID: 1
|
|
NumRefType: NMRC
|
|
NumRefTypeLabel: Numeric
|
|
RangeType: REF
|
|
RangeTypeLabel: Reference Range
|
|
Sex: '2'
|
|
SexLabel: Male
|
|
LowSign: GE
|
|
LowSignLabel: '>='
|
|
HighSign: LE
|
|
HighSignLabel: <=
|
|
Low: 70
|
|
High: 100
|
|
AgeStart: 6570
|
|
AgeEnd: 36135
|
|
Flag: 'N'
|
|
Interpretation: Normal
|
|
TEST_threshold:
|
|
summary: Technical test with threshold reference (panic)
|
|
value:
|
|
TestSiteID: 2
|
|
SiteID: 1
|
|
TestSiteCode: GLU
|
|
TestSiteName: Glucose
|
|
TestType: TEST
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
ResultType: NMRIC
|
|
RefType: THOLD
|
|
Unit1: mg/dL
|
|
Decimal: 0
|
|
Method: Hexokinase
|
|
SeqScr: 11
|
|
SeqRpt: 11
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
refnum:
|
|
- RefNumID: 2
|
|
NumRefType: THOLD
|
|
NumRefTypeLabel: Threshold
|
|
RangeType: PANIC
|
|
RangeTypeLabel: Panic Range
|
|
Sex: '1'
|
|
SexLabel: Female
|
|
LowSign: LT
|
|
LowSignLabel: <
|
|
High: 40
|
|
AgeStart: 0
|
|
AgeEnd: 43800
|
|
Flag: L
|
|
Interpretation: Critical Low
|
|
TEST_text:
|
|
summary: Technical test with text reference
|
|
value:
|
|
TestSiteID: 3
|
|
SiteID: 1
|
|
TestSiteCode: STAGE
|
|
TestSiteName: Disease Stage
|
|
TestType: TEST
|
|
DisciplineID: 1
|
|
DepartmentID: 1
|
|
ResultType: VSET
|
|
RefType: TEXT
|
|
SeqScr: 50
|
|
SeqRpt: 50
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
reftxt:
|
|
- RefTxtID: 1
|
|
TxtRefType: TEXT
|
|
TxtRefTypeLabel: Text
|
|
Sex: '2'
|
|
SexLabel: Male
|
|
AgeStart: 6570
|
|
AgeEnd: 36135
|
|
RefTxt: NORM=Normal;HYPO=Hypochromic;MACRO=Macrocytic
|
|
Flag: 'N'
|
|
PARAM:
|
|
summary: Parameter test
|
|
value:
|
|
TestSiteID: 4
|
|
SiteID: 1
|
|
TestSiteCode: HEIGHT
|
|
TestSiteName: Height
|
|
TestType: PARAM
|
|
DisciplineID: 10
|
|
ResultType: NMRIC
|
|
Unit1: cm
|
|
Decimal: 0
|
|
SeqScr: 40
|
|
SeqRpt: 40
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 0
|
|
isCountStat: 0
|
|
CALC:
|
|
summary: Calculated test with reference
|
|
value:
|
|
TestSiteID: 5
|
|
SiteID: 1
|
|
TestSiteCode: EGFR
|
|
TestSiteName: eGFR
|
|
TestType: CALC
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
Unit1: mL/min/1.73m2
|
|
Decimal: 0
|
|
SeqScr: 20
|
|
SeqRpt: 20
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 0
|
|
testdefcal:
|
|
- TestCalID: 1
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
FormulaCode: CKD_EPI(CREA,AGE,GENDER)
|
|
Unit1: mL/min/1.73m2
|
|
Decimal: 0
|
|
testdefgrp:
|
|
members:
|
|
- TestSiteID: 21
|
|
TestSiteCode: CREA
|
|
TestSiteName: Creatinine
|
|
TestType: TEST
|
|
- TestSiteID: 51
|
|
TestSiteCode: AGE
|
|
TestSiteName: Age
|
|
TestType: PARAM
|
|
refnum:
|
|
- RefNumID: 5
|
|
NumRefType: NMRC
|
|
NumRefTypeLabel: Numeric
|
|
RangeType: REF
|
|
RangeTypeLabel: Reference Range
|
|
Sex: '1'
|
|
SexLabel: Female
|
|
LowSign: GE
|
|
LowSignLabel: '>='
|
|
HighSign: LE
|
|
HighSignLabel: <=
|
|
Low: 10
|
|
High: 20
|
|
AgeStart: 6570
|
|
AgeEnd: 43800
|
|
Flag: 'N'
|
|
Interpretation: Normal
|
|
GROUP:
|
|
summary: Panel/Profile test
|
|
value:
|
|
TestSiteID: 6
|
|
SiteID: 1
|
|
TestSiteCode: LIPID
|
|
TestSiteName: Lipid Panel
|
|
TestType: GROUP
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
SeqScr: 51
|
|
SeqRpt: 51
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 1
|
|
testdefgrp:
|
|
members:
|
|
- TestGrpID: 1
|
|
TestSiteID: 6
|
|
Member: 100
|
|
MemberTestSiteID: 100
|
|
TestSiteCode: CHOL
|
|
TestSiteName: Total Cholesterol
|
|
TestType: TEST
|
|
- TestGrpID: 2
|
|
TestSiteID: 6
|
|
Member: 101
|
|
MemberTestSiteID: 101
|
|
TestSiteCode: TG
|
|
TestSiteName: Triglycerides
|
|
TestType: TEST
|
|
TITLE:
|
|
summary: Section header
|
|
value:
|
|
TestSiteID: 7
|
|
SiteID: 1
|
|
TestSiteCode: CHEM_HEADER
|
|
TestSiteName: '--- CHEMISTRY ---'
|
|
TestType: TITLE
|
|
DisciplineID: 2
|
|
DepartmentID: 2
|
|
SeqScr: 100
|
|
SeqRpt: 100
|
|
isVisibleScr: 1
|
|
isVisibleRpt: 1
|
|
isCountStat: 0
|
|
TestMap:
|
|
type: object
|
|
properties:
|
|
TestMapID:
|
|
type: integer
|
|
HostType:
|
|
type: string
|
|
description: Host type code (e.g., SITE, WORKSTATION, INSTRUMENT)
|
|
HostID:
|
|
type: string
|
|
description: Host identifier
|
|
ClientType:
|
|
type: string
|
|
description: Client type code (e.g., SITE, WORKSTATION, INSTRUMENT)
|
|
ClientID:
|
|
type: string
|
|
description: Client identifier
|
|
HostName:
|
|
type: string
|
|
description: Resolved host name (from view)
|
|
ClientName:
|
|
type: string
|
|
description: Resolved client name (from view)
|
|
details:
|
|
type: array
|
|
description: Test mapping detail records
|
|
items:
|
|
$ref: '#/components/schemas/TestMapDetail'
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
description: Soft delete timestamp
|
|
OrderTestList:
|
|
type: object
|
|
properties:
|
|
InternalOID:
|
|
type: integer
|
|
description: Internal order ID
|
|
OrderID:
|
|
type: string
|
|
description: Order ID (e.g., 0025030300001)
|
|
PlacerID:
|
|
type: string
|
|
nullable: true
|
|
InternalPID:
|
|
type: integer
|
|
description: Patient internal ID
|
|
SiteID:
|
|
type: integer
|
|
PVADTID:
|
|
type: integer
|
|
description: Visit ADT ID
|
|
ReqApp:
|
|
type: string
|
|
nullable: true
|
|
Priority:
|
|
type: string
|
|
enum:
|
|
- R
|
|
- S
|
|
- U
|
|
description: |
|
|
R: Routine
|
|
S: Stat
|
|
U: Urgent
|
|
PriorityLabel:
|
|
type: string
|
|
description: Priority display text
|
|
TrnDate:
|
|
type: string
|
|
format: date-time
|
|
description: Transaction/Order date
|
|
EffDate:
|
|
type: string
|
|
format: date-time
|
|
description: Effective date
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
OrderStatus:
|
|
type: string
|
|
enum:
|
|
- ORD
|
|
- SCH
|
|
- ANA
|
|
- VER
|
|
- REV
|
|
- REP
|
|
description: |
|
|
ORD: Ordered
|
|
SCH: Scheduled
|
|
ANA: Analysis
|
|
VER: Verified
|
|
REV: Reviewed
|
|
REP: Reported
|
|
OrderStatusLabel:
|
|
type: string
|
|
description: Order status display text
|
|
OrderTest:
|
|
type: object
|
|
properties:
|
|
InternalOID:
|
|
type: integer
|
|
description: Internal order ID
|
|
OrderID:
|
|
type: string
|
|
description: Order ID (e.g., 0025030300001)
|
|
PlacerID:
|
|
type: string
|
|
nullable: true
|
|
InternalPID:
|
|
type: integer
|
|
description: Patient internal ID
|
|
SiteID:
|
|
type: integer
|
|
PVADTID:
|
|
type: integer
|
|
description: Visit ADT ID
|
|
ReqApp:
|
|
type: string
|
|
nullable: true
|
|
Priority:
|
|
type: string
|
|
enum:
|
|
- R
|
|
- S
|
|
- U
|
|
description: |
|
|
R: Routine
|
|
S: Stat
|
|
U: Urgent
|
|
PriorityLabel:
|
|
type: string
|
|
description: Priority display text
|
|
TrnDate:
|
|
type: string
|
|
format: date-time
|
|
description: Transaction/Order date
|
|
EffDate:
|
|
type: string
|
|
format: date-time
|
|
description: Effective date
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
OrderStatus:
|
|
type: string
|
|
enum:
|
|
- ORD
|
|
- SCH
|
|
- ANA
|
|
- VER
|
|
- REV
|
|
- REP
|
|
description: |
|
|
ORD: Ordered
|
|
SCH: Scheduled
|
|
ANA: Analysis
|
|
VER: Verified
|
|
REV: Reviewed
|
|
REP: Reported
|
|
OrderStatusLabel:
|
|
type: string
|
|
description: Order status display text
|
|
Specimens:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/OrderSpecimen'
|
|
description: Associated specimens for this order
|
|
Tests:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/OrderTestItem'
|
|
description: Test results (patres) for this order
|
|
OrderItem:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
OrderID:
|
|
type: string
|
|
TestID:
|
|
type: integer
|
|
SpecimenID:
|
|
type: string
|
|
Status:
|
|
type: string
|
|
EdgeResultRequest:
|
|
type: object
|
|
required:
|
|
- sample_id
|
|
- instrument_id
|
|
properties:
|
|
sample_id:
|
|
type: string
|
|
description: Sample barcode/identifier
|
|
instrument_id:
|
|
type: string
|
|
description: Instrument identifier
|
|
patient_id:
|
|
type: string
|
|
description: Patient identifier (optional)
|
|
results:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
test_code:
|
|
type: string
|
|
result_value:
|
|
type: string
|
|
unit:
|
|
type: string
|
|
flags:
|
|
type: string
|
|
enum:
|
|
- H
|
|
- L
|
|
- 'N'
|
|
- A
|
|
description: H=High, L=Low, N=Normal, A=Abnormal
|
|
EdgeResultResponse:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: Result received and queued
|
|
data:
|
|
type: object
|
|
properties:
|
|
edge_res_id:
|
|
type: integer
|
|
sample_id:
|
|
type: string
|
|
instrument_id:
|
|
type: string
|
|
EdgeOrder:
|
|
type: object
|
|
properties:
|
|
OrderID:
|
|
type: string
|
|
PatientID:
|
|
type: string
|
|
SampleID:
|
|
type: string
|
|
Tests:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
TestCode:
|
|
type: string
|
|
TestName:
|
|
type: string
|
|
SpecimenType:
|
|
type: string
|
|
Priority:
|
|
type: string
|
|
DueDateTime:
|
|
type: string
|
|
format: date-time
|
|
ValueSetLibItem:
|
|
type: object
|
|
description: Library/system value set item from JSON files
|
|
properties:
|
|
value:
|
|
type: string
|
|
description: The value/key code
|
|
label:
|
|
type: string
|
|
description: The display label
|
|
ValueSetDef:
|
|
type: object
|
|
description: User-defined value set definition (from database)
|
|
properties:
|
|
VSetID:
|
|
type: integer
|
|
description: Primary key
|
|
SiteID:
|
|
type: integer
|
|
description: Site reference
|
|
VSName:
|
|
type: string
|
|
description: Value set name
|
|
VSDesc:
|
|
type: string
|
|
description: Value set description
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
description: Creation timestamp
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
description: Soft delete timestamp
|
|
ItemCount:
|
|
type: integer
|
|
description: Number of items in this value set
|
|
ValueSetItem:
|
|
type: object
|
|
description: User-defined value set item (from database)
|
|
properties:
|
|
VID:
|
|
type: integer
|
|
description: Primary key
|
|
SiteID:
|
|
type: integer
|
|
description: Site reference
|
|
VSetID:
|
|
type: integer
|
|
description: Reference to value set definition
|
|
VOrder:
|
|
type: integer
|
|
description: Display order
|
|
VValue:
|
|
type: string
|
|
description: The value code
|
|
VDesc:
|
|
type: string
|
|
description: The display description/label
|
|
VCategory:
|
|
type: string
|
|
description: Category code
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
description: Creation timestamp
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
description: Soft delete timestamp
|
|
VSName:
|
|
type: string
|
|
description: Value set name (from joined definition)
|
|
Location:
|
|
type: object
|
|
properties:
|
|
LocationID:
|
|
type: integer
|
|
description: Primary key
|
|
SiteID:
|
|
type: integer
|
|
description: Reference to site
|
|
LocCode:
|
|
type: string
|
|
maxLength: 6
|
|
description: Location code (short identifier)
|
|
Parent:
|
|
type: integer
|
|
nullable: true
|
|
description: Parent location ID for hierarchical locations
|
|
LocFull:
|
|
type: string
|
|
maxLength: 255
|
|
description: Full location name
|
|
Description:
|
|
type: string
|
|
maxLength: 255
|
|
description: Location description
|
|
LocType:
|
|
type: string
|
|
description: Location type code (e.g., ROOM, WARD, BUILDING)
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
EquipmentList:
|
|
type: object
|
|
properties:
|
|
EID:
|
|
type: integer
|
|
description: Equipment ID (auto-increment)
|
|
IEID:
|
|
type: string
|
|
maxLength: 50
|
|
description: Internal Equipment ID
|
|
DepartmentID:
|
|
type: integer
|
|
description: Reference to department
|
|
InstrumentID:
|
|
type: string
|
|
maxLength: 150
|
|
description: Instrument identifier
|
|
InstrumentName:
|
|
type: string
|
|
maxLength: 150
|
|
description: Instrument display name
|
|
WorkstationID:
|
|
type: integer
|
|
description: Reference to workstation
|
|
Enable:
|
|
type: integer
|
|
enum:
|
|
- 0
|
|
- 1
|
|
description: Equipment status (0=disabled, 1=enabled)
|
|
EquipmentRole:
|
|
type: string
|
|
maxLength: 1
|
|
description: Equipment role code
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
description: Creation timestamp
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
description: Deletion timestamp (soft delete)
|
|
DepartmentName:
|
|
type: string
|
|
description: Joined department name
|
|
WorkstationName:
|
|
type: string
|
|
description: Joined workstation name
|
|
User:
|
|
type: object
|
|
properties:
|
|
UserID:
|
|
type: integer
|
|
description: Unique user identifier
|
|
Username:
|
|
type: string
|
|
description: Unique login username
|
|
Email:
|
|
type: string
|
|
format: email
|
|
description: User email address
|
|
Name:
|
|
type: string
|
|
description: Full name of the user
|
|
Role:
|
|
type: string
|
|
description: User role (admin, technician, doctor, etc.)
|
|
Department:
|
|
type: string
|
|
description: Department name
|
|
IsActive:
|
|
type: boolean
|
|
description: Whether the user account is active
|
|
CreatedAt:
|
|
type: string
|
|
format: date-time
|
|
description: Creation timestamp
|
|
UpdatedAt:
|
|
type: string
|
|
format: date-time
|
|
description: Last update timestamp
|
|
DelDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
description: Soft delete timestamp (null if active)
|
|
UserCreate:
|
|
type: object
|
|
required:
|
|
- Username
|
|
- Email
|
|
properties:
|
|
Username:
|
|
type: string
|
|
minLength: 3
|
|
maxLength: 50
|
|
description: Unique login username
|
|
Email:
|
|
type: string
|
|
format: email
|
|
maxLength: 100
|
|
description: User email address
|
|
Name:
|
|
type: string
|
|
description: Full name of the user
|
|
Role:
|
|
type: string
|
|
description: User role
|
|
Department:
|
|
type: string
|
|
description: Department name
|
|
IsActive:
|
|
type: boolean
|
|
default: true
|
|
description: Whether the user account is active
|
|
UserUpdate:
|
|
type: object
|
|
required:
|
|
- UserID
|
|
properties:
|
|
UserID:
|
|
type: integer
|
|
description: User ID to update
|
|
Email:
|
|
type: string
|
|
format: email
|
|
description: User email address
|
|
Name:
|
|
type: string
|
|
description: Full name of the user
|
|
Role:
|
|
type: string
|
|
description: User role
|
|
Department:
|
|
type: string
|
|
description: Department name
|
|
IsActive:
|
|
type: boolean
|
|
description: Whether the user account is active
|
|
UserListResponse:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
example: success
|
|
message:
|
|
type: string
|
|
example: Users retrieved successfully
|
|
data:
|
|
type: object
|
|
properties:
|
|
users:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/User'
|
|
pagination:
|
|
type: object
|
|
properties:
|
|
current_page:
|
|
type: integer
|
|
per_page:
|
|
type: integer
|
|
total:
|
|
type: integer
|
|
total_pages:
|
|
type: integer
|
|
RuleDef:
|
|
type: object
|
|
properties:
|
|
RuleID:
|
|
type: integer
|
|
RuleCode:
|
|
type: string
|
|
example: AUTO_SET_RESULT
|
|
RuleName:
|
|
type: string
|
|
example: Automatically Set Result
|
|
Description:
|
|
type: string
|
|
nullable: true
|
|
EventCode:
|
|
type: string
|
|
example: ORDER_CREATED
|
|
ConditionExpr:
|
|
type: string
|
|
nullable: true
|
|
description: Raw DSL expression (editable)
|
|
example: if(sex('M'); result_set(0.5); result_set(0.6))
|
|
ConditionExprCompiled:
|
|
type: string
|
|
nullable: true
|
|
description: Compiled JSON structure (auto-generated from ConditionExpr)
|
|
example: '{"conditionExpr":"patient[\"Sex\"] == \"M\"","valueExpr":"(patient[\"Sex\"] == \"M\") ? 0.5 : 0.6","then":[{"type":"RESULT_SET","value":0.5,"valueExpr":"0.5"}],"else":[{"type":"RESULT_SET","value":0.6,"valueExpr":"0.6"}]}'
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
StartDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
RuleWithDetails:
|
|
allOf:
|
|
- $ref: '#/components/schemas/RuleDef'
|
|
- type: object
|
|
properties:
|
|
linkedTests:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
description: Array of TestSiteIDs this rule is linked to. Rules are active only when attached to tests.
|
|
TestRule:
|
|
type: object
|
|
description: Mapping between a rule and a test site (testrule table). Rules are active when linked via this table.
|
|
properties:
|
|
TestRuleID:
|
|
type: integer
|
|
RuleID:
|
|
type: integer
|
|
TestSiteID:
|
|
type: integer
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
AuditLogEntry:
|
|
type: object
|
|
properties:
|
|
LogPatientID:
|
|
type: integer
|
|
nullable: true
|
|
LogOrderID:
|
|
type: integer
|
|
nullable: true
|
|
LogMasterID:
|
|
type: integer
|
|
nullable: true
|
|
LogSystemID:
|
|
type: integer
|
|
nullable: true
|
|
TblName:
|
|
type: string
|
|
RecID:
|
|
type: string
|
|
FldName:
|
|
type: string
|
|
nullable: true
|
|
FldValuePrev:
|
|
type: string
|
|
nullable: true
|
|
FldValueNew:
|
|
type: string
|
|
nullable: true
|
|
UserID:
|
|
type: string
|
|
SiteID:
|
|
type: string
|
|
DIDType:
|
|
type: string
|
|
nullable: true
|
|
DID:
|
|
type: string
|
|
nullable: true
|
|
MachineID:
|
|
type: string
|
|
nullable: true
|
|
SessionID:
|
|
type: string
|
|
AppID:
|
|
type: string
|
|
ProcessID:
|
|
type: string
|
|
nullable: true
|
|
WebPageID:
|
|
type: string
|
|
nullable: true
|
|
EventID:
|
|
type: string
|
|
ActivityID:
|
|
type: string
|
|
Reason:
|
|
type: string
|
|
nullable: true
|
|
LogDate:
|
|
type: string
|
|
format: date-time
|
|
Context:
|
|
type: string
|
|
IpAddress:
|
|
type: string
|
|
nullable: true
|
|
AuditLogListResponse:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/AuditLogEntry'
|
|
pagination:
|
|
type: object
|
|
properties:
|
|
page:
|
|
type: integer
|
|
perPage:
|
|
type: integer
|
|
total:
|
|
type: integer
|
|
required:
|
|
- page
|
|
- perPage
|
|
- total
|
|
required:
|
|
- data
|
|
- pagination
|
|
AuditLogsEnvelope:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
$ref: '#/components/schemas/AuditLogListResponse'
|
|
required:
|
|
- status
|
|
- message
|
|
- data
|
|
AuditLogsErrorResponse:
|
|
type: object
|
|
properties:
|
|
status:
|
|
type: string
|
|
message:
|
|
type: string
|
|
data:
|
|
nullable: true
|
|
required:
|
|
- status
|
|
- message
|
|
- data
|
|
Contact:
|
|
type: object
|
|
properties:
|
|
ContactID:
|
|
type: integer
|
|
description: Primary key
|
|
NameFirst:
|
|
type: string
|
|
description: First name (required)
|
|
NameLast:
|
|
type: string
|
|
description: Last name
|
|
Title:
|
|
type: string
|
|
description: Title (e.g., Dr, Mr, Mrs)
|
|
Initial:
|
|
type: string
|
|
description: Middle initial
|
|
Birthdate:
|
|
type: string
|
|
format: date-time
|
|
description: Date of birth
|
|
EmailAddress1:
|
|
type: string
|
|
format: email
|
|
description: Primary email address
|
|
EmailAddress2:
|
|
type: string
|
|
format: email
|
|
description: Secondary email address
|
|
Phone:
|
|
type: string
|
|
description: Primary phone number
|
|
MobilePhone1:
|
|
type: string
|
|
description: Primary mobile number
|
|
MobilePhone2:
|
|
type: string
|
|
description: Secondary mobile number
|
|
Specialty:
|
|
type: string
|
|
description: Medical specialty code
|
|
SubSpecialty:
|
|
type: string
|
|
description: Sub-specialty code
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
description: Occupation display text
|
|
OrderSpecimen:
|
|
type: object
|
|
properties:
|
|
InternalSID:
|
|
type: integer
|
|
description: Internal specimen ID
|
|
SID:
|
|
type: string
|
|
description: Specimen ID (e.g., 0025030300001-S01)
|
|
SiteID:
|
|
type: integer
|
|
OrderID:
|
|
type: integer
|
|
description: Reference to internal order ID
|
|
ConDefID:
|
|
type: integer
|
|
description: Container Definition ID
|
|
nullable: true
|
|
ConCode:
|
|
type: string
|
|
description: Container code
|
|
nullable: true
|
|
ConName:
|
|
type: string
|
|
description: Container name
|
|
nullable: true
|
|
Qty:
|
|
type: integer
|
|
description: Quantity
|
|
Unit:
|
|
type: string
|
|
description: Unit of measurement
|
|
Status:
|
|
type: string
|
|
enum:
|
|
- PENDING
|
|
- COLLECTED
|
|
- RECEIVED
|
|
- PREPARED
|
|
- REJECTED
|
|
description: Current specimen status
|
|
GenerateBy:
|
|
type: string
|
|
description: Source that generated this specimen
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
OrderTestItem:
|
|
type: object
|
|
properties:
|
|
ResultID:
|
|
type: integer
|
|
description: Unique result ID
|
|
OrderID:
|
|
type: integer
|
|
description: Reference to internal order ID
|
|
InternalSID:
|
|
type: integer
|
|
description: Reference to specimen
|
|
nullable: true
|
|
TestSiteID:
|
|
type: integer
|
|
description: Test definition site ID
|
|
TestSiteCode:
|
|
type: string
|
|
description: Test code
|
|
TestSiteName:
|
|
type: string
|
|
description: Test name
|
|
nullable: true
|
|
TestType:
|
|
type: string
|
|
description: Test type code identifying the test category
|
|
enum:
|
|
- TEST
|
|
- PARAM
|
|
- CALC
|
|
- GROUP
|
|
- TITLE
|
|
SID:
|
|
type: string
|
|
description: Order ID reference
|
|
SampleID:
|
|
type: string
|
|
description: Sample ID (same as OrderID)
|
|
SeqScr:
|
|
type: integer
|
|
nullable: true
|
|
description: Sequence number for this test on the screen
|
|
SeqRpt:
|
|
type: integer
|
|
nullable: true
|
|
description: Sequence number for this test in reports
|
|
Result:
|
|
type: string
|
|
description: Test result value
|
|
nullable: true
|
|
Discipline:
|
|
type: object
|
|
description: Discipline metadata used for ordering tests
|
|
properties:
|
|
DisciplineID:
|
|
type: integer
|
|
nullable: true
|
|
DisciplineCode:
|
|
type: string
|
|
nullable: true
|
|
DisciplineName:
|
|
type: string
|
|
nullable: true
|
|
SeqScr:
|
|
type: integer
|
|
nullable: true
|
|
description: Discipline sequence on the screen
|
|
SeqRpt:
|
|
type: integer
|
|
nullable: true
|
|
description: Discipline sequence in reports
|
|
ResultDateTime:
|
|
type: string
|
|
format: date-time
|
|
description: Result timestamp
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
TestMapDetail:
|
|
type: object
|
|
properties:
|
|
TestMapDetailID:
|
|
type: integer
|
|
TestMapID:
|
|
type: integer
|
|
HostTestCode:
|
|
type: string
|
|
description: Test code in host system
|
|
HostTestName:
|
|
type: string
|
|
description: Test name in host system
|
|
ConDefID:
|
|
type: integer
|
|
description: Container definition ID
|
|
ClientTestCode:
|
|
type: string
|
|
description: Test code in client system
|
|
ClientTestName:
|
|
type: string
|
|
description: Test name in client system
|
|
CreateDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
description: Soft delete timestamp
|
|
TestDefinitionListItem:
|
|
type: object
|
|
properties:
|
|
TestSiteID:
|
|
type: integer
|
|
TestSiteCode:
|
|
type: string
|
|
TestSiteName:
|
|
type: string
|
|
TestType:
|
|
type: string
|
|
enum:
|
|
- TEST
|
|
- PARAM
|
|
- CALC
|
|
- GROUP
|
|
- TITLE
|
|
SeqScr:
|
|
type: integer
|
|
SeqRpt:
|
|
type: integer
|
|
isVisibleScr:
|
|
type: integer
|
|
enum:
|
|
- 0
|
|
- 1
|
|
isVisibleRpt:
|
|
type: integer
|
|
enum:
|
|
- 0
|
|
- 1
|
|
isCountStat:
|
|
type: integer
|
|
StartDate:
|
|
type: string
|
|
format: date-time
|
|
EndDate:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
DisciplineID:
|
|
type: integer
|
|
nullable: true
|
|
DepartmentID:
|
|
type: integer
|
|
nullable: true
|
|
DisciplineName:
|
|
type: string
|
|
nullable: true
|
|
DepartmentName:
|
|
type: string
|
|
nullable: true
|
|
ValueSetListItem:
|
|
type: object
|
|
description: Library/system value set summary (from JSON files)
|
|
properties:
|
|
value:
|
|
type: string
|
|
description: The value set key/name
|
|
label:
|
|
type: string
|
|
description: The display name/label
|
|
count:
|
|
type: integer
|
|
description: Number of items in this value set
|