Hệ thống pháp luật

ỦY BAN NHÂN DÂN
TỈNH NINH BÌNH
-------

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc
---------------

Số: 65/KH-UBND

Ninh Bình, ngày 12 tháng 4 năm 2023

 

KẾ HOẠCH

ĐÀO TẠO, BỒI DƯỠNG, NÂNG CAO NĂNG LỰC ĐỘI NGŨ CÁN BỘ LÀM CÔNG TÁC DÂN SỐ CÁC CẤP ĐẾN NĂM 2030

I. CĂN CỨ BAN HÀNH KẾ HOẠCH

1. Cơ sở lý luận, pháp lý

- Nghị quyết số 21-NQ/TW ngày 25/10/2017 Hội nghị lần thứ sáu Ban Chấp hành Trung ương Đảng khóa XII về công tác dân số trong tình hình mới.

- Quyết định số 1679/QĐ-TTg ngày 22/11/2019 của Thủ tướng Chính phủ về việc phê duyệt Chiến lược Dân số Việt Nam đến năm 2030.

- Quyết định số 520/QĐ-TTg ngày 01/4/2021 của Thủ tướng Chính phủ phê duyệt Đề án đào tạo, bồi dưỡng, nâng cao năng lực đội ngũ cán bộ làm công tác dân số các cấp giai đoạn 2021-2030. Công văn số 3904/BYT-TCDS ngày 12/5/2021 của Bộ Y tế về việc hướng dẫn thực hiện Quyết định số 520/QĐ-TTg ngày 01/4/2021 của Thủ tướng Chính phủ.

- Quyết định số 441/QĐ-BYT ngày 28/02/2022 của Bộ Y tế ban hành Kế hoạch đào tạo, bồi dưỡng, nâng cao năng lực đội ngũ làm công tác dân số các cấp giai đoạn 2021-2030.

- Thông tư liên tịch số 08/2016/TTLT-BYT-BNV ngày 15/4/2016 của Bộ Y tế - Bộ Nội vụ quy định mã số, tiêu chuẩn chức danh nghề nghiệp dân số.

- Quyết định số 86/QĐ-TCDS ngày 18/4/2012 của Tổng cục Dân số - Kế hoạch hóa gia đình về việc phê duyệt và ban hành Chương trình bồi dưỡng nghiệp vụ dân số

- kế hoạch hóa gia đình đạt chuẩn viên chức dân số. Công văn số 342/TCDS-TCCB ngày 22/6/2012 của Tổng cục Dân số - Kế hoạch hóa gia đình về việc hướng dẫn thực hiện chương trình bồi dưỡng nghiệp vụ dân số - kế hoạch hóa gia đình đạt chuẩn viên chức dân số.

- Chương trình hành động số 22-CTr/TU ngày 26/02/2018 của Tỉnh ủy Ninh Bình thực hiện Nghị quyết số 21-NQ/TW ngày 25/10/2017 của Hội nghị lần thứ sáu Ban Chấp hành Trung ương Đảng khoá XII về công tác dân số trong tình hình mới.

- Kế hoạch số 37/KH-UBND ngày 09/4/2018 của Ủy ban nhân dân tỉnh về thực hiện Chương trình hành động số 22-CTr/TU ngày 26/02/2018 của Tỉnh ủy thực hiện Nghị quyết số 21-NQ/TW ngày 25/10/2017 của Hội nghị lần thứ sáu Ban Chấp hành Trung ương Đảng (khóa XII) về công tác dân số trong tình hình mới.

- Kế hoạch số 100/KH-UBND ngày 08/10/2020 của Ủy ban nhân dân tỉnh về thực hiện Kế hoạch hành động giai đoạn 2020-2025 của tỉnh Ninh Bình thực hiện Chiến lược Dân số Việt Nam đến năm 2030.

2. Cơ sở thực tiễn

a) Thực trạng đội ngũ cán bộ làm công tác dân số

Đội ngũ cán bộ làm công tác dân số các cấp hiện có 3.605 người, trong đó:

- Chi cục Dân số - Kế hoạch hóa gia đình: 10 người (08 công chức, hợp đồng lao động); trong đó, 09/10 người có trình độ đại học và trên đại học, chiếm 90%.

- Trung tâm Y tế các huyện, thành phố: 45 viên chức; trong đó, 36/45 người có trình độ đại học và trên đại học, chiếm 80%.

- Cộng tác viên dân số: 1.913 người, trong đó chuyên trách 326 người, chiếm 17% và kiêm nhiệm 1.587 người, chiếm 83%- Ban chỉ đạo công tác dân số và phát triển các cấp: 1.637 người (cấp tỉnh 18 người, cấp huyện 127 người, cấp xã 1.492 người).

b) Tình hình đào tạo, bồi dưỡng đội ngũ cán bộ làm công tác dân số

Giai đoạn 2011-2020, công tác đào tạo, bồi dưỡng đội ngũ cán bộ làm công tác dân số các cấp tỉnh Ninh Bình được thực hiện trên cơ sở định hướng của Chiến lược dân số và sức khỏe sinh sản Việt Nam giai đoạn 2011-2020. Từ năm 2021, Chương trình mục tiêu Y tế - Dân số kết thúc, các hoạt động công tác dân số không được đầu tư kinh phí từ nguồn trung ương và chỉ được đầu tư từ nguồn kinh phí địa phương.

Nhìn chung, công tác đào tạo, bồi dưỡng chuyên môn nghiệp vụ dân số luôn được quan tâm, chú trọng và đạt được nhiều kết quả tích cực:

- Hàng năm, Sở Y tế (Chi cục Dân số - Kế hoạch hóa gia đình) thường xuyên tổ chức các chương trình tập huấn cho đội ngũ cán bộ làm công tác dân số từ cấp tỉnh đến cấp huyện, cấp xã. Ngoài ra, cán bộ làm công tác dân số trong tỉnh còn được cử tham gia các chương trình tập huấn của Tổng cục Dân số - Kế hoạch hóa gia đình.

- Công chức làm công tác dân số được bồi dưỡng kiến thức dân số cơ bản là 04/08 người, đạt 50%. Viên chức làm công tác dân số được bồi dưỡng theo tiêu chuẩn chức danh nghề nghiệp dân số là 45/45 người, đạt 100%. 30% cộng tác viên dân số được tập huấn kiến thức nghiệp vụ công tác dân số hàng năm (chủ yếu là những cộng tác viên mới tham gia công tác).

- Các chương trình đào tạo, tập huấn, bồi dưỡng đã giúp cán bộ làm công tác dân số được cập nhật những văn bản mới về dân số - kế hoạch hóa gia đình, nâng cao kỹ năng, chuyên môn nghiệp vụ, đáp ứng được yêu cầu, nhiệm vụ về công tác dân số trong tình hình mới.

Bên cạnh thuận lợi, kết quả đã đạt được, công tác đào tạo, bồi dưỡng đội ngũ cán bộ làm công tác dân số vẫn còn những khó khăn, hạn chế làm ảnh hưởng đến chất lượng đào tạo, bồi dưỡng:

- Nội dung đào tạo, bồi dưỡng vẫn tập trung chủ yếu vào các chủ đề dân số - kế hoạch hóa gia đình phục vụ cho mục tiêu giảm sinh, là một trong các nguyên nhân làm cho công tác dân số chưa thích ứng kịp thời với yêu cầu của chiến lược chuyển mạnh trọng tâm của các hoạt động từ nội dung dân số - kế hoạch hóa gia đình sang dân số và phát triển.

