ldhpgemrdhs83600 1.250923.11035 → 1.250926.11416
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +7 -7
- package/package.json +1 -1
package/index.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! [dist-pg-services.js]; ===WEBPACK BUILD: 1.25.
|
1
|
+
/*! [dist-pg-services.js]; ===WEBPACK BUILD: 1.25.0926.1416=== */
|
2
2
|
(() => {
|
3
3
|
var e = {
|
4
4
|
4466: (e, n, t) => {
|
@@ -2275,10 +2275,10 @@
|
|
2275
2275
|
},
|
2276
2276
|
logError: u,
|
2277
2277
|
logStarted: function() {
|
2278
|
-
return O("🚀- ".concat(p, "; 🅥:").concat("1.25.
|
2278
|
+
return O("🚀- ".concat(p, "; 🅥:").concat("1.25.0926.1416"))
|
2279
2279
|
},
|
2280
2280
|
logEnded: function() {
|
2281
|
-
return O("🔜 - ".concat(p, "; 🅥:").concat("1.25.
|
2281
|
+
return O("🔜 - ".concat(p, "; 🅥:").concat("1.25.0926.1416", " 🔚"))
|
2282
2282
|
},
|
2283
2283
|
DirectoryPathLogs: c,
|
2284
2284
|
logInfoObject: function(e) {
|
@@ -4472,7 +4472,7 @@
|
|
4472
4472
|
name: "badt_dhs.insertTreatmentProcess",
|
4473
4473
|
para: ["input_json"],
|
4474
4474
|
returns: "JSONB",
|
4475
|
-
codesql: "\n\nCREATE OR REPLACE FUNCTION badt_dhs.insertTreatmentProcess(input_json JSONB)\nRETURNS JSONB AS $$\nDECLARE\n-- Lastest commit: author:onghaup; date: 2025-09-18 13:41:06\n-- ===============================================================\n-- Thực hiện: NGUYỄN TRIỀU VƯƠNG - 2025-06-19\n-- Hàm: badt_dhs.insertTreatmentProcess_Thuoc_CLS(input_json JSONB)\n-- Mô tả:\n-- - input_json: nội dung file json: quá trình điều trị có thuốc và cls\n-- Sử dụng:\n-- SELECT badt_dhs.insertTreatmentProcess(input_json JSONB); --Insert vào current.qtdieutri từ DHS\n-- Nếu có thuốc gọi hàm insert thuốc (inserttpprescription)\n-- Nếu có cls gọi hàm inser cls(insertcutpparaclinrequest)\n-- ===============================================================\n-- \n--noitru\n-- Phụ: gom chuỗi bằng dấu ;\n-- Biến dùng để bắt lỗi\n-- Biến kiểm tra ICD \n--[ÔNG TRIỆU HẬU: 2025-09-18] Kiểm tra diễn biến rỗng, ảnh hưởng XML08\n--[ÔNG TRIỆU HẬU: 2025-09-10] Kiểm tra trạng thái ra viện\n-- Kiểm tra \n--[ÔNG TRIỆU HẬU: 2025-09-10] Kiểm tra tồn tại ICD\n--[ÔNG TRIỆU HẬU: 2025-09-13] Kiểm tra tồn tại ICD YHCT\n--[ÔNG TRIỆU HẬU: 2025-09-10] Kiểm tra tồn tại macls\n-- Xử lý chẩn đoán\n-- [ÔNG TRIỆU HẬU: 2025-08-11] Ưu tiên lấy DiagnosisICDName, nếu không có thì lấy DiagnosisDesc\n-- dt_tenyhct := Diagnosis->>'DiagnosisDesc';\n-- [ÔNG TRIỆU HẬU - 2025-08-14]: Đổi lại lấy theo DiagnosisDesc \n-- [ÔNG TRIỆU HẬU: 2025-08-11] Ưu tiên lấy DiagnosisICDName, nếu không có thì lấy DiagnosisDesc\n-- dt_kqcdoan := Diagnosis->>'DiagnosisDesc';\n--Chẩn đoán phụ \n-- [ÔNG TRIỆU HẬU: 2025-08-11] Ưu tiên lấy DiagnosisICDName, nếu không có thì lấy DiagnosisDesc\n-- dt_kqcdoanp_arr := array_append(dt_kqcdoanp_arr, Diagnosis->>'DiagnosisDesc');\n-- Kiểm tra các cột bắt buộc\n-- Lấy tháng/năm kế toán\n-- Lấy thông tin nội trú\n-- Thực hiện insert/update\n--Update bnnoitru\n--Update ttcon (mã thẻ 2)\n-- Gọi hàm thêm thuốc nếu có\n-- Gọi hàm thêm CLS nếu có\n TPCode TEXT; --Mã tờ điều trị: iddienbien\n PatientCode TEXT;--Mã bệnh nhân: mabn\n AdmissionCode TEXT;--Mã tiếp nhận: makb\n MedicalRecordNo TEXT;--Mã bệnh án\n TPDate TIMESTAMP; --Ngày tờ điều trị: ngaygio\n TreatmentDoctorCode TEXT;--Mã số bs chỉ định điều trị: manv\n DepartmentCode TEXT;--Mã khoa chỉ định điều trị:madv\n ParaClinicalResultCommand TEXT;\n VitalSignCommand TEXT; --Chỉ số sinh hiệu\n RiskOfFalling INT; --Té ngã: 1-Thấp, 2-Cao, 3-Trung bình\n TakeCare INT; --Chế độ chăm sóc: 1-Cấp 1, 2-Cấp 2, 3-Cấp 3\n FollowUpCommand TEXT;--Chăm sóc: chamsoc\n MethodOfTreatmentCommand TEXT;\n NutritionCommand TEXT;\n Infor TEXT; --Diễn biến: dienbien\n DiseaseName TEXT;\n IsNotChange BOOLEAN := FALSE;\n FileDocID TEXT;\n FilePath TEXT;\n SignStatus INT := 0;--Trạng thái\n Reason TEXT;--Lý do hủy\n DiagnosisDesc TEXT; --Chẩn đoán hiện đại: kqcdoan || ',' || kqcdoanp\n DiagnosisICDName TEXT; -- [ÔNG TRIỆU HẬU: 2025-08-11]: Đồng bộ dữ liệu ICD >> Theo HIS đề xuất, EMR có bổ sung 1 field DiagnosisICDName >> HIS lấy field này thay cho DiagnosisDesc như hiện tại\n DiagnosisTraditionalDesc TEXT;--Chẩn đoán YHCT: tenyhct\n DiagnosisOtherDesc TEXT;\n Prescriptions JSONB; --Thông tin thuốc\n ParaClinRequests JSONB; --Thông tin CLS\n Diagnosis JSONB; -- Thông tin chẩn đoán\n\n VitalSign JSONB; -- Dấu hiệu sinh tồn\n VSDate TIMESTAMP; --Ngày giờ ghi nhận dấu hiệu sinh tồn\n ExecutorCode TEXT; --Mã nhân viên thực hiện\n ExecutorName TEXT; --Tên nhân viên thực hiện\n\n Height NUMERIC; --: 120.0, Chiều cao của bệnh nhân (cm)\n Weight NUMERIC; --\": 40.0, Cân nặng của bệnh nhân (kg)\n BMI NUMERIC; --\": 27.8, Chỉ số khối cơ thể (BMI)\n BloodPressureSystolic INT; --\": 140.0, Huyết áp tâm thu (mmHg)\n BloodPressureDiastolic INT;--: 100.0, Huyết áp tâm trương (mmHg)\n BodyTemperature NUMERIC; --\": 37.0,Nhiệt độ cơ thể (°C)\n Pulse NUMERIC; --\": 59.0,Nhịp tim (lần/phút)\n BreathBeat NUMERIC; --\": 20.0, Nhịp thở (lần/phút)\n SpO2 NUMERIC; --\": 99.0, Độ bão hòa oxy trong máu (%)\n Para TEXT;\n I_RHType INT; --Loại Rh máu (1: Rh+, 2: Rh-)\n I_BloodType INT; --Nhóm máu (1: A, 2: B, 3: AB, 4: O, 5: Chưa xác định)\n\n nt_maphong TEXT := NULL;\n nt_sogiuong TEXT := NULL;\n nt_huyetap TEXT := NULL;\n\n thangnam TEXT;\n thangkt_S TEXT; -- thangkt, lấy cho đủ số liệu, toa thuốc mới lên module\n namkt_S TEXT; --namkt, lấy cho đủ số liệu, toa thuốc mới lên module\n\n dt_maicd TEXT := NULL;\n dt_kqcdoan TEXT := NULL;\n\n dt_mayhct TEXT := NULL;\n dt_tenyhct TEXT := NULL;\n \n record_exists BOOLEAN := FALSE;\n insert_success BOOLEAN := TRUE;\n \n dt_maicdp_arr TEXT[] := ARRAY[]::TEXT[];\n dt_kqcdoanp_arr TEXT[] := ARRAY[]::TEXT[];\n dt_maicdp TEXT := NULL;\n dt_kqcdoanp TEXT := NULL;\n \n v_err_context TEXT;\n v_err_msg TEXT;\n\n missing_icds TEXT[];\n BedNo TEXT := NULL;\n\nBEGIN\n TPCode := input_json->>'TPCode';\n PatientCode := input_json->>'PatientCode';\n AdmissionCode := input_json->>'AdmissionCode';\n MedicalRecordNo := input_json->>'MedicalRecordNo';\n TreatmentDoctorCode := input_json->>'TreatmentDoctorCode';\n Infor := input_json->>'Infor';\n BedNo := input_json->>'BedNo';\n\n IF COALESCE(Infor,'')='' THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('Diễn biến (Infor): Không thể rỗng. (Mabn: %L, Makb: %L, Maba: %L)', \n PatientCode, AdmissionCode, MedicalRecordNo)\n );\n END IF;\n\n IF NOT EXISTS ( SELECT 1 FROM current.bnnoitru\n WHERE mabn = PatientCode AND makb = AdmissionCode AND maba = MedicalRecordNo AND COALESCE(ravien,0) = 0\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('Mabn: %L, Makb: %L, Maba: %L không tồn tại trong HIS (phải còn đang điều trị)', \n PatientCode, AdmissionCode, MedicalRecordNo)\n );\n END IF;\n \n IF NOT EXISTS (\n SELECT 1 FROM current.dmnhanvien\n WHERE manv = TreatmentDoctorCode AND COALESCE(macc_hanhnghe_cv2348,'') != '' AND COALESCE(trangthai,'') = '1'\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', format('TreatmentDoctorCode: %s không tồn tại trong HIS (Điều kiện: Phải có CCHN và trạng thái đang làm việc.)', TreatmentDoctorCode));\n END IF;\n IF input_json ? 'Diagnosis' AND jsonb_array_length(input_json->'Diagnosis') > 0 THEN\n \n /* Gom tất cả ICD code (DiagnosisType=1) rồi kiểm tra một lần */\n WITH dx AS (\n SELECT DISTINCT\n (d->>'DiagnosisICDCode')::text AS icd_code\n FROM jsonb_array_elements(input_json->'Diagnosis') AS d\n WHERE COALESCE((d->>'DiagnosisType')::int, 0) = 1\n AND NULLIF(d->>'DiagnosisICDCode','') IS NOT NULL\n ),\n missing AS (\n SELECT dx.icd_code\n FROM dx\n LEFT JOIN current.dmicd m\n ON m.maicd = dx.icd_code AND COALESCE(m.xoa,0)=0\n WHERE m.maicd IS NULL\n )\n SELECT ARRAY_AGG(icd_code)\n INTO missing_icds\n FROM missing;\n\n IF missing_icds IS NOT NULL THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('ICD code (DiagnosisType=1) không tồn tại hoặc ngưng sử dụng trong current.dmicd: %L', missing_icds));\n END IF;\n\n END IF;\n\n IF input_json ? 'Diagnosis' AND jsonb_array_length(input_json->'Diagnosis') > 0 THEN\n \n /* Gom tất cả ICD code (DiagnosisType=1) rồi kiểm tra một lần */\n WITH dx AS (\n SELECT DISTINCT\n (d->>'DiagnosisICDCode')::text AS icd_code\n FROM jsonb_array_elements(input_json->'Diagnosis') AS d\n WHERE COALESCE((d->>'DiagnosisType')::int, 0) = 2\n AND NULLIF(d->>'DiagnosisICDCode','') IS NOT NULL\n ),\n missing AS (\n SELECT dx.icd_code\n FROM dx\n LEFT JOIN current.dmbyt_benhyhct m\n ON m.ma_yhct = dx.icd_code\n WHERE m.ma_yhct IS NULL\n )\n SELECT ARRAY_AGG(icd_code)\n INTO missing_icds\n FROM missing;\n\n IF missing_icds IS NOT NULL THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('ICD code (DiagnosisType=2) không tồn tại hoặc ngưng sử dụng trong current.dmbyt_benhyhct: %L', missing_icds));\n END IF;\n\n END IF;\n\n IF input_json ? 'ParaClinRequests' AND jsonb_array_length(input_json->'ParaClinRequests') > 0 THEN\n \n WITH dx AS (\n SELECT DISTINCT\n (d->>'MedSerCode')::text AS macls_code\n FROM jsonb_array_elements(input_json->'ParaClinRequests') AS d\n WHERE NULLIF(d->>'MedSerCode','') IS NOT NULL\n ),\n missing AS (\n SELECT dx.macls_code\n FROM dx\n LEFT JOIN current.dmcls m\n ON m.macls = dx.macls_code AND COALESCE(m.sudung,0)=1 AND COALESCE(m.tt37,0)=1\n WHERE m.macls IS NULL\n )\n SELECT ARRAY_AGG(macls_code)\n INTO missing_icds\n FROM missing;\n\n IF missing_icds IS NOT NULL THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('MedSerCode code không tồn tại hoặc ngưng sử dụng trong current.dmcls: %L', missing_icds));\n END IF;\n\n END IF;\n\n SELECT EXISTS (\n SELECT 1 FROM current.qtdieutri WHERE iddienbien = TPCode\n ) INTO record_exists;\n\n TPDate := (input_json->>'TPDate')::timestamptz;\n DepartmentCode := input_json->>'DepartmentCode';\n ParaClinicalResultCommand := input_json->>'ParaClinicalResultCommand';\n VitalSignCommand := input_json->>'VitalSignCommand';\n RiskOfFalling := input_json->>'RiskOfFalling';\n TakeCare := input_json->>'TakeCare';\n FollowUpCommand := input_json->>'FollowUpCommand';\n MethodOfTreatmentCommand := input_json->>'PatientCode';\n NutritionCommand := input_json->>'NutritionCommand';\n \n DiseaseName := input_json->>'DiseaseName';\n IsNotChange := (input_json->>'IsNotChange')::BOOLEAN;\n FileDocID := input_json->>'FileDocID';\n FilePath := input_json->>'FilePath';\n SignStatus := (input_json->>'SignStatus')::INT;\n Reason := input_json->>'Reason';\n DiagnosisDesc := input_json->>'DiagnosisDesc';\n DiagnosisICDName := input_json->>'DiagnosisICDName';\n DiagnosisTraditionalDesc := input_json->>'DiagnosisTraditionalDesc';\n DiagnosisOtherDesc := input_json->>'DiagnosisOtherDesc';\n\n Height := (input_json->'VitalSign'->>'Height')::numeric;\n Weight := (input_json->'VitalSign'->>'Weight')::numeric;\n BMI := (input_json->'VitalSign'->>'BMI')::numeric;\n BloodPressureSystolic := (input_json->'VitalSign'->>'BloodPressureSystolic')::numeric;\n BloodPressureDiastolic := (input_json->'VitalSign'->>'BloodPressureDiastolic')::numeric;\n BodyTemperature := (input_json->'VitalSign'->>'BodyTemperature')::numeric;\n Pulse := (input_json->'VitalSign'->>'Pulse')::numeric;\n BreathBeat := (input_json->'VitalSign'->>'BreathBeat')::numeric;\n SpO2 := (input_json->'VitalSign'->>'SpO2')::numeric;\n Para := (input_json->'VitalSign'->>'Para');\n I_RHType := (input_json->'VitalSign'->>'I_RHType')::numeric;\n I_BloodType := (input_json->'VitalSign'->>'I_BloodType')::numeric;\n\n nt_huyetap := BloodPressureSystolic || '/' || BloodPressureDiastolic;\n\n FOR Diagnosis IN SELECT value FROM jsonb_array_elements(COALESCE(input_json->'Diagnosis','[]')) AS value\n LOOP\n IF (Diagnosis->>'DiagnosisType')::INT = 2 THEN\n dt_mayhct := Diagnosis->>'DiagnosisICDCode';\n dt_tenyhct := COALESCE(\n Diagnosis->>'DiagnosisDesc',\n NULLIF(TRIM(Diagnosis->>'DiagnosisICDName'), '') \n );\n \n ELSE\n IF (Diagnosis->>'IsMain')::BOOLEAN THEN\n dt_maicd := Diagnosis->>'DiagnosisICDCode';\n dt_kqcdoan := COALESCE(\n Diagnosis->>'DiagnosisDesc',\n NULLIF(TRIM(Diagnosis->>'DiagnosisICDName'), '') \n );\n \n ELSE\n dt_maicdp_arr := array_append(dt_maicdp_arr, Diagnosis->>'DiagnosisICDCode');\n dt_kqcdoanp_arr := array_append(dt_kqcdoanp_arr, \n COALESCE(\n Diagnosis->>'DiagnosisDesc',\n NULLIF(TRIM(Diagnosis->>'DiagnosisICDName'), '') \n )\n );\t\t\t\t\n END IF;\n END IF;\n END LOOP;\n\t\n dt_maicdp := array_to_string(dt_maicdp_arr, ';'); \n dt_kqcdoanp := array_to_string(dt_kqcdoanp_arr, ';');\n \n IF NOT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_name = 'qtdieutri' AND column_name = 'api'\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', 'Bảng qtdieutri chưa có cột api');\n END IF;\n\n IF NOT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_name = 'chungtu' AND column_name = 'api'\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', 'Bảng chungtu chưa có cột api');\n END IF;\n\n IF NOT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_name = 'chidinhcls' AND column_name = 'api'\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', 'Bảng chidinhcls chưa có cột api');\n END IF;\n\n SELECT giatri INTO thangnam FROM current.system WHERE tents = 'thanglv';\n thangkt_S := SPLIT_PART(thangnam, '/', 1);\n namkt_S := SPLIT_PART(thangnam, '/', 2);\n\n SELECT maphong, sogiuong INTO nt_maphong, nt_sogiuong -- lấy cho đủ số liệu\n FROM current.bnnoitru\n WHERE mabn = PatientCode AND maba = MedicalRecordNo AND makb = AdmissionCode;\n\n\n BEGIN\n IF record_exists THEN\n UPDATE current.qtdieutri\n SET manv = TreatmentDoctorCode,\n ngaygio = TPDate,\n dienbien = Infor,\n maicd = dt_maicd,\n kqcdoan = dt_kqcdoan,\n maicdp = dt_maicdp,\n kqcdoanp = dt_kqcdoanp,\n madv = DepartmentCode,\n mayhct = dt_mayhct,\n tenyhct = dt_tenyhct,\n chamsoc = FollowUpCommand,\n maphong = nt_maphong,\n sogiuong = nt_sogiuong,\n ma_giuong = BedNo,\n api = 1\n WHERE iddienbien = TPCode AND mabn = PatientCode and maba = MedicalRecordNo AND makb = AdmissionCode;\n ELSE\n INSERT INTO current.qtdieutri(\n mabn, makb, maba, manv, ngaygio,\n dienbien, maicd, kqcdoan, maicdp, kqcdoanp,\n madv, iddienbien, mayhct, tenyhct, chamsoc, api, thangkt, namkt, maphong, sogiuong,\n ma_giuong\n )\n VALUES (\n PatientCode, AdmissionCode, MedicalRecordNo, TreatmentDoctorCode, TPDate,\n Infor, dt_maicd, dt_kqcdoan, dt_maicdp, dt_kqcdoanp,\n DepartmentCode, TPCode, dt_mayhct, dt_tenyhct, FollowUpCommand, 1, thangkt_S, namkt_S, nt_maphong, nt_sogiuong,\n BedNo\n );\n END IF;\n\n UPDATE current.bnnoitru\n SET manv = TreatmentDoctorCode,\n iddienbien = TPCode,\n ngaykcb = TPDate,\n dienbien = Infor,\n maicd = dt_maicd,\n kqcdoan = dt_kqcdoan,\n maicdp = dt_maicdp,\n kqcdoanp = dt_kqcdoanp,\n madv = DepartmentCode,\n mayhct = dt_mayhct,\n tenyhct = dt_tenyhct,\n chamsoc = FollowUpCommand,\n huyetap = nt_huyetap,\n nhiptho = BreathBeat,\n nhietdo = BodyTemperature,\n mach = Pulse,\n chieucao = Height/100.0,\n cannang = Weight,\n maphong = nt_maphong,\n sogiuong = nt_sogiuong\n WHERE mabn = PatientCode and maba = MedicalRecordNo AND makb = AdmissionCode;\n\n UPDATE current.ttcon\n SET manv = TreatmentDoctorCode,\n iddienbien = TPCode,\n maicd = dt_maicd,\n kqcdoan = dt_kqcdoan,\n maicdp = dt_maicdp,\n kqcdoanp = dt_kqcdoanp,\n mayhct = dt_mayhct,\n tenyhct = dt_tenyhct\n WHERE mabnme = PatientCode and mabame = MedicalRecordNo AND COALESCE(loaitt,0) = 1;\n\n IF jsonb_array_length(COALESCE(input_json->'Prescriptions', '[]'::jsonb)) > 0 THEN\n PERFORM badt_dhs.inserttpprescription(input_json);\n END IF;\n\n IF jsonb_array_length(COALESCE(input_json->'ParaClinRequests', '[]'::jsonb)) > 0 THEN\n PERFORM badt_dhs.insertcutpparaclinrequest(input_json);\n END IF;\n\n RETURN jsonb_build_object('status', 'success', 'message', '');\n\n EXCEPTION\n WHEN OTHERS THEN\n GET STACKED DIAGNOSTICS\n v_err_context = PG_EXCEPTION_CONTEXT,\n v_err_msg = MESSAGE_TEXT;\n\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', v_err_msg\n );\n END;\n\nEND;\n$$ LANGUAGE plpgsql;\n\n\n"
|
4475
|
+
codesql: "\n\nCREATE OR REPLACE FUNCTION badt_dhs.insertTreatmentProcess(input_json JSONB)\nRETURNS JSONB AS $$\nDECLARE\n-- Lastest commit: author:onghaup; date: 2025-09-26 10:32:27\n-- ===============================================================\n-- Thực hiện: NGUYỄN TRIỀU VƯƠNG - 2025-06-19\n-- Hàm: badt_dhs.insertTreatmentProcess_Thuoc_CLS(input_json JSONB)\n-- Mô tả:\n-- - input_json: nội dung file json: quá trình điều trị có thuốc và cls\n-- Sử dụng:\n-- SELECT badt_dhs.insertTreatmentProcess(input_json JSONB); --Insert vào current.qtdieutri từ DHS\n-- Nếu có thuốc gọi hàm insert thuốc (inserttpprescription)\n-- Nếu có cls gọi hàm inser cls(insertcutpparaclinrequest)\n-- ===============================================================\n-- \n--noitru\n-- Phụ: gom chuỗi bằng dấu ;\n-- Biến dùng để bắt lỗi\n-- Biến kiểm tra ICD \n--[ÔNG TRIỆU HẬU: 2025-09-26] Nếu ngày diễn biến (TPDate) lớn hơn ngày server thì chặn lại \n--  \n--[ÔNG TRIỆU HẬU: 2025-09-18] Kiểm tra diễn biến rỗng, ảnh hưởng XML08\n--[ÔNG TRIỆU HẬU: 2025-09-10] Kiểm tra trạng thái ra viện\n-- Kiểm tra \n--[ÔNG TRIỆU HẬU: 2025-09-10] Kiểm tra tồn tại ICD\n--[ÔNG TRIỆU HẬU: 2025-09-13] Kiểm tra tồn tại ICD YHCT\n--[ÔNG TRIỆU HẬU: 2025-09-10] Kiểm tra tồn tại macls\n-- Xử lý chẩn đoán\n-- [ÔNG TRIỆU HẬU: 2025-08-11] Ưu tiên lấy DiagnosisICDName, nếu không có thì lấy DiagnosisDesc\n-- dt_tenyhct := Diagnosis->>'DiagnosisDesc';\n-- [ÔNG TRIỆU HẬU - 2025-08-14]: Đổi lại lấy theo DiagnosisDesc \n-- [ÔNG TRIỆU HẬU: 2025-08-11] Ưu tiên lấy DiagnosisICDName, nếu không có thì lấy DiagnosisDesc\n-- dt_kqcdoan := Diagnosis->>'DiagnosisDesc';\n--Chẩn đoán phụ \n-- [ÔNG TRIỆU HẬU: 2025-08-11] Ưu tiên lấy DiagnosisICDName, nếu không có thì lấy DiagnosisDesc\n-- dt_kqcdoanp_arr := array_append(dt_kqcdoanp_arr, Diagnosis->>'DiagnosisDesc');\n-- Kiểm tra các cột bắt buộc\n-- Lấy tháng/năm kế toán\n-- Lấy thông tin nội trú\n-- Thực hiện insert/update\n--Update bnnoitru\n--Update ttcon (mã thẻ 2)\n-- Gọi hàm thêm thuốc nếu có\n-- Gọi hàm thêm CLS nếu có\n TPCode TEXT; --Mã tờ điều trị: iddienbien\n PatientCode TEXT;--Mã bệnh nhân: mabn\n AdmissionCode TEXT;--Mã tiếp nhận: makb\n MedicalRecordNo TEXT;--Mã bệnh án\n TPDate TIMESTAMP; --Ngày tờ điều trị: ngaygio\n TreatmentDoctorCode TEXT;--Mã số bs chỉ định điều trị: manv\n DepartmentCode TEXT;--Mã khoa chỉ định điều trị:madv\n ParaClinicalResultCommand TEXT;\n VitalSignCommand TEXT; --Chỉ số sinh hiệu\n RiskOfFalling INT; --Té ngã: 1-Thấp, 2-Cao, 3-Trung bình\n TakeCare INT; --Chế độ chăm sóc: 1-Cấp 1, 2-Cấp 2, 3-Cấp 3\n FollowUpCommand TEXT;--Chăm sóc: chamsoc\n MethodOfTreatmentCommand TEXT;\n NutritionCommand TEXT;\n Infor TEXT; --Diễn biến: dienbien\n DiseaseName TEXT;\n IsNotChange BOOLEAN := FALSE;\n FileDocID TEXT;\n FilePath TEXT;\n SignStatus INT := 0;--Trạng thái\n Reason TEXT;--Lý do hủy\n DiagnosisDesc TEXT; --Chẩn đoán hiện đại: kqcdoan || ',' || kqcdoanp\n DiagnosisICDName TEXT; -- [ÔNG TRIỆU HẬU: 2025-08-11]: Đồng bộ dữ liệu ICD >> Theo HIS đề xuất, EMR có bổ sung 1 field DiagnosisICDName >> HIS lấy field này thay cho DiagnosisDesc như hiện tại\n DiagnosisTraditionalDesc TEXT;--Chẩn đoán YHCT: tenyhct\n DiagnosisOtherDesc TEXT;\n Prescriptions JSONB; --Thông tin thuốc\n ParaClinRequests JSONB; --Thông tin CLS\n Diagnosis JSONB; -- Thông tin chẩn đoán\n\n VitalSign JSONB; -- Dấu hiệu sinh tồn\n VSDate TIMESTAMP; --Ngày giờ ghi nhận dấu hiệu sinh tồn\n ExecutorCode TEXT; --Mã nhân viên thực hiện\n ExecutorName TEXT; --Tên nhân viên thực hiện\n\n Height NUMERIC; --: 120.0, Chiều cao của bệnh nhân (cm)\n Weight NUMERIC; --\": 40.0, Cân nặng của bệnh nhân (kg)\n BMI NUMERIC; --\": 27.8, Chỉ số khối cơ thể (BMI)\n BloodPressureSystolic INT; --\": 140.0, Huyết áp tâm thu (mmHg)\n BloodPressureDiastolic INT;--: 100.0, Huyết áp tâm trương (mmHg)\n BodyTemperature NUMERIC; --\": 37.0,Nhiệt độ cơ thể (°C)\n Pulse NUMERIC; --\": 59.0,Nhịp tim (lần/phút)\n BreathBeat NUMERIC; --\": 20.0, Nhịp thở (lần/phút)\n SpO2 NUMERIC; --\": 99.0, Độ bão hòa oxy trong máu (%)\n Para TEXT;\n I_RHType INT; --Loại Rh máu (1: Rh+, 2: Rh-)\n I_BloodType INT; --Nhóm máu (1: A, 2: B, 3: AB, 4: O, 5: Chưa xác định)\n\n nt_maphong TEXT := NULL;\n nt_sogiuong TEXT := NULL;\n nt_huyetap TEXT := NULL;\n\n thangnam TEXT;\n thangkt_S TEXT; -- thangkt, lấy cho đủ số liệu, toa thuốc mới lên module\n namkt_S TEXT; --namkt, lấy cho đủ số liệu, toa thuốc mới lên module\n\n dt_maicd TEXT := NULL;\n dt_kqcdoan TEXT := NULL;\n\n dt_mayhct TEXT := NULL;\n dt_tenyhct TEXT := NULL;\n \n record_exists BOOLEAN := FALSE;\n insert_success BOOLEAN := TRUE;\n \n dt_maicdp_arr TEXT[] := ARRAY[]::TEXT[];\n dt_kqcdoanp_arr TEXT[] := ARRAY[]::TEXT[];\n dt_maicdp TEXT := NULL;\n dt_kqcdoanp TEXT := NULL;\n \n v_err_context TEXT;\n v_err_msg TEXT;\n\n missing_icds TEXT[];\n BedNo TEXT := NULL;\n CurrentDateTime timestamptz;\n\nBEGIN\n TPCode := input_json->>'TPCode';\n PatientCode := input_json->>'PatientCode';\n AdmissionCode := input_json->>'AdmissionCode';\n MedicalRecordNo := input_json->>'MedicalRecordNo';\n TreatmentDoctorCode := input_json->>'TreatmentDoctorCode';\n Infor := input_json->>'Infor';\n BedNo := input_json->>'BedNo';\n TPDate := (input_json->>'TPDate')::timestamptz;\n\n CurrentDateTime := NOW() AT TIME ZONE 'Asia/Ho_Chi_Minh';\n\n IF TPDate > CurrentDateTime THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('Ngày diễn biến (TPDate): %s - Không thể lớn hơn ngày hiện tại: %s. (Mabn: %L, Makb: %L, Maba: %L)', \n TO_CHAR(TPDate AT TIME ZONE 'Asia/Ho_Chi_Minh', 'YYYY-MM-DD HH24:MI:SS'),\n TO_CHAR(CurrentDateTime, 'YYYY-MM-DD HH24:MI:SS'),\n PatientCode, AdmissionCode, MedicalRecordNo)\n );\n END IF;\n\n IF COALESCE(Infor,'')='' THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('Diễn biến (Infor): Không thể rỗng. (Mabn: %L, Makb: %L, Maba: %L)', \n PatientCode, AdmissionCode, MedicalRecordNo)\n );\n END IF;\n\n IF NOT EXISTS ( SELECT 1 FROM current.bnnoitru\n WHERE mabn = PatientCode AND makb = AdmissionCode AND maba = MedicalRecordNo AND COALESCE(ravien,0) = 0\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('Mabn: %L, Makb: %L, Maba: %L không tồn tại trong HIS (phải còn đang điều trị)', \n PatientCode, AdmissionCode, MedicalRecordNo)\n );\n END IF;\n \n IF NOT EXISTS (\n SELECT 1 FROM current.dmnhanvien\n WHERE manv = TreatmentDoctorCode AND COALESCE(macc_hanhnghe_cv2348,'') != '' AND COALESCE(trangthai,'') = '1'\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', format('TreatmentDoctorCode: %s không tồn tại trong HIS (Điều kiện: Phải có CCHN và trạng thái đang làm việc.)', TreatmentDoctorCode));\n END IF;\n IF input_json ? 'Diagnosis' AND jsonb_array_length(input_json->'Diagnosis') > 0 THEN\n \n /* Gom tất cả ICD code (DiagnosisType=1) rồi kiểm tra một lần */\n WITH dx AS (\n SELECT DISTINCT\n (d->>'DiagnosisICDCode')::text AS icd_code\n FROM jsonb_array_elements(input_json->'Diagnosis') AS d\n WHERE COALESCE((d->>'DiagnosisType')::int, 0) = 1\n AND NULLIF(d->>'DiagnosisICDCode','') IS NOT NULL\n ),\n missing AS (\n SELECT dx.icd_code\n FROM dx\n LEFT JOIN current.dmicd m\n ON m.maicd = dx.icd_code AND COALESCE(m.xoa,0)=0\n WHERE m.maicd IS NULL\n )\n SELECT ARRAY_AGG(icd_code)\n INTO missing_icds\n FROM missing;\n\n IF missing_icds IS NOT NULL THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('ICD code (DiagnosisType=1) không tồn tại hoặc ngưng sử dụng trong current.dmicd: %L', missing_icds));\n END IF;\n\n END IF;\n\n IF input_json ? 'Diagnosis' AND jsonb_array_length(input_json->'Diagnosis') > 0 THEN\n \n /* Gom tất cả ICD code (DiagnosisType=1) rồi kiểm tra một lần */\n WITH dx AS (\n SELECT DISTINCT\n (d->>'DiagnosisICDCode')::text AS icd_code\n FROM jsonb_array_elements(input_json->'Diagnosis') AS d\n WHERE COALESCE((d->>'DiagnosisType')::int, 0) = 2\n AND NULLIF(d->>'DiagnosisICDCode','') IS NOT NULL\n ),\n missing AS (\n SELECT dx.icd_code\n FROM dx\n LEFT JOIN current.dmbyt_benhyhct m\n ON m.ma_yhct = dx.icd_code\n WHERE m.ma_yhct IS NULL\n )\n SELECT ARRAY_AGG(icd_code)\n INTO missing_icds\n FROM missing;\n\n IF missing_icds IS NOT NULL THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('ICD code (DiagnosisType=2) không tồn tại hoặc ngưng sử dụng trong current.dmbyt_benhyhct: %L', missing_icds));\n END IF;\n\n END IF;\n\n IF input_json ? 'ParaClinRequests' AND jsonb_array_length(input_json->'ParaClinRequests') > 0 THEN\n \n WITH dx AS (\n SELECT DISTINCT\n (d->>'MedSerCode')::text AS macls_code\n FROM jsonb_array_elements(input_json->'ParaClinRequests') AS d\n WHERE NULLIF(d->>'MedSerCode','') IS NOT NULL\n ),\n missing AS (\n SELECT dx.macls_code\n FROM dx\n LEFT JOIN current.dmcls m\n ON m.macls = dx.macls_code AND COALESCE(m.sudung,0)=1 AND COALESCE(m.tt37,0)=1\n WHERE m.macls IS NULL\n )\n SELECT ARRAY_AGG(macls_code)\n INTO missing_icds\n FROM missing;\n\n IF missing_icds IS NOT NULL THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('MedSerCode code không tồn tại hoặc ngưng sử dụng trong current.dmcls: %L', missing_icds));\n END IF;\n\n END IF;\n\n SELECT EXISTS (\n SELECT 1 FROM current.qtdieutri WHERE iddienbien = TPCode\n ) INTO record_exists;\n\n \n DepartmentCode := input_json->>'DepartmentCode';\n ParaClinicalResultCommand := input_json->>'ParaClinicalResultCommand';\n VitalSignCommand := input_json->>'VitalSignCommand';\n RiskOfFalling := input_json->>'RiskOfFalling';\n TakeCare := input_json->>'TakeCare';\n FollowUpCommand := input_json->>'FollowUpCommand';\n MethodOfTreatmentCommand := input_json->>'PatientCode';\n NutritionCommand := input_json->>'NutritionCommand';\n \n DiseaseName := input_json->>'DiseaseName';\n IsNotChange := (input_json->>'IsNotChange')::BOOLEAN;\n FileDocID := input_json->>'FileDocID';\n FilePath := input_json->>'FilePath';\n SignStatus := (input_json->>'SignStatus')::INT;\n Reason := input_json->>'Reason';\n DiagnosisDesc := input_json->>'DiagnosisDesc';\n DiagnosisICDName := input_json->>'DiagnosisICDName';\n DiagnosisTraditionalDesc := input_json->>'DiagnosisTraditionalDesc';\n DiagnosisOtherDesc := input_json->>'DiagnosisOtherDesc';\n\n Height := (input_json->'VitalSign'->>'Height')::numeric;\n Weight := (input_json->'VitalSign'->>'Weight')::numeric;\n BMI := (input_json->'VitalSign'->>'BMI')::numeric;\n BloodPressureSystolic := (input_json->'VitalSign'->>'BloodPressureSystolic')::numeric;\n BloodPressureDiastolic := (input_json->'VitalSign'->>'BloodPressureDiastolic')::numeric;\n BodyTemperature := (input_json->'VitalSign'->>'BodyTemperature')::numeric;\n Pulse := (input_json->'VitalSign'->>'Pulse')::numeric;\n BreathBeat := (input_json->'VitalSign'->>'BreathBeat')::numeric;\n SpO2 := (input_json->'VitalSign'->>'SpO2')::numeric;\n Para := (input_json->'VitalSign'->>'Para');\n I_RHType := (input_json->'VitalSign'->>'I_RHType')::numeric;\n I_BloodType := (input_json->'VitalSign'->>'I_BloodType')::numeric;\n\n nt_huyetap := BloodPressureSystolic || '/' || BloodPressureDiastolic;\n\n FOR Diagnosis IN SELECT value FROM jsonb_array_elements(COALESCE(input_json->'Diagnosis','[]')) AS value\n LOOP\n IF (Diagnosis->>'DiagnosisType')::INT = 2 THEN\n dt_mayhct := Diagnosis->>'DiagnosisICDCode';\n dt_tenyhct := COALESCE(\n Diagnosis->>'DiagnosisDesc',\n NULLIF(TRIM(Diagnosis->>'DiagnosisICDName'), '') \n );\n \n ELSE\n IF (Diagnosis->>'IsMain')::BOOLEAN THEN\n dt_maicd := Diagnosis->>'DiagnosisICDCode';\n dt_kqcdoan := COALESCE(\n Diagnosis->>'DiagnosisDesc',\n NULLIF(TRIM(Diagnosis->>'DiagnosisICDName'), '') \n );\n \n ELSE\n dt_maicdp_arr := array_append(dt_maicdp_arr, Diagnosis->>'DiagnosisICDCode');\n dt_kqcdoanp_arr := array_append(dt_kqcdoanp_arr, \n COALESCE(\n Diagnosis->>'DiagnosisDesc',\n NULLIF(TRIM(Diagnosis->>'DiagnosisICDName'), '') \n )\n );\t\t\t\t\n END IF;\n END IF;\n END LOOP;\n\t\n dt_maicdp := array_to_string(dt_maicdp_arr, ';'); \n dt_kqcdoanp := array_to_string(dt_kqcdoanp_arr, ';');\n \n IF NOT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_name = 'qtdieutri' AND column_name = 'api'\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', 'Bảng qtdieutri chưa có cột api');\n END IF;\n\n IF NOT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_name = 'chungtu' AND column_name = 'api'\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', 'Bảng chungtu chưa có cột api');\n END IF;\n\n IF NOT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_name = 'chidinhcls' AND column_name = 'api'\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', 'Bảng chidinhcls chưa có cột api');\n END IF;\n\n SELECT giatri INTO thangnam FROM current.system WHERE tents = 'thanglv';\n thangkt_S := SPLIT_PART(thangnam, '/', 1);\n namkt_S := SPLIT_PART(thangnam, '/', 2);\n\n SELECT maphong, sogiuong INTO nt_maphong, nt_sogiuong -- lấy cho đủ số liệu\n FROM current.bnnoitru\n WHERE mabn = PatientCode AND maba = MedicalRecordNo AND makb = AdmissionCode;\n\n\n BEGIN\n IF record_exists THEN\n UPDATE current.qtdieutri\n SET manv = TreatmentDoctorCode,\n ngaygio = TPDate,\n dienbien = Infor,\n maicd = dt_maicd,\n kqcdoan = dt_kqcdoan,\n maicdp = dt_maicdp,\n kqcdoanp = dt_kqcdoanp,\n madv = DepartmentCode,\n mayhct = dt_mayhct,\n tenyhct = dt_tenyhct,\n chamsoc = FollowUpCommand,\n maphong = nt_maphong,\n sogiuong = nt_sogiuong,\n ma_giuong = BedNo,\n api = 1\n WHERE iddienbien = TPCode AND mabn = PatientCode and maba = MedicalRecordNo AND makb = AdmissionCode;\n ELSE\n INSERT INTO current.qtdieutri(\n mabn, makb, maba, manv, ngaygio,\n dienbien, maicd, kqcdoan, maicdp, kqcdoanp,\n madv, iddienbien, mayhct, tenyhct, chamsoc, api, thangkt, namkt, maphong, sogiuong,\n ma_giuong\n )\n VALUES (\n PatientCode, AdmissionCode, MedicalRecordNo, TreatmentDoctorCode, TPDate,\n Infor, dt_maicd, dt_kqcdoan, dt_maicdp, dt_kqcdoanp,\n DepartmentCode, TPCode, dt_mayhct, dt_tenyhct, FollowUpCommand, 1, thangkt_S, namkt_S, nt_maphong, nt_sogiuong,\n BedNo\n );\n END IF;\n\n UPDATE current.bnnoitru\n SET manv = TreatmentDoctorCode,\n iddienbien = TPCode,\n ngaykcb = TPDate,\n dienbien = Infor,\n maicd = dt_maicd,\n kqcdoan = dt_kqcdoan,\n maicdp = dt_maicdp,\n kqcdoanp = dt_kqcdoanp,\n madv = DepartmentCode,\n mayhct = dt_mayhct,\n tenyhct = dt_tenyhct,\n chamsoc = FollowUpCommand,\n huyetap = nt_huyetap,\n nhiptho = BreathBeat,\n nhietdo = BodyTemperature,\n mach = Pulse,\n chieucao = Height/100.0,\n cannang = Weight,\n maphong = nt_maphong,\n sogiuong = nt_sogiuong\n WHERE mabn = PatientCode and maba = MedicalRecordNo AND makb = AdmissionCode;\n\n UPDATE current.ttcon\n SET manv = TreatmentDoctorCode,\n iddienbien = TPCode,\n maicd = dt_maicd,\n kqcdoan = dt_kqcdoan,\n maicdp = dt_maicdp,\n kqcdoanp = dt_kqcdoanp,\n mayhct = dt_mayhct,\n tenyhct = dt_tenyhct\n WHERE mabnme = PatientCode and mabame = MedicalRecordNo AND COALESCE(loaitt,0) = 1;\n\n IF jsonb_array_length(COALESCE(input_json->'Prescriptions', '[]'::jsonb)) > 0 THEN\n PERFORM badt_dhs.inserttpprescription(input_json);\n END IF;\n\n IF jsonb_array_length(COALESCE(input_json->'ParaClinRequests', '[]'::jsonb)) > 0 THEN\n PERFORM badt_dhs.insertcutpparaclinrequest(input_json);\n END IF;\n\n RETURN jsonb_build_object('status', 'success', 'message', '');\n\n EXCEPTION\n WHEN OTHERS THEN\n GET STACKED DIAGNOSTICS\n v_err_context = PG_EXCEPTION_CONTEXT,\n v_err_msg = MESSAGE_TEXT;\n\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', v_err_msg\n );\n END;\n\nEND;\n$$ LANGUAGE plpgsql;\n\n\n"
|
4476
4476
|
},
|
4477
4477
|
"badt_dhs.GetSyncCityProvince": {
|
4478
4478
|
name: "badt_dhs.GetSyncCityProvince",
|
@@ -4544,7 +4544,7 @@
|
|
4544
4544
|
name: "badt_dhs.cancelTPPrescription",
|
4545
4545
|
para: ["input_json"],
|
4546
4546
|
returns: "JSONB",
|
4547
|
-
codesql: "\n\nCREATE OR REPLACE FUNCTION badt_dhs.cancelTPPrescription(input_json JSONB )\nRETURNS JSONB AS $$\nDECLARE\n-- Lastest commit: author:onghaup; date: 2025-09-19 11:52:42\n-- ===============================================================\n-- Thực hiện: NGUYỄN TRIỀU VƯƠNG - 2025-08-11\n-- Hàm: badt_dhs.cancelTPPrescription(input_json JSONB)\n-- Mô tả: Hủy 1 thuốc trong toa\n-- input_json: nội dung file json: thông tin bệnh nhân và toa thuốc\n-- Sử dụng:\n-- SELECT badt_dhs.cancelTPPrescription(input_json JSONB);\n-- Nếu thuốc đã tổng hơp --\x3e tạo toa trả với thông tin thuốc trong json --\x3e theo tháng năm kế toán hiện tại\n-- Nếu thuốc thuốc chưa tổng hợp --\x3e xóa thuốc trong pshdxn --\x3e tăng pstonkho.tamnhap --\x3e xóa chungtu hoặc điều chỉnh theo thuốc còn lại trong pshdxn\n-- ===============================================================\n--Số lượng thuốc ngưng sử dụng\n--[ÔNG TRIỆU HẬU: 2025-09-18] Kiểm tra trạng thái ra viện\n-- Lấy tháng năm kế toán\n--Kiểm tra số lượng xuất - trả\n--TUTRUC\n-- Lấy chi tiết thuốc trả\n-- Ghi vào pshdxn\n-- Cập nhật tồn kho tủ trưc\n-- Cộng tổng\n-- Ghi chứng từ\n--ENDTUTRUC\n-- 2. Kiểm tra đã in chứng từ hay chưa\n--\n-- 1. Kiểm tra còn đủ số lượng để trả\n--Kiểm tra số lượng còn lại\n-- Lấy chi tiết thuốc trả\n-- Ghi vào pshdxn\n-- Cập nhật tồn kho\n-- Cộng tổng\n-- Ghi chứng từ\n-- Lấy chi tiết thuốc trả\n-- UPDATE\n-- Cập nhật tồn kho\n-- Cộng tổng\n-- Ghi chứng từ\n-- UPDATE\n p_mabn TEXT := input_json->>'PatientCode'; --Mã bệnh nhân\n p_makh TEXT := input_json->>'MedicalRecordNo'; -- Mã bệnh án\n p_makb TEXT := input_json->>'AdmissionCode'; -- Mã khám bệnh\n p_iddienbien TEXT := input_json->>'TPCode'; -- ID diễn biến\n p_sohd TEXT := input_json->>'PresCode'; -- Số hd\n p_mahh TEXT := input_json->>'PresDtlCode'; --Mã hàng hóa\n\n p_sang NUMERIC := input_json->>'CancelMorningQty'; --Số lượng thuốc ngưng sáng\n p_trua NUMERIC := input_json->>'CancelMiddayQty'; --Số lượng thuốc ngưng trưa\n p_chieu NUMERIC := input_json->>'CancelAfternoonQty'; --Số lượng thuốc chiều\n p_toi NUMERIC := input_json->>'CancelEveningQty'; --Số lượng thuốc tối\n\n p_soluong NUMERIC := input_json->>'CancelDispenseQty'; --Tổng số lượng thuốc ngưng\n p_matutruc TEXT := COALESCE(input_json->>'Matutruc',''); --Mã tủ trực\n\n tong_thanhtien NUMERIC := 0;\n tong_thanhtienbhyt NUMERIC := 0;\n tong_thanhtienvat NUMERIC := 0;\n tong NUMERIC := 0;\n so_mahh NUMERIC := 0;\n tong_tien_tra NUMERIC := 0;\n sl_xuat_tutruc NUMERIC := 0;\n\n r_hd RECORD;\n r_ct RECORD;\n\n thangnam TEXT;\n thangkt_S TEXT;\n namkt_S TEXT;\n v_code TEXT;\n \n r_mahh TEXT:='';\n r_sohd TEXT:='';\n r_matutuc TEXT:='';\n \n v_dain_exists BOOLEAN;\n v_matutruc_exists BOOLEAN;\n v_toatutruc_exists BOOLEAN;\n \nBEGIN\n\n IF NOT EXISTS ( SELECT 1 FROM current.bnnoitru\n WHERE mabn = p_mabn AND maba = p_makh AND COALESCE(ravien,0) = 0\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('Mabn: %L, Maba: %L không tồn tại trong HIS (phải còn đang điều trị)', \n p_mabn, p_makh)\n );\n END IF;\n\n SELECT giatri INTO thangnam FROM current.system WHERE tents = 'thanglv';\n \tthangkt_S := SPLIT_PART(thangnam, '/', 1);\n namkt_S := SPLIT_PART(thangnam, '/', 2);\n\n SELECT COALESCE(sohd,'') sohd, COALESCE(mahh,'') mahh, COALESCE(tutruc,'') tutruc INTO r_sohd, r_mahh, r_matutuc\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND sohd = p_sohd\n AND mahh = p_mahh\n AND COALESCE(xoa, 0) = 0 ;\n \n RAISE NOTICE 'p_mabn: %', p_mabn;\n RAISE NOTICE 'p_makh: %', p_makh;\n RAISE NOTICE 'p_sohd: %', p_sohd;\n RAISE NOTICE 'p_mahh: %', p_mahh;\n \n RAISE NOTICE 'mahh: %', COALESCE(r_mahh,'');\n RAISE NOTICE 'sohd: %', COALESCE(r_sohd,'');\n RAISE NOTICE 'tutruc: %', COALESCE(r_matutuc,'');\n \n IF COALESCE(r_mahh,'') = '' THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('PresDtlCode: %s không tồn tại', p_mahh)\n );\n END IF;\n\n IF COALESCE(r_sohd,'') = '' THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Hóa đơn %s (iddienbien=%s) không tồn tại', p_sohd, p_iddienbien)\n );\n END IF;\n\n\n IF COALESCE(r_matutuc,'') != '' THEN -- toa tủ trực\n \tSELECT EXISTS (\n SELECT 1 FROM current.dmdonvi WHERE madv = p_matutruc AND COALESCE(xoa, 0) = 0\n ) INTO v_matutruc_exists;\n\n IF NOT v_matutruc_exists THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Mã tủ trực: %s không tồn tại', p_matutruc)\n );\n END IF;\n\n SELECT EXISTS (\n SELECT 1\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND sohd = p_sohd\n AND mahh = p_mahh\n AND tutruc = p_matutruc\n AND COALESCE(xoa, 0) = 0\n ) INTO v_toatutruc_exists;\n\n IF NOT v_toatutruc_exists THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Toa tủ trực : %s không tồn tại', p_sohd)\n );\n END IF;\n\n v_code := CASE WHEN length(p_sohd) > 14 THEN LEFT(p_sohd, 14) ELSE p_sohd END;\n v_code := v_code || to_char(NOW(), 'HH24MISS');\n\n SELECT Sum(toncuoi) AS toncuoi INTO sl_xuat_tutruc\n FROM\n ( SELECT Sum(soluong) AS toncuoi\n FROM CURRENT.pshdxn\n WHERE mahh = p_mahh\n AND makh = p_makh\n AND COALESCE(tutruc,'') = p_matutruc\n AND sohd = p_sohd\n AND loaixn = 'xbb'\n AND toatutruc IN (1,2)\n AND COALESCE(noitru,0) = 1\n AND COALESCE(xoa,0) = 0\n AND COALESCE(toacon, 0) = 0\n AND COALESCE(kyhieu,'')=''\n UNION\n SELECT Sum(-soluong) AS toncuoi\n FROM CURRENT.pshdxn\n WHERE mahh = p_mahh\n AND makh = p_makh\n AND COALESCE(tutruc,'') = p_matutruc\n AND sohdx = p_sohd\n AND loaixn = 'ttt'\n AND COALESCE(noitru,0) = 1\n AND COALESCE(xoa,0) = 0\n AND COALESCE(toacon, 0) = 0\n AND COALESCE(kyhieu,'')=''\n AND COALESCE(thanhtoan, '') = ''\n ) AS tam;\n \n IF p_soluong > sl_xuat_tutruc THEN\n \tRETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Số lượng trả lớn hơn số lượng xuất: trả %s, xuất %s', p_soluong,sl_xuat_tutruc)\n );\n END IF;\n FOR r_hd IN\n SELECT *, p_soluong as soluong_tra\n FROM current.pshdxn hd\n WHERE hd.mahh = p_mahh\n AND hd.sohd = p_sohd\n AND hd.mabn = p_mabn\n AND hd.makh = p_makh\n AND hd.tutruc = p_matutruc\n AND COALESCE(hd.xoa, 0) = 0\n LOOP\n IF COALESCE(r_hd.soluong, 0) > 0 THEN\n INSERT INTO current.pshdxn(\n sohd, sohdx, iddienbien, mabn, makh,\n mahh, ngayhd, ngaylap, giolap, madv,\n soluong, sang, trua, chieu, toi, lieu_dung, cachuong,\n giaban, giavat, giabhyt, thanhtien, thanhtienbhyt, bhyt,\n handung, solo, visa, thangkt, namkt,\n stt, loaixn, noitru, khole, toaxv,\n madt, khochan, theodon, tienvat, tenmay, loaitoa, thanhtoan, \n tutruc, dain, toatutruc\n )\n VALUES (\n v_code, r_hd.sohd, r_hd.iddienbien, r_hd.mabn, r_hd.makh,\n r_hd.mahh, r_hd.ngayhd, r_hd.ngaylap, now(), r_hd.madv,\n r_hd.soluong_tra, r_hd.sang, r_hd.trua, r_hd.chieu, r_hd.toi, r_hd.lieu_dung, r_hd.cachuong,\n r_hd.giaban, r_hd.giavat, r_hd.giabhyt, r_hd.thanhtien, r_hd.thanhtienbhyt, r_hd.bhyt,\n r_hd.handung, r_hd.solo, r_hd.visa, thangkt_S, namkt_S,\n r_hd.stt, 'ttt', r_hd.noitru, r_hd.khole, 0,\n r_hd.madt, r_hd.khochan, r_hd.theodon, r_hd.tienvat, r_hd.tenmay, r_hd.loaitoa, r_hd.thanhtoan,\n r_hd.tutruc, 1,1\n );\n\n UPDATE current.pstonkho\n SET nhap = COALESCE(nhap, 0) + COALESCE(r_hd.soluong_tra,0),\n toncuoi = COALESCE(toncuoi, 0) + COALESCE(r_hd.soluong_tra,0)\n WHERE COALESCE(mahh, '') = COALESCE(r_hd.mahh, '')\n AND COALESCE(giavat, 0) = COALESCE(r_hd.giavat, 0)\n AND COALESCE(madv, '') = COALESCE(r_hd.tutruc, '')\n AND COALESCE(handung, '') = COALESCE(r_hd.handung, '')\n AND COALESCE(thangkt, '') = COALESCE(thangkt_S, '')\n AND COALESCE(namkt, '') = COALESCE(namkt_S, '');\n\n tong_thanhtien := tong_thanhtien + COALESCE(r_hd.thanhtien, 0);\n tong_thanhtienbhyt := tong_thanhtienbhyt + COALESCE(r_hd.thanhtienbhyt, 0);\n tong_thanhtienvat := tong_thanhtienvat + COALESCE(r_hd.tienvat, 0);\n tong_tien_tra := tong_tien_tra + COALESCE(r_hd.giavat, 0) * COALESCE(r_hd.soluong_tra, 0);\n END IF;\n END LOOP;\n\n FOR r_ct IN\n SELECT *\n FROM current.chungtu ct\n WHERE ct.sohd = p_sohd\n AND ct.mabn = p_mabn\n AND ct.makh = p_makh\n AND ct.tutruc = p_matutruc\n AND COALESCE(ct.xoa, 0) = 0\n LOOP\n INSERT INTO current.chungtu(\n sohd, sohdx, iddienbien, mabn, makh, madt, madv,\n manv, ngayuong, ghichu, khole,\n ngayhd, ngaylap, giolap, thanhtien, thangkt, namkt,\n loaixn, noitru, taikhoan, maicd, kqcdoan, maicdp, kqcdoanp, api, thanhtoan, toaxv,\n khochan, tienvat, tenmay, taikham, loaitoa, mathe, thanhtienbhyt, mayhct, tenyhct,\n tutruc, dain, toatutruc\n )\n VALUES (\n v_code, r_ct.sohd, r_ct.iddienbien, r_ct.mabn, r_ct.makh, r_ct.madt, r_ct.madv,\n r_ct.manv, r_ct.ngayuong, r_ct.ghichu, r_ct.khole,\n r_ct.ngayhd, r_ct.ngaylap, now(), tong_thanhtien, thangkt_S, namkt_S,\n 'ttt', r_ct.noitru, r_ct.taikhoan, r_ct.maicd, r_ct.kqcdoan, r_ct.maicdp, r_ct.kqcdoanp, r_ct.api, r_ct.thanhtoan, r_ct.toaxv,\n r_ct.khochan, tong_thanhtienvat, r_ct.tenmay, r_ct.taikham, r_ct.loaitoa, r_ct.mathe, tong_thanhtienbhyt, r_ct.mayhct, r_ct.tenyhct,\n r_ct.tutruc, 1,1\n );\n END LOOP;\n\n RETURN jsonb_build_object(\n 'status', 'success',\n 'message', format('Thêm thành công chứng từ trả tủ trực %s, chứng từ mới: %s',p_matutruc, v_code)\n );\n ELSE --toa thường\n SELECT EXISTS (\n SELECT 1\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND sohd = p_sohd\n AND mahh = p_mahh\n AND COALESCE(xoa, 0) = 0\n AND COALESCE(dain, 0) = 1\n ) INTO v_dain_exists;\n\n \tIF v_dain_exists THEN\n\n v_code := CASE WHEN length(p_sohd) > 14 THEN LEFT(p_sohd, 14) ELSE p_sohd END;\n v_code := v_code || to_char(NOW(), 'HH24MISS');\n\n SELECT SUM(CASE WHEN loaixn = 'xbb' AND COALESCE(dain,0) = 1 THEN soluong ELSE 0 END)\n - SUM(CASE WHEN loaixn = 'nkt' THEN soluong ELSE 0 END)\n INTO tong\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND mahh = p_mahh\n AND COALESCE(xoa, 0) = 0;\n\n IF tong <= 0 THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Thuốc/vật tư %s đã trả đủ số lượng, không thể trả thêm', p_mahh)\n );\n END IF;\n \n IF p_soluong > tong THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Thuốc/vật tư %s, số lượng trả %s > số lượng còn lại %s, không đủ để trả', p_mahh,p_soluong,tong)\n );\n END IF;\n\n FOR r_hd IN\n SELECT *, p_soluong as soluong_tra\n FROM current.pshdxn hd\n WHERE hd.mahh = p_mahh\n AND hd.sohd = p_sohd\n AND hd.mabn = p_mabn\n AND hd.makh = p_makh\n AND COALESCE(hd.xoa, 0) = 0\n LOOP\n IF COALESCE(r_hd.soluong, 0) > 0 THEN\n INSERT INTO current.pshdxn(\n sohd, sohdx, iddienbien, mabn, makh,\n mahh, ngayhd, ngaylap, giolap, madv,\n soluong, sang, trua, chieu, toi, lieu_dung, cachuong,\n giaban, giavat, giabhyt, thanhtien, thanhtienbhyt, bhyt,\n handung, solo, visa, thangkt, namkt,\n stt, loaixn, noitru, khole, toaxv,\n madt, khochan, theodon, tienvat, tenmay, loaitoa, thanhtoan\n )\n VALUES (\n v_code, r_hd.sohd, r_hd.iddienbien, r_hd.mabn, r_hd.makh,\n r_hd.mahh, r_hd.ngayhd, r_hd.ngaylap, now(), r_hd.madv,\n r_hd.soluong_tra, r_hd.sang, r_hd.trua, r_hd.chieu, r_hd.toi, r_hd.lieu_dung, r_hd.cachuong,\n r_hd.giaban, r_hd.giavat, r_hd.giabhyt, r_hd.thanhtien, r_hd.thanhtienbhyt, r_hd.bhyt,\n r_hd.handung, r_hd.solo, r_hd.visa, thangkt_S, namkt_S,\n r_hd.stt, 'nkt', r_hd.noitru, r_hd.khole, 0,\n r_hd.madt, r_hd.khochan, r_hd.theodon, r_hd.tienvat, r_hd.tenmay, r_hd.loaitoa, r_hd.thanhtoan\n );\n\n UPDATE current.pstonkho\n SET tamnhap = COALESCE(tamnhap, 0) + COALESCE(r_hd.soluong_tra, 0)\n WHERE COALESCE(mahh, '') = COALESCE(r_hd.mahh, '')\n AND COALESCE(giavat, 0) = COALESCE(r_hd.giavat, 0)\n AND COALESCE(khocp, '') = COALESCE(r_hd.khole, '')\n AND COALESCE(handung, '') = COALESCE(r_hd.handung, '')\n AND COALESCE(thangkt, '') = COALESCE(thangkt_S, '')\n AND COALESCE(namkt, '') = COALESCE(namkt_S, '');\n\n tong_thanhtien := tong_thanhtien + COALESCE(r_hd.thanhtien, 0);\n tong_thanhtienbhyt := tong_thanhtienbhyt + COALESCE(r_hd.thanhtienbhyt, 0);\n tong_thanhtienvat := tong_thanhtienvat + COALESCE(r_hd.tienvat, 0);\n tong_tien_tra := tong_tien_tra + COALESCE(r_hd.giavat, 0) * COALESCE(r_hd.soluong_tra, 0);\n END IF;\n END LOOP;\n\n FOR r_ct IN\n SELECT *\n FROM current.chungtu ct\n WHERE ct.sohd = p_sohd\n AND ct.mabn = p_mabn\n AND ct.makh = p_makh\n AND COALESCE(ct.xoa, 0) = 0\n LOOP\n INSERT INTO current.chungtu(\n sohd, sohdx, iddienbien, mabn, makh, madt, madv,\n manv, ngayuong, ghichu, khole,\n ngayhd, ngaylap, giolap, thanhtien, thangkt, namkt,\n loaixn, noitru, taikhoan, maicd, kqcdoan, maicdp, kqcdoanp, api, thanhtoan, toaxv,\n khochan, tienvat, tenmay, taikham, loaitoa, mathe, thanhtienbhyt, mayhct, tenyhct\n )\n VALUES (\n v_code, r_ct.sohd, r_ct.iddienbien, r_ct.mabn, r_ct.makh, r_ct.madt, r_ct.madv,\n r_ct.manv, r_ct.ngayuong, r_ct.ghichu, r_ct.khole,\n r_ct.ngayhd, r_ct.ngaylap, now(), tong_thanhtien, thangkt_S, namkt_S,\n 'nkt', r_ct.noitru, r_ct.taikhoan, r_ct.maicd, r_ct.kqcdoan, r_ct.maicdp, r_ct.kqcdoanp, r_ct.api, r_ct.thanhtoan, r_ct.toaxv,\n r_ct.khochan, tong_thanhtienvat, r_ct.tenmay, r_ct.taikham, r_ct.loaitoa, r_ct.mathe, tong_thanhtienbhyt, r_ct.mayhct, r_ct.tenyhct\n );\n END LOOP;\n\n RETURN jsonb_build_object(\n 'status', 'success',\n 'message', format('Thêm thành công chứng từ trả %s', v_code)\n );\n\n ELSE -- Thuốc chưa tổng hợp ---cập nhật [08/09/2025]\n\t\tSELECT COUNT(DISTINCT mahh) INTO so_mahh\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND sohd = p_sohd\n AND COALESCE(xoa,0) = 0\n AND COALESCE(dain,0) = 0;\n\n FOR r_hd IN\n SELECT *, p_soluong as soluong_tra\n FROM current.pshdxn hd\n WHERE hd.mahh = p_mahh\n AND hd.sohd = p_sohd\n AND hd.mabn = p_mabn\n AND hd.makh = p_makh\n AND hd.soluong >= p_soluong --[VUONG] them theo yeu cầu\n AND COALESCE(hd.xoa, 0) = 0\n AND COALESCE(hd.dain, 0) = 0\n LOOP\n RAISE NOTICE 'soluong_tra: %',\n p_soluong;\n IF COALESCE(r_hd.soluong_tra, 0) > 0 THEN --soluong --\x3e soluong_tra\n IF COALESCE(r_hd.soluong_tra, 0) = COALESCE(r_hd.soluong, 0) THEN\n RAISE NOTICE 'soluong=nhau --\x3exóa: %',\n r_hd.soluong;\n UPDATE CURRENT.pshdxn SET xoa = 1, ngayxoa = NOW()\n WHERE mahh = p_mahh\n AND sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh\n AND soluong = r_hd.soluong_tra;\n ELSE --So luong tra < soluong\n RAISE NOTICE 'soluong > hơn --\x3egiảm: %', r_hd.soluong;\n UPDATE CURRENT.pshdxn SET\n \tsang = sang - p_sang,\n trua = trua - p_trua,\n chieu = chieu - p_chieu,\n toi = toi - p_toi,\n soluong = soluong - r_hd.soluong_tra,\n thanhtien = (r_hd.soluong - r_hd.soluong_tra) * r_hd.giavat,\n thanhtienbhyt = (r_hd.soluong - r_hd.soluong_tra) * r_hd.giavat\n WHERE mahh = p_mahh\n AND sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh\n AND soluong > r_hd.soluong_tra;\n END IF;\n\n RAISE NOTICE 'Cập nhật tồn kho, chưa tổng hợp: %', r_hd.soluong_tra;\n UPDATE current.pstonkho\n SET tamxuat = COALESCE(tamxuat, 0) - COALESCE(r_hd.soluong_tra, 0)\n WHERE COALESCE(mahh, '') = COALESCE(r_hd.mahh, '')\n AND COALESCE(giavat, 0) = COALESCE(r_hd.giavat, 0)\n AND COALESCE(khocp, '') = COALESCE(r_hd.khole, '')\n AND COALESCE(handung, '') = COALESCE(r_hd.handung, '')\n AND COALESCE(thangkt, '') = COALESCE(thangkt_S, '')\n AND COALESCE(namkt, '') = COALESCE(namkt_S, '');\n\n tong_thanhtien := tong_thanhtien + COALESCE(r_hd.thanhtien, 0);\n tong_thanhtienbhyt := tong_thanhtienbhyt + COALESCE(r_hd.thanhtienbhyt, 0);\n tong_thanhtienvat := tong_thanhtienvat + COALESCE(r_hd.tienvat, 0);\n tong_tien_tra := tong_tien_tra + COALESCE(r_hd.giavat, 0) * COALESCE(r_hd.soluong_tra, 0);\n\n RAISE NOTICE 'tong_thanhtien: %', tong_thanhtien;\n RAISE NOTICE 'tong_thanhtienbhyt: %', tong_thanhtienbhyt;\n RAISE NOTICE 'tong_thanhtienvat: %', tong_thanhtienvat;\n RAISE NOTICE 'tong_tien_tra: %', tong_tien_tra;\n END IF;\n END LOOP;\n\n FOR r_ct IN\n SELECT *\n FROM current.chungtu ct\n WHERE ct.sohd = p_sohd\n AND ct.mabn = p_mabn\n AND ct.makh = p_makh\n AND COALESCE(ct.xoa, 0) = 0\n LOOP\n IF so_mahh = 1 THEN --xóa chưng từ\n RAISE NOTICE 'Tổng tiền chứng từ %', r_ct.thanhtien;\n IF r_ct.thanhtien = tong_tien_tra THEN\n RAISE NOTICE 'Xoa chứng từ %', r_ct.sohd;\n UPDATE CURRENT.chungtu SET xoa = 1, ngayxoa = NOW()\n WHERE sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh;\n ELSE\n RAISE NOTICE 'Cập nhật chứng từ %', r_ct.sohd;\n \tUPDATE CURRENT.chungtu SET\n thanhtien = thanhtien - tong_tien_tra,\n tienvat = tienvat - tong_tien_tra,\n thanhtienbhyt = thanhtienbhyt - tong_tien_tra\n WHERE sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh;\n END IF;\n ELSE -- cập nhật chứng từ theo tiền còn lại lại\n RAISE NOTICE 'Cập nhật chứng từ, còn lại %', r_ct.sohd;\n \tUPDATE CURRENT.chungtu SET\n \tthanhtien = thanhtien - tong_tien_tra,\n tienvat = tienvat - tong_tien_tra,\n thanhtienbhyt = thanhtienbhyt - tong_tien_tra\n WHERE sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh;\n\n END IF;\n\n END LOOP;\n\n RETURN jsonb_build_object(\n 'status', 'success',\n 'message', format('Cập nhật thành công chứng từ trả %s', p_sohd)\n );\n END IF;\n END IF; \n\nEXCEPTION\n WHEN OTHERS THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', SQLERRM\n );\nEND;\n$$ LANGUAGE plpgsql;\n\n"
|
4547
|
+
codesql: "\n\nCREATE OR REPLACE FUNCTION badt_dhs.cancelTPPrescription(input_json JSONB )\nRETURNS JSONB AS $$\nDECLARE\n-- Lastest commit: author:Nguyễn Triều Vương; date: 2025-09-25 10:35:09\n-- ===============================================================\n-- Thực hiện: NGUYỄN TRIỀU VƯƠNG - 2025-08-11\n-- Hàm: badt_dhs.cancelTPPrescription(input_json JSONB)\n-- Mô tả: Hủy 1 thuốc trong toa\n-- input_json: nội dung file json: thông tin bệnh nhân và toa thuốc\n-- Sử dụng:\n-- SELECT badt_dhs.cancelTPPrescription(input_json JSONB);\n-- Nếu thuốc đã tổng hơp --\x3e tạo toa trả với thông tin thuốc trong json --\x3e theo tháng năm kế toán hiện tại\n-- Nếu thuốc thuốc chưa tổng hợp --\x3e xóa thuốc trong pshdxn --\x3e tăng pstonkho.tamnhap --\x3e xóa chungtu hoặc điều chỉnh theo thuốc còn lại trong pshdxn\n-- ===============================================================\n--Số lượng thuốc ngưng sử dụng\n--[ÔNG TRIỆU HẬU: 2025-09-18] Kiểm tra trạng thái ra viện\n-- Lấy tháng năm kế toán\n-- [2025-09-25]: Vương chỉnh\n--Kiểm tra số lượng xuất - trả\n--TUTRUC\n-- Lấy chi tiết thuốc trả\n-- Ghi vào pshdxn\n-- Cập nhật tồn kho tủ trưc\n-- Cộng tổng\n-- Ghi chứng từ\n--ENDTUTRUC\n-- 2. Kiểm tra đã in chứng từ hay chưa\n-- [2025-09-25]: Vương chỉnh\n--\n-- 1. Kiểm tra còn đủ số lượng để trả\n--Kiểm tra số lượng còn lại\n-- Lấy chi tiết thuốc trả\n-- Ghi vào pshdxn\n-- Cập nhật tồn kho\n-- Cộng tổng\n-- Ghi chứng từ\n-- Lấy chi tiết thuốc trả\n-- UPDATE\n-- Cập nhật tồn kho\n-- Cộng tổng\n-- Ghi chứng từ\n-- UPDATE\n p_mabn TEXT := input_json->>'PatientCode'; --Mã bệnh nhân\n p_makh TEXT := input_json->>'MedicalRecordNo'; -- Mã bệnh án\n p_makb TEXT := input_json->>'AdmissionCode'; -- Mã khám bệnh\n p_iddienbien TEXT := input_json->>'TPCode'; -- ID diễn biến\n p_sohd TEXT := input_json->>'PresCode'; -- Số hd\n p_mahh TEXT := input_json->>'PresDtlCode'; --Mã hàng hóa\n\n p_sang NUMERIC := input_json->>'CancelMorningQty'; --Số lượng thuốc ngưng sáng\n p_trua NUMERIC := input_json->>'CancelMiddayQty'; --Số lượng thuốc ngưng trưa\n p_chieu NUMERIC := input_json->>'CancelAfternoonQty'; --Số lượng thuốc chiều\n p_toi NUMERIC := input_json->>'CancelEveningQty'; --Số lượng thuốc tối\n\n p_soluong NUMERIC := input_json->>'CancelDispenseQty'; --Tổng số lượng thuốc ngưng\n p_matutruc TEXT := COALESCE(input_json->>'Matutruc',''); --Mã tủ trực\n\n tong_thanhtien NUMERIC := 0;\n tong_thanhtienbhyt NUMERIC := 0;\n tong_thanhtienvat NUMERIC := 0;\n tong NUMERIC := 0;\n so_mahh NUMERIC := 0;\n tong_tien_tra NUMERIC := 0;\n sl_xuat_tutruc NUMERIC := 0;\n\n r_hd RECORD;\n r_ct RECORD;\n\n thangnam TEXT;\n thangkt_S TEXT;\n namkt_S TEXT;\n v_code TEXT;\n \n r_mahh TEXT:='';\n r_sohd TEXT:='';\n r_matutuc TEXT:='';\n \n v_dain_exists BOOLEAN;\n v_matutruc_exists BOOLEAN;\n v_toatutruc_exists BOOLEAN;\n \nBEGIN\n\n IF NOT EXISTS ( SELECT 1 FROM current.bnnoitru\n WHERE mabn = p_mabn AND maba = p_makh AND COALESCE(ravien,0) = 0\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('Mabn: %L, Maba: %L không tồn tại trong HIS (phải còn đang điều trị)', \n p_mabn, p_makh)\n );\n END IF;\n\n SELECT giatri INTO thangnam FROM current.system WHERE tents = 'thanglv';\n \tthangkt_S := SPLIT_PART(thangnam, '/', 1);\n namkt_S := SPLIT_PART(thangnam, '/', 2);\n\n SELECT COALESCE(sohd,'') sohd, COALESCE(mahh,'') mahh, COALESCE(tutruc,'') tutruc INTO r_sohd, r_mahh, r_matutuc\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND sohd = p_sohd\n AND mahh = p_mahh\n AND COALESCE(xoa, 0) = 0 ;\n \n RAISE NOTICE 'p_mabn: %', p_mabn;\n RAISE NOTICE 'p_makh: %', p_makh;\n RAISE NOTICE 'p_sohd: %', p_sohd;\n RAISE NOTICE 'p_mahh: %', p_mahh;\n \n RAISE NOTICE 'mahh: %', COALESCE(r_mahh,'');\n RAISE NOTICE 'sohd: %', COALESCE(r_sohd,'');\n RAISE NOTICE 'tutruc: %', COALESCE(r_matutuc,'');\n \n IF COALESCE(r_mahh,'') = '' THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('PresDtlCode: %s không tồn tại', p_mahh)\n );\n END IF;\n\n IF COALESCE(r_sohd,'') = '' THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Hóa đơn %s (iddienbien=%s) không tồn tại', p_sohd, p_iddienbien)\n );\n END IF;\n\n\n IF COALESCE(r_matutuc,'') != '' THEN -- toa tủ trực\n \tSELECT EXISTS (\n SELECT 1 FROM current.dmdonvi WHERE madv = p_matutruc AND COALESCE(xoa, 0) = 0\n ) INTO v_matutruc_exists;\n\n IF NOT v_matutruc_exists THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Mã tủ trực: %s không tồn tại', p_matutruc)\n );\n END IF;\n\n SELECT EXISTS (\n SELECT 1\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND sohd = p_sohd\n AND mahh = p_mahh\n AND tutruc = p_matutruc\n AND COALESCE(xoa, 0) = 0\n ) INTO v_toatutruc_exists;\n\n IF NOT v_toatutruc_exists THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Toa tủ trực : %s không tồn tại', p_sohd)\n );\n END IF;\n\n v_code := to_char(NOW(), 'YYYYMMDD-HH24MISS') || '-' || UPPER(substring(md5(random()::text), 1, 4));\n\n SELECT Sum(toncuoi) AS toncuoi INTO sl_xuat_tutruc\n FROM\n ( SELECT Sum(soluong) AS toncuoi\n FROM CURRENT.pshdxn\n WHERE mahh = p_mahh\n AND makh = p_makh\n AND COALESCE(tutruc,'') = p_matutruc\n AND sohd = p_sohd\n AND loaixn = 'xbb'\n AND toatutruc IN (1,2)\n AND COALESCE(noitru,0) = 1\n AND COALESCE(xoa,0) = 0\n AND COALESCE(toacon, 0) = 0\n AND COALESCE(kyhieu,'')=''\n UNION\n SELECT Sum(-soluong) AS toncuoi\n FROM CURRENT.pshdxn\n WHERE mahh = p_mahh\n AND makh = p_makh\n AND COALESCE(tutruc,'') = p_matutruc\n AND sohdx = p_sohd\n AND loaixn = 'ttt'\n AND COALESCE(noitru,0) = 1\n AND COALESCE(xoa,0) = 0\n AND COALESCE(toacon, 0) = 0\n AND COALESCE(kyhieu,'')=''\n AND COALESCE(thanhtoan, '') = ''\n ) AS tam;\n \n IF p_soluong > sl_xuat_tutruc THEN\n \tRETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Số lượng trả lớn hơn số lượng xuất: trả %s, xuất %s', p_soluong,sl_xuat_tutruc)\n );\n END IF;\n FOR r_hd IN\n SELECT *, p_soluong as soluong_tra\n FROM current.pshdxn hd\n WHERE hd.mahh = p_mahh\n AND hd.sohd = p_sohd\n AND hd.mabn = p_mabn\n AND hd.makh = p_makh\n AND hd.tutruc = p_matutruc\n AND COALESCE(hd.xoa, 0) = 0\n LOOP\n IF COALESCE(r_hd.soluong, 0) > 0 THEN\n INSERT INTO current.pshdxn(\n sohd, sohdx, iddienbien, mabn, makh,\n mahh, ngayhd, ngaylap, giolap, madv,\n soluong, sang, trua, chieu, toi, lieu_dung, cachuong,\n giaban, giavat, giabhyt, thanhtien, thanhtienbhyt, bhyt,\n handung, solo, visa, thangkt, namkt,\n stt, loaixn, noitru, khole, toaxv,\n madt, khochan, theodon, tienvat, tenmay, loaitoa, thanhtoan, \n tutruc, dain, toatutruc\n )\n VALUES (\n v_code, r_hd.sohd, r_hd.iddienbien, r_hd.mabn, r_hd.makh,\n r_hd.mahh, r_hd.ngayhd, r_hd.ngaylap, now(), r_hd.madv,\n r_hd.soluong_tra, r_hd.sang, r_hd.trua, r_hd.chieu, r_hd.toi, r_hd.lieu_dung, r_hd.cachuong,\n r_hd.giaban, r_hd.giavat, r_hd.giabhyt, r_hd.thanhtien, r_hd.thanhtienbhyt, r_hd.bhyt,\n r_hd.handung, r_hd.solo, r_hd.visa, thangkt_S, namkt_S,\n r_hd.stt, 'ttt', r_hd.noitru, r_hd.khole, 0,\n r_hd.madt, r_hd.khochan, r_hd.theodon, r_hd.tienvat, r_hd.tenmay, r_hd.loaitoa, r_hd.thanhtoan,\n r_hd.tutruc, 1,1\n );\n\n UPDATE current.pstonkho\n SET nhap = COALESCE(nhap, 0) + COALESCE(r_hd.soluong_tra,0),\n toncuoi = COALESCE(toncuoi, 0) + COALESCE(r_hd.soluong_tra,0)\n WHERE COALESCE(mahh, '') = COALESCE(r_hd.mahh, '')\n AND COALESCE(giavat, 0) = COALESCE(r_hd.giavat, 0)\n AND COALESCE(madv, '') = COALESCE(r_hd.tutruc, '')\n AND COALESCE(handung, '') = COALESCE(r_hd.handung, '')\n AND COALESCE(thangkt, '') = COALESCE(thangkt_S, '')\n AND COALESCE(namkt, '') = COALESCE(namkt_S, '');\n\n tong_thanhtien := tong_thanhtien + COALESCE(r_hd.thanhtien, 0);\n tong_thanhtienbhyt := tong_thanhtienbhyt + COALESCE(r_hd.thanhtienbhyt, 0);\n tong_thanhtienvat := tong_thanhtienvat + COALESCE(r_hd.tienvat, 0);\n tong_tien_tra := tong_tien_tra + COALESCE(r_hd.giavat, 0) * COALESCE(r_hd.soluong_tra, 0);\n END IF;\n END LOOP;\n\n FOR r_ct IN\n SELECT *\n FROM current.chungtu ct\n WHERE ct.sohd = p_sohd\n AND ct.mabn = p_mabn\n AND ct.makh = p_makh\n AND ct.tutruc = p_matutruc\n AND COALESCE(ct.xoa, 0) = 0\n LOOP\n INSERT INTO current.chungtu(\n sohd, sohdx, iddienbien, mabn, makh, madt, madv,\n manv, ngayuong, ghichu, khole,\n ngayhd, ngaylap, giolap, thanhtien, thangkt, namkt,\n loaixn, noitru, taikhoan, maicd, kqcdoan, maicdp, kqcdoanp, api, thanhtoan, toaxv,\n khochan, tienvat, tenmay, taikham, loaitoa, mathe, thanhtienbhyt, mayhct, tenyhct,\n tutruc, dain, toatutruc\n )\n VALUES (\n v_code, r_ct.sohd, r_ct.iddienbien, r_ct.mabn, r_ct.makh, r_ct.madt, r_ct.madv,\n r_ct.manv, r_ct.ngayuong, r_ct.ghichu, r_ct.khole,\n r_ct.ngayhd, r_ct.ngaylap, now(), tong_thanhtien, thangkt_S, namkt_S,\n 'ttt', r_ct.noitru, r_ct.taikhoan, r_ct.maicd, r_ct.kqcdoan, r_ct.maicdp, r_ct.kqcdoanp, r_ct.api, r_ct.thanhtoan, r_ct.toaxv,\n r_ct.khochan, tong_thanhtienvat, r_ct.tenmay, r_ct.taikham, r_ct.loaitoa, r_ct.mathe, tong_thanhtienbhyt, r_ct.mayhct, r_ct.tenyhct,\n r_ct.tutruc, 1,1\n );\n END LOOP;\n\n RETURN jsonb_build_object(\n 'status', 'success',\n 'message', format('Thêm thành công chứng từ trả tủ trực %s, chứng từ mới: %s',p_matutruc, v_code)\n );\n ELSE --toa thường\n SELECT EXISTS (\n SELECT 1\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND sohd = p_sohd\n AND mahh = p_mahh\n AND COALESCE(xoa, 0) = 0\n AND COALESCE(dain, 0) = 1\n ) INTO v_dain_exists;\n\n \tIF v_dain_exists THEN\n\n v_code := to_char(NOW(), 'YYYYMMDD-HH24MISS') || '-' || UPPER(substring(md5(random()::text), 1, 4));\n\n SELECT SUM(CASE WHEN loaixn = 'xbb' AND COALESCE(dain,0) = 1 THEN soluong ELSE 0 END)\n - SUM(CASE WHEN loaixn = 'nkt' THEN soluong ELSE 0 END)\n INTO tong\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND mahh = p_mahh\n AND COALESCE(xoa, 0) = 0;\n\n IF tong <= 0 THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Thuốc/vật tư %s đã trả đủ số lượng, không thể trả thêm', p_mahh)\n );\n END IF;\n \n IF p_soluong > tong THEN\n RETURN jsonb_build_object(\n 'status', 'warning',\n 'message', format('Thuốc/vật tư %s, số lượng trả %s > số lượng còn lại %s, không đủ để trả', p_mahh,p_soluong,tong)\n );\n END IF;\n\n FOR r_hd IN\n SELECT *, p_soluong as soluong_tra\n FROM current.pshdxn hd\n WHERE hd.mahh = p_mahh\n AND hd.sohd = p_sohd\n AND hd.mabn = p_mabn\n AND hd.makh = p_makh\n AND COALESCE(hd.xoa, 0) = 0\n LOOP\n IF COALESCE(r_hd.soluong, 0) > 0 THEN\n INSERT INTO current.pshdxn(\n sohd, sohdx, iddienbien, mabn, makh,\n mahh, ngayhd, ngaylap, giolap, madv,\n soluong, sang, trua, chieu, toi, lieu_dung, cachuong,\n giaban, giavat, giabhyt, thanhtien, thanhtienbhyt, bhyt,\n handung, solo, visa, thangkt, namkt,\n stt, loaixn, noitru, khole, toaxv,\n madt, khochan, theodon, tienvat, tenmay, loaitoa, thanhtoan\n )\n VALUES (\n v_code, r_hd.sohd, r_hd.iddienbien, r_hd.mabn, r_hd.makh,\n r_hd.mahh, r_hd.ngayhd, r_hd.ngaylap, now(), r_hd.madv,\n r_hd.soluong_tra, r_hd.sang, r_hd.trua, r_hd.chieu, r_hd.toi, r_hd.lieu_dung, r_hd.cachuong,\n r_hd.giaban, r_hd.giavat, r_hd.giabhyt, r_hd.thanhtien, r_hd.thanhtienbhyt, r_hd.bhyt,\n r_hd.handung, r_hd.solo, r_hd.visa, thangkt_S, namkt_S,\n r_hd.stt, 'nkt', r_hd.noitru, r_hd.khole, 0,\n r_hd.madt, r_hd.khochan, r_hd.theodon, r_hd.tienvat, r_hd.tenmay, r_hd.loaitoa, r_hd.thanhtoan\n );\n\n UPDATE current.pstonkho\n SET tamnhap = COALESCE(tamnhap, 0) + COALESCE(r_hd.soluong_tra, 0)\n WHERE COALESCE(mahh, '') = COALESCE(r_hd.mahh, '')\n AND COALESCE(giavat, 0) = COALESCE(r_hd.giavat, 0)\n AND COALESCE(khocp, '') = COALESCE(r_hd.khole, '')\n AND COALESCE(handung, '') = COALESCE(r_hd.handung, '')\n AND COALESCE(thangkt, '') = COALESCE(thangkt_S, '')\n AND COALESCE(namkt, '') = COALESCE(namkt_S, '');\n\n tong_thanhtien := tong_thanhtien + COALESCE(r_hd.thanhtien, 0);\n tong_thanhtienbhyt := tong_thanhtienbhyt + COALESCE(r_hd.thanhtienbhyt, 0);\n tong_thanhtienvat := tong_thanhtienvat + COALESCE(r_hd.tienvat, 0);\n tong_tien_tra := tong_tien_tra + COALESCE(r_hd.giavat, 0) * COALESCE(r_hd.soluong_tra, 0);\n END IF;\n END LOOP;\n\n FOR r_ct IN\n SELECT *\n FROM current.chungtu ct\n WHERE ct.sohd = p_sohd\n AND ct.mabn = p_mabn\n AND ct.makh = p_makh\n AND COALESCE(ct.xoa, 0) = 0\n LOOP\n INSERT INTO current.chungtu(\n sohd, sohdx, iddienbien, mabn, makh, madt, madv,\n manv, ngayuong, ghichu, khole,\n ngayhd, ngaylap, giolap, thanhtien, thangkt, namkt,\n loaixn, noitru, taikhoan, maicd, kqcdoan, maicdp, kqcdoanp, api, thanhtoan, toaxv,\n khochan, tienvat, tenmay, taikham, loaitoa, mathe, thanhtienbhyt, mayhct, tenyhct\n )\n VALUES (\n v_code, r_ct.sohd, r_ct.iddienbien, r_ct.mabn, r_ct.makh, r_ct.madt, r_ct.madv,\n r_ct.manv, r_ct.ngayuong, r_ct.ghichu, r_ct.khole,\n r_ct.ngayhd, r_ct.ngaylap, now(), tong_thanhtien, thangkt_S, namkt_S,\n 'nkt', r_ct.noitru, r_ct.taikhoan, r_ct.maicd, r_ct.kqcdoan, r_ct.maicdp, r_ct.kqcdoanp, r_ct.api, r_ct.thanhtoan, r_ct.toaxv,\n r_ct.khochan, tong_thanhtienvat, r_ct.tenmay, r_ct.taikham, r_ct.loaitoa, r_ct.mathe, tong_thanhtienbhyt, r_ct.mayhct, r_ct.tenyhct\n );\n END LOOP;\n\n RETURN jsonb_build_object(\n 'status', 'success',\n 'message', format('Thêm thành công chứng từ trả %s', v_code)\n );\n\n ELSE -- Thuốc chưa tổng hợp ---cập nhật [08/09/2025]\n\t\tSELECT COUNT(DISTINCT mahh) INTO so_mahh\n FROM current.pshdxn\n WHERE mabn = p_mabn\n AND makh = p_makh\n AND sohd = p_sohd\n AND COALESCE(xoa,0) = 0\n AND COALESCE(dain,0) = 0;\n\n FOR r_hd IN\n SELECT *, p_soluong as soluong_tra\n FROM current.pshdxn hd\n WHERE hd.mahh = p_mahh\n AND hd.sohd = p_sohd\n AND hd.mabn = p_mabn\n AND hd.makh = p_makh\n AND hd.soluong >= p_soluong --[VUONG] them theo yeu cầu\n AND COALESCE(hd.xoa, 0) = 0\n AND COALESCE(hd.dain, 0) = 0\n LOOP\n RAISE NOTICE 'soluong_tra: %',\n p_soluong;\n IF COALESCE(r_hd.soluong_tra, 0) > 0 THEN --soluong --\x3e soluong_tra\n IF COALESCE(r_hd.soluong_tra, 0) = COALESCE(r_hd.soluong, 0) THEN\n RAISE NOTICE 'soluong=nhau --\x3exóa: %',\n r_hd.soluong;\n UPDATE CURRENT.pshdxn SET xoa = 1, ngayxoa = NOW()\n WHERE mahh = p_mahh\n AND sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh\n AND soluong = r_hd.soluong_tra;\n ELSE --So luong tra < soluong\n RAISE NOTICE 'soluong > hơn --\x3egiảm: %', r_hd.soluong;\n UPDATE CURRENT.pshdxn SET\n \tsang = sang - p_sang,\n trua = trua - p_trua,\n chieu = chieu - p_chieu,\n toi = toi - p_toi,\n soluong = soluong - r_hd.soluong_tra,\n thanhtien = (r_hd.soluong - r_hd.soluong_tra) * r_hd.giavat,\n thanhtienbhyt = (r_hd.soluong - r_hd.soluong_tra) * r_hd.giavat\n WHERE mahh = p_mahh\n AND sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh\n AND soluong > r_hd.soluong_tra;\n END IF;\n\n RAISE NOTICE 'Cập nhật tồn kho, chưa tổng hợp: %', r_hd.soluong_tra;\n UPDATE current.pstonkho\n SET tamxuat = COALESCE(tamxuat, 0) - COALESCE(r_hd.soluong_tra, 0)\n WHERE COALESCE(mahh, '') = COALESCE(r_hd.mahh, '')\n AND COALESCE(giavat, 0) = COALESCE(r_hd.giavat, 0)\n AND COALESCE(khocp, '') = COALESCE(r_hd.khole, '')\n AND COALESCE(handung, '') = COALESCE(r_hd.handung, '')\n AND COALESCE(thangkt, '') = COALESCE(thangkt_S, '')\n AND COALESCE(namkt, '') = COALESCE(namkt_S, '');\n\n tong_thanhtien := tong_thanhtien + COALESCE(r_hd.thanhtien, 0);\n tong_thanhtienbhyt := tong_thanhtienbhyt + COALESCE(r_hd.thanhtienbhyt, 0);\n tong_thanhtienvat := tong_thanhtienvat + COALESCE(r_hd.tienvat, 0);\n tong_tien_tra := tong_tien_tra + COALESCE(r_hd.giavat, 0) * COALESCE(r_hd.soluong_tra, 0);\n\n RAISE NOTICE 'tong_thanhtien: %', tong_thanhtien;\n RAISE NOTICE 'tong_thanhtienbhyt: %', tong_thanhtienbhyt;\n RAISE NOTICE 'tong_thanhtienvat: %', tong_thanhtienvat;\n RAISE NOTICE 'tong_tien_tra: %', tong_tien_tra;\n END IF;\n END LOOP;\n\n FOR r_ct IN\n SELECT *\n FROM current.chungtu ct\n WHERE ct.sohd = p_sohd\n AND ct.mabn = p_mabn\n AND ct.makh = p_makh\n AND COALESCE(ct.xoa, 0) = 0\n LOOP\n IF so_mahh = 1 THEN --xóa chưng từ\n RAISE NOTICE 'Tổng tiền chứng từ %', r_ct.thanhtien;\n IF r_ct.thanhtien = tong_tien_tra THEN\n RAISE NOTICE 'Xoa chứng từ %', r_ct.sohd;\n UPDATE CURRENT.chungtu SET xoa = 1, ngayxoa = NOW()\n WHERE sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh;\n ELSE\n RAISE NOTICE 'Cập nhật chứng từ %', r_ct.sohd;\n \tUPDATE CURRENT.chungtu SET\n thanhtien = thanhtien - tong_tien_tra,\n tienvat = tienvat - tong_tien_tra,\n thanhtienbhyt = thanhtienbhyt - tong_tien_tra\n WHERE sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh;\n END IF;\n ELSE -- cập nhật chứng từ theo tiền còn lại lại\n RAISE NOTICE 'Cập nhật chứng từ, còn lại %', r_ct.sohd;\n \tUPDATE CURRENT.chungtu SET\n \tthanhtien = thanhtien - tong_tien_tra,\n tienvat = tienvat - tong_tien_tra,\n thanhtienbhyt = thanhtienbhyt - tong_tien_tra\n WHERE sohd = p_sohd\n AND mabn = p_mabn\n AND makh = p_makh;\n\n END IF;\n\n END LOOP;\n\n RETURN jsonb_build_object(\n 'status', 'success',\n 'message', format('Cập nhật thành công chứng từ trả %s', p_sohd)\n );\n END IF;\n END IF; \n\nEXCEPTION\n WHEN OTHERS THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', SQLERRM\n );\nEND;\n$$ LANGUAGE plpgsql;\n\n\n"
|
4548
4548
|
},
|
4549
4549
|
"badt_dhs.getCUTPParaClinRequest": {
|
4550
4550
|
name: "badt_dhs.getCUTPParaClinRequest",
|
@@ -4604,7 +4604,7 @@
|
|
4604
4604
|
name: "badt_dhs.InsertDiagnose",
|
4605
4605
|
para: ["p_json"],
|
4606
4606
|
returns: "JSONB",
|
4607
|
-
codesql: "\n\n\nCREATE OR REPLACE FUNCTION badt_dhs.InsertDiagnose(p_json JSONB)\nRETURNS JSONB AS\n$$\nDECLARE\n-- Lastest commit: author:onghaup; date: 2025-09-18 08:25:07\n-- Thực hiện: NGUYỄN QUỐC HOÀ - 2025-05-22\n-- Hàm: badt_dhs.badt_dhs.InsertDiagnose(p_json JSONB)\n-- Mô tả: Nhận dữ liệu Json thêm vào dữ liệu\n-- Bổ sung so với file mẫu:\n-- \"NGAYTH\"\n-- \"MAKB\"\n-- \"MABA\"\n-- \"MA_BSDOC\"\n-- \"MABSDT\"\n-- \"MAKP\"\n-- \"MAPHONG\"\n-- Chưa rõ thông tin :\n-- \"NGAY_CD\" và \"NGAYCD\" => Chưa rõ ngày chỉ định hay ngày chẩn đoán\n-- ===============================================================\n-- Lấy dữ liệu từ JSON\n-- Tham số hệ thống\n--[ÔNG TRIỆU HẬU: 2025-09-18] Kiểm tra trạng thái ra viện\n-- Bước 1: Kiểm tra tồn tại trong chidinhcls\n-- Bước 2: Kiểm tra nhân viên thực hiện\n-- Bước 3: Kiểm tra nhân viên trả kết quả\n-- Bước 4: Kiểm tra mã máy thực hiện\n-- Bước 5: Lấy tham số thời gian từ bảng system\n-- Kiểm tra khoảng thời gian thực hiện y lệnh\n-- Kiểm tra khoảng thời gian trả kết quả\n-- Kiểm tra tồn tại dòng trong pskhamha\n-- Cập nhật\n v_iddienbien TEXT := p_json->>'TPCode';\n v_idchidinh TEXT := p_json->>'ParaClinReqCode';\n v_mabn TEXT := p_json->>'PatientCode';\n v_makb TEXT := p_json->>'AdmissionCode';\n v_maba TEXT := p_json->>'MedicalRecordNo';\n v_macls TEXT := p_json->>'MedSerCode';\n v_ngaycd TIMESTAMP := (p_json->>'NgayChiDinh')::TIMESTAMP;\n v_ngayth TIMESTAMP := (p_json->>'NgayThucHien')::TIMESTAMP;\n v_ngaykq TIMESTAMP := (p_json->>'NgayKetQua')::TIMESTAMP;\n v_madv\t\t TEXT \t := p_json->>'MaDonViThucHien';\n v_phong\t\t TEXT \t := p_json->>'MaPhongThucHien';\n\n v_manv_thuchien TEXT := p_json->>'MaNhanVienThucHien';\n v_manv_ketqua TEXT := p_json->>'MaNhanVienTraKQ';\n v_mamay TEXT := p_json->>'MaMayThucHien';\n \n v_ketluan TEXT := p_json->>'KetLuan';\n v_mota \tTEXT := p_json->>'MoTa';\n v_ghicchu \tTEXT := p_json->>'GhiChu';\n v_filepath TEXT := (\n SELECT value\n FROM jsonb_each_text(p_json)\n WHERE upper(key) = 'FILEPATH' \n\t);\n\n v_chidinhcls RECORD;\n v_exists_nv_thuchien INT;\n v_exists_nv_ketqua INT;\n v_exists_mamay INT;\n v_exists_pskhamha\t INT;\n\n v_sophuttoithieu INT;\n v_sophuttraketqua INT;\n \n cchn_thuchien \tTEXT;\n tk_thuchien \tTEXT;\n tk_traketqua \tTEXT;\n\n v_checktgthuchien NUMERIC; \n v_checktgketqua NUMERIC; \n \n cd_thangkt\t\tTEXT;\n cd_namkt\t\tTEXT;\n v_ngaycd_lui1thang TIMESTAMP := v_ngaycd - INTERVAL '1 month';\n \nBEGIN\n\n IF NOT EXISTS ( SELECT 1 FROM current.bnnoitru\n WHERE mabn = v_mabn AND makb = v_makb AND maba = v_maba AND COALESCE(ravien,0) = 0\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('Mabn: %L, Makb: %L, Maba: %L không tồn tại trong HIS (phải còn đang điều trị)', \n v_mabn, v_makb, v_maba)\n );\n END IF;\n\n SELECT ngaykcb, thangkt, namkt, dath, dathu, dalappttt\n INTO v_chidinhcls\n FROM current.chidinhcls\n WHERE xoa = 0\n AND macls = v_macls\n AND iddienbien = v_iddienbien\n AND idchidinh = v_idchidinh\n AND ngaykcb = v_ngaycd\n AND (namkt||thangkt) >= to_char(v_ngaycd_lui1thang,'YYYYMM')\n LIMIT 1;\n\n IF NOT FOUND THEN\n RETURN jsonb_build_object(\n 'success', false,\n 'message', format(\n 'Không tìm thấy chỉ định với macls=%s, iddienbien=%s, idchidinh=%s, ngaykcb=%s',\n v_macls, v_iddienbien, v_idchidinh, v_ngaycd\n )\n );\n END IF;\n\n SELECT COUNT(*) INTO v_exists_nv_thuchien\n FROM current.dmnhanvien\n WHERE manv = v_manv_thuchien\n AND COALESCE(macc_hanhnghe_cv2348,'') != ''\n AND COALESCE(trangthai,'0') = '1';\n\n IF v_exists_nv_thuchien = 0 THEN\n RETURN jsonb_build_object(\n 'success', false,\n 'message', format(\n 'Nhân viên %s không có chứng chỉ hành nghề hoặc đã nghỉ việc',\n v_manv_thuchien\n )\n );\n END IF;\n\n SELECT COUNT(*) INTO v_exists_nv_ketqua\n FROM current.dmnhanvien\n WHERE manv = v_manv_ketqua\n AND COALESCE(macc_hanhnghe_cv2348,'') != ''\n AND COALESCE(trangthai,'0') = '1';\n\n IF v_exists_nv_ketqua = 0 THEN\n RETURN jsonb_build_object(\n 'success', false,\n 'message', format(\n 'Nhân viên %s không có chứng chỉ hành nghề hoặc đã nghỉ việc',\n v_manv_ketqua\n )\n );\n END IF;\n\n SELECT COUNT(*) INTO v_exists_mamay\n FROM current.dmmamay\n WHERE mamay = v_mamay;\n\n IF v_exists_mamay = 0 THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', format(\n 'Không tìm thấy mã máy thực hiện: %s',\n v_mamay\n )\n );\n END IF;\n\n SELECT CAST(giatri AS INT) INTO v_sophuttoithieu\n FROM current.system\n WHERE tents = 'ha.sophuttoithieu';\n\n SELECT CAST(giatri AS INT) INTO v_sophuttraketqua\n FROM current.system\n WHERE tents = 'ha.sophuttraketqua';\n\n v_checktgthuchien := EXTRACT(EPOCH FROM (v_ngayth - v_ngaycd)) / 60.0;\n IF v_checktgthuchien <= v_sophuttoithieu THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', format(\n 'Thời gian thực hiện y lệnh phải tối thiểu %s phút đối với thời gian chỉ định',\n v_sophuttoithieu\n )\n );\n END IF;\n\n v_checktgketqua := EXTRACT(EPOCH FROM (v_ngaykq - v_ngayth)) / 60.0;\n IF v_checktgketqua <= v_sophuttraketqua THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', format(\n 'Thời gian trả kết quả phải tối thiểu %s phút kể từ thời gian thực hiện',\n v_sophuttraketqua\n )\n );\n END IF;\n \n SELECT taikhoan, macc_hanhnghe_cv2348\n INTO tk_thuchien, cchn_thuchien\n FROM current.dmnhanvien\n WHERE manv = v_manv_thuchien; \n \n SELECT taikhoan\n INTO tk_traketqua\n FROM current.dmnhanvien\n WHERE manv = v_manv_ketqua; \n\n SELECT COUNT(*) INTO v_exists_pskhamha\n FROM current.pskhamha\n WHERE mabn = v_mabn\n AND makb = v_makb\n AND maba = v_maba\n AND macls = v_macls\n AND ngaykcb = v_ngaycd;\n\n IF v_exists_pskhamha > 0 THEN\n UPDATE current.pskhamha\n SET\n tenmay = 'EMR',\n taikhoan = 'EMR',\n taikhoan_traketqua = tk_thuchien,\n manv = v_manv_ketqua,\n madv = v_madv,\n maphong = v_phong,\n ngaycd = v_ngaykq::TIMESTAMP,\n mamay = v_mamay,\n ketluan_plaintext = v_ketluan,\n mota_text = v_mota,\n ghichu = v_mota, \n filepath = v_filepath\n WHERE\n mabn = v_mabn\n AND makb = v_makb\n AND maba = v_maba\n AND macls = v_macls\n AND ngaykcb = v_ngaycd;\n ELSE\n INSERT INTO current.pskhamha (\n mabn, makb, maba, macls, tenmay,\n taikhoan, manv, madv, maphong, ngaykcb, soluong,\n ngaycd, mamay,ketluan, ketluan_plaintext, mota_text, ghichu,\n dakhoa, mabl, thangkt, namkt, phienban,\n taikhoan_traketqua, hinhthuctraketqua, api, filepath\n )\n VALUES (\n v_mabn, v_makb, v_maba, v_macls, 'EMR',\n tk_thuchien, v_manv_ketqua, v_madv, v_phong, v_ngaycd::TIMESTAMP, 1,\n v_ngaykq::TIMESTAMP, v_mamay,v_ketluan, v_ketluan, v_mota, v_mota, 1, '',\n to_char(v_ngaykq::date,'MM'),to_char(v_ngaykq::date,'YYYY'), 'EMR.API',\n tk_traketqua,0, 1, v_filepath\n );\n END IF;\n\n UPDATE current.chidinhcls\n SET dath = 1,\n giolaymau = v_ngayth::TIMESTAMP,\n ngaykq = v_ngaykq::TIMESTAMP,\n nguoi_thuc_hien = cchn_thuchien\n WHERE mabn = v_mabn\n AND makb = v_makb\n AND COALESCE(maba,'') = COALESCE(v_maba,'')\n AND macls = v_macls\n AND ngaykcb = v_ngaycd::TIMESTAMP\n AND thangkt = v_chidinhcls.thangkt\n AND namkt = v_chidinhcls.namkt\n AND COALESCE(xoa, 0) = 0;\n\n RETURN jsonb_build_object(\n 'status', 'success',\n 'message', 'OK' \n );\n\n EXCEPTION\n WHEN OTHERS THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', 'Lỗi xử lý: ' || SQLERRM\n );\nEND;\n$$ LANGUAGE plpgsql;\n\n\n\n"
|
4607
|
+
codesql: "\n\n\nCREATE OR REPLACE FUNCTION badt_dhs.InsertDiagnose(p_json JSONB)\nRETURNS JSONB AS\n$$\nDECLARE\n-- Lastest commit: author:onghaup; date: 2025-09-25 15:48:37\n-- Thực hiện: NGUYỄN QUỐC HOÀ - 2025-05-22\n-- Hàm: badt_dhs.badt_dhs.InsertDiagnose(p_json JSONB)\n-- Mô tả: Nhận dữ liệu Json thêm vào dữ liệu\n-- Bổ sung so với file mẫu:\n-- \"NGAYTH\"\n-- \"MAKB\"\n-- \"MABA\"\n-- \"MA_BSDOC\"\n-- \"MABSDT\"\n-- \"MAKP\"\n-- \"MAPHONG\"\n-- Chưa rõ thông tin :\n-- \"NGAY_CD\" và \"NGAYCD\" => Chưa rõ ngày chỉ định hay ngày chẩn đoán\n-- ===============================================================\n-- Lấy dữ liệu từ JSON\n-- Tham số hệ thống\n--[ÔNG TRIỆU HẬU: 2025-09-18] Kiểm tra trạng thái ra viện\n--[ÔNG TRIỆU HẬU: 2025-09-25] Kiểm tra trạng thái ra viện, không kiểm tra nếu ngoại trú\n-- Bước 1: Kiểm tra tồn tại trong chidinhcls\n-- Bước 2: Kiểm tra nhân viên thực hiện\n-- Bước 3: Kiểm tra nhân viên trả kết quả\n-- Bước 4: Kiểm tra mã máy thực hiện\n-- Bước 5: Lấy tham số thời gian từ bảng system\n-- Kiểm tra khoảng thời gian thực hiện y lệnh\n-- Kiểm tra khoảng thời gian trả kết quả\n-- Kiểm tra tồn tại dòng trong pskhamha\n-- Cập nhật\n-- Lấy giá trị IMAGE{i}\n-- Tạo tên file\n v_iddienbien TEXT := p_json->>'TPCode';\n v_idchidinh TEXT := p_json->>'ParaClinReqCode';\n v_mabn TEXT := p_json->>'PatientCode';\n v_makb TEXT := p_json->>'AdmissionCode';\n v_maba TEXT := p_json->>'MedicalRecordNo';\n v_macls TEXT := p_json->>'MedSerCode';\n v_ngaycd TIMESTAMP := (p_json->>'NgayChiDinh')::TIMESTAMP;\n v_ngayth TIMESTAMP := (p_json->>'NgayThucHien')::TIMESTAMP;\n v_ngaykq TIMESTAMP := (p_json->>'NgayKetQua')::TIMESTAMP;\n v_madv\t\t TEXT \t := p_json->>'MaDonViThucHien';\n v_phong\t\t TEXT \t := p_json->>'MaPhongThucHien';\n\n v_manv_thuchien TEXT := p_json->>'MaNhanVienThucHien';\n v_manv_ketqua TEXT := p_json->>'MaNhanVienTraKQ';\n v_mamay TEXT := p_json->>'MaMayThucHien';\n \n v_ketluan TEXT := p_json->>'KetLuan';\n v_mota \tTEXT := p_json->>'MoTa';\n v_ghicchu \tTEXT := p_json->>'GhiChu';\n v_filepath TEXT := (\n SELECT value\n FROM jsonb_each_text(p_json)\n WHERE upper(key) = 'FILEPATH' \n\t);\n\n v_chidinhcls RECORD;\n v_exists_nv_thuchien INT;\n v_exists_nv_ketqua INT;\n v_exists_mamay INT;\n v_exists_pskhamha\t INT;\n\n v_sophuttoithieu INT;\n v_sophuttraketqua INT;\n \n cchn_thuchien \tTEXT;\n tk_thuchien \tTEXT;\n tk_traketqua \tTEXT;\n\n v_checktgthuchien NUMERIC; \n v_checktgketqua NUMERIC; \n \n cd_thangkt\t\tTEXT;\n cd_namkt\t\tTEXT;\n v_ngaycd_lui1thang TIMESTAMP := v_ngaycd - INTERVAL '1 month';\n \nBEGIN\n\n IF COALESCE(v_maba,'')<>'' THEN\n IF NOT EXISTS ( SELECT 1 FROM current.bnnoitru\n WHERE mabn = v_mabn AND makb = v_makb AND maba = v_maba AND COALESCE(ravien,0) = 0\n ) THEN\n RETURN jsonb_build_object('status', 'error', 'message', \n format('Mabn: %L, Makb: %L, Maba: %L không tồn tại trong HIS (phải còn đang điều trị)', \n v_mabn, v_makb, v_maba)\n );\n END IF;\n END IF;\n \n\n SELECT ngaykcb, thangkt, namkt, dath, dathu, dalappttt\n INTO v_chidinhcls\n FROM current.chidinhcls\n WHERE xoa = 0\n AND macls = v_macls\n AND iddienbien = v_iddienbien\n AND idchidinh = v_idchidinh\n AND ngaykcb = v_ngaycd\n AND (namkt||thangkt) >= to_char(v_ngaycd_lui1thang,'YYYYMM')\n LIMIT 1;\n\n IF NOT FOUND THEN\n RETURN jsonb_build_object(\n 'success', false,\n 'message', format(\n 'Không tìm thấy chỉ định với macls=%s, iddienbien=%s, idchidinh=%s, ngaykcb=%s',\n v_macls, v_iddienbien, v_idchidinh, v_ngaycd\n )\n );\n END IF;\n\n SELECT COUNT(*) INTO v_exists_nv_thuchien\n FROM current.dmnhanvien\n WHERE manv = v_manv_thuchien\n AND COALESCE(macc_hanhnghe_cv2348,'') != ''\n AND COALESCE(trangthai,'0') = '1';\n\n IF v_exists_nv_thuchien = 0 THEN\n RETURN jsonb_build_object(\n 'success', false,\n 'message', format(\n 'Nhân viên %s không có chứng chỉ hành nghề hoặc đã nghỉ việc',\n v_manv_thuchien\n )\n );\n END IF;\n\n SELECT COUNT(*) INTO v_exists_nv_ketqua\n FROM current.dmnhanvien\n WHERE manv = v_manv_ketqua\n AND COALESCE(macc_hanhnghe_cv2348,'') != ''\n AND COALESCE(trangthai,'0') = '1';\n\n IF v_exists_nv_ketqua = 0 THEN\n RETURN jsonb_build_object(\n 'success', false,\n 'message', format(\n 'Nhân viên %s không có chứng chỉ hành nghề hoặc đã nghỉ việc',\n v_manv_ketqua\n )\n );\n END IF;\n\n SELECT COUNT(*) INTO v_exists_mamay\n FROM current.dmmamay\n WHERE mamay = v_mamay;\n\n IF v_exists_mamay = 0 THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', format(\n 'Không tìm thấy mã máy thực hiện: %s',\n v_mamay\n )\n );\n END IF;\n\n SELECT CAST(giatri AS INT) INTO v_sophuttoithieu\n FROM current.system\n WHERE tents = 'ha.sophuttoithieu';\n\n SELECT CAST(giatri AS INT) INTO v_sophuttraketqua\n FROM current.system\n WHERE tents = 'ha.sophuttraketqua';\n\n v_checktgthuchien := EXTRACT(EPOCH FROM (v_ngayth - v_ngaycd)) / 60.0;\n IF v_checktgthuchien <= v_sophuttoithieu THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', format(\n 'Thời gian thực hiện y lệnh phải tối thiểu %s phút đối với thời gian chỉ định',\n v_sophuttoithieu\n )\n );\n END IF;\n\n v_checktgketqua := EXTRACT(EPOCH FROM (v_ngaykq - v_ngayth)) / 60.0;\n IF v_checktgketqua <= v_sophuttraketqua THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', format(\n 'Thời gian trả kết quả phải tối thiểu %s phút kể từ thời gian thực hiện',\n v_sophuttraketqua\n )\n );\n END IF;\n \n SELECT taikhoan, macc_hanhnghe_cv2348\n INTO tk_thuchien, cchn_thuchien\n FROM current.dmnhanvien\n WHERE manv = v_manv_thuchien; \n \n SELECT taikhoan\n INTO tk_traketqua\n FROM current.dmnhanvien\n WHERE manv = v_manv_ketqua; \n\n SELECT COUNT(*) INTO v_exists_pskhamha\n FROM current.pskhamha\n WHERE mabn = v_mabn\n AND makb = v_makb\n AND maba = v_maba\n AND macls = v_macls\n AND ngaykcb = v_ngaycd;\n\n IF v_exists_pskhamha > 0 THEN\n UPDATE current.pskhamha\n SET\n tenmay = 'EMR',\n taikhoan = 'EMR',\n taikhoan_traketqua = tk_thuchien,\n manv = v_manv_ketqua,\n madv = v_madv,\n maphong = v_phong,\n ngaycd = v_ngaykq::TIMESTAMP,\n mamay = v_mamay,\n ketluan_plaintext = v_ketluan,\n mota_text = v_mota,\n ghichu = v_mota, \n filepath = v_filepath\n WHERE\n mabn = v_mabn\n AND makb = v_makb\n AND maba = v_maba\n AND macls = v_macls\n AND ngaykcb = v_ngaycd;\n ELSE\n INSERT INTO current.pskhamha (\n mabn, makb, maba, macls, tenmay,\n taikhoan, manv, madv, maphong, ngaykcb, soluong,\n ngaycd, mamay,ketluan, ketluan_plaintext, mota_text, ghichu,\n dakhoa, mabl, thangkt, namkt, phienban,\n taikhoan_traketqua, hinhthuctraketqua, api, filepath\n )\n VALUES (\n v_mabn, v_makb, v_maba, v_macls, 'EMR',\n tk_thuchien, v_manv_ketqua, v_madv, v_phong, v_ngaycd::TIMESTAMP, 1,\n v_ngaykq::TIMESTAMP, v_mamay,v_ketluan, v_ketluan, v_mota, v_mota, 1, '',\n to_char(v_ngaykq::date,'MM'),to_char(v_ngaykq::date,'YYYY'), 'EMR.API',\n tk_traketqua,0, 1, v_filepath\n );\n END IF;\n\n UPDATE current.chidinhcls\n SET dath = 1,\n giolaymau = v_ngayth::TIMESTAMP,\n ngaykq = v_ngaykq::TIMESTAMP,\n nguoi_thuc_hien = cchn_thuchien\n WHERE mabn = v_mabn\n AND makb = v_makb\n AND COALESCE(maba,'') = COALESCE(v_maba,'')\n AND macls = v_macls\n AND ngaykcb = v_ngaycd::TIMESTAMP\n AND thangkt = v_chidinhcls.thangkt\n AND namkt = v_chidinhcls.namkt\n AND COALESCE(xoa, 0) = 0;\n \n DELETE FROM current.pshinhanh\n WHERE mabn = v_mabn\n AND makb = v_makb\n AND macls = v_macls\n AND ngaykcb = v_ngaycd;\n \n DECLARE\n i INT := 1;\n v_image_key TEXT;\n v_mota_key TEXT;\n v_image_val TEXT;\n v_mota_val TEXT;\n v_hinhanh TEXT;\n v_ngaycd_str TEXT := to_char(v_ngaycd, 'DDMMYYYY_HH24MISS');\n BEGIN\n LOOP\n v_image_key := format('IMAGE%s', i);\n v_mota_key := format('MOTA_IMAGE%s', i);\n\n v_image_val := p_json ->> v_image_key;\n EXIT WHEN v_image_val IS NULL; -- không còn IMAGE{i} thì dừng vòng lặp\n\n IF v_image_val <> '' THEN\n v_mota_val := COALESCE(p_json ->> v_mota_key, '');\n\n v_hinhanh := format('%s_%s_%s_%s_%s.jpg',\n v_mabn, v_makb, v_macls,\n v_ngaycd_str, i);\n\n INSERT INTO current.pshinhanh (\n mabn, makb, maba, ngaykcb, macls, stt,\n mota, hinhanh, thangkt, namkt, ngaycd, chon\n )\n VALUES (\n v_mabn, v_makb, '', v_ngaycd, v_macls, i,\n v_mota_val, v_hinhanh, v_chidinhcls.thangkt, v_chidinhcls.namkt,\n v_ngaykq, 1\n );\n END IF;\n\n i := i + 1;\n END LOOP;\n END;\n\n RETURN jsonb_build_object(\n 'status', 'success',\n 'message', 'OK' \n );\n\n EXCEPTION\n WHEN OTHERS THEN\n RETURN jsonb_build_object(\n 'status', 'error',\n 'message', 'Lỗi xử lý: ' || SQLERRM\n );\nEND;\n$$ LANGUAGE plpgsql;\n\n\n\n\n"
|
4608
4608
|
},
|
4609
4609
|
"badt_dhs.IsCancelCUTPParaClinRequest": {
|
4610
4610
|
name: "badt_dhs.IsCancelCUTPParaClinRequest",
|
@@ -32083,4 +32083,4 @@
|
|
32083
32083
|
})
|
32084
32084
|
}, t.nmd = e => (e.paths = [], e.children || (e.children = []), e);
|
32085
32085
|
t(t.s = 1402)
|
32086
|
-
})();/*! [dist-pg-services.js]; ===WEBPACK BUILD: 1.25.
|
32086
|
+
})();/*! [dist-pg-services.js]; ===WEBPACK BUILD: 1.25.0926.1416=== */
|