38 changed files with 197 additions and 12175 deletions
			
			
		| @ -1,112 +0,0 @@ | |||
| <template> | |||
|   <div class="component-wrapper"> | |||
|     <div class="year-select"> | |||
|       <el-select v-model="yearSelect" placeholder="请选择"> | |||
|         <el-option v-for="item2 in years" :key="item2.value" :label="item2.label" :value="item2.value" /> | |||
|       </el-select> | |||
|     </div> | |||
|     <div v-for="(item,index) in progressList" :key="index" v-loading="progressLoading" class="heatmap-wrapper"> | |||
|       <div class="heatmap-head"> | |||
|         <span class="heatmap-title">{{ item.name }}</span> | |||
|         <span>          {{ yearSelect }}        </span> | |||
|       </div> | |||
|       <div class="heatmap-container"> | |||
|         <calendar-heatmap :data-list="item.data||[]" :end-date="endDate" class="heatmap" /> | |||
|       </div> | |||
|     </div> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| // import Cookies from 'js-cookie' | |||
| // window.SITE_CONFIG['dict_examItem'] | |||
| 
 | |||
| import calendarHeatmap from '@/components/calendar-heatmap' | |||
| 
 | |||
| export default { | |||
|   components: { | |||
|     calendarHeatmap | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       progressLoading: false, | |||
|       progressList: [], | |||
|       yearSelect: (new Date()).getFullYear(), | |||
|       endDate: String((new Date()).getFullYear()) + '-12-31' | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     years() { | |||
|       const result = [] | |||
|       const thisYear = Number((new Date()).getFullYear()) | |||
|       for (let i = 0; i < 10; i++) { | |||
|         result.push({ | |||
|           label: thisYear - i, | |||
|           value: thisYear - i | |||
|         }) | |||
|       } | |||
|       return result | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     yearSelect(val) { | |||
|       this.getProgressList(val) | |||
|     } | |||
|   }, | |||
|   created() { this.getProgressList() }, | |||
|   mounted() { }, | |||
|   methods: { | |||
|     getProgressList(year) { | |||
|       this.progressLoading = true | |||
|       year = year || String((new Date()).getFullYear()) | |||
|       const startDate = year + '-01-01' | |||
|       const endDate = year + '-12-31' | |||
|       this.endDate = endDate | |||
|       // this.progressLoading = true | |||
|       this.$http.get('/stats/examItem/allExtract', { params: { startDate, endDate }}) | |||
|         .then(({ data: res }) => { | |||
|           this.progressList = res.data | |||
|           window.sessionStorage.setItem('progressList', JSON.stringify(this.progressList)) | |||
|           this.progressLoading = false | |||
|         }).catch(() => { this.progressLoading = false }) | |||
|     } | |||
|   } | |||
| 
 | |||
| } | |||
| </script> | |||
| 
 | |||
| <style  lang='scss' scoped> | |||
| .component-wrapper { | |||
|   min-height: 200px; | |||
| 
 | |||
|   .year-select{ | |||
|     display: flex; | |||
|     justify-content: center; | |||
|     margin-bottom: 10px; | |||
|   } | |||
| 
 | |||
|   .heatmap-wrapper { | |||
|     margin-bottom: 10px; | |||
| 
 | |||
|     .heatmap-head { | |||
|       display: flex; | |||
|       justify-content: space-between; | |||
| 
 | |||
|       .heatmap-title { | |||
|         padding: 0 20px; | |||
|         font-size: 16px; | |||
|         font-weight: bolder; | |||
|       } | |||
|     } | |||
| 
 | |||
|     .heatmap-container { | |||
|       min-height: 130px; | |||
|       // padding-left: 170px; | |||
| 
 | |||
|       .heatmap { | |||
|         height: 100%; | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,112 +0,0 @@ | |||
| <template> | |||
|   <div v-loading="progressLoading" class="component-wrapper"> | |||
|     <div class="heatmap-wrapper"> | |||
|       <div class="heatmap-head"> | |||
|         <div class="heatmap-title"> | |||
|           <el-select v-model="itemSelect" size="mini" placeholder="请选择" style="width:250px" filterable> | |||
|             <el-option v-for="item in items" :key="item.itemId" :label="item.itemName" :value="item.itemId" /> | |||
|           </el-select> | |||
|         </div> | |||
|         <div class="year-select"> | |||
|           <el-select v-model="yearSelect" size="mini" placeholder="请选择" style="width:80px"> | |||
|             <el-option v-for="item in years" :key="item.value" :label="item.label" :value="item.value" /> | |||
|           </el-select> | |||
|         </div> | |||
|       </div> | |||
|       <div class="heatmap-container"> | |||
|         <calendar-heatmap :data-list="dataList" :end-date="endDate" class="heatmap" /> | |||
|       </div> | |||
|     </div> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import calendarHeatmap from '@/components/calendar-heatmap' | |||
| 
 | |||
| export default { | |||
|   components: { | |||
|     calendarHeatmap | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       progressLoading: false, | |||
|       dataList: [], | |||
|       itemSelect: window.SITE_CONFIG['dict_examItem'][0].itemId, | |||
|       yearSelect: (new Date()).getFullYear(), | |||
|       endDate: String((new Date()).getFullYear()) + '-12-31' | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     years() { | |||
|       const result = [] | |||
|       const thisYear = Number((new Date()).getFullYear()) | |||
|       for (let i = 0; i < 10; i++) { | |||
|         result.push({ | |||
|           label: thisYear - i, | |||
|           value: thisYear - i | |||
|         }) | |||
|       } | |||
|       return result | |||
|     }, | |||
|     items() { | |||
|       return window.SITE_CONFIG['dict_examItem'] | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     yearSelect() { | |||
|       this.getProgressList() | |||
|     }, | |||
|     itemSelect() { | |||
|       this.getProgressList() | |||
|     } | |||
|   }, | |||
|   created() { this.getProgressList() }, | |||
|   mounted() { }, // this.itemSelect = window.SITE_CONFIG['dict_examItem'][8].itemId | |||
|   methods: { | |||
|     getProgressList() { | |||
|       this.progressLoading = true | |||
|       const year = this.yearSelect | |||
|       const startDate = year + '-01-01' | |||
|       const endDate = year + '-12-31' | |||
|       this.endDate = endDate | |||
|       this.$http.get('/stats/examItem/extract', { params: { code: this.itemSelect, startDate, endDate }}) | |||
|         .then(({ data: res }) => { | |||
|           this.dataList = res.data | |||
|           this.progressLoading = false | |||
|         }).catch(() => { this.progressLoading = false }) | |||
|     } | |||
|   } | |||
| 
 | |||
| } | |||
| </script> | |||
| 
 | |||
| <style  lang='scss' scoped> | |||
| .component-wrapper { | |||
|   min-height: 200px; | |||
| 
 | |||
|   .heatmap-wrapper { | |||
|     margin-bottom: 10px; | |||
| 
 | |||
|     .heatmap-head { | |||
|       display: flex; | |||
|       justify-content: space-between; | |||
|       margin-bottom: 20px; | |||
| 
 | |||
|       .heatmap-title { | |||
|         padding: 0 20px; | |||
|         font-size: 16px; | |||
|         font-weight: bolder; | |||
|       } | |||
|     } | |||
| 
 | |||
|     .heatmap-container { | |||
|       min-height: 130px; | |||
|       // padding-left: 170px; | |||
| 
 | |||
|       .heatmap { | |||
|         height: 100%; | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,72 +0,0 @@ | |||
| <template> | |||
|   <el-table :data="data" class="table-wrapper" :show-header="showHeader" style="width: 100%"> | |||
|     <el-table-column type="index" width="44" /> | |||
|     <el-table-column prop="name" :label="colTitle" width="150" show-overflow-tooltip /> | |||
|     <!-- <el-table-column prop="num" :label="colNum" header-align="center" width="100" align="left" /> --> | |||
|     <el-table-column header-align="center" min-width="150" align="left"> | |||
|       <!-- scope.row.num --> | |||
|       <template slot-scope="scope"> | |||
|         <el-progress :stroke-width="10" :percentage="toPercentage(scope.row.num)" :format="format" /> | |||
|       </template> | |||
|     </el-table-column> | |||
|   </el-table> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| export default { | |||
|   props: { | |||
|     data: { type: Array, required: true }, | |||
|     showHeader: { type: Boolean, default: false }, | |||
|     colTitle: { type: String, default: '排名' }, | |||
|     colNum: { type: String, default: '数量' } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       totalNum: 0, | |||
|       valMap: {} | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     data: { | |||
|       deep: true, | |||
|       handler(newVal, oldVal) { | |||
|         this.data.forEach(item => { | |||
|           this.totalNum += item.num || 0 | |||
|         }) | |||
|       }, | |||
|       immediate: true | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     toPercentage(val) { | |||
|       if (val === 0 || this.totalNum === 0) return 0 | |||
|       const perVal = (Math.round(val / this.totalNum * 10000) / 100)// 小数点后两位百分比 | |||
|       this.valMap[perVal] = val | |||
|       return perVal | |||
|     }, | |||
|     format(percentage) { | |||
|       return this.valMap[percentage] | |||
|     } | |||
|   } | |||
| 
 | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .table-wrapper { | |||
| 
 | |||
|   ::v-deep .el-table th { | |||
|     background-color: transparent; | |||
|   } | |||
| 
 | |||
|   ::v-deep .el-table td, | |||
|   ::v-deep .el-table th.is-leaf { | |||
|     border-bottom: 0px; | |||
|   } | |||
| 
 | |||
|   ::v-deep .el-progress-bar__inner, | |||
|   ::v-deep .el-progress-bar__outer { | |||
|     border-radius: 0%; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,7 +0,0 @@ | |||
| import RenDeptTree from './src/ren-dept-tree' | |||
| 
 | |||
| RenDeptTree.install = function(Vue) { | |||
|   Vue.component(RenDeptTree.name, RenDeptTree) | |||
| } | |||
| 
 | |||
| export default RenDeptTree | |||
| @ -1,121 +0,0 @@ | |||
| <template> | |||
|   <div> | |||
|     <el-input v-model="showDeptName" :placeholder="placeholder" @focus="deptDialog"> | |||
|       <el-button slot="append" icon="el-icon-search" @click="deptDialog" /> | |||
|     </el-input> | |||
|     <el-input :value="value" style="display: none" /> | |||
|     <el-dialog :visible.sync="visibleDept" width="30%" :modal="false" :title="placeholder" :close-on-click-modal="false" :close-on-press-escape="false"> | |||
|       <el-form size="mini" :inline="true"> | |||
|         <el-form-item :label="$t('keyword')"> | |||
|           <el-input v-model="filterText" /> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button type="default">{{ $t('query') }}</el-button> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <el-tree | |||
|         ref="tree" | |||
|         class="filter-tree" | |||
|         :data="deptList" | |||
|         :default-expanded-keys="expandedKeys" | |||
|         :props="{ label: 'name', children: 'children' }" | |||
|         :expand-on-click-node="false" | |||
|         :filter-node-method="filterNode" | |||
|         :highlight-current="true" | |||
|         node-key="id" | |||
|       /> | |||
|       <template slot="footer"> | |||
|         <el-button type="default" size="mini" @click="cancelHandle()">{{ $t('cancel') }}</el-button> | |||
|         <el-button v-if="query" type="info" size="mini" @click="clearHandle()">{{ $t('clear') }}</el-button> | |||
|         <el-button type="primary" size="mini" @click="commitHandle()">{{ $t('confirm') }}</el-button> | |||
|       </template> | |||
|     </el-dialog> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| export default { | |||
|   name: 'RenDeptTree', | |||
|   props: { | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     value: [Number, String], | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     deptName: String, | |||
|     query: Boolean, | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     placeholder: String | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       filterText: '', | |||
|       visibleDept: false, | |||
|       deptList: [], | |||
|       showDeptName: '', | |||
|       expandedKeys: null, | |||
|       defaultProps: { | |||
|         children: 'children', | |||
|         label: 'label' | |||
|       } | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     filterText(val) { | |||
|       this.$refs.tree.filter(val) | |||
|     }, | |||
|     deptName(val) { | |||
|       this.showDeptName = val | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     deptDialog() { | |||
|       this.expandedKeys = null | |||
|       if (this.$refs.tree) { | |||
|         this.$refs.tree.setCurrentKey(null) | |||
|       } | |||
|       this.visibleDept = true | |||
|       this.getDeptList(this.value) | |||
|     }, | |||
|     filterNode(value, data) { | |||
|       if (!value) return true | |||
|       return data.name.indexOf(value) !== -1 | |||
|     }, | |||
|     getDeptList(id) { | |||
|       return this.$http.get('/sys/dept/list').then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.deptList = res.data | |||
|         this.$nextTick(() => { | |||
|           this.$refs.tree.setCurrentKey(id) | |||
|           this.expandedKeys = [id] | |||
|         }) | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     cancelHandle() { | |||
|       this.visibleDept = false | |||
|       this.deptList = [] | |||
|       this.filterText = '' | |||
|     }, | |||
|     clearHandle() { | |||
|       this.$emit('input', '') | |||
|       this.$emit('update:deptName', '') | |||
|       this.showDeptName = '' | |||
|       this.visibleDept = false | |||
|       this.deptList = [] | |||
|       this.filterText = '' | |||
|     }, | |||
|     commitHandle() { | |||
|       const node = this.$refs.tree.getCurrentNode() | |||
|       if (!node) { | |||
|         this.$message.error(this.$t('dept.chooseerror')) | |||
|         return | |||
|       } | |||
|       this.$emit('input', node.id) | |||
|       this.$emit('update:deptName', node.name) | |||
|       this.showDeptName = node.name | |||
|       this.visibleDept = false | |||
|       this.deptList = [] | |||
|       this.filterText = '' | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,7 +0,0 @@ | |||
| import RenRadioGroup from './src/ren-radio-group' | |||
| 
 | |||
| RenRadioGroup.install = function(Vue) { | |||
|   Vue.component(RenRadioGroup.name, RenRadioGroup) | |||
| } | |||
| 
 | |||
| export default RenRadioGroup | |||
| @ -1,22 +0,0 @@ | |||
| <template> | |||
|   <el-radio-group :value="value+''" @input="$emit('input', $event)"> | |||
|     <el-radio v-for="data in dataList" :key="data.dictValue" :label="data.dictValue">{{ data.dictLabel }}</el-radio> | |||
|   </el-radio-group> | |||
| </template> | |||
| <script> | |||
| import { getDictDataList } from '@/utils' | |||
| export default { | |||
|   name: 'RenRadioGroup', | |||
|   props: { | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     value: [Number, String], | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     dictType: String | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       dataList: getDictDataList(this.dictType) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,7 +0,0 @@ | |||
| import RenRegionTree from './src/ren-region-tree' | |||
| 
 | |||
| RenRegionTree.install = function(Vue) { | |||
|   Vue.component(RenRegionTree.name, RenRegionTree) | |||
| } | |||
| 
 | |||
| export default RenRegionTree | |||
| @ -1,135 +0,0 @@ | |||
| <template> | |||
|   <div class="ren-region"> | |||
|     <el-input v-model="showName" :placeholder="placeholder" @focus="treeDialog"> | |||
|       <el-button slot="append" icon="el-icon-search" @click="treeDialog" /> | |||
|     </el-input> | |||
|     <el-input :value="value" style="display: none" /> | |||
|     <el-dialog :visible.sync="visibleTree" width="360px" :modal="false" :title="placeholder" :close-on-click-modal="false" :close-on-press-escape="false"> | |||
|       <el-form size="mini" :inline="true"> | |||
|         <el-form-item :label="$t('keyword')"> | |||
|           <el-input v-model="filterText" /> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button type="default">{{ $t('query') }}</el-button> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <el-tree | |||
|         ref="tree" | |||
|         class="filter-tree" | |||
|         :data="dataList" | |||
|         :default-expanded-keys="expandedKeys" | |||
|         :props="{ label: 'name', children: 'children' }" | |||
|         :expand-on-click-node="false" | |||
|         :filter-node-method="filterNode" | |||
|         :highlight-current="true" | |||
|         node-key="id" | |||
|       /> | |||
|       <template slot="footer"> | |||
|         <el-button type="default" size="mini" @click="cancelHandle()">{{ $t('cancel') }}</el-button> | |||
|         <el-button type="info" size="mini" @click="clearHandle()">{{ $t('clear') }}</el-button> | |||
|         <el-button type="primary" size="mini" @click="commitHandle()">{{ $t('confirm') }}</el-button> | |||
|       </template> | |||
|     </el-dialog> | |||
|   </div> | |||
| </template> | |||
| <style lang="scss"> | |||
| .ren-region { | |||
|     .filter-tree { | |||
|         max-height: 230px; | |||
|         overflow: auto; | |||
|     } | |||
|     .el-dialog__body { | |||
|         padding: 0px 0px 0px 20px; | |||
|     } | |||
|     .el-dialog__footer { | |||
|         padding: 10px 20px 8px 20px; | |||
|     } | |||
| } | |||
| </style> | |||
| <script> | |||
| import { treeDataTranslate } from '@/utils' | |||
| export default { | |||
|   name: 'RenRegionTree', | |||
|   props: { | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     value: [Number, String], | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     parentName: String, | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     placeholder: String | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       filterText: '', | |||
|       visibleTree: false, | |||
|       dataList: [], | |||
|       showName: '', | |||
|       expandedKeys: null, | |||
|       defaultProps: { | |||
|         children: 'children', | |||
|         label: 'name' | |||
|       } | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     filterText(val) { | |||
|       this.$refs.tree.filter(val) | |||
|     }, | |||
|     parentName(val) { | |||
|       this.showName = val | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     treeDialog() { | |||
|       this.expandedKeys = null | |||
|       if (this.$refs.tree) { | |||
|         this.$refs.tree.setCurrentKey(null) | |||
|       } | |||
|       this.visibleTree = true | |||
|       this.getDataList(this.value) | |||
|     }, | |||
|     filterNode(value, data) { | |||
|       if (!value) return true | |||
|       return data.name.indexOf(value) !== -1 | |||
|     }, | |||
|     getDataList(id) { | |||
|       return this.$http.get('/sys/region/tree').then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.dataList = treeDataTranslate(res.data) | |||
|         this.$nextTick(() => { | |||
|           this.$refs.tree.setCurrentKey(id) | |||
|           this.expandedKeys = [id] | |||
|         }) | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     cancelHandle() { | |||
|       this.visibleTree = false | |||
|       this.dataList = [] | |||
|       this.filterText = '' | |||
|     }, | |||
|     clearHandle() { | |||
|       this.$emit('input', '0') | |||
|       this.$emit('update:parentName', '') | |||
|       this.showName = '' | |||
|       this.visibleTree = false | |||
|       this.dataList = [] | |||
|       this.filterText = '' | |||
|     }, | |||
|     commitHandle() { | |||
|       const node = this.$refs.tree.getCurrentNode() | |||
|       if (!node) { | |||
|         this.$message.error(this.$t('choose')) | |||
|         return | |||
|       } | |||
|       this.$emit('input', node.id) | |||
|       this.$emit('update:parentName', node.name) | |||
|       this.showName = node.name | |||
|       this.visibleTree = false | |||
|       this.dataList = [] | |||
|       this.filterText = '' | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,7 +0,0 @@ | |||
| import RenSelect from './src/ren-select' | |||
| 
 | |||
| RenSelect.install = function(Vue) { | |||
|   Vue.component(RenSelect.name, RenSelect) | |||
| } | |||
| 
 | |||
| export default RenSelect | |||
| @ -1,24 +0,0 @@ | |||
| <template> | |||
|   <el-select :value="value+''" :placeholder="placeholder" clearable @input="$emit('input', $event)"> | |||
|     <el-option v-for="data in dataList" :key="data.dictValue" :label="data.dictLabel" :value="data.dictValue">{{ data.dictLabel }}</el-option> | |||
|   </el-select> | |||
| </template> | |||
| <script> | |||
| import { getDictDataList } from '@/utils' | |||
| export default { | |||
|   name: 'RenSelect', | |||
|   props: { | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     value: [Number, String], | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     dictType: String, | |||
|     // eslint-disable-next-line vue/require-default-prop | |||
|     placeholder: String | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       dataList: getDictDataList(this.dictType) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,404 +0,0 @@ | |||
| <template> | |||
|   <div class="component-container searchContent"> | |||
|     <!-- max-height="450" --> | |||
|     <el-table | |||
|       ref="registerPatientsListTable" | |||
|       :data="dataList" | |||
|       style="width: 100%" | |||
|       class="examine-table" | |||
|       :show-header="conCiseShow == true ? true : false" | |||
|       @="handleSelectionChange" | |||
|       @select="headleSelect" | |||
|     > | |||
|       <el-table-column v-if="projectName == 'sampleBank'" type="selection" width="55" :selectable="selectable" /> | |||
|       <!-- 简洁版 --> | |||
|       <template v-if="conCiseShow == true"> | |||
|         <!-- 姓名 --> | |||
|         <el-table-column :label="'姓名'" header-align="center" align="center" width="120"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.register_patient.name | f_desensitize_name }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 性别 --> | |||
|         <el-table-column :label="'性别'" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.register_patient.sex | f_sex }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 年龄 --> | |||
|         <el-table-column :label="'年龄'" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.register_patient.birthday | f_getAge }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 身份证号 --> | |||
|         <el-table-column prop="patientIdNumber" :label="'身份证号'" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.register_patient.patientIdNumber | f_desensitize_idNumber }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 电话号码 备用--> | |||
|         <!-- <el-table-column | |||
|           prop="patientPhone" | |||
|           :label="'电话号码'" | |||
|           header-align="center" | |||
|           align="center" | |||
|         > | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.register_patient.patientPhone }} | |||
|           </template> | |||
|         </el-table-column> --> | |||
|         <!-- 地址 备用--> | |||
|         <!-- <el-table-column | |||
|           prop="patientAddress" | |||
|           :label="'地址'" | |||
|           header-align="center" | |||
|           align="center" | |||
|         > | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.register_patient.patientAddress }} | |||
|           </template> | |||
|         </el-table-column> --> | |||
|         <!-- 操作 --> | |||
|         <el-table-column label="操作" header-align="center" align="center" width="150"> | |||
|           <template slot-scope="scope"> | |||
|             <el-button type="text" size="small" @click="showDetail(scope.row)">查看详情 | |||
|             </el-button> | |||
|           </template> | |||
|         </el-table-column> | |||
|       </template> | |||
|       <!-- 标准版 --> | |||
|       <template v-if="conCiseShow == false"> | |||
|         <!-- 姓名 --> | |||
|         <el-table-column header-align="center"> | |||
|           <template slot-scope="scope"> | |||
|             <div class="head"> | |||
|               <div class="left"> | |||
|                 <!-- <el-checkbox :label="id">{{ "" }}</el-checkbox> --> | |||
|                 <div class="left"> | |||
|                   <span>姓名:{{ scope.row.register_patient.name }}</span> | |||
|                   <span>性别:{{ scope.row.register_patient.sex }}</span> | |||
|                   <!-- <span>年龄:{{ registerPatient.patientSexAge }}</span> --> | |||
|                 </div> | |||
|               </div> | |||
|               <div class="right"> | |||
|                 <el-link type="primary" :underline="false" @click="showDetail(scope.row)">查看详情 <i | |||
|                   class="el-icon-arrow-right el-icon--right" | |||
|                 /></el-link> | |||
|               </div> | |||
|             </div> | |||
|             <div class="searchContent-text" v-html="scope.row.allHighlight" /> | |||
|             <div class="exam"> | |||
|               <p v-for="(item, index) in scope.row.pacs_register_examine_item" :key="index"> | |||
|                 <span>{{ item.examineItem }}</span> | |||
|                 <span>{{ item.count + "次" }}</span> | |||
|               </p> | |||
|             </div> | |||
| 
 | |||
|             <el-row :gutter="20"> | |||
|               <el-col :span="12"> | |||
|                 <echarts-shili :chart-data="scope.row.shili" :id-name="'shili' + scope.$index" desc="视力" /> | |||
|               </el-col> | |||
|               <el-col :span="12"> | |||
|                 <echarts-yanya :chart-data="scope.row.yanya" :id-name="'yanya' + scope.$index" desc="眼压" /> | |||
|               </el-col> | |||
|             </el-row> | |||
|           </template> | |||
|         </el-table-column> | |||
|       </template> | |||
|     </el-table> | |||
|     <!-- 底部全选反选 --> | |||
|     <checked-footer | |||
|       v-if="projectName == 'sampleBank'" | |||
|       ref="checkfooter" | |||
|       table-ref="registerPatientsListTable" | |||
|       :current-table-list="currentTableList" | |||
|       :data-list="dataList" | |||
|     > | |||
|       <div class="batch_button"> | |||
|         <el-button type="primary" size="small" @click="IntoSubjectsClick">引入受试者</el-button> | |||
|       </div> | |||
|     </checked-footer> | |||
|     <!-- 详情页 --> | |||
|     <el-dialog title="360视图" class="detail-view" :visible.sync="dialogVisible" :fullscreen="true"> | |||
|       <detail-view :id="detailId" ref="viewRef" :patient-id-number="patientIdNumber" /> | |||
|     </el-dialog> | |||
|     <!-- 补全身份证号 --> | |||
|     <el-dialog title="收货地址" :visible.sync="dialogPatientIDVisible" @closed="closePatientId"> | |||
|       <span>身份证:</span> | |||
|       <el-input v-model="patientIdNumber" placeholder="请输入内容" clearable /> | |||
|       <div slot="footer" class="dialog-footer"> | |||
|         <el-button @click="dialogPatientIDVisible=false">取 消</el-button> | |||
|         <el-button type="primary" @click="surePatientIdClick">确 定</el-button> | |||
|       </div> | |||
|     </el-dialog> | |||
| 
 | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import echartsShili from '@/components/echarts/shili' | |||
| import echartsYanya from '@/components/echarts/yanya' | |||
| import checkedFooter from '@/components/checked-footer' | |||
| import detailView from '@/components/360View/index1' | |||
| import checked from '@/mixins/checked' | |||
| import { confirm } from '@/utils/confirm' | |||
| export default { | |||
|   components: { echartsShili, echartsYanya, detailView, checkedFooter }, | |||
|   mixins: [checked], | |||
|   inject: ['refresh'], | |||
|   props: { | |||
|     id: { | |||
|       type: String, | |||
|       default: '' | |||
|     }, | |||
|     htmlText: { | |||
|       type: String, | |||
|       default: '' | |||
|     }, | |||
|     projectName: { | |||
|       type: String, | |||
|       default: '' | |||
|     }, | |||
|     registerPatient: { | |||
|       type: Object, | |||
|       default: () => { | |||
|         return {} | |||
|       } | |||
|     }, | |||
|     dataList: { | |||
|       type: Array, | |||
|       default: () => [] | |||
|     }, | |||
|     visionData: { | |||
|       type: Array, | |||
|       default: () => [] | |||
|     }, | |||
|     iopData: { | |||
|       type: Array, | |||
|       default: () => [] | |||
|     }, | |||
|     conCiseShow: { | |||
|       type: Boolean, | |||
|       default: true | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       dialogVisible: false, | |||
|       dialogPatientIDVisible: false, | |||
|       detailId: '', | |||
|       patientIdNumber: '', | |||
|       checked: false, | |||
|       // cheackAllFooter: false, | |||
|       currentTableList: [], | |||
|       projectId: '', | |||
|       noPatientIDList: {}, | |||
|       currentSelectionRow: {}, | |||
|       flag: 0 | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     this.projectId = window.SITE_CONFIG['projectId'] | |||
|   }, | |||
|   methods: { | |||
|     // 查看详情 | |||
|     showDetail(scope) { | |||
|       this.patientIdNumber = scope.register_patient.patientIdNumber | |||
|       this.detailId = scope.id | |||
|       this.dialogVisible = true | |||
|       this.$nextTick(() => { | |||
|         // 根据id获取患者信息--中间上侧患者信息 | |||
|         this.$refs.viewRef.getPatientData() | |||
|         // 获取时间轴数据--左侧时间轴 | |||
|         this.$refs.viewRef.getTimeAxisData() | |||
|         // 获取视力和眼压图标的值 | |||
|         this.$refs.viewRef.getShiLiAndYanYaData() | |||
|         // 获取关键指标--右侧获取筛选的具体值 | |||
|         this.$refs.viewRef.getKPI() | |||
|       }) | |||
|     }, | |||
|     // 当选择项发生变化时会触发该事件 | |||
|     handleSelectionChange(val) { | |||
|       if (val.length === this.dataList.length) { | |||
|         this.$refs.checkfooter.cheackAllFooter = true | |||
|       } else { | |||
|         this.$refs.checkfooter.cheackAllFooter = false | |||
|       } | |||
|       this.currentTableList = val | |||
|     }, | |||
|     // 当用户手动勾选数据行的 Checkbox 时触发的事件 | |||
|     headleSelect(val) { | |||
|       // 330104195404061636 | |||
|       this.flag = 0 | |||
|       this.currentSelectionRow = val[0] | |||
|       if (val.length > 0 && !val[0].register_patient.patientIdNumber) { | |||
|         this.noPatientIDList = val[0].register_patient | |||
|         this.dialogPatientIDVisible = true | |||
|       } | |||
|     }, | |||
|     // 确定添加身份证号 | |||
|     async surePatientIdClick() { | |||
|       const { data: res } = await this.$http.post('/project/patient/completeIdNumber', { | |||
|         birthday: this.$options.filters['dateFilterTwo'](this.noPatientIDList.birthday), | |||
|         hospitalId: this.noPatientIDList.hospitalId, | |||
|         name: this.noPatientIDList.name, | |||
|         patientId: this.noPatientIDList.id, | |||
|         patientIdNumber: this.patientIdNumber, | |||
|         sex: this.noPatientIDList.sex | |||
|       }) | |||
|       if (res.code === 0) { | |||
|         this.$message({ | |||
|           type: 'success', | |||
|           message: '身份证号添加成功' | |||
|         }) | |||
|         this.flag = 1 | |||
|         this.dialogPatientIDVisible = false | |||
|       } else { | |||
|         this.flag = 0 | |||
|         this.$message.error(res.msg) | |||
|       } | |||
|     }, | |||
|     // 关闭添加身份证号弹框 | |||
|     closePatientId() { | |||
|       this.dialogPatientIDVisible = false | |||
|       this.flag === 0 ? this.$refs.registerPatientsListTable.toggleRowSelection(this.currentSelectionRow, false) : '' | |||
|     }, | |||
|     // 引入受试者 | |||
|     IntoSubjectsClick() { | |||
|       confirm('确定要引入受试者吗?').then(async() => { | |||
|         const patientInfoArr = [] | |||
|         let patientInfoObj = {} | |||
|         this.currentTableList.forEach((item) => { | |||
|           patientInfoObj = { | |||
|             hospitalCode: item.register_patient.hospitalId, | |||
|             patientBirthday: item.register_patient.birthday, | |||
|             patientId: item.register_patient.id, | |||
|             patientIdNumber: item.register_patient.patientIdNumber, | |||
|             patientName: item.register_patient.name, | |||
|             patientSex: item.register_patient.sex, | |||
|             projectId: this.projectId | |||
|           } | |||
|           patientInfoArr.push(patientInfoObj) | |||
|         }) | |||
|         const { data: res } = await this.$http({ | |||
|           method: 'post', | |||
|           url: '/project/patient', | |||
|           data: patientInfoArr | |||
|         }) | |||
|         if (res.code === 0) { | |||
|           this.$message({ | |||
|             type: 'success', | |||
|             message: '引入成功!' | |||
|           }) | |||
|           this.currentTableList.forEach(item => { | |||
|             this.dataList.forEach(iten => { | |||
|               if (item.id === iten.id) { | |||
|                 item.existInProject = 1 | |||
|               } | |||
|             }) | |||
|           }) | |||
|           this.$refs.registerPatientsListTable.clearSelection() | |||
|         } else { | |||
|           this.$message.error(res.msg) | |||
|         } | |||
|       }) | |||
|     }, | |||
|     // Function 的返回值用来决定这一行的 CheckBox 是否可以勾选 | |||
|     selectable(row, index) { | |||
|       if (row.existInProject === 1) { | |||
|         return false | |||
|       } else { | |||
|         return true | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .searchContent { | |||
|   width: 100%; | |||
|   padding-bottom: 16px; | |||
|   background-color: #fff; | |||
|   margin-bottom: 16px; | |||
|   .head { | |||
|     display: flex; | |||
|     justify-content: space-between; | |||
|     .el-checkbox { | |||
|       margin-right: 16px; | |||
|     } | |||
|     .left { | |||
|       display: flex; | |||
|       span { | |||
|         font-size: 14px; | |||
|         padding-right: 55px; | |||
|         font-weight: bold; | |||
|       } | |||
|     } | |||
|   } | |||
|   .searchContent-text { | |||
|     font-size: 14px; | |||
|     margin: 16px 0; | |||
|   } | |||
|   .exam { | |||
|     display: flex; | |||
|     flex-wrap: wrap; | |||
|     p { | |||
|       display: flex; | |||
|       flex-wrap: nowrap; | |||
|       height: 32px; | |||
|       line-height: 32px; | |||
|       width: 18%; | |||
|       background-color: #eee; | |||
|       padding: 0 10px; | |||
|       margin: 6px; | |||
|       span { | |||
|         display: block; | |||
|         flex: 1; | |||
|         overflow: hidden; | |||
|         white-space: nowrap; | |||
|         text-overflow: ellipsis; | |||
|       } | |||
|       span:nth-child(2) { | |||
|         padding-left: 14px; | |||
|         color: #0072f9; | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| 
 | |||
| a.el-link.el-link--primary:hover { | |||
|   text-decoration: none; | |||
| } | |||
| </style> | |||
| 
 | |||
| <style lang="scss"> | |||
| .searchContent .detail-view { | |||
|   .el-dialog { | |||
|     background: #000; | |||
|     overflow: hidden; | |||
|   } | |||
| 
 | |||
|   .el-dialog__header { | |||
|     padding: 10px 20px 10px; | |||
| 
 | |||
|     .el-dialog__title { | |||
|       color: #fff; | |||
|       padding: 10px; | |||
|     } | |||
| 
 | |||
|     .el-dialog__headerbtn { | |||
|       top: 5px; | |||
|       font-size: 30px; | |||
|     } | |||
|     .el-dialog__headerbtn .el-dialog__close { | |||
|       color: #fff; | |||
|     } | |||
|   } | |||
|   .el-dialog__body { | |||
|     height: calc(100vh - 60px); | |||
|     padding: 0 10px; | |||
|   } | |||
| } | |||
| </style> | |||
								
									
										File diff suppressed because it is too large
									
								
							
						
					
								
									
										File diff suppressed because one or more lines are too long
									
								
							
						
					
								
									Binary file not shown.
								
							
						
					
								
									Binary file not shown.
								
							
						
					
					Loading…
					
					
				
		Reference in new issue