Nâng cấp phần mềm 4 năm tuổi bằng AI
Trong bài viết này, mình sẽ chia sẻ cách mà mình đã nâng cấp 1 phần mềm quản lý nha khoa 4 năm tuổi cùng với AI
Mở đầu
Hồi năm mình học lớp 12, có một bác sĩ là người quen của mình nhờ làm một phần mềm quản lý nha khoa của chú. Các nghiệp vụ quản lí cũng dừng ở mức cơ bản như:
- Lưu và tra cứu thông tin bệnh nhân.
- Đặt lịch hẹn khám.
- Lưu trữ thông tin các vật tư y tế.
- Tính tiền, tính công nợ, xuất hoá đơn.
- Quản lý và phân công công việc cho các nha sĩ, nhân viên khác.
- Thêm vài cái biểu đồ nhỏ nhỏ để trực quan hoá hoạt động của nha khoa,...
Hồi đó là khoảng năm 2021, chưa có ChatGPT, kĩ năng dev mình còn hạn chế. Đứng trước bài toán này mình chọn giải pháp là làm một ứng dụng Windows chạy local trên máy đặt tại phòng khám đó.
Chi tiết về công nghệ như sau:
- App thì mình dùng Winform C#.
- Database thì dùng SQLite. Theo phân tích của mình khi đó, số lượt đọc ghi dữ liệu của phòng khám không nhiều nên dùng SQLite vừa nhẹ vừa nhanh, hạn chế lỗi và cũng dễ sao lưu.
- Ngoài ra, để an toàn hơn mình có dùng Firebase Realtime Database. Nhưng nó chỉ dùng để push dữ liệu sau này backup thôi.

Trải qua ròng rã 1 tháng code, mình cũng hoàn thành dự án với đầy đủ tính năng mà chú yêu cầu. Trong đó bao gồm cả mấy cái thêm như: tự động cập nhật khi có phiên bản mới, xuất dữ liệu ra Excel, CSV,...

Phần mềm này đã hoạt động cực kỳ ổn định, trong 4 năm mình chỉ cập nhật 2 lần (1 lần là thêm tính năng mới rồi). Ngoài bán cho chú đó mình còn được giới thiệu 5 bác sĩ khác có nhu cầu. Mỗi năm mình thu cũng được kha khá tiền license.
Phát sinh vấn đề...

Mặc dù chạy ổn định trong nhiều năm, nhưng nó còn vướng phải những vấn đề như:
- Chạy local ở 1 máy tính. Không có máy là không có dữ liệu.
- Chỉ có 1 nhân viên nhập liệu.
- Nếu nha khoa có 2 chi nhánh đổ lên là phần mềm sẽ phải chạy 2 database riêng.
- Ngoài ra một vài thư viện của Winform C# mà mình dùng bị outdate, lâu lâu nó nhảy vài cái cửa sổ báo bị crash lên khá bất tiện.
Tuần trước chú có liên hệ với mình để yêu cầu cập nhật. Trong phút chốc mình liền đồng ý vì trách nhiệm và vì mình hiểu rằng: năm nay là 2025 rồi có AI chắc ăn sẽ dễ hơn hồi trước.
Cùng AI chinh phục thử thách
AI đã đồng hành cùng mình ở các công việc như: phân tích lại nghiệp vụ để tìm phương án mới, viết tools để đồng bộ dữ liệu từ phần mềm cũ.
Chuyển sang dùng CRM
Sau khi phân tích kĩ lại nghiệp vụ, trao đổi với chú và tất nhiên là trao đổi với ChatGPT. Mình nhận ra về cơ bản phần mềm này cũng là một CRM (Customer Relationship Management). Nên việc chuyển sang dùng CRM là hoàn toàn hợp lý. Một giải pháp CRM sẽ giúp quản lý thông tin khách hàng tốt hơn, tăng hiệu suất làm việc và dễ mở rộng.
Một điều thú vị là khi dev phần mềm cũ, mình không hiểu rõ CRM là gì. Thêm vào đó, hồi đó mình có tâm lý thích tự build, tự chủ, nên đã hì hục code từ đầu đến cuối mà không nghĩ đến các giải pháp có sẵn.
Quản lý quan hệ khách hàng hay CRM (tiếng Anh: Customer relationship management) là một phương pháp giúp các doanh nghiệp tiếp cận và giao tiếp với khách hàng một cách có hệ thống và hiệu quả, quản lý các thông tin của khách hàng như thông tin về tài khoản, nhu cầu, liên lạc và các vấn đề khác nhằm phục vụ khách hàng tốt hơn.[1] Các mục tiêu tổng thể là tìm kiếm, thu hút, giành niềm tin khách hàng mới, duy trì những đối tác đã có, lôi kéo khách hàng cũ trở lại, giảm chi phí tiếp thị và mở rộng dịch vụ khách hàng.[2][3] Việc đo lường và đánh giá mối quan hệ với khách hàng là rất quan trọng trong mục tiêu thực hiện chiến lược.[4]

