| | |
| | | <div class="left-course" :class="{ 'left-collapsed': isLeftCollapsed }"> |
| | | <div class="postfilx"> |
| | | <div class="title"> |
| | | 工作进程 |
| | | 案例进程 |
| | | <el-button |
| | | class="collapse-btn" |
| | | @click="toggleLeftCollapse" |
| | |
| | | size="small" |
| | | v-model="form.reporttime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择报告日期" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | v-model="form.birthday" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择出生日期" |
| | | > |
| | | </el-date-picker> |
| | |
| | | style="width: 190px" |
| | | v-model="form.contacttime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择报告时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | v-model="medicineform.hospitalassesstime" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择院级评估时间" |
| | | > |
| | | </el-date-picker> </el-form-item |
| | |
| | | size="small" |
| | | v-model="medicineform.provincialassesstime" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择省级评估时间" |
| | | > |
| | | </el-date-picker> </el-form-item></el-col |
| | |
| | | size="small" |
| | | v-model="medicineform.coreteamassesstime" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="评估时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | v-model="ethicform.conclusiontime" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择结论时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | style="width: 100%" |
| | | v-model="scope.row.applicanttime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择分配接收时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.deathtime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择死亡时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.operationbegtime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择手术开始时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.operationendtime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择手术结束时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.coordinatorInOperating" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择手术开始时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.coordinatorOutOperating" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择手术结束时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.coordinatorSignTime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择手术结束时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.abdominalaortacannulatime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择腹主动脉插管时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.abdominalaortaperfusiontime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择腹主动脉灌注时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.portalveincannulatime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择门静脉脉插管时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.portalveinperfusiontime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择门静脉灌注时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.pulmonaryarterycannulatime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择门静脉插管时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.pulmonaryarteryperfusiontime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择门静脉灌注时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.aortacannulatime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择主动脉插管时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | v-model="witnessform.aortaperfusiontime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择主动脉灌注时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | style="width: 100%" |
| | | v-model="scope.row.organStartTime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="请输入获取开始时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | style="width: 100%" |
| | | v-model="scope.row.organgettime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="请输入器官离体时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | v-model="accomplishform.completetime" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择完成时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | this.isLeftCollapsed = !this.isLeftCollapsed; |
| | | }, |
| | | /** 保存主表按钮 */ |
| | | submitForm() { |
| | | submitForm(fromProcess) { |
| | | // 保存防重:非"流程推进"触发的保存,2 秒内的重复点击直接忽略(防止重复插入) |
| | | if (!fromProcess && !this.canSave()) { |
| | | this.$modal.msgWarning("请勿重复提交"); |
| | | return; |
| | | } |
| | | this.$refs["form"].validate(valid => { |
| | | console.log("提交的数据们:", this.form); |
| | | if (valid) { |
| | |
| | | "YYYY-MM-DD HH:mm:ss" |
| | | ); |
| | | |
| | | this.form.diseasetype = this.form.diseasetype.join(","); |
| | | |
| | | this.form.infectious = this.form.infectious.join(","); |
| | | this.form.selfwill = this.form.selfwill.join(","); |
| | | this.form.othercases = this.form.othercases.join(","); |
| | | this.form.infosources = this.form.infosources.join(","); |
| | | this.form.kinship = this.form.kinship.join(","); |
| | | this.form.patientstate = this.form.patientstate.join(","); |
| | | // 多选字段转字符串:幂等处理(已是字符串时保持原样), |
| | | // 避免"保存成功后未重新加载再次保存"时抛 join is not a function |
| | | [ |
| | | "diseasetype", |
| | | "infectious", |
| | | "selfwill", |
| | | "othercases", |
| | | "infosources", |
| | | "kinship", |
| | | "patientstate" |
| | | ].forEach(key => { |
| | | if (Array.isArray(this.form[key])) { |
| | | this.form[key] = this.form[key].join(","); |
| | | } |
| | | }); |
| | | this.form.registerprovince = this.$refs.registerSelect.getSheng(); |
| | | this.form.registerprovincename = this.registerAddresss.sheng; |
| | | |
| | |
| | | }, |
| | | // 保存二级表按钮 |
| | | Savethedetails() { |
| | | // 保存防重:2 秒内的重复点击直接忽略(防止重复插入) |
| | | if (!this.canSave()) { |
| | | this.$modal.msgWarning("请勿重复提交"); |
| | | return; |
| | | } |
| | | console.log(this.actives); |
| | | if (this.actives == 1) { |
| | | this.medicineform.infoid = this.infoid; |
| | |
| | | updateMedicalevaluation(this.medicineform).then(response => { |
| | | this.$modal.msgSuccess("医学评估信息修改成功"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } else { |
| | | addMedicalevaluation(this.medicineform).then(response => { |
| | | // 回填主键:否则下次保存仍走"新增",会产生重复行 |
| | | if (response && response.data && response.data.id) { |
| | | this.medicineform.id = response.data.id; |
| | | } |
| | | this.$modal.msgSuccess("医学评估信息新增成功"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } |
| | | this.Processvalidation(); |
| | | } |
| | | }); |
| | | } else if (this.actives == 2) { |
| | |
| | | updateRelativesconfirmation(this.affirmform).then(response => { |
| | | this.$modal.msgSuccess("捐献确认信息修改成功"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } else { |
| | | this.affirmform.residenceprovincename = this.defultAddresss.sheng; |
| | | this.affirmform.residencecityname = this.defultAddresss.shi; |
| | | this.affirmform.residencetownname = this.defultAddresss.qu; |
| | | addRelativesconfirmation(this.affirmform).then(response => { |
| | | // 回填主键:否则下次保存仍走"新增",会产生重复行 |
| | | if (response && response.data && response.data.id) { |
| | | this.affirmform.id = response.data.id; |
| | | } |
| | | this.$modal.msgSuccess("捐献确认信息新增成功"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } |
| | | this.Processvalidation(); |
| | | } |
| | | }); |
| | | } else if (this.actives == 3) { |
| | |
| | | updateEthicalreviewopinions(this.ethicform).then(res => { |
| | | this.$modal.msgSuccess("伦理审查信息修改成功"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } else { |
| | | //addDonateflowchart(this.ethicform).then(response => { |
| | | addEthicalreviewopinions(this.ethicform).then(res => { |
| | | // 回填主键:否则下次保存仍走"新增",会产生重复行 |
| | | if (res && res.data && res.data.id) { |
| | | this.ethicform.id = res.data.id; |
| | | } |
| | | this.$modal.msgSuccess("伦理审查信息新增成功"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } |
| | | this.Processvalidation(); |
| | | } |
| | | }); |
| | | } else if (this.actives == 4) { |
| | |
| | | } |
| | | }); |
| | | saveDonateorgan(this.allocateddata).then(res => { |
| | | // 回填主键:后端已按"同一案例同一器官"做 upsert,回填后前端不会再误判为新增 |
| | | if (res && res.data && res.data.length === this.allocateddata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.allocateddata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("器官捐献分配信息保存成功!"); |
| | | this.$modal.closeLoading(); |
| | |
| | | }); |
| | | //保存器官获取表数据 |
| | | saveDonationwitnessorgan(this.procureddata).then(res => { |
| | | if (res == 200) { |
| | | if (res && res.data && res.data.length === this.procureddata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.procureddata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("捐献器官获取信息保存成功!"); |
| | | } |
| | | this.$modal.closeLoading(); |
| | |
| | | } else { |
| | | addDonationwitness(this.witnessform).then(response => { |
| | | if (response.code === 200) { |
| | | // 回填主键:否则下次保存仍走"新增" |
| | | if (response.data && response.data.id) { |
| | | this.witnessform.id = response.data.id; |
| | | } |
| | | this.$modal.msgSuccess("获取见证信息新增成功"); |
| | | this.form.donationcategory = this.witnessform.donationcategory; |
| | | let data = JSON.parse(JSON.stringify(this.form)); |
| | |
| | | }); |
| | | //保存器官获取表数据 |
| | | saveDonationwitnessorgan(this.procureddata).then(res => { |
| | | if (res == 200) { |
| | | if (res && res.data && res.data.length === this.procureddata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.procureddata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("捐献器官获取信息保存成功!"); |
| | | } |
| | | this.$modal.closeLoading(); |
| | |
| | | updateDonatecompletioninfo(this.accomplishform).then(response => { |
| | | this.$modal.msgSuccess("完成登记信息修改成功"); |
| | | saveDonatecomporgan(this.transplantdata).then(res => { |
| | | if (res == 200) { |
| | | if (res && res.data && res.data.length === this.transplantdata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.transplantdata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("捐献器官登记信息保存成功!"); |
| | | } else { |
| | | this.$modal.msgSuccess(res.msg); |
| | |
| | | }); |
| | | } else { |
| | | addDonatecompletioninfo(this.accomplishform).then(response => { |
| | | // 回填主键:否则下次保存仍走"新增" |
| | | if (response && response.data && response.data.id) { |
| | | this.accomplishform.id = response.data.id; |
| | | } |
| | | this.$modal.msgSuccess("完成登记成功"); |
| | | saveDonatecomporgan(this.transplantdata).then(res => { |
| | | if (res && res.data && res.data.length === this.transplantdata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.transplantdata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("捐献器官登记信息保存成功!"); |
| | | } else { |
| | |
| | | console.log("已到达最大值"); |
| | | } |
| | | }, |
| | | // 保存防重:2 秒内重复点击视为重复提交 |
| | | canSave() { |
| | | const now = Date.now(); |
| | | if (this.saveLockAt && now - this.saveLockAt < 2000) { |
| | | return false; |
| | | } |
| | | this.saveLockAt = now; |
| | | return true; |
| | | }, |
| | | // 更改进程效验 |
| | | Processvalidation() { |
| | | if (this.form.workflow + 1 == this.actives) { |
| | |
| | | this.form.workflow++; |
| | | } else { |
| | | } |
| | | this.submitForm(); |
| | | // this.GetAttacheddata(); |
| | | // 由"保存二级表"触发的保存,不参与防重(否则会被 canSave 拦掉) |
| | | this.submitForm(true); |
| | | } else if (this.form.workflow > this.actives) { |
| | | this.submitForm(); |
| | | // Modifydonationattachment(this.donatelist).then(res => {}); |
| | | // this.GetAttacheddata(); |
| | | this.submitForm(true); |
| | | } else { |
| | | this.submitForm(); |
| | | // this.$modal.msgWarning("请先完成前部步骤"); |
| | | this.submitForm(true); |
| | | return; |
| | | } |
| | | }, |
| | |
| | | <style lang="scss" scoped> |
| | | .particularsdiv { |
| | | display: flex; |
| | | background-color: #f5f7fa; |
| | | background-color: var(--opo-bg-page, #f5f7fa); |
| | | height: 100vh; |
| | | overflow: hidden; |
| | | transition: all 0.3s ease; |
| | | |
| | | // 左侧工作进程栏 |
| | | // 左侧工作进程栏(2026-10-22:去掉底色,只留一条分隔线;标题文字改品牌青) |
| | | .left-course { |
| | | background: #fff; |
| | | background: transparent; |
| | | width: 220px; |
| | | min-width: 220px; |
| | | text-align: center; |
| | | margin: 0; |
| | | padding: 0; |
| | | height: 100%; |
| | | box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1); |
| | | border-right: 1px solid var(--opo-border-base, #e5e7eb); |
| | | transition: all 0.3s ease; |
| | | position: relative; |
| | | z-index: 100; |
| | |
| | | flex-direction: column; |
| | | |
| | | .title { |
| | | background: #22a2c3; |
| | | background: transparent; |
| | | margin-bottom: 0; |
| | | padding: 15px 10px; |
| | | color: #fff; |
| | | color: var(--opo-primary, #0e768f); |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | display: flex; |
| | |
| | | transition: all 0.3s ease; |
| | | min-height: 54px; // 确保标题区域有固定高度 |
| | | box-sizing: border-box; |
| | | border-bottom: 1px solid var(--opo-border-base, #e5e7eb); |
| | | |
| | | .collapse-btn { |
| | | background: rgba(255, 255, 255, 0.2); |
| | | border: none; |
| | | color: #fff; |
| | | // 标题底色去掉后,按钮改为浅青描边风格,避免白底白字看不见 |
| | | background: var(--opo-primary-light-9, #e7f1f4); |
| | | border: 1px solid var(--opo-primary-light-7, #b7d6dd); |
| | | color: var(--opo-primary, #0e768f); |
| | | width: 32px; // 稍微增大确保可点击区域 |
| | | height: 32px; |
| | | padding: 0; |
| | |
| | | flex-shrink: 0; // 防止按钮被压缩 |
| | | |
| | | &:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | background: var(--opo-primary-light-7, #b7d6dd); |
| | | border-color: var(--opo-primary, #0e768f); |
| | | transform: scale(1.1); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | // 步骤样式优化 |
| | | // 步骤样式优化(配色统一到系统品牌色:teal #0E768F) |
| | | ::v-deep .el-steps { |
| | | &.el-steps--vertical { |
| | | height: 100%; |
| | |
| | | |
| | | .el-step__head { |
| | | &.is-finish { |
| | | color: #22a2c3; |
| | | border-color: #22a2c3; |
| | | color: var(--opo-primary, #0e768f); |
| | | border-color: var(--opo-primary, #0e768f); |
| | | } |
| | | } |
| | | |
| | | .el-step__title { |
| | | font-size: 14px; |
| | | font-size: var(--opo-font-size-sm); |
| | | font-weight: 600; |
| | | |
| | | &.is-finish { |
| | | color: #22a2c3; |
| | | color: var(--opo-primary, #0e768f); |
| | | } |
| | | } |
| | | |
| | | .el-step__description { |
| | | font-size: 12px; |
| | | color: #666; |
| | | font-size: var(--opo-font-size-xs); |
| | | // 描述文字统一用中性灰,避免整块面板被品牌色淹没 |
| | | color: var(--opo-text-secondary, #6b7280); |
| | | line-height: 1.5; |
| | | |
| | | &.is-finish { |
| | | color: #22a2c3; |
| | | color: var(--opo-text-regular, #4b5563); |
| | | } |
| | | |
| | | p { |