# 医嘱接口文档(医嘱树查询 + 医嘱项检索) > 模块:src.InternetHospital.MyConsultationNew / src.OutPatient > 接口类:src.InternetHospital.MyConsultationNew.Interface / src.OutPatient.Interface > 实现类:src.Doctor.Application / src.OutPatient.MedItem > 适用场景:前端展示医嘱选择树(西药大类+子类嵌套 + 检查检验治疗),以及按关键字检索本院可执行医嘱项/医嘱套 --- ## 一、通用规范 ### 公共入参格式 所有接口统一采用项目标准入参信封: ```json { "params": [{}], "pagination": [{"pageSize": 20, "currentPage": 1}], "code": "", "session": [{}] } ``` - `params`:业务参数数组,取第 0 个元素作为业务参数对象。 - `code`:接口编码(见各接口定义)。 - `session`:登录会话信息,提供 `language` 语言字段。 入参解析方式(项目规范): ```objectscript set postParams = jsonObj.params.%Get(0) set session = jsonObj.session.%Get(0) set postParams.language = session.language ``` ### 公共出参格式 ```json { "errorCode": "0", "errorMessage": "成功", "result": {} } ``` - `errorCode`:`"0"` 表示成功,非 `"0"` 表示失败。 - `errorMessage`:错误描述,成功时为「成功」。 - `result`:业务数据对象(各接口字段不同,详见下文)。 ### 调试方式 ```objectscript // 接口类(前端入口) w ##class(src.InternetHospital.MyConsultationNew.Interface).GetMedOrderTree({"params":[{"hospID":"48","searchCode":""}],"session":[{"language":"CH"}]}).%ToJSON() // 实现类(直接调用) w ##class(src.Doctor.Application).GetMedOrderTree({"hospID":"48","searchCode":""}).%ToJSON() ``` --- ## 二、接口清单 | 接口编码 | 方法名 | 说明 | |---------|--------|------| | 12100052 | GetMedOrderTree | 医嘱树(西药大类+子类 + 检查检验治疗)查询 | | 03050019 | FindMedItem | 医嘱项/医嘱套检索(按关键字、科室、权限、库存等过滤) | --- ## 三、接口详情 ### 3.1 医嘱树查询 GetMedOrderTree - **接口编码**:12100052 - **方法**:`src.InternetHospital.MyConsultationNew.Interface.GetMedOrderTree(postObj)` - **底层**:`src.Doctor.Application.GetMedOrderTree(params)` #### 入参 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | params[0].hospID | String | 是 | 医院 ID(医院不能为空,否则返回错误码 05210010) | | params[0].searchCode | String | 否 | 模糊搜索关键字,仅按 descripts(名称)匹配,大小写不敏感(自动转大写)。为空表示不搜索,返回全量树 | 入参示例: ```json { "params": [{"hospID": "48", "searchCode": ""}], "code": "12100052", "session": [{"language": "CH"}] } ``` #### 业务规则 1. **西药分支(集团级,不依赖 hospID)** - 西药大类:`^CBOrderCatD` 中 `Code='西药'` 的记录(有效性规则:未生效或已失效的大类跳过)。 - 西药子类:遍历 `^CBOrderSubCatI("OrderCat",西药大类ID,...)` 索引下所有有效子类,按 `Code` 定长 2 位分段逐级嵌套: - 例:`0101` → `010101` → `01010101` → `0101010101` - 父节点 Code = 子节点 Code 去掉末尾 2 位;若父 Code 在有效子类映射中不存在(如 `0101` 的父 `01` 不存在),则该节点作为一级节点挂到西药大类下。 - 子类有效性规则:第 21 位 StartDate 晚于今天,或第 22 位 StopDate 早于今天则跳过。 2. **检查/检验/治疗分支(依赖 hospID)**:复用 `GetApplicationType` 逻辑,返回医院级申请单类型树,节点 `type` 统一标记为 `appType`。 3. **模糊搜索(searchCode 非空)** - 仅按子类 `descripts` 字段匹配;命中子类后,**整条祖先路径(含西药大类)全部保留**,非路径上的兄弟节点隐藏。 - 西药大类自身若 descripts 命中,或存在任一命中的子类,则大类保留。 4. **西药节点不返回 medCount**(与 appType 节点字段不同)。 #### 出参 `result.data` 为数组,元素分为三类节点: **① 西药大类节点(type=orderCat)** | 字段 | 类型 | 说明 | |------|------|------| | id | String | 西药大类 ID(实体主键) | | code | String | 大类 Code(值为「西药」) | | descripts | String | 大类名称 | | descriptsSPCode | String | 名称拼音码 | | type | String | 固定值 `orderCat` | | breadcrumb | String | 面包屑,值为大类名称 | | count | Integer | 子类数量(含嵌套所有层级节点数) | | children | Array | 子类嵌套数组(结构见下) | **② 西药子类节点(type=orderSubCat,可多级嵌套于 children 中)** | 字段 | 类型 | 说明 | |------|------|------| | id | String | 子类 ID | | code | String | 子类 Code(如 0101、010101、01010101 等,定长 2 位分段) | | descripts | String | 子类名称 | | descriptsSPCode | String | 名称拼音码 | | type | String | 固定值 `orderSubCat` | | breadcrumb | String | 面包屑,逐级拼接「父名称>>>子名称」 | | startDate | String | 生效日期(yyyy-mm-dd),空串表示未设置 | | stopDate | String | 失效日期(yyyy-mm-dd),空串表示未设置 | | children | Array | 下一级子类数组(无下级则为空数组 `[]`) | **③ 检查/检验/治疗节点(type=appType)** 复用 `GetApplicationType` 返回的节点结构(`type` 统一标记为 `appType`),字段以 `GetApplicationType` 实现为准。 #### 出参示例 ```json { "errorCode": "0", "errorMessage": "成功", "result": { "data": [ { "id": "西药大类ID", "code": "西药", "descripts": "西药", "descriptsSPCode": "XY", "type": "orderCat", "breadcrumb": "西药", "count": 3, "children": [ { "id": "子类ID_0101", "code": "0101", "descripts": "抗感染药物", "descriptsSPCode": "KJRYW", "type": "orderSubCat", "breadcrumb": "西药>>>抗感染药物", "startDate": "", "stopDate": "", "children": [ { "id": "子类ID_010101", "code": "010101", "descripts": "青霉素类", "descriptsSPCode": "QMSL", "type": "orderSubCat", "breadcrumb": "西药>>>抗感染药物>>>青霉素类", "startDate": "", "stopDate": "", "children": [ { "id": "子类ID_01010101", "code": "01010101", "descripts": "天然青霉素", "descriptsSPCode": "TRQMS", "type": "orderSubCat", "breadcrumb": "西药>>>抗感染药物>>>青霉素类>>>天然青霉素", "startDate": "", "stopDate": "", "children": [] } ] } ] } ] }, { "id": "检查类型ID", "type": "appType", "descripts": "检查", "children": [ { "type": "appType", "descripts": "CT", "children": [] } ] } ] } } ``` #### 错误码 | errorCode | errorMessage | 说明 | |-----------|--------------|------| | 0 | 成功 | 正常返回 | | 05210010 | 医院不能为空 | hospID 为空 | | 5002 等 | 系统错误描述 | 运行时异常(catch 捕获后返回原始错误信息) | --- ### 3.2 医嘱项检索 FindMedItem - **接口编码**:03050019 - **方法**:`src.OutPatient.Interface.FindMedItem(jsonObj)` - **底层**:`src.OutPatient.MedItem.FindMedItem(paraStr, pageStr)` #### 入参 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | params[0].admID | String | 否 | 就诊 ID;为空时不按就诊类型/接收科室校验权限 | | params[0].searchCode | String | 否 | 模糊搜索关键字,匹配医嘱项代码、名称、别名(含拼音/首字母前缀匹配),大小写不敏感 | | params[0].logonLocID | String | 是 | 登录科室 ID(用于接收科室权限判断) | | params[0].userID | String | 是 | 用户 ID(医生),用于个人级医嘱套/医嘱权限过滤 | | params[0].groupID | String | 否 | 角色 ID,用于取角色下的医嘱子类权限 | | params[0].hospID | String | 是 | 医院 ID(为空返回错误码 03050050) | | params[0].medCatID | String | 否 | 医嘱大类 ID,预筛子类范围 | | params[0].medSubCatID | String | 否 | 医嘱子类 ID,预筛子类范围 | | params[0].cmFlag | String | 否 | 草药标志,Y=仅检索中草药大类,否则排除中草药大类 | | params[0].herbalFormID | String | 否 | 草药剂型 ID,仅检索该剂型对应的子类 | | params[0].drugsFlag | String | 否 | 药品标识,Y=仅检索药品类医嘱(orderTypeCode='D') | | params[0].judgeFlag | String | 否 | 库存/接收科室判断标志,Y=需判断库存与接收科室;部分页面检索无需判断 | | params[0].ordType | String | 否 | 医嘱类型,进一步按类型过滤子类 | | params[0].notOrdSet | String | 否 | 不检索医嘱套标志,Y=不返回医嘱套结果 | | params[0].language | String | 否 | 语言:CN 中文 / EN 英文(影响 descripts 英文名回退) | | pagination[0].pageSize | Integer | 否 | 每页条数,>0 时启用分页 | | pagination[0].currentPage | Integer | 否 | 当前页,空默认第 1 页 | | pagination[0].sortColumn | String | 否 | 排序字段 | | pagination[0].sortOrder | String | 否 | 排序方向 | 入参示例: ```json { "params": [{ "admID": "1599898", "searchCode": "护理液", "logonLocID": "1777", "userID": "4924", "groupID": "407", "hospID": "25", "medCatID": "", "medSubCatID": "", "cmFlag": "", "herbalFormID": "", "drugsFlag": "", "judgeFlag": "Y", "ordType": "", "notOrdSet": "", "language": "CN" }], "pagination": [{"pageSize": 50, "currentPage": 1, "sortColumn": "", "sortOrder": ""}], "code": "03050019", "session": [{"userID": "4924", "locID": "1777", "groupID": "407", "hospID": "25", "sessionID": "0YrbAyydeH", "hospCode": "H03", "language": "CN"}] } ``` #### 业务规则 1. **权限过滤**:依次按角色(groupID)、就诊类型(admID)、资源类型、医嘱类型(ordType)过滤可开的医嘱子类;无任何权限返回 `03050063`。 2. **本院校验**:医嘱项必须存在本院库存/收费记录(视光产品、药品分别校验)。 3. **关键字匹配**:匹配医嘱项代码(全等优先)、名称(前缀匹配次之)、别名(含拼音码匹配);按匹配优先级(全等>前缀>别名)排序,集采标识排前。 4. **库存/价格过滤**:根据模块配置(ShowStockZeroOrder、ShowPriceZeroOrder、ShowNoRecLocOrder 等)决定是否过滤零库存、零价格、无接收科室的医嘱项。 5. **医嘱套**:`notOrdSet` 非 Y 时检索全院级/科室级/个人级医嘱套(cmFlag=Y 时检索草药医嘱套 `HBCMOrderSet`)。 #### 出参 `result` 为对象,含 `totalCount` 与 `data` 数组: | 字段 | 类型 | 说明 | |------|------|------| | result.totalCount | Integer | 符合结果的总条数(含医嘱项与医嘱套,分页前) | | result.data | Array | 结果数组,元素分「医嘱项」与「医嘱套」两类(见下) | **① 医嘱项节点(来自 GetMedItemObj)** | 字段 | 类型 | 说明 | |------|------|------| | medID | String | 医嘱项 ID | | medDesc | String | 医嘱项名称(含规格,英文环境回退英文名) | | medCode | String | 医嘱项代码 | | medSubCatDesc | String | 医嘱子类名称 | | medCatDesc | String | 医嘱大类名称 | | medPrice | String | 医嘱项价格(2 位小数) | | medVendorDesc | String | 供应商 | | medManfDesc | String | 厂商 | | recLocDesc | String | 执行/接收科室描述 | | medStock | String | 库存(科室+数量+单位,多科室用 `;` 分隔) | | resQty | String | 在途数量 | | medItemGrade | String | 医保类型/等级 | | tradeName | String | 商品名 | | price | String | 计价单位价格(2 位小数) | | manfDesc | String | 生产厂家 | | uniformPurchFlag | String | 集采标志(「是」/「否」) | | drugUseInfo | String | 药品用法信息 | | recLocCode | String | 接收科室(药房)Code | | userCode | String | 医生 Code | **② 医嘱套节点(来自 GetOrdSetObj,cmFlag=Y 时为草药医嘱套)** | 字段 | 类型 | 说明 | |------|------|------| | ordSetID | String | 医嘱套 ID | | medDesc | String | 医嘱套描述 | | medCode | String | 医嘱套代码 | | medSubCatDesc | String | 固定值「医嘱套」 | | medCatDesc | String | 固定值「医嘱套」 | | medPrice | String | 空 | | medVendorDesc | String | 空 | | medManfDesc | String | 空 | | recLocDesc | String | 空 | | medStock | String | 空 | | resQty | String | 空 | | orderType | String | 空 | | medItemGrade | String | 空 | 出参示例(节选): ```json { "errorCode": "0", "errorMessage": "", "time": 0.012, "result": { "totalCount": 12, "data": [ { "medID": "12345", "medDesc": "氯化钠注射液(250ml)", "medCode": "207.TC00007", "medSubCatDesc": "体液电解质调节药", "medCatDesc": "西药", "medPrice": "12.50", "medVendorDesc": "某供应商", "medManfDesc": "某厂商", "recLocDesc": "住院药房", "medStock": "住院药房100瓶", "resQty": "住院药房0瓶", "medItemGrade": "甲类", "tradeName": "", "price": "12.50", "manfDesc": "某制药厂", "uniformPurchFlag": "否", "drugUseInfo": "", "recLocCode": "LOC01", "userCode": "DOC01" }, { "ordSetID": "987", "medDesc": "普通感冒医嘱套", "medCode": "ORDSET001", "medSubCatDesc": "医嘱套", "medCatDesc": "医嘱套", "medPrice": "", "medVendorDesc": "", "medManfDesc": "", "recLocDesc": "", "medStock": "", "resQty": "", "orderType": "", "medItemGrade": "" } ] } } ``` #### 错误码 | errorCode | errorMessage | 说明 | |-----------|--------------|------| | 0 | 成功 | 正常返回(errorMessage 为空串) | | 03050050 | 搜索医嘱项时医院不能为空 | hospID 为空 | | 03050063 | 该医生没有维护录医嘱权限 | 过滤后无私权子类 | | 5002 等 | 系统错误描述 | 运行时异常(方法内 `$zt="error"` 捕获) |