| | |
| | | <div class="left-course" :class="{ 'left-collapsed': isLeftCollapsed }"> |
| | | <div class="postfilx"> |
| | | <div class="title"> |
| | | 工作进程 |
| | | 案例进程 |
| | | <el-button |
| | | class="collapse-btn" |
| | | @click="toggleLeftCollapse" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.reporttime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择报告日期" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.birthday" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择出生日期" |
| | | > |
| | |
| | | size="small" |
| | | style="width: 190px" |
| | | v-model="form.contacttime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择报告时间" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="medicineform.hospitalassesstime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择院级评估时间" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="medicineform.provincialassesstime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择省级评估时间" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="medicineform.coreteamassesstime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="评估时间" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="ethicform.conclusiontime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择结论时间" |
| | | > |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.applicanttime" |
| | | type="datetime" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | type="datetime" 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" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择主动脉插管时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.aortaperfusiontime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择主动脉灌注时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.organStartTime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="请输入获取开始时间" |
| | | > |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.organgettime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="请输入器官离体时间" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="accomplishform.completetime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择完成时间" |
| | | > |
| | | </el-date-picker> |
| | |
| | | contacttime: "", |
| | | reporttime: "" |
| | | }, |
| | | organOrder: [ |
| | | "肝脏", |
| | | "左肾", |
| | | "右肾", |
| | | "心脏", |
| | | "左肺", |
| | | "右肺", |
| | | "胰腺", |
| | | "小肠", |
| | | "左眼角膜", |
| | | "右眼角膜" |
| | | ], // 指定的器官顺序 |
| | | isSorting: false, // 标志位,表示是否正在排序 |
| | | tableKey: 0, |
| | | istb: false, |
| | |
| | | // 监听 procureddata 的变化,数据更新后重新排序 |
| | | procureddata: { |
| | | handler(newVal) { |
| | | if (this.procureddata[0].organgettime) { |
| | | // 判空:取消最后一个器官时数组会变成空,直接取 [0] 会抛 TypeError |
| | | if (this.procureddata[0] && this.procureddata[0].organgettime) { |
| | | this.organgettimetrue = true; |
| | | } |
| | | if (this.isSorting) { |
| | |
| | | listDonateorgan(searchParam).then(res => { |
| | | if (res.code == 200) { |
| | | if (res.rows[0]) { |
| | | this.allocateddata = res.rows; |
| | | // 2026-10-23:按器官排队序号排序后再渲染 |
| | | this.allocateddata = this.sortOrganRows(res.rows); |
| | | console.log("this.allocateddata", this.allocateddata); |
| | | this.allocateddataform.allocateddata = this.allocateddata; |
| | | } |
| | |
| | | }); |
| | | // this.procureddata.infoid = this.infoid; |
| | | } |
| | | // 2026-10-23:按器官排队序号排序后再渲染 |
| | | this.procureddata = this.sortOrganRows(this.procureddata); |
| | | this.organList.organprocured = []; |
| | | for (let i = 0; i < this.procureddata.length; i++) { |
| | | this.organList.organprocured.push(this.procureddata[i].organno); |
| | |
| | | |
| | | this.transplantdata.infoid = this.infoid; |
| | | } |
| | | // 2026-10-23:按器官排队序号排序后再渲染 |
| | | this.transplantdata = this.sortOrganRows(this.transplantdata); |
| | | for (let i = 0; i < this.transplantdata.length; i++) { |
| | | this.organList.organtransplant.push( |
| | | this.transplantdata[i].organno |
| | |
| | | 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) { |
| | |
| | | item.transplanthospitalname = objs.organizationname; |
| | | } |
| | | }); |
| | | // 2026-10-23:提交前按器官排队序号排序,保证入库顺序与展示一致 |
| | | this.sortOrganRows(this.allocateddata); |
| | | 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(); |
| | |
| | | } |
| | | }); |
| | | //保存器官获取表数据 |
| | | // 2026-10-23:提交前按器官排队序号排序 |
| | | this.sortOrganRows(this.procureddata); |
| | | 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)); |
| | |
| | | this.Processvalidation(); |
| | | }); |
| | | //保存器官获取表数据 |
| | | // 2026-10-23:提交前按器官排队序号排序 |
| | | this.sortOrganRows(this.procureddata); |
| | | 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(); |
| | |
| | | if (this.accomplishform.id) { |
| | | updateDonatecompletioninfo(this.accomplishform).then(response => { |
| | | this.$modal.msgSuccess("完成登记信息修改成功"); |
| | | // 2026-10-23:提交前按器官排队序号排序 |
| | | this.sortOrganRows(this.transplantdata); |
| | | 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("完成登记成功"); |
| | | // 2026-10-23:提交前按器官排队序号排序 |
| | | this.sortOrganRows(this.transplantdata); |
| | | 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 { |
| | |
| | | } |
| | | }, |
| | | |
| | | customOrganSort() { |
| | | console.log("调用"); |
| | | /** |
| | | * 取器官的排队序号:字典 sys_Organ 的 dict_sort 原值 |
| | | * 字典里没有该器官时返回 null(排序时排最后) |
| | | */ |
| | | getOrganSort(organno) { |
| | | const list = |
| | | (this.dict && this.dict.type && this.dict.type.sys_Organ) || []; |
| | | const item = list.find(d => d.value === organno); |
| | | if (item && item.raw) { |
| | | const s = item.raw.dictSort; |
| | | if (s !== null && s !== undefined && s !== "") { |
| | | return Number(s); |
| | | } |
| | | } |
| | | return null; |
| | | }, |
| | | |
| | | /** |
| | | * 按器官排队序号升序排序(原地) |
| | | * sort 为空/0 视为未知,排最后;相同序号按 id 兜底,保证顺序稳定 |
| | | */ |
| | | sortOrganRows(rows) { |
| | | if (!rows || !rows.length) { |
| | | return rows; |
| | | } |
| | | const weight = r => { |
| | | const s = Number(r.sort); |
| | | if (r.sort === null || r.sort === undefined || isNaN(s) || s === 0) { |
| | | return 999999; |
| | | } |
| | | return s; |
| | | }; |
| | | rows.sort((a, b) => weight(a) - weight(b) || (a.id || 0) - (b.id || 0)); |
| | | return rows; |
| | | }, |
| | | |
| | | customOrganSort() { |
| | | // 1. 加锁,阻止监听器执行 |
| | | this.isSorting = true; |
| | | this.loading = true; |
| | | // 自定义排序函数 |
| | | this.procureddata.sort((a, b) => { |
| | | const indexA = this.organOrder.indexOf(a.organname); |
| | | const indexB = this.organOrder.indexOf(b.organname); |
| | | |
| | | // 如果两个都在列表中,按列表中的顺序排序 |
| | | if (indexA !== -1 && indexB !== -1) { |
| | | return indexA - indexB; |
| | | } |
| | | // 如果 a 在列表中,b 不在,a 排前面 |
| | | if (indexA !== -1) { |
| | | return -1; |
| | | } |
| | | // 如果 b 在列表中,a 不在,b 排前面 |
| | | if (indexB !== -1) { |
| | | return 1; |
| | | } |
| | | // 两个都不在列表中,保持原顺序(或按其他规则,比如按字母排序,这里按原始顺序) |
| | | return 0; |
| | | }); |
| | | console.log(this.procureddata, "顺序"); |
| | | this.sortOrganRows(this.procureddata); |
| | | this.tableKey += 1; // 改变 key 迫使表格重新渲染 |
| | | // 你可以使用 this.$forceUpdate() 或者重新赋值数组来触发更新 |
| | | this.procureddata = [...this.procureddata]; |
| | | this.$nextTick(() => { |
| | | this.isSorting = false; |
| | |
| | | }); |
| | | }, |
| | | allocateddataSort() { |
| | | console.log("调用"); |
| | | |
| | | // 1. 加锁,阻止监听器执行 |
| | | this.isSorting = true; |
| | | // 自定义排序函数 |
| | | this.allocateddata.sort((a, b) => { |
| | | const indexA = this.organOrder.indexOf(a.organname); |
| | | const indexB = this.organOrder.indexOf(b.organname); |
| | | |
| | | // 如果两个都在列表中,按列表中的顺序排序 |
| | | if (indexA !== -1 && indexB !== -1) { |
| | | return indexA - indexB; |
| | | } |
| | | // 如果 a 在列表中,b 不在,a 排前面 |
| | | if (indexA !== -1) { |
| | | return -1; |
| | | } |
| | | // 如果 b 在列表中,a 不在,b 排前面 |
| | | if (indexB !== -1) { |
| | | return 1; |
| | | } |
| | | // 两个都不在列表中,保持原顺序(或按其他规则,比如按字母排序,这里按原始顺序) |
| | | return 0; |
| | | }); |
| | | console.log(this.allocateddata, "顺序"); |
| | | this.sortOrganRows(this.allocateddata); |
| | | this.tableKey += 1; // 改变 key 迫使表格重新渲染 |
| | | // 你可以使用 this.$forceUpdate() 或者重新赋值数组来触发更新 |
| | | this.allocateddata = [...this.allocateddata]; |
| | | this.$nextTick(() => { |
| | | this.isSorting = false; |
| | |
| | | this.allocateddata.push({ |
| | | organname: temporganname, |
| | | organno: value, |
| | | // 2026-10-23:写入器官排队序号(字典 dict_sort) |
| | | sort: this.getOrganSort(value), |
| | | id: null, |
| | | infoid: this.infoid, |
| | | donorno: this.form.donorno, |
| | |
| | | this.procureddata.push({ |
| | | organname: temporganname, |
| | | organno: value, |
| | | // 2026-10-23:写入器官排队序号(字典 dict_sort) |
| | | sort: this.getOrganSort(value), |
| | | id: null, |
| | | infoid: this.infoid, |
| | | donorno: this.form.donorno, |
| | |
| | | this.transplantdata.push({ |
| | | organname: temporganname, |
| | | organno: value, |
| | | // 2026-10-23:写入器官排队序号(字典 dict_sort) |
| | | sort: this.getOrganSort(value), |
| | | id: null, |
| | | infoid: this.infoid, |
| | | donorno: this.form.donorno, |
| | | organstate: 1, |
| | | transplantstate: 1 |
| | | }); |
| | | // 2026-10-23:完成登记原先没有 watch,新增器官会停在表格最后; |
| | | // 这里立即按排队序号归位(原地排序后必须重新赋值,否则表格不重渲染) |
| | | this.transplantdata = this.sortOrganRows([...this.transplantdata]); |
| | | } |
| | | } else { |
| | | this.$modal.msgWarning("该器官已经选择,请勿重复选择!"); |
| | |
| | | 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 { |