368 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			368 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
| <template>
 | ||
|   <div v-loading="loading" class="add_reading-period-wrapper" style="display:flex;width: 100%;height: 100%;">
 | ||
|     <div
 | ||
|       class="reading-period-form"
 | ||
|       style="width:400px;height:100%;margin-right: 10px;"
 | ||
|     >
 | ||
|       <el-card shadow="never" style="height:571px;">
 | ||
|         <el-form
 | ||
|           ref="addOrUpdatePR"
 | ||
|           :model="form"
 | ||
|           size="small"
 | ||
|           :rules="rules"
 | ||
|           label-width="100px"
 | ||
|         >
 | ||
|           <!-- 阅片期类型 -->
 | ||
|           <el-form-item :label="$t('trials:rpManage:table:readingType')">
 | ||
|             <el-input v-model="form.ReadingSetTypeName" disabled style="width:100%;" />
 | ||
|           </el-form-item>
 | ||
|           <!-- 阅片期名称 -->
 | ||
|           <el-form-item :label="$t('trials:rpManage:table:readingName')" prop="ReadingPeriodName">
 | ||
|             <el-input v-model="form.ReadingPeriodName" style="width:100%;" />
 | ||
|           </el-form-item>
 | ||
|           <!-- 受试者范围 -->
 | ||
|           <el-form-item :label="$t('trials:rpManage:table:subjectRange')" prop="ReadingScope">
 | ||
|             <el-select v-model="form.ReadingScope" style="width:100%;">
 | ||
|               <el-option
 | ||
|                 v-for="(item,index) of $d.ReadingScopeEnum"
 | ||
|                 :key="index"
 | ||
|                 :label="item.label"
 | ||
|                 :value="item.value"
 | ||
|               />
 | ||
|             </el-select>
 | ||
|           </el-form-item>
 | ||
|           <!-- 中心 -->
 | ||
|           <el-form-item v-if="form.ReadingScope === 1" :label="$t('trials:addRP:form:sites')" prop="SiteIds">
 | ||
|             <el-select v-model="form.SiteIds" filterable style="width:100%;" multiple>
 | ||
|               <el-option
 | ||
|                 v-for="(item,index) of siteOptions"
 | ||
|                 :key="index"
 | ||
|                 :label="item.TrialSiteCode"
 | ||
|                 :value="item.SiteId"
 | ||
|               />
 | ||
|             </el-select>
 | ||
|           </el-form-item>
 | ||
|           <!-- 条件 -->
 | ||
|           <el-form-item :label="$t('trials:addRP:form:condition')" prop="DeadlineCondition">
 | ||
|             <el-radio-group v-model="form.DeadlineCondition" style="width:100%;" @change="handleDeadlineCondition">
 | ||
|               <!-- 截止日期 -->
 | ||
|               <el-radio :label="0">{{ $t('trials:rpManage:table:expirationDate') }}</el-radio>
 | ||
|               <!-- 截止访视 -->
 | ||
|               <el-radio :label="1">{{ $t('trials:rpManage:table:expirationVisit') }}</el-radio>
 | ||
|             </el-radio-group>
 | ||
|           </el-form-item>
 | ||
|           <!-- 截止日期 -->
 | ||
|           <el-form-item v-if="form.DeadlineCondition === 0" :label="$t('trials:rpManage:table:expirationDate')" prop="ExpirationDate">
 | ||
|             <el-date-picker
 | ||
|               v-model="form.ExpirationDate"
 | ||
|               type="date"
 | ||
|               value-format="yyyy-MM-dd"
 | ||
|               format="yyyy-MM-dd"
 | ||
| 
 | ||
|               style="width:100%;"
 | ||
|             />
 | ||
|           </el-form-item>
 | ||
|           <!-- 截止访视 -->
 | ||
|           <el-form-item v-if="form.DeadlineCondition === 1" :label="$t('trials:rpManage:table:expirationVisit')" prop="VisitStageId">
 | ||
|             <el-select
 | ||
|               v-model="form.VisitStageId"
 | ||
|               clearable
 | ||
|               style="width:100%;"
 | ||
|               @change="handleVisitChange"
 | ||
|             >
 | ||
|               <el-option
 | ||
|                 v-for="item of visitPlanOptions"
 | ||
|                 :key="item.VisitStageId"
 | ||
|                 :label="item.VisitName"
 | ||
|                 :value="item.VisitStageId"
 | ||
|               >
 | ||
