BỘ KẾ HOẠCH VÀ ĐẦU TƯ -------
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc ---------------
Số: 6585/BKHĐT-TH V/v tình hình thực hiện Nghị quyết số 01/NQ-CP và tình hình KTXH tháng 8 và 8 tháng năm 2023
Hà Nội, ngày 15 tháng 8 năm 2023
Kính gửi:
- Các bộ, cơ quan ngang bộ, cơ quan thuộc Chính phủ; - UBND các tỉnh, thành phố trực thuộc Trung ương.
Căn cứ Nghị quyết số 01/NQ-CP ngày 06/01/2023 về nhiệm vụ, giải pháp chủ yếu thực hiện Kế hoạch phát triển kinh tế - xã hội và Dự toán ngân sách nhà nước năm 2023, để chuẩn bị tài liệu báo cáo Chính phủ tại phiên họp Chính phủ thường kỳ tháng 8 năm 2023, Bộ Kế hoạch và Đầu tư đề nghị các bộ, cơ quan ngang bộ, cơ quan thuộc Chính phủ và Ủy ban nhân dân các tỉnh, thành phố trực thuộc Trung ương thực hiện các nhiệm vụ dưới đây:
1. Về triển khai thực hiện Nghị quyết số 01/NQ-CP ngày 06/01/2023 của Chính phủ.
Các bộ, cơ quan trung ương và địa phương đánh giá kết quả chỉ đạo, điều hành triển khai thực hiện Nghị quyết số 01/NQ-CP và tiến độ thực hiện các nhiệm vụ được phân công chủ trì.
2. Về tình hình kinh tế - xã hội tháng 8 và 8 tháng năm 2023
Các bộ, cơ quan trung ương và địa phương báo cáo tình hình phát triển các ngành, lĩnh vực và tình hình kinh tế - xã hội trong tháng 8 và 8 tháng năm 2023, làm rõ kết quả đạt được, tồn tại, hạn chế, diễn biến mới phát sinh trong tháng 8 và đề xuất, kiến nghị giải pháp cần triển khai thực hiện các tháng còn lại trong năm. Trong đó, lưu ý thực hiện một số nội dung sau đây:
- Báo cáo tình hình, kết quả thực hiện một số nhiệm vụ, giải pháp chủ yếu cải thiện môi trường kinh doanh, nâng cao năng lực cạnh tranh quốc gia như sau: (i) tình hình và kết quả triển khai các mục tiêu, nhiệm vụ, giải pháp về cải thiện môi trường kinh doanh, nâng cao năng lực cạnh tranh quốc gia; (ii) những thuận lợi, vướng mắc, khó khăn trong quá trình triển khai thực hiện; (iii) các đề xuất, kiến nghị liên quan.
- Đánh giá tình hình sản xuất kinh doanh (bao gồm sản xuất các sản phẩm chủ yếu) và phát triển các ngành, lĩnh vực trong tháng 8 và 8 tháng năm 2023, trong đó: (i) đánh giá kết quả đạt được, những hạn chế, khó khăn trong tháng 8 và 8 tháng năm 2023, so sánh với cùng kỳ các năm trước; (ii) tình hình thực hiện các mục tiêu, chỉ tiêu năm 2023; (iii) dự báo tình hình ngành, lĩnh vực phụ trách, từ đó đề xuất, kiến nghị các giải pháp cần thực hiện.
- Ngân hàng Nhà nước Việt Nam tập trung phân tích, dự báo: diễn biến điều hành chính sách tiền tệ của FED, các ngân hàng trung ương và giải pháp ứng phó trong nước; việc điều hành giảm mặt bằng lãi suất huy động và cho vay; các giải pháp tháo gỡ khó khăn, tăng khả năng tiếp cận tín dụng cho doanh nghiệp; việc bảo đảm ổn định của hệ thống ngân hàng, xử lý các TCTD yếu kém; tình hình thực hiện công tác tín dụng và triển khai chính sách cơ cấu lại thời hạn trả nợ và giữ nguyên nhóm nợ được quy định tại Thông tư số 02/2023/TT-NHNN.
- Bộ Tài chính phân tích, đánh giá: (i) tình hình thu - chi ngân sách nhà nước; (ii) việc xây dựng, triển khai chính sách thuế, phí,... hỗ trợ doanh nghiệp, người dân và nền kinh tế; (iii) việc phát hành, đáo hạn và trả nợ trái phiếu doanh nghiệp trong tháng 8 và 8 tháng, các tác động của Nghị định số 08/2023/NĐ-CP đến thị trường trái phiếu, chứng khoán sau khi được ban hành; (iv) việc phối hợp với Bộ Y tế triển khai đấu thầu mua sắm thiết bị vật tư y tế tập trung.
- Bộ Công Thương phân tích, đánh giá: việc quản lý, phân phối bán lẻ xăng dầu trong nước; tình hình hoạt động của các nhà máy điện, đảm bảo nguồn điện trong nước; tình hình xuất khẩu, nhập khẩu hàng hóa của Việt Nam sang các thị trường trọng điểm, thị trường mới; tình hình đàm phán, ký kết các hiệp định thương mại; tình hình sản xuất công nghiệp (nhất là ngành công nghiệp chế biến, chế tạo), tiêu dùng trong nước; đề xuất các giải pháp ứng phó với các tình huống xảy ra; tình hình triển khai quy hoạch điện VIII.
- Bộ Giao thông vận tải phân tích, đánh giá, dự báo: (i) tình hình thực hiện các dự án giao thông trọng điểm; (ii) việc bảo đảm hoạt động của hệ thống đăng kiểm trên cả nước; (iii) quản lý hoạt động vận tải, nhất là vận tải đường bộ và hàng không, đáp ứng nhu cầu du lịch của người dân, bảo đảm an toàn giao thông; (iv) đánh giá tình hình nguồn cung, giá vật liệu xây dựng và tác động đến việc triển khai kế hoạch đầu tư công, đặc biệt đối với các dự án quan trọng quốc gia; (v) tình hình sạt lở, ngập lụt trên các tuyến cao tốc, quốc lộ và các trục giao thông chính.
- Bộ Xây dựng phân tích, đánh giá, dự báo tình hình thị trường bất động sản, trong đó đánh giá kỹ tình hình khó khăn của các doanh nghiệp bất động sản; tình hình triển khai chính sách tháo gỡ khó khăn cho thị trường theo Nghị quyết số 33/NQ-CP ngày 11/02/2023 của Chính phủ; triển khai các chính sách phát triển nhà ở xã hội; tình hình xử lý, tháo gỡ khó khăn liên quan đến quy định phòng cháy chữa cháy.
- Bộ Nông nghiệp và Phát triển nông thôn báo cáo tình hình sản xuất nông nghiệp và an ninh lương thực trong nước; công tác phòng chống mưa, bão, lũ, hạn hán, bảo đảm nguồn nước cho sản xuất nông nghiệp; tình hình giá cả, nguồn cung-cầu các ngành để có các giải pháp ứng phó, hỗ trợ kịp thời; diễn biến thị trường gạo khu vực, thế giới, tình hình sản xuất, sản lượng lúa gạo trong năm để cân đối phục vụ nhu cầu tiêu dùng trong nước và xuất khẩu.
- Bộ Tài nguyên và Môi trường báo cáo tình hình sạt lở đất, bờ sông, bờ biển và lũ quét; đề xuất các giải pháp ứng phó; tình hình thực hiện kết luận của Thường trực Chính phủ tại văn bản số 225/TB-VPCP ngày 15/6/2023 về những nhiệm vụ, giải pháp lớn ổn định kinh tế vĩ mô, kiểm soát lạm phát, thúc đẩy tăng trưởng và bảo đảm các cân đối lớn của nền kinh tế trong tình hình hiện nay.
- Bộ Y tế báo cáo tình hình triển khai đấu thầu, mua sắm thuốc, vật tư, trang thiết bị y tế phục vụ khám, chữa bệnh bảo đảm nguồn cung trong nước; công tác phòng, chống dịch bệnh, chăm sóc sức khỏe nhân dân; việc tháo gỡ vướng mắc, bảo đảm cung ứng vaccine cho chương trình tiêm chủng mở rộng.
- Bộ Giáo dục và Đào tạo báo cáo tình hình công tác tuyển sinh học sinh cấp trung học phổ thông (THPT) và tuyển sinh đại học; chuẩn bị cho năm học mới.
- Bộ Lao động - Thương binh và Xã hội báo cáo tình hình việc làm, thị trường lao động, nhất là tại các địa bàn công nghiệp trọng điểm, nhóm ngành thâm dụng lao động...; các giải pháp kết nối cung-cầu, hỗ trợ người lao động tìm kiếm việc làm, các chính sách an sinh xã hội, bảo trợ xã hội.
- Bộ Văn hóa, Thể thao và Du lịch báo cáo tình hình triển khai các hoạt động xúc tiến du lịch, thu hút khách du lịch trong nước, quốc tế; việc quản lý giá dịch vụ du lịch tại các địa phương; tiến độ xây dựng chương trình mục tiêu quốc gia về văn hóa.
- Bộ Công an báo cáo việc triển khai tháo gỡ vướng mắc về quy định phòng cháy, chữa cháy theo Công điện số 220/QĐ-TTg ngày 5/4/2023 của Thủ tướng Chính phủ, bảo đảm an ninh chính trị, trật tự xã hội, phòng chống tội phạm, lừa đảo...; tình hình triển khai Luật Xuất cảnh, nhập cảnh của công dân Việt Nam và Luật Nhập cảnh, xuất cảnh, quá cảnh, cư trú của người nước ngoài tại Việt Nam sửa đổi năm 2023.
- Bộ Ngoại giao phân tích, dự báo tình hình, chính sách của các nước và tác động đến Việt Nam; chính sách đối ngoại về kinh tế, chính trị và giải pháp ứng phó phù hợp; công tác bảo hộ, cứu trợ công dân.
3. Tổ chức thực hiện
Đề nghị các bộ, ngành và địa phương gửi Bộ Kế hoạch và Đầu tư báo cáo bằng văn bản và qua thư điện tửTrân trọng cảm ơn sự hợp tác của Quý cơ quan./.
Nơi nhận: - Như trên; - Văn phòng Chính phủ; - Bộ KH&ĐT: Vụ KTĐPLT (để tổng hợp báo cáo các địa phương); Trung tâm Công nghệ thông tin và chuyển đổi số (để đăng tải lên hệ thống thông tin); - Lưu: VT, Vụ TH.
KT. BỘ TRƯỞNG THỨ TRƯỞNG Trần Quốc Phương
lồng nhau (bên trong) hay không
const memberID = 0;
const vbID = '10511cd04adc50de6f83d5f696911cca';
// 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, '');
// 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 = `
Đ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(`
Lỗi! Không thể xóa cache. Vui lòng thử lại.
`);
$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(`
Lỗi! ${escapeHtml(response.error || 'Không thể phân tích điều luật.')}
Vui lòng thử lại sau.
`);
}
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(`
Lỗi! Không thể kết nối đến server phân tích.
Chi tiết: ${escapeHtml(errorMsg)}
`);
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 = `
Đang phân tích...
Đang phân tích...
`;
$('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(`
Lỗi! ${escapeHtml(response.error || 'Không thể phân tích điều luật.')}
Vui lòng thử lại sau.
`);
}
},
error: function(xhr, status, error) {
let errorMsg = error;
if (xhr.responseJSON && xhr.responseJSON.error) {
errorMsg = xhr.responseJSON.error;
}
$('#modalPhanTichBody').html(`
Lỗi! Không thể kết nối đến server phân tích.
Chi tiết: ${escapeHtml(errorMsg)}
`);
}
});
}
// 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);
}
});
Tra cứu thuật ngữ với từ hoặc cụm từ đã chọn?
×
Công văn 6585/BKHĐT-TH về tình hình thực hiện Nghị quyết 01/NQ-CP và tình hình kinh tế xã hội tháng 8 và 8 tháng năm 2023 do Bộ Kế hoạch và Đầu tư ban hành