ソースを参照

Merge remote-tracking branch 'origin/independentTag' into dev

# Conflicts:
#	src/components/icss/AddIndeptLabel.vue
zhouna 6 年 前
コミット
3acacf1291

+ 63 - 6
package-lock.json

@@ -3319,8 +3319,7 @@
     "deep-equal": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
-      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
-      "dev": true
+      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
     },
     "deep-is": {
       "version": "0.1.3",
@@ -4323,8 +4322,7 @@
     "extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
     },
     "extend-shallow": {
       "version": "3.0.2",
@@ -4435,6 +4433,11 @@
       "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
       "dev": true
     },
+    "fast-diff": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
+      "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
+    },
     "fast-glob": {
       "version": "2.2.6",
       "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz",
@@ -7355,8 +7358,7 @@
     "object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
     },
     "object-copy": {
       "version": "0.1.0",
@@ -7641,6 +7643,11 @@
         "no-case": "2.3.2"
       }
     },
+    "parchment": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
+      "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+    },
     "parse-asn1": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
@@ -8548,6 +8555,47 @@
       "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==",
       "dev": true
     },
+    "quill": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.6.tgz",
+      "integrity": "sha512-K0mvhimWZN6s+9OQ249CH2IEPZ9JmkFuCQeHAOQax3EZ2nDJ3wfGh59mnlQaZV2i7u8eFarx6wAtvQKgShojug==",
+      "requires": {
+        "clone": "2.1.2",
+        "deep-equal": "1.0.1",
+        "eventemitter3": "2.0.3",
+        "extend": "3.0.2",
+        "parchment": "1.1.4",
+        "quill-delta": "3.6.3"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
+        },
+        "eventemitter3": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
+          "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo="
+        }
+      }
+    },
+    "quill-delta": {
+      "version": "3.6.3",
+      "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
+      "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+      "requires": {
+        "deep-equal": "1.0.1",
+        "extend": "3.0.2",
+        "fast-diff": "1.1.2"
+      }
+    },
+    "quill-image-extend-module": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/quill-image-extend-module/-/quill-image-extend-module-1.1.2.tgz",
+      "integrity": "sha512-yHJWZWlTjNZzV34zuT4H55ttDwMxmVJ7JUgKnt/Wd3ejUNcaPOV57/sKG8VEMU5mL7bKZPIKmBdb3weM0M5UeA==",
+      "dev": true
+    },
     "randombytes": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
@@ -10681,6 +10729,15 @@
         "vue-style-loader": "4.1.2"
       }
     },
+    "vue-quill-editor": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
+      "integrity": "sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==",
+      "requires": {
+        "object-assign": "4.1.1",
+        "quill": "1.3.6"
+      }
+    },
     "vue-router": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz",

+ 3 - 1
package.json