Mình quyết định sử dụng Twenty, một CRM mã nguồn mở phù hợp với nhu cầu của phòng khám. Với sự hỗ trợ của AI, việc cài đặt và tùy chỉnh Twenty chỉ mất một ngày.
Đồng bộ dữ liệu từ hệ thống cũ
Nghĩ cũng thấy ngán đúng không, dữ liệu 4 năm mà trong đó chú đổi máy tính mấy lần. Mất cũng kha khá dữ liệu trong database local. Tuy nhiên mình đã có sao lưu 1 phần ở Firebase nên cũng đỡ phần nào.
Cùng với sự hỗ trợ của ChatGPT, việc đồng bộ dữ liệu cũ chỉ mất 15 phút.
Mình chỉ cần mô tả dữ liệu cũ được tổ chức như thế nào, luồng hoạt động của các script, tài liệu API của Twenty và bùm mình có code.
Prompt mà mình đã nhập cho AI dưới đây. Tất nhiên đây là prompt mình đã sửa lại chứ không phải prompt mà mình dùng trực tiếp với dự án.
Hi AI, I need your help with a project. I have a PostgreSQL database with a table called ORDERS, and I want to sync its data into an inventory management system via an API. The API uses JSON payloads and requires authentication with an API key in the header. I’ll give you the table schema, API details, and some sample data. Please write a Python script to do this.
Here’s the PostgreSQL table schema:CREATE TABLE ORDERS (
order_id SERIAL PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL,
order_date VARCHAR(10) NOT NULL, -- Format can be DD/MM/YYYY or YYYY-MM-DD
product_code VARCHAR(20) NOT NULL,
quantity INTEGER NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
status VARCHAR(20) NOT NULL,
shipping_address TEXT,
phone_number VARCHAR(15),
notes TEXT
);
And here’s the API documentation for the inventory system:POST /api/v1/inventory/orders
Host: inventory.example.com
Headers:
Content-Type: application/json
Authorization: Bearer <API_KEY>
Request Body (JSON):
{
"orderId": "string", // Unique order identifier
"customer": {
"name": "string",
"phone": {
"countryCode": "string", // e.g., "+1"
"number": "string" // Phone number without country code
}
},
"orderDetails": {
"date": "string", // ISO 8601 format: YYYY-MM-DD
"items": [
{
"productCode": "string",
"quantity": integer,
"pricePerUnit": number
}
],
"total": number
},
"status": "string", // Enum: PENDING, SHIPPED, DELIVERED, CANCELLED
"shipping": {
"address": "string"
},
"additionalNotes": "string"
}
Query Parameters:
- includeDetails (optional, boolean, default: false)
- If true, response includes full item details
Here’s some sample data from my ORDERS table:INSERT INTO ORDERS (order_id, customer_name, order_date, product_code, quantity, unit_price, total_amount, status, shipping_address, phone_number, notes)
VALUES
(1, 'John Doe', '15/03/2023', 'PROD-001', 5, 25.50, 127.50, 'PENDING', '123 Main St, NYC', '01234567890', 'Urgent delivery'),
(2, 'Jane Smith', '2023-04-01', 'PROD-002', 3, 15.75, 47.25, 'SHIPPED', '456 Oak Ave, LA', '+12025550123', 'Gift wrap requested');
And here’s a sample response I got when testing the API manually:{
"success": true,
_here’s a sample response I got when testing the API manually:
"data": {
"orderId": "e7f8a9b0-1234-5678-9abc-def012345678",
"customer": {
"name": "John Doe",
"phone": {
"countryCode": "+1",
"number": "1234567890"
}
},
"orderDetails": {
"date": "2023-03-15",
"items": [
{
"productCode": "PROD-001",
"quantity": 5,
"pricePerUnit": 25.50
}
],
"total": 127.50
},
"status": "PENDING",
"shipping": {
"address": "123 Main St, NYC"
},
"additionalNotes": "Urgent delivery"
},
"timestamp": "2025-03-27T12:34:56Z"
}
Notes:
The order_date in my database can be in either "DD/MM/YYYY" or "YYYY-MM-DD" format, so handle both.
For phone_number, if it starts with "0", strip the "0" and assume the country code is "+1" unless it already has a country code (like "+12025550123").
The API expects orderId to be a UUID, but my database uses an integer order_id. Generate a UUID for each order.
Hardcode the API key for now: Bearer abc123xyz789.
Please write a Python script that:
Connects to the PostgreSQL database (assume localhost, database "inventory_db", user "admin", password "pass123").
Fetches all rows from the ORDERS table.
Maps the data to the API payload format.
Sends each order to the API.
Prints success/failure for each request and a final summary.
Go for it, AI!---
Now, as the AI, it’s your turn to respond with a Python script based on this prompt! Let me know how you’d like to proceed.
Tổng kết
AI đã giúp mình hoàn thành nhiệm vụ một cách nhanh chóng và hiệu quả. Toàn bộ quá trình chỉ mất khoảng một ngày thay vì hàng tuần như trước đây.
Tuy nhiên, để AI làm việc hiệu quả, bạn cần có kiến thức cơ bản về hệ thống, dữ liệu, nghiệp vụ và nhu cầu khách hàng. AI là công cụ hỗ trợ mạnh mẽ, nhưng không thể thay thế hoàn toàn tư duy và kinh nghiệm của con người.
Giờ mình cầm nó đi bán tiếp đây, cảm ơn mọi người đã đọc bài viết.
Bình luận ()