458 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			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>
 |