@@ -9,7 +9,8 @@
   },
   "dependencies": {
     "js-md5": "^0.7.3",
-    "vue": "^2.5.17"
+    "vue": "^2.5.17",
+    "vue-quill-editor": "^3.0.6"
   },
   "eslintConfig": {
     "env": {
@@ -29,6 +30,7 @@
     "less-loader": "^4.1.0",
     "path": "^0.12.7",
     "qs": "^6.5.2",
+    "quill-image-extend-module": "^1.1.2",
     "vue-router": "^3.0.1",
     "vue-template-compiler": "^2.5.17",
     "vue-ueditor-wrap": "^2.4.0"

+ 3 - 0
src/api/icss.js

@@ -25,6 +25,9 @@ export default {
     getPrompDetail(param){
       return axios.post(urls.PromptInfoDetail,param);
     },
+    getAllType(){
+      return axios.post(urls.allKnowledgeType,{size:10});
+    },
     getTremList(param){
       return axios.post(urls.getConceptKnowledge,param);
     },

+ 19 - 1
src/components/icss/AddIndeptLabel.vue

@@ -13,7 +13,7 @@
                 ref="submitForm"
         ></PubIndeptTag>
         <div class="main">
-            <p class="title" v-if="dataPub.region2==1||dataPub.region2==2"> <i>*</i> 标签明细:</p>
+            <p class="title" v-if="dataPub.region2==1||dataPub.region2==2"> <i>*</i> 标签明细:<i style="margin-left:70px;color: #22ccc8; font-size: 12px;">所有选项必须都有或者都没有同“伴”/“无”标记</i></p>
             <SingleSelect v-if="dataPub.region2==1 || dataPub.region2==2 || dataPub.region2==11" :ascription="dataPub.region1" :sexType="dataPub.region7" :type="dataPub.region2" @pushValues="pushValues" :options="editData.questionDetailList"></SingleSelect>
             <div class="btn">
                 <el-button
@@ -94,6 +94,7 @@
         //仍需验证标签明细是否选择
         let isNull = true
         let options2 = []
+        const opts = this.options;
         for (let i = 0; i < this.options.length; i++) {
           if(this.options[i].name.trim() != '') {
             isNull = false
@@ -108,6 +109,23 @@
             });
             return;
         }
+        let flag=true;
+        if(opts[0].code){
+          flag=opts.findIndex((it)=>{
+            return !it.code;
+          })==-1;
+        }else{
+          flag=opts.findIndex((it)=>{
+            return it.code;
+          })==-1;
+        }
+        if(!flag){
+          this.$message({
+            message: '所有选项必须都有或者都没有同“伴”/“无”标记',
+            type: 'warning'
+          });
+          return;
+        }
         if(this.dataPub.region8 >= this.dataPub.region9) {
           this.$message({
             message: '最小年龄不能大于或等于最大年龄',

+ 71 - 18
src/components/icss/AddMedicinePrompt.vue

@@ -9,26 +9,42 @@
                      :model="form"
                      label-width="130px"
                      ref="groups">
-                <el-form-item v-if="!isEdit" label="选择术语标签:" prop="selectedTerm">
+                <el-form-item v-if="!isEdit" label="选择术语:" prop="selectedTerm">
                     <el-select v-model="form.selectedTerm"
                                filterable
                                remote
                                clearable
-                               value-key="libId"
+                               value-key="id"
                                ref="termName"
                                placeholder="搜索术语"
                                :remote-method="searchTerms">
-                        <el-option v-for="term in terms" :key="term.libId" :label="term.name" :value="term" ></el-option>
+                        <el-option v-for="term in terms" :key="term.id" :label="term.name+'-('+term.type+')'" :value="term" ></el-option>
                     </el-select>
                 </el-form-item>
                 <el-form-item label="已选择术语标签:">
                     {{form.selectedTermName}}
                 </el-form-item>
-                <el-form-item label="添加静态知识">
+                <el-form-item label="术语类型:">
+                    {{form.selectedTermType}}
+                    <!--<el-select  filterable
+                                remote
+                                clearable
+                                v-model="form.termType"
+                                placeholder="搜索术语类型">
+                        <el-option v-for="it in termTypes" :label="it.name" :value="it.name" :key="it.id"></el-option>
+                    </el-select>-->
+                </el-form-item>
+                <p class="line"></p>
+                <el-form-item label="添加静态知识" style="font-weight: bold">
+                </el-form-item>
+                <el-form-item label="静态知识来源:" prop="source">
+                    <el-input v-if="!isEdit" v-model="form.source" placeholder="输入静态知识来源"></el-input>
+                    {{isEdit?form.source:''}}
                 </el-form-item>
                 <InfoParagraph v-for="(f,i) in form.prags"
                                :data="f"
                                :index="i"
+                               :len="1"
                                :isEdit = "isEdit"
                                @change="getPgValues"
                                @add="addParagraph"
@@ -58,6 +74,7 @@
     data() {
       return {
         isEdit:false,
+        termTypes:[],
         terms:[],              //术语列表
         editData:{
           selectedTerm:'',
@@ -65,7 +82,10 @@
         },
         form:{
           selectedTerm:'',            //术语标签
+          termType:'',
+          source:'',
           selectedTermName:'',
+          selectedTermType:'',
           prags:[{              //单个段落相关
             title:'',
             content:'',
@@ -75,6 +95,9 @@
             text:''}]
         },
         rules: {
+          source: [
+            { required: true, message: '请输入静态知识来源', trigger: 'change' }
+          ],
           selectedTerm: [
             { required: true, message: '请选择术语标签', trigger: 'change' }
           ]
@@ -84,14 +107,30 @@
     watch:{
       'form.selectedTerm':function(newVal){
         const name = newVal.name;
-        this.editData.selectedTermName = name;
+        //this.editData.selectedTermName = name;
+        this.form.selectedTermName = name;
+        this.form.selectedTermType = newVal.type;
       }
     },
     created:function(){
       const {isEdit,data} = this.$route.params;
+      //this.getTermTypes();
       if(isEdit){
         this.isEdit = isEdit;
+        /*api.getTremList({term:data.name,type:data.type}).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.form.prags=data.information&&data.information.map((it)=>{
+              return {title:it.title,position:this.mapStringToNum(it.position),content:it.content,isReason:it.isReason};
+            });
+            console.log(data)
+          }
+        }).catch((error) => {
+          console.log(error);
+        });*/
         this.form.selectedTermName = data.name;
+        this.form.selectedTermType = data.type;
+        this.form.source = data.source;
         this.form.prags[0].content = data.content;
         this.form.prags[0].position=this.mapStringToNum(data.position);
         this.form.prags[0].title = data.title;
@@ -99,11 +138,22 @@
     },
     methods: {
       back() { this.$router.go(-1) },
+      async getTermTypes(){
+        let types = localStorage.getItem('termTypes');
+        if(!types){
+          types = await api.getAllType();
+          if(types.data.code=='0'){
+            this.termTypes = types.data.data.records;
+          }
+        }else{
+          this.termTypes = JSON.parse(types).records;
+        }
+      },
       searchTerms(query){
         //搜索术语列表
-        api.getConceptInfo({term:query,type:''}).then((res) =>{
+        api.knowledgeName({term:query,type:''}).then((res) =>{
           if(res.data.code === '0') {
-            this.terms = res.data.data;
+            this.terms = res.data.data.records;
           }else{
             this.warning("数据获取失败");
           }
@@ -116,14 +166,16 @@
       },
       parseData(info){
         let detail = [];
-        info.details.forEach((it)=>{
-          detail.push(Object.assign({},it,{position:this.mapStringToNum(it.position)}));
+        info.prags.forEach((it)=>{
+          detail.push(Object.assign({},it,{position:it.position,source:this.form.source}));
         });
         return {
-          name:info.name,
-          tagFor:info.questionList[0].type+'',
-          selectedTags:info.questionList,
-          prags:detail
+          oldterm:'',
+          concept:'',
+          oldtype:'',
+          newterm:info.selectedTermName,
+          newtype:info.selectedTermType,
+          information:detail
         };
       },
       addParagraph(){
@@ -170,11 +222,12 @@
           return;
         }
         //通过必填验证,提交保存
-        const param = {
-          name:this.form.selectedTerm.libId,
-          detailVOList:Object.assign(this.form.prags)
-        };
-        console.log(param);
+        const param = this.parseData(this.form);/*{
+          newterm:this.form.selectedTermName,
+          newtype:this.form.termType,
+          information:Object.assign(this.form.prags)
+        };*/
+        //console.log(param);
         this.showSaveDialog(param);
       },
       showSaveDialog(param) {

+ 3 - 0
src/components/icss/AddPromptInfo.vue

@@ -15,6 +15,7 @@
                 <InfoParagraph v-for="(f,i) in form.prags"
                                :data="f"
                                :index="i"
+                               :len="len"
                                :isEdit = "isEdit"
                                @change="getPgValues"
                                @add="addParagraph"
@@ -68,6 +69,7 @@
       return {
         isEdit:false,
         tagPool:[],                 //标签池数据
+        len:0,
         Adscriptions:[],            //归属列表
         editData:{
           tagFor:'',
@@ -106,6 +108,7 @@
           if(res.data.code === '0') {
             this.form = this.parseData(res.data.data);
             this.editData = Object.assign({},this.form);
+            this.len=res.data.data.details&&res.data.data.details.length;
           }else{
             this.warning("数据获取失败");
           }

+ 35 - 21
src/components/icss/InfoParagraph.vue

@@ -3,13 +3,13 @@
             <p class="line"></p>
             <el-input v-model="data.orderNo" :value="index" type="hidden"></el-input>
             <el-form-item label="是否属于诊断:" prop="isReason" @change="emitVal">
-                <el-select v-model="data.isReason" placeholder="请选择" :disabled="isEdit">
+                <el-select v-model="data.isReason" placeholder="请选择" :disabled="isEdit&&index<len">
                     <el-option label="否" :value="0"></el-option>
                     <el-option label="是" :value="1"></el-option>
                 </el-select>
             </el-form-item>
             <el-form-item label="显示位置:" prop="position" label-width="130px">
-                <el-checkbox-group v-model="data.position" @change="emitVal" :disabled="isEdit">
+                <el-checkbox-group v-model="data.position" @change="emitVal" :disabled="isEdit&&index<len">
                     <el-checkbox v-for="it in positions" :key="it.key" :label="it.key">{{it.name}}</el-checkbox>
                 </el-checkbox-group>
             </el-form-item>
@@ -17,37 +17,49 @@
                 <el-input v-model="data.title" @change="emitVal"></el-input>
             </el-form-item>
             <el-form-item label="内容" prop="content" label-width="130px">
-                <InfoUeditor v-model="data.content" :config="config"></InfoUeditor>
+                <quillEditor v-model="data.content" :options="editorOption"></quillEditor>
             </el-form-item>
             <el-form-item label-width="130px">
-                <el-button @click="addEmit">添加段落</el-button >
+                <el-button @click="addEmit">添加段落</el-button>
                 <el-button @click="delEmit" type="info">删除本段落</el-button>
             </el-form-item>
     </el-form>
 </template>
 
 <script>
-  import InfoUeditor from 'vue-ueditor-wrap';
+  import 'quill/dist/quill.core.css'
+  import 'quill/dist/quill.snow.css'
+  import 'quill/dist/quill.bubble.css'
+  import {quillEditor, Quill} from 'vue-quill-editor'
+  import {container, ImageExtend, QuillWatch} from 'quill-image-extend-module';
+  Quill.register('modules/ImageExtend', ImageExtend);
   export default{
-    props:['data','index','isEdit'],
+    props:['data','index','isEdit','len'],
     name:'InfoParagraph',
     components:{
-      InfoUeditor
+      quillEditor
     },
     data(){
         return {
-          config:{
-            initialFrameWidth: null,
-            initialFrameHeight: 350,
-            imageUrlPrefix:"http://192.168.2.236:82",
-            serverUrl: '/api/icssman/file/uploadImage',
-            UEDITOR_HOME_URL: '/UEditor/',        //静态文件路径
-            toolbars:[['source','undo','redo','bold','italic','underline','fontborder','strikethrough','superscript','subscript','removeformat','formatmatch','autotypeset','blockquote',
-              'pasteplain','forecolor','backcolor','insertorderedlist','insertunorderedlist','selectall',
-              'cleardoc','rowspacingtop','rowspacingbottom','lineheight','customstyle','paragraph',
-              'fontfamily','fontsize','directionalityltr','directionalityrtl','indent','justifyleft',
-              'justifycenter','justifyright','justifyjustify','touppercase','tolowercase','link','simpleupload','insertimage','horizontal',
-              'date','time','spechars','fullscreen']]      //自定义工具
+          editorOption: {
+            modules: {
+              ImageExtend: {
+                loading: true,
+                name: 'upfile',
+                action: 'http://192.168.2.236/api/icssman/file/uploadImage',
+                response: (res) => {
+                  return 'http://192.168.2.236:82'+res.url;
+                }
+              },
+              toolbar: {
+                container: container,
+                handlers: {
+                  'image': function () {
+                    QuillWatch.emit(this.quill.id)
+                  }
+                }
+              }
+            }
           },
           form:{},
           positions:[],               //位置列表
@@ -78,7 +90,7 @@
       //显示位置枚举列表
       const pos = localStorage.getItem("icssEnumsData");
       this.positions = JSON.parse(pos)&&JSON.parse(pos).introducePositionEnum;
-      this.form = this.data;console.log(this.isEdit)
+      this.form = this.data;
     },
     methods:{
       addEmit(){
@@ -89,7 +101,9 @@
       },
       emitVal(){
         let data = Object.assign({},this.data);
-        data =   Object.assign({},data,{position:this.data.position?this.data.position.join(","):''});
+        let pst=this.data.position;
+        pst = typeof pst=='string'?pst:pst.join(',');
+        data =   Object.assign({},data,{position:this.data.position?pst:''});
         this.$emit("change",this.index,data);
       }
     }

+ 40 - 14
src/components/icss/MedicinePrompt.vue

@@ -2,11 +2,13 @@
     <div>
         <crumbs title="医学术语静态知识维护">
             <el-form :inline="true" class="demo-form-inline">
-                <el-form-item label="静态知识名称:">
-                    <el-input size="mini" v-model="filter.name" placeholder="静态知识名称" clearable></el-input>
+                <el-form-item label="医学标准术语:">
+                    <el-input size="mini" v-model="filter.term" placeholder="医学标准术语" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="标签系统名称:">
-                    <el-input size="mini" v-model="filter.term" placeholder="术语标签" clearable></el-input>
+                <el-form-item label="术语类型:">
+                    <el-select size="mini" v-model="filter.type" placeholder="术语类型" clearable>
+                        <el-option v-for="it in termTypes" :label="it.name" :value="it.name" :key="it.id"></el-option>
+                    </el-select>
                 </el-form-item>
                 <el-form-item>
                     <el-button size="mini" @click="filterDatas">确认</el-button>
@@ -36,6 +38,11 @@
                         prop="name"
                         label="医学标准术语">
                 </el-table-column>
+                <el-table-column
+                        prop="type"
+                        label="术语类型"
+                        width="140">
+                </el-table-column>
                 <el-table-column
                         prop="title"
                         label="静态知识名称"
@@ -52,7 +59,7 @@
                     <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" @click="showDelDialog(scope.row.id)">删除</el-button>
+                        <el-button type="text" size="small" @click="showDelDialog(scope.row)">删除</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -77,6 +84,7 @@
     name: 'MedicinePrompt',
     data: function () {
       return {
+        termTypes:[],
         list: [],
         cacheData: {},
         currentPage: 1,
@@ -85,15 +93,36 @@
         linkIn:[],
         pays:[],
         filter: {
-          name: '',
-          tagName:''
+          term: '',
+          type:''
         }
       }
     },
     created() {
       this.getDataList();
+      this.getTermTypes();
     },
     methods: {
+      getTermTypes(){
+        api.getAllType().then((res)=>{
+          if(res.data.code=='0'){
+            this.termTypes = res.data.data.records;
+          }
+        }).catch((error)=>{
+          console.log('获取术语类型失败');
+        });
+      },
+      /*async getTermTypes(){
+        let types = localStorage.getItem('termTypes');
+        if(!types){
+          types = await api.getAllType();
+          if(types.data.code=='0'){
+            this.termTypes = types.data.data.records;
+          }
+        }else{
+          this.termTypes = JSON.parse(types).records;
+        }
+      },*/
       toEditProduct(row){
         this.$router.push({
           name:'AddMedicinePrompt',
@@ -106,9 +135,6 @@
       },
       getDataList() {
         const param = this.getFilterItems();
-        // const param = {
-        //   'name':''
-        // };
         api.getConceptKnowledgeList(param).then((res) => {
           if (res.data.code == '0') {
             const data = res.data.data;
@@ -126,8 +152,8 @@
       },
       getFilterItems() {
         const param = {
-          term:this.filter.name,
-          conecpt_name:this.filter.term,
+          term:this.filter.term,
+          type:this.filter.type,
           current: this.currentPage,
           size: this.pageSize
         };
@@ -159,9 +185,9 @@
           resolve();
         }).catch(() => {});
       },
-      showDelDialog(id){
+      showDelDialog(row){
         this.showConfirmDialog('是否删除该静态知识?',()=>{
-          api.delConceptInfo({id}).then((res)=>{
+          api.delConceptInfo({id:row.id}).then((res)=>{
             if(res.data.code=='0'){
               this.warning(res.data.msg||'操作成功','success');
               this.getDataList();