From 25fa11b9cc57433172bb2ac0b76b902c495bd1f5 Mon Sep 17 00:00:00 2001 From: Cheng Zhou Date: Wed, 17 Dec 2025 12:46:58 +0800 Subject: [PATCH] =?UTF-8?q?Step=20F8=EF=BC=9A=E8=8D=AF=E5=93=81=E7=AE=A1?= =?UTF-8?q?=E7=90=86=EF=BC=88IMP=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/axios.ts | 11 ++ frontend/src/api/impBatches.ts | 34 ++++ frontend/src/api/impInventory.ts | 16 ++ frontend/src/api/impProducts.ts | 34 ++++ frontend/src/api/impTransactions.ts | 30 ++++ frontend/src/components/ImpBatchForm.vue | 118 ++++++++++++++ frontend/src/components/ImpProductForm.vue | 106 ++++++++++++ .../src/components/ImpTransactionForm.vue | 104 ++++++++++++ frontend/src/components/Layout.vue | 11 +- frontend/src/components/QuickActions.vue | 2 +- frontend/src/router/index.ts | 28 ++++ frontend/src/views/Imp.vue | 22 ++- frontend/src/views/ImpBatches.vue | 153 ++++++++++++++++++ frontend/src/views/ImpInventory.vue | 94 +++++++++++ frontend/src/views/ImpProducts.vue | 86 ++++++++++ frontend/src/views/ImpTransactions.vue | 144 +++++++++++++++++ pg_data/base/16384/24576 | Bin 8192 -> 8192 bytes pg_data/base/16384/24584 | Bin 8192 -> 8192 bytes pg_data/base/16384/24618 | Bin 8192 -> 8192 bytes pg_data/base/16384/24653 | Bin 8192 -> 8192 bytes pg_data/base/16384/24659 | Bin 16384 -> 16384 bytes pg_data/base/16384/24710 | Bin 8192 -> 8192 bytes pg_data/base/16384/24717 | Bin 16384 -> 16384 bytes pg_data/base/16384/24719 | Bin 16384 -> 16384 bytes pg_data/base/16384/24726 | Bin 16384 -> 16384 bytes pg_data/base/16384/24774 | Bin 8192 -> 8192 bytes pg_data/base/16384/24797 | Bin 8192 -> 8192 bytes pg_data/base/16384/24802 | Bin 16384 -> 16384 bytes pg_data/base/16384/24804 | Bin 16384 -> 16384 bytes pg_data/base/16384/24816 | Bin 16384 -> 16384 bytes pg_data/base/16384/24817 | Bin 16384 -> 16384 bytes pg_data/base/16384/24844 | Bin 8192 -> 8192 bytes pg_data/base/16384/25004 | Bin 8192 -> 8192 bytes pg_data/base/16384/25008 | Bin 16384 -> 16384 bytes pg_data/base/16384/25010 | Bin 16384 -> 16384 bytes pg_data/base/16384/25027 | Bin 16384 -> 16384 bytes pg_data/base/16384/25028 | Bin 16384 -> 16384 bytes pg_data/base/16384/25029 | Bin 16384 -> 16384 bytes pg_data/base/16384/25030 | Bin 8192 -> 8192 bytes pg_data/base/16384/25036 | Bin 16384 -> 16384 bytes pg_data/base/16384/25063 | Bin 16384 -> 16384 bytes pg_data/base/16384/25064 | Bin 16384 -> 16384 bytes pg_data/base/16384/25065 | Bin 16384 -> 16384 bytes pg_data/base/16384/2604 | Bin 8192 -> 8192 bytes pg_data/base/16384/2619 | Bin 196608 -> 196608 bytes pg_data/global/pg_control | Bin 8192 -> 8192 bytes pg_data/pg_subtrans/0000 | Bin 8192 -> 8192 bytes pg_data/pg_wal/000000010000000000000001 | Bin 16777216 -> 16777216 bytes pg_data/pg_xact/0000 | Bin 8192 -> 8192 bytes 49 files changed, 989 insertions(+), 4 deletions(-) create mode 100644 frontend/src/api/impBatches.ts create mode 100644 frontend/src/api/impInventory.ts create mode 100644 frontend/src/api/impProducts.ts create mode 100644 frontend/src/api/impTransactions.ts create mode 100644 frontend/src/components/ImpBatchForm.vue create mode 100644 frontend/src/components/ImpProductForm.vue create mode 100644 frontend/src/components/ImpTransactionForm.vue create mode 100644 frontend/src/views/ImpBatches.vue create mode 100644 frontend/src/views/ImpInventory.vue create mode 100644 frontend/src/views/ImpProducts.vue create mode 100644 frontend/src/views/ImpTransactions.vue diff --git a/frontend/src/api/axios.ts b/frontend/src/api/axios.ts index d4a99937..5cf7fe7a 100644 --- a/frontend/src/api/axios.ts +++ b/frontend/src/api/axios.ts @@ -3,6 +3,7 @@ import { ElMessage } from "element-plus"; import router from "../router"; import { getToken, clearToken } from "../utils/auth"; import type { ApiError } from "../types/api"; +import { useStudyStore } from "../store/study"; const instance: AxiosInstance = axios.create({ baseURL: "/", @@ -23,6 +24,16 @@ instance.interceptors.response.use( async (error: AxiosError) => { const status = error.response?.status; const data = error.response?.data; + // 如果当前项目不存在或已失效,清理项目并跳到项目列表 + if (status === 404 && typeof data?.message === "string" && data.message.toLowerCase().includes("study")) { + try { + const studyStore = useStudyStore(); + studyStore.clearCurrentStudy(); + } catch { + /* ignore */ + } + router.push("/studies"); + } if (status === 401) { clearToken(); ElMessage.error(data?.message || "登录已过期,请重新登录"); diff --git a/frontend/src/api/impBatches.ts b/frontend/src/api/impBatches.ts new file mode 100644 index 00000000..3e7034cc --- /dev/null +++ b/frontend/src/api/impBatches.ts @@ -0,0 +1,34 @@ +import { apiGet, apiPatch, apiPost } from "./axios"; +import type { AxiosResponse } from "axios"; +import type { ApiListResponse } from "../types/api"; + +export interface ImpBatch { + id: string; + study_id: string; + product_id: string; + batch_no: string; + expiry_date?: string | null; + manufacture_date?: string | null; + status: string; + created_at: string; + updated_at: string; +} + +export const fetchImpBatches = ( + studyId: string, + params?: Record +): Promise>> => + apiGet(`/api/v1/studies/${studyId}/imp/batches/`, { params }); + +export const createImpBatch = ( + studyId: string, + payload: Record +): Promise> => + apiPost(`/api/v1/studies/${studyId}/imp/batches/`, payload); + +export const updateImpBatch = ( + studyId: string, + batchId: string, + payload: Record +): Promise> => + apiPatch(`/api/v1/studies/${studyId}/imp/batches/${batchId}`, payload); diff --git a/frontend/src/api/impInventory.ts b/frontend/src/api/impInventory.ts new file mode 100644 index 00000000..1b3a7f85 --- /dev/null +++ b/frontend/src/api/impInventory.ts @@ -0,0 +1,16 @@ +import { apiGet } from "./axios"; +import type { AxiosResponse } from "axios"; +import type { ApiListResponse } from "../types/api"; + +export interface ImpInventoryRow { + site_id: string; + batch_id: string; + quantity_on_hand: number; + updated_at: string; +} + +export const fetchImpInventory = ( + studyId: string, + params?: Record +): Promise>> => + apiGet(`/api/v1/studies/${studyId}/imp/inventory/`, { params }); diff --git a/frontend/src/api/impProducts.ts b/frontend/src/api/impProducts.ts new file mode 100644 index 00000000..c5e6b1f5 --- /dev/null +++ b/frontend/src/api/impProducts.ts @@ -0,0 +1,34 @@ +import { apiGet, apiPatch, apiPost } from "./axios"; +import type { AxiosResponse } from "axios"; +import type { ApiListResponse } from "../types/api"; + +export interface ImpProduct { + id: string; + study_id: string; + name: string; + form?: string | null; + strength?: string | null; + unit: string; + description?: string | null; + is_active: boolean; + created_at: string; + updated_at: string; +} + +export const fetchImpProducts = ( + studyId: string +): Promise>> => + apiGet(`/api/v1/studies/${studyId}/imp/products/`); + +export const createImpProduct = ( + studyId: string, + payload: Record +): Promise> => + apiPost(`/api/v1/studies/${studyId}/imp/products/`, payload); + +export const updateImpProduct = ( + studyId: string, + productId: string, + payload: Record +): Promise> => + apiPatch(`/api/v1/studies/${studyId}/imp/products/${productId}`, payload); diff --git a/frontend/src/api/impTransactions.ts b/frontend/src/api/impTransactions.ts new file mode 100644 index 00000000..af351c28 --- /dev/null +++ b/frontend/src/api/impTransactions.ts @@ -0,0 +1,30 @@ +import { apiGet, apiPost } from "./axios"; +import type { AxiosResponse } from "axios"; +import type { ApiListResponse } from "../types/api"; + +export interface ImpTransaction { + id: string; + study_id: string; + site_id: string; + batch_id: string; + subject_id?: string | null; + tx_type: string; + quantity: number; + tx_date: string; + reference?: string | null; + notes?: string | null; + created_by: string; + created_at: string; +} + +export const fetchImpTransactions = ( + studyId: string, + params?: Record +): Promise>> => + apiGet(`/api/v1/studies/${studyId}/imp/transactions/`, { params }); + +export const createImpTransaction = ( + studyId: string, + payload: Record +): Promise> => + apiPost(`/api/v1/studies/${studyId}/imp/transactions/`, payload); diff --git a/frontend/src/components/ImpBatchForm.vue b/frontend/src/components/ImpBatchForm.vue new file mode 100644 index 00000000..988263fc --- /dev/null +++ b/frontend/src/components/ImpBatchForm.vue @@ -0,0 +1,118 @@ + + + diff --git a/frontend/src/components/ImpProductForm.vue b/frontend/src/components/ImpProductForm.vue new file mode 100644 index 00000000..4532631c --- /dev/null +++ b/frontend/src/components/ImpProductForm.vue @@ -0,0 +1,106 @@ + + + diff --git a/frontend/src/components/ImpTransactionForm.vue b/frontend/src/components/ImpTransactionForm.vue new file mode 100644 index 00000000..612be9bd --- /dev/null +++ b/frontend/src/components/ImpTransactionForm.vue @@ -0,0 +1,104 @@ + + + diff --git a/frontend/src/components/Layout.vue b/frontend/src/components/Layout.vue index f01a9940..66ff43b6 100644 --- a/frontend/src/components/Layout.vue +++ b/frontend/src/components/Layout.vue @@ -24,6 +24,15 @@ 风险/问题 数据问题 SDV/SDR + + + 库存 + 产品 + 批次 + 交易台账 + + 费用 + FAQ @@ -46,7 +55,7 @@ const router = useRouter(); const onLogout = () => { auth.logout(); study.clearCurrentStudy(); - router.push("/login"); + router.replace("/login"); }; diff --git a/frontend/src/components/QuickActions.vue b/frontend/src/components/QuickActions.vue index c6080ce8..1f33d178 100644 --- a/frontend/src/components/QuickActions.vue +++ b/frontend/src/components/QuickActions.vue @@ -18,7 +18,7 @@ const actions = [ { label: "受试者", path: "/study/subjects" }, { label: "AE", path: "/study/aes" }, { label: "数据问题", path: "/study/data-queries" }, - { label: "药品", path: "/study/imp" }, + { label: "药品", path: "/study/imp/inventory" }, { label: "费用", path: "/study/finance" }, { label: "FAQ", path: "/study/faq" }, ]; diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index d5973f69..47f7dbe9 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -15,6 +15,10 @@ import AeDetail from "../views/AeDetail.vue"; import DataQueries from "../views/DataQueries.vue"; import DataQueryDetail from "../views/DataQueryDetail.vue"; import Imp from "../views/Imp.vue"; +import ImpProducts from "../views/ImpProducts.vue"; +import ImpBatches from "../views/ImpBatches.vue"; +import ImpInventory from "../views/ImpInventory.vue"; +import ImpTransactions from "../views/ImpTransactions.vue"; import Finance from "../views/Finance.vue"; import Faq from "../views/Faq.vue"; import Issues from "../views/Issues.vue"; @@ -111,6 +115,30 @@ const routes: RouteRecordRaw[] = [ component: Imp, meta: { title: "药品", requiresStudy: true }, }, + { + path: "study/imp/products", + name: "StudyImpProducts", + component: ImpProducts, + meta: { title: "IMP 产品", requiresStudy: true }, + }, + { + path: "study/imp/batches", + name: "StudyImpBatches", + component: ImpBatches, + meta: { title: "IMP 批次", requiresStudy: true }, + }, + { + path: "study/imp/inventory", + name: "StudyImpInventory", + component: ImpInventory, + meta: { title: "IMP 库存", requiresStudy: true }, + }, + { + path: "study/imp/transactions", + name: "StudyImpTransactions", + component: ImpTransactions, + meta: { title: "IMP 交易", requiresStudy: true }, + }, { path: "study/finance", name: "StudyFinance", diff --git a/frontend/src/views/Imp.vue b/frontend/src/views/Imp.vue index d68ba290..df19c832 100644 --- a/frontend/src/views/Imp.vue +++ b/frontend/src/views/Imp.vue @@ -1,13 +1,31 @@ - + diff --git a/frontend/src/views/ImpBatches.vue b/frontend/src/views/ImpBatches.vue new file mode 100644 index 00000000..995290ff --- /dev/null +++ b/frontend/src/views/ImpBatches.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/frontend/src/views/ImpInventory.vue b/frontend/src/views/ImpInventory.vue new file mode 100644 index 00000000..3647504a --- /dev/null +++ b/frontend/src/views/ImpInventory.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/frontend/src/views/ImpProducts.vue b/frontend/src/views/ImpProducts.vue new file mode 100644 index 00000000..ecc1dc69 --- /dev/null +++ b/frontend/src/views/ImpProducts.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/frontend/src/views/ImpTransactions.vue b/frontend/src/views/ImpTransactions.vue new file mode 100644 index 00000000..53760bfd --- /dev/null +++ b/frontend/src/views/ImpTransactions.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/pg_data/base/16384/24576 b/pg_data/base/16384/24576 index b10fc06b5207e12c1d8ba9990eb4def901e63bba..e2490e635d1f57f19b6bda2d4e28e3e599408f0f 100644 GIT binary patch delta 35 pcmZp0XmDU-0D=wIH?q~qG74;Nm91xF6q(E_U(Y1LJh@H23IM8O319#K delta 35 pcmZp0XmDU-0D=#p8`K%8`-AGGjdFxE1wJiJKY7l diff --git a/pg_data/base/16384/24618 b/pg_data/base/16384/24618 index 35b0dc3b8f4924bb3a0d1cd7646eecc0aa2b0be0..98f310829a088efa9120fc140a7c81dd0c74b48c 100644 GIT binary patch delta 21 bcmZp0XmDU-0D_7I8`<>a83iVr%AW=RI4%Wd delta 21 bcmZp0XmDU-0D=w58`<>a85t&<%AW=RH6H~L diff --git a/pg_data/base/16384/24653 b/pg_data/base/16384/24653 index 8b0a9b269fa3bbb93e129b74abda6ce92a1167ec..66ddbeb07d3e8fb365f33e0f3de47c59a9a26804 100644 GIT binary patch delta 1091 zcmZp0XmAi<0D>RamNJ6q9EKMH69pV(Dy9Z7KA2*__+jz`Mg}0xm}J1XVqyd1iwO;k z8v|NU<<6OG-&I&`mT*HPtmS zFiq06G&M`oH8L|aH!w^!PPH^QRwyk&NTp;_K(GF?w8r3#4alV;%nbD? zE)|Blw2fs(T>ElohStKhtv};94`o~4eLuh4v2?D}>fnnX^*8XAWfo_a6uy2@_k6C` z{N)U%N@Hx+`D%uF2789Y2ZuO@ga*eudpP>JyXt~fDufv*xcK|ID(KpQ>Af4Abyh6& zzOd`k$L!+1j>L?+ob3_*ko@h02o3++v@%pyoXa7tNkQ9%yW06>p zzR_!18*_`pitzG2S?3^ESQLjuJa_R74si7gc2zJ^D9y_(DON~IEJ@B#urxDIOiHsf z(oHipv(Pn3OSIHYOfyK+O-r#zOEI!cGfGW1oP1Ey%+q+Ka9ptWKHu`S4l>JZQX1Jg zf$0V0u5~7M=VgG7<%K$y59(M!sAKQMG6eA-_Bqy+^*TAyqwXolv620^LKD4heFayG z1;2c=s>2G^u}_0son1WxLKIBNa;ujqF1IpVerF4IEDu`d5r8_@G4Yzb>1DUAOD-8s zi&SKvKiNS_N?=;m{z+dm{8z5$|J#3QzTUyfSyJ+hMw7dwlO zF97ln0O=od4Hz_l>>WV70>~Et(i4Dm1dzTk&tRkDMA>>#1__2%&aIow8GVvB&3&V2 zQ-3uOWSIz1{IvF)56e0n%v+B}T}tKSIs_6I28y?_%!q4W?#$3yxVH6Y94A;@2q-SP zQ1C>nf!nOLHjCG{9Y6aAq+SpxekYb8i2tz9v8Jro$&ns)PeI}WKyk;!YpU|5m)*85 nxnwvkQjvW=NP-_IA#4BOS&^*M&ow*USA^`|yJhnNy97o6fdyJm delta 79 zcmZo@U~Fh$+`yv1(-69pkpTz-7#7G)7Eln;PMB}Na07@dfLH>E4S;yTJOhRUKzav| XUIC;h0P%%+1{)niaHF3trFN?D+@4la3?pQk4 zX?5_$kNO)V!%~Yf(<&8Qib~V@OA?cEQcHM^3=DG9IiJs-#LUR>!rJz{%u6PQ4@^{X|@E3?-fRTZVVKO7aKI4zg>jm1~CEKd<>m9RL`O(9X9~6KJj?f_FHiUYO NF|s*L3KV`Y8UR2Cl6wFE delta 44 ucmZp0XmF5b0D>QXmoS288HO413<@j?Aoh&;7d9HI%WZTBW1KugJ_7*mq6>8Z diff --git a/pg_data/base/16384/24717 b/pg_data/base/16384/24717 index 46ac7c0efdb615893fcb380cf8f27992a79b711d..16921272fb4d55fce685f31d05a76e2bcb25fa31 100644 GIT binary patch delta 66 zcmZo@U~Fh$+`ytB-BGcWkpT!47!JsPkY`ZJU9OTTPtt@yp`LH|#Y4h;bGk delta 44 xcmZo@U~Fh$+`ytBzTxc>Mg|~|VYngxL7qhc#J(}#V58%1`H2B+lkeE8001a=4Wa-5 diff --git a/pg_data/base/16384/24719 b/pg_data/base/16384/24719 index fef3565ca53da6827c5414298363f076e176d136..c81848b7276aba00596751499e8dd8baf69fd8b0 100644 GIT binary patch delta 78 zcmZo@U~Fh$+`ytBZBe0D(nIH?s4}GYK$H7L$Jk06voidH?_b delta 23 dcmZp0XmDU>0D^{>OE$9e$}|0Bnk**&3II-%2Pgml diff --git a/pg_data/base/16384/24797 b/pg_data/base/16384/24797 index 6565420e1215e8caec32c50dbd838afcb85d0501..9c7e93f81b206be1cf156917c6901aae7f9823bf 100644 GIT binary patch delta 172 zcmZp0XmF5c0D=t*mNJ591qK0m1_c%c5W8dk2L^%pA2up}l&j}vW?&EiVi;gz;AEK0 zsBj;w2`D(NYX79K8U8ER^Z)I?G+*yvw&mUT^UEDe=Q^zpzW7mp!wt8+9~L}yh@P6Q yCeHZyWihvtfq@ZFU#l7e1HYqlh-a89*ysfdZO_ZRWMY8Pf0=;7%nXzJ3FOBq453`2)Jg93{Jh}|*&!$!sTauW^eCU?kJ007Ie3p)S+ diff --git a/pg_data/base/16384/24802 b/pg_data/base/16384/24802 index e4e3c17955b1d4ef6654aace15c69f6f83916e78..6ca74a515de29c0ab7d299ead44d1c58e9b2deaa 100644 GIT binary patch delta 66 zcmZo@U~Fh$+`ytBEz!G_kpT!47!JsPkY`Z}yJ0DFZNy8r+H delta 44 wcmZo@U~Fh$+`ytBUh#VgBLfh~Fx-&;AkU%zV&9l=u+ee1{KNpZ$#?8k03y{5cmMzZ diff --git a/pg_data/base/16384/24804 b/pg_data/base/16384/24804 index 0cb790db3f5f905c3b62e42999cf370552bd8bad..9c6ed6cce7c1133dd4cd854db1c13b2ad9449102 100644 GIT binary patch delta 87 zcmZo@U~Fh$+`ytB{h)U#BLfg9FiepDAkU%zVjq~Fz%XHc!bZnZc}*q;1BYzOyYJ_h pJC@FMS{;1xqy7eNCj$ec8*Y0)EO_b=JvCcRobmC?;>mmModMedAV~lK delta 41 tcmZo@U~Fh$+`ytBZt-UcBLfh~FdUHoAkU%zVjq~Fu+ed){Ny9{HURSm3_t(? diff --git a/pg_data/base/16384/24816 b/pg_data/base/16384/24816 index 704bd8e0d2eecddb5bd838957a2cc9d3b9e88a97..695df65968579c316c1b3cd26e0c21584fb722d7 100644 GIT binary patch delta 51 zcmZo@U~Fh$+`ytBUD3CckpT!47!JsPkY`ZJU9OTTPtt@yp`LH|#Y4b0QVJ delta 44 wcmZo@U~Fh$+`ytB-tl({BLfh~Fx-&;AkU%zV&9l=u+ee1{KNpZ$#?8k03|mKiU0rr diff --git a/pg_data/base/16384/24844 b/pg_data/base/16384/24844 index 0037f3dff79438c17be1535d60d9206b2cdb3350..16cd3703aa4f63e1a5e45ff74e61428a2443d67a 100644 GIT binary patch delta 138 zcmZp0XmHSB0D^!OOBq454nv15g93|!Ff#)~!+Zutj`<%LI_3dsAnusUz_`&cMpgnO zi40g7cpI2C75-12A@3v2rOLp-?c(p}3RH1y%>hxFmrM*6dk-+mzGT|WE?3JagsdB= M(}9_F@-+D@04PNoE&u=k delta 86 zcmZp0XmHSA0D>REOBg}41_Os2g93{Jh}|%sfsteW2ZoM$KpKcQ8ivbGbm-j7Ay>mF Z0#X12j10UC%$y4QCohoonfydv1_0RX5fK0Y diff --git a/pg_data/base/16384/25004 b/pg_data/base/16384/25004 index 8bdbece097631269fe9d65d03c4ab77ff8de8a48..bde9d34bdcc336e4aef8f21240c67863afacddf1 100644 GIT binary patch delta 303 zcmZp0XmHSG0D>QjmokEA9flvW3<@j?49pA+Gv;4lFaY8c^DZzX0P&Bx7d9%MmDLac z$_W86SOZWGD+Akt1Bwz1mxbfMow?z8ZOQ)+6I*`1)0%uhUcqBp)&5CeGyGSs=l|P( zX};b;pgu5IXJU6=<|PvYA5Z{fAd+DZ7*vTgj1_9w<#)Dl!$1bY01E?~g90md!{pIj c2GayJY_h(*7^CLob@EP=JLFXvS%It|04ZB%RR910 delta 64 zcmZp0XmF5c00IM*rHmk2fx$qYL4ieqfti6}#{3Hm2JvZ1^PqsHWQ P@=lXGc|-gFoT2{7?>aw z12Y2;12d<>e;z2`jzwZY`bMv5ZOknWE5ghBCa;iJ(4AJbf6~_s|CQ_c|Mp*+uXk|Y zXCAYi;Z6<9B{N*u&jzj%cJT}jaPa$h37PcIRbYGBNN$t>lDS!344L zJTitBLfh~Fx-&;AkU%zV&B-TsL(AxF~DN-9eWi3{hkaJ diff --git a/pg_data/base/16384/25063 b/pg_data/base/16384/25063 index 55a6d3bf4fb04a8eec801d81c8a866f72be2e854..54236cc4acbdde5819765e5fdcace4d6477cfa37 100644 GIT binary patch delta 61 zcmZo@U~Fh$+`ytBpD=$ZBLfhqFszXOAkU%zV&9l=z;FPFSIjrq=-4UG$UOP3y*MKi Kh@5=KUIhRYSQ2Fb delta 43 vcmZo@U~Fh$+`ytB>fpMRkpT!~7;eaakY`ZBuzBLfh~Fx-&;AkU%zV&B-TsL(AxF~DN-9eWi3{MHN) diff --git a/pg_data/base/16384/2604 b/pg_data/base/16384/2604 index cfdcff948d3a14833fcce567f060fbae197e7c18..1456965e477f3d5fd2da3049694724aaadbfcb75 100644 GIT binary patch delta 20 bcmZp0XmHpd%F4(&S&Vf*Bj@I8tXfh4J@Eye delta 20 bcmZp0XmHpd%F4(wS&Vf*Bgf`ztXfh4J>LbK diff --git a/pg_data/base/16384/2619 b/pg_data/base/16384/2619 index 88b7bb7f164e4d1fb4003763f0091afdefb82cbf..b6961db9d7141f21b85b398984b08d58a0d3925f 100644 GIT binary patch delta 87 zcmZo@;Av>!5n}*?8>LGbL39R#1tWt3ivk0~L@_UR5e7yEi$<4;7u6^Bi8E?W_G3(+ g%*&`f{X{Ag-^6+B2$ALojO`B?8Mi-RWK#GC0BGPA-2eap delta 90 zcmZo@;Av>!5n})XfzJyWL39Sg1O^5L7KNKk6UDsPEgD@ICp5TByr@30Pn=O>vLEB5 q$rTIvI2ag27~~z8nSlc7>~|*E*n8Y-Yu>}yzK4-<`yNInmwx~j^%?8{ diff --git a/pg_data/global/pg_control b/pg_data/global/pg_control index 1d98f731fc294ea7b1b361c649b7569080c3a040..7dbaa0a8409df62e0a5db0274569da15b3bc30ed 100644 GIT binary patch delta 86 zcmZp0XmFSyp?TNDDU$&RJZ>yy1knOe8pMHNkhtVTM|HtFP{kkt5RjZ$xtzuJ{F{W$ NhK%RsCOa_l0szpi5gY&j delta 86 zcmZp0XmFSyp?ONlDU$&R1j?2&g6M!S2o2)EFi4zpqNBRt5vXF200?kStX$5r=6sLK NW<$pFa+4hxc>#i+55xcf diff --git a/pg_data/pg_subtrans/0000 b/pg_data/pg_subtrans/0000 index 459cd5d86477e7c2a6fffc53e6c1c4d0a8d35c3f..86e2f0bfdc71a65bb1ed93d22aebb7d66fb3e377 100644 GIT binary patch delta 31 dcmZp0XmHqI!6U@W%m4=bP+E|AvmnnlVE|Af1Xch5 delta 15 WcmZp0XmHqI!LvDmXMylU0Sy2wq6H8D diff --git a/pg_data/pg_wal/000000010000000000000001 b/pg_data/pg_wal/000000010000000000000001 index 413d8162dd11ac2b8eb4640966fe2a3b39eabd5c..cb1d05558ee45feafbd893bfebe45d257dcb3e41 100644 GIT binary patch delta 19942 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 delta 5213 zcmeIu=T^@F9Khj|e^fG(5h+CWsEkM2j5}~nZ@Vx-|x`L0jDAAb7v z=l5X8Kz?6Me`=s~u)en-9s(f{0wE9rArJx~5CS0(0wE9rArJx~5CZ?FKw0W9?iUOD diff --git a/pg_data/pg_xact/0000 b/pg_data/pg_xact/0000 index e37dc51c40f4d37404d5f55b45432434d026f5fc..3a30c261be73f1b8e75926135c1e1824d2ae1ffd 100644 GIT binary patch delta 14 VcmZp0XmFTth&ePgbK^m4c>pVt1+@SG delta 15 WcmZp0XmFTth>>yQMSb~+5BLBv2?itp