- Kinh phí tập huấn, bồi dưỡng kiến thức chuyên môn, nghiệp vụ, quản lý cho đội ngũ làm công tác dân số các cấp chưa đáp ứng đủ nhu cầu nhất là vào những năm cuối giai đoạn 2011-2020- Sự thay đổi về tổ chức bộ máy làm công tác dân sốc) Nhu cầu đào tạo, bồi dưỡng

- Cấp tỉnh: Bồi dưỡng theo chương trình cơ bản 02 tháng cho công chức mới chưa được đào tạo. Bồi dưỡng về quản lý công tác dân số và phát triển; quản lý các nội dung chuyên môn nghiệp vụ về chăm sóc sức khỏe sinh sản, nâng cao chất lượng dân số.

- Cấp huyện: Đào tạo cử nhân y tế công cộng định hướng công tác dân số hoặc cử nhân công tác xã hội; bồi dưỡng theo tiêu chuẩn chức danh nghề nghiệp dân số viên hạng III và hạng II; bồi dưỡng các chuyên môn nghiệp vụ khác về quản lý dân số - kế hoạch hóa gia đình: Truyền thông, vận động, truyền thông chuyển đổi hành vi, huy động cộng đồng về dân số và phát triển. Truyền thông - tư vấn, các nội dung như ổn định quy mô dân số, giảm thiểu mất cân bằng giới tính khi sinh, tư vấn chăm sóc sức khỏe sinh sản vị thành niên, chăm sóc người cao tuổi, tư vấn tầm soát, chẩn đoán điều trị bệnh tật trước sinh, sơ sinh; truyền thông, tư vấn tiếp thị phương tiện tránh thai và hàng hóa chăm sóc sức khỏe; kỹ năng lập kế hoạch và báo cáo kết quả các hoạt động lồng ghép biến dân số vào kế hoạch phát triển kinh tế và phát triển.

- Cộng tác viên dân số: Bồi dưỡng kiến thức, kỹ năng chuyên môn về các nội dung truyền thông dân số và phát triển ở cơ sở.

- Ban Chỉ đạo công tác dân số và phát triển các cấp: Nội dung triển khai thực hiện Nghị quyết số 21/NQ-TW ngày 25/10/2017 của Hội nghị lần thứ sáu Ban Chấp hành Trung ương Đảng (khóa XII) về công tác dân số trong tình hình mới, “bảo đảm sự lãnh đạo, chỉ đạo thống nhất của cấp ủy, chính quyền các cấp”.

- Nhân viên y tế cung cấp dịch vụ về dân số và phát triển: Đào tạo, tập huấn các thủ thuật tầm soát, chẩn đoán và điều trị các bệnh bẩm sinh cho trẻ sơ sinh; bồi dưỡng về các thủ thuật y tế liên quan đến cung cấp các phương tiện tránh thai lâm sàng, phá thai an toàn, làm mẹ an toàn; khám và điều trị các bệnh phụ khoa, bệnh lây truyền qua đường tình dục, các bệnh liên quan đến chăm sóc sức khỏe sinh sản.

Với mục tiêu phấn đấu ổn định quy mô, cơ cấu dân số hợp lý nhằm đảm bảo mức sinh thay thế một cách bền vững, triển khai đồng bộ các hoạt động nâng cao chất lượng dân số, chăm sóc sức khỏe sinh sản, chăm sóc sức khỏe người cao tuổi thích ứng với già hóa dân số; chủ động điều chỉnh tốc độ gia tăng dân số, kiểm soát mất cân bằng giới tính khi sinh và phát huy hiệu quả lợi thế cơ cấu dân số vàng, đưa công tác dân số - kế hoạch hóa gia đình thành nội dung quan trọng trong chương trình phát triển kinh tế - xã hội của địa phương đòi hỏi đội ngũ cán bộ dân số - kế hoạch hóa gia đình ở cơ sở ổn định về tổ chức, ngày càng nâng cao về chuyên môn nghiệp vụ để đáp ứng vai trò, nhiệm vụ trong công tác tổ chức thực hiện, tuyên truyền vận động tại cơ sở cũng như việc tham mưu cho lãnh đạo chính quyền trong việc thực hiện nhiệm vụ chính trị đảm bảo cho hoạt động dân số - kế hoạch hóa gia đình hiệu quả và chất lượng.

Trước những thách thức và khó khăn về công tác dân số trong tình hình mới chuyển trọng tâm từ dân số - kế hoạch hóa gia đình sang dân số và phát triển, việc xây dựng Kế hoạch đào tạo, bồi dưỡng, nâng cao năng lực đội ngũ cán bộ làm công tác dân số các cấp đến năm 2030 trên địa bàn tỉnh Ninh Bình là hết sức thiết thực và cần thiết nhằm góp phần triển khai có hiệu quả các hoạt động của công tác dân số từ tỉnh đến cơ sở.

II. MỤC ĐÍCH, YÊU CẦU

1. Mục đích

Cụ thể hóa các mục tiêu, nhiệm vụ và giải pháp chủ yếu của Đề án, đào tạo, bồi dưỡng, nâng cao năng lực đội ngũ làm công tác dân số các cấp giai đoạn 2021-2030 đã được Thủ tướng Chính phủ phê duyệt tại Quyết định số 520/QĐ-TTg ngày 01/4/2021 và Kế hoạch Đào tạo, bồi dưỡng, nâng cao năng lực đội ngũ cán bộ làm công tác dân số các cấp giai đoạn 2021-2030 đã được Bộ Y tế ban hành kèm theo Quyết định số 441/QĐ-BYT ngày 28/02/2022.

2. Yêu cầu

- Việc đào tạo, bồi dưỡng phải phù hợp với thực trạng và trình độ của đội ngũ cán bộ làm công tác dân số các cấp. Các giải pháp đào tạo, bồi dưỡng nâng cao năng lực đội ngũ làm công tác dân số phù hợp với tình hình thực tế địa phương.

- Nội dung đào tạo, bồi dưỡng phải cập nhật các quan điểm, chủ trương, đường lối, chính sách của Đảng và Nhà nước trong công tác dân số.

- Nâng cao trách nhiệm của cấp ủy, chính quyền, ban, ngành, đoàn thể các cấp trong việc tổ chức, triển khai thực hiện.

III. NỘI DUNG KẾ HOẠCH

1. Đối tượng, phạm vi

a) Đối tượng

- Cán bộ, công chức, viên chức làm công tác dân số trong các cơ quan, đơn vị của tỉnh (sau đây gọi chung là cấp tỉnh).

- Cán bộ, công chức, viên chức làm công tác dân số trong các cơ quan, đơn vị của huyện, thành phố (sau đây gọi chung là cấp huyện).

- Nhân viên y tế cung cấp dịch vụ về dân sô và phát triển (dịch vụ kế hoạch hóa gia đình/sức khỏe sinh sản/chất lượng dân số/chăm sóc sức khỏe người cao tuổi tại cộng đồng…).

- Thành viên Ban chỉ đạo công tác dân số và phát triển các cấp.

- Cộng tác viên dân số.

b) Phạm vi

Kế hoạch được triển khai thực hiện trong phạm vi tỉnh Ninh Bình.

2. Mục tiêu

a) Mục tiêu chung

- Nâng cao chất lượng và hiệu quả đào tạo, bồi dưỡng về công tác dân số và phát triển, góp phần xây dựng đội ngũ cán bộ, công chức, viên chức làm công tác dân số các cấp và cộng tác viên dân số có đủ phẩm chất, trình độ và năng lực, đáp ứng yêu cầu, nhiệm vụ công tác dân số đã được đề ra trong Chiến lược dân số đến năm 2030 của tỉnh.

