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