[Java Soft] Phần mềm quản lý dược phẩm Cộng Đồng Java

Discussion in 'CongDongJava member's Java Software' started by JackV, 11/7/13.

  1. JackV

    JackV Administrator Staff Member

    Phần mềm Quản Lý Dược Phẩm dành cho các nhà thuốc nhỏ.

    Phiên bản demo và open source cho thành viên congdongjava.com
    ======================​
    QuanLyDuocPhamCongDongJava_UI.png
    Chương trình này được JackV viết theo yêu cầu của một nhà thuốc nhỏ, hôm nay quyết định chia sẻ với các bạn để mọi người có thêm một sản phẩm thực tế trao đổi.
    Một mục tiêu quan trọng của bài viết này là giúp các bạn mới làm quen với swing biết được các dùng nhiều layout lồng nhau.
    Do là sản phẩm dùng cho nhu cầu nhà thuốc nhỏ, yêu cầu của người dùng đơn giản, người dùng ít kiến thức IT, phát triển trong một thời gian ngắn nên sản phẩm có một số đặc điểm riêng biệt sau:
    • Database dạng file, lưu object.
    • Không có phần báo cáo và in ấn
    ===
    Phong cách thiết kế:
    • Tránh thiết kế cổ điển (dùng nhiều cửa sổ để nhập liệu), phần nhập liệu được phóng to thu nhỏ theo nhu cầu.
    • Cho người dùng tùy biến kích thước, kích thước được tùy chỉnh thay đổi sẽ được lưu lại.
    ===================
    Bố cục phần mềm

    Bố cục chính:
    • Cửa sổ phần mềm khi chạy lên sẽ max size đối với màn hình.
    • Giao diện chia làm 3 phần chính dùng Border Layout: Tên hệ thống và nhà thuốc (PAGE_START) + Nội dung hiện thị của các chức năng (CENTER) + Phần liên hệ (PAGE_END).
    • Phần liên hệ dùng một Thead làm nhiệm vụ thay đổi nội dung hiện thị.
    Phần nội dung hiện thị của các chức năng:
    • panelFunction nằm ở vị trí center của bố cục chính, chứa 2 panel con
    • Panel con panelControl chứa một ToolBar gồm các nút cho các chức năng.
    • Panel con panelCenter dùng để chứa nội dung hiện thị của từng chức năng.
    Bố cục các trang có danh sách và có yêu cầu nhập liệu:
    • Khi nhấn một button trên ToolBar trong panelControl thì panelCenter sẽ hiện thị nội dung tương ứng cho từng chức năng.
    • Các panel hiện thị danh sách dùng BorderLayout, panelControl đặt ở PAGE_START, jScrollPane1 chứa table đặt ở CENTER, panelRoot đặt ở PAGE_END
    • panelRoot chứa các thành phần tương ứng cho chức năng thêm xóa sửa record, dùng BorderLayout và chia thành 3 phần, LINE_START chứa button cho việc thêm mới, LINE_END chứa button cho việc phóng to thu nhỏ, CENTER chứa panel cho chức năng hiện thị và thêm xóa sửa record.
    Bố cục các panel cho chức năng hiện thị và thêm xóa sửa record:
    • Gồm 2 phần chính là phần panelChonDuocPham và phần thông tin của record.
    • Phần thông tin của record bao gồm nhiều panel được sắp xếp trong GridLayout với nhiều dòng.
    Bố cục panelChonDuocPham:
    QuanLyDuocPhamCongDongJava_chonDP.png

    • Dùng để chọn dược phẩm cho các record
    • Sắp xếp với BorderLayout, phần chọn dược phẩm được đặt tại CENTER, phần hiện thị chú ý cho dược phẩm ở PAGE_END
    • Khi nhập từng ký tự trong tên dược phẩm thì nó sẽ liệt kê các dược phẩm mà tên có chứa ký tự đó (không phân biệt hoa thường, không phân biệt có dấu hay không dấu)
    • Khi click vào dược phẩm được liệt kê, nếu có chú ý thì phần chú ý sẽ hiện lên, click vào nội dung chú ý sẽ hiện một cửa sổ cho đọc nội dung chú ý.
    =======================​
    Chức năng từng thành phần:
    1. Chức năng thành phần đăng nhập. PanelLogin
    QuanLyDuocPhamCongDongJava_login.png
    Phần đăng nhập này có tính năng tiện lợi cho người dùng
    • Sau khi nhập Tài khoản nếu nhấn Enter thì cũng như nhấn Tab nó sẽ nhảy qua phần nhập mật khẩu
    • Sau khi nhập Mật khẩu nếu nhấn Enter thì sẽ gọi phương thức doClick() của butDangNhap để thực hiện đăng nhập.
    • Nhập thông tin tài khoản sai quá 3 lần sẽ exit chương trình.
    2. Chức năng chung của thành phần liệt kê danh sách
    QuanLyDuocPhamCongDongJava_cauTrucDanhSach.png
    Phần (1) là các control
    • Cho phép chọn danh sách cần xem, riêng danh mục dược phẩm không có.
    • Chức năng tìm kiếm
    Phần (2) là các table hiện thị các record​
    • Khi click vào một record trên table thì phần panel hiện thị chi tiết sẽ tự động mở rộng và hiện thị chi tiết của record
    Phần (3) là phần chi tiết record, thêm xóa sửa.​
    • Phần panel hiện thị chi tiết có chức năng phóng to, thu nhỏ.
    • Khi bấm thêm mới thì nó tự phóng to panel chi tiết để thêm record mới, không dùng cửa sổ mới.
    3. Chức năng của panel thêm xóa sửa dược phẩm
    QuanLyDuocPhamCongDongJava_themXoaSuaDP.png
    • Panel này chia làm 3 phần chính bởi BorderLayout, phần CENTER chứa một splitPane cho phép người dùng kéo dãn kích thước của hai phần 2 bên.
    • butThemMoi và butCapNhat thay đổi trạng tháy của các thành phần trong CENTER
    • Phần nhập SL hiện có được disable đi tránh việc người dùng vô tình nhấn Tab và sửa nội dung, để sửa nội dung người dùng cần double click vào nó, khi mất focus thì nó lại trở lại trạng thái disabled
    • Không cần nhập mã DP, mã DP tự sinh và tăng lên.
    4. Chức năng của panel Nhập hàng và panel Xuất Hàng
    QuanLyDuocPhamCongDongJava_nhapXuatDP.png
    • Phần chính của PanelNhapHang và PanelXuatHang là một splitPane, một bên chứa PanelChonDuocPham, một bên chứa thông tin nhập vào cho record.
    • Bên chứa thông tin record dùng GridLayout nhiều dòng
    • Sau khi chọn dược phẩm thì bắt đầu nhập thông tin, nếu chưa chọn DP sẽ có thông báo.
    • Mã phiếu tự sinh
    • Mặc định ngày nhập xuất sẽ lấy ngày hiện tại của hệ thống.
    5. Chức năng của panel xuất toa thuốc
    QuanLyDuocPhamCongDongJava_xuatToaThuoc.png
    • Panel này khác panel xuất hàng ở chỗ nó có thêm danh sách dược phẩm đã chọn.
    • Sau khi chọn DP ở panelChonDuocPham thì sẽ xuất hiện button cho phép nhập số lượng và thêm vào toa
      QuanLyDuocPhamCongDongJava_ChonDuocPhamToaThuoc2.gif
    • Khi DP được add vào toa thuốc thì sẽ tự động tính tổng tiền toa thuốc.
    • Sau khi đã chọn DP vào toa thuốc, nếu click vào DP đã chọn thì nút Loại bỏ DP sẽ hiện ra cho phép loại bỏ tất cả các DP đã chọn.
    6 Chức năng liệt kê và thông báo
    • Cửa sổ liệt kê danh sách mặt hàng có chức năng liệt kê các sản phẩm với số lượng tồn <= số lượng dự trữ tối thiểu
    • Thông báo mặt hàng số lượng tồn <= số lượng dự trữ tối thiểu khi xuất mặt hàng
    ===================

    Cấu trúc dữ liệu cho phần mềm:
    1. Loại dữ liệu
    • Dữ liệu dạng file, lưu object
    2. Các file dữ liệu chương trình
    • _DuLieuDuocPham.data: Dữ liệu tất cả các mặt hàng
    • _ApplicationSetting.set: Thiết lập của chương trình
    • _NhapHangSetting.set, _ToaThuocSetting.set, _XuatHangSetting.set: Giá trị ID tự tăng hiện tại.
    • DuLieuNhapHangXXXXXX.data, DuLieuXuatHangXXXX.data, DuLieuToaThuocXXXX.data: Dữ liệu theo tháng của việc nhập hàng, xuất hàng, xuất toa thuốc.
    3. Dữ liệu mặt hàng
    • Bao gồm tên, nhà sản xuất, đơn vị tính, ..., giá nhập, giá bán.
    • Giá nhập, giá bán được thay đổi mỗi lần nhập hàng mới bên cửa sổ nhập hàng.
    • Các thao tác nhập hàng, xuất hàng, xuất hóa đơn làm thay đổi số lượng của mặt hàng sẽ được cập nhật và tự động lưu lại.
    3. Tính an toàn dữ liệu
    • Khi bắt đầu lưu trữ sẽ đổi tên file dữ liệu đã lưu thành một file tạm đánh số lũy tiến (Nếu đã có file tạm sẽ tạo file mới), khi lưu thành công file mới thì file tạm được xóa đi, nếu trong quá trình ghi file bị lỗi thì sẽ xóa file đang ghi, file tạm đựa sửa tên lại thành file dữ liệu ban đầu (Logic này bị sai, có thể xảy ra trường hợp mất tính toàn vẹn dữ liệu)
    ==================​
    Cấu trúc class và data flow:
    1. Các package
    • ui: Các class về giao diện
    • unit: Các class cho từng item
    • unit.data: Các unit chứa dữ liệu dành cho việc lưu trữ
    • unit.manager: Các class quản lý việc tương tác xử lý dữ liệu, thêm xóa sửa ....
    • unit.setting: Các class dành cho việc lưu trữ setting.
    • worker: Các class làm nhiệm vụ xử lý các tác vụ ngoài logic của chương trình như là Lưu dữ liệu, Lấy ngày tháng năm của hệ thống, Chuyển đổi dữ liệu string từ có dấu sang không dấu, Ghi log lỗi chương trình, clipboard, icon, ...
    2. Các đối tượng chính trong chương trình
    • GlobalData: Đối tượng lưu trữ dữ liệu toàn cục, đóng vai trò là trung tâm dữ liệu cho chương trình
    • XXXXDataManager: Quản lý vấn đề liên quan đến dữ liệu của XXXX như tên file, tạo mới, thêm, xóa, sửa, lưu, tìm kiếm, kiểm tra trùng lặp, ...
    2. Data flow, ví dụ
    • PanelDanhSachHangLuuTru yêu cầu dữ liệu về các mặt hàng sẽ gọi DuocPhamDataManager.getDanhSachDuocPham(select) để lấy dữ liệu, DuocPhamDataManager.getDanhSachDuocPham(select) sẽ gọi đối tượng GlobalData yêu cầu dữ liệu các mặt hàng GlobalData.getDuocPhamData() rồi lọc theo điều kiện select để trả về danh sách theo yêu cầu.
    • GlobalData.getDuocPhamData() gọi đến DuocPhamDataManager.loadDuocPhamData() lấy dữ liệu từ file lên gán vào biến static DuocPhamData duocPhamData; cho những lần GlobalData.getDuocPhamData() sau.
    • DuocPhamDataManager.loadDuocPhamData() gọi IOMaster.readObject(FILEPATH); để đọc đọc dữ liệu từ file FILEPATH lên.
    =========================​
    Chú ý

    • Chú ý khi nhập liệu: Do thiết kế ban đầu thiếu phần quy cách, để nhập phần quy cách cho mặt hàng phải thêm dấu | vào sau tên sản phẩm rồi mới dến quy cách, ví dụ Panadol Extra 500mg | Hộp 50 viên
    Log
    • Trong quá trình chạy, chương trình gặp lỗi sẽ được log vào thư mục LoiPhanMem bên cạnh chương trình
    • Nội dung log là excption trace
    JackV viết vậy thôi, hết ý rồi, có thắc mắc gì thì anh em comment lại chúng ta trao đổi.

    Attached Files:

  2. JackV

    JackV Administrator Staff Member

    Hạn chế của phiên bản 1.1
    • Chưa hiện thực phân trang
    • Chức năng tìm kiếm chỉ thực hiện đối với danh sách đang được chọn.
  3. Joe

    Joe Moderator

    Excellent ! My Congratulation.
    tranhuyvc and JackV like this.
  4. LTV

    LTV Active Member

    Good soft :)
  5. HeisVietkhang

    HeisVietkhang New Member

    Ừm tui có mấy câu hỏi và góp ý nếu bạn không phiền...

    - Bạn làm bán cho người ta rồi chưa? Nếu bán rồi còn mang lên đây thì không đẹp, nên xóa bài này đi. Nếu không phải thì vui lòng bỏ qua.
    - Gọi là nguồn mở thì bạn có thể đưa nó lên Google Code, GitHub hay Bitbucket. Nên xài Git hay Mercurial, đừng xài SVN (nó tệ lắm, và tui thấy người mình hay xài SVN). Quan trọng là cho dự án của bạn một giấy phép.
    - Nên xài Eclipse với Google WindowBuilder Pro (miễn phí hết). Làm giao diện với NetBeans tui thấy hơi mệt.

    Cám ơn :)
  6. Joe

    Joe Moderator

    Hey Exhibitionist;),
    I just wonder if Google pay you for the promotion of Eclipse, WindowBuilder etc... My personal opinion is: A real developer won't rely on any external resources and never promote 3rd party products. Agreed ?
  7. corek

    corek New Member

    Mr JackV, open source is just a buzzword, a philosophy, every open source software must have a attached LICENSE inside it. A license permits what people can do (use, modify source code, redistribute) with your software. Some licenses have loose permissions but others are not. Sorry, I just know some licenses in its surface view, not good enough to do anything for you. Mr Joe can help you than me.

    I think that having many licenses for your choice (GPL, LGPL, BSD, MIT) for your software or write your OWN license :D
  8. HeisVietkhang

    HeisVietkhang New Member

    @Joe,

    Well I'm not real developer -- I don't have no certificates, man. And I say things without the need of clarifying that they are my opinions, 'cause they just are. If you call my words "promotion" then that's fine. I call them my experiences.

    If you don't stop being so negative then I'm sorry I have nothing to do.
  9. JackV

    JackV Administrator Staff Member

    it's just a demo version for our community, not for sale
    Cao Hoài Việt and nttai like this.
  10. nguyen_van_ab

    nguyen_van_ab New Member

    anh ơi,cho em hỏi ở PanelDanhSachhangLuuTru phần có số 1 thì làm sao cho cái flow layout nó canh lề về bên trái vậy(netbeans)?
  11. JackV

    JackV Administrator Staff Member

    Netbeans thì bên panel inspecter chọn layout, bên phần layout properties chọn alignment là left.
  12. KYAN NGUYEN

    KYAN NGUYEN Member

    Cho mình hỏi cái bảng table cua bạn tạo ở trên khi di chuột vào nó có bị dịch chuyển không ?
    Cùa mình di chuột vào kéo thì nó dịch chuyển các cột trong bảng có cách nào cố định được k?
  13. JackV

    JackV Administrator Staff Member

    jtable table.getTableHeader().setReorderingAllowed(false);
  14. KYAN NGUYEN

    KYAN NGUYEN Member

    Thanks bạn nhiều
  15. vanquan223

    vanquan223 New Member

    Ad ơi! cho hỏi có thể đổi tên và mật khẩu đăng nhập được không, dùng phần mềm gì để đọc và sửa mấy file dữ liêu chương trình vậy?????
  16. JackV

    JackV Administrator Staff Member

    Chào bạn.

    Mật khẩu chương trình được mã hóa bởi class MD5Encryption.java
    Tên và mật khẩu chương trình có thể đổi được nhưng module đó đã được tách khỏi chương trình với mục đích để các bạn tham khảo cấu trúc và hướng đi của chương trình rồi hiện thực những thứ còn thiếu.
    Tên đăng nhập và mật khẩu được lưu trong đối tượng của lớp DuocPhamData.java
    PHP:
    public DuocPhamData(String usenameString password) {
            
    this.accessInfo MD5Encryption.encrypt(usename.toLowerCase() + password);
        }
    usename và password được nối lại thành một chuỗi rồi mã hóa, tránh luôn tình trạng xem file biết tên đăng nhập.

    Để đọc file dữ liệu của chương trình.
    - Các file dữ liệu được lưu là đối tượng của các class trong package unit.data
    - Để lấy được nội dung chính xác thì phải dùng chương trình tạo ra nó.

    Để sửa file dữ liệu của chương trình.
    - Các phần mềm đọc và chỉnh sửa file dữ liệu thông thường sẽ làm hỏng cấu trúc file.
    - Việc sửa trong chương trình được thực hiện bằng cách đọc dữ liệu vào, thay đổi rồi ghi xuống lại.

    * Để đổi tên và mật khẩu chương trình thì việc duy nhất bạn phải làm là đọc file DuocPhamData vào vào gọi phương thức thay đổi thông tin đăng nhập của đối tượng
    PHP:
        public String getAccessInfo() {
            return 
    accessInfo;//accessInfo = MD5Encryption.encrypt(usename.toLowerCase() + password);
        
    }
  17. vanquan223

    vanquan223 New Member

    Cảm ơn a nhiều!
  18. quangbeo216

    quangbeo216 Member

    anh ơi cho em hỏi, trong phần mềm có thuật toán tìm kiếm tên thuốc khi nhập vào textField, em đọc code nhưng mà không thể tìm thấy được tại nó nhiều quá, anh có thể xậy dựng bản demo hướng dẫn được không ạ, với lại làm sao đê table có thể sắp xếp được tên theo vần a->z;
  19. JackV

    JackV Administrator Staff Member

    Cái đó em xem trong phần event keyrelased

    Còn việc sắp xếp thì em xem table đó được set những thuộc tính gì cho việc nhấn vào tiêu đề cột để sắp xếp, hình như là liên quan đến reorder

    Anh đang bận việc nên không làm hướng dẫn được.
  20. Joe

    Joe Moderator

    Are you a software developer or are you a Software copier? Do it yourself then you may learn something and make some own progress. Even the Admin is NOT here to spoonfeed you spoon by spoon. Nor I do. Is it so difficult to understand?

Chia sẻ trang này