- Nâng cao kiến thức, kỹ năng về công tác dân số và phát triển; nâng cao trình độ chuyên môn nghiệp vụ, bao gồm năng lực quản lý, tổ chức, triển khai công tác dân số trong tình hình mới cho đội ngũ cán bộ, công chức, viên chức làm công tác dân số các cấp và đội ngũ cộng tác viên dân số.

b) Mục tiêu cụ thể

- Giai đoạn 1: Từ năm 2023 đến năm 2025

Tăng cường tổ chức các lớp bồi dưỡng dân số cơ bản cho đội ngũ công chức làm công tác dân số (tối thiểu 60% công chức được bồi dưỡng kiến thức dân số cơ bản).

Bồi dưỡng, phổ biến, cập nhật nội dung, kiến thức về công tác dân số cho thành viên Ban chỉ đạo công tác dân số và phát triển các cấp.

Tiếp tục bồi dưỡng chuyên môn, nghiệp vụ cho đội ngũ viên chức làm công tác dân số đáp ứng yêu cầu của vị trí việc làm và nhiệm vụ được giao.

Tối thiểu 60% nhân viên y tế cung cấp dịch vụ kế hoạch hóa gia đình/sức khỏe sinh sản ở các cơ sở y tế huyện và xã có kiến thức, kỹ năng cung cấp các dịch vụ dân số và phát triển.

Tối thiểu 50% lãnh đạo đơn vị y tế huyện và xã được bồi dưỡng về quản lý dân số và phát triển để thực hiện quản lý công tác dân số được giao.

Tổ chức các lớp bồi dưỡng cập nhật kiến thức mới, nâng cao kiến thức chuyên môn nghiệp vụ về công tác dân số cho cộng tác viên dân số để thực hiện tốt công tác dân số tại cơ sở. Tối thiểu 50% cộng tác viên dân số được cập nhật kiến thức về công tác dân số.

Giảng viên, báo cáo viên cấp tỉnh được tham gia tập huấn về dân số và phát triển.

- Giai đoạn 2: Từ năm 2026 đến năm 2030

Tăng cường tổ chức các lớp bồi dưỡng dân số cơ bản cho đội ngũ công chức làm công tác dân số (100% công chức được bồi dưỡng kiến thức dân số cơ bản).

30% viên chức làm công tác dân số cấp huyện có trình độ cử nhân y tế công cộng định hướng công tác dân số hoặc cử nhân công tác xã hội.

Tiếp tục bồi dưỡng chuyên môn, nghiệp vụ cho đội ngũ viên chức làm công tác dân số đáp ứng yêu cầu của vị trí việc làm và nhiệm vụ được giao.

Tối thiểu 90% nhân viên y tế cung cấp dịch vụ kế hoạch hóa gia đình/sức khỏe sinh sản ở các cơ sở y tế huyện và xã có kiến thức, kỹ năng cung cấp các dịch vụ dân số và phát triển.

80% lãnh đạo đơn vị y tế huyện và xã được bồi dưỡng về quản lý dân số và phát triển để thực hiện quản lý công tác dân số được giao.

Tổ chức các lớp bồi dưỡng cập nhật kiến thức mới, nâng cao kiến thức chuyên môn nghiệp vụ về công tác dân số cho cộng tác viên dân số để thực hiện tốt công tác dân số tại cơ sở. Tối thiểu 80% cộng tác viên dân số được cập nhật kiến thức về công tác dân số.

Giảng viên, báo cáo viên cấp tỉnh, cấp huyện được tham gia tập huấn về dân số và phát triển.

80% cộng tác viên tại cơ sở được tham gia bồi dưỡng kiến thức kỹ năng chuyên môn về các nội dung truyền thông dân số - phát triển.

3. Chương trình đào tạo, bồi dưỡng

Có phụ lục chi tiết kèm theo.

4. Nhiệm vụ, giải pháp thực hiện

a) Tăng cường và nâng cao chất lượng, hiệu quả hoạt động đào tạo, bồi dưỡng về dân số

- Tổ chức các khóa đào tạo, bồi dưỡng nhằm nâng cao chất lượng đội ngũ cán bộ làm công tác dân số các cấp và cộng tác viên dân số, phù hợp với vị trí việc làm, đáp ứng yêu cầu nhiệm vụ.

- Từng bước chuẩn hóa trình độ chuyên môn của đội ngũ cán bộ làm công tác dân số các cấp và cộng tác viên dân số.

- Khuyến khích tự học và đào tạo trình độ sau đại học cho đội ngũ cán bộ làm công tác dân số các cấp phù hợp với chuyên môn, gắn với quy hoạch sử dụng lâu dài.

b) Hoàn thiện chương trình, tài liệu bồi dưỡng

Trên cơ sở tài liệu của trung ương, biên soạn, bổ sung và hoàn thiện hệ thống chương trình, tài liệu bồi dưỡng về dân số và phát triển phù hợp với địa phương cho đội ngũ cán bộ làm công tác dân số các cấp, cộng tác viên dân số và các đối tượng liên quan khác.

c) Nâng cao năng lực giảng viên, báo cáo viên

- Xây dựng đội ngũ giảng viên, báo cáo viên cấp tỉnh, cấp huyện có chất lượng cao, đáp ứng nhiệm vụ bồi dưỡng chuyên môn, nghiệp vụ cho đội ngũ cán bộ làm công tác dân số các cấp và cộng tác viên dân số.

- Bồi dưỡng đội ngũ cán bộ, công chức, viên chức các huyện, thành phố để tham gia giảng dạy, bồi dưỡng chuyên môn, nghiệp vụ về dân số và phát triển cho cán bộ làm công tác dân số của địa phương.

d) Tăng cường công tác kiểm tra, giám sát, đánh giá việc triển khai thực hiện Kế hoạch

- Định kỳ kiểm tra, giám sát, đánh giá việc thực hiện Kế hoạch để kịp thời đề xuất cơ chế, chính sách phù hợp với thực tiễn nhằm bảo đảm chất lượng, hiệu quả công tác đào tạo, bồi dưỡng về dân số và phát triển.

- Tổ chức sơ kết, tổng kết việc thực hiện Kế hoạch, nhất là giai đoạn đầu của Kế hoạch để điều chỉnh cho phù hợp với giai đoạn tiếp theo.

5. Kinh phí thực hiện

Kinh phí thực hiện Kế hoạch được đảm bảo từ các nguồn:

- Ngân sách nhà nước theo quy định của Luật Ngân sách nhà nước.

- Lồng ghép từ nguồn kinh phí thực hiện các chương trình, đề án có liên quan đang thực hiện trên địa bàn tỉnh.

- Nguồn xã hội hóa.

- Nguồn huy động hợp pháp khác (nếu có).

IV. TỔ CHỨC THỰC HIỆN

1. Sở Y tế

- Chủ trì, phối hợp với các sở, ban, ngành liên quan, Ủy ban nhân dân các huyện, thành phố triển khai thực hiện Kế hoạch; là đầu mối tổ chức và điều phối hoạt động để triển khai thống nhất Kế hoạch trên địa bàn tỉnh.

- Chủ động xây dựng nội dung, chương trình đào tạo, bồi dưỡng. Phối hợp với các cơ sở đào tạo, bồi dưỡng trong và ngoài tỉnh tổ chức các khóa học cho đội ngũ cán bộ làm công tác dân số các cấp.

- Chỉ đạo các cơ quan, đơn vị trong ngành Y tế quan tâm thường xuyên tổ chức bồi dưỡng, tập huấn nâng cao năng lực cán bộ y tế, cán bộ dân số các cấp đáp ứng yêu cầu nhiệm vụ và mục tiêu Kế hoạch.

- Xây dựng dự toán kinh phí hằng năm trình cấp có thẩm quyền phê duyệt và triển khai thực hiện.

