瀏覽代碼

病历质控令牌发放

zhangxc 5 年之前
父節點
當前提交
cc9b868bc7
共有 5 個文件被更改,包括 649 次插入2 次删除
  1. 7 1
      src/api/config.js
  2. 23 0
      src/api/safeControl.js
  3. 274 0
      src/components/safeControl/AddToken.vue
  4. 340 0
      src/components/safeControl/TokenControl.vue
  5. 5 1
      src/routes.js

+ 7 - 1
src/api/config.js

@@ -1,6 +1,6 @@
 export default {
   host:'http://192.168.2.241:5050',
-  imgHost:'http://192.168.2.241:82',      //富文本编辑器图片回传地址
+  imgHost:'http://192.168.2.236:82',      //富文本编辑器图片回传地址
   delayTime: 500,
   urls: {
     /* 登录注册相关接口 */
@@ -262,6 +262,12 @@ export default {
      'getUniqueNameWithList': '/api/knowledgeman/lisMapping/getUniqueNameWithList', //医学数据-查找化验公表名
       /*********数据统计  *********/
       'statisticsCount': '/api/bi/statistics/count', //诊断依据--校验数据
+      /*********安全管理  *********/
+      'tokenList': '/api/mrqcman/list',  // 令牌列表
+      'tokenSaveOrUpdate': '/api/mrqcman/saveOrUpdate', // 令牌新增或修改
+      'tokenDetails': '/api/mrqcman/index', // 令牌明细
+      'tokenDelete': '/api/mrqcman/delete', // 令牌删除
+      'tokenAnalysis': '/api/mrqcman/analysis' //解析
 
   },
 	menuIconList: { //菜单对应图标

+ 23 - 0
src/api/safeControl.js

@@ -0,0 +1,23 @@
+import axios from 'axios';
+import config from '@api/config.js';
+
+const urls = config.urls;
+export default {
+    tokenList(param){  // 令牌列表
+        return axios.post(urls.tokenList, param)
+    },
+    tokenSaveOrUpdate(param){   // 令牌新增或修改
+        return axios.post(urls.tokenSaveOrUpdate, param)
+    },
+    tokenDetails(param){  // 令牌明细
+        return axios.post(urls.tokenDetails, param)
+    },
+    tokenDelete(param){  //令牌删除
+        return axios.post(urls.tokenDelete, param)
+    },
+    tokenAnalysis(param) { //解析
+        return axios.post(urls.tokenAnalysis, param) 
+    }
+  
+
+}

+ 274 - 0
src/components/safeControl/AddToken.vue

@@ -0,0 +1,274 @@
+<!-- 添加常见科室症状  -->
+<template>
+    <div class="AddTokenWrapper">
+        <crumbs
+          :title="'令牌发放-'+titleText"
+          class="topBack"
+          :param="$route.params"
+          linkTo="TokenControl"
+        ></crumbs>
+        <el-form ref="ruleForm"  class="addDepartForm" label-width="160px">
+            <el-form-item  class="addDepartFormItem" label="设备号:">
+                <!-- <input class="searchInput" type="text" v-model = "equipNum">  -->
+               
+                <el-input
+                type="textarea"
+                :autosize ="{minRows: 2}"
+                placeholder="请输入内容"
+                @blur="tokenAnalysis"
+                v-model="equipNum">
+                </el-input>
+                 <!-- <el-button
+                    type="primary"
+                    class="analysis"
+                    @click="tokenAnalysis"
+                    >解析</el-button> -->
+            </el-form-item>
+            
+             <el-form-item class="isRequired" label="医院:" >
+                <el-input v-model="hospital" placeholder="请输医院"></el-input>
+            </el-form-item>
+             <el-form-item class="isRequired" label="服务商:">
+                 <el-input v-model="server" placeholder="请输服务商"></el-input>
+            </el-form-item>
+             <el-form-item class="isRequired" label="cpu:" >
+                {{this.cpu}}
+            </el-form-item>
+            <el-form-item  label="ip:">
+                {{this.ip}}
+            </el-form-item>
+            <el-form-item  label="主板:">
+                {{this.mainboard}}
+            </el-form-item>
+            <el-form-item  label="硬盘:">
+                {{this.disk}}
+            </el-form-item>
+            <el-form-item class="isRequired" label="使用天数(天):" >
+                <el-input v-model="remainDay" onkeyup="value=value.replace(/[^\d]/g,'')" placeholder="请输入使用天数" type='text' min = '0'></el-input>
+            </el-form-item>
+            <el-form-item class="isRequired" label="有效时间(分钟):" >
+                <el-input v-model="validTime" onkeyup="value=value.replace(/[^\d]/g,'')" placeholder="请输入有效时间" type='text' min = '0'></el-input>
+            </el-form-item>
+            <el-form-item  label="登录Key:" v-if="isEdit" >
+                {{this.loginKey}}
+            </el-form-item>
+            <el-form-item label="备注:">
+                <el-input v-model="remark" 
+                  type="textarea"
+                 :autosize ="{minRows: 2}"
+                placeholder="请输备注"></el-input>
+            </el-form-item>
+        </el-form>
+        <div class="btn">
+            <el-button
+            type="primary"
+            :disabled = 'saveDisable'
+            @click="submitForm"
+            >确 定</el-button>
+        </div>
+    </div>
+    
+</template>
+
+<script>
+  import api from '@api/safeControl.js';
+  export default {
+    name: 'AddToken',
+    data() {
+        return{
+            titleText: '添加令牌',
+            modifier: '', //操作人
+            id: '',
+            equipNum:'',
+            remainDay: '',
+            remark: '',
+            server: '',
+            hospital: '',
+            cpu: '',
+            mainboard: '',
+            validTime: 30,
+            disk: '',
+            ip: '',
+            loginKey: '',
+            isEdit: false,
+            saveDisable: false
+           
+        }
+    },
+    created(){
+        const { isEdit, data } = this.$route.params;
+        const userLoginDTO = JSON.parse(localStorage.getItem('userLoginDTO'))
+        this.modifier = userLoginDTO && userLoginDTO.linkman
+        if(isEdit) {
+            if(isEdit) {
+                this.isEdit = isEdit;
+                this.titleText = '修改令牌';
+                this.id = data.id
+                this.equipNum = data.content
+                this.remainDay = data.remainDay
+                this.remark = data.remark
+                this.server = data.server
+                this.hospital = data.hospital
+                this.cpu = data.cpu
+                this.mainboard = data.mainboard
+                this.validTime = data.validTime
+                this.disk = data.disk
+                this.ip = data.ip
+                this.loginKey = data.loginKey
+            } 
+        } else {
+            
+        }
+    },
+    watch: {
+       
+    },
+    methods: {
+       
+        back(){
+            this.$router.go(-1);
+        },
+      
+        submitForm() {
+            
+            this.showDelDialog()
+        },
+        tokenAnalysis() {
+            const param = {
+                content: this.equipNum
+            }
+            api.tokenAnalysis(param).then(res =>{
+                if(res.data.code == '0') {
+                    const data = res.data.data
+                    this.mainboard = data['server.mainboard']
+                    this.cpu = data['server.cpu']
+                    this.disk = data['server.disk']
+                }
+            })
+        },
+        showDelDialog() {
+            this.showConfirmDialog('是否生成该令牌?', () => {
+                const param = {
+                    id: this.id,
+                    creator: this.modifier,
+                    server: this.server,
+                    hospital: this.hospital,
+                    cpu: this.cpu,
+                    remainDay: this.remainDay,
+                    mainboard: this.mainboard,
+                    disk: this.disk,
+                    ip: this.ip,
+                    remark: this.remark,
+                    content: this.equipNum,
+                    validTime: this.validTime
+                }
+                this.saveDisable = true  //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
+                api.tokenSaveOrUpdate(param).then((res) => {
+                if (res.data.code  === '0') {
+                    this.warning(res.data.msg || '生成成功', 'success','1000')
+                    setTimeout(() => {
+                      //返回带搜索条件的首页
+                    this.$router.push({
+                        name:'TokenControl',
+                      params: Object.assign({}, this.$route.params, {currentPage: 1})
+                    })
+                    }, 1000);
+                } else {
+                    this.warning(res.data.msg)
+                }
+                this.saveDisable = false
+                }).catch((err) => {
+                    this.warning(err);
+                })
+            });
+        },
+        showConfirmDialog(msg, resolve) {
+            this.$alert(msg, '提示', {
+                confirmButtonText: '确定',
+                type: 'warning'
+            }).then(() => {
+                resolve();
+            }).catch(() => {});
+        },
+        warning(msg, type,time) {
+            this.$message({
+                showClose: true,
+                message: msg,
+                type: type || 'warning',
+                duration:time || '3000'
+            })
+        },
+        handleInp(e){ //分组不能输入负数
+            const value =  e;
+            this.remainDay = value.replace(/\./g,'');
+            console.log(this.remainDay)
+            // e = value.replace(/[^\d]/g,'');
+            // this.remainDay = value.replace(/[^\d]/g,'');
+        }
+    }
+  }
+</script>
+
+<style lang="less">
+    @import '../../less/common.less';
+    .AddTokenWrapper {
+        color: #606266;
+        .topBack {
+            top: 0;
+        }
+        .analysis{
+            margin-top: 20px;
+        }
+        .searchInput, .searchName {
+            display: inline-block;
+            height: 32px;
+            line-height: 32px;
+            border: 1px solid #a9a9a9;
+            margin: 0px 0 0 0;
+            padding: 0 5px;
+            float: left;
+            margin-top: 4px;
+        }
+        .isRequired .el-form-item__label::before {
+            content: '*';
+            color: red;
+        }
+        .searchName {
+            border-left: none;
+            cursor: pointer;
+            font-size: 16px;
+            padding: 0 14px;
+        }
+        .addDepartForm {
+            position: relative;
+            background-color: #fff;
+            padding: 20px;
+            margin: 70px 20px 0px 20px;
+            border-bottom: 1px solid #c0c4cc;
+        }
+        .addDepartFormItem {
+            position: relative;
+        }
+        .symptomList {
+            background-color: #fff;
+             padding: 20px;
+             margin: 0px 20px 0px 20px;
+             min-height: 400px;
+        }
+        .btn {
+            position: relative;
+            background-color: #fff;
+            margin: 0px 20px;
+            height: 40px;
+            padding: 20px;
+            .el-button {
+                position: absolute;
+                right: 20px;
+            }
+        }
+        .selectDepart {
+            
+        }
+    }
+    
+</style>

+ 340 - 0
src/components/safeControl/TokenControl.vue

@@ -0,0 +1,340 @@
+<template>
+    <div>
+        <crumbs title="令牌发放" style="min-width: 980px">
+            <el-form :inline="true" class="demo-form-inline">
+                <!-- <el-form-item label="标签类型:">
+                    <el-select size="mini" v-model="filter.tagType[0]" placeholder="标签类型" clearable>
+                        <el-option v-for="item in tagTypes" :label="item.name" :value="item.val" :key="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="标签归属:">
+                    <el-select size="mini" v-model="filter.tagAdscription" @change="getValue"  placeholder="标签归属" clearable>
+                        <el-option v-for="item in Adscriptions" :label="item.name" :value="item.val" :key="item.id" ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="标签系统名称:">
+                    <el-input size="mini" v-model="filter.tagSysName" placeholder="标签系统名称" clearable></el-input>
+                </el-form-item> -->
+                <el-form-item>
+                    <!-- <el-button size="mini" @click="filterDatas">确认</el-button> -->
+                    <el-button size="mini" type="warning" @click="addToken">新增令牌</el-button>
+                </el-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <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="server"
+                    label="供应商">
+                </el-table-column>
+                <el-table-column
+                    :resizable = "false"
+                    prop="hospital"
+                    label="医院">
+                </el-table-column>
+                <el-table-column
+                    :resizable = "false"
+                    prop="remainDay"
+                    label="有效天数">
+                </el-table-column>
+                 <el-table-column
+                    :resizable = "false"
+                    prop="validTime"
+                    label="有效时间(分钟)">
+                </el-table-column>
+                <el-table-column
+                    :resizable = "false"
+                    prop="loginKey"
+                    label="loginKey">
+                </el-table-column>
+                <el-table-column
+                    :resizable = "false"
+                    prop="modifier"
+                    label="操作人">
+                </el-table-column>
+                <el-table-column
+                    :resizable = "false"
+                    prop="operate"
+                    label="操作">
+                    <template slot-scope="scope">
+                        <el-button  @click="modifyTagGroup(scope.row, 'modify')" type="text" size="small">修改</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button @click="downLoadFile(scope.row)" type="text" size="small">下载</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button @click="showDelDialog(scope.row.id)" class="delete" type="text" size="small">删除</el-button>
+                        
+                    </template>
+                </el-table-column>
+            </el-table>
+        <div class="pagination">
+            <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/safeControl.js';
+import config from '@api/config.js';
+import $ from 'jquery';
+
+export default {
+    name: 'TokenControl',
+    data: function() {
+        return {
+            list: [],
+            filter: {
+              
+            },
+            currentPage: 1,
+            modifier: '',
+            pageSize: config.pageSize,
+            pageSizeArr:config.pageSizeArr,
+            pageLayout:config.pageLayout,
+            total: 0,
+        }
+    },
+    created() {
+        const userLoginDTO = JSON.parse(localStorage.getItem('userLoginDTO'))
+        this.modifier = userLoginDTO && userLoginDTO.linkman
+        this.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();
+        },
+        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.tokenList(param).then((res) => { 
+                    loading.close()
+                const list = res.data.data.records
+                
+                this.list = list;
+                this.total = res.data.data.total;
+                if(this.inCurrentPage!==undefined){
+                    this.currentPage=this.inCurrentPage;
+                    this.inCurrentPage = undefined;
+                }
+            })
+        },
+        filterDatas() {
+            this.currentPage = 1;
+            this.getDataList();
+        },
+        addToken() {
+            const pam = this.searched ? {
+            currentPage: this.currentPage,
+            pageSize:this.pageSize,
+            filter: this.filter
+            } : {currentPage: this.currentPage,
+            pageSize:this.pageSize};
+            this.$router.push({name: 'AddToken', params: pam});
+        },
+        modifyTagGroup(row, type) {
+            api.tokenDetails({id:row.id}).then((res)=>{
+                const {code,data,msg} = res.data;
+                if(code=='0'){
+                    const item = Object.assign({},row,data);
+                    const pam = this.searched ? {
+                    currentPage: this.currentPage,
+                    filter: this.filter
+                    } : {currentPage: this.currentPage};
+                    // console.log('item', item)
+                    if(type == 'modify') {
+                        this.$router.push({
+                        name: 'AddToken',
+                        params: Object.assign(pam, {isEdit: true, data: item})
+                        });
+                    } else {
+                        return
+                    }
+                }else{
+                    this.$message({
+                    message: msg,
+                    type: 'warning'
+                    });
+                }
+            });
+        },
+        downLoadFile(row) {
+            const url = row.url.replace(/{imageUrlPrefix}/g,config.imgHost) + '?download=1'
+            // var $form = $('<form method="GET"></form>');
+            // $form.attr('action', url);
+            // $form.appendTo($('body'));
+            // $form.submit();
+            this.download(url, 'sys.properties')
+        //     const ele = document.createElement('a');
+        //     ele.setAttribute('download' , 'download');//用于设置下载文件的文件名
+
+        //     ele.setAttribute('href',url); //设置下载文件的url地址
+
+
+        //     ele.click();
+
+
+        },
+        getBlob(url,cb) {
+            var xhr = new XMLHttpRequest();
+            xhr.open('GET', url, true);
+            xhr.responseType = 'blob';
+            xhr.onload = function() {
+                    if (xhr.status === 200) {
+                        cb(xhr.response);
+                    }
+            };
+            xhr.send();
+        },
+        saveAs(blob, filename) {
+            if (window.navigator.msSaveOrOpenBlob) {
+                navigator.msSaveBlob(blob, filename);
+            } else {
+                var link = document.createElement('a');
+                var body = document.querySelector('body');
+
+                link.href = window.URL.createObjectURL(blob);
+                link.download = filename;
+
+                // fix Firefox
+                link.style.display = 'none';
+                body.appendChild(link);
+                
+                link.click();
+                body.removeChild(link);
+
+                window.URL.revokeObjectURL(link.href);
+            };
+        },
+        download(url, filename){
+            const that = this
+            that.getBlob(url, function(blob) {
+                that.saveAs(blob, filename);
+            });
+        },
+        currentChange(next) {
+            this.currentPage = next;
+            this.getDataList(true);
+        },
+        getFilterItems(isTurnPage) {
+            //翻页时筛选条件没点确定则清空
+            if(isTurnPage&&!this.searched){
+            this.clearFilter();
+            };
+            const param = {
+                current: this.inCurrentPage||this.currentPage,
+                size: this.pageSize,
+            };
+            return param;
+        },
+        indexMethod(index) {
+            return ((this.currentPage - 1) * this.pageSize) + index + 1;
+        },
+        warning(msg,type){
+            this.$message({
+            showClose: true,
+            dangerouslyUseHTMLString: true,
+            message:'<p>'+msg+'</p>',
+            type:type||'warning'
+            })
+        },
+        showConfirmDialog(msg,resolve){
+            this.$alert(msg, '提示', {
+            confirmButtonText: '确定',
+            type: 'warning'
+            }).then(() => {
+            resolve();
+            }).catch(() => {});
+        },
+        clearFilter(){
+        
+        },
+        showDelDialog(id){
+            this.showConfirmDialog('是否删除该令牌?',()=>{
+            const param = {id:id,creator:this.modifier}
+            api.tokenDelete(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.getDataList();
+                this.warning(res.data.msg || '操作成功','success');
+                }else{
+                this.warning(res.data.msg);
+                }
+            }).catch((error)=>{
+                this.warning(error);
+            })
+            });
+        }
+    }
+}
+</script>
+
+
+<style lang="less">
+    @import "../../less/admin.less";
+    .delete{
+       color: red;
+    }
+    .delete:hover {
+        color: red;
+    } 
+    .pagination {
+        min-width: 1010px;
+    }
+</style>