|                 <span style="float: left">{{ item.VisitName }}</span>
 | ||
|               </el-option>
 | ||
|             </el-select>
 | ||
|           </el-form-item>
 | ||
|           <div style="text-align:right;margin-top:10px;">
 | ||
|             <el-form-item>
 | ||
|               <!-- 生成阅片期 -->
 | ||
|               <el-button size="small" type="primary" :loading="btnLoading" @click="getRPList">
 | ||
|                 {{ $t('trials:addRP:button:createPR') }}
 | ||
|               </el-button>
 | ||
|             </el-form-item>
 | ||
|           </div>
 | ||
| 
 | ||
|         </el-form>
 | ||
|       </el-card>
 | ||
| 
 | ||
|     </div>
 | ||
|     <div class="result-table" style="flex:1;">
 | ||
|       <el-card shadow="never">
 | ||
| 
 | ||
|         <el-table
 | ||
|           ref="prList"
 | ||
|           v-loading="listLoading"
 | ||
|           :data="list"
 | ||
|           stripe
 | ||
|           height="455"
 | ||
|           @selection-change="handleSelectChange"
 | ||
|         >
 | ||
|           <el-table-column type="selection" align="left" width="45" />
 | ||
|           <el-table-column type="index" width="40" />
 | ||
|           <!-- 中心 -->
 | ||
|           <el-table-column
 | ||
|             prop="TrialSiteCode"
 | ||
|             :label="$t('trials:linkedRP:table:siteCode')"
 | ||
|           />
 | ||
|           <!-- 受试者 -->
 | ||
|           <el-table-column
 | ||
|             prop="SubjectCode"
 | ||
|             :label="$t('trials:linkedRP:table:subjectCode')"
 | ||
|           />
 | ||
|           <!-- 截止访视 -->
 | ||
|           <el-table-column
 | ||
|             prop="SubjectVisitName"
 | ||
|             :label="$t('trials:linkedRP:table:expirationVisit')"
 | ||
|           />
 | ||
|           <!-- 最晚拍片日期 -->
 | ||
|           <el-table-column
 | ||
|             prop="LatestScanDate"
 | ||
|             :label="$t('trials:linkedRP:table:latestScanDate')"
 | ||
|           >
 | ||
|             <template slot-scope="scope">
 | ||
|               {{ scope.row.LatestScanDate?moment(scope.row.LatestScanDate).format('YYYY-MM-DD'):'' }}
 | ||
|             </template>
 | ||
|           </el-table-column>
 | ||
|           <!-- 截止日期 -->
 | ||
|           <el-table-column
 | ||
|             prop="ExpirationDate"
 | ||
|             :label="$t('trials:linkedRP:table:expirationDate')"
 | ||
|           >
 | ||
|             <template slot-scope="scope">
 | ||
|               {{ scope.row.ExpirationDate?moment(scope.row.ExpirationDate).format('YYYY-MM-DD'):'' }}
 | ||
|             </template>
 | ||
|           </el-table-column>
 | ||
|           <!-- 阅片期名称 -->
 | ||
|           <el-table-column
 | ||
|             prop="ReadingPeriodName"
 | ||
|             :label="$t('trials:linkedRP:table:readingName')"
 | ||
|           />
 | ||
|           <!-- 生效时间 -->
 | ||
|           <el-table-column
 | ||
|             prop="EffectOfTime"
 | ||
|             :label="$t('trials:linkedRP:table:effectiveTime')"
 | ||
|           />
 | ||
|         </el-table>
 | ||
|         <!-- 分页组件 -->
 | ||
|         <div style="text-align:right">
 | ||
|           <pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getReadingReriodList" />
 | ||
|         </div>
 | ||
| 
 | ||
|         <div style="text-align:right;padding-top: 10px;">
 | ||
|           <!-- 确认添加 -->
 | ||
|           <el-button size="small" type="primary" :disabled="selectArr.length === 0" @click="handleConfirm">
 | ||
|             {{ $t('trials:addRP:button:confirmAddPR') }}
 | ||
|           </el-button>
 | ||
|         </div>
 | ||
|       </el-card>
 | ||
|     </div>
 | ||
|   </div>
 | ||
| </template>
 | ||
| <script>
 | ||
| import { getTrialSiteSelect, addOrUpdateReadingPeriodSet, getReadingVisitList, getPreviewTheReadingList, getPreviewTheReadingPlanList } from '@/api/trials'
 | ||