- Tổ chức kiểm tra, giám sát, đánh giá, sơ kết, tổng kết việc thực hiện Kế hoạch; tổng hợp tình hình, kết quả thực hiện, báo cáo Bộ Y tế, Ủy ban nhân dân tỉnh theo quy định.

2. Sở Nội vụ

Theo dõi, đôn đốc, kiểm tra công tác đào tạo, bồi dưỡng cán bộ, công chức, viên chức; tổng hợp, báo cáo Bộ Nội vụ, Ủy ban nhân dân tỉnh theo quy định.

3. Sở Kế hoạch và Đầu tư

Phối hợp với Sở Tài chính, Sở Y tế cân đối nguồn ngân sách đảm bảo chi cho các nội dung hoạt động của Kế hoạch; lồng ghép nguồn lực của các chương trình phát triển kinh tế - xã hội với Chương trình dân số.

4. Sở Tài chính

Hằng năm, căn cứ khả năng cân đối ngân sách tỉnh, tham mưu cho Ủy ban nhân dân tỉnh bố trí kinh phí chi thường xuyên để thực hiện Kế hoạch theo quy định của Luật Ngân sách Nhà nước và các văn bản hướng dẫn có liên quan.

5. Các sở, ban, ngành, đoàn thể

Căn cứ chức năng, nhiệm vụ được giao, phối hợp với Sở Y tế tổ chức triển khai thực hiện các nội dung của Kế hoạch đảm bảo kết quả, đúng quy định.

6. Ủy ban nhân dân các huyện, thành phố

- Căn cứ tình hình thực tế của địa phương và nội dung Kế hoạch để chỉ đạo xây dựng và bố trí kinh phí triển khai thực hiện Kế hoạch tại địa phương.

- Định kỳ báo cáo sơ kết, tổng kết việc thực hiện các nội dung của Kế hoạch, gửi Sở Y tế để tổng hợp, báo cáo Bộ Y tế, Ủy ban nhân dân tỉnh theo quy định.

Ủy ban nhân dân tỉnh yêu cầu các cơ quan, đơn vị, địa phương căn cứ chức năng, nhiệm vụ được giao triển khai thực hiện Kế hoạch nghiêm túc, hiệu quả. Trong quá trình triển khai thực hiện, nếu có khó khăn, vướng mắc phát sinh, đề nghị các cơ quan, đơn vị, địa phương kịp thời báo cáo Ủy ban nhân dân tỉnh (qua Sở Y tế) để xem xét, điều chỉnh cho phù hợp./.

 


Nơi nhận:
- Bộ Y tế;
- Các sở, ban, ngành, đoàn thể;
- UBND các huyện, thành phố;
- Lưu: VT, VP6,7.
TC_VP7_ĐTBD_08

TM. ỦY BAN NHÂN DÂN
KT. CHỦ TỊCH

PHÓ CHỦ TỊCH




Tống Quang Thìn

 

PHỤ LỤC

CHƯƠNG TRÌNH ĐÀO TẠO, BỒI DƯỠNG, NÂNG CAO NĂNG LỰC ĐỘI NGŨ CÁN BỘ LÀM CÔNG TÁC DÂN SỐ CÁC CẤP TRÊN ĐỊA BÀN TỈNH ĐẾN NĂM 2030
(Kèm theo Kế hoạch số 65/KH-UBND ngày 12 tháng 4 năm 2023 của Ủy ban nhân dân tỉnh Ninh Bình)

Đơn vị tính: Người

STT

Chương trình bồi dưỡng

Nhu cầu bồi dưỡng

Tổng nhu cầu bồi dưỡng

Công chức làm công tác dân số

Viên chức làm công tác dân số

Ban chỉ đạo Dân số và phát triển các cấp

Cộng tác viên dân số

Nhân viên y tế cung cấp dịch vụ về dân sô và phát triển

Ghi chú

 

Số lượng đội ngũ cán bộ làm công tác dân số hiện có

3.803

08

45

1.637

1.913

200
(dự kiến)

 

1

Nâng cao kiến thức về dân số trong tình hình mới

1.543

08

45

 

1.530

 

 

2

Quản lý nhà nước về công tác dân số - kế hoạch hóa gia đình

1.318

08

 

1.310

 

 

 

3

Kỹ năng tham mưu, vận động nguồn lực

04

04

 

 

 

 

 

4

Thanh tra chuyên ngành công tác dân số

04

04

 

 

 

 

 

5

Giảng viên tuyến tỉnh

04

04

 

 

 

 

 

6

Nghiệp vụ công tác dân số - kế hoạch hóa gia đình

1.543

08

45

 

1.530

 

 

7

Tư vấn tầm soát và quản lý sàng lọc trước sinh

233

08

45

 

 

180

 

8

Tư vấn tầm soát và quản lý sàng lọc sơ sinh

53

08

45

 

 

 

 

9

Giảm thiểu tảo hôn và kết hôn cận huyết thống

1.543

08

45

 

1.530

 

 

10

Bảng kiểm phương tiện tránh thai

1.723

08

45

 

1.530

180

 

11

Kiểm soát mất cân bằng giới tính khi sinh

1.723

08

45

 

1.530

180

 

12

Quản lý thông tin dân số của hộ gia đình

53

08

45

 

 

 

 

13

Kỹ năng viết tin, bài

53

08

45

 

 

 

 

14

Chăm sóc sức khỏe người cao tuổi tại cộng đồng

1.723

08

45

 

1.530

180

 

15

Tư vấn, cung cấp dịch vụ dân số - kế hoạch hóa gia đình cho vị thành niên, thanh niên

233

08

45

 

 

180

 

16

Tư vấn khám sức khỏe trước khi kết hôn

233

08

45

 

 

180

 

17

Bồi dưỡng theo tiêu chuẩn chức danh nghề nghiệp dân số viên hạng II

45

 

45

 

 

 

 

18

Bồi dưỡng theo tiêu chuẩn chức danh nghề nghiệp dân số viên hạng III

45

 

45

 

 

 

 

19

Bồi dưỡng theo tiêu chuẩn chức danh nghề nghiệp dân số viên hạng IV

45

 

45

 

 

 

 

20

Kỹ năng tiếp thị xã hội phương tiện tránh thai, hàng hóa, sức khỏe sinh sản

1.575

 

45

 

1.530

 

 

 



