From eced769a17997a302a882c81481b5575c8fb83a7 Mon Sep 17 00:00:00 2001 From: MrWaradana Date: Mon, 17 Nov 2025 14:30:33 +0700 Subject: [PATCH] feat: get maximo data by assetnum --- .../__pycache__/router.cpython-311.pyc | Bin 11472 -> 11560 bytes .../__pycache__/schema.cpython-311.pyc | Bin 11518 -> 11642 bytes .../__pycache__/service.cpython-311.pyc | Bin 17262 -> 17696 bytes src/equipment/router.py | 6 ++++-- src/equipment/schema.py | 1 + src/equipment/service.py | 19 ++++++++++++++++-- 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/equipment/__pycache__/router.cpython-311.pyc b/src/equipment/__pycache__/router.cpython-311.pyc index 02dad94cd044579d0a4b78b001bbef85ffdfba71..d38b233f9a0a1cf7a370263009427ffe0e228264 100644 GIT binary patch delta 731 zcmZ9IPiPZC7{zz8|E7uA*fec}B;BNmiD_)?p+!+CBDJ7`A}X~a)HJ)Xu}OE`O(fA> z5%th(8So}}Qqdxn9Q0E0;7LRx^sq$ixp>-OMG!&1v7+Ma%`ixf|4df+{wT$HK=6NVI`sFidY#Ui`;4OLVrB3 zk|m$GEWcYFQ3K>DD~rRhnp1M*5Z{mXG|%y``-a=0f>ti8g{o%ED6=!BYMLc&p}^7u z{BAy|w_$vKLtcgZISW}H5|tyN3nIhVtj*cHE!d)s?JkQaG4BL<8S(eB7H9F6V2KvC zx|X>IkbNSO^@uEGSR)I&8AXbHW?ws4}+a`1vz$S&u z_{hq@3#5~hd_vIS5XKdjPF=)uRNU@h<4DbyftY}KDtd1K?FhwxTdUHCR;zlD#xPR1TptO!mZPh~Y YSN)3)%Xp5XHFV7NK+YX+KF+4lPYUb782|tP delta 616 zcmZ1xbs>^(IWI340}vSPmCBr~Fp*D!QD>w2A7*xmRFgE86t&5EEdKoJsX{3lsk$l3 zsd{M~DVmdeSb~9KB5*OT6s^hcShQKSQw>u2C$D3cm)8O7)@@-~1~hs#$b2w}a!O$d zX3*5z9K(7n5l-jhNXtJ zhOLHu4a+j1n$>KR|H;TR63J^(%ZUv39u-sBzfer$O_tBdj{^C+0ImH?T%H@hixFp8&xM6H2@CJV${#UO#a z$xjvC7z-!sD5(iR^npZ^Kt%E6BqcT03Lx{;=3b?HjNFw#<}K#j;`E~Q$z>|xY#=^R z)nyfB)*2x5+2-FW*-X-)5V*xskY8L<1hV}Wb3tiI5y+IHn#qmovRwT@CL<6R=Wkx2 ruEwG*#mKh6^8*8r+93?45X47j1}1ODD~w(rn1IqBtTr?0s4)TnrZJjs diff --git a/src/equipment/__pycache__/schema.cpython-311.pyc b/src/equipment/__pycache__/schema.cpython-311.pyc index 7191162c48a85f99bf9f4a745c00c6808e9e599b..0d1857c6fa60aa04b863772889b374d4c2eb2efe 100644 GIT binary patch delta 572 zcmewt`74TVIWI340|=a#%4Cw>$X6uG$T8VKReACf*%g!D$VzGoq;jXSr3y-d6@dr@ zE0raM+Xg6-!V=7&$ul`fu8RK_cWz=uW^R6bN@7W(rqJYba)DeaKqa?WQZkcECdT7QG7GIf-G}r7Dyx;L@0rX91x)lB62}Q9*D>X5d|Qk5JVJ#2o(?kHcbu0 zN{10~Kt}Q8%^%cr87Dte(PsuqfbG&({l%!50aBF-B>X~(ctC715P@)kz+^jRSvHU* znj(`wDj9ntq=wAyS2<1OC}%ED&z+H2duYbvYoapW7Xyu?MOx=HbzIr4-DAJ3Em&U OGGCD8g(g4OnG67@Fk(*t diff --git a/src/equipment/__pycache__/service.cpython-311.pyc b/src/equipment/__pycache__/service.cpython-311.pyc index 1d59c71f0a9d2868e12a1efe149141ec50c6f356..2a19362bc6043254b4c45b05af03844b61536ecc 100644 GIT binary patch delta 3284 zcmaJ@eQaA-6@S+s&yF3(j^lhew)17jeo30hv22n6R`C&B4b zUi^;F$M2qV?m6dP=izH)^vJnDTb{`NwqVWNRZ zs-$|-p-gxpEcl9aB-1$2D0q@?nrH&MH{G0RnP}P4wNA8xj-;a#QTX1Y7b+l#&AWh3^4cI$& z**&}LwP5cQ_Bs)^j_$VCgMFV$)ZjZrpc-hG8WPAvXcyF}hA+w!`voXK6Z~URw*cEn z>;l=;M)22zplOTR1bnYp&`bl22Q2eezT&9oUmo=HQ@t*$&9L#KgEf57)@QZrgufuy z@ZZ@EZG&Y2&L_M);_z4Z(ucRXbmHR#yl1u*kwvy@$miEH!&roM_>> zvdd?5r6hc9o~X9Rk_;IQMsN;}=X}_xQ_GC{IlCm`YlMtCBP=Aa&Vifxh!I&*^o|mb z5k0|w?y2LaT=ntDZqLl3y5=K#PYK$mx{U~5cKtzg>r13j^r2Dop~-0C8}69BS%(7h z?(%BBzx<=EuI}?ZBrO8lf>?X2(Yg}l%?Dc@Q6tL2MwBmBG>|BNr=syh3^Yz7s+Rxn zNM?yj=G#<{Vfn74R$R5t$MusXS;cqfJ)bZLU+S%~7zq(fF_e`y2-d>?<%m_c8+OBK zxQ&?6W;7e^(+)T#-qpWVd`QS9efDLrB8>PnC}vTab++Ng%-vvUVg`dDh7v`kyBI_;A(I0kb?abv~8J zP0ki5yI|UjUmixaLRz0J+Dy+DhS6k>sTw-r?^Q+lT9qTgVj!6{GZfJpBsqEJ!sL{u zQ9WD8urwHJ;nm(>^#o4X&)OUT=Y~s)v~9SNleWp?Gyn8Up33FWo$|&*HQ91I_mW?RNw1cLJU3fzEq@?z@5RJAvNyK=0zS{PXnz z?|oKJ#D>5c8yXWn1xJ^?AVkn!ne`n(&HJh$(AyiX~q(D^fbmXp?!EhWykF4A$y+({C(K z;}u}qGdY!}$5=Bi@s=dj4+=5v#ZnBSScWTnbhePnXJ~eN#8@|1Tl+^vZO|vXfG|0k z%VcudlEfeHkpokoN~anAl>C16UTZsn8d+j@tzAzF&c2SWo$8cM^;CwM)@<$^YvC59 z|FfcNLuj_CR7}-P#gJ`-lscb4!$V}3yB>N@;_ShGD6AV@CTRvQWydL)&5AOa9uhB{Pq5b{VKr2{N4U{A*tsFZjnB5x{jec3{f1Tl+Hu| z;oDwp-uDpl9V97!WGF~t{JEi^{rjMZ^SPll66Yrmd`z18f#J~LHPCLK-XH9&6AA4; zy>gOKm@Re#Kv(&d;g@9GI2%~q93CO@>&PEPf(}jF%Tr8KoW*p|87uncrwyIyEa0F@W%G%5YLCxcdnR zxA~7omPB^S5brtsNjs}Sh)-k5uBn3lVwXnQ%c&$~c;A~YR3~%U>C_CX<0nSj7DPS8 zP>uqi_#0-`bOt>u(X7SOwGn ynJwlEUo0{o*j<(ZmU=V2=03P?KeS;-_=fZ;s;^!?`heIlss93ckNw~P delta 2964 zcmaJ@eQaA-6@S-$@A)gX^JT{$@pl}@an>%)hv>4V8FUo3D%w=UAJ(Yx{B9Drw&ULS z%+~06X}VC#grIOGI#37MKZCB?RLy@N0UBtNfC-63Y=2Znnwa(vNNCF_e{BeH&UMl{ zbmb}U_@47S_ndRj$9>s)j(m8LWPav$J0*Btdoxu2^r$3#fXv<_5MXYNe?N0&ok*Ib zxhvu7aDG^TT->bO*y}w?b;Tg{(TBQP#E8byZ7OKz;gm05^e)@ zKOO*lLL*x6DiK;CdY={+nwdS#bqsRJt_^Rh`2#{}0AlYpBWn>bbMPKm6tMddTe4^| zSWgPQI2~M)wFK~o1fLXq3iv6(k5IRkq&~<&I1R#SA%ru)rcvN$G;&hPX80+~Kdq$g z;LFw%{4Hz9V}V%h@IDLgtt9{0`UEe`Kgw^!PsmN#AiVDK^Z&?mAoLT3Kc)nMUY-xh zP1RKS*KKM3iZY_u3?fN<$2rLVGV0|y*8_Y?Jr7%a{10k@*u^$`XPd)xz_u?FCx6+N zAua*AI#7?qUKVtU2 z1YulG_>u}u>Tdnc`vLK1)65FtGcS;~x>T+hl(8^>y#HU0 z>?jK%6y{G3+=|63cp{VQBs5Ppr1mF<7dZG14-@{5wl^pS#_P|ZM_om$^Xkf=}>rrnGtpLe}`peP@9B`_qeyS()Kk*?s87UM<$^<=V2&W`WJBy9YqXs-La2m9q`X&b3uW z^+v^DUjaZ@fyBkbQa^|cE2n|Kz!Q;glXUBP0Fr}1z<(!8 zC|E&K2BOPA&}irQUOayHxvK!*;7`Oh!O8ovI5|Z@u$Z-Vis1r=p~JSNtlh(34R!A2 z&#~(dcAo{kU+_YL#nZ6LlD4YTA}g)5J!OMd^+FvgQZFt;)mtAYes6h1N4H9KRil+f z7Q-#xuAuG*f#{V^Dh?s*z#YBxY@=MS(%N2`*#x(wr;m!<~n=~MO{T{`4@9h z+uzxTONTwFkd%d|!rbV$Kq#hP9$8D(h0tDqI&fy3KSy1yU($4PN+nc@7koni(G zTBBNTTZ@{;ehkvRX@3FD3m+o*{nM_N7zI!4MNs-KADcU^Vv^Wo>-o7OB=b{TA3=f! z+wwPxOwZaop`$U@vCaSe;NgA|y4t8?YqM(rUg5`&ya>Twj|5wmc^f(QBivC(BJwU` zw04Z$z9Dog;G$vSx2?itQ!t0${8!*Ju0PEmpB?1IqbnlJ>@0u#=tum`g@JxQsylU7 zI#61zEtQwq5dYi4Xs<~4dBE5lk|2*h^X*| z6}cBF5(g9Ei2H_#WZ}s_u|EhkXjJGtdmUJaRnjZ`g@@kh&1_5i{`keu)8i|Is5b|O zcdTMDmg_A3syHuAZ};Zjbxr)7-q5a9wp|artIX{vsI?>AMZemb`@;J~#vuL+%E*rL diff --git a/src/equipment/router.py b/src/equipment/router.py index 213cf94..2580fb5 100644 --- a/src/equipment/router.py +++ b/src/equipment/router.py @@ -155,7 +155,7 @@ async def get_generated_equipment_transaction(db_session: DbSession, token: Toke @router.get("/{assetnum}", response_model=StandardResponse[EquipmentRead]) -async def get_equipment(db_session: DbSession, assetnum: str): +async def get_equipment(db_session: DbSession, collector_db_session: CollectorDbSession, assetnum: str): ( equipment_master_record, equipment_data, @@ -163,7 +163,8 @@ async def get_equipment(db_session: DbSession, assetnum: str): min_eac_value, min_seq, last_actual_year, - ) = await get_master_by_assetnum(db_session=db_session, assetnum=assetnum) + maximo_data + ) = await get_master_by_assetnum(db_session=db_session, collector_db_session=collector_db_session, assetnum=assetnum) # raise Exception(equipment[0]) if not chart_data: raise HTTPException( @@ -179,6 +180,7 @@ async def get_equipment(db_session: DbSession, assetnum: str): min_eac_value=min_eac_value, min_seq=min_seq, last_actual_year=last_actual_year, + maximo_data=maximo_data ), message="Data retrieved successfully", ) diff --git a/src/equipment/schema.py b/src/equipment/schema.py index d7ecbb1..7a5acd4 100644 --- a/src/equipment/schema.py +++ b/src/equipment/schema.py @@ -88,6 +88,7 @@ class EquipmentRead(DefaultBase): min_eac_value: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) min_seq: Optional[float] = Field(None, nullable=True) last_actual_year: Optional[int] = Field(None, nullable=True) + maximo_data: Optional[List[dict]] = Field(None, nullable=True) class EquipmentTop10EconomicLife(EquipmentBase): diff --git a/src/equipment/service.py b/src/equipment/service.py index e0289d7..68b8d06 100644 --- a/src/equipment/service.py +++ b/src/equipment/service.py @@ -9,7 +9,7 @@ from ..equipment_master.model import EquipmentMaster from .schema import EquipmentCreate, EquipmentUpdate, MasterBase from typing import Optional -from src.database.core import DbSession +from src.database.core import DbSession, CollectorDbSession from src.auth.service import CurrentUser from src.config import RELIABILITY_APP_URL import httpx @@ -21,7 +21,7 @@ from sqlalchemy import text async def get_master_by_assetnum( - *, db_session: DbSession, assetnum: str + *, db_session: DbSession, collector_db_session: CollectorDbSession, assetnum: str ) -> tuple[list[EquipmentTransactionRecords], float | None]: """Returns master records with equipment data based on asset number.""" @@ -117,6 +117,20 @@ async def get_master_by_assetnum( ) min_seq = min_record[1] if min_record else None + maximo_query = f""" + SELECT + * + FROM public.wo_maximo AS a + WHERE a.asset_unit = '3' + AND a.asset_assetnum = '{assetnum}' + AND a.wonum NOT LIKE 'T%' + """ + + query = text(maximo_query) + # Pass parameters to execute to avoid bindparam/name mismatches + result_maximo = await collector_db_session.execute(query) + maximo_record = result_maximo.mappings().all() + return ( equipment_master_record, equipment_record, @@ -124,6 +138,7 @@ async def get_master_by_assetnum( min_eac_value, min_seq, last_actual_year, + maximo_record ) # return result.scalars().all()