Просмотр исходного кода

交易市场平台(供应商)

wwh дней назад: 6
Родитель
Сommit
a02a1d179e

+ 6 - 2
baqing-admin/src/main/java/com/ruoyi/web/modules/architecture/mapper/AppMedicationDrugMapper.java

@@ -2,6 +2,7 @@ package com.ruoyi.web.modules.architecture.mapper;
2 2
 
3 3
 import java.util.List;
4 4
 import org.apache.ibatis.annotations.Param;
5
+import com.ruoyi.web.modules.architecture.domain.AppMedicationIncompatibilityGroupRow;
5 6
 import com.ruoyi.web.modules.architecture.domain.BizWithdrawalPeriodStandard;
6 7
 
7 8
 /**
@@ -13,11 +14,14 @@ public interface AppMedicationDrugMapper
13 14
 
14 15
     BizWithdrawalPeriodStandard selectWithdrawalByDrugName(@Param("drugName") String drugName);
15 16
 
16
-    String selectIncompatibilityCompanionsCsv(@Param("drugName") String drugName);
17
+    List<AppMedicationIncompatibilityGroupRow> selectIncompatibilityGroupsByMainDrugName(
18
+            @Param("mainDrugName") String mainDrugName);
17 19
 
18 20
     int countIncompatibilityPair(
19 21
             @Param("mainDrugName") String mainDrugName,
20 22
             @Param("companionDrugName") String companionDrugName);
21 23
 
22
-    String selectCompatResultByMainDrugName(@Param("mainDrugName") String mainDrugName);
24
+    String selectCompatResultByPair(
25
+            @Param("mainDrugName") String mainDrugName,
26
+            @Param("companionDrugName") String companionDrugName);
23 27
 }

+ 2 - 1
baqing-admin/src/main/java/com/ruoyi/web/modules/architecture/service/impl/AppMedicationCompatibilityServiceImpl.java

@@ -40,7 +40,8 @@ public class AppMedicationCompatibilityServiceImpl implements IAppMedicationComp
40 40
         if (hasIncompatibility)
41 41
         {
42 42
             String mainForResult = dir1 ? name1 : name2;
43
-            String compatResult = appMedicationDrugMapper.selectCompatResultByMainDrugName(mainForResult);
43
+            String companionForResult = dir1 ? name2 : name1;
44
+            String compatResult = appMedicationDrugMapper.selectCompatResultByPair(mainForResult, companionForResult);
44 45
             if (StringUtils.isNotEmpty(compatResult))
45 46
             {
46 47
                 vo.setCompatResult(compatResult.trim());

+ 5 - 1
baqing-admin/src/main/java/com/ruoyi/web/modules/architecture/service/impl/AppMedicationDrugServiceImpl.java

@@ -6,11 +6,13 @@ import org.springframework.beans.factory.annotation.Autowired;
6 6
 import org.springframework.stereotype.Service;
7 7
 import com.ruoyi.common.exception.ServiceException;
8 8
 import com.ruoyi.common.utils.StringUtils;
9
+import com.ruoyi.web.modules.architecture.domain.AppMedicationIncompatibilityGroupRow;
9 10
 import com.ruoyi.web.modules.architecture.domain.AppMedicationDrugQueryVo;
10 11
 import com.ruoyi.web.modules.architecture.domain.BizWithdrawalPeriodStandard;
11 12
 import com.ruoyi.web.modules.architecture.mapper.AppMedicationDrugMapper;
12 13
 import com.ruoyi.web.modules.architecture.service.IAppMedicationDrugService;
13 14
 import com.ruoyi.web.modules.architecture.support.AppMedicationDrugNameSupport;
15
+import com.ruoyi.web.modules.architecture.support.AppMedicationIncompatibilityDisplaySupport;
14 16
 import com.ruoyi.web.modules.architecture.support.WithdrawalPeriodStandardDrugType;
15 17
 
16 18
 /**
@@ -52,7 +54,9 @@ public class AppMedicationDrugServiceImpl implements IAppMedicationDrugService
52 54
         vo.setWithdrawalDays(row.getWithdrawalDays());
53 55
         vo.setUsageGuide(row.getUsageGuide());
54 56
         vo.setDrugEffect(row.getDrugEffect());
55
-        String companions = appMedicationDrugMapper.selectIncompatibilityCompanionsCsv(name);
57
+        List<AppMedicationIncompatibilityGroupRow> groups = appMedicationDrugMapper
58
+                .selectIncompatibilityGroupsByMainDrugName(name);
59
+        String companions = AppMedicationIncompatibilityDisplaySupport.formatGroupsForDisplay(groups);
56 60
         if (StringUtils.isNotEmpty(companions))
57 61
         {
58 62
             vo.setIncompatibilityCompanions(companions);

+ 25 - 12
baqing-admin/src/main/resources/mapper/architecture/AppMedicationDrugMapper.xml

@@ -29,6 +29,24 @@
29 29
         limit 1
30 30
     </select>
31 31
 
32
+    <resultMap type="com.ruoyi.web.modules.architecture.domain.AppMedicationIncompatibilityGroupRow"
33
+               id="IncompatibilityGroupResult">
34
+        <result property="standardId"    column="standard_id"/>
35
+        <result property="compatResult"  column="compat_result"/>
36
+        <result property="companionsCsv" column="companions_csv"/>
37
+    </resultMap>
38
+
39
+    <select id="selectIncompatibilityGroupsByMainDrugName" resultMap="IncompatibilityGroupResult">
40
+        select s.id as standard_id,
41
+               s.compat_result,
42
+               group_concat(c.companion_drug_name order by c.sort_order asc separator ',') as companions_csv
43
+        from biz_drug_incompatibility_standard s
44
+        inner join biz_drug_incompatibility_companion c on c.standard_id = s.id
45
+        where s.main_drug_name = #{mainDrugName}
46
+        group by s.id, s.compat_result
47
+        order by s.id asc
48
+    </select>
49
+
32 50
     <select id="countIncompatibilityPair" resultType="int">
33 51
         select count(1)
34 52
         from biz_drug_incompatibility_standard s
@@ -37,18 +55,13 @@
37 55
           and c.companion_drug_name = #{companionDrugName}
38 56
     </select>
39 57
 
40
-    <select id="selectCompatResultByMainDrugName" resultType="string">
41
-        select compat_result
42
-        from biz_drug_incompatibility_standard
43
-        where main_drug_name = #{mainDrugName}
44
-        limit 1
45
-    </select>
46
-
47
-    <select id="selectIncompatibilityCompanionsCsv" resultType="string">
48
-        select group_concat(c.companion_drug_name order by c.sort_order asc separator ',')
49
-        from biz_withdrawal_period_standard w
50
-        inner join biz_drug_incompatibility_standard s on s.main_drug_name = w.drug_name
58
+    <select id="selectCompatResultByPair" resultType="string">
59
+        select s.compat_result
60
+        from biz_drug_incompatibility_standard s
51 61
         inner join biz_drug_incompatibility_companion c on c.standard_id = s.id
52
-        where w.drug_name = #{drugName}
62
+        where s.main_drug_name = #{mainDrugName}
63
+          and c.companion_drug_name = #{companionDrugName}
64
+        order by s.id asc
65
+        limit 1
53 66
     </select>
54 67
 </mapper>

+ 2 - 2
baqing-admin/src/test/java/com/ruoyi/web/modules/architecture/service/impl/AppMedicationCompatibilityServiceImplTest.java

@@ -33,7 +33,7 @@ class AppMedicationCompatibilityServiceImplTest
33 33
     {
34 34
         when(appMedicationDrugMapper.countIncompatibilityPair("青霉素", "链霉素")).thenReturn(1);
35 35
         when(appMedicationDrugMapper.countIncompatibilityPair("链霉素", "青霉素")).thenReturn(0);
36
-        when(appMedicationDrugMapper.selectCompatResultByMainDrugName("青霉素")).thenReturn(" 禁止合用 ");
36
+        when(appMedicationDrugMapper.selectCompatResultByPair("青霉素", "链霉素")).thenReturn(" 禁止合用 ");
37 37
 
38 38
         AppMedicationCompatibilityCheckVo vo = service.checkCompatibility("青霉素", "链霉素");
39 39
         assertTrue(vo.getHasIncompatibility());
@@ -46,7 +46,7 @@ class AppMedicationCompatibilityServiceImplTest
46 46
     {
47 47
         when(appMedicationDrugMapper.countIncompatibilityPair("药A", "药B")).thenReturn(0);
48 48
         when(appMedicationDrugMapper.countIncompatibilityPair("药B", "药A")).thenReturn(2);
49
-        when(appMedicationDrugMapper.selectCompatResultByMainDrugName("药B")).thenReturn("不宜联用");
49
+        when(appMedicationDrugMapper.selectCompatResultByPair("药B", "药A")).thenReturn("不宜联用");
50 50
 
51 51
         AppMedicationCompatibilityCheckVo vo = service.checkCompatibility("药A", "药B");
52 52
         assertTrue(vo.getHasIncompatibility());

+ 34 - 2
baqing-admin/src/test/java/com/ruoyi/web/modules/architecture/service/impl/AppMedicationDrugServiceImplTest.java

@@ -7,6 +7,7 @@ import static org.mockito.ArgumentMatchers.eq;
7 7
 import static org.mockito.Mockito.when;
8 8
 
9 9
 import java.util.Arrays;
10
+import java.util.Collections;
10 11
 import org.junit.jupiter.api.DisplayName;
11 12
 import org.junit.jupiter.api.Test;
12 13
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -14,6 +15,7 @@ import org.mockito.InjectMocks;
14 15
 import org.mockito.Mock;
15 16
 import org.mockito.junit.jupiter.MockitoExtension;
16 17
 import com.ruoyi.common.exception.ServiceException;
18
+import com.ruoyi.web.modules.architecture.domain.AppMedicationIncompatibilityGroupRow;
17 19
 import com.ruoyi.web.modules.architecture.domain.AppMedicationDrugQueryVo;
18 20
 import com.ruoyi.web.modules.architecture.domain.BizWithdrawalPeriodStandard;
19 21
 import com.ruoyi.web.modules.architecture.mapper.AppMedicationDrugMapper;
@@ -48,13 +50,34 @@ class AppMedicationDrugServiceImplTest
48 50
         row.setUsageGuide("指南");
49 51
         row.setDrugEffect("作用");
50 52
         when(appMedicationDrugMapper.selectWithdrawalByDrugName("青霉素")).thenReturn(row);
51
-        when(appMedicationDrugMapper.selectIncompatibilityCompanionsCsv("青霉素")).thenReturn("链霉素,磺胺");
53
+        when(appMedicationDrugMapper.selectIncompatibilityGroupsByMainDrugName("青霉素"))
54
+                .thenReturn(Collections.singletonList(groupRow("链霉素,磺胺", null)));
52 55
 
53 56
         AppMedicationDrugQueryVo vo = service.queryByDrugName("青霉素");
54 57
         assertEquals("抗生素", vo.getDrugTypeName());
55 58
         assertEquals("链霉素,磺胺", vo.getIncompatibilityCompanions());
56 59
     }
57 60
 
61
+    @Test
62
+    @DisplayName("多配伍组展示带配伍结果")
63
+    void queryMultipleGroups()
64
+    {
65
+        BizWithdrawalPeriodStandard row = new BizWithdrawalPeriodStandard();
66
+        row.setDrugName("青霉素");
67
+        row.setDrugType(1);
68
+        row.setWithdrawalDays(7);
69
+        row.setUsageGuide("指南");
70
+        row.setDrugEffect("作用");
71
+        when(appMedicationDrugMapper.selectWithdrawalByDrugName("青霉素")).thenReturn(row);
72
+        when(appMedicationDrugMapper.selectIncompatibilityGroupsByMainDrugName("青霉素"))
73
+                .thenReturn(Arrays.asList(
74
+                        groupRow("链霉素,庆大霉素", "禁止合用"),
75
+                        groupRow("维生素C", "降低疗效")));
76
+
77
+        AppMedicationDrugQueryVo vo = service.queryByDrugName("青霉素");
78
+        assertEquals("链霉素,庆大霉素(禁止合用);维生素C(降低疗效)", vo.getIncompatibilityCompanions());
79
+    }
80
+
58 81
     @Test
59 82
     @DisplayName("无禁配记录时配伍为空")
60 83
     void queryNoIncompatibility()
@@ -66,7 +89,8 @@ class AppMedicationDrugServiceImplTest
66 89
         row.setUsageGuide("指南");
67 90
         row.setDrugEffect("作用");
68 91
         when(appMedicationDrugMapper.selectWithdrawalByDrugName("测试药")).thenReturn(row);
69
-        when(appMedicationDrugMapper.selectIncompatibilityCompanionsCsv("测试药")).thenReturn(null);
92
+        when(appMedicationDrugMapper.selectIncompatibilityGroupsByMainDrugName("测试药"))
93
+                .thenReturn(Collections.emptyList());
70 94
 
71 95
         AppMedicationDrugQueryVo vo = service.queryByDrugName("测试药");
72 96
         assertNull(vo.getIncompatibilityCompanions());
@@ -79,4 +103,12 @@ class AppMedicationDrugServiceImplTest
79 103
         when(appMedicationDrugMapper.selectWithdrawalByDrugName("未知")).thenReturn(null);
80 104
         assertThrows(ServiceException.class, () -> service.queryByDrugName("未知"));
81 105
     }
106
+
107
+    private static AppMedicationIncompatibilityGroupRow groupRow(String companions, String result)
108
+    {
109
+        AppMedicationIncompatibilityGroupRow row = new AppMedicationIncompatibilityGroupRow();
110
+        row.setCompanionsCsv(companions);
111
+        row.setCompatResult(result);
112
+        return row;
113
+    }
82 114
 }

+ 5 - 2
doc/app/用药工具/用药工具-查询药物接口说明.md

@@ -36,9 +36,12 @@
36 36
 | `withdrawalDays` | 休药期标准 | 休药期(天) |
37 37
 | `usageGuide` | 休药期标准 | 使用指南 |
38 38
 | `drugEffect` | 休药期标准 | 药物作用 |
39
-| `incompatibilityCompanions` | 禁配子表关联 | 配伍禁忌药物,`companion_drug_name` 按 `sort_order` 逗号拼接;无禁配记录时不返回该字段 |
39
+| `incompatibilityCompanions` | 禁配标准 | 配伍禁忌展示文案;按**配伍组**拼接:`组内药物(配伍结果)`,多组以 `;` 分隔;无禁配记录时不返回该字段 |
40 40
 
41
-**配伍禁忌 SQL 逻辑**:`biz_withdrawal_period_standard` 与 `biz_drug_incompatibility_standard` 按 `drug_name = main_drug_name` 关联,再关联 `biz_drug_incompatibility_companion` 聚合 `GROUP_CONCAT(companion_drug_name)`。
41
+**示例**:同一主药两条标准 — 组1「链霉素,庆大霉素 + 禁止合用」、组2「维生素C + 降低疗效」→  
42
+`链霉素,庆大霉素(禁止合用);维生素C(降低疗效)`
43
+
44
+**数据语义**:`biz_drug_incompatibility_standard` 一条记录 = 一个配伍组;同一 `main_drug_name` 可有多条记录,各自 `compat_result` 独立。
42 45
 
43 46
 ## 4. 错误示例
44 47
 

+ 5 - 3
doc/app/用药工具/用药工具-用药配伍接口说明.md

@@ -32,11 +32,13 @@
32 32
 
33 33
 **配伍结果 `compatResult`**
34 34
 
35
-- 有禁忌时:取**命中方向主药**在 `biz_drug_incompatibility_standard.compat_result` 的值  
36
-  - 若方向1命中,取 `drugName1` 为主药的 `compat_result`  
37
-  - 否则取 `drugName2` 为主药的 `compat_result`  
35
+- 有禁忌时:取**命中药对所在禁配标准(配伍组)**的 `compat_result`  
36
+  - 若方向1命中(`drugName1` 为主药、`drugName2` 为配伍药),查该药对关联的标准记录  
37
+  - 否则查反向药对关联的标准记录  
38 38
 - 无禁忌时:不返回 `compatResult` 字段
39 39
 
40
+**数据语义**:同一 `main_drug_name` 可有多条禁配标准,每条为一个**配伍组**(组内配伍药共享该条的 `compat_result`)。
41
+
40 42
 **响应 `data`**
41 43
 
42 44
 | 字段 | 说明 |

+ 7 - 4
doc/养殖标准体系/药物禁配标准/药物禁配标准管理功能需求.md

@@ -28,13 +28,16 @@
28 28
 
29 29
 ## 2. 术语与业务状态
30 30
 
31
-### 2.1 业务对象(一条标准)
31
+### 2.1 业务对象
32 32
 
33 33
 | 概念 | 说明 |
34 34
 | --- | --- |
35 35
 | **主药** | 本条禁配标准所针对的药物;在列表检索、详情与编辑中作为主维度展示(草稿中「药物名称」即主药名称) |
36
-| **配伍药物** | 与主药存在禁配(不宜同用等)关系的药物集合;**一条标准下可有多条**,每条为一条「配伍药物名称」记录;界面可通过 **增加 / 减少** 行维护列表(与草稿「+ / -」一致);条数与合法性约束见 **2.3** |
37
-| **配伍结果** | 对配伍禁忌或临床提示的**简短文字说明**;**选填** |
36
+| **配伍组(一条标准)** | 系统内 **一条禁配标准记录** 即一个配伍组:同一主药、一组配伍药物、**一条**配伍结果说明 |
37
+| **配伍药物** | 组内与主药存在禁配关系的药物;**一条标准下可有多条**,每条为一条「配伍药物名称」记录;界面可通过 **增加 / 减少** 行维护列表(与草稿「+ / -」一致);条数与合法性约束见 **2.3** |
38
+| **配伍结果** | 对该**配伍组**的简短文字说明;组内所有配伍药物共享该说明;**选填** |
39
+
40
+**同一主药多条标准:** 允许 `main_drug_name` 相同的多条记录并存,分别表示不同配伍组及各自配伍结果(例如组1「链霉素+庆大霉素→禁止合用」,组2「维生素C→降低疗效」)。移动端用药工具按**命中药对所在组**或**分组展示**读取数据。
38 41
 
39 42
 **列表与详情中的配伍药物:** 以有序列表形式展示;顺序在业务上有展示意义时,宜与保存顺序一致。
40 43
 
@@ -104,7 +107,7 @@ stateDiagram-v2
104 107
 
105 108
 | 内容项 | 规则 |
106 109
 | --- | --- |
107
-| 主药—药物名称 | 必填;长度 **1~20** 字符(计数口径与项目全局一致);**允许重复**(不同标准可共用同一主药名称,trim 后精确匹配) |
110
+| 主药—药物名称 | 必填;长度 **1~20** 字符;**允许重复**(同一主药可新建多条标准,每条为一个配伍组) |
108 111
 | 配伍药物列表 | **至少 1 条**;每条名称必填,长度 **1~20** 字符(口径同上);同条标准内名称**互不相同**且**均不得与主药名称相同**(比较规则见 **2.3** 末款) |
109 112
 | 配伍结果 | **选填**;若有内容,长度不超过 **50** 字符(口径与项目全局一致) |
110 113
 

+ 5 - 3
doc/养殖标准体系/药物禁配标准/药物禁配标准管理技术方案.md

@@ -33,8 +33,8 @@
33 33
 | 字段 | 类型 | 非空 | 默认值 | 说明 |
34 34
 | --- | --- | --- | --- | --- |
35 35
 | `id` | `bigint(20)` | Y | 自增 | 主键 |
36
-| `main_drug_name` | `varchar(64)` | Y | — | 主药名称(业务 1~20 字符;保存前 trim;**不限制全表唯一**) |
37
-| `compat_result` | `varchar(64)` | N | NULL | 配伍结果(选填,业务 ≤50 字符) |
36
+| `main_drug_name` | `varchar(64)` | Y | — | 主药名称(业务 1~20 字符;保存前 trim;**可重复**,每条标准为一个配伍组) |
37
+| `compat_result` | `varchar(64)` | N | NULL | 配伍结果(选填,本组共用,业务 ≤50 字符) |
38 38
 | `kb_sync_status` | `tinyint(4)` | Y | `0` | `0` 未同步,`1` 已同步 |
39 39
 | `kb_doc_id` | `varchar(128)` | N | NULL | 知识库文档 ID |
40 40
 | `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | — | — |
@@ -119,7 +119,9 @@ CREATE TABLE `biz_drug_incompatibility_companion` (
119 119
 | 3.6 | 同步知识库 | POST | `/drugIncompatibility/standard/syncKb/{id}` | `drugIncompatibility:standard:syncKb` | 前置 `kb_sync_status=0`;成功则 `kb_sync_status=1`,写入 `kb_doc_id` |
120 120
 | 3.7 | 移出知识库 | POST | `/drugIncompatibility/standard/removeKb/{id}` | `drugIncompatibility:standard:removeKb` | 前置 `kb_sync_status=1`;成功则 `kb_sync_status=0`,清空 `kb_doc_id` |
121 121
 
122
-**请求体(3.3 / 3.4)摘要**:`mainDrugName` 1~20(**不校验全表唯一**);`compatResult` 选填 ≤50(空串存 `NULL`);`companions` 至少 1 条;每条 `companionDrugName` 1~20;trim 后**互不相同**且**均不等于** `mainDrugName`(`DrugIncompatibilityStandardValidation` + `BizDrugIncompatibilityStandardServiceImpl`)。
122
+**请求体(3.3 / 3.4)摘要**:`mainDrugName` 1~20(**可重复**,每条记录为一个配伍组);`compatResult` 选填 ≤50,组内共用(空串存 `NULL`);`companions` 至少 1 条;每条 `companionDrugName` 1~20;trim 后**互不相同**且**均不等于** `mainDrugName`(`DrugIncompatibilityStandardValidation` + `BizDrugIncompatibilityStandardServiceImpl`)。
123
+
124
+**App 用药工具**:配伍检查按命中药对取该组 `compat_result`;查询药物按组拼接展示 `组内药物(配伍结果)`,多组以 `;` 分隔(见 `doc/app/用药工具/`)。
123 125
 
124 126
 ---
125 127