Procházet zdrojové kódy

Merge remote-tracking branch 'origin/testedMerge' into referMaster

zhouna před 5 roky
rodič
revize
2ba683ac85

+ 22 - 1
src/api/config.js

@@ -298,7 +298,7 @@ export default {
       'getQCTempDetail':'/api/mrman/qc/qcModuleInfo/getById', //获取模板详情
       'getQCName':'/api/mrman/qc/qcQuestionInfo/index', //获取字段名称
       'getQcFlawList':'/api/mrman/qcCasesEntry/indexCaseEntry',   //获取缺陷列表
-      'getModuleTypeList':'/api/mrman/med/RecordModule/getAll', //获取模块类型列表
+      'getModuleTypeList':'/api/mrman/qc/qcModuleInfo/index', //获取模块类型列表
       'getRecordInpList':'/api/mrman/qcInputcases/getAllInputcases',//获取全部病历录入
       'removeRecordInpById':'/api/mrman/qcInputcases/cancelById',//删除病历录入
       'addRecordInp':'/api/mrman/qcInputcases/saveOrUpdata', //保存和修改全部病历录入 
@@ -319,6 +319,27 @@ export default {
       'delQcType': '/api/mrman/qc/qcType/delete', //删除质控类型
       'getQcTypeItem': '/api/mrman/qc/qcType/getEntryByHospital', //获取质控条目
       'getQcTypeDetail':'/api/mrman/qc/qcType/getById', //获取质控类型明细
+      'getQcEntryTypeList': '/api/mrman/qc/qcEntryType/page', //质控条目与质控类型关系--分页列表
+      'getQcEntryTypeDetail': '/api/mrman/qc/qcEntryType/getById', //质控条目与质控类型关系--根据entryId和医院id返回内容
+      'getQcEntryTypeByHospital': '/api/mrman/qc/qcEntryType/getTypeByHospital', //质控条目与质控类型关系--根据医院获取质控类型列表
+      'getQcEntryTypeIndex': '/api/mrman/qc/qcEntryType/index', //质控条目与质控类型关系--根据医院和条目检索未被选择的质控类型
+      'saveQcEntryType': '/api/mrman/qc/qcEntryType/saveOrUpdate', //质控条目与质控类型关系--保存
+      'getStdList':'/api/mrman/stdBehospitalInfo/getSthospitalInfoPage' ,//标准病例列表
+      'delStdRecord':'/api/mrman/stdBehospitalInfo/clearSthospitalInfo',//删除标准病例
+      'updateStdRecord':'/api/mrman/stdBehospitalInfo/updataSthospitalInfo',//更新标准病例
+      'findStdRecord':'/api/mrman/stdBehospitalInfo/findSthospitalInfo',//查找标准病例
+      'getStdDeptList':'/api/mrman/medBehospitalInfo/findhospitalDept', //获取科室列表
+      'getTestItems':'/api/mrman/stdBehospitalInfo/getStatistic',     //获取病例条目统计
+      'addTask':'/api/mrman/stdMissionDetail/addMissionDetail',   //添加任务
+      'getTaskList':'/api/mrman/stdMissionInfo/getMissionInfoPage',   //获取任务列表
+      'delTask':'/api/mrman/stdMissionInfo/clearMissionInfo',   //获取任务列表
+      'editTask':'/api/mrman/stdMissionInfo/getMissionInfoPage',   //获取任务列表
+      'getTaskDetailList':'/api/mrman/stdMissionDetail/getMissionDetailPage',   //获取任务详情列表
+      'getTaskDetail':'/api/mrman/stdMissionDetail/getMissionDetailPage',   //获取单个任务详情
+      'editTaskDetail':'/api/mrman/stdMissionDetail/updateMissionDetail',   //任务详情修改
+      'delTaskDetail':'/api/mrman/stdMissionDetail/clearMissionDetail',     //任务详情删除
+      'autoTest':'/api/mrman/stdBehospitalInfo/analyze',  //自动化测试
+
   },
 	menuIconList: { //菜单对应图标
 		'YH-KZT': 'el-icon-menu',

+ 1 - 1
src/api/index.js

@@ -3,7 +3,7 @@ import config from './config.js';
 
 axios.default.timeout = 5000;
 axios.defaults.headers.post['Content-Type'] = "application/json;charset=utf-8";
-// axios.defaults.baseURL = 'http://192.168.2.241';
+//axios.defaults.baseURL = 'http://192.168.2.236';
 // axios.defaults.baseURL = 'http://192.168.3.117:5050';
 
 const urls = config.urls;

+ 67 - 1
src/api/qualityControl.js

@@ -53,5 +53,71 @@ export default {
   },
   getQcTypeItem(param){ //获取质控条目
     return axios.post(urls.getQcTypeItem,param);
-  }
+  },
+  getQcEntryTypeList(param){ //质控条目与质控类型关系--分页列表
+    return axios.post(urls.getQcEntryTypeList,param);
+  },
+  getQcEntryTypeDetail(param){ //质控条目与质控类型关系--根据entryId和医院id返回内容
+    return axios.post(urls.getQcEntryTypeDetail,param);
+  },
+  getQcEntryTypeByHospital(param){ //质控条目与质控类型关系--根据医院获取质控类型列表
+    return axios.post(urls.getQcEntryTypeByHospital,param);
+  },
+  getQcEntryTypeIndex(param){ //质控条目与质控类型关系--根据医院和条目检索未被选择的质控类型
+    return axios.post(urls.getQcEntryTypeIndex,param);
+  },
+  saveQcEntryType(param){ //质控条目与质控类型关系--保存
+    return axios.post(urls.saveQcEntryType,param);
+  },
+  getStdList(param){//获取标准病例列表
+    return axios.post(urls.getStdList,param);
+  },
+  delStdRecord(param){//删除标准病例
+    return axios.post(urls.delStdRecord,param);
+  },
+  updateStdRecord(param){//更新标准病例
+    return axios.post(urls.updateStdRecord,param);
+  },
+  findStdRecord(param){//查找标准病例
+    return axios.post(urls.findStdRecord,param);
+  },
+  getStdDeptList(param){//更新标准病例
+    return axios.post(urls.getStdDeptList,param);
+  },
+  getTestItems(param){
+    return axios.post(urls.getTestItems,param);
+  },
+  getTaskList(param){
+    return axios.post(urls.getTaskList,param);
+  },
+  addTask(param){
+    return axios.post(urls.addTask,param);
+  },
+  delTask(param){
+    return axios.post(urls.delTask,param);
+  },
+  editTask(param){
+    return axios.post(urls.editTask,param);
+  },
+  getTaskDetailList(param){
+    return axios.post(urls.getTaskDetailList,param);
+  },
+  getTaskDetail(param){
+    return axios.post(urls.getTaskDetail,param);
+  },
+  editTaskDetail(param){
+    return axios.post(urls.editTaskDetail,param);
+  },
+  delTaskDetail(param){
+    return axios.post(urls.delTaskDetail,param);
+  },
+  getRecordHopitalList(param){
+    return axios.post(urls.getRecordHopitalList,param);
+  },
+  getRecordCases(param){
+    return axios.post(urls.getRecordCases,param);
+  },
+  autoTest(param){
+    return axios.post(urls.autoTest,param);
+  },
 }

+ 3 - 0
src/api/records.js

@@ -6,6 +6,9 @@ export default {
   getRecordList:(param)=>{
     return axios.post(urls.getRecord,param);
   },
+  getRuleTypes:(param)=>{
+    return axios.post(urls.getQcTypes,param);
+  },
   getRecordDetail:(param)=>{
     return axios.post(urls.getRecordDetail,param);
   },

+ 9 - 0
src/api/utils.js

@@ -114,6 +114,15 @@ export default {
       }
     }
   },