lồng nhau (bên trong) hay không const memberID = 0; const vbID = '3ac4f96c4d62ef9dad4302f173532766'; // State management cho phân tích let isAnalyzing = false; // Có đang phân tích không let currentAnalyzingAddress = null; // Address đang được phân tích let currentAnalyzingElement = null; // Element đang được phân tích let currentAnalyzingBadge = null; // Badge của element đang phân tích let isPanelOpen = false; // Panel phân tích có đang mở không console.log('Tiện ích loaded - memberID:', memberID, 'vbID:', vbID); function isInViewportAndTabNoiDung(element) { const rect = element.getBoundingClientRect(); const buffer = 1500; // Buffer to preload content below the viewport (approx. 50+ lines) const viewHeight = window.innerHeight || document.documentElement.clientHeight; const isInViewport = rect.top < viewHeight + buffer && rect.bottom >= 0; const isInTabNoiDung = $(element).closest('#tab_noi_dung_vb').length > 0; return isInViewport && isInTabNoiDung; } function getAddress(element) { const validTags = ['trichyeu', 'cancu', 'phan', 'chuong', 'muc', 'tieumuc', 'dieu', 'khoan', 'diem']; const $parent = $(element).closest(validTags.join(',')); if (!$parent.length) { return null; } let addr = $parent.attr('address'); if (!addr && $parent.prop('tagName').toLowerCase() === 'trichyeu') { addr = 'trichyeu'; $parent.attr('address', addr); } return addr || null; } function processTnplClasses($element) { const tnplKeysInLine = new Set(); // key = slug hoặc text (thường là slug) $element.find('tnpl').each(function () { const $tnpl = $(this); const tnplSlug = ($tnpl.attr('slug') || '').trim().toLowerCase(); const tnplKey = tnplSlug || $tnpl.text().trim().toLowerCase(); // Đã xử lý trong cùng dòng => bỏ if (tnplKeysInLine.has(tnplKey)) { return; } tnplKeysInLine.add(tnplKey); let tnplExists = false; // Chỉ duyệt các tnpl đã được tô màu (class on) $('tnpl.on').each(function () { const $existingTnpl = $(this); const existingSlug = ($existingTnpl.attr('slug') || '').trim().toLowerCase(); const existingKey = existingSlug || $existingTnpl.text().trim().toLowerCase(); if ( existingKey === tnplKey && isInViewportAndTabNoiDung($existingTnpl[0]) ) { tnplExists = true; return false; // break each } }); if (!tnplExists) { $tnpl.addClass('on'); } }); } function processQueue() { while (pendingRequests < maxConcurrentRequests && requestQueue.length > 0) { const task = requestQueue.shift(); pendingRequests++; task() .always(() => { pendingRequests--; processQueue(); }); } } function processVisibleParagraphs() { try { $('#tab_noi_dung_vb p:not([is-posted="1"])').each(function () { let $element = $(this); if (isInViewportAndTabNoiDung(this)) { $element.attr('is-posted', '1'); $element.addClass('loading-content'); let p_innerHTML = $element.html(); let address = null; if (cac_cau_hinh.loai_noi_dung.includes('docs')) { address = getAddress($element); } const isSubP = $element.parents('p').length > 0; if (isSubP && !allow_sub_p) { $element.removeClass('loading-content'); return; // Không gửi nếu không cho phép } const postData = { p_content: p_innerHTML, cac_cau_hinh, address }; if (isSubP && allow_sub_p) { postData.sub_p = 1; } requestQueue.push(() => $.ajax({ url: '//tnpl' + (Math.floor(Math.random() * 10) + 1) + '.hethongphapluat.com/tien-ich/tim.tien.ich.php', type: 'POST', data: postData, success: function(response) { $element.html(response); processTnplClasses($element); // Đợi CTTD và các tiện ích load xong rồi mới attach badge if (memberID === 4 && typeof attachPhanTichBadge === 'function') { setTimeout(function() { // $element chính là thẻ p, kiểm tra và attach badge trực tiếp const $parent = $element.closest('phan, chuong, muc, tieumuc, dieu, khoan, diem'); if ($parent.length > 0 && $parent.find('.badge-phan-tich[data-for="' + $parent.attr('address') + '"]').length === 0) { const address = $parent.attr('address'); $element.attr('data-address', address); // Lấy tên loại thẻ cho tooltip const parentType = getParentTypeName($parent.prop('tagName').toLowerCase()); // Append badge VÀO PARENT (dieu, khoan,...) thay vì vào

để tránh xung đột CTTD const $badge = $('Phân tích'); $parent.append($badge); // Thêm class để CSS set position: relative CHỈ cho element có badge $parent.addClass('has-phan-tich-badge'); } // Xử lý các p con (nếu có sub-p) attachPhanTichBadge($element); }, 300); // Đợi 300ms để CTTD render xong } }, complete: function() { $element.removeClass('loading-content'); } }) ); processQueue(); } }); } catch(e) { console.error('Lỗi processVisibleParagraphs:', e); } } $(window).on('scroll resize', function () { processVisibleParagraphs(); }); console.log('Bắt đầu processVisibleParagraphs lần đầu...'); processVisibleParagraphs(); console.log('processVisibleParagraphs lần đầu hoàn thành'); // Chức năng phân tích điều luật (chỉ cho member_id = 4) if (memberID === 4) { // Modal cảnh báo function showWarningModal(message) { // Tạo modal nếu chưa có if ($('#warningModal').length === 0) { const modalHTML = `

