irc_web/.svn/pristine/b4/b4736175b46ceabbf0c8c5f54f0...

458 lines
14 KiB
Plaintext

<template>
<BaseContainer>
<template slot="search-container">
<el-form :inline="true">
<!-- Name -->
<el-form-item :label="$t('trials:stats:form:name')">
<el-input
v-model="listQuery.ReviewerName"
disabled
/>
</el-form-item>
<!-- Source -->
<el-form-item class="my_multiple" :label="$t('trials:stats:form:source')">
<el-select v-model="listQuery.WorkLoadFromStatus" style="width: 140px" class="handle-select" multiple clearable>
<el-option
v-for="item in statusOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<!-- Begin Month -->
<el-form-item :label="$t('trials:stats:form:beginMonth')">
<el-date-picker
v-model="listQuery.SearchBeginDateTime"
type="month"
value-format="yyyy-MM"
format="yyyy-MM"
:picker-options="beginPickerOption"
/>
</el-form-item>
<!-- End Month -->
<el-form-item :label="$t('trials:stats:form:endMonth')">
<el-date-picker
v-model="listQuery.SearchEndDateTime"
type="month"
value-format="yyyy-MM"
format="yyyy-MM"
:picker-options="endpickerOption"
/>
</el-form-item>
<el-form-item>
<!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t('common:button:search') }}
</el-button>
<!-- 重置 -->
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
</el-form-item>
</el-form>
</template>
<template slot="main-container">
<el-table
v-loading="listLoading"
v-adaptive="{bottomOffset:55}"
size="small"
height="100"
:data="list"
:cell-style="cellColor"
row-key="RowGuid"
lazy
border
:load="load"
:tree-props="{ hasChildren: 'hasChildren' }"
>
<el-table-column width="60" />
<!-- Month -->
<el-table-column :label="$t('trials:stats:table:month')" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<div v-show="ShowMonthSelect(scope.row.DataFrom)">{{ scope.row.WorkTimeStr }}</div>
</template>
</el-table-column>
<!-- Source -->
<el-table-column
prop="DataFrom"
:label="$t('trials:stats:form:source')"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope">{{ scope.row.DataFrom===0?'Reviewer':scope.row.DataFrom===1?'Client':'Reconciled' }}</template>
</el-table-column>
<el-table-column
prop="Training"
:label="$t('trials:enrolledReviews:table:training')"
min-width="75"
show-overflow-tooltip
/>
<el-table-column
prop="RefresherTraining"
:label="$t('trials:enrolledReviews:table:refresherTraining')"
min-width="130"
show-overflow-tooltip
/>
<el-table-column :label="$t('trials:enrolledReviews:table:tp')" align="center">
<el-table-column
prop="Timepoint"
:label="$t('trials:enrolledReviews:table:tpRegular')"
min-width="80"
show-overflow-tooltip
/>
<el-table-column
prop="TimepointIn48H"
:label="$t('trials:enrolledReviews:table:tp48H')"
min-width="90"
show-overflow-tooltip
/>
<el-table-column
prop="TimepointIn24H"
:label="$t('trials:enrolledReviews:table:tp24H')"
min-width="90"
show-overflow-tooltip
/>
</el-table-column>
<el-table-column
:label="$t('trials:enrolledReviews:table:ad')"
align="center"
>
<el-table-column
prop="Adjudication"
:label="$t('trials:enrolledReviews:table:adRegular')"
min-width="80"
show-overflow-tooltip
/>
<el-table-column
prop="AdjudicationIn48H"
:label="$t('trials:enrolledReviews:table:ad48H')"
min-width="90"
show-overflow-tooltip
/>
<el-table-column
prop="AdjudicationIn24H"
:label="$t('trials:enrolledReviews:table:ad24H')"
min-width="90"
show-overflow-tooltip
/>
</el-table-column>
<el-table-column
prop="Global"
:label="$t('trials:enrolledReviews:table:gl')"
min-width="100"
show-overflow-tooltip
/>
<el-table-column
prop="Downtime"
:label="$t('trials:enrolledReviews:table:downtime')"
min-width="90"
show-overflow-tooltip
/>
<el-table-column :label="$t('common:action:action')" width="150" fixed="right">
<template slot-scope="scope">
<div v-if="scope.row.hasChildren">
<!-- Add -->
<el-button
circle
icon="el-icon-plus"
:disabled="scope.row.IsLock"
:title="$t('trials:stats:action:add')"
@click="handleAdd(scope.row)"
/>
</div>
<div v-else>
<!-- Edit -->
<el-button
circle
icon="el-icon-edit-outline"
:title="$t('trials:stats:action:edit')"
:disabled="scope.row.IsLock"
@click="handleUpdate(scope.row)"
/>
<!-- 重置 -->
<el-button
v-if="scope.row.DataFrom"
circle
:title="$t('trials:stats:action:reset')"
icon="el-icon-refresh"
:disabled="scope.row.Id==guidEmpty|| scope.row.Id==null || scope.row.IsLock"
@click="handleDelete(scope.row)"
/>
<!-- 删除 -->
<el-button
v-if="(!scope.row.DataFrom)"
circle
:title="$t('trials:stats:action:del')"
icon="el-icon-delete"
:disabled="scope.row.IsLock"
@click="handleDelete(scope.row)"
/>
</div>
</template>
</el-table-column>
</el-table>
</template>
<el-dialog
ref="dialog__wrapper"
:key="timer"
v-dialogDrag
size="small"
:visible.sync="dialogVisible"
width="40%"
:title="title"
:close-on-click-modal="false"
>
<add-workload
:id="Id"
:trial-id="trialId"
:doctor-id="doctorId"
:trial-expedited-state="expeditedState"
:info="row"
:year-month="yearMonth"
@handleClose="handleClose"
@setTitle="setTitle"
/>
</el-dialog>
</BaseContainer>
</template>
<script>
import { getDoctorWorkLoadList, getReviewerWorkLoadListDetail, getTrialExpeditedState, deleteWorkLoad } from '@/api/trials'
import '@/directive/dialogDrag'
require('@/utils/formatter')
import BaseContainer from '@/components/BaseContainer'
import AddWorkload from './components/AddWorkload'
const getListQueryDefault = () => {
return {
TrialId: '',
DoctorId: '',
WorkLoadFromStatus: [0, 1, 2],
SearchBeginDateTime: new Date(new Date().setMonth(new Date().getMonth() - 3)).format('yyyy-MM'),
SearchEndDateTime: new Date().format('yyyy-MM'),
PageIndex: 1,
PageSize: 20,
Asc: false,
SortField: ''
}
}
export default {
name: 'Stats',
components: { BaseContainer, AddWorkload },
data() {
return {
list: [],
listQuery: getListQueryDefault(),
statusOption: this.$d.WorkLoadStatusOption,
listLoading: false,
beginPickerOption: {
disabledDate: time => {
if (this.listQuery.SearchEndDateTime) {
return time.getTime() > new Date(this.listQuery.SearchEndDateTime).getTime()
} else {
return time.getTime() > Date.now()
}
}
},
endpickerOption: {
disabledDate: time => {
const _now = Date.now()
return time.getTime() > _now
}
},
expeditedState: 0,
dialogVisible: false,
Id: '',
trialId: '',
doctorId: '',
title: '',
row: {},
timer: '',
yearMonth: '',
maps: new Map(),
guidEmpty: '00000000-0000-0000-0000-000000000000',
trialCode: ''
}
},
mounted() {
this.trialCode = this.$route.query.trialCode
this.trialId = this.$route.query.trialId
this.listQuery.TrialCode = this.trialCode
this.listQuery.ReviewerName = this.$route.query.doctorName
this.doctorId = this.$route.query.doctorId
this.initPage()
this.getExpeditedState()
},
methods: {
initPage() {
this.listLoading = true
this.listQuery.DoctorId = this.$route.query.doctorId
this.listQuery.TrialId = this.$route.query.trialId
this.listQuery.TrialCode = this.trialCode
this.listQuery.ReviewerName = this.$route.query.doctorName
getDoctorWorkLoadList(this.listQuery).then(res => {
this.listLoading = false
const { CurrentPageData } = res.Result
CurrentPageData.forEach(function(item) {
item.DataFrom === 0 ? item.hasChildren = true : ''
})
this.list = CurrentPageData
}).catch(() => { this.listLoading = false })
},
handleReset() {
this.listQuery = getListQueryDefault()
this.initPage()
},
handleSearch() {
this.listQuery.PageIndex = 1
this.initPage()
},
handleAdd(row) {
this.timer = new Date().getTime()
this.title = this.$t('trials:stats:dialogTitle:add')
this.Id = ''
this.row = { ...row }
this.yearMonth = row.YearMonthStr
this.dialogVisible = true
},
handleUpdate(row) {
this.row = {}
this.timer = new Date().getTime()
this.title = this.$t('trials:stats:dialogTitle:edit')
this.Id = row.Id
this.dialogVisible = true
this.row = { ...row }
if (row.DataFrom === 2) {
var clientData = this.list.find(item => item.DataFrom === 1 && item.WorkTimeStr === row.WorkTimeStr)
this.row.clientData = clientData
}
},
handleDelete(row) {
let str = ''
if (row.DataFrom === 0) {
str = this.$t('trials:stats:message:del')
} else {
str = this.$t('trials:stats:message:reset')
}
this.$confirm(str, {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {
deleteWorkLoad(row.Id, this.trialId).then(res => {
if (res.IsSuccess) {
this.initPage()
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})
},
handleClose() {
this.dialogVisible = false
this.initPage()
},
load(tree, treeNode, resolve, type) {
const YearMonthStr = tree.YearMonthStr
this.maps.set(YearMonthStr, { tree, treeNode, resolve })
const param = {
TrialId: this.trialId,
DoctorId: this.$route.query.doctorId,
YearMonthStr: tree.WorkTimeStr
}
getReviewerWorkLoadListDetail(param).then(res => {
if (res.IsSuccess) {
if (res.Result) {
const data = res.Result
const nodes = res.Result.map(v => {
return { ...v, hasChildren: v.level <= 2 }
})
resolve(nodes)
if (data.length > 0) {
this.reFlashTbl(data)
this.$message.success(this.$t('common:message:savedSuccessfully'))
}
}
}
})
},
reFlashTbl(data) {
for (let i = 0; i < this.list.length; i++) {
if (this.list[i].YearMonthStr === data[0].YearMonthStr && this.list[i].DataFrom === 0) {
let Training = 0
let Timepoint = 0
let TimepointIn24H = 0
let TimepointIn48H = 0
let Adjudication = 0
let AdjudicationIn24H = 0
let AdjudicationIn48H = 0
let Global = 0
let Downtime = 0
for (let j = 0; j < data.length; j++) {
Training = data[j].Training + Training
Timepoint = data[j].Timepoint + Timepoint
TimepointIn24H = data[j].TimepointIn24H + TimepointIn24H
TimepointIn48H = data[j].TimepointIn48H + TimepointIn48H
Adjudication = data[j].Adjudication + Adjudication
AdjudicationIn24H = data[j].AdjudicationIn24H + AdjudicationIn24H
AdjudicationIn48H = data[j].AdjudicationIn48H + AdjudicationIn48H
Global = data[j].Global + Global
Downtime = data[j].Downtime + Downtime
}
this.list[i].Training = Training
this.list[i].Timepoint = Timepoint
this.list[i].TimepointIn24H = TimepointIn24H
this.list[i].TimepointIn48H = TimepointIn48H
this.list[i].Adjudication = Adjudication
this.list[i].AdjudicationIn24H = AdjudicationIn24H
this.list[i].AdjudicationIn48H = AdjudicationIn48H
this.list[i].Global = Global
this.list[i].Downtime = Downtime
break
}
}
},
getExpeditedState() {
const id = this.$route.query.trialId
getTrialExpeditedState(id).then(res => { this.expeditedState = res.Result })
},
ShowMonthSelect(dataFrom) {
return Math.min(...this.listQuery.WorkLoadFromStatus) === dataFrom
},
cellColor({ row, column, rowIndex, columnIndex }) {
if (row.DataFrom === 1) {
return {
color: '#0099cc'
}
} else if (row.DataFrom === 2) {
return {
color: '#f56c6c'
}
}
},
setTitle(title) {
this.title = this.$t('trials:stats:dialogTitle:edit')
}
}
}
</script>
<style lang="scss" scoped>
.stats-container{
padding: 5px 10px;
margin-top: 10px;
height: 100%;
.handle-select {
width: 300px;
margin-right: 10px;
margin-bottom: 5px;
}
.stats-list{
height: calc(100% - 80px);
}
}
</style>