diff --git a/openhis-ui-vue3/package.json b/openhis-ui-vue3/package.json index 4f4dc7e9..f3bd0572 100644 --- a/openhis-ui-vue3/package.json +++ b/openhis-ui-vue3/package.json @@ -1,6 +1,6 @@ { "name": "openhis", - "version": "3.8.8", + "version": "3.8.9", "description": "OpenHIS管理系统", "author": "OpenHIS", "license": "MIT", diff --git a/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/batchTransfer/index.vue b/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/batchTransfer/index.vue index 6d49536c..48ef7db3 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/batchTransfer/index.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/batchTransfer/index.vue @@ -516,6 +516,7 @@ import { getPharmacyList, getTransferProductDetail, getTransferProductDetails, + getWarehouseList, productTransferApproved, reject, submitApproval, @@ -775,6 +776,17 @@ function handleChangePurposeTypeEnum(value, type) { }).catch(error => { console.error('Error fetching dispensary list:', error); }); + } else if (value == 17) { + // 耗材库类型 + getWarehouseList().then((res) => { + purposeTypeListOptions.value = res.data; + if (!route.query.supplyBusNo && !type) { + receiptHeaderForm.purposeLocationId = ''; + receiptHeaderForm.purposeLocationId1 = ''; + } + }).catch(error => { + console.error('Error fetching warehouse list:', error); + }); } else { purposeTypeListOptions.value = []; } @@ -801,6 +813,17 @@ function handleChangeSourceTypeEnum(value, type) { }).catch(error => { console.error('Error fetching dispensary list:', error); }); + } else if (value == 17) { + // 耗材库类型 + getWarehouseList().then((res) => { + sourceTypeListOptions.value = res.data; + if (!route.query.supplyBusNo && !type) { + receiptHeaderForm.sourceLocationId = ''; + receiptHeaderForm.sourceLocationId1 = ''; + } + }).catch(error => { + console.error('Error fetching warehouse list:', error); + }); } else { sourceTypeListOptions.value = []; } diff --git a/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/components/transferManagement.js b/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/components/transferManagement.js index 91c09954..dab5643a 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/components/transferManagement.js +++ b/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/components/transferManagement.js @@ -123,6 +123,14 @@ export function getDispensaryList() { method: 'get', }) } + +// 获取耗材库列表 +export function getWarehouseList() { + return request({ + url: '/app-common/warehouse-list', + method: 'get', + }) +} // 获取仓库药房列表 export function getpharmacyCabinetList() { return request({ diff --git a/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/transferManagent/index.vue b/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/transferManagent/index.vue index 5814de61..aa90fae9 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/transferManagent/index.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/transferManagent/index.vue @@ -616,6 +616,7 @@ import { getInit, getPharmacyList, getTransferProductDetail, + getWarehouseList, productTransferApproved, reject, submitApproval, @@ -1148,6 +1149,15 @@ function handleChangePurposeTypeEnum(value, type) { receiptHeaderForm.purposeLocationId1 = ''; } }); + } else if (value == 17) { + // 耗材库类型 + getWarehouseList().then((res) => { + purposeTypeListOptions.value = res.data; + if (!route.query.supplyBusNo && !type) { + receiptHeaderForm.purposeLocationId = ''; + receiptHeaderForm.purposeLocationId1 = ''; + } + }); } } @@ -1169,6 +1179,15 @@ function handleChangeSourceTypeEnum(value, type) { receiptHeaderForm.sourceLocationId1 = ''; } }); + } else if (value == 17) { + // 耗材库类型 + getWarehouseList().then((res) => { + sourceTypeListOptions.value = res.data; + if (!route.query.supplyBusNo && !type) { + receiptHeaderForm.sourceLocationId = ''; + receiptHeaderForm.sourceLocationId1 = ''; + } + }); } } diff --git a/sql/create_lab_observation_table.sql b/sql/create_lab_observation_table.sql new file mode 100644 index 00000000..2a21e497 --- /dev/null +++ b/sql/create_lab_observation_table.sql @@ -0,0 +1,62 @@ +-- ============================================= +-- 创建 lab_observation 表 +-- 用途: 实验室观察记录表 +-- 创建时间: 2026-03-09 +-- ============================================= + +-- 删除已存在的表(如果存在) +DROP TABLE IF EXISTS lab_observation; + +-- 创建序列(如果不存在) +DROP SEQUENCE IF EXISTS lab_observation_id_seq; +CREATE SEQUENCE lab_observation_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +-- 创建表 +CREATE TABLE lab_observation ( + id BIGINT PRIMARY KEY DEFAULT nextval('lab_observation_id_seq'), + patient_id BIGINT, + encounter_id BIGINT, + specimen_id BIGINT, + observation_definition_id BIGINT, + observation_result TEXT, + observation_date TIMESTAMP, + technician_id BIGINT, + delete_flag VARCHAR(1) DEFAULT '0', + create_by VARCHAR(64) DEFAULT '', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_by VARCHAR(64) DEFAULT '', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + remark VARCHAR(500) +); + +-- 添加表注释 +COMMENT ON TABLE lab_observation IS '实验室观察记录表'; + +-- 添加字段注释 +COMMENT ON COLUMN lab_observation.id IS '观察记录的唯一标识符'; +COMMENT ON COLUMN lab_observation.patient_id IS '患者ID'; +COMMENT ON COLUMN lab_observation.encounter_id IS '就诊ID'; +COMMENT ON COLUMN lab_observation.specimen_id IS '关联的样本ID'; +COMMENT ON COLUMN lab_observation.observation_definition_id IS '观察定义ID'; +COMMENT ON COLUMN lab_observation.observation_result IS '观察结果,可能是文本描述或数值'; +COMMENT ON COLUMN lab_observation.observation_date IS '观察的日期和时间'; +COMMENT ON COLUMN lab_observation.technician_id IS '执行观察的技术员ID'; +COMMENT ON COLUMN lab_observation.delete_flag IS '删除状态,0-未删除,1-已删除'; +COMMENT ON COLUMN lab_observation.create_by IS '创建者'; +COMMENT ON COLUMN lab_observation.create_time IS '创建时间'; +COMMENT ON COLUMN lab_observation.update_by IS '更新者'; +COMMENT ON COLUMN lab_observation.update_time IS '更新时间'; +COMMENT ON COLUMN lab_observation.remark IS '备注'; + +-- 创建索引 +CREATE INDEX idx_lab_observation_patient_id ON lab_observation(patient_id); +CREATE INDEX idx_lab_observation_specimen_id ON lab_observation(specimen_id); +CREATE INDEX idx_lab_observation_observation_date ON lab_observation(observation_date); + +-- 打印完成信息 +SELECT 'lab_observation 表创建成功!' AS message; diff --git a/sql/create_lab_specimen_tables.sql b/sql/create_lab_specimen_tables.sql new file mode 100644 index 00000000..1b66d0b9 --- /dev/null +++ b/sql/create_lab_specimen_tables.sql @@ -0,0 +1,86 @@ +-- 创建 lab_specimen 检验标本表 +CREATE TABLE hisdev.lab_specimen ( + id BIGINT NOT NULL, + service_id BIGINT, + tenant_id BIGINT, + specimen_definition_id BIGINT, + collection_status_enum INTEGER, + collection_date TIMESTAMP WITHOUT TIME ZONE, + received_date TIMESTAMP WITHOUT TIME ZONE, + specimen_volume VARCHAR(50), + specimen_unit VARCHAR(20), + create_by VARCHAR(50), + create_time TIMESTAMP WITHOUT TIME ZONE, + update_by VARCHAR(50), + update_time TIMESTAMP WITH TIME ZONE, + PRIMARY KEY (id) +); + +COMMENT ON TABLE hisdev.lab_specimen IS '检验标本表'; +COMMENT ON COLUMN hisdev.lab_specimen.id IS '主键ID'; +COMMENT ON COLUMN hisdev.lab_specimen.service_id IS '服务请求ID(关联wor_service_request)'; +COMMENT ON COLUMN hisdev.lab_specimen.tenant_id IS '租户ID'; +COMMENT ON COLUMN hisdev.lab_specimen.specimen_definition_id IS '标本定义ID(关联adm_specimen_definition)'; +COMMENT ON COLUMN hisdev.lab_specimen.collection_status_enum IS '采集状态(1:待采集 2:已采集 3:已接收)'; +COMMENT ON COLUMN hisdev.lab_specimen.collection_date IS '采集时间'; +COMMENT ON COLUMN hisdev.lab_specimen.received_date IS '接收时间'; +COMMENT ON COLUMN hisdev.lab_specimen.specimen_volume IS '标本量'; +COMMENT ON COLUMN hisdev.lab_specimen.specimen_unit IS '标本单位'; +COMMENT ON COLUMN hisdev.lab_specimen.create_by IS '创建人'; +COMMENT ON COLUMN hisdev.lab_specimen.create_time IS '创建时间'; +COMMENT ON COLUMN hisdev.lab_specimen.update_by IS '更新人'; +COMMENT ON COLUMN hisdev.lab_specimen.update_time IS '更新时间'; + +-- 创建 adm_specimen_definition 标本定义表 +CREATE TABLE hisdev.adm_specimen_definition ( + id BIGINT NOT NULL, + code VARCHAR(50), + name VARCHAR(100), + specimen_name VARCHAR(100), + delete_flag CHAR(1) DEFAULT '0', + create_by VARCHAR(50), + create_time TIMESTAMP WITHOUT TIME ZONE, + update_by VARCHAR(50), + update_time TIMESTAMP WITH TIME ZONE, + PRIMARY KEY (id) +); + +COMMENT ON TABLE hisdev.adm_specimen_definition IS '标本定义表'; +COMMENT ON COLUMN hisdev.adm_specimen_definition.id IS '主键ID'; +COMMENT ON COLUMN hisdev.adm_specimen_definition.code IS '标本编码'; +COMMENT ON COLUMN hisdev.adm_specimen_definition.name IS '标本名称'; +COMMENT ON COLUMN hisdev.adm_specimen_definition.specimen_name IS '标本显示名称'; +COMMENT ON COLUMN hisdev.adm_specimen_definition.delete_flag IS '删除标志(0:正常 1:删除)'; + +-- 创建 adm_observation_definition 检验项目定义表 +CREATE TABLE hisdev.adm_observation_definition ( + id BIGINT NOT NULL, + code VARCHAR(50), + name VARCHAR(100), + category VARCHAR(50), + unit VARCHAR(20), + reference_range VARCHAR(200), + normal_range VARCHAR(200), + delete_flag CHAR(1) DEFAULT '0', + create_by VARCHAR(50), + create_time TIMESTAMP WITHOUT TIME ZONE, + update_by VARCHAR(50), + update_time TIMESTAMP WITH TIME ZONE, + PRIMARY KEY (id) +); + +COMMENT ON TABLE hisdev.adm_observation_definition IS '检验项目定义表'; +COMMENT ON COLUMN hisdev.adm_observation_definition.id IS '主键ID'; +COMMENT ON COLUMN hisdev.adm_observation_definition.code IS '项目编码'; +COMMENT ON COLUMN hisdev.adm_observation_definition.name IS '项目名称'; +COMMENT ON COLUMN hisdev.adm_observation_definition.category IS '项目类别'; +COMMENT ON COLUMN hisdev.adm_observation_definition.unit IS '单位'; +COMMENT ON COLUMN hisdev.adm_observation_definition.reference_range IS '参考范围'; +COMMENT ON COLUMN hisdev.adm_observation_definition.normal_range IS '正常范围'; +COMMENT ON COLUMN hisdev.adm_observation_definition.delete_flag IS '删除标志(0:正常 1:删除)'; + +-- 创建索引 +CREATE INDEX idx_lab_specimen_service_id ON hisdev.lab_specimen(service_id); +CREATE INDEX idx_lab_specimen_specimen_def ON hisdev.lab_specimen(specimen_definition_id); +CREATE INDEX idx_adm_specimen_definition_code ON hisdev.adm_specimen_definition(code); +CREATE INDEX idx_adm_observation_definition_code ON hisdev.adm_observation_definition(code); \ No newline at end of file diff --git a/sql/迁移记录-DB变更记录/202603051000_card_management_menu.sql b/sql/迁移记录-DB变更记录/202603051000_card_management_menu.sql new file mode 100644 index 00000000..a8405152 --- /dev/null +++ b/sql/迁移记录-DB变更记录/202603051000_card_management_menu.sql @@ -0,0 +1,327 @@ +-- ============================================ +-- STORY #104: 增加报卡管理界面 +-- 创建时间: 2026-03-05 +-- 功能说明: 在疾病报告管理目录下增加报卡管理界面菜单 +-- ============================================ + +-- 1. 创建疾病报告管理目录(如果不存在) +-- 注意:需要根据实际情况调整parent_id,这里假设是一级菜单 +INSERT INTO "sys_menu" ( + "menu_name", + "parent_id", + "order_num", + "path", + "component", + "query", + "route_name", + "is_frame", + "is_cache", + "menu_type", + "visible", + "status", + "perms", + "icon", + "create_by", + "create_time", + "update_by", + "update_time", + "remark" +) +SELECT + '疾病报告管理', + 0, -- 一级菜单,根据实际情况调整 + 100, + 'diseaseReport', + NULL, + NULL, + NULL, + '1', + '0', + 'M', -- M=目录 + '0', + '0', + NULL, + 'documentation', + 'admin', + NOW(), + NULL, + NULL, + '疾病报告管理目录' +WHERE NOT EXISTS ( + SELECT 1 FROM "sys_menu" WHERE "menu_name" = '疾病报告管理' +); + +-- 2. 创建报卡管理菜单 +-- 获取疾病报告管理目录的ID +INSERT INTO "sys_menu" ( + "menu_name", + "parent_id", + "order_num", + "path", + "component", + "query", + "route_name", + "is_frame", + "is_cache", + "menu_type", + "visible", + "status", + "perms", + "icon", + "create_by", + "create_time", + "update_by", + "update_time", + "remark" +) +SELECT + '报卡管理', + (SELECT "menu_id" FROM "sys_menu" WHERE "menu_name" = '疾病报告管理' LIMIT 1), + 1, + 'cardManagement', + 'cardmanagement/index', + NULL, + 'CardManagement', + '1', + '0', + 'C', -- C=菜单 + '0', + '0', + 'card:management:list', + 'form', + 'admin', + NOW(), + NULL, + NULL, + '报卡管理界面' +WHERE NOT EXISTS ( + SELECT 1 FROM "sys_menu" WHERE "menu_name" = '报卡管理' +); + +-- 3. 创建报卡管理相关按钮权限 +-- 获取报卡管理菜单的ID +INSERT INTO "sys_menu" ( + "menu_name", + "parent_id", + "order_num", + "path", + "component", + "query", + "route_name", + "is_frame", + "is_cache", + "menu_type", + "visible", + "status", + "perms", + "icon", + "create_by", + "create_time", + "update_by", + "update_time", + "remark" +) +SELECT + '报卡查询', + (SELECT "menu_id" FROM "sys_menu" WHERE "menu_name" = '报卡管理' LIMIT 1), + 1, + '', + NULL, + NULL, + NULL, + '1', + '0', + 'F', -- F=按钮 + '0', + '0', + 'card:management:query', + '#', + 'admin', + NOW(), + NULL, + NULL, + '' +WHERE NOT EXISTS ( + SELECT 1 FROM "sys_menu" WHERE "perms" = 'card:management:query' +); + +INSERT INTO "sys_menu" ( + "menu_name", + "parent_id", + "order_num", + "path", + "component", + "query", + "route_name", + "is_frame", + "is_cache", + "menu_type", + "visible", + "status", + "perms", + "icon", + "create_by", + "create_time", + "update_by", + "update_time", + "remark" +) +SELECT + '报卡审核', + (SELECT "menu_id" FROM "sys_menu" WHERE "menu_name" = '报卡管理' LIMIT 1), + 2, + '', + NULL, + NULL, + NULL, + '1', + '0', + 'F', + '0', + '0', + 'card:management:audit', + '#', + 'admin', + NOW(), + NULL, + NULL, + '' +WHERE NOT EXISTS ( + SELECT 1 FROM "sys_menu" WHERE "perms" = 'card:management:audit' +); + +INSERT INTO "sys_menu" ( + "menu_name", + "parent_id", + "order_num", + "path", + "component", + "query", + "route_name", + "is_frame", + "is_cache", + "menu_type", + "visible", + "status", + "perms", + "icon", + "create_by", + "create_time", + "update_by", + "update_time", + "remark" +) +SELECT + '报卡导出', + (SELECT "menu_id" FROM "sys_menu" WHERE "menu_name" = '报卡管理' LIMIT 1), + 3, + '', + NULL, + NULL, + NULL, + '1', + '0', + 'F', + '0', + '0', + 'card:management:export', + '#', + 'admin', + NOW(), + NULL, + NULL, + '' +WHERE NOT EXISTS ( + SELECT 1 FROM "sys_menu" WHERE "perms" = 'card:management:export' +); + +-- 4. 创建数据库表(如果不存在) +-- 传染病报卡表 +CREATE TABLE IF NOT EXISTS "infectious_card" ( + "id" BIGINT PRIMARY KEY, + "card_no" VARCHAR(20) UNIQUE, + "visit_id" BIGINT, + "diag_id" BIGINT, + "pat_id" BIGINT, + "id_type" INTEGER, + "id_no" VARCHAR(30), + "pat_name" VARCHAR(50), + "parent_name" VARCHAR(50), + "sex" CHAR(1), + "birthday" DATE, + "age" INTEGER, + "age_unit" CHAR(1), + "workplace" VARCHAR(100), + "phone" VARCHAR(20), + "contact_phone" VARCHAR(20), + "address_prov" VARCHAR(50), + "address_city" VARCHAR(50), + "address_county" VARCHAR(50), + "address_town" VARCHAR(50), + "address_village" VARCHAR(80), + "address_house" VARCHAR(40), + "patientbelong" VARCHAR(20), + "occupation" VARCHAR(20), + "disease_code" VARCHAR(10), + "disease_name" VARCHAR(100), + "disease_subtype" VARCHAR(50), + "other_disease" VARCHAR(100), + "disease_type" CHAR(1), + "onset_date" DATE, + "diag_date" TIMESTAMP, + "death_date" DATE, + "revised_disease_name" VARCHAR(100), + "return_reason" VARCHAR(200), + "report_org" VARCHAR(100), + "report_org_phone" VARCHAR(20), + "report_doc" VARCHAR(50), + "report_date" DATE, + "status" CHAR(1) DEFAULT '0', + "fail_msg" VARCHAR(500), + "xml_content" TEXT, + "card_name_code" INTEGER, + "registration_source" INTEGER, + "dept_id" BIGINT, + "dept_name" VARCHAR(100), + "doctor_id" BIGINT, + "create_by" VARCHAR(64), + "create_time" TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + "update_by" VARCHAR(64), + "update_time" TIMESTAMP, + "remark" VARCHAR(500) +); + +-- 审核记录表 +CREATE TABLE IF NOT EXISTS "infectious_audit" ( + "audit_id" BIGINT PRIMARY KEY, + "card_id" BIGINT NOT NULL, + "audit_seq" INTEGER NOT NULL, + "audit_type" CHAR(1) NOT NULL, + "audit_status_from" CHAR(1) NOT NULL, + "audit_status_to" CHAR(1) NOT NULL, + "audit_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "auditor_id" VARCHAR(20) NOT NULL, + "auditor_name" VARCHAR(50) NOT NULL, + "audit_opinion" TEXT, + "reason_for_return" TEXT, + "fail_reason_code" VARCHAR(20), + "fail_reason_desc" TEXT, + "is_batch" BOOLEAN DEFAULT FALSE, + "batch_size" INTEGER DEFAULT 1, + "create_by" VARCHAR(64), + "create_time" TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + "update_by" VARCHAR(64), + "update_time" TIMESTAMP, + "remark" VARCHAR(500) +); + +-- 创建索引 +CREATE INDEX IF NOT EXISTS idx_infectious_card_no ON "infectious_card"("card_no"); +CREATE INDEX IF NOT EXISTS idx_infectious_card_status ON "infectious_card"("status"); +CREATE INDEX IF NOT EXISTS idx_infectious_card_create_time ON "infectious_card"("create_time"); +CREATE INDEX IF NOT EXISTS idx_infectious_audit_card_id ON "infectious_audit"("card_id"); + +-- 添加迁移记录 +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202603051000_card_management_menu', '1.0.0') +ON CONFLICT DO NOTHING;