| import Pagination from '@/components/Pagination'
 | ||
| import moment from 'moment'
 | ||
| const searchDataDefault = () => {
 | ||
|   return {
 | ||
|     PageIndex: 1,
 | ||
|     PageSize: 20
 | ||
|   }
 | ||
| }
 | ||
| export default {
 | ||
|   name: 'AddOrEditRP',
 | ||
|   components: { Pagination },
 | ||
|   props: {
 | ||
|     data: {
 | ||
|       type: Object,
 | ||
|       default() { return {} }
 | ||
|     }
 | ||
|   },
 | ||
|   data() {
 | ||
|     return {
 | ||
|       loading: false,
 | ||
|       btnLoading: false,
 | ||
|       visitPlanOptions: [],
 | ||
|       form: {
 | ||
|         Id: '',
 | ||
|         TrialId: '',
 | ||
|         ReadingSetType: null,
 | ||
|         ReadingSetTypeName: '',
 | ||
|         DeadlineCondition: 0,
 | ||
|         ReadingPeriodName: '',
 | ||
|         ReadingScope: null,
 | ||
|         SiteIds: [],
 | ||
|         VisitStageId: '',
 | ||
|         ExpirationDate: '',
 | ||
|         ExpirationVisitNum: null,
 | ||
|         PlanCount: 0
 | ||
|         // Remark: ''
 | ||
|       },
 | ||
|       rules: {
 | ||
|         ReadingPeriodName: [
 | ||
|           { required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' },
 | ||
|           { max: 50, message: `${this.$t('common:ruleMessage:maxLength')} 50` }
 | ||
|         ],
 | ||
|         ReadingScope: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur', 'change'] }],
 | ||
|         SiteIds: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur', 'change'] }],
 | ||
|         DeadlineCondition: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur', 'change'] }],
 | ||
|         ExpirationDate: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur', 'change'] }],
 | ||
|         VisitStageId: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur', 'change'] }]
 | ||
|         // Remark: [{ max: 500, message: `${this.$t('common:ruleMessage:maxLength')} 500` }]
 | ||
|       },
 | ||
|       siteOptions: [],
 | ||
|       trialId: '',
 | ||
|       listLoading: false,
 | ||
|       list: [],
 | ||
|       selectArr: [],
 | ||
|       searchData: searchDataDefault(),
 | ||
|       total: 0,
 | ||
|       moment
 | ||
|     }
 | ||
|   },
 | ||
|   mounted() {
 | ||
|     this.trialId = this.$route.query.trialId
 | ||
|     this.initForm()
 | ||
|   },
 | ||
|   methods: {
 | ||
|     async initForm() {
 | ||
|       this.loading = true
 | ||
|       await this.getSite()
 | ||
|       var param = {
 | ||
|         trialId: this.trialId,
 | ||
|         readingPeriodSetId: Object.keys(this.data).length > 0 ? this.data.Id : '',
 | ||
|         readingSetType: this.data.ReadingSetType
 | ||
|       }
 | ||
|       const { Result } = await getReadingVisitList(param)
 | ||
|       this.visitPlanOptions = Result
 | ||
|       if (Object.keys(this.data).length > 0) {
 | ||
|         for (const k in this.form) {
 | ||
|           if (this.data.hasOwnProperty(k)) {
 | ||
|             this.form[k] = this.data[k]
 | ||
|           }
 | ||
|         }
 | ||
|         this.form.ReadingSetTypeName = this.$fd('ReadingSetType', this.data.ReadingSetType)
 | ||
| 
 | ||
|         this.form.DeadlineCondition = this.data.SubjectVisitName ? 1 : 0
 | ||
|         if (this.form.Id) {
 | ||
|           this.getReadingPeriodCheckedResult()
 | ||
|         }
 | ||
|       }
 | ||
|       this.form.TrialId = this.trialId
 | ||
|       this.loading = false
 | ||
|     },
 | ||
|     getRPList() {
 | ||
|       this.$refs.addOrUpdatePR.validate(valid => {
 | ||
|         if (!valid) return
 | ||
|         this.btnLoading = true
 | ||
|         this.getReadingPeriodResult()
 | ||
|       })
 | ||
|     },
 | ||
|     getReadingReriodList() {
 | ||
|       if (this.form.Id === '') {
 | ||
|         this.getReadingPeriodResult()
 | ||
|       } else {
 | ||
|         this.getReadingPeriodCheckedResult()
 | ||
|       }
 | ||
|     },
 | ||
|     getReadingPeriodResult() {
 | ||
|       this.listLoading = true
 | ||
|       var param = {
 | ||
|         SiteIds: this.form.ReadingScope === 1 ? this.form.SiteIds : [],
 | ||
|         TrialId: this.form.TrialId,
 | ||
|         ExpirationDate: this.form.ExpirationDate,
 | ||
|         ExpirationVisitNum: this.form.ExpirationVisitNum,
 | ||
|         VisitStageId: this.form.VisitStageId,
 | ||
|         ReadingPeriodName: this.form.ReadingPeriodName,
 | ||
|         ReadingSetType: this.form.ReadingSetType,
 | ||
|         ReadingScope: this.form.ReadingScope
 | ||
|       }
 | ||
|       Object.assign(this.searchData, param)
 | ||
|       getPreviewTheReadingList(this.searchData).then(res => {
 | ||
|         this.list = res.Result.CurrentPageData
 | ||
|         this.total = res.Result.TotalCount
 | ||
|         this.listLoading = false
 | ||
|         this.btnLoading = false
 | ||
|       })
 | ||
|         .catch(() => {
 | ||
|           this.listLoading = false
 | ||
|           this.btnLoading = false
 | ||
|         })
 | ||
|     },
 | ||
|     getReadingPeriodCheckedResult() {
 | ||
|       this.listLoading = true
 | ||
|       this.searchData.ReadingPeriodSetId = this.form.Id
 | ||
|       getPreviewTheReadingPlanList(this.searchData).then(res => {
 | ||
|         this.list = res.Result.CurrentPageData
 | ||
|         this.total = res.Result.TotalCount
 | ||
|         this.listLoading = false
 | ||
|         this.$nextTick(() => {
 | ||
|           for (let i = 0; i < this.list.length; i++) {
 | ||
|             this.$refs['prList'].toggleRowSelection(this.list[i], true)
 | ||
|           }
 | ||
|         })
 | ||
|       }).catch(() => {
 | ||
|         this.listLoading = false
 | ||
|       })
 | ||
|     },
 | ||
|     // 获取勾选行数据
 | ||
|     handleSelectChange(val) {
 | ||
|       const arr = []
 | ||
|       for (let index = 0; index < val.length; index++) {
 | ||
|         arr.push(val[index].SubjectVisitId)
 | ||
|       }
 | ||
|       this.selectArr = arr
 | ||
|     },
 | ||
|     handleConfirm() {
 | ||
|       this.loading = true
 | ||
|       var params = Object.assign({}, this.form)
 | ||
|       params.subjectVisitIds = this.selectArr
 | ||
|       addOrUpdateReadingPeriodSet(params).then(res => {
 | ||
|         this.loading = false
 | ||
|         this.$emit('close')
 | ||
|         this.$emit('getList')
 | ||
|         this.$message.success(this.$t('common:message:savedSuccessfully'))
 | ||
|       }).catch(() => { this.loading = false })
 | ||
|     },
 | ||
|     handleVisitChange(val) {
 | ||
|       const selectArr = this.visitPlanOptions.filter(item => item.VisitStageId === val)
 | ||
|       if (selectArr.length > 0) {
 | ||
|         this.form.ExpirationVisitNum = selectArr[0].VisitNum
 | ||
|       } else {
 | ||
|         this.form.ExpirationVisitNum = null
 | ||
|       }
 | ||
|     },
 | ||
|     handleDeadlineCondition(val) {
 | ||
|       // 0:截止日期  1:截止访视
 | ||
|       if (val) {
 | ||
|         this.form.ExpirationDate = ''
 | ||
|       } else {
 | ||
|         this.form.VisitStageId = ''
 | ||
|         this.form.ExpirationVisitNum = null
 | ||
|       }
 | ||
|     },
 | ||
|     // 获取site下拉框数据
 | ||
|     getSite() {
 | ||
|       return new Promise((resolve, reject) => {
 | ||
|         getTrialSiteSelect(this.trialId).then(res => {
 | ||
|           this.siteOptions = res.Result
 | ||
|           resolve()
 | ||
|         }).catch(() => {
 | ||
|           this.loading = false
 | ||
|           reject()
 | ||
|         })
 | ||
|       })
 | ||
|     },
 | ||
|     close() {
 | ||
|       this.$emit('close')
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| </script>
 |