+  tranformDate(time,str,flag='-'){
+    if(!time){
+      return time;
+    }
+    const year=time.getFullYear();
+    const month = time.getMonth()+1;
+    const day = time.getDate();
+    return year+flag+(month>9?month:'0'+month)+flag+(day>9?day:'0'+day)+str;
+  },
   //获取两个时间间隔天数
   getTimeRangeDay(timeArr) {
     if(!timeArr||timeArr.length==0){

+ 46 - 78
src/components/qualityControl/AddQualityControlTemp.vue

@@ -11,22 +11,18 @@
                         </el-select>
                     </el-form-item>
                     <el-form-item label="所属模块:" prop="moduleName" class="formItem">
-                        <el-select  v-model="form.moduleName" placeholder="请选择所属模块"  :disabled="isEdit||isCopy" class="selectModule" @change="changeHsopital">
+                        <el-select  v-model="form.moduleName" placeholder="请选择所属模块"  :disabled="isEdit||isCopy" class="selectModule" @change="changeModule">
                             <el-option v-for="item in moduleList" :key="item.id" :label="item.name" :value="item.val"></el-option>
                         </el-select>
                     </el-form-item>
-                    <el-form-item label="模块类型:" prop="moduleType" class="formItem widthLarge">
-                        <el-select  v-model="form.moduleType" :disabled="form.hospital==='' || form.moduleName===''" placeholder="请选择模块类型"   @change="changeModuleType" class="selectModule">
-                            <el-option v-for="item in moduleTypeList" :key="item.id" :label="item.recTypeDetail" :value="item.id"></el-option>
-                        </el-select>
-                    </el-form-item>
                     <el-form-item label="模板名称:" prop="tempName" class="formItem widthLarge">
-                        <el-input v-model="form.tempName"  placeholder="请输入模板名称" disabled></el-input>
+                        <el-input v-model.trim="form.tempName"  placeholder="请输入模板名称"></el-input>
                     </el-form-item>
-                     <el-form-item label="示例:" v-if="form.moduleType !==''" prop="example" class="formItem formExam">
-                         <span class="exampleTxt">{{form.example}}</span>
-                        <!-- <el-input v-model="form.example"  disabled placeholder="示例"></el-input> -->
+                    <el-form-item label="模块类型:" prop="moduleTypes" class="formItem widthLarge">
                     </el-form-item>
+                    <QCTypePour :hospital="form.hospital"
+                                :moduleName="form.moduleName"
+                                @changeActionData="moduleTypeChange" :selectedTag="form.recordAnalyzeList"></QCTypePour>
                     <el-form-item label="模块内容:" prop="moduleInfo" class="formItem addCon">
                         <div class="moduleInfoItem" v-for="(item,index) in moduleInfoList">
                             <div class="orderBox">
@@ -77,6 +73,7 @@
 </template>
 <script>
 import api from '@api/qualityControl.js';
+import QCTypePour from './QCTypePour.vue';
 export default {
     name:"AddQualityControlTemp",
     data: function(){
@@ -89,46 +86,27 @@ export default {
                 tempName: "",
                 hospital:"",
                 moduleName:"",
-                moduleType:"",
+                moduleTypes:[],
+                recordAnalyzeList:[],
                 nameType:""
             },
             rules:{
                 tempName:{ required: true, message: '请输入模块名称', trigger: ['blur', 'change']},
                 hospital:{ required: true, message: '请选择医院', trigger: ['blur', 'change']},
                 moduleName:{ required: true, message: '请选择所属模块', trigger: ['blur', 'change']},
-                moduleType:{ required: true, message: '请选择模块类型   ', trigger: ['blur', 'change']},
+                moduleTypes:{ required: true, message: '请选择模块类型   ', trigger: ['blur', 'change']},
                 /*name:[{ required: true, message: '请输入显示名称',trigger: ['blur', 'change'] }],*/
             },
             searchIndex: -1,
             
             hospitalList:[],
             moduleList:[ ],
-            moduleTypeList:[], //模块类型列表
-            moduleInfoList:[
-                // {   
-                //     searchName:"",
-                //     activeIndex: -1,
-                //     searchResult:[
-                //         // {
-                //         //     name: "4姓名"
-                //         // },
-                //         // {
-                //         //     name: "5职业"
-                //         // },
-                //         // {
-                //         //     name: "6年龄"
-                //         // }
-                //     ],
-                //     selectFiled:[
-                        
-                //     ]
-                // }
-            ]
+            moduleInfoList:[]
         }
     },
     created(){
         this.getAllTypes();
-        const {isCopy, isEdit, data } = this.$route.params
+        const {isCopy, isEdit, data } = this.$route.params;
         if(isEdit || isCopy) {
             this.form.hospital = ''+data.hospitalId
             this.form.moduleName = ''+data.modeId
@@ -136,11 +114,8 @@ export default {
                 this.isEdit = isEdit;
                 this.id = data.id
                 this.title ="模板维护-修改"
-               this.form.tempName = data.name
-               this.getModuleTypeList().then(res =>{
-                   this.form.moduleType = data.recordModuleId
-                   this.form.example = this.moduleTypeList.find(item => item.id == this.form.moduleType).behospitalCodes
-                })
+                this.form.tempName = data.name;
+                this.form.recordAnalyzeList = data.recordAnalyzeList;
             }
             if(isCopy){
                 this.isEdit = isEdit;
@@ -148,9 +123,8 @@ export default {
                 this.id = ""
                 this.title ="模板维护-复制"
                 this.form.tempName = ""
-                 this.form.moduleType=""
-                 this.form.example=""
-                 this.getModuleTypeList()
+                this.form.moduleTypes=[];
+                 //this.form.example=""
             }
             const moduleDetail = data.moduleDetail
             const keysList = Object.keys(moduleDetail)
@@ -175,6 +149,9 @@ export default {
        
     },
     methods:{
+        moduleTypeChange(list){
+          this.form.moduleTypes=[...list];
+        },
         closeSearch(){
             if(this.searchIndex > -1){
                 this.moduleInfoList[this.searchIndex].searchName = ""
@@ -210,40 +187,28 @@ export default {
             // e.stopPropagation()
         },
         changeHsopital(){
-            this.form.moduleType = ""
-            this.getModuleTypeList()
+            this.form.moduleTypes = []
         },
         changeModule(){
-             this.form.moduleType = ""
-            this.getModuleTypeList()
-        },
-        changeModuleType(){
-            this.form.example = this.moduleTypeList.find(item => item.id == this.form.moduleType).behospitalCodes
-            this.form.tempName = this.moduleTypeList.find(item => item.id == this.form.moduleType).recTypeDetail
-        },
-        getModuleTypeList(){
-            this.moduleTypeList = []
-            if(this.form.hospital === "" || this.form.moduleName===""){
-                return
-            }
-            return api.getModuleTypeList({hospitalId: this.form.hospital, modeId: this.form.moduleName}).then((res) =>{
-                if(res.data.code==="0"){
-                    const data = res.data.data;
-                    this.moduleTypeList = data
-                }else{
-                    this.moduleTypeList=[]
-                    this.warning("获取模块类型失败");
-                }
-            })
+             this.form.moduleTypes = []
         },
         addUnit(){
-            if(!this.form.hospital){
+          const {hospital,moduleName,tempName,moduleTypes}=this.form;
+            if(!hospital){
                 this.warning("请先选择所属医院")
                 return
             }
-            if(!this.form.tempName){
-                this.warning("请先选择模块")
-                return
+            if(!moduleName){
+              this.warning("请选择所属模块");
+              return
+            }
+            if(!tempName.trim()){
+              this.warning("请输入模块名称");
+              return
+            }
+            if(!moduleTypes.length){
+              this.warning("请先选择模块类型");
+              return
             }
             this.moduleInfoList.push({   
                         searchName:"",
@@ -338,8 +303,8 @@ export default {
         confirm(form){
             // this.$refs[form].validate((valid) => {
             //     if (valid) {
-                    const {tempName,hospital,moduleName,moduleType} = this.form
-                    let moduleDetail = [], moduleInfoList = this.moduleInfoList
+                    const {tempName,hospital,moduleName,moduleTypes} = this.form;
+                    let moduleDetail = [], moduleInfoList = this.moduleInfoList;
                     for(let i = 0; i < moduleInfoList.length; i++){
                        for(let j = 0; j < moduleInfoList[i].selectFiled.length; j++){
                             let item ={
@@ -358,12 +323,12 @@ export default {
                         this.warning("请选择所属模块");
                         return
                     }
-                    if(!moduleType){
-                        this.warning("请选择模块类型");
-                        return
-                    }
                     if(!tempName){
-                        this.warning("请输入模块名称");
+                      this.warning("请输入模块名称");
+                      return
+                    }
+                    if(!moduleTypes.length){
+                        this.warning("请选择模块类型");
                         return
                     }
                    
@@ -378,8 +343,8 @@ export default {
                         hospitalId: hospital,
                         moduleDetail: moduleDetail,
                         remark:'',
-                        recordModuleId:moduleType
-                     }
+                        recordIdList:moduleTypes
+                     };
                      if(this.isEdit){
                          param = Object.assign({}, param, {id: this.id})
                      }
@@ -436,6 +401,9 @@ export default {
                 duration:time || '3000'
             })
         },
+    },
+    components:{
+      QCTypePour
     }
 
 }

+ 228 - 0
src/components/qualityControl/AddStandardRecord.vue

@@ -0,0 +1,228 @@
+<template>
+    <div>
+        <crumbs :title="title" :param="$route.params" linkTo="StandardRecord"></crumbs>
+        <div class="contents">
+            <div class="content">
+            <el-form ref="form" :label-position="labelPosition" label-width="125px" :model="form" :rules="rules">
+                <el-form-item label="所属医院:" prop="hospitalId">
+                    <el-select v-model="form.hospitalId"
+                               placeholder="请选择"
+                               size="small">
+                        <el-option
+                                v-for="item in hisTypes"
+                                :key="item.id"
+                                :label="item.name"
+                                :value="item.id">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="病人住院序号:" prop="behospitalCode">
+                    <el-input size="mini" v-model.trim="form.behospitalCode" placeholder="病人住院序号" clearable style="width: 200px;"></el-input>
+                    <el-button size="mini" @click="searchList" style="margin-left: 20px;height: 30px;">搜索</el-button>
+                </el-form-item>
+                <div>
+                    <el-table
+                    :data="medicalRecordlist"
+                    border
+                    style="width: 100%">
+                <!--<el-table-column
+                        :resizable = "false"
+                        label="所属医院"
+                        prop="hospitalName"
+                        >
+                </el-table-column>-->
+                <el-table-column
+                        :resizable = "false"
+                        prop="behospitalCode"
+                        label="病人住院序号"
+                        width="180">
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="name"
+                        label="病人姓名">
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="sex"
+                        label="性别">
+                </el-table-column>
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="behospitalDate"
+                        :formatter="dateFormatter"
+                        label="入院日期">
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="leaveHospitalDate"
+                        :formatter="dateFormatter"
+                        label="出院日期">
+                </el-table-column>
+                <!--<el-table-column
+                        :resizable = "false"
+                        prop="gmtModified"
+                        :formatter="dateFormatter"
+                        label="加入时间">
+                </el-table-column>-->
+            </el-table>
+                </div>
+                <el-button class="disclButn" size="small" type="primary" :disabled = 'saveDisable' @click="comfirn">确定</el-button>
+            </el-form>
+        </div>
+        </div>
+    </div>
+</template>
+<script type="text/javascript">
+  import api from '@api/qualityControl.js';
+  export default {
+    name:'AddStandardRecord',
+    data(){
+      return{
+        // data:{},
+        list:[],
+        medicalRecordlist:[],
+        labelPosition:'left',
+        isFirst:true,
+        title:'标准病历-新增',
+        casesEIds:'',
+        form:{
+          hospitalId:"",
+          behospitalCode:"", //病人住院序号
+        },
+        id:null,
+        rules:{
+          hospitalId:{ required: true, message: '请选择所属医院', trigger: ['blur', 'change']},
+          behospitalCode:{ required: true, message: '请输入病人住院序号', trigger: ['blur', 'change']},
+          /*name:[{ required: true, message: '请输入显示名称',trigger: ['blur', 'change'] }],*/
+        },
+        copy:null,
+        saveDisable: true,  //保存按钮禁止点击
+        flawList:[],
+        hisTypes:[],
+      }
+    },
+    created(){
+      let {hisTypes} = this.$route.params;
+      if(!hisTypes){
+        this.getHisTypes();
+        return;
+      }
+      this.hisTypes = hisTypes;
+    },
+    watch:{
+    },
+    methods:{
+      getHisTypes(){
+        api.getRecordHopitalList().then((res)=>{
+          if(res.data.code==="0"){
+            const data = res.data.data;
+            this.hisTypes =data;
+          }else{
+            this.warning("获取医院列表失败");
+          }
+        });
+      },
+      dateFormatter(item,prop,it){
+        return it.substr(0,10);
+      },
+      searchList(){
+        const { hospitalId, behospitalCode } = this.form;
+        if(!hospitalId){
+          this.warning("请选择所属医院");
+          return
+        }
+        if(!behospitalCode){
+          this.warning("请输入病人住院序号");
+          return
+        }
+        const param={ hospitalId, behospitalCode };
+        api.findStdRecord(param).then((res)=>{
+          if(res.data.code==="0") {
+            const data = res.data.data;
+            this.medicalRecordlist = [data];
+            if(data.status===1){
+              this.saveDisable=true;
+              this.warning("病历此前已被添加");
+            }else{
+              this.saveDisable=false;
+            }
+          }else{
+            this.medicalRecordlist = [];
+            this.saveDisable=true;
+            this.warning(res.data.msg);
+          }
+        });
+      },
+      comfirn(){
+        const {hospitalId,behospitalCode} = this.form;
+        const params = Object.assign({},this.form);
+        this.saveDisable = true;  //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
+        api.updateStdRecord(params).then((res)=>{
+          if(res.data.code==0){
+            this.$message({
+              message:"添加成功",
+              type:'success'
+            });
+            this.$router.push({name: 'StandardRecord'});
+          }else{
+            this.$message({
+              message:res.data.msg,
+              type:'warning'
+            });
+          }
+          this.saveDisable = false;
+        })
+      },
+      warning(msg, type,time) {
+          this.$message({
+              showClose: true,
+              message: msg,
+              type: type || 'warning',
+              duration:time || '3000'
+          })
+      },
+    }
+  }
+</script>
+<style>
+    .content .el-form-item.is-success .el-input__inner{
+        border-color: #ccc;
+    }
+    .content .el-form-item.is-success .el-input__inner:focus{
+        border-color: #48C5D7;
+    }
+</style>
+<style lang="less" scoped>
+    .content {
+        background: #fff;
+        padding: 20px 20px 80px;
+        color: #545455;
+        min-width: 980px;
+        position: relative;
+        .el-checkbox{
+            display: inline-block;
+        }
+    }
+    /deep/.el-input{
+              .el-input__inner{
+                    height: 30px;
+                    line-height: 30px;
+                  width: 200px;
+              }
+            }
+    .el-form-item{
+        width: 600px;
+    }
+    .el-select.big-select{
+        width: 360px;
+    }
+    .disclButn{
+        left: 49%;
+        bottom: 20px;
+    }
+    .el-button.is-disabled, .el-button.is-disabled:focus, .el-button.is-disabled:hover{
+        color: #fff;
+    }
+</style>

+ 333 - 0
src/components/qualityControl/AutoTestList.vue

@@ -0,0 +1,333 @@
+<template>
+    <div>
+        <crumbs title="自动化测试统计">
+            <el-form :inline="true" class="demo-form-inline" style="max-width: 870px;text-align: right;">
+                <el-form-item label="所属医院:">
+                    <el-select size="mini" v-model="filter.hospitalId" placeholder="所属医院" clearable>
+                        <el-option v-for="item in hisTypes" :label="item.name" :value="item.id" :key="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="所属模块:">
+                    <el-select size="mini" v-model="filter.casesId" placeholder="所属模块" clearable>
+                        <el-option v-for="item in fieldTypes" :label="item.name" :value="String(item.id)" :key="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="缺陷名称:">
+                    <el-input size="mini" v-model="filter.entryName" placeholder="缺陷名称"></el-input>
+                </el-form-item>
+                <el-form-item label="条目编码:">
+                    <el-input size="mini" v-model="filter.entryCode" placeholder="条目编码"></el-input>
+                </el-form-item>
+                <el-form-item>
+                    <el-button size="mini" @click="filterDatas">确认</el-button>
+                    <el-button size="mini" type="warning" @click="setTaskName">转化为任务</el-button>
+                    <el-button size="mini" type="warning" @click="showTestDialog">自动化测试</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="gmtModified"
+                        label="所属医院"
+                        width="120"
+                        :formatter="hisFormatter"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                <el-table-column
+                        prop="casesName"
+                        width="120"
+                        label="所属模块">
+                </el-table-column>
+                <el-table-column
+                        prop="entryName"
+                        label="缺陷名称">
+                </el-table-column>
+                <el-table-column
+                        prop="entryCode"
+                        width="120"
+                        label="条目编码">
+                </el-table-column>
+                <el-table-column
+                        prop="amount"
+                        width="80"
+                        label="差异数量">
+                </el-table-column>
+                <el-table-column
+                        prop="behospitalCodeStr"
+                        width="145"
+                        label="病人住院序号">
+                </el-table-column>
+                <!--<el-table-column
+                        label="操作" width="100">
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="toEditField(scope.row, 'modify')">修改</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button type="text" size="small" @click="toEditField(scope.row, 'copy')">复制</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button type="text" size="small" class="delete" @click="showDelDialog(scope.row.id)">删除</el-button>
+                    </template>
+                </el-table-column>-->
+            </el-table>
+            <el-pagination v-if="total>pageSize"
+                           :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           :layout="pageLayout"
+                           :total="total">
+            </el-pagination>
+        </div>
+        <el-dialog title="新建" :visible.sync="dialogTaskName" class="autotest-dialog">
+            <el-form>
+                <el-form-item label="任务名称:" label-width="80">
+                    <el-input v-model.tirm="taskName" placeholder="请输入任务名称" autocomplete="off"></el-input>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="addTask" :disabled="addBtnDisable">确 定</el-button>
+            </div>
+        </el-dialog>
+        <el-dialog title="提示" :visible.sync="dialogTippop" class="tip-dialog">
+            <div class="dialog-body">
+                <p>经程序自动化测试,下列病历存在问题,请及时处理~</p>
+                <br/>
+                <div class="warn-tip" v-html="tips"></div>
+            </div>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="addTask">确 定</el-button>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+  import api from '@api/qualityControl.js';
+  import { Loading } from 'element-ui';
+  import config from '@api/config.js';
+
+  export default {
+    name: 'AutoTestList',
+    data: function () {
+      return {
+        list: [],
+        tagType:[1],
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        loading: false,
+        fieldTypes:[],
+        searched:false,
+        hisTypes:[],
+        taskName:"",
+        dialogTaskName:false,
+        dialogTippop:false,
+        addBtnDisable:false,
+        pageLayout:config.pageLayout,
+        tips:'',
+        filter: {
+          hospitalId:'',
+          entryName:'',
+          entryCode: '',
+          casesId:'',
+        }
+      }
+    },
+    created() {
+      const _this=this;
+      setTimeout(function() {
+        _this.getAllTypes()
+      },100);
+    },
+    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: {
+      hisFormatter(item){
+        const field = this.hisTypes.filter((it)=>it.id==item.hospitalId);
+        return field[0]?field[0].name:'';
+      },
+      getAllTypes(){
+        api.getRecordHopitalList().then((res)=>{
+          if(res.data.code==="0"){
+            const data = res.data.data;
+            this.hisTypes =data;
+            this.getDataList();
+          }else{
+            this.warning("获取医院信息失败");
+          }
+        });
+        api.getRecordCases().then((res)=>{
+          if(res.data.code==="0"){
+            const data = res.data.data;
+            this.fieldTypes =data;
+          }else{
+            this.warning("获取模块信息失败");
+          }
+        });
+      },
+      autoTest(){
+        //this.loading=true;
+        let loadingInstance =Loading.service({background:"rgba(0, 0, 0, 0.6)"});
+        api.autoTest().then((res)=>{
+          if(res.data.code==="0"){
+            //this.loading=false;
+            loadingInstance.close();
+            const {messages}=res.data.data;
+            let str='';
+            if(messages.length>0){
+              for(let i=0;i<messages.length;i++){
+                str+=`<p>`+messages[i]+`</p>`;
+              }
+              this.tips = str;
+              this.dialogTippop=true;
+            }else{
+              this.warning(res.data.msg||'操作成功','success');
+            }
+            this.getDataList();
+          }else{
+            this.warning(res.data.msg||"自动化测试失败");
+          }
+        });
+      },
+      setTaskName(){
+        this.dialogTaskName = true;
+      },
+      addTask(){
+        if(!this.taskName.trim()){
+          this.warning("请输入任务名称");
+          return;
+        }
+        this.addBtnDisable=true;
+        api.addTask({missionName:this.taskName}).then((res)=>{
+          this.addBtnDisable=false;
+          if(res.data.code==="0"){
+            this.dialogTaskName = false;
+            this.toTaskList();
+          }else{
+            this.warning(res.data.msg||"转化为任务失败");
+          }
+        });
+      },
+      toTaskList(){
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          filter: this.filter
+        } : {currentPage: this.currentPage};
+        this.$router.push({name: 'AutoTestTask', params: pam});
+      },
+      filterDatas(){
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      getDataList() {
+        const param = this.getFilterItems();
+        this.searched = true;
+        api.getTestItems(param).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records;
+            this.total = data.total;
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      getFilterItems() {
+        const param = Object.assign({
+          current: this.currentPage,
+          size: this.pageSize,
+        },this.filter);
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        this.getDataList();
+      },
+      warning(msg,type){
+        this.$message({
+          showClose: true,
+          message:msg,
+          type:type||'warning'
+        })
+      },
+      showTestDialog(){
+        this.showConfirmDialog('所有标准病历自动化测试,可能将等待很长时间~',()=>{
+          this.autoTest();
+        });
+      },
+      showConfirmDialog(msg,resolve){
+        this.$alert(msg, '提示', {
+          confirmButtonText: '确定',
+          type: 'warning'
+        }).then(() => {
+          resolve();
+        }).catch(() => {});
+      },
+      showDelDialog(id){
+        this.showConfirmDialog('是否删除该字段映射?',()=>{
+          api.delFieldMatch({ids:id}).then((res)=>{
+            if(res.data.code=='0'){
+              this.warning(res.data.msg||'操作成功','success');
+              this.getDataList();
+            }else{
+              this.warning(res.data.msg);
+            }
+          }).catch((error)=>{
+            this.warning(error);
+          })
+        });
+      }
+    }
+  }
+</script>
+<style>
+   .el-loading-spinner{
+        top:200px;
+    }
+    .autotest-dialog .el-dialog__body{
+        padding: 30px 20px;
+    }
+   .autotest-dialog .el-form-item__content{
+       display: inline-block;
+       width: 272px;
+    }
+    .autotest-dialog .el-dialog{
+        width: 400px!important;
+    }
+</style>
+<style lang="less" scoped>
+    @import "../../less/admin.less";
+    .delete{
+        color: red !important;
+    }
+    div.container{
+        height: 90px!important;
+    }
+    .contents{
+        padding:120px 20px 0;
+    }
+</style>

+ 172 - 0
src/components/qualityControl/AutoTestTask.vue

@@ -0,0 +1,172 @@
+<template>
+    <div>
+        <crumbs title="任务列表">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="任务名称:">
+                    <el-input size="mini" v-model="filter.missionName" 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">
+            <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="missionName"
+                        label="任务名称">
+                </el-table-column>
+                <el-table-column
+                        label="操作" width="150">
+                    <template slot-scope="scope"><el-button type="text" size="small" @click="toTaskDetail(scope.row.id)">详情</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <!--<el-button type="text" size="small" @click="toEditField(scope.row, 'modify')">修改</el-button>
+                        <span style="margin:0 3px;">|</span>-->
+                        <el-button type="text" size="small" class="delete" @click="showDelDialog(scope.row.id)">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           :layout="pageLayout"
+                           :total="total">
+            </el-pagination>
+        </div>
+    </div>
+</template>
+
+<script>
+  import api from '@api/qualityControl.js';
+  import config from '@api/config.js';
+
+  export default {
+    name: 'AutoTestTask',
+    data: function () {
+      return {
+        list: [],
+        tagType:[1],
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        fieldTypes:[],
+        searched:false,
+        pageLayout:config.pageLayout,
+        hisTypes:[],
+        filter: {
+          missionName: ''
+        }
+      }
+    },
+    created() {
+      const _this=this;
+      setTimeout(function() {
+        _this.getDataList()
+      },100);
+    },
+    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: {
+      toTaskDetail(id){
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          filter: this.filter,
+          id
+        } : {currentPage: this.currentPage,id};
+         this.$router.push({
+           name:'TaskDetail',
+           params: pam
+         })
+      },
+      filterDatas(){
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      getDataList() {
+        const param = this.getFilterItems();
+        this.searched = true;
+        api.getTaskList(param).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records;
+            this.total = data.total;
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      getFilterItems() {
+        const param = Object.assign({
+          current: this.currentPage,
+          size: this.pageSize,
+        },this.filter);
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        this.getDataList();
+      },
+      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(id){
+        this.showConfirmDialog('是否删除该任务?',()=>{
+          api.delTask({id:id}).then((res)=>{
+            if(res.data.code=='0'){
+              this.warning(res.data.msg||'操作成功','success');
+              this.getDataList();
+            }else{
+              this.warning(res.data.msg);
+            }
+          }).catch((error)=>{
+            this.warning(error);
+          })
+        });
+      }
+    }
+  }
+</script>
+
+<style lang="less">
+    @import "../../less/admin.less";
+    .delete{
+        color: red !important;
+    }
+</style>

+ 398 - 0
src/components/qualityControl/ItemDataType.vue

@@ -0,0 +1,398 @@
+<template>
+    <div>
+        <crumbs title="条目关联质控类型">
+            <el-form :inline="true" class="demo-form-inline">
+                <el-form-item label="所属医院:">
+                    <el-select size="mini" v-model.trim="filter.hospitalId" @change="getValue"  placeholder="所属医院" clearable>
+                        <el-option v-for="item in hospitalList" :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.trim="filter.typeName" placeholder="质控类型" clearable>
+                        <el-option v-for="item in qcTypeNameList" :label="item.name" :value="item.name" :key="item.name" ></el-option>
+                    </el-select>
+                </el-form-item>
+                 <el-form-item label="条目名称:">
+                    <el-input size="mini" v-model.trim="filter.entryName" placeholder="条目名称" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="所属模块:">
+                     <el-select size="mini" v-model.trim="filter.casesId"  placeholder="所属模块" clearable>
+                        <el-option v-for="item in moduleList" :label="item.name" :value="item.id" :key="item.id" ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="条目编码:">
+                    <el-input size="mini" v-model.trim="filter.code" 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="addTemp">添加模板</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
+                        :resizable = "false"
+                        label="所属医院"
+                        prop="hospitalId"
+                        :formatter="hisFormatter"
+                        >
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="entryName"
+                        label="条目名称"
+                        width="180"
+                        show-overflow-tooltip>
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="casesName"
+                        label="所属模块">
+                </el-table-column>
+                
+                <el-table-column
+                        :resizable = "false"
+                        prop="code"
+                        label="条目编码">
+                </el-table-column>
+                 <el-table-column
+                        :resizable = "false"
+                        prop="typeStr"
+                        label="质控类型"
+                        show-overflow-tooltip>
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="operate"
+                        label="操作">
+                    <template slot-scope="scope">
+                        <el-button  @click="modifyIndeptTag(scope.row, 'modify')" type="text" size="small">关联</el-button>
+                        <!-- <span style="margin:0 3px;">|</span>
+                        <el-button @click="modifyIndeptTag(scope.row, 'copy')" class="text" type="text" size="small">复制</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button @click="showDelDialog(scope.row)" class="delete" type="text" size="small">删除</el-button> -->
+                    </template>
+                </el-table-column>
+            </el-table>
+          <el-pagination  :current-page.sync="currentPage"
+                          @current-change="currentChange"
+                          background
+                          :page-size.sync="pageSize"
+                          :page-sizes="pageSizeArr"
+                           @size-change="handleSizeChange"
+                          :layout="pageLayout"
+                          :total="total">
+            </el-pagination>
+        </div>
+    </div>
+</template>
+
+<script>
+  import api from '@api/qualityControl.js';
+  import apis from '@api/records.js';
+  import config from '@api/config.js';
+  import utils from '@api/utils.js'
+  export default {
+    name: 'ItemDataType',
+    data: function() {
+      return {
+        list: [],
+        hospitalList: [],
+        moduleList:[],
+        qcTypeNameList:[],
+        searched: false,
+        filter: {
+          typeName:"",//质控类型名称
+          hospitalId: "", //所属医院
+          entryName:"", //条目名称
+          casesId:null,//所属模块
+          code:"",//条目编码
+        },
+        currentPage: 1,
+        pageSize: config.pageSize,
+        pageSizeArr:config.pageSizeArr,
+        pageLayout:config.pageLayout,
+        total: 0,
+      }
+    },
+    created() {
+      const _this=this;
+      this.getTypeNameList()
+      this.getModuleList()
+      setTimeout(function(){
+        _this.getAllTypes().then(()=>{
+          _this.getDataList()
+        })
+      },100);
+
+    },
+    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: {
+      moduleFormatter(row, column, cellValue){
+        const it = this.moduleList.find(item => item.id == cellValue);
+        return it?it.name:'';
+      },
+      hisFormatter(row, column, cellValue){
+        const it = this.hospitalList.find(item => item.val == cellValue);
+        return it?it.name:'';
+      },
+      getAllTypes(){
+          if(localStorage.getItem("qcModuleTypes")){
+              this.hospitalList = JSON.parse(localStorage.getItem("qcHospitalTypes"));
+              return new Promise(function(resolve, reject){
+                  resolve()
+              });
+          }
+          //获取枚举信息
+          return api.getQcTypes().then((res)=>{
+              if(res.data.code==="0"){
+                  const data = res.data.data;
+                  localStorage.setItem("qcFieldTypes",JSON.stringify(data[11]));
+                  localStorage.setItem("qcModuleTypes",JSON.stringify(data[12]));
+                  localStorage.setItem("qcHospitalTypes",JSON.stringify(data[13]));
+                  this.hospitalList = JSON.parse(localStorage.getItem("qcHospitalTypes"));
+              }else{
+                  this.warning("获取枚举信息失败");
+              }
+          });
+      },
+      
+      getTypeNameList(hospitalId){
+        api.getQcEntryTypeByHospital({hospitalId:hospitalId}).then((res) => {
+          if(res.data.code == 0){
+            // let list = res.data.data.records
+              this.qcTypeNameList = res.data.data
+              this.qcTypeNameList.unshift({id: null, name:"无质控类型"})
+          }
+          
+        })
+      },
+       getModuleList(){
+        return apis.getRecordCases({}).then((res)=>{
+          const result = res.data;
+          if(result.code==0){
+            this.moduleList = result.data
+          }else{
+            this.$message({
+              message:result.msg,
+              type:'warning',
+              showClose: true
+            });
+          }
+        })
+      },
+      handleSizeChange(val){
+        this.pageSize = val;
+        this.currentPage = utils.getCurrentPage(this.currentPage, this.total, this.pageSize);
+        this.getDataList();
+      },
+      getValue(val) {
+        this.filter.typeName = ""
+        this.qcTypeNameList=[]
+        this.getTypeNameList(val)
+      },
+      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.getQcEntryTypeList(param).then((res) => {
+          loading.close()
+          if(res.data.code == 0){
+            let list = res.data.data.records
+          /*for(let i = 0; i < list.length; i++){
+            list[i].hospitalId = this.hospitalList.find(item => item.val == list[i].hospitalId).name
+            list[i].modeId  = this.moduleList.find(item => item.val == list[i].modeId).name
+          }*/
+          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();
+      },
+      addTemp() {
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          pageSize:this.pageSize,
+          filter: this.filter
+        } : {currentPage: this.currentPage,pageSize:this.pageSize};
+        this.$router.push({
+          name: 'ItemDataTypeRelation',
+          params: pam
+        })
+      },
+      modifyIndeptTag(row, type) {
+        api.getQcEntryTypeDetail({ "entryId": row.entryId,"hospitalId": row.hospitalId}).then((res)=>{
+          const {code,data,msg} = res.data;
+          const hospitalItem = this.hospitalList.find(item => item.val == row.hospitalId);
+         const hospitalName = hospitalItem ? hospitalItem.name:''
+          if(code=='0'){
+            const item = Object.assign({},{hospitalName:hospitalName},data);
+            const pam = this.searched ? {
+              currentPage: this.currentPage,
+              filter: this.filter
+            } : {currentPage: this.currentPage};
+            if(type == 'modify') {
+              this.$router.push({name: 'ItemDataTypeRelation', params: Object.assign(pam, {isEdit: true, data: item})});
+            } else if( type == 'copy') {
+              this.$router.push({name: 'ItemDataTypeRelation', params: Object.assign(pam, {isCopy: true, data: item})});
+            } else {
+                return
+            }
+          }else{
+            this.$message({
+              message: msg,
+              type: 'warning'
+            });
+          }
+        });
+        //this.$router.push({name:'AddIndeptLabel',params:{isEdit:true,data:row}});
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        this.getDataList(true);
+        // if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+        //     this.list = this.cacheData[next];
+        // } else {
+        //     this.getDataList();
+        // }
+      },
+      clearFilter(){
+        this.filter={
+          hospitalId: "",
+          typeName:"",
+          entryName:"",
+          casesId:null,
+          code:""
+        };
+      },
+      getFilterItems(isTurnPage) {
+        //翻页时筛选条件没点确定则清空
+        if(isTurnPage&&!this.searched){
+          this.clearFilter();
+        };
+        const {hospitalId,typeName,entryName,casesId,code} = this.filter
+        let param = {
+          current: this.inCurrentPage||this.currentPage,
+          size: this.pageSize,
+          hospitalId: hospitalId,
+          typeName:typeName,
+          entryName:entryName,
+          casesId:casesId,
+          code:code
+        };
+        if(typeName == "无质控类型"){
+          param = Object.assign({}, param,{typeName:"",typeIsNull:1})
+        }
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      getTagType(val) {
+        return val
+      },
+      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(() => {});
+      },
+      showDelDialog(row){
+        const param = {
+          "ids": row.id,
+        }
+        this.showConfirmDialog('是否删除该模板?',()=>{
+          api.delQCTemp(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;
+    }
+    .el-select .el-input .el-icon-arrow-up{
+        display: inline-block!important;
+    }
+    .el-select .el-input .el-icon-circle-close{
+        float:left;
+    }
+  .el-pagination__sizes{
+      margin-right: 20px;
+    .el-input .el-input__inner{
+        height: 28px;
+        line-height: 28px;
+    }
+  }
+</style>

+ 454 - 0
src/components/qualityControl/ItemDataTypeQcTypePour.vue

@@ -0,0 +1,454 @@
+<template>
+    <div class="qcTypeWrapper commomSymptom clearfix">
+        <QCTipPop :name="curName" :example="curEmp" :show="showPop" :top="popTop" :left="popLeft" @close="closePop"></QCTipPop>
+        <div class="bottomPartLeft">
+            <p style="height: 26px;"> </p>
+          <div class="pool">
+            <ul class="tagList tagPool">
+                <li v-for="(item, index) in leftTagsList"
+                    class = "tagItem"
+                    :key='item.id'
+                    :style="getStyle(item)?styles:null"
+                    @click='selectLeftTag(item, index, $event)'
+                >
+                    <p class="ellipsis" @click="closePop">
+                        <span class="tagName">{{item.name}}</span>
+                        <!-- <span :class="activeId==item.id?'tip-icon active':'tip-icon'" @click.stop="showTipPop(item,$event)"></span> -->
+                    </p>
+                </li>
+            </ul>
+          </div>
+        </div>
+        <div class="bottomPartMid fl">
+            <p><span class="el-icon-arrow-right" @click="toRightList"></span></p>
+            <p><span class="el-icon-arrow-left" @click="toLeftList"></span></p>
+        </div>
+        <div class="bottomPartRight ">
+          <p class="poolTitle">已选质控类型:</p>
+          <ul class="tagList operationPool operationPools">
+                <li class = "tagItem"
+                    v-for="(item) in rightTagsList"
+                    :key='item.id'
+                    :style="getStyle2(item)?styles:null"
+                    @click='selectRightTag(item)'
+                >
+                    <p class="ellipsis" @click="closePop">
+                        <span class="tagName">{{item.name}}</span>
+                        <!-- <span :class="activeId==item.id?'tip-icon active':'tip-icon'" @click.stop="showTipPop(item,$event)"></span> -->
+                    </p>
+                </li>
+            </ul>
+        </div>
+    <!--<div class="buttonBox" :class="(qaType==2)?'rightMore':''">
+        <div class="bottomPartMid bottomPartMidss fl bottomPartMids" >
+            <p><span class="el-icon-arrow-up" @click="toggleTopDownList(1)"></span></p>
+            <p><span class="el-icon-arrow-down" @click="toggleTopDownList(2)"></span></p>
+        </div>
+    </div>-->
+  </div>
+</template>
+<script>
+import api from '@api/qualityControl.js';
+import QCTipPop from './QCTipPop.vue';
+import $ from 'jquery'
+
+export default {
+    name: "ItemDataTypeQcTypePour",
+    props: ['hospital','moduleName','selectedTag'],
+    data() {
+        return {
+            checkedExc:false,
+            leftTagsList: [],
+            selectLeftTagsList: [],
+            rightTagsList: [],
+            selectRightTagsList: [],
+            showPop:false,
+            activeId:'',
+            curName:"",
+            curEmp:"",
+            popTop:'',
+            popLeft:'',
+            styles:{
+                background:'#eae7e7'
+            },
+        }
+    },
+    mounted() {
+      //编辑
+        if(this.hospital&&this.moduleName){
+          const that = this;
+          setTimeout(function(){            //等watch执行后赋值tags,否则这里先执行,会被watch里清空
+            that.rightTagsList = [...that.selectedTag];
+            that.getModuleTypeList();
+            that.$emit('changeActionData',that.getModuleTypeIds());
+          },100);
+        }
+    },
+    watch: {
+      hospital(){
+            this.rightTagsList=[];
+          this.getModuleTypeList();
+        },
+      moduleName(){
+            this.rightTagsList=[];
+          this.getModuleTypeList();
+        },
+      /*'selectRightTagsList':{
+          handler:function(newVal){
+          },
+          deep:true
+        }*/
+    },
+    methods: {
+        closePop(){
+          this.activeId = '';
+          this.curName = '';
+          this.curEmp = '';
+          this.popTop = 0;
+          this.popLeft=0;
+          this.showPop=false;
+        },
+        showTipPop(item,e){
+          if(this.showPop&&this.activeId===item.id){
+            this.closePop();
+            return;
+          }
+          const t=$(".el-main").scrollTop();
+          this.activeId = item.id;
+          this.curName = item.name;
+          this.curEmp = item.behospitalCodes;
+          this.popTop = t+e.clientY;
+          this.popLeft=e.clientX;
+          this.showPop = true;
+        },
+        handleExclu(){
+            if(!this.selectRightTagsList||this.selectRightTagsList.length==0){
+              this.$message({
+                showClose: true,
+                message: '请先选择要操作的标签',
+                type: 'warning'
+              });
+              return ;
+            }
+            const arr = this.rightTagsList.map((it)=>{
+              if(it.id==this.selectRightTagsList[0].id){
+                if(it.exclusionType===1){
+                  it.exclusionType = 0
+                }else{
+                  it.exclusionType=1;
+                }
+              }else{
+                it.exclusionType=0;
+              }
+              return it;
+            });
+            this.rightTagsList=arr;
+            this.$emit('changeActionData',this.getModuleTypeIds());
+        },
+        transOptions(opt){
+          return opt&&opt.map((it)=>{
+            return Object.assign({},it,{id:it.questionId||it.id});      //模板是questionId,组合是id
+          });
+        },
+        ifReflashTagList(newVal='', preVal=''){
+          if(newVal.trim() == ''){
+            this.searchVal = '';
+            this.rightTagsList=[];
+            this.getModuleTypeList();
+          }else if(newVal.trim() != preVal.trim()){
+            this.searchVal = '';
+            this.rightTagsList=[];
+            this.getModuleTypeList();
+          }
+        },
+        selectLeftTag(tag) {
+            const hasTag = this.isHasTag(tag, this.selectLeftTagsList);
+            if (hasTag) {
+                this.selectLeftTagsList = this.selectLeftTagsList.filter(item => item.id !== tag.id)
+            } else {
+                this.selectLeftTagsList.push(tag);
+            }
+        },
+        selectRightTag(tag) {
+            /*let tmpArr = [];
+            tmpArr.push(tag);
+            if (this.selectRightTagsList.length > 0 && tag.id == this.selectRightTagsList[0].id) {
+              this.selectRightTagsList = this.selectRightTagsList.filter(item => item.id !== tag.id)
+            }else{
+              this.selectRightTagsList = tmpArr;
+            }*/
+          const hasTag = this.isHasTag(tag, this.selectRightTagsList);
+          if (hasTag) {
+            this.selectRightTagsList = this.selectRightTagsList.filter(item => item.id !== tag.id)
+          } else {
+            this.selectRightTagsList.push(tag);
+          }
+        },
+        isHasTag(item, arr) {
+            for ( let i = 0; i <arr.length; i++) {
+                if(arr[i].id === item.id) {
+                    return true;
+                }
+            }
+            return false;
+        },
+        getStyle(item){       //左侧选中状态
+            return this.isHasTag(item, this.selectLeftTagsList)
+        },
+        getStyle2(item) {
+            return this.isHasTag(item, this.selectRightTagsList);
+        },
+        toggleTopDownList(type){
+          if(this.selectRightTagsList.length == 0 || this.rightTagsList.length == 0){
+            return;
+          }
+          const tmpRightSelect = JSON.parse(JSON.stringify(this.selectRightTagsList));
+          const tmpRightLis = JSON.parse(JSON.stringify(this.rightTagsList));
+          const numLen = tmpRightLis.length;
+          const numId = tmpRightSelect[0].id;
+          if(type == 1){
+            for(let i = 0;i < tmpRightLis.length;i++){
+              if(numId === tmpRightLis[i].id){//选中的是第几个
+                if(i == 0){//第一个不能往上移动
+                  return;
+                }else{//先把这个元素和后面的输入框从数组中删除,再添加到数组里
+                  let tmp1 = tmpRightLis[i];
+                  tmpRightLis.splice(i,1);
+                  tmpRightLis.splice(i-1,0,tmp1);
+                  this.rightTagsList = [...tmpRightLis];
+                  this.$emit('changeActionData',this.getModuleTypeIds(), false);
+                  return
+                }
+              }
+            }
+          }else if(type == 2){
+            for(let i = 0;i < tmpRightLis.length;i++){
+              if(numId === tmpRightLis[i].id){
+                if(i == numLen-1){
+                  return;
+                }else{
+                  let tmp1 = tmpRightLis[i];
+                  tmpRightLis.splice(i,1);
+                  tmpRightLis.splice(i+1,0,tmp1);
+                  this.rightTagsList = [...tmpRightLis];
+                  this.$emit('changeActionData',this.getModuleTypeIds(), false);
+                  return;
+                }
+              }
+            }
+          }
+        },
+        toLeftList() {console.log(this.rightTagsList)
+            this.leftTagsList.push(...this.selectRightTagsList);
+            for (let i = 0; i < this.selectRightTagsList.length; i++) {
+                this.rightTagsList = this.rightTagsList.filter(item => item.id !== this.selectRightTagsList[i].id);
+            }
+            for (let i = 0; i < this.selectRightTagsList.length; i++) {
+                for (let j = 0; j < this.rightTagsList.length; j++) {
+                    if(this.selectRightTagsList[i].id === this.rightTagsList[j].id) {
+                        if(this.rightTagsList.length === 1) {
+                            this.rightTagsList = [];
+                        } else {
+                            this.rightTagsList.splice(j, 1);
+                        }
+                    }
+                }
+            }
+            this.selectLeftTagsList = [];
+            this.selectRightTagsList = [];
+            //this.getModuleTypeList();
+            this.$emit('changeActionData',this.getModuleTypeIds(), false);
+        },
+        toRightList() {
+            this.rightTagsList.push(...this.selectLeftTagsList);
+            for (let i = 0; i < this.rightTagsList.length; i++) {
+                this.leftTagsList = this.leftTagsList.filter(item => item.id !== this.rightTagsList[i].id)
+            }
+            this.selectLeftTagsList = [];
+            this.selectRightTagsList = [];
+            //this.getModuleTypeList();
+            this.$emit('changeActionData',this.getModuleTypeIds(), false);
+        },
+        getModuleTypeList() {
+          this.leftTagsList = []
+          if(this.hospital === "" || this.moduleName===""){
+            return
+          }
+          return api.getQcEntryTypeIndex({hospitalId: ""+this.hospital, entryId: ""+this.moduleName,notIdList:this.getModuleTypeIds()||[]}).then((res) =>{
+            if(res.data.code==="0"){
+              const data = res.data.data;
+              this.leftTagsList = data;
+              this.selectLeftTagsList = [];
+              this.selectRightTagsList = [];
+            }else{
+              this.leftTagsList=[];
+              this.selectLeftTagsList = [];
+              this.selectRightTagsList = [];
+              this.warning("获取质控类型失败");
+            }
+          })
+        },
+      getModuleTypeIds(){
+          const list=this.rightTagsList;
+          return list.map((it)=>it.id);
+      },
+      warning(msg, type,time) {
+            this.$message({
+                showClose: true,
+                message: msg,
+                type: type || 'warning',
+                duration:time || '3000'
+            })
+        },
+    },
+    components:{
+      QCTipPop
+    }
+}
+</script>
+
+<style lang="less" scoped>
+@import '../../less/common.less';
+.operation-row{
+    text-align: right;
+}
+.exclu{
+    position: absolute;
+    right: -54px;
+    top: 5px;
+}
+.rightMore{
+    margin-left: 48px;
+}
+.commomSymptom {
+  .tagList.operationPools {
+    width: 100%;
+  }
+  div.bottomPartMids {
+    margin-left: 20px;
+  }
+  div.bottomPartMidss {
+    margin-top: 30px;
+  }
+}
+.qcTypeWrapper {
+    padding-left: 60px;
+    margin:-20px 0 20px;
+    position: relative;
+    .bottomPartLeft {
+        width: 40%;
+        box-sizing: border-box;
+        float: left;
+    }
+    .poolTitle {
+        // border-bottom: 1px solid @icssBorder;
+        box-sizing: border-box;
+        margin-bottom: 10px;
+        font-size: 12px;
+    }
+    .pool {
+        // border:1px solid @icssBorder;
+    
+    }
+    .search {
+        width: 100%;
+        border-bottom: 1px solid @icssBorder;
+        box-sizing: border-box;
+        height: 30px;
+    }
+    .tagList {
+        border: 1px solid @icssBorder;
+    }
+    .ellipsis{
+        .tip-icon{
+            display:inline-block;
+            width:16px;
+            height: 16px;
+            vertical-align: middle;
+            background-image:url("../../images/tip.png");
+            background-size:16px;
+            background-repeat:no-repeat;
+            &:hover,&.active{
+                 background-image:url("../../images/tip1.png");
+            }
+        }
+
+    }
+    /*.pop{
+        display: none;
+        position: absolute;
+        top:-30px;
+        right: -10px;
+        padding: 5px 10px;
+        background: #fff;
+        border:1px #ccc solid;
+        border-radius: 3px;
+        line-height: 20px;
+        font-size: 12px;
+        width: 300px;
+        word-break: break-all;
+        z-index: 1;
+    }*/
+    .tagPool {
+        height: 320px;
+        overflow-y: auto;
+
+    }
+    .tagItem {
+        position: relative;
+        line-height: 30px;
+        cursor: pointer;
+        padding: 0 10px;
+        /*z-index:0;*/
+    }
+    .operationPool {
+        position: relative;
+        width: 60%;
+        height: 300px;
+        padding: 10px 0;
+        overflow: auto;
+    }
+    .tagName{
+        margin-right: 10px;
+        font-size: 14px;
+        vertical-align: middle;
+    }
+    .bottomPartMid {
+        width: 8%;
+        margin-top: 60px;
+        p {
+        width: 100%;
+        text-align: center;
+        span {
+            cursor: pointer;
+            display: inline-block;
+            width: 30px;
+            height: 40px;
+            line-height: 40px;
+            margin: 0 auto;
+            border: 1px solid @icssBorder;
+            margin-bottom: 15px;
+            font-size: 18px;
+        }
+        }
+    }
+    .bottomPartRight {
+        float: left;
+        width: 40%;
+    }
+    .buttonBox {
+        width: 10%;
+        float: left;
+        margin-top: 30px;
+    }
+    .inputBox {
+        width: 120px;
+        .el-input {
+            .el-input__inner {
+                height: 30px;
+                background: rgb(234, 231, 231);
+            }
+        }
+    }
+}
+</style>

+ 561 - 0
src/components/qualityControl/ItemDataTypeRelation.vue

@@ -0,0 +1,561 @@
+<template>
+    <div @click="closeSearch">
+       <crumbs :title="title" :param="$route.params" linkTo="ItemDataType">
+        </crumbs>
+        <div class="contentWrapper">
+            <div class="content">
+                <el-form :model="form" :rules="rules" ref="form" class="selectHospital">
+                    <el-form-item label="所属医院:" prop="hospital" class="formItem">
+                        <el-select  v-model="form.hospitalId" placeholder="请选择医院"  :disabled="isEdit||isCopy" class="selectHospital" @change="changeHsopital">
+                            <el-option v-for="item in hospitalList" :key="item.val" :label="item.name" :value="item.val"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="所属模块:" prop="moduleName" class="formItem">
+                        <el-select  v-model="form.moduleName" placeholder="请选择所属模块"  :disabled="isEdit||isCopy" class="selectModule" @change="changeModule">
+                            <el-option v-for="item in moduleList" :key="item.val" :label="item.name" :value="item.val"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="条目名称:" prop="tempName" class="formItem widthLarge">
+                        <el-input v-model.trim="form.tempName"  :title="form.tempName"  :disabled="isEdit||isCopy" placeholder="请输入条目名称"></el-input>
+                    </el-form-item>
+                    <el-form-item label="质控类型:" prop="moduleTypes" class="formItem widthLarge">
+                    </el-form-item>
+                    <ItemDataTypeQcTypePour :hospital="form.hospitalId"
+                                :moduleName="form.entryId"
+                                @changeActionData="moduleTypeChange" :selectedTag="form.recordAnalyzeList"></ItemDataTypeQcTypePour>
+                    <!-- <el-form-item label="模块内容:" prop="moduleInfo" class="formItem addCon">
+                        <div class="moduleInfoItem" v-for="(item,index) in moduleInfoList">
+                            <div class="orderBox">
+                                <span class="el-icon-arrow-up order"  @click="upUnit(index)"></span>
+                                <span  class="el-icon-arrow-down order" @click="downUnit(index)"></span> 
+                            </div>
+                            <div class="searchBox">
+                                <el-input v-model.trim="item.searchName"  placeholder="搜索字段单元" @click="stopClick"  @input="searchFiled(index)">
+                                </el-input>
+                                <ul v-if="searchIndex == index &&  item.searchResult.length > 0" class="searchResultBox">
+                                    <li class="searchItem" 
+                                        v-for="searchItem in item.searchResult" 
+                                        :title="searchItem.tagName"
+                                        @click="selectSearchFiled(searchItem,index)"
+                                    >
+                                        {{searchItem.tagName}}
+                                    </li>
+                                </ul>
+                            </div>
+                            <div>
+                                <p>已选择字段:</p>
+                                <div class="selectFiledBox">
+                                     <div class="orderBox">
+                                            <span class="el-icon-arrow-up order"  @click="upFiled(index)"></span>
+                                            <span  class="el-icon-arrow-down order" @click="downFiled(index)"></span> 
+                                        </div>
+                                    <div class="selectFiled" v-for="(it,ii) in item.selectFiled">
+                                        <span class="filedName" :class="{activeFiledName: item.activeIndex == ii}" @click="setActiveIndex(index,ii)">{{it.tagName}}
+                                            <span class="el-icon-circle-close delFiled" @click="delSelected(ii,index)"></span>
+                                        </span>
+                                    
+                                    </div>
+                                </div>
+                                
+                            </div>
+                            <span class="el-icon-circle-close delUnit" @click="delUnit(index)"></span>
+                        </div>
+                        <span  class="addUnit" >
+                            <el-button  size="small" type="primary"  @click="addUnit">+单元组</el-button>
+                        </span>
+                    </el-form-item> -->
+                </el-form>
+                <el-button class="disclButn" size="small" type="primary" :disabled = 'saveDisable' @click="confirm('form')">确定</el-button>
+            </div>
+        </div>
+        
+    </div>
+</template>
+<script>
+import api from '@api/qualityControl.js';
+import ItemDataTypeQcTypePour from './ItemDataTypeQcTypePour.vue';
+export default {
+    name:"AddQualityControlTemp",
+    data: function(){
+        return {
+            title: "条目关联质控类型-关联",
+            isEdit:false,
+            isCopy: false,
+            saveDisable: false,
+            form:{
+                tempName: "",
+                hospitalId:"",
+                moduleName:"",
+                moduleTypes:[],
+                recordAnalyzeList:[],
+                nameType:"",
+                entryId:""
+            },
+            rules:{
+                tempName:{ required: true, message: '请输入条目名称', trigger: ['blur', 'change']},
+                hospital:{ required: true, message: '请选择医院', trigger: ['blur', 'change']},
+                moduleName:{ required: true, message: '请选择所属模块', trigger: ['blur', 'change']},
+                moduleTypes:{ required: true, message: '请选择质控类型   ', trigger: ['blur', 'change']},
+                /*name:[{ required: true, message: '请输入显示名称',trigger: ['blur', 'change'] }],*/
+            },
+            searchIndex: -1,
+            
+            hospitalList:[],
+            moduleList:[ ],
+            moduleInfoList:[]
+        }
+    },
+    created(){
+        // this.getAllTypes();
+        const {isCopy, isEdit, data } = this.$route.params;
+        console.log('data',data)
+        if(isEdit || isCopy) {
+            this.isEdit = isEdit;
+            this.form.hospitalId = data.hospitalId
+            this.form.moduleName = data.casesName
+            this.form.tempName = data.entryName
+            this.form.entryId = data.entryId
+            this.form.recordAnalyzeList = data.qcTypeSimpDTOList
+            this.hospitalList.push({
+                val: this.form.hospitalId,
+                name: data.hospitalName
+            })
+            this.moduleList.push({
+                val: data.casesName,
+                name: data.casesName
+            })
+            // if(isEdit){
+            //     this.isEdit = isEdit;
+            //     this.id = data.id
+            //     this.title ="条目关联质控类型-关联"
+            //     this.form.tempName = data.name;
+            //     this.form.recordAnalyzeList = data.recordAnalyzeList;
+            // }
+            // if(isCopy){
+            //     this.isEdit = isEdit;
+            //     this.isCopy = isCopy
+            //     this.id = ""
+            //     this.title ="条目关联质控类型-关联"
+            //     this.form.tempName = ""
+            //     this.form.moduleTypes=[];
+            //      //this.form.example=""
+            // }
+            // const moduleDetail = data.moduleDetail
+            // const keysList = Object.keys(moduleDetail)
+            // for(let i = 0; i < keysList.length; i++){
+            //     let selectFiled = []
+            //     for(let j = 0; j < moduleDetail[keysList[i]].length; j++){
+            //         const item =  moduleDetail[keysList[i]][j]
+            //         selectFiled.push(item.questionDTO)
+            //     }
+            //     this.moduleInfoList.push({
+            //         searchName:"",
+            //         activeIndex: -1,
+            //         searchResult:[
+            //         ],
+            //         selectFiled:selectFiled
+            //     })
+                
+            // }
+          
+            
+        }
+       
+    },
+    methods:{
+        moduleTypeChange(list){
+          this.form.moduleTypes=[...list];
+        },
+        closeSearch(){
+            if(this.searchIndex > -1){
+                this.moduleInfoList[this.searchIndex].searchName = ""
+                this.moduleInfoList[this.searchIndex].searchResult=[]
+                this.searchIndex = -1
+            }
+            
+        },
+        getAllTypes(){
+            if(localStorage.getItem("qcModuleTypes")){
+                this.hospitalList = JSON.parse(localStorage.getItem("qcHospitalTypes"));
+                this.moduleList = JSON.parse(localStorage.getItem("qcModuleTypes"));
+                return new Promise(function(resolve, reject){
+                    resolve()
+                });
+            }
+            //获取枚举信息
+            return api.getQcTypes().then((res)=>{
+                if(res.data.code==="0"){
+                    const data = res.data.data;
+                    localStorage.setItem("qcFieldTypes",JSON.stringify(data[11]));
+                    localStorage.setItem("qcModuleTypes",JSON.stringify(data[12]));
+                    localStorage.setItem("qcHospitalTypes",JSON.stringify(data[13]));
+                    this.hospitalList = JSON.parse(localStorage.getItem("qcHospitalTypes"));
+                    this.moduleList = JSON.parse(localStorage.getItem("qcModuleTypes"));
+                }else{
+                    this.warning("获取枚举信息失败");
+                }
+            });
+        },
+        stopClick(e){
+            // e.stopPropagation()
+        },
+        changeHsopital(){
+            this.form.moduleTypes = []
+        },
+        changeModule(){
+             this.form.moduleTypes = []
+        },
+        addUnit(){
+          const {hospitalId,moduleName,tempName,moduleTypes}=this.form;
+            if(!hospitalId){
+                this.warning("请先选择所属医院")
+                return
+            }
+            if(!moduleName){
+              this.warning("请选择所属模块");
+              return
+            }
+            if(!tempName.trim()){
+              this.warning("请输入模块名称");
+              return
+            }
+            if(!moduleTypes.length){
+              this.warning("请先选择质控类型");
+              return
+            }
+            this.moduleInfoList.push({   
+                        searchName:"",
+                        activeIndex: -1,
+                        searchResult:[
+                        ],
+                        selectFiled:[
+                           
+                        ]
+                    })
+        },
+        searchFiled(index){
+            this.searchIndex = index
+            const searchName = this.moduleInfoList[index].searchName
+            if(!searchName){
+                return
+            }
+            const param = {
+                tagName: searchName,
+                hospitalId: this.form.hospitalId,
+                modeId:  [this.form.moduleName],
+            }
+            api.getQCName(param).then(res =>{
+                if(res.data.code == '0'){
+                     this.moduleInfoList[index].searchResult = []
+                     this.moduleInfoList[index].searchResult.push(...res.data.data)
+                }
+            }).catch(e =>{
+                console.log(e)
+            })
+          
+        },
+        selectSearchFiled(searchItem,index){
+            this.moduleInfoList[index].selectFiled.push(searchItem)
+            this.searchIndex = -1
+            this.moduleInfoList[index].searchName=""
+            this.moduleInfoList[index].searchResult = []
+        },
+        setActiveIndex(index, ii){
+             let activeIndex = this.moduleInfoList[index].activeIndex
+             if( ii === activeIndex) {
+                 this.moduleInfoList[index].activeIndex = -1
+             } else {
+                 this.moduleInfoList[index].activeIndex = ii
+             }
+             
+        },
+        upUnit(index){
+            if(index == 0){
+                return
+            }
+            const current = this.moduleInfoList[index]
+            const currentPre = this.moduleInfoList[index-1]
+            this.moduleInfoList.splice(index-1,2,current,currentPre)
+        },
+        downUnit(index){
+             if(index == this.moduleInfoList.length -1){
+                return
+            }
+            const current = this.moduleInfoList[index]
+            const currentNext = this.moduleInfoList[index+1]
+            this.moduleInfoList.splice(index,2,currentNext,current)
+        },
+        upFiled(index){
+            let activeIndex = this.moduleInfoList[index].activeIndex
+            if(activeIndex == 0 || activeIndex == -1){
+                return
+            }
+            const current = this.moduleInfoList[index].selectFiled[activeIndex]
+            const currentPre = this.moduleInfoList[index].selectFiled[activeIndex-1]
+            this.moduleInfoList[index].selectFiled.splice(activeIndex-1,2,current,currentPre)
+            this.moduleInfoList[index].activeIndex--
+        },
+        downFiled(index){
+             let activeIndex = this.moduleInfoList[index].activeIndex
+            if(activeIndex == this.moduleInfoList[index].selectFiled.length -1 || activeIndex == -1){
+                return
+            }
+            const current = this.moduleInfoList[index].selectFiled[activeIndex]
+            const currentNext = this.moduleInfoList[index].selectFiled[activeIndex+1]
+            this.moduleInfoList[index].selectFiled.splice(activeIndex,2,currentNext,current)
+             this.moduleInfoList[index].activeIndex++
+
+        },
+        delSelected(ii,index){
+            this.moduleInfoList[index].selectFiled.splice(ii,1)
+           
+        },
+        delUnit(index){
+             this.moduleInfoList.splice(index,1)
+        },
+        confirm(form){
+            // this.$refs[form].validate((valid) => {
+            //     if (valid) {
+                    const {tempName,hospitalId,moduleName,moduleTypes,entryId} = this.form;
+                   
+                    let moduleDetail = [], moduleInfoList = this.moduleInfoList;
+                    for(let i = 0; i < moduleInfoList.length; i++){
+                       for(let j = 0; j < moduleInfoList[i].selectFiled.length; j++){
+                            let item ={
+                                groupId: i,
+                                questionId: moduleInfoList[i].selectFiled[j].id
+                            }
+                            moduleDetail.push(item)
+                       }
+                        
+                    }
+                    if(!hospitalId){
+                        this.warning("请选择所属医院");
+                        return
+                    }
+                    if(!moduleName){
+                        this.warning("请选择所属模块");
+                        return
+                    }
+                    if(!tempName){
+                      this.warning("请输入条目名称:");
+                      return
+                    }
+                    if(!moduleTypes.length){
+                        this.warning("请选择质控类型");
+                        return
+                    }
+                   
+                    
+                    // if(moduleDetail.length === 0){
+                    //     this.warning('请添加模块内容')
+                    //     return
+                    // }
+                     let param = {
+                        entryId: entryId,
+                        hospitalId: hospitalId,
+                        // moduleDetail: moduleDetail,
+                        // remark:'',
+                        typeIdList:moduleTypes
+                     };
+                    //  if(this.isEdit){
+                    //      param = Object.assign({}, param, {id: this.id})
+                    //  }
+                    if(this.isEdit){//修改
+                        this.saveDisable = true  //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
+                        api.saveQcEntryType(param).then((res)=>{
+                            if(res.data.code==0){
+                            this.$message({
+                                message:"关联成功",
+                                type:'success'
+                            });
+                            //返回带搜索条件的首页
+                            this.$router.push({
+                                name: 'ItemDataType',
+                                params: Object.assign({}, this.$route.params, {currentPage: 1})
+                            });
+                            }else{
+                            this.$message({
+                                message:res.data.msg,
+                                type:'warning'
+                            });
+                            }
+                            this.saveDisable = false
+                        })
+                    }else{//添加
+                        // this.saveDisable = true;  //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
+                        // api.saveOrUpdateQCTemp(param).then((res)=>{
+                        //     if(res.data.code==0){
+                        //     this.$message({
+                        //         message:"添加成功",
+                        //         type:'success'
+                        //     })
+                        //     this.$router.push({name: 'QualityControlTemp'});
+                        //     }else{
+                        //     this.$message({
+                        //         message:res.data.msg,
+                        //         type:'warning'
+                        //     });
+                        //     }
+                        //     this.saveDisable = false
+                        // })
+                    }
+            //     } else {
+            //         return false;
+            //     }
+            // }); 
+        },
+        warning(msg, type,time) {
+            this.$message({
+                showClose: true,
+                message: msg,
+                type: type || 'warning',
+                duration:time || '3000'
+            })
+        },
+    },
+    components:{
+      ItemDataTypeQcTypePour
+    }
+
+}
+</script>
+<style lang="less" scoped>
+.contentWrapper{
+     padding: 50px 20px 0;
+}
+.content{
+    background: #fff;
+}
+.formItem{
+    /deep/.el-form-item__label{
+        width: 150px;
+    }
+}
+/deep/.el-form-item__content{
+    display: inline-block;
+}
+/deep/.el-input__inner {
+    height: 30px;
+    line-height: 30px;
+    // width: 200px;
+}
+/deep/.widthLarge .el-input__inner {
+    width: 350px;
+}
+/deep/.addCon .el-form-item__label:before {
+    content: '*';
+    color: #f56c6c;
+    margin-right: 4px;
+}
+.formExam{
+    /deep/.el-form-item__content{
+        width: calc(100% - 185px);
+    }
+}
+.exampleTxt{
+        display: inline-block;
+        position: relative;
+        width: 100%;
+        max-height: 200px;
+        padding: 0 20px 0 0;
+        height: 100%;
+        word-break: break-all;
+        overflow-y: auto;
+}
+.moduleInfoItem{
+    width: 500px;
+    min-height: 200px;
+    padding: 0 50px 0 50px;
+    border: 1px solid #dcdfe6;
+    border-radius: 5px;
+    margin-bottom: 20px;
+    position: relative;
+}
+.addUnit{
+    display: inline-block;
+    border: 1px solid #dcdfe6;
+    border-radius: 5px;
+    width: 80px;
+    text-align: center;
+    height: 20px;
+    line-height: 20px;
+    cursor: pointer;
+}
+
+.searchBox{
+    width: 500px;
+    position: relative;
+}
+.searchResultBox{
+    position: absolute;
+    width: 500px;
+    box-sizing: border-box;
+    max-height: 200px;
+    overflow-y: auto;
+    background: #fff;
+    z-index: 2;
+    border: 1px solid #48c5d7;
+}
+.searchItem{
+    height: 40px;
+    line-height: 40px;
+    padding: 0 20px;
+    cursor: pointer;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+}
+.searchItem:hover{
+    background-color: #F5F7FA;
+}
+.selectFiled{
+    position: relative;
+}
+.orderBox{
+    position: absolute;
+    left: -50px;
+    top: 50%;
+    width: 50px;
+    height: 84px;
+    margin-top: -42px;
+}
+.selectFiledBox{
+    position: relative;
+    min-height: 120px;
+}
+.order{
+    display: inline-block;
+    width: 30px;
+    height: 30px;
+    font-size: 30px;
+    margin-left: 5px;
+    border: 1px solid #dcdfe6;
+    cursor: pointer;
+   
+}
+.firstItem{
+    margin-left: 28px;
+}
+.delUnit,.delFiled{
+    position: absolute;
+    top: -8px;
+    right: -6px;
+    cursor: pointer;
+}
+.delFiled{
+    top: -7px;
+    right: -9px;
+}
+.filedName{
+    position: relative;
+    border: 1px solid #dcdfe6;
+    border-radius: 4px;
+    padding: 5px 10px;
+    display: inline-block;
+    line-height: 20px;
+}
+.activeFiledName{
+    border: 1px solid #48C5D7;
+}
+</style>

+ 61 - 0
src/components/qualityControl/QCTipPop.vue

@@ -0,0 +1,61 @@
+<template>
+    <div class="pop" :style="getStyle()">
+        <p class="close"><a href="javascript:void(0);" @click="closePop">×</a></p>
+        <div class="info">
+            <p>模块类型:{{name}}</p>
+            <p>示例:{{example}}</p>
+        </div>
+
+    </div>
+</template>
+
+<script>
+  export default {
+    name: "QCTipPop",
+    props: ['name','example','top','left','show'],
+    data() {
+      return {
+        getStyle(){
+            return {
+                top:(this.top-350)+"px",
+                left:(this.left-330)+"px",
+                display:this.show?"block":"none"
+            }
+        }
+      }
+    },
+    methods:{
+      closePop(){
+        this.$emit("close");
+      }
+    }
+  }
+</script>
+<style lang="less" scoped>
+    .pop{
+        position: absolute;
+        border: 1px solid #c0c4cc;
+        padding: 5px 10px;
+        border-radius: 5px;
+        background: #fff;
+        font-size: 12px;
+        line-height: 22px;
+        z-index: 99;
+        width: 300px;
+        .info{
+            max-height: 270px;
+            word-break: break-all;
+            overflow: auto;
+        }
+        .close{
+            text-align:right;
+            a{
+                display: inline-block;
+                font-size: 18px;
+                color: #909090;
+            }
+
+        }
+
+    }
+</style>

+ 454 - 0
src/components/qualityControl/QCTypePour.vue

@@ -0,0 +1,454 @@
+<template>
+    <div class="qcTypeWrapper commomSymptom clearfix">
+        <QCTipPop :name="curName" :example="curEmp" :show="showPop" :top="popTop" :left="popLeft" @close="closePop"></QCTipPop>
+        <div class="bottomPartLeft">
+            <p style="height: 26px;"> </p>
+          <div class="pool">
+            <ul class="tagList tagPool">
+                <li v-for="(item, index) in leftTagsList"
+                    class = "tagItem"
+                    :key='item.id'
+                    :style="getStyle(item)?styles:null"
+                    @click='selectLeftTag(item, index, $event)'
+                >
+                    <p class="ellipsis" @click="closePop">
+                        <span class="tagName">{{item.name}}</span>
+                        <span :class="activeId==item.id?'tip-icon active':'tip-icon'" @click.stop="showTipPop(item,$event)"></span>
+                    </p>
+                </li>
+            </ul>
+          </div>
+        </div>
+        <div class="bottomPartMid fl">
+            <p><span class="el-icon-arrow-right" @click="toRightList"></span></p>
+            <p><span class="el-icon-arrow-left" @click="toLeftList"></span></p>
+        </div>
+        <div class="bottomPartRight ">
+          <p class="poolTitle">已选模块类型:</p>
+          <ul class="tagList operationPool operationPools">
+                <li class = "tagItem"
+                    v-for="(item) in rightTagsList"
+                    :key='item.id'
+                    :style="getStyle2(item)?styles:null"
+                    @click='selectRightTag(item)'
+                >
+                    <p class="ellipsis" @click="closePop">
+                        <span class="tagName">{{item.name}}</span>
+                        <span :class="activeId==item.id?'tip-icon active':'tip-icon'" @click.stop="showTipPop(item,$event)"></span>
+                    </p>
+                </li>
+            </ul>
+        </div>
+    <!--<div class="buttonBox" :class="(qaType==2)?'rightMore':''">
+        <div class="bottomPartMid bottomPartMidss fl bottomPartMids" >
+            <p><span class="el-icon-arrow-up" @click="toggleTopDownList(1)"></span></p>
+            <p><span class="el-icon-arrow-down" @click="toggleTopDownList(2)"></span></p>
+        </div>
+    </div>-->
+  </div>
+</template>
+<script>
+import api from '@api/qualityControl.js';
+import QCTipPop from './QCTipPop.vue';
+import $ from 'jquery'
+
+export default {
+    name: "QCTypePour",
+    props: ['hospital','moduleName','selectedTag'],
+    data() {
+        return {
+            checkedExc:false,
+            leftTagsList: [],
+            selectLeftTagsList: [],
+            rightTagsList: [],
+            selectRightTagsList: [],
+            showPop:false,
+            activeId:'',
+            curName:"",
+            curEmp:"",
+            popTop:'',
+            popLeft:'',
+            styles:{
+                background:'#eae7e7'
+            },
+        }
+    },
+    mounted() {
+      //编辑
+        if(this.hospital&&this.moduleName){
+          const that = this;
+          setTimeout(function(){            //等watch执行后赋值tags,否则这里先执行,会被watch里清空
+            that.rightTagsList = [...that.selectedTag];
+            that.getModuleTypeList();
+            that.$emit('changeActionData',that.getModuleTypeIds());
+          },100);
+        }
+    },
+    watch: {
+      hospital(){
+            this.rightTagsList=[];
+          this.getModuleTypeList();
+        },
+      moduleName(){
+            this.rightTagsList=[];
+          this.getModuleTypeList();
+        },
+      /*'selectRightTagsList':{
+          handler:function(newVal){
+          },
+          deep:true
+        }*/
+    },
+    methods: {
+        closePop(){
+          this.activeId = '';
+          this.curName = '';
+          this.curEmp = '';
+          this.popTop = 0;
+          this.popLeft=0;
+          this.showPop=false;
+        },
+        showTipPop(item,e){
+          if(this.showPop&&this.activeId===item.id){
+            this.closePop();
+            return;
+          }
+          const t=$(".el-main").scrollTop();
+          this.activeId = item.id;
+          this.curName = item.name;
+          this.curEmp = item.behospitalCodes;
+          this.popTop = t+e.clientY;
+          this.popLeft=e.clientX;
+          this.showPop = true;
+        },
+        handleExclu(){
+            if(!this.selectRightTagsList||this.selectRightTagsList.length==0){
+              this.$message({
+                showClose: true,
+                message: '请先选择要操作的标签',
+                type: 'warning'
+              });
+              return ;
+            }
+            const arr = this.rightTagsList.map((it)=>{
+              if(it.id==this.selectRightTagsList[0].id){
+                if(it.exclusionType===1){
+                  it.exclusionType = 0
+                }else{
+                  it.exclusionType=1;
+                }
+              }else{
+                it.exclusionType=0;
+              }
+              return it;
+            });
+            this.rightTagsList=arr;
+            this.$emit('changeActionData',this.getModuleTypeIds());
+        },
+        transOptions(opt){
+          return opt&&opt.map((it)=>{
+            return Object.assign({},it,{id:it.questionId||it.id});      //模板是questionId,组合是id
+          });
+        },
+        ifReflashTagList(newVal='', preVal=''){
+          if(newVal.trim() == ''){
+            this.searchVal = '';
+            this.rightTagsList=[];
+            this.getModuleTypeList();
+          }else if(newVal.trim() != preVal.trim()){
+            this.searchVal = '';
+            this.rightTagsList=[];
+            this.getModuleTypeList();
+          }
+        },
+        selectLeftTag(tag) {
+            const hasTag = this.isHasTag(tag, this.selectLeftTagsList);
+            if (hasTag) {
+                this.selectLeftTagsList = this.selectLeftTagsList.filter(item => item.id !== tag.id)
+            } else {
+                this.selectLeftTagsList.push(tag);
+            }
+        },
+        selectRightTag(tag) {
+            /*let tmpArr = [];
+            tmpArr.push(tag);
+            if (this.selectRightTagsList.length > 0 && tag.id == this.selectRightTagsList[0].id) {
+              this.selectRightTagsList = this.selectRightTagsList.filter(item => item.id !== tag.id)
+            }else{
+              this.selectRightTagsList = tmpArr;
+            }*/
+          const hasTag = this.isHasTag(tag, this.selectRightTagsList);
+          if (hasTag) {
+            this.selectRightTagsList = this.selectRightTagsList.filter(item => item.id !== tag.id)
+          } else {
+            this.selectRightTagsList.push(tag);
+          }
+        },
+        isHasTag(item, arr) {
+            for ( let i = 0; i <arr.length; i++) {
+                if(arr[i].id === item.id) {
+                    return true;
+                }
+            }
+            return false;
+        },
+        getStyle(item){       //左侧选中状态
+            return this.isHasTag(item, this.selectLeftTagsList)
+        },
+        getStyle2(item) {
+            return this.isHasTag(item, this.selectRightTagsList);
+        },
+        toggleTopDownList(type){
+          if(this.selectRightTagsList.length == 0 || this.rightTagsList.length == 0){
+            return;
+          }
+          const tmpRightSelect = JSON.parse(JSON.stringify(this.selectRightTagsList));
+          const tmpRightLis = JSON.parse(JSON.stringify(this.rightTagsList));
+          const numLen = tmpRightLis.length;
+          const numId = tmpRightSelect[0].id;
+          if(type == 1){
+            for(let i = 0;i < tmpRightLis.length;i++){
+              if(numId === tmpRightLis[i].id){//选中的是第几个
+                if(i == 0){//第一个不能往上移动
+                  return;
+                }else{//先把这个元素和后面的输入框从数组中删除,再添加到数组里
+                  let tmp1 = tmpRightLis[i];
+                  tmpRightLis.splice(i,1);
+                  tmpRightLis.splice(i-1,0,tmp1);
+                  this.rightTagsList = [...tmpRightLis];
+                  this.$emit('changeActionData',this.getModuleTypeIds(), false);
+                  return
+                }
+              }
+            }
+          }else if(type == 2){
+            for(let i = 0;i < tmpRightLis.length;i++){
+              if(numId === tmpRightLis[i].id){
+                if(i == numLen-1){
+                  return;
+                }else{
+                  let tmp1 = tmpRightLis[i];
+                  tmpRightLis.splice(i,1);
+                  tmpRightLis.splice(i+1,0,tmp1);
+                  this.rightTagsList = [...tmpRightLis];
+                  this.$emit('changeActionData',this.getModuleTypeIds(), false);
+                  return;
+                }
+              }
+            }
+          }
+        },
+        toLeftList() {console.log(this.rightTagsList)
+            this.leftTagsList.push(...this.selectRightTagsList);
+            for (let i = 0; i < this.selectRightTagsList.length; i++) {
+                this.rightTagsList = this.rightTagsList.filter(item => item.id !== this.selectRightTagsList[i].id);
+            }
+            for (let i = 0; i < this.selectRightTagsList.length; i++) {
+                for (let j = 0; j < this.rightTagsList.length; j++) {
+                    if(this.selectRightTagsList[i].id === this.rightTagsList[j].id) {
+                        if(this.rightTagsList.length === 1) {
+                            this.rightTagsList = [];
+                        } else {
+                            this.rightTagsList.splice(j, 1);
+                        }
+                    }
+                }
+            }
+            this.selectLeftTagsList = [];
+            this.selectRightTagsList = [];
+            //this.getModuleTypeList();
+            this.$emit('changeActionData',this.getModuleTypeIds(), false);
+        },
+        toRightList() {
+            this.rightTagsList.push(...this.selectLeftTagsList);
+            for (let i = 0; i < this.rightTagsList.length; i++) {
+                this.leftTagsList = this.leftTagsList.filter(item => item.id !== this.rightTagsList[i].id)
+            }
+            this.selectLeftTagsList = [];
+            this.selectRightTagsList = [];
+            //this.getModuleTypeList();
+            this.$emit('changeActionData',this.getModuleTypeIds(), false);
+        },
+        getModuleTypeList() {
+          this.leftTagsList = []
+          if(this.hospital === "" || this.moduleName===""){
+            return
+          }
+          return api.getModuleTypeList({hospitalId: this.hospital, modeId: this.moduleName,notIdList:this.getModuleTypeIds()||[]}).then((res) =>{
+            if(res.data.code==="0"){
+              const data = res.data.data;
+              this.leftTagsList = data;
+              this.selectLeftTagsList = [];
+              this.selectRightTagsList = [];
+            }else{
+              this.leftTagsList=[];
+              this.selectLeftTagsList = [];
+              this.selectRightTagsList = [];
+              this.warning("获取模块类型失败");
+            }
+          })
+        },
+      getModuleTypeIds(){
+          const list=this.rightTagsList;
+          return list.map((it)=>it.id);
+      },
+      warning(msg, type,time) {
+            this.$message({
+                showClose: true,
+                message: msg,
+                type: type || 'warning',
+                duration:time || '3000'
+            })
+        },
+    },
+    components:{
+      QCTipPop
+    }
+}
+</script>
+
+<style lang="less" scoped>
+@import '../../less/common.less';
+.operation-row{
+    text-align: right;
+}
+.exclu{
+    position: absolute;
+    right: -54px;
+    top: 5px;
+}
+.rightMore{
+    margin-left: 48px;
+}
+.commomSymptom {
+  .tagList.operationPools {
+    width: 100%;
+  }
+  div.bottomPartMids {
+    margin-left: 20px;
+  }
+  div.bottomPartMidss {
+    margin-top: 30px;
+  }
+}
+.qcTypeWrapper {
+    padding-left: 60px;
+    margin:-20px 0 20px;
+    position: relative;
+    .bottomPartLeft {
+        width: 40%;
+        box-sizing: border-box;
+        float: left;
+    }
+    .poolTitle {
+        // border-bottom: 1px solid @icssBorder;
+        box-sizing: border-box;
+        margin-bottom: 10px;
+        font-size: 12px;
+    }
+    .pool {
+        // border:1px solid @icssBorder;
+    
+    }
+    .search {
+        width: 100%;
+        border-bottom: 1px solid @icssBorder;
+        box-sizing: border-box;
+        height: 30px;
+    }
+    .tagList {
+        border: 1px solid @icssBorder;
+    }
+    .ellipsis{
+        .tip-icon{
+            display:inline-block;
+            width:16px;
+            height: 16px;
+            vertical-align: middle;
+            background-image:url("../../images/tip.png");
+            background-size:16px;
+            background-repeat:no-repeat;
+            &:hover,&.active{
+                 background-image:url("../../images/tip1.png");
+            }
+        }
+
+    }
+    /*.pop{
+        display: none;
+        position: absolute;
+        top:-30px;
+        right: -10px;
+        padding: 5px 10px;
+        background: #fff;
+        border:1px #ccc solid;
+        border-radius: 3px;
+        line-height: 20px;
+        font-size: 12px;
+        width: 300px;
+        word-break: break-all;
+        z-index: 1;
+    }*/
+    .tagPool {
+        height: 320px;
+        overflow-y: auto;
+
+    }
+    .tagItem {
+        position: relative;
+        line-height: 30px;
+        cursor: pointer;
+        padding: 0 10px;
+        /*z-index:0;*/
+    }
+    .operationPool {
+      position: relative;
+      width: 60%;
+      height: 300px;
+      padding: 10px 0;
+      overflow: auto;
+    }
+    .tagName{
+        margin-right: 10px;
+        font-size: 14px;
+        vertical-align: middle;
+    }
+    .bottomPartMid {
+        width: 8%;
+        margin-top: 60px;
+        p {
+        width: 100%;
+        text-align: center;
+        span {
+            cursor: pointer;
+            display: inline-block;
+            width: 30px;
+            height: 40px;
+            line-height: 40px;
+            margin: 0 auto;
+            border: 1px solid @icssBorder;
+            margin-bottom: 15px;
+            font-size: 18px;
+        }
+        }
+    }
+    .bottomPartRight {
+        float: left;
+        width: 40%;
+    }
+    .buttonBox {
+        width: 10%;
+        float: left;
+        margin-top: 30px;
+    }
+    .inputBox {
+        width: 120px;
+        .el-input {
+            .el-input__inner {
+                height: 30px;
+                background: rgb(234, 231, 231);
+            }
+        }
+    }
+}
+</style>

+ 23 - 5
src/components/qualityControl/QualityControlTemp.vue

@@ -2,6 +2,9 @@
     <div>
         <crumbs title="模板维护">
             <el-form :inline="true" class="demo-form-inline">
+              <el-form-item label="模板Id:">
+                    <el-input size="mini" v-model.trim="filter.moduleId" placeholder="模板Id" clearable></el-input>
+                </el-form-item>
                  <el-form-item label="模板名称:">
                     <el-input size="mini" v-model.trim="filter.modeName" placeholder="模板名称" clearable></el-input>
                 </el-form-item>
@@ -48,12 +51,14 @@
                 <el-table-column
                         :resizable = "false"
                         prop="modeId"
+                        :formatter="moduleFormatter"
                         label="所属模块">
                 </el-table-column>
                 
                 <el-table-column
                         :resizable = "false"
                         prop="hospitalId"
+                        :formatter="hisFormatter"
                         label="所属医院">
                 </el-table-column>
                 <el-table-column
@@ -85,6 +90,7 @@
 <script>
     import api from '@api/qualityControl.js';
   import config from '@api/config.js';
+  import utils from '@api/utils.js'
   export default {
     name: 'QualityControlTemp',
     data: function() {
@@ -95,7 +101,8 @@
         searched: false,
         filter: {
           modeName: '', //模板名称
-          modeId: '',//模板Id
+          moduleId:null, //模板Id
+          modeId: '',//所属模块
           hospitalName: '', //所属医院
         },
         currentPage: 1,
@@ -130,6 +137,14 @@
       })
     },
     methods: {
+      moduleFormatter(row, column, cellValue){
+        const it = this.moduleList.find(item => item.val == cellValue);
+        return it?it.name:'';
+      },
+      hisFormatter(row, column, cellValue){
+        const it = this.hospitalList.find(item => item.val == cellValue);
+        return it?it.name:'';
+      },
       getAllTypes(){
           if(localStorage.getItem("qcModuleTypes")){
               this.hospitalList = JSON.parse(localStorage.getItem("qcHospitalTypes"));
@@ -172,10 +187,10 @@
         api.getQCTemplist(param).then((res) => {
           loading.close()
           let list = res.data.data.records
-          for(let i = 0; i < list.length; i++){
+          /*for(let i = 0; i < list.length; i++){
             list[i].hospitalId = this.hospitalList.find(item => item.val == list[i].hospitalId).name
             list[i].modeId  = this.moduleList.find(item => item.val == list[i].modeId).name
-          }
+          }*/
           this.list = list;
           this.total = res.data.data.total;
           if(this.inCurrentPage!==undefined){
@@ -237,7 +252,9 @@
         this.filter={
           name: "",
           modeId: "",
-          hospitalName: ""
+          hospitalName: "",
+          id:"",
+
         };
       },
       getFilterItems(isTurnPage) {
@@ -245,12 +262,13 @@
         if(isTurnPage&&!this.searched){
           this.clearFilter();
         };
-        const {modeName, modeId, hospitalName} = this.filter
+        const {modeName, modeId, hospitalName,moduleId} = this.filter
         const param = {
           name: modeName,
           current: this.inCurrentPage||this.currentPage,
           size: this.pageSize,
           modeId: modeId,
+          id:moduleId,
           hospitalId: hospitalName
         };
         return param;

+ 401 - 0
src/components/qualityControl/StandardRecord.vue

@@ -0,0 +1,401 @@
+<template>
+    <div class="standardRecordWrapper">
+        <crumbs title="标准病历维护">
+            <el-form :inline="true" class="demo-form-inline" style="max-width: 870px;text-align: right;">
+                <el-form-item label="所属医院:">
+                    <el-select size="mini" v-model="filter.hospitalId" placeholder="所属医院" clearable>
+                        <el-option v-for="item in hisTypes" :label="item.name" :value="item.id" :key="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+              <el-form-item label="病人住院序号:">
+                    <el-input size="mini" v-model.trim="filter.behospitalCode" placeholder="病人住院序号" clearable></el-input>
+                </el-form-item>
+                 <el-form-item label="病人姓名:">
+                    <el-input size="mini" v-model.trim="filter.name" placeholder="病人姓名" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="科室:">
+                     <el-select size="mini" v-model.trim="filter.deptId" @change="getValue"  placeholder="请选择科室" clearable>
+                        <el-option v-for="item in moduleList" :label="item.deptName" :value="Number(item.deptId)" :key="Number(item.deptId)" ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="出院日期:">
+                    <el-date-picker
+                      v-model="filter.date1"
+                      type="date"
+                      placeholder="选择日期">
+                    </el-date-picker>
+                    <span>-</span>
+                    <el-date-picker
+                      v-model="filter.date2"
+                      type="date"
+                      placeholder="选择日期">
+                    </el-date-picker>
+                </el-form-item>
+               
+                <el-form-item>
+                    <el-button size="mini" @click="filterDatas">确认</el-button>
+                    <el-button size="mini" type="warning" @click="addTemp">新增病历</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
+                        :resizable = "false"
+                        label="所属医院"
+                        prop="hospitalName"
+                        >
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="behospitalCode"
+                        label="病人住院序号"
+                        width="180">
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="deptName"
+                        label="科室">
+                </el-table-column>
+                
+                <el-table-column
+                        :resizable = "false"
+                        prop="name"
+                        label="病人姓名">
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="sex"
+                        label="性别">
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="behospitalDate"
+                        :formatter="dateFormatter"
+                        label="入院日期">
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="leaveHospitalDate"
+                        :formatter="dateFormatter"
+                        label="出院日期">
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="gmtModified"
+                        :formatter="dateFormatter"
+                        label="加入时间">
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="operate"
+                        label="操作">
+                    <template slot-scope="scope">
+                        <el-button  @click="modifyStd(scope.row)" type="text" size="small">更新</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <el-button @click="showDelDialog(scope.row)" class="delete" type="text" size="small">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+          <el-pagination  :current-page.sync="currentPage"
+                          @current-change="currentChange"
+                          background
+                          :page-size.sync="pageSize"
+                          :page-sizes="pageSizeArr"
+                           @size-change="handleSizeChange"
+                          :layout="pageLayout"
+                          :total="total">
+            </el-pagination>
+        </div>
+    </div>
+</template>
+
+<script>
+    import api from '@api/qualityControl.js';
+  import config from '@api/config.js';
+  import utils from '@api/utils.js'
+  export default {
+    name: 'StandardRecord',
+    data: function() {
+      return {
+        list: [],
+        hisTypes:[],
+        moduleList:[],
+        searched: false,
+        filter: {
+          hospitalId:'',
+          behospitalCode: '',
+          deptId:'',
+          name: '',
+          date1:"",
+          date2:"",
+        },
+        currentPage: 1,
+        pageSize: config.pageSize,
+        pageSizeArr:config.pageSizeArr,
+        pageLayout:config.pageLayout,
+        total: 0,
+      }
+    },
+    created() {
+      const _this=this;
+      setTimeout(function(){
+        _this.getAllTypes()
+      },100);
+
+    },
+    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: {
+      dateFormatter(item,prop,it){
+        return it.substr(0,10);
+      },
+      getAllTypes(){
+        api.getRecordHopitalList().then((res)=>{
+          if(res.data.code==="0"){
+            const data = res.data.data;
+            this.hisTypes =data;
+          }else{
+            this.warning("获取医院列表失败");
+          }
+        });
+        api.getStdDeptList({}).then((res)=>{
+            if(res.data.code==="0"){
+                const data = res.data.data;
+                this.moduleList=data;
+            }else{
+                this.warning("获取科室列表失败");
+            }
+        });
+        this.getDataList();
+      },
+      handleSizeChange(val){
+        this.pageSize = val;
+        this.currentPage = utils.getCurrentPage(this.currentPage, this.total, this.pageSize);
+        this.getDataList();
+      },
+      getValue(val) {
+        console.log('changeVal', val, this.filter.tagAdscription)
+      },
+      getDataList(isTurnPage) {
+        const param = this.getFilterItems(isTurnPage);
+        const {leaveHosDateStart,leaveHosDateEnd}=param;
+        if(leaveHosDateStart&&leaveHosDateEnd&&leaveHosDateStart>leaveHosDateEnd){
+          this.warning('开始时间不能大于结束时间');
+          return;
+        }
+        this.searched = true;
+        const loading = this.$loading({
+            lock: true,
+            text: 'Loading',
+            spinner: 'el-icon-loading',
+            background: 'rgba(0, 0, 0, 0.7)'
+        });
+        api.getStdList(param).then((res) => {
+          loading.close();
+          if(res.data.code==="0"){
+            let 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;
+            }
+          }else{
+            this.warning(res.data.msg||'操作失败');
+          }
+        })
+      },
+      filterDatas() {
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      addTemp() {
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          pageSize:this.pageSize,
+          filter: this.filter,
+          hisTypes:this.hisTypes
+        } : {currentPage: this.currentPage,pageSize:this.pageSize,hisTypes:this.hisTypes};
+        this.$router.push({
+          name: 'AddStandardRecord',
+          params: pam
+        })
+      },
+      modifyStd(row) {
+        api.updateStdRecord({behospitalCode:row.behospitalCode,hospitalId:row.hospitalId}).then((res)=>{
+          const {code,data,msg} = res.data;
+          if(code=='0'){
+            this.warning(res.data.msg || '更新成功','success');
+            this.getDataList();
+          }else{
+            this.$message({
+              message: msg,
+              type: 'warning'
+            });
+          }
+        });
+        //this.$router.push({name:'AddIndeptLabel',params:{isEdit:true,data:row}});
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        this.getDataList(true);
+        // if (this.cacheData[next]) {       //如果已请求过该页数据,则使用缓存不重复请求
+        //     this.list = this.cacheData[next];
+        // } else {
+        //     this.getDataList();
+        // }
+      },
+      clearFilter(){
+        this.filter={
+          hospitalId:'',
+          behospitalCode: '',
+          deptId:'',
+          name: '',
+          date1:"",
+          date2:"",
+        };
+      },
+      getFilterItems(isTurnPage) {
+        //翻页时筛选条件没点确定则清空
+        if(isTurnPage&&!this.searched){
+          this.clearFilter();
+        };
+        const {hospitalId,behospitalCode, deptId, name,date1,date2} = this.filter;
+        let beCode=behospitalCode;
+        var patrn = /[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘',。、]/g;
+        beCode=behospitalCode.replace(patrn,function(x){
+          return "\\"+x;
+        });
+        const {tranformDate} = utils;
+        const param = {
+          current: this.inCurrentPage||this.currentPage,
+          size: this.pageSize,
+          hospitalId,
+          deptId,
+          name,
+          behospitalCode:beCode,
+          leaveHosDateEnd:tranformDate(date2,' 23:59:59'),
+          leaveHosDateStart: tranformDate(date1," 00:00:00")
+        };
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      getTagType(val) {
+        return val
+      },
+      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(() => {});
+      },
+      showDelDialog(row){
+        const param = {
+          "behospitalCode": row.behospitalCode,
+          "hospitalId":row.hospitalId
+        }
+        this.showConfirmDialog('是否删除该病历?',()=>{
+          api.delStdRecord(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";
+  .standardRecordWrapper{
+    .el-date-editor.el-input{
+      width: 130px;
+      input{
+        padding: 0 5px;
+        width: 130px;
+        height: 25px;
+      }
+    }
+  }
+  .delete{
+      color: red
+  }
+  .delete:hover {
+      color: red;
+  }
+  .el-select .el-input .el-icon-arrow-up{
+      display: inline-block!important;
+  }
+  .el-select .el-input .el-icon-circle-close{
+      float:left;
+  }
+  .el-pagination__sizes{
+      margin-right: 20px;
+    .el-input .el-input__inner{
+        height: 28px;
+        line-height: 28px;
+    }
+  }
+  .standardRecordWrapper .container{
+      height: 90px!important;
+  }
+  .standardRecordWrapper>.contents{
+      padding:120px 20px 0;
+  }
+  .standardRecordWrapper .el-form-item{
+      margin-bottom: 0;
+  }
+  .standardRecordWrapper .el-input__suffix{
+      right: 22px;
+  }
+</style>

+ 335 - 0
src/components/qualityControl/TaskDetail.vue

@@ -0,0 +1,335 @@
+<template>
+    <div>
+        <crumbs title="详情" :param="$route.params" linkTo="AutoTestTask">
+            <el-form :inline="true" class="demo-form-inline" style="max-width: 870px;text-align: right;">
+                <el-form-item label="所属医院:">
+                    <el-select size="mini" v-model="filter.hospitalId" placeholder="所属医院" clearable>
+                        <el-option v-for="item in hisTypes" :label="item.name" :value="item.id" :key="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="所属模块:">
+                    <el-select size="mini" v-model="filter.casesId" placeholder="所属模块" clearable>
+                        <el-option v-for="item in fieldTypes" :label="item.name" :value="item.id" :key="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="缺陷名称:">
+                    <el-input size="mini" v-model="filter.entryName" placeholder="缺陷名称"></el-input>
+                </el-form-item>
+                <el-form-item label="条目编码:">
+                    <el-input size="mini" v-model="filter.entryCode" placeholder="条目编码"></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 statusTypes" :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-form-item>
+            </el-form>
+        </crumbs>
+        <div class="contents">
+            <el-table :data="list"
+                      border
+                      v-loading="loading"
+                      element-loading-text="拼命加载中"
+                      element-loading-spinner="el-icon-loading"
+                      element-loading-background="rgba(0, 0, 0, 0.6)"
+                      style="width: 100%">
+                <el-table-column
+                        type="index"
+                        :index="indexMethod"
+                        label="编号"
+                        width="60">
+                </el-table-column>
+                <el-table-column
+                        prop="gmtModified"
+                        label="所属医院"
+                        width="110"
+                        :formatter="hisFormatter"
+                        :show-overflow-tooltip="true">
+                </el-table-column>
+                <el-table-column
+                        prop="casesName"
+                        width="110"
+                        label="所属模块">
+                </el-table-column>
+                <el-table-column
+                        prop="entryName"
+                        label="缺陷名称">
+                </el-table-column>
+                <el-table-column
+                        prop="entryCode"
+                        width="120"
+                        label="条目编码">
+                </el-table-column>
+                <el-table-column
+                        prop="amount"
+                        width="80"
+                        label="差异数量">
+                </el-table-column>
+                <el-table-column
+                        width="145"
+                        prop="behospitalCodeStr"
+                        label="病人住院序号">
+                </el-table-column>
+                <el-table-column
+                        prop="status"
+                        width="80"
+                        :formatter="statusFormatter"
+                        label="状态">
+                </el-table-column>
+                <el-table-column
+                        prop="remark"
+                        width="60"
+                        label="备注">
+                </el-table-column>
+                <el-table-column
+                        label="操作" width="100">
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="showEditDialog(scope.row)">修改</el-button>
+                        <span style="margin:0 3px;">|</span>
+                        <!--<el-button type="text" size="small" @click="toEditField(scope.row, 'copy')">复制</el-button>
+                        <span style="margin:0 3px;">|</span>-->
+                        <el-button type="text" size="small" class="delete" @click="showDelDialog(scope.row.id)">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination v-if="total>pageSize"
+                           :current-page.sync="currentPage"
+                           @current-change="currentChange"
+                           background
+                           :page-size="pageSize"
+                           layout="total,prev, pager, next, jumper"
+                           :total="total">
+            </el-pagination>
+        </div>
+        <el-dialog title="修改" :visible.sync="dialogVisible" class="autotest-dialog">
+            <el-form>
+                <el-form-item label="状态:" label-width="80">
+                    <el-select size="mini" v-model="status" placeholder="状态">
+                        <el-option v-for="item in editStatus" :label="item.name" :value="item.id" :key="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="备注:" label-width="80">
+                    <el-input type="textarea"
+                              v-model="remark"
+                              placeholder="请输入备注"
+                              :rows="3"
+                              autocomplete="off"></el-input>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="editTaskDetail">确 定</el-button>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+  import api from '@api/qualityControl.js';
+  import { Loading } from 'element-ui';
+
+  export default {
+    name: 'AutoTestList',
+    data: function () {
+      return {
+        list: [],
+        tagType:[1],
+        currentPage: 1,
+        pageSize: 10,
+        total: 0,
+        loading: false,
+        fieldTypes:[],
+        searched:false,
+        hisTypes:[],
+        statusTypes:[
+          {id:null,name:'全部'},
+          {id:0,name:'未处理'},
+          {id:1,name:'已处理'},
+          ],
+        editStatus:[
+          {id:0,name:'未处理'},
+          {id:1,name:'已处理'},
+        ],
+        taskName:"",
+        dialogVisible:false,
+        editId:'',
+        remark:'',
+        status:'',
+        filter: {
+          hospitalId:'',
+          entryName:'',
+          entryCode: '',
+          casesId:'',
+        }
+      }
+    },
+    created() {
+      const _this=this;
+      setTimeout(function() {
+        _this.getAllTypes()
+      },100);
+    },
+    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: {
+      getAllTypes(){
+        api.getRecordHopitalList().then((res)=>{
+          if(res.data.code==="0"){
+            const data = res.data.data;
+            this.hisTypes =data;
+            this.getDataList();
+          }else{
+            this.warning("获取医院信息失败");
+          }
+        });
+        api.getRecordCases().then((res)=>{
+          if(res.data.code==="0"){
+            const data = res.data.data;
+            this.fieldTypes =data;
+          }else{
+            this.warning("获取模块信息失败");
+          }
+        });
+      },
+      statusFormatter(it){
+        return +it.status===0?"未处理":"已处理";
+      },
+      hisFormatter(item){
+        const field = this.hisTypes.filter((it)=>it.id==item.hospitalId);
+        return field[0]?field[0].name:'';
+      },
+      showEditDialog(row){
+        this.dialogVisible = true;console.log(row)
+        this.editId = row.id;
+        this.remark=row.remark;
+        this.status = row.status;
+      },
+      editTaskDetail(){
+        const param = {
+          id:this.editId,
+          remark:this.remark,
+          status:this.status,
+        };
+        api.editTaskDetail(param).then((res) => {
+          if (res.data.code == '0') {
+            this.dialogVisible = false;
+              this.warning(res.data.msg||'修改成功','success');
+            this.getDataList();
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      toTaskList(){
+        const pam = this.searched ? {
+          currentPage: this.currentPage,
+          filter: this.filter
+        } : {currentPage: this.currentPage};
+        this.$router.push({name: 'AutoTestTask', params: pam});
+      },
+      filterDatas(){
+        this.currentPage = 1;
+        this.getDataList();
+      },
+      getDataList() {
+        const param = this.getFilterItems();
+        this.searched = true;
+        api.getTaskDetailList(param).then((res) => {
+          if (res.data.code == '0') {
+            const data = res.data.data;
+            this.list = data.records;
+            this.total = data.total;
+          }
+        }).catch((error) => {
+          console.log(error);
+        });
+      },
+      getFilterItems() {
+        const param = Object.assign({
+          current: this.currentPage,
+          size: this.pageSize,
+          missionId:this.$route.params.id,
+        },this.filter);
+        return param;
+      },
+      indexMethod(index) {
+        return ((this.currentPage - 1) * this.pageSize) + index + 1;
+      },
+      currentChange(next) {
+        this.currentPage = next;
+        this.getDataList();
+      },
+      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(id){
+        this.showConfirmDialog('是否删除该缺陷?',()=>{
+          api.delTaskDetail({id:id}).then((res)=>{
+            if(res.data.code=='0'){
+              this.warning(res.data.msg||'操作成功','success');
+              this.getDataList();
+            }else{
+              this.warning(res.data.msg);
+            }
+          }).catch((error)=>{
+            this.warning(error);
+          })
+        });
+      }
+    }
+  }
+</script>
+<style>
+   .el-loading-spinner{
+        top:200px;
+    }
+    .autotest-dialog .el-dialog__body{
+        padding: 30px 20px;
+    }
+   .autotest-dialog .el-form-item__content{
+       display: inline-block;
+       width: 272px;
+    }
+    .autotest-dialog .el-dialog{
+        width: 400px!important;
+    }
+</style>
+<style lang="less" scoped>
+    @import "../../less/admin.less";
+    .delete{
+        color: red !important;
+    }
+    div.container{
+        height: 90px!important;
+    }
+    .contents{
+        padding:120px 20px 0;
+    }
+</style>

+ 73 - 9
src/components/recordInput/AddRecordItem.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="addRecordItemWrapper">
-        <crumbs :title="title" :param="$route.params" linkTo="RecordItemList"></crumbs>
+        <crumbs :title="title" :param="$route.params"  minWidth="1120px" linkTo="RecordItemList"></crumbs>
         <div class="contents">
             <div class="content">
                 <el-form :rules="rules" ref="form" :label-position="labelPosition" label-width="125px" class="add-record-form" :model="form">
@@ -38,6 +38,42 @@
                             </el-option>
                         </el-select>
                     </el-form-item>
+                    <el-form-item label="条目类型:" prop="ruleType">
+                        <el-select v-model="form.ruleType"
+                                   placeholder="请选择条目类型"
+                        >
+                            <el-option
+                                    v-for="item in ruleTypeList"
+                                    :key="item.val"
+                                    :label="item.name"
+                                    :value="Number(item.val)">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="开发状态:" prop="ruleType">
+                        <el-select v-model="form.devType"
+                                   placeholder="请选择开发状态"
+                        >
+                            <el-option
+                                    v-for="item in devTypeList"
+                                    :key="item.val"
+                                    :label="item.name"
+                                    :value="Number(item.val)">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="准确率:" prop="ruleType">
+                        <el-select v-model="form.accuracyType"
+                                   placeholder="请选择准确率"
+                        >
+                            <el-option
+                                    v-for="item in accuracyTypeList"
+                                    :key="item.val"
+                                    :label="item.name"
+                                    :value="Number(item.val)">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
                     <el-form-item label="备注:" prop="remark">
                          <el-input v-model="form.remark" maxlength="200" placeholder="请输入备注"></el-input>
                     </el-form-item>
@@ -89,6 +125,15 @@
                                    <el-checkbox v-model="scope.row.isUsed" :checked="scope.row.isUsed=='1'" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0"></el-checkbox>
                                 </template>
                             </el-table-column>
+                            <el-table-column
+                              prop="address"
+                              label="单项否决"
+                              width="120"
+                              show-overflow-tooltip>
+                               <template slot-scope="scope">
+                                   <el-checkbox v-model="scope.row.isReject" :checked="scope.row.isReject=='1'" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0"></el-checkbox>
+                                </template>
+                            </el-table-column>
                           </el-table>
                       </div>
                          
@@ -117,13 +162,19 @@
         ],*/
         modifier:'',
         hospitalList:[],
+        ruleTypeList:[],
+        devTypeList:[],
+        accuracyTypeList:[],
         caseLIst:[],
         hospitalModuleList:[], //医院数据模块列表
-        title:'病历条目-新增',
+        title:'质控条目-新增',
         form:{
           itemName:'',
           casesId:'',
           itemCode:'',
+          ruleType:0,
+          devType:0,
+          accuracyType:3,
           remark:'',
           levelNo:'',
           precond:'',
@@ -145,15 +196,22 @@
       }
     },
     created(){
-      let {isEdit, data} = this.$route.params;
+      let {isEdit, data,ruleTypeList,devTypeList,accuracyTypeList} = this.$route.params;
       const userLoginDTO = JSON.parse(localStorage.getItem('userLoginDTO'))
       this.modifier = userLoginDTO && userLoginDTO.linkman
-     
+      this.ruleTypeList=ruleTypeList;
+      this.devTypeList=devTypeList;
+      this.accuracyTypeList=accuracyTypeList;
+      this.devTypeList.shift();
+      this.accuracyTypeList.shift();
       if(isEdit){
-        this.title = '病历条目-修改'
+        this.title = '质控条目-修改'
         this.isEdit = isEdit
         this.id = data.id
         this.form.itemName = data.name
+        this.form.ruleType = data.ruleType
+         this.form.devType = data.devType
+          this.form.accuracyType = data.accuracyType
         this.form.itemCode = data.code
         this.form.casesId = data.casesId
         this.form.remark = data.remark
@@ -205,7 +263,8 @@
                 hospitalName:  this.hospitalList[i].name,
                 value: '',
                 tipMsg:'',
-                isUsed: '0'
+                isUsed: '0',
+                isReject:'0'
               })
             }
             for(let i = 0; i < this.selectHospital.length; i++){
@@ -215,6 +274,7 @@
                   item.value = selectItem.score
                   item.tipMsg = selectItem.msg
                   item.isUsed = selectItem.isUsed
+                  item.isReject = selectItem.isReject
                   this.multipleSelection.push(item)
               }
             
@@ -269,7 +329,7 @@
             return
           }
           this.canSave = false
-          const {itemName,casesId,itemCode,remark,levelNo,precond,hospitalModuleId} = this.form
+          const {itemName,casesId,itemCode,remark,levelNo,precond,hospitalModuleId,ruleType,devType,accuracyType} = this.form
           if(!itemName){
             this.$message({
               message:"请输入条目名称",
@@ -326,13 +386,17 @@
               modifier:this.modifier,
               hospitalId: item.hospitalId,
               msg: item.tipMsg,
-              isUsed: item.isUsed
+              isUsed: item.isUsed,
+              isReject: item.isReject,
             })
           }
            let params = {
             id:this.id,
             name:itemName,
             modeId: hospitalModuleId,
+            ruleType:ruleType,
+            devType:devType,
+            accuracyType:accuracyType,
             remark: remark,
             code: itemCode,
             precond:precond,
@@ -426,7 +490,7 @@
             background: #fff;
             padding: 20px 20px 50px;
             color: #545455;
-            min-width: 980px;
+            min-width: 1100px;
             position: relative;
             .short-inp{
                 width: 200px;

+ 81 - 25
src/components/recordInput/ManageItemBatch.vue

@@ -113,6 +113,16 @@
                                         <!-- <el-checkbox v-model="scope.row.isUsed" :value ="scope.row.isUsed" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0">{{scope.row.isUsed}}</el-checkbox> -->
                                       </template>
                                   </el-table-column>
+                                  <el-table-column
+                                    prop="address"
+                                    label="单项否决"
+                                    width="120"
+                                    show-overflow-tooltip>
+                                    <template slot-scope="scope">
+                                        <span class="checkUsed" :class="{'active': scope.row.isReject == 1,'disabled': getDisabled(scope.row,item.remark)}" @click="checkReject(scope.row,index,scope.$index,item.remark)"></span>
+                                        <!-- <el-checkbox v-model="scope.row.isUsed" :value ="scope.row.isUsed" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0">{{scope.row.isUsed}}</el-checkbox> -->
+                                      </template>
+                                  </el-table-column>
                                   </el-table>
                                 </el-collapse-item>
                               </el-collapse>
@@ -128,8 +138,7 @@
 </template>
 <script type="text/javascript">
  import api from '@api/records.js';
- import config from '@api/config.js';
-  import utils from '@api/utils.js';
+ import $ from 'jquery';
 
   export default {
     name:'ManageItemBatch',
@@ -146,7 +155,7 @@
         sexType:[],
         bloodType:[],
         rhType:[],
-        title:'病历条目-批量管理',
+        title:'质控条目-批量管理',
         hospitalId:'',
         tableData:[],
         checkAllMap:{
@@ -154,7 +163,7 @@
         },
         multipleSelection: [],
         id:null,
-        activeLeftNames: ['1'],
+        activeLeftNames: [],
         modifier:''
       }
     },
@@ -217,6 +226,21 @@
         const values = Object.values(this.checkAllMap)
         this.toggleSelection(values)
       },
+      checkReject(row,index,ii,remark){
+        if(this.getDisabled(row,remark)){
+          return
+        }
+        let isReject = this.caseLIst[index].qcCasesEntry[ii].isReject
+        const caseLIstCopy = JSON.parse(JSON.stringify(this.caseLIst))
+        if(isReject == 1){
+          caseLIstCopy[index].qcCasesEntry[ii].isReject = 0
+        }else{
+          caseLIstCopy[index].qcCasesEntry[ii].isReject = 1
+        }
+        this.caseLIst = caseLIstCopy
+        const values = Object.values(this.checkAllMap)
+        this.toggleSelection(values)
+      },
       handleSelectionChange(val,remark) {
         this.checkAllMap[remark] = val;
       },
@@ -249,6 +273,7 @@
             for(let i = 0; i < caseLIstCopy.length; i++){
               for(let j = 0; j < caseLIstCopy[i].qcCasesEntry.length; j++){
                 caseLIstCopy[i].qcCasesEntry[j].isUsed = 0
+                caseLIstCopy[i].qcCasesEntry[j].isReject = 0
               }
             }
 
@@ -310,6 +335,7 @@
                 recordItem.score = checkedItem.score
                 recordItem.msg = checkedItem.msg
                 recordItem.isUsed = checkedItem.isUsed
+                 recordItem.isReject = checkedItem.isReject
                 recordItem.modeName = checkedItem.modeName
                 this.checkAllMap[caseItem.remark].push(recordItem)
               }
@@ -340,27 +366,22 @@
                     showClose: true
                   });
         }
-        const values = Object.values(this.checkAllMap)
-        let casesEntryHospitals = []
+        const values = Object.values(this.checkAllMap);
+        let casesEntryHospitals = [],requiredValNull=[],valueTypeWr=[],tempItemIdx={};
+        $(".el-collapse .wrong").removeClass("wrong");
         for(let i = 0; i < values.length; i++){
           for(let j = 0; j < values[i].length;j++){
-            const value = values[i][j]
-            if(!value.msg||value.score==""){
-              this.$message({
-                message:'勾选项扣分值和提示信息不能为空',
-                type:'warning',
-                showClose: true
-              });
-              return
+            const value = values[i][j];
+            if(!valueTypeWr.length&&(!value.msg||value.score==="")){
+              tempItemIdx=this.caseLIst[i].qcCasesEntry.findIndex(item =>item.id === value.id);
+              requiredValNull.push(value.casesId);
+              $(".el-collapse .el-collapse-item:eq("+i+") table tr:eq("+(+tempItemIdx+1)+")").addClass("wrong");
             }
             var reg = new RegExp(/^\d+(\.\d)?$/);
-            if(!reg.test(value.score) || value.score >100){
-               this.$message({
-                message:'扣分值请输入≥0且≤100的数字,最多保留小数点后1位',
-                type:'warning',
-                showClose: true
-              });
-              return
+            if(!requiredValNull.length&&(!reg.test(value.score) || value.score >100)){
+              tempItemIdx=this.caseLIst[i].qcCasesEntry.findIndex(item =>item.id === value.id);
+              $(".el-collapse .el-collapse-item:eq("+i+") table tr:eq("+(+tempItemIdx+1)+")").addClass("wrong");
+              valueTypeWr.push(value.casesId);
             }
             let item = {
               "casesEntryId": value.id,
@@ -370,11 +391,31 @@
               "msg": value.msg||"",
               "remark": value.remark,
               "score": Number(value.score),
-              "isUsed":value.isUsed||0
+              "isUsed":value.isUsed||0,
+              "isReject":value.isReject||0
             }
             casesEntryHospitals.push(item)
           }
         }
+        if(requiredValNull.length>0){
+          this.$message({
+            message:'勾选项扣分值和提示信息不能为空',
+            type:'warning',
+            showClose: true
+          });
+          this.activeLeftNames = requiredValNull;
+          $(".el-main").scrollTop(160);
+          return
+        }else if(valueTypeWr.length>0){
+          this.$message({
+            message:'扣分值请输入≥0且≤100的数字,最多保留小数点后1位',
+            type:'warning',
+            showClose: true
+          });
+          this.activeLeftNames = valueTypeWr;
+          $(".el-main").scrollTop(160);
+          return
+        }
         let param = {
           "casesEntryHospitals": casesEntryHospitals,
           "hospitalIds": [
@@ -477,7 +518,7 @@
         background: #fff;
         padding: 20px 20px 50px;
         color: #545455;
-        min-width: 1200px;
+        min-width: 1300px;
         position: relative;
         .short-inp{
             width: 200px;
@@ -517,7 +558,17 @@
           -webkit-transition: border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);
           transition: border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);
         }
-       
+        .wrong td{
+            border:1px #ff0000 solid;
+            border-right:none;
+            border-left:none;
+            &:last-child{
+                 border-right:1px #ff0000 solid;
+             }
+            &:first-child{
+                 border-left:1px #ff0000 solid;
+             }
+        }
         .active::after{
             -webkit-box-sizing: content-box;
             box-sizing: content-box;
@@ -613,6 +664,11 @@
             }
       }
     }
-    
+    .el-collapse-item__content{
+        padding-bottom: 0;
+    }
+    .el-table::before{
+        content: unset;
+    }
 
 </style>

+ 152 - 12
src/components/recordInput/RecordItemList.vue

@@ -1,16 +1,64 @@
 <template>
-    <div>
-        <crumbs title="病历条目" style="min-width: 980px" class="recordItemTitle">
+    <div class="recordItemWrapper">
+        <crumbs title="质控条目" style="min-width: 980px;height:80px" class="recordItemTitle">
             <el-form :inline="true" class="demo-form-inline">
                 <el-form-item label="条目名称:">
                    <el-input size="mini" v-model.trim="filter.itemName" placeholder="条目名称" clearable></el-input>
                </el-form-item>
+                <el-form-item label="条目类型:">
+                    <!-- <el-input size="mini" v-model.trim="filter.module" placeholder="所属模块" clearable></el-input> -->
+                    <el-select v-model="filter.ruleType"
+                               clearable
+                               filterable
+                               placeholder="请选择条目类型"
+                               size="mini"
+                               class="long-item">
+                        <el-option
+                                v-for="item in ruleTypeList"
+                                :key="item.val"
+                                :label="item.name"
+                                :value="item.val">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="开发状态:">
+                    <!-- <el-input size="mini" v-model.trim="filter.module" placeholder="所属模块" clearable></el-input> -->
+                    <el-select v-model="filter.devType"
+                               clearable
+                               filterable
+                               placeholder="请选择开发状态"
+                               size="mini"
+                               class="long-item">
+                        <el-option
+                                v-for="item in devTypeList"
+                                :key="item.val"
+                                :label="item.name"
+                                :value="item.val">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="准确率:">
+                    <!-- <el-input size="mini" v-model.trim="filter.module" placeholder="所属模块" clearable></el-input> -->
+                    <el-select v-model="filter.accuracyType"
+                               clearable
+                               filterable
+                               placeholder="请选择准确率"
+                               size="mini"
+                               class="long-item">
+                        <el-option
+                                v-for="item in accuracyTypeList"
+                                :key="item.val"
+                                :label="item.name"
+                                :value="item.val">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
                 <el-form-item label="所属模块:">
                    <!-- <el-input size="mini" v-model.trim="filter.module" placeholder="所属模块" clearable></el-input> -->
-                   <el-select v-model="filter.module"  
-                      clearable 
-                      filterable 
-                      placeholder="请选择模块" 
+                   <el-select v-model="filter.module"
+                      clearable
+                      filterable
+                      placeholder="请选择模块"
                       size="mini">
                     <el-option
                       v-for="item in caseLIst"
@@ -23,7 +71,10 @@
                <!-- <el-form-item label="层级定义:">
                    <el-input size="mini" v-model.trim="filter.level" placeholder="层级定义" clearable></el-input>
                </el-form-item> -->
-               <el-form-item label="条目编码:">
+               
+            </el-form>
+            <el-form :inline="true" class="demo-form-inline demo-form-inline-second">
+              <el-form-item :inline="true"  label="条目编码:">
                    <el-input size="mini" v-model.trim="filter.itemCode" placeholder="条目编码" clearable></el-input>
                </el-form-item>
                <el-form-item>
@@ -50,6 +101,27 @@
                         label="条目名称"
                 >
                 </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="ruleType"
+                        label="条目类型"
+                        :formatter="typeFormatter"
+                >
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="devType"
+                        label="开发状态"
+                        :formatter="devTypeFormatter"
+                >
+                </el-table-column>
+                <el-table-column
+                        :resizable = "false"
+                        prop="accuracyType"
+                        label="准确率"
+                        :formatter="accuracyTypeFormatter"
+                >
+                </el-table-column>
                 <el-table-column
                         :resizable = "false"
                         prop="casesName"
@@ -114,11 +186,17 @@
         list: [],
         searched: false,
         caseLIst:[],
+        ruleTypeList:[],
+        devTypeList:[],
+        accuracyTypeList:[],
         filter:{
           itemName:'',
+          ruleType:'',
           module:'',
           level:'',
-          itemCode:''
+          itemCode:'',
+          devType:'',
+          accuracyType:''
         },
         currentPage: 1,
         pageSize: config.pageSize,
@@ -129,6 +207,7 @@
     },
     created() {
       const that = this;
+      this.getRuleTypeModule();
       //返回时避免参数未赋值就获取列表
       setTimeout(function(){
         that.getDataList();
@@ -151,18 +230,36 @@
       })
     },
     methods: {
+      typeFormatter(row, column, cellValue){
+        const li = this.ruleTypeList.filter((it)=>it.val===""+cellValue);
+        return li[0]?li[0].name:"";
+      },
+      devTypeFormatter(row, column, cellValue){
+        const li = this.devTypeList.filter((it)=>it.val===""+cellValue);
+        return li[0]?li[0].name:"";
+      },
+      accuracyTypeFormatter(row, column, cellValue){
+        const li = this.accuracyTypeList.filter((it)=>it.val===""+cellValue);
+        return li[0]?li[0].name:"";
+      },
      handleSizeChange(val){
         this.pageSize = val;
         this.currentPage = utils.getCurrentPage(this.currentPage, this.total, this.pageSize);
         this.getDataList();
       },
       indexMethod(index) {
-            return   index + 1;
-        },
+          return   index + 1;
+      },
       AddRecordItem(){
          const pam = this.searched?{currentPage:this.currentPage,
           pageSize:this.pageSize,
+          ruleTypeList:this.ruleTypeList,
+          devTypeList:this.devTypeList,
+          accuracyTypeList:this.accuracyTypeList,
           filter:this.filter}:{currentPage:this.currentPage,
+           ruleTypeList:this.ruleTypeList,
+            devTypeList:this.devTypeList,
+          accuracyTypeList:this.accuracyTypeList,
           pageSize:this.pageSize};
         this.$router.push({
           name:'AddRecordItem',
@@ -193,6 +290,24 @@
           }
         })
       },
+      getRuleTypeModule(){
+        return api.getRuleTypes({}).then((res)=>{
+          const result = res.data;
+          if(result.code==0){
+            this.ruleTypeList = result.data[14];
+            this.devTypeList = res.data.data&&res.data.data["15"]
+            this.accuracyTypeList = res.data.data&&res.data.data["16"]
+            this.devTypeList.unshift({name:"全部", val:""})
+            this.accuracyTypeList.unshift({name:"全部", val:""})
+          }else{
+            this.$message({
+              message:result.msg,
+              type:'warning',
+              showClose: true
+            });
+          }
+        })
+      },
       getDataList(isTurnPage) {
         const param = this.getFilterItems(isTurnPage);
         this.searched = true;
@@ -232,9 +347,15 @@
           const pam = this.searched ? {
             currentPage: this.currentPage,
             pageSize:this.pageSize,
+            ruleTypeList:this.ruleTypeList,
+            devTypeList:this.devTypeList,
+            accuracyTypeList:this.accuracyTypeList,
             filter: this.filter,
           } : {
             currentPage: this.currentPage,
+            ruleTypeList:this.ruleTypeList,
+            devTypeList:this.devTypeList,
+            accuracyTypeList:this.accuracyTypeList,
             pageSize:this.pageSize};
           this.$router.push({
             name:'AddRecordItem',
@@ -255,11 +376,14 @@
         };
         const param = {
           casesId:this.filter.module,
+          ruleType:this.filter.ruleType,
           code: this.filter.itemCode.trim(),
           levelNo:this.filter.level.trim(),
           name: this.filter.itemName.trim(),
           current: this.inCurrentPage||this.currentPage,
           size: this.pageSize,
+          devType:this.filter.devType,
+          accuracyType:this.filter.accuracyType,
        
         };
         return param;
@@ -283,7 +407,7 @@
         const param = {
          id: row.id 
         };
-        const txt ='是否删除该病历条目?';
+        const txt ='是否删除该质控条目?';
         this.showConfirmDialog(txt,()=>{
           api.delRecordItem(param).then((res)=>{
             if(res.data.code=='0'){
@@ -304,7 +428,23 @@
 
 <style lang="less">
     @import "../../less/admin.less";
-    
+    .recordItemWrapper .contents{
+      padding: 104px 20px 0;
+    }
+    .recordItemTitle .contents{
+          padding:  0;
+    }
+    .recordItemTitle .contents{
+      form{
+        height: 40px;
+      }
+    }
+     .recordItemTitle .demo-form-inline-second{
+       float: right;
+     }
+    .demo-form-inline .long-item .el-input--mini .el-input__inner{
+        width: 124px;
+    }
     .delete{
         color: red;
     }

binární
src/images/tip.png


binární
src/images/tip1.png


+ 20 - 1
src/routes.js

@@ -131,6 +131,17 @@ import QualityControlTemp from '@components/qualityControl/QualityControlTemp.vu
 import AddQualityControlTemp from '@components/qualityControl/AddQualityControlTemp.vue';
 import QCTypeMang from '@components/qualityControl/QCTypeMang.vue';
 import AddQcType from '@components/qualityControl/AddQcType.vue';
+import StandardRecord from '@components/qualityControl/StandardRecord.vue';
+import AddStandardRecord from '@components/qualityControl/AddStandardRecord.vue';
+import ItemDataType from '@components/qualityControl/ItemDataType.vue';
+import AutoTestList from '@components/qualityControl/AutoTestList.vue';
+import AutoTestTask from '@components/qualityControl/AutoTestTask.vue';
+import TaskDetail from '@components/qualityControl/TaskDetail';
+import ItemDataTypeRelation from '@components/qualityControl/ItemDataTypeRelation.vue';
+
+
+
+
 //病历录入
 import RecordInput from '@components/recordInput/RecordList.vue';
 import AddRecordInput from '@components/recordInput/AddRecord.vue';
@@ -324,14 +335,22 @@ export default [
       {path:'LT-ZKYMSJWH-ZHDYWH',name:'CombineFeild',component: CombineFeild},  //组合字段
       {path:'LT-ZKYMSJWH-TJZHDYWH',name:'AddCombineFeild',component: AddCombineFeild},  //添加组合字段
       {path:'LT-ZKYMSJWH-MBWH',name:'QualityControlTemp',component: QualityControlTemp},  //模板维护
+      {path:'LT-ZKYMSJWH-TMGLZKLX',name:'ItemDataType',component: ItemDataType},  //条目关联质控类型
+      {path:'LT-ZKYMSJWH-TMGLZKLXGL',name:'ItemDataTypeRelation',component: ItemDataTypeRelation},  //条目关联质控类型--关联
+
       {path:'LT-ZKYMSJWH-TJMBWH',name:'AddQualityControlTemp',component: AddQualityControlTemp},  //添加模板维护
       {path: 'LT-BLZK-BLRl',name:'RecordInput', component: RecordInput},//病例录入
       {path: 'LT-BLZK-TJBLRl',name:'AddRecordInput', component: AddRecordInput},//病例录入
-      {path: 'LT-BLZK-BLTM',name:'RecordItemList', component: RecordItemList},//病例条目
+      {path: 'LT-ZKYMSJWH-ZKTM',name:'RecordItemList', component: RecordItemList},//病例条目
       {path: 'LT-BLZK-TJBLTM',name:'AddRecordItem', component: AddRecordItem},//病例条目
       {path: 'LT-BLZK-PLGLBLTM',name:'ManageItemBatch', component: ManageItemBatch},//病例条目
       {path:'LT-ZKYMSJWH-ZKLXWH',name:'QCTypeMang',component: QCTypeMang},  //质控类型
       {path:'LT-ZKYMSJWH-TJZKLXWH',name:'AddQcType',component: AddQcType},  //添加质控类型
+      {path:'LT-ZKYMSJWH-ZDHCSTJ',name:'AutoTestList',component:AutoTestList},//自动化测试统计
+      {path:'LT-ZKYMSJWH-RWLB',name:'AutoTestTask',component:AutoTestTask},//自动化测试统计-转为任务
+      {path:'LT-ZKYMSJWH-ZDHCSXQ',name:'TaskDetail',component:TaskDetail},//自动化测试统计-转为任务-详情
+      {path:'LT-ZKYMSJWH-BZBL',name:'StandardRecord',component: StandardRecord},  //标准病历
+      {path:'LT-ZKYMSJWH-TJBZBL',name:'AddStandardRecord',component: AddStandardRecord},  //添加标准病历
 
     ]
   }

+ 1 - 1
vue.config.js

@@ -1,6 +1,6 @@
 const path = require('path');
 // const proxy_path = 'http://192.168.2.236:80';
-const proxy_path = 'http://192.168.2.241:88';
+const proxy_path = 'http://192.168.2.236:88';
 // const proxy_path = 'http://192.168.2.236:88';
 // const proxy_path = 'http://192.168.3.101:5050';
 // const proxy_path = 'http://192.168.3.117:5050';//周铁刚