| | |
| | | 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 |
| | |
| | | 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) { |
| | |
| | | } |
| | | }); |
| | | //保存器官获取表数据 |
| | | // 2026-10-23:提交前按器官排队序号排序 |
| | | this.sortOrganRows(this.procureddata); |
| | | saveDonationwitnessorgan(this.procureddata).then(res => { |
| | | if (res && res.data && res.data.length === this.procureddata.length) { |
| | | res.data.forEach((row, i) => { |
| | |
| | | this.Processvalidation(); |
| | | }); |
| | | //保存器官获取表数据 |
| | | // 2026-10-23:提交前按器官排队序号排序 |
| | | this.sortOrganRows(this.procureddata); |
| | | saveDonationwitnessorgan(this.procureddata).then(res => { |
| | | if (res && res.data && res.data.length === this.procureddata.length) { |
| | | res.data.forEach((row, i) => { |
| | |
| | | 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 && res.data && res.data.length === this.transplantdata.length) { |
| | | res.data.forEach((row, i) => { |
| | |
| | | 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) => { |
| | |
| | | } |
| | | }, |
| | | |
| | | 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("该器官已经选择,请勿重复选择!"); |
| | |
| | | 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(16, 24, 40, 0.08); |
| | | border-right: 1px solid var(--opo-border-base, #e5e7eb); |
| | | transition: all 0.3s ease; |
| | | position: relative; |
| | | z-index: 100; |
| | |
| | | flex-direction: column; |
| | | |
| | | .title { |
| | | background: var(--opo-primary, #0e768f); |
| | | 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); |
| | | } |
| | | |