Skip to content

Feature List ​

Organized by layer: general clinic essentials first, then TCM-specific items on their own. Each feature notes the reference source projects (per each project's actual README description) and Sinomed's current source-code status (per the actual implementation in server/); it serves as a checklist for future planning.

Legend — Sinomed status: 已实现 / implemented (API and pages available) / 部分 / partial (related fields or placeholders exist) / 未实现 / not implemented (absent from the source code).

1. General Clinic Essentials ​

FeatureReference source projectsSinomed statusNotes
Appointment registrationopenhis-clinic (appointment registration), ZainZhao/HIS, TANGKUO/HIS (registration workstation), hisystem (registration and billing)Implementedappointments table + /api/v1/appointment (create appointment / awaiting-arrival list / on-arrival reception converting to treatment / cancel), admin console /appointment/* list workbench + /appointment/schedule physician×time-slot scheduling grid (cells carry visit markers: course card = Nth course session, no card means visits per the treats treatment records = return or first visit); mini program self-service booking is implemented (POST /api/v1/kiosk/appointments unauthenticated + mini program pages/booking, rate-limited to 1 booking/day/phone number, no same-slot conflict checking); mini program self-service cancellation is implemented (POST /api/v1/kiosk/appointment-cancel, decided on the user's behalf 2026-10-16 — the original "cancellation verifies no identity" premise lapsed once two-factor verification landed; re-issuing a one-time code then cancelling one's own not-yet-arrived and not-yet-expired appointment, with not-the-owner / already-received / already-expired refused by 400, all attempts audited in card_lookup_logs, and the slot released after cancellation); the mini program's "我的卡项" (my service cards) phone card lookup is implemented (privacy red line: no bare-phone-number card lookup — sinomed.phone-lookup.mode defaults to off; openid_only looks up via openid binding, sms_verified looks up via phone number + verification code two-factor, both paths land in the card_lookup_logs audit log, see kiosk.md). Screenshot: Appointment Scheduling
Electronic medical recordYukang (chief complaint / present illness / four examinations / pattern differentiation / medical advice), openhis (EMR module), his_mvpPartialThe treats treatment record carries chief complaint, inquiry, inspection, palpation, pulse, five phases, point selection, diagnosis, plan, diet, conditioning, follow-up; the history structure is implemented (customer_histories records allergy history / past history item by item, add/remove on the patient profile page, see CustomerHistoryHttpTest); no past-history timeline beyond the allergy/past-history lists
Prescription (Western / patent medicine)Yukang (Western and patent medicine prescriptions), openhis-clinic (billing and dispensing)Not implementedWestern/patent-medicine prescriptions and a drug catalog are not built — no prototype design exists (mockups cover only the TCM prescription sheet; no Western prescription or drug catalog screens); the ruling is to not invent screens out of thin air (same agreed policy as spread / celebrity scheduling), and dispensing.md also lists it as out of scope; the 2026-10-14 patrol review decided on the user's behalf to keep it a non-goal (single-store TCM clinic positioning, no Western prescription routing) — enabling it would require the user to overturn the ruling and provide a prototype. The TCM prescription is implemented (prescriptions/prescription_items, priced against the herb dictionary). Screenshot: TCM Prescription Sheet
TCM prescriptionYukang (herbs / application / external therapy), herb-ms-ssm (herb–prescription–pricing), his_mvp (TCM formulas), chinese_medicine_store_cos (condition-based prescriptions)Partialprescriptions/prescription_items tables + /api/v1/prescription (write / detail / paging / delete, items carry gram doses and special decoction methods) + /prescription/* writing and lookup pages; real-time pricing against the herb dictionary, compatibility review (eighteen incompatibles / nineteen fears), dose review (/prescription/dose-check, compared per-item against the herb dictionary's dose_max ceiling, warns without blocking), decoction service and paste pickup flows, condition templates, and formula-library search with full-formula autofill are implemented; herb stock in/out ledgers and expiry warnings are implemented (/api/v1/herb-stock, prescribing still does not deduct stock). Screenshot: TCM Prescription Sheet
Pharmacy and dispensingZainZhao/HIS, TANGKUO/HIS (pharmacy workstation), openhis-clinic, hisystem (pharmacy pickup)PartialDispense confirmation and the pharmacy workbench are implemented (prescriptions gains dispense_status/dispense_time/dispense_by + one-way dispense_logs ledger, POST /api/v1/prescription/{id}/dispense pending-dispense → dispensed + GET /dispense/page workbench paging; decoction / paste "picked up" automatically triggers dispensing; admin console /prescription/dispensary three-state switching + patient search + note on dispense, see DispenseHttpTest; agreed policy in pharmacy and dispensing flow: no stock deduction, no money involved); Western / patent-medicine prescription dispensing is not built
Herb stockchinese_medicine_store_cos (herb records / purchasing / stock warnings), his_mvp (in/out / stocktaking), Yukang (batches / expiry)PartialIn/out ledgers and expiry warnings are implemented (herb_stock_logs in/out ledger in grams, balance = total in − total out recomputed from the ledger, outbound consumes batches FEFO by expiry and may not exceed stock, GET /api/v1/herb-stock/balance returns the earliest unconsumed batch's expiry and expiry warning (default 30 days), admin console /prescription/herb-stock balance dashboard + ledger entry/deletion, see HerbStockHttpTest; seed data: 5 common herbs received in + 1 outbound demo entry); floor/ceiling stock warnings are implemented (herbs stock_min/stock_max in grams, balance API flags warnStock, the herb dictionary form maintains the limits, and the balance dashboard shows a "库存线" column); purchase documents / stockkeeping are ruled out per dispensing.md (in/out ledger policy: no purchase documents, stocktaking, loss reporting, or multi-warehouse; suppliers are recorded on inbound ledger entries)
Billing and settlementYukang (cash / WeChat / Alipay / bank card / insurance), OpenHIS (pricing and charging), openhis-clinicPartialsettlements settlement records + /api/v1/settlement (order 0/1→2 paid) + /api/v1/recharge stored-value ledger (balance = total), admin console /billing/settle settlement counter; refunds and daily reconciliation are implemented (/api/v1/settlement/{id}/refund whole-order original-route refund, once per order + /reconciliation three-segment reconciliation by calendar day, admin console /billing/reconciliation, see reconciliation); WeChat / Alipay are in-store scan-to-pay (the static payment-code display surface is implemented: /api/v1/pay-qrcode/{method} serves merchant code images from data/payqrcodes/, a missing image honestly returns 404; no gateway integration); no invoices or real online-payment channel; prescription herb lines entering settlement is ruled out. Screenshot: Billing and Settlement Counter
Patient membershipTANGKUO/HIS (patient management), Yukang (chain branches), chinese_medicine_store_cos (membership purchase / orders)PartialThe customers.level membership tier field exists; stored-value top-up / deduction ledgers are wired up (recharges); no discounts, bundles, or cross-store spending
SchedulingNo clearly implemented scheduling module among the surveyed projectsPartialsigns attendance remains clock-in/clock-out; appointment scheduling is implemented — /appointment/schedule physician×time-slot daily grid (occupied / open / in-cell reception); recurring employee shift schedules are implemented (/api/v1/shift employee×weekday×HH:mm slots, unique per employee per weekday, admin console /staff/shifts weekly matrix with add / adjust / delete, see StaffShiftHttpTest); schedule–attendance linkage is implemented (/api/v1/staff/timesheet/week weekly shift comparison: planned schedule matched against that weekday's clock-ins, earliest clock-in / latest clock-out per day, rounded to whole hours, admin console /staff/timesheet/week; the scheduling grid is linked to shift schedules — on-duty physicians (per that weekday's staff_shifts) sort first, and rostered physicians with no shift get a de-emphasized column header; the linkage is display-only and does not block booking). Screenshot: Appointment Scheduling
Reports and statisticsYukang (business statistics / prescription volume trends), OpenHIS (chart statistics), openhis-clinic (report queries)PartialAlready present: daily reports (summary / retrospective / follow-up) and monthly attendance statistics; the monthly billing report is implemented (GET /api/v1/settlement/report/month per-day breakdown and payment-method mix, visit-card redemptions listed separately; see SettlementReportHttpTest); business trends are implemented (GET /api/v1/settlement/report/trend per-month actual revenue / order count / visit-card redemptions / treatment volume over the recent N months, dual-bar trend chart on the monthly report page; see SettlementTrendHttpTest)
Multi-store / chainYukang (head-office aggregation / branch-independent databases), chinese_medicine_store_cos (multi-store)Not implementedRuled out (2026-10-12): single-store model — neither the data model nor permissions have a store dimension, and inventing that layer would be fabricated design; if chaining happens later, store fields and an aggregation policy will be defined then

2. TCM-Specific ​

FeatureReference source projectsSinomed statusNotes
Pattern-differentiation treatment recordsYukang (four examinations + pattern differentiation + medical advice record structure), his_mvp (pattern-differentiation prescribing)PartialThe treatment record carries five-phase generation/restraint (本 / 克 / 难经 / ratio), pulse (left and right hands), and diagnosis fields, enough to support pattern-differentiation records; no standard pattern (证型) dictionary
Herbs and formulasYukang (raw herbs / patent medicine / granule categories), his_mvp (formula library + pinyin input), herb-ms-ssm, chinese_medicine_store_cosPartialThe dose model shipped with the TCM prescription (prescription_items.weight grams/dose + special decoction method); the formula library and pinyin search are implemented (/api/v1/formula unique formula name + lowercase full-pinyin code search, the prescribing page pulls the whole formula in one click by name or pinyin, see FormulaHttpTest); the herb catalog = herb dictionary is implemented and backs real-time pricing; herb in/out ledgers and expiry warnings are implemented (/api/v1/herb-stock FEFO batch policy, see HerbStockHttpTest); purchase documents / stocktaking ruled out per dispensing.md (in/out ledger policy)
Acupuncture / point-selection recordsYukang (external therapy / application prescriptions), his_mvp (includes a meridian-point curriculum)PartialThe treatment record carries acupoint_left/right point fields (free text); the point dictionary is implemented (/api/v1/acupoint, unique point name + lowercase full-pinyin code search, the treatment page appends selections by name or pinyin, see AcupointHttpTest); acupuncture prescription records are implemented (treatment record acu_method/retention_minutes/manipulation/acu_course for needling method / retention / manipulation / course, "针灸处方" section on the treatment page, guards in TreatAcuHttpTest); auricular-point / application and other external-therapy prescription templates are implemented (/api/v1/therapy-template, the treatment page's "套用外治模板" pulls in method / points / course suggestions, freely editable per record without writing back)
Tuina / moxibustion courses仲正堂 store format (tuina, Guanyuan moxibustion; no app feature list seen)PartialThe course-card policy has landed with visit cards: a tuina / moxibustion course card = service card (visit card) + customer_cards card holding, the settlement counter deducts a visit per redemption; redemption ledgers are implemented (card_usages records per deduction "which visit / serving employee / order", viewable in the patient profile's held-cards panel; the serving employee is taken from the order's staffId); validity periods are implemented (validUntil optional at issuance, expired cards cannot be redeemed); marketing is implemented with gifted visits / card transfers (card_adjusts audit trail: add 1–99 visits to an active card / change the owning patient, reason required ≤100 chars, operated from the patient profile's held-cards panel)
Condition-based prescription templateschinese_medicine_store_cos (condition prescription template library)ImplementedThe condition template library is implemented (prescription_templates + items, two tables; /api/v1/prescription/template/* CRUD + published-only filtering; the prescribing page's "套用模板" pulls in items / doses / directions in one click — templates store suggested values only and never write back; screenshot: Prescription · Condition Templates)
Compatibility contraindication reviewYukang (AI prescription review: allergies / incompatibilities / interactions)PartialThe eighteen-incompatibles / nineteen-fears static rules are implemented (POST /api/v1/prescription/compatibility, alias substring matching, warns without blocking; see CompatibilityServiceImplTest); the allergy-history static review is implemented (POST /api/v1/prescription/allergy-check, substring match against the patient's allergy-history text, warns without blocking; see PrescriptionAllergyHttpTest); interaction comparison and AI review are not built
Paste / decoction serviceNot seen in surveyed projectsImplementedBoth independent pickup chains are implemented: decoction service (checked at prescribing it lands as "待煎", flow 待煎→可取→已取, bags = doses, service fee is display-only); paste (prescription_type=1 at prescribing lands as "待制作", craft records the collection method, counted per batch not per bag, flow 待制作→可取→已取, non-paste or skipped states return 400; the two do not affect each other)
Celebrity-physician schedulingNot seen in surveyed projectsImplementedThe celebrity tier is implemented (staffs.famous_level 0–3, 0 regular / 1–3 celebrity, affecting only list sorting and badge labels); scheduling is unified on the employee dimension (/api/v1/shift employee×weekday schedule + /appointment/schedule physician×time-slot grid + weekly attendance comparison, see the scheduling row); the celebrity registration-fee premium is capped at 20% (config sinomed.famous-doctor-surge-cap-percent, default 20, editable in the admin console), the premium is shown as a separate line, no tiered / time-slot pricing; no complex pricing engine, no dynamic repricing (2026-10-14 ruling)

3. Modules Landed in Sinomed (source code) ​

The following are available in the source code; details in the server API list and admin console pages:

ModuleCapabilities
Patient systemOnboarding, paging / name / phone search, update, delete
Diagnosis systemTCM treatment record creation (four examinations / pulse / five phases / points / diagnosis / plan), per-patient history, fuzzy search
Feedback systemDaily summary (per-day upsert), employee daily retrospective, patient follow-up (due items land in the daily report)
Employee systemEmployee CRUD, clock-in / clock-out, today and monthly attendance statistics
Service-card systemCard creation, query, maintenance
AuthenticationJWT login, admin / employee two-tier roles, disable on offboarding

4. Sourcing Advice for Planning ​

  • For the business model, reference Yukang first (highest overlap with a TCM clinic) and openhis-clinic (a closed loop of 5 clinic modules); both are covered in the open-source project survey.
  • Check licenses before reusing code: MIT/Apache allow relaxed reference; GPL-3.0 (the openhis family) is contagious; unlicensed projects (chinese_medicine_store_cos, his_mvp, etc.) may be consulted for ideas only — never copy code.
  • Feature names and copy follow this repo's source code (patient / diagnosis / feedback / employee / service-card systems); avoid naming collisions with existing modules when introducing new ones.

Last updated: