feat(transfer): add warehouse type support and lab specimen tables

This commit is contained in:
2026-03-12 16:31:31 +08:00
parent d083a3123a
commit e8850e85fc
7 changed files with 526 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "openhis", "name": "openhis",
"version": "3.8.8", "version": "3.8.9",
"description": "OpenHIS管理系统", "description": "OpenHIS管理系统",
"author": "OpenHIS", "author": "OpenHIS",
"license": "MIT", "license": "MIT",

View File

@@ -516,6 +516,7 @@ import {
getPharmacyList, getPharmacyList,
getTransferProductDetail, getTransferProductDetail,
getTransferProductDetails, getTransferProductDetails,
getWarehouseList,
productTransferApproved, productTransferApproved,
reject, reject,
submitApproval, submitApproval,
@@ -775,6 +776,17 @@ function handleChangePurposeTypeEnum(value, type) {
}).catch(error => { }).catch(error => {
console.error('Error fetching dispensary list:', 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 { } else {
purposeTypeListOptions.value = []; purposeTypeListOptions.value = [];
} }
@@ -801,6 +813,17 @@ function handleChangeSourceTypeEnum(value, type) {
}).catch(error => { }).catch(error => {
console.error('Error fetching dispensary list:', 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 { } else {
sourceTypeListOptions.value = []; sourceTypeListOptions.value = [];
} }

View File

@@ -123,6 +123,14 @@ export function getDispensaryList() {
method: 'get', method: 'get',
}) })
} }
// 获取耗材库列表
export function getWarehouseList() {
return request({
url: '/app-common/warehouse-list',
method: 'get',
})
}
// 获取仓库药房列表 // 获取仓库药房列表
export function getpharmacyCabinetList() { export function getpharmacyCabinetList() {
return request({ return request({

View File

@@ -616,6 +616,7 @@ import {
getInit, getInit,
getPharmacyList, getPharmacyList,
getTransferProductDetail, getTransferProductDetail,
getWarehouseList,
productTransferApproved, productTransferApproved,
reject, reject,
submitApproval, submitApproval,
@@ -1148,6 +1149,15 @@ function handleChangePurposeTypeEnum(value, type) {
receiptHeaderForm.purposeLocationId1 = ''; 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 = ''; receiptHeaderForm.sourceLocationId1 = '';
} }
}); });
} else if (value == 17) {
// 耗材库类型
getWarehouseList().then((res) => {
sourceTypeListOptions.value = res.data;
if (!route.query.supplyBusNo && !type) {
receiptHeaderForm.sourceLocationId = '';
receiptHeaderForm.sourceLocationId1 = '';
}
});
} }
} }

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;