`; $('body').append(modalHTML); } $('#warningModalBody').html('

' + message + '

'); $('#warningModal').modal('show'); } // Hàm lấy tên tiếng Việt của thẻ function getParentTypeName(tagName) { const typeNames = { 'phan': 'Phần', 'chuong': 'Chương', 'muc': 'Mục', 'tieumuc': 'Tiểu mục', 'dieu': 'Điều', 'khoan': 'Khoản', 'diem': 'Điểm' }; return typeNames[tagName] || 'Nội dung'; } function attachPhanTichBadge($container) { const validTags = 'phan, chuong, muc, tieumuc, dieu, khoan, diem'; $container.find('p').each(function() { const $p = $(this); const $parent = $p.closest(validTags); if ($parent.length > 0) { const address = $parent.attr('address'); // Kiểm tra đã có badge cho parent này chưa if ($parent.find('.badge-phan-tich[data-for="' + address + '"]').length === 0) { // Lưu address vào data attribute $p.attr('data-address', address); // Lấy tên loại thẻ cho tooltip const parentType = getParentTypeName($parent.prop('tagName').toLowerCase()); // Append badge vào PARENT, không vào

const $badge = $('Phân tích'); $parent.append($badge); // Thêm class để CSS set position: relative CHỈ cho element có badge $parent.addClass('has-phan-tich-badge'); } } }); } // Helper: Escape HTML entities function escapeHtml(text) { const map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return String(text).replace(/[&<>"']/g, function(m) { return map[m]; }); } // Helper: Convert Markdown to HTML (đơn giản) function markdownToHtml(markdown) { if (!markdown) return ''; let html = markdown; // Headers html = html.replace(/^### (.*$)/gim, '

$1
'); html = html.replace(/^## (.*$)/gim, '

$1

'); html = html.replace(/^# (.*$)/gim, '

$1

'); // Bold html = html.replace(/\*\*(.*?)\*\*/g, '$1'); // Italic html = html.replace(/\*(.*?)\*/g, '$1'); // Blockquote html = html.replace(/^> (.*$)/gim, '
$1
'); html = html.replace(/^> (.*$)/gim, '
$1
'); // Lists (unordered) html = html.replace(/^\- (.*$)/gim, '
  • $1
  • '); html = html.replace(/(
  • .*<\/li>)/s, '
      $1
    '); // Lists (ordered) html = html.replace(/^\d+\. (.*$)/gim, '
  • $1
  • '); // Line breaks và paragraphs html = html.split('\n\n').map(para => { para = para.trim(); if (para.startsWith('')) { return para; } if (para) { return '

    ' + para.replace(/\n/g, '
    ') + '

    '; } return ''; }).join('\n'); // Clean up multiple line breaks html = html.replace(/\n{3,}/g, '\n\n'); return html; } // Panel fixed position function closePhanTichPanel() { const $panel = $('#phanTichPanel'); if ($panel.length) { $panel.removeClass('show'); setTimeout(() => { $panel.remove(); }, 300); } // Reset highlight và badge khi đóng panel if (currentAnalyzingElement) { currentAnalyzingElement.removeClass('highlight-border-persistent'); } if (currentAnalyzingBadge) { currentAnalyzingBadge.text('Phân tích').removeClass('analyzing'); currentAnalyzingBadge.data('analyzing', false); currentAnalyzingBadge.data('hovering', false); currentAnalyzingBadge.css({display: 'none'}); // Ẩn badge khi đóng } // Reset tất cả các element khác (trong trường hợp có nhiều) $('#tab_noi_dung_vb .highlight-border-persistent').removeClass('highlight-border-persistent'); $('#tab_noi_dung_vb .badge-phan-tich-container.analyzing').each(function() { $(this).text('Phân tích').removeClass('analyzing').data('analyzing', false); }); // Check: có CTTD pointer đang mở không? const $visiblePointers = $('.pointer:visible'); const hadCTTDOpen = $visiblePointers.length > 0; if (hadCTTDOpen) { // CÓ CTTD đang mở → giữ rightdocinfo ẩn console.log('ℹ️ CTTD pointer is visible, keeping rightdocinfo hidden'); } else { // KHÔNG có CTTD → SHOW lại rightdocinfo const $rightdocinfo = $('#rightdocinfo'); if ($rightdocinfo.length > 0) { $rightdocinfo.show(); console.log('✅ Showing rightdocinfo back (no CTTD pointer)'); } } // Reset state isAnalyzing = false; currentAnalyzingAddress = null; currentAnalyzingElement = null; currentAnalyzingBadge = null; isPanelOpen = false; // Đánh dấu panel đã đóng console.log('✅ Panel closed, state reset, isPanelOpen = false'); } // Panel đã song song với rightdocinfo → không cần MutationObserver nữa console.log('✅ Panel running in standalone mode (parallel to rightdocinfo)'); // Resize event để update panel dimensions khi browser resize let resizeTimer; $(window).on('resize', function() { clearTimeout(resizeTimer); resizeTimer = setTimeout(function() { if (isPanelOpen && $('#phanTichPanel').length > 0) { updatePanelDimensions(); console.log('✅ Panel dimensions updated on window resize'); } }, 250); // Debounce 250ms }); // Function để detect và áp dụng dimensions từ rightdocinfo function updatePanelDimensions() { const $panel = $('#phanTichPanel'); const $rightdocinfo = $('#rightdocinfo'); const $docRightCol = $('#doc-right-col'); if ($panel.length === 0) return; // Ưu tiên: doc-right-col > rightdocinfo let $reference = $docRightCol.length > 0 ? $docRightCol : $rightdocinfo; // Nếu reference bị ẩn (display:none), tạm show để get dimensions let wasHidden = false; if ($reference.length > 0 && !$reference.is(':visible')) { wasHidden = true; $reference.css('visibility', 'hidden').show(); } if ($reference.length > 0) { const refWidth = $reference.outerWidth(); const refOffset = $reference.offset(); if (refWidth && refOffset) { // Tính vị trí right từ edge màn hình const windowWidth = $(window).width(); const rightPosition = windowWidth - (refOffset.left + refWidth); $panel.css({ 'width': refWidth + 'px', 'right': rightPosition + 'px' }); console.log('✅ Panel dimensions updated:', { width: refWidth + 'px', right: rightPosition + 'px', reference: $reference.attr('id') }); } else { console.warn('⚠️ Could not get dimensions from reference element'); } // Restore trạng thái hidden nếu cần if (wasHidden) { $reference.hide().css('visibility', ''); } } else { console.warn('⚠️ No reference element found for panel dimensions'); } } function openPhanTichPanel(address, vbID) { console.log('openPhanTichPanel called with address:', address); console.log('Current state - isAnalyzing:', isAnalyzing, 'currentAnalyzingAddress:', currentAnalyzingAddress); // Kiểm tra nếu đang phân tích element khác if (isAnalyzing && currentAnalyzingAddress && currentAnalyzingAddress !== address) { const currentName = getElementDisplayName(currentAnalyzingAddress); console.warn('Already analyzing:', currentAnalyzingAddress, 'Cannot analyze:', address); showWarningModal('Vui lòng chờ phân tích ' + currentName + ' hoàn tất...'); return; } // Nếu đang phân tích cùng element → không làm gì if (isAnalyzing && currentAnalyzingAddress === address) { console.log('Already analyzing this element, ignoring duplicate request'); return; } // Panel sẽ fixed position append vào body const $rightdocinfo = $('#rightdocinfo'); // KHÔNG ẨN CTTD pointer - cho phép CTTD và panel cùng tồn tại console.log('Panel opening, CTTD pointer can stay visible'); // ẨN rightdocinfo để tiết kiệm không gian if ($rightdocinfo.length > 0) { $rightdocinfo.hide(); console.log('Hidden rightdocinfo to save space'); } // XÓA highlight persistent của TẤT CẢ elements cũ trước $('#tab_noi_dung_vb .highlight-border-persistent').removeClass('highlight-border-persistent'); console.log('Removed all previous highlight-border-persistent'); // Tìm element đang được phân tích và badge của nó const $element = $('[address="' + address + '"]'); const $badge = $element.find('.badge-phan-tich-container[data-for="' + address + '"]').first(); // Set state isAnalyzing = true; currentAnalyzingAddress = address; currentAnalyzingElement = $element; currentAnalyzingBadge = $badge; console.log('State set:', { isAnalyzing: isAnalyzing, currentAnalyzingAddress: currentAnalyzingAddress, elementFound: $element.length > 0, badgeFound: $badge.length > 0 }); // Thêm highlight persistent cho element MỚI này $element.addClass('highlight-border-persistent'); // Thay đổi badge thành "Đang phân tích..." và giữ hiển thị if ($badge.length > 0) { $badge.text('Đang phân tích...').addClass('analyzing'); // Giữ badge hiển thị và ở đúng vị trí $badge.data('analyzing', true); $badge.data('hovering', true); // Prevent auto-hide console.log('Badge set to analyzing state'); // Đảm bảo badge hiển thị ở đúng vị trí (vì dùng position: fixed) showPhanTichBadgeForParent($element); } // Tạo panel nếu chưa có - fixed position append vào body if ($('#phanTichPanel').length === 0) { const panelHTML = `
    Phân tích điều luật
    Đang phân tích...

    Đang phân tích...

    `; // Append vào body (fixed position không cần container cụ thể) $('body').append(panelHTML); // Detect width từ rightdocinfo và áp dụng cho panel updatePanelDimensions(); // Trigger show và set flag setTimeout(() => { $('#phanTichPanel').addClass('show'); isPanelOpen = true; console.log('✅ Panel opened (fixed position), isPanelOpen = true'); }, 10); } else { $('#phanTichPanelBody').html(`
    Đang phân tích...

    Đang phân tích...

    `); // Update dimensions khi re-open updatePanelDimensions(); $('#phanTichPanel').addClass('show'); isPanelOpen = true; console.log('✅ Panel re-opened (fixed position), isPanelOpen = true'); } // Bind nút đóng và ESC $(document).off('click.closePhanTich').on('click.closePhanTich', '.close-phan-tich', function() { closePhanTichPanel(); }); $(document).off('keyup.closePhanTich').on('keyup.closePhanTich', function(e) { if (e.key === 'Escape') closePhanTichPanel(); }); // Bind nút refresh - phân tích lại $(document).off('click.refreshPhanTich').on('click.refreshPhanTich', '.btn-refresh-phan-tich', function(e) { e.preventDefault(); e.stopPropagation(); const $btn = $(this); const $icon = $btn.find('i'); // Disable button và thêm animation $btn.prop('disabled', true); $icon.addClass('fa-spin'); console.log('🔄 Refresh: Phân tích lại address:', address); // Show loading trong panel $('#phanTichPanelBody').html(`
    Đang phân tích lại...

    Đang xóa cache và phân tích lại...

    `); // Gọi API xóa cache trước deletePhanTichCache(address, vbID, function(deleteSuccess) { if (deleteSuccess) { console.log('✅ Cache deleted, now re-analyzing...'); // Sau khi xóa cache, gọi lại API phân tích callPhanTichAPI(address, vbID, function() { // Enable lại button $btn.prop('disabled', false); $icon.removeClass('fa-spin'); }); } else { console.error('❌ Failed to delete cache'); $('#phanTichPanelBody').html(` `); $btn.prop('disabled', false); $icon.removeClass('fa-spin'); } }); }); // Gọi API phân tích (dùng function helper) callPhanTichAPI(address, vbID); } // Helper: Gọi API phân tích (tách riêng để dùng lại) function callPhanTichAPI(address, vbID, callback) { const randomServer = Math.floor(Math.random() * 10) + 1; $.ajax({ url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/phan.tich.dieu.luat.php', type: 'POST', contentType: 'application/json', timeout: 300000, // 5 phút data: JSON.stringify({ address: address, vb_id: vbID }), success: function(response) { console.log('Analysis complete for:', address, response); // Reset badge về trạng thái bình thường (nhưng vẫn hiển thị) if (currentAnalyzingBadge) { currentAnalyzingBadge.text('Phân tích').removeClass('analyzing'); currentAnalyzingBadge.data('analyzing', false); console.log('Badge reset to normal state'); } // Reset state analyzing để có thể phân tích element khác isAnalyzing = false; console.log('State reset: isAnalyzing = false, can analyze other elements now'); if (response.ok) { // Render kết quả phân tích let html = ''; html += '
    '; html += '
    ' + escapeHtml(response.ten_van_ban) + '
    '; if (response.so_hieu) { html += 'Số hiệu: ' + escapeHtml(response.so_hieu) + '
    '; } html += 'Điều khoản: ' + escapeHtml(response.address) + ''; if (response.from_cache) { html += ' Cache'; } html += '
    '; html += '
    ' + markdownToHtml(response.phan_tich) + '
    '; if (response.usage) { html += '
    '; html += 'Thống kê: '; html += 'Input tokens: ' + (response.usage.promptTokenCount || 0) + ', '; html += 'Output tokens: ' + (response.usage.candidatesTokenCount || 0); html += '
    '; } $('#phanTichPanelBody').html(html); } else { $('#phanTichPanelBody').html(` `); } if (callback) callback(); }, error: function(xhr, status, error) { console.error('Analysis error:', error); // Reset badge về trạng thái bình thường if (currentAnalyzingBadge) { currentAnalyzingBadge.text('Phân tích').removeClass('analyzing'); currentAnalyzingBadge.data('analyzing', false); } // Reset state analyzing isAnalyzing = false; let errorMsg = error; if (xhr.responseJSON && xhr.responseJSON.error) { errorMsg = xhr.responseJSON.error; } $('#phanTichPanelBody').html(` `); if (callback) callback(); } }); } // Helper: Xóa cache phân tích function deletePhanTichCache(address, vbID, callback) { const randomServer = Math.floor(Math.random() * 10) + 1; $.ajax({ url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/delete.phan.tich.cache.php', type: 'POST', contentType: 'application/json', timeout: 10000, data: JSON.stringify({ address: address, vb_id: vbID }), success: function(response) { console.log('Delete cache response:', response); if (callback) callback(response.ok || false); }, error: function(xhr, status, error) { console.error('Delete cache error:', error); if (callback) callback(false); } }); } // Helper: Lấy tên hiển thị của element từ address function getElementDisplayName(address) { if (!address) return 'nội dung'; const $element = $('[address="' + address + '"]'); if ($element.length === 0) return address; // Parse address: vd "dieu_3_khoan_29" -> "Khoản 29 Điều 3" // Address format: lớn đến nhỏ (phan > chuong > muc > dieu > khoan > diem) const parts = address.split('_'); const displayParts = []; for (let i = 0; i < parts.length; i += 2) { if (i + 1 < parts.length) { const type = getParentTypeName(parts[i]); const num = parts[i + 1]; displayParts.push(type + ' ' + num); } } // Reverse để hiển thị từ nhỏ đến lớn: "Khoản 29 Điều 3" (thay vì "Điều 3 Khoản 29") return displayParts.reverse().join(' '); } function openPhanTichModal(address, vbID) { // Tạo modal nếu chưa có if ($('#modalPhanTich').length === 0) { const modalHTML = ` `; $('body').append(modalHTML); } // Reset và hiển thị modal với loading $('#modalPhanTichBody').html(`
    Đang phân tích...

    Đang phân tích...

    `); $('#modalPhanTich').modal('show'); // AJAX request const randomServer = Math.floor(Math.random() * 10) + 1; $.ajax({ url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/phan.tich.dieu.luat.php', type: 'POST', contentType: 'application/json', data: JSON.stringify({ address: address, vb_id: vbID }), success: function(response) { if (response.ok) { // Render kết quả phân tích let html = ''; // Header thông tin văn bản html += '
    '; html += '
    ' + escapeHtml(response.ten_van_ban) + '
    '; if (response.so_hieu) { html += 'Số hiệu: ' + escapeHtml(response.so_hieu) + '
    '; } html += 'Điều khoản: ' + escapeHtml(response.address) + ''; html += '
    '; // Nội dung phân tích (Markdown -> HTML) html += '
    '; html += markdownToHtml(response.phan_tich); html += '
    '; // Thông tin usage (nếu có) if (response.usage) { html += '
    '; html += 'Thống kê: '; html += 'Input tokens: ' + (response.usage.promptTokenCount || 0) + ', '; html += 'Output tokens: ' + (response.usage.candidatesTokenCount || 0); html += '
    '; } $('#modalPhanTichBody').html(html); } else { $('#modalPhanTichBody').html(` `); } }, error: function(xhr, status, error) { let errorMsg = error; if (xhr.responseJSON && xhr.responseJSON.error) { errorMsg = xhr.responseJSON.error; } $('#modalPhanTichBody').html(` `); } }); } // Helpers: show/hide badge cho parent element (dieu, khoan,...) với position: fixed function showPhanTichBadgeForParent($parent) { // Lấy badge CỦA CHÍNH parent này (match data-for với address của parent) const parentAddress = $parent.attr('address'); const $badge = $parent.find('.badge-phan-tich-container[data-for="' + parentAddress + '"]').first(); if ($badge.length === 0) { console.warn('No badge found for parent:', parentAddress); return; } // Ẩn TẤT CẢ các badge khác để tránh overlap $('.badge-phan-tich-container').not($badge).each(function() { const $otherBadge = $(this); // Chỉ ẩn badge KHÔNG đang analyzing if (!$otherBadge.data('analyzing')) { $otherBadge.css({display: 'none'}); } }); // Show badge tạm để tính width $badge.css({display: 'inline-block', opacity: 0, visibility: 'hidden'}); const badgeWidth = $badge.outerWidth(); // Tính toán vị trí fixed dựa trên offset của parent const offset = $parent.offset(); const scrollTop = $(window).scrollTop(); const scrollLeft = $(window).scrollLeft(); // Position badge top-right của parent và show $badge.css({ display: 'inline-block', visibility: 'visible', opacity: 1, top: (offset.top - scrollTop) + 'px', left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 5) + 'px' // -5px padding }); console.log('Showing badge for:', parentAddress, 'at position:', $badge.css('top'), $badge.css('left')); $parent.addClass('highlight-border'); } function hidePhanTichBadgeForParent($parent) { const $badge = $parent.find('.badge-phan-tich-container').first(); if ($badge.length === 0) return; $badge.css({display: 'none', opacity: 0}); $parent.removeClass('highlight-border'); } // Biến lưu element đang hover let currentHoveredElement = null; let hoverDebounceTimer = null; // Dùng mousemove để track chính xác element nào đang được hover $(document).on('mousemove', '#tab_noi_dung_vb', function(e) { // Tìm element gần nhất (phan, chuong, muc, dieu, khoan, diem) tại vị trí chuột const $target = $(e.target).closest('phan, chuong, muc, tieumuc, dieu, khoan, diem'); if ($target.length === 0) { // Không hover vào element nào return; } const address = $target.attr('address'); // Nếu đang hover vào cùng element → skip if (currentHoveredElement && currentHoveredElement[0] === $target[0]) { return; } // Clear debounce timer cũ if (hoverDebounceTimer) { clearTimeout(hoverDebounceTimer); } // Debounce để tránh trigger quá nhiều hoverDebounceTimer = setTimeout(function() { // Element thay đổi console.log('Hover changed to:', address); // Set flag hovering cho element mới $target.data('hovering', true); // Cancel timeout nếu có const timeoutId = $target.data('hideTimeout'); if (timeoutId) { clearTimeout(timeoutId); } // Ẩn badge của TẤT CẢ elements khác $('#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem') .not($target) .each(function() { const $el = $(this); // Chỉ xóa highlight-border, KHÔNG xóa highlight-border-persistent $el.removeClass('highlight-border'); // Ẩn badge nếu KHÔNG đang analyzing const $badge = $el.find('.badge-phan-tich-container'); if ($badge.length && !$badge.data('analyzing')) { $badge.css({display: 'none'}); } }); // Attach badge nếu chưa có if (address && $target.find('.badge-phan-tich-container[data-for="' + address + '"]').length === 0) { const parentType = getParentTypeName($target.prop('tagName').toLowerCase()); const $badge = $('Phân tích'); console.log('Creating badge for address:', address, 'parentType:', parentType); $target.append($badge); $target.addClass('has-phan-tich-badge'); } // Show badge cho element này if ($target.find('.badge-phan-tich-container').length > 0) { showPhanTichBadgeForParent($target); } // Update current hovered element currentHoveredElement = $target; }, 50); // Debounce 50ms }); // Event delegation cho hover ra khỏi #tab_noi_dung_vb $(document).on('mouseleave', '#tab_noi_dung_vb', function(e) { // Clear current hovered element currentHoveredElement = null; // Ẩn tất cả badge không đang analyzing sau một khoảng thời gian setTimeout(function() { if (currentHoveredElement === null) { // Chỉ ẩn nếu thực sự không hover vào element nào $('#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem') .each(function() { const $el = $(this); const $badge = $el.find('.badge-phan-tich-container'); if ($badge.length && !$badge.data('analyzing')) { $badge.css({display: 'none'}); } }); console.log('Mouse left tab_noi_dung_vb, hiding all badges'); } }, 300); }); // Event delegation cho hover ra khỏi parent (giữ lại cho badge behavior) $(document).on('mouseleave', '#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem', function(e) { const $parent = $(this); const parentAddress = $parent.attr('address'); const $badge = $parent.find('.badge-phan-tich-container[data-for="' + parentAddress + '"]').first(); // Set flag parent not hovering $parent.data('hovering', false); // Nếu badge đang analyzing thì KHÔNG ẩn, GIỮ hiển thị if ($badge.length > 0 && $badge.data('analyzing')) { console.log('Badge is analyzing, keep visible'); return; } // Delay để có thời gian di chuột vào badge const timeoutId = setTimeout(() => { // Chỉ ẩn nếu cả parent và badge đều không hover và không analyzing if ($badge.length > 0 && !$parent.data('hovering') && !$badge.data('hovering') && !$badge.data('analyzing')) { hidePhanTichBadgeForParent($parent); } }, 300); // Tăng lên 300ms $parent.data('hideTimeout', timeoutId); }); // Hover vào badge → giữ hiển thị $(document).on('mouseenter', '.badge-phan-tich-container', function(e) { e.stopPropagation(); const $badge = $(this); const $parent = $badge.parent(); $badge.data('hovering', true); // Cancel timeout của parent const timeoutId = $parent.data('hideTimeout'); if (timeoutId) { clearTimeout(timeoutId); } }); // Hover ra khỏi badge → ẩn nếu không hover parent $(document).on('mouseleave', '.badge-phan-tich-container', function(e) { const $badge = $(this); $badge.data('hovering', false); const $parent = $badge.parent(); // Nếu badge đang analyzing thì KHÔNG ẩn, GIỮ hiển thị if ($badge.data('analyzing') || $badge.hasClass('analyzing')) { console.log('Badge is analyzing on mouseleave, keep visible'); return; } setTimeout(() => { // Chỉ ẩn nếu cả parent và badge đều không hover và không analyzing if (!$parent.data('hovering') && !$badge.data('hovering') && !$badge.data('analyzing') && !$badge.hasClass('analyzing')) { hidePhanTichBadgeForParent($parent); } }, 300); }); // Event delegation cho hover vào badge → hiện tooltip $(document).on('mouseenter', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function() { const $badge = $(this); const parentType = $badge.attr('data-parent-type') || 'Nội dung'; if ($badge.find('.badge-tooltip').length === 0) { const $tooltip = $('Phân tích chi tiết nội dung ' + parentType + ' này'); $badge.append($tooltip); setTimeout(() => $tooltip.addClass('show'), 10); } }); // Event delegation cho hover ra khỏi badge → ẩn tooltip $(document).on('mouseleave', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function() { const $tooltip = $(this).find('.badge-tooltip'); if ($tooltip.length > 0) { $tooltip.removeClass('show'); setTimeout(() => $tooltip.remove(), 300); } }); // Event delegation cho click badge → mở panel $(document).on('click', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function(e) { e.preventDefault(); e.stopPropagation(); const $badge = $(this); console.log('Badge clicked! Element:', $badge[0]); console.log('Badge parent:', $badge.parent().prop('tagName'), $badge.parent().attr('address')); console.log('Badge data-for:', $badge.attr('data-for')); console.log('Badge data-parent-type:', $badge.attr('data-parent-type')); // Nếu badge đang analyzing thì không cho click if ($badge.hasClass('analyzing') || $badge.data('analyzing')) { console.log('Badge is analyzing, click ignored'); return; } // Lấy address từ data-for attribute const address = $badge.attr('data-for'); console.log('Will analyze address:', address, 'vbID:', vbID); if (address && vbID) { openPhanTichPanel(address, vbID); } else { console.error('Missing address or vbID', {address, vbID}); showWarningModal('Không tìm thấy địa chỉ điều luật hoặc ID văn bản!'); } }); // Ẩn badge khi click vào CTTD $(document).on('click', 'cttd.chuthichtudong span, dctk span, dctd span', function(e) { console.log('CTTD clicked'); // Ẩn TẤT CẢ badge KHÔNG đang analyzing $('.badge-phan-tich-container').each(function() { const $badge = $(this); if (!$badge.data('analyzing') && !$badge.hasClass('analyzing')) { $badge.css({display: 'none'}); console.log('Hiding badge:', $badge.attr('data-for')); } }); }); // Update badge position khi scroll hoặc resize (vì dùng position: fixed) function updateBadgePositions() { $('.badge-phan-tich-container:visible').each(function() { const $badge = $(this); const $parent = $badge.parent(); // Cập nhật position nếu parent đang hover HOẶC badge đang analyzing if ($parent.length && ($parent.is(':hover') || $badge.data('analyzing'))) { // Re-calculate position const offset = $parent.offset(); const scrollTop = $(window).scrollTop(); const scrollLeft = $(window).scrollLeft(); const badgeWidth = $badge.outerWidth(); $badge.css({ top: (offset.top - scrollTop) + 'px', left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 5) + 'px' }); } }); } $(window).on('scroll', updateBadgePositions); $(window).on('resize', updateBadgePositions); } });