+ 5 - 1
src/routes.js

@@ -107,6 +107,9 @@ import AddAssistCheckMultRelation from '@components/medicalTerm/AddAssistCheckMu
 import AssistCheckSon from '@components/medicalTerm/AssistCheckSon.vue';
 import AddAssistCheckSon from '@components/medicalTerm/AddAssistCheckSon.vue';
 
+//安全管理
+import TokenControl from '@components/safeControl/TokenControl.vue';
+import AddToken from '@components/safeControl/AddToken.vue';
 
 export default [
   {
@@ -278,7 +281,8 @@ export default [
       {path:'LT-ZDYJWH-TJZDYJSJ',component:AddDiagBase,name:'AddDiagBase'},  //诊断依据-添加诊断依据
       {path:'LT-ZDYJWH-WTCSJWH',component:QuestionWords,name:'QuestionWords'},  //问题列表
       {path:'LT-SJTJ-YXSJTJ',component:MedicalStatistics,name:'MedicalStatistics'},  //问题列表
-
+      {path:'LT-AQGL-LPFF',component:TokenControl,name:'TokenControl'},  //安全管理--令牌列表
+      {path:'LT-AQGL-TJLP',component:AddToken,name:'AddToken'},  //安全管理--发放令牌
     ]
   }
 ]