Bladeren bron

Merge branch 'byll' into knowledgePlat

luolei 4 jaren geleden
bovenliggende
commit
c173f3e636

+ 39 - 12
src/api/config.js

@@ -4,7 +4,7 @@ const testUrl = 'http://192.168.2.236:5050'
 export default {
   host: 'http://192.168.2.121:5050',
   // imgHost: 'http://192.168.2.121:82',      //富文本编辑器图片回传地址
-  imgHost:'http://192.168.2.121:82',      //富文本编辑器图片回传地址
+  imgHost:'http://192.168.2.236:82',      //富文本编辑器图片回传地址
   delayTime: 500,
   urls: {
     /* 登录注册相关接口 */
@@ -481,6 +481,7 @@ export default {
     'updateDisclaimerInformationsCDSS': '/api/cdssman/disclaimerInfo/updateDisclaimerInformations',   //修改免责申明详情
 
     'getListDicCDSS': '/api/cdssman/sys/dictionaryInfo/getList',   //返回字典信息(界面返回)
+    'getListBack': '/api/cdssman/sys/dictionaryInfo/getListBack',   //返回字典信息(后台返回)
 
     'getKlmEnumsDataCDSS': '/api/cdssman/getKlmEnumsData',   //枚举数据获取
 
@@ -518,17 +519,43 @@ export default {
     'getRunningStatus': '/api/cdssman/test/running/getStatus',   //查看测试用例运行状态
     'getRunningStatusByHospitalId': '/api/cdssman/test/running/getStatusByHospitalId',   //查拉面所有测试用例运行状态
     'updateRunningStatus': '/api/cdssman/test/running/updateStatus',   //更新测试用例运行状态
-      //知识库规则维护
-      'zskRuleList':'/api/cdssman/klRule/getKlRuleInfoPage',//规则列表
-      'zskAddRule':'/api/cdssman//klRule/saveRuleInfo',//添加规则
-      'zskActiveRule':'/api/cdssman/klRule/startRuleInfo',//启用规则
-      'zskDisableRule':'/api/cdssman/klRule/disableRuleInfo',//禁用规则
-      'zskDelRule':'/api/cdssman/klRule/clearRuleInfo',//删除规则
-      'zskRuleDetail':'/api/cdssman/klRule/getByIdRuleInfo',//规则详情
-      'zskTypeList':'/api/cdssman/klRulePlan/getMenu',//类型列表
-      'zskSearchConcept':'/api/cdssman/klDisease/searchConcept',//知识库搜索术语
-      'zskUpdateAll':'/api/cdssman/cache/clearRuleAll',//更新数据
-
+    //知识库规则维护
+    'zskRuleList':'/api/cdssman/klRule/getKlRuleInfoPage',//规则列表
+    'zskAddRule':'/api/cdssman//klRule/saveRuleInfo',//添加规则
+    'zskActiveRule':'/api/cdssman/klRule/startRuleInfo',//启用规则
+    'zskDisableRule':'/api/cdssman/klRule/disableRuleInfo',//禁用规则
+    'zskDelRule':'/api/cdssman/klRule/clearRuleInfo',//删除规则
+    'zskRuleDetail':'/api/cdssman/klRule/getByIdRuleInfo',//规则详情
+    'zskTypeList':'/api/cdssman/klRulePlan/getMenu',//类型列表
+    'zskSearchConcept':'/api/cdssman/klDisease/searchConcept',//知识库搜索术语
+    'zskUpdateAll':'/api/cdssman/cache/clearRuleAll',//更新数据
+
+    //知识库树形图
+    'getTree':'/api/cdssman/multContact/getTree',//获取当前type数据
+    'searchTreeItem':'/api/cdssman/multContact/getAllForRelation',//检索树元素
+    'addTreeRelation':'/api/cdssman/multContact/addRelation',//保存树元素
+    //知识库基础维护
+    'getBaseConceptInfoPage':'/api/cdssman/graph/klConcept/getConceptInfoPage',
+    'startConcept':'/api/cdssman/graph/klConcept/startConcept',
+    'disableConcept':'/api/cdssman/graph/klConcept/disableConcept',
+    'baseTypeGetPage':'/api/cdssman/kl/lexicon/getPage',
+    'baseRelationTypeGetPage':'/api/cdssman/kl/lexiconRelationship/getPage',
+    'clearStandRuleDrug':'/api/cdssman/cache/clearStandRuleDrug',
+    'saveBaseConceptInfo':'/api/cdssman/graph/klConcept/saveConceptInfo',
+    'getBaseConceptAll':'/api/cdssman/graph/klConcept/getConceptAll',
+    'clearConceptInfo':'/api/cdssman/graph/klConcept/clearConceptInfo',
+    //疾病相关维护
+    'getDiseasePage':'/api/cdssman/klDisease/getDiseasePage',
+    'diseaseDelete':'/api/cdssman/klDisease/delete',
+    'getBaseDetail':'/api/cdssman/klDisease/getDetail',
+    'searchConcept':'/api/cdssman/klDisease/searchConcept',
+    'diseaseBaseSave':'/api/cdssman/klDisease/save',
+    //静态知识术语
+    'staticBaseKnowledge':'/api/cdssman/kl/conceptInfo/getPage',
+    'changeBaseStatus':'/api/cdssman/kl/conceptInfo/changeStatus',
+    'getBaseRecordById':'/api/cdssman/kl/conceptInfo/getRecordById',
+    'saveBaseOrUpdateRecord':'/api/cdssman/kl/conceptInfo/saveOrUpdateRecord',
+    'staticKnowledgeBaseInfo':'/api/cdssman/kl/conceptInfo/staticKnowledgeIndexWithoutInfo',
   },
   menuIconList: { //菜单对应图标
     'YH-KZT': 'el-icon-menu',

+ 85 - 0
src/api/knowledgeTree.js

@@ -0,0 +1,85 @@
+import axios from 'axios';
+import config from '@api/config.js';
+const urls = config.urls;
+function request(config) {
+  const instance = axios.create({
+    baseURL: "http://192.168.2.121:7010",
+    timeout: 500000,
+    headers: {
+      'Content-Type': "application/json;charset=utf-8"
+    }
+  })
+  return instance(config)
+}
+
+export default {
+  addTreeRelation(param) {
+    return axios.post(urls.addTreeRelation, param);
+  },
+  getTreeSearchList(param) {
+    return axios.post(urls.searchTreeItem, param);
+  },
+  getlistTree(param) {
+    return axios.post(urls.getTree, param);
+  },
+  getBaseConceptInfoPage(param) {
+    return axios.post(urls.getBaseConceptInfoPage, param);
+  },
+  disableConcept(param) {
+    return axios.post(urls.disableConcept, param);
+  },
+  startConcept(param) {
+    return axios.post(urls.startConcept, param);
+  },
+  baseTypeGetPage(param) {
+    return axios.post(urls.baseTypeGetPage, param);
+  },
+  clearStandRuleDrug(param) {
+    return axios.post(urls.clearStandRuleDrug, param);
+  },
+  saveBaseConceptInfo(param) {
+    return axios.post(urls.saveBaseConceptInfo, param);
+  },
+  getBaseConceptAll(param) {
+    return axios.post(urls.getBaseConceptAll, param);
+  },
+  baseRelationTypeGetPage(param) {
+    return axios.post(urls.baseRelationTypeGetPage, param);
+  },
+  getDiseasePage(param) {
+    return axios.post(urls.getDiseasePage, param);
+  },
+  staticBaseKnowledge(param) {
+    return axios.post(urls.staticBaseKnowledge, param);
+  },
+  getListBack(param) {//字典信息
+    return axios.post(urls.getListBack, param);
+  },
+  changeBaseStatus(param) {//字典信息
+    return axios.post(urls.changeBaseStatus, param);
+  },
+  getBaseRecordById(param) {//获取静态知识详情
+    return axios.post(urls.getBaseRecordById, param);
+  },
+  saveBaseOrUpdateRecord(param) {//保存静态知识
+    return axios.post(urls.saveBaseOrUpdateRecord, param);
+  },
+  staticKnowledgeBaseInfo(param) {//搜索静态知识
+    return axios.post(urls.staticKnowledgeBaseInfo, param);
+  },
+  diseaseDelete(param) {//删除诊断依据
+    return axios.post(urls.diseaseDelete, param);
+  },
+  getBaseDetail(param) {//获取疾病详情
+    return axios.post(urls.getBaseDetail, param);
+  },
+  searchConcept(param) {//查询疾病
+    return axios.post(urls.searchConcept, param);
+  },
+  diseaseBaseSave(param) {//保存疾病
+    return axios.post(urls.diseaseBaseSave, param);
+  },
+  clearConceptInfo(param) {//删除同义词
+    return axios.post(urls.clearConceptInfo, param);
+  },
+};

+ 124 - 91
src/components/basicKnow/AddTerm.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <crumbs :title="minTitle" :param="$route.params" linkTo="MedicalName"></crumbs>
+    <crumbs :title="minTitle" :param="$route.params" linkTo="BasicTermsMaintenance"></crumbs>
     <div class="contents">
       <div class="content">
         <h3>添加术语:</h3>
@@ -95,7 +95,7 @@
               <td class="descs">术语性质</td>
               <td v-if="id">操作</td>
             </tr>
-            <tr v-for="(item,index) in allwords">
+            <tr v-for="(item,index) in allwords" :key="index">
               <td class="ind">{{index+1}}</td>
               <td :title="item.name&&item.name.length>9?item.name:''">
                 <!-- 使用原生input,输入限制 -->
@@ -130,7 +130,6 @@
                 />
               </td>
               <td>
-                <!-- {{data.type}} -->
                 <template v-if="index==0&&copy">
                   <el-select
                     v-model="data.type"
@@ -157,7 +156,7 @@
               <td class="desc">{{item.isConcept == 1?"标准词":"同义词"}}</td>
               <td v-if="id">
                 <span class="displayColor" v-if="item.isConcept == 1">删除</span>
-                <span @click="deleLine(index,55)" class="delete" v-else>删除</span>
+                <span @click="deleLine(index,55,item)" class="delete" v-else>删除</span>
               </td>
             </tr>
             <tr @click="addSpan(55)">
@@ -175,6 +174,7 @@
                 <el-radio
                   v-for="(item,index) in allwords"
                   :label="index"
+                  :key="index"
                   :disabled="index == 0"
                 >选为标准词</el-radio>
               </el-radio-group>
@@ -191,7 +191,7 @@
             <td class="desc">说明</td>
             <td v-if="id">操作</td>
           </tr>
-          <tr v-for="(item,index) in synonymous">
+          <tr v-for="(item,index) in synonymous" :key="index">
             <td class="ind">{{index+1}}</td>
             <td :title="item.name&&item.name.length>9?item.name:''">
               <!-- 使用原生input,输入限制 -->
@@ -224,7 +224,7 @@
               <input v-model="item.remark" placeholder="请输入术语说明" maxlength="120" />
             </td>
             <td v-if="id">
-              <span @click="deleLine(index)" class="delete">删除</span>
+              <span @click="deleLine(index,1,item)" class="delete">删除</span>
             </td>
           </tr>
           <tr @click="addSpan">
@@ -236,7 +236,7 @@
           <el-form label-width="150px">
             <el-form-item label="性别:">
               <el-select v-model="sexType">
-                <el-option v-for="(it,i) in sex" :label="it.name" :value="it.name"></el-option>
+                <el-option v-for="(it,i) in sex" :key="i" :label="it.name" :value="it.name"></el-option>
               </el-select>
             </el-form-item>
             <el-form-item label="年龄:" class="ages">
@@ -259,7 +259,7 @@
             </el-form-item>
             <el-form-item label="归属类型:" v-if="dioType" class="marT">
               <el-select v-model="dioType">
-                <el-option v-for="(it,i) in dioTypeList" :label="it.name" :value="it.val"></el-option>
+                <el-option v-for="(it,i) in dioTypeList" :key="i" :label="it.name" :value="it.val"></el-option>
               </el-select>
             </el-form-item>
             <el-form-item
@@ -290,7 +290,7 @@
   </div>
 </template>
 <script type="text/javascript">
-import api from '@api/icss.js';
+import api from '@api/knowledgeTree.js';
 import pinyin from '../../js/Convert_Pinyin.js';
 import utils from '@api/utils.js';
 import SimilarListDrag from './SimilarListDrag';
@@ -302,6 +302,7 @@ export default {
       data: {
         name: '',
         type: '',
+        code: '',
         remark: '',
         isConcept: 1,
         spell: ''
@@ -354,7 +355,7 @@ export default {
   },
   created() {
     this.getTypeList();
-    const id = this.$route.params.id || '';
+    const id = this.$route.params.id;
     const copy = this.$route.params.copy || '';
     this.copy = copy;
     if (id) {
@@ -402,7 +403,6 @@ export default {
         if (data.code == 0) {
           this.deptList = data.data;
           if (!conptId) {
-            console.log('this.deptListArr');
             this.dept = '全科'; //默认展示全科
           } else {
             // 科室id转成name显示
@@ -456,30 +456,55 @@ export default {
         this.radioVal = '';
       }
     },
+    reViewData(data) {
+      let tmpObj = [{
+        isConcept: data.isConcept,
+        name: data.libName,
+        remark: data.remark,
+        spell: data.spell,
+        type: data.typeName,
+        conceptId: data.conceptId,
+        libId: data.libId,
+        isHasCommon: data.isHasCommon,
+        synonymName: data.synonymName,
+        status: data.status,
+        typeId: data.libType
+      }]
+      for(let i = 0;i < data.klConceptSub.length;i++){
+        let tmp = data.klConceptSub[i]
+        tmp.name = tmp.synonymName
+        tmp.type = tmp.typeName
+        tmp.typeId = tmp.libType
+      }
+      data.libName = tmpObj
+      data.otherNames = data.klConceptSub
+      return data
+    },
     getDetail(ids) {
       if (ids) {
-        api.getMedicalDetail({ conceptId: ids }).then(res => {
+        api.getBaseConceptAll({ conceptId: ids }).then(res => {
           const result = res.data;
+          let redata = this.reViewData(result.data)
           if (result.code == 0) {
-            this.data = result.data.libName[0];
-            this.singleword = result.data.libName;
-            this.synonymous = result.data.otherNames;
-            this.allwords = result.data.libName.concat(result.data.otherNames);
-            this.showMore = result.data.isHasCommon;
-            this.maxAge = result.data.maxAge;
-            this.minAge = result.data.minAge;
-            this.description = result.data.description;
-            this.explains = result.data.explains;
-            const type = result.data.type;
+            this.data = redata.libName[0];
+            this.singleword = redata.libName;
+            this.synonymous = redata.otherNames;
+            this.allwords = redata.libName.concat(redata.otherNames);
+            this.showMore = redata.isHasCommon;
+            this.maxAge = redata.maxAge;
+            this.minAge = redata.minAge;
+            this.description = redata.description;
+            this.explains = redata.explains;
+            const type = redata.type;
 
             if (type == '诊断') {
-              this.dioType = result.data.classify || 'Ⅰ'; //类型,默认展示Ⅰ类
-              const deptConptId = result.data.deptId;
+              this.dioType = redata.classify || 'Ⅰ'; //类型,默认展示Ⅰ类
+              const deptConptId = redata.deptId;
               this.getDioType(true);
               this.getDdeptList(deptConptId);
             }
             // this.sexType = result.data.sexType;
-            let sexType = result.data.sexType;
+            let sexType = redata.sexType;
             this.sex.map((v, i) => {
               if (v.value == sexType) {
                 this.sexType = v.name;
@@ -495,27 +520,27 @@ export default {
       }
     },
     getTypeList() {
-      api
-        .allKnowledgeType({ name: '' })
+      api.baseTypeGetPage({ name: '',size: 1000 })
         .then(res => {
           const data = res.data;
           if (data.code == 0) {
-            // this.typeList = data.data.records;
-            this.typeList = data.data;
+            let types = data.data.records
+            this.typeList = types;
+            // this.typeList = data.data;
             // 类型改成平铺
-            if (data.data.length > 0) {
-              const total = data.data.length;
+            if (types.length > 0) {
+              const total = types.length;
               const average = parseInt(total / 3);
               const mod = total % 3; //余数
-              const firstGroup = data.data.slice(0, average);
+              const firstGroup = types.slice(0, average);
               let secGroup = [];
               let thirdGroup = [];
               if (mod == 2) {
-                secGroup = data.data.slice(average, average * 2 + 1);
-                thirdGroup = data.data.slice(average * 2 + 1, total);
+                secGroup = types.slice(average, average * 2 + 1);
+                thirdGroup = types.slice(average * 2 + 1, total);
               } else {
-                secGroup = data.data.slice(average, average * 2);
-                thirdGroup = data.data.slice(average * 2, total);
+                secGroup = types.slice(average, average * 2);
+                thirdGroup = types.slice(average * 2, total);
               }
               this.options.push(
                 { label: 1, options: firstGroup },
@@ -606,7 +631,7 @@ export default {
             this.unfit = false;
             this.searchType = 'similar';
             this.searchIndex = index;
-            this.getSimilarList(this.synonymous[index].name);
+            this.getSimilarList(current.name);
           }
         }
       }
@@ -628,6 +653,8 @@ export default {
       // e.target.value = e.target.value.replace(/[^a-zA-Z]/g,'');
     },
     getSimilarList(name) {
+      //不知道还有没有用
+      return
       if (!name) {
         this.closeTable();
         return;
@@ -671,12 +698,24 @@ export default {
         })
         .catch(() => {});
     },
-    deleLine(index, type) {
+    deleLine(index, type,item) {
       // 只在界面删除数据,待点确认 后参才真正删除
       if (type == 55) {
-        this.synonymous.splice(index - 1, 1);
-        this.allwords.splice(index, 1);
+        const {libId} = item
+        if(libId){
+          api.clearConceptInfo({libId}).then((res)=>{
+            const result = res.data
+            if(result.code == 0){
+              this.synonymous.splice(index - 1, 1);
+              this.allwords.splice(index, 1);
+            }
+          })
+        }else{
+          this.synonymous.splice(index - 1, 1);
+          this.allwords.splice(index, 1);
+        }
       } else {
+        console.log(2222)
         this.synonymous.splice(index, 1);
       }
     },
@@ -735,12 +774,18 @@ export default {
           return item.name;
         });
       }
-
       let detailList = [];
-      detailList[0] = this.data;
       for (let i = 0; i < realData.length; i++) {
-        realData[i].type = this.data.type;
+        let obj = {}
+        realData[i].synonymName = realData[i].name;
+        realData[i].typeId = this.data.code;
+
+        // obj.isConcept=realData[i].isConcept
+        // obj.remark=realData[i].remark
+        // obj.spell=realData[i].spell
+
         detailList.push(realData[i]);
+        // detailList.push(obj);
       }
       // 校验是否有名称全为数字
       const pattern = /[^0-9]/g;
@@ -764,69 +809,55 @@ export default {
         this.warning('请输入填写单患者界面展示通俗内容');
         return;
       }
-
-      let params;
-      if (this.showMore == 1) {
-        // 下拉文字转code
-        let sexCode;
+      let params,sexCode=null;
+      if (this.showMore == 1) {// 下拉文字转code
         this.sex.map((v, i) => {
           if (v.name == this.sexType) {
             sexCode = v.value;
           }
         });
-
-        if (this.dioType) {
-          const deptList = this.deptList;
-          let conptId = null;
-          for (let i in deptList) {
-            if (deptList[i].name == this.dept) {
-              conptId = deptList[i].conceptId;
-            }
-          }
-          params = {
-            addCptDiseaseExtVO: {
-              classify: this.dioType,
-              deptId: conptId
-            },
-            name: this.data.name,
-            type: this.data.type,
-            detailList: detailList,
-            conceptId: this.copy ? '' : this.id, //复制当新增,把id置空
-            sexType: sexCode,
-            maxAge: this.maxAge,
-            minAge: this.minAge
-          };
-        } else {
-          params = {
-            name: this.data.name,
-            type: this.data.type,
-            detailList: detailList,
-            conceptId: this.copy ? '' : this.id, //复制当新增,把id置空
-            sexType: sexCode,
-            maxAge: this.maxAge,
-            minAge: this.minAge,
-            symptomExtVO: {
-              description: this.description,
-              explains: this.explains
-            }
-          };
+        params = {
+          conceptId: this.copy ? '' : this.id,
+          isConcept: this.data.isConcept,
+          libName: this.data.name,
+          remark: this.data.remark,
+          spell: this.data.spell,
+          status: this.data.status||1,
+          libType: this.data.typeId,
+          typeId:this.data.typeId,
+          synonymName: this.data.synonymName,
+          isHasCommon: this.data.isHasCommon,
+          libId: this.data.libId,
+          klConceptSub:detailList,
+          sexType:sexCode,
+          maxAge:this.maxAge,
+          minAge:this.minAge
         }
-      } else {
+      }else{
         params = {
-          name: this.data.name,
-          type: this.data.type,
-          detailList: detailList,
-          conceptId: this.copy ? '' : this.id
+          conceptId: this.copy ? '' : this.id,
+          isConcept: this.data.isConcept||1,
+          libName: this.data.name,
+          remark: this.data.remark,
+          spell: this.data.spell,
+          libType: this.data.typeId||this.data.code,
+          typeId:this.data.typeId||this.data.code,
+          libId: this.data.libId,
+          status: this.data.status||1,
+          isHasCommon: this.data.isHasCommon||0,
+          synonymName: '',
+          klConceptSub: detailList||[],
         };
       }
+      // return false
       this.saveDisable = true; //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
-      api.addMedicalName(params).then(res => {
+      api.saveBaseConceptInfo(params).then(res => {
         const result = res.data;
         if (result.code == 0) {
           this.warning(res.data.msg || '操作成功', 'success');
           //返回带搜索条件的首页
           this.$router.push({
-            name: 'MedicalName',
+            name: 'BasicTermsMaintenance',
             params: Object.assign({}, this.$route.params, { currentPage: 1 })
           });
           /*if(flg == 14){
@@ -849,6 +880,7 @@ export default {
       this.typeList.map((v, i) => {
         if (v.name == e) {
           this.showMore = v.isHasCommon;
+          this.data.code = v.code
         }
       });
       if (e == '诊断') {
@@ -872,6 +904,7 @@ tr,
 td {
   list-style: none;
 }
+
 /deep/ .radioWrap .el-radio {
   display: block;
   height: 41px;

+ 212 - 139
src/components/basicKnow/BasicRelationship.vue

@@ -1,89 +1,97 @@
 <template>
   <div>
-    <crumbs title="基础关系类型维护" style="min-width: 980px">
+    <crumbs title="基础关系类型维护" minWidth="995px" class="knowledgeTitle">
       <el-form :inline="true" class="demo-form-inline">
-        <el-form-item label="词性名称:">
-          <el-select size="mini" v-model="filter.hisName" placeholder="请选择" clearable>
+        <el-form-item label="关系类型名称:">
+          <el-select v-model="filter.type" clearable filterable placeholder="请选择" size="mini">
             <el-option
               v-for="item in typeList"
+              :key="item.id"
               :label="item.name"
-              :value="item.orderNo"
-              :key="item.orderNo"
+              :value="item.name"
             ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="数字编码:">
-          <el-input size="mini" v-model="filter.uniqueName" placeholder="请输入" clearable></el-input>
+          <el-input size="mini" type="number" v-model="filter.term" placeholder="请输入编码"></el-input>
         </el-form-item>
-        <el-form-item class="dododo">
+        <el-form-item>
           <el-button size="mini" @click="filterDatas">搜索</el-button>
         </el-form-item>
       </el-form>
     </crumbs>
-    <div class="contents">
+    <div class="contents knowledgeContents">
       <el-table :data="list" border style="width: 100%">
-        <el-table-column :resizable="false" type="index" :index="indexMethod" label="编号" width="60"></el-table-column>
-        <el-table-column :resizable="false" prop="gmtModified" label="关系名称" width="180"></el-table-column>
-        <el-table-column :resizable="false" prop="hisName" label="数字编码" show-overflow-tooltip></el-table-column>
-        <el-table-column :resizable="false" prop="uniqueName" label="操作人" show-overflow-tooltip></el-table-column>
-        <el-table-column :resizable="false" prop="uniqueName" label="操作时间" show-overflow-tooltip></el-table-column>
-        <el-table-column :resizable="false" prop="operate" label="操作">
+        <el-table-column type="index" :index="indexMethod" label="编号" width="60"></el-table-column>
+        <el-table-column prop="name" label="关系类型名称" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="code" label="数字编码" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="modifier" label="操作人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="gmtModified" label="操作时间" show-overflow-tooltip></el-table-column>
+        <el-table-column label="操作" width="160">
           <template slot-scope="scope">
-            <el-button @click="modifyRelation(scope.row)" type="text" size="small">修改</el-button>
+            <el-button
+              type="text"
+              size="small"
+              :disabled="true"
+            >修改</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <div class="pagination pagepage">
-        <el-pagination
-          :current-page.sync="currentPage"
-          @current-change="currentChange"
-          background
-          :page-size="pageSize"
-          :page-sizes="pageSizeArr"
-          @size-change="handleSizeChange"
-          :layout="pageLayout"
-          :total="total"
-        ></el-pagination>
-      </div>
+      <el-pagination
+        :current-page.sync="currentPage"
+        @current-change="currentChange"
+        background
+        :page-size="pageSize"
+        :page-sizes="pageSizeArr"
+        @size-change="handleSizeChange"
+        :layout="pageLayout"
+        :total="total"
+      ></el-pagination>
     </div>
   </div>
 </template>
 
 <script>
-import api from '@api/icss.js';
+import api from '@api/knowledgeTree.js';
 import config from '@api/config.js';
 import utils from '@api/utils.js';
 
 export default {
-  name: 'Fusion', //化验大小项和公表维护
+  name: 'BasicTermsMaintenance',
   data: function() {
     return {
       list: [],
-      typeList: [],
-      searched: false,
-      filter: {
-        hisName: '', // 医院诊断名称
-        uniqueName: '', //标准诊断名称
-      },
+      stateSelect:[
+          {id:'N',name:'启用'},
+          {id:'Y',name:'禁用'},
+      ],
+      // isState:'',
+      cacheData: {}, //因为删除和恢复要及时更新,所以不做缓存
       currentPage: 1,
       pageSize: config.pageSize,
       pageSizeArr: config.pageSizeArr,
       pageLayout: config.pageLayout,
       total: 0,
-      uploadInfo: '导入'
+      searched: false,
+      filter: {
+        term: '',
+        type: '',
+        libName: '',
+      },
+      typeList: [],
+      reloadFlag: true
     };
   },
   created() {
+    // this.getDataList();
+    this.getTypeList();
     const that = this;
     //返回时避免参数未赋值就获取列表
     setTimeout(function() {
-      that.clearFilter();
-      // that.getDataList();
     });
-    // 非首页 编辑页返回 设置 this.currentPage
-    if (Object.keys(this.$route.params).length !== 0) {
-      this.currentPage = this.$route.params.currentPage;
-    }
+    this.$nextTick(()=>{
+      that.getDataList();
+    })
   },
   watch: {
     filter: {
@@ -110,144 +118,209 @@ export default {
       );
       this.getDataList();
     },
-
-    // 获取列表数据
+    reloadLib() {
+      if (this.reloadFlag) {
+        this.reloadFlag = false;
+        api.clearStandRuleDrug().then(res => {
+          if (res.data.code == 0) {
+            this.reloadFlag = true;
+          }
+        });
+      }
+    },
+    addMedicalName() {
+      const pam = this.searched
+        ? {
+            currentPage: this.currentPage,
+            pageSize: this.pageSize,
+            filter: this.filter
+          }
+        : { currentPage: this.currentPage, pageSize: this.pageSize };
+      this.$router.push({ name: 'AddTerm', params: pam });
+    },
+    filterDatas() {
+      this.currentPage = 1;
+      this.getDataList();
+    },
     getDataList(isTurnPage) {
-      const params = this.getFilterItems(isTurnPage);
+      const param = this.getFilterItems(isTurnPage);
       this.searched = true;
-      const loading = this.$loading({
-        lock: true,
-        text: 'Loading',
-        spinner: 'el-icon-loading',
-        background: 'rgba(0, 0, 0, 0.7)'
-      });
-      api.getFusionPage(params).then(res => {
-        loading.close();
-        if (res.data.code === '0') {
-          this.list = res.data.data && res.data.data.records;
-        }
-        this.total = res.data.data && res.data.data.total;
-        if (this.inCurrentPage !== undefined) {
-          this.currentPage = this.inCurrentPage;
-          this.inCurrentPage = undefined;
-        }
-      });
+      // const loading = this.$loading({
+      //   lock: true,
+      //   text: 'Loading',
+      //   spinner: 'el-icon-loading',
+      //   background: 'rgba(0, 0, 0, 0.7)'
+      // });
+      api.baseRelationTypeGetPage(param)
+        .then(res => {
+          // loading.close();
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            const templis = data.records;
+            for(let i = 0;i < templis.length;i++){
+              templis[i].isDeleted = templis[i].status=='1'?'N':'Y'
+            }
+            this.list = templis;
+            // this.cacheData[param.current] = data.records;
+            this.total = data.total;
+            if (this.inCurrentPage !== undefined) {
+              this.currentPage = this.inCurrentPage;
+              this.inCurrentPage = undefined;
+            }
+          }
+        })
+        .catch(error => {
+          console.log(error);
+        });
     },
-
-    // 处理列表请求数据参数
+    getTypeList() {
+      api
+        .baseRelationTypeGetPage({ name: '',size: 1000 })
+        .then(res => {
+          const data = res.data;
+          if (data.code == 0) {
+            this.typeList = data.data.records||[];
+          } else {
+            console.log(res.msg);
+          }
+        })
+        .catch(error => {
+          console.log(error);
+        });
+    },
+    /*getDetailList(id) {
+        this.$router.push({name:'DeptInfoDetail', params:{id: id}})
+      },*/
     getFilterItems(isTurnPage) {
       //翻页时筛选条件没点确定则清空
       if (isTurnPage && !this.searched) {
         this.clearFilter();
       }
       const param = {
+        "code": this.filter.term.trim(),
+        "name": this.filter.type,
         current: this.inCurrentPage || this.currentPage,
         size: this.pageSize,
-        hisName: this.filter.hisName.trim(),
-        uniqueName: this.filter.uniqueName.trim(),
-        uniqueCode: ''
       };
       return param;
     },
-
-    filterDatas() {
-      this.currentPage = 1;
-      this.getDataList();
-    },
-
-    // 跳转至编辑页面
-    modifyRelation(row) {
-      // const item = Object.assign({}, row);
-      // const pam = this.searched
-      //   ? {
-      //       currentPage: this.currentPage,
-      //       pageSize: this.pageSize,
-      //       filter: this.filter
-      //     }
-      //   : { currentPage: this.currentPage, pageSize: this.pageSize };
-      // this.$router.push({
-      //   name: 'AddFusion',
-      //   params: Object.assign(pam, { isEdit: true, data: item })
-      // });
+    indexMethod(index) {
+      return (this.currentPage - 1) * this.pageSize + index + 1;
     },
     currentChange(next) {
       this.currentPage = next;
-      this.getDataList(true);
       // if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
-      //     this.list = this.cacheData[next];
+      //   this.list = this.cacheData[next];
       // } else {
-      //     this.getDataList();
+      this.getDataList(true);
       // }
     },
-    // 清空搜索参数
-    clearFilter() {
-      this.filter = {
-        hisName: '',
-        uniqueName: ''
-      };
-    },
-
-    indexMethod(index) {
-      return (this.currentPage - 1) * this.pageSize + index + 1;
-    },
-    getTagType(val) {
-      return val;
-    },
     warning(msg, type) {
       this.$message({
         showClose: true,
         message: msg,
         type: type || 'warning'
       });
+    },
+    showConfirmDialog(msg, resolve) {
+      this.$alert(msg, '提示', {
+        confirmButtonText: '确定',
+        type: 'warning'
+      })
+        .then(() => {
+          resolve();
+        })
+        .catch(() => {});
+    },
+    showDelDialog(item) {
+      /*const param = {
+          term:item.term,
+          type:item.type,
+          id:item.id
+        }*/
+      const param = {
+        conceptId: item.conceptId
+      };
+      let url = item.isDeleted === 'N'?'disableConcept':'startConcept'
+      let waringTxt =
+        item.isDeleted === 'N'
+          ? '是否禁用该标准术语?'
+          : '是否重新启用该条数据?';
+      this.showConfirmDialog(waringTxt, () => {
+        api[url](param)
+          .then(res => {
+            if (res.data.code == '0') {
+              if (!this.searched) {
+                //未点确认时清空搜索条件
+                this.clearFilter();
+              }
+              if (item.isDeleted !== 'N') {
+                //恢复成功后跳转到筛选条件的首页
+                this.currentPage = 1;
+              } else {
+                if (this.filter.isState !== '' && this.list.length === 1) {
+                  //有启用状态筛选条件且当前页只有最后一条数据删除时,删除成功后跳转到前一页
+                  this.currentPage =
+                    this.currentPage === 1 ? 1 : this.currentPage - 1;
+                }
+              }
+              this.warning(res.data.msg || '操作成功', 'success');
+              this.getDataList();
+            } else {
+              this.warning(res.data.msg);
+            }
+          })
+          .catch(error => {
+            this.warning(error);
+          });
+      });
+    },
+    clearFilter() {
+      this.filter = {
+        term: '',
+        type: '',
+        libName: '',
+        isState: ''
+      };
     }
   }
 };
 </script>
 
-
-<style lang="less">
+<style lang="less" scoped>
 @import '../../less/admin.less';
+
+/deep/ .container.knowledgeTitle {
+  height: 40px;
+}
+/deep/ .contents.knowledgeContents {
+  padding: 64px 20px 0;
+}
+/deep/ .secLine.el-form {
+  float: right;
+  display: block;
+  position: relative;
+  top: -5px;
+}
 .delete {
   color: red;
 }
-.delete:hover {
+.review {
+  color: #22ccc8;
+}
+.deletes {
+  cursor: default;
   color: red;
 }
-.pagination {
-  min-width: 1010px;
+.reviews {
+  color: #606266;
+  cursor: default;
 }
-.downTemplate {
-  margin-right: 8px;
-  span {
-    color: #02a7f0;
-  }
+.el-table .cell {
+  overflow: hidden;
+  white-space: nowrap;
 }
 #upFile {
   display: none !important;
 }
-.el-message-box {
-  /deep/.cancelBtn {
-    background-color: #d7d7d7;
-    border-color: transparent;
-  }
-  /deep/.confirmC {
-    background-color: #ff545b !important;
-    border-color: transparent !important;
-  }
-}
-.exportBox6 {
-  /deep/ .el-message-box__btns {
-    margin-top: 20px;
-  }
-  /deep/ .el-message-box__message {
-    // text-align: center;
-  }
-  /deep/.leftbtn {
-    background-color: #d7d7d7;
-    border-color: transparent !important;
-  }
-  /deep/ .el-message-box__header {
-    border-bottom: 1px solid #dcdfe6;
-  }
-}
 </style>

+ 55 - 23
src/components/basicKnow/BasicTermsMaintenance.vue

@@ -11,13 +11,23 @@
               v-for="item in typeList"
               :key="item.id"
               :label="item.name"
-              :value="item.name"
+              :value="item.code"
             ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="同义词:">
           <el-input size="mini" v-model="filter.libName" placeholder="输入同义词"></el-input>
         </el-form-item>
+                <el-form-item label="状态:">
+                    <el-select v-model="filter.isState" clearable placeholder="请选择" size="mini">
+                        <el-option
+                                v-for="item in stateSelect"
+                                :key="item.id"
+                                :label="item.name"
+                                :value="item.id">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
         <el-form-item>
           <el-button size="mini" @click="filterDatas">搜索</el-button>
         </el-form-item>
@@ -38,10 +48,15 @@
       <el-table :data="list" border style="width: 100%">
         <el-table-column type="index" :index="indexMethod" label="编号" width="60"></el-table-column>
         <el-table-column prop="libName" label="医学标准术语" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="libType" label="术语类型"></el-table-column>
-        <el-table-column prop="otherNames" label="同义词" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="operName" label="操作人"></el-table-column>
-        <el-table-column prop="operTime" label="操作时间" :show-overflow-tooltip="true"></el-table-column>
+        <el-table-column prop="typeName" label="术语类型"></el-table-column>
+        <el-table-column prop="synonymName" label="同义词" show-overflow-tooltip></el-table-column>
+        <el-table-column label="状态" width="100">
+          <template slot-scope="scope">
+            <span :class="scope.row.isDeleted == 'Y'?'deletes':'reviews'">{{scope.row.isDeleted == 'N'?'启用中':'禁用中'}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="modifierName" label="操作人"></el-table-column>
+        <el-table-column prop="gmtModified" label="操作时间" :show-overflow-tooltip="true"></el-table-column>
         <el-table-column label="操作" width="160">
           <template slot-scope="scope">
             <el-button
@@ -63,7 +78,7 @@
               size="small"
               :class="scope.row.isDeleted == 'N'?'delete':'review'"
               @click="showDelDialog(scope.row)"
-            >{{scope.row.isDeleted == 'N'?'删除':'恢复'}}</el-button>
+            >{{scope.row.isDeleted == 'Y'?'启用':'禁用'}}</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -82,7 +97,7 @@
 </template>
 
 <script>
-import api from '@api/icss.js';
+import api from '@api/knowledgeTree.js';
 import config from '@api/config.js';
 import utils from '@api/utils.js';
 
@@ -91,6 +106,10 @@ export default {
   data: function() {
     return {
       list: [],
+      stateSelect:[
+          {id:'N',name:'启用'},
+          {id:'Y',name:'禁用'},
+      ],
       // isState:'',
       cacheData: {}, //因为删除和恢复要及时更新,所以不做缓存
       currentPage: 1,
@@ -110,12 +129,14 @@ export default {
   },
   created() {
     // this.getDataList();
-    // this.getTypeList();
+    this.getTypeList();
     const that = this;
     //返回时避免参数未赋值就获取列表
     setTimeout(function() {
-      // that.getDataList();
     });
+    this.$nextTick(()=>{
+      that.getDataList();
+    })
   },
   watch: {
     filter: {
@@ -145,7 +166,7 @@ export default {
     reloadLib() {
       if (this.reloadFlag) {
         this.reloadFlag = false;
-        api.reloadLib().then(res => {
+        api.clearStandRuleDrug().then(res => {
           if (res.data.code == 0) {
             this.reloadFlag = true;
           }
@@ -189,13 +210,16 @@ export default {
         spinner: 'el-icon-loading',
         background: 'rgba(0, 0, 0, 0.7)'
       });
-      api
-        .knowledgeName(param)
+      api.getBaseConceptInfoPage(param)
         .then(res => {
           loading.close();
           if (res.data.code == '0') {
             const data = res.data.data;
-            this.list = data.records;
+            const templis = data.records;
+            for(let i = 0;i < templis.length;i++){
+              templis[i].isDeleted = templis[i].status=='1'?'N':'Y'
+            }
+            this.list = templis;
             // this.cacheData[param.current] = data.records;
             this.total = data.total;
             if (this.inCurrentPage !== undefined) {
@@ -210,11 +234,11 @@ export default {
     },
     getTypeList() {
       api
-        .allKnowledgeType({ name: '' })
+        .baseTypeGetPage({ name: '',size: 1000 })
         .then(res => {
           const data = res.data;
           if (data.code == 0) {
-            this.typeList = data.data;
+            this.typeList = data.data.records||[];
           } else {
             console.log(res.msg);
           }
@@ -232,11 +256,12 @@ export default {
         this.clearFilter();
       }
       const param = {
-        name: this.filter.term.trim(),
+        "libName": this.filter.term.trim(),
+        "libType": this.filter.type,
+        "status": this.filter.isState=='N'?'1':this.filter.isState=='Y'?'0':'',
+        "synonymName": this.filter.libName.trim(),
         current: this.inCurrentPage || this.currentPage,
         size: this.pageSize,
-        type: this.filter.type,
-        libName: this.filter.libName.trim(),
         isDeleted: this.filter.isState
       };
       return param;
@@ -276,16 +301,15 @@ export default {
           id:item.id
         }*/
       const param = {
-        conceptId: item.conceptId,
-        isDeleted: item.isDeleted === 'N' ? 'Y' : 'N'
+        conceptId: item.conceptId
       };
+      let url = item.isDeleted === 'N'?'disableConcept':'startConcept'
       let waringTxt =
         item.isDeleted === 'N'
-          ? '是否删除该标准术语?'
+          ? '是否禁用该标准术语?'
           : '是否重新启用该条数据?';
       this.showConfirmDialog(waringTxt, () => {
-        api
-          .deletMedicalName(param)
+        api[url](param)
           .then(res => {
             if (res.data.code == '0') {
               if (!this.searched) {
@@ -345,6 +369,14 @@ export default {
 .review {
   color: #22ccc8;
 }
+.deletes {
+  cursor: default;
+  color: red;
+}
+.reviews {
+  color: #606266;
+  cursor: default;
+}
 .el-table .cell {
   overflow: hidden;
   white-space: nowrap;

+ 113 - 0
src/components/basicKnow/SearchList.vue

@@ -0,0 +1,113 @@
+<template>
+  <div class="conceptSearch" ref="conceptSearch">
+    <h4  class="conceptTitle">术语(概念ID)搜索</h4>
+    <img class="closeSearch" src="../../images/close-icon.png" @click="closeSearch" alt="">
+    <p class="searchWrap">
+      <img class="search" src="../../images/search.png" alt="搜索">
+      <input v-model.trim="conceptText" @input="searchConcept" type="text" ref="conceptInput" class="searchText" placeholder="请输入关键词搜索">
+    </p>
+    <ul class="conceptList" ref="conceptList">
+      <li 
+        v-for="item in conceptList" 
+        class="conceptItem ellipsis"
+        :title="item.conceptName"
+        @click="selectConcept(item)"
+        :key="item.conceptId">
+        {{item.conceptName}}
+      </li>
+    </ul>
+  </div>
+</template>
+<script>
+import api from '@api/knowledgeTree.js';
+
+export default {
+  props:['conceptList','addLevel'],
+  data(){
+    return {
+      conceptText: '',
+      list: [], //概念列表
+    }
+  },
+  watch:{
+    addLevel:{
+      handler(newName, oldName) {
+        this.conceptText = ''
+        this.list = []
+      },
+      deep: true
+    }
+  },
+  methods:{
+    closeSearch() {
+      this.$emit('closeSearch')
+    },
+    selectConcept(item) {
+      this.$emit('selectConcept',item)
+      this.$emit('closeSearch')
+    },
+    searchConcept() {
+      this.$emit('searchConcept',this.conceptText)
+    },
+  }
+}
+</script>
+<style lang="less" scoped>
+.conceptSearch {
+  position: fixed;
+  right: 20px;
+  top: 180px;
+  bottom: 10px;
+  width: 300px;
+  background: #fff;
+  border: 1px solid #C9C9C9;
+  text-align: center;
+  z-index: 2;
+  padding: 30px;
+  box-sizing: border-box;
+  .conceptTitle {
+    width: 100%;
+    text-align: center;
+    padding: 20px 0;
+  }
+  .searchText {
+    padding: 0 35px 0 15px;
+    width: 100%;
+    height: 34px;
+    border: 1px solid #C9C9C9;
+    box-sizing: border-box;
+  }
+  .conceptList {
+    min-height: 200px;
+    max-height:300px;
+    margin: -2px auto 0;
+    border: 1px solid #E1DFDF;
+    overflow: hidden;
+    overflow-y: auto;
+  }
+  .conceptItem {
+    height: 34px;
+    line-height: 34px;
+    text-align: left;
+    padding: 0 15px;
+    cursor: pointer;
+  }
+  .conceptItem:hover {
+    background: #f5f7fa;
+  }
+  .closeSearch {
+    position: absolute;
+    width: 30px;
+    right: 0;
+    top: 0;
+  }
+  .searchWrap {
+    position: relative;
+    .search {
+      position: absolute;
+      right: 7px;
+      top:8px;
+    }
+  }
+}
+</style>

+ 77 - 0
src/components/basicKnow/TreeTab.vue

@@ -0,0 +1,77 @@
+<template>
+  <div class="tabList">
+    <ul class="clearfix">
+      <li :class="{'curTab':curId==item.id}" 
+        @click="()=>handleTabClick(item.id)" 
+        v-for="item in tab" :key="item.id"
+      >{{item.name}}<span v-if="curId==item.id"></span></li>
+    </ul>
+  </div>
+</template>
+
+<script>
+export default {
+  data(){
+    return {
+      curId:'1',
+        tab:[
+          {name:'化学物质类别',id:'1'},
+          {name:'治疗学类别',id:'2'},
+          {name:'药理学类别',id:'3'},
+          {name:'解剖学类别',id:'4'},
+          {name:'实验室检查类别',id:'7'},
+          {name:'辅助检查类别',id:'8'},
+        ],
+    }
+  },
+  mounted(){
+    let elSide = document.querySelector('.el-aside'),tabWidth = document.querySelector('.tabList');
+    // window.onresize = function(){
+    //   tabWidth = document.querySelector('.tabList')
+    //   tabWidth.style.left = elSide.offsetWidth+20+'px'
+    // }
+    tabWidth.style.left = elSide.offsetWidth+20+'px'
+  },
+  methods:{
+      handleTabClick(id){
+        this.curId = id
+        this.$emit('getTreeList',id)
+      },
+  }
+}
+</script>
+<style lang="less" scoped>
+.tabList {
+  position: fixed;
+  top: 100px;
+  right: 20px;
+  left: 270px;
+  z-index: 10;
+  border-top: 30px solid #dee2ea;
+  border-bottom: 10px solid #dee2ea;
+  box-sizing: border-box;
+  ul {
+      background-color: #fff;
+    li {
+      float: left;
+      height: 60px;
+      line-height: 60px;
+      margin: 0 15px;
+      box-sizing: border-box;
+      cursor: pointer;
+      position: relative;
+      span {
+        position: absolute;
+        bottom: 10px;
+        left: 0;
+        width: 100%;
+        height: 2px;
+        background-color: #21CBC7;
+      }
+    }
+    .curTab {
+        color: #48C5D7;
+    }
+  }
+}
+</style>

+ 3 - 3
src/components/common/Crumbs.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="container clearfix" :style="{'minWidth':minWidth?minWidth:'980px'}">
+  <div class="container clearfix" :style="{'minWidth':minWidth?minWidth:'980px',position:fix?fix:'absolute'}">
     <img
       v-if="linkTo"
       class="return-btn fl"
@@ -17,7 +17,7 @@
 <script>
 export default {
   name: 'crumbs',
-  props: ['title', 'linkTo', 'minWidth', 'param'], //minWidth-有些头部选项比较多,最小宽度需要调整
+  props: ['title', 'linkTo', 'minWidth', 'param','fix'], //minWidth-有些头部选项比较多,最小宽度需要调整
   data: function() {
     return {
       isShowEllipsis: false // 是否显示文字省略号
@@ -65,7 +65,7 @@ div.container {
 
 h4 {
   font-size: 15px;
-  width: 280px;
+  width: auto;
   overflow: hidden; /*超出部分隐藏*/
   white-space: nowrap; /*不换行*/
   text-overflow: ellipsis; /*超出部分文字以...显示*/

+ 1 - 0
src/components/icss/AddMedicinePrompt.vue

@@ -35,6 +35,7 @@
                
                 <InfoParagraph v-for="(f,i) in form.prags"
                                 v-if="!upload"
+                               :key="i"
                                :data="f"
                                :index="i"
                                :total="form.prags.length"

+ 325 - 0
src/components/knowledgeExtra/AboutDisease.vue

@@ -0,0 +1,325 @@
+<template>
+    <div>
+        <crumbs title="疾病相关维护" minWidth="995px">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="疾病名称:">
+                    <el-input size="mini" v-model="filter.term" placeholder="请输入名称"></el-input>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="mini" @click="filterDatas">确认</el-button>
+                    <el-button size="mini" type="warning" style="margin:0 10px"  @click="addMedicalMultR">新增疾病</el-button>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      style="width: 100%">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="60">
+                </el-table-column>
+                <el-table-column
+                        prop="disName"
+                        label="疾病名称"
+                        show-overflow-tooltip>
+                </el-table-column>
+                <el-table-column
+                        prop="modifier"
+                        label="操作人">
+                </el-table-column>
+                <el-table-column
+                        prop="gmtModified"
+                        label="操作时间"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                
+                <el-table-column
+                        label="操作" width="160">
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="toEditProduct(scope.row)">修改</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button type="text" size="small" class="delete" @click="showDelDialog(scope.row)">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           :page-sizes="pageSizeArr"
+                           @size-change="handleSizeChange"
+                           :layout="pageLayout"
+                           :total="total">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+
+<script>
+  import api from '@api/knowledgeTree.js';
+  import config from '@api/config.js';
+  import utils from '@api/utils.js';
+  
+  export default {
+    name: 'AboutDisease',
+    data: function () {
+      return {
+        list: [],
+        stateSelect:[
+          {id:'N',name:'启用中'},
+          {id:'Y',name:'已删除'},
+        ],
+        isState:'',
+        cacheData: {},
+        currentPage: 1,
+        pageSize: config.pageSize,
+        pageSizeArr:config.pageSizeArr,
+        pageLayout:config.pageLayout,
+        total: 0,
+        searched: false,
+        filter: {
+          term:'',
+          type:''
+        },
+        typeList:[]
+      }
+    },
+    created() {
+      const that = this;
+      //返回时避免参数未赋值就获取列表
+      setTimeout(function(){
+        that.getDataList();
+      });
+      // this.getTypeList();
+    },
+    watch: {
+      'filter': {
+        handler: function () {
+          this.searched = false;
+        },
+        deep: true
+      }
+    },
+    beforeRouteEnter(to, from, next){
+      next(vm => {
+        //const pm = to.param;
+        Object.assign(vm,to.params);
+        vm.inCurrentPage=to.params.currentPage;
+      })
+    },
+    methods: {
+      handleSizeChange(val){
+        this.pageSize = val;
+        this.currentPage = utils.getCurrentPage(this.currentPage, this.total, this.pageSize);
+        this.getDataList();
+      },
+      addMedicalMultR(){
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          pageSize:this.pageSize,
+          filter: this.filter
+        } : {currentPage: this.currentPage,
+          pageSize:this.pageSize};
+        this.$router.push({name:'DiseaseTree',
+          params:pam});
+      },
+      toEditProduct(row){
+        const param = {
+          disName: row.disName,
+        };
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          pageSize:this.pageSize,
+          filter: this.filter
+        } : {currentPage: this.currentPage,
+          pageSize:this.pageSize};
+        api.getBaseDetail(param).then((res) => {
+          const {code,data,msg} = res.data;
+          if(code=='0'){
+              const item = Object.assign({},row,data);
+              this.$router.push({name:'DiseaseTree',params:Object.assign(pam, {isEdit: true, data: item})});
+          }else{
+              this.$message({
+              message: msg,
+              type: 'warning'
+              });
+          }
+        })
+      },
+      filterDatas(){
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      getDataList(isTurnPage) {
+        const param = this.getFilterItems(isTurnPage);
+        this.searched = true;
+        const loading = this.$loading({
+            lock: true,
+            text: 'Loading',
+            spinner: 'el-icon-loading',
+            background: 'rgba(0, 0, 0, 0.7)'
+        }); 
+        api.getDiseasePage(param).then((res) => {
+          loading.close()
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records;
+            this.cacheData[param.current] = data.records;
+            this.total = data.total;
+            if(this.inCurrentPage!==undefined){
+              this.currentPage=this.inCurrentPage;
+              this.inCurrentPage = undefined;
+            }
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      getTypeList(){
+        api.allKnowledgeType({'name':''}).then((res)=>{
+          const data = res.data;
+          if(data.code==0){
+            this.typeList = data.data;
+          }else{
+            console.log(res.msg);
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      /*getDetailList(id) {
+        this.$router.push({name:'DeptInfoDetail', params:{id: id}})
+      },*/
+      getFilterItems(isTurnPage) {
+        //翻页时筛选条件没点确定则清空
+        if(isTurnPage&&!this.searched){
+          this.clearFilter();
+        };
+        const param = {
+          disName: this.filter.term.trim(),
+          current: this.inCurrentPage||this.currentPage,
+          size: this.pageSize
+        };
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+          this.list = this.cacheData[next];
+        } else {
+          this.getDataList(true);
+        }
+      },
+      warning(msg,type){
+        this.$message({
+          showClose: true,
+          message:msg,
+          type:type||'warning'
+        })
+      },
+      showConfirmDialog(msg,resolve){
+        this.$alert(msg, '提示', {
+          confirmButtonText: '确定',
+          type: 'warning'
+        }).then(() => {
+          resolve();
+        }).catch(() => {});
+      },
+      showDelDialog(item){
+        /*const param = {
+          term:item.term,
+          type:item.type,
+          id:item.id
+        }*/
+        const param = {
+          disName:item.disName
+        }
+        let waringTxt = '是否删除该关系,可能对现有系统造成影响'
+        this.showConfirmDialog(waringTxt,()=>{
+          api.diseaseDelete(param).then((res)=>{
+            if(res.data.code=='0'){
+              if(!this.searched){
+                //未点确认时清空搜索条件
+                this.clearFilter();
+              }
+              if(this.list.length==1){
+                //当前在最后一页且只有一条数据时,删除后跳到前一页
+                this.currentPage = this.currentPage===1?1:this.currentPage-1;
+              }
+              this.warning(res.data.msg||'操作成功','success');
+              this.getDataList();
+            }else{
+              this.warning(res.data.msg);
+            }
+          }).catch((error)=>{
+            this.warning(error);
+          })
+        });
+      },
+      clearFilter(){
+        this.filter={
+          term:'',
+          type:''
+        };
+      },
+      uploadClick(){
+        let inp = document.getElementById("upFile");
+        inp.click();
+      },
+      uploadFile(e){
+        let fileInfo = e.target.files[0];
+        e.preventDefault();
+        let formData = new FormData();
+        formData.append('uploadfile', fileInfo);
+        const header = {
+          headers:{
+            'Content-Type': 'multipart/form-data'
+          }
+        }
+        api.knowledgeUpload(formData,header).then((res)=>{
+          if(res.data.code==0){
+            this.$message({
+              message: '上传成功',
+              type: 'success',
+            });
+            this.getDataList();
+          }else{
+            this.$message({
+              dangerouslyUseHTMLString: true,
+              message:res.data.msg,
+              type:'warning'
+            });
+          }
+        })
+        
+        //解决上传相同文件不触发change
+        let inp = document.getElementById("upFile");
+        inp.value = "";   
+      },
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    @import "../../less/admin.less";
+    .delete{
+        color: red;
+    }
+    .review{
+      color: #22ccc8;
+    }
+    .el-table .cell{
+      overflow: hidden;
+      white-space: nowrap;
+    }
+    #upFile{
+      display: none !important;
+    }
+</style>

+ 6 - 9
src/components/knowledgeExtra/AddDevKnow.vue

@@ -59,7 +59,7 @@
             @reOrder="reOrder"
             :showType="showType"
           ></DevInfo>
-          <el-form-item v-if="upload" label="标题名称:" prop="fileTitle" label-width="160px">
+          <el-form-item v-if="upload" label="标题名称搜索:" prop="fileTitle" label-width="160px">
             <el-input v-model="form.fileTitle"></el-input>
           </el-form-item>
           <el-form-item
@@ -107,7 +107,7 @@
 /**
  *
  */
-import api from '@api/cdss.js';
+import api from '@api/knowledgeTree.js';
 import DevInfo from './DevInfo';
 import config from '@api/config';
 import $ from 'jquery';
@@ -204,7 +204,6 @@ export default {
   watch: {
     showType: {
       handler(newVal, oldVal) {
-        // console.log('newVal============', newVal, 'oldVal============', oldVal);
         if (newVal !== oldVal) {
           this.form.prags = this.form.prags.map(item => {
             return { ...item, position: [] };
@@ -234,8 +233,7 @@ export default {
           _this.handleClear();
         }, 300);
       }
-      api
-        .getTremList({ id: data.id })
+      api.getBaseRecordById({ id: data.id })
         .then(res => {
           if (res.data.code == '0') {
             const data = res.data.data;
@@ -448,7 +446,7 @@ export default {
       }
       //搜索术语列表
       this.showDrop = true;
-      api.getAllConcept({ inputStr: query.trim(), types: [0] }).then(res => {
+      api.staticKnowledgeBaseInfo({ inputStr: query.trim(), types: [0] }).then(res => {
         this.showDrop = false;
         if (res.data.code === '0') {
           this.terms = res.data.data;
@@ -649,8 +647,7 @@ export default {
     //保存编辑 接口
     sendSaveOrEdit(param) {
       this.isCopy && (param.id = undefined);
-      api
-        .saveTermPrompts(param)
+      api.saveBaseOrUpdateRecord(param)
         .then(res => {
           if (res.data.code === '0') {
             this.isSuccessUpload = 0; // 修改文件上传状态为0
@@ -658,7 +655,7 @@ export default {
             this.isSaveSuccess = true; // 保存成功,可正常退出
             //返回带搜索条件的首页
             this.$router.push({
-              name: 'MedicinePromptCDSS',
+              name: 'StaticInfo',
               params: Object.assign({}, this.$route.params, {
                 currentPage: 1
               })

+ 484 - 0
src/components/knowledgeExtra/DiseaseTree.vue

@@ -0,0 +1,484 @@
+<template>
+  <div class="addMedicalMultRelationWrapper">
+    <crumbs :title="minTitle" fix="fixed" linkTo="AboutDisease"></crumbs>
+    <div class="contents">
+      <div class="content">
+        <div class="addBtn" v-if="list.length == 0">
+          <el-button
+            @click="addConcept"
+          >+ 新 增</el-button>
+        </div>
+
+        <div class="tree">
+          <el-tree
+            :data="list"
+            :props="defaultProps"
+            node-key="conceptId"
+            draggable
+            :allow-drag="allowDrag"
+            :allow-drop="allowDrop"
+            :expand-on-click-node="true"
+            :render-after-expand="true"
+            :highlight-current="true"
+            :default-expanded-keys="defaultExpandedArr"
+            @node-click = "handleNodeClick"
+          >
+            <span class="custom-tree-node" slot-scope="{ node, data }" >
+                <span class="custom-tree-node-name ellipsis" :class="{colorGray: data.isDeletedConcept == 'Y'}" :title="node.label">{{ node.label }}</span>
+                <span class="btn-box">
+                  <el-button
+                      class="btn-add fl"
+                      v-if="data.level < 2 &&data.level>0"
+                      type="text"
+                      size="mini"
+                      @click="(e) => append(data, e)">
+                      + 增加
+                  </el-button>
+                  <el-button
+                      class="btn-del fr"
+                      v-if="data.level != 0"
+                      type="text"
+                      size="mini"
+                      @click="() => remove(node, data)">
+                      删除
+                  </el-button>
+                </span>
+            </span>
+          </el-tree>
+        </div>
+        <div class="btn">
+          <el-button
+            type="primary"
+            :disabled = 'saveDisable'
+            @click="confirm"
+          >确 定</el-button>
+        </div>
+      </div>
+    </div>
+    <SearchList 
+      v-if="showSearch" 
+      :conceptList="conceptList||[]" 
+      :addLevel="addLevel"
+      @closeSearch="closeSearch" 
+      @selectConcept="selectConcept" 
+      @searchConcept="searchConcept" />
+  </div>
+</template>
+<script type="text/javascript">
+import api from '@api/knowledgeTree.js';
+import SearchList from '../basicKnow/SearchList.vue';
+
+export default {
+    name:'DiseaseTree',
+    components:{
+      SearchList
+    },
+    data(){
+      return{
+        minTitle:'疾病相关维护-添加',
+        tab:[
+          {name:'ICD10疾病类别',id:'1'},
+          {name:'科室疾病类别',id:'2'},
+          {name:'药物类别',id:'3'},
+          {name:'症状类别',id:'4'},
+          {name:'手术和操作类别',id:'5'},
+          {name:'实验室检查类别',id:'6'},
+          {name:'辅助检查类别',id:'7'},
+        ],
+        template:{
+          "conceptId": null,
+          "conceptName": "",
+          "nodeList": [{
+            "conceptId": 501,
+            "conceptName": "疾病相关主症状",
+            "nodeList": [],
+            "libType": [103],
+            "level": 1,
+            "sonRelationId": 17,
+            "isExpanded": false
+          }, {
+            "conceptId": 502,
+            "conceptName": "疾病相关次症状",
+            "nodeList": [],
+            "libType": [103],
+            "level": 1,
+            "sonRelationId": 17,
+            "isExpanded": false
+          }, {
+            "conceptId": 503,
+            "conceptName": "疾病相关体格检查结果",
+            "nodeList": [],
+            "libType": [104],
+            "level": 1,
+            "sonRelationId": 17,
+            "isExpanded": false
+          }, {
+            "conceptId": 504,
+            "conceptName": "疾病相关实验室检查套餐",
+            "nodeList": [],
+            "libType": [107],
+            "level": 1,
+            "sonRelationId": 17,
+            "isExpanded": false
+          }, {
+            "conceptId": 505,
+            "conceptName": "疾病相关辅助检查项目",
+            "nodeList": [],
+            "libType": [109, 110],
+            "level": 1,
+            "sonRelationId": 17,
+            "isExpanded": false
+          }, {
+            "conceptId": 506,
+            "conceptName": "疾病相关药物治疗",
+            "nodeList": [],
+            "libType": [101],
+            "level": 1,
+            "sonRelationId": 17,
+            "isExpanded": false
+          }, {
+            "conceptId": 507,
+            "conceptName": "疾病相关手术治疗",
+            "nodeList": [],
+            "libType": [106],
+            "level": 1,
+            "sonRelationId": 17,
+            "isExpanded": false
+          }, {
+            "conceptId": 508,
+            "conceptName": "疾病相关鉴别诊断",
+            "nodeList": [],
+            "libType": [100],
+            "level": 1,
+            "sonRelationId": 17,
+            "isExpanded": false
+          }],
+          "level": 0,
+          "isExpanded": false
+        },
+        curId:'1',
+        list: [],
+        defaultProps: {
+          children: 'nodeList',
+          label: 'conceptName'
+        },
+        conceptList: [], //概念列表
+        showSearch: false,
+        addLevel: 0,  //添加级别
+        excludedConceptIds:[],
+        operaList: [],
+        relationConceptId: '', //关联父类ID
+        level: 0, //层级(修改时只能显示三级)
+        saveDisable: false,  //保存按钮禁止点击
+        defaultExpandedArr: [],
+        relationTypes:[]
+      }
+    },
+    created(){
+      this.getTreeList(1)
+    },
+    methods:{
+      addConcept(e) {
+        this.addLevel = 0;
+        this.openSearch(e);
+      },
+      getTreeList(id){
+      const { isEdit, data } = this.$route.params
+      if(isEdit) {
+          this.isEdit = isEdit
+          this.minTitle = '疾病相关维护-修改'
+          const paramData = JSON.parse(JSON.stringify(data))
+          let result = paramData.diseaseDetailDTO||{}
+          // this.relationTypes = paramData.types[0]||[]
+          const itemStr = JSON.stringify(result)
+          let tmp = itemStr.replace(/disName/g,'conceptName').replace(/rname/g,'conceptName').replace(/datas/g,'nodeList').replace(/details/g,'nodeList').replace(/id/g,'conceptId').replace(/sconceptId/g,'conceptId').replace(/rconceptId/g,'conceptId').replace(/libName/g,'conceptName')
+          let item = JSON.parse(tmp)
+          item.level = 0
+          item.isExpanded = false
+          item.nodeList = this.IteraNodeList(item.nodeList, [], 1)
+          let arr = []
+          arr[0] = item
+          this.list = [...arr]
+      }
+      },
+      allowDrop(draggingNode, dropNode, type) {
+        if(draggingNode.parent.data.conceptName !== dropNode.parent.data.conceptName){
+          return false
+        }else{
+          return type !== 'inner'
+        }
+      },
+      allowDrag(draggingNode) {
+        return draggingNode.data.level != 0;//一级不可拖动
+      },
+      handleNodeClick(data) {
+          if(data.nodeList.length > 0) {
+            if(!data.isExpanded) {
+              this.defaultExpandedArr.push(data.conceptId)
+            } else {
+              this.defaultExpandedArr = this.defaultExpandedArr.filter(item => item !== data.conceptId)
+            }
+            this.$set(data, 'isExpanded', !data.isExpanded);
+          }
+      
+      },
+      confirm() { 
+        if(!this.list[0] || this.list[0].nodeList.length == 0) {
+          this.message('请输入数据信息');
+          return
+        }
+        const param = {
+          conceptId: this.list[0].conceptId,
+          sonRelationId: 17,
+          isOrderBy: 1
+        }
+        const nodeListResult = []
+        this.IteraNodeList(this.list[0].nodeList, nodeListResult, 0)
+        param.nodeList = nodeListResult
+        this.saveDisable = true  //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
+        api.diseaseBaseSave(this.reparams(param)).then((res) => {
+          const { data } = res
+          if(data.code == '0') {
+            this.message(res.data.msg||'术语关系建立成功','success');
+            this.$router.push({
+              name: 'AboutDisease',
+              params: Object.assign({}, this.$route.params, { currentPage: 1 })
+            });
+          } else {
+            this.message(data.msg);
+          }
+          this.saveDisable = false;
+        })
+      },
+      IteraNodeList(nodeList,  nodeListResult, type, level = 1) {
+        this.level= level + 1
+        for(let i = 0; i <nodeList.length; i++) {
+          let newChild;
+          if(type == '0') { //添加的时候保存所有的id列表
+            newChild = {conceptId: nodeList[i].conceptId,libType:nodeList[i].libType, relationId: 17,nodeList:[],sonRelationId: 17, isExpanded:false}
+          } else if(type == '1') {  //修改的时候添加层级
+            const item = JSON.parse(JSON.stringify(nodeList[i]))
+            newChild = Object.assign(item, {level:  level, nodeList: [],sonRelationId: 17, isExpanded:false})
+          } else if(type == '2') { //移除节点的时候同时移除节点(搜索时排除的id列表)
+            newChild = nodeList[i].conceptId
+          }
+          if(nodeList[i].nodeList &&nodeList[i].nodeList.length > 0&&level < 3) {
+            if(type == '0' || type =='1') {
+              this.IteraNodeList(nodeList[i].nodeList,  newChild.nodeList, type, level+1)
+            } else if(type == '2') {
+              this.IteraNodeList(nodeList[i].nodeList,  nodeListResult, type, level+1)
+            }
+          }
+          newChild&&nodeListResult.push(newChild)
+        }
+        return nodeListResult
+      },
+      searchConcept(txt) {
+        let  excludedConceptIds = [];
+        if(this.list.length>0) {
+          this.excludedConceptIds = this.IteraNodeList(this.list[0].nodeList,excludedConceptIds, 2)
+        }
+        const {libType} = this.operaList
+
+        const params = {
+          "name": txt,
+          "excludedConceptIds": this.excludedConceptIds||[],
+          "libType": this.addLevel == 0?100:libType&&libType[0]||''
+        }
+        api.searchConcept(params).then((res) => {
+          const { data } = res
+          if(data.code == '0') {
+            this.conceptList = data.data
+          }
+        })
+      },
+      selectConcept(item) {
+        if(this.addLevel == 0) {
+          let temp = JSON.parse(JSON.stringify(this.template))
+          temp.conceptId = item.conceptId
+          temp.conceptName = item.conceptName
+          this.list = [temp]
+        }else {
+          const data = this.operaList
+          const newChild = Object.assign({}, item,  {nodeList: [],libType:data.libType, level: data.level+1, conceptId: item.conceptId, relationId: 17,sonRelationId: 17});
+          // const newChild = { id: id++, label: 'nodeList', level: data.level+1, children: [] };
+          if (!data.nodeList) {
+            this.$set(data, 'nodeList', []);
+          }
+          data.nodeList.push(newChild);
+        }
+        this.conceptList = [];
+        this.closeSearch();
+      },
+      openSearch(e) {
+        this.showSearch = true
+      },
+      closeSearch() {
+        this.conceptText = ''
+        this.conceptList = []
+        this.showSearch = false
+      },
+      append(data, e) {
+          this.addLevel = data.level+1;
+          this.relationConceptId = data.conceptId
+          this.operaList = data;
+          this.openSearch(data);
+
+          // const newChild = { id: id++, label: 'testtest', level: data.level+1, nodeList: [] };
+          // if (!data.nodeList) {
+          // this.$set(data, 'nodeList', []);
+          // }
+          // data.nodeList.push(newChild);
+      },
+
+      remove(node, data) {
+          const parent = node.parent;
+          const nodeList = parent.data.nodeList || parent.data;
+          const index = nodeList.findIndex(d => d.conceptId === data.conceptId);
+          nodeList.splice(index, 1);
+      },
+      reparams(param){
+        let params = []
+        const tmplis = param.nodeList||[];
+        for(let i = 0;i < tmplis.length;i++){
+          let item = tmplis[i],sonIds=[]
+          if(item.nodeList&&item.nodeList.length>0){
+            for(let j = 0;j < item.nodeList.length;j++){
+              sonIds.push(item.nodeList[j].conceptId)
+            }
+          }
+          let obj = {
+            "sid": param.conceptId,
+            "rid": item.conceptId,
+            "eids": sonIds,
+            // "eid": item.libType[0],
+            // "srid": 0
+          }
+          params.push(obj)
+        }
+        return params
+      },
+      message(msg,type){
+        this.$message({
+          showClose: true,
+          message:msg,
+          type:type||'warning'
+        })
+      },
+      
+    }
+}
+</script>
+<style lang="less" scoped>
+@import "../../less/admin.less";
+.content {
+  min-width: auto;
+  box-sizing: border-box;
+}
+.contents {
+  box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+.addMedicalMultRelationWrapper {
+  height: calc(100% - 70px);
+}
+.tree {
+  margin-bottom: 230px;
+}
+.contents {
+  height: 100%;
+  padding-top: 60px;
+}
+.btn-box {
+  position: absolute;
+  left: 350px;
+}
+.btn-del {
+  color: #8F8F8F;
+  padding-left: 28px;
+}
+.addBtn {
+  width: 66px;
+  order: 1px solid #21CBC7;
+  border-radius: 2px;
+}
+.conceptSearch {
+  position: fixed;
+  right: 20px;
+  top: 180px;
+  bottom: 10px;
+  width: 300px;
+  background: #fff;
+  border: 1px solid #C9C9C9;
+  text-align: center;
+  z-index: 2;
+  padding: 30px;
+  box-sizing: border-box;
+  .conceptTitle {
+    width: 100%;
+    text-align: center;
+    padding: 20px 0;
+  }
+  .searchText {
+    padding: 0 35px 0 15px;
+    width: 100%;
+    height: 34px;
+    border: 1px solid #C9C9C9;
+    box-sizing: border-box;
+  }
+  .conceptList {
+    min-height: 200px;
+    max-height:300px;
+    margin: -2px auto 0;
+    border: 1px solid #E1DFDF;
+    overflow: hidden;
+    overflow-y: auto;
+  }
+  .conceptItem {
+    height: 34px;
+    line-height: 34px;
+    text-align: left;
+    padding: 0 15px;
+    cursor: pointer;
+  }
+  .conceptItem:hover {
+    background: #f5f7fa;
+  }
+  .closeSearch {
+    position: absolute;
+    width: 30px;
+    right: 0;
+    top: 0;
+  }
+  .searchWrap {
+    position: relative;
+    .search {
+      position: absolute;
+      right: 7px;
+      top:8px;
+    }
+  }
+}
+.delete {
+  cursor: pointer;
+}
+.content{
+  background: #fff;
+  padding: 20px 20px 30px;
+  color: #545455;
+ 
+}
+
+.btn {
+  text-align: right;
+  margin-top: 20px;
+}
+.custom-tree-node-name {
+  display: inline-block;
+  width: 270px;
+}
+.colorGray {
+  color: #c1c1c1;
+} 
+</style>

+ 418 - 0
src/components/knowledgeExtra/KnowledgeAll.vue

@@ -0,0 +1,418 @@
+<template>
+  <div class="addMedicalMultRelationWrapper">
+    <crumbs :title="minTitle" fix="fixed" linkTo="MedicalMultRelation"></crumbs>
+    <TreeTab @getTreeList="getTreeList" />
+    <div class="contents">
+      <div class="content">
+        <div class="addBtn" v-if="list.length == 0">
+          <!-- <el-button
+            @click="addConcept"
+          >+ 新 增</el-button> -->
+        </div>
+
+        <div class="tree">
+          <el-tree
+            :data="list"
+            :props="defaultProps"
+            node-key="conceptId"
+            draggable
+            :allow-drag="allowDrag"
+            :allow-drop="allowDrop"
+            :expand-on-click-node="true"
+            :render-after-expand="true"
+            :highlight-current="true"
+            :default-expanded-keys="defaultExpandedArr"
+            @node-click = "handleNodeClick"
+          >
+            <span class="custom-tree-node" slot-scope="{ node, data }" >
+                <span class="custom-tree-node-name ellipsis" :class="{colorGray: data.isDeletedConcept == 'Y'}" :title="node.label">{{ node.label }}</span>
+                <span class="btn-box">
+                  <el-button
+                      class="btn-add fl"
+                      v-if="data.level < 2"
+                      type="text"
+                      size="mini"
+                      @click="(e) => append(data, e)">
+                      + 增加
+                  </el-button>
+                  <el-button
+                      class="btn-del fr"
+                      v-if="data.level != 0"
+                      type="text"
+                      size="mini"
+                      @click="() => remove(node, data)">
+                      删除
+                  </el-button>
+                </span>
+            </span>
+          </el-tree>
+        </div>
+        <div class="btn">
+          <el-button
+            type="primary"
+            :disabled = 'saveDisable'
+            @click="confirm"
+          >确 定</el-button>
+        </div>
+      </div>
+    </div>
+    <SearchList 
+      v-if="showSearch" 
+      :conceptList="conceptList" 
+      :addLevel="addLevel"
+      @closeSearch="closeSearch" 
+      @selectConcept="selectConcept" 
+      @searchConcept="searchConcept" />
+  </div>
+</template>
+<script type="text/javascript">
+import api from '@api/knowledgeTree.js';
+import SearchList from '../basicKnow/SearchList.vue';
+import TreeTab from '../basicKnow/TreeTab.vue';
+
+export default {
+    name:'KnowledgeAll',
+    components:{
+      SearchList,TreeTab
+    },
+    data(){
+      return{
+        minTitle:'树形结构维护',
+        tab:[
+          {name:'ICD10疾病类别',id:'1'},
+          {name:'科室疾病类别',id:'2'},
+          {name:'药物类别',id:'3'},
+          {name:'症状类别',id:'4'},
+          {name:'手术和操作类别',id:'5'},
+          {name:'实验室检查类别',id:'6'},
+          {name:'辅助检查类别',id:'7'},
+        ],
+        curId:'1',
+        list: [],
+        defaultProps: {
+          children: 'nodeList',
+          label: 'conceptName'
+        },
+        conceptList: [], //概念列表
+        showSearch: false,
+        addLevel: 0,  //添加级别
+        excludedConceptIds:[],
+        operaList: [],
+        relationConceptId: '', //关联父类ID
+        level: 0, //层级(修改时只能显示三级)
+        saveDisable: false,  //保存按钮禁止点击
+        defaultExpandedArr: [],
+        relationTypes:[]
+      }
+    },
+    created(){
+      this.getTreeList(1)
+    },
+    methods:{
+      getTreeList(id){
+        const params = {
+          "type": id,
+        }
+        api.getlistTree(params).then((res) => {
+          const { data } = res
+          if(data.code == '0') {
+            let result = data.data.treeDTO||{}
+            this.relationTypes = data.data.types||[]
+            const itemStr = JSON.stringify(result)
+            let tmp = itemStr.replace(/nextTree/g,'nodeList').replace(/id/g,'conceptId').replace(/name/g,'conceptName')
+            let item = JSON.parse(tmp)
+            item.level = 0
+            item.isExpanded = false
+            item.nodeList = this.IteraNodeList(item.nodeList, [], 1)
+            let arr = []
+            arr[0] = item
+            this.list = [...arr]
+          } else {
+            this.message(data.msg);
+          }
+          this.saveDisable = false;
+        })
+      },
+      allowDrop(draggingNode, dropNode, type) {
+        if(draggingNode.parent.data.conceptName !== dropNode.parent.data.conceptName){
+          return false
+        }else{
+          return type !== 'inner'
+        }
+      },
+      allowDrag(draggingNode) {
+        return draggingNode.data.level != 0;//一级不可拖动
+      },
+      handleNodeClick(data) {
+          if(data.nodeList.length > 0) {
+            if(!data.isExpanded) {
+              this.defaultExpandedArr.push(data.conceptId)
+            } else {
+              this.defaultExpandedArr = this.defaultExpandedArr.filter(item => item !== data.conceptId)
+            }
+            this.$set(data, 'isExpanded', !data.isExpanded);
+          }
+      
+      },
+      // addConcept(e) {
+      //   console.log(e)
+      //   this.addLevel = 0;
+      //   this.openSearch(e);
+      // },
+      confirm() { 
+        if(!this.list[0] || this.list[0].nodeList.length == 0) {
+          this.message('请输入数据信息');
+          return
+        }
+        const param = {
+          conceptId: this.list[0].conceptId,
+          sonRelationId: 17,
+          isOrderBy: 1
+        }
+        const nodeListResult = []
+        this.IteraNodeList(this.list[0].nodeList, nodeListResult, 0)
+        param.nodeList = nodeListResult
+        this.saveDisable = true  //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
+        api.addTreeRelation(this.reparams(param)).then((res) => {
+          const { data } = res
+          if(data.code == '0') {
+            this.message(res.data.msg||'术语关系建立成功','success');
+          } else {
+            this.message(data.msg);
+          }
+          this.saveDisable = false;
+        })
+      },
+      IteraNodeList(nodeList,  nodeListResult, type, level = 1) {
+        this.level= level + 1
+        for(let i = 0; i <nodeList.length; i++) {
+          let newChild;
+          if(type == '0') { //添加的时候保存所有的id列表
+            newChild = {conceptId: nodeList[i].conceptId, relationId: 17,nodeList:[],sonRelationId: 17, isExpanded:false}
+          } else if(type == '1') {  //修改的时候添加层级
+            const item = JSON.parse(JSON.stringify(nodeList[i]))
+            newChild = Object.assign(item, {level:  level, nodeList: [],sonRelationId: 17, isExpanded:false})
+          } else if(type == '2') { //移除节点的时候同时移除节点(搜索时排除的id列表)
+            newChild = nodeList[i].conceptId
+          }
+          
+          if(nodeList[i].nodeList &&nodeList[i].nodeList.length > 0&&level < 3) {
+            if(type == '0' || type =='1') {
+              this.IteraNodeList(nodeList[i].nodeList,  newChild.nodeList, type, level+1)
+            } else if(type == '2') {
+              this.IteraNodeList(nodeList[i].nodeList,  nodeListResult, type, level+1)
+            }
+            
+          }
+          nodeListResult.push(newChild)
+        }
+        return nodeListResult
+      },
+      searchConcept(txt) {
+        let  excludedConceptIds = [];
+        if(this.list[0]) {
+          excludedConceptIds.push(this.list[0].conceptId)
+          this.excludedConceptIds = this.IteraNodeList(this.list[0].nodeList,excludedConceptIds, 2)
+        }
+        const params = {
+          "typeId": this.addLevel === 1 ? this.relationTypes[2] : this.addLevel === 2 ? this.relationTypes[4] : 1,
+          "name": txt,
+          "excludedConceptIds": this.excludedConceptIds,
+          "relationId": this.addLevel === 1 ? this.relationTypes[1] : this.addLevel === 2 ? this.relationTypes[3] : 1,
+          "relationConceptId": this.relationConceptId,
+        }
+        api.getTreeSearchList(params).then((res) => {
+          const { data } = res
+          if(data.code == '0') {
+            this.conceptList = data.data
+          }
+        })
+      },
+      selectConcept(item) {
+        if(this.addLevel == 0) {
+          this.list.push(Object.assign({}, item,  {nodeList: [], level: 0, conceptId: item.conceptId, sonRelationId: 17}))
+          this.list = JSON.parse(JSON.stringify(this.list))
+        }else {
+          const data = this.operaList
+          const newChild = Object.assign({}, item,  {nodeList: [], level: data.level+1, conceptId: item.conceptId, relationId: 17,sonRelationId: 17});
+          // const newChild = { id: id++, label: 'nodeList', level: data.level+1, children: [] };
+          if (!data.nodeList) {
+          this.$set(data, 'nodeList', []);
+          }
+          data.nodeList.push(newChild);
+        }
+        this.conceptList = [];
+        this.closeSearch();
+      },
+      openSearch(e) {
+        this.showSearch = true
+      },
+      closeSearch() {
+        this.conceptText = ''
+        this.conceptList = []
+        this.showSearch = false
+      },
+      append(data, e) {
+          this.addLevel = data.level+1;
+          this.relationConceptId = data.conceptId
+          this.operaList = data;
+          this.openSearch(data);
+
+          // const newChild = { id: id++, label: 'testtest', level: data.level+1, nodeList: [] };
+          // if (!data.nodeList) {
+          // this.$set(data, 'nodeList', []);
+          // }
+          // data.nodeList.push(newChild);
+      },
+
+      remove(node, data) {
+          const parent = node.parent;
+          const nodeList = parent.data.nodeList || parent.data;
+          const index = nodeList.findIndex(d => d.conceptId === data.conceptId);
+          nodeList.splice(index, 1);
+      },
+      reparams(param){
+        let params = []
+        const tmplis = param.nodeList||[];
+        for(let i = 0;i < tmplis.length;i++){
+          let item = tmplis[i],sonIds=[]
+          if(item.nodeList&&item.nodeList.length>0){
+            for(let j = 0;j < item.nodeList.length;j++){
+              sonIds.push(item.nodeList[j].conceptId)
+            }
+          }
+          let obj = {
+            "eid": item.conceptId,
+            "eids": sonIds,
+            "rid": this.relationTypes[1],
+            "sid": param.conceptId,
+            "srid": this.relationTypes[3]
+          }
+          params.push(obj)
+        }
+        return params
+      },
+      message(msg,type){
+        this.$message({
+          showClose: true,
+          message:msg,
+          type:type||'warning'
+        })
+      },
+      
+    }
+}
+</script>
+<style lang="less" scoped>
+@import "../../less/admin.less";
+.content {
+  min-width: auto;
+  box-sizing: border-box;
+}
+.contents {
+  box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+.addMedicalMultRelationWrapper {
+  height: calc(100% - 70px);
+}
+.tree {
+  margin-bottom: 230px;
+}
+.contents {
+  height: 100%;
+  padding-top: 120px;
+}
+.btn-box {
+  position: absolute;
+  left: 350px;
+}
+.btn-del {
+  color: #8F8F8F;
+  padding-left: 28px;
+}
+.addBtn {
+  width: 66px;
+  order: 1px solid #21CBC7;
+  border-radius: 2px;
+}
+.conceptSearch {
+  position: fixed;
+  right: 20px;
+  top: 180px;
+  bottom: 10px;
+  width: 300px;
+  background: #fff;
+  border: 1px solid #C9C9C9;
+  text-align: center;
+  z-index: 2;
+  padding: 30px;
+  box-sizing: border-box;
+  .conceptTitle {
+    width: 100%;
+    text-align: center;
+    padding: 20px 0;
+  }
+  .searchText {
+    padding: 0 35px 0 15px;
+    width: 100%;
+    height: 34px;
+    border: 1px solid #C9C9C9;
+    box-sizing: border-box;
+  }
+  .conceptList {
+    min-height: 200px;
+    max-height:300px;
+    margin: -2px auto 0;
+    border: 1px solid #E1DFDF;
+    overflow: hidden;
+    overflow-y: auto;
+  }
+  .conceptItem {
+    height: 34px;
+    line-height: 34px;
+    text-align: left;
+    padding: 0 15px;
+    cursor: pointer;
+  }
+  .conceptItem:hover {
+    background: #f5f7fa;
+  }
+  .closeSearch {
+    position: absolute;
+    width: 30px;
+    right: 0;
+    top: 0;
+  }
+  .searchWrap {
+    position: relative;
+    .search {
+      position: absolute;
+      right: 7px;
+      top:8px;
+    }
+  }
+}
+.delete {
+  cursor: pointer;
+}
+.content{
+  background: #fff;
+  padding: 40px 20px 30px;
+  color: #545455;
+ 
+}
+
+.btn {
+  text-align: right;
+  margin-top: 20px;
+}
+.custom-tree-node-name {
+  display: inline-block;
+  width: 270px;
+}
+.colorGray {
+  color: #c1c1c1;
+} 
+</style>

+ 329 - 0
src/components/knowledgeExtra/KnowledgeBaseType.vue

@@ -0,0 +1,329 @@
+<template>
+  <div>
+    <crumbs title="基础术语类型维护" minWidth="995px" class="knowledgeTitle">
+      <el-form :inline="true" class="demo-form-inline">
+        <el-form-item label="术语类型:">
+          <el-select v-model="filter.type" clearable filterable placeholder="请选择" size="mini">
+            <el-option
+              v-for="item in typeList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数字编码:">
+          <el-input size="mini" type="number" v-model="filter.term" placeholder="请输入编码"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button size="mini" @click="filterDatas">搜索</el-button>
+        </el-form-item>
+      </el-form>
+    </crumbs>
+    <div class="contents knowledgeContents">
+      <el-table :data="list" border style="width: 100%">
+        <el-table-column type="index" :index="indexMethod" label="编号" width="60"></el-table-column>
+        <el-table-column prop="name" label="术语类型" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="code" label="数字编码" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="isHasCommonCn" label="是否支持通用扩展" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="canChangeCn" label="是否允许修改" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="onlyOneCn" label="是否只有单个词" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="modifier" label="操作人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="gmtModified" label="操作时间" show-overflow-tooltip></el-table-column>
+        <el-table-column label="操作" width="160">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              size="small"
+              :disabled="true"
+            >修改</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        :current-page.sync="currentPage"
+        @current-change="currentChange"
+        background
+        :page-size="pageSize"
+        :page-sizes="pageSizeArr"
+        @size-change="handleSizeChange"
+        :layout="pageLayout"
+        :total="total"
+      ></el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import api from '@api/knowledgeTree.js';
+import config from '@api/config.js';
+import utils from '@api/utils.js';
+
+export default {
+  name: 'KnowledgeBaseType',
+  data: function() {
+    return {
+      list: [],
+      stateSelect:[
+          {id:'N',name:'启用'},
+          {id:'Y',name:'禁用'},
+      ],
+      // isState:'',
+      cacheData: {}, //因为删除和恢复要及时更新,所以不做缓存
+      currentPage: 1,
+      pageSize: config.pageSize,
+      pageSizeArr: config.pageSizeArr,
+      pageLayout: config.pageLayout,
+      total: 0,
+      searched: false,
+      filter: {
+        term: '',
+        type: '',
+        libName: '',
+      },
+      typeList: [],
+      reloadFlag: true
+    };
+  },
+  created() {
+    // this.getDataList();
+    this.getTypeList();
+    const that = this;
+    //返回时避免参数未赋值就获取列表
+    setTimeout(function() {
+    });
+    this.$nextTick(()=>{
+      that.getDataList();
+    })
+  },
+  watch: {
+    filter: {
+      handler: function() {
+        this.searched = false;
+      },
+      deep: true
+    }
+  },
+  beforeRouteEnter(to, from, next) {
+    next(vm => {
+      //const pm = to.param;
+      Object.assign(vm, to.params);
+      vm.inCurrentPage = to.params.currentPage;
+    });
+  },
+  methods: {
+    handleSizeChange(val) {
+      this.pageSize = val;
+      this.currentPage = utils.getCurrentPage(
+        this.currentPage,
+        this.total,
+        this.pageSize
+      );
+      this.getDataList();
+    },
+    reloadLib() {
+      if (this.reloadFlag) {
+        this.reloadFlag = false;
+        api.clearStandRuleDrug().then(res => {
+          if (res.data.code == 0) {
+            this.reloadFlag = true;
+          }
+        });
+      }
+    },
+    addMedicalName() {
+      const pam = this.searched
+        ? {
+            currentPage: this.currentPage,
+            pageSize: this.pageSize,
+            filter: this.filter
+          }
+        : { currentPage: this.currentPage, pageSize: this.pageSize };
+      this.$router.push({ name: 'AddTerm', params: pam });
+    },
+    filterDatas() {
+      this.currentPage = 1;
+      this.getDataList();
+    },
+    getDataList(isTurnPage) {
+      const param = this.getFilterItems(isTurnPage);
+      this.searched = true;
+      // const loading = this.$loading({
+      //   lock: true,
+      //   text: 'Loading',
+      //   spinner: 'el-icon-loading',
+      //   background: 'rgba(0, 0, 0, 0.7)'
+      // });
+      api.baseTypeGetPage(param)
+        .then(res => {
+          // loading.close();
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            const templis = data.records;
+            for(let i = 0;i < templis.length;i++){
+              templis[i].isDeleted = templis[i].status=='1'?'N':'Y'
+            }
+            this.list = templis;
+            // this.cacheData[param.current] = data.records;
+            this.total = data.total;
+            if (this.inCurrentPage !== undefined) {
+              this.currentPage = this.inCurrentPage;
+              this.inCurrentPage = undefined;
+            }
+          }
+        })
+        .catch(error => {
+          console.log(error);
+        });
+    },
+    getTypeList() {
+      api
+        .baseTypeGetPage({ name: '',size: 1000 })
+        .then(res => {
+          const data = res.data;
+          if (data.code == 0) {
+            this.typeList = data.data.records||[];
+          } else {
+            console.log(res.msg);
+          }
+        })
+        .catch(error => {
+          console.log(error);
+        });
+    },
+    /*getDetailList(id) {
+        this.$router.push({name:'DeptInfoDetail', params:{id: id}})
+      },*/
+    getFilterItems(isTurnPage) {
+      //翻页时筛选条件没点确定则清空
+      if (isTurnPage && !this.searched) {
+        this.clearFilter();
+      }
+      const param = {
+        "code": this.filter.term.trim(),
+        "name": this.filter.type,
+        current: this.inCurrentPage || this.currentPage,
+        size: this.pageSize,
+      };
+      return param;
+    },
+    indexMethod(index) {
+      return (this.currentPage - 1) * this.pageSize + index + 1;
+    },
+    currentChange(next) {
+      this.currentPage = next;
+      // if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+      //   this.list = this.cacheData[next];
+      // } else {
+      this.getDataList(true);
+      // }
+    },
+    warning(msg, type) {
+      this.$message({
+        showClose: true,
+        message: msg,
+        type: type || 'warning'
+      });
+    },
+    showConfirmDialog(msg, resolve) {
+      this.$alert(msg, '提示', {
+        confirmButtonText: '确定',
+        type: 'warning'
+      })
+        .then(() => {
+          resolve();
+        })
+        .catch(() => {});
+    },
+    showDelDialog(item) {
+      /*const param = {
+          term:item.term,
+          type:item.type,
+          id:item.id
+        }*/
+      const param = {
+        conceptId: item.conceptId
+      };
+      let url = item.isDeleted === 'N'?'disableConcept':'startConcept'
+      let waringTxt =
+        item.isDeleted === 'N'
+          ? '是否禁用该标准术语?'
+          : '是否重新启用该条数据?';
+      this.showConfirmDialog(waringTxt, () => {
+        api[url](param)
+          .then(res => {
+            if (res.data.code == '0') {
+              if (!this.searched) {
+                //未点确认时清空搜索条件
+                this.clearFilter();
+              }
+              if (item.isDeleted !== 'N') {
+                //恢复成功后跳转到筛选条件的首页
+                this.currentPage = 1;
+              } else {
+                if (this.filter.isState !== '' && this.list.length === 1) {
+                  //有启用状态筛选条件且当前页只有最后一条数据删除时,删除成功后跳转到前一页
+                  this.currentPage =
+                    this.currentPage === 1 ? 1 : this.currentPage - 1;
+                }
+              }
+              this.warning(res.data.msg || '操作成功', 'success');
+              this.getDataList();
+            } else {
+              this.warning(res.data.msg);
+            }
+          })
+          .catch(error => {
+            this.warning(error);
+          });
+      });
+    },
+    clearFilter() {
+      this.filter = {
+        term: '',
+        type: '',
+        libName: '',
+        isState: ''
+      };
+    }
+  }
+};
+</script>
+
+<style lang="less" scoped>
+@import '../../less/admin.less';
+
+/deep/ .container.knowledgeTitle {
+  height: 40px;
+}
+/deep/ .contents.knowledgeContents {
+  padding: 64px 20px 0;
+}
+/deep/ .secLine.el-form {
+  float: right;
+  display: block;
+  position: relative;
+  top: -5px;
+}
+.delete {
+  color: red;
+}
+.review {
+  color: #22ccc8;
+}
+.deletes {
+  cursor: default;
+  color: red;
+}
+.reviews {
+  color: #606266;
+  cursor: default;
+}
+.el-table .cell {
+  overflow: hidden;
+  white-space: nowrap;
+}
+#upFile {
+  display: none !important;
+}
+</style>

+ 300 - 410
src/components/knowledgeExtra/StaticInfo.vue

@@ -1,439 +1,329 @@
 <template>
-  <div>
-    <crumbs title="医学术语静态知识维护" style="min-width: 1088px">
-      <el-form :inline="true" class="demo-form-inline">
-        <el-form-item label="标准术语归类:" class="selectMedicine">
-          <el-select size="mini" v-model="filter.libType" placeholder="请选择" clearable>
-            <el-option
-              v-for="item in typeList"
-              :label="item.name"
-              :value="item.orderNo"
-              :key="item.orderNo"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="标准术语:">
-          <el-input size="mini" maxlength="50" v-model="filter.term" placeholder="请输入" clearable></el-input>
-        </el-form-item>
-        <el-form-item label="状态:" class="selectMedicine">
-          <el-select size="mini" v-model="filter.status" placeholder="请选择" clearable>
-            <el-option v-for="item in stateList" :label="item.name" :value="item.id" :key="item.id"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item class="dododo">
-          <el-button size="mini" @click="filterDatas">检索</el-button>
-          <!-- <el-button
-            size="mini"
-            type="warning"
-            @click="reIdentification"
-          >{{!reLoading?'更新图谱标识':'正在更新中...'}}</el-button> -->
-          <el-button size="mini" type="warning" @click="addMedicalPrompt">添加静态知识</el-button>
-        </el-form-item>
-      </el-form>
-    </crumbs>
-    <div class="contents">
-      <el-table :data="list" border style="width: 100%">
-        <el-table-column type="index" :index="indexMethod" label="编号" width="80"></el-table-column>
-        <el-table-column prop="gmtModified" label="医学标准术语"></el-table-column>
-        <el-table-column prop="name" label="标准术语归类" :show-overflow-tooltip="true"></el-table-column>
-        <el-table-column prop="typeName" label="关联标题"></el-table-column>
-        <el-table-column label="状态" >
-          <template slot-scope="scope">
-            <span v-if="scope.row.status===1">启用</span>
-            <span v-if="scope.row.status===0">禁用</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="title" label="操作人"  :show-overflow-tooltip="true"></el-table-column>
-        <el-table-column prop="title" label="操作时间"  :show-overflow-tooltip="true"></el-table-column>
-        <el-table-column label="操作" width="140">
-          <template slot-scope="scope">
-            <el-button v-if="scope.row.status===0" type="text" size="small" class="is-disabled">修改</el-button>
-            <el-button
-              v-if="scope.row.status===1"
-              type="text"
-              size="small"
-              @click="toEditProduct(scope.row)"
-            >修改</el-button>
-             <span style="margin:0 3px;">|</span>
-             <el-button type="text" size="small" @click="toCopyProduct(scope.row)">复制</el-button>
-            <span style="margin:0 3px;">|</span>
-            <el-button
-              v-if="scope.row.status===0"
-              type="text"
-              size="small"
-              @click="showReuseDialog(scope.row)"
-            >启用</el-button>
-            <el-button
-              v-if="scope.row.status===1"
-              type="text"
-              size="small"
-              class="delete"
-              @click="showDelDialog(scope.row)"
-            >禁用</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <el-pagination
-        :current-page.sync="currentPage"
-        @current-change="currentChange"
-        background
-        :page-size="pageSize"
-        class="pagepage pagepage"
-        :page-sizes="pageSizeArr"
-        @size-change="handleSizeChange"
-        :layout="pageLayout"
-        :total="total"
-      ></el-pagination>
+    <div>
+        <crumbs title="医学术语静态知识维护">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="标准术语归类:">
+                    <el-select size="mini" v-model="filter.libType" placeholder="标准术语归类" clearable>
+                        <el-option v-for="item in typeList" :label="item.name" :value="item.val" :key="item.val"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="医学标准术语:">
+                    <el-input size="mini" v-model="filter.term" placeholder="请输入术语" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="状态:">
+                    <el-select size="mini" v-model="filter.status" placeholder="请选择" clearable>
+                        <el-option v-for="item in stateList" :label="item.name" :value="item.id" :key="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="mini" @click="filterDatas">确认</el-button>
+                    <el-button size="mini" type="warning" style="margin:0 10px" @click="addMedicalPrompt">添加静态知识</el-button>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      style="width: 100%">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="60">
+                </el-table-column>
+                <el-table-column
+                        prop="name"
+                        width="150"
+                        label="医学标准术语">
+                </el-table-column>
+                <el-table-column
+                        prop="typeName"
+                        label="标准术语归属"
+                        width="120">
+                </el-table-column>
+                <el-table-column
+                        prop="title"
+                        label="关联标题"
+                        width="240">
+                </el-table-column>
+                <el-table-column
+                        label="状态">
+                    <template slot-scope="scope">
+                        <span v-if="scope.row.isDeleted=='N'">启用</span>
+                        <span v-if="scope.row.isDeleted=='Y'" class="delete">禁用</span>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                        prop="modifier"
+                        label="操作人"
+                        width="80">
+                </el-table-column>
+                <el-table-column
+                        prop="gmtModified"
+                        label="操作时间"
+                        width="180"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                <el-table-column
+                        label="操作" width="140">
+                    <template slot-scope="scope">
+                        <el-button v-if="scope.row.isDeleted=='Y'" type="text" size="small" class="is-disabled">修改</el-button>
+                        <el-button v-if="scope.row.isDeleted=='N'" type="text" size="small" @click="toEditProduct(scope.row)">修改</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button v-if="scope.row.isDeleted=='Y' || scope.row.typeId === 82 || scope.row.typeId === 83" type="text" size="small" class="is-disabled">复制</el-button>
+                        <el-button v-if="scope.row.isDeleted=='N'&&scope.row.typeId !== 82 && scope.row.typeId !== 83" type="text" size="small" @click="toCopyProduct(scope.row)">复制</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button v-if="scope.row.isDeleted=='Y'" type="text" size="small" @click="showReuseDialog(scope.row)">启用</el-button>
+                        <el-button v-if="scope.row.isDeleted=='N'" type="text" size="small" class="delete" @click="showDelDialog(scope.row)">禁用</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           :page-sizes="pageSizeArr"
+                           @size-change="handleSizeChange"
+                           :layout="pageLayout"
+                           :total="total">
+            </el-pagination>
+        </div>
+
     </div>
-  </div>
 </template>
 
 <script>
-import api from '@api/cdss.js';
-import config from '@api/config.js';
-import utils from '@api/utils.js';
-
-export default {
-  name: 'MedicinePrompt',
-  data: function() {
-    return {
-      list: [],
-      cacheData: {},
-      currentPage: 1,
-      pageSize: config.pageSize,
-      pageSizeArr: config.pageSizeArr,
-      pageLayout: config.pageLayout,
-      total: 0,
-      linkIn: [],
-      pays: [],
-      typeList: [],
-      stateList: [
-        { id: 1, name: '启用' },
-        { id: 0, name: '禁用' }
-      ],
-      searched: false,
-      filter: {
-        term: '',
-        title: '',
-        status: '',
-        libType: ''
-      },
-      // reLoading: false //更新图谱标识
-    };
-  },
-  created() {
-    const that = this;
-    //返回时避免参数未赋值就获取列表
-    setTimeout(function() {
-      // that.getDataList();
-      // that.getListDicCDSS();
-    });
-    // this.typeList = config.emData;
-    // 非首页 编辑页返回 设置 this.currentPage
-    if (Object.keys(this.$route.params).length !== 0) {
-      this.currentPage = this.$route.params.currentPage;
-    }
-  },
-  watch: {
-    filter: {
-      handler: function() {
-        this.searched = false;
-      },
-      deep: true
-    }
-  },
-  beforeRouteEnter(to, from, next) {
-    next(vm => {
-      //const pm = to.param;
-      Object.assign(vm, to.params);
-      vm.inCurrentPage = to.params.currentPage;
-    });
-  },
-  methods: {
-    //更新图谱标识
-    // reIdentification() {
-    //   this.reLoading = true;
-    //   api.BatchUpdateHasInfoStatus().then(res => {
-    //     this.reLoading = false;
-    //     if (res.data.code === '0' && res.data.data === true) {
-    //       // 更新成功
-    //       this.warning('更新成功', 'success');
-    //     } else {
-    //       // 更新失败
-    //       this.warning('更新失败');
-    //     }
-    //   });
-    // },
+  import api from '@api/knowledgeTree.js';
+  import config from '@api/config.js';
+  import utils from '@api/utils.js';
 
-    getListDicCDSS() {
-      api.getListDicCDSS().then(res => {
-        if (res.data.code === '0') {
-          this.typeList = res.data.data && res.data.data['10'];
+  export default {
+    name: 'StaticInfo',
+    data: function () {
+      return {
+        list: [],
+        cacheData: {},
+        currentPage: 1,
+        pageSize: config.pageSize,
+        pageSizeArr:config.pageSizeArr,
+        pageLayout:config.pageLayout,
+        total: 0,
+        linkIn:[],
+        pays:[],
+        typeList:[],
+        stateList:[
+          {id:'N',name:'启用'},
+          {id:'Y',name:'禁用'},
+        ],
+        searched: false,
+        filter: {
+          term: '',
+          title:'',
+          status:'',
+          libType:'',
         }
-      });
-    },
-
-    handleSizeChange(val) {
-      this.pageSize = val;
-      this.currentPage = utils.getCurrentPage(
-        this.currentPage,
-        this.total,
-        this.pageSize
-      );
-      this.getDataList();
-    },
-    addMedicalPrompt() {
-      const pam = this.searched
-        ? {
-            currentPage: this.currentPage,
-            pageSize: this.pageSize,
-            filter: this.filter
-          }
-        : { currentPage: this.currentPage, pageSize: this.pageSize };
-      this.$router.push({ name: 'AddDevKnow', params: pam });
+      }
     },
-    toEditProduct(row) {
-      const pam = this.searched
-        ? {
-            currentPage: this.currentPage,
-            pageSize: this.pageSize,
-            filter: this.filter
-          }
-        : { currentPage: this.currentPage, pageSize: this.pageSize };
-      this.$router.push({
-        name: 'AddDevKnow',
-        params: Object.assign(pam, { data: row, isEdit: true })
+    created() {
+      //返回时避免参数未赋值就获取列表
+      setTimeout(()=>{
+        this.getDataList();
+        this.getListBack();
       });
+      // const enums = JSON.parse(localStorage.getItem('knowledgeEnumsData'));
+      // this.typeList = enums.conceptDetailLexiconTypeEnum;
     },
-    toCopyProduct(row) {
-      const pam = this.searched
-        ? {
-            currentPage: this.currentPage,
-            pageSize: this.pageSize,
-            filter: this.filter
-          }
-        : { currentPage: this.currentPage, pageSize: this.pageSize };
-      this.$router.push({
-        name: 'AddDevKnow',
-        params: Object.assign(pam, { data: row, isCopy: true })
-      });
+    watch: {
+      'filter': {
+        handler: function () {
+          this.searched = false;
+        },
+        deep: true
+      }
     },
-    filterDatas() {
-      this.currentPage = 1;
-      this.getDataList();
+    beforeRouteEnter(to, from, next){
+      next(vm => {
+        //const pm = to.param;
+        Object.assign(vm,to.params);
+        vm.inCurrentPage=to.params.currentPage;
+      })
     },
-    getDataList(isTurnPage) {
-      const param = this.getFilterItems(isTurnPage);
-      this.searched = true;
-      const loading = this.$loading({
-        lock: true,
-        text: 'Loading',
-        spinner: 'el-icon-loading',
-        background: 'rgba(0, 0, 0, 0.7)'
-      });
-      api
-        .getConceptKnowledgeList(param)
-        .then(res => {
-          loading.close();
+    methods: {
+      handleSizeChange(val){
+        this.pageSize = val;
+        this.currentPage = utils.getCurrentPage(this.currentPage, this.total, this.pageSize);
+        this.getDataList();
+      },
+      addMedicalPrompt(){
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          pageSize:this.pageSize,
+          filter: this.filter
+        } : {currentPage: this.currentPage,
+          pageSize:this.pageSize};
+        this.$router.push({name:'AddDevKnow',
+          params:pam});
+      },
+      toEditProduct(row){
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          pageSize:this.pageSize,
+          filter: this.filter
+        } : {currentPage: this.currentPage,
+          pageSize:this.pageSize};
+        this.$router.push({
+          name:'AddDevKnow',
+          params: Object.assign(pam, {data:row,isEdit:true})
+        })
+      },
+      toCopyProduct(row){
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          pageSize:this.pageSize,
+          filter: this.filter
+        } : {currentPage: this.currentPage,
+          pageSize:this.pageSize};
+        this.$router.push({
+          name:'AddDevKnow',
+          params: Object.assign(pam, {data:row,isCopy:true})
+        })
+      },
+      filterDatas(){
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      getListBack(){
+        api.getListBack({}).then((res) => {
+          const result = res.data
+          if (result.code == '0') {
+            this.typeList = result.data&&result.data[10]||[]
+          }
+        })
+      },
+      getDataList(isTurnPage) {
+        const param = this.getFilterItems(isTurnPage);
+        this.searched = true;
+        const loading = this.$loading({
+            lock: true,
+            text: 'Loading',
+            spinner: 'el-icon-loading',
+            background: 'rgba(0, 0, 0, 0.7)'
+        });
+        api.staticBaseKnowledge(param).then((res) => {
+          loading.close()
           if (res.data.code == '0') {
             const data = res.data.data;
-            // 类型:1-诊断、2-药品、3-检验套餐、4-检验细项、5-检查、6-检查子项  7-手术和操作
-            let temp = [
-              '',
-              '诊断',
-              '药品',
-              '检验套餐',
-              '检验细项',
-              '检查',
-              '检查子项',
-              '手术和操作'
-            ];
-            this.list = data.records = data.records.filter(item => {
-              item.typeName = temp[item.type];
-              return item;
-            });
+            let templis = data.records;
+            this.list = templis;
             this.cacheData[param.current] = data.records;
             this.total = data.total;
-            if (this.inCurrentPage !== undefined) {
-              this.currentPage = this.inCurrentPage;
+            for(let i = 0;i < templis.length;i++){
+              templis[i].isDeleted = templis[i].status=='1'?'N':'Y'
+            }
+            if(this.inCurrentPage!==undefined){
+              this.currentPage=this.inCurrentPage;
               this.inCurrentPage = undefined;
             }
           }
-        })
-        .catch(error => {
-          if (error.code === '900010001') {
-            return false;
-          }
+        }).catch((error) => {
           console.log(error);
         });
-    },
-    clearFilter() {
-      this.filter = {
-        term: '',
-        title: '',
-        status: '',
-        libType: ''
-      };
-    },
-    getFilterItems(isTurnPage) {
-      //翻页时筛选条件没点确定则清空
-      if (isTurnPage && !this.searched) {
-        this.clearFilter();
-      }
-      const param = {
-        name: this.filter.term.trim(),
-        title: this.filter.title,
-        current: this.inCurrentPage || this.currentPage,
-        size: this.pageSize,
-        status: this.filter.status,
-        type: this.filter.libType
-      };
-      return param;
-    },
-    indexMethod(index) {
-      return (this.currentPage - 1) * this.pageSize + index + 1;
-    },
-    currentChange(next) {
-      this.currentPage = next;
-      /*if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+      },
+      clearFilter(){
+        this.filter={
+          term: '',
+          title:'',
+          status:'',
+          libType:'',
+        };
+      },
+      getFilterItems(isTurnPage) {
+        //翻页时筛选条件没点确定则清空
+        if(isTurnPage&&!this.searched){
+          this.clearFilter();
+        };
+        const param = {
+          name:this.filter.term.trim(),
+          current: this.inCurrentPage||this.currentPage,
+          size: this.pageSize,
+          status:this.filter.status == 'Y'?0:this.filter.status == 'N'?1:'',
+          type:this.filter.libType||'',
+        };
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        /*if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
           this.list = this.cacheData[next];
         } else {*/
-      this.getDataList(true);
-      //}
-    },
-    warning(msg, type) {
-      this.$message({
-        showClose: true,
-        message: msg,
-        type: type || 'warning'
-      });
-    },
-    showConfirmDialog(msg, resolve, type) {
-      let showInfo = '启用';
-      let btnNameClass = 'confirmBtn1';
-      if (type === 'Del') {
-        showInfo = '禁用';
-        btnNameClass = 'delBtn';
-      }
-
-      this.$alert(msg, '提示', {
-        confirmButtonText: showInfo,
-        // cancelButtonText: '取消',
-        // cancelButtonClass: 'cancelBtn',
-        // confirmButtonClass: btnNameClass,
-        type: 'warning'
-      })
-        .then(() => {
-          resolve();
+          this.getDataList(true);
+        //}
+      },
+      warning(msg,type){
+        this.$message({
+          showClose: true,
+          message:msg,
+          type:type||'warning'
         })
-        .catch(() => {});
-    },
-    showDelDialog(row) {
-      this.showConfirmDialog(
-        '确定禁用该静态知识?',
-        () => {
-          api
-            .delConceptInfo({ id: row.id, status: 0 })
-            .then(res => {
-              if (res.data.code == '0') {
-                if (!this.searched) {
-                  //未点确认时清空搜索条件
-                  this.clearFilter();
-                }
-                this.warning(res.data.msg || '操作成功', 'success');
-                this.getDataList();
-              } else {
-                this.warning(res.data.msg);
-              }
-            })
-            .catch(error => {
-              if (error.code === '900010001') {
-                return false;
-              }
-              this.warning(error);
-            });
-        },
-        'Del'
-      );
-    },
-    showReuseDialog(row) {
-      this.showConfirmDialog(
-        '确定启用该静态知识?',
-        () => {
-          api
-            .delConceptInfo({ id: row.id, status: 1 })
-            .then(res => {
-              if (res.data.code == '0') {
-                this.currentPage = 1; //恢复数据跳转到筛选条件下首页
-                this.warning(res.data.msg || '操作成功', 'success');
-                this.getDataList();
-              } else {
-                this.warning(res.data.msg);
-              }
-            })
-            .catch(error => {
-              if (error.code === '900010001') {
-                return false;
+      },
+      showConfirmDialog(msg,resolve){
+        this.$confirm(msg, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass:'cancel',
+          type: 'warning'
+        }).then(() => {
+          resolve();
+        }).catch(() => {});
+      },
+      showDelDialog(row){
+        this.showConfirmDialog('是否删除该静态知识?',()=>{
+          api.changeBaseStatus({id:row.id,status:0}).then((res)=>{
+            if(res.data.code=='0'){
+              if(!this.searched){
+                //未点确认时清空搜索条件
+                this.clearFilter();
               }
-              this.warning(error);
-            });
-        },
-        'Reuse'
-      );
+              this.warning(res.data.msg||'操作成功','success');
+              this.getDataList();
+            }else{
+              this.warning(res.data.msg);
+            }
+          }).catch((error)=>{
+            this.warning(error);
+          })
+        });
+      },
+      showReuseDialog(row){
+        this.showConfirmDialog('是否重新启用该条数据?',()=>{
+          api.changeBaseStatus({id:row.id,status:1}).then((res)=>{
+            if(res.data.code=='0'){
+              this.currentPage = 1;         //恢复数据跳转到筛选条件下首页
+              this.warning(res.data.msg||'操作成功','success');
+              this.getDataList();
+            }else{
+              this.warning(res.data.msg);
+            }
+          }).catch((error)=>{
+            this.warning(error);
+          })
+        });
+      }
     }
   }
-};
 </script>
 
-<style lang="less" scoped>
-@import '../../less/admin.less';
-.status-span {
-  font-size: 12px;
-  margin-right: 10px;
-  color: unset;
-}
-.dododo {
-  margin-top: 1px !important;
-}
-.pagepage {
-  .el-input.el-input--mini.el-input--suffix input {
-    height: 28px;
-    line-height: 28px;
-  }
-  .el-pagination__sizes {
-    margin-right: 20px !important;
-  }
-}
-.el-message-box {
-  /deep/ .cancelBtn {
-    background-color: #d7d7d7;
-    border-color: transparent;
-  }
-  /deep/ .delBtn {
-    background-color: #ff545b !important;
-    border-color: transparent !important;
-  }
-  /deep/ .confirmBtn1 {
-    position: relative;
-    right: 0px !important;
-  }
-}
-
-.selectMedicine {
-  // /deep/ .el-input__suffix-inner {
-  //   position: relative;
-  //   top: -1px;
-  // }
-  /deep/ .el-icon-circle-close {
-    position: relative;
-    // top: -2px;
-    left: 12px;
-  }
-}
-
-body {
-  .el-tooltip__popper {
-    max-width: 400px;
-  }
-}
-</style>
+<style lang="less">
+    @import "../../less/admin.less";
+    .status-span{
+        font-size: 12px;
+        margin-right:10px;
+        color: unset;
+    }
+    .delete {
+      color: red;
+    }
+</style>

BIN
src/images/search.png


+ 1 - 1
src/less/admin.less

@@ -192,7 +192,7 @@ body {
       }
     }
     ul {
-      max-width: 300px;
+      // max-width: 300px;   //影响其他页面控件
     }
 
     /deep/ .el-scrollbar {

+ 132 - 1
src/routes.js

@@ -204,6 +204,10 @@ import StaticInfo from '@components/knowledgeExtra/StaticInfo.vue'   //知识库
 import AddDevKnow from '@components/knowledgeExtra/AddDevKnow.vue'   //知识库扩展维护-静态信息维护-编辑
 import ZskRuleManager from '@components/knowledgeExtra/RuleManager.vue';  //知识库规则维护
 import AddZskRule from '@components/knowledgeExtra/AddNewRule.vue';   //知识库添加规则
+import KnowledgeAll from '@components/knowledgeExtra/KnowledgeAll.vue'   //知识库树
+import KnowledgeBaseType from '@components/knowledgeExtra/KnowledgeBaseType.vue'   
+import AboutDisease from '@components/knowledgeExtra/AboutDisease.vue'   
+import DiseaseTree from '@components/knowledgeExtra/DiseaseTree.vue'   
 
 export default [
     {
@@ -242,7 +246,6 @@ export default [
             { path: 'YH-JGZX-ZHXX', component: Information }, //账号信息
         ],
     },
-
     {
         //朗通后台
         path: '/admin',
@@ -613,4 +616,132 @@ export default [
             },
         ],
     },
+    { path: 'LT-CDSSSJWH-YYGL', component: HospitalCDSS, name: 'HospitalCDSS' }, //医院管理
+    { path: 'LT-CDSSSJWH-YYGLEDIT', component: AddHospitalCDSS, name: 'AddHospitalCDSS' }, //医院管理--新增编辑
+    { path: 'LT-CDSSSJWH-YYYHGL', component: HospitalUserCDSS, name: 'HospitalUserCDSS' }, //医院用户管理
+    {
+        path: 'LT-CDSSSJWH-YYYHGLEDIT',
+        component: AddHospitalUserCDSS,
+        name: 'AddHospitalUserCDSS',
+    }, //医院用户管理--添加用户
+    { path: 'LT-CDSSSJWH-BBWH', component: VersionCDSS, name: 'VersionCDSS' }, //CDSS版本信息维护
+    { path: 'LT-CDSSSJWH-BBWHEDIT', component: AddVersionCDSS, name: 'AddVersionCDSS' }, //CDSS版本信息维护--新增编辑
+    { path: 'LT-CDSSSJWH-BBWHDETAIL', component: VersionDetailCDSS, name: 'VersionDetailCDSS' }, //CDSS版本信息维护--详情
+    { path: 'LT-CDSSSJWH-MZSMWH', component: DisclaimerCDSS, name: 'DisclaimerCDSS' }, //免责声明维护
+    { path: 'LT-CDSSSJWH-MZSMWHEDIT', component: AddDisclaimerCDSS, name: 'AddDisclaimerCDSS' }, //免责声明维护--新增编辑
+    {
+        path: 'LT-CDSSSJWH-MZSMWHDETAIL',
+        component: DisclaimerDetailCDSS,
+        name: 'DisclaimerDetailCDSS',
+    }, //免责声明维护--新增编辑
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS',
+        component: KnowledgeMapRuleTest,
+        name: 'KnowledgeMapRuleTest',
+    }, //知识图谱规则测试
+    {
+        path: 'LT-YYSYZDHCS-JTZSYSCS',
+        component: StaticKnowledgeMapTest,
+        name: 'StaticKnowledgeMapTest',
+    }, //静态知识映射测试
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS-TYGZCS',
+        component: BillCommonTest,
+        name: 'BillCommonTest',
+    },
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS-SXGZCS',
+        component: BillFusionTest,
+        name: 'BillFusionTest',
+    },
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS-SYSJCGZCS',
+        component: CriticalLabTest,
+        name: 'CriticalLabTest',
+    },
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS-FZJCGZCS',
+        component: CriticalAuxTest,
+        name: 'CriticalAuxTest',
+    },
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS-GWYPGZCS',
+        component: HighRiskDrugTest,
+        name: 'HighRiskDrugTest',
+    },
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS-GWSSZHGZCS',
+        component: HighRiskOperationTest,
+        name: 'HighRiskOperationTest',
+    },
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS-QTHYGZCS',
+        component: OtherAssayRuleTest,
+        name: 'OtherAssayRuleTest',
+    },
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS-QTFJGZCS',
+        component: OtherAuxRuleTest,
+        name: 'OtherAuxRuleTest',
+    },
+    {
+        path: 'LT-YYSYZDHCS-ZSTPGZCS-QTFXGZCS',
+        component: OtherFusionRuleTest,
+        name: 'OtherFusionRuleTest',
+    },
+    {
+        path: 'LT-YYSYZDHCS-JTZSYSCS-WYSZD',
+        component: LessStaticOrNoMap,
+        name: 'LessStaticOrNoMap',
+    },
+    {
+        path: 'LT-ZSKJCWH-JCSYWH',
+        component: BasicTermsMaintenance,
+        name: 'BasicTermsMaintenance',
+    },
+    {
+        path: 'LT-ZSKJCWH-JCCXWH',
+        component: BasicPartOfSpeech,
+        name: 'BasicPartOfSpeech',
+    },
+    {
+        path: 'LT-ZSKJCWH-JCGXLXWH',
+        component: BasicRelationship,
+        name: 'BasicRelationship',
+    },
+    {
+        path: 'LT-ZSKJCWH-JCSYWH-EDIT',
+        component: AddTerm,
+        name: 'AddTerm',
+    },
+    {
+        path: 'LT-ZSKKZWH-JTXXWH',
+        component: StaticInfo,
+        name: 'StaticInfo',
+    },
+    {
+        path: 'LT-ZSKKZWH-JTXXWH-EDIT',
+        component: AddDevKnow,
+        name: 'AddDevKnow',
+    },
+    {
+        path: 'LT-ZSKKZWH-SXJGWH',
+        component: KnowledgeAll,
+        name: 'KnowledgeAll',
+    }, //树形结构维护
+    {
+        path: 'LT-ZSKJCWH-JCSYLXWH',
+        component: KnowledgeBaseType,
+        name: 'KnowledgeBaseType',
+    }, //基础术语类型维护
+    {
+        path: 'LT-ZSKKZWH-JBXGWH',
+        component: AboutDisease,
+        name: 'AboutDisease',
+    }, //疾病相关维护
+    {
+        path: 'LT-ZSKKZWH-JBXGWH-EDIT',
+        component: DiseaseTree,
+        name: 'DiseaseTree',
+    }, //疾病相关维护
 ];