test-run-new.txt 1.8 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841
  1. [INFO] Scanning for projects...
  2. [WARNING]
  3. [WARNING] Some problems were encountered while building the effective model for com.xuekairui:zhijiayun-user:jar:1.0.0
  4. [WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: com.xuekairui:zhijiayun-common:jar -> duplicate declaration of version (?) @ line 96, column 21
  5. [WARNING]
  6. [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
  7. [WARNING]
  8. [WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
  9. [WARNING]
  10. [INFO] ------------------------------------------------------------------------
  11. [INFO] Reactor Build Order:
  12. [INFO]
  13. [INFO] zhijiayun-pharmacy [pom]
  14. [INFO] zhijiayun-common [jar]
  15. [INFO] zhijiayun-user [jar]
  16. [INFO] zhijiayun-payment [jar]
  17. [INFO] zhijiayun-invite [jar]
  18. [INFO] zhijiayun-gateway [jar]
  19. [INFO]
  20. [INFO] ------------------< com.xuekairui:zhijiayun-pharmacy >------------------
  21. [INFO] Building zhijiayun-pharmacy 1.0-SNAPSHOT [1/6]
  22. [INFO] from pom.xml
  23. [INFO] --------------------------------[ pom ]---------------------------------
  24. [INFO]
  25. [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-pharmacy ---
  26. [INFO]
  27. [INFO] -------------------< com.xuekairui:zhijiayun-common >-------------------
  28. [INFO] Building zhijiayun-common 1.0.0 [2/6]
  29. [INFO] from zhijiayun-common\pom.xml
  30. [INFO] --------------------------------[ jar ]---------------------------------
  31. [INFO]
  32. [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-common ---
  33. [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-common\target
  34. [INFO]
  35. [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-common ---
  36. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-common\src\main\resources
  37. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-common\src\main\resources
  38. [INFO]
  39. [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-common ---
  40. [INFO] Recompiling the module because of changed source code.
  41. [INFO] Compiling 7 source files with javac [debug parameters release 17] to target\classes
  42. [INFO]
  43. [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-common ---
  44. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-common\src\test\resources
  45. [INFO]
  46. [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-common ---
  47. [INFO] No sources to compile
  48. [INFO]
  49. [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-common ---
  50. [INFO] No tests to run.
  51. [INFO]
  52. [INFO] --------------------< com.xuekairui:zhijiayun-user >--------------------
  53. [INFO] Building zhijiayun-user 1.0.0 [3/6]
  54. [INFO] from zhijiayun-user\pom.xml
  55. [INFO] --------------------------------[ jar ]---------------------------------
  56. [INFO]
  57. [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-user ---
  58. [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-user\target
  59. [INFO]
  60. [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-user ---
  61. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-user\src\main\resources
  62. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-user\src\main\resources
  63. [INFO]
  64. [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-user ---
  65. [INFO] Recompiling the module because of changed dependency.
  66. [INFO] Compiling 120 source files with javac [debug parameters release 17] to target\classes
  67. [INFO]
  68. [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-user ---
  69. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-user\src\test\resources
  70. [INFO]
  71. [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-user ---
  72. [INFO] Recompiling the module because of changed dependency.
  73. [INFO]
  74. [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-user ---
  75. [INFO]
  76. [INFO] ------------------< com.xuekairui:zhijiayun-payment >-------------------
  77. [INFO] Building zhijiayun-payment 1.0.0 [4/6]
  78. [INFO] from zhijiayun-payment\pom.xml
  79. [INFO] --------------------------------[ jar ]---------------------------------
  80. [INFO]
  81. [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-payment ---
  82. [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-payment\target
  83. [INFO]
  84. [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-payment ---
  85. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\main\resources
  86. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\main\resources
  87. [INFO]
  88. [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-payment ---
  89. [INFO] Recompiling the module because of changed dependency.
  90. [INFO] Compiling 47 source files with javac [debug parameters release 17] to target\classes
  91. [INFO] /D:/project/zhijiayun-pharmacy/zhijiayun-payment/src/main/java/com/xuekairui/payment/service/AlipayAnxinPayService.java: D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\main\java\com\xuekairui\payment\service\AlipayAnxinPayService.java使用了未经检查或不安全的操作。
  92. [INFO] /D:/project/zhijiayun-pharmacy/zhijiayun-payment/src/main/java/com/xuekairui/payment/service/AlipayAnxinPayService.java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
  93. [INFO]
  94. [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-payment ---
  95. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\test\resources
  96. [INFO]
  97. [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-payment ---
  98. [INFO] No sources to compile
  99. [INFO]
  100. [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-payment ---
  101. [INFO] No tests to run.
  102. [INFO]
  103. [INFO] -------------------< com.xuekairui:zhijiayun-invite >-------------------
  104. [INFO] Building zhijiayun-invite 1.0.0 [5/6]
  105. [INFO] from zhijiayun-invite\pom.xml
  106. [INFO] --------------------------------[ jar ]---------------------------------
  107. [INFO]
  108. [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-invite ---
  109. [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-invite\target
  110. [INFO]
  111. [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-invite ---
  112. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-invite\src\main\resources
  113. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-invite\src\main\resources
  114. [INFO]
  115. [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-invite ---
  116. [INFO] Recompiling the module because of changed dependency.
  117. [INFO] Compiling 20 source files with javac [debug parameters release 17] to target\classes
  118. [INFO]
  119. [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-invite ---
  120. [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-invite\src\test\resources
  121. [INFO]
  122. [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-invite ---
  123. [INFO] No sources to compile
  124. [INFO]
  125. [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-invite ---
  126. [INFO] No tests to run.
  127. [INFO]
  128. [INFO] ------------------< com.xuekairui:zhijiayun-gateway >-------------------
  129. [INFO] Building zhijiayun-gateway 1.0.0 [6/6]
  130. [INFO] from zhijiayun-gateway\pom.xml
  131. [INFO] --------------------------------[ jar ]---------------------------------
  132. [INFO]
  133. [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-gateway ---
  134. [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-gateway\target
  135. [INFO]
  136. [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-gateway ---
  137. [INFO] Copying 3 resources from src\main\resources to target\classes
  138. [INFO] Copying 29 resources from src\main\resources to target\classes
  139. [INFO]
  140. [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-gateway ---
  141. [INFO] Recompiling the module because of changed dependency.
  142. [INFO] Compiling 6 source files with javac [debug parameters release 17] to target\classes
  143. [INFO]
  144. [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-gateway ---
  145. [INFO] Copying 2 resources from src\test\resources to target\test-classes
  146. [INFO]
  147. [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-gateway ---
  148. [INFO] Recompiling the module because of changed dependency.
  149. [INFO] Compiling 24 source files with javac [debug parameters release 17] to target\test-classes
  150. [INFO]
  151. [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-gateway ---
  152. [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
  153. [INFO]
  154. [INFO] -------------------------------------------------------
  155. [INFO] T E S T S
  156. [INFO] -------------------------------------------------------
  157. [INFO] Running 运营管理接口测试
  158. 15:17:02.339 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.xuekairui.gateway.AdminControllerTest]: AdminControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  159. 15:17:02.546 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.AdminControllerTest
  160. . ____ _ __ _ _
  161. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
  162. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
  163. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  164. ' |____| .__|_| |_|_| |_\__, | / / / /
  165. =========|_|==============|___/=/_/_/_/
  166. :: Spring Boot :: (v3.5.14)
  167. 15:17:03.189 INFO [] [] [ main] c.x.g.AdminControllerTest : Starting AdminControllerTest using Java 17.0.17 with PID 37656 (started by geloger in D:\project\zhijiayun-pharmacy\zhijiayun-gateway)
  168. 15:17:03.190 DEBUG [] [] [ main] c.x.g.AdminControllerTest : Running with Spring Boot v3.5.14, Spring v6.2.18
  169. 15:17:03.190 INFO [] [] [ main] c.x.g.AdminControllerTest : The following 1 profile is active: "test"
  170. 15:17:04.700 INFO [] [] [ main] epositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
  171. 15:17:04.704 INFO [] [] [ main] epositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
  172. 15:17:04.767 INFO [] [] [ main] epositoryConfigurationDelegate : Finished Spring Data repository scanning in 29 ms. Found 0 Redis repository interfaces.
  173. _ _ |_ _ _|_. ___ _ | _
  174. | | |\/|_)(_| | |_\ |_)||_|_\
  175. / |
  176. 3.5.16
  177. 15:17:07.002 INFO [] [] [ main] c.x.u.service.AliyunSmsClient : 阿里云短信客户端初始化成功,端点: dysmsapi.aliyuncs.com
  178. 15:17:07.698 INFO [] [] [ main] c.z.hikari.HikariDataSource : HikariPool-1 - Starting...
  179. 15:17:08.030 INFO [] [] [ main] c.z.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@6075a4ea
  180. 15:17:08.032 INFO [] [] [ main] c.z.hikari.HikariDataSource : HikariPool-1 - Start completed.
  181. [DB-INIT] Test database initialized successfully
  182. 15:17:09.800 INFO [] [] [ main] .b.a.e.w.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator'
  183. 15:17:09.848 WARN [] [] [ main] etailsServiceAutoConfiguration :
  184. Using generated security password: 696adf54-5590-4d2d-a255-2a0669d6228b
  185. This generated password is for development use only. Your security configuration must be updated before running your application in production.
  186. 15:17:09.867 INFO [] [] [ main] zeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
  187. 15:17:10.441 INFO [] [] [ main] tisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.web.context.support.GenericWebApplicationContext@1c26273d
  188. 15:17:10.769 DEBUG [] [] [ main] c.x.g.f.RequestLoggingFilter : Filter 'requestLoggingFilter' configured for use
  189. 15:17:10.769 DEBUG [] [] [ main] c.x.g.filter.RateLimitFilter : Filter 'rateLimitFilter' configured for use
  190. 15:17:10.769 DEBUG [] [] [ main] .x.u.s.JwtAuthenticationFilter : Filter 'jwtAuthenticationFilter' configured for use
  191. 15:17:10.770 INFO [] [] [ main] w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet ''
  192. 15:17:10.770 INFO [] [] [ main] .s.t.w.s.TestDispatcherServlet : Initializing Servlet ''
  193. 15:17:10.771 INFO [] [] [ main] .s.t.w.s.TestDispatcherServlet : Completed initialization in 1 ms
  194. 15:17:10.922 INFO [] [] [ main] c.x.g.AdminControllerTest : Started AdminControllerTest in 8.242 seconds (process running for 9.669)
  195. 15:17:10.989 DEBUG [HxLyDBsZ] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Preparing: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
  196. 15:17:11.030 DEBUG [HxLyDBsZ] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Parameters: 2026-07-02T15:17:10.946416500(LocalDateTime)
  197. 15:17:11.059 DEBUG [HxLyDBsZ] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : <== Total: 0
  198. 15:17:11.100 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (role = ?) LIMIT 1
  199. 15:17:11.102 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: SUPER_ADMIN(String)
  200. 15:17:11.106 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
  201. 15:17:11.108 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (nickname = ?)
  202. 15:17:11.109 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: admin(String)
  203. 15:17:11.111 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
  204. 15:17:11.183 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, nickname, password, status, role, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
  205. 15:17:11.184 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580326515744769(Long), admin(String), $2a$10$RyC8dyJdNKjVVRbXeWqdk.hqyuld8W5xqkAcIRKTLR9ui6GKQlYk2(String), 1(Integer), SUPER_ADMIN(String), 0(Long), 2026-07-02T15:17:11.179740300(LocalDateTime), 2026-07-02T15:17:11.179740300(LocalDateTime)
  206. 15:17:11.192 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
  207. 15:17:11.192 INFO [] [] [ main] c.x.u.c.SuperAdminInitializer : 已创建默认超级管理员,用户名:admin,默认密码:admin@123,请尽快修改默认密码
  208. mvn : Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap cl
  209. asspath has been appended
  210. 所在位置 行:1 字符: 165
  211. + ... eep -Seconds 3; mvn clean test -pl zhijiayun-gateway -am 2>&1 | Out-F ...
  212. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  213. + CategoryInfo : NotSpecified: (Java HotSpot(TM...s been appended:String) [], RemoteException
  214. + FullyQualifiedErrorId : NativeCommandError
  215. 15:17:15.291 DEBUG [jPPgGtHL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config | IP: 127.0.0.1
  216. 15:17:15.370 DEBUG [jPPgGtHL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  217. 15:17:15.370 DEBUG [jPPgGtHL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  218. 15:17:15.377 DEBUG [jPPgGtHL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  219. 15:17:15.407 DEBUG [jPPgGtHL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  220. 15:17:15.407 DEBUG [jPPgGtHL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  221. 15:17:15.414 DEBUG [jPPgGtHL] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  222. 15:17:15.452 DEBUG [jPPgGtHL] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config 200 162ms
  223. MockHttpServletRequest:
  224. HTTP Method = GET
  225. Request URI = /api/admin/invite/config
  226. Parameters = {}
  227. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
  228. Body = null
  229. Session Attrs = {}
  230. Handler:
  231. Type = com.xuekairui.invite.controller.AdminController
  232. Method = com.xuekairui.invite.controller.AdminController#getInviteConfig()
  233. Async:
  234. Async started = false
  235. Async result = null
  236. Resolved Exception:
  237. Type = null
  238. ModelAndView:
  239. View name = null
  240. View = null
  241. Model = null
  242. FlashMap:
  243. Attributes = null
  244. MockHttpServletResponse:
  245. Status = 200
  246. Error message = null
  247. Headers = [X-Request-Id:"jPPgGtHL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  248. Content type = application/json
  249. Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":0,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"邀请你加入智价云(药店版)","landingDesc":"登录智价云(药店版),邀请好友各得好礼","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635416}
  250. Forwarded URL = null
  251. Redirected URL = null
  252. Cookies = []
  253. 15:17:15.521 DEBUG [KedrtyDL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config | IP: 127.0.0.1
  254. 15:17:15.529 WARN [KedrtyDL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config 401 8ms
  255. MockHttpServletRequest:
  256. HTTP Method = GET
  257. Request URI = /api/admin/invite/config
  258. Parameters = {}
  259. Headers = []
  260. Body = null
  261. Session Attrs = {}
  262. Handler:
  263. Type = null
  264. Async:
  265. Async started = false
  266. Async result = null
  267. Resolved Exception:
  268. Type = null
  269. ModelAndView:
  270. View name = null
  271. View = null
  272. Model = null
  273. FlashMap:
  274. Attributes = null
  275. MockHttpServletResponse:
  276. Status = 401
  277. Error message = null
  278. Headers = [X-Request-Id:"KedrtyDL", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  279. Content type = application/json;charset=UTF-8
  280. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976635526}
  281. Forwarded URL = null
  282. Redirected URL = null
  283. Cookies = []
  284. 15:17:15.541 DEBUG [AbpCJb6T] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config | IP: 127.0.0.1
  285. 15:17:15.544 DEBUG [AbpCJb6T] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  286. 15:17:15.545 DEBUG [AbpCJb6T] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  287. 15:17:15.547 DEBUG [AbpCJb6T] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  288. 15:17:15.550 DEBUG [AbpCJb6T] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  289. 15:17:15.551 DEBUG [AbpCJb6T] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  290. 15:17:15.554 DEBUG [AbpCJb6T] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  291. 15:17:15.557 DEBUG [AbpCJb6T] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config 200 16ms
  292. MockHttpServletRequest:
  293. HTTP Method = GET
  294. Request URI = /api/admin/invite/config
  295. Parameters = {}
  296. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
  297. Body = null
  298. Session Attrs = {}
  299. Handler:
  300. Type = com.xuekairui.invite.controller.AdminController
  301. Method = com.xuekairui.invite.controller.AdminController#getInviteConfig()
  302. Async:
  303. Async started = false
  304. Async result = null
  305. Resolved Exception:
  306. Type = null
  307. ModelAndView:
  308. View name = null
  309. View = null
  310. Model = null
  311. FlashMap:
  312. Attributes = null
  313. MockHttpServletResponse:
  314. Status = 200
  315. Error message = null
  316. Headers = [X-Request-Id:"AbpCJb6T", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  317. Content type = application/json
  318. Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":0,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"邀请你加入智价云(药店版)","landingDesc":"登录智价云(药店版),邀请好友各得好礼","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635555}
  319. Forwarded URL = null
  320. Redirected URL = null
  321. Cookies = []
  322. 15:17:15.574 DEBUG [bc3sPgK8] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config | IP: 127.0.0.1
  323. 15:17:15.578 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  324. 15:17:15.579 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  325. 15:17:15.582 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  326. 15:17:15.710 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  327. 15:17:15.711 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  328. 15:17:15.713 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  329. 15:17:15.723 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_config SET reward_crawler_count=?, reward_type=?, reward_months=?, max_daily_reward=?, invite_code_expire_days=?, max_invite_per_day=?, max_total_invites=?, landing_title=?, landing_desc=?, app_name=?, status=?, share_title_template=?, copy_text_template=?, reward_description=?, summary_text_template=?, instruction_windows=?, instruction_app=?, instruction_miniapp=?, instruction_wechat=?, instruction_dingtalk=?, instruction_feishu=?, instruction_default=?, create_time=?, update_time=? WHERE id=?
  330. 15:17:15.725 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.updateById : ==> Parameters: 5(Integer), MEMBERSHIP(String), 1(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), 测试标题(String), 登录智价云(药店版),邀请好友各得好礼(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:14(LocalDateTime), 2026-07-02T15:17:14(LocalDateTime), 1(Long)
  331. 15:17:15.732 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.updateById : <== Updates: 1
  332. 15:17:15.732 INFO [bc3sPgK8] [1] [ main] c.x.i.s.InviteConfigService : 邀请配置已更新: rewardType=MEMBERSHIP, rewardMonths=1, appDownloadUrl=null, miniappPath=null
  333. 15:17:15.738 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  334. 15:17:15.739 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580345629188098(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:15.735046500(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 1(Long), INVITE_CONFIG(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:15.737854200(LocalDateTime)
  335. 15:17:15.747 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  336. 15:17:15.747 WARN [bc3sPgK8] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG, 结果: SUCCESS
  337. 15:17:15.747 DEBUG [bc3sPgK8] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
  338. 15:17:15.749 DEBUG [bc3sPgK8] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config 200 175ms
  339. MockHttpServletRequest:
  340. HTTP Method = PUT
  341. Request URI = /api/admin/invite/config
  342. Parameters = {}
  343. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g", Content-Length:"196"]
  344. Body = {
  345. "rewardCrawlerCount": 5,
  346. "maxDailyReward": 50,
  347. "inviteCodeExpireDays": 30,
  348. "maxInvitePerDay": 10,
  349. "landingTitle": "测试标题",
  350. "appName": "智价云(药店版)"
  351. }
  352. Session Attrs = {}
  353. Handler:
  354. Type = com.xuekairui.invite.controller.AdminController
  355. Method = com.xuekairui.invite.controller.AdminController#updateInviteConfig(InviteConfigRequest, HttpServletRequest)
  356. Async:
  357. Async started = false
  358. Async result = null
  359. Resolved Exception:
  360. Type = null
  361. ModelAndView:
  362. View name = null
  363. View = null
  364. Model = null
  365. FlashMap:
  366. Attributes = null
  367. MockHttpServletResponse:
  368. Status = 200
  369. Error message = null
  370. Headers = [X-Request-Id:"bc3sPgK8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  371. Content type = application/json
  372. Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"测试标题","landingDesc":"登录智价云(药店版),邀请好友各得好礼","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635747}
  373. Forwarded URL = null
  374. Redirected URL = null
  375. Cookies = []
  376. 15:17:15.762 DEBUG [rtsu3PJe] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config | IP: 127.0.0.1
  377. 15:17:15.765 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  378. 15:17:15.766 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  379. 15:17:15.770 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  380. 15:17:15.773 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  381. 15:17:15.773 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  382. 15:17:15.777 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  383. 15:17:15.779 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_config SET reward_crawler_count=?, reward_type=?, reward_months=?, max_daily_reward=?, invite_code_expire_days=?, max_invite_per_day=?, max_total_invites=?, app_download_url=?, miniapp_path=?, miniapp_app_id=?, wechat_redirect_url=?, dingtalk_app_id=?, feishu_app_id=?, landing_title=?, landing_desc=?, app_name=?, status=?, share_title_template=?, copy_text_template=?, reward_description=?, summary_text_template=?, instruction_windows=?, instruction_app=?, instruction_miniapp=?, instruction_wechat=?, instruction_dingtalk=?, instruction_feishu=?, instruction_default=?, create_time=?, update_time=? WHERE id=?
  384. 15:17:15.781 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.updateById : ==> Parameters: 5(Integer), MEMBERSHIP(String), 1(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), https://download.example.com/app.exe(String), /pages/download/index(String), wx1234567890(String), https://mp.weixin.qq.com/xxx(String), dingxxx(String), feishuxxx(String), 邀请你加入(String), 高效数据采集(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:14(LocalDateTime), 2026-07-02T15:17:14(LocalDateTime), 1(Long)
  385. 15:17:15.788 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.updateById : <== Updates: 1
  386. 15:17:15.789 INFO [rtsu3PJe] [1] [ main] c.x.i.s.InviteConfigService : 邀请配置已更新: rewardType=MEMBERSHIP, rewardMonths=1, appDownloadUrl=https://download.example.com/app.exe, miniappPath=/pages/download/index
  387. 15:17:15.790 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  388. 15:17:15.791 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580345817931777(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:15.789480700(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 1(Long), INVITE_CONFIG(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:15.790528200(LocalDateTime)
  389. 15:17:15.797 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  390. 15:17:15.798 WARN [rtsu3PJe] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG, 结果: SUCCESS
  391. 15:17:15.798 DEBUG [rtsu3PJe] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
  392. 15:17:15.800 DEBUG [rtsu3PJe] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config 200 38ms
  393. MockHttpServletRequest:
  394. HTTP Method = PUT
  395. Request URI = /api/admin/invite/config
  396. Parameters = {}
  397. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g", Content-Length:"503"]
  398. Body = {
  399. "rewardCrawlerCount": 5,
  400. "maxDailyReward": 50,
  401. "inviteCodeExpireDays": 30,
  402. "maxInvitePerDay": 10,
  403. "appDownloadUrl": "https://download.example.com/app.exe",
  404. "miniappPath": "/pages/download/index",
  405. "miniappAppId": "wx1234567890",
  406. "wechatRedirectUrl": "https://mp.weixin.qq.com/xxx",
  407. "dingtalkAppId": "dingxxx",
  408. "feishuAppId": "feishuxxx",
  409. "landingTitle": "邀请你加入",
  410. "landingDesc": "高效数据采集",
  411. "appName": "智价云(药店版)"
  412. }
  413. Session Attrs = {}
  414. Handler:
  415. Type = com.xuekairui.invite.controller.AdminController
  416. Method = com.xuekairui.invite.controller.AdminController#updateInviteConfig(InviteConfigRequest, HttpServletRequest)
  417. Async:
  418. Async started = false
  419. Async result = null
  420. Resolved Exception:
  421. Type = null
  422. ModelAndView:
  423. View name = null
  424. View = null
  425. Model = null
  426. FlashMap:
  427. Attributes = null
  428. MockHttpServletResponse:
  429. Status = 200
  430. Error message = null
  431. Headers = [X-Request-Id:"rtsu3PJe", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  432. Content type = application/json
  433. Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"邀请你加入","landingDesc":"高效数据采集","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635798}
  434. Forwarded URL = null
  435. Redirected URL = null
  436. Cookies = []
  437. 15:17:15.808 DEBUG [jsZ82rt7] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config | IP: 127.0.0.1
  438. 15:17:15.812 WARN [jsZ82rt7] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config 401 4ms
  439. MockHttpServletRequest:
  440. HTTP Method = PUT
  441. Request URI = /api/admin/invite/config
  442. Parameters = {}
  443. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  444. Body = {}
  445. Session Attrs = {}
  446. Handler:
  447. Type = null
  448. Async:
  449. Async started = false
  450. Async result = null
  451. Resolved Exception:
  452. Type = null
  453. ModelAndView:
  454. View name = null
  455. View = null
  456. Model = null
  457. FlashMap:
  458. Attributes = null
  459. MockHttpServletResponse:
  460. Status = 401
  461. Error message = null
  462. Headers = [X-Request-Id:"jsZ82rt7", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  463. Content type = application/json;charset=UTF-8
  464. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976635810}
  465. Forwarded URL = null
  466. Redirected URL = null
  467. Cookies = []
  468. 15:17:15.822 DEBUG [XF5QAxNm] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/configs | IP: 127.0.0.1
  469. 15:17:15.824 DEBUG [XF5QAxNm] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  470. 15:17:15.825 DEBUG [XF5QAxNm] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  471. 15:17:15.828 DEBUG [XF5QAxNm] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  472. 15:17:15.902 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_invite_config
  473. 15:17:15.903 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList_mpCount : ==> Parameters:
  474. 15:17:15.906 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList_mpCount : <== Total: 1
  475. 15:17:15.909 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config ORDER BY create_time DESC LIMIT ?
  476. 15:17:15.910 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 20(Long)
  477. 15:17:15.912 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  478. 15:17:15.917 DEBUG [XF5QAxNm] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/configs 200 95ms
  479. MockHttpServletRequest:
  480. HTTP Method = GET
  481. Request URI = /api/admin/invite/configs
  482. Parameters = {}
  483. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
  484. Body = null
  485. Session Attrs = {}
  486. Handler:
  487. Type = com.xuekairui.invite.controller.AdminController
  488. Method = com.xuekairui.invite.controller.AdminController#listInviteConfigs(Integer, Integer)
  489. Async:
  490. Async started = false
  491. Async result = null
  492. Resolved Exception:
  493. Type = null
  494. ModelAndView:
  495. View name = null
  496. View = null
  497. Model = null
  498. FlashMap:
  499. Attributes = null
  500. MockHttpServletResponse:
  501. Status = 200
  502. Error message = null
  503. Headers = [X-Request-Id:"XF5QAxNm", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  504. Content type = application/json
  505. Body = {"code":200,"message":"操作成功","data":{"records":[{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"邀请你加入","landingDesc":"高效数据采集","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"}],"total":1,"size":20,"current":1,"pages":1},"timestamp":1782976635913}
  506. Forwarded URL = null
  507. Redirected URL = null
  508. Cookies = []
  509. 15:17:15.926 DEBUG [WDtEh5vm] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/1 | IP: 127.0.0.1
  510. 15:17:15.929 DEBUG [WDtEh5vm] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  511. 15:17:15.929 DEBUG [WDtEh5vm] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  512. 15:17:15.932 DEBUG [WDtEh5vm] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  513. 15:17:15.934 DEBUG [WDtEh5vm] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
  514. 15:17:15.935 DEBUG [WDtEh5vm] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 1(Long)
  515. 15:17:15.938 DEBUG [WDtEh5vm] [1] [ main] c.x.i.m.I.selectById : <== Total: 1
  516. 15:17:15.940 DEBUG [WDtEh5vm] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/1 200 14ms
  517. MockHttpServletRequest:
  518. HTTP Method = GET
  519. Request URI = /api/admin/invite/config/1
  520. Parameters = {}
  521. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
  522. Body = null
  523. Session Attrs = {}
  524. Handler:
  525. Type = com.xuekairui.invite.controller.AdminController
  526. Method = com.xuekairui.invite.controller.AdminController#getInviteConfigById(Long)
  527. Async:
  528. Async started = false
  529. Async result = null
  530. Resolved Exception:
  531. Type = null
  532. ModelAndView:
  533. View name = null
  534. View = null
  535. Model = null
  536. FlashMap:
  537. Attributes = null
  538. MockHttpServletResponse:
  539. Status = 200
  540. Error message = null
  541. Headers = [X-Request-Id:"WDtEh5vm", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  542. Content type = application/json
  543. Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"邀请你加入","landingDesc":"高效数据采集","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635938}
  544. Forwarded URL = null
  545. Redirected URL = null
  546. Cookies = []
  547. 15:17:15.948 DEBUG [fNkx8ULs] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/99999 | IP: 127.0.0.1
  548. 15:17:15.950 DEBUG [fNkx8ULs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  549. 15:17:15.950 DEBUG [fNkx8ULs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  550. 15:17:15.953 DEBUG [fNkx8ULs] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  551. 15:17:15.955 DEBUG [fNkx8ULs] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
  552. 15:17:15.955 DEBUG [fNkx8ULs] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 99999(Long)
  553. 15:17:15.956 DEBUG [fNkx8ULs] [1] [ main] c.x.i.m.I.selectById : <== Total: 0
  554. 15:17:15.960 WARN [fNkx8ULs] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=邀请配置不存在
  555. 15:17:15.961 DEBUG [fNkx8ULs] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/99999 200 13ms
  556. MockHttpServletRequest:
  557. HTTP Method = GET
  558. Request URI = /api/admin/invite/config/99999
  559. Parameters = {}
  560. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
  561. Body = null
  562. Session Attrs = {}
  563. Handler:
  564. Type = com.xuekairui.invite.controller.AdminController
  565. Method = com.xuekairui.invite.controller.AdminController#getInviteConfigById(Long)
  566. Async:
  567. Async started = false
  568. Async result = null
  569. Resolved Exception:
  570. Type = com.xuekairui.common.BusinessException
  571. ModelAndView:
  572. View name = null
  573. View = null
  574. Model = null
  575. FlashMap:
  576. Attributes = null
  577. MockHttpServletResponse:
  578. Status = 200
  579. Error message = null
  580. Headers = [X-Request-Id:"fNkx8ULs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  581. Content type = application/json
  582. Body = {"code":404,"message":"邀请配置不存在","data":null,"timestamp":1782976635960}
  583. Forwarded URL = null
  584. Redirected URL = null
  585. Cookies = []
  586. 15:17:15.969 DEBUG [cDv3xdzq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant | IP: 127.0.0.1
  587. 15:17:15.972 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  588. 15:17:15.972 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  589. 15:17:15.974 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  590. 15:17:15.985 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  591. 15:17:15.986 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  592. 15:17:15.987 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  593. 15:17:15.990 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_quota_grant ( id, user_id, grant_type, quota_count, used_count, remark, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  594. 15:17:15.991 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580346656792577(Long), 1(Long), ADMIN(String), 50(Integer), 0(Integer), 测试发放(String), 1(Integer), 2026-07-02T15:17:15.989513300(LocalDateTime), 2026-07-02T15:17:15.989513300(LocalDateTime)
  595. 15:17:15.993 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  596. 15:17:15.994 INFO [cDv3xdzq] [1] [ main] x.u.s.CrawlerQuotaGrantService : 爬虫配额发放: 用户=1, 类型=ADMIN, 次数=50, 过期=null, 备注=测试发放
  597. 15:17:16.000 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  598. 15:17:16.001 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580346723901441(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:15.999762200(LocalDateTime), CRAWLER(String), QUOTA_GRANT(String), 手动发放爬虫配额(String), CRAWLER_QUOTA(String), 1(Long), CRAWLER_QUOTA:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.000289900(LocalDateTime)
  599. 15:17:16.005 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  600. 15:17:16.006 WARN [cDv3xdzq] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】手动发放爬虫配额 - 操作人: 管理员(1), 目标: CRAWLER_QUOTA:1, 结果: SUCCESS
  601. 15:17:16.006 DEBUG [cDv3xdzq] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 手动发放爬虫配额
  602. 15:17:16.009 DEBUG [cDv3xdzq] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant 200 40ms
  603. MockHttpServletRequest:
  604. HTTP Method = POST
  605. Request URI = /api/admin/crawler/grant
  606. Parameters = {}
  607. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g", Content-Length:"94"]
  608. Body = {
  609. "userId": 1,
  610. "quotaCount": 50,
  611. "expireDays": 30,
  612. "remark": "测试发放"
  613. }
  614. Session Attrs = {}
  615. Handler:
  616. Type = com.xuekairui.invite.controller.AdminController
  617. Method = com.xuekairui.invite.controller.AdminController#grantCrawlerQuota(QuotaGrantRequest, HttpServletRequest)
  618. Async:
  619. Async started = false
  620. Async result = null
  621. Resolved Exception:
  622. Type = null
  623. ModelAndView:
  624. View name = null
  625. View = null
  626. Model = null
  627. FlashMap:
  628. Attributes = null
  629. MockHttpServletResponse:
  630. Status = 200
  631. Error message = null
  632. Headers = [X-Request-Id:"cDv3xdzq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  633. Content type = application/json
  634. Body = {"code":200,"message":"操作成功","data":{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:15","updateTime":"2026-07-02 15:17:15"},"timestamp":1782976636006}
  635. Forwarded URL = null
  636. Redirected URL = null
  637. Cookies = []
  638. 15:17:16.018 DEBUG [YuJMuqg4] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/invite/config | IP: 127.0.0.1
  639. 15:17:16.020 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  640. 15:17:16.020 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  641. 15:17:16.023 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  642. 15:17:16.029 DEBUG [YuJMuqg4] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_config ( reward_crawler_count, reward_type, reward_months, max_daily_reward, invite_code_expire_days, max_invite_per_day, max_total_invites, landing_title, landing_desc, app_name, status, share_title_template, copy_text_template, reward_description, summary_text_template, instruction_windows, instruction_app, instruction_miniapp, instruction_wechat, instruction_dingtalk, instruction_feishu, instruction_default, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  643. 15:17:16.030 DEBUG [YuJMuqg4] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 3(Integer), MEMBERSHIP(String), 2(Integer), 30(Integer), 15(Integer), 5(Integer), 20(Integer), 新配置标题(String), 登录智价云(药店版),聚合比价查低价(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:16.028702200(LocalDateTime), 2026-07-02T15:17:16.028702200(LocalDateTime)
  644. 15:17:16.035 DEBUG [YuJMuqg4] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
  645. 15:17:16.037 INFO [YuJMuqg4] [1] [ main] c.x.i.s.InviteConfigService : 创建邀请配置: id=2, rewardType=MEMBERSHIP, rewardMonths=2
  646. 15:17:16.038 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  647. 15:17:16.039 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580346849730562(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.037481200(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 2(Long), INVITE_CONFIG_CREATE(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.037998700(LocalDateTime)
  648. 15:17:16.043 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  649. 15:17:16.044 WARN [YuJMuqg4] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_CREATE, 结果: SUCCESS
  650. 15:17:16.044 DEBUG [YuJMuqg4] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
  651. 15:17:16.046 DEBUG [YuJMuqg4] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/invite/config 200 28ms
  652. MockHttpServletRequest:
  653. HTTP Method = POST
  654. Request URI = /api/admin/invite/config
  655. Parameters = {}
  656. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"280"]
  657. Body = {
  658. "rewardCrawlerCount": 3,
  659. "rewardType": "MEMBERSHIP",
  660. "rewardMonths": 2,
  661. "maxDailyReward": 30,
  662. "inviteCodeExpireDays": 15,
  663. "maxInvitePerDay": 5,
  664. "maxTotalInvites": 20,
  665. "landingTitle": "新配置标题",
  666. "appName": "智价云(药店版)"
  667. }
  668. Session Attrs = {}
  669. Handler:
  670. Type = com.xuekairui.invite.controller.AdminController
  671. Method = com.xuekairui.invite.controller.AdminController#createInviteConfig(InviteConfigRequest, HttpServletRequest)
  672. Async:
  673. Async started = false
  674. Async result = null
  675. Resolved Exception:
  676. Type = null
  677. ModelAndView:
  678. View name = null
  679. View = null
  680. Model = null
  681. FlashMap:
  682. Attributes = null
  683. MockHttpServletResponse:
  684. Status = 200
  685. Error message = null
  686. Headers = [X-Request-Id:"YuJMuqg4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  687. Content type = application/json
  688. Body = {"code":200,"message":"操作成功","data":{"id":2,"rewardCrawlerCount":3,"rewardType":"MEMBERSHIP","rewardMonths":2,"maxDailyReward":30,"inviteCodeExpireDays":15,"maxInvitePerDay":5,"maxTotalInvites":20,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"新配置标题","landingDesc":"登录智价云(药店版),聚合比价查低价","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"},"timestamp":1782976636044}
  689. Forwarded URL = null
  690. Redirected URL = null
  691. Cookies = []
  692. 15:17:16.051 DEBUG [2v65QrTh] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant | IP: 127.0.0.1
  693. 15:17:16.053 WARN [2v65QrTh] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant 401 2ms
  694. MockHttpServletRequest:
  695. HTTP Method = POST
  696. Request URI = /api/admin/crawler/grant
  697. Parameters = {}
  698. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
  699. Body = {"userId":1,"quotaCount":50}
  700. Session Attrs = {}
  701. Handler:
  702. Type = null
  703. Async:
  704. Async started = false
  705. Async result = null
  706. Resolved Exception:
  707. Type = null
  708. ModelAndView:
  709. View name = null
  710. View = null
  711. Model = null
  712. FlashMap:
  713. Attributes = null
  714. MockHttpServletResponse:
  715. Status = 401
  716. Error message = null
  717. Headers = [X-Request-Id:"2v65QrTh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  718. Content type = application/json;charset=UTF-8
  719. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976636052}
  720. Forwarded URL = null
  721. Redirected URL = null
  722. Cookies = []
  723. 15:17:16.060 DEBUG [NazCSJkw] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config/1 | IP: 127.0.0.1
  724. 15:17:16.062 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  725. 15:17:16.063 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  726. 15:17:16.065 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  727. 15:17:16.068 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
  728. 15:17:16.068 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 1(Long)
  729. 15:17:16.070 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.selectById : <== Total: 1
  730. 15:17:16.071 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_config SET reward_crawler_count=?, reward_type=?, reward_months=?, max_daily_reward=?, invite_code_expire_days=?, max_invite_per_day=?, max_total_invites=?, app_download_url=?, miniapp_path=?, miniapp_app_id=?, wechat_redirect_url=?, dingtalk_app_id=?, feishu_app_id=?, landing_title=?, landing_desc=?, app_name=?, status=?, share_title_template=?, copy_text_template=?, reward_description=?, summary_text_template=?, instruction_windows=?, instruction_app=?, instruction_miniapp=?, instruction_wechat=?, instruction_dingtalk=?, instruction_feishu=?, instruction_default=?, create_time=?, update_time=? WHERE id=?
  731. 15:17:16.076 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.updateById : ==> Parameters: 5(Integer), MEMBERSHIP(String), 3(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), https://download.example.com/app.exe(String), /pages/download/index(String), wx1234567890(String), https://mp.weixin.qq.com/xxx(String), dingxxx(String), feishuxxx(String), 更新后的标题(String), 高效数据采集(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:14(LocalDateTime), 2026-07-02T15:17:14(LocalDateTime), 1(Long)
  732. 15:17:16.081 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.updateById : <== Updates: 1
  733. 15:17:16.081 INFO [NazCSJkw] [1] [ main] c.x.i.s.InviteConfigService : 更新邀请配置: id=1, rewardType=MEMBERSHIP, rewardMonths=3
  734. 15:17:16.082 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  735. 15:17:16.082 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580347042668545(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.081872300(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 1(Long), INVITE_CONFIG_UPDATE:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.082419400(LocalDateTime)
  736. 15:17:16.087 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  737. 15:17:16.087 WARN [NazCSJkw] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_UPDATE:1, 结果: SUCCESS
  738. 15:17:16.087 DEBUG [NazCSJkw] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
  739. 15:17:16.089 DEBUG [NazCSJkw] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config/1 200 29ms
  740. MockHttpServletRequest:
  741. HTTP Method = PUT
  742. Request URI = /api/admin/invite/config/1
  743. Parameters = {}
  744. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"68"]
  745. Body = {
  746. "rewardMonths": 3,
  747. "landingTitle": "更新后的标题"
  748. }
  749. Session Attrs = {}
  750. Handler:
  751. Type = com.xuekairui.invite.controller.AdminController
  752. Method = com.xuekairui.invite.controller.AdminController#updateInviteConfigById(Long, InviteConfigRequest, HttpServletRequest)
  753. Async:
  754. Async started = false
  755. Async result = null
  756. Resolved Exception:
  757. Type = null
  758. ModelAndView:
  759. View name = null
  760. View = null
  761. Model = null
  762. FlashMap:
  763. Attributes = null
  764. MockHttpServletResponse:
  765. Status = 200
  766. Error message = null
  767. Headers = [X-Request-Id:"NazCSJkw", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  768. Content type = application/json
  769. Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":3,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"更新后的标题","landingDesc":"高效数据采集","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976636087}
  770. Forwarded URL = null
  771. Redirected URL = null
  772. Cookies = []
  773. 15:17:16.098 DEBUG [mAPZYCA9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants | IP: 127.0.0.1
  774. 15:17:16.100 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  775. 15:17:16.100 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  776. 15:17:16.102 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  777. 15:17:16.105 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant ORDER BY create_time DESC
  778. 15:17:16.105 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.C.selectList : ==> Parameters:
  779. 15:17:16.107 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.C.selectList : <== Total: 1
  780. 15:17:16.108 DEBUG [mAPZYCA9] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants 200 10ms
  781. MockHttpServletRequest:
  782. HTTP Method = GET
  783. Request URI = /api/admin/crawler/grants
  784. Parameters = {}
  785. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  786. Body = null
  787. Session Attrs = {}
  788. Handler:
  789. Type = com.xuekairui.invite.controller.AdminController
  790. Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
  791. Async:
  792. Async started = false
  793. Async result = null
  794. Resolved Exception:
  795. Type = null
  796. ModelAndView:
  797. View name = null
  798. View = null
  799. Model = null
  800. FlashMap:
  801. Attributes = null
  802. MockHttpServletResponse:
  803. Status = 200
  804. Error message = null
  805. Headers = [X-Request-Id:"mAPZYCA9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  806. Content type = application/json
  807. Body = {"code":200,"message":"操作成功","data":[{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"}],"timestamp":1782976636107}
  808. Forwarded URL = null
  809. Redirected URL = null
  810. Cookies = []
  811. 15:17:16.115 DEBUG [UvEFs9Cr] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config/99999 | IP: 127.0.0.1
  812. 15:17:16.116 DEBUG [UvEFs9Cr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  813. 15:17:16.117 DEBUG [UvEFs9Cr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  814. 15:17:16.119 DEBUG [UvEFs9Cr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  815. 15:17:16.121 DEBUG [UvEFs9Cr] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
  816. 15:17:16.121 DEBUG [UvEFs9Cr] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 99999(Long)
  817. 15:17:16.122 DEBUG [UvEFs9Cr] [1] [ main] c.x.i.m.I.selectById : <== Total: 0
  818. 15:17:16.123 WARN [UvEFs9Cr] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=邀请配置不存在
  819. 15:17:16.124 DEBUG [UvEFs9Cr] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config/99999 200 10ms
  820. MockHttpServletRequest:
  821. HTTP Method = PUT
  822. Request URI = /api/admin/invite/config/99999
  823. Parameters = {}
  824. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"19"]
  825. Body = {"rewardMonths": 3}
  826. Session Attrs = {}
  827. Handler:
  828. Type = com.xuekairui.invite.controller.AdminController
  829. Method = com.xuekairui.invite.controller.AdminController#updateInviteConfigById(Long, InviteConfigRequest, HttpServletRequest)
  830. Async:
  831. Async started = false
  832. Async result = null
  833. Resolved Exception:
  834. Type = com.xuekairui.common.BusinessException
  835. ModelAndView:
  836. View name = null
  837. View = null
  838. Model = null
  839. FlashMap:
  840. Attributes = null
  841. MockHttpServletResponse:
  842. Status = 200
  843. Error message = null
  844. Headers = [X-Request-Id:"UvEFs9Cr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  845. Content type = application/json
  846. Body = {"code":404,"message":"邀请配置不存在","data":null,"timestamp":1782976636123}
  847. Forwarded URL = null
  848. Redirected URL = null
  849. Cookies = []
  850. 15:17:16.130 DEBUG [dvg2GNxZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/invite/config | IP: 127.0.0.1
  851. 15:17:16.132 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  852. 15:17:16.133 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  853. 15:17:16.134 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  854. 15:17:16.136 DEBUG [dvg2GNxZ] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_config ( reward_crawler_count, reward_type, reward_months, max_daily_reward, invite_code_expire_days, max_invite_per_day, max_total_invites, landing_title, landing_desc, app_name, status, share_title_template, copy_text_template, reward_description, summary_text_template, instruction_windows, instruction_app, instruction_miniapp, instruction_wechat, instruction_dingtalk, instruction_feishu, instruction_default, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  855. 15:17:16.137 DEBUG [dvg2GNxZ] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 0(Integer), MEMBERSHIP(String), 1(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), 待删除配置(String), 登录智价云(药店版),聚合比价查低价(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:16.136861100(LocalDateTime), 2026-07-02T15:17:16.136861100(LocalDateTime)
  856. 15:17:16.142 DEBUG [dvg2GNxZ] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
  857. 15:17:16.142 INFO [dvg2GNxZ] [1] [ main] c.x.i.s.InviteConfigService : 创建邀请配置: id=3, rewardType=MEMBERSHIP, rewardMonths=1
  858. 15:17:16.144 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  859. 15:17:16.144 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580347298521089(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.143202700(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 3(Long), INVITE_CONFIG_CREATE(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.144267500(LocalDateTime)
  860. 15:17:16.148 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  861. 15:17:16.148 WARN [dvg2GNxZ] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_CREATE, 结果: SUCCESS
  862. 15:17:16.149 DEBUG [dvg2GNxZ] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
  863. 15:17:16.150 DEBUG [dvg2GNxZ] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/invite/config 200 20ms
  864. MockHttpServletRequest:
  865. HTTP Method = POST
  866. Request URI = /api/admin/invite/config
  867. Parameters = {}
  868. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"65"]
  869. Body = {
  870. "rewardMonths": 1,
  871. "landingTitle": "待删除配置"
  872. }
  873. Session Attrs = {}
  874. Handler:
  875. Type = com.xuekairui.invite.controller.AdminController
  876. Method = com.xuekairui.invite.controller.AdminController#createInviteConfig(InviteConfigRequest, HttpServletRequest)
  877. Async:
  878. Async started = false
  879. Async result = null
  880. Resolved Exception:
  881. Type = null
  882. ModelAndView:
  883. View name = null
  884. View = null
  885. Model = null
  886. FlashMap:
  887. Attributes = null
  888. MockHttpServletResponse:
  889. Status = 200
  890. Error message = null
  891. Headers = [X-Request-Id:"dvg2GNxZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  892. Content type = application/json
  893. Body = {"code":200,"message":"操作成功","data":{"id":3,"rewardCrawlerCount":0,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"待删除配置","landingDesc":"登录智价云(药店版),聚合比价查低价","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"},"timestamp":1782976636149}
  894. Forwarded URL = null
  895. Redirected URL = null
  896. Cookies = []
  897. 15:17:16.156 DEBUG [wU6NaWCQ] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/invite/config/3 | IP: 127.0.0.1
  898. 15:17:16.160 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
  899. 15:17:16.160 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 3(Long)
  900. 15:17:16.162 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.selectById : <== Total: 1
  901. 15:17:16.164 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.deleteById : ==> Preparing: DELETE FROM t_invite_config WHERE id=?
  902. 15:17:16.164 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.deleteById : ==> Parameters: 3(Long)
  903. 15:17:16.168 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.deleteById : <== Updates: 1
  904. 15:17:16.169 INFO [wU6NaWCQ] [1] [ main] c.x.i.s.InviteConfigService : 删除邀请配置: id=3
  905. 15:17:16.169 DEBUG [wU6NaWCQ] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  906. 15:17:16.170 DEBUG [wU6NaWCQ] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580347428544513(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.169215(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 3(Long), INVITE_CONFIG_DELETE:3(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.169753900(LocalDateTime)
  907. 15:17:16.175 DEBUG [wU6NaWCQ] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  908. 15:17:16.175 WARN [wU6NaWCQ] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_DELETE:3, 结果: SUCCESS
  909. 15:17:16.175 DEBUG [wU6NaWCQ] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
  910. 15:17:16.176 DEBUG [wU6NaWCQ] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/invite/config/3 200 20ms
  911. MockHttpServletRequest:
  912. HTTP Method = DELETE
  913. Request URI = /api/admin/invite/config/3
  914. Parameters = {}
  915. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  916. Body = null
  917. Session Attrs = {}
  918. Handler:
  919. Type = com.xuekairui.invite.controller.AdminController
  920. Method = com.xuekairui.invite.controller.AdminController#deleteInviteConfig(Long, HttpServletRequest)
  921. Async:
  922. Async started = false
  923. Async result = null
  924. Resolved Exception:
  925. Type = null
  926. ModelAndView:
  927. View name = null
  928. View = null
  929. Model = null
  930. FlashMap:
  931. Attributes = null
  932. MockHttpServletResponse:
  933. Status = 200
  934. Error message = null
  935. Headers = [X-Request-Id:"wU6NaWCQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  936. Content type = application/json
  937. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976636175}
  938. Forwarded URL = null
  939. Redirected URL = null
  940. Cookies = []
  941. 15:17:16.179 DEBUG [fawATnUx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/3 | IP: 127.0.0.1
  942. 15:17:16.182 DEBUG [fawATnUx] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
  943. 15:17:16.183 DEBUG [fawATnUx] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 3(Long)
  944. 15:17:16.184 DEBUG [fawATnUx] [1] [ main] c.x.i.m.I.selectById : <== Total: 0
  945. 15:17:16.185 WARN [fawATnUx] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=邀请配置不存在
  946. 15:17:16.186 DEBUG [fawATnUx] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/3 200 7ms
  947. MockHttpServletRequest:
  948. HTTP Method = GET
  949. Request URI = /api/admin/invite/config/3
  950. Parameters = {}
  951. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  952. Body = null
  953. Session Attrs = {}
  954. Handler:
  955. Type = com.xuekairui.invite.controller.AdminController
  956. Method = com.xuekairui.invite.controller.AdminController#getInviteConfigById(Long)
  957. Async:
  958. Async started = false
  959. Async result = null
  960. Resolved Exception:
  961. Type = com.xuekairui.common.BusinessException
  962. ModelAndView:
  963. View name = null
  964. View = null
  965. Model = null
  966. FlashMap:
  967. Attributes = null
  968. MockHttpServletResponse:
  969. Status = 200
  970. Error message = null
  971. Headers = [X-Request-Id:"fawATnUx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  972. Content type = application/json
  973. Body = {"code":404,"message":"邀请配置不存在","data":null,"timestamp":1782976636185}
  974. Forwarded URL = null
  975. Redirected URL = null
  976. Cookies = []
  977. 15:17:16.198 DEBUG [sRsK3Bvh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?userId=1 | IP: 127.0.0.1
  978. 15:17:16.200 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  979. 15:17:16.200 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  980. 15:17:16.202 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  981. 15:17:16.205 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (user_id = ?) ORDER BY create_time DESC
  982. 15:17:16.205 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long)
  983. 15:17:16.207 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.C.selectList : <== Total: 1
  984. 15:17:16.208 DEBUG [sRsK3Bvh] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?userId=1 200 11ms
  985. MockHttpServletRequest:
  986. HTTP Method = GET
  987. Request URI = /api/admin/crawler/grants
  988. Parameters = {userId=[1]}
  989. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  990. Body = null
  991. Session Attrs = {}
  992. Handler:
  993. Type = com.xuekairui.invite.controller.AdminController
  994. Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
  995. Async:
  996. Async started = false
  997. Async result = null
  998. Resolved Exception:
  999. Type = null
  1000. ModelAndView:
  1001. View name = null
  1002. View = null
  1003. Model = null
  1004. FlashMap:
  1005. Attributes = null
  1006. MockHttpServletResponse:
  1007. Status = 200
  1008. Error message = null
  1009. Headers = [X-Request-Id:"sRsK3Bvh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1010. Content type = application/json
  1011. Body = {"code":200,"message":"操作成功","data":[{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"}],"timestamp":1782976636207}
  1012. Forwarded URL = null
  1013. Redirected URL = null
  1014. Cookies = []
  1015. 15:17:16.217 DEBUG [8Zm5EJRs] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=ADMIN | IP: 127.0.0.1
  1016. 15:17:16.220 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1017. 15:17:16.220 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1018. 15:17:16.222 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1019. 15:17:16.228 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (grant_type = ?) ORDER BY create_time DESC
  1020. 15:17:16.229 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: ADMIN(String)
  1021. 15:17:16.231 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.C.selectList : <== Total: 1
  1022. 15:17:16.232 DEBUG [8Zm5EJRs] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=ADMIN 200 15ms
  1023. MockHttpServletRequest:
  1024. HTTP Method = GET
  1025. Request URI = /api/admin/crawler/grants
  1026. Parameters = {grantType=[ADMIN]}
  1027. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1028. Body = null
  1029. Session Attrs = {}
  1030. Handler:
  1031. Type = com.xuekairui.invite.controller.AdminController
  1032. Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
  1033. Async:
  1034. Async started = false
  1035. Async result = null
  1036. Resolved Exception:
  1037. Type = null
  1038. ModelAndView:
  1039. View name = null
  1040. View = null
  1041. Model = null
  1042. FlashMap:
  1043. Attributes = null
  1044. MockHttpServletResponse:
  1045. Status = 200
  1046. Error message = null
  1047. Headers = [X-Request-Id:"8Zm5EJRs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1048. Content type = application/json
  1049. Body = {"code":200,"message":"操作成功","data":[{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"}],"timestamp":1782976636231}
  1050. Forwarded URL = null
  1051. Redirected URL = null
  1052. Cookies = []
  1053. 15:17:16.241 DEBUG [6KGQUg83] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=INVITE | IP: 127.0.0.1
  1054. 15:17:16.242 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1055. 15:17:16.244 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1056. 15:17:16.246 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1057. 15:17:16.248 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (grant_type = ?) ORDER BY create_time DESC
  1058. 15:17:16.248 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: INVITE(String)
  1059. 15:17:16.250 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  1060. 15:17:16.251 DEBUG [6KGQUg83] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=INVITE 200 10ms
  1061. MockHttpServletRequest:
  1062. HTTP Method = GET
  1063. Request URI = /api/admin/crawler/grants
  1064. Parameters = {grantType=[INVITE]}
  1065. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1066. Body = null
  1067. Session Attrs = {}
  1068. Handler:
  1069. Type = com.xuekairui.invite.controller.AdminController
  1070. Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
  1071. Async:
  1072. Async started = false
  1073. Async result = null
  1074. Resolved Exception:
  1075. Type = null
  1076. ModelAndView:
  1077. View name = null
  1078. View = null
  1079. Model = null
  1080. FlashMap:
  1081. Attributes = null
  1082. MockHttpServletResponse:
  1083. Status = 200
  1084. Error message = null
  1085. Headers = [X-Request-Id:"6KGQUg83", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1086. Content type = application/json
  1087. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636250}
  1088. Forwarded URL = null
  1089. Redirected URL = null
  1090. Cookies = []
  1091. 15:17:16.259 DEBUG [bnHwSmgV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=PURCHASE | IP: 127.0.0.1
  1092. 15:17:16.262 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1093. 15:17:16.262 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1094. 15:17:16.268 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1095. 15:17:16.270 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (grant_type = ?) ORDER BY create_time DESC
  1096. 15:17:16.270 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: PURCHASE(String)
  1097. 15:17:16.272 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  1098. 15:17:16.274 DEBUG [bnHwSmgV] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=PURCHASE 200 15ms
  1099. MockHttpServletRequest:
  1100. HTTP Method = GET
  1101. Request URI = /api/admin/crawler/grants
  1102. Parameters = {grantType=[PURCHASE]}
  1103. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1104. Body = null
  1105. Session Attrs = {}
  1106. Handler:
  1107. Type = com.xuekairui.invite.controller.AdminController
  1108. Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
  1109. Async:
  1110. Async started = false
  1111. Async result = null
  1112. Resolved Exception:
  1113. Type = null
  1114. ModelAndView:
  1115. View name = null
  1116. View = null
  1117. Model = null
  1118. FlashMap:
  1119. Attributes = null
  1120. MockHttpServletResponse:
  1121. Status = 200
  1122. Error message = null
  1123. Headers = [X-Request-Id:"bnHwSmgV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1124. Content type = application/json
  1125. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636273}
  1126. Forwarded URL = null
  1127. Redirected URL = null
  1128. Cookies = []
  1129. 15:17:16.286 DEBUG [9F5pxKKv] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards?userId=1 | IP: 127.0.0.1
  1130. 15:17:16.288 DEBUG [9F5pxKKv] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1131. 15:17:16.288 DEBUG [9F5pxKKv] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1132. 15:17:16.292 DEBUG [9F5pxKKv] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1133. 15:17:16.294 DEBUG [9F5pxKKv] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?) ORDER BY create_time DESC
  1134. 15:17:16.295 DEBUG [9F5pxKKv] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
  1135. 15:17:16.297 DEBUG [9F5pxKKv] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  1136. 15:17:16.299 DEBUG [9F5pxKKv] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards?userId=1 200 13ms
  1137. MockHttpServletRequest:
  1138. HTTP Method = GET
  1139. Request URI = /api/admin/invite/rewards
  1140. Parameters = {userId=[1]}
  1141. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1142. Body = null
  1143. Session Attrs = {}
  1144. Handler:
  1145. Type = com.xuekairui.invite.controller.AdminController
  1146. Method = com.xuekairui.invite.controller.AdminController#listInviteRewards(Long)
  1147. Async:
  1148. Async started = false
  1149. Async result = null
  1150. Resolved Exception:
  1151. Type = null
  1152. ModelAndView:
  1153. View name = null
  1154. View = null
  1155. Model = null
  1156. FlashMap:
  1157. Attributes = null
  1158. MockHttpServletResponse:
  1159. Status = 200
  1160. Error message = null
  1161. Headers = [X-Request-Id:"9F5pxKKv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1162. Content type = application/json
  1163. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636298}
  1164. Forwarded URL = null
  1165. Redirected URL = null
  1166. Cookies = []
  1167. 15:17:16.307 DEBUG [hngD3H9Z] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards | IP: 127.0.0.1
  1168. 15:17:16.310 DEBUG [hngD3H9Z] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1169. 15:17:16.310 DEBUG [hngD3H9Z] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1170. 15:17:16.312 DEBUG [hngD3H9Z] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1171. 15:17:16.316 DEBUG [hngD3H9Z] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards 200 9ms
  1172. MockHttpServletRequest:
  1173. HTTP Method = GET
  1174. Request URI = /api/admin/invite/rewards
  1175. Parameters = {}
  1176. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1177. Body = null
  1178. Session Attrs = {}
  1179. Handler:
  1180. Type = com.xuekairui.invite.controller.AdminController
  1181. Method = com.xuekairui.invite.controller.AdminController#listInviteRewards(Long)
  1182. Async:
  1183. Async started = false
  1184. Async result = null
  1185. Resolved Exception:
  1186. Type = null
  1187. ModelAndView:
  1188. View name = null
  1189. View = null
  1190. Model = null
  1191. FlashMap:
  1192. Attributes = null
  1193. MockHttpServletResponse:
  1194. Status = 200
  1195. Error message = null
  1196. Headers = [X-Request-Id:"hngD3H9Z", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1197. Content type = application/json
  1198. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636313}
  1199. Forwarded URL = null
  1200. Redirected URL = null
  1201. Cookies = []
  1202. 15:17:16.321 DEBUG [LdgkvbTT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards | IP: 127.0.0.1
  1203. 15:17:16.325 WARN [LdgkvbTT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards 401 4ms
  1204. MockHttpServletRequest:
  1205. HTTP Method = GET
  1206. Request URI = /api/admin/invite/rewards
  1207. Parameters = {}
  1208. Headers = []
  1209. Body = null
  1210. Session Attrs = {}
  1211. Handler:
  1212. Type = null
  1213. Async:
  1214. Async started = false
  1215. Async result = null
  1216. Resolved Exception:
  1217. Type = null
  1218. ModelAndView:
  1219. View name = null
  1220. View = null
  1221. Model = null
  1222. FlashMap:
  1223. Attributes = null
  1224. MockHttpServletResponse:
  1225. Status = 401
  1226. Error message = null
  1227. Headers = [X-Request-Id:"LdgkvbTT", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1228. Content type = application/json;charset=UTF-8
  1229. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976636323}
  1230. Forwarded URL = null
  1231. Redirected URL = null
  1232. Cookies = []
  1233. 15:17:16.332 DEBUG [bc33J4JU] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
  1234. 15:17:16.334 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1235. 15:17:16.334 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1236. 15:17:16.336 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1237. 15:17:16.338 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1238. 15:17:16.338 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1239. 15:17:16.340 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1240. 15:17:16.340 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  1241. 15:17:16.340 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  1242. 15:17:16.343 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  1243. 15:17:16.343 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  1244. 15:17:16.343 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  1245. 15:17:16.345 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  1246. 15:17:16.346 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as today_usage FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE() GROUP BY platform
  1247. 15:17:16.346 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Parameters: 1(Long)
  1248. 15:17:16.348 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTodayUsageByPlatform : <== Total: 0
  1249. 15:17:16.349 DEBUG [bc33J4JU] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as monthly_usage FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE()) GROUP BY platform
  1250. 15:17:16.349 DEBUG [bc33J4JU] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Parameters: 1(Long)
  1251. 15:17:16.351 DEBUG [bc33J4JU] [1] [ main] .m.C.sumMonthlyUsageByPlatform : <== Total: 0
  1252. 15:17:16.352 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as total_usage FROM t_crawler_usage_log WHERE user_id = ? GROUP BY platform
  1253. 15:17:16.352 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Parameters: 1(Long)
  1254. 15:17:16.354 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTotalUsageByPlatform : <== Total: 0
  1255. 15:17:16.357 DEBUG [bc33J4JU] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 200 25ms
  1256. MockHttpServletRequest:
  1257. HTTP Method = GET
  1258. Request URI = /api/admin/crawler/user-detail
  1259. Parameters = {userId=[1]}
  1260. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1261. Body = null
  1262. Session Attrs = {}
  1263. Handler:
  1264. Type = com.xuekairui.invite.controller.AdminController
  1265. Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)
  1266. Async:
  1267. Async started = false
  1268. Async result = null
  1269. Resolved Exception:
  1270. Type = null
  1271. ModelAndView:
  1272. View name = null
  1273. View = null
  1274. Model = null
  1275. FlashMap:
  1276. Attributes = null
  1277. MockHttpServletResponse:
  1278. Status = 200
  1279. Error message = null
  1280. Headers = [X-Request-Id:"bc33J4JU", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1281. Content type = application/json
  1282. Body = {"code":200,"message":"操作成功","data":{"userId":1,"nickname":"测试用户","phone":"138****8000","todayTotalUsage":0,"monthlyTotalUsage":0,"platformStats":[]},"timestamp":1782976636355}
  1283. Forwarded URL = null
  1284. Redirected URL = null
  1285. Cookies = []
  1286. 15:17:16.365 DEBUG [B6Zfqyac] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
  1287. 15:17:16.367 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1288. 15:17:16.368 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1289. 15:17:16.369 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1290. 15:17:16.371 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1291. 15:17:16.371 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1292. 15:17:16.373 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1293. 15:17:16.374 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  1294. 15:17:16.374 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  1295. 15:17:16.375 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  1296. 15:17:16.376 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  1297. 15:17:16.376 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  1298. 15:17:16.377 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  1299. 15:17:16.378 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as today_usage FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE() GROUP BY platform
  1300. 15:17:16.378 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Parameters: 1(Long)
  1301. 15:17:16.379 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTodayUsageByPlatform : <== Total: 0
  1302. 15:17:16.380 DEBUG [B6Zfqyac] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as monthly_usage FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE()) GROUP BY platform
  1303. 15:17:16.381 DEBUG [B6Zfqyac] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Parameters: 1(Long)
  1304. 15:17:16.382 DEBUG [B6Zfqyac] [1] [ main] .m.C.sumMonthlyUsageByPlatform : <== Total: 0
  1305. 15:17:16.383 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as total_usage FROM t_crawler_usage_log WHERE user_id = ? GROUP BY platform
  1306. 15:17:16.383 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Parameters: 1(Long)
  1307. 15:17:16.384 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTotalUsageByPlatform : <== Total: 0
  1308. 15:17:16.386 DEBUG [B6Zfqyac] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 200 21ms
  1309. MockHttpServletRequest:
  1310. HTTP Method = GET
  1311. Request URI = /api/admin/crawler/user-detail
  1312. Parameters = {userId=[1]}
  1313. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1314. Body = null
  1315. Session Attrs = {}
  1316. Handler:
  1317. Type = com.xuekairui.invite.controller.AdminController
  1318. Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)
  1319. Async:
  1320. Async started = false
  1321. Async result = null
  1322. Resolved Exception:
  1323. Type = null
  1324. ModelAndView:
  1325. View name = null
  1326. View = null
  1327. Model = null
  1328. FlashMap:
  1329. Attributes = null
  1330. MockHttpServletResponse:
  1331. Status = 200
  1332. Error message = null
  1333. Headers = [X-Request-Id:"B6Zfqyac", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1334. Content type = application/json
  1335. Body = {"code":200,"message":"操作成功","data":{"userId":1,"nickname":"测试用户","phone":"138****8000","todayTotalUsage":0,"monthlyTotalUsage":0,"platformStats":[]},"timestamp":1782976636385}
  1336. Forwarded URL = null
  1337. Redirected URL = null
  1338. Cookies = []
  1339. 15:17:16.394 DEBUG [8LyLGwu9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
  1340. 15:17:16.396 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1341. 15:17:16.396 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1342. 15:17:16.398 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1343. 15:17:16.399 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1344. 15:17:16.400 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1345. 15:17:16.401 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1346. 15:17:16.402 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  1347. 15:17:16.402 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  1348. 15:17:16.403 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  1349. 15:17:16.403 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  1350. 15:17:16.403 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  1351. 15:17:16.404 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  1352. 15:17:16.405 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as today_usage FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE() GROUP BY platform
  1353. 15:17:16.405 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Parameters: 1(Long)
  1354. 15:17:16.406 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTodayUsageByPlatform : <== Total: 0
  1355. 15:17:16.406 DEBUG [8LyLGwu9] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as monthly_usage FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE()) GROUP BY platform
  1356. 15:17:16.407 DEBUG [8LyLGwu9] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Parameters: 1(Long)
  1357. 15:17:16.407 DEBUG [8LyLGwu9] [1] [ main] .m.C.sumMonthlyUsageByPlatform : <== Total: 0
  1358. 15:17:16.407 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as total_usage FROM t_crawler_usage_log WHERE user_id = ? GROUP BY platform
  1359. 15:17:16.408 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Parameters: 1(Long)
  1360. 15:17:16.409 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTotalUsageByPlatform : <== Total: 0
  1361. 15:17:16.410 DEBUG [8LyLGwu9] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 200 16ms
  1362. MockHttpServletRequest:
  1363. HTTP Method = GET
  1364. Request URI = /api/admin/crawler/user-detail
  1365. Parameters = {userId=[1]}
  1366. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1367. Body = null
  1368. Session Attrs = {}
  1369. Handler:
  1370. Type = com.xuekairui.invite.controller.AdminController
  1371. Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)
  1372. Async:
  1373. Async started = false
  1374. Async result = null
  1375. Resolved Exception:
  1376. Type = null
  1377. ModelAndView:
  1378. View name = null
  1379. View = null
  1380. Model = null
  1381. FlashMap:
  1382. Attributes = null
  1383. MockHttpServletResponse:
  1384. Status = 200
  1385. Error message = null
  1386. Headers = [X-Request-Id:"8LyLGwu9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1387. Content type = application/json
  1388. Body = {"code":200,"message":"操作成功","data":{"userId":1,"nickname":"测试用户","phone":"138****8000","todayTotalUsage":0,"monthlyTotalUsage":0,"platformStats":[]},"timestamp":1782976636409}
  1389. Forwarded URL = null
  1390. Redirected URL = null
  1391. Cookies = []
  1392. 15:17:16.414 DEBUG [2MWUw8mC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
  1393. 15:17:16.417 WARN [2MWUw8mC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 401 3ms
  1394. MockHttpServletRequest:
  1395. HTTP Method = GET
  1396. Request URI = /api/admin/crawler/user-detail
  1397. Parameters = {userId=[1]}
  1398. Headers = []
  1399. Body = null
  1400. Session Attrs = {}
  1401. Handler:
  1402. Type = null
  1403. Async:
  1404. Async started = false
  1405. Async result = null
  1406. Resolved Exception:
  1407. Type = null
  1408. ModelAndView:
  1409. View name = null
  1410. View = null
  1411. Model = null
  1412. FlashMap:
  1413. Attributes = null
  1414. MockHttpServletResponse:
  1415. Status = 401
  1416. Error message = null
  1417. Headers = [X-Request-Id:"2MWUw8mC", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1418. Content type = application/json;charset=UTF-8
  1419. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976636415}
  1420. Forwarded URL = null
  1421. Redirected URL = null
  1422. Cookies = []
  1423. 15:17:16.424 DEBUG [YmJkmgxx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=999 | IP: 127.0.0.1
  1424. 15:17:16.426 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1425. 15:17:16.427 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1426. 15:17:16.429 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1427. 15:17:16.430 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1428. 15:17:16.431 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 999(Long)
  1429. 15:17:16.433 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 0
  1430. 15:17:16.434 WARN [YmJkmgxx] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1001, message=用户不存在
  1431. 15:17:16.435 DEBUG [YmJkmgxx] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=999 200 11ms
  1432. MockHttpServletRequest:
  1433. HTTP Method = GET
  1434. Request URI = /api/admin/crawler/user-detail
  1435. Parameters = {userId=[999]}
  1436. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1437. Body = null
  1438. Session Attrs = {}
  1439. Handler:
  1440. Type = com.xuekairui.invite.controller.AdminController
  1441. Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)
  1442. Async:
  1443. Async started = false
  1444. Async result = null
  1445. Resolved Exception:
  1446. Type = com.xuekairui.common.BusinessException
  1447. ModelAndView:
  1448. View name = null
  1449. View = null
  1450. Model = null
  1451. FlashMap:
  1452. Attributes = null
  1453. MockHttpServletResponse:
  1454. Status = 200
  1455. Error message = null
  1456. Headers = [X-Request-Id:"YmJkmgxx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1457. Content type = application/json
  1458. Body = {"code":1001,"message":"用户不存在","data":null,"timestamp":1782976636434}
  1459. Forwarded URL = null
  1460. Redirected URL = null
  1461. Cookies = []
  1462. 15:17:16.442 DEBUG [GhzxNaDh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
  1463. 15:17:16.444 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1464. 15:17:16.444 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1465. 15:17:16.446 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1466. 15:17:16.450 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  1467. 15:17:16.450 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:16.449071500(LocalDateTime)
  1468. 15:17:16.452 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  1469. 15:17:16.453 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  1470. 15:17:16.453 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  1471. 15:17:16.455 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 2
  1472. 15:17:16.457 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
  1473. 15:17:16.457 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: ZXHS9WYB(String)
  1474. 15:17:16.459 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
  1475. 15:17:16.460 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  1476. 15:17:16.460 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 1(Long), ZXHS9WYB(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:17:16.455971100(LocalDateTime), 1(Integer), 2026-07-02T15:17:16.460059700(LocalDateTime), 2026-07-02T15:17:16.460059700(LocalDateTime)
  1477. 15:17:16.464 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
  1478. 15:17:16.465 INFO [GhzxNaDh] [1] [ main] c.x.i.service.InviteService : 用户 1 创建邀请码: ZXHS9WYB
  1479. 15:17:16.465 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  1480. 15:17:16.465 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  1481. 15:17:16.467 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 2
  1482. 15:17:16.467 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1483. 15:17:16.467 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1484. 15:17:16.470 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1485. 15:17:16.477 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND code = ?)
  1486. 15:17:16.478 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), ZXHS9WYB(String)
  1487. 15:17:16.479 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  1488. 15:17:16.480 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
  1489. 15:17:16.480 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
  1490. 15:17:16.481 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  1491. 15:17:16.487 DEBUG [GhzxNaDh] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 200 45ms
  1492. MockHttpServletRequest:
  1493. HTTP Method = GET
  1494. Request URI = /api/admin/invite/conversion-stats
  1495. Parameters = {userId=[1]}
  1496. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1497. Body = null
  1498. Session Attrs = {}
  1499. Handler:
  1500. Type = com.xuekairui.invite.controller.AdminController
  1501. Method = com.xuekairui.invite.controller.AdminController#getInviteConversionStats(Long)
  1502. Async:
  1503. Async started = false
  1504. Async result = null
  1505. Resolved Exception:
  1506. Type = null
  1507. ModelAndView:
  1508. View name = null
  1509. View = null
  1510. Model = null
  1511. FlashMap:
  1512. Attributes = null
  1513. MockHttpServletResponse:
  1514. Status = 200
  1515. Error message = null
  1516. Headers = [X-Request-Id:"GhzxNaDh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1517. Content type = application/json
  1518. Body = {"code":200,"message":"操作成功","data":{"inviteCode":"ZXHS9WYB","clickedCount":0,"totalInvited":0,"registeredCount":0,"pendingCount":0,"conversionRate":0.0,"totalReward":0},"timestamp":1782976636483}
  1519. Forwarded URL = null
  1520. Redirected URL = null
  1521. Cookies = []
  1522. 15:17:16.496 DEBUG [8wtcvYkL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
  1523. 15:17:16.498 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1524. 15:17:16.498 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1525. 15:17:16.499 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1526. 15:17:16.502 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  1527. 15:17:16.502 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:16.501339600(LocalDateTime)
  1528. 15:17:16.504 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  1529. 15:17:16.505 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  1530. 15:17:16.505 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  1531. 15:17:16.508 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : <== Total: 2
  1532. 15:17:16.508 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1533. 15:17:16.508 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1534. 15:17:16.511 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1535. 15:17:16.512 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND code = ?)
  1536. 15:17:16.512 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), ZXHS9WYB(String)
  1537. 15:17:16.513 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  1538. 15:17:16.515 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
  1539. 15:17:16.515 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
  1540. 15:17:16.516 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  1541. 15:17:16.518 DEBUG [8wtcvYkL] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 200 22ms
  1542. MockHttpServletRequest:
  1543. HTTP Method = GET
  1544. Request URI = /api/admin/invite/conversion-stats
  1545. Parameters = {userId=[1]}
  1546. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1547. Body = null
  1548. Session Attrs = {}
  1549. Handler:
  1550. Type = com.xuekairui.invite.controller.AdminController
  1551. Method = com.xuekairui.invite.controller.AdminController#getInviteConversionStats(Long)
  1552. Async:
  1553. Async started = false
  1554. Async result = null
  1555. Resolved Exception:
  1556. Type = null
  1557. ModelAndView:
  1558. View name = null
  1559. View = null
  1560. Model = null
  1561. FlashMap:
  1562. Attributes = null
  1563. MockHttpServletResponse:
  1564. Status = 200
  1565. Error message = null
  1566. Headers = [X-Request-Id:"8wtcvYkL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1567. Content type = application/json
  1568. Body = {"code":200,"message":"操作成功","data":{"inviteCode":"ZXHS9WYB","clickedCount":0,"totalInvited":0,"registeredCount":0,"pendingCount":0,"conversionRate":0.0,"totalReward":0},"timestamp":1782976636517}
  1569. Forwarded URL = null
  1570. Redirected URL = null
  1571. Cookies = []
  1572. 15:17:16.527 DEBUG [zt4ALaK7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
  1573. 15:17:16.529 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1574. 15:17:16.529 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1575. 15:17:16.531 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1576. 15:17:16.533 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  1577. 15:17:16.533 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:16.532948600(LocalDateTime)
  1578. 15:17:16.535 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  1579. 15:17:16.536 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  1580. 15:17:16.536 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  1581. 15:17:16.539 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : <== Total: 2
  1582. 15:17:16.540 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1583. 15:17:16.540 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1584. 15:17:16.542 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1585. 15:17:16.543 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND code = ?)
  1586. 15:17:16.543 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), ZXHS9WYB(String)
  1587. 15:17:16.545 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  1588. 15:17:16.545 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
  1589. 15:17:16.545 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
  1590. 15:17:16.547 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  1591. 15:17:16.548 DEBUG [zt4ALaK7] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 200 21ms
  1592. MockHttpServletRequest:
  1593. HTTP Method = GET
  1594. Request URI = /api/admin/invite/conversion-stats
  1595. Parameters = {userId=[1]}
  1596. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
  1597. Body = null
  1598. Session Attrs = {}
  1599. Handler:
  1600. Type = com.xuekairui.invite.controller.AdminController
  1601. Method = com.xuekairui.invite.controller.AdminController#getInviteConversionStats(Long)
  1602. Async:
  1603. Async started = false
  1604. Async result = null
  1605. Resolved Exception:
  1606. Type = null
  1607. ModelAndView:
  1608. View name = null
  1609. View = null
  1610. Model = null
  1611. FlashMap:
  1612. Attributes = null
  1613. MockHttpServletResponse:
  1614. Status = 200
  1615. Error message = null
  1616. Headers = [X-Request-Id:"zt4ALaK7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1617. Content type = application/json
  1618. Body = {"code":200,"message":"操作成功","data":{"inviteCode":"ZXHS9WYB","clickedCount":0,"totalInvited":0,"registeredCount":0,"pendingCount":0,"conversionRate":0.0,"totalReward":0},"timestamp":1782976636547}
  1619. Forwarded URL = null
  1620. Redirected URL = null
  1621. Cookies = []
  1622. 15:17:16.553 DEBUG [gedevtrF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
  1623. 15:17:16.554 WARN [gedevtrF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 401 1ms
  1624. MockHttpServletRequest:
  1625. HTTP Method = GET
  1626. Request URI = /api/admin/invite/conversion-stats
  1627. Parameters = {userId=[1]}
  1628. Headers = []
  1629. Body = null
  1630. Session Attrs = {}
  1631. Handler:
  1632. Type = null
  1633. Async:
  1634. Async started = false
  1635. Async result = null
  1636. Resolved Exception:
  1637. Type = null
  1638. ModelAndView:
  1639. View name = null
  1640. View = null
  1641. Model = null
  1642. FlashMap:
  1643. Attributes = null
  1644. MockHttpServletResponse:
  1645. Status = 401
  1646. Error message = null
  1647. Headers = [X-Request-Id:"gedevtrF", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1648. Content type = application/json;charset=UTF-8
  1649. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976636554}
  1650. Forwarded URL = null
  1651. Redirected URL = null
  1652. Cookies = []
  1653. [INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 14.50 s -- in 运营管理接口测试
  1654. [INFO] Running 营业执照审核管理接口测试
  1655. 15:17:16.564 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.AdminLicenseTest]: AdminLicenseTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  1656. 15:17:16.566 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.AdminLicenseTest
  1657. 15:17:19.688 DEBUG [W3QF8V8z] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
  1658. 15:17:19.689 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1659. 15:17:19.690 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1660. 15:17:19.692 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1661. 15:17:19.697 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
  1662. 15:17:19.697 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
  1663. 15:17:19.700 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 0
  1664. 15:17:19.702 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.insert : ==> Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  1665. 15:17:19.703 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.insert : ==> Parameters: 1(Long), https://oss.example.com/license/review-test.jpg(String), 91110000MA12345678(String), 审核测试大药房(String), 李四(String), PENDING(String), false(Boolean), 2026-07-02T15:17:19.702277400(LocalDateTime), 2026-07-02T15:17:19.702277400(LocalDateTime)
  1666. 15:17:19.708 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.insert : <== Updates: 1
  1667. 15:17:19.709 DEBUG [W3QF8V8z] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 200 21ms
  1668. MockHttpServletRequest:
  1669. HTTP Method = POST
  1670. Request URI = /api/business-license/upload
  1671. Parameters = {}
  1672. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"191"]
  1673. Body = {
  1674. "licenseImageUrl": "https://oss.example.com/license/review-test.jpg",
  1675. "creditCode": "91110000MA12345678",
  1676. "pharmacyName": "审核测试大药房",
  1677. "legalPerson": "李四"
  1678. }
  1679. Session Attrs = {}
  1680. Handler:
  1681. Type = com.xuekairui.user.controller.BusinessLicenseController
  1682. Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
  1683. Async:
  1684. Async started = false
  1685. Async result = null
  1686. Resolved Exception:
  1687. Type = null
  1688. ModelAndView:
  1689. View name = null
  1690. View = null
  1691. Model = null
  1692. FlashMap:
  1693. Attributes = null
  1694. MockHttpServletResponse:
  1695. Status = 200
  1696. Error message = null
  1697. Headers = [X-Request-Id:"W3QF8V8z", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1698. Content type = application/json
  1699. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639708}
  1700. Forwarded URL = null
  1701. Redirected URL = null
  1702. Cookies = []
  1703. 15:17:19.716 DEBUG [eteEALJE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review | IP: 127.0.0.1
  1704. 15:17:19.717 DEBUG [eteEALJE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1705. 15:17:19.717 DEBUG [eteEALJE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1706. 15:17:19.720 DEBUG [eteEALJE] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1707. 15:17:19.722 DEBUG [eteEALJE] [1] [ main] c.x.u.m.B.selectList : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
  1708. 15:17:19.722 DEBUG [eteEALJE] [1] [ main] c.x.u.m.B.selectList : ==> Parameters: PENDING(String)
  1709. 15:17:19.724 DEBUG [eteEALJE] [1] [ main] c.x.u.m.B.selectList : <== Total: 1
  1710. 15:17:19.727 DEBUG [eteEALJE] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review 200 11ms
  1711. MockHttpServletRequest:
  1712. HTTP Method = GET
  1713. Request URI = /api/admin/license/review
  1714. Parameters = {}
  1715. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
  1716. Body = null
  1717. Session Attrs = {}
  1718. Handler:
  1719. Type = com.xuekairui.user.controller.AdminLicenseController
  1720. Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)
  1721. Async:
  1722. Async started = false
  1723. Async result = null
  1724. Resolved Exception:
  1725. Type = null
  1726. ModelAndView:
  1727. View name = null
  1728. View = null
  1729. Model = null
  1730. FlashMap:
  1731. Attributes = null
  1732. MockHttpServletResponse:
  1733. Status = 200
  1734. Error message = null
  1735. Headers = [X-Request-Id:"eteEALJE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1736. Content type = application/json
  1737. Body = {"code":200,"message":"操作成功","data":[{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/review-test.jpg","creditCode":"91110000MA12345678","pharmacyName":"审核测试大药房","legalPerson":"李四","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:20","updateTime":"2026-07-02 15:17:20"}],"timestamp":1782976639725}
  1738. Forwarded URL = null
  1739. Redirected URL = null
  1740. Cookies = []
  1741. 15:17:19.732 DEBUG [Cd5cRJYk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=PENDING | IP: 127.0.0.1
  1742. 15:17:19.735 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1743. 15:17:19.735 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1744. 15:17:19.737 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1745. 15:17:19.738 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.B.selectList : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
  1746. 15:17:19.738 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.B.selectList : ==> Parameters: PENDING(String)
  1747. 15:17:19.740 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.B.selectList : <== Total: 1
  1748. 15:17:19.741 DEBUG [Cd5cRJYk] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=PENDING 200 9ms
  1749. MockHttpServletRequest:
  1750. HTTP Method = GET
  1751. Request URI = /api/admin/license/review
  1752. Parameters = {reviewStatus=[PENDING]}
  1753. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
  1754. Body = null
  1755. Session Attrs = {}
  1756. Handler:
  1757. Type = com.xuekairui.user.controller.AdminLicenseController
  1758. Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)
  1759. Async:
  1760. Async started = false
  1761. Async result = null
  1762. Resolved Exception:
  1763. Type = null
  1764. ModelAndView:
  1765. View name = null
  1766. View = null
  1767. Model = null
  1768. FlashMap:
  1769. Attributes = null
  1770. MockHttpServletResponse:
  1771. Status = 200
  1772. Error message = null
  1773. Headers = [X-Request-Id:"Cd5cRJYk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1774. Content type = application/json
  1775. Body = {"code":200,"message":"操作成功","data":[{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/review-test.jpg","creditCode":"91110000MA12345678","pharmacyName":"审核测试大药房","legalPerson":"李四","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:20","updateTime":"2026-07-02 15:17:20"}],"timestamp":1782976639740}
  1776. Forwarded URL = null
  1777. Redirected URL = null
  1778. Cookies = []
  1779. 15:17:19.749 DEBUG [UDpvyY8r] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=APPROVED | IP: 127.0.0.1
  1780. 15:17:19.750 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1781. 15:17:19.750 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1782. 15:17:19.752 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1783. 15:17:19.754 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.B.selectList : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
  1784. 15:17:19.754 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.B.selectList : ==> Parameters: APPROVED(String)
  1785. 15:17:19.757 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.B.selectList : <== Total: 0
  1786. 15:17:19.758 DEBUG [UDpvyY8r] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=APPROVED 200 9ms
  1787. MockHttpServletRequest:
  1788. HTTP Method = GET
  1789. Request URI = /api/admin/license/review
  1790. Parameters = {reviewStatus=[APPROVED]}
  1791. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
  1792. Body = null
  1793. Session Attrs = {}
  1794. Handler:
  1795. Type = com.xuekairui.user.controller.AdminLicenseController
  1796. Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)
  1797. Async:
  1798. Async started = false
  1799. Async result = null
  1800. Resolved Exception:
  1801. Type = null
  1802. ModelAndView:
  1803. View name = null
  1804. View = null
  1805. Model = null
  1806. FlashMap:
  1807. Attributes = null
  1808. MockHttpServletResponse:
  1809. Status = 200
  1810. Error message = null
  1811. Headers = [X-Request-Id:"UDpvyY8r", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1812. Content type = application/json
  1813. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976639757}
  1814. Forwarded URL = null
  1815. Redirected URL = null
  1816. Cookies = []
  1817. 15:17:19.765 DEBUG [A8rHA8Lp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=REJECTED | IP: 127.0.0.1
  1818. 15:17:19.767 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1819. 15:17:19.767 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1820. 15:17:19.769 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1821. 15:17:19.771 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.B.selectList : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
  1822. 15:17:19.771 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.B.selectList : ==> Parameters: REJECTED(String)
  1823. 15:17:19.773 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.B.selectList : <== Total: 0
  1824. 15:17:19.774 DEBUG [A8rHA8Lp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=REJECTED 200 9ms
  1825. MockHttpServletRequest:
  1826. HTTP Method = GET
  1827. Request URI = /api/admin/license/review
  1828. Parameters = {reviewStatus=[REJECTED]}
  1829. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
  1830. Body = null
  1831. Session Attrs = {}
  1832. Handler:
  1833. Type = com.xuekairui.user.controller.AdminLicenseController
  1834. Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)
  1835. Async:
  1836. Async started = false
  1837. Async result = null
  1838. Resolved Exception:
  1839. Type = null
  1840. ModelAndView:
  1841. View name = null
  1842. View = null
  1843. Model = null
  1844. FlashMap:
  1845. Attributes = null
  1846. MockHttpServletResponse:
  1847. Status = 200
  1848. Error message = null
  1849. Headers = [X-Request-Id:"A8rHA8Lp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1850. Content type = application/json
  1851. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976639773}
  1852. Forwarded URL = null
  1853. Redirected URL = null
  1854. Cookies = []
  1855. 15:17:19.778 DEBUG [hRGUqmGh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review | IP: 127.0.0.1
  1856. 15:17:19.780 WARN [hRGUqmGh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review 401 2ms
  1857. MockHttpServletRequest:
  1858. HTTP Method = GET
  1859. Request URI = /api/admin/license/review
  1860. Parameters = {}
  1861. Headers = []
  1862. Body = null
  1863. Session Attrs = {}
  1864. Handler:
  1865. Type = null
  1866. Async:
  1867. Async started = false
  1868. Async result = null
  1869. Resolved Exception:
  1870. Type = null
  1871. ModelAndView:
  1872. View name = null
  1873. View = null
  1874. Model = null
  1875. FlashMap:
  1876. Attributes = null
  1877. MockHttpServletResponse:
  1878. Status = 401
  1879. Error message = null
  1880. Headers = [X-Request-Id:"hRGUqmGh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1881. Content type = application/json;charset=UTF-8
  1882. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976639779}
  1883. Forwarded URL = null
  1884. Redirected URL = null
  1885. Cookies = []
  1886. 15:17:19.787 DEBUG [zntcy4CM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
  1887. 15:17:19.789 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1888. 15:17:19.790 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1889. 15:17:19.792 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1890. 15:17:19.796 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
  1891. 15:17:19.797 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 1(Long)
  1892. 15:17:19.799 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectById : <== Total: 1
  1893. 15:17:19.801 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_business_license WHERE (user_id = ? AND review_status = ? AND id <> ?)
  1894. 15:17:19.801 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectCount : ==> Parameters: 1(Long), APPROVED(String), 1(Long)
  1895. 15:17:19.803 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectCount : <== Total: 1
  1896. 15:17:19.805 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1897. 15:17:19.805 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1898. 15:17:19.808 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1899. 15:17:19.809 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  1900. 15:17:19.809 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  1901. 15:17:19.811 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  1902. 15:17:19.812 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
  1903. 15:17:19.812 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
  1904. 15:17:19.815 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  1905. 15:17:19.816 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  1906. 15:17:19.816 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580362733559809(Long), 1(Long), PRO(String), LICENSE(String), 2026-07-02T15:17:19.815124(LocalDateTime), 2026-08-01T15:17:19.815124(LocalDateTime), 1(Integer), 营业执照审核通过赠送30天高级会员(String), 2026-07-02T15:17:19.816202700(LocalDateTime), 2026-07-02T15:17:19.816202700(LocalDateTime)
  1907. 15:17:19.819 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.insert : <== Updates: 1
  1908. 15:17:19.822 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, token_version=?, create_time=?, update_time=? WHERE id=?
  1909. 15:17:19.822 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:19.815124(LocalDateTime), 0(Long), 2026-07-02T15:17:19(LocalDateTime), 2026-07-02T15:17:19(LocalDateTime), 1(Long)
  1910. 15:17:19.825 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  1911. 15:17:19.830 INFO [zntcy4CM] [1] [ main] c.x.u.c.AdminLicenseController : 营业执照审核通过,赠送用户1 30天高级会员
  1912. 15:17:19.831 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.updateById : ==> Preparing: UPDATE t_business_license SET user_id=?, license_image_url=?, credit_code=?, pharmacy_name=?, legal_person=?, review_status=?, reviewer_id=?, review_time=?, show_verified_badge=?, create_time=?, update_time=? WHERE id=?
  1913. 15:17:19.831 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.updateById : ==> Parameters: 1(Long), https://oss.example.com/license/review-test.jpg(String), 91110000MA12345678(String), 审核测试大药房(String), 李四(String), APPROVED(String), 1(Long), 2026-07-02T15:17:19.830129500(LocalDateTime), true(Boolean), 2026-07-02T15:17:20(LocalDateTime), 2026-07-02T15:17:20(LocalDateTime), 1(Long)
  1914. 15:17:19.837 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.updateById : <== Updates: 1
  1915. 15:17:19.837 INFO [zntcy4CM] [1] [ main] c.x.u.c.AdminLicenseController : 营业执照审核完成: licenseId=1, action=APPROVED, reviewerId=1
  1916. 15:17:19.839 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  1917. 15:17:19.840 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580362800668673(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:19.837659700(LocalDateTime), LICENSE(String), APPROVE(String), 审核营业执照(通过)(String), LICENSE(String), 1(Long), LICENSE:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:19.839290300(LocalDateTime)
  1918. 15:17:19.845 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  1919. 15:17:19.845 WARN [zntcy4CM] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】审核营业执照(通过) - 操作人: 管理员(1), 目标: LICENSE:1, 结果: SUCCESS
  1920. 15:17:19.845 DEBUG [zntcy4CM] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 审核营业执照(通过)
  1921. 15:17:19.847 DEBUG [zntcy4CM] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 60ms
  1922. MockHttpServletRequest:
  1923. HTTP Method = POST
  1924. Request URI = /api/admin/license/review
  1925. Parameters = {}
  1926. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"49"]
  1927. Body = {
  1928. "licenseId": 1,
  1929. "action": "APPROVED"
  1930. }
  1931. Session Attrs = {}
  1932. Handler:
  1933. Type = com.xuekairui.user.controller.AdminLicenseController
  1934. Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
  1935. Async:
  1936. Async started = false
  1937. Async result = null
  1938. Resolved Exception:
  1939. Type = null
  1940. ModelAndView:
  1941. View name = null
  1942. View = null
  1943. Model = null
  1944. FlashMap:
  1945. Attributes = null
  1946. MockHttpServletResponse:
  1947. Status = 200
  1948. Error message = null
  1949. Headers = [X-Request-Id:"zntcy4CM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1950. Content type = application/json
  1951. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639846}
  1952. Forwarded URL = null
  1953. Redirected URL = null
  1954. Cookies = []
  1955. 15:17:19.853 DEBUG [HP6CLQJy] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
  1956. 15:17:19.853 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1957. 15:17:19.855 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1958. 15:17:19.857 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  1959. 15:17:19.859 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
  1960. 15:17:19.859 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 1(Long)
  1961. 15:17:19.861 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.B.selectById : <== Total: 1
  1962. 15:17:19.862 DEBUG [HP6CLQJy] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 9ms
  1963. MockHttpServletRequest:
  1964. HTTP Method = POST
  1965. Request URI = /api/admin/license/review
  1966. Parameters = {}
  1967. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"49"]
  1968. Body = {
  1969. "licenseId": 1,
  1970. "action": "APPROVED"
  1971. }
  1972. Session Attrs = {}
  1973. Handler:
  1974. Type = com.xuekairui.user.controller.AdminLicenseController
  1975. Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
  1976. Async:
  1977. Async started = false
  1978. Async result = null
  1979. Resolved Exception:
  1980. Type = null
  1981. ModelAndView:
  1982. View name = null
  1983. View = null
  1984. Model = null
  1985. FlashMap:
  1986. Attributes = null
  1987. MockHttpServletResponse:
  1988. Status = 200
  1989. Error message = null
  1990. Headers = [X-Request-Id:"HP6CLQJy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  1991. Content type = application/json
  1992. Body = {"code":400,"message":"该营业执照已审核,无法重复操作","data":null,"timestamp":1782976639861}
  1993. Forwarded URL = null
  1994. Redirected URL = null
  1995. Cookies = []
  1996. 15:17:19.869 DEBUG [a9cBADze] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
  1997. 15:17:19.870 DEBUG [a9cBADze] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  1998. 15:17:19.870 DEBUG [a9cBADze] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  1999. 15:17:19.872 DEBUG [a9cBADze] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2000. 15:17:19.874 DEBUG [a9cBADze] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
  2001. 15:17:19.874 DEBUG [a9cBADze] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 9999(Long)
  2002. 15:17:19.876 DEBUG [a9cBADze] [1] [ main] c.x.u.m.B.selectById : <== Total: 0
  2003. 15:17:19.877 DEBUG [a9cBADze] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 8ms
  2004. MockHttpServletRequest:
  2005. HTTP Method = POST
  2006. Request URI = /api/admin/license/review
  2007. Parameters = {}
  2008. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"52"]
  2009. Body = {
  2010. "licenseId": 9999,
  2011. "action": "APPROVED"
  2012. }
  2013. Session Attrs = {}
  2014. Handler:
  2015. Type = com.xuekairui.user.controller.AdminLicenseController
  2016. Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
  2017. Async:
  2018. Async started = false
  2019. Async result = null
  2020. Resolved Exception:
  2021. Type = null
  2022. ModelAndView:
  2023. View name = null
  2024. View = null
  2025. Model = null
  2026. FlashMap:
  2027. Attributes = null
  2028. MockHttpServletResponse:
  2029. Status = 200
  2030. Error message = null
  2031. Headers = [X-Request-Id:"a9cBADze", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2032. Content type = application/json
  2033. Body = {"code":404,"message":"营业执照记录不存在","data":null,"timestamp":1782976639876}
  2034. Forwarded URL = null
  2035. Redirected URL = null
  2036. Cookies = []
  2037. 15:17:19.884 DEBUG [zaeSjGPj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
  2038. 15:17:19.885 DEBUG [zaeSjGPj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2039. 15:17:19.885 DEBUG [zaeSjGPj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2040. 15:17:19.888 DEBUG [zaeSjGPj] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2041. 15:17:19.894 WARN [zaeSjGPj] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 审核动作不能为空
  2042. 15:17:19.898 WARN [zaeSjGPj] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 400 14ms
  2043. MockHttpServletRequest:
  2044. HTTP Method = POST
  2045. Request URI = /api/admin/license/review
  2046. Parameters = {}
  2047. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"23"]
  2048. Body = {
  2049. "licenseId": 1
  2050. }
  2051. Session Attrs = {}
  2052. Handler:
  2053. Type = com.xuekairui.user.controller.AdminLicenseController
  2054. Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
  2055. Async:
  2056. Async started = false
  2057. Async result = null
  2058. Resolved Exception:
  2059. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2060. ModelAndView:
  2061. View name = null
  2062. View = null
  2063. Model = null
  2064. FlashMap:
  2065. Attributes = null
  2066. MockHttpServletResponse:
  2067. Status = 400
  2068. Error message = null
  2069. Headers = [X-Request-Id:"zaeSjGPj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2070. Content type = application/json
  2071. Body = {"code":400,"message":"审核动作不能为空","data":null,"timestamp":1782976639894}
  2072. Forwarded URL = null
  2073. Redirected URL = null
  2074. Cookies = []
  2075. 15:17:19.906 DEBUG [AehShErK] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
  2076. 15:17:19.908 DEBUG [AehShErK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2077. 15:17:19.909 DEBUG [AehShErK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2078. 15:17:19.910 DEBUG [AehShErK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2079. 15:17:19.912 WARN [AehShErK] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 营业执照ID不能为空
  2080. 15:17:19.913 WARN [AehShErK] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 400 7ms
  2081. MockHttpServletRequest:
  2082. HTTP Method = POST
  2083. Request URI = /api/admin/license/review
  2084. Parameters = {}
  2085. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"29"]
  2086. Body = {
  2087. "action": "APPROVED"
  2088. }
  2089. Session Attrs = {}
  2090. Handler:
  2091. Type = com.xuekairui.user.controller.AdminLicenseController
  2092. Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
  2093. Async:
  2094. Async started = false
  2095. Async result = null
  2096. Resolved Exception:
  2097. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2098. ModelAndView:
  2099. View name = null
  2100. View = null
  2101. Model = null
  2102. FlashMap:
  2103. Attributes = null
  2104. MockHttpServletResponse:
  2105. Status = 400
  2106. Error message = null
  2107. Headers = [X-Request-Id:"AehShErK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2108. Content type = application/json
  2109. Body = {"code":400,"message":"营业执照ID不能为空","data":null,"timestamp":1782976639912}
  2110. Forwarded URL = null
  2111. Redirected URL = null
  2112. Cookies = []
  2113. 15:17:19.920 DEBUG [JZz75DCC] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
  2114. 15:17:19.921 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2115. 15:17:19.921 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2116. 15:17:19.924 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2117. 15:17:19.926 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
  2118. 15:17:19.926 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 1(Long)
  2119. 15:17:19.928 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.B.selectById : <== Total: 1
  2120. 15:17:19.929 DEBUG [JZz75DCC] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 9ms
  2121. MockHttpServletRequest:
  2122. HTTP Method = POST
  2123. Request URI = /api/admin/license/review
  2124. Parameters = {}
  2125. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"55"]
  2126. Body = {
  2127. "licenseId": 1,
  2128. "action": "INVALID_ACTION"
  2129. }
  2130. Session Attrs = {}
  2131. Handler:
  2132. Type = com.xuekairui.user.controller.AdminLicenseController
  2133. Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
  2134. Async:
  2135. Async started = false
  2136. Async result = null
  2137. Resolved Exception:
  2138. Type = null
  2139. ModelAndView:
  2140. View name = null
  2141. View = null
  2142. Model = null
  2143. FlashMap:
  2144. Attributes = null
  2145. MockHttpServletResponse:
  2146. Status = 200
  2147. Error message = null
  2148. Headers = [X-Request-Id:"JZz75DCC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2149. Content type = application/json
  2150. Body = {"code":400,"message":"该营业执照已审核,无法重复操作","data":null,"timestamp":1782976639928}
  2151. Forwarded URL = null
  2152. Redirected URL = null
  2153. Cookies = []
  2154. 15:17:19.936 DEBUG [xgZwQxRs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
  2155. 15:17:19.938 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2156. 15:17:19.938 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  2157. 15:17:19.941 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2158. 15:17:19.942 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
  2159. 15:17:19.942 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 2(Long)
  2160. 15:17:19.944 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.selectByUserId : <== Total: 0
  2161. 15:17:19.945 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.insert : ==> Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  2162. 15:17:19.945 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.insert : ==> Parameters: 2(Long), https://oss.example.com/license/reject-test.jpg(String), 91110000MA87654321(String), 拒绝测试药房(String), 王五(String), PENDING(String), false(Boolean), 2026-07-02T15:17:19.945305500(LocalDateTime), 2026-07-02T15:17:19.945305500(LocalDateTime)
  2163. 15:17:19.950 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.insert : <== Updates: 1
  2164. 15:17:19.952 DEBUG [xgZwQxRs] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 200 16ms
  2165. MockHttpServletRequest:
  2166. HTTP Method = POST
  2167. Request URI = /api/business-license/upload
  2168. Parameters = {}
  2169. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.wASNXjbYJawq1JLMKuHV07q7BI5ujDRaggX0qeCVnhjkotwlk8pR4Jhf-HIc1V7rE9fJiGUewBiqMb9qCj-80w", Content-Length:"188"]
  2170. Body = {
  2171. "licenseImageUrl": "https://oss.example.com/license/reject-test.jpg",
  2172. "creditCode": "91110000MA87654321",
  2173. "pharmacyName": "拒绝测试药房",
  2174. "legalPerson": "王五"
  2175. }
  2176. Session Attrs = {}
  2177. Handler:
  2178. Type = com.xuekairui.user.controller.BusinessLicenseController
  2179. Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
  2180. Async:
  2181. Async started = false
  2182. Async result = null
  2183. Resolved Exception:
  2184. Type = null
  2185. ModelAndView:
  2186. View name = null
  2187. View = null
  2188. Model = null
  2189. FlashMap:
  2190. Attributes = null
  2191. MockHttpServletResponse:
  2192. Status = 200
  2193. Error message = null
  2194. Headers = [X-Request-Id:"xgZwQxRs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2195. Content type = application/json
  2196. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639951}
  2197. Forwarded URL = null
  2198. Redirected URL = null
  2199. Cookies = []
  2200. 15:17:19.955 DEBUG [VP8B3MU8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
  2201. 15:17:19.956 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2202. 15:17:19.957 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2203. 15:17:19.958 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2204. 15:17:19.960 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
  2205. 15:17:19.960 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 2(Long)
  2206. 15:17:19.962 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.selectById : <== Total: 1
  2207. 15:17:19.963 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.updateById : ==> Preparing: UPDATE t_business_license SET user_id=?, license_image_url=?, credit_code=?, pharmacy_name=?, legal_person=?, review_status=?, reviewer_id=?, review_time=?, reject_reason=?, show_verified_badge=?, create_time=?, update_time=? WHERE id=?
  2208. 15:17:19.963 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.updateById : ==> Parameters: 2(Long), https://oss.example.com/license/reject-test.jpg(String), 91110000MA87654321(String), 拒绝测试药房(String), 王五(String), REJECTED(String), 1(Long), 2026-07-02T15:17:19.962838300(LocalDateTime), 营业执照图片不清晰,请重新上传(String), false(Boolean), 2026-07-02T15:17:20(LocalDateTime), 2026-07-02T15:17:20(LocalDateTime), 2(Long)
  2209. 15:17:19.969 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.updateById : <== Updates: 1
  2210. 15:17:19.969 INFO [VP8B3MU8] [1] [ main] c.x.u.c.AdminLicenseController : 营业执照审核完成: licenseId=2, action=REJECTED, reviewerId=1
  2211. 15:17:19.969 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  2212. 15:17:19.970 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580363375288321(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:19.969695100(LocalDateTime), LICENSE(String), REJECT(String), 审核营业执照(驳回)(String), LICENSE(String), 2(Long), LICENSE:2(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:19.969695100(LocalDateTime)
  2213. 15:17:19.975 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  2214. 15:17:19.975 WARN [VP8B3MU8] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】审核营业执照(驳回) - 操作人: 管理员(1), 目标: LICENSE:2, 结果: SUCCESS
  2215. 15:17:19.975 DEBUG [VP8B3MU8] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 审核营业执照(驳回)
  2216. 15:17:19.976 DEBUG [VP8B3MU8] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 21ms
  2217. MockHttpServletRequest:
  2218. HTTP Method = POST
  2219. Request URI = /api/admin/license/review
  2220. Parameters = {}
  2221. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"118"]
  2222. Body = {
  2223. "licenseId": 2,
  2224. "action": "REJECTED",
  2225. "rejectReason": "营业执照图片不清晰,请重新上传"
  2226. }
  2227. Session Attrs = {}
  2228. Handler:
  2229. Type = com.xuekairui.user.controller.AdminLicenseController
  2230. Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
  2231. Async:
  2232. Async started = false
  2233. Async result = null
  2234. Resolved Exception:
  2235. Type = null
  2236. ModelAndView:
  2237. View name = null
  2238. View = null
  2239. Model = null
  2240. FlashMap:
  2241. Attributes = null
  2242. MockHttpServletResponse:
  2243. Status = 200
  2244. Error message = null
  2245. Headers = [X-Request-Id:"VP8B3MU8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2246. Content type = application/json
  2247. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639975}
  2248. Forwarded URL = null
  2249. Redirected URL = null
  2250. Cookies = []
  2251. 15:17:19.980 DEBUG [k4AmgMGh] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
  2252. 15:17:19.984 WARN [k4AmgMGh] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 401 4ms
  2253. MockHttpServletRequest:
  2254. HTTP Method = POST
  2255. Request URI = /api/admin/license/review
  2256. Parameters = {}
  2257. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"35"]
  2258. Body = {"licenseId":1,"action":"APPROVED"}
  2259. Session Attrs = {}
  2260. Handler:
  2261. Type = null
  2262. Async:
  2263. Async started = false
  2264. Async result = null
  2265. Resolved Exception:
  2266. Type = null
  2267. ModelAndView:
  2268. View name = null
  2269. View = null
  2270. Model = null
  2271. FlashMap:
  2272. Attributes = null
  2273. MockHttpServletResponse:
  2274. Status = 401
  2275. Error message = null
  2276. Headers = [X-Request-Id:"k4AmgMGh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2277. Content type = application/json;charset=UTF-8
  2278. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976639981}
  2279. Forwarded URL = null
  2280. Redirected URL = null
  2281. Cookies = []
  2282. [INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.423 s -- in 营业执照审核管理接口测试
  2283. [INFO] Running 认证接口测试
  2284. 15:17:19.988 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.AuthControllerTest]: AuthControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  2285. 15:17:19.991 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.AuthControllerTest
  2286. 15:17:23.183 DEBUG [pGPbQ8bg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  2287. 15:17:23.200 WARN [pGPbQ8bg] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号格式不正确
  2288. 15:17:23.202 WARN [pGPbQ8bg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 19ms
  2289. MockHttpServletRequest:
  2290. HTTP Method = POST
  2291. Request URI = /api/auth/sms/send
  2292. Parameters = {}
  2293. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"31"]
  2294. Body = {"phone":"123","scene":"login"}
  2295. Session Attrs = {}
  2296. Handler:
  2297. Type = com.xuekairui.user.controller.AuthController
  2298. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  2299. Async:
  2300. Async started = false
  2301. Async result = null
  2302. Resolved Exception:
  2303. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2304. ModelAndView:
  2305. View name = null
  2306. View = null
  2307. Model = null
  2308. FlashMap:
  2309. Attributes = null
  2310. MockHttpServletResponse:
  2311. Status = 400
  2312. Error message = null
  2313. Headers = [X-Request-Id:"pGPbQ8bg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2314. Content type = application/json
  2315. Body = {"code":400,"message":"手机号格式不正确","data":null,"timestamp":1782976643200}
  2316. Forwarded URL = null
  2317. Redirected URL = null
  2318. Cookies = []
  2319. 15:17:23.207 DEBUG [Vxj6UchZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  2320. 15:17:23.212 WARN [Vxj6UchZ] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 场景参数不正确
  2321. 15:17:23.215 WARN [Vxj6UchZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 8ms
  2322. MockHttpServletRequest:
  2323. HTTP Method = POST
  2324. Request URI = /api/auth/sms/send
  2325. Parameters = {}
  2326. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"41"]
  2327. Body = {"phone":"13800138000","scene":"invalid"}
  2328. Session Attrs = {}
  2329. Handler:
  2330. Type = com.xuekairui.user.controller.AuthController
  2331. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  2332. Async:
  2333. Async started = false
  2334. Async result = null
  2335. Resolved Exception:
  2336. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2337. ModelAndView:
  2338. View name = null
  2339. View = null
  2340. Model = null
  2341. FlashMap:
  2342. Attributes = null
  2343. MockHttpServletResponse:
  2344. Status = 400
  2345. Error message = null
  2346. Headers = [X-Request-Id:"Vxj6UchZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2347. Content type = application/json
  2348. Body = {"code":400,"message":"场景参数不正确","data":null,"timestamp":1782976643212}
  2349. Forwarded URL = null
  2350. Redirected URL = null
  2351. Cookies = []
  2352. 15:17:23.227 DEBUG [kg6SHZMx] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  2353. 15:17:23.231 WARN [kg6SHZMx] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号不能为空, 场景不能为空
  2354. 15:17:23.233 WARN [kg6SHZMx] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 6ms
  2355. MockHttpServletRequest:
  2356. HTTP Method = POST
  2357. Request URI = /api/auth/sms/send
  2358. Parameters = {}
  2359. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  2360. Body = {}
  2361. Session Attrs = {}
  2362. Handler:
  2363. Type = com.xuekairui.user.controller.AuthController
  2364. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  2365. Async:
  2366. Async started = false
  2367. Async result = null
  2368. Resolved Exception:
  2369. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2370. ModelAndView:
  2371. View name = null
  2372. View = null
  2373. Model = null
  2374. FlashMap:
  2375. Attributes = null
  2376. MockHttpServletResponse:
  2377. Status = 400
  2378. Error message = null
  2379. Headers = [X-Request-Id:"kg6SHZMx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2380. Content type = application/json
  2381. Body = {"code":400,"message":"手机号不能为空, 场景不能为空","data":null,"timestamp":1782976643231}
  2382. Forwarded URL = null
  2383. Redirected URL = null
  2384. Cookies = []
  2385. 15:17:23.242 DEBUG [3kRA9yWY] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  2386. 15:17:23.245 WARN [3kRA9yWY] [] [ main] c.x.h.GlobalExceptionHandler : 请求体解析失败: JSON parse error: Unexpected character ('i' (code 105)): was expecting double-quote to start field name
  2387. 15:17:23.246 WARN [3kRA9yWY] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 4ms
  2388. MockHttpServletRequest:
  2389. HTTP Method = POST
  2390. Request URI = /api/auth/sms/send
  2391. Parameters = {}
  2392. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"14"]
  2393. Body = {invalid json}
  2394. Session Attrs = {}
  2395. Handler:
  2396. Type = com.xuekairui.user.controller.AuthController
  2397. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  2398. Async:
  2399. Async started = false
  2400. Async result = null
  2401. Resolved Exception:
  2402. Type = org.springframework.http.converter.HttpMessageNotReadableException
  2403. ModelAndView:
  2404. View name = null
  2405. View = null
  2406. Model = null
  2407. FlashMap:
  2408. Attributes = null
  2409. MockHttpServletResponse:
  2410. Status = 400
  2411. Error message = null
  2412. Headers = [X-Request-Id:"3kRA9yWY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2413. Content type = application/json
  2414. Body = {"code":400,"message":"请求体格式错误","data":null,"timestamp":1782976643245}
  2415. Forwarded URL = null
  2416. Redirected URL = null
  2417. Cookies = []
  2418. 15:17:23.252 DEBUG [zbZL4Mhm] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  2419. 15:17:23.254 WARN [zbZL4Mhm] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号不能为空, 手机号格式不正确
  2420. 15:17:23.255 WARN [zbZL4Mhm] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 3ms
  2421. MockHttpServletRequest:
  2422. HTTP Method = POST
  2423. Request URI = /api/auth/sms/send
  2424. Parameters = {}
  2425. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
  2426. Body = {"phone":"","scene":"login"}
  2427. Session Attrs = {}
  2428. Handler:
  2429. Type = com.xuekairui.user.controller.AuthController
  2430. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  2431. Async:
  2432. Async started = false
  2433. Async result = null
  2434. Resolved Exception:
  2435. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2436. ModelAndView:
  2437. View name = null
  2438. View = null
  2439. Model = null
  2440. FlashMap:
  2441. Attributes = null
  2442. MockHttpServletResponse:
  2443. Status = 400
  2444. Error message = null
  2445. Headers = [X-Request-Id:"zbZL4Mhm", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2446. Content type = application/json
  2447. Body = {"code":400,"message":"手机号不能为空, 手机号格式不正确","data":null,"timestamp":1782976643254}
  2448. Forwarded URL = null
  2449. Redirected URL = null
  2450. Cookies = []
  2451. 15:17:23.261 DEBUG [9cuUq8xa] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  2452. 15:17:23.262 INFO [9cuUq8xa] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
  2453. 15:17:24.390 INFO [9cuUq8xa] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
  2454. 15:17:24.392 WARN [9cuUq8xa] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 1131ms SLOW
  2455. MockHttpServletRequest:
  2456. HTTP Method = POST
  2457. Request URI = /api/auth/sms/send
  2458. Parameters = {}
  2459. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  2460. Body = {"phone":"13800138000","scene":"login"}
  2461. Session Attrs = {}
  2462. Handler:
  2463. Type = com.xuekairui.user.controller.AuthController
  2464. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  2465. Async:
  2466. Async started = false
  2467. Async result = null
  2468. Resolved Exception:
  2469. Type = null
  2470. ModelAndView:
  2471. View name = null
  2472. View = null
  2473. Model = null
  2474. FlashMap:
  2475. Attributes = null
  2476. MockHttpServletResponse:
  2477. Status = 200
  2478. Error message = null
  2479. Headers = [X-Request-Id:"9cuUq8xa", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2480. Content type = application/json
  2481. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976644390}
  2482. Forwarded URL = null
  2483. Redirected URL = null
  2484. Cookies = []
  2485. 15:17:24.403 DEBUG [Jb2pUWbJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  2486. 15:17:24.414 WARN [Jb2pUWbJ] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 验证码必须为6位数字
  2487. 15:17:24.417 WARN [Jb2pUWbJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 400 14ms
  2488. MockHttpServletRequest:
  2489. HTTP Method = POST
  2490. Request URI = /api/auth/smsc/login
  2491. Parameters = {}
  2492. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"36"]
  2493. Body = {"phone":"13800138000","code":"123"}
  2494. Session Attrs = {}
  2495. Handler:
  2496. Type = com.xuekairui.user.controller.AuthController
  2497. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  2498. Async:
  2499. Async started = false
  2500. Async result = null
  2501. Resolved Exception:
  2502. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2503. ModelAndView:
  2504. View name = null
  2505. View = null
  2506. Model = null
  2507. FlashMap:
  2508. Attributes = null
  2509. MockHttpServletResponse:
  2510. Status = 400
  2511. Error message = null
  2512. Headers = [X-Request-Id:"Jb2pUWbJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2513. Content type = application/json
  2514. Body = {"code":400,"message":"验证码必须为6位数字","data":null,"timestamp":1782976644415}
  2515. Forwarded URL = null
  2516. Redirected URL = null
  2517. Cookies = []
  2518. 15:17:24.428 DEBUG [RKzNsXPz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  2519. 15:17:24.490 WARN [RKzNsXPz] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1102, message=验证码错误或已过期
  2520. 15:17:24.492 DEBUG [RKzNsXPz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 64ms
  2521. MockHttpServletRequest:
  2522. HTTP Method = POST
  2523. Request URI = /api/auth/sms/login
  2524. Parameters = {}
  2525. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  2526. Body = {"phone":"13800138000","code":"000000"}
  2527. Session Attrs = {}
  2528. Handler:
  2529. Type = com.xuekairui.user.controller.AuthController
  2530. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  2531. Async:
  2532. Async started = false
  2533. Async result = null
  2534. Resolved Exception:
  2535. Type = com.xuekairui.common.BusinessException
  2536. ModelAndView:
  2537. View name = null
  2538. View = null
  2539. Model = null
  2540. FlashMap:
  2541. Attributes = null
  2542. MockHttpServletResponse:
  2543. Status = 200
  2544. Error message = null
  2545. Headers = [X-Request-Id:"RKzNsXPz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2546. Content type = application/json
  2547. Body = {"code":1102,"message":"验证码错误或已过期","data":null,"timestamp":1782976644490}
  2548. Forwarded URL = null
  2549. Redirected URL = null
  2550. Cookies = []
  2551. 15:17:24.500 DEBUG [nHJNesYZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  2552. 15:17:24.503 WARN [nHJNesYZ] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号不能为空, 验证码不能为空
  2553. 15:17:24.504 WARN [nHJNesYZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 400 4ms
  2554. MockHttpServletRequest:
  2555. HTTP Method = POST
  2556. Request URI = /api/auth/sms/login
  2557. Parameters = {}
  2558. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  2559. Body = {}
  2560. Session Attrs = {}
  2561. Handler:
  2562. Type = com.xuekairui.user.controller.AuthController
  2563. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  2564. Async:
  2565. Async started = false
  2566. Async result = null
  2567. Resolved Exception:
  2568. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2569. ModelAndView:
  2570. View name = null
  2571. View = null
  2572. Model = null
  2573. FlashMap:
  2574. Attributes = null
  2575. MockHttpServletResponse:
  2576. Status = 400
  2577. Error message = null
  2578. Headers = [X-Request-Id:"nHJNesYZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2579. Content type = application/json
  2580. Body = {"code":400,"message":"手机号不能为空, 验证码不能为空","data":null,"timestamp":1782976644503}
  2581. Forwarded URL = null
  2582. Redirected URL = null
  2583. Cookies = []
  2584. 15:17:24.509 DEBUG [tbeAphLL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  2585. 15:17:24.512 WARN [tbeAphLL] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号格式不正确
  2586. 15:17:24.513 WARN [tbeAphLL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 400 4ms
  2587. MockHttpServletRequest:
  2588. HTTP Method = POST
  2589. Request URI = /api/auth/sms/login
  2590. Parameters = {}
  2591. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"31"]
  2592. Body = {"phone":"123","code":"123456"}
  2593. Session Attrs = {}
  2594. Handler:
  2595. Type = com.xuekairui.user.controller.AuthController
  2596. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  2597. Async:
  2598. Async started = false
  2599. Async result = null
  2600. Resolved Exception:
  2601. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2602. ModelAndView:
  2603. View name = null
  2604. View = null
  2605. Model = null
  2606. FlashMap:
  2607. Attributes = null
  2608. MockHttpServletResponse:
  2609. Status = 400
  2610. Error message = null
  2611. Headers = [X-Request-Id:"tbeAphLL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2612. Content type = application/json
  2613. Body = {"code":400,"message":"手机号格式不正确","data":null,"timestamp":1782976644512}
  2614. Forwarded URL = null
  2615. Redirected URL = null
  2616. Cookies = []
  2617. 15:17:24.520 DEBUG [cT4g62cq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  2618. 15:17:24.534 WARN [cT4g62cq] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1102, message=验证码错误或已过期
  2619. 15:17:24.535 DEBUG [cT4g62cq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 15ms
  2620. MockHttpServletRequest:
  2621. HTTP Method = POST
  2622. Request URI = /api/auth/sms/login
  2623. Parameters = {}
  2624. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"61"]
  2625. Body = {"phone":"13800138000","code":"000000","inviteCode":"ABC123"}
  2626. Session Attrs = {}
  2627. Handler:
  2628. Type = com.xuekairui.user.controller.AuthController
  2629. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  2630. Async:
  2631. Async started = false
  2632. Async result = null
  2633. Resolved Exception:
  2634. Type = com.xuekairui.common.BusinessException
  2635. ModelAndView:
  2636. View name = null
  2637. View = null
  2638. Model = null
  2639. FlashMap:
  2640. Attributes = null
  2641. MockHttpServletResponse:
  2642. Status = 200
  2643. Error message = null
  2644. Headers = [X-Request-Id:"cT4g62cq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2645. Content type = application/json
  2646. Body = {"code":1102,"message":"验证码错误或已过期","data":null,"timestamp":1782976644534}
  2647. Forwarded URL = null
  2648. Redirected URL = null
  2649. Cookies = []
  2650. 15:17:24.543 DEBUG [GZv2XxD5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url | IP: 127.0.0.1
  2651. 15:17:24.546 DEBUG [GZv2XxD5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url 200 3ms
  2652. MockHttpServletRequest:
  2653. HTTP Method = GET
  2654. Request URI = /api/auth/wechat/url
  2655. Parameters = {}
  2656. Headers = []
  2657. Body = null
  2658. Session Attrs = {}
  2659. Handler:
  2660. Type = com.xuekairui.user.controller.AuthController
  2661. Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)
  2662. Async:
  2663. Async started = false
  2664. Async result = null
  2665. Resolved Exception:
  2666. Type = null
  2667. ModelAndView:
  2668. View name = null
  2669. View = null
  2670. Model = null
  2671. FlashMap:
  2672. Attributes = null
  2673. MockHttpServletResponse:
  2674. Status = 200
  2675. Error message = null
  2676. Headers = [X-Request-Id:"GZv2XxD5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2677. Content type = application/json
  2678. Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=login#wechat_redirect","timestamp":1782976644545}
  2679. Forwarded URL = null
  2680. Redirected URL = null
  2681. Cookies = []
  2682. 15:17:24.556 DEBUG [SqPJdmV7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url?state=custom_state | IP: 127.0.0.1
  2683. 15:17:24.560 DEBUG [SqPJdmV7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url?state=custom_state 200 4ms
  2684. MockHttpServletRequest:
  2685. HTTP Method = GET
  2686. Request URI = /api/auth/wechat/url
  2687. Parameters = {state=[custom_state]}
  2688. Headers = []
  2689. Body = null
  2690. Session Attrs = {}
  2691. Handler:
  2692. Type = com.xuekairui.user.controller.AuthController
  2693. Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)
  2694. Async:
  2695. Async started = false
  2696. Async result = null
  2697. Resolved Exception:
  2698. Type = null
  2699. ModelAndView:
  2700. View name = null
  2701. View = null
  2702. Model = null
  2703. FlashMap:
  2704. Attributes = null
  2705. MockHttpServletResponse:
  2706. Status = 200
  2707. Error message = null
  2708. Headers = [X-Request-Id:"SqPJdmV7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2709. Content type = application/json
  2710. Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=custom_state#wechat_redirect","timestamp":1782976644559}
  2711. Forwarded URL = null
  2712. Redirected URL = null
  2713. Cookies = []
  2714. 15:17:24.569 DEBUG [WHJCCZEV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/callback | IP: 127.0.0.1
  2715. 15:17:24.574 DEBUG [WHJCCZEV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/callback 200 5ms
  2716. MockHttpServletRequest:
  2717. HTTP Method = GET
  2718. Request URI = /api/auth/wechat/callback
  2719. Parameters = {code=[test_code], state=[login]}
  2720. Headers = []
  2721. Body = null
  2722. Session Attrs = {}
  2723. Handler:
  2724. Type = com.xuekairui.user.controller.AuthController
  2725. Method = com.xuekairui.user.controller.AuthController#wechatCallback(String)
  2726. Async:
  2727. Async started = false
  2728. Async result = null
  2729. Resolved Exception:
  2730. Type = null
  2731. ModelAndView:
  2732. View name = null
  2733. View = null
  2734. Model = null
  2735. FlashMap:
  2736. Attributes = null
  2737. MockHttpServletResponse:
  2738. Status = 200
  2739. Error message = null
  2740. Headers = [X-Request-Id:"WHJCCZEV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2741. Content type = application/json
  2742. Body = {"code":200,"message":"操作成功","data":"https://your-domain.com/wechat-login?code=test_code","timestamp":1782976644572}
  2743. Forwarded URL = null
  2744. Redirected URL = null
  2745. Cookies = []
  2746. 15:17:24.581 DEBUG [wRWSAc4N] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/wechat/login | IP: 127.0.0.1
  2747. 15:17:24.588 WARN [wRWSAc4N] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 授权码不能为空
  2748. 15:17:24.589 WARN [wRWSAc4N] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/wechat/login 400 9ms
  2749. MockHttpServletRequest:
  2750. HTTP Method = POST
  2751. Request URI = /api/auth/wechat/login
  2752. Parameters = {}
  2753. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  2754. Body = {}
  2755. Session Attrs = {}
  2756. Handler:
  2757. Type = com.xuekairui.user.controller.AuthController
  2758. Method = com.xuekairui.user.controller.AuthController#wechatLogin(WechatLoginRequest, HttpServletRequest)
  2759. Async:
  2760. Async started = false
  2761. Async result = null
  2762. Resolved Exception:
  2763. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2764. ModelAndView:
  2765. View name = null
  2766. View = null
  2767. Model = null
  2768. FlashMap:
  2769. Attributes = null
  2770. MockHttpServletResponse:
  2771. Status = 400
  2772. Error message = null
  2773. Headers = [X-Request-Id:"wRWSAc4N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2774. Content type = application/json
  2775. Body = {"code":400,"message":"授权码不能为空","data":null,"timestamp":1782976644588}
  2776. Forwarded URL = null
  2777. Redirected URL = null
  2778. Cookies = []
  2779. 15:17:24.595 DEBUG [PKPEjKFs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/wechat/bind | IP: 127.0.0.1
  2780. 15:17:24.603 WARN [PKPEjKFs] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 验证码不能为空, 手机号不能为空, 临时令牌不能为空
  2781. 15:17:24.605 WARN [PKPEjKFs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/wechat/bind 400 10ms
  2782. MockHttpServletRequest:
  2783. HTTP Method = POST
  2784. Request URI = /api/auth/wechat/bind
  2785. Parameters = {}
  2786. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  2787. Body = {}
  2788. Session Attrs = {}
  2789. Handler:
  2790. Type = com.xuekairui.user.controller.AuthController
  2791. Method = com.xuekairui.user.controller.AuthController#wechatBind(WechatBindRequest, HttpServletRequest)
  2792. Async:
  2793. Async started = false
  2794. Async result = null
  2795. Resolved Exception:
  2796. Type = org.springframework.web.bind.MethodArgumentNotValidException
  2797. ModelAndView:
  2798. View name = null
  2799. View = null
  2800. Model = null
  2801. FlashMap:
  2802. Attributes = null
  2803. MockHttpServletResponse:
  2804. Status = 400
  2805. Error message = null
  2806. Headers = [X-Request-Id:"PKPEjKFs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2807. Content type = application/json
  2808. Body = {"code":400,"message":"验证码不能为空, 手机号不能为空, 临时令牌不能为空","data":null,"timestamp":1782976644603}
  2809. Forwarded URL = null
  2810. Redirected URL = null
  2811. Cookies = []
  2812. 15:17:24.619 DEBUG [Z3awMk9N] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  2813. 15:17:24.620 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2814. 15:17:24.620 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2815. 15:17:24.624 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2816. 15:17:24.626 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2817. 15:17:24.626 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2818. 15:17:24.629 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2819. 15:17:24.631 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2820. 15:17:24.631 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2821. 15:17:24.635 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2822. 15:17:24.636 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  2823. 15:17:24.636 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  2824. 15:17:24.640 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  2825. 15:17:24.644 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  2826. 15:17:24.645 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  2827. 15:17:24.649 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  2828. 15:17:24.658 DEBUG [Z3awMk9N] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 200 39ms
  2829. MockHttpServletRequest:
  2830. HTTP Method = GET
  2831. Request URI = /api/auth/user/info
  2832. Parameters = {}
  2833. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDQsImV4cCI6MTc4MzA2MzA0NH0.wiVzmckqvuV9e3DWmdEK5mofBpDHjYbGyFsFAdByiL3_WYqvIBowpWsFKCifPj63_hI0oNkO-qNhKSXmaLTIuQ"]
  2834. Body = null
  2835. Session Attrs = {}
  2836. Handler:
  2837. Type = com.xuekairui.user.controller.AuthController
  2838. Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
  2839. Async:
  2840. Async started = false
  2841. Async result = null
  2842. Resolved Exception:
  2843. Type = null
  2844. ModelAndView:
  2845. View name = null
  2846. View = null
  2847. Model = null
  2848. FlashMap:
  2849. Attributes = null
  2850. MockHttpServletResponse:
  2851. Status = 200
  2852. Error message = null
  2853. Headers = [X-Request-Id:"Z3awMk9N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2854. Content type = application/json
  2855. Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:22","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"timestamp":1782976644651}
  2856. Forwarded URL = null
  2857. Redirected URL = null
  2858. Cookies = []
  2859. 15:17:24.664 DEBUG [88xsVdaF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  2860. 15:17:24.667 WARN [88xsVdaF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 3ms
  2861. MockHttpServletRequest:
  2862. HTTP Method = GET
  2863. Request URI = /api/auth/user/info
  2864. Parameters = {}
  2865. Headers = []
  2866. Body = null
  2867. Session Attrs = {}
  2868. Handler:
  2869. Type = null
  2870. Async:
  2871. Async started = false
  2872. Async result = null
  2873. Resolved Exception:
  2874. Type = null
  2875. ModelAndView:
  2876. View name = null
  2877. View = null
  2878. Model = null
  2879. FlashMap:
  2880. Attributes = null
  2881. MockHttpServletResponse:
  2882. Status = 401
  2883. Error message = null
  2884. Headers = [X-Request-Id:"88xsVdaF", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2885. Content type = application/json;charset=UTF-8
  2886. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976644665}
  2887. Forwarded URL = null
  2888. Redirected URL = null
  2889. Cookies = []
  2890. 15:17:24.674 DEBUG [kK7ZX6Bz] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  2891. 15:17:24.698 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2892. 15:17:24.699 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2893. 15:17:24.710 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2894. 15:17:24.711 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2895. 15:17:24.712 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2896. 15:17:24.714 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2897. 15:17:24.714 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  2898. 15:17:24.715 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  2899. 15:17:24.717 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  2900. 15:17:24.718 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  2901. 15:17:24.718 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  2902. 15:17:24.720 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  2903. 15:17:24.721 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  2904. 15:17:24.721 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  2905. 15:17:24.724 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  2906. 15:17:24.726 DEBUG [kK7ZX6Bz] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 200 52ms
  2907. MockHttpServletRequest:
  2908. HTTP Method = GET
  2909. Request URI = /api/auth/user/info
  2910. Parameters = {}
  2911. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJwaG9uZSI6IjEzODAwMTM4MDAwIiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4MjgwMzg0NCwiZXhwIjoxNzgyODkwMjQ0fQ.VTKAD6i2z7RYXEF7pNHYnoE_U1fmxYRtBRgI3KZi4oyL3KERN9Z1uCNsc_jbLrtyJNguyQAp302P8DNEi1MlWQ"]
  2912. Body = null
  2913. Session Attrs = {}
  2914. Handler:
  2915. Type = com.xuekairui.user.controller.AuthController
  2916. Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
  2917. Async:
  2918. Async started = false
  2919. Async result = null
  2920. Resolved Exception:
  2921. Type = null
  2922. ModelAndView:
  2923. View name = null
  2924. View = null
  2925. Model = null
  2926. FlashMap:
  2927. Attributes = null
  2928. MockHttpServletResponse:
  2929. Status = 200
  2930. Error message = null
  2931. Headers = [X-Request-Id:"kK7ZX6Bz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2932. Content type = application/json
  2933. Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:22","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"timestamp":1782976644725}
  2934. Forwarded URL = null
  2935. Redirected URL = null
  2936. Cookies = []
  2937. MockHttpServletRequest:
  2938. HTTP Method = GET
  2939. Request URI = /api/auth/user/info
  2940. Parameters = {}
  2941. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJwaG9uZSI6IjEzODAwMTM4MDAwIiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4MjgwMzg0NCwiZXhwIjoxNzgyODkwMjQ0fQ.VTKAD6i2z7RYXEF7pNHYnoE_U1fmxYRtBRgI3KZi4oyL3KERN9Z1uCNsc_jbLrtyJNguyQAp302P8DNEi1MlWQ"]
  2942. Body = null
  2943. Session Attrs = {}
  2944. Handler:
  2945. Type = com.xuekairui.user.controller.AuthController
  2946. Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
  2947. Async:
  2948. Async started = false
  2949. Async result = null
  2950. Resolved Exception:
  2951. Type = null
  2952. ModelAndView:
  2953. View name = null
  2954. View = null
  2955. Model = null
  2956. FlashMap:
  2957. Attributes = null
  2958. MockHttpServletResponse:
  2959. Status = 200
  2960. Error message = null
  2961. Headers = [X-Request-Id:"kK7ZX6Bz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2962. Content type = application/json
  2963. Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:22","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"timestamp":1782976644725}
  2964. Forwarded URL = null
  2965. Redirected URL = null
  2966. Cookies = []
  2967. 15:17:24.746 DEBUG [JVvGBn4s] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  2968. 15:17:24.749 WARN [JVvGBn4s] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 3
  2969. 15:17:24.750 WARN [JVvGBn4s] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 3
  2970. 15:17:24.750 WARN [JVvGBn4s] [] [ main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
  2971. 15:17:24.753 WARN [JVvGBn4s] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 7ms
  2972. MockHttpServletRequest:
  2973. HTTP Method = GET
  2974. Request URI = /api/auth/user/info
  2975. Parameters = {}
  2976. Headers = [Authorization:"Bearer not.a.valid.jwt"]
  2977. Body = null
  2978. Session Attrs = {}
  2979. Handler:
  2980. Type = null
  2981. Async:
  2982. Async started = false
  2983. Async result = null
  2984. Resolved Exception:
  2985. Type = null
  2986. ModelAndView:
  2987. View name = null
  2988. View = null
  2989. Model = null
  2990. FlashMap:
  2991. Attributes = null
  2992. MockHttpServletResponse:
  2993. Status = 401
  2994. Error message = null
  2995. Headers = [X-Request-Id:"JVvGBn4s", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  2996. Content type = application/json;charset=UTF-8
  2997. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976644751}
  2998. Forwarded URL = null
  2999. Redirected URL = null
  3000. Cookies = []
  3001. 15:17:24.763 DEBUG [4MxmwV4S] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  3002. 15:17:24.766 WARN [4MxmwV4S] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 3ms
  3003. MockHttpServletRequest:
  3004. HTTP Method = GET
  3005. Request URI = /api/auth/user/info
  3006. Parameters = {}
  3007. Headers = [Authorization:"Bearer "]
  3008. Body = null
  3009. Session Attrs = {}
  3010. Handler:
  3011. Type = null
  3012. Async:
  3013. Async started = false
  3014. Async result = null
  3015. Resolved Exception:
  3016. Type = null
  3017. ModelAndView:
  3018. View name = null
  3019. View = null
  3020. Model = null
  3021. FlashMap:
  3022. Attributes = null
  3023. MockHttpServletResponse:
  3024. Status = 401
  3025. Error message = null
  3026. Headers = [X-Request-Id:"4MxmwV4S", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3027. Content type = application/json;charset=UTF-8
  3028. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976644764}
  3029. Forwarded URL = null
  3030. Redirected URL = null
  3031. Cookies = []
  3032. 15:17:24.782 DEBUG [Wq4gpETA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  3033. 15:17:24.785 WARN [Wq4gpETA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 3ms
  3034. MockHttpServletRequest:
  3035. HTTP Method = GET
  3036. Request URI = /api/auth/user/info
  3037. Parameters = {}
  3038. Headers = [Authorization:"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDQsImV4cCI6MTc4MzA2MzA0NH0.wiVzmckqvuV9e3DWmdEK5mofBpDHjYbGyFsFAdByiL3_WYqvIBowpWsFKCifPj63_hI0oNkO-qNhKSXmaLTIuQ"]
  3039. Body = null
  3040. Session Attrs = {}
  3041. Handler:
  3042. Type = null
  3043. Async:
  3044. Async started = false
  3045. Async result = null
  3046. Resolved Exception:
  3047. Type = null
  3048. ModelAndView:
  3049. View name = null
  3050. View = null
  3051. Model = null
  3052. FlashMap:
  3053. Attributes = null
  3054. MockHttpServletResponse:
  3055. Status = 401
  3056. Error message = null
  3057. Headers = [X-Request-Id:"Wq4gpETA", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3058. Content type = application/json;charset=UTF-8
  3059. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976644783}
  3060. Forwarded URL = null
  3061. Redirected URL = null
  3062. Cookies = []
  3063. 15:17:24.792 DEBUG [c9t3xmwH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh | IP: 127.0.0.1
  3064. 15:17:24.801 WARN [c9t3xmwH] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析Token失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
  3065. 15:17:24.807 WARN [c9t3xmwH] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1302, message=Token无效
  3066. 15:17:24.809 DEBUG [c9t3xmwH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh 200 17ms
  3067. MockHttpServletRequest:
  3068. HTTP Method = POST
  3069. Request URI = /api/auth/refresh
  3070. Parameters = {}
  3071. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"40"]
  3072. Body = {"refreshToken":"invalid_refresh_token"}
  3073. Session Attrs = {}
  3074. Handler:
  3075. Type = com.xuekairui.user.controller.AuthController
  3076. Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)
  3077. Async:
  3078. Async started = false
  3079. Async result = null
  3080. Resolved Exception:
  3081. Type = com.xuekairui.common.BusinessException
  3082. ModelAndView:
  3083. View name = null
  3084. View = null
  3085. Model = null
  3086. FlashMap:
  3087. Attributes = null
  3088. MockHttpServletResponse:
  3089. Status = 200
  3090. Error message = null
  3091. Headers = [X-Request-Id:"c9t3xmwH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3092. Content type = application/json
  3093. Body = {"code":1302,"message":"Token无效","data":null,"timestamp":1782976644807}
  3094. Forwarded URL = null
  3095. Redirected URL = null
  3096. Cookies = []
  3097. [ERROR] Tests run: 23, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 4.833 s <<< FAILURE! -- in 认证接口测试
  3098. [ERROR] com.xuekairui.gateway.AuthControllerTest.getUserInfo_withExpiredToken_shouldReturn401 -- Time elapsed: 0.064 s <<< FAILURE!
  3099. java.lang.AssertionError: Status expected:<401> but was:<200>
  3100. at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)
  3101. at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)
  3102. at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:640)
  3103. at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
  3104. at com.xuekairui.gateway.AuthControllerTest.getUserInfo_withExpiredToken_shouldReturn401(AuthControllerTest.java:222)
  3105. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  3106. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  3107. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  3108. [INFO] Running 营业执照和优惠券模块测试
  3109. 15:17:24.828 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.BusinessLicenseAndCouponTest]: BusinessLicenseAndCouponTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  3110. 15:17:24.835 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.BusinessLicenseAndCouponTest
  3111. 15:17:29.848 DEBUG [sTjhRXRH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
  3112. 15:17:29.850 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3113. 15:17:29.850 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3114. 15:17:29.852 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3115. 15:17:29.853 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
  3116. 15:17:29.853 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
  3117. 15:17:29.856 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 0
  3118. 15:17:29.857 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.insert : ==> Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  3119. 15:17:29.858 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.insert : ==> Parameters: 1(Long), https://oss.example.com/license/test.jpg(String), 91110000XXXXXXXXXX(String), 测试大药房(String), 张三(String), PENDING(String), false(Boolean), 2026-07-02T15:17:29.857501800(LocalDateTime), 2026-07-02T15:17:29.857501800(LocalDateTime)
  3120. 15:17:29.863 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.insert : <== Updates: 1
  3121. 15:17:29.864 DEBUG [sTjhRXRH] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 200 16ms
  3122. MockHttpServletRequest:
  3123. HTTP Method = POST
  3124. Request URI = /api/business-license/upload
  3125. Parameters = {}
  3126. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw", Content-Length:"178"]
  3127. Body = {
  3128. "licenseImageUrl": "https://oss.example.com/license/test.jpg",
  3129. "creditCode": "91110000XXXXXXXXXX",
  3130. "pharmacyName": "测试大药房",
  3131. "legalPerson": "张三"
  3132. }
  3133. Session Attrs = {}
  3134. Handler:
  3135. Type = com.xuekairui.user.controller.BusinessLicenseController
  3136. Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
  3137. Async:
  3138. Async started = false
  3139. Async result = null
  3140. Resolved Exception:
  3141. Type = null
  3142. ModelAndView:
  3143. View name = null
  3144. View = null
  3145. Model = null
  3146. FlashMap:
  3147. Attributes = null
  3148. MockHttpServletResponse:
  3149. Status = 200
  3150. Error message = null
  3151. Headers = [X-Request-Id:"sTjhRXRH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3152. Content type = application/json
  3153. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976649863}
  3154. Forwarded URL = null
  3155. Redirected URL = null
  3156. Cookies = []
  3157. 15:17:29.872 DEBUG [ZRAFWTWL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
  3158. 15:17:29.874 DEBUG [ZRAFWTWL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3159. 15:17:29.874 DEBUG [ZRAFWTWL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3160. 15:17:29.876 DEBUG [ZRAFWTWL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3161. 15:17:29.879 WARN [ZRAFWTWL] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 统一社会信用代码不能为空, 执照图片URL不能为空
  3162. 15:17:29.880 WARN [ZRAFWTWL] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 400 8ms
  3163. MockHttpServletRequest:
  3164. HTTP Method = POST
  3165. Request URI = /api/business-license/upload
  3166. Parameters = {}
  3167. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw", Content-Length:"42"]
  3168. Body = {
  3169. "pharmacyName": "测试大药房"
  3170. }
  3171. Session Attrs = {}
  3172. Handler:
  3173. Type = com.xuekairui.user.controller.BusinessLicenseController
  3174. Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
  3175. Async:
  3176. Async started = false
  3177. Async result = null
  3178. Resolved Exception:
  3179. Type = org.springframework.web.bind.MethodArgumentNotValidException
  3180. ModelAndView:
  3181. View name = null
  3182. View = null
  3183. Model = null
  3184. FlashMap:
  3185. Attributes = null
  3186. MockHttpServletResponse:
  3187. Status = 400
  3188. Error message = null
  3189. Headers = [X-Request-Id:"ZRAFWTWL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3190. Content type = application/json
  3191. Body = {"code":400,"message":"统一社会信用代码不能为空, 执照图片URL不能为空","data":null,"timestamp":1782976649879}
  3192. Forwarded URL = null
  3193. Redirected URL = null
  3194. Cookies = []
  3195. 15:17:29.884 DEBUG [Q6mj4CqU] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
  3196. 15:17:29.889 WARN [Q6mj4CqU] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 401 5ms
  3197. MockHttpServletRequest:
  3198. HTTP Method = POST
  3199. Request URI = /api/business-license/upload
  3200. Parameters = {}
  3201. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  3202. Body = {}
  3203. Session Attrs = {}
  3204. Handler:
  3205. Type = null
  3206. Async:
  3207. Async started = false
  3208. Async result = null
  3209. Resolved Exception:
  3210. Type = null
  3211. ModelAndView:
  3212. View name = null
  3213. View = null
  3214. Model = null
  3215. FlashMap:
  3216. Attributes = null
  3217. MockHttpServletResponse:
  3218. Status = 401
  3219. Error message = null
  3220. Headers = [X-Request-Id:"Q6mj4CqU", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3221. Content type = application/json;charset=UTF-8
  3222. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976649887}
  3223. Forwarded URL = null
  3224. Redirected URL = null
  3225. Cookies = []
  3226. 15:17:29.905 DEBUG [KEapBTD4] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info | IP: 127.0.0.1
  3227. 15:17:29.907 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3228. 15:17:29.908 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3229. 15:17:29.912 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3230. 15:17:29.915 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
  3231. 15:17:29.915 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
  3232. 15:17:29.920 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 1
  3233. 15:17:29.922 DEBUG [KEapBTD4] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info 200 18ms
  3234. MockHttpServletRequest:
  3235. HTTP Method = GET
  3236. Request URI = /api/business-license/info
  3237. Parameters = {}
  3238. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
  3239. Body = null
  3240. Session Attrs = {}
  3241. Handler:
  3242. Type = com.xuekairui.user.controller.BusinessLicenseController
  3243. Method = com.xuekairui.user.controller.BusinessLicenseController#getInfo(HttpServletRequest)
  3244. Async:
  3245. Async started = false
  3246. Async result = null
  3247. Resolved Exception:
  3248. Type = null
  3249. ModelAndView:
  3250. View name = null
  3251. View = null
  3252. Model = null
  3253. FlashMap:
  3254. Attributes = null
  3255. MockHttpServletResponse:
  3256. Status = 200
  3257. Error message = null
  3258. Headers = [X-Request-Id:"KEapBTD4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3259. Content type = application/json
  3260. Body = {"code":200,"message":"操作成功","data":{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:30","updateTime":"2026-07-02 15:17:30"},"timestamp":1782976649920}
  3261. Forwarded URL = null
  3262. Redirected URL = null
  3263. Cookies = []
  3264. 15:17:29.930 DEBUG [FMDxc9tZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info | IP: 127.0.0.1
  3265. 15:17:29.932 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3266. 15:17:29.932 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3267. 15:17:29.935 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3268. 15:17:29.937 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
  3269. 15:17:29.937 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
  3270. 15:17:29.940 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 1
  3271. 15:17:29.942 DEBUG [FMDxc9tZ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info 200 12ms
  3272. MockHttpServletRequest:
  3273. HTTP Method = GET
  3274. Request URI = /api/business-license/info
  3275. Parameters = {}
  3276. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
  3277. Body = null
  3278. Session Attrs = {}
  3279. Handler:
  3280. Type = com.xuekairui.user.controller.BusinessLicenseController
  3281. Method = com.xuekairui.user.controller.BusinessLicenseController#getInfo(HttpServletRequest)
  3282. Async:
  3283. Async started = false
  3284. Async result = null
  3285. Resolved Exception:
  3286. Type = null
  3287. ModelAndView:
  3288. View name = null
  3289. View = null
  3290. Model = null
  3291. FlashMap:
  3292. Attributes = null
  3293. MockHttpServletResponse:
  3294. Status = 200
  3295. Error message = null
  3296. Headers = [X-Request-Id:"FMDxc9tZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3297. Content type = application/json
  3298. Body = {"code":200,"message":"操作成功","data":{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:30","updateTime":"2026-07-02 15:17:30"},"timestamp":1782976649940}
  3299. Forwarded URL = null
  3300. Redirected URL = null
  3301. Cookies = []
  3302. 15:17:29.950 DEBUG [4JkgHQJZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info | IP: 127.0.0.1
  3303. 15:17:29.952 WARN [4JkgHQJZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info 401 2ms
  3304. MockHttpServletRequest:
  3305. HTTP Method = GET
  3306. Request URI = /api/business-license/info
  3307. Parameters = {}
  3308. Headers = []
  3309. Body = null
  3310. Session Attrs = {}
  3311. Handler:
  3312. Type = null
  3313. Async:
  3314. Async started = false
  3315. Async result = null
  3316. Resolved Exception:
  3317. Type = null
  3318. ModelAndView:
  3319. View name = null
  3320. View = null
  3321. Model = null
  3322. FlashMap:
  3323. Attributes = null
  3324. MockHttpServletResponse:
  3325. Status = 401
  3326. Error message = null
  3327. Headers = [X-Request-Id:"4JkgHQJZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3328. Content type = application/json;charset=UTF-8
  3329. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976649951}
  3330. Forwarded URL = null
  3331. Redirected URL = null
  3332. Cookies = []
  3333. 15:17:29.960 DEBUG [9XuL78Cn] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
  3334. 15:17:29.962 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3335. 15:17:29.962 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3336. 15:17:29.965 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3337. 15:17:29.969 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ?) ORDER BY create_time DESC
  3338. 15:17:29.969 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long)
  3339. 15:17:29.975 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  3340. 15:17:29.977 DEBUG [9XuL78Cn] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 200 17ms
  3341. MockHttpServletRequest:
  3342. HTTP Method = GET
  3343. Request URI = /api/coupon/my
  3344. Parameters = {}
  3345. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
  3346. Body = null
  3347. Session Attrs = {}
  3348. Handler:
  3349. Type = com.xuekairui.user.controller.CouponController
  3350. Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
  3351. Async:
  3352. Async started = false
  3353. Async result = null
  3354. Resolved Exception:
  3355. Type = null
  3356. ModelAndView:
  3357. View name = null
  3358. View = null
  3359. Model = null
  3360. FlashMap:
  3361. Attributes = null
  3362. MockHttpServletResponse:
  3363. Status = 200
  3364. Error message = null
  3365. Headers = [X-Request-Id:"9XuL78Cn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3366. Content type = application/json
  3367. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976649976}
  3368. Forwarded URL = null
  3369. Redirected URL = null
  3370. Cookies = []
  3371. 15:17:29.989 DEBUG [uuyG22fU] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=0 | IP: 127.0.0.1
  3372. 15:17:29.990 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3373. 15:17:29.991 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3374. 15:17:29.993 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3375. 15:17:29.996 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
  3376. 15:17:29.997 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer)
  3377. 15:17:29.999 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  3378. 15:17:30.001 DEBUG [uuyG22fU] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=0 200 12ms
  3379. MockHttpServletRequest:
  3380. HTTP Method = GET
  3381. Request URI = /api/coupon/my
  3382. Parameters = {status=[0]}
  3383. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
  3384. Body = null
  3385. Session Attrs = {}
  3386. Handler:
  3387. Type = com.xuekairui.user.controller.CouponController
  3388. Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
  3389. Async:
  3390. Async started = false
  3391. Async result = null
  3392. Resolved Exception:
  3393. Type = null
  3394. ModelAndView:
  3395. View name = null
  3396. View = null
  3397. Model = null
  3398. FlashMap:
  3399. Attributes = null
  3400. MockHttpServletResponse:
  3401. Status = 200
  3402. Error message = null
  3403. Headers = [X-Request-Id:"uuyG22fU", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3404. Content type = application/json
  3405. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650000}
  3406. Forwarded URL = null
  3407. Redirected URL = null
  3408. Cookies = []
  3409. 15:17:30.009 DEBUG [XR48RxdZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=1 | IP: 127.0.0.1
  3410. 15:17:30.011 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3411. 15:17:30.011 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3412. 15:17:30.014 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3413. 15:17:30.016 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
  3414. 15:17:30.016 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
  3415. 15:17:30.018 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  3416. 15:17:30.019 DEBUG [XR48RxdZ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=1 200 10ms
  3417. MockHttpServletRequest:
  3418. HTTP Method = GET
  3419. Request URI = /api/coupon/my
  3420. Parameters = {status=[1]}
  3421. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
  3422. Body = null
  3423. Session Attrs = {}
  3424. Handler:
  3425. Type = com.xuekairui.user.controller.CouponController
  3426. Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
  3427. Async:
  3428. Async started = false
  3429. Async result = null
  3430. Resolved Exception:
  3431. Type = null
  3432. ModelAndView:
  3433. View name = null
  3434. View = null
  3435. Model = null
  3436. FlashMap:
  3437. Attributes = null
  3438. MockHttpServletResponse:
  3439. Status = 200
  3440. Error message = null
  3441. Headers = [X-Request-Id:"XR48RxdZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3442. Content type = application/json
  3443. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650018}
  3444. Forwarded URL = null
  3445. Redirected URL = null
  3446. Cookies = []
  3447. 15:17:30.027 DEBUG [nLChwG2E] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=2 | IP: 127.0.0.1
  3448. 15:17:30.029 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3449. 15:17:30.029 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3450. 15:17:30.031 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3451. 15:17:30.033 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
  3452. 15:17:30.033 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 2(Integer)
  3453. 15:17:30.035 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  3454. 15:17:30.036 DEBUG [nLChwG2E] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=2 200 9ms
  3455. MockHttpServletRequest:
  3456. HTTP Method = GET
  3457. Request URI = /api/coupon/my
  3458. Parameters = {status=[2]}
  3459. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
  3460. Body = null
  3461. Session Attrs = {}
  3462. Handler:
  3463. Type = com.xuekairui.user.controller.CouponController
  3464. Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
  3465. Async:
  3466. Async started = false
  3467. Async result = null
  3468. Resolved Exception:
  3469. Type = null
  3470. ModelAndView:
  3471. View name = null
  3472. View = null
  3473. Model = null
  3474. FlashMap:
  3475. Attributes = null
  3476. MockHttpServletResponse:
  3477. Status = 200
  3478. Error message = null
  3479. Headers = [X-Request-Id:"nLChwG2E", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3480. Content type = application/json
  3481. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650035}
  3482. Forwarded URL = null
  3483. Redirected URL = null
  3484. Cookies = []
  3485. 15:17:30.040 DEBUG [5ktJWwfJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
  3486. 15:17:30.042 WARN [5ktJWwfJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 401 2ms
  3487. MockHttpServletRequest:
  3488. HTTP Method = GET
  3489. Request URI = /api/coupon/my
  3490. Parameters = {}
  3491. Headers = []
  3492. Body = null
  3493. Session Attrs = {}
  3494. Handler:
  3495. Type = null
  3496. Async:
  3497. Async started = false
  3498. Async result = null
  3499. Resolved Exception:
  3500. Type = null
  3501. ModelAndView:
  3502. View name = null
  3503. View = null
  3504. Model = null
  3505. FlashMap:
  3506. Attributes = null
  3507. MockHttpServletResponse:
  3508. Status = 401
  3509. Error message = null
  3510. Headers = [X-Request-Id:"5ktJWwfJ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3511. Content type = application/json;charset=UTF-8
  3512. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976650041}
  3513. Forwarded URL = null
  3514. Redirected URL = null
  3515. Cookies = []
  3516. 15:17:30.049 DEBUG [5NkH2D5s] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available?type=CRAWLER | IP: 127.0.0.1
  3517. 15:17:30.051 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3518. 15:17:30.051 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3519. 15:17:30.053 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3520. 15:17:30.056 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  3521. 15:17:30.056 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  3522. 15:17:30.059 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  3523. 15:17:30.060 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ? AND expire_time > ?) ORDER BY expire_time ASC
  3524. 15:17:30.060 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer), 2026-07-02T15:17:30.054906100(LocalDateTime)
  3525. 15:17:30.063 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  3526. 15:17:30.064 DEBUG [5NkH2D5s] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available?type=CRAWLER 200 15ms
  3527. MockHttpServletRequest:
  3528. HTTP Method = GET
  3529. Request URI = /api/coupon/my/available
  3530. Parameters = {type=[CRAWLER]}
  3531. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
  3532. Body = null
  3533. Session Attrs = {}
  3534. Handler:
  3535. Type = com.xuekairui.user.controller.CouponController
  3536. Method = com.xuekairui.user.controller.CouponController#listAvailableCoupons(HttpServletRequest, String)
  3537. Async:
  3538. Async started = false
  3539. Async result = null
  3540. Resolved Exception:
  3541. Type = null
  3542. ModelAndView:
  3543. View name = null
  3544. View = null
  3545. Model = null
  3546. FlashMap:
  3547. Attributes = null
  3548. MockHttpServletResponse:
  3549. Status = 200
  3550. Error message = null
  3551. Headers = [X-Request-Id:"5NkH2D5s", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3552. Content type = application/json
  3553. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650063}
  3554. Forwarded URL = null
  3555. Redirected URL = null
  3556. Cookies = []
  3557. 15:17:30.069 DEBUG [ZnFSE87G] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available | IP: 127.0.0.1
  3558. 15:17:30.071 WARN [ZnFSE87G] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available 401 2ms
  3559. MockHttpServletRequest:
  3560. HTTP Method = GET
  3561. Request URI = /api/coupon/my/available
  3562. Parameters = {}
  3563. Headers = []
  3564. Body = null
  3565. Session Attrs = {}
  3566. Handler:
  3567. Type = null
  3568. Async:
  3569. Async started = false
  3570. Async result = null
  3571. Resolved Exception:
  3572. Type = null
  3573. ModelAndView:
  3574. View name = null
  3575. View = null
  3576. Model = null
  3577. FlashMap:
  3578. Attributes = null
  3579. MockHttpServletResponse:
  3580. Status = 401
  3581. Error message = null
  3582. Headers = [X-Request-Id:"ZnFSE87G", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3583. Content type = application/json;charset=UTF-8
  3584. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976650070}
  3585. Forwarded URL = null
  3586. Redirected URL = null
  3587. Cookies = []
  3588. 15:17:30.077 DEBUG [ehbje4jx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  3589. 15:17:30.080 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  3590. 15:17:30.080 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  3591. 15:17:30.084 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  3592. 15:17:30.085 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  3593. 15:17:30.085 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  3594. 15:17:30.088 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  3595. 15:17:30.091 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  3596. 15:17:30.091 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  3597. 15:17:30.096 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  3598. 15:17:30.101 DEBUG [ehbje4jx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 24ms
  3599. MockHttpServletRequest:
  3600. HTTP Method = GET
  3601. Request URI = /api/membership/levels
  3602. Parameters = {}
  3603. Headers = []
  3604. Body = null
  3605. Session Attrs = {}
  3606. Handler:
  3607. Type = com.xuekairui.user.controller.MembershipController
  3608. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  3609. Async:
  3610. Async started = false
  3611. Async result = null
  3612. Resolved Exception:
  3613. Type = null
  3614. ModelAndView:
  3615. View name = null
  3616. View = null
  3617. Model = null
  3618. FlashMap:
  3619. Attributes = null
  3620. MockHttpServletResponse:
  3621. Status = 200
  3622. Error message = null
  3623. Headers = [X-Request-Id:"ehbje4jx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3624. Content type = application/json
  3625. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976650096}
  3626. Forwarded URL = null
  3627. Redirected URL = null
  3628. Cookies = []
  3629. 15:17:30.108 DEBUG [HRCvFUyR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  3630. 15:17:30.110 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  3631. 15:17:30.110 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  3632. 15:17:30.113 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  3633. 15:17:30.114 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  3634. 15:17:30.115 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  3635. 15:17:30.118 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  3636. 15:17:30.119 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  3637. 15:17:30.119 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  3638. 15:17:30.122 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  3639. 15:17:30.124 DEBUG [HRCvFUyR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 16ms
  3640. MockHttpServletRequest:
  3641. HTTP Method = GET
  3642. Request URI = /api/membership/levels
  3643. Parameters = {}
  3644. Headers = []
  3645. Body = null
  3646. Session Attrs = {}
  3647. Handler:
  3648. Type = com.xuekairui.user.controller.MembershipController
  3649. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  3650. Async:
  3651. Async started = false
  3652. Async result = null
  3653. Resolved Exception:
  3654. Type = null
  3655. ModelAndView:
  3656. View name = null
  3657. View = null
  3658. Model = null
  3659. FlashMap:
  3660. Attributes = null
  3661. MockHttpServletResponse:
  3662. Status = 200
  3663. Error message = null
  3664. Headers = [X-Request-Id:"HRCvFUyR", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3665. Content type = application/json
  3666. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976650122}
  3667. Forwarded URL = null
  3668. Redirected URL = null
  3669. Cookies = []
  3670. 15:17:30.133 DEBUG [PwWdrc6S] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/1 | IP: 127.0.0.1
  3671. 15:17:30.135 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3672. 15:17:30.135 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3673. 15:17:30.138 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3674. 15:17:30.141 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  3675. 15:17:30.141 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  3676. 15:17:30.144 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  3677. 15:17:30.145 DEBUG [PwWdrc6S] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/1 200 12ms
  3678. MockHttpServletRequest:
  3679. HTTP Method = GET
  3680. Request URI = /api/membership/levels/1
  3681. Parameters = {}
  3682. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
  3683. Body = null
  3684. Session Attrs = {}
  3685. Handler:
  3686. Type = com.xuekairui.user.controller.MembershipController
  3687. Method = com.xuekairui.user.controller.MembershipController#getLevel(Long)
  3688. Async:
  3689. Async started = false
  3690. Async result = null
  3691. Resolved Exception:
  3692. Type = null
  3693. ModelAndView:
  3694. View name = null
  3695. View = null
  3696. Model = null
  3697. FlashMap:
  3698. Attributes = null
  3699. MockHttpServletResponse:
  3700. Status = 200
  3701. Error message = null
  3702. Headers = [X-Request-Id:"PwWdrc6S", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3703. Content type = application/json
  3704. Body = {"code":200,"message":"操作成功","data":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},"timestamp":1782976650144}
  3705. Forwarded URL = null
  3706. Redirected URL = null
  3707. Cookies = []
  3708. 15:17:30.155 DEBUG [PjSb93SM] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/999 | IP: 127.0.0.1
  3709. 15:17:30.157 DEBUG [PjSb93SM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3710. 15:17:30.158 DEBUG [PjSb93SM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3711. 15:17:30.160 DEBUG [PjSb93SM] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3712. 15:17:30.163 WARN [PjSb93SM] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4001, message=用户等级不存在
  3713. 15:17:30.164 DEBUG [PjSb93SM] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/999 200 9ms
  3714. MockHttpServletRequest:
  3715. HTTP Method = GET
  3716. Request URI = /api/membership/levels/999
  3717. Parameters = {}
  3718. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
  3719. Body = null
  3720. Session Attrs = {}
  3721. Handler:
  3722. Type = com.xuekairui.user.controller.MembershipController
  3723. Method = com.xuekairui.user.controller.MembershipController#getLevel(Long)
  3724. Async:
  3725. Async started = false
  3726. Async result = null
  3727. Resolved Exception:
  3728. Type = com.xuekairui.common.BusinessException
  3729. ModelAndView:
  3730. View name = null
  3731. View = null
  3732. Model = null
  3733. FlashMap:
  3734. Attributes = null
  3735. MockHttpServletResponse:
  3736. Status = 200
  3737. Error message = null
  3738. Headers = [X-Request-Id:"PjSb93SM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3739. Content type = application/json
  3740. Body = {"code":4001,"message":"用户等级不存在","data":null,"timestamp":1782976650163}
  3741. Forwarded URL = null
  3742. Redirected URL = null
  3743. Cookies = []
  3744. 15:17:30.173 DEBUG [NPB2szSe] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  3745. 15:17:30.175 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3746. 15:17:30.175 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3747. 15:17:30.178 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3748. 15:17:30.179 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  3749. 15:17:30.180 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  3750. 15:17:30.183 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  3751. 15:17:30.186 DEBUG [NPB2szSe] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 13ms
  3752. MockHttpServletRequest:
  3753. HTTP Method = GET
  3754. Request URI = /api/membership/my
  3755. Parameters = {}
  3756. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
  3757. Body = null
  3758. Session Attrs = {}
  3759. Handler:
  3760. Type = com.xuekairui.user.controller.MembershipController
  3761. Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
  3762. Async:
  3763. Async started = false
  3764. Async result = null
  3765. Resolved Exception:
  3766. Type = null
  3767. ModelAndView:
  3768. View name = null
  3769. View = null
  3770. Model = null
  3771. FlashMap:
  3772. Attributes = null
  3773. MockHttpServletResponse:
  3774. Status = 200
  3775. Error message = null
  3776. Headers = [X-Request-Id:"NPB2szSe", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3777. Content type = application/json
  3778. Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":1,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976650183}
  3779. Forwarded URL = null
  3780. Redirected URL = null
  3781. Cookies = []
  3782. 15:17:30.190 DEBUG [n8kMYTBt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  3783. 15:17:30.195 WARN [n8kMYTBt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 5ms
  3784. MockHttpServletRequest:
  3785. HTTP Method = GET
  3786. Request URI = /api/membership/my
  3787. Parameters = {}
  3788. Headers = []
  3789. Body = null
  3790. Session Attrs = {}
  3791. Handler:
  3792. Type = null
  3793. Async:
  3794. Async started = false
  3795. Async result = null
  3796. Resolved Exception:
  3797. Type = null
  3798. ModelAndView:
  3799. View name = null
  3800. View = null
  3801. Model = null
  3802. FlashMap:
  3803. Attributes = null
  3804. MockHttpServletResponse:
  3805. Status = 401
  3806. Error message = null
  3807. Headers = [X-Request-Id:"n8kMYTBt", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3808. Content type = application/json;charset=UTF-8
  3809. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976650193}
  3810. Forwarded URL = null
  3811. Redirected URL = null
  3812. Cookies = []
  3813. 15:17:30.204 DEBUG [z6SD5Ga9] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh | IP: 127.0.0.1
  3814. 15:17:30.206 DEBUG [z6SD5Ga9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3815. 15:17:30.206 DEBUG [z6SD5Ga9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3816. 15:17:30.208 DEBUG [z6SD5Ga9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3817. 15:17:30.211 WARN [z6SD5Ga9] [1] [ main] c.xuekairui.user.util.JwtUtil : JWT解析Token失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
  3818. 15:17:30.214 WARN [z6SD5Ga9] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1302, message=Token无效
  3819. 15:17:30.215 DEBUG [z6SD5Ga9] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh 200 11ms
  3820. MockHttpServletRequest:
  3821. HTTP Method = POST
  3822. Request URI = /api/auth/refresh
  3823. Parameters = {}
  3824. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw", Content-Length:"37"]
  3825. Body = {"refreshToken":"test_refresh_token"}
  3826. Session Attrs = {}
  3827. Handler:
  3828. Type = com.xuekairui.user.controller.AuthController
  3829. Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)
  3830. Async:
  3831. Async started = false
  3832. Async result = null
  3833. Resolved Exception:
  3834. Type = com.xuekairui.common.BusinessException
  3835. ModelAndView:
  3836. View name = null
  3837. View = null
  3838. Model = null
  3839. FlashMap:
  3840. Attributes = null
  3841. MockHttpServletResponse:
  3842. Status = 200
  3843. Error message = null
  3844. Headers = [X-Request-Id:"z6SD5Ga9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3845. Content type = application/json
  3846. Body = {"code":1302,"message":"Token无效","data":null,"timestamp":1782976650214}
  3847. Forwarded URL = null
  3848. Redirected URL = null
  3849. Cookies = []
  3850. 15:17:30.220 DEBUG [xdkrmsmL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh | IP: 127.0.0.1
  3851. 15:17:30.221 WARN [xdkrmsmL] [] [ main] c.x.h.GlobalExceptionHandler : 请求体解析失败: Required request body is missing: public com.xuekairui.common.Result<com.xuekairui.user.dto.LoginResponse> com.xuekairui.user.controller.AuthController.refreshToken(com.xuekairui.user.dto.RefreshTokenRequest)
  3852. 15:17:30.222 WARN [xdkrmsmL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh 400 2ms
  3853. MockHttpServletRequest:
  3854. HTTP Method = POST
  3855. Request URI = /api/auth/refresh
  3856. Parameters = {}
  3857. Headers = [Content-Type:"application/json;charset=UTF-8"]
  3858. Body =
  3859. Session Attrs = {}
  3860. Handler:
  3861. Type = com.xuekairui.user.controller.AuthController
  3862. Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)
  3863. Async:
  3864. Async started = false
  3865. Async result = null
  3866. Resolved Exception:
  3867. Type = org.springframework.http.converter.HttpMessageNotReadableException
  3868. ModelAndView:
  3869. View name = null
  3870. View = null
  3871. Model = null
  3872. FlashMap:
  3873. Attributes = null
  3874. MockHttpServletResponse:
  3875. Status = 400
  3876. Error message = null
  3877. Headers = [X-Request-Id:"xdkrmsmL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3878. Content type = application/json
  3879. Body = {"code":400,"message":"请求体格式错误","data":null,"timestamp":1782976650221}
  3880. Forwarded URL = null
  3881. Redirected URL = null
  3882. Cookies = []
  3883. [INFO] Tests run: 21, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.401 s -- in 营业执照和优惠券模块测试
  3884. [INFO] Running 优惠券接口测试
  3885. 15:17:30.228 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.CouponControllerTest]: CouponControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  3886. 15:17:30.232 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.CouponControllerTest
  3887. 15:17:33.472 DEBUG [6f4j6tKy] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue | IP: 127.0.0.1
  3888. 15:17:33.473 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3889. 15:17:33.473 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3890. 15:17:33.474 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3891. 15:17:33.479 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.C.selectById : ==> Preparing: SELECT id,name,type,value,total_count,issued_count,valid_type,valid_days,valid_start,valid_end,min_level_code,status,description,create_time,update_time FROM t_coupon WHERE id=?
  3892. 15:17:33.480 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.C.selectById : ==> Parameters: 999(Long)
  3893. 15:17:33.481 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.C.selectById : <== Total: 0
  3894. 15:17:33.484 WARN [6f4j6tKy] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4101, message=优惠券不存在
  3895. 15:17:33.485 DEBUG [6f4j6tKy] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue 200 14ms
  3896. MockHttpServletRequest:
  3897. HTTP Method = POST
  3898. Request URI = /api/coupon/issue
  3899. Parameters = {}
  3900. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA", Content-Length:"44"]
  3901. Body = {
  3902. "couponId": 999,
  3903. "userIds": [1]
  3904. }
  3905. Session Attrs = {}
  3906. Handler:
  3907. Type = com.xuekairui.user.controller.CouponController
  3908. Method = com.xuekairui.user.controller.CouponController#issueCoupon(CouponIssueRequest, HttpServletRequest)
  3909. Async:
  3910. Async started = false
  3911. Async result = null
  3912. Resolved Exception:
  3913. Type = com.xuekairui.common.BusinessException
  3914. ModelAndView:
  3915. View name = null
  3916. View = null
  3917. Model = null
  3918. FlashMap:
  3919. Attributes = null
  3920. MockHttpServletResponse:
  3921. Status = 200
  3922. Error message = null
  3923. Headers = [X-Request-Id:"6f4j6tKy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3924. Content type = application/json
  3925. Body = {"code":4101,"message":"优惠券不存在","data":null,"timestamp":1782976653484}
  3926. Forwarded URL = null
  3927. Redirected URL = null
  3928. Cookies = []
  3929. 15:17:33.488 DEBUG [BKfgqGye] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue | IP: 127.0.0.1
  3930. 15:17:33.490 WARN [BKfgqGye] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue 401 2ms
  3931. MockHttpServletRequest:
  3932. HTTP Method = POST
  3933. Request URI = /api/coupon/issue
  3934. Parameters = {}
  3935. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
  3936. Body = {"couponId":1,"userIds":[1]}
  3937. Session Attrs = {}
  3938. Handler:
  3939. Type = null
  3940. Async:
  3941. Async started = false
  3942. Async result = null
  3943. Resolved Exception:
  3944. Type = null
  3945. ModelAndView:
  3946. View name = null
  3947. View = null
  3948. Model = null
  3949. FlashMap:
  3950. Attributes = null
  3951. MockHttpServletResponse:
  3952. Status = 401
  3953. Error message = null
  3954. Headers = [X-Request-Id:"BKfgqGye", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3955. Content type = application/json;charset=UTF-8
  3956. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976653489}
  3957. Forwarded URL = null
  3958. Redirected URL = null
  3959. Cookies = []
  3960. 15:17:33.495 DEBUG [DqqVmsEU] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
  3961. 15:17:33.496 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  3962. 15:17:33.496 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  3963. 15:17:33.499 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  3964. 15:17:33.500 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ?) ORDER BY create_time DESC
  3965. 15:17:33.500 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long)
  3966. 15:17:33.502 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  3967. 15:17:33.503 DEBUG [DqqVmsEU] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 200 8ms
  3968. MockHttpServletRequest:
  3969. HTTP Method = GET
  3970. Request URI = /api/coupon/my
  3971. Parameters = {}
  3972. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
  3973. Body = null
  3974. Session Attrs = {}
  3975. Handler:
  3976. Type = com.xuekairui.user.controller.CouponController
  3977. Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
  3978. Async:
  3979. Async started = false
  3980. Async result = null
  3981. Resolved Exception:
  3982. Type = null
  3983. ModelAndView:
  3984. View name = null
  3985. View = null
  3986. Model = null
  3987. FlashMap:
  3988. Attributes = null
  3989. MockHttpServletResponse:
  3990. Status = 200
  3991. Error message = null
  3992. Headers = [X-Request-Id:"DqqVmsEU", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  3993. Content type = application/json
  3994. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653502}
  3995. Forwarded URL = null
  3996. Redirected URL = null
  3997. Cookies = []
  3998. 15:17:33.509 DEBUG [eBYp2AcF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=0 | IP: 127.0.0.1
  3999. 15:17:33.510 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4000. 15:17:33.510 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4001. 15:17:33.512 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4002. 15:17:33.513 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
  4003. 15:17:33.513 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer)
  4004. 15:17:33.515 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  4005. 15:17:33.517 DEBUG [eBYp2AcF] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=0 200 7ms
  4006. MockHttpServletRequest:
  4007. HTTP Method = GET
  4008. Request URI = /api/coupon/my
  4009. Parameters = {status=[0]}
  4010. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
  4011. Body = null
  4012. Session Attrs = {}
  4013. Handler:
  4014. Type = com.xuekairui.user.controller.CouponController
  4015. Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
  4016. Async:
  4017. Async started = false
  4018. Async result = null
  4019. Resolved Exception:
  4020. Type = null
  4021. ModelAndView:
  4022. View name = null
  4023. View = null
  4024. Model = null
  4025. FlashMap:
  4026. Attributes = null
  4027. MockHttpServletResponse:
  4028. Status = 200
  4029. Error message = null
  4030. Headers = [X-Request-Id:"eBYp2AcF", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4031. Content type = application/json
  4032. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653516}
  4033. Forwarded URL = null
  4034. Redirected URL = null
  4035. Cookies = []
  4036. 15:17:33.524 DEBUG [sZPhJCxp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=1 | IP: 127.0.0.1
  4037. 15:17:33.525 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4038. 15:17:33.525 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4039. 15:17:33.527 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4040. 15:17:33.528 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
  4041. 15:17:33.528 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
  4042. 15:17:33.530 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  4043. 15:17:33.531 DEBUG [sZPhJCxp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=1 200 7ms
  4044. MockHttpServletRequest:
  4045. HTTP Method = GET
  4046. Request URI = /api/coupon/my
  4047. Parameters = {status=[1]}
  4048. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
  4049. Body = null
  4050. Session Attrs = {}
  4051. Handler:
  4052. Type = com.xuekairui.user.controller.CouponController
  4053. Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
  4054. Async:
  4055. Async started = false
  4056. Async result = null
  4057. Resolved Exception:
  4058. Type = null
  4059. ModelAndView:
  4060. View name = null
  4061. View = null
  4062. Model = null
  4063. FlashMap:
  4064. Attributes = null
  4065. MockHttpServletResponse:
  4066. Status = 200
  4067. Error message = null
  4068. Headers = [X-Request-Id:"sZPhJCxp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4069. Content type = application/json
  4070. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653530}
  4071. Forwarded URL = null
  4072. Redirected URL = null
  4073. Cookies = []
  4074. 15:17:33.539 DEBUG [ewhLF74V] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=2 | IP: 127.0.0.1
  4075. 15:17:33.540 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4076. 15:17:33.540 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4077. 15:17:33.542 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4078. 15:17:33.543 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
  4079. 15:17:33.544 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 2(Integer)
  4080. 15:17:33.545 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  4081. 15:17:33.547 DEBUG [ewhLF74V] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=2 200 8ms
  4082. MockHttpServletRequest:
  4083. HTTP Method = GET
  4084. Request URI = /api/coupon/my
  4085. Parameters = {status=[2]}
  4086. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
  4087. Body = null
  4088. Session Attrs = {}
  4089. Handler:
  4090. Type = com.xuekairui.user.controller.CouponController
  4091. Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
  4092. Async:
  4093. Async started = false
  4094. Async result = null
  4095. Resolved Exception:
  4096. Type = null
  4097. ModelAndView:
  4098. View name = null
  4099. View = null
  4100. Model = null
  4101. FlashMap:
  4102. Attributes = null
  4103. MockHttpServletResponse:
  4104. Status = 200
  4105. Error message = null
  4106. Headers = [X-Request-Id:"ewhLF74V", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4107. Content type = application/json
  4108. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653545}
  4109. Forwarded URL = null
  4110. Redirected URL = null
  4111. Cookies = []
  4112. 15:17:33.552 DEBUG [eW83GppW] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
  4113. 15:17:33.554 WARN [eW83GppW] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 401 2ms
  4114. MockHttpServletRequest:
  4115. HTTP Method = GET
  4116. Request URI = /api/coupon/my
  4117. Parameters = {}
  4118. Headers = []
  4119. Body = null
  4120. Session Attrs = {}
  4121. Handler:
  4122. Type = null
  4123. Async:
  4124. Async started = false
  4125. Async result = null
  4126. Resolved Exception:
  4127. Type = null
  4128. ModelAndView:
  4129. View name = null
  4130. View = null
  4131. Model = null
  4132. FlashMap:
  4133. Attributes = null
  4134. MockHttpServletResponse:
  4135. Status = 401
  4136. Error message = null
  4137. Headers = [X-Request-Id:"eW83GppW", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4138. Content type = application/json;charset=UTF-8
  4139. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976653553}
  4140. Forwarded URL = null
  4141. Redirected URL = null
  4142. Cookies = []
  4143. 15:17:33.560 DEBUG [v5KvzYpy] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available | IP: 127.0.0.1
  4144. 15:17:33.561 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4145. 15:17:33.561 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4146. 15:17:33.563 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4147. 15:17:33.565 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ? AND expire_time > ?) ORDER BY expire_time ASC
  4148. 15:17:33.565 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer), 2026-07-02T15:17:33.564736800(LocalDateTime)
  4149. 15:17:33.567 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  4150. 15:17:33.568 DEBUG [v5KvzYpy] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available 200 8ms
  4151. MockHttpServletRequest:
  4152. HTTP Method = GET
  4153. Request URI = /api/coupon/my/available
  4154. Parameters = {}
  4155. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
  4156. Body = null
  4157. Session Attrs = {}
  4158. Handler:
  4159. Type = com.xuekairui.user.controller.CouponController
  4160. Method = com.xuekairui.user.controller.CouponController#listAvailableCoupons(HttpServletRequest, String)
  4161. Async:
  4162. Async started = false
  4163. Async result = null
  4164. Resolved Exception:
  4165. Type = null
  4166. ModelAndView:
  4167. View name = null
  4168. View = null
  4169. Model = null
  4170. FlashMap:
  4171. Attributes = null
  4172. MockHttpServletResponse:
  4173. Status = 200
  4174. Error message = null
  4175. Headers = [X-Request-Id:"v5KvzYpy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4176. Content type = application/json
  4177. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653567}
  4178. Forwarded URL = null
  4179. Redirected URL = null
  4180. Cookies = []
  4181. 15:17:33.574 DEBUG [VUWXXu3N] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available?type=CRAWLER | IP: 127.0.0.1
  4182. 15:17:33.575 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4183. 15:17:33.575 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4184. 15:17:33.577 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4185. 15:17:33.578 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  4186. 15:17:33.578 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  4187. 15:17:33.580 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  4188. 15:17:33.581 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ? AND expire_time > ?) ORDER BY expire_time ASC
  4189. 15:17:33.581 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer), 2026-07-02T15:17:33.578151100(LocalDateTime)
  4190. 15:17:33.583 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  4191. 15:17:33.584 DEBUG [VUWXXu3N] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available?type=CRAWLER 200 10ms
  4192. MockHttpServletRequest:
  4193. HTTP Method = GET
  4194. Request URI = /api/coupon/my/available
  4195. Parameters = {type=[CRAWLER]}
  4196. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
  4197. Body = null
  4198. Session Attrs = {}
  4199. Handler:
  4200. Type = com.xuekairui.user.controller.CouponController
  4201. Method = com.xuekairui.user.controller.CouponController#listAvailableCoupons(HttpServletRequest, String)
  4202. Async:
  4203. Async started = false
  4204. Async result = null
  4205. Resolved Exception:
  4206. Type = null
  4207. ModelAndView:
  4208. View name = null
  4209. View = null
  4210. Model = null
  4211. FlashMap:
  4212. Attributes = null
  4213. MockHttpServletResponse:
  4214. Status = 200
  4215. Error message = null
  4216. Headers = [X-Request-Id:"VUWXXu3N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4217. Content type = application/json
  4218. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653583}
  4219. Forwarded URL = null
  4220. Redirected URL = null
  4221. Cookies = []
  4222. 15:17:33.587 DEBUG [yMRXYfgu] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available | IP: 127.0.0.1
  4223. 15:17:33.589 WARN [yMRXYfgu] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available 401 2ms
  4224. MockHttpServletRequest:
  4225. HTTP Method = GET
  4226. Request URI = /api/coupon/my/available
  4227. Parameters = {}
  4228. Headers = []
  4229. Body = null
  4230. Session Attrs = {}
  4231. Handler:
  4232. Type = null
  4233. Async:
  4234. Async started = false
  4235. Async result = null
  4236. Resolved Exception:
  4237. Type = null
  4238. ModelAndView:
  4239. View name = null
  4240. View = null
  4241. Model = null
  4242. FlashMap:
  4243. Attributes = null
  4244. MockHttpServletResponse:
  4245. Status = 401
  4246. Error message = null
  4247. Headers = [X-Request-Id:"yMRXYfgu", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4248. Content type = application/json;charset=UTF-8
  4249. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976653588}
  4250. Forwarded URL = null
  4251. Redirected URL = null
  4252. Cookies = []
  4253. [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.366 s -- in 优惠券接口测试
  4254. [INFO] Running 爬虫配额接口测试
  4255. 15:17:33.594 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.CrawlerControllerTest]: CrawlerControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  4256. 15:17:33.596 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.CrawlerControllerTest
  4257. 15:17:37.278 DEBUG [pbyf9MYW] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  4258. 15:17:37.279 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4259. 15:17:37.279 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4260. 15:17:37.282 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4261. 15:17:37.283 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4262. 15:17:37.283 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4263. 15:17:37.285 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4264. 15:17:37.285 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4265. 15:17:37.285 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  4266. 15:17:37.288 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4267. 15:17:37.289 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4268. 15:17:37.289 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4269. 15:17:37.291 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  4270. 15:17:37.291 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4271. 15:17:37.291 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  4272. 15:17:37.293 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4273. 15:17:37.293 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4274. 15:17:37.293 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  4275. 15:17:37.295 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4276. 15:17:37.295 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4277. 15:17:37.295 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  4278. 15:17:37.297 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4279. 15:17:37.298 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  4280. 15:17:37.298 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  4281. 15:17:37.300 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  4282. 15:17:37.301 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4283. 15:17:37.301 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  4284. 15:17:37.304 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4285. 15:17:37.305 DEBUG [pbyf9MYW] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  4286. 15:17:37.305 DEBUG [pbyf9MYW] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  4287. 15:17:37.307 DEBUG [pbyf9MYW] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  4288. 15:17:37.311 DEBUG [pbyf9MYW] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 33ms
  4289. MockHttpServletRequest:
  4290. HTTP Method = GET
  4291. Request URI = /api/crawler/status
  4292. Parameters = {}
  4293. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
  4294. Body = null
  4295. Session Attrs = {}
  4296. Handler:
  4297. Type = com.xuekairui.user.controller.CrawlerController
  4298. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  4299. Async:
  4300. Async started = false
  4301. Async result = null
  4302. Resolved Exception:
  4303. Type = null
  4304. ModelAndView:
  4305. View name = null
  4306. View = null
  4307. Model = null
  4308. FlashMap:
  4309. Attributes = null
  4310. MockHttpServletResponse:
  4311. Status = 200
  4312. Error message = null
  4313. Headers = [X-Request-Id:"pbyf9MYW", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4314. Content type = application/json
  4315. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657309}
  4316. Forwarded URL = null
  4317. Redirected URL = null
  4318. Cookies = []
  4319. 15:17:37.319 DEBUG [fy5QaPJW] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  4320. 15:17:37.321 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4321. 15:17:37.321 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4322. 15:17:37.323 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4323. 15:17:37.324 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4324. 15:17:37.324 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4325. 15:17:37.326 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4326. 15:17:37.326 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4327. 15:17:37.326 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  4328. 15:17:37.328 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4329. 15:17:37.329 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4330. 15:17:37.329 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4331. 15:17:37.330 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  4332. 15:17:37.331 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4333. 15:17:37.331 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  4334. 15:17:37.332 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4335. 15:17:37.333 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4336. 15:17:37.333 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  4337. 15:17:37.334 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4338. 15:17:37.334 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4339. 15:17:37.334 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  4340. 15:17:37.336 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4341. 15:17:37.337 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  4342. 15:17:37.337 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  4343. 15:17:37.339 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  4344. 15:17:37.339 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4345. 15:17:37.340 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  4346. 15:17:37.341 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4347. 15:17:37.342 DEBUG [fy5QaPJW] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  4348. 15:17:37.342 DEBUG [fy5QaPJW] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  4349. 15:17:37.344 DEBUG [fy5QaPJW] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  4350. 15:17:37.345 DEBUG [fy5QaPJW] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 26ms
  4351. MockHttpServletRequest:
  4352. HTTP Method = GET
  4353. Request URI = /api/crawler/status
  4354. Parameters = {}
  4355. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
  4356. Body = null
  4357. Session Attrs = {}
  4358. Handler:
  4359. Type = com.xuekairui.user.controller.CrawlerController
  4360. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  4361. Async:
  4362. Async started = false
  4363. Async result = null
  4364. Resolved Exception:
  4365. Type = null
  4366. ModelAndView:
  4367. View name = null
  4368. View = null
  4369. Model = null
  4370. FlashMap:
  4371. Attributes = null
  4372. MockHttpServletResponse:
  4373. Status = 200
  4374. Error message = null
  4375. Headers = [X-Request-Id:"fy5QaPJW", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4376. Content type = application/json
  4377. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657345}
  4378. Forwarded URL = null
  4379. Redirected URL = null
  4380. Cookies = []
  4381. 15:17:37.354 DEBUG [9NtTg9pC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  4382. 15:17:37.355 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4383. 15:17:37.355 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4384. 15:17:37.357 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4385. 15:17:37.359 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4386. 15:17:37.359 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4387. 15:17:37.361 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4388. 15:17:37.361 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4389. 15:17:37.361 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  4390. 15:17:37.363 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4391. 15:17:37.364 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4392. 15:17:37.365 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4393. 15:17:37.367 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  4394. 15:17:37.368 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4395. 15:17:37.368 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  4396. 15:17:37.369 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4397. 15:17:37.370 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4398. 15:17:37.370 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  4399. 15:17:37.372 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4400. 15:17:37.372 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4401. 15:17:37.372 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  4402. 15:17:37.374 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4403. 15:17:37.376 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  4404. 15:17:37.376 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  4405. 15:17:37.377 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  4406. 15:17:37.378 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4407. 15:17:37.378 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  4408. 15:17:37.379 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4409. 15:17:37.379 DEBUG [9NtTg9pC] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  4410. 15:17:37.380 DEBUG [9NtTg9pC] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  4411. 15:17:37.381 DEBUG [9NtTg9pC] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  4412. 15:17:37.382 DEBUG [9NtTg9pC] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 28ms
  4413. MockHttpServletRequest:
  4414. HTTP Method = GET
  4415. Request URI = /api/crawler/status
  4416. Parameters = {}
  4417. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
  4418. Body = null
  4419. Session Attrs = {}
  4420. Handler:
  4421. Type = com.xuekairui.user.controller.CrawlerController
  4422. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  4423. Async:
  4424. Async started = false
  4425. Async result = null
  4426. Resolved Exception:
  4427. Type = null
  4428. ModelAndView:
  4429. View name = null
  4430. View = null
  4431. Model = null
  4432. FlashMap:
  4433. Attributes = null
  4434. MockHttpServletResponse:
  4435. Status = 200
  4436. Error message = null
  4437. Headers = [X-Request-Id:"9NtTg9pC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4438. Content type = application/json
  4439. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657381}
  4440. Forwarded URL = null
  4441. Redirected URL = null
  4442. Cookies = []
  4443. 15:17:37.391 DEBUG [rJNHGESL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  4444. 15:17:37.392 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4445. 15:17:37.392 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4446. 15:17:37.395 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4447. 15:17:37.397 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4448. 15:17:37.397 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4449. 15:17:37.398 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4450. 15:17:37.398 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4451. 15:17:37.399 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  4452. 15:17:37.401 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4453. 15:17:37.401 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4454. 15:17:37.402 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4455. 15:17:37.404 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  4456. 15:17:37.404 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4457. 15:17:37.404 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  4458. 15:17:37.407 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4459. 15:17:37.407 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4460. 15:17:37.407 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  4461. 15:17:37.409 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4462. 15:17:37.409 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4463. 15:17:37.409 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  4464. 15:17:37.411 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4465. 15:17:37.412 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  4466. 15:17:37.412 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  4467. 15:17:37.414 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  4468. 15:17:37.414 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4469. 15:17:37.415 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  4470. 15:17:37.416 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4471. 15:17:37.417 DEBUG [rJNHGESL] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  4472. 15:17:37.417 DEBUG [rJNHGESL] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  4473. 15:17:37.418 DEBUG [rJNHGESL] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  4474. 15:17:37.419 DEBUG [rJNHGESL] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 28ms
  4475. MockHttpServletRequest:
  4476. HTTP Method = GET
  4477. Request URI = /api/crawler/status
  4478. Parameters = {}
  4479. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
  4480. Body = null
  4481. Session Attrs = {}
  4482. Handler:
  4483. Type = com.xuekairui.user.controller.CrawlerController
  4484. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  4485. Async:
  4486. Async started = false
  4487. Async result = null
  4488. Resolved Exception:
  4489. Type = null
  4490. ModelAndView:
  4491. View name = null
  4492. View = null
  4493. Model = null
  4494. FlashMap:
  4495. Attributes = null
  4496. MockHttpServletResponse:
  4497. Status = 200
  4498. Error message = null
  4499. Headers = [X-Request-Id:"rJNHGESL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4500. Content type = application/json
  4501. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657418}
  4502. Forwarded URL = null
  4503. Redirected URL = null
  4504. Cookies = []
  4505. 15:17:37.426 DEBUG [GB9mtVWR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  4506. 15:17:37.427 WARN [GB9mtVWR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
  4507. MockHttpServletRequest:
  4508. HTTP Method = GET
  4509. Request URI = /api/crawler/status
  4510. Parameters = {}
  4511. Headers = []
  4512. Body = null
  4513. Session Attrs = {}
  4514. Handler:
  4515. Type = null
  4516. Async:
  4517. Async started = false
  4518. Async result = null
  4519. Resolved Exception:
  4520. Type = null
  4521. ModelAndView:
  4522. View name = null
  4523. View = null
  4524. Model = null
  4525. FlashMap:
  4526. Attributes = null
  4527. MockHttpServletResponse:
  4528. Status = 401
  4529. Error message = null
  4530. Headers = [X-Request-Id:"GB9mtVWR", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4531. Content type = application/json;charset=UTF-8
  4532. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976657427}
  4533. Forwarded URL = null
  4534. Redirected URL = null
  4535. Cookies = []
  4536. 15:17:37.435 DEBUG [BPJBcVxV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  4537. 15:17:37.436 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4538. 15:17:37.437 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4539. 15:17:37.439 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4540. 15:17:37.440 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4541. 15:17:37.441 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4542. 15:17:37.443 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4543. 15:17:37.443 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4544. 15:17:37.443 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  4545. 15:17:37.445 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4546. 15:17:37.446 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4547. 15:17:37.446 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4548. 15:17:37.449 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  4549. 15:17:37.449 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4550. 15:17:37.449 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  4551. 15:17:37.451 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4552. 15:17:37.451 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4553. 15:17:37.451 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  4554. 15:17:37.454 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4555. 15:17:37.454 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4556. 15:17:37.454 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  4557. 15:17:37.455 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4558. 15:17:37.456 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  4559. 15:17:37.456 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  4560. 15:17:37.458 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  4561. 15:17:37.458 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4562. 15:17:37.458 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  4563. 15:17:37.460 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4564. 15:17:37.460 DEBUG [BPJBcVxV] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  4565. 15:17:37.460 DEBUG [BPJBcVxV] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  4566. 15:17:37.462 DEBUG [BPJBcVxV] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  4567. 15:17:37.463 DEBUG [BPJBcVxV] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 28ms
  4568. MockHttpServletRequest:
  4569. HTTP Method = GET
  4570. Request URI = /api/crawler/status
  4571. Parameters = {}
  4572. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
  4573. Body = null
  4574. Session Attrs = {}
  4575. Handler:
  4576. Type = com.xuekairui.user.controller.CrawlerController
  4577. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  4578. Async:
  4579. Async started = false
  4580. Async result = null
  4581. Resolved Exception:
  4582. Type = null
  4583. ModelAndView:
  4584. View name = null
  4585. View = null
  4586. Model = null
  4587. FlashMap:
  4588. Attributes = null
  4589. MockHttpServletResponse:
  4590. Status = 200
  4591. Error message = null
  4592. Headers = [X-Request-Id:"BPJBcVxV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4593. Content type = application/json
  4594. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657463}
  4595. Forwarded URL = null
  4596. Redirected URL = null
  4597. Cookies = []
  4598. 15:17:37.473 DEBUG [AMuzzZpH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  4599. 15:17:37.475 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4600. 15:17:37.475 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4601. 15:17:37.477 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4602. 15:17:37.483 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4603. 15:17:37.484 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4604. 15:17:37.486 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4605. 15:17:37.486 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4606. 15:17:37.487 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  4607. 15:17:37.488 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4608. 15:17:37.489 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4609. 15:17:37.490 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4610. 15:17:37.493 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  4611. 15:17:37.493 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4612. 15:17:37.493 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  4613. 15:17:37.495 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4614. 15:17:37.496 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4615. 15:17:37.496 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  4616. 15:17:37.498 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4617. 15:17:37.499 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4618. 15:17:37.499 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  4619. 15:17:37.501 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4620. 15:17:37.501 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4621. 15:17:37.501 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  4622. 15:17:37.504 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4623. 15:17:37.504 DEBUG [AMuzzZpH] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  4624. 15:17:37.504 DEBUG [AMuzzZpH] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  4625. 15:17:37.507 DEBUG [AMuzzZpH] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  4626. 15:17:37.507 DEBUG [AMuzzZpH] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  4627. 15:17:37.508 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  4628. 15:17:37.509 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580436893048834(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:37.508689200(LocalDateTime)
  4629. 15:17:37.513 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  4630. 15:17:37.519 DEBUG [AMuzzZpH] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 46ms
  4631. MockHttpServletRequest:
  4632. HTTP Method = POST
  4633. Request URI = /api/crawler/consume
  4634. Parameters = {}
  4635. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"34"]
  4636. Body = {"count":1,"useCouponFirst":false}
  4637. Session Attrs = {}
  4638. Handler:
  4639. Type = com.xuekairui.user.controller.CrawlerController
  4640. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  4641. Async:
  4642. Async started = false
  4643. Async result = null
  4644. Resolved Exception:
  4645. Type = null
  4646. ModelAndView:
  4647. View name = null
  4648. View = null
  4649. Model = null
  4650. FlashMap:
  4651. Attributes = null
  4652. MockHttpServletResponse:
  4653. Status = 200
  4654. Error message = null
  4655. Headers = [X-Request-Id:"AMuzzZpH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4656. Content type = application/json
  4657. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657518}
  4658. Forwarded URL = null
  4659. Redirected URL = null
  4660. Cookies = []
  4661. 15:17:37.531 DEBUG [PhuWA6H2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  4662. 15:17:37.532 DEBUG [PhuWA6H2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4663. 15:17:37.532 DEBUG [PhuWA6H2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4664. 15:17:37.535 DEBUG [PhuWA6H2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4665. 15:17:37.537 WARN [PhuWA6H2] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
  4666. 15:17:37.538 WARN [PhuWA6H2] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 7ms
  4667. MockHttpServletRequest:
  4668. HTTP Method = POST
  4669. Request URI = /api/crawler/consume
  4670. Parameters = {}
  4671. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"11"]
  4672. Body = {"count":0}
  4673. Session Attrs = {}
  4674. Handler:
  4675. Type = com.xuekairui.user.controller.CrawlerController
  4676. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  4677. Async:
  4678. Async started = false
  4679. Async result = null
  4680. Resolved Exception:
  4681. Type = org.springframework.web.bind.MethodArgumentNotValidException
  4682. ModelAndView:
  4683. View name = null
  4684. View = null
  4685. Model = null
  4686. FlashMap:
  4687. Attributes = null
  4688. MockHttpServletResponse:
  4689. Status = 400
  4690. Error message = null
  4691. Headers = [X-Request-Id:"PhuWA6H2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4692. Content type = application/json
  4693. Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976657537}
  4694. Forwarded URL = null
  4695. Redirected URL = null
  4696. Cookies = []
  4697. 15:17:37.546 DEBUG [us6NqvZa] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  4698. 15:17:37.547 DEBUG [us6NqvZa] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4699. 15:17:37.547 DEBUG [us6NqvZa] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4700. 15:17:37.549 DEBUG [us6NqvZa] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4701. 15:17:37.550 WARN [us6NqvZa] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
  4702. 15:17:37.552 WARN [us6NqvZa] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 6ms
  4703. MockHttpServletRequest:
  4704. HTTP Method = POST
  4705. Request URI = /api/crawler/consume
  4706. Parameters = {}
  4707. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"12"]
  4708. Body = {"count":-1}
  4709. Session Attrs = {}
  4710. Handler:
  4711. Type = com.xuekairui.user.controller.CrawlerController
  4712. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  4713. Async:
  4714. Async started = false
  4715. Async result = null
  4716. Resolved Exception:
  4717. Type = org.springframework.web.bind.MethodArgumentNotValidException
  4718. ModelAndView:
  4719. View name = null
  4720. View = null
  4721. Model = null
  4722. FlashMap:
  4723. Attributes = null
  4724. MockHttpServletResponse:
  4725. Status = 400
  4726. Error message = null
  4727. Headers = [X-Request-Id:"us6NqvZa", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4728. Content type = application/json
  4729. Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976657550}
  4730. Forwarded URL = null
  4731. Redirected URL = null
  4732. Cookies = []
  4733. 15:17:37.557 DEBUG [NDzsean2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  4734. 15:17:37.563 WARN [NDzsean2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 401 6ms
  4735. MockHttpServletRequest:
  4736. HTTP Method = POST
  4737. Request URI = /api/crawler/consume
  4738. Parameters = {}
  4739. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"11"]
  4740. Body = {"count":1}
  4741. Session Attrs = {}
  4742. Handler:
  4743. Type = null
  4744. Async:
  4745. Async started = false
  4746. Async result = null
  4747. Resolved Exception:
  4748. Type = null
  4749. ModelAndView:
  4750. View name = null
  4751. View = null
  4752. Model = null
  4753. FlashMap:
  4754. Attributes = null
  4755. MockHttpServletResponse:
  4756. Status = 401
  4757. Error message = null
  4758. Headers = [X-Request-Id:"NDzsean2", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4759. Content type = application/json;charset=UTF-8
  4760. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976657562}
  4761. Forwarded URL = null
  4762. Redirected URL = null
  4763. Cookies = []
  4764. 15:17:37.571 DEBUG [Ne3wWgjd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  4765. 15:17:37.572 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4766. 15:17:37.572 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4767. 15:17:37.574 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4768. 15:17:37.576 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4769. 15:17:37.577 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4770. 15:17:37.579 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4771. 15:17:37.579 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4772. 15:17:37.579 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  4773. 15:17:37.581 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4774. 15:17:37.582 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4775. 15:17:37.582 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4776. 15:17:37.583 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  4777. 15:17:37.584 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4778. 15:17:37.584 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  4779. 15:17:37.585 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4780. 15:17:37.586 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4781. 15:17:37.586 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  4782. 15:17:37.587 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4783. 15:17:37.587 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4784. 15:17:37.587 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  4785. 15:17:37.588 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4786. 15:17:37.588 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4787. 15:17:37.588 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  4788. 15:17:37.589 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4789. 15:17:37.589 DEBUG [Ne3wWgjd] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  4790. 15:17:37.590 DEBUG [Ne3wWgjd] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  4791. 15:17:37.591 DEBUG [Ne3wWgjd] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  4792. 15:17:37.591 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  4793. 15:17:37.591 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  4794. 15:17:37.592 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580437270536194(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:37.591815(LocalDateTime)
  4795. 15:17:37.593 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  4796. 15:17:37.598 DEBUG [Ne3wWgjd] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 27ms
  4797. MockHttpServletRequest:
  4798. HTTP Method = POST
  4799. Request URI = /api/crawler/consume
  4800. Parameters = {}
  4801. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"2"]
  4802. Body = {}
  4803. Session Attrs = {}
  4804. Handler:
  4805. Type = com.xuekairui.user.controller.CrawlerController
  4806. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  4807. Async:
  4808. Async started = false
  4809. Async result = null
  4810. Resolved Exception:
  4811. Type = null
  4812. ModelAndView:
  4813. View name = null
  4814. View = null
  4815. Model = null
  4816. FlashMap:
  4817. Attributes = null
  4818. MockHttpServletResponse:
  4819. Status = 200
  4820. Error message = null
  4821. Headers = [X-Request-Id:"Ne3wWgjd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4822. Content type = application/json
  4823. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657597}
  4824. Forwarded URL = null
  4825. Redirected URL = null
  4826. Cookies = []
  4827. 15:17:37.608 DEBUG [MZTyaA9e] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  4828. 15:17:37.609 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4829. 15:17:37.609 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4830. 15:17:37.612 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4831. 15:17:37.614 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4832. 15:17:37.614 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4833. 15:17:37.616 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4834. 15:17:37.616 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4835. 15:17:37.616 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  4836. 15:17:37.618 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4837. 15:17:37.619 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4838. 15:17:37.619 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4839. 15:17:37.621 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  4840. 15:17:37.621 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4841. 15:17:37.621 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  4842. 15:17:37.622 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4843. 15:17:37.623 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4844. 15:17:37.623 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  4845. 15:17:37.624 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4846. 15:17:37.625 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4847. 15:17:37.625 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  4848. 15:17:37.627 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4849. 15:17:37.627 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4850. 15:17:37.627 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  4851. 15:17:37.628 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4852. 15:17:37.629 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ? AND status = ?)
  4853. 15:17:37.630 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String), 1(Integer)
  4854. 15:17:37.631 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  4855. 15:17:37.633 DEBUG [MZTyaA9e] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  4856. 15:17:37.633 DEBUG [MZTyaA9e] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  4857. 15:17:37.634 DEBUG [MZTyaA9e] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  4858. 15:17:37.634 DEBUG [MZTyaA9e] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  4859. 15:17:37.635 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  4860. 15:17:37.635 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580437463474178(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:37.634586500(LocalDateTime)
  4861. 15:17:37.637 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  4862. 15:17:37.642 DEBUG [MZTyaA9e] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 34ms
  4863. MockHttpServletRequest:
  4864. HTTP Method = POST
  4865. Request URI = /api/crawler/consume
  4866. Parameters = {}
  4867. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"33"]
  4868. Body = {"count":1,"useCouponFirst":true}
  4869. Session Attrs = {}
  4870. Handler:
  4871. Type = com.xuekairui.user.controller.CrawlerController
  4872. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  4873. Async:
  4874. Async started = false
  4875. Async result = null
  4876. Resolved Exception:
  4877. Type = null
  4878. ModelAndView:
  4879. View name = null
  4880. View = null
  4881. Model = null
  4882. FlashMap:
  4883. Attributes = null
  4884. MockHttpServletResponse:
  4885. Status = 200
  4886. Error message = null
  4887. Headers = [X-Request-Id:"MZTyaA9e", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4888. Content type = application/json
  4889. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657641}
  4890. Forwarded URL = null
  4891. Redirected URL = null
  4892. Cookies = []
  4893. 15:17:37.651 DEBUG [ptNcnr3X] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  4894. 15:17:37.652 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4895. 15:17:37.652 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4896. 15:17:37.655 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4897. 15:17:37.657 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4898. 15:17:37.657 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  4899. 15:17:37.658 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4900. 15:17:37.659 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4901. 15:17:37.659 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  4902. 15:17:37.661 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4903. 15:17:37.662 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4904. 15:17:37.662 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4905. 15:17:37.665 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  4906. 15:17:37.665 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4907. 15:17:37.665 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  4908. 15:17:37.667 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4909. 15:17:37.668 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4910. 15:17:37.668 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  4911. 15:17:37.670 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4912. 15:17:37.670 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4913. 15:17:37.670 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  4914. 15:17:37.672 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4915. 15:17:37.673 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4916. 15:17:37.673 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  4917. 15:17:37.675 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4918. 15:17:37.676 DEBUG [ptNcnr3X] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  4919. 15:17:37.677 DEBUG [ptNcnr3X] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  4920. 15:17:37.680 DEBUG [ptNcnr3X] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  4921. 15:17:37.680 DEBUG [ptNcnr3X] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  4922. 15:17:37.681 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  4923. 15:17:37.682 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580437656412161(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), taobao(String), QUOTA(String), 2026-07-02T15:17:37.680703800(LocalDateTime)
  4924. 15:17:37.686 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  4925. 15:17:37.692 DEBUG [ptNcnr3X] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 41ms
  4926. MockHttpServletRequest:
  4927. HTTP Method = POST
  4928. Request URI = /api/crawler/consume
  4929. Parameters = {}
  4930. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"31"]
  4931. Body = {"count":1,"platform":"taobao"}
  4932. Session Attrs = {}
  4933. Handler:
  4934. Type = com.xuekairui.user.controller.CrawlerController
  4935. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  4936. Async:
  4937. Async started = false
  4938. Async result = null
  4939. Resolved Exception:
  4940. Type = null
  4941. ModelAndView:
  4942. View name = null
  4943. View = null
  4944. Model = null
  4945. FlashMap:
  4946. Attributes = null
  4947. MockHttpServletResponse:
  4948. Status = 200
  4949. Error message = null
  4950. Headers = [X-Request-Id:"ptNcnr3X", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  4951. Content type = application/json
  4952. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657691}
  4953. Forwarded URL = null
  4954. Redirected URL = null
  4955. Cookies = []
  4956. 15:17:37.705 DEBUG [UrHsWQcj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  4957. 15:17:37.707 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4958. 15:17:37.708 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  4959. 15:17:37.711 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4960. 15:17:37.715 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  4961. 15:17:37.715 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  4962. 15:17:37.717 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  4963. 15:17:37.717 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  4964. 15:17:37.718 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  4965. 15:17:37.720 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  4966. 15:17:37.721 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  4967. 15:17:37.721 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  4968. 15:17:37.723 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  4969. 15:17:37.724 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  4970. 15:17:37.724 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  4971. 15:17:37.727 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  4972. 15:17:37.727 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  4973. 15:17:37.727 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  4974. 15:17:37.729 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  4975. 15:17:37.730 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  4976. 15:17:37.730 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  4977. 15:17:37.732 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  4978. 15:17:37.732 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  4979. 15:17:37.732 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  4980. 15:17:37.735 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  4981. 15:17:37.735 DEBUG [UrHsWQcj] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  4982. 15:17:37.736 DEBUG [UrHsWQcj] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  4983. 15:17:37.738 DEBUG [UrHsWQcj] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  4984. 15:17:37.738 DEBUG [UrHsWQcj] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  4985. 15:17:37.739 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  4986. 15:17:37.739 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580437912264705(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), jd(String), QUOTA(String), 2026-07-02T15:17:37.739087600(LocalDateTime)
  4987. 15:17:37.743 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  4988. 15:17:37.751 DEBUG [UrHsWQcj] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 46ms
  4989. MockHttpServletRequest:
  4990. HTTP Method = POST
  4991. Request URI = /api/crawler/consume
  4992. Parameters = {}
  4993. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"27"]
  4994. Body = {"count":1,"platform":"jd"}
  4995. Session Attrs = {}
  4996. Handler:
  4997. Type = com.xuekairui.user.controller.CrawlerController
  4998. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  4999. Async:
  5000. Async started = false
  5001. Async result = null
  5002. Resolved Exception:
  5003. Type = null
  5004. ModelAndView:
  5005. View name = null
  5006. View = null
  5007. Model = null
  5008. FlashMap:
  5009. Attributes = null
  5010. MockHttpServletResponse:
  5011. Status = 200
  5012. Error message = null
  5013. Headers = [X-Request-Id:"UrHsWQcj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5014. Content type = application/json
  5015. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657750}
  5016. Forwarded URL = null
  5017. Redirected URL = null
  5018. Cookies = []
  5019. 15:17:37.753 DEBUG [qDYxGqKY] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5020. 15:17:37.758 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5021. 15:17:37.758 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  5022. 15:17:37.761 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5023. 15:17:37.761 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5024. 15:17:37.761 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  5025. 15:17:37.764 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5026. 15:17:37.765 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5027. 15:17:37.766 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5028. 15:17:37.768 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  5029. 15:17:37.769 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5030. 15:17:37.769 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  5031. 15:17:37.772 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5032. 15:17:37.772 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5033. 15:17:37.772 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  5034. 15:17:37.774 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5035. 15:17:37.775 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5036. 15:17:37.775 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  5037. 15:17:37.778 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5038. 15:17:37.778 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5039. 15:17:37.778 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  5040. 15:17:37.781 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5041. 15:17:37.782 DEBUG [qDYxGqKY] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  5042. 15:17:37.782 DEBUG [qDYxGqKY] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  5043. 15:17:37.785 DEBUG [qDYxGqKY] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  5044. 15:17:37.785 DEBUG [qDYxGqKY] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  5045. 15:17:37.787 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  5046. 15:17:37.787 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438105202690(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), pdd(String), QUOTA(String), 2026-07-02T15:17:37.787346800(LocalDateTime)
  5047. 15:17:37.792 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  5048. 15:17:37.799 DEBUG [qDYxGqKY] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 46ms
  5049. MockHttpServletRequest:
  5050. HTTP Method = POST
  5051. Request URI = /api/crawler/consume
  5052. Parameters = {}
  5053. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"28"]
  5054. Body = {"count":1,"platform":"pdd"}
  5055. Session Attrs = {}
  5056. Handler:
  5057. Type = com.xuekairui.user.controller.CrawlerController
  5058. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5059. Async:
  5060. Async started = false
  5061. Async result = null
  5062. Resolved Exception:
  5063. Type = null
  5064. ModelAndView:
  5065. View name = null
  5066. View = null
  5067. Model = null
  5068. FlashMap:
  5069. Attributes = null
  5070. MockHttpServletResponse:
  5071. Status = 200
  5072. Error message = null
  5073. Headers = [X-Request-Id:"qDYxGqKY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5074. Content type = application/json
  5075. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657799}
  5076. Forwarded URL = null
  5077. Redirected URL = null
  5078. Cookies = []
  5079. 15:17:37.800 DEBUG [BqTC8wBs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5080. 15:17:37.806 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5081. 15:17:37.806 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  5082. 15:17:37.809 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5083. 15:17:37.809 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5084. 15:17:37.810 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  5085. 15:17:37.812 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5086. 15:17:37.813 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5087. 15:17:37.813 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5088. 15:17:37.816 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  5089. 15:17:37.816 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5090. 15:17:37.816 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  5091. 15:17:37.818 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5092. 15:17:37.818 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5093. 15:17:37.819 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  5094. 15:17:37.821 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5095. 15:17:37.821 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5096. 15:17:37.821 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  5097. 15:17:37.823 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5098. 15:17:37.824 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5099. 15:17:37.824 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  5100. 15:17:37.826 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5101. 15:17:37.827 DEBUG [BqTC8wBs] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  5102. 15:17:37.827 DEBUG [BqTC8wBs] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  5103. 15:17:37.829 DEBUG [BqTC8wBs] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  5104. 15:17:37.829 DEBUG [BqTC8wBs] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  5105. 15:17:37.830 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  5106. 15:17:37.830 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438298140673(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), douyin(String), QUOTA(String), 2026-07-02T15:17:37.830262700(LocalDateTime)
  5107. 15:17:37.834 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  5108. 15:17:37.842 DEBUG [BqTC8wBs] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 42ms
  5109. MockHttpServletRequest:
  5110. HTTP Method = POST
  5111. Request URI = /api/crawler/consume
  5112. Parameters = {}
  5113. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"31"]
  5114. Body = {"count":1,"platform":"douyin"}
  5115. Session Attrs = {}
  5116. Handler:
  5117. Type = com.xuekairui.user.controller.CrawlerController
  5118. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5119. Async:
  5120. Async started = false
  5121. Async result = null
  5122. Resolved Exception:
  5123. Type = null
  5124. ModelAndView:
  5125. View name = null
  5126. View = null
  5127. Model = null
  5128. FlashMap:
  5129. Attributes = null
  5130. MockHttpServletResponse:
  5131. Status = 200
  5132. Error message = null
  5133. Headers = [X-Request-Id:"BqTC8wBs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5134. Content type = application/json
  5135. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657841}
  5136. Forwarded URL = null
  5137. Redirected URL = null
  5138. Cookies = []
  5139. 15:17:37.843 DEBUG [uYEhnXpk] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5140. 15:17:37.850 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5141. 15:17:37.850 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  5142. 15:17:37.852 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5143. 15:17:37.853 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5144. 15:17:37.853 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  5145. 15:17:37.857 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5146. 15:17:37.858 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5147. 15:17:37.858 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5148. 15:17:37.862 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  5149. 15:17:37.862 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5150. 15:17:37.862 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  5151. 15:17:37.865 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5152. 15:17:37.865 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5153. 15:17:37.865 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  5154. 15:17:37.868 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5155. 15:17:37.868 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5156. 15:17:37.868 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  5157. 15:17:37.871 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5158. 15:17:37.871 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5159. 15:17:37.871 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  5160. 15:17:37.874 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5161. 15:17:37.875 DEBUG [uYEhnXpk] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  5162. 15:17:37.875 DEBUG [uYEhnXpk] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  5163. 15:17:37.877 DEBUG [uYEhnXpk] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  5164. 15:17:37.877 DEBUG [uYEhnXpk] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  5165. 15:17:37.879 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  5166. 15:17:37.879 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438491078658(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), kuaishou(String), QUOTA(String), 2026-07-02T15:17:37.879254500(LocalDateTime)
  5167. 15:17:37.884 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  5168. 15:17:37.892 DEBUG [uYEhnXpk] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 49ms
  5169. MockHttpServletRequest:
  5170. HTTP Method = POST
  5171. Request URI = /api/crawler/consume
  5172. Parameters = {}
  5173. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"33"]
  5174. Body = {"count":1,"platform":"kuaishou"}
  5175. Session Attrs = {}
  5176. Handler:
  5177. Type = com.xuekairui.user.controller.CrawlerController
  5178. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5179. Async:
  5180. Async started = false
  5181. Async result = null
  5182. Resolved Exception:
  5183. Type = null
  5184. ModelAndView:
  5185. View name = null
  5186. View = null
  5187. Model = null
  5188. FlashMap:
  5189. Attributes = null
  5190. MockHttpServletResponse:
  5191. Status = 200
  5192. Error message = null
  5193. Headers = [X-Request-Id:"uYEhnXpk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5194. Content type = application/json
  5195. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657891}
  5196. Forwarded URL = null
  5197. Redirected URL = null
  5198. Cookies = []
  5199. 15:17:37.893 DEBUG [GM4JKDZK] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5200. 15:17:37.898 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5201. 15:17:37.898 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  5202. 15:17:37.901 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5203. 15:17:37.901 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5204. 15:17:37.901 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  5205. 15:17:37.903 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5206. 15:17:37.904 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5207. 15:17:37.904 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5208. 15:17:37.906 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  5209. 15:17:37.907 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5210. 15:17:37.907 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  5211. 15:17:37.909 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5212. 15:17:37.909 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5213. 15:17:37.910 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  5214. 15:17:37.911 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5215. 15:17:37.912 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5216. 15:17:37.912 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  5217. 15:17:37.913 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5218. 15:17:37.913 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5219. 15:17:37.914 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  5220. 15:17:37.915 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5221. 15:17:37.916 DEBUG [GM4JKDZK] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  5222. 15:17:37.916 DEBUG [GM4JKDZK] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  5223. 15:17:37.918 DEBUG [GM4JKDZK] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  5224. 15:17:37.918 DEBUG [GM4JKDZK] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  5225. 15:17:37.919 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  5226. 15:17:37.919 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438621102081(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), xiaohongshu(String), QUOTA(String), 2026-07-02T15:17:37.919152800(LocalDateTime)
  5227. 15:17:37.923 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  5228. 15:17:37.930 DEBUG [GM4JKDZK] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 37ms
  5229. MockHttpServletRequest:
  5230. HTTP Method = POST
  5231. Request URI = /api/crawler/consume
  5232. Parameters = {}
  5233. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"36"]
  5234. Body = {"count":1,"platform":"xiaohongshu"}
  5235. Session Attrs = {}
  5236. Handler:
  5237. Type = com.xuekairui.user.controller.CrawlerController
  5238. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5239. Async:
  5240. Async started = false
  5241. Async result = null
  5242. Resolved Exception:
  5243. Type = null
  5244. ModelAndView:
  5245. View name = null
  5246. View = null
  5247. Model = null
  5248. FlashMap:
  5249. Attributes = null
  5250. MockHttpServletResponse:
  5251. Status = 200
  5252. Error message = null
  5253. Headers = [X-Request-Id:"GM4JKDZK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5254. Content type = application/json
  5255. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657929}
  5256. Forwarded URL = null
  5257. Redirected URL = null
  5258. Cookies = []
  5259. 15:17:37.931 DEBUG [LDKCYCS2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5260. 15:17:37.936 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5261. 15:17:37.936 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  5262. 15:17:37.940 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5263. 15:17:37.940 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5264. 15:17:37.940 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  5265. 15:17:37.944 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5266. 15:17:37.945 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5267. 15:17:37.946 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5268. 15:17:37.949 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  5269. 15:17:37.950 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5270. 15:17:37.950 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  5271. 15:17:37.952 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5272. 15:17:37.952 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5273. 15:17:37.953 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  5274. 15:17:37.956 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5275. 15:17:37.957 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5276. 15:17:37.957 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  5277. 15:17:37.960 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5278. 15:17:37.960 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5279. 15:17:37.960 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  5280. 15:17:37.962 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5281. 15:17:37.963 DEBUG [LDKCYCS2] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  5282. 15:17:37.963 DEBUG [LDKCYCS2] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  5283. 15:17:37.965 DEBUG [LDKCYCS2] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  5284. 15:17:37.966 DEBUG [LDKCYCS2] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  5285. 15:17:37.966 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  5286. 15:17:37.967 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438814040065(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), vipshop(String), QUOTA(String), 2026-07-02T15:17:37.966757900(LocalDateTime)
  5287. 15:17:37.972 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  5288. 15:17:37.979 DEBUG [LDKCYCS2] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 48ms
  5289. MockHttpServletRequest:
  5290. HTTP Method = POST
  5291. Request URI = /api/crawler/consume
  5292. Parameters = {}
  5293. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"32"]
  5294. Body = {"count":1,"platform":"vipshop"}
  5295. Session Attrs = {}
  5296. Handler:
  5297. Type = com.xuekairui.user.controller.CrawlerController
  5298. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5299. Async:
  5300. Async started = false
  5301. Async result = null
  5302. Resolved Exception:
  5303. Type = null
  5304. ModelAndView:
  5305. View name = null
  5306. View = null
  5307. Model = null
  5308. FlashMap:
  5309. Attributes = null
  5310. MockHttpServletResponse:
  5311. Status = 200
  5312. Error message = null
  5313. Headers = [X-Request-Id:"LDKCYCS2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5314. Content type = application/json
  5315. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657978}
  5316. Forwarded URL = null
  5317. Redirected URL = null
  5318. Cookies = []
  5319. 15:17:37.980 DEBUG [ckc3HMJk] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5320. 15:17:37.984 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5321. 15:17:37.984 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  5322. 15:17:37.986 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5323. 15:17:37.987 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5324. 15:17:37.987 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  5325. 15:17:37.990 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5326. 15:17:37.991 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5327. 15:17:37.991 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5328. 15:17:37.994 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  5329. 15:17:37.995 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5330. 15:17:37.995 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  5331. 15:17:37.997 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5332. 15:17:37.997 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5333. 15:17:37.997 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  5334. 15:17:37.998 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5335. 15:17:37.999 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5336. 15:17:37.999 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  5337. 15:17:38.000 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5338. 15:17:38.000 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5339. 15:17:38.000 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  5340. 15:17:38.003 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5341. 15:17:38.004 DEBUG [ckc3HMJk] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  5342. 15:17:38.004 DEBUG [ckc3HMJk] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  5343. 15:17:38.006 DEBUG [ckc3HMJk] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  5344. 15:17:38.007 DEBUG [ckc3HMJk] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  5345. 15:17:38.007 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  5346. 15:17:38.007 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580439006978050(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), other(String), QUOTA(String), 2026-07-02T15:17:38.007018400(LocalDateTime)
  5347. 15:17:38.010 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  5348. 15:17:38.016 DEBUG [ckc3HMJk] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 36ms
  5349. MockHttpServletRequest:
  5350. HTTP Method = POST
  5351. Request URI = /api/crawler/consume
  5352. Parameters = {}
  5353. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"30"]
  5354. Body = {"count":1,"platform":"other"}
  5355. Session Attrs = {}
  5356. Handler:
  5357. Type = com.xuekairui.user.controller.CrawlerController
  5358. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5359. Async:
  5360. Async started = false
  5361. Async result = null
  5362. Resolved Exception:
  5363. Type = null
  5364. ModelAndView:
  5365. View name = null
  5366. View = null
  5367. Model = null
  5368. FlashMap:
  5369. Attributes = null
  5370. MockHttpServletResponse:
  5371. Status = 200
  5372. Error message = null
  5373. Headers = [X-Request-Id:"ckc3HMJk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5374. Content type = application/json
  5375. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658016}
  5376. Forwarded URL = null
  5377. Redirected URL = null
  5378. Cookies = []
  5379. 15:17:38.025 DEBUG [bZx3SFPK] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5380. 15:17:38.026 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5381. 15:17:38.026 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  5382. 15:17:38.028 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5383. 15:17:38.032 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5384. 15:17:38.032 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  5385. 15:17:38.034 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5386. 15:17:38.034 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5387. 15:17:38.034 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  5388. 15:17:38.035 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5389. 15:17:38.036 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5390. 15:17:38.036 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5391. 15:17:38.038 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  5392. 15:17:38.039 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5393. 15:17:38.039 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  5394. 15:17:38.040 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5395. 15:17:38.040 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5396. 15:17:38.040 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  5397. 15:17:38.042 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5398. 15:17:38.042 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5399. 15:17:38.042 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  5400. 15:17:38.043 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5401. 15:17:38.043 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5402. 15:17:38.043 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  5403. 15:17:38.045 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5404. 15:17:38.045 DEBUG [bZx3SFPK] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  5405. 15:17:38.046 DEBUG [bZx3SFPK] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  5406. 15:17:38.047 DEBUG [bZx3SFPK] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  5407. 15:17:38.047 DEBUG [bZx3SFPK] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  5408. 15:17:38.048 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  5409. 15:17:38.048 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580439204110337(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:38.048246300(LocalDateTime)
  5410. 15:17:38.050 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  5411. 15:17:38.055 DEBUG [bZx3SFPK] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 30ms
  5412. MockHttpServletRequest:
  5413. HTTP Method = POST
  5414. Request URI = /api/crawler/consume
  5415. Parameters = {}
  5416. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg", Content-Length:"11"]
  5417. Body = {"count":1}
  5418. Session Attrs = {}
  5419. Handler:
  5420. Type = com.xuekairui.user.controller.CrawlerController
  5421. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5422. Async:
  5423. Async started = false
  5424. Async result = null
  5425. Resolved Exception:
  5426. Type = null
  5427. ModelAndView:
  5428. View name = null
  5429. View = null
  5430. Model = null
  5431. FlashMap:
  5432. Attributes = null
  5433. MockHttpServletResponse:
  5434. Status = 200
  5435. Error message = null
  5436. Headers = [X-Request-Id:"bZx3SFPK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5437. Content type = application/json
  5438. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658054}
  5439. Forwarded URL = null
  5440. Redirected URL = null
  5441. Cookies = []
  5442. 15:17:38.065 DEBUG [Y4CBSrDX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
  5443. 15:17:38.067 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5444. 15:17:38.067 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  5445. 15:17:38.068 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5446. 15:17:38.070 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
  5447. 15:17:38.071 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
  5448. 15:17:38.072 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  5449. 15:17:38.074 DEBUG [Y4CBSrDX] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 200 9ms
  5450. MockHttpServletRequest:
  5451. HTTP Method = GET
  5452. Request URI = /api/crawler/logs
  5453. Parameters = {}
  5454. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg"]
  5455. Body = null
  5456. Session Attrs = {}
  5457. Handler:
  5458. Type = com.xuekairui.user.controller.CrawlerController
  5459. Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
  5460. Async:
  5461. Async started = false
  5462. Async result = null
  5463. Resolved Exception:
  5464. Type = null
  5465. ModelAndView:
  5466. View name = null
  5467. View = null
  5468. Model = null
  5469. FlashMap:
  5470. Attributes = null
  5471. MockHttpServletResponse:
  5472. Status = 200
  5473. Error message = null
  5474. Headers = [X-Request-Id:"Y4CBSrDX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5475. Content type = application/json
  5476. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976658072}
  5477. Forwarded URL = null
  5478. Redirected URL = null
  5479. Cookies = []
  5480. 15:17:38.081 DEBUG [hJkB9JbB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=30 | IP: 127.0.0.1
  5481. 15:17:38.082 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5482. 15:17:38.082 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  5483. 15:17:38.084 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5484. 15:17:38.085 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
  5485. 15:17:38.085 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-02(LocalDate)
  5486. 15:17:38.087 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  5487. 15:17:38.088 DEBUG [hJkB9JbB] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=30 200 7ms
  5488. MockHttpServletRequest:
  5489. HTTP Method = GET
  5490. Request URI = /api/crawler/logs
  5491. Parameters = {days=[30]}
  5492. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg"]
  5493. Body = null
  5494. Session Attrs = {}
  5495. Handler:
  5496. Type = com.xuekairui.user.controller.CrawlerController
  5497. Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
  5498. Async:
  5499. Async started = false
  5500. Async result = null
  5501. Resolved Exception:
  5502. Type = null
  5503. ModelAndView:
  5504. View name = null
  5505. View = null
  5506. Model = null
  5507. FlashMap:
  5508. Attributes = null
  5509. MockHttpServletResponse:
  5510. Status = 200
  5511. Error message = null
  5512. Headers = [X-Request-Id:"hJkB9JbB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5513. Content type = application/json
  5514. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976658087}
  5515. Forwarded URL = null
  5516. Redirected URL = null
  5517. Cookies = []
  5518. 15:17:38.094 DEBUG [jYTHp9My] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
  5519. 15:17:38.096 WARN [jYTHp9My] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 401 2ms
  5520. MockHttpServletRequest:
  5521. HTTP Method = GET
  5522. Request URI = /api/crawler/logs
  5523. Parameters = {}
  5524. Headers = []
  5525. Body = null
  5526. Session Attrs = {}
  5527. Handler:
  5528. Type = null
  5529. Async:
  5530. Async started = false
  5531. Async result = null
  5532. Resolved Exception:
  5533. Type = null
  5534. ModelAndView:
  5535. View name = null
  5536. View = null
  5537. Model = null
  5538. FlashMap:
  5539. Attributes = null
  5540. MockHttpServletResponse:
  5541. Status = 401
  5542. Error message = null
  5543. Headers = [X-Request-Id:"jYTHp9My", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5544. Content type = application/json;charset=UTF-8
  5545. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976658095}
  5546. Forwarded URL = null
  5547. Redirected URL = null
  5548. Cookies = []
  5549. 15:17:38.103 DEBUG [5TTJHDrj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5550. 15:17:38.104 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5551. 15:17:38.104 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  5552. 15:17:38.106 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5553. 15:17:38.110 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5554. 15:17:38.110 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  5555. 15:17:38.112 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5556. 15:17:38.112 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5557. 15:17:38.112 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  5558. 15:17:38.114 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5559. 15:17:38.115 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5560. 15:17:38.115 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5561. 15:17:38.117 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  5562. 15:17:38.117 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5563. 15:17:38.117 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  5564. 15:17:38.119 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5565. 15:17:38.119 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5566. 15:17:38.119 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  5567. 15:17:38.121 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5568. 15:17:38.121 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5569. 15:17:38.121 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  5570. 15:17:38.122 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5571. 15:17:38.123 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5572. 15:17:38.123 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  5573. 15:17:38.124 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5574. 15:17:38.125 DEBUG [5TTJHDrj] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  5575. 15:17:38.125 DEBUG [5TTJHDrj] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  5576. 15:17:38.127 DEBUG [5TTJHDrj] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  5577. 15:17:38.127 DEBUG [5TTJHDrj] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  5578. 15:17:38.127 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  5579. 15:17:38.127 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580439522877441(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), taobao(String), QUOTA(String), 2026-07-02T15:17:38.127626300(LocalDateTime)
  5580. 15:17:38.129 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  5581. 15:17:38.135 DEBUG [5TTJHDrj] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 32ms
  5582. MockHttpServletRequest:
  5583. HTTP Method = POST
  5584. Request URI = /api/crawler/consume
  5585. Parameters = {}
  5586. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg", Content-Length:"31"]
  5587. Body = {"count":1,"platform":"taobao"}
  5588. Session Attrs = {}
  5589. Handler:
  5590. Type = com.xuekairui.user.controller.CrawlerController
  5591. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5592. Async:
  5593. Async started = false
  5594. Async result = null
  5595. Resolved Exception:
  5596. Type = null
  5597. ModelAndView:
  5598. View name = null
  5599. View = null
  5600. Model = null
  5601. FlashMap:
  5602. Attributes = null
  5603. MockHttpServletResponse:
  5604. Status = 200
  5605. Error message = null
  5606. Headers = [X-Request-Id:"5TTJHDrj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5607. Content type = application/json
  5608. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658134}
  5609. Forwarded URL = null
  5610. Redirected URL = null
  5611. Cookies = []
  5612. 15:17:38.136 DEBUG [pKRrx5sp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 | IP: 127.0.0.1
  5613. 15:17:38.138 DEBUG [pKRrx5sp] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
  5614. 15:17:38.138 DEBUG [pKRrx5sp] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
  5615. 15:17:38.140 DEBUG [pKRrx5sp] [1] [ main] c.x.u.m.C.selectList : <== Total: 1
  5616. 15:17:38.141 DEBUG [pKRrx5sp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 200 5ms
  5617. MockHttpServletRequest:
  5618. HTTP Method = GET
  5619. Request URI = /api/crawler/logs
  5620. Parameters = {days=[7]}
  5621. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg"]
  5622. Body = null
  5623. Session Attrs = {}
  5624. Handler:
  5625. Type = com.xuekairui.user.controller.CrawlerController
  5626. Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
  5627. Async:
  5628. Async started = false
  5629. Async result = null
  5630. Resolved Exception:
  5631. Type = null
  5632. ModelAndView:
  5633. View name = null
  5634. View = null
  5635. Model = null
  5636. FlashMap:
  5637. Attributes = null
  5638. MockHttpServletResponse:
  5639. Status = 200
  5640. Error message = null
  5641. Headers = [X-Request-Id:"pKRrx5sp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5642. Content type = application/json
  5643. Body = {"code":200,"message":"操作成功","data":[{"id":2072580439522877441,"userId":1,"usageDate":"2026-07-02","usageCount":1,"platform":"taobao","source":"QUOTA","remark":null,"createTime":"2026-07-02 15:17:38"}],"timestamp":1782976658140}
  5644. Forwarded URL = null
  5645. Redirected URL = null
  5646. Cookies = []
  5647. 15:17:38.155 DEBUG [PvaXdNKZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5648. 15:17:38.157 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5649. 15:17:38.157 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9001(Long)
  5650. 15:17:38.158 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5651. 15:17:38.161 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5652. 15:17:38.161 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9001(Long)
  5653. 15:17:38.162 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5654. 15:17:38.162 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5655. 15:17:38.162 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9001(Long)
  5656. 15:17:38.164 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5657. 15:17:38.164 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5658. 15:17:38.164 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5659. 15:17:38.165 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.M.selectList : <== Total: 3
  5660. 15:17:38.166 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5661. 15:17:38.166 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9001(Long)
  5662. 15:17:38.167 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5663. 15:17:38.167 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5664. 15:17:38.167 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9001(Long)
  5665. 15:17:38.168 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5666. 15:17:38.169 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5667. 15:17:38.169 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9001(Long)
  5668. 15:17:38.170 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5669. 15:17:38.171 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5670. 15:17:38.171 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9001(Long)
  5671. 15:17:38.172 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5672. 15:17:38.174 WARN [PvaXdNKZ] [9001] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4201, message=今日爬虫次数已用完
  5673. 15:17:38.174 DEBUG [PvaXdNKZ] [9001] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 19ms
  5674. MockHttpServletRequest:
  5675. HTTP Method = POST
  5676. Request URI = /api/crawler/consume
  5677. Parameters = {}
  5678. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkwMDEsInN1YiI6IjkwMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.RB29YiTzsukc7u3p6K3KYrpeGSLaBGCCE2OS3_cCF4mynL4v6lJwxuL3WIzICLX_AwKUMOpSjuhhAA64jLAbRw", Content-Length:"12"]
  5679. Body = {"count":15}
  5680. Session Attrs = {}
  5681. Handler:
  5682. Type = com.xuekairui.user.controller.CrawlerController
  5683. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5684. Async:
  5685. Async started = false
  5686. Async result = null
  5687. Resolved Exception:
  5688. Type = com.xuekairui.common.BusinessException
  5689. ModelAndView:
  5690. View name = null
  5691. View = null
  5692. Model = null
  5693. FlashMap:
  5694. Attributes = null
  5695. MockHttpServletResponse:
  5696. Status = 200
  5697. Error message = null
  5698. Headers = [X-Request-Id:"PvaXdNKZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5699. Content type = application/json
  5700. Body = {"code":4201,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976658174}
  5701. Forwarded URL = null
  5702. Redirected URL = null
  5703. Cookies = []
  5704. 15:17:38.187 DEBUG [K6qaJBu7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5705. 15:17:38.188 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5706. 15:17:38.188 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9002(Long)
  5707. 15:17:38.190 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5708. 15:17:38.193 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5709. 15:17:38.194 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9002(Long)
  5710. 15:17:38.196 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5711. 15:17:38.196 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5712. 15:17:38.197 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9002(Long)
  5713. 15:17:38.199 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5714. 15:17:38.199 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5715. 15:17:38.200 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5716. 15:17:38.201 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.M.selectList : <== Total: 3
  5717. 15:17:38.202 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5718. 15:17:38.202 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9002(Long)
  5719. 15:17:38.203 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5720. 15:17:38.203 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5721. 15:17:38.203 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9002(Long)
  5722. 15:17:38.205 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5723. 15:17:38.205 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5724. 15:17:38.205 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9002(Long)
  5725. 15:17:38.207 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5726. 15:17:38.207 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5727. 15:17:38.207 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9002(Long)
  5728. 15:17:38.208 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5729. 15:17:38.211 WARN [K6qaJBu7] [9002] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4201, message=今日爬虫次数已用完
  5730. 15:17:38.212 DEBUG [K6qaJBu7] [9002] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 25ms
  5731. MockHttpServletRequest:
  5732. HTTP Method = POST
  5733. Request URI = /api/crawler/consume
  5734. Parameters = {}
  5735. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkwMDIsInN1YiI6IjkwMDIiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.MZfgkeqY-NHNa_-Dm17oQV_5h1WWWvaV6Odh5V_s7tkrkDOF5HgAW2PfOocl_cyTGaqZxpCN0j8D4weLT6HnVg", Content-Length:"12"]
  5736. Body = {"count":11}
  5737. Session Attrs = {}
  5738. Handler:
  5739. Type = com.xuekairui.user.controller.CrawlerController
  5740. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5741. Async:
  5742. Async started = false
  5743. Async result = null
  5744. Resolved Exception:
  5745. Type = com.xuekairui.common.BusinessException
  5746. ModelAndView:
  5747. View name = null
  5748. View = null
  5749. Model = null
  5750. FlashMap:
  5751. Attributes = null
  5752. MockHttpServletResponse:
  5753. Status = 200
  5754. Error message = null
  5755. Headers = [X-Request-Id:"K6qaJBu7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5756. Content type = application/json
  5757. Body = {"code":4201,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976658211}
  5758. Forwarded URL = null
  5759. Redirected URL = null
  5760. Cookies = []
  5761. 15:17:38.225 DEBUG [E3WwyApV] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5762. 15:17:38.226 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5763. 15:17:38.226 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9003(Long)
  5764. 15:17:38.228 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5765. 15:17:38.232 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5766. 15:17:38.232 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9003(Long)
  5767. 15:17:38.234 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5768. 15:17:38.235 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5769. 15:17:38.235 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9003(Long)
  5770. 15:17:38.237 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5771. 15:17:38.238 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5772. 15:17:38.238 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5773. 15:17:38.240 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.M.selectList : <== Total: 3
  5774. 15:17:38.240 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5775. 15:17:38.240 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9003(Long)
  5776. 15:17:38.242 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5777. 15:17:38.242 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5778. 15:17:38.242 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9003(Long)
  5779. 15:17:38.244 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5780. 15:17:38.244 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5781. 15:17:38.244 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9003(Long)
  5782. 15:17:38.247 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5783. 15:17:38.247 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5784. 15:17:38.248 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9003(Long)
  5785. 15:17:38.249 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5786. 15:17:38.252 WARN [E3WwyApV] [9003] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4202, message=本月爬虫次数已用完
  5787. 15:17:38.253 DEBUG [E3WwyApV] [9003] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 28ms
  5788. MockHttpServletRequest:
  5789. HTTP Method = POST
  5790. Request URI = /api/crawler/consume
  5791. Parameters = {}
  5792. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkwMDMsInN1YiI6IjkwMDMiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.BLBcyOEglg0g6wIx3VBOs5DUTTjUYiVj2-Bp_QYWfzxgwOwMql8YQmYGocjAXmqj5p-7mO1hSDprXBQzzGWqqw", Content-Length:"13"]
  5793. Body = {"count":999}
  5794. Session Attrs = {}
  5795. Handler:
  5796. Type = com.xuekairui.user.controller.CrawlerController
  5797. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5798. Async:
  5799. Async started = false
  5800. Async result = null
  5801. Resolved Exception:
  5802. Type = com.xuekairui.common.BusinessException
  5803. ModelAndView:
  5804. View name = null
  5805. View = null
  5806. Model = null
  5807. FlashMap:
  5808. Attributes = null
  5809. MockHttpServletResponse:
  5810. Status = 200
  5811. Error message = null
  5812. Headers = [X-Request-Id:"E3WwyApV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5813. Content type = application/json
  5814. Body = {"code":4202,"message":"本月爬虫次数已用完","data":null,"timestamp":1782976658252}
  5815. Forwarded URL = null
  5816. Redirected URL = null
  5817. Cookies = []
  5818. 15:17:38.267 DEBUG [uK4Q4k9w] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  5819. 15:17:38.268 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5820. 15:17:38.268 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9101(Long)
  5821. 15:17:38.269 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5822. 15:17:38.270 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5823. 15:17:38.270 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9101(Long)
  5824. 15:17:38.272 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5825. 15:17:38.272 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5826. 15:17:38.272 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9101(Long)
  5827. 15:17:38.275 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5828. 15:17:38.276 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5829. 15:17:38.276 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5830. 15:17:38.278 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.M.selectList : <== Total: 3
  5831. 15:17:38.279 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5832. 15:17:38.279 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9101(Long)
  5833. 15:17:38.280 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5834. 15:17:38.280 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5835. 15:17:38.281 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9101(Long)
  5836. 15:17:38.282 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5837. 15:17:38.283 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5838. 15:17:38.283 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9101(Long)
  5839. 15:17:38.285 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5840. 15:17:38.285 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  5841. 15:17:38.286 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  5842. 15:17:38.287 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.selectList : <== Total: 0
  5843. 15:17:38.287 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5844. 15:17:38.287 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9101(Long)
  5845. 15:17:38.289 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5846. 15:17:38.289 DEBUG [uK4Q4k9w] [9101] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  5847. 15:17:38.290 DEBUG [uK4Q4k9w] [9101] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 9101(Long)
  5848. 15:17:38.292 DEBUG [uK4Q4k9w] [9101] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  5849. 15:17:38.294 DEBUG [uK4Q4k9w] [9101] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 27ms
  5850. MockHttpServletRequest:
  5851. HTTP Method = GET
  5852. Request URI = /api/crawler/status
  5853. Parameters = {}
  5854. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDEsInN1YiI6IjkxMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.CkNHAC302tbQ7C23v5zHRHQqVmdTPQd6pP-1ewgVvHKYlba8s602M2dL-DjDFme2sK-fe_Og0yJxQFdX289ZoA"]
  5855. Body = null
  5856. Session Attrs = {}
  5857. Handler:
  5858. Type = com.xuekairui.user.controller.CrawlerController
  5859. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  5860. Async:
  5861. Async started = false
  5862. Async result = null
  5863. Resolved Exception:
  5864. Type = null
  5865. ModelAndView:
  5866. View name = null
  5867. View = null
  5868. Model = null
  5869. FlashMap:
  5870. Attributes = null
  5871. MockHttpServletResponse:
  5872. Status = 200
  5873. Error message = null
  5874. Headers = [X-Request-Id:"uK4Q4k9w", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5875. Content type = application/json
  5876. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976658292}
  5877. Forwarded URL = null
  5878. Redirected URL = null
  5879. Cookies = []
  5880. 15:17:38.295 DEBUG [5Ne4KJvk] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  5881. 15:17:38.297 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5882. 15:17:38.297 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9101(Long)
  5883. 15:17:38.299 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5884. 15:17:38.299 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5885. 15:17:38.300 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9101(Long)
  5886. 15:17:38.301 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5887. 15:17:38.302 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5888. 15:17:38.302 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5889. 15:17:38.303 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.M.selectList : <== Total: 3
  5890. 15:17:38.304 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5891. 15:17:38.304 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9101(Long)
  5892. 15:17:38.306 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5893. 15:17:38.306 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5894. 15:17:38.306 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9101(Long)
  5895. 15:17:38.308 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5896. 15:17:38.308 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5897. 15:17:38.308 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9101(Long)
  5898. 15:17:38.309 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5899. 15:17:38.310 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5900. 15:17:38.310 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9101(Long)
  5901. 15:17:38.311 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5902. 15:17:38.312 DEBUG [5Ne4KJvk] [9101] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  5903. 15:17:38.312 DEBUG [5Ne4KJvk] [9101] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9101(Long)
  5904. 15:17:38.313 DEBUG [5Ne4KJvk] [9101] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  5905. 15:17:38.313 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.service.CrawlerService : 用户9101消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  5906. 15:17:38.314 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  5907. 15:17:38.314 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580440294629377(Long), 9101(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:38.314155200(LocalDateTime)
  5908. 15:17:38.317 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.insert : <== Updates: 1
  5909. 15:17:38.323 DEBUG [5Ne4KJvk] [9101] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 28ms
  5910. MockHttpServletRequest:
  5911. HTTP Method = POST
  5912. Request URI = /api/crawler/consume
  5913. Parameters = {}
  5914. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDEsInN1YiI6IjkxMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.CkNHAC302tbQ7C23v5zHRHQqVmdTPQd6pP-1ewgVvHKYlba8s602M2dL-DjDFme2sK-fe_Og0yJxQFdX289ZoA", Content-Length:"11"]
  5915. Body = {"count":1}
  5916. Session Attrs = {}
  5917. Handler:
  5918. Type = com.xuekairui.user.controller.CrawlerController
  5919. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  5920. Async:
  5921. Async started = false
  5922. Async result = null
  5923. Resolved Exception:
  5924. Type = null
  5925. ModelAndView:
  5926. View name = null
  5927. View = null
  5928. Model = null
  5929. FlashMap:
  5930. Attributes = null
  5931. MockHttpServletResponse:
  5932. Status = 200
  5933. Error message = null
  5934. Headers = [X-Request-Id:"5Ne4KJvk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5935. Content type = application/json
  5936. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658322}
  5937. Forwarded URL = null
  5938. Redirected URL = null
  5939. Cookies = []
  5940. 15:17:38.323 DEBUG [SbV9ngzA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  5941. 15:17:38.324 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  5942. 15:17:38.324 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9101(Long)
  5943. 15:17:38.327 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  5944. 15:17:38.327 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  5945. 15:17:38.327 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9101(Long)
  5946. 15:17:38.329 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  5947. 15:17:38.330 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  5948. 15:17:38.330 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  5949. 15:17:38.332 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.M.selectList : <== Total: 3
  5950. 15:17:38.332 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  5951. 15:17:38.332 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9101(Long)
  5952. 15:17:38.334 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  5953. 15:17:38.334 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  5954. 15:17:38.334 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9101(Long)
  5955. 15:17:38.336 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  5956. 15:17:38.336 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  5957. 15:17:38.337 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9101(Long)
  5958. 15:17:38.338 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  5959. 15:17:38.339 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  5960. 15:17:38.339 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  5961. 15:17:38.340 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.selectList : <== Total: 0
  5962. 15:17:38.341 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  5963. 15:17:38.341 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9101(Long)
  5964. 15:17:38.342 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  5965. 15:17:38.343 DEBUG [SbV9ngzA] [9101] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  5966. 15:17:38.343 DEBUG [SbV9ngzA] [9101] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 9101(Long)
  5967. 15:17:38.344 DEBUG [SbV9ngzA] [9101] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  5968. 15:17:38.345 DEBUG [SbV9ngzA] [9101] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 22ms
  5969. MockHttpServletRequest:
  5970. HTTP Method = GET
  5971. Request URI = /api/crawler/status
  5972. Parameters = {}
  5973. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDEsInN1YiI6IjkxMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.CkNHAC302tbQ7C23v5zHRHQqVmdTPQd6pP-1ewgVvHKYlba8s602M2dL-DjDFme2sK-fe_Og0yJxQFdX289ZoA"]
  5974. Body = null
  5975. Session Attrs = {}
  5976. Handler:
  5977. Type = com.xuekairui.user.controller.CrawlerController
  5978. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  5979. Async:
  5980. Async started = false
  5981. Async result = null
  5982. Resolved Exception:
  5983. Type = null
  5984. ModelAndView:
  5985. View name = null
  5986. View = null
  5987. Model = null
  5988. FlashMap:
  5989. Attributes = null
  5990. MockHttpServletResponse:
  5991. Status = 200
  5992. Error message = null
  5993. Headers = [X-Request-Id:"SbV9ngzA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  5994. Content type = application/json
  5995. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":1,"todayQuota":10,"todayRemaining":9,"monthUsed":1,"monthQuota":300,"monthRemaining":299,"yearUsed":1,"yearQuota":3650,"yearRemaining":3649,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976658344}
  5996. Forwarded URL = null
  5997. Redirected URL = null
  5998. Cookies = []
  5999. [INFO] Tests run: 23, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.754 s -- in 爬虫配额接口测试
  6000. [INFO] Running 爬虫配额和平台账号绑定测试
  6001. 15:17:38.350 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.CrawlerQuotaAndPlatformTest]: CrawlerQuotaAndPlatformTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  6002. 15:17:38.352 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.CrawlerQuotaAndPlatformTest
  6003. 15:17:41.570 DEBUG [xWGWjQ4R] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  6004. 15:17:41.571 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6005. 15:17:41.571 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6006. 15:17:41.572 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6007. 15:17:41.573 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6008. 15:17:41.573 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6009. 15:17:41.574 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6010. 15:17:41.574 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  6011. 15:17:41.575 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  6012. 15:17:41.576 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  6013. 15:17:41.577 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  6014. 15:17:41.577 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  6015. 15:17:41.578 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  6016. 15:17:41.578 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  6017. 15:17:41.578 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  6018. 15:17:41.580 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  6019. 15:17:41.580 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  6020. 15:17:41.580 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  6021. 15:17:41.581 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  6022. 15:17:41.581 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  6023. 15:17:41.581 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  6024. 15:17:41.582 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  6025. 15:17:41.583 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  6026. 15:17:41.583 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  6027. 15:17:41.585 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  6028. 15:17:41.585 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  6029. 15:17:41.585 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  6030. 15:17:41.587 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  6031. 15:17:41.587 DEBUG [xWGWjQ4R] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  6032. 15:17:41.587 DEBUG [xWGWjQ4R] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  6033. 15:17:41.588 DEBUG [xWGWjQ4R] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  6034. 15:17:41.589 DEBUG [xWGWjQ4R] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 19ms
  6035. MockHttpServletRequest:
  6036. HTTP Method = GET
  6037. Request URI = /api/crawler/status
  6038. Parameters = {}
  6039. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
  6040. Body = null
  6041. Session Attrs = {}
  6042. Handler:
  6043. Type = com.xuekairui.user.controller.CrawlerController
  6044. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  6045. Async:
  6046. Async started = false
  6047. Async result = null
  6048. Resolved Exception:
  6049. Type = null
  6050. ModelAndView:
  6051. View name = null
  6052. View = null
  6053. Model = null
  6054. FlashMap:
  6055. Attributes = null
  6056. MockHttpServletResponse:
  6057. Status = 200
  6058. Error message = null
  6059. Headers = [X-Request-Id:"xWGWjQ4R", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6060. Content type = application/json
  6061. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976661588}
  6062. Forwarded URL = null
  6063. Redirected URL = null
  6064. Cookies = []
  6065. 15:17:41.596 DEBUG [kMjKA3cY] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  6066. 15:17:41.597 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6067. 15:17:41.597 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6068. 15:17:41.599 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6069. 15:17:41.599 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6070. 15:17:41.599 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6071. 15:17:41.601 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6072. 15:17:41.601 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  6073. 15:17:41.601 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  6074. 15:17:41.602 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  6075. 15:17:41.603 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  6076. 15:17:41.603 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  6077. 15:17:41.604 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  6078. 15:17:41.605 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  6079. 15:17:41.605 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  6080. 15:17:41.605 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  6081. 15:17:41.605 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  6082. 15:17:41.606 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  6083. 15:17:41.608 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  6084. 15:17:41.608 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  6085. 15:17:41.608 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  6086. 15:17:41.609 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  6087. 15:17:41.610 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  6088. 15:17:41.610 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  6089. 15:17:41.611 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  6090. 15:17:41.611 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  6091. 15:17:41.611 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  6092. 15:17:41.612 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  6093. 15:17:41.612 DEBUG [kMjKA3cY] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  6094. 15:17:41.612 DEBUG [kMjKA3cY] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  6095. 15:17:41.614 DEBUG [kMjKA3cY] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  6096. 15:17:41.615 DEBUG [kMjKA3cY] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 19ms
  6097. MockHttpServletRequest:
  6098. HTTP Method = GET
  6099. Request URI = /api/crawler/status
  6100. Parameters = {}
  6101. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
  6102. Body = null
  6103. Session Attrs = {}
  6104. Handler:
  6105. Type = com.xuekairui.user.controller.CrawlerController
  6106. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  6107. Async:
  6108. Async started = false
  6109. Async result = null
  6110. Resolved Exception:
  6111. Type = null
  6112. ModelAndView:
  6113. View name = null
  6114. View = null
  6115. Model = null
  6116. FlashMap:
  6117. Attributes = null
  6118. MockHttpServletResponse:
  6119. Status = 200
  6120. Error message = null
  6121. Headers = [X-Request-Id:"kMjKA3cY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6122. Content type = application/json
  6123. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976661615}
  6124. Forwarded URL = null
  6125. Redirected URL = null
  6126. Cookies = []
  6127. 15:17:41.622 DEBUG [v4mAdBGD] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  6128. 15:17:41.623 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6129. 15:17:41.624 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6130. 15:17:41.625 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6131. 15:17:41.626 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6132. 15:17:41.626 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6133. 15:17:41.628 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6134. 15:17:41.628 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  6135. 15:17:41.628 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  6136. 15:17:41.629 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  6137. 15:17:41.630 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  6138. 15:17:41.630 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  6139. 15:17:41.633 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  6140. 15:17:41.633 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  6141. 15:17:41.633 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  6142. 15:17:41.634 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  6143. 15:17:41.634 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  6144. 15:17:41.634 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  6145. 15:17:41.635 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  6146. 15:17:41.636 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  6147. 15:17:41.636 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  6148. 15:17:41.637 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  6149. 15:17:41.637 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  6150. 15:17:41.637 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  6151. 15:17:41.639 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  6152. 15:17:41.639 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  6153. 15:17:41.639 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  6154. 15:17:41.641 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  6155. 15:17:41.641 DEBUG [v4mAdBGD] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  6156. 15:17:41.641 DEBUG [v4mAdBGD] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  6157. 15:17:41.642 DEBUG [v4mAdBGD] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  6158. 15:17:41.643 DEBUG [v4mAdBGD] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 21ms
  6159. MockHttpServletRequest:
  6160. HTTP Method = GET
  6161. Request URI = /api/crawler/status
  6162. Parameters = {}
  6163. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
  6164. Body = null
  6165. Session Attrs = {}
  6166. Handler:
  6167. Type = com.xuekairui.user.controller.CrawlerController
  6168. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  6169. Async:
  6170. Async started = false
  6171. Async result = null
  6172. Resolved Exception:
  6173. Type = null
  6174. ModelAndView:
  6175. View name = null
  6176. View = null
  6177. Model = null
  6178. FlashMap:
  6179. Attributes = null
  6180. MockHttpServletResponse:
  6181. Status = 200
  6182. Error message = null
  6183. Headers = [X-Request-Id:"v4mAdBGD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6184. Content type = application/json
  6185. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976661642}
  6186. Forwarded URL = null
  6187. Redirected URL = null
  6188. Cookies = []
  6189. 15:17:41.649 DEBUG [ApJVwb7L] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  6190. 15:17:41.650 WARN [ApJVwb7L] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
  6191. MockHttpServletRequest:
  6192. HTTP Method = GET
  6193. Request URI = /api/crawler/status
  6194. Parameters = {}
  6195. Headers = []
  6196. Body = null
  6197. Session Attrs = {}
  6198. Handler:
  6199. Type = null
  6200. Async:
  6201. Async started = false
  6202. Async result = null
  6203. Resolved Exception:
  6204. Type = null
  6205. ModelAndView:
  6206. View name = null
  6207. View = null
  6208. Model = null
  6209. FlashMap:
  6210. Attributes = null
  6211. MockHttpServletResponse:
  6212. Status = 401
  6213. Error message = null
  6214. Headers = [X-Request-Id:"ApJVwb7L", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6215. Content type = application/json;charset=UTF-8
  6216. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976661650}
  6217. Forwarded URL = null
  6218. Redirected URL = null
  6219. Cookies = []
  6220. 15:17:41.657 DEBUG [CXeT6Cg7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  6221. 15:17:41.658 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6222. 15:17:41.658 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6223. 15:17:41.660 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6224. 15:17:41.663 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6225. 15:17:41.664 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6226. 15:17:41.665 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6227. 15:17:41.665 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  6228. 15:17:41.665 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  6229. 15:17:41.666 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  6230. 15:17:41.667 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  6231. 15:17:41.667 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  6232. 15:17:41.669 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  6233. 15:17:41.670 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  6234. 15:17:41.670 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  6235. 15:17:41.671 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  6236. 15:17:41.671 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  6237. 15:17:41.671 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  6238. 15:17:41.672 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  6239. 15:17:41.672 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  6240. 15:17:41.672 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  6241. 15:17:41.674 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  6242. 15:17:41.674 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  6243. 15:17:41.674 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  6244. 15:17:41.676 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  6245. 15:17:41.676 DEBUG [CXeT6Cg7] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  6246. 15:17:41.676 DEBUG [CXeT6Cg7] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  6247. 15:17:41.678 DEBUG [CXeT6Cg7] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  6248. 15:17:41.678 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  6249. 15:17:41.678 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  6250. 15:17:41.679 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580454421045249(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:41.678146700(LocalDateTime)
  6251. 15:17:41.682 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  6252. 15:17:41.687 DEBUG [CXeT6Cg7] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 30ms
  6253. MockHttpServletRequest:
  6254. HTTP Method = POST
  6255. Request URI = /api/crawler/consume
  6256. Parameters = {}
  6257. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"78"]
  6258. Body = {
  6259. "count": 1,
  6260. "useCouponFirst": false,
  6261. "platform": "yaoshibang"
  6262. }
  6263. Session Attrs = {}
  6264. Handler:
  6265. Type = com.xuekairui.user.controller.CrawlerController
  6266. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  6267. Async:
  6268. Async started = false
  6269. Async result = null
  6270. Resolved Exception:
  6271. Type = null
  6272. ModelAndView:
  6273. View name = null
  6274. View = null
  6275. Model = null
  6276. FlashMap:
  6277. Attributes = null
  6278. MockHttpServletResponse:
  6279. Status = 200
  6280. Error message = null
  6281. Headers = [X-Request-Id:"CXeT6Cg7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6282. Content type = application/json
  6283. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661686}
  6284. Forwarded URL = null
  6285. Redirected URL = null
  6286. Cookies = []
  6287. 15:17:41.698 DEBUG [wJVGpdFN] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  6288. 15:17:41.699 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6289. 15:17:41.699 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6290. 15:17:41.701 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6291. 15:17:41.703 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6292. 15:17:41.704 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6293. 15:17:41.705 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6294. 15:17:41.705 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  6295. 15:17:41.705 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  6296. 15:17:41.706 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  6297. 15:17:41.707 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  6298. 15:17:41.707 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  6299. 15:17:41.709 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  6300. 15:17:41.709 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  6301. 15:17:41.709 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  6302. 15:17:41.710 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  6303. 15:17:41.711 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  6304. 15:17:41.711 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  6305. 15:17:41.711 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  6306. 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  6307. 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  6308. 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  6309. 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  6310. 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  6311. 15:17:41.713 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  6312. 15:17:41.714 DEBUG [wJVGpdFN] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  6313. 15:17:41.714 DEBUG [wJVGpdFN] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  6314. 15:17:41.715 DEBUG [wJVGpdFN] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  6315. 15:17:41.715 DEBUG [wJVGpdFN] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  6316. 15:17:41.715 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  6317. 15:17:41.715 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580454551068674(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:41.715406400(LocalDateTime)
  6318. 15:17:41.718 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  6319. 15:17:41.722 DEBUG [wJVGpdFN] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 24ms
  6320. MockHttpServletRequest:
  6321. HTTP Method = POST
  6322. Request URI = /api/crawler/consume
  6323. Parameters = {}
  6324. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"49"]
  6325. Body = {
  6326. "count": 1,
  6327. "platform": "yaoshibang"
  6328. }
  6329. Session Attrs = {}
  6330. Handler:
  6331. Type = com.xuekairui.user.controller.CrawlerController
  6332. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  6333. Async:
  6334. Async started = false
  6335. Async result = null
  6336. Resolved Exception:
  6337. Type = null
  6338. ModelAndView:
  6339. View name = null
  6340. View = null
  6341. Model = null
  6342. FlashMap:
  6343. Attributes = null
  6344. MockHttpServletResponse:
  6345. Status = 200
  6346. Error message = null
  6347. Headers = [X-Request-Id:"wJVGpdFN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6348. Content type = application/json
  6349. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661721}
  6350. Forwarded URL = null
  6351. Redirected URL = null
  6352. Cookies = []
  6353. 15:17:41.731 DEBUG [7VHsx84F] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  6354. 15:17:41.732 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6355. 15:17:41.732 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6356. 15:17:41.734 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6357. 15:17:41.737 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6358. 15:17:41.737 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6359. 15:17:41.738 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6360. 15:17:41.738 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  6361. 15:17:41.738 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  6362. 15:17:41.739 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  6363. 15:17:41.740 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  6364. 15:17:41.740 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  6365. 15:17:41.742 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  6366. 15:17:41.742 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  6367. 15:17:41.742 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  6368. 15:17:41.743 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  6369. 15:17:41.743 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  6370. 15:17:41.743 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  6371. 15:17:41.744 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  6372. 15:17:41.744 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  6373. 15:17:41.744 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  6374. 15:17:41.745 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  6375. 15:17:41.746 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  6376. 15:17:41.746 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  6377. 15:17:41.746 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  6378. 15:17:41.746 DEBUG [7VHsx84F] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  6379. 15:17:41.747 DEBUG [7VHsx84F] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  6380. 15:17:41.748 DEBUG [7VHsx84F] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  6381. 15:17:41.748 DEBUG [7VHsx84F] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  6382. 15:17:41.748 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  6383. 15:17:41.748 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580454676897793(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaobangmang(String), QUOTA(String), 2026-07-02T15:17:41.748111500(LocalDateTime)
  6384. 15:17:41.750 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  6385. 15:17:41.755 DEBUG [7VHsx84F] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 24ms
  6386. MockHttpServletRequest:
  6387. HTTP Method = POST
  6388. Request URI = /api/crawler/consume
  6389. Parameters = {}
  6390. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"50"]
  6391. Body = {
  6392. "count": 1,
  6393. "platform": "yaobangmang"
  6394. }
  6395. Session Attrs = {}
  6396. Handler:
  6397. Type = com.xuekairui.user.controller.CrawlerController
  6398. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  6399. Async:
  6400. Async started = false
  6401. Async result = null
  6402. Resolved Exception:
  6403. Type = null
  6404. ModelAndView:
  6405. View name = null
  6406. View = null
  6407. Model = null
  6408. FlashMap:
  6409. Attributes = null
  6410. MockHttpServletResponse:
  6411. Status = 200
  6412. Error message = null
  6413. Headers = [X-Request-Id:"7VHsx84F", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6414. Content type = application/json
  6415. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661754}
  6416. Forwarded URL = null
  6417. Redirected URL = null
  6418. Cookies = []
  6419. 15:17:41.765 DEBUG [jzsaRJdf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  6420. 15:17:41.765 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6421. 15:17:41.766 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6422. 15:17:41.767 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6423. 15:17:41.770 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6424. 15:17:41.770 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6425. 15:17:41.771 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6426. 15:17:41.771 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  6427. 15:17:41.772 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  6428. 15:17:41.773 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  6429. 15:17:41.774 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  6430. 15:17:41.774 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  6431. 15:17:41.776 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  6432. 15:17:41.776 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  6433. 15:17:41.776 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  6434. 15:17:41.777 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  6435. 15:17:41.778 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  6436. 15:17:41.778 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  6437. 15:17:41.779 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  6438. 15:17:41.779 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  6439. 15:17:41.779 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  6440. 15:17:41.780 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  6441. 15:17:41.780 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  6442. 15:17:41.780 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  6443. 15:17:41.782 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  6444. 15:17:41.782 DEBUG [jzsaRJdf] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  6445. 15:17:41.782 DEBUG [jzsaRJdf] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  6446. 15:17:41.784 DEBUG [jzsaRJdf] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  6447. 15:17:41.784 DEBUG [jzsaRJdf] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  6448. 15:17:41.784 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  6449. 15:17:41.784 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580454869835778(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yiyaocheng(String), QUOTA(String), 2026-07-02T15:17:41.784680700(LocalDateTime)
  6450. 15:17:41.786 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  6451. 15:17:41.792 DEBUG [jzsaRJdf] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 27ms
  6452. MockHttpServletRequest:
  6453. HTTP Method = POST
  6454. Request URI = /api/crawler/consume
  6455. Parameters = {}
  6456. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"49"]
  6457. Body = {
  6458. "count": 1,
  6459. "platform": "yiyaocheng"
  6460. }
  6461. Session Attrs = {}
  6462. Handler:
  6463. Type = com.xuekairui.user.controller.CrawlerController
  6464. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  6465. Async:
  6466. Async started = false
  6467. Async result = null
  6468. Resolved Exception:
  6469. Type = null
  6470. ModelAndView:
  6471. View name = null
  6472. View = null
  6473. Model = null
  6474. FlashMap:
  6475. Attributes = null
  6476. MockHttpServletResponse:
  6477. Status = 200
  6478. Error message = null
  6479. Headers = [X-Request-Id:"jzsaRJdf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6480. Content type = application/json
  6481. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661792}
  6482. Forwarded URL = null
  6483. Redirected URL = null
  6484. Cookies = []
  6485. 15:17:41.802 DEBUG [mJxZWtZK] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  6486. 15:17:41.803 DEBUG [mJxZWtZK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6487. 15:17:41.803 DEBUG [mJxZWtZK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6488. 15:17:41.805 DEBUG [mJxZWtZK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6489. 15:17:41.806 WARN [mJxZWtZK] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
  6490. 15:17:41.807 WARN [mJxZWtZK] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 5ms
  6491. MockHttpServletRequest:
  6492. HTTP Method = POST
  6493. Request URI = /api/crawler/consume
  6494. Parameters = {}
  6495. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"49"]
  6496. Body = {
  6497. "count": 0,
  6498. "platform": "yaoshibang"
  6499. }
  6500. Session Attrs = {}
  6501. Handler:
  6502. Type = com.xuekairui.user.controller.CrawlerController
  6503. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  6504. Async:
  6505. Async started = false
  6506. Async result = null
  6507. Resolved Exception:
  6508. Type = org.springframework.web.bind.MethodArgumentNotValidException
  6509. ModelAndView:
  6510. View name = null
  6511. View = null
  6512. Model = null
  6513. FlashMap:
  6514. Attributes = null
  6515. MockHttpServletResponse:
  6516. Status = 400
  6517. Error message = null
  6518. Headers = [X-Request-Id:"mJxZWtZK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6519. Content type = application/json
  6520. Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976661806}
  6521. Forwarded URL = null
  6522. Redirected URL = null
  6523. Cookies = []
  6524. 15:17:41.812 DEBUG [hza3PFrM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  6525. 15:17:41.814 WARN [hza3PFrM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 401 2ms
  6526. MockHttpServletRequest:
  6527. HTTP Method = POST
  6528. Request URI = /api/crawler/consume
  6529. Parameters = {}
  6530. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"11"]
  6531. Body = {"count":1}
  6532. Session Attrs = {}
  6533. Handler:
  6534. Type = null
  6535. Async:
  6536. Async started = false
  6537. Async result = null
  6538. Resolved Exception:
  6539. Type = null
  6540. ModelAndView:
  6541. View name = null
  6542. View = null
  6543. Model = null
  6544. FlashMap:
  6545. Attributes = null
  6546. MockHttpServletResponse:
  6547. Status = 401
  6548. Error message = null
  6549. Headers = [X-Request-Id:"hza3PFrM", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6550. Content type = application/json;charset=UTF-8
  6551. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976661813}
  6552. Forwarded URL = null
  6553. Redirected URL = null
  6554. Cookies = []
  6555. 15:17:41.820 DEBUG [whCeG6Y9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 | IP: 127.0.0.1
  6556. 15:17:41.821 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6557. 15:17:41.821 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6558. 15:17:41.824 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6559. 15:17:41.825 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
  6560. 15:17:41.825 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
  6561. 15:17:41.826 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  6562. 15:17:41.827 DEBUG [whCeG6Y9] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 200 7ms
  6563. MockHttpServletRequest:
  6564. HTTP Method = GET
  6565. Request URI = /api/crawler/logs
  6566. Parameters = {days=[7]}
  6567. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
  6568. Body = null
  6569. Session Attrs = {}
  6570. Handler:
  6571. Type = com.xuekairui.user.controller.CrawlerController
  6572. Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
  6573. Async:
  6574. Async started = false
  6575. Async result = null
  6576. Resolved Exception:
  6577. Type = null
  6578. ModelAndView:
  6579. View name = null
  6580. View = null
  6581. Model = null
  6582. FlashMap:
  6583. Attributes = null
  6584. MockHttpServletResponse:
  6585. Status = 200
  6586. Error message = null
  6587. Headers = [X-Request-Id:"whCeG6Y9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6588. Content type = application/json
  6589. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661826}
  6590. Forwarded URL = null
  6591. Redirected URL = null
  6592. Cookies = []
  6593. 15:17:41.835 DEBUG [C38pVPxy] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 | IP: 127.0.0.1
  6594. 15:17:41.836 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6595. 15:17:41.836 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6596. 15:17:41.837 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6597. 15:17:41.838 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
  6598. 15:17:41.839 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
  6599. 15:17:41.840 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  6600. 15:17:41.841 DEBUG [C38pVPxy] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 200 6ms
  6601. MockHttpServletRequest:
  6602. HTTP Method = GET
  6603. Request URI = /api/crawler/logs
  6604. Parameters = {days=[7]}
  6605. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
  6606. Body = null
  6607. Session Attrs = {}
  6608. Handler:
  6609. Type = com.xuekairui.user.controller.CrawlerController
  6610. Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
  6611. Async:
  6612. Async started = false
  6613. Async result = null
  6614. Resolved Exception:
  6615. Type = null
  6616. ModelAndView:
  6617. View name = null
  6618. View = null
  6619. Model = null
  6620. FlashMap:
  6621. Attributes = null
  6622. MockHttpServletResponse:
  6623. Status = 200
  6624. Error message = null
  6625. Headers = [X-Request-Id:"C38pVPxy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6626. Content type = application/json
  6627. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661840}
  6628. Forwarded URL = null
  6629. Redirected URL = null
  6630. Cookies = []
  6631. 15:17:41.848 DEBUG [B7DC5Mkn] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
  6632. 15:17:41.849 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6633. 15:17:41.849 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6634. 15:17:41.851 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6635. 15:17:41.852 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
  6636. 15:17:41.852 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
  6637. 15:17:41.853 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  6638. 15:17:41.854 DEBUG [B7DC5Mkn] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 200 6ms
  6639. MockHttpServletRequest:
  6640. HTTP Method = GET
  6641. Request URI = /api/crawler/logs
  6642. Parameters = {}
  6643. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
  6644. Body = null
  6645. Session Attrs = {}
  6646. Handler:
  6647. Type = com.xuekairui.user.controller.CrawlerController
  6648. Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
  6649. Async:
  6650. Async started = false
  6651. Async result = null
  6652. Resolved Exception:
  6653. Type = null
  6654. ModelAndView:
  6655. View name = null
  6656. View = null
  6657. Model = null
  6658. FlashMap:
  6659. Attributes = null
  6660. MockHttpServletResponse:
  6661. Status = 200
  6662. Error message = null
  6663. Headers = [X-Request-Id:"B7DC5Mkn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6664. Content type = application/json
  6665. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661853}
  6666. Forwarded URL = null
  6667. Redirected URL = null
  6668. Cookies = []
  6669. 15:17:41.862 DEBUG [XSNwMZff] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=30 | IP: 127.0.0.1
  6670. 15:17:41.863 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6671. 15:17:41.863 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6672. 15:17:41.865 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6673. 15:17:41.866 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
  6674. 15:17:41.866 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-02(LocalDate)
  6675. 15:17:41.867 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  6676. 15:17:41.869 DEBUG [XSNwMZff] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=30 200 7ms
  6677. MockHttpServletRequest:
  6678. HTTP Method = GET
  6679. Request URI = /api/crawler/logs
  6680. Parameters = {days=[30]}
  6681. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
  6682. Body = null
  6683. Session Attrs = {}
  6684. Handler:
  6685. Type = com.xuekairui.user.controller.CrawlerController
  6686. Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
  6687. Async:
  6688. Async started = false
  6689. Async result = null
  6690. Resolved Exception:
  6691. Type = null
  6692. ModelAndView:
  6693. View name = null
  6694. View = null
  6695. Model = null
  6696. FlashMap:
  6697. Attributes = null
  6698. MockHttpServletResponse:
  6699. Status = 200
  6700. Error message = null
  6701. Headers = [X-Request-Id:"XSNwMZff", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6702. Content type = application/json
  6703. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661868}
  6704. Forwarded URL = null
  6705. Redirected URL = null
  6706. Cookies = []
  6707. 15:17:41.873 DEBUG [Ns5BHsSr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
  6708. 15:17:41.874 WARN [Ns5BHsSr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 401 1ms
  6709. MockHttpServletRequest:
  6710. HTTP Method = GET
  6711. Request URI = /api/crawler/logs
  6712. Parameters = {}
  6713. Headers = []
  6714. Body = null
  6715. Session Attrs = {}
  6716. Handler:
  6717. Type = null
  6718. Async:
  6719. Async started = false
  6720. Async result = null
  6721. Resolved Exception:
  6722. Type = null
  6723. ModelAndView:
  6724. View name = null
  6725. View = null
  6726. Model = null
  6727. FlashMap:
  6728. Attributes = null
  6729. MockHttpServletResponse:
  6730. Status = 401
  6731. Error message = null
  6732. Headers = [X-Request-Id:"Ns5BHsSr", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6733. Content type = application/json;charset=UTF-8
  6734. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976661873}
  6735. Forwarded URL = null
  6736. Redirected URL = null
  6737. Cookies = []
  6738. 15:17:41.881 DEBUG [rkYdLfpA] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  6739. 15:17:41.881 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6740. 15:17:41.882 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6741. 15:17:41.883 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6742. 15:17:41.889 DEBUG [rkYdLfpA] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  6743. 15:17:41.889 DEBUG [rkYdLfpA] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
  6744. 15:17:41.891 DEBUG [rkYdLfpA] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  6745. 15:17:41.898 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  6746. 15:17:41.898 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580455318626305(Long), 1(Long), yaoshibang(String), 药师帮(String), EJZkX5AAmfJJtaiasI9Xv37Ern3lgf3gQVUNDuAmMZnQG4vgkkRb(String), R4BZSz47fOdiaJRZN2XUXBa1k0o+46tq25xashcvpGQkWUykatD8U0I=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:41.898965900(LocalDateTime), 2026-07-02T15:17:41.898965900(LocalDateTime)
  6747. 15:17:41.901 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
  6748. 15:17:41.901 INFO [rkYdLfpA] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaoshibang
  6749. 15:17:41.906 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  6750. 15:17:41.907 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580455385735170(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:41.906193800(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:41.906779600(LocalDateTime)
  6751. 15:17:41.912 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  6752. 15:17:41.912 DEBUG [rkYdLfpA] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
  6753. 15:17:41.912 DEBUG [rkYdLfpA] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 31ms
  6754. MockHttpServletRequest:
  6755. HTTP Method = POST
  6756. Request URI = /api/platform-account/bind
  6757. Parameters = {}
  6758. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"133"]
  6759. Body = {
  6760. "platformCode": "yaoshibang",
  6761. "platformName": "药师帮",
  6762. "account": "13800138000",
  6763. "password": "test_password"
  6764. }
  6765. Session Attrs = {}
  6766. Handler:
  6767. Type = com.xuekairui.user.controller.PlatformAccountController
  6768. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  6769. Async:
  6770. Async started = false
  6771. Async result = null
  6772. Resolved Exception:
  6773. Type = null
  6774. ModelAndView:
  6775. View name = null
  6776. View = null
  6777. Model = null
  6778. FlashMap:
  6779. Attributes = null
  6780. MockHttpServletResponse:
  6781. Status = 200
  6782. Error message = null
  6783. Headers = [X-Request-Id:"rkYdLfpA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6784. Content type = application/json
  6785. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976661912}
  6786. Forwarded URL = null
  6787. Redirected URL = null
  6788. Cookies = []
  6789. 15:17:41.922 DEBUG [SBbx2jjJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  6790. 15:17:41.923 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6791. 15:17:41.923 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6792. 15:17:41.924 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6793. 15:17:41.926 DEBUG [SBbx2jjJ] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  6794. 15:17:41.926 DEBUG [SBbx2jjJ] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
  6795. 15:17:41.927 DEBUG [SBbx2jjJ] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  6796. 15:17:41.928 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  6797. 15:17:41.928 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580455452844034(Long), 1(Long), yaobangmang(String), 药帮忙(String), OppMs95lNQP1PdbDk2Bet78/Sz4z2Wt2aUksPH69OSz3zE9bY0e9(String), IJcnI6uHez4/wQZck0aFOzAXvWyrQEi/D3Oxu72pmYZn6SRw7sunGMc=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:41.928397100(LocalDateTime), 2026-07-02T15:17:41.928397100(LocalDateTime)
  6798. 15:17:41.930 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
  6799. 15:17:41.930 INFO [SBbx2jjJ] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaobangmang
  6800. 15:17:41.934 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  6801. 15:17:41.935 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580455515758594(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:41.934846100(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:41.934846100(LocalDateTime)
  6802. 15:17:41.939 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  6803. 15:17:41.940 DEBUG [SBbx2jjJ] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
  6804. 15:17:41.940 DEBUG [SBbx2jjJ] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 18ms
  6805. MockHttpServletRequest:
  6806. HTTP Method = POST
  6807. Request URI = /api/platform-account/bind
  6808. Parameters = {}
  6809. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"134"]
  6810. Body = {
  6811. "platformCode": "yaobangmang",
  6812. "platformName": "药帮忙",
  6813. "account": "13800138000",
  6814. "password": "test_password"
  6815. }
  6816. Session Attrs = {}
  6817. Handler:
  6818. Type = com.xuekairui.user.controller.PlatformAccountController
  6819. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  6820. Async:
  6821. Async started = false
  6822. Async result = null
  6823. Resolved Exception:
  6824. Type = null
  6825. ModelAndView:
  6826. View name = null
  6827. View = null
  6828. Model = null
  6829. FlashMap:
  6830. Attributes = null
  6831. MockHttpServletResponse:
  6832. Status = 200
  6833. Error message = null
  6834. Headers = [X-Request-Id:"SBbx2jjJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6835. Content type = application/json
  6836. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976661940}
  6837. Forwarded URL = null
  6838. Redirected URL = null
  6839. Cookies = []
  6840. 15:17:41.946 DEBUG [5w4LzHqz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  6841. 15:17:41.947 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6842. 15:17:41.947 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6843. 15:17:41.948 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6844. 15:17:41.950 DEBUG [5w4LzHqz] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  6845. 15:17:41.950 DEBUG [5w4LzHqz] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yiyaocheng(String)
  6846. 15:17:41.951 DEBUG [5w4LzHqz] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  6847. 15:17:41.952 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  6848. 15:17:41.952 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580455582867458(Long), 1(Long), yiyaocheng(String), 1药城(String), Y+gICIjM+z0cx6ZX7Bc5Fn9x7vC/2uzTw1eZen5na870bMi8TDGk(String), XM/Ncnrta96k/RDRE+qZXI+gmkLp0+dNSMAoa5AGTJ27MpGZzP9BWbE=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:41.951875300(LocalDateTime), 2026-07-02T15:17:41.951875300(LocalDateTime)
  6849. 15:17:41.954 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
  6850. 15:17:41.954 INFO [5w4LzHqz] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yiyaocheng
  6851. 15:17:41.958 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  6852. 15:17:41.958 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580455582867459(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:41.958341500(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yiyaocheng(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:41.958341500(LocalDateTime)
  6853. 15:17:41.963 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  6854. 15:17:41.963 DEBUG [5w4LzHqz] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
  6855. 15:17:41.964 DEBUG [5w4LzHqz] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 18ms
  6856. MockHttpServletRequest:
  6857. HTTP Method = POST
  6858. Request URI = /api/platform-account/bind
  6859. Parameters = {}
  6860. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"131"]
  6861. Body = {
  6862. "platformCode": "yiyaocheng",
  6863. "platformName": "1药城",
  6864. "account": "13800138000",
  6865. "password": "test_password"
  6866. }
  6867. Session Attrs = {}
  6868. Handler:
  6869. Type = com.xuekairui.user.controller.PlatformAccountController
  6870. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  6871. Async:
  6872. Async started = false
  6873. Async result = null
  6874. Resolved Exception:
  6875. Type = null
  6876. ModelAndView:
  6877. View name = null
  6878. View = null
  6879. Model = null
  6880. FlashMap:
  6881. Attributes = null
  6882. MockHttpServletResponse:
  6883. Status = 200
  6884. Error message = null
  6885. Headers = [X-Request-Id:"5w4LzHqz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6886. Content type = application/json
  6887. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976661963}
  6888. Forwarded URL = null
  6889. Redirected URL = null
  6890. Cookies = []
  6891. 15:17:41.970 DEBUG [3mqMcSZX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  6892. 15:17:41.971 DEBUG [3mqMcSZX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6893. 15:17:41.971 DEBUG [3mqMcSZX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6894. 15:17:41.972 DEBUG [3mqMcSZX] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6895. 15:17:41.974 WARN [3mqMcSZX] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 平台名称不能为空, 密码不能为空, 账号不能为空
  6896. 15:17:41.975 WARN [3mqMcSZX] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 400 5ms
  6897. MockHttpServletRequest:
  6898. HTTP Method = POST
  6899. Request URI = /api/platform-account/bind
  6900. Parameters = {}
  6901. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"37"]
  6902. Body = {
  6903. "platformCode": "yaoshibang"
  6904. }
  6905. Session Attrs = {}
  6906. Handler:
  6907. Type = com.xuekairui.user.controller.PlatformAccountController
  6908. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  6909. Async:
  6910. Async started = false
  6911. Async result = null
  6912. Resolved Exception:
  6913. Type = org.springframework.web.bind.MethodArgumentNotValidException
  6914. ModelAndView:
  6915. View name = null
  6916. View = null
  6917. Model = null
  6918. FlashMap:
  6919. Attributes = null
  6920. MockHttpServletResponse:
  6921. Status = 400
  6922. Error message = null
  6923. Headers = [X-Request-Id:"3mqMcSZX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6924. Content type = application/json
  6925. Body = {"code":400,"message":"平台名称不能为空, 密码不能为空, 账号不能为空","data":null,"timestamp":1782976661974}
  6926. Forwarded URL = null
  6927. Redirected URL = null
  6928. Cookies = []
  6929. 15:17:41.979 DEBUG [4y2QdqYg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  6930. 15:17:41.980 WARN [4y2QdqYg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 401 1ms
  6931. MockHttpServletRequest:
  6932. HTTP Method = POST
  6933. Request URI = /api/platform-account/bind
  6934. Parameters = {}
  6935. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  6936. Body = {}
  6937. Session Attrs = {}
  6938. Handler:
  6939. Type = null
  6940. Async:
  6941. Async started = false
  6942. Async result = null
  6943. Resolved Exception:
  6944. Type = null
  6945. ModelAndView:
  6946. View name = null
  6947. View = null
  6948. Model = null
  6949. FlashMap:
  6950. Attributes = null
  6951. MockHttpServletResponse:
  6952. Status = 401
  6953. Error message = null
  6954. Headers = [X-Request-Id:"4y2QdqYg", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6955. Content type = application/json;charset=UTF-8
  6956. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976661980}
  6957. Forwarded URL = null
  6958. Redirected URL = null
  6959. Cookies = []
  6960. 15:17:41.987 DEBUG [wsq7CMVA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
  6961. 15:17:41.987 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  6962. 15:17:41.988 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  6963. 15:17:41.989 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  6964. 15:17:41.989 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
  6965. 15:17:41.989 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
  6966. 15:17:41.991 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 3
  6967. 15:17:41.995 DEBUG [wsq7CMVA] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 8ms
  6968. MockHttpServletRequest:
  6969. HTTP Method = GET
  6970. Request URI = /api/platform-account/list
  6971. Parameters = {}
  6972. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
  6973. Body = null
  6974. Session Attrs = {}
  6975. Handler:
  6976. Type = com.xuekairui.user.controller.PlatformAccountController
  6977. Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
  6978. Async:
  6979. Async started = false
  6980. Async result = null
  6981. Resolved Exception:
  6982. Type = null
  6983. ModelAndView:
  6984. View name = null
  6985. View = null
  6986. Model = null
  6987. FlashMap:
  6988. Attributes = null
  6989. MockHttpServletResponse:
  6990. Status = 200
  6991. Error message = null
  6992. Headers = [X-Request-Id:"wsq7CMVA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  6993. Content type = application/json
  6994. Body = {"code":200,"message":"操作成功","data":[{"id":2072580455452844034,"platformCode":"yaobangmang","platformName":"药帮忙","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455318626305,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455582867458,"platformCode":"yiyaocheng","platformName":"1药城","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"}],"timestamp":1782976661993}
  6995. Forwarded URL = null
  6996. Redirected URL = null
  6997. Cookies = []
  6998. 15:17:42.002 DEBUG [AUyfXxAk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
  6999. 15:17:42.002 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7000. 15:17:42.003 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  7001. 15:17:42.005 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7002. 15:17:42.006 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
  7003. 15:17:42.006 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
  7004. 15:17:42.007 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 3
  7005. 15:17:42.008 DEBUG [AUyfXxAk] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 6ms
  7006. MockHttpServletRequest:
  7007. HTTP Method = GET
  7008. Request URI = /api/platform-account/list
  7009. Parameters = {}
  7010. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjIsImV4cCI6MTc4MzA2MzA2Mn0.Bw72fwU6bE7o2rZUH0ZCDv_R1_y2a0wJ0wTRQHb6VKJFzQbrGEw2rOErRmkzxd9XSw-mrzb1kIe5946qJWNBlg"]
  7011. Body = null
  7012. Session Attrs = {}
  7013. Handler:
  7014. Type = com.xuekairui.user.controller.PlatformAccountController
  7015. Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
  7016. Async:
  7017. Async started = false
  7018. Async result = null
  7019. Resolved Exception:
  7020. Type = null
  7021. ModelAndView:
  7022. View name = null
  7023. View = null
  7024. Model = null
  7025. FlashMap:
  7026. Attributes = null
  7027. MockHttpServletResponse:
  7028. Status = 200
  7029. Error message = null
  7030. Headers = [X-Request-Id:"AUyfXxAk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7031. Content type = application/json
  7032. Body = {"code":200,"message":"操作成功","data":[{"id":2072580455452844034,"platformCode":"yaobangmang","platformName":"药帮忙","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455318626305,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455582867458,"platformCode":"yiyaocheng","platformName":"1药城","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"}],"timestamp":1782976662008}
  7033. Forwarded URL = null
  7034. Redirected URL = null
  7035. Cookies = []
  7036. 15:17:42.014 DEBUG [bxpq79Wr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
  7037. 15:17:42.015 WARN [bxpq79Wr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 401 1ms
  7038. MockHttpServletRequest:
  7039. HTTP Method = GET
  7040. Request URI = /api/platform-account/list
  7041. Parameters = {}
  7042. Headers = []
  7043. Body = null
  7044. Session Attrs = {}
  7045. Handler:
  7046. Type = null
  7047. Async:
  7048. Async started = false
  7049. Async result = null
  7050. Resolved Exception:
  7051. Type = null
  7052. ModelAndView:
  7053. View name = null
  7054. View = null
  7055. Model = null
  7056. FlashMap:
  7057. Attributes = null
  7058. MockHttpServletResponse:
  7059. Status = 401
  7060. Error message = null
  7061. Headers = [X-Request-Id:"bxpq79Wr", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7062. Content type = application/json;charset=UTF-8
  7063. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976662014}
  7064. Forwarded URL = null
  7065. Redirected URL = null
  7066. Cookies = []
  7067. 15:17:42.022 DEBUG [4mTKVmfX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang | IP: 127.0.0.1
  7068. 15:17:42.023 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7069. 15:17:42.023 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  7070. 15:17:42.024 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7071. 15:17:42.027 DEBUG [4mTKVmfX] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  7072. 15:17:42.027 DEBUG [4mTKVmfX] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
  7073. 15:17:42.028 DEBUG [4mTKVmfX] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
  7074. 15:17:42.029 INFO [4mTKVmfX] [1] [ main] c.x.u.s.PlatformAccountService : 模拟验证平台账号: platform=yaoshibang, account=13800138000
  7075. 15:17:42.030 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
  7076. 15:17:42.031 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), EJZkX5AAmfJJtaiasI9Xv37Ern3lgf3gQVUNDuAmMZnQG4vgkkRb(String), R4BZSz47fOdiaJRZN2XUXBa1k0o+46tq25xashcvpGQkWUykatD8U0I=(String), true(Boolean), 2026-07-02T15:17:42.029864400(LocalDateTime), SUCCESS(String), 2026-07-02T15:17:42(LocalDateTime), 2026-07-02T15:17:42.029864400(LocalDateTime), 2072580455318626305(Long)
  7077. 15:17:42.033 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
  7078. 15:17:42.038 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  7079. 15:17:42.038 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580455905828866(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:42.037741300(LocalDateTime), ACCOUNT(String), VERIFY(String), 验证B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:42.037741300(LocalDateTime)
  7080. 15:17:42.042 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  7081. 15:17:42.042 DEBUG [4mTKVmfX] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 验证B2B平台账号
  7082. 15:17:42.043 DEBUG [4mTKVmfX] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang 200 21ms
  7083. MockHttpServletRequest:
  7084. HTTP Method = POST
  7085. Request URI = /api/platform-account/verify/yaoshibang
  7086. Parameters = {}
  7087. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjIsImV4cCI6MTc4MzA2MzA2Mn0.Bw72fwU6bE7o2rZUH0ZCDv_R1_y2a0wJ0wTRQHb6VKJFzQbrGEw2rOErRmkzxd9XSw-mrzb1kIe5946qJWNBlg"]
  7088. Body = null
  7089. Session Attrs = {}
  7090. Handler:
  7091. Type = com.xuekairui.user.controller.PlatformAccountController
  7092. Method = com.xuekairui.user.controller.PlatformAccountController#verifyAccount(String, Authentication)
  7093. Async:
  7094. Async started = false
  7095. Async result = null
  7096. Resolved Exception:
  7097. Type = null
  7098. ModelAndView:
  7099. View name = null
  7100. View = null
  7101. Model = null
  7102. FlashMap:
  7103. Attributes = null
  7104. MockHttpServletResponse:
  7105. Status = 200
  7106. Error message = null
  7107. Headers = [X-Request-Id:"4mTKVmfX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7108. Content type = application/json
  7109. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976662042}
  7110. Forwarded URL = null
  7111. Redirected URL = null
  7112. Cookies = []
  7113. 15:17:42.048 DEBUG [HJAtsU3Q] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang | IP: 127.0.0.1
  7114. 15:17:42.049 WARN [HJAtsU3Q] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang 401 1ms
  7115. MockHttpServletRequest:
  7116. HTTP Method = POST
  7117. Request URI = /api/platform-account/verify/yaoshibang
  7118. Parameters = {}
  7119. Headers = []
  7120. Body = null
  7121. Session Attrs = {}
  7122. Handler:
  7123. Type = null
  7124. Async:
  7125. Async started = false
  7126. Async result = null
  7127. Resolved Exception:
  7128. Type = null
  7129. ModelAndView:
  7130. View name = null
  7131. View = null
  7132. Model = null
  7133. FlashMap:
  7134. Attributes = null
  7135. MockHttpServletResponse:
  7136. Status = 401
  7137. Error message = null
  7138. Headers = [X-Request-Id:"HJAtsU3Q", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7139. Content type = application/json;charset=UTF-8
  7140. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976662049}
  7141. Forwarded URL = null
  7142. Redirected URL = null
  7143. Cookies = []
  7144. 15:17:42.055 DEBUG [pRRQcsRB] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaoshibang | IP: 127.0.0.1
  7145. 15:17:42.056 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7146. 15:17:42.056 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  7147. 15:17:42.058 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7148. 15:17:42.059 DEBUG [pRRQcsRB] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  7149. 15:17:42.059 DEBUG [pRRQcsRB] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
  7150. 15:17:42.061 DEBUG [pRRQcsRB] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
  7151. 15:17:42.061 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
  7152. 15:17:42.062 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), EJZkX5AAmfJJtaiasI9Xv37Ern3lgf3gQVUNDuAmMZnQG4vgkkRb(String), R4BZSz47fOdiaJRZN2XUXBa1k0o+46tq25xashcvpGQkWUykatD8U0I=(String), false(Boolean), 2026-07-02T15:17:42(LocalDateTime), SUCCESS(String), 2026-07-02T15:17:42(LocalDateTime), 2026-07-02T15:17:42.061782300(LocalDateTime), 2072580455318626305(Long)
  7153. 15:17:42.063 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
  7154. 15:17:42.063 INFO [pRRQcsRB] [1] [ main] c.x.u.s.PlatformAccountService : 解绑平台账号: userId=1, platform=yaoshibang
  7155. 15:17:42.068 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  7156. 15:17:42.068 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580456035852289(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:42.068074100(LocalDateTime), ACCOUNT(String), UNBIND(String), 解绑B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:42.068074100(LocalDateTime)
  7157. 15:17:42.072 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  7158. 15:17:42.072 DEBUG [pRRQcsRB] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 解绑B2B平台账号
  7159. 15:17:42.073 DEBUG [pRRQcsRB] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaoshibang 200 18ms
  7160. MockHttpServletRequest:
  7161. HTTP Method = DELETE
  7162. Request URI = /api/platform-account/unbind/yaoshibang
  7163. Parameters = {}
  7164. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjIsImV4cCI6MTc4MzA2MzA2Mn0.Bw72fwU6bE7o2rZUH0ZCDv_R1_y2a0wJ0wTRQHb6VKJFzQbrGEw2rOErRmkzxd9XSw-mrzb1kIe5946qJWNBlg"]
  7165. Body = null
  7166. Session Attrs = {}
  7167. Handler:
  7168. Type = com.xuekairui.user.controller.PlatformAccountController
  7169. Method = com.xuekairui.user.controller.PlatformAccountController#unbindAccount(String, Authentication)
  7170. Async:
  7171. Async started = false
  7172. Async result = null
  7173. Resolved Exception:
  7174. Type = null
  7175. ModelAndView:
  7176. View name = null
  7177. View = null
  7178. Model = null
  7179. FlashMap:
  7180. Attributes = null
  7181. MockHttpServletResponse:
  7182. Status = 200
  7183. Error message = null
  7184. Headers = [X-Request-Id:"pRRQcsRB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7185. Content type = application/json
  7186. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976662072}
  7187. Forwarded URL = null
  7188. Redirected URL = null
  7189. Cookies = []
  7190. 15:17:42.077 DEBUG [z5CuEmpG] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaoshibang | IP: 127.0.0.1
  7191. 15:17:42.079 WARN [z5CuEmpG] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaoshibang 401 2ms
  7192. MockHttpServletRequest:
  7193. HTTP Method = DELETE
  7194. Request URI = /api/platform-account/unbind/yaoshibang
  7195. Parameters = {}
  7196. Headers = []
  7197. Body = null
  7198. Session Attrs = {}
  7199. Handler:
  7200. Type = null
  7201. Async:
  7202. Async started = false
  7203. Async result = null
  7204. Resolved Exception:
  7205. Type = null
  7206. ModelAndView:
  7207. View name = null
  7208. View = null
  7209. Model = null
  7210. FlashMap:
  7211. Attributes = null
  7212. MockHttpServletResponse:
  7213. Status = 401
  7214. Error message = null
  7215. Headers = [X-Request-Id:"z5CuEmpG", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7216. Content type = application/json;charset=UTF-8
  7217. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976662078}
  7218. Forwarded URL = null
  7219. Redirected URL = null
  7220. Cookies = []
  7221. 15:17:42.083 DEBUG [UryBceVa] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled | IP: 127.0.0.1
  7222. 15:17:42.084 DEBUG [UryBceVa] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Preparing: SELECT * FROM t_platform_config WHERE enabled = true ORDER BY priority ASC
  7223. 15:17:42.084 DEBUG [UryBceVa] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Parameters:
  7224. 15:17:42.085 DEBUG [UryBceVa] [] [ main] x.u.m.P.selectEnabledPlatforms : <== Total: 3
  7225. 15:17:42.087 DEBUG [UryBceVa] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled 200 4ms
  7226. MockHttpServletRequest:
  7227. HTTP Method = GET
  7228. Request URI = /api/platform-config/enabled
  7229. Parameters = {}
  7230. Headers = []
  7231. Body = null
  7232. Session Attrs = {}
  7233. Handler:
  7234. Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
  7235. Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getEnabledPlatforms()
  7236. Async:
  7237. Async started = false
  7238. Async result = null
  7239. Resolved Exception:
  7240. Type = null
  7241. ModelAndView:
  7242. View name = null
  7243. View = null
  7244. Model = null
  7245. FlashMap:
  7246. Attributes = null
  7247. MockHttpServletResponse:
  7248. Status = 200
  7249. Error message = null
  7250. Headers = [X-Request-Id:"UryBceVa", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7251. Content type = application/json
  7252. Body = {"code":200,"message":"操作成功","data":[{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":2,"platformCode":"yaobangmang","platformName":"药帮忙","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":2,"underMaintenance":false,"maintenanceNotice":null,"description":"专业医药B2B采购平台","officialUrl":"https://www.yaobangmang.com","bindingInstructions":"请输入您在药帮忙的手机号和密码","sortOrder":2,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":3,"platformCode":"yiyaocheng","platformName":"1药城","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":3,"underMaintenance":false,"maintenanceNotice":null,"description":"1药网旗下B2B医药平台","officialUrl":"https://www.1yaocheng.com","bindingInstructions":"请输入您在1药城的手机号和密码","sortOrder":3,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null}],"timestamp":1782976662086}
  7253. Forwarded URL = null
  7254. Redirected URL = null
  7255. Cookies = []
  7256. 15:17:42.092 DEBUG [XJ5fy9Cq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled | IP: 127.0.0.1
  7257. 15:17:42.093 DEBUG [XJ5fy9Cq] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Preparing: SELECT * FROM t_platform_config WHERE enabled = true ORDER BY priority ASC
  7258. 15:17:42.093 DEBUG [XJ5fy9Cq] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Parameters:
  7259. 15:17:42.094 DEBUG [XJ5fy9Cq] [] [ main] x.u.m.P.selectEnabledPlatforms : <== Total: 3
  7260. 15:17:42.095 DEBUG [XJ5fy9Cq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled 200 3ms
  7261. MockHttpServletRequest:
  7262. HTTP Method = GET
  7263. Request URI = /api/platform-config/enabled
  7264. Parameters = {}
  7265. Headers = []
  7266. Body = null
  7267. Session Attrs = {}
  7268. Handler:
  7269. Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
  7270. Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getEnabledPlatforms()
  7271. Async:
  7272. Async started = false
  7273. Async result = null
  7274. Resolved Exception:
  7275. Type = null
  7276. ModelAndView:
  7277. View name = null
  7278. View = null
  7279. Model = null
  7280. FlashMap:
  7281. Attributes = null
  7282. MockHttpServletResponse:
  7283. Status = 200
  7284. Error message = null
  7285. Headers = [X-Request-Id:"XJ5fy9Cq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7286. Content type = application/json
  7287. Body = {"code":200,"message":"操作成功","data":[{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":2,"platformCode":"yaobangmang","platformName":"药帮忙","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":2,"underMaintenance":false,"maintenanceNotice":null,"description":"专业医药B2B采购平台","officialUrl":"https://www.yaobangmang.com","bindingInstructions":"请输入您在药帮忙的手机号和密码","sortOrder":2,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":3,"platformCode":"yiyaocheng","platformName":"1药城","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":3,"underMaintenance":false,"maintenanceNotice":null,"description":"1药网旗下B2B医药平台","officialUrl":"https://www.1yaocheng.com","bindingInstructions":"请输入您在1药城的手机号和密码","sortOrder":3,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null}],"timestamp":1782976662094}
  7288. Forwarded URL = null
  7289. Redirected URL = null
  7290. Cookies = []
  7291. 15:17:42.100 DEBUG [GhMadpW3] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/yaoshibang | IP: 127.0.0.1
  7292. 15:17:42.101 DEBUG [GhMadpW3] [] [ main] c.x.u.m.P.selectByPlatformCode : ==> Preparing: SELECT * FROM t_platform_config WHERE platform_code = ? LIMIT 1
  7293. 15:17:42.101 DEBUG [GhMadpW3] [] [ main] c.x.u.m.P.selectByPlatformCode : ==> Parameters: yaoshibang(String)
  7294. 15:17:42.102 DEBUG [GhMadpW3] [] [ main] c.x.u.m.P.selectByPlatformCode : <== Total: 1
  7295. 15:17:42.103 DEBUG [GhMadpW3] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/yaoshibang 200 3ms
  7296. MockHttpServletRequest:
  7297. HTTP Method = GET
  7298. Request URI = /api/platform-config/yaoshibang
  7299. Parameters = {}
  7300. Headers = []
  7301. Body = null
  7302. Session Attrs = {}
  7303. Handler:
  7304. Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
  7305. Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getPlatformConfig(String)
  7306. Async:
  7307. Async started = false
  7308. Async result = null
  7309. Resolved Exception:
  7310. Type = null
  7311. ModelAndView:
  7312. View name = null
  7313. View = null
  7314. Model = null
  7315. FlashMap:
  7316. Attributes = null
  7317. MockHttpServletResponse:
  7318. Status = 200
  7319. Error message = null
  7320. Headers = [X-Request-Id:"GhMadpW3", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7321. Content type = application/json
  7322. Body = {"code":200,"message":"操作成功","data":{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},"timestamp":1782976662102}
  7323. Forwarded URL = null
  7324. Redirected URL = null
  7325. Cookies = []
  7326. 15:17:42.108 DEBUG [nt9xTLes] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/nonexistent | IP: 127.0.0.1
  7327. 15:17:42.109 DEBUG [nt9xTLes] [] [ main] c.x.u.m.P.selectByPlatformCode : ==> Preparing: SELECT * FROM t_platform_config WHERE platform_code = ? LIMIT 1
  7328. 15:17:42.109 DEBUG [nt9xTLes] [] [ main] c.x.u.m.P.selectByPlatformCode : ==> Parameters: nonexistent(String)
  7329. 15:17:42.110 DEBUG [nt9xTLes] [] [ main] c.x.u.m.P.selectByPlatformCode : <== Total: 0
  7330. 15:17:42.111 WARN [nt9xTLes] [] [ main] c.x.h.GlobalExceptionHandler : 响应状态异常: status=404 NOT_FOUND, reason=平台配置不存在
  7331. 15:17:42.114 WARN [nt9xTLes] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/nonexistent 404 6ms
  7332. MockHttpServletRequest:
  7333. HTTP Method = GET
  7334. Request URI = /api/platform-config/nonexistent
  7335. Parameters = {}
  7336. Headers = []
  7337. Body = null
  7338. Session Attrs = {}
  7339. Handler:
  7340. Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
  7341. Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getPlatformConfig(String)
  7342. Async:
  7343. Async started = false
  7344. Async result = null
  7345. Resolved Exception:
  7346. Type = org.springframework.web.server.ResponseStatusException
  7347. ModelAndView:
  7348. View name = null
  7349. View = null
  7350. Model = null
  7351. FlashMap:
  7352. Attributes = null
  7353. MockHttpServletResponse:
  7354. Status = 404
  7355. Error message = null
  7356. Headers = [X-Request-Id:"nt9xTLes", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7357. Content type = application/json
  7358. Body = {"code":404,"message":"平台配置不存在","data":null,"timestamp":1782976662111}
  7359. Forwarded URL = null
  7360. Redirected URL = null
  7361. Cookies = []
  7362. [INFO] Tests run: 31, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.767 s -- in 爬虫配额和平台账号绑定测试
  7363. [INFO] Running 药品搜索接口测试
  7364. 15:17:42.118 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.DrugSearchControllerTest]: DrugSearchControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  7365. 15:17:42.119 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.DrugSearchControllerTest
  7366. 15:17:45.075 DEBUG [vvawT3PN] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7367. 15:17:45.076 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7368. 15:17:45.077 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7369. 15:17:45.078 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7370. 15:17:45.083 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7371. 15:17:45.083 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7372. 15:17:45.084 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7373. 15:17:45.085 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  7374. 15:17:45.085 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  7375. 15:17:45.087 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  7376. 15:17:45.087 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  7377. 15:17:45.087 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  7378. 15:17:45.089 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  7379. 15:17:45.090 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  7380. 15:17:45.090 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  7381. 15:17:45.091 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  7382. 15:17:45.091 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  7383. 15:17:45.091 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  7384. 15:17:45.092 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  7385. 15:17:45.092 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  7386. 15:17:45.092 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  7387. 15:17:45.093 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  7388. 15:17:45.093 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  7389. 15:17:45.093 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  7390. 15:17:45.094 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  7391. 15:17:45.094 DEBUG [vvawT3PN] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  7392. 15:17:45.095 DEBUG [vvawT3PN] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  7393. 15:17:45.096 DEBUG [vvawT3PN] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  7394. 15:17:45.096 DEBUG [vvawT3PN] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  7395. 15:17:45.096 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  7396. 15:17:45.096 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580468736204801(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.096876700(LocalDateTime)
  7397. 15:17:45.098 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  7398. 15:17:45.101 INFO [vvawT3PN] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  7399. 15:17:45.108 DEBUG [vvawT3PN] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 33ms
  7400. MockHttpServletRequest:
  7401. HTTP Method = POST
  7402. Request URI = /api/search/query
  7403. Parameters = {}
  7404. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"32"]
  7405. Body = {"keyword":"阿莫西林胶囊"}
  7406. Session Attrs = {}
  7407. Handler:
  7408. Type = com.xuekairui.user.controller.DrugSearchController
  7409. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7410. Async:
  7411. Async started = false
  7412. Async result = null
  7413. Resolved Exception:
  7414. Type = null
  7415. ModelAndView:
  7416. View name = null
  7417. View = null
  7418. Model = null
  7419. FlashMap:
  7420. Attributes = null
  7421. MockHttpServletResponse:
  7422. Status = 200
  7423. Error message = null
  7424. Headers = [X-Request-Id:"vvawT3PN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7425. Content type = application/json
  7426. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665106}
  7427. Forwarded URL = null
  7428. Redirected URL = null
  7429. Cookies = []
  7430. 15:17:45.122 DEBUG [n6LcGSCf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7431. 15:17:45.122 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7432. 15:17:45.122 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7433. 15:17:45.124 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7434. 15:17:45.126 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7435. 15:17:45.126 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7436. 15:17:45.127 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7437. 15:17:45.127 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  7438. 15:17:45.127 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  7439. 15:17:45.128 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  7440. 15:17:45.129 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  7441. 15:17:45.129 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  7442. 15:17:45.130 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  7443. 15:17:45.130 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  7444. 15:17:45.131 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  7445. 15:17:45.132 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  7446. 15:17:45.133 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  7447. 15:17:45.133 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  7448. 15:17:45.134 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  7449. 15:17:45.134 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  7450. 15:17:45.134 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  7451. 15:17:45.135 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  7452. 15:17:45.136 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  7453. 15:17:45.136 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  7454. 15:17:45.136 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  7455. 15:17:45.137 DEBUG [n6LcGSCf] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  7456. 15:17:45.137 DEBUG [n6LcGSCf] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  7457. 15:17:45.138 DEBUG [n6LcGSCf] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  7458. 15:17:45.138 DEBUG [n6LcGSCf] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  7459. 15:17:45.138 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  7460. 15:17:45.138 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580468929142785(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.138859800(LocalDateTime)
  7461. 15:17:45.140 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  7462. 15:17:45.140 INFO [n6LcGSCf] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 奥美拉唑肠溶胶囊, 平台: null, 找到 3 条结果
  7463. 15:17:45.144 DEBUG [n6LcGSCf] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 22ms
  7464. MockHttpServletRequest:
  7465. HTTP Method = POST
  7466. Request URI = /api/search/query
  7467. Parameters = {}
  7468. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"38"]
  7469. Body = {"keyword":"奥美拉唑肠溶胶囊"}
  7470. Session Attrs = {}
  7471. Handler:
  7472. Type = com.xuekairui.user.controller.DrugSearchController
  7473. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7474. Async:
  7475. Async started = false
  7476. Async result = null
  7477. Resolved Exception:
  7478. Type = null
  7479. ModelAndView:
  7480. View name = null
  7481. View = null
  7482. Model = null
  7483. FlashMap:
  7484. Attributes = null
  7485. MockHttpServletResponse:
  7486. Status = 200
  7487. Error message = null
  7488. Headers = [X-Request-Id:"n6LcGSCf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7489. Content type = application/json
  7490. Body = {"code":200,"message":"操作成功","data":{"keyword":"奥美拉唑肠溶胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":8.90,"spec":"20mg*14粒/盒","manufacturer":"山东罗欣","expiry":"2027-06","moq":20,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=奥美拉唑肠溶胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":9.50,"spec":"20mg*14粒/盒","manufacturer":"山东罗欣","expiry":"2027-04","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaobangmang.com/search?q=奥美拉唑肠溶胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":8.50,"spec":"20mg*14粒/盒","manufacturer":"悦康药业","expiry":"2027-11","moq":1,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.1yaocheng.com/search?q=奥美拉唑肠溶胶囊&ref=zhijiayun"}],"lowestPrice":8.50,"lowestPricePlatform":"1药城","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665143}
  7491. Forwarded URL = null
  7492. Redirected URL = null
  7493. Cookies = []
  7494. 15:17:45.153 DEBUG [pFwvrnR9] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7495. 15:17:45.154 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7496. 15:17:45.154 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7497. 15:17:45.155 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7498. 15:17:45.158 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7499. 15:17:45.158 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7500. 15:17:45.159 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7501. 15:17:45.159 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  7502. 15:17:45.159 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  7503. 15:17:45.161 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  7504. 15:17:45.162 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  7505. 15:17:45.162 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  7506. 15:17:45.163 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  7507. 15:17:45.163 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  7508. 15:17:45.163 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  7509. 15:17:45.165 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  7510. 15:17:45.165 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  7511. 15:17:45.165 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  7512. 15:17:45.166 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  7513. 15:17:45.167 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  7514. 15:17:45.167 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  7515. 15:17:45.168 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  7516. 15:17:45.169 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  7517. 15:17:45.169 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  7518. 15:17:45.170 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  7519. 15:17:45.170 DEBUG [pFwvrnR9] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  7520. 15:17:45.170 DEBUG [pFwvrnR9] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  7521. 15:17:45.171 DEBUG [pFwvrnR9] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  7522. 15:17:45.171 DEBUG [pFwvrnR9] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  7523. 15:17:45.171 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  7524. 15:17:45.171 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469059166209(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.171767800(LocalDateTime)
  7525. 15:17:45.174 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  7526. 15:17:45.174 INFO [pFwvrnR9] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 不存在的药品名称XYZ, 平台: null, 找到 0 条结果
  7527. 15:17:45.178 DEBUG [pFwvrnR9] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 25ms
  7528. MockHttpServletRequest:
  7529. HTTP Method = POST
  7530. Request URI = /api/search/query
  7531. Parameters = {}
  7532. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"41"]
  7533. Body = {"keyword":"不存在的药品名称XYZ"}
  7534. Session Attrs = {}
  7535. Handler:
  7536. Type = com.xuekairui.user.controller.DrugSearchController
  7537. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7538. Async:
  7539. Async started = false
  7540. Async result = null
  7541. Resolved Exception:
  7542. Type = null
  7543. ModelAndView:
  7544. View name = null
  7545. View = null
  7546. Model = null
  7547. FlashMap:
  7548. Attributes = null
  7549. MockHttpServletResponse:
  7550. Status = 200
  7551. Error message = null
  7552. Headers = [X-Request-Id:"pFwvrnR9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7553. Content type = application/json
  7554. Body = {"code":200,"message":"操作成功","data":{"keyword":"不存在的药品名称XYZ","prices":[],"lowestPrice":null,"lowestPricePlatform":null,"totalCount":0,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665177}
  7555. Forwarded URL = null
  7556. Redirected URL = null
  7557. Cookies = []
  7558. 15:17:45.188 DEBUG [9UXRAf95] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7559. 15:17:45.188 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7560. 15:17:45.189 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7561. 15:17:45.190 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7562. 15:17:45.193 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7563. 15:17:45.193 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7564. 15:17:45.195 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7565. 15:17:45.195 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  7566. 15:17:45.196 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  7567. 15:17:45.197 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  7568. 15:17:45.198 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  7569. 15:17:45.198 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  7570. 15:17:45.199 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  7571. 15:17:45.200 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  7572. 15:17:45.200 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  7573. 15:17:45.202 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  7574. 15:17:45.202 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  7575. 15:17:45.202 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  7576. 15:17:45.203 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  7577. 15:17:45.203 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  7578. 15:17:45.203 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  7579. 15:17:45.204 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  7580. 15:17:45.204 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  7581. 15:17:45.204 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  7582. 15:17:45.205 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  7583. 15:17:45.206 DEBUG [9UXRAf95] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  7584. 15:17:45.206 DEBUG [9UXRAf95] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  7585. 15:17:45.207 DEBUG [9UXRAf95] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  7586. 15:17:45.207 DEBUG [9UXRAf95] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  7587. 15:17:45.207 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  7588. 15:17:45.207 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469184995329(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:45.207897800(LocalDateTime)
  7589. 15:17:45.210 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  7590. 15:17:45.210 INFO [9UXRAf95] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 阿莫西林胶囊, 平台: yaoshibang, 找到 1 条结果
  7591. 15:17:45.216 DEBUG [9UXRAf95] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 28ms
  7592. MockHttpServletRequest:
  7593. HTTP Method = POST
  7594. Request URI = /api/search/query
  7595. Parameters = {}
  7596. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"59"]
  7597. Body = {"keyword":"阿莫西林胶囊","platforms":["yaoshibang"]}
  7598. Session Attrs = {}
  7599. Handler:
  7600. Type = com.xuekairui.user.controller.DrugSearchController
  7601. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7602. Async:
  7603. Async started = false
  7604. Async result = null
  7605. Resolved Exception:
  7606. Type = null
  7607. ModelAndView:
  7608. View name = null
  7609. View = null
  7610. Model = null
  7611. FlashMap:
  7612. Attributes = null
  7613. MockHttpServletResponse:
  7614. Status = 200
  7615. Error message = null
  7616. Headers = [X-Request-Id:"9UXRAf95", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7617. Content type = application/json
  7618. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":12.50,"lowestPricePlatform":"药师帮","totalCount":1,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665214}
  7619. Forwarded URL = null
  7620. Redirected URL = null
  7621. Cookies = []
  7622. 15:17:45.224 DEBUG [MqkWmeSz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7623. 15:17:45.225 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7624. 15:17:45.225 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7625. 15:17:45.228 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7626. 15:17:45.230 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7627. 15:17:45.230 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  7628. 15:17:45.233 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7629. 15:17:45.233 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  7630. 15:17:45.233 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  7631. 15:17:45.235 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  7632. 15:17:45.235 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  7633. 15:17:45.235 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  7634. 15:17:45.237 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
  7635. 15:17:45.237 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  7636. 15:17:45.237 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
  7637. 15:17:45.240 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  7638. 15:17:45.240 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  7639. 15:17:45.240 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
  7640. 15:17:45.241 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  7641. 15:17:45.241 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  7642. 15:17:45.242 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
  7643. 15:17:45.243 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  7644. 15:17:45.243 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  7645. 15:17:45.243 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
  7646. 15:17:45.244 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  7647. 15:17:45.244 DEBUG [MqkWmeSz] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  7648. 15:17:45.244 DEBUG [MqkWmeSz] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
  7649. 15:17:45.246 DEBUG [MqkWmeSz] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  7650. 15:17:45.246 DEBUG [MqkWmeSz] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  7651. 15:17:45.247 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  7652. 15:17:45.247 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469382127618(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.247131100(LocalDateTime)
  7653. 15:17:45.249 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
  7654. 15:17:45.250 INFO [MqkWmeSz] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 布洛芬, 平台: null, 找到 3 条结果
  7655. 15:17:45.255 DEBUG [MqkWmeSz] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 31ms
  7656. MockHttpServletRequest:
  7657. HTTP Method = POST
  7658. Request URI = /api/search/query
  7659. Parameters = {}
  7660. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"23"]
  7661. Body = {"keyword":"布洛芬"}
  7662. Session Attrs = {}
  7663. Handler:
  7664. Type = com.xuekairui.user.controller.DrugSearchController
  7665. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7666. Async:
  7667. Async started = false
  7668. Async result = null
  7669. Resolved Exception:
  7670. Type = null
  7671. ModelAndView:
  7672. View name = null
  7673. View = null
  7674. Model = null
  7675. FlashMap:
  7676. Attributes = null
  7677. MockHttpServletResponse:
  7678. Status = 200
  7679. Error message = null
  7680. Headers = [X-Request-Id:"MqkWmeSz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7681. Content type = application/json
  7682. Body = {"code":200,"message":"操作成功","data":{"keyword":"布洛芬","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":15.80,"spec":"0.3g*20粒/盒","manufacturer":"中美史克","expiry":"2027-12","moq":10,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaoshibang.com/search?q=布洛芬&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":14.90,"spec":"0.3g*20粒/盒","manufacturer":"中美史克","expiry":"2027-09","moq":5,"stockStatus":"LOW_STOCK","isLowest":false,"purchaseUrl":"https://www.yaobangmang.com/search?q=布洛芬&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":16.50,"spec":"0.3g*24粒/盒","manufacturer":"珠海联邦","expiry":"2028-01","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=布洛芬&ref=zhijiayun"}],"lowestPrice":15.80,"lowestPricePlatform":"药师帮","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665255}
  7683. Forwarded URL = null
  7684. Redirected URL = null
  7685. Cookies = []
  7686. 15:17:45.266 DEBUG [uw79CavX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7687. 15:17:45.267 DEBUG [uw79CavX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7688. 15:17:45.267 DEBUG [uw79CavX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  7689. 15:17:45.269 DEBUG [uw79CavX] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7690. 15:17:45.271 WARN [uw79CavX] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 搜索关键词不能为空
  7691. 15:17:45.271 WARN [uw79CavX] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 400 5ms
  7692. MockHttpServletRequest:
  7693. HTTP Method = POST
  7694. Request URI = /api/search/query
  7695. Parameters = {}
  7696. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0._Wg12DzhpkFmfAxTGa53YEih7j38oPv_6swi3FiQIZDquhsG-7bjWojOwifCuKLBZPuBFXsmqxAma60LRp16sg", Content-Length:"14"]
  7697. Body = {"keyword":""}
  7698. Session Attrs = {}
  7699. Handler:
  7700. Type = com.xuekairui.user.controller.DrugSearchController
  7701. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7702. Async:
  7703. Async started = false
  7704. Async result = null
  7705. Resolved Exception:
  7706. Type = org.springframework.web.bind.MethodArgumentNotValidException
  7707. ModelAndView:
  7708. View name = null
  7709. View = null
  7710. Model = null
  7711. FlashMap:
  7712. Attributes = null
  7713. MockHttpServletResponse:
  7714. Status = 400
  7715. Error message = null
  7716. Headers = [X-Request-Id:"uw79CavX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7717. Content type = application/json
  7718. Body = {"code":400,"message":"搜索关键词不能为空","data":null,"timestamp":1782976665271}
  7719. Forwarded URL = null
  7720. Redirected URL = null
  7721. Cookies = []
  7722. 15:17:45.276 DEBUG [gzLLXdSd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7723. 15:17:45.278 WARN [gzLLXdSd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 401 2ms
  7724. MockHttpServletRequest:
  7725. HTTP Method = POST
  7726. Request URI = /api/search/query
  7727. Parameters = {}
  7728. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"26"]
  7729. Body = {"keyword":"阿莫西林"}
  7730. Session Attrs = {}
  7731. Handler:
  7732. Type = null
  7733. Async:
  7734. Async started = false
  7735. Async result = null
  7736. Resolved Exception:
  7737. Type = null
  7738. ModelAndView:
  7739. View name = null
  7740. View = null
  7741. Model = null
  7742. FlashMap:
  7743. Attributes = null
  7744. MockHttpServletResponse:
  7745. Status = 401
  7746. Error message = null
  7747. Headers = [X-Request-Id:"gzLLXdSd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7748. Content type = application/json;charset=UTF-8
  7749. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976665277}
  7750. Forwarded URL = null
  7751. Redirected URL = null
  7752. Cookies = []
  7753. 15:17:45.289 DEBUG [epBWSsGR] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7754. 15:17:45.290 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7755. 15:17:45.290 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  7756. 15:17:45.291 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7757. 15:17:45.294 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7758. 15:17:45.294 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  7759. 15:17:45.296 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7760. 15:17:45.296 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  7761. 15:17:45.296 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  7762. 15:17:45.297 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  7763. 15:17:45.298 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  7764. 15:17:45.298 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  7765. 15:17:45.300 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  7766. 15:17:45.300 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  7767. 15:17:45.300 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  7768. 15:17:45.301 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  7769. 15:17:45.302 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  7770. 15:17:45.302 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  7771. 15:17:45.303 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  7772. 15:17:45.303 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  7773. 15:17:45.303 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  7774. 15:17:45.305 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  7775. 15:17:45.305 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  7776. 15:17:45.305 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  7777. 15:17:45.306 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  7778. 15:17:45.306 DEBUG [epBWSsGR] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  7779. 15:17:45.307 DEBUG [epBWSsGR] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  7780. 15:17:45.308 DEBUG [epBWSsGR] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  7781. 15:17:45.308 DEBUG [epBWSsGR] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  7782. 15:17:45.308 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  7783. 15:17:45.309 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469633785858(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.308771500(LocalDateTime)
  7784. 15:17:45.311 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  7785. 15:17:45.311 INFO [epBWSsGR] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  7786. 15:17:45.317 DEBUG [epBWSsGR] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 28ms
  7787. MockHttpServletRequest:
  7788. HTTP Method = POST
  7789. Request URI = /api/search/query
  7790. Parameters = {}
  7791. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  7792. Body = {"keyword":"阿莫西林胶囊"}
  7793. Session Attrs = {}
  7794. Handler:
  7795. Type = com.xuekairui.user.controller.DrugSearchController
  7796. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7797. Async:
  7798. Async started = false
  7799. Async result = null
  7800. Resolved Exception:
  7801. Type = null
  7802. ModelAndView:
  7803. View name = null
  7804. View = null
  7805. Model = null
  7806. FlashMap:
  7807. Attributes = null
  7808. MockHttpServletResponse:
  7809. Status = 200
  7810. Error message = null
  7811. Headers = [X-Request-Id:"epBWSsGR", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7812. Content type = application/json
  7813. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665316}
  7814. Forwarded URL = null
  7815. Redirected URL = null
  7816. Cookies = []
  7817. 15:17:45.317 DEBUG [rFt44e4w] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7818. 15:17:45.321 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7819. 15:17:45.321 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  7820. 15:17:45.323 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7821. 15:17:45.323 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  7822. 15:17:45.323 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  7823. 15:17:45.325 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  7824. 15:17:45.325 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  7825. 15:17:45.325 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  7826. 15:17:45.327 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  7827. 15:17:45.327 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  7828. 15:17:45.327 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  7829. 15:17:45.329 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  7830. 15:17:45.330 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  7831. 15:17:45.330 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  7832. 15:17:45.331 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  7833. 15:17:45.332 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  7834. 15:17:45.332 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  7835. 15:17:45.334 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  7836. 15:17:45.334 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  7837. 15:17:45.334 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  7838. 15:17:45.335 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  7839. 15:17:45.335 DEBUG [rFt44e4w] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  7840. 15:17:45.335 DEBUG [rFt44e4w] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  7841. 15:17:45.337 DEBUG [rFt44e4w] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  7842. 15:17:45.337 DEBUG [rFt44e4w] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  7843. 15:17:45.337 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  7844. 15:17:45.337 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469763809282(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.337849800(LocalDateTime)
  7845. 15:17:45.340 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  7846. 15:17:45.340 INFO [rFt44e4w] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  7847. 15:17:45.345 DEBUG [rFt44e4w] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 28ms
  7848. MockHttpServletRequest:
  7849. HTTP Method = POST
  7850. Request URI = /api/search/query
  7851. Parameters = {}
  7852. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  7853. Body = {"keyword":"阿莫西林胶囊"}
  7854. Session Attrs = {}
  7855. Handler:
  7856. Type = com.xuekairui.user.controller.DrugSearchController
  7857. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7858. Async:
  7859. Async started = false
  7860. Async result = null
  7861. Resolved Exception:
  7862. Type = null
  7863. ModelAndView:
  7864. View name = null
  7865. View = null
  7866. Model = null
  7867. FlashMap:
  7868. Attributes = null
  7869. MockHttpServletResponse:
  7870. Status = 200
  7871. Error message = null
  7872. Headers = [X-Request-Id:"rFt44e4w", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7873. Content type = application/json
  7874. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665344}
  7875. Forwarded URL = null
  7876. Redirected URL = null
  7877. Cookies = []
  7878. 15:17:45.346 DEBUG [qVeLnKha] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7879. 15:17:45.349 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7880. 15:17:45.349 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  7881. 15:17:45.351 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7882. 15:17:45.351 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  7883. 15:17:45.351 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  7884. 15:17:45.352 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  7885. 15:17:45.352 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  7886. 15:17:45.353 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  7887. 15:17:45.354 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  7888. 15:17:45.354 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  7889. 15:17:45.354 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  7890. 15:17:45.356 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  7891. 15:17:45.356 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  7892. 15:17:45.356 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  7893. 15:17:45.357 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  7894. 15:17:45.357 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  7895. 15:17:45.357 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  7896. 15:17:45.359 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  7897. 15:17:45.359 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  7898. 15:17:45.359 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  7899. 15:17:45.361 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  7900. 15:17:45.361 DEBUG [qVeLnKha] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  7901. 15:17:45.361 DEBUG [qVeLnKha] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  7902. 15:17:45.362 DEBUG [qVeLnKha] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  7903. 15:17:45.363 DEBUG [qVeLnKha] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  7904. 15:17:45.363 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  7905. 15:17:45.363 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469893832705(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.363398700(LocalDateTime)
  7906. 15:17:45.366 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  7907. 15:17:45.366 INFO [qVeLnKha] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  7908. 15:17:45.371 DEBUG [qVeLnKha] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 25ms
  7909. MockHttpServletRequest:
  7910. HTTP Method = POST
  7911. Request URI = /api/search/query
  7912. Parameters = {}
  7913. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  7914. Body = {"keyword":"阿莫西林胶囊"}
  7915. Session Attrs = {}
  7916. Handler:
  7917. Type = com.xuekairui.user.controller.DrugSearchController
  7918. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7919. Async:
  7920. Async started = false
  7921. Async result = null
  7922. Resolved Exception:
  7923. Type = null
  7924. ModelAndView:
  7925. View name = null
  7926. View = null
  7927. Model = null
  7928. FlashMap:
  7929. Attributes = null
  7930. MockHttpServletResponse:
  7931. Status = 200
  7932. Error message = null
  7933. Headers = [X-Request-Id:"qVeLnKha", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7934. Content type = application/json
  7935. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665370}
  7936. Forwarded URL = null
  7937. Redirected URL = null
  7938. Cookies = []
  7939. 15:17:45.372 DEBUG [PzwXp9eN] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  7940. 15:17:45.375 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  7941. 15:17:45.375 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  7942. 15:17:45.376 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  7943. 15:17:45.376 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  7944. 15:17:45.376 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  7945. 15:17:45.378 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  7946. 15:17:45.379 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  7947. 15:17:45.379 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  7948. 15:17:45.381 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  7949. 15:17:45.381 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  7950. 15:17:45.381 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  7951. 15:17:45.383 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  7952. 15:17:45.383 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  7953. 15:17:45.383 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  7954. 15:17:45.385 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  7955. 15:17:45.385 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  7956. 15:17:45.385 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  7957. 15:17:45.386 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  7958. 15:17:45.386 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  7959. 15:17:45.386 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  7960. 15:17:45.388 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  7961. 15:17:45.388 DEBUG [PzwXp9eN] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  7962. 15:17:45.388 DEBUG [PzwXp9eN] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  7963. 15:17:45.389 DEBUG [PzwXp9eN] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  7964. 15:17:45.389 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  7965. 15:17:45.390 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  7966. 15:17:45.390 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469956747265(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.390467400(LocalDateTime)
  7967. 15:17:45.393 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  7968. 15:17:45.393 INFO [PzwXp9eN] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  7969. 15:17:45.399 DEBUG [PzwXp9eN] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 27ms
  7970. MockHttpServletRequest:
  7971. HTTP Method = POST
  7972. Request URI = /api/search/query
  7973. Parameters = {}
  7974. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  7975. Body = {"keyword":"阿莫西林胶囊"}
  7976. Session Attrs = {}
  7977. Handler:
  7978. Type = com.xuekairui.user.controller.DrugSearchController
  7979. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  7980. Async:
  7981. Async started = false
  7982. Async result = null
  7983. Resolved Exception:
  7984. Type = null
  7985. ModelAndView:
  7986. View name = null
  7987. View = null
  7988. Model = null
  7989. FlashMap:
  7990. Attributes = null
  7991. MockHttpServletResponse:
  7992. Status = 200
  7993. Error message = null
  7994. Headers = [X-Request-Id:"PzwXp9eN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  7995. Content type = application/json
  7996. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665398}
  7997. Forwarded URL = null
  7998. Redirected URL = null
  7999. Cookies = []
  8000. 15:17:45.399 DEBUG [uCg7cGwb] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  8001. 15:17:45.402 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8002. 15:17:45.402 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  8003. 15:17:45.403 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8004. 15:17:45.403 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8005. 15:17:45.404 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  8006. 15:17:45.405 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8007. 15:17:45.406 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8008. 15:17:45.406 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8009. 15:17:45.408 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  8010. 15:17:45.408 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  8011. 15:17:45.408 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  8012. 15:17:45.409 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  8013. 15:17:45.409 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  8014. 15:17:45.409 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  8015. 15:17:45.411 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  8016. 15:17:45.412 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  8017. 15:17:45.412 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  8018. 15:17:45.413 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  8019. 15:17:45.414 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  8020. 15:17:45.414 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  8021. 15:17:45.415 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  8022. 15:17:45.415 DEBUG [uCg7cGwb] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  8023. 15:17:45.416 DEBUG [uCg7cGwb] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  8024. 15:17:45.417 DEBUG [uCg7cGwb] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  8025. 15:17:45.417 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  8026. 15:17:45.418 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  8027. 15:17:45.418 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470082576385(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.418509300(LocalDateTime)
  8028. 15:17:45.421 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  8029. 15:17:45.421 INFO [uCg7cGwb] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  8030. 15:17:45.427 DEBUG [uCg7cGwb] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 28ms
  8031. MockHttpServletRequest:
  8032. HTTP Method = POST
  8033. Request URI = /api/search/query
  8034. Parameters = {}
  8035. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  8036. Body = {"keyword":"阿莫西林胶囊"}
  8037. Session Attrs = {}
  8038. Handler:
  8039. Type = com.xuekairui.user.controller.DrugSearchController
  8040. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  8041. Async:
  8042. Async started = false
  8043. Async result = null
  8044. Resolved Exception:
  8045. Type = null
  8046. ModelAndView:
  8047. View name = null
  8048. View = null
  8049. Model = null
  8050. FlashMap:
  8051. Attributes = null
  8052. MockHttpServletResponse:
  8053. Status = 200
  8054. Error message = null
  8055. Headers = [X-Request-Id:"uCg7cGwb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8056. Content type = application/json
  8057. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665425}
  8058. Forwarded URL = null
  8059. Redirected URL = null
  8060. Cookies = []
  8061. 15:17:45.427 DEBUG [H6CFAPV2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  8062. 15:17:45.430 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8063. 15:17:45.430 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  8064. 15:17:45.432 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8065. 15:17:45.432 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8066. 15:17:45.432 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  8067. 15:17:45.434 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8068. 15:17:45.434 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8069. 15:17:45.434 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8070. 15:17:45.436 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  8071. 15:17:45.436 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  8072. 15:17:45.436 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  8073. 15:17:45.438 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  8074. 15:17:45.438 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  8075. 15:17:45.438 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  8076. 15:17:45.440 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  8077. 15:17:45.440 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  8078. 15:17:45.440 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  8079. 15:17:45.442 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  8080. 15:17:45.442 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  8081. 15:17:45.442 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  8082. 15:17:45.443 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  8083. 15:17:45.443 DEBUG [H6CFAPV2] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  8084. 15:17:45.443 DEBUG [H6CFAPV2] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  8085. 15:17:45.444 DEBUG [H6CFAPV2] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  8086. 15:17:45.445 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  8087. 15:17:45.445 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  8088. 15:17:45.445 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470212599809(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.445349800(LocalDateTime)
  8089. 15:17:45.447 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  8090. 15:17:45.448 INFO [H6CFAPV2] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  8091. 15:17:45.453 DEBUG [H6CFAPV2] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 26ms
  8092. MockHttpServletRequest:
  8093. HTTP Method = POST
  8094. Request URI = /api/search/query
  8095. Parameters = {}
  8096. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  8097. Body = {"keyword":"阿莫西林胶囊"}
  8098. Session Attrs = {}
  8099. Handler:
  8100. Type = com.xuekairui.user.controller.DrugSearchController
  8101. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  8102. Async:
  8103. Async started = false
  8104. Async result = null
  8105. Resolved Exception:
  8106. Type = null
  8107. ModelAndView:
  8108. View name = null
  8109. View = null
  8110. Model = null
  8111. FlashMap:
  8112. Attributes = null
  8113. MockHttpServletResponse:
  8114. Status = 200
  8115. Error message = null
  8116. Headers = [X-Request-Id:"H6CFAPV2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8117. Content type = application/json
  8118. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665452}
  8119. Forwarded URL = null
  8120. Redirected URL = null
  8121. Cookies = []
  8122. 15:17:45.454 DEBUG [jNBZbHYt] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  8123. 15:17:45.457 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8124. 15:17:45.457 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  8125. 15:17:45.458 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8126. 15:17:45.459 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8127. 15:17:45.459 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  8128. 15:17:45.460 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8129. 15:17:45.460 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8130. 15:17:45.461 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8131. 15:17:45.463 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  8132. 15:17:45.463 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  8133. 15:17:45.463 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  8134. 15:17:45.464 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  8135. 15:17:45.464 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  8136. 15:17:45.465 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  8137. 15:17:45.466 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  8138. 15:17:45.466 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  8139. 15:17:45.466 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  8140. 15:17:45.469 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  8141. 15:17:45.469 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  8142. 15:17:45.469 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  8143. 15:17:45.470 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  8144. 15:17:45.471 DEBUG [jNBZbHYt] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  8145. 15:17:45.471 DEBUG [jNBZbHYt] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  8146. 15:17:45.472 DEBUG [jNBZbHYt] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  8147. 15:17:45.472 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  8148. 15:17:45.473 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  8149. 15:17:45.473 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470338428929(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.473396(LocalDateTime)
  8150. 15:17:45.475 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  8151. 15:17:45.475 INFO [jNBZbHYt] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  8152. 15:17:45.480 DEBUG [jNBZbHYt] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 26ms
  8153. MockHttpServletRequest:
  8154. HTTP Method = POST
  8155. Request URI = /api/search/query
  8156. Parameters = {}
  8157. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  8158. Body = {"keyword":"阿莫西林胶囊"}
  8159. Session Attrs = {}
  8160. Handler:
  8161. Type = com.xuekairui.user.controller.DrugSearchController
  8162. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  8163. Async:
  8164. Async started = false
  8165. Async result = null
  8166. Resolved Exception:
  8167. Type = null
  8168. ModelAndView:
  8169. View name = null
  8170. View = null
  8171. Model = null
  8172. FlashMap:
  8173. Attributes = null
  8174. MockHttpServletResponse:
  8175. Status = 200
  8176. Error message = null
  8177. Headers = [X-Request-Id:"jNBZbHYt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8178. Content type = application/json
  8179. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665480}
  8180. Forwarded URL = null
  8181. Redirected URL = null
  8182. Cookies = []
  8183. 15:17:45.481 DEBUG [aHyj6eUJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  8184. 15:17:45.484 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8185. 15:17:45.484 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  8186. 15:17:45.485 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8187. 15:17:45.485 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8188. 15:17:45.485 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  8189. 15:17:45.487 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8190. 15:17:45.488 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8191. 15:17:45.488 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8192. 15:17:45.489 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  8193. 15:17:45.489 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  8194. 15:17:45.490 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  8195. 15:17:45.491 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  8196. 15:17:45.491 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  8197. 15:17:45.491 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  8198. 15:17:45.492 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  8199. 15:17:45.492 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  8200. 15:17:45.492 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  8201. 15:17:45.493 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  8202. 15:17:45.493 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  8203. 15:17:45.493 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  8204. 15:17:45.495 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  8205. 15:17:45.495 DEBUG [aHyj6eUJ] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  8206. 15:17:45.495 DEBUG [aHyj6eUJ] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  8207. 15:17:45.496 DEBUG [aHyj6eUJ] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  8208. 15:17:45.497 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  8209. 15:17:45.497 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  8210. 15:17:45.497 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470401343490(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.497017300(LocalDateTime)
  8211. 15:17:45.499 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  8212. 15:17:45.499 INFO [aHyj6eUJ] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  8213. 15:17:45.557 DEBUG [aHyj6eUJ] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 76ms
  8214. MockHttpServletRequest:
  8215. HTTP Method = POST
  8216. Request URI = /api/search/query
  8217. Parameters = {}
  8218. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  8219. Body = {"keyword":"阿莫西林胶囊"}
  8220. Session Attrs = {}
  8221. Handler:
  8222. Type = com.xuekairui.user.controller.DrugSearchController
  8223. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  8224. Async:
  8225. Async started = false
  8226. Async result = null
  8227. Resolved Exception:
  8228. Type = null
  8229. ModelAndView:
  8230. View name = null
  8231. View = null
  8232. Model = null
  8233. FlashMap:
  8234. Attributes = null
  8235. MockHttpServletResponse:
  8236. Status = 200
  8237. Error message = null
  8238. Headers = [X-Request-Id:"aHyj6eUJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8239. Content type = application/json
  8240. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665556}
  8241. Forwarded URL = null
  8242. Redirected URL = null
  8243. Cookies = []
  8244. 15:17:45.557 DEBUG [5vHXSnzD] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  8245. 15:17:45.560 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8246. 15:17:45.560 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  8247. 15:17:45.562 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8248. 15:17:45.562 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8249. 15:17:45.562 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  8250. 15:17:45.563 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8251. 15:17:45.564 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8252. 15:17:45.564 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8253. 15:17:45.567 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  8254. 15:17:45.568 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  8255. 15:17:45.568 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  8256. 15:17:45.569 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  8257. 15:17:45.569 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  8258. 15:17:45.569 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  8259. 15:17:45.570 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  8260. 15:17:45.570 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  8261. 15:17:45.570 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  8262. 15:17:45.571 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  8263. 15:17:45.571 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  8264. 15:17:45.571 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  8265. 15:17:45.572 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  8266. 15:17:45.572 DEBUG [5vHXSnzD] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  8267. 15:17:45.572 DEBUG [5vHXSnzD] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  8268. 15:17:45.573 DEBUG [5vHXSnzD] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  8269. 15:17:45.573 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  8270. 15:17:45.573 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  8271. 15:17:45.573 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470724304898(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.573959500(LocalDateTime)
  8272. 15:17:45.576 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  8273. 15:17:45.576 INFO [5vHXSnzD] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  8274. 15:17:45.594 DEBUG [5vHXSnzD] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 37ms
  8275. MockHttpServletRequest:
  8276. HTTP Method = POST
  8277. Request URI = /api/search/query
  8278. Parameters = {}
  8279. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  8280. Body = {"keyword":"阿莫西林胶囊"}
  8281. Session Attrs = {}
  8282. Handler:
  8283. Type = com.xuekairui.user.controller.DrugSearchController
  8284. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  8285. Async:
  8286. Async started = false
  8287. Async result = null
  8288. Resolved Exception:
  8289. Type = null
  8290. ModelAndView:
  8291. View name = null
  8292. View = null
  8293. Model = null
  8294. FlashMap:
  8295. Attributes = null
  8296. MockHttpServletResponse:
  8297. Status = 200
  8298. Error message = null
  8299. Headers = [X-Request-Id:"5vHXSnzD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8300. Content type = application/json
  8301. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665593}
  8302. Forwarded URL = null
  8303. Redirected URL = null
  8304. Cookies = []
  8305. 15:17:45.595 DEBUG [Nfhe3Jz7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  8306. 15:17:45.599 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8307. 15:17:45.599 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  8308. 15:17:45.600 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8309. 15:17:45.601 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8310. 15:17:45.601 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  8311. 15:17:45.602 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8312. 15:17:45.602 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8313. 15:17:45.602 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8314. 15:17:45.604 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  8315. 15:17:45.604 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  8316. 15:17:45.604 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  8317. 15:17:45.605 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  8318. 15:17:45.605 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  8319. 15:17:45.605 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  8320. 15:17:45.606 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  8321. 15:17:45.606 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  8322. 15:17:45.606 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  8323. 15:17:45.608 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  8324. 15:17:45.608 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  8325. 15:17:45.608 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  8326. 15:17:45.609 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  8327. 15:17:45.610 DEBUG [Nfhe3Jz7] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  8328. 15:17:45.610 DEBUG [Nfhe3Jz7] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
  8329. 15:17:45.611 DEBUG [Nfhe3Jz7] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  8330. 15:17:45.611 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  8331. 15:17:45.611 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
  8332. 15:17:45.612 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470917242881(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.611953300(LocalDateTime)
  8333. 15:17:45.614 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
  8334. 15:17:45.614 INFO [Nfhe3Jz7] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
  8335. 15:17:45.619 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 24ms
  8336. MockHttpServletRequest:
  8337. HTTP Method = POST
  8338. Request URI = /api/search/query
  8339. Parameters = {}
  8340. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  8341. Body = {"keyword":"阿莫西林胶囊"}
  8342. Session Attrs = {}
  8343. Handler:
  8344. Type = com.xuekairui.user.controller.DrugSearchController
  8345. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  8346. Async:
  8347. Async started = false
  8348. Async result = null
  8349. Resolved Exception:
  8350. Type = null
  8351. ModelAndView:
  8352. View name = null
  8353. View = null
  8354. Model = null
  8355. FlashMap:
  8356. Attributes = null
  8357. MockHttpServletResponse:
  8358. Status = 200
  8359. Error message = null
  8360. Headers = [X-Request-Id:"Nfhe3Jz7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8361. Content type = application/json
  8362. Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665619}
  8363. Forwarded URL = null
  8364. Redirected URL = null
  8365. Cookies = []
  8366. 15:17:45.620 DEBUG [72SD6BXE] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  8367. 15:17:45.624 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8368. 15:17:45.624 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  8369. 15:17:45.626 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8370. 15:17:45.626 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8371. 15:17:45.626 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  8372. 15:17:45.627 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8373. 15:17:45.628 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8374. 15:17:45.628 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8375. 15:17:45.630 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  8376. 15:17:45.630 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  8377. 15:17:45.630 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  8378. 15:17:45.631 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  8379. 15:17:45.632 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  8380. 15:17:45.632 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  8381. 15:17:45.633 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  8382. 15:17:45.633 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  8383. 15:17:45.633 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  8384. 15:17:45.634 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  8385. 15:17:45.634 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  8386. 15:17:45.634 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  8387. 15:17:45.635 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  8388. 15:17:45.639 WARN [72SD6BXE] [9100] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4301, message=今日爬虫次数已用完
  8389. 15:17:45.640 DEBUG [72SD6BXE] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 20ms
  8390. MockHttpServletRequest:
  8391. HTTP Method = POST
  8392. Request URI = /api/search/query
  8393. Parameters = {}
  8394. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
  8395. Body = {"keyword":"阿莫西林胶囊"}
  8396. Session Attrs = {}
  8397. Handler:
  8398. Type = com.xuekairui.user.controller.DrugSearchController
  8399. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  8400. Async:
  8401. Async started = false
  8402. Async result = null
  8403. Resolved Exception:
  8404. Type = com.xuekairui.common.BusinessException
  8405. ModelAndView:
  8406. View name = null
  8407. View = null
  8408. Model = null
  8409. FlashMap:
  8410. Attributes = null
  8411. MockHttpServletResponse:
  8412. Status = 200
  8413. Error message = null
  8414. Headers = [X-Request-Id:"72SD6BXE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8415. Content type = application/json
  8416. Body = {"code":4301,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976665639}
  8417. Forwarded URL = null
  8418. Redirected URL = null
  8419. Cookies = []
  8420. 15:17:45.640 DEBUG [BkAuupGX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
  8421. 15:17:45.644 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8422. 15:17:45.644 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
  8423. 15:17:45.645 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8424. 15:17:45.646 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8425. 15:17:45.646 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
  8426. 15:17:45.647 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8427. 15:17:45.648 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8428. 15:17:45.648 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8429. 15:17:45.649 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
  8430. 15:17:45.650 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  8431. 15:17:45.650 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
  8432. 15:17:45.652 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  8433. 15:17:45.652 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  8434. 15:17:45.652 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
  8435. 15:17:45.653 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  8436. 15:17:45.654 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  8437. 15:17:45.654 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
  8438. 15:17:45.655 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  8439. 15:17:45.655 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  8440. 15:17:45.655 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
  8441. 15:17:45.657 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  8442. 15:17:45.659 WARN [BkAuupGX] [9100] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4301, message=今日爬虫次数已用完
  8443. 15:17:45.660 DEBUG [BkAuupGX] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 20ms
  8444. MockHttpServletRequest:
  8445. HTTP Method = POST
  8446. Request URI = /api/search/query
  8447. Parameters = {}
  8448. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"29"]
  8449. Body = {"keyword":"氯雷他定片"}
  8450. Session Attrs = {}
  8451. Handler:
  8452. Type = com.xuekairui.user.controller.DrugSearchController
  8453. Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
  8454. Async:
  8455. Async started = false
  8456. Async result = null
  8457. Resolved Exception:
  8458. Type = com.xuekairui.common.BusinessException
  8459. ModelAndView:
  8460. View name = null
  8461. View = null
  8462. Model = null
  8463. FlashMap:
  8464. Attributes = null
  8465. MockHttpServletResponse:
  8466. Status = 200
  8467. Error message = null
  8468. Headers = [X-Request-Id:"BkAuupGX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8469. Content type = application/json
  8470. Body = {"code":4301,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976665659}
  8471. Forwarded URL = null
  8472. Redirected URL = null
  8473. Cookies = []
  8474. 15:17:45.665 DEBUG [j8gMvGAj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/search/suggestions | IP: 127.0.0.1
  8475. 15:17:45.666 DEBUG [j8gMvGAj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/search/suggestions 200 1ms
  8476. MockHttpServletRequest:
  8477. HTTP Method = GET
  8478. Request URI = /api/search/suggestions
  8479. Parameters = {}
  8480. Headers = []
  8481. Body = null
  8482. Session Attrs = {}
  8483. Handler:
  8484. Type = com.xuekairui.user.controller.DrugSearchController
  8485. Method = com.xuekairui.user.controller.DrugSearchController#suggestions()
  8486. Async:
  8487. Async started = false
  8488. Async result = null
  8489. Resolved Exception:
  8490. Type = null
  8491. ModelAndView:
  8492. View name = null
  8493. View = null
  8494. Model = null
  8495. FlashMap:
  8496. Attributes = null
  8497. MockHttpServletResponse:
  8498. Status = 200
  8499. Error message = null
  8500. Headers = [X-Request-Id:"j8gMvGAj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8501. Content type = application/json
  8502. Body = {"code":200,"message":"操作成功","data":["阿莫西林胶囊","布洛芬缓释胶囊","头孢克肟分散片","奥美拉唑肠溶胶囊","硝苯地平控释片","氯雷他定片"],"timestamp":1782976665665}
  8503. Forwarded URL = null
  8504. Redirected URL = null
  8505. Cookies = []
  8506. 15:17:45.672 DEBUG [nXxHwhn5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/search/suggestions | IP: 127.0.0.1
  8507. 15:17:45.673 DEBUG [nXxHwhn5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/search/suggestions 200 1ms
  8508. MockHttpServletRequest:
  8509. HTTP Method = GET
  8510. Request URI = /api/search/suggestions
  8511. Parameters = {}
  8512. Headers = []
  8513. Body = null
  8514. Session Attrs = {}
  8515. Handler:
  8516. Type = com.xuekairui.user.controller.DrugSearchController
  8517. Method = com.xuekairui.user.controller.DrugSearchController#suggestions()
  8518. Async:
  8519. Async started = false
  8520. Async result = null
  8521. Resolved Exception:
  8522. Type = null
  8523. ModelAndView:
  8524. View name = null
  8525. View = null
  8526. Model = null
  8527. FlashMap:
  8528. Attributes = null
  8529. MockHttpServletResponse:
  8530. Status = 200
  8531. Error message = null
  8532. Headers = [X-Request-Id:"nXxHwhn5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8533. Content type = application/json
  8534. Body = {"code":200,"message":"操作成功","data":["阿莫西林胶囊","布洛芬缓释胶囊","头孢克肟分散片","奥美拉唑肠溶胶囊","硝苯地平控释片","氯雷他定片"],"timestamp":1782976665673}
  8535. Forwarded URL = null
  8536. Redirected URL = null
  8537. Cookies = []
  8538. [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.559 s -- in 药品搜索接口测试
  8539. [INFO] Running com.xuekairui.gateway.EndToEndBusinessFlowTest
  8540. 15:17:45.677 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.EndToEndBusinessFlowTest]: EndToEndBusinessFlowTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  8541. 15:17:45.679 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.EndToEndBusinessFlowTest
  8542. 15:17:48.786 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  8543. ========== 阶段1:用户注册 ==========
  8544. 15:17:48.786 DEBUG [bYWTYe3a] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  8545. 15:17:48.787 INFO [bYWTYe3a] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
  8546. 15:17:48.789 INFO [bYWTYe3a] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
  8547. 15:17:48.790 DEBUG [bYWTYe3a] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 4ms
  8548. MockHttpServletRequest:
  8549. HTTP Method = POST
  8550. Request URI = /api/auth/sms/send
  8551. Parameters = {}
  8552. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  8553. Body = {"phone":"13800138000","scene":"login"}
  8554. Session Attrs = {}
  8555. Handler:
  8556. Type = com.xuekairui.user.controller.AuthController
  8557. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  8558. Async:
  8559. Async started = false
  8560. Async result = null
  8561. Resolved Exception:
  8562. Type = null
  8563. ModelAndView:
  8564. View name = null
  8565. View = null
  8566. Model = null
  8567. FlashMap:
  8568. Attributes = null
  8569. MockHttpServletResponse:
  8570. Status = 200
  8571. Error message = null
  8572. Headers = [X-Request-Id:"bYWTYe3a", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8573. Content type = application/json
  8574. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668789}
  8575. Forwarded URL = null
  8576. Redirected URL = null
  8577. Cookies = []
  8578. 15:17:48.790 DEBUG [MYCSc49d] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  8579. 15:17:48.793 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  8580. 15:17:48.793 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  8581. 15:17:48.795 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  8582. 15:17:48.795 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
  8583. 15:17:48.795 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.795064300(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
  8584. 15:17:48.798 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  8585. 15:17:48.799 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  8586. 15:17:48.799 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.795064300(LocalDateTime), 127.0.0.1(String), 1(Long), 19beddef6938c65c1fa71b46d57abe1883267e015858bb17ed6308cab0d6e509(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
  8587. 15:17:48.801 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  8588. 15:17:48.802 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8589. 15:17:48.802 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  8590. 15:17:48.803 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8591. 15:17:48.804 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8592. 15:17:48.804 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  8593. 15:17:48.805 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8594. 15:17:48.806 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8595. 15:17:48.806 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8596. 15:17:48.807 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  8597. 15:17:48.808 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  8598. 15:17:48.808 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580484313849857(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:17:48.808331200(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.808331200(LocalDateTime)
  8599. 15:17:48.811 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  8600. 15:17:48.811 DEBUG [MYCSc49d] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  8601. 15:17:48.817 DEBUG [MYCSc49d] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 27ms
  8602. MockHttpServletRequest:
  8603. HTTP Method = POST
  8604. Request URI = /api/auth/sms/login
  8605. Parameters = {}
  8606. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  8607. Body = {"phone":"13800138000","code":"123456"}
  8608. Session Attrs = {}
  8609. Handler:
  8610. Type = com.xuekairui.user.controller.AuthController
  8611. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  8612. Async:
  8613. Async started = false
  8614. Async result = null
  8615. Resolved Exception:
  8616. Type = null
  8617. ModelAndView:
  8618. View name = null
  8619. View = null
  8620. Model = null
  8621. FlashMap:
  8622. Attributes = null
  8623. MockHttpServletResponse:
  8624. Status = 200
  8625. Error message = null
  8626. Headers = [X-Request-Id:"MYCSc49d", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8627. Content type = application/json
  8628. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzNTgxNDY4fQ.5WCYP1AZKEyWvlW4jL3wCvVGi5HC61a6O641K4oloZqc_sPg8wQLzYF5aYtJ6Wvp5yK66Rwrt-0MluAWzgBuSw","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976668815}
  8629. Forwarded URL = null
  8630. Redirected URL = null
  8631. Cookies = []
  8632. 15:17:48.817 DEBUG [u9GUgWAV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  8633. 15:17:48.818 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8634. 15:17:48.818 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  8635. 15:17:48.820 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8636. 15:17:48.820 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8637. 15:17:48.820 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  8638. 15:17:48.821 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8639. 15:17:48.822 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  8640. 15:17:48.822 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  8641. 15:17:48.823 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  8642. 15:17:48.823 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  8643. 15:17:48.823 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  8644. 15:17:48.825 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  8645. 15:17:48.825 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  8646. 15:17:48.825 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  8647. 15:17:48.826 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  8648. 15:17:48.826 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  8649. 15:17:48.826 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  8650. 15:17:48.827 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  8651. 15:17:48.827 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  8652. 15:17:48.827 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  8653. 15:17:48.829 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  8654. 15:17:48.829 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  8655. 15:17:48.829 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  8656. 15:17:48.832 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  8657. 15:17:48.832 DEBUG [u9GUgWAV] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  8658. 15:17:48.832 DEBUG [u9GUgWAV] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  8659. 15:17:48.833 DEBUG [u9GUgWAV] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  8660. 15:17:48.834 DEBUG [u9GUgWAV] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 17ms
  8661. MockHttpServletRequest:
  8662. HTTP Method = GET
  8663. Request URI = /api/crawler/status
  8664. Parameters = {}
  8665. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
  8666. Body = null
  8667. Session Attrs = {}
  8668. Handler:
  8669. Type = com.xuekairui.user.controller.CrawlerController
  8670. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  8671. Async:
  8672. Async started = false
  8673. Async result = null
  8674. Resolved Exception:
  8675. Type = null
  8676. ModelAndView:
  8677. View name = null
  8678. View = null
  8679. Model = null
  8680. FlashMap:
  8681. Attributes = null
  8682. MockHttpServletResponse:
  8683. Status = 200
  8684. Error message = null
  8685. Headers = [X-Request-Id:"u9GUgWAV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8686. Content type = application/json
  8687. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976668833}
  8688. Forwarded URL = null
  8689. Redirected URL = null
  8690. Cookies = []
  8691. 15:17:48.834 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段1完成: userId=1, 初始配额: 5次/天, 100次/月
  8692. 15:17:48.837 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  8693. ========== 阶段2:绑定B2B平台账号 ==========
  8694. 15:17:48.838 DEBUG [RPB5kbYL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  8695. 15:17:48.839 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8696. 15:17:48.839 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  8697. 15:17:48.841 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8698. 15:17:48.842 DEBUG [RPB5kbYL] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  8699. 15:17:48.842 DEBUG [RPB5kbYL] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
  8700. 15:17:48.844 DEBUG [RPB5kbYL] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  8701. 15:17:48.845 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  8702. 15:17:48.846 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580484443873282(Long), 1(Long), yaoshibang(String), 药师帮(String), IHR5Wl+d81ZzGqPk8Ntlhg3uawhA4AWpmId6DWBTdQjQ0Z+qae1Y(String), 31h/gnEkKkkpdetkt3lyVljZ3O3STNKF5xuBwt9d5SgatZl9dxzMFBs=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:48.845656400(LocalDateTime), 2026-07-02T15:17:48.845656400(LocalDateTime)
  8703. 15:17:48.849 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
  8704. 15:17:48.849 INFO [RPB5kbYL] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaoshibang
  8705. 15:17:48.855 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  8706. 15:17:48.855 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580484506787842(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:48.854874800(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.854874800(LocalDateTime)
  8707. 15:17:48.860 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  8708. 15:17:48.860 DEBUG [RPB5kbYL] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
  8709. 15:17:48.860 DEBUG [RPB5kbYL] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 22ms
  8710. MockHttpServletRequest:
  8711. HTTP Method = POST
  8712. Request URI = /api/platform-account/bind
  8713. Parameters = {}
  8714. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"107"]
  8715. Body = {"account":"13800138000","platformName":"药师帮","platformCode":"yaoshibang","password":"test_password"}
  8716. Session Attrs = {}
  8717. Handler:
  8718. Type = com.xuekairui.user.controller.PlatformAccountController
  8719. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  8720. Async:
  8721. Async started = false
  8722. Async result = null
  8723. Resolved Exception:
  8724. Type = null
  8725. ModelAndView:
  8726. View name = null
  8727. View = null
  8728. Model = null
  8729. FlashMap:
  8730. Attributes = null
  8731. MockHttpServletResponse:
  8732. Status = 200
  8733. Error message = null
  8734. Headers = [X-Request-Id:"RPB5kbYL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8735. Content type = application/json
  8736. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668860}
  8737. Forwarded URL = null
  8738. Redirected URL = null
  8739. Cookies = []
  8740. 15:17:48.861 DEBUG [mE4g2z6A] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  8741. 15:17:48.867 DEBUG [mE4g2z6A] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  8742. 15:17:48.867 DEBUG [mE4g2z6A] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
  8743. 15:17:48.868 DEBUG [mE4g2z6A] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  8744. 15:17:48.869 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  8745. 15:17:48.869 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580484582285314(Long), 1(Long), yaobangmang(String), 药帮忙(String), CNuPOegNewrwpdskE1blVOThy6ai2nx7jqTRTgYaSS6o43YbPCpD(String), A025jUlQHfHIV+ZkbYffaq20wOMLyzglCEqgtkq9B/eRMEzDuzkjS9Q=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:48.869503700(LocalDateTime), 2026-07-02T15:17:48.869503700(LocalDateTime)
  8746. 15:17:48.871 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
  8747. 15:17:48.871 INFO [mE4g2z6A] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaobangmang
  8748. 15:17:48.874 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  8749. 15:17:48.875 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580484582285315(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:48.874944200(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.874944200(LocalDateTime)
  8750. 15:17:48.879 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  8751. 15:17:48.879 DEBUG [mE4g2z6A] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
  8752. 15:17:48.880 DEBUG [mE4g2z6A] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 19ms
  8753. MockHttpServletRequest:
  8754. HTTP Method = POST
  8755. Request URI = /api/platform-account/bind
  8756. Parameters = {}
  8757. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"108"]
  8758. Body = {"account":"13900139000","platformName":"药帮忙","platformCode":"yaobangmang","password":"test_password"}
  8759. Session Attrs = {}
  8760. Handler:
  8761. Type = com.xuekairui.user.controller.PlatformAccountController
  8762. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  8763. Async:
  8764. Async started = false
  8765. Async result = null
  8766. Resolved Exception:
  8767. Type = null
  8768. ModelAndView:
  8769. View name = null
  8770. View = null
  8771. Model = null
  8772. FlashMap:
  8773. Attributes = null
  8774. MockHttpServletResponse:
  8775. Status = 200
  8776. Error message = null
  8777. Headers = [X-Request-Id:"mE4g2z6A", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8778. Content type = application/json
  8779. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668879}
  8780. Forwarded URL = null
  8781. Redirected URL = null
  8782. Cookies = []
  8783. 15:17:48.881 DEBUG [ArUB5EsA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
  8784. 15:17:48.882 DEBUG [ArUB5EsA] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
  8785. 15:17:48.882 DEBUG [ArUB5EsA] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
  8786. 15:17:48.884 DEBUG [ArUB5EsA] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 2
  8787. 15:17:48.884 DEBUG [ArUB5EsA] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 3ms
  8788. MockHttpServletRequest:
  8789. HTTP Method = GET
  8790. Request URI = /api/platform-account/list
  8791. Parameters = {}
  8792. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
  8793. Body = null
  8794. Session Attrs = {}
  8795. Handler:
  8796. Type = com.xuekairui.user.controller.PlatformAccountController
  8797. Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
  8798. Async:
  8799. Async started = false
  8800. Async result = null
  8801. Resolved Exception:
  8802. Type = null
  8803. ModelAndView:
  8804. View name = null
  8805. View = null
  8806. Model = null
  8807. FlashMap:
  8808. Attributes = null
  8809. MockHttpServletResponse:
  8810. Status = 200
  8811. Error message = null
  8812. Headers = [X-Request-Id:"ArUB5EsA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8813. Content type = application/json
  8814. Body = {"code":200,"message":"操作成功","data":[{"id":2072580484582285314,"platformCode":"yaobangmang","platformName":"药帮忙","account":"139****9000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:49"},{"id":2072580484443873282,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:49"}],"timestamp":1782976668884}
  8815. Forwarded URL = null
  8816. Redirected URL = null
  8817. Cookies = []
  8818. 15:17:48.885 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段2完成: 已绑定2个B2B平台
  8819. 15:17:48.887 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  8820. ========== 阶段3:上传营业执照 ==========
  8821. 15:17:48.888 DEBUG [ATNYRvQf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
  8822. 15:17:48.889 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8823. 15:17:48.889 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  8824. 15:17:48.891 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8825. 15:17:48.892 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
  8826. 15:17:48.892 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
  8827. 15:17:48.893 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 0
  8828. 15:17:48.894 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.insert : ==> Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  8829. 15:17:48.894 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.insert : ==> Parameters: 1(Long), https://oss.example.com/license/test.jpg(String), 91110000XXXXXXXXXX(String), 测试大药房(String), 张三(String), PENDING(String), false(Boolean), 2026-07-02T15:17:48.894812800(LocalDateTime), 2026-07-02T15:17:48.894812800(LocalDateTime)
  8830. 15:17:48.899 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.insert : <== Updates: 1
  8831. 15:17:48.900 DEBUG [ATNYRvQf] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 200 12ms
  8832. MockHttpServletRequest:
  8833. HTTP Method = POST
  8834. Request URI = /api/business-license/upload
  8835. Parameters = {}
  8836. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"152"]
  8837. Body = {"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三"}
  8838. Session Attrs = {}
  8839. Handler:
  8840. Type = com.xuekairui.user.controller.BusinessLicenseController
  8841. Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
  8842. Async:
  8843. Async started = false
  8844. Async result = null
  8845. Resolved Exception:
  8846. Type = null
  8847. ModelAndView:
  8848. View name = null
  8849. View = null
  8850. Model = null
  8851. FlashMap:
  8852. Attributes = null
  8853. MockHttpServletResponse:
  8854. Status = 200
  8855. Error message = null
  8856. Headers = [X-Request-Id:"ATNYRvQf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8857. Content type = application/json
  8858. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668899}
  8859. Forwarded URL = null
  8860. Redirected URL = null
  8861. Cookies = []
  8862. 15:17:48.900 DEBUG [uqEFraqA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info | IP: 127.0.0.1
  8863. 15:17:48.902 DEBUG [uqEFraqA] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
  8864. 15:17:48.902 DEBUG [uqEFraqA] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
  8865. 15:17:48.903 DEBUG [uqEFraqA] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 1
  8866. 15:17:48.904 DEBUG [uqEFraqA] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info 200 4ms
  8867. MockHttpServletRequest:
  8868. HTTP Method = GET
  8869. Request URI = /api/business-license/info
  8870. Parameters = {}
  8871. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
  8872. Body = null
  8873. Session Attrs = {}
  8874. Handler:
  8875. Type = com.xuekairui.user.controller.BusinessLicenseController
  8876. Method = com.xuekairui.user.controller.BusinessLicenseController#getInfo(HttpServletRequest)
  8877. Async:
  8878. Async started = false
  8879. Async result = null
  8880. Resolved Exception:
  8881. Type = null
  8882. ModelAndView:
  8883. View name = null
  8884. View = null
  8885. Model = null
  8886. FlashMap:
  8887. Attributes = null
  8888. MockHttpServletResponse:
  8889. Status = 200
  8890. Error message = null
  8891. Headers = [X-Request-Id:"uqEFraqA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8892. Content type = application/json
  8893. Body = {"code":200,"message":"操作成功","data":{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:49","updateTime":"2026-07-02 15:17:49"},"timestamp":1782976668903}
  8894. Forwarded URL = null
  8895. Redirected URL = null
  8896. Cookies = []
  8897. 15:17:48.904 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段3完成: 营业执照已提交,待审核
  8898. 15:17:48.906 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  8899. ========== 阶段4:邀请裂变 ==========
  8900. 15:17:48.907 DEBUG [228tmmP4] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
  8901. 15:17:48.907 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8902. 15:17:48.907 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  8903. 15:17:48.909 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8904. 15:17:48.911 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  8905. 15:17:48.911 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:48.910675900(LocalDateTime)
  8906. 15:17:48.913 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  8907. 15:17:48.913 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  8908. 15:17:48.913 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  8909. 15:17:48.914 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  8910. 15:17:48.915 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
  8911. 15:17:48.915 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 5YZ8LMEM(String)
  8912. 15:17:48.916 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
  8913. 15:17:48.916 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  8914. 15:17:48.916 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 1(Long), 5YZ8LMEM(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:17:48.914933900(LocalDateTime), 1(Integer), 2026-07-02T15:17:48.916531800(LocalDateTime), 2026-07-02T15:17:48.916531800(LocalDateTime)
  8915. 15:17:48.920 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
  8916. 15:17:48.920 INFO [228tmmP4] [1] [ main] c.x.i.service.InviteService : 用户 1 创建邀请码: 5YZ8LMEM
  8917. 15:17:48.920 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  8918. 15:17:48.920 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  8919. 15:17:48.921 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  8920. 15:17:48.922 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8921. 15:17:48.922 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  8922. 15:17:48.923 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8923. 15:17:48.925 DEBUG [228tmmP4] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 18ms
  8924. MockHttpServletRequest:
  8925. HTTP Method = GET
  8926. Request URI = /api/invite/code
  8927. Parameters = {}
  8928. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
  8929. Body = null
  8930. Session Attrs = {}
  8931. Handler:
  8932. Type = com.xuekairui.invite.controller.InviteController
  8933. Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
  8934. Async:
  8935. Async started = false
  8936. Async result = null
  8937. Resolved Exception:
  8938. Type = null
  8939. ModelAndView:
  8940. View name = null
  8941. View = null
  8942. Model = null
  8943. FlashMap:
  8944. Attributes = null
  8945. MockHttpServletResponse:
  8946. Status = 200
  8947. Error message = null
  8948. Headers = [X-Request-Id:"228tmmP4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  8949. Content type = application/json
  8950. Body = {"code":200,"message":"操作成功","data":{"code":"5YZ8LMEM","inviteLink":"https://app.zhijiayun.com/api/invite/5YZ8LMEM","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:17:48","status":1,"createTime":"2026-07-02 15:17:48","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/5YZ8LMEM填我的邀请码 5YZ8LMEM 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/5YZ8LMEM"},"timestamp":1782976668923}
  8951. Forwarded URL = null
  8952. Redirected URL = null
  8953. Cookies = []
  8954. 15:17:48.925 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 邀请码: 5YZ8LMEM
  8955. 15:17:48.925 DEBUG [BycXFeCy] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  8956. 15:17:48.929 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  8957. 15:17:48.929 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13912345678(String)
  8958. 15:17:48.930 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
  8959. 15:17:48.931 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, phone, nickname, login_source, status, role, membership_level, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  8960. 15:17:48.931 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580484829749249(Long), 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:17:48.931019600(LocalDateTime), 2026-07-02T15:17:48.931019600(LocalDateTime)
  8961. 15:17:48.933 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
  8962. 15:17:48.933 INFO [BycXFeCy] [] [ main] c.x.i.l.UserRegisteredListener : 收到用户注册事件: userId=2072580484829749249, inviteCode=5YZ8LMEM
  8963. 15:17:48.934 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  8964. 15:17:48.934 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : ==> Parameters: 5YZ8LMEM(String)
  8965. 15:17:48.935 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : <== Total: 1
  8966. 15:17:48.936 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8967. 15:17:48.936 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580484829749249(Long)
  8968. 15:17:48.936 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8969. 15:17:48.937 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (invitee_id = ?)
  8970. 15:17:48.937 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : ==> Parameters: 2072580484829749249(Long)
  8971. 15:17:48.938 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : <== Total: 1
  8972. 15:17:48.939 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  8973. 15:17:48.939 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : ==> Parameters:
  8974. 15:17:48.941 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : <== Total: 1
  8975. 15:17:48.942 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND registered = ?)
  8976. 15:17:48.942 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 1(Integer)
  8977. 15:17:48.944 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : <== Total: 1
  8978. 15:17:48.944 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_relation ( inviter_id, invitee_id, invite_code_id, registered, reward_granted, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
  8979. 15:17:48.945 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.insert : ==> Parameters: 1(Long), 2072580484829749249(Long), 1(Long), 1(Integer), 1(Integer), 1(Integer), 2026-07-02T15:17:48.944892300(LocalDateTime), 2026-07-02T15:17:48.944892300(LocalDateTime)
  8980. 15:17:48.947 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.insert : <== Updates: 1
  8981. 15:17:48.948 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_code SET user_id=?, code=?, max_uses=?, used_count=?, click_count=?, expire_time=?, status=?, create_time=?, update_time=? WHERE id=?
  8982. 15:17:48.948 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.updateById : ==> Parameters: 1(Long), 5YZ8LMEM(String), -1(Integer), 1(Integer), 0(Integer), 2026-08-01T15:17:49(LocalDateTime), 1(Integer), 2026-07-02T15:17:49(LocalDateTime), 2026-07-02T15:17:49(LocalDateTime), 1(Long)
  8983. 15:17:48.951 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.updateById : <== Updates: 1
  8984. 15:17:48.951 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  8985. 15:17:48.951 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  8986. 15:17:48.952 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  8987. 15:17:48.952 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  8988. 15:17:48.952 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  8989. 15:17:48.954 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  8990. 15:17:48.954 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
  8991. 15:17:48.954 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
  8992. 15:17:48.955 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectList : <== Total: 0
  8993. 15:17:48.956 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  8994. 15:17:48.956 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580484963966977(Long), 1(Long), PRO(String), INVITE(String), 2026-07-02T15:17:48.956245100(LocalDateTime), 2026-08-01T15:17:48.956245100(LocalDateTime), 1(Integer), 邀请奖励:邀请用户2072580484829749249注册(String), 2026-07-02T15:17:48.956245100(LocalDateTime), 2026-07-02T15:17:48.956245100(LocalDateTime)
  8995. 15:17:48.958 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.insert : <== Updates: 1
  8996. 15:17:48.958 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  8997. 15:17:48.959 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:48.956245100(LocalDateTime), 2026-07-02T15:17:49(LocalDateTime), 127.0.0.1(String), 1(Long), 19beddef6938c65c1fa71b46d57abe1883267e015858bb17ed6308cab0d6e509(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
  8998. 15:17:48.961 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  8999. 15:17:48.961 INFO [BycXFeCy] [] [ main] c.x.u.s.MembershipService : 邀请奖励:用户1获得30天高级会员(PRO)
  9000. 15:17:48.961 INFO [BycXFeCy] [] [ main] c.x.i.service.InviteService : 邀请奖励已发放: inviter=1, invitee=2072580484829749249, 会员=PRO/30天, 配额=0次
  9001. 15:17:48.961 INFO [BycXFeCy] [] [ main] c.x.i.service.InviteService : 邀请成功: inviter=1, invitee=2072580484829749249
  9002. 15:17:48.961 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, inviter_id=?, token_version=?, create_time=?, update_time=? WHERE id=?
  9003. 15:17:48.962 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 1(Long), 0(Long), 2026-07-02T15:17:49(LocalDateTime), 2026-07-02T15:17:49(LocalDateTime), 2072580484829749249(Long)
  9004. 15:17:48.964 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  9005. 15:17:48.964 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
  9006. 15:17:48.965 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.964233700(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:17:48.931019600(LocalDateTime), 2026-07-02T15:17:48.931019600(LocalDateTime), 2072580484829749249(Long)
  9007. 15:17:48.966 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  9008. 15:17:48.968 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  9009. 15:17:48.968 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.964233700(LocalDateTime), 127.0.0.1(String), 1(Long), cb8ac91cda3091b1af1b5b555c3919acc9881bae250ffe19884beb95407c7fb9(String), ACTIVE(String), 2026-07-02T15:17:48.931019600(LocalDateTime), 2026-07-02T15:17:48.931019600(LocalDateTime), 2072580484829749249(Long)
  9010. 15:17:48.970 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  9011. 15:17:48.970 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9012. 15:17:48.970 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580484829749249(Long)
  9013. 15:17:48.971 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9014. 15:17:48.972 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  9015. 15:17:48.972 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580484829749249(Long)
  9016. 15:17:48.973 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  9017. 15:17:48.974 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9018. 15:17:48.974 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  9019. 15:17:48.975 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.M.selectList : <== Total: 3
  9020. 15:17:48.975 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  9021. 15:17:48.975 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580485026881537(Long), 2072580484829749249(Long), 用户5678(String), USER(String), 2026-07-02T15:17:48.975628300(LocalDateTime), USER(String), REGISTER(String), 用户注册(String), USER(String), 2072580484829749249(Long), USER:2072580484829749249(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.975628300(LocalDateTime)
  9022. 15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : <== Updates: 1
  9023. 15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户注册
  9024. 15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  9025. 15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580485026881538(Long), 2072580484829749249(Long), 用户5678(String), USER(String), 2026-07-02T15:17:48.977733500(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 2072580484829749249(Long), USER:2072580484829749249(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.977733500(LocalDateTime)
  9026. 15:17:48.979 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : <== Updates: 1
  9027. 15:17:48.979 DEBUG [BycXFeCy] [2072580484829749249] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  9028. 15:17:48.984 DEBUG [BycXFeCy] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 59ms
  9029. MockHttpServletRequest:
  9030. HTTP Method = POST
  9031. Request URI = /api/auth/sms/login
  9032. Parameters = {}
  9033. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"63"]
  9034. Body = {"phone":"13912345678","inviteCode":"5YZ8LMEM","code":"123456"}
  9035. Session Attrs = {}
  9036. Handler:
  9037. Type = com.xuekairui.user.controller.AuthController
  9038. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  9039. Async:
  9040. Async started = false
  9041. Async result = null
  9042. Resolved Exception:
  9043. Type = null
  9044. ModelAndView:
  9045. View name = null
  9046. View = null
  9047. Model = null
  9048. FlashMap:
  9049. Attributes = null
  9050. MockHttpServletResponse:
  9051. Status = 200
  9052. Error message = null
  9053. Headers = [X-Request-Id:"BycXFeCy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9054. Content type = application/json
  9055. Body = {"code":200,"message":"操作成功","data":{"userId":2072580484829749249,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDQ4NDgyOTc0OTI0OSwic3ViIjoiMjA3MjU4MDQ4NDgyOTc0OTI0OSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.0f0sa1_nYWram4ZHRBZ0qgAyXBjstiRbbDkc2F590wa667GEuNZ3R0BE43X5oBTwWrUQZTICawZV2jax73zGKw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDQ4NDgyOTc0OTI0OSwic3ViIjoiMjA3MjU4MDQ4NDgyOTc0OTI0OSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzNTgxNDY4fQ.Vp24hmMW7FKuKnZJIeZKt44kxXsFu2Q-tKHfKxVp62If5nKwUx-J1EP7WVxZy8U00DIgdkQGr_nxqM7JYFuJ5g","expiresIn":86400,"userInfo":{"id":2072580484829749249,"phone":"139****5678","nickname":"用户5678","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:48","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580484829749249,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":true,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976668984}
  9056. Forwarded URL = null
  9057. Redirected URL = null
  9058. Cookies = []
  9059. 15:17:48.985 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段4完成: 成功邀请1位新用户
  9060. 15:17:48.987 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  9061. ========== 阶段5:查看邀请奖励 ==========
  9062. 15:17:48.987 DEBUG [ggDcXz9g] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
  9063. 15:17:48.988 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9064. 15:17:48.988 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9065. 15:17:48.991 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9066. 15:17:48.991 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  9067. 15:17:48.991 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  9068. 15:17:48.993 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  9069. 15:17:48.993 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  9070. 15:17:48.993 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:48.993167400(LocalDateTime)
  9071. 15:17:48.995 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  9072. 15:17:48.995 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  9073. 15:17:48.995 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  9074. 15:17:48.996 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  9075. 15:17:48.996 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9076. 15:17:48.996 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9077. 15:17:48.998 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9078. 15:17:48.999 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
  9079. 15:17:48.999 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
  9080. 15:17:49.000 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  9081. 15:17:49.001 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
  9082. 15:17:49.001 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
  9083. 15:17:49.003 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
  9084. 15:17:49.003 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9085. 15:17:49.004 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9086. 15:17:49.005 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9087. 15:17:49.006 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  9088. 15:17:49.006 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  9089. 15:17:49.007 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  9090. 15:17:49.007 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9091. 15:17:49.007 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9092. 15:17:49.009 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
  9093. 15:17:49.009 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  9094. 15:17:49.009 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  9095. 15:17:49.010 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  9096. 15:17:49.010 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  9097. 15:17:49.010 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  9098. 15:17:49.012 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  9099. 15:17:49.012 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  9100. 15:17:49.012 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  9101. 15:17:49.012 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  9102. 15:17:49.013 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  9103. 15:17:49.013 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  9104. 15:17:49.015 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  9105. 15:17:49.015 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  9106. 15:17:49.015 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  9107. 15:17:49.016 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  9108. 15:17:49.016 DEBUG [ggDcXz9g] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  9109. 15:17:49.016 DEBUG [ggDcXz9g] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  9110. 15:17:49.017 DEBUG [ggDcXz9g] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  9111. 15:17:49.020 DEBUG [ggDcXz9g] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 200 33ms
  9112. MockHttpServletRequest:
  9113. HTTP Method = GET
  9114. Request URI = /api/invite/stats
  9115. Parameters = {}
  9116. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
  9117. Body = null
  9118. Session Attrs = {}
  9119. Handler:
  9120. Type = com.xuekairui.invite.controller.InviteController
  9121. Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)
  9122. Async:
  9123. Async started = false
  9124. Async result = null
  9125. Resolved Exception:
  9126. Type = null
  9127. ModelAndView:
  9128. View name = null
  9129. View = null
  9130. Model = null
  9131. FlashMap:
  9132. Attributes = null
  9133. MockHttpServletResponse:
  9134. Status = 200
  9135. Error message = null
  9136. Headers = [X-Request-Id:"ggDcXz9g", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9137. Content type = application/json
  9138. Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"5YZ8LMEM","inviteLink":"https://app.zhijiayun.com/api/invite/5YZ8LMEM","clickedCount":0,"totalInvited":1,"registeredCount":1,"totalReward":1,"summaryText":"已邀请1家药店,1家注册,累计获得1个月高级会员","todayInvited":1,"todayRemaining":9,"rewardPerInvite":1,"crawlerTodayRemaining":999,"crawlerQuotaFromInvites":0},"timestamp":1782976669019}
  9139. Forwarded URL = null
  9140. Redirected URL = null
  9141. Cookies = []
  9142. 15:17:49.021 DEBUG [YDC3CuEG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  9143. 15:17:49.022 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9144. 15:17:49.023 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9145. 15:17:49.025 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9146. 15:17:49.025 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  9147. 15:17:49.025 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  9148. 15:17:49.026 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  9149. 15:17:49.027 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9150. 15:17:49.027 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9151. 15:17:49.029 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
  9152. 15:17:49.029 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  9153. 15:17:49.030 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  9154. 15:17:49.031 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  9155. 15:17:49.031 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  9156. 15:17:49.031 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  9157. 15:17:49.032 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  9158. 15:17:49.032 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  9159. 15:17:49.032 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  9160. 15:17:49.034 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  9161. 15:17:49.034 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  9162. 15:17:49.034 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  9163. 15:17:49.036 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  9164. 15:17:49.037 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  9165. 15:17:49.037 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  9166. 15:17:49.038 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  9167. 15:17:49.038 DEBUG [YDC3CuEG] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  9168. 15:17:49.038 DEBUG [YDC3CuEG] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  9169. 15:17:49.039 DEBUG [YDC3CuEG] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  9170. 15:17:49.040 DEBUG [YDC3CuEG] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 19ms
  9171. MockHttpServletRequest:
  9172. HTTP Method = GET
  9173. Request URI = /api/crawler/status
  9174. Parameters = {}
  9175. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
  9176. Body = null
  9177. Session Attrs = {}
  9178. Handler:
  9179. Type = com.xuekairui.user.controller.CrawlerController
  9180. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  9181. Async:
  9182. Async started = false
  9183. Async result = null
  9184. Resolved Exception:
  9185. Type = null
  9186. ModelAndView:
  9187. View name = null
  9188. View = null
  9189. Model = null
  9190. FlashMap:
  9191. Attributes = null
  9192. MockHttpServletResponse:
  9193. Status = 200
  9194. Error message = null
  9195. Headers = [X-Request-Id:"YDC3CuEG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9196. Content type = application/json
  9197. Body = {"code":200,"message":"操作成功","data":{"levelName":"高级会员","levelCode":"PRO","todayUsed":0,"todayQuota":999,"todayRemaining":999,"monthUsed":0,"monthQuota":29970,"monthRemaining":29970,"yearUsed":0,"yearQuota":364635,"yearRemaining":364635,"baseDailyQuota":999,"baseMonthlyQuota":29970,"baseYearlyQuota":364635,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":5,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976669039}
  9198. Forwarded URL = null
  9199. Redirected URL = null
  9200. Cookies = []
  9201. 15:17:49.040 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段5完成: 已获得邀请奖励
  9202. 15:17:49.043 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  9203. ========== 阶段6:消耗配额比价 ==========
  9204. 15:17:49.043 DEBUG [Bgz9XUNz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  9205. 15:17:49.043 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9206. 15:17:49.043 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9207. 15:17:49.046 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9208. 15:17:49.049 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9209. 15:17:49.049 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9210. 15:17:49.051 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9211. 15:17:49.051 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  9212. 15:17:49.051 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  9213. 15:17:49.053 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  9214. 15:17:49.053 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9215. 15:17:49.054 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9216. 15:17:49.055 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
  9217. 15:17:49.055 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  9218. 15:17:49.055 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  9219. 15:17:49.056 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  9220. 15:17:49.056 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  9221. 15:17:49.056 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  9222. 15:17:49.057 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  9223. 15:17:49.057 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  9224. 15:17:49.057 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  9225. 15:17:49.058 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  9226. 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  9227. 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  9228. 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  9229. 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
  9230. 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
  9231. 15:17:49.060 DEBUG [Bgz9XUNz] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
  9232. 15:17:49.060 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
  9233. 15:17:49.060 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
  9234. 15:17:49.061 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580485354037249(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:49.060619(LocalDateTime)
  9235. 15:17:49.062 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
  9236. 15:17:49.067 DEBUG [Bgz9XUNz] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 24ms
  9237. MockHttpServletRequest:
  9238. HTTP Method = POST
  9239. Request URI = /api/crawler/consume
  9240. Parameters = {}
  9241. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"35"]
  9242. Body = {"count":1,"platform":"yaoshibang"}
  9243. Session Attrs = {}
  9244. Handler:
  9245. Type = com.xuekairui.user.controller.CrawlerController
  9246. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  9247. Async:
  9248. Async started = false
  9249. Async result = null
  9250. Resolved Exception:
  9251. Type = null
  9252. ModelAndView:
  9253. View name = null
  9254. View = null
  9255. Model = null
  9256. FlashMap:
  9257. Attributes = null
  9258. MockHttpServletResponse:
  9259. Status = 200
  9260. Error message = null
  9261. Headers = [X-Request-Id:"Bgz9XUNz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9262. Content type = application/json
  9263. Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976669067}
  9264. Forwarded URL = null
  9265. Redirected URL = null
  9266. Cookies = []
  9267. 15:17:49.068 DEBUG [33A9hQ7S] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  9268. 15:17:49.069 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9269. 15:17:49.069 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9270. 15:17:49.070 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9271. 15:17:49.070 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  9272. 15:17:49.071 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  9273. 15:17:49.072 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  9274. 15:17:49.072 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9275. 15:17:49.072 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9276. 15:17:49.073 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
  9277. 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  9278. 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  9279. 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  9280. 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  9281. 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  9282. 15:17:49.076 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  9283. 15:17:49.076 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  9284. 15:17:49.076 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  9285. 15:17:49.077 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  9286. 15:17:49.077 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  9287. 15:17:49.078 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  9288. 15:17:49.079 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  9289. 15:17:49.080 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  9290. 15:17:49.080 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  9291. 15:17:49.081 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  9292. 15:17:49.081 DEBUG [33A9hQ7S] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  9293. 15:17:49.081 DEBUG [33A9hQ7S] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  9294. 15:17:49.083 DEBUG [33A9hQ7S] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  9295. 15:17:49.083 DEBUG [33A9hQ7S] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 15ms
  9296. MockHttpServletRequest:
  9297. HTTP Method = GET
  9298. Request URI = /api/crawler/status
  9299. Parameters = {}
  9300. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
  9301. Body = null
  9302. Session Attrs = {}
  9303. Handler:
  9304. Type = com.xuekairui.user.controller.CrawlerController
  9305. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  9306. Async:
  9307. Async started = false
  9308. Async result = null
  9309. Resolved Exception:
  9310. Type = null
  9311. ModelAndView:
  9312. View name = null
  9313. View = null
  9314. Model = null
  9315. FlashMap:
  9316. Attributes = null
  9317. MockHttpServletResponse:
  9318. Status = 200
  9319. Error message = null
  9320. Headers = [X-Request-Id:"33A9hQ7S", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9321. Content type = application/json
  9322. Body = {"code":200,"message":"操作成功","data":{"levelName":"高级会员","levelCode":"PRO","todayUsed":1,"todayQuota":999,"todayRemaining":998,"monthUsed":1,"monthQuota":29970,"monthRemaining":29969,"yearUsed":1,"yearQuota":364635,"yearRemaining":364634,"baseDailyQuota":999,"baseMonthlyQuota":29970,"baseYearlyQuota":364635,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":5,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976669083}
  9323. Forwarded URL = null
  9324. Redirected URL = null
  9325. Cookies = []
  9326. 15:17:49.084 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段6完成: 消耗1次配额,剩余4次/天
  9327. 15:17:49.087 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  9328. ========== 阶段7:管理员审核 ==========
  9329. 15:17:49.091 DEBUG [ZHwx5Kbr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  9330. 15:17:49.095 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  9331. 15:17:49.095 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  9332. 15:17:49.097 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  9333. 15:17:49.098 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  9334. 15:17:49.098 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:49(LocalDateTime), 2026-07-02T15:17:49.098235800(LocalDateTime), 127.0.0.1(String), 0(Long), 19beddef6938c65c1fa71b46d57abe1883267e015858bb17ed6308cab0d6e509(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
  9335. 15:17:49.101 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  9336. 15:17:49.102 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  9337. 15:17:49.102 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:49(LocalDateTime), 2026-07-02T15:17:49.098235800(LocalDateTime), 127.0.0.1(String), 1(Long), d6468a01aae3df5116c23a4e214bb21f443355a228f6afae09510f159cafa733(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
  9338. 15:17:49.105 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  9339. 15:17:49.105 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9340. 15:17:49.105 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9341. 15:17:49.107 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9342. 15:17:49.107 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  9343. 15:17:49.107 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  9344. 15:17:49.108 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  9345. 15:17:49.109 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9346. 15:17:49.109 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9347. 15:17:49.111 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
  9348. 15:17:49.112 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  9349. 15:17:49.112 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580485605695490(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:17:49.111596200(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:49.111596200(LocalDateTime)
  9350. 15:17:49.114 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  9351. 15:17:49.114 DEBUG [ZHwx5Kbr] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  9352. 15:17:49.119 DEBUG [ZHwx5Kbr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 28ms
  9353. MockHttpServletRequest:
  9354. HTTP Method = POST
  9355. Request URI = /api/auth/sms/login
  9356. Parameters = {}
  9357. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  9358. Body = {"phone":"13800138000","code":"123456"}
  9359. Session Attrs = {}
  9360. Handler:
  9361. Type = com.xuekairui.user.controller.AuthController
  9362. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  9363. Async:
  9364. Async started = false
  9365. Async result = null
  9366. Resolved Exception:
  9367. Type = null
  9368. ModelAndView:
  9369. View name = null
  9370. View = null
  9371. Model = null
  9372. FlashMap:
  9373. Attributes = null
  9374. MockHttpServletResponse:
  9375. Status = 200
  9376. Error message = null
  9377. Headers = [X-Request-Id:"ZHwx5Kbr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9378. Content type = application/json
  9379. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzMDYzMDY5fQ.r4HvNsmZlUwmpdoEVnxz7eyEViBEEx4IroiXbt09H9Eu76mg7MS7V7RGfgghurTFmNNtSpB8V0MR_PdIZ_JwCA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzNTgxNDY5fQ.h6GF9oDhsKICOcF7zKbfEdJa0tzNSvQoBvKtZXnRvYBwDvZsj7-8sRgMg8p8MDJqX4Sj0Ksb1Y2kS58huBt7pA","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":"2026-08-01 15:17:49","membershipDaysRemaining":29,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PRO","membershipLevelName":"高级会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PRO","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976669118}
  9380. Forwarded URL = null
  9381. Redirected URL = null
  9382. Cookies = []
  9383. 15:17:49.119 DEBUG [4jwdDJSZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=PENDING | IP: 127.0.0.1
  9384. 15:17:49.120 INFO [4jwdDJSZ] [1] [ main] .x.u.s.JwtAuthenticationFilter : 用户 1 的Token版本号不匹配(已在其他设备登录),拒绝访问
  9385. 15:17:49.121 WARN [4jwdDJSZ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=PENDING 401 2ms
  9386. MockHttpServletRequest:
  9387. HTTP Method = GET
  9388. Request URI = /api/admin/license/review
  9389. Parameters = {reviewStatus=[PENDING]}
  9390. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
  9391. Body = null
  9392. Session Attrs = {}
  9393. Handler:
  9394. Type = null
  9395. Async:
  9396. Async started = false
  9397. Async result = null
  9398. Resolved Exception:
  9399. Type = null
  9400. ModelAndView:
  9401. View name = null
  9402. View = null
  9403. Model = null
  9404. FlashMap:
  9405. Attributes = null
  9406. MockHttpServletResponse:
  9407. Status = 401
  9408. Error message = null
  9409. Headers = [X-Request-Id:"4jwdDJSZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9410. Content type = application/json;charset=UTF-8
  9411. Body = {"code":1304,"message":"您的账号已在其他设备登录,当前会话已失效,请重新登录","data":null,"timestamp":1782976669120}
  9412. Forwarded URL = null
  9413. Redirected URL = null
  9414. Cookies = []
  9415. MockHttpServletRequest:
  9416. HTTP Method = POST
  9417. Request URI = /api/auth/sms/login
  9418. Parameters = {}
  9419. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  9420. Body = {"phone":"13800138000","code":"123456"}
  9421. Session Attrs = {}
  9422. Handler:
  9423. Type = com.xuekairui.user.controller.AuthController
  9424. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  9425. Async:
  9426. Async started = false
  9427. Async result = null
  9428. Resolved Exception:
  9429. Type = null
  9430. ModelAndView:
  9431. View name = null
  9432. View = null
  9433. Model = null
  9434. FlashMap:
  9435. Attributes = null
  9436. MockHttpServletResponse:
  9437. Status = 200
  9438. Error message = null
  9439. Headers = [X-Request-Id:"ZHwx5Kbr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9440. Content type = application/json
  9441. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzMDYzMDY5fQ.r4HvNsmZlUwmpdoEVnxz7eyEViBEEx4IroiXbt09H9Eu76mg7MS7V7RGfgghurTFmNNtSpB8V0MR_PdIZ_JwCA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzNTgxNDY5fQ.h6GF9oDhsKICOcF7zKbfEdJa0tzNSvQoBvKtZXnRvYBwDvZsj7-8sRgMg8p8MDJqX4Sj0Ksb1Y2kS58huBt7pA","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":"2026-08-01 15:17:49","membershipDaysRemaining":29,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PRO","membershipLevelName":"高级会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PRO","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976669118}
  9442. Forwarded URL = null
  9443. Redirected URL = null
  9444. Cookies = []
  9445. MockHttpServletRequest:
  9446. HTTP Method = GET
  9447. Request URI = /api/admin/license/review
  9448. Parameters = {reviewStatus=[PENDING]}
  9449. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
  9450. Body = null
  9451. Session Attrs = {}
  9452. Handler:
  9453. Type = null
  9454. Async:
  9455. Async started = false
  9456. Async result = null
  9457. Resolved Exception:
  9458. Type = null
  9459. ModelAndView:
  9460. View name = null
  9461. View = null
  9462. Model = null
  9463. FlashMap:
  9464. Attributes = null
  9465. MockHttpServletResponse:
  9466. Status = 401
  9467. Error message = null
  9468. Headers = [X-Request-Id:"4jwdDJSZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9469. Content type = application/json;charset=UTF-8
  9470. Body = {"code":1304,"message":"您的账号已在其他设备登录,当前会话已失效,请重新登录","data":null,"timestamp":1782976669120}
  9471. Forwarded URL = null
  9472. Redirected URL = null
  9473. Cookies = []
  9474. 15:17:49.124 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  9475. ========== 阶段8:查看操作审计日志 ==========
  9476. 15:17:49.125 DEBUG [TjEHfpJQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
  9477. 15:17:49.126 DEBUG [TjEHfpJQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9478. 15:17:49.126 DEBUG [TjEHfpJQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9479. 15:17:49.128 DEBUG [TjEHfpJQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9480. 15:17:49.128 INFO [TjEHfpJQ] [1] [ main] .x.u.s.JwtAuthenticationFilter : 用户 1 的Token版本号不匹配(已在其他设备登录),拒绝访问
  9481. 15:17:49.129 WARN [TjEHfpJQ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 401 4ms
  9482. MockHttpServletRequest:
  9483. HTTP Method = GET
  9484. Request URI = /api/admin/audit-log/user/1
  9485. Parameters = {limit=[50]}
  9486. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
  9487. Body = null
  9488. Session Attrs = {}
  9489. Handler:
  9490. Type = null
  9491. Async:
  9492. Async started = false
  9493. Async result = null
  9494. Resolved Exception:
  9495. Type = null
  9496. ModelAndView:
  9497. View name = null
  9498. View = null
  9499. Model = null
  9500. FlashMap:
  9501. Attributes = null
  9502. MockHttpServletResponse:
  9503. Status = 401
  9504. Error message = null
  9505. Headers = [X-Request-Id:"TjEHfpJQ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9506. Content type = application/json;charset=UTF-8
  9507. Body = {"code":1304,"message":"您的账号已在其他设备登录,当前会话已失效,请重新登录","data":null,"timestamp":1782976669128}
  9508. Forwarded URL = null
  9509. Redirected URL = null
  9510. Cookies = []
  9511. MockHttpServletRequest:
  9512. HTTP Method = GET
  9513. Request URI = /api/admin/audit-log/user/1
  9514. Parameters = {limit=[50]}
  9515. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
  9516. Body = null
  9517. Session Attrs = {}
  9518. Handler:
  9519. Type = null
  9520. Async:
  9521. Async started = false
  9522. Async result = null
  9523. Resolved Exception:
  9524. Type = null
  9525. ModelAndView:
  9526. View name = null
  9527. View = null
  9528. Model = null
  9529. FlashMap:
  9530. Attributes = null
  9531. MockHttpServletResponse:
  9532. Status = 401
  9533. Error message = null
  9534. Headers = [X-Request-Id:"TjEHfpJQ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9535. Content type = application/json;charset=UTF-8
  9536. Body = {"code":1304,"message":"您的账号已在其他设备登录,当前会话已失效,请重新登录","data":null,"timestamp":1782976669128}
  9537. Forwarded URL = null
  9538. Redirected URL = null
  9539. Cookies = []
  9540. 15:17:49.133 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  9541. ========== 阶段9:查看完整用户信息 ==========
  9542. 15:17:49.133 DEBUG [AttSvmWJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  9543. 15:17:49.133 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9544. 15:17:49.133 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9545. 15:17:49.135 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9546. 15:17:49.137 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9547. 15:17:49.137 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9548. 15:17:49.138 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9549. 15:17:49.139 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9550. 15:17:49.139 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9551. 15:17:49.140 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9552. 15:17:49.141 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  9553. 15:17:49.141 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  9554. 15:17:49.143 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  9555. 15:17:49.143 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9556. 15:17:49.143 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9557. 15:17:49.145 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
  9558. 15:17:49.145 DEBUG [AttSvmWJ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 200 12ms
  9559. MockHttpServletRequest:
  9560. HTTP Method = GET
  9561. Request URI = /api/auth/user/info
  9562. Parameters = {}
  9563. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzMDYzMDY5fQ.r4HvNsmZlUwmpdoEVnxz7eyEViBEEx4IroiXbt09H9Eu76mg7MS7V7RGfgghurTFmNNtSpB8V0MR_PdIZ_JwCA"]
  9564. Body = null
  9565. Session Attrs = {}
  9566. Handler:
  9567. Type = com.xuekairui.user.controller.AuthController
  9568. Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
  9569. Async:
  9570. Async started = false
  9571. Async result = null
  9572. Resolved Exception:
  9573. Type = null
  9574. ModelAndView:
  9575. View name = null
  9576. View = null
  9577. Model = null
  9578. FlashMap:
  9579. Attributes = null
  9580. MockHttpServletResponse:
  9581. Status = 200
  9582. Error message = null
  9583. Headers = [X-Request-Id:"AttSvmWJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9584. Content type = application/json
  9585. Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":"2026-08-01 15:17:49","membershipDaysRemaining":29,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PRO","membershipLevelName":"高级会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PRO","version":null},"timestamp":1782976669145}
  9586. Forwarded URL = null
  9587. Redirected URL = null
  9588. Cookies = []
  9589. 15:17:49.146 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段9完成: 用户信息完整
  9590. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  9591. ========== ? 端到端业务流程测试完成 ==========
  9592. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段1: 用户注册 - 完成
  9593. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段2: 绑定B2B平台账号 - 完成
  9594. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段3: 上传营业执照 - 完成
  9595. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段4: 邀请裂变 - 完成
  9596. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段5: 获得邀请奖励 - 完成
  9597. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段6: 消耗配额比价 - 完成
  9598. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段7: 管理员审核 - 完成
  9599. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段8: 操作审计日志 - 完成
  9600. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段9: 用户完整信息 - 完成
  9601. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  9602. ? 测试覆盖:
  9603. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 用户认证流程 ?
  9604. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - B2B平台账号绑定 ?
  9605. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 营业执照上传 ?
  9606. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 邀请裂变系统 ?
  9607. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 配额管理 ?
  9608. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 操作审计日志 ?
  9609. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 多端支持字段 ?
  9610. 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
  9611. ? 全流程测试通过!
  9612. [ERROR] Tests run: 10, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 3.475 s <<< FAILURE! -- in com.xuekairui.gateway.EndToEndBusinessFlowTest
  9613. [ERROR] com.xuekairui.gateway.EndToEndBusinessFlowTest.stage7_AdminReviewLicense -- Time elapsed: 0.037 s <<< FAILURE!
  9614. java.lang.AssertionError: Status expected:<200> but was:<401>
  9615. at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)
  9616. at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)
  9617. at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:640)
  9618. at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
  9619. at com.xuekairui.gateway.EndToEndBusinessFlowTest.stage7_AdminReviewLicense(EndToEndBusinessFlowTest.java:264)
  9620. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  9621. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  9622. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  9623. [ERROR] com.xuekairui.gateway.EndToEndBusinessFlowTest.stage8_CheckAuditLogs -- Time elapsed: 0.008 s <<< FAILURE!
  9624. java.lang.AssertionError: Status expected:<200> but was:<401>
  9625. at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)
  9626. at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)
  9627. at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:640)
  9628. at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
  9629. at com.xuekairui.gateway.EndToEndBusinessFlowTest.stage8_CheckAuditLogs(EndToEndBusinessFlowTest.java:295)
  9630. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  9631. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  9632. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  9633. [INFO] Running 文件上传接口测试
  9634. 15:17:49.153 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.FileUploadControllerTest]: FileUploadControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  9635. 15:17:49.156 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.FileUploadControllerTest
  9636. . ____ _ __ _ _
  9637. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
  9638. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
  9639. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  9640. ' |____| .__|_| |_|_| |_\__, | / / / /
  9641. =========|_|==============|___/=/_/_/_/
  9642. :: Spring Boot :: (v3.5.14)
  9643. 15:17:49.185 INFO [] [] [ main] c.x.g.FileUploadControllerTest : Starting FileUploadControllerTest using Java 17.0.17 with PID 37656 (started by geloger in D:\project\zhijiayun-pharmacy\zhijiayun-gateway)
  9644. 15:17:49.185 DEBUG [] [] [ main] c.x.g.FileUploadControllerTest : Running with Spring Boot v3.5.14, Spring v6.2.18
  9645. 15:17:49.186 INFO [] [] [ main] c.x.g.FileUploadControllerTest : The following 1 profile is active: "test"
  9646. 15:17:49.553 INFO [] [] [ main] epositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
  9647. 15:17:49.553 INFO [] [] [ main] epositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
  9648. 15:17:49.567 INFO [] [] [ main] epositoryConfigurationDelegate : Finished Spring Data repository scanning in 12 ms. Found 0 Redis repository interfaces.
  9649. _ _ |_ _ _|_. ___ _ | _
  9650. | | |\/|_)(_| | |_\ |_)||_|_\
  9651. / |
  9652. 3.5.16
  9653. 15:17:49.957 INFO [] [] [ main] c.x.u.service.AliyunSmsClient : 阿里云短信客户端初始化成功,端点: dysmsapi.aliyuncs.com
  9654. 15:17:50.211 INFO [] [] [ main] c.z.hikari.HikariDataSource : HikariPool-2 - Starting...
  9655. 15:17:50.226 INFO [] [] [ main] c.z.hikari.pool.HikariPool : HikariPool-2 - Added connection com.mysql.cj.jdbc.ConnectionImpl@31e8949d
  9656. 15:17:50.226 INFO [] [] [ main] c.z.hikari.HikariDataSource : HikariPool-2 - Start completed.
  9657. [DB-INIT] Test database initialized successfully
  9658. 15:17:51.475 INFO [] [] [ main] .b.a.e.w.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator'
  9659. 15:17:51.484 WARN [] [] [ main] etailsServiceAutoConfiguration :
  9660. Using generated security password: c6536c9b-8164-4a99-b1f7-1b03cfb2ee55
  9661. This generated password is for development use only. Your security configuration must be updated before running your application in production.
  9662. 15:17:51.485 INFO [] [] [ main] zeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
  9663. 15:17:51.535 INFO [] [] [ main] tisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.web.context.support.GenericWebApplicationContext@6288199
  9664. 15:17:51.577 DEBUG [] [] [ main] c.x.g.f.RequestLoggingFilter : Filter 'requestLoggingFilter' configured for use
  9665. 15:17:51.577 DEBUG [] [] [ main] c.x.g.filter.RateLimitFilter : Filter 'rateLimitFilter' configured for use
  9666. 15:17:51.577 DEBUG [] [] [ main] .x.u.s.JwtAuthenticationFilter : Filter 'jwtAuthenticationFilter' configured for use
  9667. 15:17:51.577 INFO [] [] [ main] w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet ''
  9668. 15:17:51.577 INFO [] [] [ main] .s.t.w.s.TestDispatcherServlet : Initializing Servlet ''
  9669. 15:17:51.577 INFO [] [] [ main] .s.t.w.s.TestDispatcherServlet : Completed initialization in 0 ms
  9670. 15:17:51.626 INFO [] [] [ main] c.x.g.FileUploadControllerTest : Started FileUploadControllerTest in 2.465 seconds (process running for 50.372)
  9671. 15:17:51.629 DEBUG [C4jWrYkF] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Preparing: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
  9672. 15:17:51.630 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (role = ?) LIMIT 1
  9673. 15:17:51.630 DEBUG [C4jWrYkF] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Parameters: 2026-07-02T15:17:51.629687600(LocalDateTime)
  9674. 15:17:51.630 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: SUPER_ADMIN(String)
  9675. 15:17:51.632 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
  9676. 15:17:51.633 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (nickname = ?)
  9677. 15:17:51.633 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: admin(String)
  9678. 15:17:51.633 DEBUG [C4jWrYkF] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : <== Total: 0
  9679. 15:17:51.635 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
  9680. 15:17:51.687 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, nickname, password, status, role, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
  9681. 15:17:51.687 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580496406028290(Long), admin(String), $2a$10$yPk9rdR/zrI0I/ud9iBbfOLnunqAfNgSnWyVrXbFo.GgkrKLdyALC(String), 1(Integer), SUPER_ADMIN(String), 0(Long), 2026-07-02T15:17:51.687287300(LocalDateTime), 2026-07-02T15:17:51.687287300(LocalDateTime)
  9682. 15:17:51.693 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
  9683. 15:17:51.693 INFO [] [] [ main] c.x.u.c.SuperAdminInitializer : 已创建默认超级管理员,用户名:admin,默认密码:admin@123,请尽快修改默认密码
  9684. 15:17:54.790 DEBUG [ZvAcFqUS] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload | IP: 127.0.0.1
  9685. 15:17:54.791 DEBUG [ZvAcFqUS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9686. 15:17:54.792 DEBUG [ZvAcFqUS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9687. 15:17:54.794 DEBUG [ZvAcFqUS] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9688. 15:17:54.799 INFO [ZvAcFqUS] [1] [ main] c.x.u.c.FileUploadController : 文件上传成功: C:\Users\gelog\AppData\Local\Temp\zhijiayun-test-uploads\dbe0fd8be26e428c98f39b5fa9d58ae3.jpg
  9689. 15:17:54.801 DEBUG [ZvAcFqUS] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload 200 11ms
  9690. MockHttpServletRequest:
  9691. HTTP Method = POST
  9692. Request URI = /api/upload
  9693. Parameters = {}
  9694. Headers = [Content-Type:"multipart/form-data;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NzQsImV4cCI6MTc4MzA2MzA3NH0.M47hd8jsKV1dCZu8a-JVsyxR6hEjf0G_MP2vFaV4rd0FiUcNy7dd_znWpY_0PSWwstW8FKnDi60VpJnebrCg9g"]
  9695. Body = null
  9696. Session Attrs = {}
  9697. Handler:
  9698. Type = com.xuekairui.user.controller.FileUploadController
  9699. Method = com.xuekairui.user.controller.FileUploadController#upload(MultipartFile)
  9700. Async:
  9701. Async started = false
  9702. Async result = null
  9703. Resolved Exception:
  9704. Type = null
  9705. ModelAndView:
  9706. View name = null
  9707. View = null
  9708. Model = null
  9709. FlashMap:
  9710. Attributes = null
  9711. MockHttpServletResponse:
  9712. Status = 200
  9713. Error message = null
  9714. Headers = [X-Request-Id:"ZvAcFqUS", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9715. Content type = application/json
  9716. Body = {"code":200,"message":"操作成功","data":"/opt/uploads/dbe0fd8be26e428c98f39b5fa9d58ae3.jpg","timestamp":1782976674799}
  9717. Forwarded URL = null
  9718. Redirected URL = null
  9719. Cookies = []
  9720. 15:17:54.807 DEBUG [thjgHf26] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload | IP: 127.0.0.1
  9721. 15:17:54.810 DEBUG [thjgHf26] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9722. 15:17:54.811 DEBUG [thjgHf26] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9723. 15:17:54.812 DEBUG [thjgHf26] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9724. 15:17:54.813 DEBUG [thjgHf26] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload 200 6ms
  9725. MockHttpServletRequest:
  9726. HTTP Method = POST
  9727. Request URI = /api/upload
  9728. Parameters = {}
  9729. Headers = [Content-Type:"multipart/form-data;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NzQsImV4cCI6MTc4MzA2MzA3NH0.M47hd8jsKV1dCZu8a-JVsyxR6hEjf0G_MP2vFaV4rd0FiUcNy7dd_znWpY_0PSWwstW8FKnDi60VpJnebrCg9g"]
  9730. Body = null
  9731. Session Attrs = {}
  9732. Handler:
  9733. Type = com.xuekairui.user.controller.FileUploadController
  9734. Method = com.xuekairui.user.controller.FileUploadController#upload(MultipartFile)
  9735. Async:
  9736. Async started = false
  9737. Async result = null
  9738. Resolved Exception:
  9739. Type = null
  9740. ModelAndView:
  9741. View name = null
  9742. View = null
  9743. Model = null
  9744. FlashMap:
  9745. Attributes = null
  9746. MockHttpServletResponse:
  9747. Status = 200
  9748. Error message = null
  9749. Headers = [X-Request-Id:"thjgHf26", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9750. Content type = application/json
  9751. Body = {"code":400,"message":"文件不能为空","data":null,"timestamp":1782976674813}
  9752. Forwarded URL = null
  9753. Redirected URL = null
  9754. Cookies = []
  9755. 15:17:54.818 DEBUG [ZYAMBxnT] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload | IP: 127.0.0.1
  9756. 15:17:54.819 WARN [ZYAMBxnT] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload 401 1ms
  9757. MockHttpServletRequest:
  9758. HTTP Method = POST
  9759. Request URI = /api/upload
  9760. Parameters = {}
  9761. Headers = [Content-Type:"multipart/form-data;charset=UTF-8"]
  9762. Body = null
  9763. Session Attrs = {}
  9764. Handler:
  9765. Type = null
  9766. Async:
  9767. Async started = false
  9768. Async result = null
  9769. Resolved Exception:
  9770. Type = null
  9771. ModelAndView:
  9772. View name = null
  9773. View = null
  9774. Model = null
  9775. FlashMap:
  9776. Attributes = null
  9777. MockHttpServletResponse:
  9778. Status = 401
  9779. Error message = null
  9780. Headers = [X-Request-Id:"ZYAMBxnT", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9781. Content type = application/json;charset=UTF-8
  9782. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976674819}
  9783. Forwarded URL = null
  9784. Redirected URL = null
  9785. Cookies = []
  9786. 15:17:54.825 DEBUG [rUC79meH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload | IP: 127.0.0.1
  9787. 15:17:54.826 DEBUG [rUC79meH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  9788. 15:17:54.826 DEBUG [rUC79meH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  9789. 15:17:54.828 DEBUG [rUC79meH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  9790. 15:17:54.830 INFO [rUC79meH] [1] [ main] c.x.u.c.FileUploadController : 文件上传成功: C:\Users\gelog\AppData\Local\Temp\zhijiayun-test-uploads\98c2777f9e064f098b1a718ac14a8a46.png
  9791. 15:17:54.830 DEBUG [rUC79meH] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload 200 5ms
  9792. MockHttpServletRequest:
  9793. HTTP Method = POST
  9794. Request URI = /api/upload
  9795. Parameters = {}
  9796. Headers = [Content-Type:"multipart/form-data;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NzQsImV4cCI6MTc4MzA2MzA3NH0.M47hd8jsKV1dCZu8a-JVsyxR6hEjf0G_MP2vFaV4rd0FiUcNy7dd_znWpY_0PSWwstW8FKnDi60VpJnebrCg9g"]
  9797. Body = null
  9798. Session Attrs = {}
  9799. Handler:
  9800. Type = com.xuekairui.user.controller.FileUploadController
  9801. Method = com.xuekairui.user.controller.FileUploadController#upload(MultipartFile)
  9802. Async:
  9803. Async started = false
  9804. Async result = null
  9805. Resolved Exception:
  9806. Type = null
  9807. ModelAndView:
  9808. View name = null
  9809. View = null
  9810. Model = null
  9811. FlashMap:
  9812. Attributes = null
  9813. MockHttpServletResponse:
  9814. Status = 200
  9815. Error message = null
  9816. Headers = [X-Request-Id:"rUC79meH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9817. Content type = application/json
  9818. Body = {"code":200,"message":"操作成功","data":"/opt/uploads/98c2777f9e064f098b1a718ac14a8a46.png","timestamp":1782976674830}
  9819. Forwarded URL = null
  9820. Redirected URL = null
  9821. Cookies = []
  9822. [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.682 s -- in 文件上传接口测试
  9823. [INFO] Running 网关过滤器测试
  9824. 15:17:54.835 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest]: GatewayFilterTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  9825. 15:17:54.837 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest
  9826. [INFO] Running 客户端IP提取
  9827. 15:17:57.984 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$ClientIpTests]: ClientIpTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  9828. 15:17:57.986 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$ClientIpTests
  9829. 15:17:57.994 DEBUG [7a3xWaS9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 192.168.1.1
  9830. 15:17:57.996 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9831. 15:17:57.996 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  9832. 15:17:57.998 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  9833. 15:17:57.999 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9834. 15:17:57.999 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9835. 15:17:58.001 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  9836. 15:17:58.002 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9837. 15:17:58.002 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  9838. 15:17:58.003 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  9839. 15:17:58.005 DEBUG [7a3xWaS9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 11ms
  9840. MockHttpServletRequest:
  9841. HTTP Method = GET
  9842. Request URI = /api/membership/levels
  9843. Parameters = {}
  9844. Headers = [X-Forwarded-For:"192.168.1.1, 10.0.0.1, 172.16.0.1"]
  9845. Body = null
  9846. Session Attrs = {}
  9847. Handler:
  9848. Type = com.xuekairui.user.controller.MembershipController
  9849. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  9850. Async:
  9851. Async started = false
  9852. Async result = null
  9853. Resolved Exception:
  9854. Type = null
  9855. ModelAndView:
  9856. View name = null
  9857. View = null
  9858. Model = null
  9859. FlashMap:
  9860. Attributes = null
  9861. MockHttpServletResponse:
  9862. Status = 200
  9863. Error message = null
  9864. Headers = [X-Request-Id:"7a3xWaS9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9865. Content type = application/json
  9866. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678003}
  9867. Forwarded URL = null
  9868. Redirected URL = null
  9869. Cookies = []
  9870. 15:17:58.011 DEBUG [2DnDVeMg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 10.0.0.1
  9871. 15:17:58.013 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9872. 15:17:58.013 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  9873. 15:17:58.015 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  9874. 15:17:58.016 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9875. 15:17:58.016 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9876. 15:17:58.018 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  9877. 15:17:58.018 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9878. 15:17:58.018 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  9879. 15:17:58.021 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  9880. 15:17:58.023 DEBUG [2DnDVeMg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 12ms
  9881. MockHttpServletRequest:
  9882. HTTP Method = GET
  9883. Request URI = /api/membership/levels
  9884. Parameters = {}
  9885. Headers = [X-Real-IP:"10.0.0.1"]
  9886. Body = null
  9887. Session Attrs = {}
  9888. Handler:
  9889. Type = com.xuekairui.user.controller.MembershipController
  9890. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  9891. Async:
  9892. Async started = false
  9893. Async result = null
  9894. Resolved Exception:
  9895. Type = null
  9896. ModelAndView:
  9897. View name = null
  9898. View = null
  9899. Model = null
  9900. FlashMap:
  9901. Attributes = null
  9902. MockHttpServletResponse:
  9903. Status = 200
  9904. Error message = null
  9905. Headers = [X-Request-Id:"2DnDVeMg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9906. Content type = application/json
  9907. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678021}
  9908. Forwarded URL = null
  9909. Redirected URL = null
  9910. Cookies = []
  9911. 15:17:58.029 DEBUG [Bgk8sF7K] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 192.168.1.100
  9912. 15:17:58.030 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9913. 15:17:58.030 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  9914. 15:17:58.032 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  9915. 15:17:58.033 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9916. 15:17:58.033 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9917. 15:17:58.035 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  9918. 15:17:58.035 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9919. 15:17:58.036 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  9920. 15:17:58.037 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  9921. 15:17:58.038 DEBUG [Bgk8sF7K] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
  9922. MockHttpServletRequest:
  9923. HTTP Method = GET
  9924. Request URI = /api/membership/levels
  9925. Parameters = {}
  9926. Headers = [X-Forwarded-For:"192.168.1.100"]
  9927. Body = null
  9928. Session Attrs = {}
  9929. Handler:
  9930. Type = com.xuekairui.user.controller.MembershipController
  9931. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  9932. Async:
  9933. Async started = false
  9934. Async result = null
  9935. Resolved Exception:
  9936. Type = null
  9937. ModelAndView:
  9938. View name = null
  9939. View = null
  9940. Model = null
  9941. FlashMap:
  9942. Attributes = null
  9943. MockHttpServletResponse:
  9944. Status = 200
  9945. Error message = null
  9946. Headers = [X-Request-Id:"Bgk8sF7K", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9947. Content type = application/json
  9948. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678037}
  9949. Forwarded URL = null
  9950. Redirected URL = null
  9951. Cookies = []
  9952. [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.059 s -- in 客户端IP提取
  9953. [INFO] Running 统一响应格式
  9954. 15:17:58.043 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$ResponseFormatTests]: ResponseFormatTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  9955. 15:17:58.046 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$ResponseFormatTests
  9956. 15:17:58.053 DEBUG [xa3kUkhJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  9957. 15:17:58.054 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9958. 15:17:58.055 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  9959. 15:17:58.056 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  9960. 15:17:58.057 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9961. 15:17:58.058 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  9962. 15:17:58.059 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  9963. 15:17:58.060 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  9964. 15:17:58.060 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  9965. 15:17:58.061 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  9966. 15:17:58.062 DEBUG [xa3kUkhJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
  9967. MockHttpServletRequest:
  9968. HTTP Method = GET
  9969. Request URI = /api/membership/levels
  9970. Parameters = {}
  9971. Headers = []
  9972. Body = null
  9973. Session Attrs = {}
  9974. Handler:
  9975. Type = com.xuekairui.user.controller.MembershipController
  9976. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  9977. Async:
  9978. Async started = false
  9979. Async result = null
  9980. Resolved Exception:
  9981. Type = null
  9982. ModelAndView:
  9983. View name = null
  9984. View = null
  9985. Model = null
  9986. FlashMap:
  9987. Attributes = null
  9988. MockHttpServletResponse:
  9989. Status = 200
  9990. Error message = null
  9991. Headers = [X-Request-Id:"xa3kUkhJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  9992. Content type = application/json
  9993. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678061}
  9994. Forwarded URL = null
  9995. Redirected URL = null
  9996. Cookies = []
  9997. 15:17:58.068 DEBUG [hdN9Z4K6] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  9998. 15:17:58.069 WARN [hdN9Z4K6] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
  9999. MockHttpServletRequest:
  10000. HTTP Method = GET
  10001. Request URI = /api/crawler/status
  10002. Parameters = {}
  10003. Headers = []
  10004. Body = null
  10005. Session Attrs = {}
  10006. Handler:
  10007. Type = null
  10008. Async:
  10009. Async started = false
  10010. Async result = null
  10011. Resolved Exception:
  10012. Type = null
  10013. ModelAndView:
  10014. View name = null
  10015. View = null
  10016. Model = null
  10017. FlashMap:
  10018. Attributes = null
  10019. MockHttpServletResponse:
  10020. Status = 401
  10021. Error message = null
  10022. Headers = [X-Request-Id:"hdN9Z4K6", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10023. Content type = application/json;charset=UTF-8
  10024. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976678068}
  10025. Forwarded URL = null
  10026. Redirected URL = null
  10027. Cookies = []
  10028. 15:17:58.075 DEBUG [7RYf83cy] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/nonexistent | IP: 127.0.0.1
  10029. 15:17:58.077 WARN [7RYf83cy] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/nonexistent 401 2ms
  10030. MockHttpServletRequest:
  10031. HTTP Method = GET
  10032. Request URI = /api/nonexistent
  10033. Parameters = {}
  10034. Headers = []
  10035. Body = null
  10036. Session Attrs = {}
  10037. Handler:
  10038. Type = null
  10039. Async:
  10040. Async started = false
  10041. Async result = null
  10042. Resolved Exception:
  10043. Type = null
  10044. ModelAndView:
  10045. View name = null
  10046. View = null
  10047. Model = null
  10048. FlashMap:
  10049. Attributes = null
  10050. MockHttpServletResponse:
  10051. Status = 401
  10052. Error message = null
  10053. Headers = [X-Request-Id:"7RYf83cy", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10054. Content type = application/json;charset=UTF-8
  10055. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976678077}
  10056. Forwarded URL = null
  10057. Redirected URL = null
  10058. Cookies = []
  10059. [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.038 s -- in 统一响应格式
  10060. [INFO] Running 限流过滤器
  10061. 15:17:58.081 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$RateLimitTests]: RateLimitTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  10062. 15:17:58.084 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$RateLimitTests
  10063. 15:17:58.091 DEBUG [Uv2EkXtw] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  10064. 15:17:58.092 WARN [Uv2EkXtw] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
  10065. MockHttpServletRequest:
  10066. HTTP Method = GET
  10067. Request URI = /api/crawler/status
  10068. Parameters = {}
  10069. Headers = []
  10070. Body = null
  10071. Session Attrs = {}
  10072. Handler:
  10073. Type = null
  10074. Async:
  10075. Async started = false
  10076. Async result = null
  10077. Resolved Exception:
  10078. Type = null
  10079. ModelAndView:
  10080. View name = null
  10081. View = null
  10082. Model = null
  10083. FlashMap:
  10084. Attributes = null
  10085. MockHttpServletResponse:
  10086. Status = 401
  10087. Error message = null
  10088. Headers = [X-Request-Id:"Uv2EkXtw", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10089. Content type = application/json;charset=UTF-8
  10090. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976678092}
  10091. Forwarded URL = null
  10092. Redirected URL = null
  10093. Cookies = []
  10094. 15:17:58.099 DEBUG [p3ygLaJb] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10095. 15:17:58.100 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10096. 15:17:58.100 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10097. 15:17:58.102 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10098. 15:17:58.102 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10099. 15:17:58.103 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10100. 15:17:58.105 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10101. 15:17:58.106 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10102. 15:17:58.106 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10103. 15:17:58.108 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10104. 15:17:58.108 DEBUG [p3ygLaJb] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
  10105. MockHttpServletRequest:
  10106. HTTP Method = GET
  10107. Request URI = /api/membership/levels
  10108. Parameters = {}
  10109. Headers = []
  10110. Body = null
  10111. Session Attrs = {}
  10112. Handler:
  10113. Type = com.xuekairui.user.controller.MembershipController
  10114. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10115. Async:
  10116. Async started = false
  10117. Async result = null
  10118. Resolved Exception:
  10119. Type = null
  10120. ModelAndView:
  10121. View name = null
  10122. View = null
  10123. Model = null
  10124. FlashMap:
  10125. Attributes = null
  10126. MockHttpServletResponse:
  10127. Status = 200
  10128. Error message = null
  10129. Headers = [X-Request-Id:"p3ygLaJb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10130. Content type = application/json
  10131. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678108}
  10132. Forwarded URL = null
  10133. Redirected URL = null
  10134. Cookies = []
  10135. 15:17:58.110 DEBUG [zW4VLH36] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10136. 15:17:58.111 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10137. 15:17:58.111 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10138. 15:17:58.113 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10139. 15:17:58.114 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10140. 15:17:58.114 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10141. 15:17:58.115 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10142. 15:17:58.116 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10143. 15:17:58.116 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10144. 15:17:58.118 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10145. 15:17:58.119 DEBUG [zW4VLH36] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
  10146. MockHttpServletRequest:
  10147. HTTP Method = GET
  10148. Request URI = /api/membership/levels
  10149. Parameters = {}
  10150. Headers = []
  10151. Body = null
  10152. Session Attrs = {}
  10153. Handler:
  10154. Type = com.xuekairui.user.controller.MembershipController
  10155. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10156. Async:
  10157. Async started = false
  10158. Async result = null
  10159. Resolved Exception:
  10160. Type = null
  10161. ModelAndView:
  10162. View name = null
  10163. View = null
  10164. Model = null
  10165. FlashMap:
  10166. Attributes = null
  10167. MockHttpServletResponse:
  10168. Status = 200
  10169. Error message = null
  10170. Headers = [X-Request-Id:"zW4VLH36", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10171. Content type = application/json
  10172. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678118}
  10173. Forwarded URL = null
  10174. Redirected URL = null
  10175. Cookies = []
  10176. 15:17:58.120 DEBUG [yruUE7xc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10177. 15:17:58.121 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10178. 15:17:58.121 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10179. 15:17:58.123 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10180. 15:17:58.124 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10181. 15:17:58.124 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10182. 15:17:58.125 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10183. 15:17:58.126 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10184. 15:17:58.126 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10185. 15:17:58.128 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10186. 15:17:58.129 DEBUG [yruUE7xc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
  10187. MockHttpServletRequest:
  10188. HTTP Method = GET
  10189. Request URI = /api/membership/levels
  10190. Parameters = {}
  10191. Headers = []
  10192. Body = null
  10193. Session Attrs = {}
  10194. Handler:
  10195. Type = com.xuekairui.user.controller.MembershipController
  10196. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10197. Async:
  10198. Async started = false
  10199. Async result = null
  10200. Resolved Exception:
  10201. Type = null
  10202. ModelAndView:
  10203. View name = null
  10204. View = null
  10205. Model = null
  10206. FlashMap:
  10207. Attributes = null
  10208. MockHttpServletResponse:
  10209. Status = 200
  10210. Error message = null
  10211. Headers = [X-Request-Id:"yruUE7xc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10212. Content type = application/json
  10213. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678128}
  10214. Forwarded URL = null
  10215. Redirected URL = null
  10216. Cookies = []
  10217. 15:17:58.129 DEBUG [Pscp8ufJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10218. 15:17:58.130 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10219. 15:17:58.130 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10220. 15:17:58.132 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10221. 15:17:58.133 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10222. 15:17:58.133 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10223. 15:17:58.135 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10224. 15:17:58.136 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10225. 15:17:58.136 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10226. 15:17:58.137 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10227. 15:17:58.138 DEBUG [Pscp8ufJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
  10228. MockHttpServletRequest:
  10229. HTTP Method = GET
  10230. Request URI = /api/membership/levels
  10231. Parameters = {}
  10232. Headers = []
  10233. Body = null
  10234. Session Attrs = {}
  10235. Handler:
  10236. Type = com.xuekairui.user.controller.MembershipController
  10237. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10238. Async:
  10239. Async started = false
  10240. Async result = null
  10241. Resolved Exception:
  10242. Type = null
  10243. ModelAndView:
  10244. View name = null
  10245. View = null
  10246. Model = null
  10247. FlashMap:
  10248. Attributes = null
  10249. MockHttpServletResponse:
  10250. Status = 200
  10251. Error message = null
  10252. Headers = [X-Request-Id:"Pscp8ufJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10253. Content type = application/json
  10254. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678138}
  10255. Forwarded URL = null
  10256. Redirected URL = null
  10257. Cookies = []
  10258. 15:17:58.139 DEBUG [BBSJP5qq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10259. 15:17:58.140 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10260. 15:17:58.140 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10261. 15:17:58.142 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10262. 15:17:58.143 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10263. 15:17:58.143 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10264. 15:17:58.145 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10265. 15:17:58.145 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10266. 15:17:58.145 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10267. 15:17:58.148 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10268. 15:17:58.149 DEBUG [BBSJP5qq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
  10269. MockHttpServletRequest:
  10270. HTTP Method = GET
  10271. Request URI = /api/membership/levels
  10272. Parameters = {}
  10273. Headers = []
  10274. Body = null
  10275. Session Attrs = {}
  10276. Handler:
  10277. Type = com.xuekairui.user.controller.MembershipController
  10278. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10279. Async:
  10280. Async started = false
  10281. Async result = null
  10282. Resolved Exception:
  10283. Type = null
  10284. ModelAndView:
  10285. View name = null
  10286. View = null
  10287. Model = null
  10288. FlashMap:
  10289. Attributes = null
  10290. MockHttpServletResponse:
  10291. Status = 200
  10292. Error message = null
  10293. Headers = [X-Request-Id:"BBSJP5qq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10294. Content type = application/json
  10295. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678148}
  10296. Forwarded URL = null
  10297. Redirected URL = null
  10298. Cookies = []
  10299. 15:17:58.149 DEBUG [JdF4V9mk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10300. 15:17:58.150 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10301. 15:17:58.150 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10302. 15:17:58.152 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10303. 15:17:58.153 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10304. 15:17:58.153 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10305. 15:17:58.155 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10306. 15:17:58.156 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10307. 15:17:58.156 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10308. 15:17:58.158 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10309. 15:17:58.158 DEBUG [JdF4V9mk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
  10310. MockHttpServletRequest:
  10311. HTTP Method = GET
  10312. Request URI = /api/membership/levels
  10313. Parameters = {}
  10314. Headers = []
  10315. Body = null
  10316. Session Attrs = {}
  10317. Handler:
  10318. Type = com.xuekairui.user.controller.MembershipController
  10319. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10320. Async:
  10321. Async started = false
  10322. Async result = null
  10323. Resolved Exception:
  10324. Type = null
  10325. ModelAndView:
  10326. View name = null
  10327. View = null
  10328. Model = null
  10329. FlashMap:
  10330. Attributes = null
  10331. MockHttpServletResponse:
  10332. Status = 200
  10333. Error message = null
  10334. Headers = [X-Request-Id:"JdF4V9mk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10335. Content type = application/json
  10336. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678158}
  10337. Forwarded URL = null
  10338. Redirected URL = null
  10339. Cookies = []
  10340. 15:17:58.159 DEBUG [pJsDHaRC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10341. 15:17:58.160 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10342. 15:17:58.160 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10343. 15:17:58.162 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10344. 15:17:58.163 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10345. 15:17:58.163 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10346. 15:17:58.165 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10347. 15:17:58.166 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10348. 15:17:58.166 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10349. 15:17:58.168 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10350. 15:17:58.169 DEBUG [pJsDHaRC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
  10351. MockHttpServletRequest:
  10352. HTTP Method = GET
  10353. Request URI = /api/membership/levels
  10354. Parameters = {}
  10355. Headers = []
  10356. Body = null
  10357. Session Attrs = {}
  10358. Handler:
  10359. Type = com.xuekairui.user.controller.MembershipController
  10360. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10361. Async:
  10362. Async started = false
  10363. Async result = null
  10364. Resolved Exception:
  10365. Type = null
  10366. ModelAndView:
  10367. View name = null
  10368. View = null
  10369. Model = null
  10370. FlashMap:
  10371. Attributes = null
  10372. MockHttpServletResponse:
  10373. Status = 200
  10374. Error message = null
  10375. Headers = [X-Request-Id:"pJsDHaRC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10376. Content type = application/json
  10377. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678168}
  10378. Forwarded URL = null
  10379. Redirected URL = null
  10380. Cookies = []
  10381. 15:17:58.170 DEBUG [3hLe6hnB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10382. 15:17:58.171 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10383. 15:17:58.171 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10384. 15:17:58.173 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10385. 15:17:58.174 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10386. 15:17:58.174 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10387. 15:17:58.176 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10388. 15:17:58.177 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10389. 15:17:58.177 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10390. 15:17:58.179 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10391. 15:17:58.180 DEBUG [3hLe6hnB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
  10392. MockHttpServletRequest:
  10393. HTTP Method = GET
  10394. Request URI = /api/membership/levels
  10395. Parameters = {}
  10396. Headers = []
  10397. Body = null
  10398. Session Attrs = {}
  10399. Handler:
  10400. Type = com.xuekairui.user.controller.MembershipController
  10401. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10402. Async:
  10403. Async started = false
  10404. Async result = null
  10405. Resolved Exception:
  10406. Type = null
  10407. ModelAndView:
  10408. View name = null
  10409. View = null
  10410. Model = null
  10411. FlashMap:
  10412. Attributes = null
  10413. MockHttpServletResponse:
  10414. Status = 200
  10415. Error message = null
  10416. Headers = [X-Request-Id:"3hLe6hnB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10417. Content type = application/json
  10418. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678179}
  10419. Forwarded URL = null
  10420. Redirected URL = null
  10421. Cookies = []
  10422. 15:17:58.180 DEBUG [ffkk5bQG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10423. 15:17:58.181 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10424. 15:17:58.181 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10425. 15:17:58.183 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10426. 15:17:58.184 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10427. 15:17:58.184 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10428. 15:17:58.185 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10429. 15:17:58.186 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10430. 15:17:58.186 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10431. 15:17:58.188 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10432. 15:17:58.189 DEBUG [ffkk5bQG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
  10433. MockHttpServletRequest:
  10434. HTTP Method = GET
  10435. Request URI = /api/membership/levels
  10436. Parameters = {}
  10437. Headers = []
  10438. Body = null
  10439. Session Attrs = {}
  10440. Handler:
  10441. Type = com.xuekairui.user.controller.MembershipController
  10442. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10443. Async:
  10444. Async started = false
  10445. Async result = null
  10446. Resolved Exception:
  10447. Type = null
  10448. ModelAndView:
  10449. View name = null
  10450. View = null
  10451. Model = null
  10452. FlashMap:
  10453. Attributes = null
  10454. MockHttpServletResponse:
  10455. Status = 200
  10456. Error message = null
  10457. Headers = [X-Request-Id:"ffkk5bQG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10458. Content type = application/json
  10459. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678188}
  10460. Forwarded URL = null
  10461. Redirected URL = null
  10462. Cookies = []
  10463. 15:17:58.189 DEBUG [MYWZMV3q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10464. 15:17:58.192 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10465. 15:17:58.192 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10466. 15:17:58.193 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10467. 15:17:58.194 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10468. 15:17:58.194 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10469. 15:17:58.196 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10470. 15:17:58.196 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10471. 15:17:58.196 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10472. 15:17:58.199 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10473. 15:17:58.199 DEBUG [MYWZMV3q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
  10474. MockHttpServletRequest:
  10475. HTTP Method = GET
  10476. Request URI = /api/membership/levels
  10477. Parameters = {}
  10478. Headers = []
  10479. Body = null
  10480. Session Attrs = {}
  10481. Handler:
  10482. Type = com.xuekairui.user.controller.MembershipController
  10483. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10484. Async:
  10485. Async started = false
  10486. Async result = null
  10487. Resolved Exception:
  10488. Type = null
  10489. ModelAndView:
  10490. View name = null
  10491. View = null
  10492. Model = null
  10493. FlashMap:
  10494. Attributes = null
  10495. MockHttpServletResponse:
  10496. Status = 200
  10497. Error message = null
  10498. Headers = [X-Request-Id:"MYWZMV3q", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10499. Content type = application/json
  10500. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678199}
  10501. Forwarded URL = null
  10502. Redirected URL = null
  10503. Cookies = []
  10504. 15:17:58.206 DEBUG [nhTNb26q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10505. 15:17:58.208 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10506. 15:17:58.208 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10507. 15:17:58.209 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10508. 15:17:58.211 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10509. 15:17:58.211 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10510. 15:17:58.213 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10511. 15:17:58.213 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10512. 15:17:58.214 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10513. 15:17:58.215 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10514. 15:17:58.216 DEBUG [nhTNb26q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
  10515. MockHttpServletRequest:
  10516. HTTP Method = GET
  10517. Request URI = /api/membership/levels
  10518. Parameters = {}
  10519. Headers = []
  10520. Body = null
  10521. Session Attrs = {}
  10522. Handler:
  10523. Type = com.xuekairui.user.controller.MembershipController
  10524. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10525. Async:
  10526. Async started = false
  10527. Async result = null
  10528. Resolved Exception:
  10529. Type = null
  10530. ModelAndView:
  10531. View name = null
  10532. View = null
  10533. Model = null
  10534. FlashMap:
  10535. Attributes = null
  10536. MockHttpServletResponse:
  10537. Status = 200
  10538. Error message = null
  10539. Headers = [X-Request-Id:"nhTNb26q", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10540. Content type = application/json
  10541. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678215}
  10542. Forwarded URL = null
  10543. Redirected URL = null
  10544. Cookies = []
  10545. 15:17:58.223 DEBUG [jZUeVZ8b] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10546. 15:17:58.224 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10547. 15:17:58.224 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10548. 15:17:58.226 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10549. 15:17:58.227 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10550. 15:17:58.227 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10551. 15:17:58.229 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10552. 15:17:58.229 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10553. 15:17:58.229 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10554. 15:17:58.231 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10555. 15:17:58.232 DEBUG [jZUeVZ8b] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
  10556. MockHttpServletRequest:
  10557. HTTP Method = GET
  10558. Request URI = /api/membership/levels
  10559. Parameters = {}
  10560. Headers = []
  10561. Body = null
  10562. Session Attrs = {}
  10563. Handler:
  10564. Type = com.xuekairui.user.controller.MembershipController
  10565. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10566. Async:
  10567. Async started = false
  10568. Async result = null
  10569. Resolved Exception:
  10570. Type = null
  10571. ModelAndView:
  10572. View name = null
  10573. View = null
  10574. Model = null
  10575. FlashMap:
  10576. Attributes = null
  10577. MockHttpServletResponse:
  10578. Status = 200
  10579. Error message = null
  10580. Headers = [X-Request-Id:"jZUeVZ8b", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10581. Content type = application/json
  10582. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678231}
  10583. Forwarded URL = null
  10584. Redirected URL = null
  10585. Cookies = []
  10586. 15:17:58.239 DEBUG [JabjFpFd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10587. 15:17:58.241 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10588. 15:17:58.241 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10589. 15:17:58.244 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10590. 15:17:58.244 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10591. 15:17:58.244 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10592. 15:17:58.247 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10593. 15:17:58.248 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10594. 15:17:58.248 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10595. 15:17:58.250 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10596. 15:17:58.251 DEBUG [JabjFpFd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 12ms
  10597. MockHttpServletRequest:
  10598. HTTP Method = GET
  10599. Request URI = /api/membership/levels
  10600. Parameters = {}
  10601. Headers = []
  10602. Body = null
  10603. Session Attrs = {}
  10604. Handler:
  10605. Type = com.xuekairui.user.controller.MembershipController
  10606. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10607. Async:
  10608. Async started = false
  10609. Async result = null
  10610. Resolved Exception:
  10611. Type = null
  10612. ModelAndView:
  10613. View name = null
  10614. View = null
  10615. Model = null
  10616. FlashMap:
  10617. Attributes = null
  10618. MockHttpServletResponse:
  10619. Status = 200
  10620. Error message = null
  10621. Headers = [X-Request-Id:"JabjFpFd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10622. Content type = application/json
  10623. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678250}
  10624. Forwarded URL = null
  10625. Redirected URL = null
  10626. Cookies = []
  10627. 15:17:58.262 DEBUG [3N8ff9CB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10628. 15:17:58.264 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10629. 15:17:58.265 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10630. 15:17:58.267 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10631. 15:17:58.268 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10632. 15:17:58.268 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10633. 15:17:58.270 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10634. 15:17:58.271 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10635. 15:17:58.271 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10636. 15:17:58.274 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10637. 15:17:58.275 DEBUG [3N8ff9CB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 13ms
  10638. MockHttpServletRequest:
  10639. HTTP Method = GET
  10640. Request URI = /api/membership/levels
  10641. Parameters = {}
  10642. Headers = []
  10643. Body = null
  10644. Session Attrs = {}
  10645. Handler:
  10646. Type = com.xuekairui.user.controller.MembershipController
  10647. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10648. Async:
  10649. Async started = false
  10650. Async result = null
  10651. Resolved Exception:
  10652. Type = null
  10653. ModelAndView:
  10654. View name = null
  10655. View = null
  10656. Model = null
  10657. FlashMap:
  10658. Attributes = null
  10659. MockHttpServletResponse:
  10660. Status = 200
  10661. Error message = null
  10662. Headers = [X-Request-Id:"3N8ff9CB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10663. Content type = application/json
  10664. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678274}
  10665. Forwarded URL = null
  10666. Redirected URL = null
  10667. Cookies = []
  10668. [INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.198 s -- in 限流过滤器
  10669. [INFO] Running 请求日志过滤器
  10670. 15:17:58.280 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$RequestLoggingTests]: RequestLoggingTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  10671. 15:17:58.283 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$RequestLoggingTests
  10672. 15:17:58.293 DEBUG [fxBgz3Kt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10673. 15:17:58.296 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10674. 15:17:58.296 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10675. 15:17:58.299 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10676. 15:17:58.300 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10677. 15:17:58.300 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10678. 15:17:58.302 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10679. 15:17:58.303 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10680. 15:17:58.303 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10681. 15:17:58.306 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10682. 15:17:58.306 DEBUG [fxBgz3Kt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 13ms
  10683. MockHttpServletRequest:
  10684. HTTP Method = GET
  10685. Request URI = /api/membership/levels
  10686. Parameters = {}
  10687. Headers = []
  10688. Body = null
  10689. Session Attrs = {}
  10690. Handler:
  10691. Type = com.xuekairui.user.controller.MembershipController
  10692. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10693. Async:
  10694. Async started = false
  10695. Async result = null
  10696. Resolved Exception:
  10697. Type = null
  10698. ModelAndView:
  10699. View name = null
  10700. View = null
  10701. Model = null
  10702. FlashMap:
  10703. Attributes = null
  10704. MockHttpServletResponse:
  10705. Status = 200
  10706. Error message = null
  10707. Headers = [X-Request-Id:"fxBgz3Kt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10708. Content type = application/json
  10709. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678306}
  10710. Forwarded URL = null
  10711. Redirected URL = null
  10712. Cookies = []
  10713. 15:17:58.316 DEBUG [UR33DKbL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  10714. 15:17:58.317 INFO [UR33DKbL] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
  10715. 15:17:58.320 INFO [UR33DKbL] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
  10716. 15:17:58.321 DEBUG [UR33DKbL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 5ms
  10717. MockHttpServletRequest:
  10718. HTTP Method = POST
  10719. Request URI = /api/auth/sms/send
  10720. Parameters = {}
  10721. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  10722. Body = {"phone":"13800138000","scene":"login"}
  10723. Session Attrs = {}
  10724. Handler:
  10725. Type = com.xuekairui.user.controller.AuthController
  10726. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  10727. Async:
  10728. Async started = false
  10729. Async result = null
  10730. Resolved Exception:
  10731. Type = null
  10732. ModelAndView:
  10733. View name = null
  10734. View = null
  10735. Model = null
  10736. FlashMap:
  10737. Attributes = null
  10738. MockHttpServletResponse:
  10739. Status = 200
  10740. Error message = null
  10741. Headers = [X-Request-Id:"UR33DKbL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10742. Content type = application/json
  10743. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976678320}
  10744. Forwarded URL = null
  10745. Redirected URL = null
  10746. Cookies = []
  10747. 15:17:58.328 DEBUG [vASvXfKM] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10748. 15:17:58.329 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10749. 15:17:58.331 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10750. 15:17:58.334 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10751. 15:17:58.335 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10752. 15:17:58.336 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10753. 15:17:58.338 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10754. 15:17:58.338 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10755. 15:17:58.338 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10756. 15:17:58.341 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10757. 15:17:58.342 DEBUG [vASvXfKM] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 14ms
  10758. MockHttpServletRequest:
  10759. HTTP Method = GET
  10760. Request URI = /api/membership/levels
  10761. Parameters = {}
  10762. Headers = []
  10763. Body = null
  10764. Session Attrs = {}
  10765. Handler:
  10766. Type = com.xuekairui.user.controller.MembershipController
  10767. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10768. Async:
  10769. Async started = false
  10770. Async result = null
  10771. Resolved Exception:
  10772. Type = null
  10773. ModelAndView:
  10774. View name = null
  10775. View = null
  10776. Model = null
  10777. FlashMap:
  10778. Attributes = null
  10779. MockHttpServletResponse:
  10780. Status = 200
  10781. Error message = null
  10782. Headers = [X-Request-Id:"vASvXfKM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10783. Content type = application/json
  10784. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678341}
  10785. Forwarded URL = null
  10786. Redirected URL = null
  10787. Cookies = []
  10788. 15:17:58.343 DEBUG [zbu5FgQG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10789. 15:17:58.345 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10790. 15:17:58.345 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10791. 15:17:58.348 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10792. 15:17:58.349 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10793. 15:17:58.349 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10794. 15:17:58.352 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10795. 15:17:58.353 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10796. 15:17:58.353 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10797. 15:17:58.356 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10798. 15:17:58.357 DEBUG [zbu5FgQG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 14ms
  10799. MockHttpServletRequest:
  10800. HTTP Method = GET
  10801. Request URI = /api/membership/levels
  10802. Parameters = {}
  10803. Headers = []
  10804. Body = null
  10805. Session Attrs = {}
  10806. Handler:
  10807. Type = com.xuekairui.user.controller.MembershipController
  10808. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10809. Async:
  10810. Async started = false
  10811. Async result = null
  10812. Resolved Exception:
  10813. Type = null
  10814. ModelAndView:
  10815. View name = null
  10816. View = null
  10817. Model = null
  10818. FlashMap:
  10819. Attributes = null
  10820. MockHttpServletResponse:
  10821. Status = 200
  10822. Error message = null
  10823. Headers = [X-Request-Id:"zbu5FgQG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10824. Content type = application/json
  10825. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678356}
  10826. Forwarded URL = null
  10827. Redirected URL = null
  10828. Cookies = []
  10829. 15:17:58.377 DEBUG [my-custom-id-123] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10830. 15:17:58.379 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10831. 15:17:58.379 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10832. 15:17:58.381 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10833. 15:17:58.382 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10834. 15:17:58.382 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10835. 15:17:58.384 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10836. 15:17:58.385 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10837. 15:17:58.385 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10838. 15:17:58.387 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10839. 15:17:58.388 DEBUG [my-custom-id-123] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 11ms
  10840. MockHttpServletRequest:
  10841. HTTP Method = GET
  10842. Request URI = /api/membership/levels
  10843. Parameters = {}
  10844. Headers = [X-Request-Id:"my-custom-id-123"]
  10845. Body = null
  10846. Session Attrs = {}
  10847. Handler:
  10848. Type = com.xuekairui.user.controller.MembershipController
  10849. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10850. Async:
  10851. Async started = false
  10852. Async result = null
  10853. Resolved Exception:
  10854. Type = null
  10855. ModelAndView:
  10856. View name = null
  10857. View = null
  10858. Model = null
  10859. FlashMap:
  10860. Attributes = null
  10861. MockHttpServletResponse:
  10862. Status = 200
  10863. Error message = null
  10864. Headers = [X-Request-Id:"my-custom-id-123", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10865. Content type = application/json
  10866. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678387}
  10867. Forwarded URL = null
  10868. Redirected URL = null
  10869. Cookies = []
  10870. 15:17:58.395 DEBUG [aZsjEREt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  10871. 15:17:58.396 WARN [aZsjEREt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
  10872. MockHttpServletRequest:
  10873. HTTP Method = GET
  10874. Request URI = /api/crawler/status
  10875. Parameters = {}
  10876. Headers = []
  10877. Body = null
  10878. Session Attrs = {}
  10879. Handler:
  10880. Type = null
  10881. Async:
  10882. Async started = false
  10883. Async result = null
  10884. Resolved Exception:
  10885. Type = null
  10886. ModelAndView:
  10887. View name = null
  10888. View = null
  10889. Model = null
  10890. FlashMap:
  10891. Attributes = null
  10892. MockHttpServletResponse:
  10893. Status = 401
  10894. Error message = null
  10895. Headers = [X-Request-Id:"aZsjEREt", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10896. Content type = application/json;charset=UTF-8
  10897. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976678395}
  10898. Forwarded URL = null
  10899. Redirected URL = null
  10900. Cookies = []
  10901. [INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.121 s -- in 请求日志过滤器
  10902. [INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.565 s -- in 网关过滤器测试
  10903. [INFO] Running 全局异常处理测试
  10904. 15:17:58.403 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest]: GlobalExceptionHandlerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  10905. 15:17:58.410 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest
  10906. [INFO] Running 边界场景
  10907. 15:18:01.631 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$EdgeCases]: EdgeCases does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  10908. 15:18:01.633 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$EdgeCases
  10909. 15:18:01.636 DEBUG [82LJjFHK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10910. 15:18:01.637 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10911. 15:18:01.637 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10912. 15:18:01.639 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10913. 15:18:01.640 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10914. 15:18:01.640 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10915. 15:18:01.641 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10916. 15:18:01.642 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10917. 15:18:01.642 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10918. 15:18:01.643 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10919. 15:18:01.643 DEBUG [82LJjFHK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 7ms
  10920. MockHttpServletRequest:
  10921. HTTP Method = GET
  10922. Request URI = /api/membership/levels
  10923. Parameters = {}
  10924. Headers = []
  10925. Body = null
  10926. Session Attrs = {}
  10927. Handler:
  10928. Type = com.xuekairui.user.controller.MembershipController
  10929. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10930. Async:
  10931. Async started = false
  10932. Async result = null
  10933. Resolved Exception:
  10934. Type = null
  10935. ModelAndView:
  10936. View name = null
  10937. View = null
  10938. Model = null
  10939. FlashMap:
  10940. Attributes = null
  10941. MockHttpServletResponse:
  10942. Status = 200
  10943. Error message = null
  10944. Headers = [X-Request-Id:"82LJjFHK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10945. Content type = application/json
  10946. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681643}
  10947. Forwarded URL = null
  10948. Redirected URL = null
  10949. Cookies = []
  10950. 15:18:01.644 DEBUG [a7ZFHHPP] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10951. 15:18:01.644 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10952. 15:18:01.644 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10953. 15:18:01.646 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10954. 15:18:01.647 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10955. 15:18:01.647 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10956. 15:18:01.648 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10957. 15:18:01.649 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10958. 15:18:01.649 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  10959. 15:18:01.650 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10960. 15:18:01.652 DEBUG [a7ZFHHPP] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
  10961. MockHttpServletRequest:
  10962. HTTP Method = GET
  10963. Request URI = /api/membership/levels
  10964. Parameters = {}
  10965. Headers = []
  10966. Body = null
  10967. Session Attrs = {}
  10968. Handler:
  10969. Type = com.xuekairui.user.controller.MembershipController
  10970. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  10971. Async:
  10972. Async started = false
  10973. Async result = null
  10974. Resolved Exception:
  10975. Type = null
  10976. ModelAndView:
  10977. View name = null
  10978. View = null
  10979. Model = null
  10980. FlashMap:
  10981. Attributes = null
  10982. MockHttpServletResponse:
  10983. Status = 200
  10984. Error message = null
  10985. Headers = [X-Request-Id:"a7ZFHHPP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  10986. Content type = application/json
  10987. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681651}
  10988. Forwarded URL = null
  10989. Redirected URL = null
  10990. Cookies = []
  10991. 15:18:01.652 DEBUG [eBQZCayY] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  10992. 15:18:01.652 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10993. 15:18:01.653 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  10994. 15:18:01.655 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  10995. 15:18:01.655 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10996. 15:18:01.655 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  10997. 15:18:01.657 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  10998. 15:18:01.657 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  10999. 15:18:01.657 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  11000. 15:18:01.659 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11001. 15:18:01.660 DEBUG [eBQZCayY] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
  11002. MockHttpServletRequest:
  11003. HTTP Method = GET
  11004. Request URI = /api/membership/levels
  11005. Parameters = {}
  11006. Headers = []
  11007. Body = null
  11008. Session Attrs = {}
  11009. Handler:
  11010. Type = com.xuekairui.user.controller.MembershipController
  11011. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  11012. Async:
  11013. Async started = false
  11014. Async result = null
  11015. Resolved Exception:
  11016. Type = null
  11017. ModelAndView:
  11018. View name = null
  11019. View = null
  11020. Model = null
  11021. FlashMap:
  11022. Attributes = null
  11023. MockHttpServletResponse:
  11024. Status = 200
  11025. Error message = null
  11026. Headers = [X-Request-Id:"eBQZCayY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11027. Content type = application/json
  11028. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681659}
  11029. Forwarded URL = null
  11030. Redirected URL = null
  11031. Cookies = []
  11032. 15:18:01.660 DEBUG [GLPKjQMh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  11033. 15:18:01.661 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11034. 15:18:01.661 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  11035. 15:18:01.663 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  11036. 15:18:01.663 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11037. 15:18:01.663 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  11038. 15:18:01.665 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11039. 15:18:01.666 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11040. 15:18:01.666 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  11041. 15:18:01.668 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11042. 15:18:01.668 DEBUG [GLPKjQMh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
  11043. MockHttpServletRequest:
  11044. HTTP Method = GET
  11045. Request URI = /api/membership/levels
  11046. Parameters = {}
  11047. Headers = []
  11048. Body = null
  11049. Session Attrs = {}
  11050. Handler:
  11051. Type = com.xuekairui.user.controller.MembershipController
  11052. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  11053. Async:
  11054. Async started = false
  11055. Async result = null
  11056. Resolved Exception:
  11057. Type = null
  11058. ModelAndView:
  11059. View name = null
  11060. View = null
  11061. Model = null
  11062. FlashMap:
  11063. Attributes = null
  11064. MockHttpServletResponse:
  11065. Status = 200
  11066. Error message = null
  11067. Headers = [X-Request-Id:"GLPKjQMh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11068. Content type = application/json
  11069. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681668}
  11070. Forwarded URL = null
  11071. Redirected URL = null
  11072. Cookies = []
  11073. 15:18:01.669 DEBUG [Z7q9PwEe] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  11074. 15:18:01.670 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11075. 15:18:01.670 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  11076. 15:18:01.672 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  11077. 15:18:01.672 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11078. 15:18:01.673 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  11079. 15:18:01.674 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11080. 15:18:01.675 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11081. 15:18:01.675 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  11082. 15:18:01.677 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11083. 15:18:01.677 DEBUG [Z7q9PwEe] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
  11084. MockHttpServletRequest:
  11085. HTTP Method = GET
  11086. Request URI = /api/membership/levels
  11087. Parameters = {}
  11088. Headers = []
  11089. Body = null
  11090. Session Attrs = {}
  11091. Handler:
  11092. Type = com.xuekairui.user.controller.MembershipController
  11093. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  11094. Async:
  11095. Async started = false
  11096. Async result = null
  11097. Resolved Exception:
  11098. Type = null
  11099. ModelAndView:
  11100. View name = null
  11101. View = null
  11102. Model = null
  11103. FlashMap:
  11104. Attributes = null
  11105. MockHttpServletResponse:
  11106. Status = 200
  11107. Error message = null
  11108. Headers = [X-Request-Id:"Z7q9PwEe", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11109. Content type = application/json
  11110. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681677}
  11111. Forwarded URL = null
  11112. Redirected URL = null
  11113. Cookies = []
  11114. 15:18:01.680 DEBUG [s8aKUJf7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TEST%2520CODE | IP: 127.0.0.1
  11115. 15:18:01.682 WARN [s8aKUJf7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TEST%2520CODE 400 2ms
  11116. MockHttpServletRequest:
  11117. HTTP Method = GET
  11118. Request URI = /api/invite/page/TEST%2520CODE
  11119. Parameters = {}
  11120. Headers = []
  11121. Body = null
  11122. Session Attrs = {}
  11123. Handler:
  11124. Type = null
  11125. Async:
  11126. Async started = false
  11127. Async result = null
  11128. Resolved Exception:
  11129. Type = null
  11130. ModelAndView:
  11131. View name = null
  11132. View = null
  11133. Model = null
  11134. FlashMap:
  11135. Attributes = null
  11136. MockHttpServletResponse:
  11137. Status = 400
  11138. Error message = null
  11139. Headers = [X-Request-Id:"s8aKUJf7"]
  11140. Content type = null
  11141. Body =
  11142. Forwarded URL = null
  11143. Redirected URL = null
  11144. Cookies = []
  11145. 15:18:01.686 DEBUG [UWStuhxT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | IP: 127.0.0.1
  11146. 15:18:01.688 DEBUG [UWStuhxT] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  11147. 15:18:01.688 DEBUG [UWStuhxT] [] [ main] c.x.i.m.I.selectList : ==> Parameters: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA(String)
  11148. 15:18:01.691 DEBUG [UWStuhxT] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  11149. 15:18:01.692 WARN [UWStuhxT] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  11150. 15:18:01.692 DEBUG [UWStuhxT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 200 6ms
  11151. MockHttpServletRequest:
  11152. HTTP Method = GET
  11153. Request URI = /api/invite/page/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  11154. Parameters = {}
  11155. Headers = []
  11156. Body = null
  11157. Session Attrs = {}
  11158. Handler:
  11159. Type = com.xuekairui.invite.controller.InviteController
  11160. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  11161. Async:
  11162. Async started = false
  11163. Async result = null
  11164. Resolved Exception:
  11165. Type = com.xuekairui.common.BusinessException
  11166. ModelAndView:
  11167. View name = null
  11168. View = null
  11169. Model = null
  11170. FlashMap:
  11171. Attributes = null
  11172. MockHttpServletResponse:
  11173. Status = 200
  11174. Error message = null
  11175. Headers = [X-Request-Id:"UWStuhxT", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11176. Content type = application/json
  11177. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976681692}
  11178. Forwarded URL = null
  11179. Redirected URL = null
  11180. Cookies = []
  11181. [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.064 s -- in 边界场景
  11182. [INFO] Running 统一响应格式
  11183. 15:18:01.696 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$ResponseFormat]: ResponseFormat does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  11184. 15:18:01.698 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$ResponseFormat
  11185. 15:18:01.702 DEBUG [gB2Dcbsq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  11186. 15:18:01.702 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11187. 15:18:01.703 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  11188. 15:18:01.705 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  11189. 15:18:01.706 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11190. 15:18:01.706 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  11191. 15:18:01.708 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11192. 15:18:01.709 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11193. 15:18:01.709 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  11194. 15:18:01.711 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11195. 15:18:01.712 DEBUG [gB2Dcbsq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
  11196. MockHttpServletRequest:
  11197. HTTP Method = GET
  11198. Request URI = /api/membership/levels
  11199. Parameters = {}
  11200. Headers = []
  11201. Body = null
  11202. Session Attrs = {}
  11203. Handler:
  11204. Type = com.xuekairui.user.controller.MembershipController
  11205. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  11206. Async:
  11207. Async started = false
  11208. Async result = null
  11209. Resolved Exception:
  11210. Type = null
  11211. ModelAndView:
  11212. View name = null
  11213. View = null
  11214. Model = null
  11215. FlashMap:
  11216. Attributes = null
  11217. MockHttpServletResponse:
  11218. Status = 200
  11219. Error message = null
  11220. Headers = [X-Request-Id:"gB2Dcbsq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11221. Content type = application/json
  11222. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681711}
  11223. Forwarded URL = null
  11224. Redirected URL = null
  11225. Cookies = []
  11226. 15:18:01.717 DEBUG [Q7mNc7h5] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  11227. 15:18:01.718 WARN [Q7mNc7h5] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号格式不正确, 场景不能为空
  11228. 15:18:01.719 WARN [Q7mNc7h5] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 2ms
  11229. MockHttpServletRequest:
  11230. HTTP Method = POST
  11231. Request URI = /api/auth/sms/send
  11232. Parameters = {}
  11233. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"13"]
  11234. Body = {"phone":"1"}
  11235. Session Attrs = {}
  11236. Handler:
  11237. Type = com.xuekairui.user.controller.AuthController
  11238. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  11239. Async:
  11240. Async started = false
  11241. Async result = null
  11242. Resolved Exception:
  11243. Type = org.springframework.web.bind.MethodArgumentNotValidException
  11244. ModelAndView:
  11245. View name = null
  11246. View = null
  11247. Model = null
  11248. FlashMap:
  11249. Attributes = null
  11250. MockHttpServletResponse:
  11251. Status = 400
  11252. Error message = null
  11253. Headers = [X-Request-Id:"Q7mNc7h5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11254. Content type = application/json
  11255. Body = {"code":400,"message":"手机号格式不正确, 场景不能为空","data":null,"timestamp":1782976681718}
  11256. Forwarded URL = null
  11257. Redirected URL = null
  11258. Cookies = []
  11259. 15:18:01.723 DEBUG [K3bgRYWJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  11260. 15:18:01.725 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11261. 15:18:01.725 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  11262. 15:18:01.726 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  11263. 15:18:01.728 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11264. 15:18:01.728 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  11265. 15:18:01.729 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11266. 15:18:01.730 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11267. 15:18:01.730 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  11268. 15:18:01.732 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11269. 15:18:01.733 DEBUG [K3bgRYWJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
  11270. MockHttpServletRequest:
  11271. HTTP Method = GET
  11272. Request URI = /api/membership/levels
  11273. Parameters = {}
  11274. Headers = []
  11275. Body = null
  11276. Session Attrs = {}
  11277. Handler:
  11278. Type = com.xuekairui.user.controller.MembershipController
  11279. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  11280. Async:
  11281. Async started = false
  11282. Async result = null
  11283. Resolved Exception:
  11284. Type = null
  11285. ModelAndView:
  11286. View name = null
  11287. View = null
  11288. Model = null
  11289. FlashMap:
  11290. Attributes = null
  11291. MockHttpServletResponse:
  11292. Status = 200
  11293. Error message = null
  11294. Headers = [X-Request-Id:"K3bgRYWJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11295. Content type = application/json
  11296. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681732}
  11297. Forwarded URL = null
  11298. Redirected URL = null
  11299. Cookies = []
  11300. 15:18:01.738 DEBUG [vu3EJJLj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  11301. 15:18:01.740 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11302. 15:18:01.740 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  11303. 15:18:01.741 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  11304. 15:18:01.743 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11305. 15:18:01.743 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  11306. 15:18:01.745 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11307. 15:18:01.745 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  11308. 15:18:01.746 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  11309. 15:18:01.748 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  11310. 15:18:01.749 DEBUG [vu3EJJLj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 11ms
  11311. MockHttpServletRequest:
  11312. HTTP Method = GET
  11313. Request URI = /api/membership/levels
  11314. Parameters = {}
  11315. Headers = []
  11316. Body = null
  11317. Session Attrs = {}
  11318. Handler:
  11319. Type = com.xuekairui.user.controller.MembershipController
  11320. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  11321. Async:
  11322. Async started = false
  11323. Async result = null
  11324. Resolved Exception:
  11325. Type = null
  11326. ModelAndView:
  11327. View name = null
  11328. View = null
  11329. Model = null
  11330. FlashMap:
  11331. Attributes = null
  11332. MockHttpServletResponse:
  11333. Status = 200
  11334. Error message = null
  11335. Headers = [X-Request-Id:"vu3EJJLj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11336. Content type = application/json
  11337. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681748}
  11338. Forwarded URL = null
  11339. Redirected URL = null
  11340. Cookies = []
  11341. [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.056 s -- in 统一响应格式
  11342. [INFO] Running 认证异常 (401)
  11343. 15:18:01.754 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$AuthenticationExceptions]: AuthenticationExceptions does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  11344. 15:18:01.756 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$AuthenticationExceptions
  11345. 15:18:01.760 DEBUG [jQ7YSutZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  11346. 15:18:01.761 WARN [jQ7YSutZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
  11347. MockHttpServletRequest:
  11348. HTTP Method = GET
  11349. Request URI = /api/crawler/status
  11350. Parameters = {}
  11351. Headers = []
  11352. Body = null
  11353. Session Attrs = {}
  11354. Handler:
  11355. Type = null
  11356. Async:
  11357. Async started = false
  11358. Async result = null
  11359. Resolved Exception:
  11360. Type = null
  11361. ModelAndView:
  11362. View name = null
  11363. View = null
  11364. Model = null
  11365. FlashMap:
  11366. Attributes = null
  11367. MockHttpServletResponse:
  11368. Status = 401
  11369. Error message = null
  11370. Headers = [X-Request-Id:"jQ7YSutZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11371. Content type = application/json;charset=UTF-8
  11372. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976681761}
  11373. Forwarded URL = null
  11374. Redirected URL = null
  11375. Cookies = []
  11376. 15:18:01.767 DEBUG [jGEGfMWX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  11377. 15:18:01.768 WARN [jGEGfMWX] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Malformed protected header JSON: Unable to deserialize: Unrecognized token 'i': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
  11378. at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
  11379. 15:18:01.768 WARN [jGEGfMWX] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析Token失败, 原因: Malformed protected header JSON: Unable to deserialize: Unrecognized token 'i': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
  11380. at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
  11381. 15:18:01.768 WARN [jGEGfMWX] [] [ main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
  11382. 15:18:01.769 WARN [jGEGfMWX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 2ms
  11383. MockHttpServletRequest:
  11384. HTTP Method = GET
  11385. Request URI = /api/crawler/status
  11386. Parameters = {}
  11387. Headers = [Authorization:"Bearer abc.def.ghi"]
  11388. Body = null
  11389. Session Attrs = {}
  11390. Handler:
  11391. Type = null
  11392. Async:
  11393. Async started = false
  11394. Async result = null
  11395. Resolved Exception:
  11396. Type = null
  11397. ModelAndView:
  11398. View name = null
  11399. View = null
  11400. Model = null
  11401. FlashMap:
  11402. Attributes = null
  11403. MockHttpServletResponse:
  11404. Status = 401
  11405. Error message = null
  11406. Headers = [X-Request-Id:"jGEGfMWX", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11407. Content type = application/json;charset=UTF-8
  11408. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976681769}
  11409. Forwarded URL = null
  11410. Redirected URL = null
  11411. Cookies = []
  11412. 15:18:01.775 DEBUG [BxNrnwCr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  11413. 15:18:01.777 WARN [BxNrnwCr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 2ms
  11414. MockHttpServletRequest:
  11415. HTTP Method = GET
  11416. Request URI = /api/crawler/status
  11417. Parameters = {}
  11418. Headers = []
  11419. Body = null
  11420. Session Attrs = {}
  11421. Handler:
  11422. Type = null
  11423. Async:
  11424. Async started = false
  11425. Async result = null
  11426. Resolved Exception:
  11427. Type = null
  11428. ModelAndView:
  11429. View name = null
  11430. View = null
  11431. Model = null
  11432. FlashMap:
  11433. Attributes = null
  11434. MockHttpServletResponse:
  11435. Status = 401
  11436. Error message = null
  11437. Headers = [X-Request-Id:"BxNrnwCr", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11438. Content type = application/json;charset=UTF-8
  11439. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976681776}
  11440. Forwarded URL = null
  11441. Redirected URL = null
  11442. Cookies = []
  11443. 15:18:01.781 DEBUG [DJRDjV5m] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  11444. 15:18:01.783 WARN [DJRDjV5m] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 2ms
  11445. MockHttpServletRequest:
  11446. HTTP Method = GET
  11447. Request URI = /api/crawler/status
  11448. Parameters = {}
  11449. Headers = [Authorization:"Basic dXNlcjpwYXNz"]
  11450. Body = null
  11451. Session Attrs = {}
  11452. Handler:
  11453. Type = null
  11454. Async:
  11455. Async started = false
  11456. Async result = null
  11457. Resolved Exception:
  11458. Type = null
  11459. ModelAndView:
  11460. View name = null
  11461. View = null
  11462. Model = null
  11463. FlashMap:
  11464. Attributes = null
  11465. MockHttpServletResponse:
  11466. Status = 401
  11467. Error message = null
  11468. Headers = [X-Request-Id:"DJRDjV5m", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11469. Content type = application/json;charset=UTF-8
  11470. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976681782}
  11471. Forwarded URL = null
  11472. Redirected URL = null
  11473. Cookies = []
  11474. [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.033 s -- in 认证异常 (401)
  11475. [INFO] Running 参数校验异常 (400)
  11476. 15:18:01.787 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$ValidationExceptions]: ValidationExceptions does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  11477. 15:18:01.790 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$ValidationExceptions
  11478. 15:18:01.797 DEBUG [xa6UhSuN] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  11479. 15:18:01.798 DEBUG [xa6UhSuN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  11480. 15:18:01.798 DEBUG [xa6UhSuN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  11481. 15:18:01.800 DEBUG [xa6UhSuN] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  11482. 15:18:01.801 WARN [xa6UhSuN] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
  11483. 15:18:01.803 WARN [xa6UhSuN] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 6ms
  11484. MockHttpServletRequest:
  11485. HTTP Method = POST
  11486. Request URI = /api/crawler/consume
  11487. Parameters = {}
  11488. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODEsImV4cCI6MTc4MzA2MzA4MX0.p0KvkGgRxGVtNrnhB_xgvB9NCZFBiuPuWl_POrChFlndlMFMbZLYrs_Zvqcm4pRQrnKd2ZJ0FvE7fJTv1VMlMA", Content-Length:"12"]
  11489. Body = {"count":-5}
  11490. Session Attrs = {}
  11491. Handler:
  11492. Type = com.xuekairui.user.controller.CrawlerController
  11493. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  11494. Async:
  11495. Async started = false
  11496. Async result = null
  11497. Resolved Exception:
  11498. Type = org.springframework.web.bind.MethodArgumentNotValidException
  11499. ModelAndView:
  11500. View name = null
  11501. View = null
  11502. Model = null
  11503. FlashMap:
  11504. Attributes = null
  11505. MockHttpServletResponse:
  11506. Status = 400
  11507. Error message = null
  11508. Headers = [X-Request-Id:"xa6UhSuN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11509. Content type = application/json
  11510. Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976681802}
  11511. Forwarded URL = null
  11512. Redirected URL = null
  11513. Cookies = []
  11514. 15:18:01.807 DEBUG [4CsxYX99] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  11515. 15:18:01.810 WARN [4CsxYX99] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号格式不正确, 场景不能为空
  11516. 15:18:01.811 WARN [4CsxYX99] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 4ms
  11517. MockHttpServletRequest:
  11518. HTTP Method = POST
  11519. Request URI = /api/auth/sms/send
  11520. Parameters = {}
  11521. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"15"]
  11522. Body = {"phone":"123"}
  11523. Session Attrs = {}
  11524. Handler:
  11525. Type = com.xuekairui.user.controller.AuthController
  11526. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  11527. Async:
  11528. Async started = false
  11529. Async result = null
  11530. Resolved Exception:
  11531. Type = org.springframework.web.bind.MethodArgumentNotValidException
  11532. ModelAndView:
  11533. View name = null
  11534. View = null
  11535. Model = null
  11536. FlashMap:
  11537. Attributes = null
  11538. MockHttpServletResponse:
  11539. Status = 400
  11540. Error message = null
  11541. Headers = [X-Request-Id:"4CsxYX99", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11542. Content type = application/json
  11543. Body = {"code":400,"message":"手机号格式不正确, 场景不能为空","data":null,"timestamp":1782976681810}
  11544. Forwarded URL = null
  11545. Redirected URL = null
  11546. Cookies = []
  11547. 15:18:01.818 DEBUG [RrFDkwJ5] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  11548. 15:18:01.819 DEBUG [RrFDkwJ5] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  11549. 15:18:01.819 DEBUG [RrFDkwJ5] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  11550. 15:18:01.822 DEBUG [RrFDkwJ5] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  11551. 15:18:01.824 ERROR [RrFDkwJ5] [1] [ main] c.x.h.GlobalExceptionHandler : 系统异常
  11552. org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'text/plain;charset=UTF-8' is not supported
  11553. at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:236)
  11554. at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:176)
  11555. at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:150)
  11556. at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
  11557. at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227)
  11558. at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181)
  11559. at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
  11560. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)
  11561. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)
  11562. at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
  11563. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
  11564. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
  11565. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
  11566. at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
  11567. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
  11568. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
  11569. at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
  11570. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
  11571. at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
  11572. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  11573. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
  11574. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  11575. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  11576. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
  11577. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
  11578. at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
  11579. at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
  11580. at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
  11581. at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
  11582. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
  11583. at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
  11584. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11585. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11586. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11587. at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
  11588. at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
  11589. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11590. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11591. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11592. at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
  11593. at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
  11594. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11595. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11596. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11597. at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
  11598. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11599. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11600. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11601. at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
  11602. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11603. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11604. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11605. at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
  11606. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11607. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11608. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11609. at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
  11610. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11611. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11612. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11613. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11614. at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
  11615. at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
  11616. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11617. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11618. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11619. at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
  11620. at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
  11621. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11622. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11623. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11624. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11625. at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
  11626. at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
  11627. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11628. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11629. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11630. at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
  11631. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11632. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11633. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  11634. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11635. at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
  11636. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11637. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  11638. at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
  11639. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
  11640. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  11641. at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
  11642. at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
  11643. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  11644. at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
  11645. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  11646. at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
  11647. at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
  11648. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  11649. at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
  11650. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  11651. at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
  11652. at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
  11653. at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
  11654. at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
  11655. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  11656. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  11657. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
  11658. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11659. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  11660. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  11661. at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
  11662. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11663. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  11664. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  11665. at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
  11666. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11667. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  11668. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  11669. at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
  11670. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11671. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  11672. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  11673. at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
  11674. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11675. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  11676. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  11677. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
  11678. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  11679. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  11680. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  11681. at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
  11682. at com.xuekairui.gateway.GlobalExceptionHandlerTest$ValidationExceptions.wrongContentType_shouldReturnError(GlobalExceptionHandlerTest.java:70)
  11683. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  11684. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  11685. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  11686. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  11687. at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
  11688. at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
  11689. at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
  11690. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
  11691. at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
  11692. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
  11693. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
  11694. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
  11695. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
  11696. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
  11697. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
  11698. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
  11699. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
  11700. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
  11701. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
  11702. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
  11703. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  11704. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
  11705. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
  11706. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
  11707. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
  11708. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  11709. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  11710. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  11711. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  11712. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  11713. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  11714. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  11715. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  11716. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  11717. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  11718. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  11719. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  11720. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  11721. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  11722. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  11723. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  11724. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  11725. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  11726. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  11727. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  11728. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  11729. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  11730. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  11731. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  11732. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  11733. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  11734. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  11735. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  11736. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  11737. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  11738. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  11739. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  11740. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  11741. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  11742. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  11743. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  11744. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  11745. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
  11746. at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
  11747. at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
  11748. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
  11749. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
  11750. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
  11751. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
  11752. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
  11753. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
  11754. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
  11755. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
  11756. at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
  11757. at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
  11758. at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
  11759. at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
  11760. at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
  11761. at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
  11762. at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
  11763. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
  11764. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
  11765. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
  11766. at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
  11767. at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
  11768. at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
  11769. at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
  11770. 15:18:01.829 WARN [RrFDkwJ5] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 500 11ms
  11771. MockHttpServletRequest:
  11772. HTTP Method = POST
  11773. Request URI = /api/crawler/consume
  11774. Parameters = {}
  11775. Headers = [Content-Type:"text/plain;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODEsImV4cCI6MTc4MzA2MzA4MX0.p0KvkGgRxGVtNrnhB_xgvB9NCZFBiuPuWl_POrChFlndlMFMbZLYrs_Zvqcm4pRQrnKd2ZJ0FvE7fJTv1VMlMA", Content-Length:"8"]
  11776. Body = not json
  11777. Session Attrs = {}
  11778. Handler:
  11779. Type = com.xuekairui.user.controller.CrawlerController
  11780. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  11781. Async:
  11782. Async started = false
  11783. Async result = null
  11784. Resolved Exception:
  11785. Type = org.springframework.web.HttpMediaTypeNotSupportedException
  11786. ModelAndView:
  11787. View name = null
  11788. View = null
  11789. Model = null
  11790. FlashMap:
  11791. Attributes = null
  11792. MockHttpServletResponse:
  11793. Status = 500
  11794. Error message = null
  11795. Headers = [X-Request-Id:"RrFDkwJ5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11796. Content type = application/json
  11797. Body = {"code":500,"message":"系统繁忙,请稍后重试","data":null,"timestamp":1782976681827}
  11798. Forwarded URL = null
  11799. Redirected URL = null
  11800. Cookies = []
  11801. 15:18:01.836 DEBUG [qMHSGzTE] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  11802. 15:18:01.837 DEBUG [qMHSGzTE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  11803. 15:18:01.837 DEBUG [qMHSGzTE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  11804. 15:18:01.839 DEBUG [qMHSGzTE] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  11805. 15:18:01.841 WARN [qMHSGzTE] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
  11806. 15:18:01.841 WARN [qMHSGzTE] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 5ms
  11807. MockHttpServletRequest:
  11808. HTTP Method = POST
  11809. Request URI = /api/crawler/consume
  11810. Parameters = {}
  11811. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODEsImV4cCI6MTc4MzA2MzA4MX0.p0KvkGgRxGVtNrnhB_xgvB9NCZFBiuPuWl_POrChFlndlMFMbZLYrs_Zvqcm4pRQrnKd2ZJ0FvE7fJTv1VMlMA", Content-Length:"11"]
  11812. Body = {"count":0}
  11813. Session Attrs = {}
  11814. Handler:
  11815. Type = com.xuekairui.user.controller.CrawlerController
  11816. Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
  11817. Async:
  11818. Async started = false
  11819. Async result = null
  11820. Resolved Exception:
  11821. Type = org.springframework.web.bind.MethodArgumentNotValidException
  11822. ModelAndView:
  11823. View name = null
  11824. View = null
  11825. Model = null
  11826. FlashMap:
  11827. Attributes = null
  11828. MockHttpServletResponse:
  11829. Status = 400
  11830. Error message = null
  11831. Headers = [X-Request-Id:"qMHSGzTE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11832. Content type = application/json
  11833. Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976681841}
  11834. Forwarded URL = null
  11835. Redirected URL = null
  11836. Cookies = []
  11837. 15:18:01.845 DEBUG [6zhpy9Xw] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  11838. 15:18:01.847 WARN [6zhpy9Xw] [] [ main] c.x.h.GlobalExceptionHandler : 请求体解析失败: JSON parse error: Unexpected character ('n' (code 110)): was expecting double-quote to start field name
  11839. 15:18:01.847 WARN [6zhpy9Xw] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 2ms
  11840. MockHttpServletRequest:
  11841. HTTP Method = POST
  11842. Request URI = /api/auth/sms/send
  11843. Parameters = {}
  11844. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"16"]
  11845. Body = {not valid json}
  11846. Session Attrs = {}
  11847. Handler:
  11848. Type = com.xuekairui.user.controller.AuthController
  11849. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  11850. Async:
  11851. Async started = false
  11852. Async result = null
  11853. Resolved Exception:
  11854. Type = org.springframework.http.converter.HttpMessageNotReadableException
  11855. ModelAndView:
  11856. View name = null
  11857. View = null
  11858. Model = null
  11859. FlashMap:
  11860. Attributes = null
  11861. MockHttpServletResponse:
  11862. Status = 400
  11863. Error message = null
  11864. Headers = [X-Request-Id:"6zhpy9Xw", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11865. Content type = application/json
  11866. Body = {"code":400,"message":"请求体格式错误","data":null,"timestamp":1782976681847}
  11867. Forwarded URL = null
  11868. Redirected URL = null
  11869. Cookies = []
  11870. [INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.064 s -- in 参数校验异常 (400)
  11871. [INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.450 s -- in 全局异常处理测试
  11872. [INFO] Running 邀请系统接口测试
  11873. 15:18:01.853 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.InviteControllerTest]: InviteControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  11874. 15:18:01.855 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.InviteControllerTest
  11875. 15:18:04.878 DEBUG [t8jxGE82] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
  11876. 15:18:04.879 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  11877. 15:18:04.879 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  11878. 15:18:04.881 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  11879. 15:18:04.882 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  11880. 15:18:04.882 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.882059(LocalDateTime)
  11881. 15:18:04.884 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  11882. 15:18:04.884 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  11883. 15:18:04.884 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  11884. 15:18:04.886 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  11885. 15:18:04.886 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
  11886. 15:18:04.886 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 4FQ2CNX5(String)
  11887. 15:18:04.888 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
  11888. 15:18:04.888 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  11889. 15:18:04.888 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 1(Long), 4FQ2CNX5(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:18:04.886075800(LocalDateTime), 1(Integer), 2026-07-02T15:18:04.888180200(LocalDateTime), 2026-07-02T15:18:04.888180200(LocalDateTime)
  11890. 15:18:04.892 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
  11891. 15:18:04.892 INFO [t8jxGE82] [1] [ main] c.x.i.service.InviteService : 用户 1 创建邀请码: 4FQ2CNX5
  11892. 15:18:04.892 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  11893. 15:18:04.892 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  11894. 15:18:04.894 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  11895. 15:18:04.895 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  11896. 15:18:04.895 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  11897. 15:18:04.896 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  11898. 15:18:04.897 DEBUG [t8jxGE82] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 19ms
  11899. MockHttpServletRequest:
  11900. HTTP Method = GET
  11901. Request URI = /api/invite/code
  11902. Parameters = {}
  11903. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
  11904. Body = null
  11905. Session Attrs = {}
  11906. Handler:
  11907. Type = com.xuekairui.invite.controller.InviteController
  11908. Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
  11909. Async:
  11910. Async started = false
  11911. Async result = null
  11912. Resolved Exception:
  11913. Type = null
  11914. ModelAndView:
  11915. View name = null
  11916. View = null
  11917. Model = null
  11918. FlashMap:
  11919. Attributes = null
  11920. MockHttpServletResponse:
  11921. Status = 200
  11922. Error message = null
  11923. Headers = [X-Request-Id:"t8jxGE82", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11924. Content type = application/json
  11925. Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:04","status":1,"createTime":"2026-07-02 15:18:04","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976684896}
  11926. Forwarded URL = null
  11927. Redirected URL = null
  11928. Cookies = []
  11929. 15:18:04.900 DEBUG [DXtQgWnK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
  11930. 15:18:04.902 WARN [DXtQgWnK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 401 2ms
  11931. MockHttpServletRequest:
  11932. HTTP Method = GET
  11933. Request URI = /api/invite/code
  11934. Parameters = {}
  11935. Headers = []
  11936. Body = null
  11937. Session Attrs = {}
  11938. Handler:
  11939. Type = null
  11940. Async:
  11941. Async started = false
  11942. Async result = null
  11943. Resolved Exception:
  11944. Type = null
  11945. ModelAndView:
  11946. View name = null
  11947. View = null
  11948. Model = null
  11949. FlashMap:
  11950. Attributes = null
  11951. MockHttpServletResponse:
  11952. Status = 401
  11953. Error message = null
  11954. Headers = [X-Request-Id:"DXtQgWnK", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11955. Content type = application/json;charset=UTF-8
  11956. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976684901}
  11957. Forwarded URL = null
  11958. Redirected URL = null
  11959. Cookies = []
  11960. 15:18:04.907 DEBUG [ms7qEhtr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
  11961. 15:18:04.908 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  11962. 15:18:04.908 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  11963. 15:18:04.910 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  11964. 15:18:04.911 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  11965. 15:18:04.911 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.910778700(LocalDateTime)
  11966. 15:18:04.913 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  11967. 15:18:04.913 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  11968. 15:18:04.913 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  11969. 15:18:04.915 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  11970. 15:18:04.915 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  11971. 15:18:04.915 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  11972. 15:18:04.917 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  11973. 15:18:04.917 DEBUG [ms7qEhtr] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 10ms
  11974. MockHttpServletRequest:
  11975. HTTP Method = GET
  11976. Request URI = /api/invite/code
  11977. Parameters = {}
  11978. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
  11979. Body = null
  11980. Session Attrs = {}
  11981. Handler:
  11982. Type = com.xuekairui.invite.controller.InviteController
  11983. Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
  11984. Async:
  11985. Async started = false
  11986. Async result = null
  11987. Resolved Exception:
  11988. Type = null
  11989. ModelAndView:
  11990. View name = null
  11991. View = null
  11992. Model = null
  11993. FlashMap:
  11994. Attributes = null
  11995. MockHttpServletResponse:
  11996. Status = 200
  11997. Error message = null
  11998. Headers = [X-Request-Id:"ms7qEhtr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  11999. Content type = application/json
  12000. Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:05","status":1,"createTime":"2026-07-02 15:18:05","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976684917}
  12001. Forwarded URL = null
  12002. Redirected URL = null
  12003. Cookies = []
  12004. 15:18:04.918 DEBUG [vFjG7xL6] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
  12005. 15:18:04.919 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  12006. 15:18:04.919 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.919419900(LocalDateTime)
  12007. 15:18:04.922 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12008. 15:18:04.922 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  12009. 15:18:04.922 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  12010. 15:18:04.923 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12011. 15:18:04.923 DEBUG [vFjG7xL6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12012. 15:18:04.923 DEBUG [vFjG7xL6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12013. 15:18:04.924 DEBUG [vFjG7xL6] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12014. 15:18:04.925 DEBUG [vFjG7xL6] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 7ms
  12015. MockHttpServletRequest:
  12016. HTTP Method = GET
  12017. Request URI = /api/invite/code
  12018. Parameters = {}
  12019. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
  12020. Body = null
  12021. Session Attrs = {}
  12022. Handler:
  12023. Type = com.xuekairui.invite.controller.InviteController
  12024. Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
  12025. Async:
  12026. Async started = false
  12027. Async result = null
  12028. Resolved Exception:
  12029. Type = null
  12030. ModelAndView:
  12031. View name = null
  12032. View = null
  12033. Model = null
  12034. FlashMap:
  12035. Attributes = null
  12036. MockHttpServletResponse:
  12037. Status = 200
  12038. Error message = null
  12039. Headers = [X-Request-Id:"vFjG7xL6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12040. Content type = application/json
  12041. Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:05","status":1,"createTime":"2026-07-02 15:18:05","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976684925}
  12042. Forwarded URL = null
  12043. Redirected URL = null
  12044. Cookies = []
  12045. 15:18:04.932 DEBUG [aHfVySED] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
  12046. 15:18:04.933 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12047. 15:18:04.933 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12048. 15:18:04.935 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12049. 15:18:04.935 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  12050. 15:18:04.935 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  12051. 15:18:04.937 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12052. 15:18:04.937 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  12053. 15:18:04.938 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.937288900(LocalDateTime)
  12054. 15:18:04.939 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12055. 15:18:04.939 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  12056. 15:18:04.940 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  12057. 15:18:04.941 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12058. 15:18:04.941 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12059. 15:18:04.941 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12060. 15:18:04.943 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12061. 15:18:04.943 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
  12062. 15:18:04.943 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
  12063. 15:18:04.945 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  12064. 15:18:04.946 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
  12065. 15:18:04.946 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
  12066. 15:18:04.948 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
  12067. 15:18:04.948 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12068. 15:18:04.948 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12069. 15:18:04.950 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12070. 15:18:04.950 DEBUG [aHfVySED] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  12071. 15:18:04.950 DEBUG [aHfVySED] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  12072. 15:18:04.952 DEBUG [aHfVySED] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  12073. 15:18:04.953 DEBUG [aHfVySED] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  12074. 15:18:04.953 DEBUG [aHfVySED] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  12075. 15:18:04.954 DEBUG [aHfVySED] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  12076. 15:18:04.955 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  12077. 15:18:04.955 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  12078. 15:18:04.957 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  12079. 15:18:04.957 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  12080. 15:18:04.958 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  12081. 15:18:04.959 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  12082. 15:18:04.960 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  12083. 15:18:04.960 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  12084. 15:18:04.961 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  12085. 15:18:04.961 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  12086. 15:18:04.961 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  12087. 15:18:04.963 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  12088. 15:18:04.964 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  12089. 15:18:04.964 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  12090. 15:18:04.965 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  12091. 15:18:04.965 DEBUG [aHfVySED] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  12092. 15:18:04.966 DEBUG [aHfVySED] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  12093. 15:18:04.966 DEBUG [aHfVySED] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  12094. 15:18:04.967 DEBUG [aHfVySED] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 200 35ms
  12095. MockHttpServletRequest:
  12096. HTTP Method = GET
  12097. Request URI = /api/invite/stats
  12098. Parameters = {}
  12099. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
  12100. Body = null
  12101. Session Attrs = {}
  12102. Handler:
  12103. Type = com.xuekairui.invite.controller.InviteController
  12104. Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)
  12105. Async:
  12106. Async started = false
  12107. Async result = null
  12108. Resolved Exception:
  12109. Type = null
  12110. ModelAndView:
  12111. View name = null
  12112. View = null
  12113. Model = null
  12114. FlashMap:
  12115. Attributes = null
  12116. MockHttpServletResponse:
  12117. Status = 200
  12118. Error message = null
  12119. Headers = [X-Request-Id:"aHfVySED", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12120. Content type = application/json
  12121. Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","clickedCount":0,"totalInvited":0,"registeredCount":0,"totalReward":0,"summaryText":"已邀请0家药店,0家注册,累计获得0个月高级会员","todayInvited":0,"todayRemaining":10,"rewardPerInvite":1,"crawlerTodayRemaining":10,"crawlerQuotaFromInvites":0},"timestamp":1782976684967}
  12122. Forwarded URL = null
  12123. Redirected URL = null
  12124. Cookies = []
  12125. 15:18:04.973 DEBUG [aSqdxCzJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
  12126. 15:18:04.974 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12127. 15:18:04.974 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12128. 15:18:04.977 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12129. 15:18:04.978 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  12130. 15:18:04.978 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  12131. 15:18:04.979 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12132. 15:18:04.980 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  12133. 15:18:04.981 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.980207700(LocalDateTime)
  12134. 15:18:04.982 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12135. 15:18:04.982 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  12136. 15:18:04.983 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  12137. 15:18:04.984 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12138. 15:18:04.985 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12139. 15:18:04.985 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12140. 15:18:04.986 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12141. 15:18:04.986 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
  12142. 15:18:04.987 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
  12143. 15:18:04.988 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  12144. 15:18:04.988 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
  12145. 15:18:04.988 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
  12146. 15:18:04.992 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
  12147. 15:18:04.992 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12148. 15:18:04.992 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12149. 15:18:04.994 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12150. 15:18:04.994 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  12151. 15:18:04.994 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  12152. 15:18:04.996 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  12153. 15:18:04.996 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  12154. 15:18:04.997 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  12155. 15:18:04.998 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  12156. 15:18:04.998 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  12157. 15:18:04.998 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  12158. 15:18:04.999 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  12159. 15:18:04.999 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  12160. 15:18:04.999 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  12161. 15:18:05.001 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  12162. 15:18:05.001 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  12163. 15:18:05.001 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  12164. 15:18:05.002 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  12165. 15:18:05.003 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  12166. 15:18:05.003 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  12167. 15:18:05.004 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  12168. 15:18:05.004 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  12169. 15:18:05.004 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  12170. 15:18:05.006 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  12171. 15:18:05.006 DEBUG [aSqdxCzJ] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  12172. 15:18:05.006 DEBUG [aSqdxCzJ] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  12173. 15:18:05.007 DEBUG [aSqdxCzJ] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  12174. 15:18:05.008 DEBUG [aSqdxCzJ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 200 35ms
  12175. MockHttpServletRequest:
  12176. HTTP Method = GET
  12177. Request URI = /api/invite/stats
  12178. Parameters = {}
  12179. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
  12180. Body = null
  12181. Session Attrs = {}
  12182. Handler:
  12183. Type = com.xuekairui.invite.controller.InviteController
  12184. Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)
  12185. Async:
  12186. Async started = false
  12187. Async result = null
  12188. Resolved Exception:
  12189. Type = null
  12190. ModelAndView:
  12191. View name = null
  12192. View = null
  12193. Model = null
  12194. FlashMap:
  12195. Attributes = null
  12196. MockHttpServletResponse:
  12197. Status = 200
  12198. Error message = null
  12199. Headers = [X-Request-Id:"aSqdxCzJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12200. Content type = application/json
  12201. Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","clickedCount":0,"totalInvited":0,"registeredCount":0,"totalReward":0,"summaryText":"已邀请0家药店,0家注册,累计获得0个月高级会员","todayInvited":0,"todayRemaining":10,"rewardPerInvite":1,"crawlerTodayRemaining":10,"crawlerQuotaFromInvites":0},"timestamp":1782976685007}
  12202. Forwarded URL = null
  12203. Redirected URL = null
  12204. Cookies = []
  12205. 15:18:05.012 DEBUG [wuvWHYfQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
  12206. 15:18:05.013 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12207. 15:18:05.013 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12208. 15:18:05.015 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12209. 15:18:05.015 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  12210. 15:18:05.015 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  12211. 15:18:05.016 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12212. 15:18:05.017 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  12213. 15:18:05.017 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:05.016598900(LocalDateTime)
  12214. 15:18:05.018 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12215. 15:18:05.018 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  12216. 15:18:05.018 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  12217. 15:18:05.019 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12218. 15:18:05.020 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12219. 15:18:05.020 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12220. 15:18:05.021 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12221. 15:18:05.022 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
  12222. 15:18:05.022 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
  12223. 15:18:05.024 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  12224. 15:18:05.024 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
  12225. 15:18:05.024 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
  12226. 15:18:05.025 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
  12227. 15:18:05.026 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12228. 15:18:05.026 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12229. 15:18:05.027 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12230. 15:18:05.027 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  12231. 15:18:05.027 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  12232. 15:18:05.028 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  12233. 15:18:05.029 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  12234. 15:18:05.029 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  12235. 15:18:05.031 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  12236. 15:18:05.031 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  12237. 15:18:05.031 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  12238. 15:18:05.032 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  12239. 15:18:05.032 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  12240. 15:18:05.033 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  12241. 15:18:05.034 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  12242. 15:18:05.034 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  12243. 15:18:05.034 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  12244. 15:18:05.035 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  12245. 15:18:05.035 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  12246. 15:18:05.035 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  12247. 15:18:05.037 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  12248. 15:18:05.037 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  12249. 15:18:05.037 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  12250. 15:18:05.039 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  12251. 15:18:05.039 DEBUG [wuvWHYfQ] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  12252. 15:18:05.039 DEBUG [wuvWHYfQ] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  12253. 15:18:05.040 DEBUG [wuvWHYfQ] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  12254. 15:18:05.041 DEBUG [wuvWHYfQ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 200 29ms
  12255. MockHttpServletRequest:
  12256. HTTP Method = GET
  12257. Request URI = /api/invite/stats
  12258. Parameters = {}
  12259. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
  12260. Body = null
  12261. Session Attrs = {}
  12262. Handler:
  12263. Type = com.xuekairui.invite.controller.InviteController
  12264. Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)
  12265. Async:
  12266. Async started = false
  12267. Async result = null
  12268. Resolved Exception:
  12269. Type = null
  12270. ModelAndView:
  12271. View name = null
  12272. View = null
  12273. Model = null
  12274. FlashMap:
  12275. Attributes = null
  12276. MockHttpServletResponse:
  12277. Status = 200
  12278. Error message = null
  12279. Headers = [X-Request-Id:"wuvWHYfQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12280. Content type = application/json
  12281. Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","clickedCount":0,"totalInvited":0,"registeredCount":0,"totalReward":0,"summaryText":"已邀请0家药店,0家注册,累计获得0个月高级会员","todayInvited":0,"todayRemaining":10,"rewardPerInvite":1,"crawlerTodayRemaining":10,"crawlerQuotaFromInvites":0},"timestamp":1782976685040}
  12282. Forwarded URL = null
  12283. Redirected URL = null
  12284. Cookies = []
  12285. 15:18:05.043 DEBUG [cFhkQmtd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
  12286. 15:18:05.044 WARN [cFhkQmtd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 401 1ms
  12287. MockHttpServletRequest:
  12288. HTTP Method = GET
  12289. Request URI = /api/invite/stats
  12290. Parameters = {}
  12291. Headers = []
  12292. Body = null
  12293. Session Attrs = {}
  12294. Handler:
  12295. Type = null
  12296. Async:
  12297. Async started = false
  12298. Async result = null
  12299. Resolved Exception:
  12300. Type = null
  12301. ModelAndView:
  12302. View name = null
  12303. View = null
  12304. Model = null
  12305. FlashMap:
  12306. Attributes = null
  12307. MockHttpServletResponse:
  12308. Status = 401
  12309. Error message = null
  12310. Headers = [X-Request-Id:"cFhkQmtd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12311. Content type = application/json;charset=UTF-8
  12312. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976685044}
  12313. Forwarded URL = null
  12314. Redirected URL = null
  12315. Cookies = []
  12316. 15:18:05.049 DEBUG [UTU9jLeP] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards | IP: 127.0.0.1
  12317. 15:18:05.050 DEBUG [UTU9jLeP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12318. 15:18:05.051 DEBUG [UTU9jLeP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12319. 15:18:05.052 DEBUG [UTU9jLeP] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12320. 15:18:05.053 DEBUG [UTU9jLeP] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?) ORDER BY create_time DESC
  12321. 15:18:05.053 DEBUG [UTU9jLeP] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
  12322. 15:18:05.055 DEBUG [UTU9jLeP] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
  12323. 15:18:05.055 DEBUG [UTU9jLeP] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards 200 6ms
  12324. MockHttpServletRequest:
  12325. HTTP Method = GET
  12326. Request URI = /api/invite/rewards
  12327. Parameters = {}
  12328. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
  12329. Body = null
  12330. Session Attrs = {}
  12331. Handler:
  12332. Type = com.xuekairui.invite.controller.InviteController
  12333. Method = com.xuekairui.invite.controller.InviteController#getInviteRewards(HttpServletRequest)
  12334. Async:
  12335. Async started = false
  12336. Async result = null
  12337. Resolved Exception:
  12338. Type = null
  12339. ModelAndView:
  12340. View name = null
  12341. View = null
  12342. Model = null
  12343. FlashMap:
  12344. Attributes = null
  12345. MockHttpServletResponse:
  12346. Status = 200
  12347. Error message = null
  12348. Headers = [X-Request-Id:"UTU9jLeP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12349. Content type = application/json
  12350. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976685055}
  12351. Forwarded URL = null
  12352. Redirected URL = null
  12353. Cookies = []
  12354. 15:18:05.058 DEBUG [qzX5myJd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards | IP: 127.0.0.1
  12355. 15:18:05.060 WARN [qzX5myJd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards 401 2ms
  12356. MockHttpServletRequest:
  12357. HTTP Method = GET
  12358. Request URI = /api/invite/rewards
  12359. Parameters = {}
  12360. Headers = []
  12361. Body = null
  12362. Session Attrs = {}
  12363. Handler:
  12364. Type = null
  12365. Async:
  12366. Async started = false
  12367. Async result = null
  12368. Resolved Exception:
  12369. Type = null
  12370. ModelAndView:
  12371. View name = null
  12372. View = null
  12373. Model = null
  12374. FlashMap:
  12375. Attributes = null
  12376. MockHttpServletResponse:
  12377. Status = 401
  12378. Error message = null
  12379. Headers = [X-Request-Id:"qzX5myJd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12380. Content type = application/json;charset=UTF-8
  12381. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976685059}
  12382. Forwarded URL = null
  12383. Redirected URL = null
  12384. Cookies = []
  12385. 15:18:05.064 DEBUG [3fdgvuUH] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota | IP: 127.0.0.1
  12386. 15:18:05.065 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12387. 15:18:05.065 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12388. 15:18:05.067 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12389. 15:18:05.068 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  12390. 15:18:05.068 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  12391. 15:18:05.069 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  12392. 15:18:05.070 DEBUG [3fdgvuUH] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota 200 6ms
  12393. MockHttpServletRequest:
  12394. HTTP Method = GET
  12395. Request URI = /api/invite/extra-quota
  12396. Parameters = {}
  12397. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
  12398. Body = null
  12399. Session Attrs = {}
  12400. Handler:
  12401. Type = com.xuekairui.invite.controller.InviteController
  12402. Method = com.xuekairui.invite.controller.InviteController#getExtraQuota(HttpServletRequest)
  12403. Async:
  12404. Async started = false
  12405. Async result = null
  12406. Resolved Exception:
  12407. Type = null
  12408. ModelAndView:
  12409. View name = null
  12410. View = null
  12411. Model = null
  12412. FlashMap:
  12413. Attributes = null
  12414. MockHttpServletResponse:
  12415. Status = 200
  12416. Error message = null
  12417. Headers = [X-Request-Id:"3fdgvuUH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12418. Content type = application/json
  12419. Body = {"code":200,"message":"操作成功","data":0,"timestamp":1782976685070}
  12420. Forwarded URL = null
  12421. Redirected URL = null
  12422. Cookies = []
  12423. 15:18:05.073 DEBUG [MpSvnntL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota | IP: 127.0.0.1
  12424. 15:18:05.075 WARN [MpSvnntL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota 401 2ms
  12425. MockHttpServletRequest:
  12426. HTTP Method = GET
  12427. Request URI = /api/invite/extra-quota
  12428. Parameters = {}
  12429. Headers = []
  12430. Body = null
  12431. Session Attrs = {}
  12432. Handler:
  12433. Type = null
  12434. Async:
  12435. Async started = false
  12436. Async result = null
  12437. Resolved Exception:
  12438. Type = null
  12439. ModelAndView:
  12440. View name = null
  12441. View = null
  12442. Model = null
  12443. FlashMap:
  12444. Attributes = null
  12445. MockHttpServletResponse:
  12446. Status = 401
  12447. Error message = null
  12448. Headers = [X-Request-Id:"MpSvnntL", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12449. Content type = application/json;charset=UTF-8
  12450. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976685074}
  12451. Forwarded URL = null
  12452. Redirected URL = null
  12453. Cookies = []
  12454. 15:18:05.079 DEBUG [ejHN52Wp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
  12455. 15:18:05.080 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12456. 15:18:05.080 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12457. 15:18:05.082 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12458. 15:18:05.085 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  12459. 15:18:05.085 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:05.084993800(LocalDateTime)
  12460. 15:18:05.087 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12461. 15:18:05.088 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  12462. 15:18:05.088 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
  12463. 15:18:05.089 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
  12464. 15:18:05.089 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12465. 15:18:05.089 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12466. 15:18:05.090 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12467. 15:18:05.091 DEBUG [ejHN52Wp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 12ms
  12468. MockHttpServletRequest:
  12469. HTTP Method = GET
  12470. Request URI = /api/invite/code
  12471. Parameters = {}
  12472. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
  12473. Body = null
  12474. Session Attrs = {}
  12475. Handler:
  12476. Type = com.xuekairui.invite.controller.InviteController
  12477. Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
  12478. Async:
  12479. Async started = false
  12480. Async result = null
  12481. Resolved Exception:
  12482. Type = null
  12483. ModelAndView:
  12484. View name = null
  12485. View = null
  12486. Model = null
  12487. FlashMap:
  12488. Attributes = null
  12489. MockHttpServletResponse:
  12490. Status = 200
  12491. Error message = null
  12492. Headers = [X-Request-Id:"ejHN52Wp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12493. Content type = application/json
  12494. Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:05","status":1,"createTime":"2026-07-02 15:18:05","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976685090}
  12495. Forwarded URL = null
  12496. Redirected URL = null
  12497. Cookies = []
  12498. 15:18:05.091 DEBUG [X38wc5Ah] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE | IP: 127.0.0.1
  12499. 15:18:05.092 DEBUG [X38wc5Ah] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12500. 15:18:05.092 DEBUG [X38wc5Ah] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  12501. 15:18:05.093 DEBUG [X38wc5Ah] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12502. 15:18:05.094 WARN [X38wc5Ah] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  12503. 15:18:05.095 DEBUG [X38wc5Ah] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE 200 4ms
  12504. MockHttpServletRequest:
  12505. HTTP Method = GET
  12506. Request URI = /api/invite/page/TESTCODE
  12507. Parameters = {}
  12508. Headers = []
  12509. Body = null
  12510. Session Attrs = {}
  12511. Handler:
  12512. Type = com.xuekairui.invite.controller.InviteController
  12513. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  12514. Async:
  12515. Async started = false
  12516. Async result = null
  12517. Resolved Exception:
  12518. Type = com.xuekairui.common.BusinessException
  12519. ModelAndView:
  12520. View name = null
  12521. View = null
  12522. Model = null
  12523. FlashMap:
  12524. Attributes = null
  12525. MockHttpServletResponse:
  12526. Status = 200
  12527. Error message = null
  12528. Headers = [X-Request-Id:"X38wc5Ah", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12529. Content type = application/json
  12530. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685094}
  12531. Forwarded URL = null
  12532. Redirected URL = null
  12533. Cookies = []
  12534. 15:18:05.097 DEBUG [VnCUn4vv] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=app | IP: 127.0.0.1
  12535. 15:18:05.099 DEBUG [VnCUn4vv] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12536. 15:18:05.099 DEBUG [VnCUn4vv] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  12537. 15:18:05.100 DEBUG [VnCUn4vv] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12538. 15:18:05.100 WARN [VnCUn4vv] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  12539. 15:18:05.101 DEBUG [VnCUn4vv] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=app 200 4ms
  12540. MockHttpServletRequest:
  12541. HTTP Method = GET
  12542. Request URI = /api/invite/page/TESTCODE
  12543. Parameters = {channel=[app]}
  12544. Headers = []
  12545. Body = null
  12546. Session Attrs = {}
  12547. Handler:
  12548. Type = com.xuekairui.invite.controller.InviteController
  12549. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  12550. Async:
  12551. Async started = false
  12552. Async result = null
  12553. Resolved Exception:
  12554. Type = com.xuekairui.common.BusinessException
  12555. ModelAndView:
  12556. View name = null
  12557. View = null
  12558. Model = null
  12559. FlashMap:
  12560. Attributes = null
  12561. MockHttpServletResponse:
  12562. Status = 200
  12563. Error message = null
  12564. Headers = [X-Request-Id:"VnCUn4vv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12565. Content type = application/json
  12566. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685101}
  12567. Forwarded URL = null
  12568. Redirected URL = null
  12569. Cookies = []
  12570. 15:18:05.104 DEBUG [Zj8B6GkN] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=wechat | IP: 127.0.0.1
  12571. 15:18:05.105 DEBUG [Zj8B6GkN] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12572. 15:18:05.105 DEBUG [Zj8B6GkN] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  12573. 15:18:05.107 DEBUG [Zj8B6GkN] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12574. 15:18:05.107 WARN [Zj8B6GkN] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  12575. 15:18:05.108 DEBUG [Zj8B6GkN] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=wechat 200 5ms
  12576. MockHttpServletRequest:
  12577. HTTP Method = GET
  12578. Request URI = /api/invite/page/TESTCODE
  12579. Parameters = {channel=[wechat]}
  12580. Headers = []
  12581. Body = null
  12582. Session Attrs = {}
  12583. Handler:
  12584. Type = com.xuekairui.invite.controller.InviteController
  12585. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  12586. Async:
  12587. Async started = false
  12588. Async result = null
  12589. Resolved Exception:
  12590. Type = com.xuekairui.common.BusinessException
  12591. ModelAndView:
  12592. View name = null
  12593. View = null
  12594. Model = null
  12595. FlashMap:
  12596. Attributes = null
  12597. MockHttpServletResponse:
  12598. Status = 200
  12599. Error message = null
  12600. Headers = [X-Request-Id:"Zj8B6GkN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12601. Content type = application/json
  12602. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685107}
  12603. Forwarded URL = null
  12604. Redirected URL = null
  12605. Cookies = []
  12606. 15:18:05.110 DEBUG [Jgf2XDuZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=miniapp | IP: 127.0.0.1
  12607. 15:18:05.112 DEBUG [Jgf2XDuZ] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12608. 15:18:05.112 DEBUG [Jgf2XDuZ] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  12609. 15:18:05.114 DEBUG [Jgf2XDuZ] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12610. 15:18:05.114 WARN [Jgf2XDuZ] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  12611. 15:18:05.115 DEBUG [Jgf2XDuZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=miniapp 200 5ms
  12612. MockHttpServletRequest:
  12613. HTTP Method = GET
  12614. Request URI = /api/invite/page/TESTCODE
  12615. Parameters = {channel=[miniapp]}
  12616. Headers = []
  12617. Body = null
  12618. Session Attrs = {}
  12619. Handler:
  12620. Type = com.xuekairui.invite.controller.InviteController
  12621. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  12622. Async:
  12623. Async started = false
  12624. Async result = null
  12625. Resolved Exception:
  12626. Type = com.xuekairui.common.BusinessException
  12627. ModelAndView:
  12628. View name = null
  12629. View = null
  12630. Model = null
  12631. FlashMap:
  12632. Attributes = null
  12633. MockHttpServletResponse:
  12634. Status = 200
  12635. Error message = null
  12636. Headers = [X-Request-Id:"Jgf2XDuZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12637. Content type = application/json
  12638. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685114}
  12639. Forwarded URL = null
  12640. Redirected URL = null
  12641. Cookies = []
  12642. 15:18:05.121 DEBUG [jJ9MwVUX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=dingtalk | IP: 127.0.0.1
  12643. 15:18:05.122 DEBUG [jJ9MwVUX] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12644. 15:18:05.122 DEBUG [jJ9MwVUX] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  12645. 15:18:05.124 DEBUG [jJ9MwVUX] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12646. 15:18:05.124 WARN [jJ9MwVUX] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  12647. 15:18:05.125 DEBUG [jJ9MwVUX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=dingtalk 200 4ms
  12648. MockHttpServletRequest:
  12649. HTTP Method = GET
  12650. Request URI = /api/invite/page/TESTCODE
  12651. Parameters = {channel=[dingtalk]}
  12652. Headers = []
  12653. Body = null
  12654. Session Attrs = {}
  12655. Handler:
  12656. Type = com.xuekairui.invite.controller.InviteController
  12657. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  12658. Async:
  12659. Async started = false
  12660. Async result = null
  12661. Resolved Exception:
  12662. Type = com.xuekairui.common.BusinessException
  12663. ModelAndView:
  12664. View name = null
  12665. View = null
  12666. Model = null
  12667. FlashMap:
  12668. Attributes = null
  12669. MockHttpServletResponse:
  12670. Status = 200
  12671. Error message = null
  12672. Headers = [X-Request-Id:"jJ9MwVUX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12673. Content type = application/json
  12674. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685124}
  12675. Forwarded URL = null
  12676. Redirected URL = null
  12677. Cookies = []
  12678. 15:18:05.128 DEBUG [pCDDxfVA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=feishu | IP: 127.0.0.1
  12679. 15:18:05.129 DEBUG [pCDDxfVA] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12680. 15:18:05.130 DEBUG [pCDDxfVA] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  12681. 15:18:05.132 DEBUG [pCDDxfVA] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12682. 15:18:05.132 WARN [pCDDxfVA] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  12683. 15:18:05.133 DEBUG [pCDDxfVA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=feishu 200 5ms
  12684. MockHttpServletRequest:
  12685. HTTP Method = GET
  12686. Request URI = /api/invite/page/TESTCODE
  12687. Parameters = {channel=[feishu]}
  12688. Headers = []
  12689. Body = null
  12690. Session Attrs = {}
  12691. Handler:
  12692. Type = com.xuekairui.invite.controller.InviteController
  12693. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  12694. Async:
  12695. Async started = false
  12696. Async result = null
  12697. Resolved Exception:
  12698. Type = com.xuekairui.common.BusinessException
  12699. ModelAndView:
  12700. View name = null
  12701. View = null
  12702. Model = null
  12703. FlashMap:
  12704. Attributes = null
  12705. MockHttpServletResponse:
  12706. Status = 200
  12707. Error message = null
  12708. Headers = [X-Request-Id:"pCDDxfVA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12709. Content type = application/json
  12710. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685132}
  12711. Forwarded URL = null
  12712. Redirected URL = null
  12713. Cookies = []
  12714. 15:18:05.135 DEBUG [P5czgMbB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/ANYCODE | IP: 127.0.0.1
  12715. 15:18:05.137 DEBUG [P5czgMbB] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12716. 15:18:05.137 DEBUG [P5czgMbB] [] [ main] c.x.i.m.I.selectList : ==> Parameters: ANYCODE(String)
  12717. 15:18:05.138 DEBUG [P5czgMbB] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12718. 15:18:05.139 WARN [P5czgMbB] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  12719. 15:18:05.139 DEBUG [P5czgMbB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/ANYCODE 200 4ms
  12720. MockHttpServletRequest:
  12721. HTTP Method = GET
  12722. Request URI = /api/invite/page/ANYCODE
  12723. Parameters = {}
  12724. Headers = []
  12725. Body = null
  12726. Session Attrs = {}
  12727. Handler:
  12728. Type = com.xuekairui.invite.controller.InviteController
  12729. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  12730. Async:
  12731. Async started = false
  12732. Async result = null
  12733. Resolved Exception:
  12734. Type = com.xuekairui.common.BusinessException
  12735. ModelAndView:
  12736. View name = null
  12737. View = null
  12738. Model = null
  12739. FlashMap:
  12740. Attributes = null
  12741. MockHttpServletResponse:
  12742. Status = 200
  12743. Error message = null
  12744. Headers = [X-Request-Id:"P5czgMbB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12745. Content type = application/json
  12746. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685139}
  12747. Forwarded URL = null
  12748. Redirected URL = null
  12749. Cookies = []
  12750. 15:18:05.142 DEBUG [R7aMMLsM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE | IP: 127.0.0.1
  12751. 15:18:05.143 DEBUG [R7aMMLsM] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12752. 15:18:05.143 DEBUG [R7aMMLsM] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  12753. 15:18:05.146 DEBUG [R7aMMLsM] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12754. 15:18:05.146 DEBUG [R7aMMLsM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE 200 4ms
  12755. MockHttpServletRequest:
  12756. HTTP Method = POST
  12757. Request URI = /api/invite/click/TESTCODE
  12758. Parameters = {}
  12759. Headers = [Content-Type:"application/json;charset=UTF-8"]
  12760. Body = null
  12761. Session Attrs = {}
  12762. Handler:
  12763. Type = com.xuekairui.invite.controller.InviteController
  12764. Method = com.xuekairui.invite.controller.InviteController#trackClick(String)
  12765. Async:
  12766. Async started = false
  12767. Async result = null
  12768. Resolved Exception:
  12769. Type = null
  12770. ModelAndView:
  12771. View name = null
  12772. View = null
  12773. Model = null
  12774. FlashMap:
  12775. Attributes = null
  12776. MockHttpServletResponse:
  12777. Status = 200
  12778. Error message = null
  12779. Headers = [X-Request-Id:"R7aMMLsM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12780. Content type = application/json
  12781. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976685146}
  12782. Forwarded URL = null
  12783. Redirected URL = null
  12784. Cookies = []
  12785. 15:18:05.149 DEBUG [2Mq9VEEj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE | IP: 127.0.0.1
  12786. 15:18:05.151 DEBUG [2Mq9VEEj] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12787. 15:18:05.151 DEBUG [2Mq9VEEj] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  12788. 15:18:05.153 DEBUG [2Mq9VEEj] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12789. 15:18:05.153 DEBUG [2Mq9VEEj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE 200 4ms
  12790. MockHttpServletRequest:
  12791. HTTP Method = POST
  12792. Request URI = /api/invite/click/TESTCODE
  12793. Parameters = {}
  12794. Headers = []
  12795. Body = null
  12796. Session Attrs = {}
  12797. Handler:
  12798. Type = com.xuekairui.invite.controller.InviteController
  12799. Method = com.xuekairui.invite.controller.InviteController#trackClick(String)
  12800. Async:
  12801. Async started = false
  12802. Async result = null
  12803. Resolved Exception:
  12804. Type = null
  12805. ModelAndView:
  12806. View name = null
  12807. View = null
  12808. Model = null
  12809. FlashMap:
  12810. Attributes = null
  12811. MockHttpServletResponse:
  12812. Status = 200
  12813. Error message = null
  12814. Headers = [X-Request-Id:"2Mq9VEEj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12815. Content type = application/json
  12816. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976685153}
  12817. Forwarded URL = null
  12818. Redirected URL = null
  12819. Cookies = []
  12820. 15:18:05.156 DEBUG [vWY9MBWL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/NONEXISTENT | IP: 127.0.0.1
  12821. 15:18:05.157 DEBUG [vWY9MBWL] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  12822. 15:18:05.157 DEBUG [vWY9MBWL] [] [ main] c.x.i.m.I.selectList : ==> Parameters: NONEXISTENT(String)
  12823. 15:18:05.159 DEBUG [vWY9MBWL] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  12824. 15:18:05.160 DEBUG [vWY9MBWL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/NONEXISTENT 200 4ms
  12825. MockHttpServletRequest:
  12826. HTTP Method = POST
  12827. Request URI = /api/invite/click/NONEXISTENT
  12828. Parameters = {}
  12829. Headers = [Content-Type:"application/json;charset=UTF-8"]
  12830. Body = null
  12831. Session Attrs = {}
  12832. Handler:
  12833. Type = com.xuekairui.invite.controller.InviteController
  12834. Method = com.xuekairui.invite.controller.InviteController#trackClick(String)
  12835. Async:
  12836. Async started = false
  12837. Async result = null
  12838. Resolved Exception:
  12839. Type = null
  12840. ModelAndView:
  12841. View name = null
  12842. View = null
  12843. Model = null
  12844. FlashMap:
  12845. Attributes = null
  12846. MockHttpServletResponse:
  12847. Status = 200
  12848. Error message = null
  12849. Headers = [X-Request-Id:"vWY9MBWL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12850. Content type = application/json
  12851. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976685159}
  12852. Forwarded URL = null
  12853. Redirected URL = null
  12854. Cookies = []
  12855. [INFO] Tests run: 21, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.310 s -- in 邀请系统接口测试
  12856. [INFO] Running 会员体系接口测试
  12857. 15:18:05.164 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.MembershipControllerTest]: MembershipControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  12858. 15:18:05.166 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.MembershipControllerTest
  12859. 15:18:08.360 DEBUG [5UU8Mxdb] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
  12860. 15:18:08.361 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12861. 15:18:08.361 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12862. 15:18:08.363 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12863. 15:18:08.368 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12864. 15:18:08.369 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12865. 15:18:08.370 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12866. 15:18:08.371 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
  12867. 15:18:08.371 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
  12868. 15:18:08.374 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  12869. 15:18:08.374 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  12870. 15:18:08.374 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580566367019009(Long), 1(Long), PLUS(String), ADMIN_GRANT(String), 2026-07-02T15:18:08.374546(LocalDateTime), 1(Integer), 测试初始化(String), 2026-07-02T15:18:08.374546(LocalDateTime), 2026-07-02T15:18:08.374546(LocalDateTime)
  12871. 15:18:08.377 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.insert : <== Updates: 1
  12872. 15:18:08.377 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, token_version=?, create_time=?, update_time=? WHERE id=?
  12873. 15:18:08.378 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:18:08(LocalDateTime), 2026-07-02T15:18:08(LocalDateTime), 1(Long)
  12874. 15:18:08.380 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  12875. 15:18:08.381 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  12876. 15:18:08.381 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580566429933570(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:08.381052(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), MEMBERSHIP:1->PLUS(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:08.381052(LocalDateTime)
  12877. 15:18:08.384 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  12878. 15:18:08.385 DEBUG [5UU8Mxdb] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
  12879. 15:18:08.385 INFO [5UU8Mxdb] [1] [ main] c.x.u.s.MembershipService : 运营人员1为用户1发放会员等级PLUS
  12880. 15:18:08.385 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12881. 15:18:08.385 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12882. 15:18:08.386 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12883. 15:18:08.391 DEBUG [5UU8Mxdb] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 200 31ms
  12884. MockHttpServletRequest:
  12885. HTTP Method = POST
  12886. Request URI = /api/admin/membership/grant
  12887. Parameters = {}
  12888. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ", Content-Length:"77"]
  12889. Body = {"userId":1,"level":"PLUS","source":"ADMIN_GRANT","remark":"测试初始化"}
  12890. Session Attrs = {}
  12891. Handler:
  12892. Type = com.xuekairui.user.controller.AdminMembershipController
  12893. Method = com.xuekairui.user.controller.AdminMembershipController#grantMembership(GrantMembershipRequest, HttpServletRequest)
  12894. Async:
  12895. Async started = false
  12896. Async result = null
  12897. Resolved Exception:
  12898. Type = null
  12899. ModelAndView:
  12900. View name = null
  12901. View = null
  12902. Model = null
  12903. FlashMap:
  12904. Attributes = null
  12905. MockHttpServletResponse:
  12906. Status = 200
  12907. Error message = null
  12908. Headers = [X-Request-Id:"5UU8Mxdb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12909. Content type = application/json
  12910. Body = {"code":200,"message":"操作成功","data":{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},"timestamp":1782976688391}
  12911. Forwarded URL = null
  12912. Redirected URL = null
  12913. Cookies = []
  12914. 15:18:08.397 DEBUG [85Q8WsTS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  12915. 15:18:08.398 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12916. 15:18:08.398 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12917. 15:18:08.399 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12918. 15:18:08.400 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  12919. 15:18:08.400 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  12920. 15:18:08.401 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  12921. 15:18:08.401 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12922. 15:18:08.402 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12923. 15:18:08.403 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12924. 15:18:08.404 DEBUG [85Q8WsTS] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 7ms
  12925. MockHttpServletRequest:
  12926. HTTP Method = GET
  12927. Request URI = /api/membership/my
  12928. Parameters = {}
  12929. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
  12930. Body = null
  12931. Session Attrs = {}
  12932. Handler:
  12933. Type = com.xuekairui.user.controller.MembershipController
  12934. Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
  12935. Async:
  12936. Async started = false
  12937. Async result = null
  12938. Resolved Exception:
  12939. Type = null
  12940. ModelAndView:
  12941. View name = null
  12942. View = null
  12943. Model = null
  12944. FlashMap:
  12945. Attributes = null
  12946. MockHttpServletResponse:
  12947. Status = 200
  12948. Error message = null
  12949. Headers = [X-Request-Id:"85Q8WsTS", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12950. Content type = application/json
  12951. Body = {"code":200,"message":"操作成功","data":{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},"timestamp":1782976688403}
  12952. Forwarded URL = null
  12953. Redirected URL = null
  12954. Cookies = []
  12955. 15:18:08.410 DEBUG [feh9NG37] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=PLUS | IP: 127.0.0.1
  12956. 15:18:08.411 DEBUG [feh9NG37] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  12957. 15:18:08.411 DEBUG [feh9NG37] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  12958. 15:18:08.412 DEBUG [feh9NG37] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  12959. 15:18:08.413 DEBUG [feh9NG37] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  12960. 15:18:08.414 DEBUG [feh9NG37] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  12961. 15:18:08.416 DEBUG [feh9NG37] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  12962. 15:18:08.418 DEBUG [feh9NG37] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=PLUS 200 8ms
  12963. MockHttpServletRequest:
  12964. HTTP Method = GET
  12965. Request URI = /api/membership/benefits
  12966. Parameters = {level=[PLUS]}
  12967. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
  12968. Body = null
  12969. Session Attrs = {}
  12970. Handler:
  12971. Type = com.xuekairui.user.controller.MembershipController
  12972. Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)
  12973. Async:
  12974. Async started = false
  12975. Async result = null
  12976. Resolved Exception:
  12977. Type = null
  12978. ModelAndView:
  12979. View name = null
  12980. View = null
  12981. Model = null
  12982. FlashMap:
  12983. Attributes = null
  12984. MockHttpServletResponse:
  12985. Status = 200
  12986. Error message = null
  12987. Headers = [X-Request-Id:"feh9NG37", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  12988. Content type = application/json
  12989. Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":10,"description":"普通会员:每日有效查询10次"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":300,"description":"普通会员:每月查询300次"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":3650,"description":"普通会员:每年查询3650次(10*365)"}],"timestamp":1782976688417}
  12990. Forwarded URL = null
  12991. Redirected URL = null
  12992. Cookies = []
  12993. 15:18:08.421 DEBUG [LahQpFLm] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  12994. 15:18:08.423 WARN [LahQpFLm] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 2ms
  12995. MockHttpServletRequest:
  12996. HTTP Method = GET
  12997. Request URI = /api/membership/my
  12998. Parameters = {}
  12999. Headers = []
  13000. Body = null
  13001. Session Attrs = {}
  13002. Handler:
  13003. Type = null
  13004. Async:
  13005. Async started = false
  13006. Async result = null
  13007. Resolved Exception:
  13008. Type = null
  13009. ModelAndView:
  13010. View name = null
  13011. View = null
  13012. Model = null
  13013. FlashMap:
  13014. Attributes = null
  13015. MockHttpServletResponse:
  13016. Status = 401
  13017. Error message = null
  13018. Headers = [X-Request-Id:"LahQpFLm", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13019. Content type = application/json;charset=UTF-8
  13020. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976688422}
  13021. Forwarded URL = null
  13022. Redirected URL = null
  13023. Cookies = []
  13024. 15:18:08.429 DEBUG [6m7WyS8W] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits | IP: 127.0.0.1
  13025. 15:18:08.429 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13026. 15:18:08.429 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13027. 15:18:08.431 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13028. 15:18:08.432 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  13029. 15:18:08.432 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  13030. 15:18:08.434 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  13031. 15:18:08.435 DEBUG [6m7WyS8W] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits 200 6ms
  13032. MockHttpServletRequest:
  13033. HTTP Method = GET
  13034. Request URI = /api/membership/benefits
  13035. Parameters = {}
  13036. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
  13037. Body = null
  13038. Session Attrs = {}
  13039. Handler:
  13040. Type = com.xuekairui.user.controller.MembershipController
  13041. Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)
  13042. Async:
  13043. Async started = false
  13044. Async result = null
  13045. Resolved Exception:
  13046. Type = null
  13047. ModelAndView:
  13048. View name = null
  13049. View = null
  13050. Model = null
  13051. FlashMap:
  13052. Attributes = null
  13053. MockHttpServletResponse:
  13054. Status = 200
  13055. Error message = null
  13056. Headers = [X-Request-Id:"6m7WyS8W", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13057. Content type = application/json
  13058. Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":10,"description":"普通会员:每日有效查询10次"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":300,"description":"普通会员:每月查询300次"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":3650,"description":"普通会员:每年查询3650次(10*365)"}],"timestamp":1782976688434}
  13059. Forwarded URL = null
  13060. Redirected URL = null
  13061. Cookies = []
  13062. 15:18:08.441 DEBUG [FVuPXp7b] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=PRO | IP: 127.0.0.1
  13063. 15:18:08.441 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13064. 15:18:08.441 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13065. 15:18:08.444 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13066. 15:18:08.445 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  13067. 15:18:08.445 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  13068. 15:18:08.446 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
  13069. 15:18:08.447 DEBUG [FVuPXp7b] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=PRO 200 7ms
  13070. MockHttpServletRequest:
  13071. HTTP Method = GET
  13072. Request URI = /api/membership/benefits
  13073. Parameters = {level=[PRO]}
  13074. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
  13075. Body = null
  13076. Session Attrs = {}
  13077. Handler:
  13078. Type = com.xuekairui.user.controller.MembershipController
  13079. Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)
  13080. Async:
  13081. Async started = false
  13082. Async result = null
  13083. Resolved Exception:
  13084. Type = null
  13085. ModelAndView:
  13086. View name = null
  13087. View = null
  13088. Model = null
  13089. FlashMap:
  13090. Attributes = null
  13091. MockHttpServletResponse:
  13092. Status = 200
  13093. Error message = null
  13094. Headers = [X-Request-Id:"FVuPXp7b", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13095. Content type = application/json
  13096. Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":999,"description":"高级会员:每日不限量"},{"benefitType":"MAX_CONCURRENT","benefitTypeName":"最大并发加成","benefitValue":5,"description":"高级会员最大并发数"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":29970,"description":"高级会员:每月查询29970次(999*30)"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":364635,"description":"高级会员:每年查询364635次(999*365)"}],"timestamp":1782976688446}
  13097. Forwarded URL = null
  13098. Redirected URL = null
  13099. Cookies = []
  13100. 15:18:08.453 DEBUG [t2pUyrX4] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=ULTRA | IP: 127.0.0.1
  13101. 15:18:08.454 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13102. 15:18:08.454 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13103. 15:18:08.456 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13104. 15:18:08.458 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  13105. 15:18:08.458 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  13106. 15:18:08.460 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
  13107. 15:18:08.461 DEBUG [t2pUyrX4] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=ULTRA 200 8ms
  13108. MockHttpServletRequest:
  13109. HTTP Method = GET
  13110. Request URI = /api/membership/benefits
  13111. Parameters = {level=[ULTRA]}
  13112. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
  13113. Body = null
  13114. Session Attrs = {}
  13115. Handler:
  13116. Type = com.xuekairui.user.controller.MembershipController
  13117. Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)
  13118. Async:
  13119. Async started = false
  13120. Async result = null
  13121. Resolved Exception:
  13122. Type = null
  13123. ModelAndView:
  13124. View name = null
  13125. View = null
  13126. Model = null
  13127. FlashMap:
  13128. Attributes = null
  13129. MockHttpServletResponse:
  13130. Status = 200
  13131. Error message = null
  13132. Headers = [X-Request-Id:"t2pUyrX4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13133. Content type = application/json
  13134. Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":999,"description":"超级会员:每日不限量"},{"benefitType":"MAX_CONCURRENT","benefitTypeName":"最大并发加成","benefitValue":10,"description":"超级会员最大并发数"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":29970,"description":"超级会员:每月查询29970次(999*30)"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":364635,"description":"超级会员:每年查询364635次(999*365)"}],"timestamp":1782976688460}
  13135. Forwarded URL = null
  13136. Redirected URL = null
  13137. Cookies = []
  13138. 15:18:08.467 DEBUG [Eveha6v8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
  13139. 15:18:08.468 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13140. 15:18:08.468 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13141. 15:18:08.470 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13142. 15:18:08.472 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13143. 15:18:08.473 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13144. 15:18:08.475 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13145. 15:18:08.475 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
  13146. 15:18:08.475 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
  13147. 15:18:08.476 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.selectList : <== Total: 1
  13148. 15:18:08.478 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.updateById : ==> Preparing: UPDATE t_user_membership SET user_id=?, level=?, source=?, effective_from=?, status=?, remark=?, create_time=?, update_time=? WHERE id=?
  13149. 15:18:08.478 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.updateById : ==> Parameters: 1(Long), PLUS(String), ADMIN_GRANT(String), 2026-07-02T15:18:08(LocalDateTime), 0(Integer), 测试初始化(String), 2026-07-02T15:18:08(LocalDateTime), 2026-07-02T15:18:08(LocalDateTime), 2072580566367019009(Long)
  13150. 15:18:08.480 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.updateById : <== Updates: 1
  13151. 15:18:08.481 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  13152. 15:18:08.481 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580566815809538(Long), 1(Long), PRO(String), ADMIN_GRANT(String), 2026-07-02T15:18:08.480846500(LocalDateTime), 1(Integer), 测试发放(String), 2026-07-02T15:18:08.480846500(LocalDateTime), 2026-07-02T15:18:08.480846500(LocalDateTime)
  13153. 15:18:08.484 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.insert : <== Updates: 1
  13154. 15:18:08.484 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, token_version=?, create_time=?, update_time=? WHERE id=?
  13155. 15:18:08.484 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 0(Long), 2026-07-02T15:18:08(LocalDateTime), 2026-07-02T15:18:08(LocalDateTime), 1(Long)
  13156. 15:18:08.487 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  13157. 15:18:08.488 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  13158. 15:18:08.488 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580566878724097(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:08.487671(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), MEMBERSHIP:1->PRO(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:08.488175700(LocalDateTime)
  13159. 15:18:08.491 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  13160. 15:18:08.491 DEBUG [Eveha6v8] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
  13161. 15:18:08.491 INFO [Eveha6v8] [1] [ main] c.x.u.s.MembershipService : 运营人员1为用户1发放会员等级PRO
  13162. 15:18:08.491 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13163. 15:18:08.491 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13164. 15:18:08.492 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13165. 15:18:08.497 DEBUG [Eveha6v8] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 200 30ms
  13166. MockHttpServletRequest:
  13167. HTTP Method = POST
  13168. Request URI = /api/admin/membership/grant
  13169. Parameters = {}
  13170. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ", Content-Length:"73"]
  13171. Body = {"userId":1,"level":"PRO","source":"ADMIN_GRANT","remark":"测试发放"}
  13172. Session Attrs = {}
  13173. Handler:
  13174. Type = com.xuekairui.user.controller.AdminMembershipController
  13175. Method = com.xuekairui.user.controller.AdminMembershipController#grantMembership(GrantMembershipRequest, HttpServletRequest)
  13176. Async:
  13177. Async started = false
  13178. Async result = null
  13179. Resolved Exception:
  13180. Type = null
  13181. ModelAndView:
  13182. View name = null
  13183. View = null
  13184. Model = null
  13185. FlashMap:
  13186. Attributes = null
  13187. MockHttpServletResponse:
  13188. Status = 200
  13189. Error message = null
  13190. Headers = [X-Request-Id:"Eveha6v8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13191. Content type = application/json
  13192. Body = {"code":200,"message":"操作成功","data":{"id":2072580566815809538,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PRO","levelName":"高级会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试发放","createTime":"2026-07-02 15:18:08"},"timestamp":1782976688496}
  13193. Forwarded URL = null
  13194. Redirected URL = null
  13195. Cookies = []
  13196. 15:18:08.503 DEBUG [d8GMgdat] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
  13197. 15:18:08.504 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13198. 15:18:08.504 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13199. 15:18:08.506 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13200. 15:18:08.508 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13201. 15:18:08.508 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13202. 15:18:08.509 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13203. 15:18:08.511 WARN [d8GMgdat] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=400, message=会员等级无效
  13204. 15:18:08.512 DEBUG [d8GMgdat] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 200 9ms
  13205. MockHttpServletRequest:
  13206. HTTP Method = POST
  13207. Request URI = /api/admin/membership/grant
  13208. Parameters = {}
  13209. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ", Content-Length:"53"]
  13210. Body = {"userId":1,"level":"INVALID","source":"ADMIN_GRANT"}
  13211. Session Attrs = {}
  13212. Handler:
  13213. Type = com.xuekairui.user.controller.AdminMembershipController
  13214. Method = com.xuekairui.user.controller.AdminMembershipController#grantMembership(GrantMembershipRequest, HttpServletRequest)
  13215. Async:
  13216. Async started = false
  13217. Async result = null
  13218. Resolved Exception:
  13219. Type = com.xuekairui.common.BusinessException
  13220. ModelAndView:
  13221. View name = null
  13222. View = null
  13223. Model = null
  13224. FlashMap:
  13225. Attributes = null
  13226. MockHttpServletResponse:
  13227. Status = 200
  13228. Error message = null
  13229. Headers = [X-Request-Id:"d8GMgdat", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13230. Content type = application/json
  13231. Body = {"code":400,"message":"会员等级无效","data":null,"timestamp":1782976688511}
  13232. Forwarded URL = null
  13233. Redirected URL = null
  13234. Cookies = []
  13235. 15:18:08.515 DEBUG [v8fmDGQP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
  13236. 15:18:08.516 WARN [v8fmDGQP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 401 1ms
  13237. MockHttpServletRequest:
  13238. HTTP Method = POST
  13239. Request URI = /api/admin/membership/grant
  13240. Parameters = {}
  13241. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"49"]
  13242. Body = {"userId":1,"level":"PRO","source":"ADMIN_GRANT"}
  13243. Session Attrs = {}
  13244. Handler:
  13245. Type = null
  13246. Async:
  13247. Async started = false
  13248. Async result = null
  13249. Resolved Exception:
  13250. Type = null
  13251. ModelAndView:
  13252. View name = null
  13253. View = null
  13254. Model = null
  13255. FlashMap:
  13256. Attributes = null
  13257. MockHttpServletResponse:
  13258. Status = 401
  13259. Error message = null
  13260. Headers = [X-Request-Id:"v8fmDGQP", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13261. Content type = application/json;charset=UTF-8
  13262. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976688515}
  13263. Forwarded URL = null
  13264. Redirected URL = null
  13265. Cookies = []
  13266. 15:18:08.521 DEBUG [VE4WP664] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10 | IP: 127.0.0.1
  13267. 15:18:08.521 DEBUG [VE4WP664] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13268. 15:18:08.521 DEBUG [VE4WP664] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13269. 15:18:08.523 DEBUG [VE4WP664] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13270. 15:18:08.528 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_user_membership
  13271. 15:18:08.528 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Parameters:
  13272. 15:18:08.530 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList_mpCount : <== Total: 1
  13273. 15:18:08.530 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership ORDER BY create_time DESC LIMIT ?
  13274. 15:18:08.531 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 10(Long)
  13275. 15:18:08.532 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList : <== Total: 2
  13276. 15:18:08.534 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectByIds : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id IN ( ? )
  13277. 15:18:08.534 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectByIds : ==> Parameters: 1(Long)
  13278. 15:18:08.536 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectByIds : <== Total: 1
  13279. 15:18:08.537 DEBUG [VE4WP664] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10 200 16ms
  13280. MockHttpServletRequest:
  13281. HTTP Method = GET
  13282. Request URI = /api/admin/membership/memberships
  13283. Parameters = {page=[1], size=[10]}
  13284. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
  13285. Body = null
  13286. Session Attrs = {}
  13287. Handler:
  13288. Type = com.xuekairui.user.controller.AdminMembershipController
  13289. Method = com.xuekairui.user.controller.AdminMembershipController#listMemberships(Integer, Integer, Long, String, String, String, String)
  13290. Async:
  13291. Async started = false
  13292. Async result = null
  13293. Resolved Exception:
  13294. Type = null
  13295. ModelAndView:
  13296. View name = null
  13297. View = null
  13298. Model = null
  13299. FlashMap:
  13300. Attributes = null
  13301. MockHttpServletResponse:
  13302. Status = 200
  13303. Error message = null
  13304. Headers = [X-Request-Id:"VE4WP664", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13305. Content type = application/json
  13306. Body = {"code":200,"message":"操作成功","data":{"records":[{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":0,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},{"id":2072580566815809538,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PRO","levelName":"高级会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试发放","createTime":"2026-07-02 15:18:08"}],"total":2,"size":10,"current":1,"pages":1},"timestamp":1782976688537}
  13307. Forwarded URL = null
  13308. Redirected URL = null
  13309. Cookies = []
  13310. 15:18:08.542 DEBUG [JH62Em77] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10&userId=1 | IP: 127.0.0.1
  13311. 15:18:08.543 DEBUG [JH62Em77] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13312. 15:18:08.543 DEBUG [JH62Em77] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13313. 15:18:08.544 DEBUG [JH62Em77] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13314. 15:18:08.554 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_user_membership WHERE (user_id = ?)
  13315. 15:18:08.554 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Parameters: 1(Long)
  13316. 15:18:08.556 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList_mpCount : <== Total: 1
  13317. 15:18:08.556 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ?) ORDER BY create_time DESC LIMIT ?
  13318. 15:18:08.556 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 10(Long)
  13319. 15:18:08.558 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList : <== Total: 2
  13320. 15:18:08.558 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectByIds : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id IN ( ? )
  13321. 15:18:08.559 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectByIds : ==> Parameters: 1(Long)
  13322. 15:18:08.560 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectByIds : <== Total: 1
  13323. 15:18:08.561 DEBUG [JH62Em77] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10&userId=1 200 19ms
  13324. MockHttpServletRequest:
  13325. HTTP Method = GET
  13326. Request URI = /api/admin/membership/memberships
  13327. Parameters = {page=[1], size=[10], userId=[1]}
  13328. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
  13329. Body = null
  13330. Session Attrs = {}
  13331. Handler:
  13332. Type = com.xuekairui.user.controller.AdminMembershipController
  13333. Method = com.xuekairui.user.controller.AdminMembershipController#listMemberships(Integer, Integer, Long, String, String, String, String)
  13334. Async:
  13335. Async started = false
  13336. Async result = null
  13337. Resolved Exception:
  13338. Type = null
  13339. ModelAndView:
  13340. View name = null
  13341. View = null
  13342. Model = null
  13343. FlashMap:
  13344. Attributes = null
  13345. MockHttpServletResponse:
  13346. Status = 200
  13347. Error message = null
  13348. Headers = [X-Request-Id:"JH62Em77", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13349. Content type = application/json
  13350. Body = {"code":200,"message":"操作成功","data":{"records":[{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":0,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},{"id":2072580566815809538,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PRO","levelName":"高级会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试发放","createTime":"2026-07-02 15:18:08"}],"total":2,"size":10,"current":1,"pages":1},"timestamp":1782976688560}
  13351. Forwarded URL = null
  13352. Redirected URL = null
  13353. Cookies = []
  13354. 15:18:08.567 DEBUG [9bkfqEx2] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10&level=PLUS | IP: 127.0.0.1
  13355. 15:18:08.568 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13356. 15:18:08.568 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13357. 15:18:08.570 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13358. 15:18:08.573 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_user_membership WHERE (level = ?)
  13359. 15:18:08.573 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Parameters: PLUS(String)
  13360. 15:18:08.576 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList_mpCount : <== Total: 1
  13361. 15:18:08.576 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (level = ?) ORDER BY create_time DESC LIMIT ?
  13362. 15:18:08.576 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: PLUS(String), 10(Long)
  13363. 15:18:08.578 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList : <== Total: 1
  13364. 15:18:08.578 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectByIds : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id IN ( ? )
  13365. 15:18:08.578 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectByIds : ==> Parameters: 1(Long)
  13366. 15:18:08.580 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectByIds : <== Total: 1
  13367. 15:18:08.581 DEBUG [9bkfqEx2] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10&level=PLUS 200 14ms
  13368. MockHttpServletRequest:
  13369. HTTP Method = GET
  13370. Request URI = /api/admin/membership/memberships
  13371. Parameters = {page=[1], size=[10], level=[PLUS]}
  13372. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
  13373. Body = null
  13374. Session Attrs = {}
  13375. Handler:
  13376. Type = com.xuekairui.user.controller.AdminMembershipController
  13377. Method = com.xuekairui.user.controller.AdminMembershipController#listMemberships(Integer, Integer, Long, String, String, String, String)
  13378. Async:
  13379. Async started = false
  13380. Async result = null
  13381. Resolved Exception:
  13382. Type = null
  13383. ModelAndView:
  13384. View name = null
  13385. View = null
  13386. Model = null
  13387. FlashMap:
  13388. Attributes = null
  13389. MockHttpServletResponse:
  13390. Status = 200
  13391. Error message = null
  13392. Headers = [X-Request-Id:"9bkfqEx2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13393. Content type = application/json
  13394. Body = {"code":200,"message":"操作成功","data":{"records":[{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":0,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"}],"total":1,"size":10,"current":1,"pages":1},"timestamp":1782976688580}
  13395. Forwarded URL = null
  13396. Redirected URL = null
  13397. Cookies = []
  13398. 15:18:08.585 DEBUG [t5QkNrDG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10 | IP: 127.0.0.1
  13399. 15:18:08.587 WARN [t5QkNrDG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10 401 2ms
  13400. MockHttpServletRequest:
  13401. HTTP Method = GET
  13402. Request URI = /api/admin/membership/memberships
  13403. Parameters = {page=[1], size=[10]}
  13404. Headers = []
  13405. Body = null
  13406. Session Attrs = {}
  13407. Handler:
  13408. Type = null
  13409. Async:
  13410. Async started = false
  13411. Async result = null
  13412. Resolved Exception:
  13413. Type = null
  13414. ModelAndView:
  13415. View name = null
  13416. View = null
  13417. Model = null
  13418. FlashMap:
  13419. Attributes = null
  13420. MockHttpServletResponse:
  13421. Status = 401
  13422. Error message = null
  13423. Headers = [X-Request-Id:"t5QkNrDG", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13424. Content type = application/json;charset=UTF-8
  13425. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976688586}
  13426. Forwarded URL = null
  13427. Redirected URL = null
  13428. Cookies = []
  13429. [INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.425 s -- in 会员体系接口测试
  13430. [INFO] Running 操作审计日志接口测试
  13431. 15:18:08.591 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.OperationAuditLogTest]: OperationAuditLogTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  13432. 15:18:08.593 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.OperationAuditLogTest
  13433. 15:18:10.931 DEBUG [8QgaBN5M] [] [scheduling-2] c.x.p.m.P.selectDueForDeduct : ==> Preparing: SELECT * FROM t_payment_agreement WHERE status = 'SIGNED' AND next_deduct_time IS NOT NULL AND next_deduct_time <= ? ORDER BY next_deduct_time ASC
  13434. 15:18:10.931 DEBUG [8QgaBN5M] [] [scheduling-2] c.x.p.m.P.selectDueForDeduct : ==> Parameters: 2026-07-02T15:18:10.929491200(LocalDateTime)
  13435. 15:18:10.932 DEBUG [8QgaBN5M] [] [scheduling-2] c.x.p.m.P.selectDueForDeduct : <== Total: 0
  13436. 15:18:11.084 DEBUG [gSCLu3Gv] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Preparing: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
  13437. 15:18:11.085 DEBUG [gSCLu3Gv] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Parameters: 2026-07-02T15:18:11.084515200(LocalDateTime)
  13438. 15:18:11.226 ERROR [gSCLu3Gv] [] [scheduling-1] c.x.user.config.AsyncConfig : 定时任务执行异常
  13439. org.springframework.jdbc.BadSqlGrammarException:
  13440. ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'zhijiayun_pharmacy.t_payment_order' doesn't exist
  13441. ### The error may exist in com/xuekairui/payment/mapper/PaymentOrderMapper.java (best guess)
  13442. ### The error may involve com.xuekairui.payment.mapper.PaymentOrderMapper.selectExpiredPending-Inline
  13443. ### The error occurred while setting parameters
  13444. ### SQL: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
  13445. ### Cause: java.sql.SQLSyntaxErrorException: Table 'zhijiayun_pharmacy.t_payment_order' doesn't exist
  13446. ; bad SQL grammar []
  13447. at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246)
  13448. at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)
  13449. at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:95)
  13450. at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347)
  13451. at jdk.proxy2/jdk.proxy2.$Proxy127.selectList(Unknown Source)
  13452. at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:194)
  13453. at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)
  13454. at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)
  13455. at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)
  13456. at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)
  13457. at jdk.proxy2/jdk.proxy2.$Proxy160.selectExpiredPending(Unknown Source)
  13458. at com.xuekairui.payment.service.PaymentOrderService.cleanupExpiredOrders(PaymentOrderService.java:373)
  13459. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  13460. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  13461. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  13462. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  13463. at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)
  13464. at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
  13465. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  13466. at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
  13467. at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
  13468. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
  13469. at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)
  13470. at com.xuekairui.payment.service.PaymentOrderService$$SpringCGLIB$$0.cleanupExpiredOrders(<generated>)
  13471. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  13472. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  13473. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  13474. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  13475. at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130)
  13476. at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124)
  13477. at io.micrometer.observation.Observation.observe(Observation.java:498)
  13478. at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124)
  13479. at org.springframework.scheduling.config.Task$OutcomeTrackingRunnable.run(Task.java:87)
  13480. at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
  13481. at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
  13482. at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
  13483. at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
  13484. at com.xuekairui.user.config.AsyncConfig$MdcTraceIdTaskDecorator.lambda$decorate$0(AsyncConfig.java:84)
  13485. at org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler$DelegatingRunnableScheduledFuture.run(ThreadPoolTaskScheduler.java:508)
  13486. at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
  13487. at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
  13488. at java.base/java.lang.Thread.run(Thread.java:842)
  13489. Caused by: java.sql.SQLSyntaxErrorException: Table 'zhijiayun_pharmacy.t_payment_order' doesn't exist
  13490. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:112)
  13491. at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:114)
  13492. at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:990)
  13493. at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:384)
  13494. at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)
  13495. at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java)
  13496. at jdk.internal.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
  13497. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  13498. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  13499. at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)
  13500. at jdk.proxy3/jdk.proxy3.$Proxy182.execute(Unknown Source)
  13501. at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)
  13502. at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)
  13503. at jdk.internal.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
  13504. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  13505. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  13506. at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
  13507. at jdk.proxy2/jdk.proxy2.$Proxy180.query(Unknown Source)
  13508. at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)
  13509. at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)
  13510. at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)
  13511. at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)
  13512. at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)
  13513. at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)
  13514. at jdk.proxy2/jdk.proxy2.$Proxy179.query(Unknown Source)
  13515. at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
  13516. at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
  13517. at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
  13518. at jdk.internal.reflect.GeneratedMethodAccessor103.invoke(Unknown Source)
  13519. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  13520. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  13521. at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333)
  13522. ... 38 common frames omitted
  13523. 15:18:11.574 DEBUG [ENh4NUTh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
  13524. 15:18:11.574 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13525. 15:18:11.575 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13526. 15:18:11.576 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13527. 15:18:11.580 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log
  13528. 15:18:11.580 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters:
  13529. 15:18:11.584 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
  13530. 15:18:11.585 DEBUG [ENh4NUTh] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 200 11ms
  13531. MockHttpServletRequest:
  13532. HTTP Method = GET
  13533. Request URI = /api/admin/audit-log
  13534. Parameters = {}
  13535. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13536. Body = null
  13537. Session Attrs = {}
  13538. Handler:
  13539. Type = com.xuekairui.user.controller.OperationAuditLogController
  13540. Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
  13541. Async:
  13542. Async started = false
  13543. Async result = null
  13544. Resolved Exception:
  13545. Type = null
  13546. ModelAndView:
  13547. View name = null
  13548. View = null
  13549. Model = null
  13550. FlashMap:
  13551. Attributes = null
  13552. MockHttpServletResponse:
  13553. Status = 200
  13554. Error message = null
  13555. Headers = [X-Request-Id:"ENh4NUTh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13556. Content type = application/json
  13557. Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691584}
  13558. Forwarded URL = null
  13559. Redirected URL = null
  13560. Cookies = []
  13561. 15:18:11.591 DEBUG [ccHp7WWP] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?page=1&size=10 | IP: 127.0.0.1
  13562. 15:18:11.592 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13563. 15:18:11.592 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13564. 15:18:11.593 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13565. 15:18:11.597 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log
  13566. 15:18:11.597 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters:
  13567. 15:18:11.599 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
  13568. 15:18:11.600 DEBUG [ccHp7WWP] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?page=1&size=10 200 8ms
  13569. MockHttpServletRequest:
  13570. HTTP Method = GET
  13571. Request URI = /api/admin/audit-log
  13572. Parameters = {page=[1], size=[10]}
  13573. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13574. Body = null
  13575. Session Attrs = {}
  13576. Handler:
  13577. Type = com.xuekairui.user.controller.OperationAuditLogController
  13578. Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
  13579. Async:
  13580. Async started = false
  13581. Async result = null
  13582. Resolved Exception:
  13583. Type = null
  13584. ModelAndView:
  13585. View name = null
  13586. View = null
  13587. Model = null
  13588. FlashMap:
  13589. Attributes = null
  13590. MockHttpServletResponse:
  13591. Status = 200
  13592. Error message = null
  13593. Headers = [X-Request-Id:"ccHp7WWP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13594. Content type = application/json
  13595. Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":10,"current":1,"pages":0},"timestamp":1782976691599}
  13596. Forwarded URL = null
  13597. Redirected URL = null
  13598. Cookies = []
  13599. 15:18:11.606 DEBUG [3vygFTkd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?module=USER | IP: 127.0.0.1
  13600. 15:18:11.606 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13601. 15:18:11.607 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13602. 15:18:11.608 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13603. 15:18:11.613 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (module = ?)
  13604. 15:18:11.613 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: USER(String)
  13605. 15:18:11.615 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
  13606. 15:18:11.615 DEBUG [3vygFTkd] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?module=USER 200 9ms
  13607. MockHttpServletRequest:
  13608. HTTP Method = GET
  13609. Request URI = /api/admin/audit-log
  13610. Parameters = {module=[USER]}
  13611. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13612. Body = null
  13613. Session Attrs = {}
  13614. Handler:
  13615. Type = com.xuekairui.user.controller.OperationAuditLogController
  13616. Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
  13617. Async:
  13618. Async started = false
  13619. Async result = null
  13620. Resolved Exception:
  13621. Type = null
  13622. ModelAndView:
  13623. View name = null
  13624. View = null
  13625. Model = null
  13626. FlashMap:
  13627. Attributes = null
  13628. MockHttpServletResponse:
  13629. Status = 200
  13630. Error message = null
  13631. Headers = [X-Request-Id:"3vygFTkd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13632. Content type = application/json
  13633. Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691615}
  13634. Forwarded URL = null
  13635. Redirected URL = null
  13636. Cookies = []
  13637. 15:18:11.620 DEBUG [gQnthUv2] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?operationType=USER_LOGIN | IP: 127.0.0.1
  13638. 15:18:11.621 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13639. 15:18:11.621 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13640. 15:18:11.622 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13641. 15:18:11.627 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (operation_type = ?)
  13642. 15:18:11.627 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: USER_LOGIN(String)
  13643. 15:18:11.629 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
  13644. 15:18:11.629 DEBUG [gQnthUv2] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?operationType=USER_LOGIN 200 9ms
  13645. MockHttpServletRequest:
  13646. HTTP Method = GET
  13647. Request URI = /api/admin/audit-log
  13648. Parameters = {operationType=[USER_LOGIN]}
  13649. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13650. Body = null
  13651. Session Attrs = {}
  13652. Handler:
  13653. Type = com.xuekairui.user.controller.OperationAuditLogController
  13654. Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
  13655. Async:
  13656. Async started = false
  13657. Async result = null
  13658. Resolved Exception:
  13659. Type = null
  13660. ModelAndView:
  13661. View name = null
  13662. View = null
  13663. Model = null
  13664. FlashMap:
  13665. Attributes = null
  13666. MockHttpServletResponse:
  13667. Status = 200
  13668. Error message = null
  13669. Headers = [X-Request-Id:"gQnthUv2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13670. Content type = application/json
  13671. Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691629}
  13672. Forwarded URL = null
  13673. Redirected URL = null
  13674. Cookies = []
  13675. 15:18:11.636 DEBUG [SrDX528q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?operatorId=1 | IP: 127.0.0.1
  13676. 15:18:11.637 DEBUG [SrDX528q] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13677. 15:18:11.637 DEBUG [SrDX528q] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13678. 15:18:11.638 DEBUG [SrDX528q] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13679. 15:18:11.643 DEBUG [SrDX528q] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (operator_id = ?)
  13680. 15:18:11.643 DEBUG [SrDX528q] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: 1(Long)
  13681. 15:18:11.644 DEBUG [SrDX528q] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
  13682. 15:18:11.645 DEBUG [SrDX528q] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?operatorId=1 200 9ms
  13683. MockHttpServletRequest:
  13684. HTTP Method = GET
  13685. Request URI = /api/admin/audit-log
  13686. Parameters = {operatorId=[1]}
  13687. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13688. Body = null
  13689. Session Attrs = {}
  13690. Handler:
  13691. Type = com.xuekairui.user.controller.OperationAuditLogController
  13692. Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
  13693. Async:
  13694. Async started = false
  13695. Async result = null
  13696. Resolved Exception:
  13697. Type = null
  13698. ModelAndView:
  13699. View name = null
  13700. View = null
  13701. Model = null
  13702. FlashMap:
  13703. Attributes = null
  13704. MockHttpServletResponse:
  13705. Status = 200
  13706. Error message = null
  13707. Headers = [X-Request-Id:"SrDX528q", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13708. Content type = application/json
  13709. Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691645}
  13710. Forwarded URL = null
  13711. Redirected URL = null
  13712. Cookies = []
  13713. 15:18:11.650 DEBUG [KTAGdS8E] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?isSensitive=true | IP: 127.0.0.1
  13714. 15:18:11.650 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13715. 15:18:11.650 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13716. 15:18:11.652 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13717. 15:18:11.656 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (is_sensitive = ?)
  13718. 15:18:11.656 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: true(Boolean)
  13719. 15:18:11.659 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
  13720. 15:18:11.659 DEBUG [KTAGdS8E] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?isSensitive=true 200 9ms
  13721. MockHttpServletRequest:
  13722. HTTP Method = GET
  13723. Request URI = /api/admin/audit-log
  13724. Parameters = {isSensitive=[true]}
  13725. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13726. Body = null
  13727. Session Attrs = {}
  13728. Handler:
  13729. Type = com.xuekairui.user.controller.OperationAuditLogController
  13730. Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
  13731. Async:
  13732. Async started = false
  13733. Async result = null
  13734. Resolved Exception:
  13735. Type = null
  13736. ModelAndView:
  13737. View name = null
  13738. View = null
  13739. Model = null
  13740. FlashMap:
  13741. Attributes = null
  13742. MockHttpServletResponse:
  13743. Status = 200
  13744. Error message = null
  13745. Headers = [X-Request-Id:"KTAGdS8E", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13746. Content type = application/json
  13747. Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691659}
  13748. Forwarded URL = null
  13749. Redirected URL = null
  13750. Cookies = []
  13751. 15:18:11.665 DEBUG [KhH6urLQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?isSensitive=false | IP: 127.0.0.1
  13752. 15:18:11.666 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13753. 15:18:11.666 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13754. 15:18:11.667 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13755. 15:18:11.670 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (is_sensitive = ?)
  13756. 15:18:11.670 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: false(Boolean)
  13757. 15:18:11.673 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
  13758. 15:18:11.674 DEBUG [KhH6urLQ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?isSensitive=false 200 9ms
  13759. MockHttpServletRequest:
  13760. HTTP Method = GET
  13761. Request URI = /api/admin/audit-log
  13762. Parameters = {isSensitive=[false]}
  13763. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13764. Body = null
  13765. Session Attrs = {}
  13766. Handler:
  13767. Type = com.xuekairui.user.controller.OperationAuditLogController
  13768. Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
  13769. Async:
  13770. Async started = false
  13771. Async result = null
  13772. Resolved Exception:
  13773. Type = null
  13774. ModelAndView:
  13775. View name = null
  13776. View = null
  13777. Model = null
  13778. FlashMap:
  13779. Attributes = null
  13780. MockHttpServletResponse:
  13781. Status = 200
  13782. Error message = null
  13783. Headers = [X-Request-Id:"KhH6urLQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13784. Content type = application/json
  13785. Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691673}
  13786. Forwarded URL = null
  13787. Redirected URL = null
  13788. Cookies = []
  13789. 15:18:11.680 DEBUG [w7fWqg8P] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
  13790. 15:18:11.681 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13791. 15:18:11.681 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13792. 15:18:11.683 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13793. 15:18:11.692 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (operation_time >= ? AND operation_time <= ?)
  13794. 15:18:11.693 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: 2024-01-01T00:00(LocalDateTime), 2030-12-31T23:59:59(LocalDateTime)
  13795. 15:18:11.694 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
  13796. 15:18:11.695 DEBUG [w7fWqg8P] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 200 15ms
  13797. MockHttpServletRequest:
  13798. HTTP Method = GET
  13799. Request URI = /api/admin/audit-log
  13800. Parameters = {startTime=[2024-01-01T00:00:00], endTime=[2030-12-31T23:59:59]}
  13801. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13802. Body = null
  13803. Session Attrs = {}
  13804. Handler:
  13805. Type = com.xuekairui.user.controller.OperationAuditLogController
  13806. Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
  13807. Async:
  13808. Async started = false
  13809. Async result = null
  13810. Resolved Exception:
  13811. Type = null
  13812. ModelAndView:
  13813. View name = null
  13814. View = null
  13815. Model = null
  13816. FlashMap:
  13817. Attributes = null
  13818. MockHttpServletResponse:
  13819. Status = 200
  13820. Error message = null
  13821. Headers = [X-Request-Id:"w7fWqg8P", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13822. Content type = application/json
  13823. Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691695}
  13824. Forwarded URL = null
  13825. Redirected URL = null
  13826. Cookies = []
  13827. 15:18:11.701 DEBUG [A6uLPnwG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
  13828. 15:18:11.701 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13829. 15:18:11.701 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13830. 15:18:11.703 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13831. 15:18:11.707 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (module = ? AND operator_id = ?)
  13832. 15:18:11.707 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: USER(String), 1(Long)
  13833. 15:18:11.708 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
  13834. 15:18:11.709 DEBUG [A6uLPnwG] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 200 8ms
  13835. MockHttpServletRequest:
  13836. HTTP Method = GET
  13837. Request URI = /api/admin/audit-log
  13838. Parameters = {module=[USER], operatorId=[1], page=[1], size=[5]}
  13839. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13840. Body = null
  13841. Session Attrs = {}
  13842. Handler:
  13843. Type = com.xuekairui.user.controller.OperationAuditLogController
  13844. Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
  13845. Async:
  13846. Async started = false
  13847. Async result = null
  13848. Resolved Exception:
  13849. Type = null
  13850. ModelAndView:
  13851. View name = null
  13852. View = null
  13853. Model = null
  13854. FlashMap:
  13855. Attributes = null
  13856. MockHttpServletResponse:
  13857. Status = 200
  13858. Error message = null
  13859. Headers = [X-Request-Id:"A6uLPnwG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13860. Content type = application/json
  13861. Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":5,"current":1,"pages":0},"timestamp":1782976691708}
  13862. Forwarded URL = null
  13863. Redirected URL = null
  13864. Cookies = []
  13865. 15:18:11.713 DEBUG [GV5KFCU5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
  13866. 15:18:11.714 WARN [GV5KFCU5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 401 1ms
  13867. MockHttpServletRequest:
  13868. HTTP Method = GET
  13869. Request URI = /api/admin/audit-log
  13870. Parameters = {}
  13871. Headers = []
  13872. Body = null
  13873. Session Attrs = {}
  13874. Handler:
  13875. Type = null
  13876. Async:
  13877. Async started = false
  13878. Async result = null
  13879. Resolved Exception:
  13880. Type = null
  13881. ModelAndView:
  13882. View name = null
  13883. View = null
  13884. Model = null
  13885. FlashMap:
  13886. Attributes = null
  13887. MockHttpServletResponse:
  13888. Status = 401
  13889. Error message = null
  13890. Headers = [X-Request-Id:"GV5KFCU5", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13891. Content type = application/json;charset=UTF-8
  13892. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691714}
  13893. Forwarded URL = null
  13894. Redirected URL = null
  13895. Cookies = []
  13896. 15:18:11.721 DEBUG [UvuYtdUN] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
  13897. 15:18:11.722 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13898. 15:18:11.722 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13899. 15:18:11.724 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13900. 15:18:11.725 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.O.selectSensitiveLogs : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE is_sensitive = true AND operation_time >= ? ORDER BY operation_time DESC
  13901. 15:18:11.725 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.O.selectSensitiveLogs : ==> Parameters: null
  13902. 15:18:11.728 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.O.selectSensitiveLogs : <== Total: 0
  13903. 15:18:11.728 DEBUG [UvuYtdUN] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive 200 7ms
  13904. MockHttpServletRequest:
  13905. HTTP Method = GET
  13906. Request URI = /api/admin/audit-log/sensitive
  13907. Parameters = {}
  13908. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13909. Body = null
  13910. Session Attrs = {}
  13911. Handler:
  13912. Type = com.xuekairui.user.controller.OperationAuditLogController
  13913. Method = com.xuekairui.user.controller.OperationAuditLogController#getSensitiveLogs(LocalDateTime)
  13914. Async:
  13915. Async started = false
  13916. Async result = null
  13917. Resolved Exception:
  13918. Type = null
  13919. ModelAndView:
  13920. View name = null
  13921. View = null
  13922. Model = null
  13923. FlashMap:
  13924. Attributes = null
  13925. MockHttpServletResponse:
  13926. Status = 200
  13927. Error message = null
  13928. Headers = [X-Request-Id:"UvuYtdUN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13929. Content type = application/json
  13930. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691728}
  13931. Forwarded URL = null
  13932. Redirected URL = null
  13933. Cookies = []
  13934. 15:18:11.735 DEBUG [FL6aeUZc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
  13935. 15:18:11.736 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  13936. 15:18:11.736 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  13937. 15:18:11.738 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  13938. 15:18:11.739 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.O.selectSensitiveLogs : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE is_sensitive = true AND operation_time >= ? ORDER BY operation_time DESC
  13939. 15:18:11.739 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.O.selectSensitiveLogs : ==> Parameters: 2024-01-01T00:00(LocalDateTime)
  13940. 15:18:11.741 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.O.selectSensitiveLogs : <== Total: 0
  13941. 15:18:11.742 DEBUG [FL6aeUZc] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive 200 7ms
  13942. MockHttpServletRequest:
  13943. HTTP Method = GET
  13944. Request URI = /api/admin/audit-log/sensitive
  13945. Parameters = {startTime=[2024-01-01T00:00:00]}
  13946. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  13947. Body = null
  13948. Session Attrs = {}
  13949. Handler:
  13950. Type = com.xuekairui.user.controller.OperationAuditLogController
  13951. Method = com.xuekairui.user.controller.OperationAuditLogController#getSensitiveLogs(LocalDateTime)
  13952. Async:
  13953. Async started = false
  13954. Async result = null
  13955. Resolved Exception:
  13956. Type = null
  13957. ModelAndView:
  13958. View name = null
  13959. View = null
  13960. Model = null
  13961. FlashMap:
  13962. Attributes = null
  13963. MockHttpServletResponse:
  13964. Status = 200
  13965. Error message = null
  13966. Headers = [X-Request-Id:"FL6aeUZc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13967. Content type = application/json
  13968. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691741}
  13969. Forwarded URL = null
  13970. Redirected URL = null
  13971. Cookies = []
  13972. 15:18:11.745 DEBUG [9sPcUeRS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
  13973. 15:18:11.746 WARN [9sPcUeRS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive 401 1ms
  13974. MockHttpServletRequest:
  13975. HTTP Method = GET
  13976. Request URI = /api/admin/audit-log/sensitive
  13977. Parameters = {}
  13978. Headers = []
  13979. Body = null
  13980. Session Attrs = {}
  13981. Handler:
  13982. Type = null
  13983. Async:
  13984. Async started = false
  13985. Async result = null
  13986. Resolved Exception:
  13987. Type = null
  13988. ModelAndView:
  13989. View name = null
  13990. View = null
  13991. Model = null
  13992. FlashMap:
  13993. Attributes = null
  13994. MockHttpServletResponse:
  13995. Status = 401
  13996. Error message = null
  13997. Headers = [X-Request-Id:"9sPcUeRS", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  13998. Content type = application/json;charset=UTF-8
  13999. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691745}
  14000. Forwarded URL = null
  14001. Redirected URL = null
  14002. Cookies = []
  14003. 15:18:11.754 DEBUG [PB7crpdZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
  14004. 15:18:11.756 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14005. 15:18:11.756 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14006. 15:18:11.758 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14007. 15:18:11.759 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE operator_id = ? ORDER BY operation_time DESC LIMIT ?
  14008. 15:18:11.760 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Parameters: 1(Long), 50(Integer)
  14009. 15:18:11.761 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.O.selectByOperatorId : <== Total: 0
  14010. 15:18:11.762 DEBUG [PB7crpdZ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 200 10ms
  14011. MockHttpServletRequest:
  14012. HTTP Method = GET
  14013. Request URI = /api/admin/audit-log/user/1
  14014. Parameters = {}
  14015. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14016. Body = null
  14017. Session Attrs = {}
  14018. Handler:
  14019. Type = com.xuekairui.user.controller.OperationAuditLogController
  14020. Method = com.xuekairui.user.controller.OperationAuditLogController#getUserLogs(Long, int)
  14021. Async:
  14022. Async started = false
  14023. Async result = null
  14024. Resolved Exception:
  14025. Type = null
  14026. ModelAndView:
  14027. View name = null
  14028. View = null
  14029. Model = null
  14030. FlashMap:
  14031. Attributes = null
  14032. MockHttpServletResponse:
  14033. Status = 200
  14034. Error message = null
  14035. Headers = [X-Request-Id:"PB7crpdZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14036. Content type = application/json
  14037. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691761}
  14038. Forwarded URL = null
  14039. Redirected URL = null
  14040. Cookies = []
  14041. 15:18:11.769 DEBUG [zcvV3WWv] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1?limit=10 | IP: 127.0.0.1
  14042. 15:18:11.769 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14043. 15:18:11.770 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14044. 15:18:11.771 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14045. 15:18:11.772 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE operator_id = ? ORDER BY operation_time DESC LIMIT ?
  14046. 15:18:11.773 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Parameters: 1(Long), 10(Integer)
  14047. 15:18:11.775 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.O.selectByOperatorId : <== Total: 0
  14048. 15:18:11.776 DEBUG [zcvV3WWv] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1?limit=10 200 7ms
  14049. MockHttpServletRequest:
  14050. HTTP Method = GET
  14051. Request URI = /api/admin/audit-log/user/1
  14052. Parameters = {limit=[10]}
  14053. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14054. Body = null
  14055. Session Attrs = {}
  14056. Handler:
  14057. Type = com.xuekairui.user.controller.OperationAuditLogController
  14058. Method = com.xuekairui.user.controller.OperationAuditLogController#getUserLogs(Long, int)
  14059. Async:
  14060. Async started = false
  14061. Async result = null
  14062. Resolved Exception:
  14063. Type = null
  14064. ModelAndView:
  14065. View name = null
  14066. View = null
  14067. Model = null
  14068. FlashMap:
  14069. Attributes = null
  14070. MockHttpServletResponse:
  14071. Status = 200
  14072. Error message = null
  14073. Headers = [X-Request-Id:"zcvV3WWv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14074. Content type = application/json
  14075. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691775}
  14076. Forwarded URL = null
  14077. Redirected URL = null
  14078. Cookies = []
  14079. 15:18:11.783 DEBUG [P6m5Zsx8] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/99999 | IP: 127.0.0.1
  14080. 15:18:11.789 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14081. 15:18:11.789 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14082. 15:18:11.791 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14083. 15:18:11.793 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE operator_id = ? ORDER BY operation_time DESC LIMIT ?
  14084. 15:18:11.793 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Parameters: 99999(Long), 50(Integer)
  14085. 15:18:11.795 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.O.selectByOperatorId : <== Total: 0
  14086. 15:18:11.796 DEBUG [P6m5Zsx8] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/99999 200 13ms
  14087. MockHttpServletRequest:
  14088. HTTP Method = GET
  14089. Request URI = /api/admin/audit-log/user/99999
  14090. Parameters = {}
  14091. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14092. Body = null
  14093. Session Attrs = {}
  14094. Handler:
  14095. Type = com.xuekairui.user.controller.OperationAuditLogController
  14096. Method = com.xuekairui.user.controller.OperationAuditLogController#getUserLogs(Long, int)
  14097. Async:
  14098. Async started = false
  14099. Async result = null
  14100. Resolved Exception:
  14101. Type = null
  14102. ModelAndView:
  14103. View name = null
  14104. View = null
  14105. Model = null
  14106. FlashMap:
  14107. Attributes = null
  14108. MockHttpServletResponse:
  14109. Status = 200
  14110. Error message = null
  14111. Headers = [X-Request-Id:"P6m5Zsx8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14112. Content type = application/json
  14113. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691795}
  14114. Forwarded URL = null
  14115. Redirected URL = null
  14116. Cookies = []
  14117. 15:18:11.800 DEBUG [YZgJ6zUE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
  14118. 15:18:11.802 WARN [YZgJ6zUE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 401 2ms
  14119. MockHttpServletRequest:
  14120. HTTP Method = GET
  14121. Request URI = /api/admin/audit-log/user/1
  14122. Parameters = {}
  14123. Headers = []
  14124. Body = null
  14125. Session Attrs = {}
  14126. Handler:
  14127. Type = null
  14128. Async:
  14129. Async started = false
  14130. Async result = null
  14131. Resolved Exception:
  14132. Type = null
  14133. ModelAndView:
  14134. View name = null
  14135. View = null
  14136. Model = null
  14137. FlashMap:
  14138. Attributes = null
  14139. MockHttpServletResponse:
  14140. Status = 401
  14141. Error message = null
  14142. Headers = [X-Request-Id:"YZgJ6zUE", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14143. Content type = application/json;charset=UTF-8
  14144. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691801}
  14145. Forwarded URL = null
  14146. Redirected URL = null
  14147. Cookies = []
  14148. 15:18:11.808 DEBUG [XvY6LZJt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
  14149. 15:18:11.809 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14150. 15:18:11.809 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14151. 15:18:11.811 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14152. 15:18:11.812 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
  14153. 15:18:11.812 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: USER(String), 1(Long), 50(Integer)
  14154. 15:18:11.815 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
  14155. 15:18:11.816 DEBUG [XvY6LZJt] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 200 8ms
  14156. MockHttpServletRequest:
  14157. HTTP Method = GET
  14158. Request URI = /api/admin/audit-log/target/USER/1
  14159. Parameters = {}
  14160. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14161. Body = null
  14162. Session Attrs = {}
  14163. Handler:
  14164. Type = com.xuekairui.user.controller.OperationAuditLogController
  14165. Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
  14166. Async:
  14167. Async started = false
  14168. Async result = null
  14169. Resolved Exception:
  14170. Type = null
  14171. ModelAndView:
  14172. View name = null
  14173. View = null
  14174. Model = null
  14175. FlashMap:
  14176. Attributes = null
  14177. MockHttpServletResponse:
  14178. Status = 200
  14179. Error message = null
  14180. Headers = [X-Request-Id:"XvY6LZJt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14181. Content type = application/json
  14182. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691815}
  14183. Forwarded URL = null
  14184. Redirected URL = null
  14185. Cookies = []
  14186. 15:18:11.822 DEBUG [6sysmkbw] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LEVEL_CONFIG/1?limit=20 | IP: 127.0.0.1
  14187. 15:18:11.823 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14188. 15:18:11.823 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14189. 15:18:11.826 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14190. 15:18:11.827 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
  14191. 15:18:11.827 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: LEVEL_CONFIG(String), 1(Long), 20(Integer)
  14192. 15:18:11.828 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
  14193. 15:18:11.829 DEBUG [6sysmkbw] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LEVEL_CONFIG/1?limit=20 200 7ms
  14194. MockHttpServletRequest:
  14195. HTTP Method = GET
  14196. Request URI = /api/admin/audit-log/target/LEVEL_CONFIG/1
  14197. Parameters = {limit=[20]}
  14198. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14199. Body = null
  14200. Session Attrs = {}
  14201. Handler:
  14202. Type = com.xuekairui.user.controller.OperationAuditLogController
  14203. Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
  14204. Async:
  14205. Async started = false
  14206. Async result = null
  14207. Resolved Exception:
  14208. Type = null
  14209. ModelAndView:
  14210. View name = null
  14211. View = null
  14212. Model = null
  14213. FlashMap:
  14214. Attributes = null
  14215. MockHttpServletResponse:
  14216. Status = 200
  14217. Error message = null
  14218. Headers = [X-Request-Id:"6sysmkbw", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14219. Content type = application/json
  14220. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691828}
  14221. Forwarded URL = null
  14222. Redirected URL = null
  14223. Cookies = []
  14224. 15:18:11.835 DEBUG [tae52s5m] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
  14225. 15:18:11.836 DEBUG [tae52s5m] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14226. 15:18:11.836 DEBUG [tae52s5m] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14227. 15:18:11.839 DEBUG [tae52s5m] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14228. 15:18:11.840 DEBUG [tae52s5m] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
  14229. 15:18:11.840 DEBUG [tae52s5m] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: USER(String), 1(Long), 50(Integer)
  14230. 15:18:11.842 DEBUG [tae52s5m] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
  14231. 15:18:11.843 DEBUG [tae52s5m] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 200 8ms
  14232. MockHttpServletRequest:
  14233. HTTP Method = GET
  14234. Request URI = /api/admin/audit-log/target/USER/1
  14235. Parameters = {}
  14236. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14237. Body = null
  14238. Session Attrs = {}
  14239. Handler:
  14240. Type = com.xuekairui.user.controller.OperationAuditLogController
  14241. Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
  14242. Async:
  14243. Async started = false
  14244. Async result = null
  14245. Resolved Exception:
  14246. Type = null
  14247. ModelAndView:
  14248. View name = null
  14249. View = null
  14250. Model = null
  14251. FlashMap:
  14252. Attributes = null
  14253. MockHttpServletResponse:
  14254. Status = 200
  14255. Error message = null
  14256. Headers = [X-Request-Id:"tae52s5m", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14257. Content type = application/json
  14258. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691842}
  14259. Forwarded URL = null
  14260. Redirected URL = null
  14261. Cookies = []
  14262. 15:18:11.846 DEBUG [hUzGWdDc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LEVEL_CONFIG/1 | IP: 127.0.0.1
  14263. 15:18:11.847 DEBUG [hUzGWdDc] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
  14264. 15:18:11.848 DEBUG [hUzGWdDc] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: LEVEL_CONFIG(String), 1(Long), 50(Integer)
  14265. 15:18:11.849 DEBUG [hUzGWdDc] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
  14266. 15:18:11.850 DEBUG [hUzGWdDc] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LEVEL_CONFIG/1 200 4ms
  14267. MockHttpServletRequest:
  14268. HTTP Method = GET
  14269. Request URI = /api/admin/audit-log/target/LEVEL_CONFIG/1
  14270. Parameters = {}
  14271. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14272. Body = null
  14273. Session Attrs = {}
  14274. Handler:
  14275. Type = com.xuekairui.user.controller.OperationAuditLogController
  14276. Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
  14277. Async:
  14278. Async started = false
  14279. Async result = null
  14280. Resolved Exception:
  14281. Type = null
  14282. ModelAndView:
  14283. View name = null
  14284. View = null
  14285. Model = null
  14286. FlashMap:
  14287. Attributes = null
  14288. MockHttpServletResponse:
  14289. Status = 200
  14290. Error message = null
  14291. Headers = [X-Request-Id:"hUzGWdDc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14292. Content type = application/json
  14293. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691849}
  14294. Forwarded URL = null
  14295. Redirected URL = null
  14296. Cookies = []
  14297. 15:18:11.853 DEBUG [CTYCZSJb] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/PLATFORM/1 | IP: 127.0.0.1
  14298. 15:18:11.854 DEBUG [CTYCZSJb] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
  14299. 15:18:11.854 DEBUG [CTYCZSJb] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: PLATFORM(String), 1(Long), 50(Integer)
  14300. 15:18:11.856 DEBUG [CTYCZSJb] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
  14301. 15:18:11.858 DEBUG [CTYCZSJb] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/PLATFORM/1 200 5ms
  14302. MockHttpServletRequest:
  14303. HTTP Method = GET
  14304. Request URI = /api/admin/audit-log/target/PLATFORM/1
  14305. Parameters = {}
  14306. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14307. Body = null
  14308. Session Attrs = {}
  14309. Handler:
  14310. Type = com.xuekairui.user.controller.OperationAuditLogController
  14311. Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
  14312. Async:
  14313. Async started = false
  14314. Async result = null
  14315. Resolved Exception:
  14316. Type = null
  14317. ModelAndView:
  14318. View name = null
  14319. View = null
  14320. Model = null
  14321. FlashMap:
  14322. Attributes = null
  14323. MockHttpServletResponse:
  14324. Status = 200
  14325. Error message = null
  14326. Headers = [X-Request-Id:"CTYCZSJb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14327. Content type = application/json
  14328. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691857}
  14329. Forwarded URL = null
  14330. Redirected URL = null
  14331. Cookies = []
  14332. 15:18:11.861 DEBUG [gVKCzyT3] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LICENSE/1 | IP: 127.0.0.1
  14333. 15:18:11.863 DEBUG [gVKCzyT3] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
  14334. 15:18:11.864 DEBUG [gVKCzyT3] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: LICENSE(String), 1(Long), 50(Integer)
  14335. 15:18:11.865 DEBUG [gVKCzyT3] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
  14336. 15:18:11.866 DEBUG [gVKCzyT3] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LICENSE/1 200 5ms
  14337. MockHttpServletRequest:
  14338. HTTP Method = GET
  14339. Request URI = /api/admin/audit-log/target/LICENSE/1
  14340. Parameters = {}
  14341. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14342. Body = null
  14343. Session Attrs = {}
  14344. Handler:
  14345. Type = com.xuekairui.user.controller.OperationAuditLogController
  14346. Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
  14347. Async:
  14348. Async started = false
  14349. Async result = null
  14350. Resolved Exception:
  14351. Type = null
  14352. ModelAndView:
  14353. View name = null
  14354. View = null
  14355. Model = null
  14356. FlashMap:
  14357. Attributes = null
  14358. MockHttpServletResponse:
  14359. Status = 200
  14360. Error message = null
  14361. Headers = [X-Request-Id:"gVKCzyT3", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14362. Content type = application/json
  14363. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691865}
  14364. Forwarded URL = null
  14365. Redirected URL = null
  14366. Cookies = []
  14367. 15:18:11.869 DEBUG [EusDZXU9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/INVITE/1 | IP: 127.0.0.1
  14368. 15:18:11.870 DEBUG [EusDZXU9] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
  14369. 15:18:11.870 DEBUG [EusDZXU9] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: INVITE(String), 1(Long), 50(Integer)
  14370. 15:18:11.872 DEBUG [EusDZXU9] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
  14371. 15:18:11.873 DEBUG [EusDZXU9] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/INVITE/1 200 4ms
  14372. MockHttpServletRequest:
  14373. HTTP Method = GET
  14374. Request URI = /api/admin/audit-log/target/INVITE/1
  14375. Parameters = {}
  14376. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14377. Body = null
  14378. Session Attrs = {}
  14379. Handler:
  14380. Type = com.xuekairui.user.controller.OperationAuditLogController
  14381. Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
  14382. Async:
  14383. Async started = false
  14384. Async result = null
  14385. Resolved Exception:
  14386. Type = null
  14387. ModelAndView:
  14388. View name = null
  14389. View = null
  14390. Model = null
  14391. FlashMap:
  14392. Attributes = null
  14393. MockHttpServletResponse:
  14394. Status = 200
  14395. Error message = null
  14396. Headers = [X-Request-Id:"EusDZXU9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14397. Content type = application/json
  14398. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691872}
  14399. Forwarded URL = null
  14400. Redirected URL = null
  14401. Cookies = []
  14402. 15:18:11.876 DEBUG [y2pEKWMS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/COUPON/1 | IP: 127.0.0.1
  14403. 15:18:11.877 DEBUG [y2pEKWMS] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
  14404. 15:18:11.878 DEBUG [y2pEKWMS] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: COUPON(String), 1(Long), 50(Integer)
  14405. 15:18:11.879 DEBUG [y2pEKWMS] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
  14406. 15:18:11.880 DEBUG [y2pEKWMS] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/COUPON/1 200 4ms
  14407. MockHttpServletRequest:
  14408. HTTP Method = GET
  14409. Request URI = /api/admin/audit-log/target/COUPON/1
  14410. Parameters = {}
  14411. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14412. Body = null
  14413. Session Attrs = {}
  14414. Handler:
  14415. Type = com.xuekairui.user.controller.OperationAuditLogController
  14416. Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
  14417. Async:
  14418. Async started = false
  14419. Async result = null
  14420. Resolved Exception:
  14421. Type = null
  14422. ModelAndView:
  14423. View name = null
  14424. View = null
  14425. Model = null
  14426. FlashMap:
  14427. Attributes = null
  14428. MockHttpServletResponse:
  14429. Status = 200
  14430. Error message = null
  14431. Headers = [X-Request-Id:"y2pEKWMS", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14432. Content type = application/json
  14433. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691879}
  14434. Forwarded URL = null
  14435. Redirected URL = null
  14436. Cookies = []
  14437. 15:18:11.884 DEBUG [KFgx2Chc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
  14438. 15:18:11.885 WARN [KFgx2Chc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 401 1ms
  14439. MockHttpServletRequest:
  14440. HTTP Method = GET
  14441. Request URI = /api/admin/audit-log/target/USER/1
  14442. Parameters = {}
  14443. Headers = []
  14444. Body = null
  14445. Session Attrs = {}
  14446. Handler:
  14447. Type = null
  14448. Async:
  14449. Async started = false
  14450. Async result = null
  14451. Resolved Exception:
  14452. Type = null
  14453. ModelAndView:
  14454. View name = null
  14455. View = null
  14456. Model = null
  14457. FlashMap:
  14458. Attributes = null
  14459. MockHttpServletResponse:
  14460. Status = 401
  14461. Error message = null
  14462. Headers = [X-Request-Id:"KFgx2Chc", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14463. Content type = application/json;charset=UTF-8
  14464. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691884}
  14465. Forwarded URL = null
  14466. Redirected URL = null
  14467. Cookies = []
  14468. 15:18:11.891 DEBUG [sQ8Sv4yp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER | IP: 127.0.0.1
  14469. 15:18:11.892 DEBUG [sQ8Sv4yp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14470. 15:18:11.892 DEBUG [sQ8Sv4yp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14471. 15:18:11.894 DEBUG [sQ8Sv4yp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14472. 15:18:11.895 DEBUG [sQ8Sv4yp] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Preparing: SELECT COUNT(*) FROM t_operation_audit_log WHERE module = ? AND operation_time >= ? AND operation_time <= ?
  14473. 15:18:11.895 DEBUG [sQ8Sv4yp] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Parameters: USER(String), null, null
  14474. 15:18:11.896 DEBUG [sQ8Sv4yp] [1] [ main] .m.O.countByModuleAndTimeRange : <== Total: 1
  14475. 15:18:11.898 DEBUG [sQ8Sv4yp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER 200 7ms
  14476. MockHttpServletRequest:
  14477. HTTP Method = GET
  14478. Request URI = /api/admin/audit-log/stats
  14479. Parameters = {module=[USER]}
  14480. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14481. Body = null
  14482. Session Attrs = {}
  14483. Handler:
  14484. Type = com.xuekairui.user.controller.OperationAuditLogController
  14485. Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)
  14486. Async:
  14487. Async started = false
  14488. Async result = null
  14489. Resolved Exception:
  14490. Type = null
  14491. ModelAndView:
  14492. View name = null
  14493. View = null
  14494. Model = null
  14495. FlashMap:
  14496. Attributes = null
  14497. MockHttpServletResponse:
  14498. Status = 200
  14499. Error message = null
  14500. Headers = [X-Request-Id:"sQ8Sv4yp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14501. Content type = application/json
  14502. Body = {"code":200,"message":"操作成功","data":{"count":0},"timestamp":1782976691896}
  14503. Forwarded URL = null
  14504. Redirected URL = null
  14505. Cookies = []
  14506. 15:18:11.903 DEBUG [FdxkNSGd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=LEVEL | IP: 127.0.0.1
  14507. 15:18:11.904 DEBUG [FdxkNSGd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14508. 15:18:11.904 DEBUG [FdxkNSGd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14509. 15:18:11.906 DEBUG [FdxkNSGd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14510. 15:18:11.907 DEBUG [FdxkNSGd] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Preparing: SELECT COUNT(*) FROM t_operation_audit_log WHERE module = ? AND operation_time >= ? AND operation_time <= ?
  14511. 15:18:11.907 DEBUG [FdxkNSGd] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Parameters: LEVEL(String), null, null
  14512. 15:18:11.908 DEBUG [FdxkNSGd] [1] [ main] .m.O.countByModuleAndTimeRange : <== Total: 1
  14513. 15:18:11.909 DEBUG [FdxkNSGd] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=LEVEL 200 6ms
  14514. MockHttpServletRequest:
  14515. HTTP Method = GET
  14516. Request URI = /api/admin/audit-log/stats
  14517. Parameters = {module=[LEVEL]}
  14518. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14519. Body = null
  14520. Session Attrs = {}
  14521. Handler:
  14522. Type = com.xuekairui.user.controller.OperationAuditLogController
  14523. Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)
  14524. Async:
  14525. Async started = false
  14526. Async result = null
  14527. Resolved Exception:
  14528. Type = null
  14529. ModelAndView:
  14530. View name = null
  14531. View = null
  14532. Model = null
  14533. FlashMap:
  14534. Attributes = null
  14535. MockHttpServletResponse:
  14536. Status = 200
  14537. Error message = null
  14538. Headers = [X-Request-Id:"FdxkNSGd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14539. Content type = application/json
  14540. Body = {"code":200,"message":"操作成功","data":{"count":0},"timestamp":1782976691909}
  14541. Forwarded URL = null
  14542. Redirected URL = null
  14543. Cookies = []
  14544. 15:18:11.914 DEBUG [ZvRyZ59a] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats | IP: 127.0.0.1
  14545. 15:18:11.915 DEBUG [ZvRyZ59a] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14546. 15:18:11.915 DEBUG [ZvRyZ59a] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14547. 15:18:11.916 DEBUG [ZvRyZ59a] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14548. 15:18:11.917 DEBUG [ZvRyZ59a] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Preparing: SELECT COUNT(*) FROM t_operation_audit_log WHERE module = ? AND operation_time >= ? AND operation_time <= ?
  14549. 15:18:11.917 DEBUG [ZvRyZ59a] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Parameters: USER(String), 2024-01-01T00:00(LocalDateTime), 2030-12-31T23:59:59(LocalDateTime)
  14550. 15:18:11.919 DEBUG [ZvRyZ59a] [1] [ main] .m.O.countByModuleAndTimeRange : <== Total: 1
  14551. 15:18:11.920 DEBUG [ZvRyZ59a] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats 200 6ms
  14552. MockHttpServletRequest:
  14553. HTTP Method = GET
  14554. Request URI = /api/admin/audit-log/stats
  14555. Parameters = {module=[USER], startTime=[2024-01-01T00:00:00], endTime=[2030-12-31T23:59:59]}
  14556. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14557. Body = null
  14558. Session Attrs = {}
  14559. Handler:
  14560. Type = com.xuekairui.user.controller.OperationAuditLogController
  14561. Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)
  14562. Async:
  14563. Async started = false
  14564. Async result = null
  14565. Resolved Exception:
  14566. Type = null
  14567. ModelAndView:
  14568. View name = null
  14569. View = null
  14570. Model = null
  14571. FlashMap:
  14572. Attributes = null
  14573. MockHttpServletResponse:
  14574. Status = 200
  14575. Error message = null
  14576. Headers = [X-Request-Id:"ZvRyZ59a", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14577. Content type = application/json
  14578. Body = {"code":200,"message":"操作成功","data":{"count":0},"timestamp":1782976691919}
  14579. Forwarded URL = null
  14580. Redirected URL = null
  14581. Cookies = []
  14582. 15:18:11.925 DEBUG [cC3T6zhb] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats | IP: 127.0.0.1
  14583. 15:18:11.926 DEBUG [cC3T6zhb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14584. 15:18:11.926 DEBUG [cC3T6zhb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14585. 15:18:11.928 DEBUG [cC3T6zhb] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14586. 15:18:11.929 ERROR [cC3T6zhb] [1] [ main] c.x.h.GlobalExceptionHandler : 系统异常
  14587. org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'module' for method parameter type String is not present
  14588. at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueInternal(RequestParamMethodArgumentResolver.java:220)
  14589. at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:196)
  14590. at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:125)
  14591. at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
  14592. at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227)
  14593. at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181)
  14594. at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
  14595. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)
  14596. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)
  14597. at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
  14598. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
  14599. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
  14600. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
  14601. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
  14602. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
  14603. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
  14604. at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
  14605. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
  14606. at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
  14607. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  14608. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
  14609. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  14610. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  14611. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
  14612. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
  14613. at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
  14614. at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
  14615. at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
  14616. at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
  14617. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
  14618. at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
  14619. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14620. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14621. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14622. at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
  14623. at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
  14624. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14625. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14626. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14627. at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
  14628. at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
  14629. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14630. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14631. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14632. at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
  14633. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14634. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14635. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14636. at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
  14637. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14638. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14639. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14640. at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
  14641. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14642. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14643. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14644. at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
  14645. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14646. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14647. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14648. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14649. at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
  14650. at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
  14651. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14652. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14653. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14654. at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
  14655. at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
  14656. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14657. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14658. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14659. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14660. at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
  14661. at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
  14662. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14663. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14664. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14665. at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
  14666. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14667. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14668. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  14669. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14670. at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
  14671. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14672. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  14673. at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
  14674. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
  14675. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  14676. at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
  14677. at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
  14678. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  14679. at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
  14680. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  14681. at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
  14682. at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
  14683. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  14684. at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
  14685. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  14686. at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
  14687. at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
  14688. at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
  14689. at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
  14690. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  14691. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  14692. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
  14693. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14694. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  14695. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  14696. at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
  14697. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14698. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  14699. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  14700. at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
  14701. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14702. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  14703. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  14704. at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
  14705. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14706. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  14707. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  14708. at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
  14709. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14710. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  14711. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  14712. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
  14713. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  14714. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  14715. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  14716. at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
  14717. at com.xuekairui.gateway.OperationAuditLogTest.getStats_missingModule_shouldReturnError(OperationAuditLogTest.java:302)
  14718. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  14719. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  14720. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  14721. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  14722. at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
  14723. at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
  14724. at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
  14725. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
  14726. at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
  14727. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
  14728. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
  14729. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
  14730. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
  14731. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
  14732. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
  14733. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
  14734. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
  14735. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
  14736. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
  14737. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
  14738. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  14739. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
  14740. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
  14741. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
  14742. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
  14743. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  14744. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  14745. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  14746. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  14747. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  14748. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  14749. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  14750. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  14751. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  14752. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  14753. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  14754. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  14755. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  14756. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  14757. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  14758. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  14759. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  14760. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  14761. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  14762. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  14763. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  14764. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  14765. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  14766. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  14767. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  14768. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  14769. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  14770. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
  14771. at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
  14772. at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
  14773. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
  14774. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
  14775. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
  14776. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
  14777. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
  14778. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
  14779. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
  14780. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
  14781. at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
  14782. at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
  14783. at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
  14784. at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
  14785. at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
  14786. at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
  14787. at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
  14788. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
  14789. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
  14790. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
  14791. at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
  14792. at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
  14793. at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
  14794. at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
  14795. 15:18:11.930 WARN [cC3T6zhb] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats 500 5ms
  14796. MockHttpServletRequest:
  14797. HTTP Method = GET
  14798. Request URI = /api/admin/audit-log/stats
  14799. Parameters = {}
  14800. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
  14801. Body = null
  14802. Session Attrs = {}
  14803. Handler:
  14804. Type = com.xuekairui.user.controller.OperationAuditLogController
  14805. Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)
  14806. Async:
  14807. Async started = false
  14808. Async result = null
  14809. Resolved Exception:
  14810. Type = org.springframework.web.bind.MissingServletRequestParameterException
  14811. ModelAndView:
  14812. View name = null
  14813. View = null
  14814. Model = null
  14815. FlashMap:
  14816. Attributes = null
  14817. MockHttpServletResponse:
  14818. Status = 500
  14819. Error message = null
  14820. Headers = [X-Request-Id:"cC3T6zhb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14821. Content type = application/json
  14822. Body = {"code":500,"message":"系统繁忙,请稍后重试","data":null,"timestamp":1782976691929}
  14823. Forwarded URL = null
  14824. Redirected URL = null
  14825. Cookies = []
  14826. 15:18:11.933 DEBUG [LHTz3ACk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER | IP: 127.0.0.1
  14827. 15:18:11.934 WARN [LHTz3ACk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER 401 2ms
  14828. MockHttpServletRequest:
  14829. HTTP Method = GET
  14830. Request URI = /api/admin/audit-log/stats
  14831. Parameters = {module=[USER]}
  14832. Headers = []
  14833. Body = null
  14834. Session Attrs = {}
  14835. Handler:
  14836. Type = null
  14837. Async:
  14838. Async started = false
  14839. Async result = null
  14840. Resolved Exception:
  14841. Type = null
  14842. ModelAndView:
  14843. View name = null
  14844. View = null
  14845. Model = null
  14846. FlashMap:
  14847. Attributes = null
  14848. MockHttpServletResponse:
  14849. Status = 401
  14850. Error message = null
  14851. Headers = [X-Request-Id:"LHTz3ACk", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14852. Content type = application/json;charset=UTF-8
  14853. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691933}
  14854. Forwarded URL = null
  14855. Redirected URL = null
  14856. Cookies = []
  14857. [INFO] Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.346 s -- in 操作审计日志接口测试
  14858. [INFO] Running 支付模块接口测试
  14859. 15:18:11.938 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.PaymentControllerTest]: PaymentControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  14860. 15:18:11.940 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.PaymentControllerTest
  14861. 15:18:14.899 DEBUG [KbgqtCF9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/plans | IP: 127.0.0.1
  14862. 15:18:14.900 DEBUG [KbgqtCF9] [] [ main] c.x.p.m.P.selectList : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE (status = ?) ORDER BY sort_order ASC
  14863. 15:18:14.900 DEBUG [KbgqtCF9] [] [ main] c.x.p.m.P.selectList : ==> Parameters: 1(Integer)
  14864. 15:18:14.902 DEBUG [KbgqtCF9] [] [ main] c.x.p.m.P.selectList : <== Total: 2
  14865. 15:18:14.904 DEBUG [KbgqtCF9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/plans 200 5ms
  14866. MockHttpServletRequest:
  14867. HTTP Method = GET
  14868. Request URI = /api/payment/plans
  14869. Parameters = {}
  14870. Headers = []
  14871. Body = null
  14872. Session Attrs = {}
  14873. Handler:
  14874. Type = com.xuekairui.payment.controller.PaymentController
  14875. Method = com.xuekairui.payment.controller.PaymentController#getPlans()
  14876. Async:
  14877. Async started = false
  14878. Async result = null
  14879. Resolved Exception:
  14880. Type = null
  14881. ModelAndView:
  14882. View name = null
  14883. View = null
  14884. Model = null
  14885. FlashMap:
  14886. Attributes = null
  14887. MockHttpServletResponse:
  14888. Status = 200
  14889. Error message = null
  14890. Headers = [X-Request-Id:"KbgqtCF9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14891. Content type = application/json
  14892. Body = {"code":200,"message":"操作成功","data":[{"id":1,"planName":"高级会员·月卡","planCode":"MONTHLY_PRO","membershipLevel":"PRO","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9(原价59.9)","tag":"省50%","sortOrder":3},{"id":2,"planName":"高级会员·年卡","planCode":"YEARLY_PRO","membershipLevel":"PRO","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9(原价599.9)","tag":"省50%","sortOrder":4}],"timestamp":1782976694903}
  14893. Forwarded URL = null
  14894. Redirected URL = null
  14895. Cookies = []
  14896. 15:18:14.908 DEBUG [fP8HbJrH] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/plans | IP: 127.0.0.1
  14897. 15:18:14.909 DEBUG [fP8HbJrH] [] [ main] c.x.p.m.P.selectList : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE (status = ?) ORDER BY sort_order ASC
  14898. 15:18:14.909 DEBUG [fP8HbJrH] [] [ main] c.x.p.m.P.selectList : ==> Parameters: 1(Integer)
  14899. 15:18:14.911 DEBUG [fP8HbJrH] [] [ main] c.x.p.m.P.selectList : <== Total: 2
  14900. 15:18:14.912 DEBUG [fP8HbJrH] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/plans 200 4ms
  14901. MockHttpServletRequest:
  14902. HTTP Method = GET
  14903. Request URI = /api/payment/plans
  14904. Parameters = {}
  14905. Headers = []
  14906. Body = null
  14907. Session Attrs = {}
  14908. Handler:
  14909. Type = com.xuekairui.payment.controller.PaymentController
  14910. Method = com.xuekairui.payment.controller.PaymentController#getPlans()
  14911. Async:
  14912. Async started = false
  14913. Async result = null
  14914. Resolved Exception:
  14915. Type = null
  14916. ModelAndView:
  14917. View name = null
  14918. View = null
  14919. Model = null
  14920. FlashMap:
  14921. Attributes = null
  14922. MockHttpServletResponse:
  14923. Status = 200
  14924. Error message = null
  14925. Headers = [X-Request-Id:"fP8HbJrH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14926. Content type = application/json
  14927. Body = {"code":200,"message":"操作成功","data":[{"id":1,"planName":"高级会员·月卡","planCode":"MONTHLY_PRO","membershipLevel":"PRO","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9(原价59.9)","tag":"省50%","sortOrder":3},{"id":2,"planName":"高级会员·年卡","planCode":"YEARLY_PRO","membershipLevel":"PRO","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9(原价599.9)","tag":"省50%","sortOrder":4}],"timestamp":1782976694911}
  14928. Forwarded URL = null
  14929. Redirected URL = null
  14930. Cookies = []
  14931. 15:18:14.917 DEBUG [AJ6tRG7H] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
  14932. 15:18:14.918 DEBUG [AJ6tRG7H] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14933. 15:18:14.918 DEBUG [AJ6tRG7H] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14934. 15:18:14.920 DEBUG [AJ6tRG7H] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14935. 15:18:14.924 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  14936. 15:18:14.924 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  14937. 15:18:14.926 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  14938. 15:18:15.045 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  14939. 15:18:15.046 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580594351415297(Long), OP2072580594017112064(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580594017112064(String), NORMAL(String), 2026-07-02T15:33:14.956912600(LocalDateTime), 2026-07-02T15:18:15.045086100(LocalDateTime), 2026-07-02T15:18:15.045086100(LocalDateTime)
  14940. 15:18:15.049 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
  14941. 15:18:15.049 INFO [AJ6tRG7H] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580594017112064 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
  14942. 15:18:15.056 DEBUG [AJ6tRG7H] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 139ms
  14943. MockHttpServletRequest:
  14944. HTTP Method = POST
  14945. Request URI = /api/payment/order/create
  14946. Parameters = {}
  14947. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTQsImV4cCI6MTc4MzA2MzA5NH0.8ocGE4QXgZC1q8xB1bNNQV3Mq3FdMzYvvR0t60rEXFHLCxVvbFuNB8XUjJUR0ZlhbsbEsh8eGHlNYFC-EfFHeQ", Content-Length:"31"]
  14948. Body = {"planId":1,"channel":"WECHAT"}
  14949. Session Attrs = {}
  14950. Handler:
  14951. Type = com.xuekairui.payment.controller.PaymentController
  14952. Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
  14953. Async:
  14954. Async started = false
  14955. Async result = null
  14956. Resolved Exception:
  14957. Type = null
  14958. ModelAndView:
  14959. View name = null
  14960. View = null
  14961. Model = null
  14962. FlashMap:
  14963. Attributes = null
  14964. MockHttpServletResponse:
  14965. Status = 200
  14966. Error message = null
  14967. Headers = [X-Request-Id:"AJ6tRG7H", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  14968. Content type = application/json
  14969. Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594017112064","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARrklEQVR4Xu3SQW7kShIE0X//S2v2L5wYRzBZJaFpy4aZR5aa//28vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNl01caXDlYRNqjQ655P4mgtq76v4moRNV01c6XAlYZMqjc75JL7mgtr7Kr4mYdNVE1c6XEnYpEqjcz6Jr7mg9r6Kr0nYdNXElQ5XEjap0uicT+JrLqi9r+JrEjZdNXGlw5WETao0OueT+JoLau+r+JqETVdNXOlwJWGTKo3O+SS+5oLaG2icw0vbW650OzZP4u10XaNzTuGl+lbtDTTO4aXtLVe6HZsn8Xa6rtE5p/BSfav2Bhrn8NL2livdjs2TeDtd1+icU3ipvlV7A41zeGl7y5Vux+ZJvJ2ua3TOKbxU36q9gcY5vLS95Uq3Y/Mk3k7XNTrnFF6qb9XeQOMcXtrecqXbsXkSb6frGp1zCi/Vt2pvoJGcBlfSjkZyJjap0jjnNLjS7dikSqPDlbSjcUHtDTSS0+BK2tFIzsQmVRrnnAZXuh2bVGl0uJJ2NC6ovYFGchpcSTsayZnYpErjnNPgSrdjkyqNDlfSjsYFtTfQSE6DK2lHIzkTm1RpnHMaXOl2bFKl0eFK2tG4oPYGGslpcCXtaCRnYpMqjXNOgyvdjk2qNDpcSTsaF9TeQCM5Da6kHY3kTGxSpXHOaXCl27FJlUaHK2lH44LaG2gkp8GVtKORnAZX0o5GciY2CZtUaZxzGlxJOxoX1N5AIzkNrqQdjeQ0uJJ2NJIzsUnYpErjnNPgStrRuKD2BhrJaXAl7Wgkp8GVtKORnIlNwiZVGuecBlfSjsYFtTfQSE6DK2lHIzkNrqQdjeRMbBI2qdI45zS4knY0Lqi9gUZyGlxJOxrJaXAl7WgkZ2KTsEmVxjmnwZW0o3FB7Q00ktPgStrRSE6DK2lHIzkTm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoHEOL6VbGk86O9zd4m5a1jiHl+pbtTfQOIeX0i2NJ50d7m5xNy1rnMNL9a3aG2icw0vplsaTzg53t7ibljXO4aX6Vu0NNM7hpXRL40lnh7tb3E3LGufwUn2r9gYa5/BSuqXxpLPD3S3upmWNc3ipvlV7A41zeCnd0njS2eHuFnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+234c7sfbHOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj/BX/0l/od0/yU25yqN5ExsuupP8Fd/if8h3X+JzblKIzkTm676E/zVX+J/SPdfYnOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj9B+0v8A6Q/gcY5vJSwSZVGcna4m5Y1zjmn8NIN2i2fkB6hcQ4vJWxSpZGcHe6mZY1zzim8dIN2yyekR2icw0sJm1RpJGeHu2lZ45xzCi/doN3yCekRGufwUsImVRrJ2eFuWtY455zCSzdot3xCeoTGObyUsEmVRnJ2uJuWNc45p/DSDdotn5AeoXEOLyVsUqWRnB3upmWNc84pvHSDo1sDjS3upmWNc06DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf/sNyPh3QSE6DKwmbhM22eg5vd9dttlWDK/VO7Q00OqfBlYRNwmZbPYe3u+s226rBlXqn9gYandPgSsImYbOtnsPb3XWbbdXgSr1TewONzmlwJWGTsNlWz+Ht7rrNtmpwpd6pvYFG5zS4krBJ2Gyr5/B2d91mWzW4Uu/U3kCjcxpcSdgkbLbVc3i7u26zrRpcqXdab+LBhM22anAl7Wh0uJJ2NDpc6XZsOlxJ2HRV5EZZYLOtGlxJOxodrqQdjQ5Xuh2bDlcSNl0VuVEW2GyrBlfSjkaHK2lHo8OVbsemw5WETVdFbpQFNtuqwZW0o9HhStrR6HCl27HpcCVh01WRG2WBzbZqcCXtaHS4knY0Olzpdmw6XEnYdFXkRllgs60aXEk7Gh2upB2NDle6HZsOVxI2XRW5URbYpEojOQ2upB2NrTOxSZVGhytpR6NzJjY32G/5qIRNqjSS0+BK2tHYOhObVGl0uJJ2NDpnYnOD/ZaPStikSiM5Da6kHY2tM7FJlUaHK2lHo3MmNjfYb/mohE2qNJLT4Era0dg6E5tUaXS4knY0Omdic4P9lo9K2KRKIzkNrqQdja0zsUmVRocraUejcyY2N9hv+aiETao0ktPgStrR2DoTm1RpdLiSdjQ6Z2Jzg5NbEx+esHkSbydsEjYJmy3udriSdjSO8vB6gc2TeDthk7BJ2Gxxt8OVtKNxlIfXC2yexNsJm4RNwmaLux2upB2Nozy8XmDzJN5O2CRsEjZb3O1wJe1oHOXh9QKbJ/F2wiZhk7DZ4m6HK2lH4ygPrxfYPIm3EzYJm4TNFnc7XEk7Gkdp133UFncTNqnSSNh8Fl+TsNlWE5uumrhS79TeIdxN2KRKI2HzWXxNwmZbTWy6auJKvVN7h3A3YZMqjYTNZ/E1CZttNbHpqokr9U7tHcLdhE2qNBI2n8XXJGy21cSmqyau1Du1dwh3Ezap0kjYfBZfk7DZVhObrpq4Uu/U3iHcTdikSiNh81l8TcJmW01sumriSr3Teg0+oX7E/8XdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjX7cuKjbjwL3E3LGp0zsUmVRudMbLZVgyvdjk3Nvpz4qBvPAnfTskbnTGxSpdE5E5tt1eBKt2NTsy8nPurGs8DdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjVt6cGETao0kjOx+Zv4q7rfZdNVE1cSNjdot3xCwiZVGsmZ2PxN/FXd77LpqokrCZsbtFs+IWGTKo3kTGz+Jv6q7nfZdNXElYTNDdotn5CwSZVGciY2fxN/Vfe7bLpq4krC5gbtlk9I2KRKIzkTm7+Jv6r7XTZdNXElYXODdssnJGxSpZGcic3fxF/V/S6brpq4krC5QbvlE7pH2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BIzsQmYZOwSdgkbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5/2wbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5+yHNbHpqh1e6m7ZJGxSpdHhSrdjkyqNDldu0G75hO4RNl21w0vdLZuETao0OlzpdmxSpdHhyg3aLZ/QPcKmq3Z4qbtlk7BJlUaHK92OTao0Oly5QbvlE7pH2HTVDi91t2wSNqnS6HCl27FJlUaHKzdot3xC9wibrtrhpe6WTcImVRodrnQ7NqnS6HDlBu2WT+geYdNVO7zU3bJJ2KRKo8OVbscmVRodrtyg3fIJ6REaCZuETao0zuGl7pZNwiZVGt/G99W0pQfTSY2ETcImVRrn8FJ3yyZhkyqNb+P7atrSg+mkRsImYZMqjXN4qbtlk7BJlca38X01benBdFIjYZOwSZXGObzU3bJJ2KRK49v4vpq29GA6qZGwSdikSuMcXupu2SRsUqXxbXxfTVt6MJ3USNgkbFKlcQ4vdbdsEjap0vg2vq9mX34X/wDdn8CmqyauJGwSNgmbDlcSNqnSqNmX38U/QPcnsOmqiSsJm4RNwqbDlYRNqjRq9uV38Q/Q/QlsumriSsImYZOw6XAlYZMqjZp9+V38A3R/ApuumriSsEnYJGw6XEnYpEqjZl9+F/8A3Z/ApqsmriRsEjYJmw5XEjap0qjZl9/FP0D3J7DpqokrCZuETcKmw5WETao0atrSg5/F13wb37fF3bSssXUmNkdp133UZ/E138b3bXE3LWtsnYnNUdp1H/VZfM238X1b3E3LGltnYnOUdt1HfRZf82183xZ307LG1pnYHKVd91Gfxdd8G9+3xd20rLF1JjZHadd91GfxNd/G921xNy1rbJ2JzVHadR/15LO8lG5pJGdi82TV4G7CpsOVbscmYXNB7Q00zuGldEsjORObJ6sGdxM2Ha50OzYJmwtqb6BxDi+lWxrJmdg8WTW4m7DpcKXbsUnYXFB7A41zeCnd0kjOxObJqsHdhE2HK92OTcLmgtobaJzDS+mWRnImNk9WDe4mbDpc6XZsEjYX1N5A4xxeSrc0kjOxebJqcDdh0+FKt2OTsLmg9gYayWlwJe1obJ0GVxI2qdJI2HTVDi8lbBI2F9TeQCM5Da6kHY2t0+BKwiZVGgmbrtrhpYRNwuaC2htoJKfBlbSjsXUaXEnYpEojYdNVO7yUsEnYXFB7A43kNLiSdjS2ToMrCZtUaSRsumqHlxI2CZsLam+gkZwGV9KOxtZpcCVhkyqNhE1X7fBSwiZhc0HtDTSS0+BK2tHYOg2uJGxSpZGw6aodXkrYJGwuqL2BRnIaXEk7GslpcCVhk7BJlUZyGlxJ2HS4cpR23UelZ2l0uJJ2NJLT4ErCJmGTKo3kNLiSsOlw5Sjtuo9Kz9LocCXtaCSnwZWETcImVRrJaXAlYdPhylHadR+VnqXR4Ura0UhOgysJm4RNqjSS0+BKwqbDlaO06z4qPUujw5W0o5GcBlcSNgmbVGkkp8GVhE2HK0dp131UepZGhytpRyM5Da4kbBI2qdJIToMrCZsOV47Srvuo9CyNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UHb5z8v3jps7caXDmHlxI226rBlXqn9gYa5/DSZ281uHIOLyVstlWDK/VO7Q00zuGlz95qcOUcXkrYbKsGV+qd2htonMNLn73V4Mo5vJSw2VYNrtQ7tTfQOIeXPnurwZVzeClhs60aXKl3am+gcQ4vffZWgyvn8FLCZls1uFLv1N5X8TXde2xSpZGwSdgkbLpq4soWd4/Srvuoz+JruvfYpEojYZOwSdh01cSVLe4epV33UZ/F13TvsUmVRsImYZOw6aqJK1vcPUq77qM+i6/p3mOTKo2ETcImYdNVE1e2uHuUdt1HfRZf073HJlUaCZuETcKmqyaubHH3KO26j/osvqZ7j02qNBI2CZuETVdNXNni7lGeXX/5Z3k/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR/gfYWtF3xw1oioAAAAASUVORK5CYII=","payUrl":null,"expireTime":"2026-07-02 15:33:14","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695055}
  14970. Forwarded URL = null
  14971. Redirected URL = null
  14972. Cookies = []
  14973. 15:18:15.065 DEBUG [E4EdmcY4] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
  14974. 15:18:15.066 DEBUG [E4EdmcY4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  14975. 15:18:15.066 DEBUG [E4EdmcY4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  14976. 15:18:15.068 DEBUG [E4EdmcY4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  14977. 15:18:15.070 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  14978. 15:18:15.071 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  14979. 15:18:15.073 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  14980. 15:18:15.094 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  14981. 15:18:15.094 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580594540158977(Long), OP2072580594507845632(String), 1(Long), 1(Long), 29.90(BigDecimal), ALIPAY(String), PENDING(String), MOCK_PAY:OP2072580594507845632(String), NORMAL(String), 2026-07-02T15:33:15.073106500(LocalDateTime), 2026-07-02T15:18:15.093688800(LocalDateTime), 2026-07-02T15:18:15.093688800(LocalDateTime)
  14982. 15:18:15.098 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
  14983. 15:18:15.098 INFO [E4EdmcY4] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580594507845632 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=支付宝
  14984. 15:18:15.104 DEBUG [E4EdmcY4] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 39ms
  14985. MockHttpServletRequest:
  14986. HTTP Method = POST
  14987. Request URI = /api/payment/order/create
  14988. Parameters = {}
  14989. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
  14990. Body = {"planId":1,"channel":"ALIPAY"}
  14991. Session Attrs = {}
  14992. Handler:
  14993. Type = com.xuekairui.payment.controller.PaymentController
  14994. Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
  14995. Async:
  14996. Async started = false
  14997. Async result = null
  14998. Resolved Exception:
  14999. Type = null
  15000. ModelAndView:
  15001. View name = null
  15002. View = null
  15003. Model = null
  15004. FlashMap:
  15005. Attributes = null
  15006. MockHttpServletResponse:
  15007. Status = 200
  15008. Error message = null
  15009. Headers = [X-Request-Id:"E4EdmcY4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15010. Content type = application/json
  15011. Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594507845632","planName":"高级会员·月卡","amount":29.90,"channel":"ALIPAY","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAR1klEQVR4Xu3SwY7jypIE0fv/P63Zn3C+cYSSVDeatiyYeWQJ/O/z8nID//mHl5cTvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbQf1n8/xdek92gk5z68nbBJlUbnPImvuaD2foqvSe/RSM59eDthkyqNznkSX3NB7f0UX5Peo5Gc+/B2wiZVGp3zJL7mgtr7Kb4mvUcjOffh7YRNqjQ650l8zQW191N8TXqPRnLuw9sJm1RpdM6T+JoLau+n+Jr0Ho3k3Ie3Ezap0uicJ/E1F9TeQOMcXkq3NBI2XTVxJWHTVTu89Efeqr2Bxjm8lG5pJGy6auJKwqardnjpj7xVewONc3gp3dJI2HTVxJWETVft8NIfeav2Bhrn8FK6pZGw6aqJKwmbrtrhpT/yVu0NNM7hpXRLI2HTVRNXEjZdtcNLf+St2htonMNL6ZZGwqarJq4kbLpqh5f+yFu1N9BIToMraUcjYdPhyhZ307JGchpcSTsaHa6kHY0Lam+gkZwGV9KORsKmw5Ut7qZljeQ0uJJ2NDpcSTsaF9TeQCM5Da6kHY2ETYcrW9xNyxrJaXAl7Wh0uJJ2NC6ovYFGchpcSTsaCZsOV7a4m5Y1ktPgStrR6HAl7WhcUHsDjeQ0uJJ2NBI2Ha5scTctaySnwZW0o9HhStrRuKD2BhrJaXAl7WgkbDpc2eJuWtZIToMraUejw5W0o3FB7Q00ktPgStrR6JyJzbaa2GxxNy1rdE6DK2lH44LaG2gkp8GVtKPRORObbTWx2eJuWtbonAZX0o7GBbU30EhOgytpR6NzJjbbamKzxd20rNE5Da6kHY0Lam+gkZwGV9KORudMbLbVxGaLu2lZo3MaXEk7GhfU3kAjOQ2upB2NzpnYbKuJzRZ307JG5zS4knY0Lqi9gUZyGlxJOxqdM7HZVhObLe6mZY3OaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXs/xdek92j8S86T+JoLau+n+Jr0Ho1/yXkSX3NB7f0UX5Peo/EvOU/iay6ovZ/ia9J7NP4l50l8zQW191N8TXqPxr/kPImvuaD2foqvSe/R+JecJ/E1F7Ten4b/bvqHNRI2Ha7cibf/Ev7adw80kjOx6XDlTrz9l/DXvnugkZyJTYcrd+Ltv4S/9t0DjeRMbDpcuRNv/yX8te8eaCRnYtPhyp14+y/hr333QCM5E5sOV+7E238J7bv9d9M/rJGw6aqJKwmbVGkkbFKl0eFKwiZVGgmbVGkkbC6ovYFGciY2XTVxJWGTKo2ETao0OlxJ2KRKI2GTKo2EzQW1N9BIzsSmqyauJGxSpZGwSZVGhysJm1RpJGxSpZGwuaD2BhrJmdh01cSVhE2qNBI2qdLocCVhkyqNhE2qNBI2F9TeQCM5E5uumriSsEmVRsImVRodriRsUqWRsEmVRsLmgtobaCRnYtNVE1cSNqnSSNikSqPDlYRNqjQSNqnSSNhc0HoTD25xN2HT4Ura0UhOgysJm1RpJGwSNgmbhE1Xfd4PSyM5Da4kbFKlkbBJ2CRsEjZd9Xk/LI3kNLiSsEmVRsImYZOwSdh01ef9sDSS0+BKwiZVGgmbhE3CJmHTVZ/3w9JIToMrCZtUaSRsEjYJm4RNV33eD0sjOQ2uJGxSpZGwSdgkbBI2XfX55sNq8FHds2wSNufwUnfLpqt+iy/ucOWC1tvho7pn2SRszuGl7pZNV/0WX9zhygWtt8NHdc+ySdicw0vdLZuu+i2+uMOVC1pvh4/qnmWTsDmHl7pbNl31W3xxhysXtN4OH9U9yyZhcw4vdbdsuuq3+OIOVy5ovR0+qnuWTcLmHF7qbtl01W/xxR2uXNB6Ew+mkxodrqQdjS3ubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurTf1jOpwMaHa6kHY1zToMrCZtUaXS4knY0Omdi8wXtlk9Ij9DocCXtaJxzGlxJ2KRKo8OVtKPRORObL2i3fEJ6hEaHK2lH45zT4ErCJlUaHa6kHY3Omdh8QbvlE9IjNDpcSTsa55wGVxI2qdLocCXtaHTOxOYL2i2fkB6h0eFK2tE45zS4krBJlUaHK2lHo3MmNl/QbvmE9AiNDlfSjsY5p8GVhE2qNDpcSTsanTOx+YL9lo/qcGWLu2lZI2GTsEmVRocraUdj6+xwt+aLcoUrW9xNyxoJm4RNqjQ6XEk7Gltnh7s1X5QrXNniblrWSNgkbFKl0eFK2tHYOjvcrfmiXOHKFnfTskbCJmGTKo0OV9KOxtbZ4W7NF+UKV7a4m5Y1EjYJm1RpdLiSdjS2zg53a74oV7iyxd20rJGwSdikSqPDlbSjsXV2uFvzRVlg0+FKwiZhk7BJlUZyGlzpdmxSpZGwSZVGckq+KAtsOlxJ2CRsEjap0khOgyvdjk2qNBI2qdJITskXZYFNhysJm4RNwiZVGslpcKXbsUmVRsImVRrJKfmiLLDpcCVhk7BJ2KRKIzkNrnQ7NqnSSNikSiM5JV+UBTYdriRsEjYJm1RpJKfBlW7HJlUaCZtUaSSn5IuywKbDlYRNwiZhkyqN5DS40u3YpEojYZMqjeSUtKUHu5M2Ha5scbfDlbSjkZyJTao0EjYdrnQ7NjVt6cHupE2HK1vc7XAl7WgkZ2KTKo2ETYcr3Y5NTVt6sDtp0+HKFnc7XEk7GsmZ2KRKI2HT4Uq3Y1PTlh7sTtp0uLLF3Q5X0o5GciY2qdJI2HS40u3Y1LSlB7uTNh2ubHG3w5W0o5GciU2qNBI2Ha50OzY1benB7qRNhytb3O1wJe1oJGdikyqNhE2HK92OTc2+nPio7bNcSdgkbFKl0TkTm1RpJGy2VYMraUejZl9OfNT2Wa4kbBI2qdLonIlNqjQSNtuqwZW0o1GzLyc+avssVxI2CZtUaXTOxCZVGgmbbdXgStrRqNmXEx+1fZYrCZuETao0OmdikyqNhM22anAl7WjU7MuJj9o+y5WETcImVRqdM7FJlUbCZls1uJJ2NGr25cRHbZ/lSsImYZMqjc6Z2KRKI2GzrRpcSTsaNV+UBTbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK/t7Pjxhc67S6HCl27FJlUZyJjbnKo3k3Mr+ng9P2JyrNDpc6XZsUqWRnInNuUojObeyv+fDEzbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK+09n3nuoe5ucTdhcw4v/fqWRudMbLrq835Yp/DSr29pdM7Epqs+74d1Ci/9+pZG50xsuurzflin8NKvb2l0zsSmqz7vh3UKL/36lkbnTGy66vN+WKfw0q9vaXTOxKarPv2H1eATukfYbKsGV87tTGyexdek92h0Tsm+nPio7lk226rBlXM7E5tn8TXpPRqdU7IvJz6qe5bNtmpw5dzOxOZZfE16j0bnlOzLiY/qnmWzrRpcObczsXkWX5Peo9E5Jfty4qO6Z9lsqwZXzu1MbJ7F16T3aHROyb6c+KjuWTbbqsGVczsTm2fxNek9Gp1T8kU50Ng6E5s78XbCJlUayXkSX5Peo9E5kdabeDCd1Oicic2deDthkyqN5DyJr0nv0eicSOtNPJhOanTOxOZOvJ2wSZVGcp7E16T3aHROpPUmHkwnNTpnYnMn3k7YpEojOU/ia9J7NDon0noTD6aTGp0zsbkTbydsUqWRnCfxNek9Gp0Tab2JB9NJjc6Z2NyJtxM2qdJIzpP4mvQejc6JtN6fhv9u9w/bJGzO4aUOVzpcSdikSqNmX/4Wf4DuJ7BJ2JzDSx2udLiSsEmVRs2+/C3+AN1PYJOwOYeXOlzpcCVhkyqNmn35W/wBup/AJmFzDi91uNLhSsImVRo1+/K3+AN0P4FNwuYcXupwpcOVhE2qNGr25W/xB+h+ApuEzTm81OFKhysJm1Rp1LSlB5/F15x7j7sJm1RpJKfBlbSj0Tk73K1pSw8+i6859x53Ezap0khOgytpR6Nzdrhb05YefBZfc+497iZsUqWRnAZX0o5G5+xwt6YtPfgsvubce9xN2KRKIzkNrqQdjc7Z4W5NW3rwWXzNufe4m7BJlUZyGlxJOxqds8Pdmrb04LP4mnPvcTdhkyqN5DS4knY0OmeHuzVt6cEvTv6/eCnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPufJaX0i2N5ExsUqWxxd20rNE5Da4kbI7SrvuoO5/lpXRLIzkTm1RpbHE3LWt0ToMrCZujtOs+6s5neSnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPSszQ6XEk7Gh2upB2N5ExsEjYdrpzDSwmbhM0FtTfQSE6DK2lHo8OVtKORnIlNwqbDlXN4KWGTsLmg9gYayWlwJe1odLiSdjSSM7FJ2HS4cg4vJWwSNhfU3kAjOQ2upB2NDlfSjkZyJjYJmw5XzuGlhE3C5oLaG2gkp8GVtKPR4Ura0UjOxCZh0+HKObyUsEnYXFB7A43kNLiSdjQ6XEk7GsmZ2CRsOlw5h5cSNgmbC2pvoJGcBlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1obJ2JTYcraUejw5W0o9HhSocrNW3pwXRSo8OVtKOxdSY2Ha6kHY0OV9KORocrHa7UtKUH00mNDlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1oJOc+vN3hStrR2DoTm4RNwqarPu+H1eDtDlfSjsbWmdgkbBI2XfV5P6wGb3e4knY0ts7EJmGTsOmqz/thNXi7w5W0o7F1JjYJm4RNV33eD6vB2x2upB2NrTOxSdgkbLrq835YDd7ucCXtaGydiU3CJmHTVZ+zH9YpvNTdsulwJe1o3Im3EzbbqsGVeqf2Bhrn8FJ3y6bDlbSjcSfeTthsqwZX6p3aG2icw0vdLZsOV9KOxp14O2GzrRpcqXdqb6BxDi91t2w6XEk7Gnfi7YTNtmpwpd6pvYHGObzU3bLpcCXtaNyJtxM226rBlXqn9gYa5/BSd8umw5W0o3En3k7YbKsGV+qd2vspvia9R6NzJjZd1eBuWtbocCVh0+FKTVt68Fl8TXqPRudMbLqqwd20rNHhSsKmw5WatvTgs/ia9B6NzpnYdFWDu2lZo8OVhE2HKzVt6cFn8TXpPRqdM7HpqgZ307JGhysJmw5XatrSg8/ia9J7NDpnYtNVDe6mZY0OVxI2Ha7UtKUHn8XXpPdodM7Epqsa3E3LGh2uJGw6XKnZly8v/4P3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX/Ay6DIKLn9Mh8AAAAAElFTkSuQmCC","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695103}
  15012. Forwarded URL = null
  15013. Redirected URL = null
  15014. Cookies = []
  15015. 15:18:15.113 DEBUG [YQwLFMWk] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
  15016. 15:18:15.114 DEBUG [YQwLFMWk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15017. 15:18:15.115 DEBUG [YQwLFMWk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15018. 15:18:15.116 DEBUG [YQwLFMWk] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15019. 15:18:15.123 WARN [YQwLFMWk] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=2004, message=支持的渠道:WECHAT, ALIPAY
  15020. 15:18:15.123 DEBUG [YQwLFMWk] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 10ms
  15021. MockHttpServletRequest:
  15022. HTTP Method = POST
  15023. Request URI = /api/payment/order/create
  15024. Parameters = {}
  15025. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"32"]
  15026. Body = {"planId":1,"channel":"INVALID"}
  15027. Session Attrs = {}
  15028. Handler:
  15029. Type = com.xuekairui.payment.controller.PaymentController
  15030. Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
  15031. Async:
  15032. Async started = false
  15033. Async result = null
  15034. Resolved Exception:
  15035. Type = com.xuekairui.common.BusinessException
  15036. ModelAndView:
  15037. View name = null
  15038. View = null
  15039. Model = null
  15040. FlashMap:
  15041. Attributes = null
  15042. MockHttpServletResponse:
  15043. Status = 200
  15044. Error message = null
  15045. Headers = [X-Request-Id:"YQwLFMWk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15046. Content type = application/json
  15047. Body = {"code":2004,"message":"支持的渠道:WECHAT, ALIPAY","data":null,"timestamp":1782976695123}
  15048. Forwarded URL = null
  15049. Redirected URL = null
  15050. Cookies = []
  15051. 15:18:15.129 DEBUG [dqU5Gxsx] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
  15052. 15:18:15.132 WARN [dqU5Gxsx] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 401 2ms
  15053. MockHttpServletRequest:
  15054. HTTP Method = POST
  15055. Request URI = /api/payment/order/create
  15056. Parameters = {}
  15057. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"31"]
  15058. Body = {"planId":1,"channel":"WECHAT"}
  15059. Session Attrs = {}
  15060. Handler:
  15061. Type = null
  15062. Async:
  15063. Async started = false
  15064. Async result = null
  15065. Resolved Exception:
  15066. Type = null
  15067. ModelAndView:
  15068. View name = null
  15069. View = null
  15070. Model = null
  15071. FlashMap:
  15072. Attributes = null
  15073. MockHttpServletResponse:
  15074. Status = 401
  15075. Error message = null
  15076. Headers = [X-Request-Id:"dqU5Gxsx", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15077. Content type = application/json;charset=UTF-8
  15078. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976695131}
  15079. Forwarded URL = null
  15080. Redirected URL = null
  15081. Cookies = []
  15082. 15:18:15.138 DEBUG [KvTpWPUD] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
  15083. 15:18:15.138 DEBUG [KvTpWPUD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15084. 15:18:15.138 DEBUG [KvTpWPUD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15085. 15:18:15.141 DEBUG [KvTpWPUD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15086. 15:18:15.143 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15087. 15:18:15.143 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15088. 15:18:15.145 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15089. 15:18:15.155 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15090. 15:18:15.155 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580594796011522(Long), OP2072580594814029824(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580594814029824(String), NORMAL(String), 2026-07-02T15:33:15.146155900(LocalDateTime), 2026-07-02T15:18:15.155197400(LocalDateTime), 2026-07-02T15:18:15.155197400(LocalDateTime)
  15091. 15:18:15.159 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
  15092. 15:18:15.159 INFO [KvTpWPUD] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580594814029824 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
  15093. 15:18:15.165 DEBUG [KvTpWPUD] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 27ms
  15094. MockHttpServletRequest:
  15095. HTTP Method = POST
  15096. Request URI = /api/payment/order/create
  15097. Parameters = {}
  15098. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
  15099. Body = {"planId":1,"channel":"WECHAT"}
  15100. Session Attrs = {}
  15101. Handler:
  15102. Type = com.xuekairui.payment.controller.PaymentController
  15103. Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
  15104. Async:
  15105. Async started = false
  15106. Async result = null
  15107. Resolved Exception:
  15108. Type = null
  15109. ModelAndView:
  15110. View name = null
  15111. View = null
  15112. Model = null
  15113. FlashMap:
  15114. Attributes = null
  15115. MockHttpServletResponse:
  15116. Status = 200
  15117. Error message = null
  15118. Headers = [X-Request-Id:"KvTpWPUD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15119. Content type = application/json
  15120. Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594814029824","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARVUlEQVR4Xu3SQZLjSnAE0X//S7f2LwOmsESBFDXw5Zh7ZHEa//29vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7GltnYpOwSdgkbFKlcc5pcCXtaFxQewON5DS4knY0ts7EJmGTsEnYpErjnNPgStrRuKD2BhrJaXAl7WhsnYlNwiZhk7BJlcY5p8GVtKNxQe0NNJLT4Era0dg6E5uETcImYZMqjXNOgytpR+OC2htoJKfBlbSjsXUmNgmbhE3CJlUa55wGV9KOxgW1N9BIToMraUdj60xsEjYJm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkZyTuGlhE3CJlUaHa6kHY0OV9KOxgW1N9BIToMraUcjOafwUsImYZMqjQ5X0o5GhytpR+OC2htoJKfBlbSjkZxTeClhk7BJlUaHK2lHo8OVtKNxQe0NNJLT4Era0UjOKbyUsEnYpEqjw5W0o9HhStrRuKD2BhrJaXAl7Wgk5xReStgkbFKl0eFK2tHocCXtaFxQewON5DS4knY0knMKLyVsEjap0uhwJe1odLiSdjQuqL2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+7+GP7f+wQu8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT/Br/4S/yBP/km8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT9B+0v8D0j/BRrn8FLCJmFzDi+lWxrnnFN46Qbtlk9Ij9A4h5cSNgmbc3gp3dI455zCSzdot3xCeoTGObyUsEnYnMNL6ZbGOecUXrpBu+UT0iM0zuGlhE3C5hxeSrc0zjmn8NIN2i2fkB6hcQ4vJWwSNufwUrqlcc45hZdu0G75hPQIjXN4KWGTsDmHl9ItjXPOKbx0g3bLJ6RHaHS4krBJ2CRszuGlLe4mbBI2CZuETVf9vR/WKby0xd2ETcImYZOw6aq/98M6hZe2uJuwSdgkbBI2XfX3flin8NIWdxM2CZuETcKmq/7eD+sUXtribsImYZOwSdh01d/7YZ3CS1vcTdgkbBI2CZuu+rvzYU1sUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLDyZsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLD6aTGk/i7YRNV01cSdicw0vplkbnTGxu0G75hPQIjSfxdsKmqyauJGzO4aV0S6NzJjY3aLd8QnqExpN4O2HTVRNXEjbn8FK6pdE5E5sbtFs+IT1C40m8nbDpqokrCZtzeCnd0uicic0N2i2fkB6h8STeTth01cSVhM05vJRuaXTOxOYG7ZZPSI/QeBJvJ2y6auJKwuYcXkq3NDpnYnODdssnpEdoJGeHuwmbVGlscTdhkyqNhE2HK2lH4yjtuo9Kz9JIzg53Ezap0tjibsImVRoJmw5X0o7GUdp1H5WepZGcHe4mbFKlscXdhE2qNBI2Ha6kHY2jtOs+Kj1LIzk73E3YpEpji7sJm1RpJGw6XEk7Gkdp131UepZGcna4m7BJlcYWdxM2qdJI2HS4knY0jtKu+6j0LI3k7HA3YZMqjS3uJmxSpZGw6XAl7WgcZb/uM9NDNba4m5Y1zjk73E3YbKuJTVdNXKl3Wm/iwXRSY4u7aVnjnLPD3YTNtprYdNXElXqn9SYeTCc1tribljXOOTvcTdhsq4lNV01cqXdab+LBdFJji7tpWeOcs8PdhM22mth01cSVeqf1Jh5MJzW2uJuWNc45O9xN2GyriU1XTVypd1pv4sF0UmOLu2lZ45yzw92Ezbaa2HTVxJV6p/UmHqxPLvBSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKAca5/BSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKP9f4K96Em931226auJKwuYG+y0f9Zv4q57E2911m66auJKwucF+y0f9Jv6qJ/F2d92mqyauJGxusN/yUb+Jv+pJvN1dt+mqiSsJmxvst3zUb+KvehJvd9dtumriSsLmBvstH/Wb+KuexNvddZuumriSsLlBu+UTto9wJWHzJN7e4m7C5slq4kra0UjYXFB7A40OVxI2T+LtLe4mbJ6sJq6kHY2EzQW1N9DocCVh8yTe3uJuwubJauJK2tFI2FxQewONDlcSNk/i7S3uJmyerCaupB2NhM0FtTfQ6HAlYfMk3t7ibsLmyWriStrRSNhcUHsDjQ5XEjZP4u0t7iZsnqwmrqQdjYTNBbU30EhOgyvbnQYvJWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV39kPq8GVbsemqxrcTdikSqPDlW7HJlUaHa7coN3yCdtHuNLt2HRVg7sJm1RpdLjS7dikSqPDlRu0Wz5h+whXuh2brmpwN2GTKo0OV7odm1RpdLhyg3bLJ2wf4Uq3Y9NVDe4mbFKl0eFKt2OTKo0OV27QbvmE7SNc6XZsuqrB3YRNqjQ6XOl2bFKl0eHKDdotn7B9hCvdjk1XNbibsEmVRocr3Y5NqjQ6XLlBu+UT0iM0kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9Xsy+/i/8BCZttNbFJ2HTVxJUOVxI2qdKo2Zffxf+AhM22mtgkbLpq4kqHKwmbVGnU7Mvv4n9AwmZbTWwSNl01caXDlYRNqjRq9uV38T8gYbOtJjYJm66auNLhSsImVRo1+/K7+B+QsNlWE5uETVdNXOlwJWGTKo2affld/A9I2GyriU3CpqsmrnS4krBJlUZNW3rws/iahE3CZou7W9xNyxpbZ2JzlHbdR30WX5OwSdhscXeLu2lZY+tMbI7Srvuoz+JrEjYJmy3ubnE3LWtsnYnNUdp1H/VZfE3CJmGzxd0t7qZlja0zsTlKu+6jPouvSdgkbLa4u8XdtKyxdSY2R2nXfdRn8TUJm4TNFne3uJuWNbbOxOYo7bqPevJZXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00zuGldEsjOQ2upB2N5ExsUqWRsOlwpduxSdhcUHsDjXN4Kd3SSE6DK2lHIzkTm1RpJGw6XOl2bBI2F9TeQOMcXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00ktPgStrR6JyJTcImYXOu0jiHlxI2CZsLam+gkZwGV9KORudMbBI2CZtzlcY5vJSwSdhcUHsDjeQ0uJJ2NDpnYpOwSdicqzTO4aWETcLmgtobaCSnwZW0o9E5E5uETcLmXKVxDi8lbBI2F9TeQCM5Da6kHY3OmdgkbBI25yqNc3gpYZOwuaD2BhrJaXAl7Wh0zsQmYZOwOVdpnMNLCZuEzQW1N9BIToMraUfjSafBlS3uJmwSNh2uHKVd91HpWRodrqQdjSedBle2uJuwSdh0uHKUdt1HpWdpdLiSdjSedBpc2eJuwiZh0+HKUdp1H5WepdHhStrReNJpcGWLuwmbhE2HK0dp131UepZGhytpR+NJp8GVLe4mbBI2Ha4cpV33UelZGh2upB2NJ50GV7a4m7BJ2HS4cpR23UelZ2l0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT144+T/ipeevDXx9va6K92OTcJmWzW4Uu/U3kDjHF568tbE29vrrnQ7NgmbbdXgSr1TewONc3jpyVsTb2+vu9Lt2CRstlWDK/VO7Q00zuGlJ29NvL297kq3Y5Ow2VYNrtQ7tTfQOIeXnrw18fb2uivdjk3CZls1uFLv1N5A4xxeevLWxNvb6650OzYJm23V4Eq9U3tfxdd8+z0T35ew6aqJK1vcPUq77qM+i6/59nsmvi9h01UTV7a4e5R23Ud9Fl/z7fdMfF/Cpqsmrmxx9yjtuo/6LL7m2++Z+L6ETVdNXNni7lHadR/1WXzNt98z8X0Jm66auLLF3aO06z7qs/iab79n4vsSNl01cWWLu0d5dv3ln+X9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuF/ANQkBqB7RoIFAAAAAElFTkSuQmCC","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695164}
  15121. Forwarded URL = null
  15122. Redirected URL = null
  15123. Cookies = []
  15124. 15:18:15.166 DEBUG [FprJMeHK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/order/OP2072580594814029824 | IP: 127.0.0.1
  15125. 15:18:15.168 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
  15126. 15:18:15.168 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP2072580594814029824(String)
  15127. 15:18:15.170 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 1
  15128. 15:18:15.171 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15129. 15:18:15.171 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15130. 15:18:15.172 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15131. 15:18:15.180 DEBUG [FprJMeHK] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/order/OP2072580594814029824 200 14ms
  15132. MockHttpServletRequest:
  15133. HTTP Method = GET
  15134. Request URI = /api/payment/order/OP2072580594814029824
  15135. Parameters = {}
  15136. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
  15137. Body = null
  15138. Session Attrs = {}
  15139. Handler:
  15140. Type = com.xuekairui.payment.controller.PaymentController
  15141. Method = com.xuekairui.payment.controller.PaymentController#queryOrder(String)
  15142. Async:
  15143. Async started = false
  15144. Async result = null
  15145. Resolved Exception:
  15146. Type = null
  15147. ModelAndView:
  15148. View name = null
  15149. View = null
  15150. Model = null
  15151. FlashMap:
  15152. Attributes = null
  15153. MockHttpServletResponse:
  15154. Status = 200
  15155. Error message = null
  15156. Headers = [X-Request-Id:"FprJMeHK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15157. Content type = application/json
  15158. Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594814029824","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARVUlEQVR4Xu3SQZLjSnAE0X//S7f2LwOmsESBFDXw5Zh7ZHEa//29vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7GltnYpOwSdgkbFKlcc5pcCXtaFxQewON5DS4knY0ts7EJmGTsEnYpErjnNPgStrRuKD2BhrJaXAl7WhsnYlNwiZhk7BJlcY5p8GVtKNxQe0NNJLT4Era0dg6E5uETcImYZMqjXNOgytpR+OC2htoJKfBlbSjsXUmNgmbhE3CJlUa55wGV9KOxgW1N9BIToMraUdj60xsEjYJm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkZyTuGlhE3CJlUaHa6kHY0OV9KOxgW1N9BIToMraUcjOafwUsImYZMqjQ5X0o5GhytpR+OC2htoJKfBlbSjkZxTeClhk7BJlUaHK2lHo8OVtKNxQe0NNJLT4Era0UjOKbyUsEnYpEqjw5W0o9HhStrRuKD2BhrJaXAl7Wgk5xReStgkbFKl0eFK2tHocCXtaFxQewON5DS4knY0knMKLyVsEjap0uhwJe1odLiSdjQuqL2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+7+GP7f+wQu8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT/Br/4S/yBP/km8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT9B+0v8D0j/BRrn8FLCJmFzDi+lWxrnnFN46Qbtlk9Ij9A4h5cSNgmbc3gp3dI455zCSzdot3xCeoTGObyUsEnYnMNL6ZbGOecUXrpBu+UT0iM0zuGlhE3C5hxeSrc0zjmn8NIN2i2fkB6hcQ4vJWwSNufwUrqlcc45hZdu0G75hPQIjXN4KWGTsDmHl9ItjXPOKbx0g3bLJ6RHaHS4krBJ2CRszuGlLe4mbBI2CZuETVf9vR/WKby0xd2ETcImYZOw6aq/98M6hZe2uJuwSdgkbBI2XfX3flin8NIWdxM2CZuETcKmq/7eD+sUXtribsImYZOwSdh01d/7YZ3CS1vcTdgkbBI2CZuu+rvzYU1sUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLDyZsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLD6aTGk/i7YRNV01cSdicw0vplkbnTGxu0G75hPQIjSfxdsKmqyauJGzO4aV0S6NzJjY3aLd8QnqExpN4O2HTVRNXEjbn8FK6pdE5E5sbtFs+IT1C40m8nbDpqokrCZtzeCnd0uicic0N2i2fkB6h8STeTth01cSVhM05vJRuaXTOxOYG7ZZPSI/QeBJvJ2y6auJKwuYcXkq3NDpnYnODdssnpEdoJGeHuwmbVGlscTdhkyqNhE2HK2lH4yjtuo9Kz9JIzg53Ezap0tjibsImVRoJmw5X0o7GUdp1H5WepZGcHe4mbFKlscXdhE2qNBI2Ha6kHY2jtOs+Kj1LIzk73E3YpEpji7sJm1RpJGw6XEk7Gkdp131UepZGcna4m7BJlcYWdxM2qdJI2HS4knY0jtKu+6j0LI3k7HA3YZMqjS3uJmxSpZGw6XAl7WgcZb/uM9NDNba4m5Y1zjk73E3YbKuJTVdNXKl3Wm/iwXRSY4u7aVnjnLPD3YTNtprYdNXElXqn9SYeTCc1tribljXOOTvcTdhsq4lNV01cqXdab+LBdFJji7tpWeOcs8PdhM22mth01cSVeqf1Jh5MJzW2uJuWNc45O9xN2GyriU1XTVypd1pv4sF0UmOLu2lZ45yzw92Ezbaa2HTVxJV6p/UmHqxPLvBSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKAca5/BSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKP9f4K96Em931226auJKwuYG+y0f9Zv4q57E2911m66auJKwucF+y0f9Jv6qJ/F2d92mqyauJGxusN/yUb+Jv+pJvN1dt+mqiSsJmxvst3zUb+KvehJvd9dtumriSsLmBvstH/Wb+KuexNvddZuumriSsLlBu+UTto9wJWHzJN7e4m7C5slq4kra0UjYXFB7A40OVxI2T+LtLe4mbJ6sJq6kHY2EzQW1N9DocCVh8yTe3uJuwubJauJK2tFI2FxQewONDlcSNk/i7S3uJmyerCaupB2NhM0FtTfQ6HAlYfMk3t7ibsLmyWriStrRSNhcUHsDjQ5XEjZP4u0t7iZsnqwmrqQdjYTNBbU30EhOgyvbnQYvJWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV39kPq8GVbsemqxrcTdikSqPDlW7HJlUaHa7coN3yCdtHuNLt2HRVg7sJm1RpdLjS7dikSqPDlRu0Wz5h+whXuh2brmpwN2GTKo0OV7odm1RpdLhyg3bLJ2wf4Uq3Y9NVDe4mbFKl0eFKt2OTKo0OV27QbvmE7SNc6XZsuqrB3YRNqjQ6XOl2bFKl0eHKDdotn7B9hCvdjk1XNbibsEmVRocr3Y5NqjQ6XLlBu+UT0iM0kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9Xsy+/i/8BCZttNbFJ2HTVxJUOVxI2qdKo2Zffxf+AhM22mtgkbLpq4kqHKwmbVGnU7Mvv4n9AwmZbTWwSNl01caXDlYRNqjRq9uV38T8gYbOtJjYJm66auNLhSsImVRo1+/K7+B+QsNlWE5uETVdNXOlwJWGTKo2affld/A9I2GyriU3CpqsmrnS4krBJlUZNW3rws/iahE3CZou7W9xNyxpbZ2JzlHbdR30WX5OwSdhscXeLu2lZY+tMbI7Srvuoz+JrEjYJmy3ubnE3LWtsnYnNUdp1H/VZfE3CJmGzxd0t7qZlja0zsTlKu+6jPouvSdgkbLa4u8XdtKyxdSY2R2nXfdRn8TUJm4TNFne3uJuWNbbOxOYo7bqPevJZXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00zuGldEsjOQ2upB2N5ExsUqWRsOlwpduxSdhcUHsDjXN4Kd3SSE6DK2lHIzkTm1RpJGw6XOl2bBI2F9TeQOMcXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00ktPgStrR6JyJTcImYXOu0jiHlxI2CZsLam+gkZwGV9KORudMbBI2CZtzlcY5vJSwSdhcUHsDjeQ0uJJ2NDpnYpOwSdicqzTO4aWETcLmgtobaCSnwZW0o9E5E5uETcLmXKVxDi8lbBI2F9TeQCM5Da6kHY3OmdgkbBI25yqNc3gpYZOwuaD2BhrJaXAl7Wh0zsQmYZOwOVdpnMNLCZuEzQW1N9BIToMraUfjSafBlS3uJmwSNh2uHKVd91HpWRodrqQdjSedBle2uJuwSdh0uHKUdt1HpWdpdLiSdjSedBpc2eJuwiZh0+HKUdp1H5WepdHhStrReNJpcGWLuwmbhE2HK0dp131UepZGhytpR+NJp8GVLe4mbBI2Ha4cpV33UelZGh2upB2NJ50GV7a4m7BJ2HS4cpR23UelZ2l0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT144+T/ipeevDXx9va6K92OTcJmWzW4Uu/U3kDjHF568tbE29vrrnQ7NgmbbdXgSr1TewONc3jpyVsTb2+vu9Lt2CRstlWDK/VO7Q00zuGlJ29NvL297kq3Y5Ow2VYNrtQ7tTfQOIeXnrw18fb2uivdjk3CZls1uFLv1N5A4xxeevLWxNvb6650OzYJm23V4Eq9U3tfxdd8+z0T35ew6aqJK1vcPUq77qM+i6/59nsmvi9h01UTV7a4e5R23Ud9Fl/z7fdMfF/Cpqsmrmxx9yjtuo/6LL7m2++Z+L6ETVdNXNni7lHadR/1WXzNt98z8X0Jm66auLLF3aO06z7qs/iab79n4vsSNl01cWWLu0d5dv3ln+X9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuF/ANQkBqB7RoIFAAAAAElFTkSuQmCC","payUrl":"MOCK_PAY:OP2072580594814029824","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695180}
  15159. Forwarded URL = null
  15160. Redirected URL = null
  15161. Cookies = []
  15162. 15:18:15.188 DEBUG [hN5y3NGr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/order/OP_NOTEXIST | IP: 127.0.0.1
  15163. 15:18:15.189 DEBUG [hN5y3NGr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15164. 15:18:15.189 DEBUG [hN5y3NGr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15165. 15:18:15.192 DEBUG [hN5y3NGr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15166. 15:18:15.193 DEBUG [hN5y3NGr] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
  15167. 15:18:15.193 DEBUG [hN5y3NGr] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP_NOTEXIST(String)
  15168. 15:18:15.195 DEBUG [hN5y3NGr] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 0
  15169. 15:18:15.196 WARN [hN5y3NGr] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=2001, message=支付订单不存在
  15170. 15:18:15.197 DEBUG [hN5y3NGr] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/order/OP_NOTEXIST 200 9ms
  15171. MockHttpServletRequest:
  15172. HTTP Method = GET
  15173. Request URI = /api/payment/order/OP_NOTEXIST
  15174. Parameters = {}
  15175. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
  15176. Body = null
  15177. Session Attrs = {}
  15178. Handler:
  15179. Type = com.xuekairui.payment.controller.PaymentController
  15180. Method = com.xuekairui.payment.controller.PaymentController#queryOrder(String)
  15181. Async:
  15182. Async started = false
  15183. Async result = null
  15184. Resolved Exception:
  15185. Type = com.xuekairui.common.BusinessException
  15186. ModelAndView:
  15187. View name = null
  15188. View = null
  15189. Model = null
  15190. FlashMap:
  15191. Attributes = null
  15192. MockHttpServletResponse:
  15193. Status = 200
  15194. Error message = null
  15195. Headers = [X-Request-Id:"hN5y3NGr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15196. Content type = application/json
  15197. Body = {"code":2001,"message":"支付订单不存在","data":null,"timestamp":1782976695196}
  15198. Forwarded URL = null
  15199. Redirected URL = null
  15200. Cookies = []
  15201. 15:18:15.205 DEBUG [P6xhCMXY] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
  15202. 15:18:15.205 DEBUG [P6xhCMXY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15203. 15:18:15.206 DEBUG [P6xhCMXY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15204. 15:18:15.208 DEBUG [P6xhCMXY] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15205. 15:18:15.211 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15206. 15:18:15.211 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15207. 15:18:15.213 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15208. 15:18:15.221 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15209. 15:18:15.221 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580595118972929(Long), OP2072580595095048192(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580595095048192(String), NORMAL(String), 2026-07-02T15:33:15.213451100(LocalDateTime), 2026-07-02T15:18:15.220602200(LocalDateTime), 2026-07-02T15:18:15.220602200(LocalDateTime)
  15210. 15:18:15.224 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
  15211. 15:18:15.224 INFO [P6xhCMXY] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580595095048192 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
  15212. 15:18:15.229 DEBUG [P6xhCMXY] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 24ms
  15213. MockHttpServletRequest:
  15214. HTTP Method = POST
  15215. Request URI = /api/payment/order/create
  15216. Parameters = {}
  15217. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
  15218. Body = {"planId":1,"channel":"WECHAT"}
  15219. Session Attrs = {}
  15220. Handler:
  15221. Type = com.xuekairui.payment.controller.PaymentController
  15222. Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
  15223. Async:
  15224. Async started = false
  15225. Async result = null
  15226. Resolved Exception:
  15227. Type = null
  15228. ModelAndView:
  15229. View name = null
  15230. View = null
  15231. Model = null
  15232. FlashMap:
  15233. Attributes = null
  15234. MockHttpServletResponse:
  15235. Status = 200
  15236. Error message = null
  15237. Headers = [X-Request-Id:"P6xhCMXY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15238. Content type = application/json
  15239. Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595095048192","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAR2klEQVR4Xu3SQW4kSxID0X//S2v2z5kAxxWhEtRpy4YZPUqd/329vFzgP//h5eUE74f1coX3w3q5wvthvVzh/bBervB+WC9XeD+slyu8H9bLFd4P6+UK74f1coX3w3q5wvthvVyh/bD++yi+psOVbsfmZrXDSz+Lr3mg9j6Kr+lwpduxuVnt8NLP4mseqL2P4ms6XOl2bG5WO7z0s/iaB2rvo/iaDle6HZub1Q4v/Sy+5oHa+yi+psOVbsfmZrXDSz+Lr3mg9j6Kr+lwpduxuVnt8NLP4mseqL2Bxjm8lG5pnMNL21uuJGwSNqnSOIeX6lu1N9A4h5fSLY1zeGl7y5WETcImVRrn8FJ9q/YGGufwUrqlcQ4vbW+5krBJ2KRK4xxeqm/V3kDjHF5KtzTO4aXtLVcSNgmbVGmcw0v1rdobaJzDS+mWxjm8tL3lSsImYZMqjXN4qb5VewONc3gp3dI4h5e2t1xJ2CRsUqVxDi/Vt2pvoJGcBlfSjkbCJmGTsEnYpEojYZOwSZVGchpcSTsaD9TeQCM5Da6kHY2ETcImYZOwSZVGwiZhkyqN5DS4knY0Hqi9gUZyGlxJOxoJm4RNwiZhkyqNhE3CJlUayWlwJe1oPFB7A43kNLiSdjQSNgmbhE3CJlUaCZuETao0ktPgStrReKD2BhrJaXAl7WgkbBI2CZuETao0EjYJm1RpJKfBlbSj8UDtDTSS0+BK2tFI2CRsEjYJm1RpJGwSNqnSSE6DK2lH44HaG2gkp8GVtKORsEnYJGw6XEk7GsmZ2KRKIzkNrqQdjQdqb6CRnAZX0o5GwiZhk7DpcCXtaCRnYpMqjeQ0uJJ2NB6ovYFGchpcSTsaCZuETcKmw5W0o5GciU2qNJLT4Era0Xig9gYayWlwJe1oJGwSNgmbDlfSjkZyJjap0khOgytpR+OB2htoJKfBlbSjkbBJ2CRsOlxJOxrJmdikSiM5Da6kHY0Ham+gkZwGV9KORsImYZOw6XAl7WgkZ2KTKo3kNLiSdjQeqL2BRnIaXEk7GlunwZW0o9HhStrROOc0uJJ2NB6ovYFGchpcSTsaW6fBlbSj0eFK2tE45zS4knY0Hqi9gUZyGlxJOxpbp8GVtKPR4Ura0TjnNLiSdjQeqL2BRnIaXEk7GlunwZW0o9HhStrROOc0uJJ2NB6ovYFGchpcSTsaW6fBlbSj0eFK2tE45zS4knY0Hqi9gUZyGlxJOxpbp8GVtKPR4Ura0TjnNLiSdjQeqL2Bxjm81N2y6aqJK9udHd5O1zWScwov1bdqb6BxDi91t2y6auLKdmeHt9N1jeScwkv1rdobaJzDS90tm66auLLd2eHtdF0jOafwUn2r9gYa5/BSd8umqyaubHd2eDtd10jOKbxU36q9gcY5vNTdsumqiSvbnR3eTtc1knMKL9W3am+gcQ4vdbdsumriynZnh7fTdY3knMJL9a3a+yi+Jr1H419yfhJf80DtfRRfk96j8S85P4mveaD2PoqvSe/R+Jecn8TXPFB7H8XXpPdo/EvOT+JrHqi9j+Jr0ns0/iXnJ/E1D9TeR/E16T0a/5Lzk/iaB1rv38E/ZMImVRqd82f4y79th//5CZtUaXTOn+Ev/7Yd/ucnbFKl0Tl/hr/823b4n5+wSZVG5/wZ/vJv2+F/fsImVRqd82f4y79th//5CZtUaXTOn6H9bf5J0h9F46YzsUmVRsJmW01sumqHl7pbNl0VaUsPppMaN52JTao0EjbbamLTVTu81N2y6apIW3owndS46UxsUqWRsNlWE5uu2uGl7pZNV0Xa0oPppMZNZ2KTKo2Ezbaa2HTVDi91t2y6KtKWHkwnNW46E5tUaSRsttXEpqt2eKm7ZdNVkbb0YDqpcdOZ2KRKI2GzrSY2XbXDS90tm66K7MuJj+pwpcOV7U6DlxI2XbXDS+mWxhZ36+XWa/AJHa50uLLdafBSwqardngp3dLY4m693HoNPqHDlQ5XtjsNXkrYdNUOL6VbGlvcrZdbr8EndLjS4cp2p8FLCZuu2uGldEtji7v1cus1+IQOVzpc2e40eClh01U7vJRuaWxxt15uvQaf0OFKhyvbnQYvJWy6aoeX0i2NLe7Wy7U30EjYpEqjw5VuxyZh01UTVxI2Ha50uNLt2NS0pQe7kzap0uhwpduxSdh01cSVhE2HKx2udDs2NW3pwe6kTao0OlzpdmwSNl01cSVh0+FKhyvdjk1NW3qwO2mTKo0OV7odm4RNV01cSdh0uNLhSrdjU9OWHuxO2qRKo8OVbscmYdNVE1cSNh2udLjS7djUtKUHu5M2qdLocKXbsUnYdNXElYRNhysdrnQ7NjVt6cF0UmPr7HC3W7Y5V2kkbDpc6XZsUqWRnJK29GA6qbF1drjbLducqzQSNh2udDs2qdJITklbejCd1Ng6O9ztlm3OVRoJmw5Xuh2bVGkkp6QtPZhOamydHe52yzbnKo2ETYcr3Y5NqjSSU9KWHkwnNbbODne7ZZtzlUbCpsOVbscmVRrJKWlLD6aTGltnh7vdss25SiNh0+FKt2OTKo3klLSlB7uTNqnSSNgkbLrqFN7eXncl7WgkbFKlkZyJzQO1N9BI2KRKI2GTsOmqU3h7e92VtKORsEmVRnImNg/U3kAjYZMqjYRNwqarTuHt7XVX0o5GwiZVGsmZ2DxQewONhE2qNBI2CZuuOoW3t9ddSTsaCZtUaSRnYvNA7Q00Ejap0kjYJGy66hTe3l53Je1oJGxSpZGcic0DtTfQSNikSiNhk7DpqlN4e3vdlbSjkbBJlUZyJjYP1F6BTcImYZOw2VYNrmx3GrzU3bJJlcZl2ns+M2GTsEnYJGy2VYMr250GL3W3bFKlcZn2ns9M2CRsEjYJm23V4Mp2p8FL3S2bVGlcpr3nMxM2CZuETcJmWzW4st1p8FJ3yyZVGpdp7/nMhE3CJmGTsNlWDa5sdxq81N2ySZXGZdp7PjNhk7BJ2CRstlWDK9udBi91t2xSpXGZ/T0f/rP4mi3upmWNc3ipw5W0o9E5E5uab5QfxddscTcta5zDSx2upB2NzpnY1Hyj/Ci+Zou7aVnjHF7qcCXtaHTOxKbmG+VH8TVb3E3LGufwUocraUejcyY2Nd8oP4qv2eJuWtY4h5c6XEk7Gp0zsan5RvlRfM0Wd9Oyxjm81OFK2tHonIlNTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKzb7c4cPT0zU6XEnYbKsGV9KOxjlnYpMqjYTNA613Cp+ZHqrR4UrCZls1uJJ2NM45E5tUaSRsHmi9U/jM9FCNDlcSNtuqwZW0o3HOmdikSiNh80DrncJnpodqdLiSsNlWDa6kHY1zzsQmVRoJmwda7xQ+Mz1Uo8OVhM22anAl7WiccyY2qdJI2DzQeqfwmemhGh2uJGy2VYMraUfjnDOxSZVGwuaB1pt4MGGTsDlXaZxzJjap0rjpTGwSNgmbB1pv4sGETcLmXKVxzpnYpErjpjOxSdgkbB5ovYkHEzYJm3OVxjlnYpMqjZvOxCZhk7B5oPUmHkzYJGzOVRrnnIlNqjRuOhObhE3C5oHWm3gwYZOwOVdpnHMmNqnSuOlMbBI2CZsHWm/iwYRNwuZcpXHOmdikSuOmM7FJ2CRsHqi9gUaHK+fwUocrCZuEzRZ3EzYJm66auFLTlh7cnnTlHF7qcCVhk7DZ4m7CJmHTVRNXatrSg9uTrpzDSx2uJGwSNlvcTdgkbLpq4kpNW3pwe9KVc3ipw5WETcJmi7sJm4RNV01cqWlLD25PunIOL3W4krBJ2GxxN2GTsOmqiSs1benB7UlXzuGlDlcSNgmbLe4mbBI2XTVxpeYb5UAjYZOwSZXGFne7ZZtUaSRsOlxJ2CRsuqpkv+WjumfZJGxSpbHF3W7ZJlUaCZsOVxI2CZuuKtlv+ajuWTYJm1RpbHG3W7ZJlUbCpsOVhE3CpqtK9ls+qnuWTcImVRpb3O2WbVKlkbDpcCVhk7DpqpL9lo/qnmWTsEmVxhZ3u2WbVGkkbDpcSdgkbLqqZL/lo7pn2SRsUqWxxd1u2SZVGgmbDlcSNgmbrippt3xCeoTGObyUbml0uPL7du7h7YRNV329H5Yrv2/nHt5O2HTV1/thufL7du7h7YRNV329H5Yrv2/nHt5O2HTV1/thufL7du7h7YRNV329H5Yrv2/nHt5O2HTVV/9h/Tb8uekHayRsUqXR4Uq3Y9NVE1e6HZuuiuzLz+IfIP0JNBI2qdLocKXbsemqiSvdjk1XRfblZ/EPkP4EGgmbVGl0uNLt2HTVxJVux6arIvvys/gHSH8CjYRNqjQ6XOl2bLpq4kq3Y9NVkX35WfwDpD+BRsImVRodrnQ7Nl01caXbsemqyL78LP4B0p9AI2GTKo0OV7odm66auNLt2HRVpC09+LP4moTNFnfTskbCJmGTKo2tcwovPVB7H8XXJGy2uJuWNRI2CZtUaWydU3jpgdr7KL4mYbPF3bSskbBJ2KRKY+ucwksP1N5H8TUJmy3upmWNhE3CJlUaW+cUXnqg9j6Kr0nYbHE3LWskbBI2qdLYOqfw0gO191F8TcJmi7tpWSNhk7BJlcbWOYWXHqi9gcY5vHTulrtb3O1wJe1oJKfBlYTNtorU3kDjHF46d8vdLe52uJJ2NJLT4ErCZltFam+gcQ4vnbvl7hZ3O1xJOxrJaXAlYbOtIrU30DiHl87dcneLux2upB2N5DS4krDZVpHaG2icw0vnbrm7xd0OV9KORnIaXEnYbKtI7Q00zuGlc7fc3eJuhytpRyM5Da4kbLZVpPYGGslpcCXtaJxzGly5uaNxDi+lWxrfoN3yCekRGh2upB2Nc06DKzd3NM7hpXRL4xu0Wz4hPUKjw5W0o3HOaXDl5o7GObyUbml8g3bLJ6RHaHS4knY0zjkNrtzc0TiHl9ItjW/QbvmE9AiNDlfSjsY5p8GVmzsa5/BSuqXxDdotn5AeodHhStrROOc0uHJzR+McXkq3NL5Bu+UT0iM0OlxJOxodrqQdjS3upmWNhE1X/ULad/tz0w/W6HAl7Wh0uJJ2NLa4m5Y1EjZd9Qtp3+3PTT9Yo8OVtKPR4Ura0djiblrWSNh01S+kfbc/N/1gjQ5X0o5GhytpR2OLu2lZI2HTVb+Q9t3+3PSDNTpcSTsaHa6kHY0t7qZljYRNV/1C2nf7c9MP1uhwJe1odLiSdjS2uJuWNRI2XfULad/tz00/WKPDlbSjsXUmNh2upB2NhM222uFuWtZITqT2BhrJaXAl7WhsnYlNhytpRyNhs612uJuWNZITqb2BRnIaXEk7GltnYtPhStrRSNhsqx3upmWN5ERqb6CRnAZX0o7G1pnYdLiSdjQSNttqh7tpWSM5kdobaCSnwZW0o7F1JjYdrqQdjYTNttrhblrWSE6k9gYayWlwJe1obJ2JTYcraUcjYbOtdribljWSE6m9gcY5vHTulrsJm1RpJGzO4aUOV7odm676ej+siU2qNBI25/BShyvdjk1Xfb0f1sQmVRoJm3N4qcOVbsemq77eD2tikyqNhM05vNThSrdj01Vf74c1sUmVRsLmHF7qcKXbsemqr/fDmtikSiNhcw4vdbjS7dh01dd3PqyfxNek92h0uJJ2NJLT4Era0UjYdNUpvP1A7X0UX5Peo9HhStrRSE6DK2lHI2HTVafw9gO191F8TXqPRocraUcjOQ2upB2NhE1XncLbD9TeR/E16T0aHa6kHY3kNLiSdjQSNl11Cm8/UHsfxdek92h0uJJ2NJLT4Era0UjYdNUpvP1A7X0UX5Peo9HhStrRSE6DK2lHI2HTVafw9gOt9/Lyf/F+WC9XeD+slyu8H9bLFd4P6+UK74f1coX3w3q5wvthvVzh/bBervB+WC9XeD+slyu8H9bLFd4P6+UK/wOCyto8mCaaOQAAAABJRU5ErkJggg==","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695228}
  15240. Forwarded URL = null
  15241. Redirected URL = null
  15242. Cookies = []
  15243. 15:18:15.230 DEBUG [P2VP9H3y] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595095048192/pay | IP: 127.0.0.1
  15244. 15:18:15.233 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
  15245. 15:18:15.233 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP2072580595095048192(String)
  15246. 15:18:15.235 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 1
  15247. 15:18:15.240 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15248. 15:18:15.241 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15249. 15:18:15.242 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15250. 15:18:15.247 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, create_time=?, update_time=? WHERE id=?
  15251. 15:18:15.247 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: OP2072580595095048192(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595095048192(String), NORMAL(String), WECHAT(String), MOCK_E8A327CE02CA485F(String), 2026-07-02T15:18:15.242857500(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595118972929(Long)
  15252. 15:18:15.251 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
  15253. 15:18:15.251 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15254. 15:18:15.251 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15255. 15:18:15.253 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15256. 15:18:15.253 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  15257. 15:18:15.254 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  15258. 15:18:15.256 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  15259. 15:18:15.256 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
  15260. 15:18:15.257 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
  15261. 15:18:15.258 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
  15262. 15:18:15.261 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15263. 15:18:15.261 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580595244802050(Long), 1(Long), PRO(String), RECHARGE(String), 2026-07-02T15:18:15.258573500(LocalDateTime), 2026-08-01T15:18:15.258573500(LocalDateTime), 1(Integer), 支付购买: OP2072580595095048192(String), 2026-07-02T15:18:15.261241300(LocalDateTime), 2026-07-02T15:18:15.261241300(LocalDateTime)
  15264. 15:18:15.265 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.insert : <== Updates: 1
  15265. 15:18:15.266 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, token_version=?, create_time=?, update_time=? WHERE id=?
  15266. 15:18:15.266 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:18:15.258573500(LocalDateTime), 0(Long), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
  15267. 15:18:15.269 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  15268. 15:18:15.270 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15269. 15:18:15.270 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580595307716610(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:15.270168800(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), PAY:OP2072580595095048192->PRO(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:15.270702300(LocalDateTime)
  15270. 15:18:15.275 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  15271. 15:18:15.275 DEBUG [P2VP9H3y] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
  15272. 15:18:15.275 INFO [P2VP9H3y] [1] [ main] c.x.u.s.MembershipService : 用户1通过支付OP2072580595095048192激活会员等级PRO, 有效期30天
  15273. 15:18:15.275 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  15274. 15:18:15.276 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  15275. 15:18:15.278 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  15276. 15:18:15.279 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, membership_record_id=?, create_time=?, update_time=? WHERE id=?
  15277. 15:18:15.281 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: OP2072580595095048192(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595095048192(String), NORMAL(String), WECHAT(String), MOCK_E8A327CE02CA485F(String), 2026-07-02T15:18:15.242857500(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2072580595244802050(Long), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595118972929(Long)
  15278. 15:18:15.284 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
  15279. 15:18:15.285 INFO [P2VP9H3y] [1] [ main] c.x.p.s.PaymentOrderService : 支付成功: OP2072580595095048192 用户=1 方案=高级会员·月卡 金额=29.90元 会员=PRO 交易号=MOCK_E8A327CE02CA485F 类型=NORMAL
  15280. 15:18:15.294 DEBUG [P2VP9H3y] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595095048192/pay 200 64ms
  15281. MockHttpServletRequest:
  15282. HTTP Method = POST
  15283. Request URI = /api/payment/order/OP2072580595095048192/pay
  15284. Parameters = {}
  15285. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
  15286. Body = null
  15287. Session Attrs = {}
  15288. Handler:
  15289. Type = com.xuekairui.payment.controller.PaymentController
  15290. Method = com.xuekairui.payment.controller.PaymentController#confirmPay(String)
  15291. Async:
  15292. Async started = false
  15293. Async result = null
  15294. Resolved Exception:
  15295. Type = null
  15296. ModelAndView:
  15297. View name = null
  15298. View = null
  15299. Model = null
  15300. FlashMap:
  15301. Attributes = null
  15302. MockHttpServletResponse:
  15303. Status = 200
  15304. Error message = null
  15305. Headers = [X-Request-Id:"P2VP9H3y", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15306. Content type = application/json
  15307. Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595095048192","status":"PAID","amount":29.90,"planName":"高级会员·月卡","membershipLevel":"PRO","paidTime":"2026-07-02 15:18:15","membershipStartDate":null,"membershipEndDate":null},"timestamp":1782976695293}
  15308. Forwarded URL = null
  15309. Redirected URL = null
  15310. Cookies = []
  15311. 15:18:15.302 DEBUG [4ZjyY3B8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
  15312. 15:18:15.303 DEBUG [4ZjyY3B8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15313. 15:18:15.303 DEBUG [4ZjyY3B8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15314. 15:18:15.304 DEBUG [4ZjyY3B8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15315. 15:18:15.307 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15316. 15:18:15.308 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15317. 15:18:15.309 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15318. 15:18:15.316 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15319. 15:18:15.316 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580595500654594(Long), OP2072580595497701376(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580595497701376(String), NORMAL(String), 2026-07-02T15:33:15.309724100(LocalDateTime), 2026-07-02T15:18:15.316785600(LocalDateTime), 2026-07-02T15:18:15.316785600(LocalDateTime)
  15320. 15:18:15.319 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
  15321. 15:18:15.320 INFO [4ZjyY3B8] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580595497701376 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
  15322. 15:18:15.325 DEBUG [4ZjyY3B8] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 23ms
  15323. MockHttpServletRequest:
  15324. HTTP Method = POST
  15325. Request URI = /api/payment/order/create
  15326. Parameters = {}
  15327. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
  15328. Body = {"planId":1,"channel":"WECHAT"}
  15329. Session Attrs = {}
  15330. Handler:
  15331. Type = com.xuekairui.payment.controller.PaymentController
  15332. Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
  15333. Async:
  15334. Async started = false
  15335. Async result = null
  15336. Resolved Exception:
  15337. Type = null
  15338. ModelAndView:
  15339. View name = null
  15340. View = null
  15341. Model = null
  15342. FlashMap:
  15343. Attributes = null
  15344. MockHttpServletResponse:
  15345. Status = 200
  15346. Error message = null
  15347. Headers = [X-Request-Id:"4ZjyY3B8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15348. Content type = application/json
  15349. Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595497701376","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARfUlEQVR4Xu3SQY7jShIE0X//S2v2L5zTjlBSaqFpy4KZR5bA/14PDzfwn394eDjB82E93MLzYT3cwvNhPdzC82E93MLzYT3cwvNhPdzC82E93MLzYT3cwvNhPdzC82E93MLzYT3cQvth/fdVfM233zPxfVvcTcsan8XXXFB7X8XXfPs9E9+3xd20rPFZfM0FtfdVfM233zPxfVvcTcsan8XXXFB7X8XXfPs9E9+3xd20rPFZfM0FtfdVfM233zPxfVvcTcsan8XXXFB7X8XXfPs9E9+3xd20rPFZfM0FtTfQOIeX0i2Nc87EJmHTVTu89Ffeqr2Bxjm8lG5pnHMmNgmbrtrhpb/yVu0NNM7hpXRL45wzsUnYdNUOL/2Vt2pvoHEOL6VbGueciU3Cpqt2eOmvvFV7A41zeCnd0jjnTGwSNl21w0t/5a3aG2icw0vplsY5Z2KTsOmqHV76K2/V3kAjOQ2upB2NhM2d1cSVtKORnAZX0o5GhytpR+OC2htoJKfBlbSjkbC5s5q4knY0ktPgStrR6HAl7WhcUHsDjeQ0uJJ2NBI2d1YTV9KORnIaXEk7Gh2upB2NC2pvoJGcBlfSjkbC5s5q4kra0UhOgytpR6PDlbSjcUHtDTSS0+BK2tFI2NxZTVxJOxrJaXAl7Wh0uJJ2NC6ovYFGchpcSTsaCZs7q4kraUcjOQ2upB2NDlfSjsYFtTfQSE6DK2lHo3MmNttqYrPF3bSs0TkNrqQdjQtqb6CRnAZX0o5G50xsttXEZou7aVmjcxpcSTsaF9TeQCM5Da6kHY3Omdhsq4nNFnfTskbnNLiSdjQuqL2BRnIaXEk7Gp0zsdlWE5st7qZljc5pcCXtaFxQewON5DS4knY0Omdis60mNlvcTcsandPgStrRuKD2BhrJaXAl7Wh0zsRmW01stribljU6p8GVtKNxQe0NNJLT4Era0UjYJGxSpbF1JjYJm1RpdE6DK2lH44LaG2gkp8GVtKORsEnYpEpj60xsEjap0uicBlfSjsYFtTfQSE6DK2lHI2GTsEmVxtaZ2CRsUqXROQ2upB2NC2pvoJGcBlfSjkbCJmGTKo2tM7FJ2KRKo3MaXEk7GhfU3kAjOQ2upB2NhE3CJlUaW2dik7BJlUbnNLiSdjQuqL2BRnIaXEk7GgmbhE2qNLbOxCZhkyqNzmlwJe1oXFB7A41zeGl7y5Ut7m6XXUnYpEojOafwUn2r9gYa5/DS9pYrW9zdLruSsEmVRnJO4aX6Vu0NNM7hpe0tV7a4u112JWGTKo3knMJL9a3aG2icw0vbW65scXe77ErCJlUayTmFl+pbtTfQOIeXtrdc2eLudtmVhE2qNJJzCi/Vt2pvoHEOL21vubLF3e2yKwmbVGkk5xReqm/V3lfxNek9Gv+S80l8zQW191V8TXqPxr/kfBJfc0HtfRVfk96j8S85n8TXXFB7X8XXpPdo/EvOJ/E1F9TeV/E16T0a/5LzSXzNBbX3VXxNeo/Gv+R8El9zQev9bfjvdv+wTcImYZOw6aqJKz/Cz757oJGwSdgkbBI2XTVx5Uf42XcPNBI2CZuETcKmqyau/Ag/++6BRsImYZOwSdh01cSVH+Fn3z3QSNgkbBI2CZuumrjyI/zsuwcaCZuETcImYdNVE1d+hPbd/rvpH9ZI2HTVxJVux+ZcpdHhSsImVRoJm1RpJGwuqL2BRnImNl01caXbsTlXaXS4krBJlUbCJlUaCZsLam+gkZyJTVdNXOl2bM5VGh2uJGxSpZGwSZVGwuaC2htoJGdi01UTV7odm3OVRocrCZtUaSRsUqWRsLmg9gYayZnYdNXElW7H5lyl0eFKwiZVGgmbVGkkbC6ovYFGciY2XTVxpduxOVdpdLiSsEmVRsImVRoJmwtq7xDupmWNDlfSjkbnNLiyxd2ETcImYZOw6arX82FpJKfBlS3uJmwSNgmbhE1XvZ4PSyM5Da5scTdhk7BJ2CRsuur1fFgayWlwZYu7CZuETcImYdNVr+fD0khOgytb3E3YJGwSNgmbrno9H5ZGchpc2eJuwiZhk7BJ2HTVq/+wJh7sTtqcw0sJmw5XEjZd9V18cYcrF7TexIPdSZtzeClh0+FKwqarvosv7nDlgtabeLA7aXMOLyVsOlxJ2HTVd/HFHa5c0HoTD3Ynbc7hpYRNhysJm676Lr64w5ULWm/iwe6kzTm8lLDpcCVh01XfxRd3uHJB60082J20OYeXEjYdriRsuuq7+OIOVy6ovRWuJGxSpdHhyp14O13XSM7EJlUaW2di01Wv58M6hbfTdY3kTGxSpbF1JjZd9Xo+rFN4O13XSM7EJlUaW2di01Wv58M6hbfTdY3kTGxSpbF1JjZd9Xo+rFN4O13XSM7EJlUaW2di01Wv58M6hbfTdY3kTGxSpbF1JjZd9Xrnw9LYOjvc3eJuWtZI2KRKo8OVtKPRORObN2i3fEJ6hEbn7HB3i7tpWSNhkyqNDlfSjkbnTGzeoN3yCekRGp2zw90t7qZljYRNqjQ6XEk7Gp0zsXmDdssnpEdodM4Od7e4m5Y1Ejap0uhwJe1odM7E5g3aLZ+QHqHROTvc3eJuWtZI2KRKo8OVtKPRORObN2i3fEJ6hEbn7HB3i7tpWSNhkyqNDlfSjkbnTGze4OjWQCNhkyqNzpnYpEpj6zS4knY0ts4Od2v25cRHdc+ySZVG50xsUqWxdRpcSTsaW2eHuzX7cuKjumfZpEqjcyY2qdLYOg2upB2NrbPD3Zp9OfFR3bNsUqXRORObVGlsnQZX0o7G1tnhbs2+nPio7lk2qdLonIlNqjS2ToMraUdj6+xwt2ZfTnxU9yybVGl0zsQmVRpbp8GVtKOxdXa4W/NGWWDT4Ura0UjYdNXElc/u2KRKI2GTKo3klLxRFth0uJJ2NBI2XTVx5bM7NqnSSNikSiM5JW+UBTYdrqQdjYRNV01c+eyOTao0Ejap0khOyRtlgU2HK2lHI2HTVRNXPrtjkyqNhE2qNJJT8kZZYNPhStrRSNh01cSVz+7YpEojYZMqjeSUvFEW2HS4knY0EjZdNXHlszs2qdJI2KRKIzklb5QDjYRNwiZh01U7vJRuaSRnYrOtGlzpdmxq3igHGgmbhE3Cpqt2eCnd0kjOxGZbNbjS7djUvFEONBI2CZuETVft8FK6pZGcic22anCl27GpeaMcaCRsEjYJm67a4aV0SyM5E5tt1eBKt2NT80Y50EjYJGwSNl21w0vplkZyJjbbqsGVbsem5o1yoJGwSdgkbLpqh5fSLY3kTGy2VYMr3Y5NTVt6MJ3U6HBluzNxt1u22VYTm1RpJGdi0+FK2tGoaUsPppMaHa5sdybudss222pikyqN5ExsOlxJOxo1benBdFKjw5XtzsTdbtlmW01sUqWRnIlNhytpR6OmLT2YTmp0uLLdmbjbLdtsq4lNqjSSM7HpcCXtaNS0pQfTSY0OV7Y7E3e7ZZttNbFJlUZyJjYdrqQdjZq29GA6qdHhynZn4m63bLOtJjap0kjOxKbDlbSjUfNGeRte6m7ZdNXElbSjsXUmNgmbVGkk51b293z4ObzU3bLpqokraUdj60xsEjap0kjOrezv+fBzeKm7ZdNVE1fSjsbWmdgkbFKlkZxb2d/z4efwUnfLpqsmrqQdja0zsUnYpEojObeyv+fDz+Gl7pZNV01cSTsaW2dik7BJlUZybmV/z4efw0vdLZuumriSdjS2zsQmYZMqjeTcSnvPZ975UC9tcbfDlQ5XtjsNXkq3NDpnYtNVr+fDmrjS4cp2p8FL6ZZG50xsuur1fFgTVzpc2e40eCnd0uiciU1XvZ4Pa+JKhyvbnQYvpVsanTOx6arX82FNXOlwZbvT4KV0S6NzJjZd9Xo+rIkrHa5sdxq8lG5pdM7Epqte/YfV4BMSNh2unNvZ4W7C5rP4mvQejc4p2ZcTH5Ww6XDl3M4OdxM2n8XXpPdodE7Jvpz4qIRNhyvndna4m7D5LL4mvUejc0r25cRHJWw6XDm3s8PdhM1n8TXpPRqdU7IvJz4qYdPhyrmdHe4mbD6Lr0nv0eickn058VEJmw5Xzu3scDdh81l8TXqPRueUvFEONLa4m7BJlUaHKwmbVGkkbO7E2+m6RudEWm/iwfrkH3E3YZMqjQ5XEjap0kjY3Im303WNzom03sSD9ck/4m7CJlUaHa4kbFKlkbC5E2+n6xqdE2m9iQfrk3/E3YRNqjQ6XEnYpEojYXMn3k7XNTon0noTD9Yn/4i7CZtUaXS4krBJlUbC5k68na5rdE6k9SYerE/+EXcTNqnS6HAlYZMqjYTNnXg7XdfonEjr/W3476Z/WCNhs8XdtKzR4UqHKwmbVGnU7Mvv4g+QfgKNhM0Wd9OyRocrHa4kbFKlUbMvv4s/QPoJNBI2W9xNyxodrnS4krBJlUbNvvwu/gDpJ9BI2GxxNy1rdLjS4UrCJlUaNfvyu/gDpJ9AI2Gzxd20rNHhSocrCZtUadTsy+/iD5B+Ao2EzRZ307JGhysdriRsUqVR05Ye/Cy+Jr1HI2FzrtJIToMraUejc3a4W9OWHvwsvia9RyNhc67SSE6DK2lHo3N2uFvTlh78LL4mvUcjYXOu0khOgytpR6Nzdrhb05Ye/Cy+Jr1HI2FzrtJIToMraUejc3a4W9OWHvwsvia9RyNhc67SSE6DK2lHo3N2uFvTlh78LL4mvUcjYXOu0khOgytpR6Nzdrhb05YefOPkH/FSuqVxzjmFl9Itjc5pcCVhc5R23Ufd+SwvpVsa55xTeCnd0uicBlcSNkdp133Unc/yUrqlcc45hZfSLY3OaXAlYXOUdt1H3fksL6VbGuecU3gp3dLonAZXEjZHadd91J3P8lK6pXHOOYWX0i2NzmlwJWFzlHbdR935LC+lWxrnnFN4Kd3S6JwGVxI2R2nXfVR6lkaHK2lHI2Gzxd2ETcImVRrJOYWXEjYJmwtqb6CRnAZX0o5GwmaLuwmbhE2qNJJzCi8lbBI2F9TeQCM5Da6kHY2EzRZ3EzYJm1RpJOcUXkrYJGwuqL2BRnIaXEk7GgmbLe4mbBI2qdJIzim8lLBJ2FxQewON5DS4knY0EjZb3E3YJGxSpZGcU3gpYZOwuaD2BhrJaXAl7WgkbLa4m7BJ2KRKIzmn8FLCJmFzQe0NNJLT4Era0eicBle6HZtzeCnd0uhwpcOVmrb0YDqp0eFK2tHonAZXuh2bc3gp3dLocKXDlZq29GA6qdHhStrR6JwGV7odm3N4Kd3S6HClw5WatvRgOqnR4Ura0eicBle6HZtzeCnd0uhwpcOVmrb0YDqp0eFK2tHonAZXuh2bc3gp3dLocKXDlZq29GA6qdHhStrR6JwGV7odm3N4Kd3S6HClw5WatvRgOqnR4Ura0eiciU1X7fBSuqWxdSY2CZuETVe9ng9L4xxeSrc0ts7EJmGTsOmq1/NhaZzDS+mWxtaZ2CRsEjZd9Xo+LI1zeCnd0tg6E5uETcKmq17Ph6VxDi+lWxpbZ2KTsEnYdNXr+bA0zuGldEtj60xsEjYJm656nf2wTuGlc7fc3eLuObyUsNlWDa7UO7U30DiHl87dcneLu+fwUsJmWzW4Uu/U3kDjHF46d8vdLe6ew0sJm23V4Eq9U3sDjXN46dwtd7e4ew4vJWy2VYMr9U7tDTTO4aVzt9zd4u45vJSw2VYNrtQ7tTfQOIeXzt1yd4u75/BSwmZbNbhS79TeV/E1v/AejQ5XOlxJ2HS4UtOWHvwsvuYX3qPR4UqHKwmbDldq2tKDn8XX/MJ7NDpc6XAlYdPhSk1bevCz+JpfeI9GhysdriRsOlypaUsPfhZf8wvv0ehwpcOVhE2HKzVt6cHP4mt+4T0aHa50uJKw6XClZl8+PPwfng/r4RaeD+vhFp4P6+EWng/r4RaeD+vhFp4P6+EWng/r4RaeD+vhFp4P6+EWng/r4RaeD+vhFp4P6+EW/gdcjMPGakRCwgAAAABJRU5ErkJggg==","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695325}
  15350. Forwarded URL = null
  15351. Redirected URL = null
  15352. Cookies = []
  15353. 15:18:15.326 DEBUG [sWqB8HvJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595497701376/pay | IP: 127.0.0.1
  15354. 15:18:15.330 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
  15355. 15:18:15.330 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP2072580595497701376(String)
  15356. 15:18:15.332 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 1
  15357. 15:18:15.332 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15358. 15:18:15.332 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15359. 15:18:15.335 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15360. 15:18:15.335 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, create_time=?, update_time=? WHERE id=?
  15361. 15:18:15.336 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: OP2072580595497701376(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595497701376(String), NORMAL(String), WECHAT(String), MOCK_654D6629F4EB48AE(String), 2026-07-02T15:18:15.335093600(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595500654594(Long)
  15362. 15:18:15.339 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
  15363. 15:18:15.339 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15364. 15:18:15.339 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15365. 15:18:15.342 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15366. 15:18:15.342 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  15367. 15:18:15.342 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  15368. 15:18:15.344 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  15369. 15:18:15.345 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.updateById : ==> Preparing: UPDATE t_user_membership SET user_id=?, level=?, source=?, effective_from=?, effective_to=?, status=?, remark=?, create_time=?, update_time=? WHERE id=?
  15370. 15:18:15.345 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.updateById : ==> Parameters: 1(Long), PRO(String), RECHARGE(String), 2026-07-02T15:18:15(LocalDateTime), 2026-08-31T15:18:15(LocalDateTime), 1(Integer), 支付购买: OP2072580595095048192(String), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595244802050(Long)
  15371. 15:18:15.348 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.updateById : <== Updates: 1
  15372. 15:18:15.349 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, token_version=?, create_time=?, update_time=? WHERE id=?
  15373. 15:18:15.349 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-31T15:18:15(LocalDateTime), 0(Long), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
  15374. 15:18:15.352 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  15375. 15:18:15.353 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15376. 15:18:15.354 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580595630678017(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:15.353500400(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), PAY:OP2072580595497701376->PRO(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:15.353500400(LocalDateTime)
  15377. 15:18:15.357 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  15378. 15:18:15.357 DEBUG [sWqB8HvJ] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
  15379. 15:18:15.357 INFO [sWqB8HvJ] [1] [ main] c.x.u.s.MembershipService : 用户1通过支付OP2072580595497701376激活会员等级PRO, 有效期30天
  15380. 15:18:15.357 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  15381. 15:18:15.357 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  15382. 15:18:15.361 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
  15383. 15:18:15.361 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, membership_record_id=?, create_time=?, update_time=? WHERE id=?
  15384. 15:18:15.362 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: OP2072580595497701376(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595497701376(String), NORMAL(String), WECHAT(String), MOCK_654D6629F4EB48AE(String), 2026-07-02T15:18:15.335093600(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2072580595244802050(Long), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595500654594(Long)
  15385. 15:18:15.365 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
  15386. 15:18:15.365 INFO [sWqB8HvJ] [1] [ main] c.x.p.s.PaymentOrderService : 支付成功: OP2072580595497701376 用户=1 方案=高级会员·月卡 金额=29.90元 会员=PRO 交易号=MOCK_654D6629F4EB48AE 类型=NORMAL
  15387. 15:18:15.371 DEBUG [sWqB8HvJ] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595497701376/pay 200 45ms
  15388. MockHttpServletRequest:
  15389. HTTP Method = POST
  15390. Request URI = /api/payment/order/OP2072580595497701376/pay
  15391. Parameters = {}
  15392. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
  15393. Body = null
  15394. Session Attrs = {}
  15395. Handler:
  15396. Type = com.xuekairui.payment.controller.PaymentController
  15397. Method = com.xuekairui.payment.controller.PaymentController#confirmPay(String)
  15398. Async:
  15399. Async started = false
  15400. Async result = null
  15401. Resolved Exception:
  15402. Type = null
  15403. ModelAndView:
  15404. View name = null
  15405. View = null
  15406. Model = null
  15407. FlashMap:
  15408. Attributes = null
  15409. MockHttpServletResponse:
  15410. Status = 200
  15411. Error message = null
  15412. Headers = [X-Request-Id:"sWqB8HvJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15413. Content type = application/json
  15414. Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595497701376","status":"PAID","amount":29.90,"planName":"高级会员·月卡","membershipLevel":"PRO","paidTime":"2026-07-02 15:18:15","membershipStartDate":null,"membershipEndDate":null},"timestamp":1782976695370}
  15415. Forwarded URL = null
  15416. Redirected URL = null
  15417. Cookies = []
  15418. 15:18:15.371 DEBUG [7mbqKcG6] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595497701376/pay | IP: 127.0.0.1
  15419. 15:18:15.374 DEBUG [7mbqKcG6] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
  15420. 15:18:15.374 DEBUG [7mbqKcG6] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP2072580595497701376(String)
  15421. 15:18:15.376 DEBUG [7mbqKcG6] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 1
  15422. 15:18:15.379 WARN [7mbqKcG6] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=2005, message=该订单已支付
  15423. 15:18:15.380 DEBUG [7mbqKcG6] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595497701376/pay 200 9ms
  15424. MockHttpServletRequest:
  15425. HTTP Method = POST
  15426. Request URI = /api/payment/order/OP2072580595497701376/pay
  15427. Parameters = {}
  15428. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
  15429. Body = null
  15430. Session Attrs = {}
  15431. Handler:
  15432. Type = com.xuekairui.payment.controller.PaymentController
  15433. Method = com.xuekairui.payment.controller.PaymentController#confirmPay(String)
  15434. Async:
  15435. Async started = false
  15436. Async result = null
  15437. Resolved Exception:
  15438. Type = com.xuekairui.common.BusinessException
  15439. ModelAndView:
  15440. View name = null
  15441. View = null
  15442. Model = null
  15443. FlashMap:
  15444. Attributes = null
  15445. MockHttpServletResponse:
  15446. Status = 200
  15447. Error message = null
  15448. Headers = [X-Request-Id:"7mbqKcG6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15449. Content type = application/json
  15450. Body = {"code":2005,"message":"该订单已支付","data":null,"timestamp":1782976695379}
  15451. Forwarded URL = null
  15452. Redirected URL = null
  15453. Cookies = []
  15454. 15:18:15.385 DEBUG [CxU6AMZ8] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/orders | IP: 127.0.0.1
  15455. 15:18:15.386 DEBUG [CxU6AMZ8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15456. 15:18:15.386 DEBUG [CxU6AMZ8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15457. 15:18:15.389 DEBUG [CxU6AMZ8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15458. 15:18:15.390 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_payment_order WHERE user_id = ? ORDER BY create_time DESC
  15459. 15:18:15.390 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectByUserId : ==> Parameters: 1(Long)
  15460. 15:18:15.392 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectByUserId : <== Total: 5
  15461. 15:18:15.393 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15462. 15:18:15.393 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15463. 15:18:15.394 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15464. 15:18:15.402 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15465. 15:18:15.402 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15466. 15:18:15.404 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15467. 15:18:15.408 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15468. 15:18:15.408 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15469. 15:18:15.410 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15470. 15:18:15.416 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15471. 15:18:15.416 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15472. 15:18:15.421 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15473. 15:18:15.421 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15474. 15:18:15.421 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15475. 15:18:15.423 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15476. 15:18:15.424 DEBUG [CxU6AMZ8] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/orders 200 39ms
  15477. MockHttpServletRequest:
  15478. HTTP Method = GET
  15479. Request URI = /api/payment/orders
  15480. Parameters = {}
  15481. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
  15482. Body = null
  15483. Session Attrs = {}
  15484. Handler:
  15485. Type = com.xuekairui.payment.controller.PaymentController
  15486. Method = com.xuekairui.payment.controller.PaymentController#listMyOrders(HttpServletRequest)
  15487. Async:
  15488. Async started = false
  15489. Async result = null
  15490. Resolved Exception:
  15491. Type = null
  15492. ModelAndView:
  15493. View name = null
  15494. View = null
  15495. Model = null
  15496. FlashMap:
  15497. Attributes = null
  15498. MockHttpServletResponse:
  15499. Status = 200
  15500. Error message = null
  15501. Headers = [X-Request-Id:"CxU6AMZ8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15502. Content type = application/json
  15503. Body = {"code":200,"message":"操作成功","data":[{"orderNo":"OP2072580594017112064","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARrklEQVR4Xu3SQW7kShIE0X//S2v2L5wYRzBZJaFpy4aZR5aa//28vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNl01caXDlYRNqjQ655P4mgtq76v4moRNV01c6XAlYZMqjc75JL7mgtr7Kr4mYdNVE1c6XEnYpEqjcz6Jr7mg9r6Kr0nYdNXElQ5XEjap0uicT+JrLqi9r+JrEjZdNXGlw5WETao0OueT+JoLau+r+JqETVdNXOlwJWGTKo3O+SS+5oLaG2icw0vbW650OzZP4u10XaNzTuGl+lbtDTTO4aXtLVe6HZsn8Xa6rtE5p/BSfav2Bhrn8NL2livdjs2TeDtd1+icU3ipvlV7A41zeGl7y5Vux+ZJvJ2ua3TOKbxU36q9gcY5vLS95Uq3Y/Mk3k7XNTrnFF6qb9XeQOMcXtrecqXbsXkSb6frGp1zCi/Vt2pvoJGcBlfSjkZyJjap0jjnNLjS7dikSqPDlbSjcUHtDTSS0+BK2tFIzsQmVRrnnAZXuh2bVGl0uJJ2NC6ovYFGchpcSTsayZnYpErjnNPgSrdjkyqNDlfSjsYFtTfQSE6DK2lHIzkTm1RpnHMaXOl2bFKl0eFK2tG4oPYGGslpcCXtaCRnYpMqjXNOgyvdjk2qNDpcSTsaF9TeQCM5Da6kHY3kTGxSpXHOaXCl27FJlUaHK2lH44LaG2gkp8GVtKORnAZX0o5GciY2CZtUaZxzGlxJOxoX1N5AIzkNrqQdjeQ0uJJ2NJIzsUnYpErjnNPgStrRuKD2BhrJaXAl7Wgkp8GVtKORnIlNwiZVGuecBlfSjsYFtTfQSE6DK2lHIzkNrqQdjeRMbBI2qdI45zS4knY0Lqi9gUZyGlxJOxrJaXAl7WgkZ2KTsEmVxjmnwZW0o3FB7Q00ktPgStrRSE6DK2lHIzkTm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoHEOL6VbGk86O9zd4m5a1jiHl+pbtTfQOIeX0i2NJ50d7m5xNy1rnMNL9a3aG2icw0vplsaTzg53t7ibljXO4aX6Vu0NNM7hpXRL40lnh7tb3E3LGufwUn2r9gYa5/BSuqXxpLPD3S3upmWNc3ipvlV7A41zeCnd0njS2eHuFnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+234c7sfbHOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj/BX/0l/od0/yU25yqN5ExsuupP8Fd/if8h3X+JzblKIzkTm676E/zVX+J/SPdfYnOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj9B+0v8A6Q/gcY5vJSwSZVGcna4m5Y1zjmn8NIN2i2fkB6hcQ4vJWxSpZGcHe6mZY1zzim8dIN2yyekR2icw0sJm1RpJGeHu2lZ45xzCi/doN3yCekRGufwUsImVRrJ2eFuWtY455zCSzdot3xCeoTGObyUsEmVRnJ2uJuWNc45p/DSDdotn5AeoXEOLyVsUqWRnB3upmWNc84pvHSDo1sDjS3upmWNc06DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf/sNyPh3QSE6DKwmbhM22eg5vd9dttlWDK/VO7Q00OqfBlYRNwmZbPYe3u+s226rBlXqn9gYandPgSsImYbOtnsPb3XWbbdXgSr1TewONzmlwJWGTsNlWz+Ht7rrNtmpwpd6pvYFG5zS4krBJ2Gyr5/B2d91mWzW4Uu/U3kCjcxpcSdgkbLbVc3i7u26zrRpcqXdab+LBhM22anAl7Wh0uJJ2NDpc6XZsOlxJ2HRV5EZZYLOtGlxJOxodrqQdjQ5Xuh2bDlcSNl0VuVEW2GyrBlfSjkaHK2lHo8OVbsemw5WETVdFbpQFNtuqwZW0o9HhStrR6HCl27HpcCVh01WRG2WBzbZqcCXtaHS4knY0Olzpdmw6XEnYdFXkRllgs60aXEk7Gh2upB2NDle6HZsOVxI2XRW5URbYpEojOQ2upB2NrTOxSZVGhytpR6NzJjY32G/5qIRNqjSS0+BK2tHYOhObVGl0uJJ2NDpnYnOD/ZaPStikSiM5Da6kHY2tM7FJlUaHK2lHo3MmNjfYb/mohE2qNJLT4Era0dg6E5tUaXS4knY0Omdic4P9lo9K2KRKIzkNrqQdja0zsUmVRocraUejcyY2N9hv+aiETao0ktPgStrR2DoTm1RpdLiSdjQ6Z2Jzg5NbEx+esHkSbydsEjYJmy3udriSdjSO8vB6gc2TeDthk7BJ2Gxxt8OVtKNxlIfXC2yexNsJm4RNwmaLux2upB2Nozy8XmDzJN5O2CRsEjZb3O1wJe1oHOXh9QKbJ/F2wiZhk7DZ4m6HK2lH4ygPrxfYPIm3EzYJm4TNFnc7XEk7Gkdp133UFncTNqnSSNh8Fl+TsNlWE5uumrhS79TeIdxN2KRKI2HzWXxNwmZbTWy6auJKvVN7h3A3YZMqjYTNZ/E1CZttNbHpqokr9U7tHcLdhE2qNBI2n8XXJGy21cSmqyau1Du1dwh3Ezap0kjYfBZfk7DZVhObrpq4Uu/U3iHcTdikSiNh81l8TcJmW01sumriSr3Teg0+oX7E/8XdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjX7cuKjbjwL3E3LGp0zsUmVRudMbLZVgyvdjk3Nvpz4qBvPAnfTskbnTGxSpdE5E5tt1eBKt2NTsy8nPurGs8DdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjVt6cGETao0kjOx+Zv4q7rfZdNVE1cSNjdot3xCwiZVGsmZ2PxN/FXd77LpqokrCZsbtFs+IWGTKo3kTGz+Jv6q7nfZdNXElYTNDdotn5CwSZVGciY2fxN/Vfe7bLpq4krC5gbtlk9I2KRKIzkTm7+Jv6r7XTZdNXElYXODdssnJGxSpZGcic3fxF/V/S6brpq4krC5QbvlE7pH2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BIzsQmYZOwSdgkbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5/2wbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5+yHNbHpqh1e6m7ZJGxSpdHhSrdjkyqNDldu0G75hO4RNl21w0vdLZuETao0OlzpdmxSpdHhyg3aLZ/QPcKmq3Z4qbtlk7BJlUaHK92OTao0Oly5QbvlE7pH2HTVDi91t2wSNqnS6HCl27FJlUaHKzdot3xC9wibrtrhpe6WTcImVRodrnQ7NqnS6HDlBu2WT+geYdNVO7zU3bJJ2KRKo8OVbscmVRodrtyg3fIJ6REaCZuETao0zuGl7pZNwiZVGt/G99W0pQfTSY2ETcImVRrn8FJ3yyZhkyqNb+P7atrSg+mkRsImYZMqjXN4qbtlk7BJlca38X01benBdFIjYZOwSZXGObzU3bJJ2KRK49v4vpq29GA6qZGwSdikSuMcXupu2SRsUqXxbXxfTVt6MJ3USNgkbFKlcQ4vdbdsEjap0vg2vq9mX34X/wDdn8CmqyauJGwSNgmbDlcSNqnSqNmX38U/QPcnsOmqiSsJm4RNwqbDlYRNqjRq9uV38Q/Q/QlsumriSsImYZOw6XAlYZMqjZp9+V38A3R/ApuumriSsEnYJGw6XEnYpEqjZl9+F/8A3Z/ApqsmriRsEjYJmw5XEjap0qjZl9/FP0D3J7DpqokrCZuETcKmw5WETao0atrSg5/F13wb37fF3bSssXUmNkdp133UZ/E138b3bXE3LWtsnYnNUdp1H/VZfM238X1b3E3LGltnYnOUdt1HfRZf82183xZ307LG1pnYHKVd91Gfxdd8G9+3xd20rLF1JjZHadd91GfxNd/G921xNy1rbJ2JzVHadR/15LO8lG5pJGdi82TV4G7CpsOVbscmYXNB7Q00zuGldEsjORObJ6sGdxM2Ha50OzYJmwtqb6BxDi+lWxrJmdg8WTW4m7DpcKXbsUnYXFB7A41zeCnd0kjOxObJqsHdhE2HK92OTcLmgtobaJzDS+mWRnImNk9WDe4mbDpc6XZsEjYX1N5A4xxeSrc0kjOxebJqcDdh0+FKt2OTsLmg9gYayWlwJe1obJ0GVxI2qdJI2HTVDi8lbBI2F9TeQCM5Da6kHY2t0+BKwiZVGgmbrtrhpYRNwuaC2htoJKfBlbSjsXUaXEnYpEojYdNVO7yUsEnYXFB7A43kNLiSdjS2ToMrCZtUaSRsumqHlxI2CZsLam+gkZwGV9KOxtZpcCVhkyqNhE1X7fBSwiZhc0HtDTSS0+BK2tHYOg2uJGxSpZGw6aodXkrYJGwuqL2BRnIaXEk7GslpcCVhk7BJlUZyGlxJ2HS4cpR23UelZ2l0uJJ2NJLT4ErCJmGTKo3kNLiSsOlw5Sjtuo9Kz9LocCXtaCSnwZWETcImVRrJaXAlYdPhylHadR+VnqXR4Ura0UhOgysJm4RNqjSS0+BKwqbDlaO06z4qPUujw5W0o5GcBlcSNgmbVGkkp8GVhE2HK0dp131UepZGhytpRyM5Da4kbBI2qdJIToMrCZsOV47Srvuo9CyNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UHb5z8v3jps7caXDmHlxI226rBlXqn9gYa5/DSZ281uHIOLyVstlWDK/VO7Q00zuGlz95qcOUcXkrYbKsGV+qd2htonMNLn73V4Mo5vJSw2VYNrtQ7tTfQOIeXPnurwZVzeClhs60aXKl3am+gcQ4vffZWgyvn8FLCZls1uFLv1N5X8TXde2xSpZGwSdgkbLpq4soWd4/Srvuoz+JruvfYpEojYZOwSdh01cSVLe4epV33UZ/F13TvsUmVRsImYZOw6aqJK1vcPUq77qM+i6/p3mOTKo2ETcImYdNVE1e2uHuUdt1HfRZf073HJlUaCZuETcKmqyaubHH3KO26j/osvqZ7j02qNBI2CZuETVdNXNni7lGeXX/5Z3k/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR/gfYWtF3xw1oioAAAAASUVORK5CYII=","payUrl":"MOCK_PAY:OP2072580594017112064","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580594507845632","planName":"高级会员·月卡","amount":29.90,"channel":"ALIPAY","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAR1klEQVR4Xu3SwY7jypIE0fv/P63Zn3C+cYSSVDeatiyYeWQJ/O/z8nID//mHl5cTvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbQf1n8/xdek92gk5z68nbBJlUbnPImvuaD2foqvSe/RSM59eDthkyqNznkSX3NB7f0UX5Peo5Gc+/B2wiZVGp3zJL7mgtr7Kb4mvUcjOffh7YRNqjQ650l8zQW191N8TXqPRnLuw9sJm1RpdM6T+JoLau+n+Jr0Ho3k3Ie3Ezap0uicJ/E1F9TeQOMcXkq3NBI2XTVxJWHTVTu89Efeqr2Bxjm8lG5pJGy6auJKwqardnjpj7xVewONc3gp3dJI2HTVxJWETVft8NIfeav2Bhrn8FK6pZGw6aqJKwmbrtrhpT/yVu0NNM7hpXRLI2HTVRNXEjZdtcNLf+St2htonMNL6ZZGwqarJq4kbLpqh5f+yFu1N9BIToMraUcjYdPhyhZ307JGchpcSTsaHa6kHY0Lam+gkZwGV9KORsKmw5Ut7qZljeQ0uJJ2NDpcSTsaF9TeQCM5Da6kHY2ETYcrW9xNyxrJaXAl7Wh0uJJ2NC6ovYFGchpcSTsaCZsOV7a4m5Y1ktPgStrR6HAl7WhcUHsDjeQ0uJJ2NBI2Ha5scTctaySnwZW0o9HhStrRuKD2BhrJaXAl7WgkbDpc2eJuWtZIToMraUejw5W0o3FB7Q00ktPgStrR6JyJzbaa2GxxNy1rdE6DK2lH44LaG2gkp8GVtKPRORObbTWx2eJuWtbonAZX0o7GBbU30EhOgytpR6NzJjbbamKzxd20rNE5Da6kHY0Lam+gkZwGV9KORudMbLbVxGaLu2lZo3MaXEk7GhfU3kAjOQ2upB2NzpnYbKuJzRZ307JG5zS4knY0Lqi9gUZyGlxJOxqdM7HZVhObLe6mZY3OaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXs/xdek92j8S86T+JoLau+n+Jr0Ho1/yXkSX3NB7f0UX5Peo/EvOU/iay6ovZ/ia9J7NP4l50l8zQW191N8TXqPxr/kPImvuaD2foqvSe/R+JecJ/E1F7Ten4b/bvqHNRI2Ha7cibf/Ev7adw80kjOx6XDlTrz9l/DXvnugkZyJTYcrd+Ltv4S/9t0DjeRMbDpcuRNv/yX8te8eaCRnYtPhyp14+y/hr333QCM5E5sOV+7E238J7bv9d9M/rJGw6aqJKwmbVGkkbFKl0eFKwiZVGgmbVGkkbC6ovYFGciY2XTVxJWGTKo2ETao0OlxJ2KRKI2GTKo2EzQW1N9BIzsSmqyauJGxSpZGwSZVGhysJm1RpJGxSpZGwuaD2BhrJmdh01cSVhE2qNBI2qdLocCVhkyqNhE2qNBI2F9TeQCM5E5uumriSsEmVRsImVRodriRsUqWRsEmVRsLmgtobaCRnYtNVE1cSNqnSSNikSqPDlYRNqjQSNqnSSNhc0HoTD25xN2HT4Ura0UhOgysJm1RpJGwSNgmbhE1Xfd4PSyM5Da4kbFKlkbBJ2CRsEjZd9Xk/LI3kNLiSsEmVRsImYZOwSdh01ef9sDSS0+BKwiZVGgmbhE3CJmHTVZ/3w9JIToMrCZtUaSRsEjYJm4RNV33eD0sjOQ2uJGxSpZGwSdgkbBI2XfX55sNq8FHds2wSNufwUnfLpqt+iy/ucOWC1tvho7pn2SRszuGl7pZNV/0WX9zhygWtt8NHdc+ySdicw0vdLZuu+i2+uMOVC1pvh4/qnmWTsDmHl7pbNl31W3xxhysXtN4OH9U9yyZhcw4vdbdsuuq3+OIOVy5ovR0+qnuWTcLmHF7qbtl01W/xxR2uXNB6Ew+mkxodrqQdjS3ubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurTf1jOpwMaHa6kHY1zToMrCZtUaXS4knY0Omdi8wXtlk9Ij9DocCXtaJxzGlxJ2KRKo8OVtKPRORObL2i3fEJ6hEaHK2lH45zT4ErCJlUaHa6kHY3Omdh8QbvlE9IjNDpcSTsa55wGVxI2qdLocCXtaHTOxOYL2i2fkB6h0eFK2tE45zS4krBJlUaHK2lHo3MmNl/QbvmE9AiNDlfSjsY5p8GVhE2qNDpcSTsanTOx+YL9lo/qcGWLu2lZI2GTsEmVRocraUdj6+xwt+aLcoUrW9xNyxoJm4RNqjQ6XEk7Gltnh7s1X5QrXNniblrWSNgkbFKl0eFK2tHYOjvcrfmiXOHKFnfTskbCJmGTKo0OV9KOxtbZ4W7NF+UKV7a4m5Y1EjYJm1RpdLiSdjS2zg53a74oV7iyxd20rJGwSdikSqPDlbSjsXV2uFvzRVlg0+FKwiZhk7BJlUZyGlzpdmxSpZGwSZVGckq+KAtsOlxJ2CRsEjap0khOgyvdjk2qNBI2qdJITskXZYFNhysJm4RNwiZVGslpcKXbsUmVRsImVRrJKfmiLLDpcCVhk7BJ2KRKIzkNrnQ7NqnSSNikSiM5JV+UBTYdriRsEjYJm1RpJKfBlW7HJlUaCZtUaSSn5IuywKbDlYRNwiZhkyqN5DS40u3YpEojYZMqjeSUtKUHu5M2Ha5scbfDlbSjkZyJTao0EjYdrnQ7NjVt6cHupE2HK1vc7XAl7WgkZ2KTKo2ETYcr3Y5NTVt6sDtp0+HKFnc7XEk7GsmZ2KRKI2HT4Uq3Y1PTlh7sTtp0uLLF3Q5X0o5GciY2qdJI2HS40u3Y1LSlB7uTNh2ubHG3w5W0o5GciU2qNBI2Ha50OzY1benB7qRNhytb3O1wJe1oJGdikyqNhE2HK92OTc2+nPio7bNcSdgkbFKl0TkTm1RpJGy2VYMraUejZl9OfNT2Wa4kbBI2qdLonIlNqjQSNtuqwZW0o1GzLyc+avssVxI2CZtUaXTOxCZVGgmbbdXgStrRqNmXEx+1fZYrCZuETao0OmdikyqNhM22anAl7WjU7MuJj9o+y5WETcImVRqdM7FJlUbCZls1uJJ2NGr25cRHbZ/lSsImYZMqjc6Z2KRKI2GzrRpcSTsaNV+UBTbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK/t7Pjxhc67S6HCl27FJlUZyJjbnKo3k3Mr+ng9P2JyrNDpc6XZsUqWRnInNuUojObeyv+fDEzbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK+09n3nuoe5ucTdhcw4v/fqWRudMbLrq835Yp/DSr29pdM7Epqs+74d1Ci/9+pZG50xsuurzflin8NKvb2l0zsSmqz7vh3UKL/36lkbnTGy66vN+WKfw0q9vaXTOxKarPv2H1eATukfYbKsGV87tTGyexdek92h0Tsm+nPio7lk226rBlXM7E5tn8TXpPRqdU7IvJz6qe5bNtmpw5dzOxOZZfE16j0bnlOzLiY/qnmWzrRpcObczsXkWX5Peo9E5Jfty4qO6Z9lsqwZXzu1MbJ7F16T3aHROyb6c+KjuWTbbqsGVczsTm2fxNek9Gp1T8kU50Ng6E5s78XbCJlUayXkSX5Peo9E5kdabeDCd1Oicic2deDthkyqN5DyJr0nv0eicSOtNPJhOanTOxOZOvJ2wSZVGcp7E16T3aHROpPUmHkwnNTpnYnMn3k7YpEojOU/ia9J7NDon0noTD6aTGp0zsbkTbydsUqWRnCfxNek9Gp0Tab2JB9NJjc6Z2NyJtxM2qdJIzpP4mvQejc6JtN6fhv9u9w/bJGzO4aUOVzpcSdikSqNmX/4Wf4DuJ7BJ2JzDSx2udLiSsEmVRs2+/C3+AN1PYJOwOYeXOlzpcCVhkyqNmn35W/wBup/AJmFzDi91uNLhSsImVRo1+/K3+AN0P4FNwuYcXupwpcOVhE2qNGr25W/xB+h+ApuEzTm81OFKhysJm1Rp1LSlB5/F15x7j7sJm1RpJKfBlbSj0Tk73K1pSw8+i6859x53Ezap0khOgytpR6Nzdrhb05YefBZfc+497iZsUqWRnAZX0o5G5+xwt6YtPfgsvubce9xN2KRKIzkNrqQdjc7Z4W5NW3rwWXzNufe4m7BJlUZyGlxJOxqds8Pdmrb04LP4mnPvcTdhkyqN5DS4knY0OmeHuzVt6cEvTv6/eCnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPufJaX0i2N5ExsUqWxxd20rNE5Da4kbI7SrvuoO5/lpXRLIzkTm1RpbHE3LWt0ToMrCZujtOs+6s5neSnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPSszQ6XEk7Gh2upB2N5ExsEjYdrpzDSwmbhM0FtTfQSE6DK2lHo8OVtKORnIlNwqbDlXN4KWGTsLmg9gYayWlwJe1odLiSdjSSM7FJ2HS4cg4vJWwSNhfU3kAjOQ2upB2NDlfSjkZyJjYJmw5XzuGlhE3C5oLaG2gkp8GVtKPR4Ura0UjOxCZh0+HKObyUsEnYXFB7A43kNLiSdjQ6XEk7GsmZ2CRsOlw5h5cSNgmbC2pvoJGcBlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1obJ2JTYcraUejw5W0o9HhSocrNW3pwXRSo8OVtKOxdSY2Ha6kHY0OV9KORocrHa7UtKUH00mNDlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1oJOc+vN3hStrR2DoTm4RNwqarPu+H1eDtDlfSjsbWmdgkbBI2XfV5P6wGb3e4knY0ts7EJmGTsOmqz/thNXi7w5W0o7F1JjYJm4RNV33eD6vB2x2upB2NrTOxSdgkbLrq835YDd7ucCXtaGydiU3CJmHTVZ+zH9YpvNTdsulwJe1o3Im3EzbbqsGVeqf2Bhrn8FJ3y6bDlbSjcSfeTthsqwZX6p3aG2icw0vdLZsOV9KOxp14O2GzrRpcqXdqb6BxDi91t2w6XEk7Gnfi7YTNtmpwpd6pvYHGObzU3bLpcCXtaNyJtxM226rBlXqn9gYa5/BSd8umw5W0o3En3k7YbKsGV+qd2vspvia9R6NzJjZd1eBuWtbocCVh0+FKTVt68Fl8TXqPRudMbLqqwd20rNHhSsKmw5WatvTgs/ia9B6NzpnYdFWDu2lZo8OVhE2HKzVt6cFn8TXpPRqdM7HpqgZ307JGhysJmw5XatrSg8/ia9J7NDpnYtNVDe6mZY0OVxI2Ha7UtKUHn8XXpPdodM7Epqsa3E3LGh2uJGw6XKnZly8v/4P3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX/Ay6DIKLn9Mh8AAAAAElFTkSuQmCC","payUrl":"MOCK_PAY:OP2072580594507845632","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580594814029824","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARVUlEQVR4Xu3SQZLjSnAE0X//S7f2LwOmsESBFDXw5Zh7ZHEa//29vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7GltnYpOwSdgkbFKlcc5pcCXtaFxQewON5DS4knY0ts7EJmGTsEnYpErjnNPgStrRuKD2BhrJaXAl7WhsnYlNwiZhk7BJlcY5p8GVtKNxQe0NNJLT4Era0dg6E5uETcImYZMqjXNOgytpR+OC2htoJKfBlbSjsXUmNgmbhE3CJlUa55wGV9KOxgW1N9BIToMraUdj60xsEjYJm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkZyTuGlhE3CJlUaHa6kHY0OV9KOxgW1N9BIToMraUcjOafwUsImYZMqjQ5X0o5GhytpR+OC2htoJKfBlbSjkZxTeClhk7BJlUaHK2lHo8OVtKNxQe0NNJLT4Era0UjOKbyUsEnYpEqjw5W0o9HhStrRuKD2BhrJaXAl7Wgk5xReStgkbFKl0eFK2tHocCXtaFxQewON5DS4knY0knMKLyVsEjap0uhwJe1odLiSdjQuqL2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+7+GP7f+wQu8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT/Br/4S/yBP/km8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT9B+0v8D0j/BRrn8FLCJmFzDi+lWxrnnFN46Qbtlk9Ij9A4h5cSNgmbc3gp3dI455zCSzdot3xCeoTGObyUsEnYnMNL6ZbGOecUXrpBu+UT0iM0zuGlhE3C5hxeSrc0zjmn8NIN2i2fkB6hcQ4vJWwSNufwUrqlcc45hZdu0G75hPQIjXN4KWGTsDmHl9ItjXPOKbx0g3bLJ6RHaHS4krBJ2CRszuGlLe4mbBI2CZuETVf9vR/WKby0xd2ETcImYZOw6aq/98M6hZe2uJuwSdgkbBI2XfX3flin8NIWdxM2CZuETcKmq/7eD+sUXtribsImYZOwSdh01d/7YZ3CS1vcTdgkbBI2CZuu+rvzYU1sUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLDyZsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLD6aTGk/i7YRNV01cSdicw0vplkbnTGxu0G75hPQIjSfxdsKmqyauJGzO4aV0S6NzJjY3aLd8QnqExpN4O2HTVRNXEjbn8FK6pdE5E5sbtFs+IT1C40m8nbDpqokrCZtzeCnd0uicic0N2i2fkB6h8STeTth01cSVhM05vJRuaXTOxOYG7ZZPSI/QeBJvJ2y6auJKwuYcXkq3NDpnYnODdssnpEdoJGeHuwmbVGlscTdhkyqNhE2HK2lH4yjtuo9Kz9JIzg53Ezap0tjibsImVRoJmw5X0o7GUdp1H5WepZGcHe4mbFKlscXdhE2qNBI2Ha6kHY2jtOs+Kj1LIzk73E3YpEpji7sJm1RpJGw6XEk7Gkdp131UepZGcna4m7BJlcYWdxM2qdJI2HS4knY0jtKu+6j0LI3k7HA3YZMqjS3uJmxSpZGw6XAl7WgcZb/uM9NDNba4m5Y1zjk73E3YbKuJTVdNXKl3Wm/iwXRSY4u7aVnjnLPD3YTNtprYdNXElXqn9SYeTCc1tribljXOOTvcTdhsq4lNV01cqXdab+LBdFJji7tpWeOcs8PdhM22mth01cSVeqf1Jh5MJzW2uJuWNc45O9xN2GyriU1XTVypd1pv4sF0UmOLu2lZ45yzw92Ezbaa2HTVxJV6p/UmHqxPLvBSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKAca5/BSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKP9f4K96Em931226auJKwuYG+y0f9Zv4q57E2911m66auJKwucF+y0f9Jv6qJ/F2d92mqyauJGxusN/yUb+Jv+pJvN1dt+mqiSsJmxvst3zUb+KvehJvd9dtumriSsLmBvstH/Wb+KuexNvddZuumriSsLlBu+UTto9wJWHzJN7e4m7C5slq4kra0UjYXFB7A40OVxI2T+LtLe4mbJ6sJq6kHY2EzQW1N9DocCVh8yTe3uJuwubJauJK2tFI2FxQewONDlcSNk/i7S3uJmyerCaupB2NhM0FtTfQ6HAlYfMk3t7ibsLmyWriStrRSNhcUHsDjQ5XEjZP4u0t7iZsnqwmrqQdjYTNBbU30EhOgyvbnQYvJWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV39kPq8GVbsemqxrcTdikSqPDlW7HJlUaHa7coN3yCdtHuNLt2HRVg7sJm1RpdLjS7dikSqPDlRu0Wz5h+whXuh2brmpwN2GTKo0OV7odm1RpdLhyg3bLJ2wf4Uq3Y9NVDe4mbFKl0eFKt2OTKo0OV27QbvmE7SNc6XZsuqrB3YRNqjQ6XOl2bFKl0eHKDdotn7B9hCvdjk1XNbibsEmVRocr3Y5NqjQ6XLlBu+UT0iM0kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9Xsy+/i/8BCZttNbFJ2HTVxJUOVxI2qdKo2Zffxf+AhM22mtgkbLpq4kqHKwmbVGnU7Mvv4n9AwmZbTWwSNl01caXDlYRNqjRq9uV38T8gYbOtJjYJm66auNLhSsImVRo1+/K7+B+QsNlWE5uETVdNXOlwJWGTKo2affld/A9I2GyriU3CpqsmrnS4krBJlUZNW3rws/iahE3CZou7W9xNyxpbZ2JzlHbdR30WX5OwSdhscXeLu2lZY+tMbI7Srvuoz+JrEjYJmy3ubnE3LWtsnYnNUdp1H/VZfE3CJmGzxd0t7qZlja0zsTlKu+6jPouvSdgkbLa4u8XdtKyxdSY2R2nXfdRn8TUJm4TNFne3uJuWNbbOxOYo7bqPevJZXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00zuGldEsjOQ2upB2N5ExsUqWRsOlwpduxSdhcUHsDjXN4Kd3SSE6DK2lHIzkTm1RpJGw6XOl2bBI2F9TeQOMcXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00ktPgStrR6JyJTcImYXOu0jiHlxI2CZsLam+gkZwGV9KORudMbBI2CZtzlcY5vJSwSdhcUHsDjeQ0uJJ2NDpnYpOwSdicqzTO4aWETcLmgtobaCSnwZW0o9E5E5uETcLmXKVxDi8lbBI2F9TeQCM5Da6kHY3OmdgkbBI25yqNc3gpYZOwuaD2BhrJaXAl7Wh0zsQmYZOwOVdpnMNLCZuEzQW1N9BIToMraUfjSafBlS3uJmwSNh2uHKVd91HpWRodrqQdjSedBle2uJuwSdh0uHKUdt1HpWdpdLiSdjSedBpc2eJuwiZh0+HKUdp1H5WepdHhStrReNJpcGWLuwmbhE2HK0dp131UepZGhytpR+NJp8GVLe4mbBI2Ha4cpV33UelZGh2upB2NJ50GV7a4m7BJ2HS4cpR23UelZ2l0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT144+T/ipeevDXx9va6K92OTcJmWzW4Uu/U3kDjHF568tbE29vrrnQ7NgmbbdXgSr1TewONc3jpyVsTb2+vu9Lt2CRstlWDK/VO7Q00zuGlJ29NvL297kq3Y5Ow2VYNrtQ7tTfQOIeXnrw18fb2uivdjk3CZls1uFLv1N5A4xxeevLWxNvb6650OzYJm23V4Eq9U3tfxdd8+z0T35ew6aqJK1vcPUq77qM+i6/59nsmvi9h01UTV7a4e5R23Ud9Fl/z7fdMfF/Cpqsmrmxx9yjtuo/6LL7m2++Z+L6ETVdNXNni7lHadR/1WXzNt98z8X0Jm66auLLF3aO06z7qs/iab79n4vsSNl01cWWLu0d5dv3ln+X9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuF/ANQkBqB7RoIFAAAAAElFTkSuQmCC","payUrl":"MOCK_PAY:OP2072580594814029824","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580595095048192","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PAID","qrCodeBase64":null,"payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":null,"createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580595497701376","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PAID","qrCodeBase64":null,"payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":null,"createTime":"2026-07-02 15:18:15"}],"timestamp":1782976695423}
  15504. Forwarded URL = null
  15505. Redirected URL = null
  15506. Cookies = []
  15507. 15:18:15.432 DEBUG [stKnnthP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/payment/plans | IP: 127.0.0.1
  15508. 15:18:15.432 DEBUG [stKnnthP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15509. 15:18:15.432 DEBUG [stKnnthP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15510. 15:18:15.435 DEBUG [stKnnthP] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15511. 15:18:15.443 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_payment_plan WHERE (plan_code = ?)
  15512. 15:18:15.443 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.selectCount : ==> Parameters: BIENNIAL(String)
  15513. 15:18:15.444 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.selectCount : <== Total: 1
  15514. 15:18:15.445 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_plan ( id, plan_name, plan_code, membership_level, price, original_price, duration_days, sort_order, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15515. 15:18:15.445 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580596041719810(Long), 两年卡(String), BIENNIAL(String), PRO(String), 1599(BigDecimal), 1798(BigDecimal), 730(Integer), 0(Integer), 1(Integer), 2026-07-02T15:18:15.445902800(LocalDateTime), 2026-07-02T15:18:15.445902800(LocalDateTime)
  15516. 15:18:15.449 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
  15517. 15:18:15.449 INFO [stKnnthP] [1] [ main] c.x.p.s.PaymentPlanService : 创建支付方案: 两年卡 (BIENNIAL)
  15518. 15:18:15.454 DEBUG [stKnnthP] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/payment/plans 200 22ms
  15519. MockHttpServletRequest:
  15520. HTTP Method = POST
  15521. Request URI = /api/admin/payment/plans
  15522. Parameters = {}
  15523. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"138"]
  15524. Body = {"planCode":"BIENNIAL","planName":"两年卡","price":1599,"originalPrice":1798,"durationDays":730,"membershipLevel":"PRO","tag":"省11%"}
  15525. Session Attrs = {}
  15526. Handler:
  15527. Type = com.xuekairui.payment.controller.AdminPaymentController
  15528. Method = com.xuekairui.payment.controller.AdminPaymentController#createPlan(AdminPlanUpsertRequest)
  15529. Async:
  15530. Async started = false
  15531. Async result = null
  15532. Resolved Exception:
  15533. Type = null
  15534. ModelAndView:
  15535. View name = null
  15536. View = null
  15537. Model = null
  15538. FlashMap:
  15539. Attributes = null
  15540. MockHttpServletResponse:
  15541. Status = 200
  15542. Error message = null
  15543. Headers = [X-Request-Id:"stKnnthP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15544. Content type = application/json
  15545. Body = {"code":200,"message":"操作成功","data":{"id":2072580596041719810,"planName":"两年卡","planCode":"BIENNIAL","membershipLevel":"PRO","price":1599,"originalPrice":1798,"durationDays":730,"description":null,"tag":"省11%","sortOrder":0},"timestamp":1782976695453}
  15546. Forwarded URL = null
  15547. Redirected URL = null
  15548. Cookies = []
  15549. 15:18:15.459 DEBUG [kR6hYVzh] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1 | IP: 127.0.0.1
  15550. 15:18:15.460 DEBUG [kR6hYVzh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15551. 15:18:15.460 DEBUG [kR6hYVzh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15552. 15:18:15.461 DEBUG [kR6hYVzh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15553. 15:18:15.464 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15554. 15:18:15.464 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15555. 15:18:15.466 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15556. 15:18:15.467 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_payment_plan WHERE (plan_code = ?)
  15557. 15:18:15.467 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectCount : ==> Parameters: MONTHLY(String)
  15558. 15:18:15.469 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectCount : <== Total: 1
  15559. 15:18:15.470 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_plan SET plan_name=?, plan_code=?, membership_level=?, price=?, original_price=?, duration_days=?, sort_order=?, status=?, create_time=?, update_time=? WHERE id=?
  15560. 15:18:15.470 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: 月卡(更新)(String), MONTHLY(String), PRO(String), 109(BigDecimal), 109(BigDecimal), 30(Integer), 3(Integer), 1(Integer), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
  15561. 15:18:15.473 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
  15562. 15:18:15.473 INFO [kR6hYVzh] [1] [ main] c.x.p.s.PaymentPlanService : 更新支付方案: 月卡(更新) (MONTHLY)
  15563. 15:18:15.478 DEBUG [kR6hYVzh] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1 200 19ms
  15564. MockHttpServletRequest:
  15565. HTTP Method = PUT
  15566. Request URI = /api/admin/payment/plans/1
  15567. Parameters = {}
  15568. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"124"]
  15569. Body = {"planCode":"MONTHLY","planName":"月卡(更新)","price":109,"originalPrice":109,"durationDays":30,"membershipLevel":"PRO"}
  15570. Session Attrs = {}
  15571. Handler:
  15572. Type = com.xuekairui.payment.controller.AdminPaymentController
  15573. Method = com.xuekairui.payment.controller.AdminPaymentController#updatePlan(Long, AdminPlanUpsertRequest)
  15574. Async:
  15575. Async started = false
  15576. Async result = null
  15577. Resolved Exception:
  15578. Type = null
  15579. ModelAndView:
  15580. View name = null
  15581. View = null
  15582. Model = null
  15583. FlashMap:
  15584. Attributes = null
  15585. MockHttpServletResponse:
  15586. Status = 200
  15587. Error message = null
  15588. Headers = [X-Request-Id:"kR6hYVzh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15589. Content type = application/json
  15590. Body = {"code":200,"message":"操作成功","data":{"id":1,"planName":"月卡(更新)","planCode":"MONTHLY","membershipLevel":"PRO","price":109,"originalPrice":109,"durationDays":30,"description":null,"tag":null,"sortOrder":3},"timestamp":1782976695477}
  15591. Forwarded URL = null
  15592. Redirected URL = null
  15593. Cookies = []
  15594. 15:18:15.486 DEBUG [CBzU7AQs] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1/status | IP: 127.0.0.1
  15595. 15:18:15.487 DEBUG [CBzU7AQs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15596. 15:18:15.487 DEBUG [CBzU7AQs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15597. 15:18:15.489 DEBUG [CBzU7AQs] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15598. 15:18:15.492 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
  15599. 15:18:15.493 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
  15600. 15:18:15.494 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
  15601. 15:18:15.494 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_plan SET plan_name=?, plan_code=?, membership_level=?, price=?, original_price=?, duration_days=?, sort_order=?, status=?, description=?, create_time=?, update_time=? WHERE id=?
  15602. 15:18:15.494 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: 月卡(更新)(String), MONTHLY(String), PRO(String), 109.00(BigDecimal), 109.00(BigDecimal), 30(Integer), 3(Integer), 0(Integer), 每天不限量· 1个月29.9(原价59.9)(String), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
  15603. 15:18:15.497 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
  15604. 15:18:15.497 INFO [CBzU7AQs] [1] [ main] c.x.p.s.PaymentPlanService : 切换支付方案状态: 月卡(更新) -> status=0
  15605. 15:18:15.503 DEBUG [CBzU7AQs] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1/status 200 17ms
  15606. MockHttpServletRequest:
  15607. HTTP Method = PUT
  15608. Request URI = /api/admin/payment/plans/1/status
  15609. Parameters = {}
  15610. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"12"]
  15611. Body = {"status":0}
  15612. Session Attrs = {}
  15613. Handler:
  15614. Type = com.xuekairui.payment.controller.AdminPaymentController
  15615. Method = com.xuekairui.payment.controller.AdminPaymentController#toggleStatus(Long, Map)
  15616. Async:
  15617. Async started = false
  15618. Async result = null
  15619. Resolved Exception:
  15620. Type = null
  15621. ModelAndView:
  15622. View name = null
  15623. View = null
  15624. Model = null
  15625. FlashMap:
  15626. Attributes = null
  15627. MockHttpServletResponse:
  15628. Status = 200
  15629. Error message = null
  15630. Headers = [X-Request-Id:"CBzU7AQs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15631. Content type = application/json
  15632. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976695502}
  15633. Forwarded URL = null
  15634. Redirected URL = null
  15635. Cookies = []
  15636. 15:18:15.505 DEBUG [3wwVZC9c] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/payment/plans | IP: 127.0.0.1
  15637. 15:18:15.507 WARN [3wwVZC9c] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/payment/plans 401 2ms
  15638. MockHttpServletRequest:
  15639. HTTP Method = POST
  15640. Request URI = /api/admin/payment/plans
  15641. Parameters = {}
  15642. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"90"]
  15643. Body = {"planCode":"TEST","planName":"测试","price":1,"durationDays":1,"membershipLevel":"PRO"}
  15644. Session Attrs = {}
  15645. Handler:
  15646. Type = null
  15647. Async:
  15648. Async started = false
  15649. Async result = null
  15650. Resolved Exception:
  15651. Type = null
  15652. ModelAndView:
  15653. View name = null
  15654. View = null
  15655. Model = null
  15656. FlashMap:
  15657. Attributes = null
  15658. MockHttpServletResponse:
  15659. Status = 401
  15660. Error message = null
  15661. Headers = [X-Request-Id:"3wwVZC9c", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15662. Content type = application/json;charset=UTF-8
  15663. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976695506}
  15664. Forwarded URL = null
  15665. Redirected URL = null
  15666. Cookies = []
  15667. 15:18:15.513 DEBUG [44xjfQz2] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1 | IP: 127.0.0.1
  15668. 15:18:15.514 DEBUG [44xjfQz2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15669. 15:18:15.514 DEBUG [44xjfQz2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15670. 15:18:15.515 DEBUG [44xjfQz2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15671. 15:18:15.516 WARN [44xjfQz2] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1 403 3ms
  15672. MockHttpServletRequest:
  15673. HTTP Method = PUT
  15674. Request URI = /api/admin/payment/plans/1
  15675. Parameters = {}
  15676. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5NSwiZXhwIjoxNzgzMDYzMDk1fQ.bsBXxeXrKAqT7fbQ4WRdyGzEh4xF7Bb1DuU_S8wy8VR-qiCvIT0REc_hL4CUmDI-PO2lkj2c44gNKjWWi5Rs9A", Content-Length:"95"]
  15677. Body = {"planCode":"MONTHLY","planName":"月卡","price":99,"durationDays":30,"membershipLevel":"PRO"}
  15678. Session Attrs = {}
  15679. Handler:
  15680. Type = null
  15681. Async:
  15682. Async started = false
  15683. Async result = null
  15684. Resolved Exception:
  15685. Type = null
  15686. ModelAndView:
  15687. View name = null
  15688. View = null
  15689. Model = null
  15690. FlashMap:
  15691. Attributes = null
  15692. MockHttpServletResponse:
  15693. Status = 403
  15694. Error message = null
  15695. Headers = [X-Request-Id:"44xjfQz2", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15696. Content type = application/json;charset=UTF-8
  15697. Body = {"code":403,"message":"无权限访问","data":null,"timestamp":1782976695516}
  15698. Forwarded URL = null
  15699. Redirected URL = null
  15700. Cookies = []
  15701. 15:18:15.520 DEBUG [ncVj6cc8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/callback/wechat | IP: 127.0.0.1
  15702. 15:18:15.521 INFO [ncVj6cc8] [] [ main] .p.c.PaymentCallbackController : 【模拟】收到微信支付回调: orderNo=null tradeNo=null
  15703. 15:18:15.521 WARN [ncVj6cc8] [] [ main] .p.c.PaymentCallbackController : 微信回调缺少订单号
  15704. 15:18:15.522 DEBUG [ncVj6cc8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/callback/wechat 200 2ms
  15705. MockHttpServletRequest:
  15706. HTTP Method = POST
  15707. Request URI = /api/payment/callback/wechat
  15708. Parameters = {}
  15709. Headers = [Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"]
  15710. Body = null
  15711. Session Attrs = {}
  15712. Handler:
  15713. Type = com.xuekairui.payment.controller.PaymentCallbackController
  15714. Method = com.xuekairui.payment.controller.PaymentCallbackController#wechatCallback(HttpServletRequest)
  15715. Async:
  15716. Async started = false
  15717. Async result = null
  15718. Resolved Exception:
  15719. Type = null
  15720. ModelAndView:
  15721. View name = null
  15722. View = null
  15723. Model = null
  15724. FlashMap:
  15725. Attributes = null
  15726. MockHttpServletResponse:
  15727. Status = 200
  15728. Error message = null
  15729. Headers = [X-Request-Id:"ncVj6cc8", Content-Type:"text/plain;charset=UTF-8", Content-Length:"4", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15730. Content type = text/plain;charset=UTF-8
  15731. Body = FAIL
  15732. Forwarded URL = null
  15733. Redirected URL = null
  15734. Cookies = []
  15735. 15:18:15.526 DEBUG [PTf8nGBr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/callback/alipay | IP: 127.0.0.1
  15736. 15:18:15.527 INFO [PTf8nGBr] [] [ main] .p.c.PaymentCallbackController : 【模拟】收到支付宝回调: orderNo=null tradeNo=null
  15737. 15:18:15.527 WARN [PTf8nGBr] [] [ main] .p.c.PaymentCallbackController : 支付宝回调缺少订单号
  15738. 15:18:15.528 DEBUG [PTf8nGBr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/callback/alipay 200 2ms
  15739. MockHttpServletRequest:
  15740. HTTP Method = POST
  15741. Request URI = /api/payment/callback/alipay
  15742. Parameters = {}
  15743. Headers = [Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"]
  15744. Body = null
  15745. Session Attrs = {}
  15746. Handler:
  15747. Type = com.xuekairui.payment.controller.PaymentCallbackController
  15748. Method = com.xuekairui.payment.controller.PaymentCallbackController#alipayCallback(HttpServletRequest)
  15749. Async:
  15750. Async started = false
  15751. Async result = null
  15752. Resolved Exception:
  15753. Type = null
  15754. ModelAndView:
  15755. View name = null
  15756. View = null
  15757. Model = null
  15758. FlashMap:
  15759. Attributes = null
  15760. MockHttpServletResponse:
  15761. Status = 200
  15762. Error message = null
  15763. Headers = [X-Request-Id:"PTf8nGBr", Content-Type:"text/plain;charset=UTF-8", Content-Length:"4", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15764. Content type = text/plain;charset=UTF-8
  15765. Body = fail
  15766. Forwarded URL = null
  15767. Redirected URL = null
  15768. Cookies = []
  15769. [INFO] Tests run: 18, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.593 s -- in 支付模块接口测试
  15770. [INFO] Running com.xuekairui.gateway.PlatformAccountBindingTest
  15771. 15:18:15.532 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.PlatformAccountBindingTest]: PlatformAccountBindingTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  15772. 15:18:15.534 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.PlatformAccountBindingTest
  15773. 15:18:18.633 DEBUG [CzkhgEqt] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  15774. 15:18:18.635 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  15775. 15:18:18.636 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  15776. 15:18:18.637 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  15777. 15:18:18.637 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
  15778. 15:18:18.637 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.637467900(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  15779. 15:18:18.641 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  15780. 15:18:18.642 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  15781. 15:18:18.642 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.637467900(LocalDateTime), 127.0.0.1(String), 1(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  15782. 15:18:18.644 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  15783. 15:18:18.645 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15784. 15:18:18.645 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15785. 15:18:18.647 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15786. 15:18:18.647 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  15787. 15:18:18.647 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  15788. 15:18:18.650 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  15789. 15:18:18.650 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  15790. 15:18:18.650 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  15791. 15:18:18.653 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  15792. 15:18:18.653 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15793. 15:18:18.653 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609518018562(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.653023800(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.653550300(LocalDateTime)
  15794. 15:18:18.657 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  15795. 15:18:18.657 DEBUG [CzkhgEqt] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  15796. 15:18:18.663 DEBUG [CzkhgEqt] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 30ms
  15797. MockHttpServletRequest:
  15798. HTTP Method = POST
  15799. Request URI = /api/auth/sms/login
  15800. Parameters = {}
  15801. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  15802. Body = {"phone":"13800138000","code":"123456"}
  15803. Session Attrs = {}
  15804. Handler:
  15805. Type = com.xuekairui.user.controller.AuthController
  15806. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  15807. Async:
  15808. Async started = false
  15809. Async result = null
  15810. Resolved Exception:
  15811. Type = null
  15812. ModelAndView:
  15813. View name = null
  15814. View = null
  15815. Model = null
  15816. FlashMap:
  15817. Attributes = null
  15818. MockHttpServletResponse:
  15819. Status = 200
  15820. Error message = null
  15821. Headers = [X-Request-Id:"CzkhgEqt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15822. Content type = application/json
  15823. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.DwLxUCP1WIogZR390EgMTUPXzDT6wQ4GxS04PI4ogkCShZyeG3QIHg4TjSz2Ic6_sWcMz7USNVwKgaI1zIGofw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976698662}
  15824. Forwarded URL = null
  15825. Redirected URL = null
  15826. Cookies = []
  15827. 15:18:18.663 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  15828. 15:18:18.665 DEBUG [wgE6Rqh7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  15829. 15:18:18.669 DEBUG [wgE6Rqh7] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  15830. 15:18:18.669 DEBUG [wgE6Rqh7] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
  15831. 15:18:18.671 DEBUG [wgE6Rqh7] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  15832. 15:18:18.673 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15833. 15:18:18.674 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580609580933121(Long), 1(Long), yaoshibang(String), 药师帮(String), J2sm/7ZSTEqpVLqnb0gvOFtbl0szwzM7HQcFw5LUobJDO5xznMr1(String), 8OvI7mta/feZVi3l9erAmiyoGmhnhKliclHj5m4lXHhKKwRWC8KBbVCN3GuA(String), true(Boolean), PENDING(String), 2026-07-02T15:18:18.673502100(LocalDateTime), 2026-07-02T15:18:18.673502100(LocalDateTime)
  15834. 15:18:18.677 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
  15835. 15:18:18.677 INFO [wgE6Rqh7] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaoshibang
  15836. 15:18:18.683 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15837. 15:18:18.683 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609648041985(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.683314500(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.683853400(LocalDateTime)
  15838. 15:18:18.689 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  15839. 15:18:18.689 DEBUG [wgE6Rqh7] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
  15840. 15:18:18.690 DEBUG [wgE6Rqh7] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 25ms
  15841. MockHttpServletRequest:
  15842. HTTP Method = POST
  15843. Request URI = /api/platform-account/bind
  15844. Parameters = {}
  15845. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.DwLxUCP1WIogZR390EgMTUPXzDT6wQ4GxS04PI4ogkCShZyeG3QIHg4TjSz2Ic6_sWcMz7USNVwKgaI1zIGofw", Content-Length:"111"]
  15846. Body = {"platformCode":"yaoshibang","platformName":"药师帮","account":"13800138000","password":"test_password_123"}
  15847. Session Attrs = {}
  15848. Handler:
  15849. Type = com.xuekairui.user.controller.PlatformAccountController
  15850. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  15851. Async:
  15852. Async started = false
  15853. Async result = null
  15854. Resolved Exception:
  15855. Type = null
  15856. ModelAndView:
  15857. View name = null
  15858. View = null
  15859. Model = null
  15860. FlashMap:
  15861. Attributes = null
  15862. MockHttpServletResponse:
  15863. Status = 200
  15864. Error message = null
  15865. Headers = [X-Request-Id:"wgE6Rqh7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15866. Content type = application/json
  15867. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698689}
  15868. Forwarded URL = null
  15869. Redirected URL = null
  15870. Cookies = []
  15871. 15:18:18.690 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 绑定药师帮账号成功
  15872. 15:18:18.693 DEBUG [dZ7XuQBs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  15873. 15:18:18.696 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  15874. 15:18:18.697 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  15875. 15:18:18.698 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  15876. 15:18:18.699 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  15877. 15:18:18.699 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.699420400(LocalDateTime), 127.0.0.1(String), 1(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  15878. 15:18:18.702 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  15879. 15:18:18.703 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  15880. 15:18:18.703 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.699420400(LocalDateTime), 127.0.0.1(String), 2(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  15881. 15:18:18.705 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  15882. 15:18:18.705 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15883. 15:18:18.706 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15884. 15:18:18.707 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15885. 15:18:18.707 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  15886. 15:18:18.707 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  15887. 15:18:18.708 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  15888. 15:18:18.709 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  15889. 15:18:18.709 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  15890. 15:18:18.711 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  15891. 15:18:18.711 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15892. 15:18:18.712 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609710956546(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.711581200(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.711581200(LocalDateTime)
  15893. 15:18:18.714 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  15894. 15:18:18.714 DEBUG [dZ7XuQBs] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  15895. 15:18:18.719 DEBUG [dZ7XuQBs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 26ms
  15896. MockHttpServletRequest:
  15897. HTTP Method = POST
  15898. Request URI = /api/auth/sms/login
  15899. Parameters = {}
  15900. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  15901. Body = {"phone":"13800138000","code":"123456"}
  15902. Session Attrs = {}
  15903. Handler:
  15904. Type = com.xuekairui.user.controller.AuthController
  15905. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  15906. Async:
  15907. Async started = false
  15908. Async result = null
  15909. Resolved Exception:
  15910. Type = null
  15911. ModelAndView:
  15912. View name = null
  15913. View = null
  15914. Model = null
  15915. FlashMap:
  15916. Attributes = null
  15917. MockHttpServletResponse:
  15918. Status = 200
  15919. Error message = null
  15920. Headers = [X-Request-Id:"dZ7XuQBs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15921. Content type = application/json
  15922. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.bNN1LMyocxH1F2r3e0hEq-8lkXhPTNRnNk7HGKZZUZBO1x1FWZlOn4kFi4HomYvuv6mBmG0yXxX7G4gHM-CPeg","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698718}
  15923. Forwarded URL = null
  15924. Redirected URL = null
  15925. Cookies = []
  15926. 15:18:18.719 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  15927. 15:18:18.720 DEBUG [eKKTWZtb] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  15928. 15:18:18.723 DEBUG [eKKTWZtb] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  15929. 15:18:18.723 DEBUG [eKKTWZtb] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
  15930. 15:18:18.724 DEBUG [eKKTWZtb] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  15931. 15:18:18.725 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15932. 15:18:18.726 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580609778065409(Long), 1(Long), yaobangmang(String), 药帮忙(String), W5i1KGnIoNTqUu/icmspS7Xo45EnvfLSUzIDw/LlTYpOKLQ5HN/G(String), qfShZ0DvC/AhrMANC03BDbOqZ32FbTCRVQTBjX7ajT85NU+Ef98yhkf0QsUv(String), true(Boolean), PENDING(String), 2026-07-02T15:18:18.725526900(LocalDateTime), 2026-07-02T15:18:18.725526900(LocalDateTime)
  15933. 15:18:18.728 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
  15934. 15:18:18.728 INFO [eKKTWZtb] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaobangmang
  15935. 15:18:18.733 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15936. 15:18:18.733 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609840979970(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.732543100(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.733067200(LocalDateTime)
  15937. 15:18:18.737 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  15938. 15:18:18.737 DEBUG [eKKTWZtb] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
  15939. 15:18:18.737 DEBUG [eKKTWZtb] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 17ms
  15940. MockHttpServletRequest:
  15941. HTTP Method = POST
  15942. Request URI = /api/platform-account/bind
  15943. Parameters = {}
  15944. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.bNN1LMyocxH1F2r3e0hEq-8lkXhPTNRnNk7HGKZZUZBO1x1FWZlOn4kFi4HomYvuv6mBmG0yXxX7G4gHM-CPeg", Content-Length:"112"]
  15945. Body = {"platformCode":"yaobangmang","platformName":"药帮忙","account":"13900139000","password":"test_password_456"}
  15946. Session Attrs = {}
  15947. Handler:
  15948. Type = com.xuekairui.user.controller.PlatformAccountController
  15949. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  15950. Async:
  15951. Async started = false
  15952. Async result = null
  15953. Resolved Exception:
  15954. Type = null
  15955. ModelAndView:
  15956. View name = null
  15957. View = null
  15958. Model = null
  15959. FlashMap:
  15960. Attributes = null
  15961. MockHttpServletResponse:
  15962. Status = 200
  15963. Error message = null
  15964. Headers = [X-Request-Id:"eKKTWZtb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  15965. Content type = application/json
  15966. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698737}
  15967. Forwarded URL = null
  15968. Redirected URL = null
  15969. Cookies = []
  15970. 15:18:18.738 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 绑定药帮忙账号成功
  15971. 15:18:18.741 DEBUG [UJrtVWxg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  15972. 15:18:18.743 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  15973. 15:18:18.743 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  15974. 15:18:18.744 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  15975. 15:18:18.745 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  15976. 15:18:18.745 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.744899400(LocalDateTime), 127.0.0.1(String), 2(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  15977. 15:18:18.747 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  15978. 15:18:18.748 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  15979. 15:18:18.748 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.744899400(LocalDateTime), 127.0.0.1(String), 3(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  15980. 15:18:18.751 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  15981. 15:18:18.751 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  15982. 15:18:18.751 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  15983. 15:18:18.752 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  15984. 15:18:18.752 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  15985. 15:18:18.752 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  15986. 15:18:18.753 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  15987. 15:18:18.753 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  15988. 15:18:18.753 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  15989. 15:18:18.754 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  15990. 15:18:18.755 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  15991. 15:18:18.755 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609908088833(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.754949300(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.755516900(LocalDateTime)
  15992. 15:18:18.757 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  15993. 15:18:18.757 DEBUG [UJrtVWxg] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  15994. 15:18:18.761 DEBUG [UJrtVWxg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 20ms
  15995. MockHttpServletRequest:
  15996. HTTP Method = POST
  15997. Request URI = /api/auth/sms/login
  15998. Parameters = {}
  15999. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  16000. Body = {"phone":"13800138000","code":"123456"}
  16001. Session Attrs = {}
  16002. Handler:
  16003. Type = com.xuekairui.user.controller.AuthController
  16004. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  16005. Async:
  16006. Async started = false
  16007. Async result = null
  16008. Resolved Exception:
  16009. Type = null
  16010. ModelAndView:
  16011. View name = null
  16012. View = null
  16013. Model = null
  16014. FlashMap:
  16015. Attributes = null
  16016. MockHttpServletResponse:
  16017. Status = 200
  16018. Error message = null
  16019. Headers = [X-Request-Id:"UJrtVWxg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16020. Content type = application/json
  16021. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KXxF-QJWZK9ODQu0tjI80EEwYBFdSxVaW6a1GRMZxheEP__hOeJIHArTx5NVsvg_YpNwfkckhuaWl06Lu7lvdw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698761}
  16022. Forwarded URL = null
  16023. Redirected URL = null
  16024. Cookies = []
  16025. 15:18:18.762 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  16026. 15:18:18.762 DEBUG [ybGBKDTr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
  16027. 15:18:18.763 DEBUG [ybGBKDTr] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
  16028. 15:18:18.763 DEBUG [ybGBKDTr] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
  16029. 15:18:18.765 DEBUG [ybGBKDTr] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 2
  16030. 15:18:18.766 DEBUG [ybGBKDTr] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 4ms
  16031. MockHttpServletRequest:
  16032. HTTP Method = GET
  16033. Request URI = /api/platform-account/list
  16034. Parameters = {}
  16035. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KXxF-QJWZK9ODQu0tjI80EEwYBFdSxVaW6a1GRMZxheEP__hOeJIHArTx5NVsvg_YpNwfkckhuaWl06Lu7lvdw"]
  16036. Body = null
  16037. Session Attrs = {}
  16038. Handler:
  16039. Type = com.xuekairui.user.controller.PlatformAccountController
  16040. Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
  16041. Async:
  16042. Async started = false
  16043. Async result = null
  16044. Resolved Exception:
  16045. Type = null
  16046. ModelAndView:
  16047. View name = null
  16048. View = null
  16049. Model = null
  16050. FlashMap:
  16051. Attributes = null
  16052. MockHttpServletResponse:
  16053. Status = 200
  16054. Error message = null
  16055. Headers = [X-Request-Id:"ybGBKDTr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16056. Content type = application/json
  16057. Body = {"code":200,"message":"操作成功","data":[{"id":2072580609778065409,"platformCode":"yaobangmang","platformName":"药帮忙","account":"139****9000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:18:19"},{"id":2072580609580933121,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:18:19"}],"timestamp":1782976698766}
  16058. Forwarded URL = null
  16059. Redirected URL = null
  16060. Cookies = []
  16061. 15:18:18.767 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 查询已绑定平台列表成功
  16062. 15:18:18.770 DEBUG [9UX3t5ML] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  16063. 15:18:18.773 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  16064. 15:18:18.773 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  16065. 15:18:18.774 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  16066. 15:18:18.775 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16067. 15:18:18.775 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.775316100(LocalDateTime), 127.0.0.1(String), 3(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16068. 15:18:18.778 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16069. 15:18:18.779 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16070. 15:18:18.779 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.775316100(LocalDateTime), 127.0.0.1(String), 4(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16071. 15:18:18.782 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16072. 15:18:18.782 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  16073. 15:18:18.782 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  16074. 15:18:18.784 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  16075. 15:18:18.784 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  16076. 15:18:18.784 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  16077. 15:18:18.786 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  16078. 15:18:18.787 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  16079. 15:18:18.787 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  16080. 15:18:18.788 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  16081. 15:18:18.789 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16082. 15:18:18.789 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610033917953(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.788622300(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.789196100(LocalDateTime)
  16083. 15:18:18.791 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16084. 15:18:18.791 DEBUG [9UX3t5ML] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  16085. 15:18:18.796 DEBUG [9UX3t5ML] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 26ms
  16086. MockHttpServletRequest:
  16087. HTTP Method = POST
  16088. Request URI = /api/auth/sms/login
  16089. Parameters = {}
  16090. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  16091. Body = {"phone":"13800138000","code":"123456"}
  16092. Session Attrs = {}
  16093. Handler:
  16094. Type = com.xuekairui.user.controller.AuthController
  16095. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  16096. Async:
  16097. Async started = false
  16098. Async result = null
  16099. Resolved Exception:
  16100. Type = null
  16101. ModelAndView:
  16102. View name = null
  16103. View = null
  16104. Model = null
  16105. FlashMap:
  16106. Attributes = null
  16107. MockHttpServletResponse:
  16108. Status = 200
  16109. Error message = null
  16110. Headers = [X-Request-Id:"9UX3t5ML", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16111. Content type = application/json
  16112. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.xM1I0C2HL9PhlFQcD0wBJEvrghajoFjIdQUqIJLb-05YiF9zavw4Eq4nXHM3QR3F3lmRMj5aiwGeNea_B0--gQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698795}
  16113. Forwarded URL = null
  16114. Redirected URL = null
  16115. Cookies = []
  16116. 15:18:18.796 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  16117. 15:18:18.797 DEBUG [YqNEnEZs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang | IP: 127.0.0.1
  16118. 15:18:18.799 DEBUG [YqNEnEZs] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  16119. 15:18:18.799 DEBUG [YqNEnEZs] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
  16120. 15:18:18.800 DEBUG [YqNEnEZs] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
  16121. 15:18:18.801 INFO [YqNEnEZs] [1] [ main] c.x.u.s.PlatformAccountService : 模拟验证平台账号: platform=yaoshibang, account=13800138000
  16122. 15:18:18.801 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
  16123. 15:18:18.801 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), J2sm/7ZSTEqpVLqnb0gvOFtbl0szwzM7HQcFw5LUobJDO5xznMr1(String), 8OvI7mta/feZVi3l9erAmiyoGmhnhKliclHj5m4lXHhKKwRWC8KBbVCN3GuA(String), true(Boolean), 2026-07-02T15:18:18.801520200(LocalDateTime), SUCCESS(String), 2026-07-02T15:18:19(LocalDateTime), 2026-07-02T15:18:18.801520200(LocalDateTime), 2072580609580933121(Long)
  16124. 15:18:18.802 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
  16125. 15:18:18.808 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16126. 15:18:18.808 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610168135681(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.807318500(LocalDateTime), ACCOUNT(String), VERIFY(String), 验证B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.807863800(LocalDateTime)
  16127. 15:18:18.813 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16128. 15:18:18.813 DEBUG [YqNEnEZs] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 验证B2B平台账号
  16129. 15:18:18.813 DEBUG [YqNEnEZs] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang 200 16ms
  16130. MockHttpServletRequest:
  16131. HTTP Method = POST
  16132. Request URI = /api/platform-account/verify/yaoshibang
  16133. Parameters = {}
  16134. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.xM1I0C2HL9PhlFQcD0wBJEvrghajoFjIdQUqIJLb-05YiF9zavw4Eq4nXHM3QR3F3lmRMj5aiwGeNea_B0--gQ"]
  16135. Body = null
  16136. Session Attrs = {}
  16137. Handler:
  16138. Type = com.xuekairui.user.controller.PlatformAccountController
  16139. Method = com.xuekairui.user.controller.PlatformAccountController#verifyAccount(String, Authentication)
  16140. Async:
  16141. Async started = false
  16142. Async result = null
  16143. Resolved Exception:
  16144. Type = null
  16145. ModelAndView:
  16146. View name = null
  16147. View = null
  16148. Model = null
  16149. FlashMap:
  16150. Attributes = null
  16151. MockHttpServletResponse:
  16152. Status = 200
  16153. Error message = null
  16154. Headers = [X-Request-Id:"YqNEnEZs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16155. Content type = application/json
  16156. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698813}
  16157. Forwarded URL = null
  16158. Redirected URL = null
  16159. Cookies = []
  16160. 15:18:18.814 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 验证药师帮账号成功
  16161. 15:18:18.816 DEBUG [eT8bfwNn] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  16162. 15:18:18.818 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  16163. 15:18:18.818 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  16164. 15:18:18.820 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  16165. 15:18:18.821 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16166. 15:18:18.821 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.820569300(LocalDateTime), 127.0.0.1(String), 4(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16167. 15:18:18.822 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16168. 15:18:18.823 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16169. 15:18:18.823 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.820569300(LocalDateTime), 127.0.0.1(String), 5(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16170. 15:18:18.825 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16171. 15:18:18.825 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  16172. 15:18:18.825 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  16173. 15:18:18.826 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  16174. 15:18:18.826 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  16175. 15:18:18.826 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  16176. 15:18:18.827 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  16177. 15:18:18.827 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  16178. 15:18:18.827 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  16179. 15:18:18.829 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  16180. 15:18:18.829 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16181. 15:18:18.829 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610231050242(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.829042500(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.829569300(LocalDateTime)
  16182. 15:18:18.831 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16183. 15:18:18.831 DEBUG [eT8bfwNn] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  16184. 15:18:18.836 DEBUG [eT8bfwNn] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 20ms
  16185. MockHttpServletRequest:
  16186. HTTP Method = POST
  16187. Request URI = /api/auth/sms/login
  16188. Parameters = {}
  16189. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  16190. Body = {"phone":"13800138000","code":"123456"}
  16191. Session Attrs = {}
  16192. Handler:
  16193. Type = com.xuekairui.user.controller.AuthController
  16194. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  16195. Async:
  16196. Async started = false
  16197. Async result = null
  16198. Resolved Exception:
  16199. Type = null
  16200. ModelAndView:
  16201. View name = null
  16202. View = null
  16203. Model = null
  16204. FlashMap:
  16205. Attributes = null
  16206. MockHttpServletResponse:
  16207. Status = 200
  16208. Error message = null
  16209. Headers = [X-Request-Id:"eT8bfwNn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16210. Content type = application/json
  16211. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.UE-x2-S3wlUv2swkDidbQ-u0YL1uNEOR7tjmBMnGqKNbGguY9tf93v5b1-yWhDAqi8PG3lWFLnzNbx97H7ZXOg","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698835}
  16212. Forwarded URL = null
  16213. Redirected URL = null
  16214. Cookies = []
  16215. 15:18:18.836 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  16216. 15:18:18.838 DEBUG [Jdt4Yhu7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  16217. 15:18:18.840 DEBUG [Jdt4Yhu7] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  16218. 15:18:18.840 DEBUG [Jdt4Yhu7] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
  16219. 15:18:18.841 DEBUG [Jdt4Yhu7] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
  16220. 15:18:18.842 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
  16221. 15:18:18.842 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), eTLZ7BtpQL4iRytYjd1isaCnWC0AgU+gBaIPOM+fTQru3S3O4dxV(String), O4+Vpgl6MXtWHXdN3NMWfe3SXk+l3irnsh/4A9yhfW20tAAQUKapMsvtK/k=(String), true(Boolean), 2026-07-02T15:18:19(LocalDateTime), PENDING(String), 2026-07-02T15:18:19(LocalDateTime), 2026-07-02T15:18:18.842388900(LocalDateTime), 2072580609580933121(Long)
  16222. 15:18:18.844 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
  16223. 15:18:18.844 INFO [Jdt4Yhu7] [1] [ main] c.x.u.s.PlatformAccountService : 更新平台账号绑定: userId=1, platform=yaoshibang
  16224. 15:18:18.849 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16225. 15:18:18.849 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610293964802(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.849125400(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.849125400(LocalDateTime)
  16226. 15:18:18.853 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16227. 15:18:18.853 DEBUG [Jdt4Yhu7] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
  16228. 15:18:18.854 DEBUG [Jdt4Yhu7] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 16ms
  16229. MockHttpServletRequest:
  16230. HTTP Method = POST
  16231. Request URI = /api/platform-account/bind
  16232. Parameters = {}
  16233. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.UE-x2-S3wlUv2swkDidbQ-u0YL1uNEOR7tjmBMnGqKNbGguY9tf93v5b1-yWhDAqi8PG3lWFLnzNbx97H7ZXOg", Content-Length:"110"]
  16234. Body = {"platformCode":"yaoshibang","platformName":"药师帮","account":"13800138000","password":"new_password_789"}
  16235. Session Attrs = {}
  16236. Handler:
  16237. Type = com.xuekairui.user.controller.PlatformAccountController
  16238. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  16239. Async:
  16240. Async started = false
  16241. Async result = null
  16242. Resolved Exception:
  16243. Type = null
  16244. ModelAndView:
  16245. View name = null
  16246. View = null
  16247. Model = null
  16248. FlashMap:
  16249. Attributes = null
  16250. MockHttpServletResponse:
  16251. Status = 200
  16252. Error message = null
  16253. Headers = [X-Request-Id:"Jdt4Yhu7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16254. Content type = application/json
  16255. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698853}
  16256. Forwarded URL = null
  16257. Redirected URL = null
  16258. Cookies = []
  16259. 15:18:18.854 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 更新药师帮账号成功
  16260. 15:18:18.856 DEBUG [u8JLQDX9] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  16261. 15:18:18.859 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  16262. 15:18:18.859 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  16263. 15:18:18.861 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  16264. 15:18:18.861 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16265. 15:18:18.861 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.861310300(LocalDateTime), 127.0.0.1(String), 5(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16266. 15:18:18.863 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16267. 15:18:18.864 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16268. 15:18:18.864 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.861310300(LocalDateTime), 127.0.0.1(String), 6(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16269. 15:18:18.867 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16270. 15:18:18.867 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  16271. 15:18:18.867 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  16272. 15:18:18.868 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  16273. 15:18:18.868 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  16274. 15:18:18.868 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  16275. 15:18:18.869 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  16276. 15:18:18.870 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  16277. 15:18:18.870 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  16278. 15:18:18.871 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  16279. 15:18:18.871 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16280. 15:18:18.872 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610423988226(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.871940900(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.871940900(LocalDateTime)
  16281. 15:18:18.874 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16282. 15:18:18.874 DEBUG [u8JLQDX9] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  16283. 15:18:18.879 DEBUG [u8JLQDX9] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 23ms
  16284. MockHttpServletRequest:
  16285. HTTP Method = POST
  16286. Request URI = /api/auth/sms/login
  16287. Parameters = {}
  16288. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  16289. Body = {"phone":"13800138000","code":"123456"}
  16290. Session Attrs = {}
  16291. Handler:
  16292. Type = com.xuekairui.user.controller.AuthController
  16293. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  16294. Async:
  16295. Async started = false
  16296. Async result = null
  16297. Resolved Exception:
  16298. Type = null
  16299. ModelAndView:
  16300. View name = null
  16301. View = null
  16302. Model = null
  16303. FlashMap:
  16304. Attributes = null
  16305. MockHttpServletResponse:
  16306. Status = 200
  16307. Error message = null
  16308. Headers = [X-Request-Id:"u8JLQDX9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16309. Content type = application/json
  16310. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KmK1NZ58AepoGq6DaQpIjI9ok983TgnnOtGRFz04U3UATRT4fyggqaAK4Q_7f_uja1_l1Xd-Uso0aoihxp9AXw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698878}
  16311. Forwarded URL = null
  16312. Redirected URL = null
  16313. Cookies = []
  16314. 15:18:18.879 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  16315. 15:18:18.880 DEBUG [r5Kmvttv] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaobangmang | IP: 127.0.0.1
  16316. 15:18:18.882 DEBUG [r5Kmvttv] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  16317. 15:18:18.882 DEBUG [r5Kmvttv] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
  16318. 15:18:18.884 DEBUG [r5Kmvttv] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
  16319. 15:18:18.884 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, verify_status=?, create_time=?, update_time=? WHERE id=?
  16320. 15:18:18.884 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaobangmang(String), 药帮忙(String), W5i1KGnIoNTqUu/icmspS7Xo45EnvfLSUzIDw/LlTYpOKLQ5HN/G(String), qfShZ0DvC/AhrMANC03BDbOqZ32FbTCRVQTBjX7ajT85NU+Ef98yhkf0QsUv(String), false(Boolean), PENDING(String), 2026-07-02T15:18:19(LocalDateTime), 2026-07-02T15:18:18.884322700(LocalDateTime), 2072580609778065409(Long)
  16321. 15:18:18.886 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
  16322. 15:18:18.886 INFO [r5Kmvttv] [1] [ main] c.x.u.s.PlatformAccountService : 解绑平台账号: userId=1, platform=yaobangmang
  16323. 15:18:18.891 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16324. 15:18:18.891 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610491097089(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.891117800(LocalDateTime), ACCOUNT(String), UNBIND(String), 解绑B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.891117800(LocalDateTime)
  16325. 15:18:18.896 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16326. 15:18:18.896 DEBUG [r5Kmvttv] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 解绑B2B平台账号
  16327. 15:18:18.897 DEBUG [r5Kmvttv] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaobangmang 200 17ms
  16328. MockHttpServletRequest:
  16329. HTTP Method = DELETE
  16330. Request URI = /api/platform-account/unbind/yaobangmang
  16331. Parameters = {}
  16332. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KmK1NZ58AepoGq6DaQpIjI9ok983TgnnOtGRFz04U3UATRT4fyggqaAK4Q_7f_uja1_l1Xd-Uso0aoihxp9AXw"]
  16333. Body = null
  16334. Session Attrs = {}
  16335. Handler:
  16336. Type = com.xuekairui.user.controller.PlatformAccountController
  16337. Method = com.xuekairui.user.controller.PlatformAccountController#unbindAccount(String, Authentication)
  16338. Async:
  16339. Async started = false
  16340. Async result = null
  16341. Resolved Exception:
  16342. Type = null
  16343. ModelAndView:
  16344. View name = null
  16345. View = null
  16346. Model = null
  16347. FlashMap:
  16348. Attributes = null
  16349. MockHttpServletResponse:
  16350. Status = 200
  16351. Error message = null
  16352. Headers = [X-Request-Id:"r5Kmvttv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16353. Content type = application/json
  16354. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698896}
  16355. Forwarded URL = null
  16356. Redirected URL = null
  16357. Cookies = []
  16358. 15:18:18.897 DEBUG [kY3LaxFj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
  16359. 15:18:18.898 DEBUG [kY3LaxFj] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
  16360. 15:18:18.898 DEBUG [kY3LaxFj] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
  16361. 15:18:18.901 DEBUG [kY3LaxFj] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 1
  16362. 15:18:18.901 DEBUG [kY3LaxFj] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 4ms
  16363. MockHttpServletRequest:
  16364. HTTP Method = GET
  16365. Request URI = /api/platform-account/list
  16366. Parameters = {}
  16367. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KmK1NZ58AepoGq6DaQpIjI9ok983TgnnOtGRFz04U3UATRT4fyggqaAK4Q_7f_uja1_l1Xd-Uso0aoihxp9AXw"]
  16368. Body = null
  16369. Session Attrs = {}
  16370. Handler:
  16371. Type = com.xuekairui.user.controller.PlatformAccountController
  16372. Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
  16373. Async:
  16374. Async started = false
  16375. Async result = null
  16376. Resolved Exception:
  16377. Type = null
  16378. ModelAndView:
  16379. View name = null
  16380. View = null
  16381. Model = null
  16382. FlashMap:
  16383. Attributes = null
  16384. MockHttpServletResponse:
  16385. Status = 200
  16386. Error message = null
  16387. Headers = [X-Request-Id:"kY3LaxFj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16388. Content type = application/json
  16389. Body = {"code":200,"message":"操作成功","data":[{"id":2072580609580933121,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":"2026-07-02 15:18:19","failReason":null,"createTime":"2026-07-02 15:18:19"}],"timestamp":1782976698901}
  16390. Forwarded URL = null
  16391. Redirected URL = null
  16392. Cookies = []
  16393. 15:18:18.901 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 解绑药帮忙账号成功
  16394. 15:18:18.904 DEBUG [jHXHRgYF] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  16395. 15:18:18.908 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  16396. 15:18:18.908 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  16397. 15:18:18.909 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  16398. 15:18:18.909 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16399. 15:18:18.909 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.909646800(LocalDateTime), 127.0.0.1(String), 6(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16400. 15:18:18.912 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16401. 15:18:18.913 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16402. 15:18:18.913 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.909646800(LocalDateTime), 127.0.0.1(String), 7(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16403. 15:18:18.915 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16404. 15:18:18.916 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  16405. 15:18:18.916 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  16406. 15:18:18.917 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  16407. 15:18:18.917 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  16408. 15:18:18.917 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  16409. 15:18:18.918 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  16410. 15:18:18.919 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  16411. 15:18:18.919 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  16412. 15:18:18.920 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  16413. 15:18:18.920 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16414. 15:18:18.921 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610616926209(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.920808800(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.920808800(LocalDateTime)
  16415. 15:18:18.923 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16416. 15:18:18.923 DEBUG [jHXHRgYF] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  16417. 15:18:18.928 DEBUG [jHXHRgYF] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 24ms
  16418. MockHttpServletRequest:
  16419. HTTP Method = POST
  16420. Request URI = /api/auth/sms/login
  16421. Parameters = {}
  16422. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  16423. Body = {"phone":"13800138000","code":"123456"}
  16424. Session Attrs = {}
  16425. Handler:
  16426. Type = com.xuekairui.user.controller.AuthController
  16427. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  16428. Async:
  16429. Async started = false
  16430. Async result = null
  16431. Resolved Exception:
  16432. Type = null
  16433. ModelAndView:
  16434. View name = null
  16435. View = null
  16436. Model = null
  16437. FlashMap:
  16438. Attributes = null
  16439. MockHttpServletResponse:
  16440. Status = 200
  16441. Error message = null
  16442. Headers = [X-Request-Id:"jHXHRgYF", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16443. Content type = application/json
  16444. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.istz5LEYsFTQufiGJvqqDC0G5Z3nO9S-JcT_h4he_J8gH3UYV0qPG1T_zzrYcqgt9BJRHKJvuNMW7UEt5XiubQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698927}
  16445. Forwarded URL = null
  16446. Redirected URL = null
  16447. Cookies = []
  16448. 15:18:18.928 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  16449. 15:18:18.929 DEBUG [hzYm5FUP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
  16450. 15:18:18.932 DEBUG [hzYm5FUP] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  16451. 15:18:18.932 DEBUG [hzYm5FUP] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), unsupported_platform(String)
  16452. 15:18:18.933 DEBUG [hzYm5FUP] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  16453. 15:18:18.934 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16454. 15:18:18.934 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580610679840769(Long), 1(Long), unsupported_platform(String), 不支持的平台(String), YJpj1qk8KnJ3j/yvfvf1bgxlC8HLutOnlPKUNl39MEMaySZq6YsN(String), 2TqsoAnOasdeXWnh9SFdlxPP7bcRZ4X8K61edFBGmE93OjJP(String), true(Boolean), PENDING(String), 2026-07-02T15:18:18.934097600(LocalDateTime), 2026-07-02T15:18:18.934097600(LocalDateTime)
  16455. 15:18:18.936 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
  16456. 15:18:18.936 INFO [hzYm5FUP] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=unsupported_platform
  16457. 15:18:18.941 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16458. 15:18:18.941 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610679840770(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.940934600(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:unsupported_platform(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.941462800(LocalDateTime)
  16459. 15:18:18.946 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16460. 15:18:18.946 DEBUG [hzYm5FUP] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
  16461. 15:18:18.946 DEBUG [hzYm5FUP] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 17ms
  16462. MockHttpServletRequest:
  16463. HTTP Method = POST
  16464. Request URI = /api/platform-account/bind
  16465. Parameters = {}
  16466. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.istz5LEYsFTQufiGJvqqDC0G5Z3nO9S-JcT_h4he_J8gH3UYV0qPG1T_zzrYcqgt9BJRHKJvuNMW7UEt5XiubQ", Content-Length:"121"]
  16467. Body = {"platformCode":"unsupported_platform","platformName":"不支持的平台","account":"13800138000","password":"password"}
  16468. Session Attrs = {}
  16469. Handler:
  16470. Type = com.xuekairui.user.controller.PlatformAccountController
  16471. Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
  16472. Async:
  16473. Async started = false
  16474. Async result = null
  16475. Resolved Exception:
  16476. Type = null
  16477. ModelAndView:
  16478. View name = null
  16479. View = null
  16480. Model = null
  16481. FlashMap:
  16482. Attributes = null
  16483. MockHttpServletResponse:
  16484. Status = 200
  16485. Error message = null
  16486. Headers = [X-Request-Id:"hzYm5FUP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16487. Content type = application/json
  16488. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698946}
  16489. Forwarded URL = null
  16490. Redirected URL = null
  16491. Cookies = []
  16492. 15:18:18.947 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 不支持的平台拦截正确
  16493. 15:18:18.949 DEBUG [5Nvu4Vkj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  16494. 15:18:18.953 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  16495. 15:18:18.953 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  16496. 15:18:18.955 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  16497. 15:18:18.955 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16498. 15:18:18.955 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.955185600(LocalDateTime), 127.0.0.1(String), 7(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16499. 15:18:18.958 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16500. 15:18:18.958 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16501. 15:18:18.959 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.955185600(LocalDateTime), 127.0.0.1(String), 8(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16502. 15:18:18.962 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16503. 15:18:18.962 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  16504. 15:18:18.962 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  16505. 15:18:18.963 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  16506. 15:18:18.963 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  16507. 15:18:18.963 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  16508. 15:18:18.965 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  16509. 15:18:18.966 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  16510. 15:18:18.966 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  16511. 15:18:18.967 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  16512. 15:18:18.967 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16513. 15:18:18.967 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610805669890(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.967578700(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.967578700(LocalDateTime)
  16514. 15:18:18.969 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16515. 15:18:18.969 DEBUG [5Nvu4Vkj] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  16516. 15:18:18.973 DEBUG [5Nvu4Vkj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 24ms
  16517. MockHttpServletRequest:
  16518. HTTP Method = POST
  16519. Request URI = /api/auth/sms/login
  16520. Parameters = {}
  16521. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  16522. Body = {"phone":"13800138000","code":"123456"}
  16523. Session Attrs = {}
  16524. Handler:
  16525. Type = com.xuekairui.user.controller.AuthController
  16526. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  16527. Async:
  16528. Async started = false
  16529. Async result = null
  16530. Resolved Exception:
  16531. Type = null
  16532. ModelAndView:
  16533. View name = null
  16534. View = null
  16535. Model = null
  16536. FlashMap:
  16537. Attributes = null
  16538. MockHttpServletResponse:
  16539. Status = 200
  16540. Error message = null
  16541. Headers = [X-Request-Id:"5Nvu4Vkj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16542. Content type = application/json
  16543. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.QJv_fCsES6RTbK5dhapWrF51cctfE_YkJM6suH99PoD0TKzyrby1B7X3I7DmfMaGG8RC9Lag1ZpHFyHQAn68QQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698973}
  16544. Forwarded URL = null
  16545. Redirected URL = null
  16546. Cookies = []
  16547. 15:18:18.974 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  16548. 15:18:18.974 DEBUG [ryyFs8WZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yiyaocheng | IP: 127.0.0.1
  16549. 15:18:18.977 DEBUG [ryyFs8WZ] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  16550. 15:18:18.977 DEBUG [ryyFs8WZ] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yiyaocheng(String)
  16551. 15:18:18.978 DEBUG [ryyFs8WZ] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  16552. 15:18:18.982 WARN [ryyFs8WZ] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=400, message=未找到该平台的绑定记录
  16553. 15:18:18.982 DEBUG [ryyFs8WZ] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yiyaocheng 200 8ms
  16554. MockHttpServletRequest:
  16555. HTTP Method = POST
  16556. Request URI = /api/platform-account/verify/yiyaocheng
  16557. Parameters = {}
  16558. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.QJv_fCsES6RTbK5dhapWrF51cctfE_YkJM6suH99PoD0TKzyrby1B7X3I7DmfMaGG8RC9Lag1ZpHFyHQAn68QQ"]
  16559. Body = null
  16560. Session Attrs = {}
  16561. Handler:
  16562. Type = com.xuekairui.user.controller.PlatformAccountController
  16563. Method = com.xuekairui.user.controller.PlatformAccountController#verifyAccount(String, Authentication)
  16564. Async:
  16565. Async started = false
  16566. Async result = null
  16567. Resolved Exception:
  16568. Type = com.xuekairui.common.BusinessException
  16569. ModelAndView:
  16570. View name = null
  16571. View = null
  16572. Model = null
  16573. FlashMap:
  16574. Attributes = null
  16575. MockHttpServletResponse:
  16576. Status = 200
  16577. Error message = null
  16578. Headers = [X-Request-Id:"ryyFs8WZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16579. Content type = application/json
  16580. Body = {"code":400,"message":"未找到该平台的绑定记录","data":null,"timestamp":1782976698982}
  16581. Forwarded URL = null
  16582. Redirected URL = null
  16583. Cookies = []
  16584. 15:18:18.983 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 未绑定平台验证返回业务错误
  16585. 15:18:18.985 DEBUG [UFmngGya] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  16586. 15:18:18.989 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  16587. 15:18:18.989 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  16588. 15:18:18.990 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  16589. 15:18:18.991 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16590. 15:18:18.991 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.990807100(LocalDateTime), 127.0.0.1(String), 8(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16591. 15:18:18.993 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16592. 15:18:18.994 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16593. 15:18:18.994 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.990807100(LocalDateTime), 127.0.0.1(String), 9(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16594. 15:18:18.996 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16595. 15:18:18.996 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  16596. 15:18:18.996 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  16597. 15:18:18.998 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  16598. 15:18:18.998 DEBUG [UFmngGya] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  16599. 15:18:18.998 DEBUG [UFmngGya] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  16600. 15:18:18.999 DEBUG [UFmngGya] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  16601. 15:18:18.999 DEBUG [UFmngGya] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  16602. 15:18:18.999 DEBUG [UFmngGya] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  16603. 15:18:19.001 DEBUG [UFmngGya] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  16604. 15:18:19.001 DEBUG [UFmngGya] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16605. 15:18:19.001 DEBUG [UFmngGya] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610935693314(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:19.001294700(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:19.001827200(LocalDateTime)
  16606. 15:18:19.003 DEBUG [UFmngGya] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16607. 15:18:19.003 DEBUG [UFmngGya] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  16608. 15:18:19.008 DEBUG [UFmngGya] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 23ms
  16609. MockHttpServletRequest:
  16610. HTTP Method = POST
  16611. Request URI = /api/auth/sms/login
  16612. Parameters = {}
  16613. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  16614. Body = {"phone":"13800138000","code":"123456"}
  16615. Session Attrs = {}
  16616. Handler:
  16617. Type = com.xuekairui.user.controller.AuthController
  16618. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  16619. Async:
  16620. Async started = false
  16621. Async result = null
  16622. Resolved Exception:
  16623. Type = null
  16624. ModelAndView:
  16625. View name = null
  16626. View = null
  16627. Model = null
  16628. FlashMap:
  16629. Attributes = null
  16630. MockHttpServletResponse:
  16631. Status = 200
  16632. Error message = null
  16633. Headers = [X-Request-Id:"UFmngGya", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16634. Content type = application/json
  16635. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.HuvvCZX3pAUCTJnN8puEB46Sg6mHFayJKTOx6LdrZwT4DZkgksmGn3tTKTFZQgw4hvY94AqZq7qhxisI3kSmnA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976699008}
  16636. Forwarded URL = null
  16637. Redirected URL = null
  16638. Cookies = []
  16639. 15:18:19.009 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  16640. 15:18:19.009 DEBUG [ysMB3RMd] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yiyaocheng | IP: 127.0.0.1
  16641. 15:18:19.011 DEBUG [ysMB3RMd] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
  16642. 15:18:19.011 DEBUG [ysMB3RMd] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yiyaocheng(String)
  16643. 15:18:19.012 DEBUG [ysMB3RMd] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
  16644. 15:18:19.014 WARN [ysMB3RMd] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=400, message=未找到该平台的绑定记录
  16645. 15:18:19.015 DEBUG [ysMB3RMd] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yiyaocheng 200 6ms
  16646. MockHttpServletRequest:
  16647. HTTP Method = DELETE
  16648. Request URI = /api/platform-account/unbind/yiyaocheng
  16649. Parameters = {}
  16650. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.HuvvCZX3pAUCTJnN8puEB46Sg6mHFayJKTOx6LdrZwT4DZkgksmGn3tTKTFZQgw4hvY94AqZq7qhxisI3kSmnA"]
  16651. Body = null
  16652. Session Attrs = {}
  16653. Handler:
  16654. Type = com.xuekairui.user.controller.PlatformAccountController
  16655. Method = com.xuekairui.user.controller.PlatformAccountController#unbindAccount(String, Authentication)
  16656. Async:
  16657. Async started = false
  16658. Async result = null
  16659. Resolved Exception:
  16660. Type = com.xuekairui.common.BusinessException
  16661. ModelAndView:
  16662. View name = null
  16663. View = null
  16664. Model = null
  16665. FlashMap:
  16666. Attributes = null
  16667. MockHttpServletResponse:
  16668. Status = 200
  16669. Error message = null
  16670. Headers = [X-Request-Id:"ysMB3RMd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16671. Content type = application/json
  16672. Body = {"code":400,"message":"未找到该平台的绑定记录","data":null,"timestamp":1782976699014}
  16673. Forwarded URL = null
  16674. Redirected URL = null
  16675. Cookies = []
  16676. 15:18:19.015 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 未绑定平台解绑拦截正确
  16677. 15:18:19.017 DEBUG [QTRb8JHd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  16678. 15:18:19.021 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  16679. 15:18:19.021 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  16680. 15:18:19.022 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  16681. 15:18:19.022 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16682. 15:18:19.023 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:19.022822700(LocalDateTime), 127.0.0.1(String), 9(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16683. 15:18:19.024 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16684. 15:18:19.025 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  16685. 15:18:19.026 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:19.022822700(LocalDateTime), 127.0.0.1(String), 10(Long), cd2f71e5af2806c30293121700ab911b13562980e6f8fafd637d0966100aed76(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
  16686. 15:18:19.027 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  16687. 15:18:19.028 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  16688. 15:18:19.028 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  16689. 15:18:19.029 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  16690. 15:18:19.029 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  16691. 15:18:19.029 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  16692. 15:18:19.030 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  16693. 15:18:19.030 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  16694. 15:18:19.031 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  16695. 15:18:19.031 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  16696. 15:18:19.032 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  16697. 15:18:19.032 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580611065716737(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:19.031979900(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:19.032775(LocalDateTime)
  16698. 15:18:19.034 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  16699. 15:18:19.034 DEBUG [QTRb8JHd] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  16700. 15:18:19.041 DEBUG [QTRb8JHd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 24ms
  16701. MockHttpServletRequest:
  16702. HTTP Method = POST
  16703. Request URI = /api/auth/sms/login
  16704. Parameters = {}
  16705. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  16706. Body = {"phone":"13800138000","code":"123456"}
  16707. Session Attrs = {}
  16708. Handler:
  16709. Type = com.xuekairui.user.controller.AuthController
  16710. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  16711. Async:
  16712. Async started = false
  16713. Async result = null
  16714. Resolved Exception:
  16715. Type = null
  16716. ModelAndView:
  16717. View name = null
  16718. View = null
  16719. Model = null
  16720. FlashMap:
  16721. Attributes = null
  16722. MockHttpServletResponse:
  16723. Status = 200
  16724. Error message = null
  16725. Headers = [X-Request-Id:"QTRb8JHd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16726. Content type = application/json
  16727. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MTAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTksImV4cCI6MTc4MzA2MzA5OX0.SiUJWJbdfidNKaVg1_0CyTMJFA1bRjZbVovLNGF4Qd_JTTLf-K1OCeL-dwfmTuL_Xs4lOKHiIuJe4vVw5H5U9w","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OSwiZXhwIjoxNzgzNTgxNDk5fQ.D1knOvZlE1Rat8TI9bg9v9K7__kxnb4CHVR0gdAS5YQ192dDEO2Dtj7iiLi02rMkXBSD4CKpNI_-5RRMlEC7yg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976699038}
  16728. Forwarded URL = null
  16729. Redirected URL = null
  16730. Cookies = []
  16731. 15:18:19.041 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
  16732. 15:18:19.041 DEBUG [AZepQ8sh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
  16733. 15:18:19.042 DEBUG [AZepQ8sh] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
  16734. 15:18:19.042 DEBUG [AZepQ8sh] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
  16735. 15:18:19.044 DEBUG [AZepQ8sh] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 2
  16736. 15:18:19.044 DEBUG [AZepQ8sh] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 3ms
  16737. MockHttpServletRequest:
  16738. HTTP Method = GET
  16739. Request URI = /api/platform-account/list
  16740. Parameters = {}
  16741. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MTAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTksImV4cCI6MTc4MzA2MzA5OX0.SiUJWJbdfidNKaVg1_0CyTMJFA1bRjZbVovLNGF4Qd_JTTLf-K1OCeL-dwfmTuL_Xs4lOKHiIuJe4vVw5H5U9w"]
  16742. Body = null
  16743. Session Attrs = {}
  16744. Handler:
  16745. Type = com.xuekairui.user.controller.PlatformAccountController
  16746. Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
  16747. Async:
  16748. Async started = false
  16749. Async result = null
  16750. Resolved Exception:
  16751. Type = null
  16752. ModelAndView:
  16753. View name = null
  16754. View = null
  16755. Model = null
  16756. FlashMap:
  16757. Attributes = null
  16758. MockHttpServletResponse:
  16759. Status = 200
  16760. Error message = null
  16761. Headers = [X-Request-Id:"AZepQ8sh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  16762. Content type = application/json
  16763. Body = {"code":200,"message":"操作成功","data":[{"id":2072580610679840769,"platformCode":"unsupported_platform","platformName":"不支持的平台","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:18:19"},{"id":2072580609580933121,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":"2026-07-02 15:18:19","failReason":null,"createTime":"2026-07-02 15:18:19"}],"timestamp":1782976699044}
  16764. Forwarded URL = null
  16765. Redirected URL = null
  16766. Cookies = []
  16767. 15:18:19.046 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 账号脱敏验证通过: 138****8000
  16768. [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.517 s -- in com.xuekairui.gateway.PlatformAccountBindingTest
  16769. [INFO] Running 安全访问控制测试
  16770. 15:18:19.049 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest]: SecurityAccessTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  16771. 15:18:19.050 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest
  16772. [INFO] Running HTTP 方法验证
  16773. 15:18:22.009 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation]: HttpMethodValidation does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  16774. 15:18:22.010 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation
  16775. 15:18:22.013 DEBUG [MEMwM3fn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/membership/levels | IP: 127.0.0.1
  16776. 15:18:22.015 ERROR [MEMwM3fn] [] [ main] c.x.h.GlobalExceptionHandler : 系统异常
  16777. org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' is not supported
  16778. at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)
  16779. at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)
  16780. at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)
  16781. at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)
  16782. at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)
  16783. at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:509)
  16784. at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1284)
  16785. at org.springframework.test.web.servlet.TestDispatcherServlet.getHandler(TestDispatcherServlet.java:123)
  16786. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)
  16787. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
  16788. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
  16789. at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:936)
  16790. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:596)
  16791. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
  16792. at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
  16793. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
  16794. at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
  16795. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  16796. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
  16797. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  16798. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  16799. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
  16800. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
  16801. at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
  16802. at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
  16803. at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
  16804. at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
  16805. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
  16806. at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
  16807. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16808. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16809. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16810. at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
  16811. at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
  16812. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16813. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16814. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16815. at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
  16816. at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
  16817. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16818. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16819. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16820. at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
  16821. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16822. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16823. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16824. at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
  16825. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16826. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16827. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16828. at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
  16829. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16830. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16831. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16832. at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
  16833. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16834. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16835. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16836. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16837. at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
  16838. at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
  16839. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16840. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16841. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16842. at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
  16843. at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
  16844. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16845. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16846. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16847. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16848. at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
  16849. at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
  16850. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16851. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16852. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16853. at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
  16854. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16855. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16856. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  16857. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16858. at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
  16859. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16860. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  16861. at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
  16862. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
  16863. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  16864. at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
  16865. at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
  16866. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  16867. at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
  16868. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  16869. at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
  16870. at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
  16871. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  16872. at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
  16873. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  16874. at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
  16875. at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
  16876. at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
  16877. at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
  16878. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  16879. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  16880. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
  16881. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16882. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  16883. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  16884. at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
  16885. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16886. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  16887. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  16888. at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
  16889. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16890. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  16891. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  16892. at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
  16893. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16894. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  16895. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  16896. at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
  16897. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16898. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  16899. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  16900. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
  16901. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  16902. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  16903. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  16904. at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
  16905. at com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation.levelList_deleteMethodShouldReturn405(SecurityAccessTest.java:406)
  16906. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  16907. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  16908. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  16909. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  16910. at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
  16911. at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
  16912. at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
  16913. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
  16914. at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
  16915. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
  16916. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
  16917. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
  16918. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
  16919. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
  16920. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
  16921. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
  16922. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
  16923. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
  16924. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
  16925. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
  16926. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  16927. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
  16928. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
  16929. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
  16930. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
  16931. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  16932. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  16933. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  16934. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  16935. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  16936. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  16937. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  16938. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  16939. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  16940. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  16941. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  16942. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  16943. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  16944. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  16945. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  16946. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  16947. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  16948. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  16949. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  16950. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  16951. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  16952. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  16953. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  16954. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  16955. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  16956. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  16957. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  16958. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  16959. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  16960. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  16961. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  16962. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  16963. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  16964. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  16965. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  16966. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  16967. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  16968. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
  16969. at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
  16970. at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
  16971. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
  16972. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
  16973. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
  16974. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
  16975. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
  16976. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
  16977. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
  16978. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
  16979. at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
  16980. at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
  16981. at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
  16982. at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
  16983. at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
  16984. at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
  16985. at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
  16986. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
  16987. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
  16988. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
  16989. at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
  16990. at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
  16991. at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
  16992. at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
  16993. 15:18:22.016 WARN [MEMwM3fn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/membership/levels 500 3ms
  16994. MockHttpServletRequest:
  16995. HTTP Method = DELETE
  16996. Request URI = /api/membership/levels
  16997. Parameters = {}
  16998. Headers = []
  16999. Body = null
  17000. Session Attrs = {}
  17001. Handler:
  17002. Type = null
  17003. Async:
  17004. Async started = false
  17005. Async result = null
  17006. Resolved Exception:
  17007. Type = org.springframework.web.HttpRequestMethodNotSupportedException
  17008. ModelAndView:
  17009. View name = null
  17010. View = null
  17011. Model = null
  17012. FlashMap:
  17013. Attributes = null
  17014. MockHttpServletResponse:
  17015. Status = 500
  17016. Error message = null
  17017. Headers = [X-Request-Id:"MEMwM3fn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17018. Content type = application/json
  17019. Body = {"code":500,"message":"系统繁忙,请稍后重试","data":null,"timestamp":1782976702016}
  17020. Forwarded URL = null
  17021. Redirected URL = null
  17022. Cookies = []
  17023. 15:18:22.019 DEBUG [wTc7EqMQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/sms/send | IP: 127.0.0.1
  17024. 15:18:22.020 ERROR [wTc7EqMQ] [] [ main] c.x.h.GlobalExceptionHandler : 系统异常
  17025. org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' is not supported
  17026. at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)
  17027. at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)
  17028. at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)
  17029. at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)
  17030. at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)
  17031. at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:509)
  17032. at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1284)
  17033. at org.springframework.test.web.servlet.TestDispatcherServlet.getHandler(TestDispatcherServlet.java:123)
  17034. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)
  17035. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
  17036. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
  17037. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
  17038. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
  17039. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
  17040. at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
  17041. at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
  17042. at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
  17043. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  17044. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
  17045. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  17046. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  17047. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
  17048. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
  17049. at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
  17050. at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
  17051. at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
  17052. at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
  17053. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
  17054. at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
  17055. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17056. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17057. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17058. at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
  17059. at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
  17060. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17061. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17062. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17063. at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
  17064. at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
  17065. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17066. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17067. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17068. at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
  17069. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17070. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17071. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17072. at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
  17073. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17074. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17075. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17076. at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
  17077. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17078. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17079. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17080. at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
  17081. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17082. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17083. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17084. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17085. at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
  17086. at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
  17087. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17088. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17089. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17090. at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
  17091. at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
  17092. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17093. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17094. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17095. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17096. at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
  17097. at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
  17098. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17099. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17100. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17101. at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
  17102. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17103. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17104. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
  17105. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17106. at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
  17107. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17108. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
  17109. at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
  17110. at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
  17111. at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
  17112. at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
  17113. at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
  17114. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  17115. at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
  17116. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  17117. at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
  17118. at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
  17119. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  17120. at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
  17121. at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
  17122. at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
  17123. at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
  17124. at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
  17125. at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
  17126. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  17127. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  17128. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
  17129. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17130. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  17131. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  17132. at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
  17133. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17134. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  17135. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  17136. at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
  17137. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17138. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  17139. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  17140. at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
  17141. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17142. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  17143. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  17144. at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
  17145. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17146. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  17147. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  17148. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
  17149. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
  17150. at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
  17151. at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
  17152. at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
  17153. at com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation.sendCode_getMethodShouldFail(SecurityAccessTest.java:399)
  17154. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  17155. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  17156. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  17157. at java.base/java.lang.reflect.Method.invoke(Method.java:568)
  17158. at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
  17159. at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
  17160. at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
  17161. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
  17162. at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
  17163. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
  17164. at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
  17165. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
  17166. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
  17167. at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
  17168. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
  17169. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
  17170. at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
  17171. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
  17172. at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
  17173. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
  17174. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  17175. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
  17176. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
  17177. at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
  17178. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
  17179. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  17180. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  17181. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  17182. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  17183. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  17184. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  17185. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  17186. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  17187. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  17188. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  17189. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  17190. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  17191. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  17192. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  17193. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  17194. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  17195. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  17196. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  17197. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  17198. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  17199. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  17200. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  17201. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  17202. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  17203. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  17204. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  17205. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  17206. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  17207. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
  17208. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
  17209. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  17210. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
  17211. at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
  17212. at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
  17213. at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  17214. at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
  17215. at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
  17216. at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
  17217. at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
  17218. at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
  17219. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
  17220. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
  17221. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
  17222. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
  17223. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
  17224. at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
  17225. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
  17226. at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
  17227. at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
  17228. at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
  17229. at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
  17230. at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
  17231. at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
  17232. at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
  17233. at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
  17234. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
  17235. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
  17236. at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
  17237. at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
  17238. at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
  17239. at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
  17240. at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
  17241. 15:18:22.021 WARN [wTc7EqMQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/sms/send 500 2ms
  17242. MockHttpServletRequest:
  17243. HTTP Method = GET
  17244. Request URI = /api/auth/sms/send
  17245. Parameters = {}
  17246. Headers = []
  17247. Body = null
  17248. Session Attrs = {}
  17249. Handler:
  17250. Type = null
  17251. Async:
  17252. Async started = false
  17253. Async result = null
  17254. Resolved Exception:
  17255. Type = org.springframework.web.HttpRequestMethodNotSupportedException
  17256. ModelAndView:
  17257. View name = null
  17258. View = null
  17259. Model = null
  17260. FlashMap:
  17261. Attributes = null
  17262. MockHttpServletResponse:
  17263. Status = 500
  17264. Error message = null
  17265. Headers = [X-Request-Id:"wTc7EqMQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17266. Content type = application/json
  17267. Body = {"code":500,"message":"系统繁忙,请稍后重试","data":null,"timestamp":1782976702021}
  17268. Forwarded URL = null
  17269. Redirected URL = null
  17270. Cookies = []
  17271. [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.014 s -- in HTTP 方法验证
  17272. [INFO] Running Token 有效性验证
  17273. 15:18:22.023 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$TokenValidation]: TokenValidation does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  17274. 15:18:22.024 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$TokenValidation
  17275. 15:18:22.027 DEBUG [u75R6Apc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  17276. 15:18:22.028 WARN [u75R6Apc] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Malformed protected header JSON: Unable to deserialize: Unexpected character ('?' (code 65533 / 0xfffd)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
  17277. at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
  17278. 15:18:22.028 WARN [u75R6Apc] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析Token失败, 原因: Malformed protected header JSON: Unable to deserialize: Unexpected character ('?' (code 65533 / 0xfffd)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
  17279. at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
  17280. 15:18:22.028 WARN [u75R6Apc] [] [ main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
  17281. 15:18:22.030 WARN [u75R6Apc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 3ms
  17282. MockHttpServletRequest:
  17283. HTTP Method = GET
  17284. Request URI = /api/membership/my
  17285. Parameters = {}
  17286. Headers = [Authorization:"Bearer invalid.token.here"]
  17287. Body = null
  17288. Session Attrs = {}
  17289. Handler:
  17290. Type = null
  17291. Async:
  17292. Async started = false
  17293. Async result = null
  17294. Resolved Exception:
  17295. Type = null
  17296. ModelAndView:
  17297. View name = null
  17298. View = null
  17299. Model = null
  17300. FlashMap:
  17301. Attributes = null
  17302. MockHttpServletResponse:
  17303. Status = 401
  17304. Error message = null
  17305. Headers = [X-Request-Id:"u75R6Apc", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17306. Content type = application/json;charset=UTF-8
  17307. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702028}
  17308. Forwarded URL = null
  17309. Redirected URL = null
  17310. Cookies = []
  17311. 15:18:22.036 DEBUG [GCx37bzE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  17312. 15:18:22.036 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  17313. 15:18:22.036 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  17314. 15:18:22.038 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  17315. 15:18:22.039 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  17316. 15:18:22.039 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  17317. 15:18:22.041 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  17318. 15:18:22.041 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  17319. 15:18:22.041 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  17320. 15:18:22.043 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  17321. 15:18:22.043 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  17322. 15:18:22.044 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  17323. 15:18:22.045 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  17324. 15:18:22.045 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
  17325. 15:18:22.046 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
  17326. 15:18:22.048 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
  17327. 15:18:22.048 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
  17328. 15:18:22.048 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
  17329. 15:18:22.049 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
  17330. 15:18:22.049 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
  17331. 15:18:22.049 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
  17332. 15:18:22.050 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
  17333. 15:18:22.051 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
  17334. 15:18:22.051 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
  17335. 15:18:22.053 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
  17336. 15:18:22.053 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
  17337. 15:18:22.053 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
  17338. 15:18:22.055 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
  17339. 15:18:22.055 DEBUG [GCx37bzE] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
  17340. 15:18:22.055 DEBUG [GCx37bzE] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
  17341. 15:18:22.057 DEBUG [GCx37bzE] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
  17342. 15:18:22.058 DEBUG [GCx37bzE] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 22ms
  17343. MockHttpServletRequest:
  17344. HTTP Method = GET
  17345. Request URI = /api/crawler/status
  17346. Parameters = {}
  17347. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.otEd4zTwmcm8W3ofGVOZCKCf-ptkWmG_Zu2VXf2ITC_iauEbeYvLuVAa1S_coRsmQi-JItBeYdrYEE5vpGjFhw"]
  17348. Body = null
  17349. Session Attrs = {}
  17350. Handler:
  17351. Type = com.xuekairui.user.controller.CrawlerController
  17352. Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
  17353. Async:
  17354. Async started = false
  17355. Async result = null
  17356. Resolved Exception:
  17357. Type = null
  17358. ModelAndView:
  17359. View name = null
  17360. View = null
  17361. Model = null
  17362. FlashMap:
  17363. Attributes = null
  17364. MockHttpServletResponse:
  17365. Status = 200
  17366. Error message = null
  17367. Headers = [X-Request-Id:"GCx37bzE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17368. Content type = application/json
  17369. Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976702057}
  17370. Forwarded URL = null
  17371. Redirected URL = null
  17372. Cookies = []
  17373. 15:18:22.061 DEBUG [sN2Tcj77] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  17374. 15:18:22.062 WARN [sN2Tcj77] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 1ms
  17375. MockHttpServletRequest:
  17376. HTTP Method = GET
  17377. Request URI = /api/membership/my
  17378. Parameters = {}
  17379. Headers = [Authorization:"Bearer "]
  17380. Body = null
  17381. Session Attrs = {}
  17382. Handler:
  17383. Type = null
  17384. Async:
  17385. Async started = false
  17386. Async result = null
  17387. Resolved Exception:
  17388. Type = null
  17389. ModelAndView:
  17390. View name = null
  17391. View = null
  17392. Model = null
  17393. FlashMap:
  17394. Attributes = null
  17395. MockHttpServletResponse:
  17396. Status = 401
  17397. Error message = null
  17398. Headers = [X-Request-Id:"sN2Tcj77", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17399. Content type = application/json;charset=UTF-8
  17400. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702061}
  17401. Forwarded URL = null
  17402. Redirected URL = null
  17403. Cookies = []
  17404. 15:18:22.068 DEBUG [9FXN98PV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  17405. 15:18:22.068 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  17406. 15:18:22.068 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  17407. 15:18:22.070 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  17408. 15:18:22.071 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  17409. 15:18:22.071 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  17410. 15:18:22.073 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  17411. 15:18:22.073 DEBUG [9FXN98PV] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 5ms
  17412. MockHttpServletRequest:
  17413. HTTP Method = GET
  17414. Request URI = /api/membership/my
  17415. Parameters = {}
  17416. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.otEd4zTwmcm8W3ofGVOZCKCf-ptkWmG_Zu2VXf2ITC_iauEbeYvLuVAa1S_coRsmQi-JItBeYdrYEE5vpGjFhw"]
  17417. Body = null
  17418. Session Attrs = {}
  17419. Handler:
  17420. Type = com.xuekairui.user.controller.MembershipController
  17421. Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
  17422. Async:
  17423. Async started = false
  17424. Async result = null
  17425. Resolved Exception:
  17426. Type = null
  17427. ModelAndView:
  17428. View name = null
  17429. View = null
  17430. Model = null
  17431. FlashMap:
  17432. Attributes = null
  17433. MockHttpServletResponse:
  17434. Status = 200
  17435. Error message = null
  17436. Headers = [X-Request-Id:"9FXN98PV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17437. Content type = application/json
  17438. Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":1,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976702073}
  17439. Forwarded URL = null
  17440. Redirected URL = null
  17441. Cookies = []
  17442. 15:18:22.080 DEBUG [Ksfvcegr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  17443. 15:18:22.080 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  17444. 15:18:22.081 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  17445. 15:18:22.082 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  17446. 15:18:22.083 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  17447. 15:18:22.083 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  17448. 15:18:22.085 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  17449. 15:18:22.085 DEBUG [Ksfvcegr] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 5ms
  17450. MockHttpServletRequest:
  17451. HTTP Method = GET
  17452. Request URI = /api/membership/my
  17453. Parameters = {}
  17454. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.otEd4zTwmcm8W3ofGVOZCKCf-ptkWmG_Zu2VXf2ITC_iauEbeYvLuVAa1S_coRsmQi-JItBeYdrYEE5vpGjFhw"]
  17455. Body = null
  17456. Session Attrs = {}
  17457. Handler:
  17458. Type = com.xuekairui.user.controller.MembershipController
  17459. Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
  17460. Async:
  17461. Async started = false
  17462. Async result = null
  17463. Resolved Exception:
  17464. Type = null
  17465. ModelAndView:
  17466. View name = null
  17467. View = null
  17468. Model = null
  17469. FlashMap:
  17470. Attributes = null
  17471. MockHttpServletResponse:
  17472. Status = 200
  17473. Error message = null
  17474. Headers = [X-Request-Id:"Ksfvcegr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17475. Content type = application/json
  17476. Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":1,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976702085}
  17477. Forwarded URL = null
  17478. Redirected URL = null
  17479. Cookies = []
  17480. 15:18:22.086 DEBUG [rqWqCjn4] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  17481. 15:18:22.086 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  17482. 15:18:22.086 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
  17483. 15:18:22.088 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  17484. 15:18:22.089 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  17485. 15:18:22.089 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
  17486. 15:18:22.091 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  17487. 15:18:22.091 DEBUG [rqWqCjn4] [2] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 5ms
  17488. MockHttpServletRequest:
  17489. HTTP Method = GET
  17490. Request URI = /api/membership/my
  17491. Parameters = {}
  17492. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.PqJ0dJSGW5Ai-c-kR3wxbkt_xScrad6gi8mIkk3vMnAS9L669ed-JpFPKCRL4tEhZnmgykMxpD6qfSgjmmW6QQ"]
  17493. Body = null
  17494. Session Attrs = {}
  17495. Handler:
  17496. Type = com.xuekairui.user.controller.MembershipController
  17497. Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
  17498. Async:
  17499. Async started = false
  17500. Async result = null
  17501. Resolved Exception:
  17502. Type = null
  17503. ModelAndView:
  17504. View name = null
  17505. View = null
  17506. Model = null
  17507. FlashMap:
  17508. Attributes = null
  17509. MockHttpServletResponse:
  17510. Status = 200
  17511. Error message = null
  17512. Headers = [X-Request-Id:"rqWqCjn4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17513. Content type = application/json
  17514. Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":2,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976702091}
  17515. Forwarded URL = null
  17516. Redirected URL = null
  17517. Cookies = []
  17518. [INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.071 s -- in Token 有效性验证
  17519. [INFO] Running 受保护接口 - 管理级(需要 Token)
  17520. 15:18:22.094 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$AdminEndpoints]: AdminEndpoints does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  17521. 15:18:22.095 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$AdminEndpoints
  17522. 15:18:22.099 DEBUG [bAc8fbXh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
  17523. 15:18:22.100 WARN [bAc8fbXh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 401 1ms
  17524. MockHttpServletRequest:
  17525. HTTP Method = GET
  17526. Request URI = /api/admin/audit-log/target/USER/1
  17527. Parameters = {}
  17528. Headers = []
  17529. Body = null
  17530. Session Attrs = {}
  17531. Handler:
  17532. Type = null
  17533. Async:
  17534. Async started = false
  17535. Async result = null
  17536. Resolved Exception:
  17537. Type = null
  17538. ModelAndView:
  17539. View name = null
  17540. View = null
  17541. Model = null
  17542. FlashMap:
  17543. Attributes = null
  17544. MockHttpServletResponse:
  17545. Status = 401
  17546. Error message = null
  17547. Headers = [X-Request-Id:"bAc8fbXh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17548. Content type = application/json;charset=UTF-8
  17549. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702099}
  17550. Forwarded URL = null
  17551. Redirected URL = null
  17552. Cookies = []
  17553. 15:18:22.103 DEBUG [sKhaVzeB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards | IP: 127.0.0.1
  17554. 15:18:22.105 WARN [sKhaVzeB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards 401 2ms
  17555. MockHttpServletRequest:
  17556. HTTP Method = GET
  17557. Request URI = /api/admin/invite/rewards
  17558. Parameters = {}
  17559. Headers = []
  17560. Body = null
  17561. Session Attrs = {}
  17562. Handler:
  17563. Type = null
  17564. Async:
  17565. Async started = false
  17566. Async result = null
  17567. Resolved Exception:
  17568. Type = null
  17569. ModelAndView:
  17570. View name = null
  17571. View = null
  17572. Model = null
  17573. FlashMap:
  17574. Attributes = null
  17575. MockHttpServletResponse:
  17576. Status = 401
  17577. Error message = null
  17578. Headers = [X-Request-Id:"sKhaVzeB", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17579. Content type = application/json;charset=UTF-8
  17580. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702103}
  17581. Forwarded URL = null
  17582. Redirected URL = null
  17583. Cookies = []
  17584. 15:18:22.109 DEBUG [AqLf4ed9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config | IP: 127.0.0.1
  17585. 15:18:22.112 WARN [AqLf4ed9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config 401 3ms
  17586. MockHttpServletRequest:
  17587. HTTP Method = GET
  17588. Request URI = /api/admin/invite/config
  17589. Parameters = {}
  17590. Headers = []
  17591. Body = null
  17592. Session Attrs = {}
  17593. Handler:
  17594. Type = null
  17595. Async:
  17596. Async started = false
  17597. Async result = null
  17598. Resolved Exception:
  17599. Type = null
  17600. ModelAndView:
  17601. View name = null
  17602. View = null
  17603. Model = null
  17604. FlashMap:
  17605. Attributes = null
  17606. MockHttpServletResponse:
  17607. Status = 401
  17608. Error message = null
  17609. Headers = [X-Request-Id:"AqLf4ed9", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17610. Content type = application/json;charset=UTF-8
  17611. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702111}
  17612. Forwarded URL = null
  17613. Redirected URL = null
  17614. Cookies = []
  17615. 15:18:22.116 DEBUG [tttxAy5f] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
  17616. 15:18:22.117 WARN [tttxAy5f] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 401 1ms
  17617. MockHttpServletRequest:
  17618. HTTP Method = POST
  17619. Request URI = /api/admin/trial-quota/config
  17620. Parameters = {}
  17621. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  17622. Body = {}
  17623. Session Attrs = {}
  17624. Handler:
  17625. Type = null
  17626. Async:
  17627. Async started = false
  17628. Async result = null
  17629. Resolved Exception:
  17630. Type = null
  17631. ModelAndView:
  17632. View name = null
  17633. View = null
  17634. Model = null
  17635. FlashMap:
  17636. Attributes = null
  17637. MockHttpServletResponse:
  17638. Status = 401
  17639. Error message = null
  17640. Headers = [X-Request-Id:"tttxAy5f", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17641. Content type = application/json;charset=UTF-8
  17642. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702116}
  17643. Forwarded URL = null
  17644. Redirected URL = null
  17645. Cookies = []
  17646. 15:18:22.120 DEBUG [bjZNAQuC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
  17647. 15:18:22.123 WARN [bjZNAQuC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive 401 3ms
  17648. MockHttpServletRequest:
  17649. HTTP Method = GET
  17650. Request URI = /api/admin/audit-log/sensitive
  17651. Parameters = {}
  17652. Headers = []
  17653. Body = null
  17654. Session Attrs = {}
  17655. Handler:
  17656. Type = null
  17657. Async:
  17658. Async started = false
  17659. Async result = null
  17660. Resolved Exception:
  17661. Type = null
  17662. ModelAndView:
  17663. View name = null
  17664. View = null
  17665. Model = null
  17666. FlashMap:
  17667. Attributes = null
  17668. MockHttpServletResponse:
  17669. Status = 401
  17670. Error message = null
  17671. Headers = [X-Request-Id:"bjZNAQuC", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17672. Content type = application/json;charset=UTF-8
  17673. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702122}
  17674. Forwarded URL = null
  17675. Redirected URL = null
  17676. Cookies = []
  17677. 15:18:22.127 DEBUG [WRFDHW7k] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 | IP: 127.0.0.1
  17678. 15:18:22.128 WARN [WRFDHW7k] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 401 1ms
  17679. MockHttpServletRequest:
  17680. HTTP Method = PUT
  17681. Request URI = /api/admin/trial-quota/config/1
  17682. Parameters = {}
  17683. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  17684. Body = {}
  17685. Session Attrs = {}
  17686. Handler:
  17687. Type = null
  17688. Async:
  17689. Async started = false
  17690. Async result = null
  17691. Resolved Exception:
  17692. Type = null
  17693. ModelAndView:
  17694. View name = null
  17695. View = null
  17696. Model = null
  17697. FlashMap:
  17698. Attributes = null
  17699. MockHttpServletResponse:
  17700. Status = 401
  17701. Error message = null
  17702. Headers = [X-Request-Id:"WRFDHW7k", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17703. Content type = application/json;charset=UTF-8
  17704. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702128}
  17705. Forwarded URL = null
  17706. Redirected URL = null
  17707. Cookies = []
  17708. 15:18:22.133 DEBUG [vvFaU4En] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
  17709. 15:18:22.135 WARN [vvFaU4En] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 401 2ms
  17710. MockHttpServletRequest:
  17711. HTTP Method = POST
  17712. Request URI = /api/admin/membership/grant
  17713. Parameters = {}
  17714. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"26"]
  17715. Body = {"userId":1,"level":"PRO"}
  17716. Session Attrs = {}
  17717. Handler:
  17718. Type = null
  17719. Async:
  17720. Async started = false
  17721. Async result = null
  17722. Resolved Exception:
  17723. Type = null
  17724. ModelAndView:
  17725. View name = null
  17726. View = null
  17727. Model = null
  17728. FlashMap:
  17729. Attributes = null
  17730. MockHttpServletResponse:
  17731. Status = 401
  17732. Error message = null
  17733. Headers = [X-Request-Id:"vvFaU4En", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17734. Content type = application/json;charset=UTF-8
  17735. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702135}
  17736. Forwarded URL = null
  17737. Redirected URL = null
  17738. Cookies = []
  17739. 15:18:22.145 DEBUG [6XSb5Ysh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
  17740. 15:18:22.146 WARN [6XSb5Ysh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 401 1ms
  17741. MockHttpServletRequest:
  17742. HTTP Method = GET
  17743. Request URI = /api/admin/audit-log
  17744. Parameters = {}
  17745. Headers = []
  17746. Body = null
  17747. Session Attrs = {}
  17748. Handler:
  17749. Type = null
  17750. Async:
  17751. Async started = false
  17752. Async result = null
  17753. Resolved Exception:
  17754. Type = null
  17755. ModelAndView:
  17756. View name = null
  17757. View = null
  17758. Model = null
  17759. FlashMap:
  17760. Attributes = null
  17761. MockHttpServletResponse:
  17762. Status = 401
  17763. Error message = null
  17764. Headers = [X-Request-Id:"6XSb5Ysh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17765. Content type = application/json;charset=UTF-8
  17766. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702145}
  17767. Forwarded URL = null
  17768. Redirected URL = null
  17769. Cookies = []
  17770. 15:18:22.149 DEBUG [7bjWpegn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/1 | IP: 127.0.0.1
  17771. 15:18:22.150 WARN [7bjWpegn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/1 401 1ms
  17772. MockHttpServletRequest:
  17773. HTTP Method = DELETE
  17774. Request URI = /api/admin/trial-quota/config/1
  17775. Parameters = {}
  17776. Headers = []
  17777. Body = null
  17778. Session Attrs = {}
  17779. Handler:
  17780. Type = null
  17781. Async:
  17782. Async started = false
  17783. Async result = null
  17784. Resolved Exception:
  17785. Type = null
  17786. ModelAndView:
  17787. View name = null
  17788. View = null
  17789. Model = null
  17790. FlashMap:
  17791. Attributes = null
  17792. MockHttpServletResponse:
  17793. Status = 401
  17794. Error message = null
  17795. Headers = [X-Request-Id:"7bjWpegn", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17796. Content type = application/json;charset=UTF-8
  17797. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702150}
  17798. Forwarded URL = null
  17799. Redirected URL = null
  17800. Cookies = []
  17801. 15:18:22.156 DEBUG [DLyfQv44] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER | IP: 127.0.0.1
  17802. 15:18:22.158 WARN [DLyfQv44] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER 401 2ms
  17803. MockHttpServletRequest:
  17804. HTTP Method = GET
  17805. Request URI = /api/admin/audit-log/stats
  17806. Parameters = {module=[USER]}
  17807. Headers = []
  17808. Body = null
  17809. Session Attrs = {}
  17810. Handler:
  17811. Type = null
  17812. Async:
  17813. Async started = false
  17814. Async result = null
  17815. Resolved Exception:
  17816. Type = null
  17817. ModelAndView:
  17818. View name = null
  17819. View = null
  17820. Model = null
  17821. FlashMap:
  17822. Attributes = null
  17823. MockHttpServletResponse:
  17824. Status = 401
  17825. Error message = null
  17826. Headers = [X-Request-Id:"DLyfQv44", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17827. Content type = application/json;charset=UTF-8
  17828. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702156}
  17829. Forwarded URL = null
  17830. Redirected URL = null
  17831. Cookies = []
  17832. 15:18:22.162 DEBUG [FemZNLr8] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config | IP: 127.0.0.1
  17833. 15:18:22.163 WARN [FemZNLr8] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config 401 1ms
  17834. MockHttpServletRequest:
  17835. HTTP Method = PUT
  17836. Request URI = /api/admin/invite/config
  17837. Parameters = {}
  17838. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  17839. Body = {}
  17840. Session Attrs = {}
  17841. Handler:
  17842. Type = null
  17843. Async:
  17844. Async started = false
  17845. Async result = null
  17846. Resolved Exception:
  17847. Type = null
  17848. ModelAndView:
  17849. View name = null
  17850. View = null
  17851. Model = null
  17852. FlashMap:
  17853. Attributes = null
  17854. MockHttpServletResponse:
  17855. Status = 401
  17856. Error message = null
  17857. Headers = [X-Request-Id:"FemZNLr8", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17858. Content type = application/json;charset=UTF-8
  17859. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702162}
  17860. Forwarded URL = null
  17861. Redirected URL = null
  17862. Cookies = []
  17863. 15:18:22.167 DEBUG [ZQADbf4z] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs | IP: 127.0.0.1
  17864. 15:18:22.168 WARN [ZQADbf4z] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs 401 1ms
  17865. MockHttpServletRequest:
  17866. HTTP Method = GET
  17867. Request URI = /api/admin/trial-quota/configs
  17868. Parameters = {}
  17869. Headers = []
  17870. Body = null
  17871. Session Attrs = {}
  17872. Handler:
  17873. Type = null
  17874. Async:
  17875. Async started = false
  17876. Async result = null
  17877. Resolved Exception:
  17878. Type = null
  17879. ModelAndView:
  17880. View name = null
  17881. View = null
  17882. Model = null
  17883. FlashMap:
  17884. Attributes = null
  17885. MockHttpServletResponse:
  17886. Status = 401
  17887. Error message = null
  17888. Headers = [X-Request-Id:"ZQADbf4z", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17889. Content type = application/json;charset=UTF-8
  17890. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702168}
  17891. Forwarded URL = null
  17892. Redirected URL = null
  17893. Cookies = []
  17894. 15:18:22.173 DEBUG [URagQ4gu] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant | IP: 127.0.0.1
  17895. 15:18:22.175 WARN [URagQ4gu] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant 401 2ms
  17896. MockHttpServletRequest:
  17897. HTTP Method = POST
  17898. Request URI = /api/admin/crawler/grant
  17899. Parameters = {}
  17900. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
  17901. Body = {"userId":1,"quotaCount":50}
  17902. Session Attrs = {}
  17903. Handler:
  17904. Type = null
  17905. Async:
  17906. Async started = false
  17907. Async result = null
  17908. Resolved Exception:
  17909. Type = null
  17910. ModelAndView:
  17911. View name = null
  17912. View = null
  17913. Model = null
  17914. FlashMap:
  17915. Attributes = null
  17916. MockHttpServletResponse:
  17917. Status = 401
  17918. Error message = null
  17919. Headers = [X-Request-Id:"URagQ4gu", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17920. Content type = application/json;charset=UTF-8
  17921. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702175}
  17922. Forwarded URL = null
  17923. Redirected URL = null
  17924. Cookies = []
  17925. 15:18:22.178 DEBUG [RKZLWJHx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review | IP: 127.0.0.1
  17926. 15:18:22.179 WARN [RKZLWJHx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review 401 1ms
  17927. MockHttpServletRequest:
  17928. HTTP Method = GET
  17929. Request URI = /api/admin/license/review
  17930. Parameters = {}
  17931. Headers = []
  17932. Body = null
  17933. Session Attrs = {}
  17934. Handler:
  17935. Type = null
  17936. Async:
  17937. Async started = false
  17938. Async result = null
  17939. Resolved Exception:
  17940. Type = null
  17941. ModelAndView:
  17942. View name = null
  17943. View = null
  17944. Model = null
  17945. FlashMap:
  17946. Attributes = null
  17947. MockHttpServletResponse:
  17948. Status = 401
  17949. Error message = null
  17950. Headers = [X-Request-Id:"RKZLWJHx", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17951. Content type = application/json;charset=UTF-8
  17952. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702178}
  17953. Forwarded URL = null
  17954. Redirected URL = null
  17955. Cookies = []
  17956. 15:18:22.184 DEBUG [rs6KyMYP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
  17957. 15:18:22.184 WARN [rs6KyMYP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 401 1ms
  17958. MockHttpServletRequest:
  17959. HTTP Method = POST
  17960. Request URI = /api/admin/license/review
  17961. Parameters = {}
  17962. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  17963. Body = {}
  17964. Session Attrs = {}
  17965. Handler:
  17966. Type = null
  17967. Async:
  17968. Async started = false
  17969. Async result = null
  17970. Resolved Exception:
  17971. Type = null
  17972. ModelAndView:
  17973. View name = null
  17974. View = null
  17975. Model = null
  17976. FlashMap:
  17977. Attributes = null
  17978. MockHttpServletResponse:
  17979. Status = 401
  17980. Error message = null
  17981. Headers = [X-Request-Id:"rs6KyMYP", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  17982. Content type = application/json;charset=UTF-8
  17983. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702184}
  17984. Forwarded URL = null
  17985. Redirected URL = null
  17986. Cookies = []
  17987. 15:18:22.188 DEBUG [FLf59b87] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants | IP: 127.0.0.1
  17988. 15:18:22.191 WARN [FLf59b87] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants 401 3ms
  17989. MockHttpServletRequest:
  17990. HTTP Method = GET
  17991. Request URI = /api/admin/crawler/grants
  17992. Parameters = {}
  17993. Headers = []
  17994. Body = null
  17995. Session Attrs = {}
  17996. Handler:
  17997. Type = null
  17998. Async:
  17999. Async started = false
  18000. Async result = null
  18001. Resolved Exception:
  18002. Type = null
  18003. ModelAndView:
  18004. View name = null
  18005. View = null
  18006. Model = null
  18007. FlashMap:
  18008. Attributes = null
  18009. MockHttpServletResponse:
  18010. Status = 401
  18011. Error message = null
  18012. Headers = [X-Request-Id:"FLf59b87", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18013. Content type = application/json;charset=UTF-8
  18014. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702190}
  18015. Forwarded URL = null
  18016. Redirected URL = null
  18017. Cookies = []
  18018. 15:18:22.194 DEBUG [YC9n6sUJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
  18019. 15:18:22.195 WARN [YC9n6sUJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 401 1ms
  18020. MockHttpServletRequest:
  18021. HTTP Method = GET
  18022. Request URI = /api/admin/audit-log/user/1
  18023. Parameters = {}
  18024. Headers = []
  18025. Body = null
  18026. Session Attrs = {}
  18027. Handler:
  18028. Type = null
  18029. Async:
  18030. Async started = false
  18031. Async result = null
  18032. Resolved Exception:
  18033. Type = null
  18034. ModelAndView:
  18035. View name = null
  18036. View = null
  18037. Model = null
  18038. FlashMap:
  18039. Attributes = null
  18040. MockHttpServletResponse:
  18041. Status = 401
  18042. Error message = null
  18043. Headers = [X-Request-Id:"YC9n6sUJ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18044. Content type = application/json;charset=UTF-8
  18045. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702195}
  18046. Forwarded URL = null
  18047. Redirected URL = null
  18048. Cookies = []
  18049. [INFO] Tests run: 17, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.104 s -- in 受保护接口 - 管理级(需要 Token)
  18050. [INFO] Running 受保护接口 - 用户级(需要 Token)
  18051. 15:18:22.200 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$ProtectedEndpoints]: ProtectedEndpoints does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  18052. 15:18:22.201 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$ProtectedEndpoints
  18053. 15:18:22.204 DEBUG [VcW5nc3e] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
  18054. 15:18:22.206 WARN [VcW5nc3e] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 401 2ms
  18055. MockHttpServletRequest:
  18056. HTTP Method = GET
  18057. Request URI = /api/invite/stats
  18058. Parameters = {}
  18059. Headers = []
  18060. Body = null
  18061. Session Attrs = {}
  18062. Handler:
  18063. Type = null
  18064. Async:
  18065. Async started = false
  18066. Async result = null
  18067. Resolved Exception:
  18068. Type = null
  18069. ModelAndView:
  18070. View name = null
  18071. View = null
  18072. Model = null
  18073. FlashMap:
  18074. Attributes = null
  18075. MockHttpServletResponse:
  18076. Status = 401
  18077. Error message = null
  18078. Headers = [X-Request-Id:"VcW5nc3e", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18079. Content type = application/json;charset=UTF-8
  18080. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702205}
  18081. Forwarded URL = null
  18082. Redirected URL = null
  18083. Cookies = []
  18084. 15:18:22.209 DEBUG [FuVNBWyS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
  18085. 15:18:22.210 WARN [FuVNBWyS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 401 1ms
  18086. MockHttpServletRequest:
  18087. HTTP Method = GET
  18088. Request URI = /api/coupon/my
  18089. Parameters = {}
  18090. Headers = []
  18091. Body = null
  18092. Session Attrs = {}
  18093. Handler:
  18094. Type = null
  18095. Async:
  18096. Async started = false
  18097. Async result = null
  18098. Resolved Exception:
  18099. Type = null
  18100. ModelAndView:
  18101. View name = null
  18102. View = null
  18103. Model = null
  18104. FlashMap:
  18105. Attributes = null
  18106. MockHttpServletResponse:
  18107. Status = 401
  18108. Error message = null
  18109. Headers = [X-Request-Id:"FuVNBWyS", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18110. Content type = application/json;charset=UTF-8
  18111. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702210}
  18112. Forwarded URL = null
  18113. Redirected URL = null
  18114. Cookies = []
  18115. 15:18:22.214 DEBUG [pF7ZfcHR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available | IP: 127.0.0.1
  18116. 15:18:22.214 WARN [pF7ZfcHR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available 401 0ms
  18117. MockHttpServletRequest:
  18118. HTTP Method = GET
  18119. Request URI = /api/coupon/my/available
  18120. Parameters = {}
  18121. Headers = []
  18122. Body = null
  18123. Session Attrs = {}
  18124. Handler:
  18125. Type = null
  18126. Async:
  18127. Async started = false
  18128. Async result = null
  18129. Resolved Exception:
  18130. Type = null
  18131. ModelAndView:
  18132. View name = null
  18133. View = null
  18134. Model = null
  18135. FlashMap:
  18136. Attributes = null
  18137. MockHttpServletResponse:
  18138. Status = 401
  18139. Error message = null
  18140. Headers = [X-Request-Id:"pF7ZfcHR", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18141. Content type = application/json;charset=UTF-8
  18142. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702214}
  18143. Forwarded URL = null
  18144. Redirected URL = null
  18145. Cookies = []
  18146. 15:18:22.218 DEBUG [TuvY4VCX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue | IP: 127.0.0.1
  18147. 15:18:22.219 WARN [TuvY4VCX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue 401 1ms
  18148. MockHttpServletRequest:
  18149. HTTP Method = POST
  18150. Request URI = /api/coupon/issue
  18151. Parameters = {}
  18152. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  18153. Body = {}
  18154. Session Attrs = {}
  18155. Handler:
  18156. Type = null
  18157. Async:
  18158. Async started = false
  18159. Async result = null
  18160. Resolved Exception:
  18161. Type = null
  18162. ModelAndView:
  18163. View name = null
  18164. View = null
  18165. Model = null
  18166. FlashMap:
  18167. Attributes = null
  18168. MockHttpServletResponse:
  18169. Status = 401
  18170. Error message = null
  18171. Headers = [X-Request-Id:"TuvY4VCX", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18172. Content type = application/json;charset=UTF-8
  18173. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702219}
  18174. Forwarded URL = null
  18175. Redirected URL = null
  18176. Cookies = []
  18177. 15:18:22.223 DEBUG [2V9ZyeJd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards | IP: 127.0.0.1
  18178. 15:18:22.225 WARN [2V9ZyeJd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards 401 2ms
  18179. MockHttpServletRequest:
  18180. HTTP Method = GET
  18181. Request URI = /api/invite/rewards
  18182. Parameters = {}
  18183. Headers = []
  18184. Body = null
  18185. Session Attrs = {}
  18186. Handler:
  18187. Type = null
  18188. Async:
  18189. Async started = false
  18190. Async result = null
  18191. Resolved Exception:
  18192. Type = null
  18193. ModelAndView:
  18194. View name = null
  18195. View = null
  18196. Model = null
  18197. FlashMap:
  18198. Attributes = null
  18199. MockHttpServletResponse:
  18200. Status = 401
  18201. Error message = null
  18202. Headers = [X-Request-Id:"2V9ZyeJd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18203. Content type = application/json;charset=UTF-8
  18204. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702224}
  18205. Forwarded URL = null
  18206. Redirected URL = null
  18207. Cookies = []
  18208. 15:18:22.227 DEBUG [6VGLgJAE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  18209. 15:18:22.229 WARN [6VGLgJAE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 2ms
  18210. MockHttpServletRequest:
  18211. HTTP Method = GET
  18212. Request URI = /api/membership/my
  18213. Parameters = {}
  18214. Headers = []
  18215. Body = null
  18216. Session Attrs = {}
  18217. Handler:
  18218. Type = null
  18219. Async:
  18220. Async started = false
  18221. Async result = null
  18222. Resolved Exception:
  18223. Type = null
  18224. ModelAndView:
  18225. View name = null
  18226. View = null
  18227. Model = null
  18228. FlashMap:
  18229. Attributes = null
  18230. MockHttpServletResponse:
  18231. Status = 401
  18232. Error message = null
  18233. Headers = [X-Request-Id:"6VGLgJAE", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18234. Content type = application/json;charset=UTF-8
  18235. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702229}
  18236. Forwarded URL = null
  18237. Redirected URL = null
  18238. Cookies = []
  18239. 15:18:22.233 DEBUG [SCN6sphB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
  18240. 15:18:22.234 WARN [SCN6sphB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 401 1ms
  18241. MockHttpServletRequest:
  18242. HTTP Method = GET
  18243. Request URI = /api/crawler/logs
  18244. Parameters = {}
  18245. Headers = []
  18246. Body = null
  18247. Session Attrs = {}
  18248. Handler:
  18249. Type = null
  18250. Async:
  18251. Async started = false
  18252. Async result = null
  18253. Resolved Exception:
  18254. Type = null
  18255. ModelAndView:
  18256. View name = null
  18257. View = null
  18258. Model = null
  18259. FlashMap:
  18260. Attributes = null
  18261. MockHttpServletResponse:
  18262. Status = 401
  18263. Error message = null
  18264. Headers = [X-Request-Id:"SCN6sphB", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18265. Content type = application/json;charset=UTF-8
  18266. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702234}
  18267. Forwarded URL = null
  18268. Redirected URL = null
  18269. Cookies = []
  18270. 15:18:22.240 DEBUG [aKghyWCx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota | IP: 127.0.0.1
  18271. 15:18:22.241 WARN [aKghyWCx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota 401 1ms
  18272. MockHttpServletRequest:
  18273. HTTP Method = GET
  18274. Request URI = /api/invite/extra-quota
  18275. Parameters = {}
  18276. Headers = []
  18277. Body = null
  18278. Session Attrs = {}
  18279. Handler:
  18280. Type = null
  18281. Async:
  18282. Async started = false
  18283. Async result = null
  18284. Resolved Exception:
  18285. Type = null
  18286. ModelAndView:
  18287. View name = null
  18288. View = null
  18289. Model = null
  18290. FlashMap:
  18291. Attributes = null
  18292. MockHttpServletResponse:
  18293. Status = 401
  18294. Error message = null
  18295. Headers = [X-Request-Id:"aKghyWCx", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18296. Content type = application/json;charset=UTF-8
  18297. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702241}
  18298. Forwarded URL = null
  18299. Redirected URL = null
  18300. Cookies = []
  18301. 15:18:22.246 DEBUG [cyxkyjeT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
  18302. 15:18:22.247 WARN [cyxkyjeT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
  18303. MockHttpServletRequest:
  18304. HTTP Method = GET
  18305. Request URI = /api/crawler/status
  18306. Parameters = {}
  18307. Headers = []
  18308. Body = null
  18309. Session Attrs = {}
  18310. Handler:
  18311. Type = null
  18312. Async:
  18313. Async started = false
  18314. Async result = null
  18315. Resolved Exception:
  18316. Type = null
  18317. ModelAndView:
  18318. View name = null
  18319. View = null
  18320. Model = null
  18321. FlashMap:
  18322. Attributes = null
  18323. MockHttpServletResponse:
  18324. Status = 401
  18325. Error message = null
  18326. Headers = [X-Request-Id:"cyxkyjeT", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18327. Content type = application/json;charset=UTF-8
  18328. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702247}
  18329. Forwarded URL = null
  18330. Redirected URL = null
  18331. Cookies = []
  18332. 15:18:22.252 DEBUG [5G7LW2ba] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  18333. 15:18:22.254 WARN [5G7LW2ba] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 2ms
  18334. MockHttpServletRequest:
  18335. HTTP Method = GET
  18336. Request URI = /api/auth/user/info
  18337. Parameters = {}
  18338. Headers = []
  18339. Body = null
  18340. Session Attrs = {}
  18341. Handler:
  18342. Type = null
  18343. Async:
  18344. Async started = false
  18345. Async result = null
  18346. Resolved Exception:
  18347. Type = null
  18348. ModelAndView:
  18349. View name = null
  18350. View = null
  18351. Model = null
  18352. FlashMap:
  18353. Attributes = null
  18354. MockHttpServletResponse:
  18355. Status = 401
  18356. Error message = null
  18357. Headers = [X-Request-Id:"5G7LW2ba", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18358. Content type = application/json;charset=UTF-8
  18359. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702253}
  18360. Forwarded URL = null
  18361. Redirected URL = null
  18362. Cookies = []
  18363. 15:18:22.257 DEBUG [ZHqrNU5r] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
  18364. 15:18:22.258 WARN [ZHqrNU5r] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 401 1ms
  18365. MockHttpServletRequest:
  18366. HTTP Method = POST
  18367. Request URI = /api/crawler/consume
  18368. Parameters = {}
  18369. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"11"]
  18370. Body = {"count":1}
  18371. Session Attrs = {}
  18372. Handler:
  18373. Type = null
  18374. Async:
  18375. Async started = false
  18376. Async result = null
  18377. Resolved Exception:
  18378. Type = null
  18379. ModelAndView:
  18380. View name = null
  18381. View = null
  18382. Model = null
  18383. FlashMap:
  18384. Attributes = null
  18385. MockHttpServletResponse:
  18386. Status = 401
  18387. Error message = null
  18388. Headers = [X-Request-Id:"ZHqrNU5r", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18389. Content type = application/json;charset=UTF-8
  18390. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702258}
  18391. Forwarded URL = null
  18392. Redirected URL = null
  18393. Cookies = []
  18394. 15:18:22.261 DEBUG [pWLpbD2j] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
  18395. 15:18:22.264 WARN [pWLpbD2j] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 401 3ms
  18396. MockHttpServletRequest:
  18397. HTTP Method = GET
  18398. Request URI = /api/invite/code
  18399. Parameters = {}
  18400. Headers = []
  18401. Body = null
  18402. Session Attrs = {}
  18403. Handler:
  18404. Type = null
  18405. Async:
  18406. Async started = false
  18407. Async result = null
  18408. Resolved Exception:
  18409. Type = null
  18410. ModelAndView:
  18411. View name = null
  18412. View = null
  18413. Model = null
  18414. FlashMap:
  18415. Attributes = null
  18416. MockHttpServletResponse:
  18417. Status = 401
  18418. Error message = null
  18419. Headers = [X-Request-Id:"pWLpbD2j", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18420. Content type = application/json;charset=UTF-8
  18421. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702263}
  18422. Forwarded URL = null
  18423. Redirected URL = null
  18424. Cookies = []
  18425. [INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.069 s -- in 受保护接口 - 用户级(需要 Token)
  18426. [INFO] Running 公开接口(无需 Token)
  18427. 15:18:22.268 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$PublicEndpoints]: PublicEndpoints does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  18428. 15:18:22.269 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$PublicEndpoints
  18429. 15:18:22.274 DEBUG [PvLYB9bg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
  18430. 15:18:22.275 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  18431. 15:18:22.275 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  18432. 15:18:22.279 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  18433. 15:18:22.280 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  18434. 15:18:22.280 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
  18435. 15:18:22.282 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  18436. 15:18:22.283 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  18437. 15:18:22.283 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
  18438. 15:18:22.284 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : <== Total: 4
  18439. 15:18:22.285 DEBUG [PvLYB9bg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 11ms
  18440. MockHttpServletRequest:
  18441. HTTP Method = GET
  18442. Request URI = /api/membership/levels
  18443. Parameters = {}
  18444. Headers = []
  18445. Body = null
  18446. Session Attrs = {}
  18447. Handler:
  18448. Type = com.xuekairui.user.controller.MembershipController
  18449. Method = com.xuekairui.user.controller.MembershipController#listLevels()
  18450. Async:
  18451. Async started = false
  18452. Async result = null
  18453. Resolved Exception:
  18454. Type = null
  18455. ModelAndView:
  18456. View name = null
  18457. View = null
  18458. Model = null
  18459. FlashMap:
  18460. Attributes = null
  18461. MockHttpServletResponse:
  18462. Status = 200
  18463. Error message = null
  18464. Headers = [X-Request-Id:"PvLYB9bg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18465. Content type = application/json
  18466. Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976702284}
  18467. Forwarded URL = null
  18468. Redirected URL = null
  18469. Cookies = []
  18470. 15:18:22.288 DEBUG [K9PV6abE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled | IP: 127.0.0.1
  18471. 15:18:22.289 DEBUG [K9PV6abE] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Preparing: SELECT * FROM t_platform_config WHERE enabled = true ORDER BY priority ASC
  18472. 15:18:22.289 DEBUG [K9PV6abE] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Parameters:
  18473. 15:18:22.291 DEBUG [K9PV6abE] [] [ main] x.u.m.P.selectEnabledPlatforms : <== Total: 3
  18474. 15:18:22.291 DEBUG [K9PV6abE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled 200 3ms
  18475. MockHttpServletRequest:
  18476. HTTP Method = GET
  18477. Request URI = /api/platform-config/enabled
  18478. Parameters = {}
  18479. Headers = []
  18480. Body = null
  18481. Session Attrs = {}
  18482. Handler:
  18483. Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
  18484. Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getEnabledPlatforms()
  18485. Async:
  18486. Async started = false
  18487. Async result = null
  18488. Resolved Exception:
  18489. Type = null
  18490. ModelAndView:
  18491. View name = null
  18492. View = null
  18493. Model = null
  18494. FlashMap:
  18495. Attributes = null
  18496. MockHttpServletResponse:
  18497. Status = 200
  18498. Error message = null
  18499. Headers = [X-Request-Id:"K9PV6abE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18500. Content type = application/json
  18501. Body = {"code":200,"message":"操作成功","data":[{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:18:21","updateTime":"2026-07-02 15:18:21","createdBy":null,"updatedBy":null},{"id":2,"platformCode":"yaobangmang","platformName":"药帮忙","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":2,"underMaintenance":false,"maintenanceNotice":null,"description":"专业医药B2B采购平台","officialUrl":"https://www.yaobangmang.com","bindingInstructions":"请输入您在药帮忙的手机号和密码","sortOrder":2,"createTime":"2026-07-02 15:18:21","updateTime":"2026-07-02 15:18:21","createdBy":null,"updatedBy":null},{"id":3,"platformCode":"yiyaocheng","platformName":"1药城","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":3,"underMaintenance":false,"maintenanceNotice":null,"description":"1药网旗下B2B医药平台","officialUrl":"https://www.1yaocheng.com","bindingInstructions":"请输入您在1药城的手机号和密码","sortOrder":3,"createTime":"2026-07-02 15:18:21","updateTime":"2026-07-02 15:18:21","createdBy":null,"updatedBy":null}],"timestamp":1782976702291}
  18502. Forwarded URL = null
  18503. Redirected URL = null
  18504. Cookies = []
  18505. 15:18:22.295 DEBUG [r3CEZq9Y] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/callback | IP: 127.0.0.1
  18506. 15:18:22.296 DEBUG [r3CEZq9Y] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/callback 200 1ms
  18507. MockHttpServletRequest:
  18508. HTTP Method = GET
  18509. Request URI = /api/auth/wechat/callback
  18510. Parameters = {code=[test], state=[login]}
  18511. Headers = []
  18512. Body = null
  18513. Session Attrs = {}
  18514. Handler:
  18515. Type = com.xuekairui.user.controller.AuthController
  18516. Method = com.xuekairui.user.controller.AuthController#wechatCallback(String)
  18517. Async:
  18518. Async started = false
  18519. Async result = null
  18520. Resolved Exception:
  18521. Type = null
  18522. ModelAndView:
  18523. View name = null
  18524. View = null
  18525. Model = null
  18526. FlashMap:
  18527. Attributes = null
  18528. MockHttpServletResponse:
  18529. Status = 200
  18530. Error message = null
  18531. Headers = [X-Request-Id:"r3CEZq9Y", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18532. Content type = application/json
  18533. Body = {"code":200,"message":"操作成功","data":"https://your-domain.com/wechat-login?code=test","timestamp":1782976702295}
  18534. Forwarded URL = null
  18535. Redirected URL = null
  18536. Cookies = []
  18537. 15:18:22.299 DEBUG [H7pYmavA] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  18538. 15:18:22.300 INFO [H7pYmavA] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
  18539. 15:18:22.302 INFO [H7pYmavA] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
  18540. 15:18:22.302 DEBUG [H7pYmavA] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 3ms
  18541. MockHttpServletRequest:
  18542. HTTP Method = POST
  18543. Request URI = /api/auth/sms/send
  18544. Parameters = {}
  18545. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  18546. Body = {"phone":"13800138000","scene":"login"}
  18547. Session Attrs = {}
  18548. Handler:
  18549. Type = com.xuekairui.user.controller.AuthController
  18550. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  18551. Async:
  18552. Async started = false
  18553. Async result = null
  18554. Resolved Exception:
  18555. Type = null
  18556. ModelAndView:
  18557. View name = null
  18558. View = null
  18559. Model = null
  18560. FlashMap:
  18561. Attributes = null
  18562. MockHttpServletResponse:
  18563. Status = 200
  18564. Error message = null
  18565. Headers = [X-Request-Id:"H7pYmavA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18566. Content type = application/json
  18567. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976702302}
  18568. Forwarded URL = null
  18569. Redirected URL = null
  18570. Cookies = []
  18571. 15:18:22.306 DEBUG [EMRz69yu] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=app | IP: 127.0.0.1
  18572. 15:18:22.307 DEBUG [EMRz69yu] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  18573. 15:18:22.308 DEBUG [EMRz69yu] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  18574. 15:18:22.310 DEBUG [EMRz69yu] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  18575. 15:18:22.310 WARN [EMRz69yu] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  18576. 15:18:22.311 DEBUG [EMRz69yu] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=app 200 5ms
  18577. MockHttpServletRequest:
  18578. HTTP Method = GET
  18579. Request URI = /api/invite/page/TESTCODE
  18580. Parameters = {channel=[app]}
  18581. Headers = []
  18582. Body = null
  18583. Session Attrs = {}
  18584. Handler:
  18585. Type = com.xuekairui.invite.controller.InviteController
  18586. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  18587. Async:
  18588. Async started = false
  18589. Async result = null
  18590. Resolved Exception:
  18591. Type = com.xuekairui.common.BusinessException
  18592. ModelAndView:
  18593. View name = null
  18594. View = null
  18595. Model = null
  18596. FlashMap:
  18597. Attributes = null
  18598. MockHttpServletResponse:
  18599. Status = 200
  18600. Error message = null
  18601. Headers = [X-Request-Id:"EMRz69yu", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18602. Content type = application/json
  18603. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976702310}
  18604. Forwarded URL = null
  18605. Redirected URL = null
  18606. Cookies = []
  18607. 15:18:22.314 DEBUG [mqqSGJAs] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/1 | IP: 127.0.0.1
  18608. 15:18:22.316 DEBUG [mqqSGJAs] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  18609. 15:18:22.316 DEBUG [mqqSGJAs] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  18610. 15:18:22.317 DEBUG [mqqSGJAs] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  18611. 15:18:22.318 DEBUG [mqqSGJAs] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/1 200 4ms
  18612. MockHttpServletRequest:
  18613. HTTP Method = GET
  18614. Request URI = /api/membership/levels/1
  18615. Parameters = {}
  18616. Headers = []
  18617. Body = null
  18618. Session Attrs = {}
  18619. Handler:
  18620. Type = com.xuekairui.user.controller.MembershipController
  18621. Method = com.xuekairui.user.controller.MembershipController#getLevel(Long)
  18622. Async:
  18623. Async started = false
  18624. Async result = null
  18625. Resolved Exception:
  18626. Type = null
  18627. ModelAndView:
  18628. View name = null
  18629. View = null
  18630. Model = null
  18631. FlashMap:
  18632. Attributes = null
  18633. MockHttpServletResponse:
  18634. Status = 200
  18635. Error message = null
  18636. Headers = [X-Request-Id:"mqqSGJAs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18637. Content type = application/json
  18638. Body = {"code":200,"message":"操作成功","data":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},"timestamp":1782976702317}
  18639. Forwarded URL = null
  18640. Redirected URL = null
  18641. Cookies = []
  18642. 15:18:22.321 DEBUG [SQqvBCTz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE | IP: 127.0.0.1
  18643. 15:18:22.322 DEBUG [SQqvBCTz] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  18644. 15:18:22.322 DEBUG [SQqvBCTz] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  18645. 15:18:22.324 DEBUG [SQqvBCTz] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  18646. 15:18:22.325 DEBUG [SQqvBCTz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE 200 4ms
  18647. MockHttpServletRequest:
  18648. HTTP Method = POST
  18649. Request URI = /api/invite/click/TESTCODE
  18650. Parameters = {}
  18651. Headers = []
  18652. Body = null
  18653. Session Attrs = {}
  18654. Handler:
  18655. Type = com.xuekairui.invite.controller.InviteController
  18656. Method = com.xuekairui.invite.controller.InviteController#trackClick(String)
  18657. Async:
  18658. Async started = false
  18659. Async result = null
  18660. Resolved Exception:
  18661. Type = null
  18662. ModelAndView:
  18663. View name = null
  18664. View = null
  18665. Model = null
  18666. FlashMap:
  18667. Attributes = null
  18668. MockHttpServletResponse:
  18669. Status = 200
  18670. Error message = null
  18671. Headers = [X-Request-Id:"SQqvBCTz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18672. Content type = application/json
  18673. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976702324}
  18674. Forwarded URL = null
  18675. Redirected URL = null
  18676. Cookies = []
  18677. 15:18:22.328 DEBUG [A4KPtyJt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url | IP: 127.0.0.1
  18678. 15:18:22.329 DEBUG [A4KPtyJt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url 200 1ms
  18679. MockHttpServletRequest:
  18680. HTTP Method = GET
  18681. Request URI = /api/auth/wechat/url
  18682. Parameters = {}
  18683. Headers = []
  18684. Body = null
  18685. Session Attrs = {}
  18686. Handler:
  18687. Type = com.xuekairui.user.controller.AuthController
  18688. Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)
  18689. Async:
  18690. Async started = false
  18691. Async result = null
  18692. Resolved Exception:
  18693. Type = null
  18694. ModelAndView:
  18695. View name = null
  18696. View = null
  18697. Model = null
  18698. FlashMap:
  18699. Attributes = null
  18700. MockHttpServletResponse:
  18701. Status = 200
  18702. Error message = null
  18703. Headers = [X-Request-Id:"A4KPtyJt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18704. Content type = application/json
  18705. Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=login#wechat_redirect","timestamp":1782976702329}
  18706. Forwarded URL = null
  18707. Redirected URL = null
  18708. Cookies = []
  18709. 15:18:22.332 DEBUG [yECnyMJ9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE | IP: 127.0.0.1
  18710. 15:18:22.333 DEBUG [yECnyMJ9] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  18711. 15:18:22.333 DEBUG [yECnyMJ9] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
  18712. 15:18:22.335 DEBUG [yECnyMJ9] [] [ main] c.x.i.m.I.selectList : <== Total: 0
  18713. 15:18:22.336 WARN [yECnyMJ9] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
  18714. 15:18:22.336 DEBUG [yECnyMJ9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE 200 4ms
  18715. MockHttpServletRequest:
  18716. HTTP Method = GET
  18717. Request URI = /api/invite/page/TESTCODE
  18718. Parameters = {}
  18719. Headers = []
  18720. Body = null
  18721. Session Attrs = {}
  18722. Handler:
  18723. Type = com.xuekairui.invite.controller.InviteController
  18724. Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
  18725. Async:
  18726. Async started = false
  18727. Async result = null
  18728. Resolved Exception:
  18729. Type = com.xuekairui.common.BusinessException
  18730. ModelAndView:
  18731. View name = null
  18732. View = null
  18733. Model = null
  18734. FlashMap:
  18735. Attributes = null
  18736. MockHttpServletResponse:
  18737. Status = 200
  18738. Error message = null
  18739. Headers = [X-Request-Id:"yECnyMJ9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18740. Content type = application/json
  18741. Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976702336}
  18742. Forwarded URL = null
  18743. Redirected URL = null
  18744. Cookies = []
  18745. 15:18:22.340 DEBUG [dKzbx7V2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  18746. 15:18:22.343 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  18747. 15:18:22.343 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  18748. 15:18:22.345 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  18749. 15:18:22.345 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
  18750. 15:18:22.345 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:22.345307300(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:21(LocalDateTime), 2026-07-02T15:18:21(LocalDateTime), 1(Long)
  18751. 15:18:22.347 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  18752. 15:18:22.348 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  18753. 15:18:22.348 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:22.345307300(LocalDateTime), 127.0.0.1(String), 1(Long), 584cdce62be1097a7c5569ad85c2e42658c81ae83065c98f423e03a30b5efcca(String), ACTIVE(String), 2026-07-02T15:18:21(LocalDateTime), 2026-07-02T15:18:21(LocalDateTime), 1(Long)
  18754. 15:18:22.351 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  18755. 15:18:22.351 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  18756. 15:18:22.351 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  18757. 15:18:22.352 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  18758. 15:18:22.352 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  18759. 15:18:22.352 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  18760. 15:18:22.353 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  18761. 15:18:22.353 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  18762. 15:18:22.354 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  18763. 15:18:22.355 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  18764. 15:18:22.356 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  18765. 15:18:22.356 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580625049526274(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:22.356167800(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:22.356167800(LocalDateTime)
  18766. 15:18:22.359 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  18767. 15:18:22.359 DEBUG [dKzbx7V2] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  18768. 15:18:22.429 DEBUG [dKzbx7V2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 89ms
  18769. MockHttpServletRequest:
  18770. HTTP Method = POST
  18771. Request URI = /api/auth/sms/login
  18772. Parameters = {}
  18773. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  18774. Body = {"phone":"13800138000","code":"123456"}
  18775. Session Attrs = {}
  18776. Handler:
  18777. Type = com.xuekairui.user.controller.AuthController
  18778. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  18779. Async:
  18780. Async started = false
  18781. Async result = null
  18782. Resolved Exception:
  18783. Type = null
  18784. ModelAndView:
  18785. View name = null
  18786. View = null
  18787. Model = null
  18788. FlashMap:
  18789. Attributes = null
  18790. MockHttpServletResponse:
  18791. Status = 200
  18792. Error message = null
  18793. Headers = [X-Request-Id:"dKzbx7V2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18794. Content type = application/json
  18795. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwMiwiZXhwIjoxNzgzMDYzMTAyfQ.YPwWBl4z33iNxLMPtxdqqSIu-B1MjUmjFC4ycglbpWlZVLP8ccTAV7oP7DCaA6pGkGZIh5R2PavrAKhDGEdaZA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwMiwiZXhwIjoxNzgzNTgxNTAyfQ.EGhjQrMi4Xl2n_1yU1w6aQqkHvmTvTlgS6zX7GnQVA1GCp9Bbr06N8Gu7qbsywlD8R6-jKnsS9kyA43dcqNO7Q","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:21","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976702427}
  18796. Forwarded URL = null
  18797. Redirected URL = null
  18798. Cookies = []
  18799. 15:18:22.433 DEBUG [FCtDnWGc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active | IP: 127.0.0.1
  18800. 15:18:22.434 DEBUG [FCtDnWGc] [] [ main] .m.T.selectActiveDefaultConfig : ==> Preparing: SELECT * FROM t_trial_quota_config WHERE config_type = 'DEFAULT' AND enabled = true AND (effective_from IS NULL OR effective_from <= ?) AND (effective_to IS NULL OR effective_to >= ?) ORDER BY create_time DESC LIMIT 1
  18801. 15:18:22.434 DEBUG [FCtDnWGc] [] [ main] .m.T.selectActiveDefaultConfig : ==> Parameters: 2026-07-02T15:18:22.434347300(LocalDateTime), 2026-07-02T15:18:22.434347300(LocalDateTime)
  18802. 15:18:22.437 DEBUG [FCtDnWGc] [] [ main] .m.T.selectActiveDefaultConfig : <== Total: 0
  18803. 15:18:22.437 WARN [FCtDnWGc] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=无生效中的体验配额配置
  18804. 15:18:22.438 DEBUG [FCtDnWGc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active 200 5ms
  18805. MockHttpServletRequest:
  18806. HTTP Method = GET
  18807. Request URI = /api/trial-quota/active
  18808. Parameters = {}
  18809. Headers = []
  18810. Body = null
  18811. Session Attrs = {}
  18812. Handler:
  18813. Type = com.xuekairui.user.controller.TrialQuotaConfigController
  18814. Method = com.xuekairui.user.controller.TrialQuotaConfigController#getActiveConfig()
  18815. Async:
  18816. Async started = false
  18817. Async result = null
  18818. Resolved Exception:
  18819. Type = com.xuekairui.common.BusinessException
  18820. ModelAndView:
  18821. View name = null
  18822. View = null
  18823. Model = null
  18824. FlashMap:
  18825. Attributes = null
  18826. MockHttpServletResponse:
  18827. Status = 200
  18828. Error message = null
  18829. Headers = [X-Request-Id:"FCtDnWGc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18830. Content type = application/json
  18831. Body = {"code":404,"message":"无生效中的体验配额配置","data":null,"timestamp":1782976702438}
  18832. Forwarded URL = null
  18833. Redirected URL = null
  18834. Cookies = []
  18835. [INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.174 s -- in 公开接口(无需 Token)
  18836. [INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.392 s -- in 安全访问控制测试
  18837. [INFO] Running 体验配额配置接口测试
  18838. 15:18:22.442 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.TrialQuotaConfigTest]: TrialQuotaConfigTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  18839. 15:18:22.443 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.TrialQuotaConfigTest
  18840. 15:18:25.826 DEBUG [NH6vSrDf] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active | IP: 127.0.0.1
  18841. 15:18:25.827 DEBUG [NH6vSrDf] [] [ main] .m.T.selectActiveDefaultConfig : ==> Preparing: SELECT * FROM t_trial_quota_config WHERE config_type = 'DEFAULT' AND enabled = true AND (effective_from IS NULL OR effective_from <= ?) AND (effective_to IS NULL OR effective_to >= ?) ORDER BY create_time DESC LIMIT 1
  18842. 15:18:25.827 DEBUG [NH6vSrDf] [] [ main] .m.T.selectActiveDefaultConfig : ==> Parameters: 2026-07-02T15:18:25.827477100(LocalDateTime), 2026-07-02T15:18:25.827477100(LocalDateTime)
  18843. 15:18:25.830 DEBUG [NH6vSrDf] [] [ main] .m.T.selectActiveDefaultConfig : <== Total: 0
  18844. 15:18:25.830 WARN [NH6vSrDf] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=无生效中的体验配额配置
  18845. 15:18:25.830 DEBUG [NH6vSrDf] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active 200 4ms
  18846. MockHttpServletRequest:
  18847. HTTP Method = GET
  18848. Request URI = /api/trial-quota/active
  18849. Parameters = {}
  18850. Headers = []
  18851. Body = null
  18852. Session Attrs = {}
  18853. Handler:
  18854. Type = com.xuekairui.user.controller.TrialQuotaConfigController
  18855. Method = com.xuekairui.user.controller.TrialQuotaConfigController#getActiveConfig()
  18856. Async:
  18857. Async started = false
  18858. Async result = null
  18859. Resolved Exception:
  18860. Type = com.xuekairui.common.BusinessException
  18861. ModelAndView:
  18862. View name = null
  18863. View = null
  18864. Model = null
  18865. FlashMap:
  18866. Attributes = null
  18867. MockHttpServletResponse:
  18868. Status = 200
  18869. Error message = null
  18870. Headers = [X-Request-Id:"NH6vSrDf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18871. Content type = application/json
  18872. Body = {"code":404,"message":"无生效中的体验配额配置","data":null,"timestamp":1782976705830}
  18873. Forwarded URL = null
  18874. Redirected URL = null
  18875. Cookies = []
  18876. 15:18:25.835 DEBUG [pVKhsG8F] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs | IP: 127.0.0.1
  18877. 15:18:25.836 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  18878. 15:18:25.836 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  18879. 15:18:25.838 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  18880. 15:18:25.839 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.T.selectList : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config ORDER BY create_time DESC
  18881. 15:18:25.839 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.T.selectList : ==> Parameters:
  18882. 15:18:25.840 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.T.selectList : <== Total: 0
  18883. 15:18:25.841 DEBUG [pVKhsG8F] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs 200 6ms
  18884. MockHttpServletRequest:
  18885. HTTP Method = GET
  18886. Request URI = /api/admin/trial-quota/configs
  18887. Parameters = {}
  18888. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA"]
  18889. Body = null
  18890. Session Attrs = {}
  18891. Handler:
  18892. Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
  18893. Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#listConfigs()
  18894. Async:
  18895. Async started = false
  18896. Async result = null
  18897. Resolved Exception:
  18898. Type = null
  18899. ModelAndView:
  18900. View name = null
  18901. View = null
  18902. Model = null
  18903. FlashMap:
  18904. Attributes = null
  18905. MockHttpServletResponse:
  18906. Status = 200
  18907. Error message = null
  18908. Headers = [X-Request-Id:"pVKhsG8F", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18909. Content type = application/json
  18910. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976705841}
  18911. Forwarded URL = null
  18912. Redirected URL = null
  18913. Cookies = []
  18914. 15:18:25.843 DEBUG [c9kaQqFg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs | IP: 127.0.0.1
  18915. 15:18:25.845 WARN [c9kaQqFg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs 401 2ms
  18916. MockHttpServletRequest:
  18917. HTTP Method = GET
  18918. Request URI = /api/admin/trial-quota/configs
  18919. Parameters = {}
  18920. Headers = []
  18921. Body = null
  18922. Session Attrs = {}
  18923. Handler:
  18924. Type = null
  18925. Async:
  18926. Async started = false
  18927. Async result = null
  18928. Resolved Exception:
  18929. Type = null
  18930. ModelAndView:
  18931. View name = null
  18932. View = null
  18933. Model = null
  18934. FlashMap:
  18935. Attributes = null
  18936. MockHttpServletResponse:
  18937. Status = 401
  18938. Error message = null
  18939. Headers = [X-Request-Id:"c9kaQqFg", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18940. Content type = application/json;charset=UTF-8
  18941. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976705844}
  18942. Forwarded URL = null
  18943. Redirected URL = null
  18944. Cookies = []
  18945. 15:18:25.849 DEBUG [nLYVV8M6] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
  18946. 15:18:25.850 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  18947. 15:18:25.850 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  18948. 15:18:25.851 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  18949. 15:18:25.855 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.T.insert : ==> Preparing: INSERT INTO t_trial_quota_config ( config_name, trial_days, daily_query_limit, monthly_watchlist_limit, enabled, config_type, applicable_user_type, current_users, priority, description, created_by, updated_by, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  18950. 15:18:25.855 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.T.insert : ==> Parameters: 测试体验配置(String), 15(Integer), 30(Integer), 200(Integer), true(Boolean), DEFAULT(String), NEW_USER(String), 0(Integer), 1(Integer), 自动化测试创建的配置(String), 1(Long), 1(Long), 2026-07-02T15:18:25.855010600(LocalDateTime), 2026-07-02T15:18:25.855010600(LocalDateTime)
  18951. 15:18:25.859 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.T.insert : <== Updates: 1
  18952. 15:18:25.859 INFO [nLYVV8M6] [1] [ main] .x.u.s.TrialQuotaConfigService : 创建体验配额配置: id=1, name=测试体验配置
  18953. 15:18:25.860 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  18954. 15:18:25.860 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580639700230145(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.860387500(LocalDateTime), TRIAL(String), CONFIG_CREATE(String), 创建体验配额配置(String), TRIAL_CONFIG(String), 1(Long), TRIAL_CONFIG:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.860387500(LocalDateTime)
  18955. 15:18:25.865 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  18956. 15:18:25.865 WARN [nLYVV8M6] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】创建体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:1, 结果: SUCCESS
  18957. 15:18:25.865 DEBUG [nLYVV8M6] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 创建体验配额配置
  18958. 15:18:25.866 DEBUG [nLYVV8M6] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 200 17ms
  18959. MockHttpServletRequest:
  18960. HTTP Method = POST
  18961. Request URI = /api/admin/trial-quota/config
  18962. Parameters = {}
  18963. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"285"]
  18964. Body = {
  18965. "configName": "测试体验配置",
  18966. "trialDays": 15,
  18967. "dailyQueryLimit": 30,
  18968. "monthlyWatchlistLimit": 200,
  18969. "enabled": true,
  18970. "configType": "DEFAULT",
  18971. "applicableUserType": "NEW_USER",
  18972. "priority": 1,
  18973. "description": "自动化测试创建的配置"
  18974. }
  18975. Session Attrs = {}
  18976. Handler:
  18977. Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
  18978. Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#createConfig(TrialQuotaConfig, HttpServletRequest)
  18979. Async:
  18980. Async started = false
  18981. Async result = null
  18982. Resolved Exception:
  18983. Type = null
  18984. ModelAndView:
  18985. View name = null
  18986. View = null
  18987. Model = null
  18988. FlashMap:
  18989. Attributes = null
  18990. MockHttpServletResponse:
  18991. Status = 200
  18992. Error message = null
  18993. Headers = [X-Request-Id:"nLYVV8M6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  18994. Content type = application/json
  18995. Body = {"code":200,"message":"操作成功","data":{"id":1,"configName":"测试体验配置","trialDays":15,"dailyQueryLimit":30,"monthlyWatchlistLimit":200,"enabled":true,"configType":"DEFAULT","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":1,"description":"自动化测试创建的配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:25","updateTime":"2026-07-02 15:18:25"},"timestamp":1782976705865}
  18996. Forwarded URL = null
  18997. Redirected URL = null
  18998. Cookies = []
  18999. 15:18:25.872 DEBUG [AfZFST97] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
  19000. 15:18:25.872 DEBUG [AfZFST97] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19001. 15:18:25.872 DEBUG [AfZFST97] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  19002. 15:18:25.874 DEBUG [AfZFST97] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19003. 15:18:25.875 DEBUG [AfZFST97] [1] [ main] c.x.u.m.T.insert : ==> Preparing: INSERT INTO t_trial_quota_config ( config_name, trial_days, daily_query_limit, monthly_watchlist_limit, enabled, config_type, applicable_user_type, max_users, current_users, priority, description, created_by, updated_by, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19004. 15:18:25.875 DEBUG [AfZFST97] [1] [ main] c.x.u.m.T.insert : ==> Parameters: 618活动体验配置(String), 30(Integer), 50(Integer), 500(Integer), true(Boolean), ACTIVITY(String), ALL(String), 1000(Integer), 0(Integer), 10(Integer), 618活动专属体验配置(String), 1(Long), 1(Long), 2026-07-02T15:18:25.875418800(LocalDateTime), 2026-07-02T15:18:25.875418800(LocalDateTime)
  19005. 15:18:25.880 DEBUG [AfZFST97] [1] [ main] c.x.u.m.T.insert : <== Updates: 1
  19006. 15:18:25.880 INFO [AfZFST97] [1] [ main] .x.u.s.TrialQuotaConfigService : 创建体验配额配置: id=2, name=618活动体验配置
  19007. 15:18:25.881 DEBUG [AfZFST97] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19008. 15:18:25.881 DEBUG [AfZFST97] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580639830253570(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.880758500(LocalDateTime), TRIAL(String), CONFIG_CREATE(String), 创建体验配额配置(String), TRIAL_CONFIG(String), 2(Long), TRIAL_CONFIG:2(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.881291700(LocalDateTime)
  19009. 15:18:25.885 DEBUG [AfZFST97] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  19010. 15:18:25.885 WARN [AfZFST97] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】创建体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:2, 结果: SUCCESS
  19011. 15:18:25.885 DEBUG [AfZFST97] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 创建体验配额配置
  19012. 15:18:25.886 DEBUG [AfZFST97] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 200 14ms
  19013. MockHttpServletRequest:
  19014. HTTP Method = POST
  19015. Request URI = /api/admin/trial-quota/config
  19016. Parameters = {}
  19017. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"304"]
  19018. Body = {
  19019. "configName": "618活动体验配置",
  19020. "trialDays": 30,
  19021. "dailyQueryLimit": 50,
  19022. "monthlyWatchlistLimit": 500,
  19023. "enabled": true,
  19024. "configType": "ACTIVITY",
  19025. "applicableUserType": "ALL",
  19026. "priority": 10,
  19027. "maxUsers": 1000,
  19028. "description": "618活动专属体验配置"
  19029. }
  19030. Session Attrs = {}
  19031. Handler:
  19032. Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
  19033. Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#createConfig(TrialQuotaConfig, HttpServletRequest)
  19034. Async:
  19035. Async started = false
  19036. Async result = null
  19037. Resolved Exception:
  19038. Type = null
  19039. ModelAndView:
  19040. View name = null
  19041. View = null
  19042. Model = null
  19043. FlashMap:
  19044. Attributes = null
  19045. MockHttpServletResponse:
  19046. Status = 200
  19047. Error message = null
  19048. Headers = [X-Request-Id:"AfZFST97", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19049. Content type = application/json
  19050. Body = {"code":200,"message":"操作成功","data":{"id":2,"configName":"618活动体验配置","trialDays":30,"dailyQueryLimit":50,"monthlyWatchlistLimit":500,"enabled":true,"configType":"ACTIVITY","applicableUserType":"ALL","effectiveFrom":null,"effectiveTo":null,"maxUsers":1000,"currentUsers":0,"priority":10,"description":"618活动专属体验配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:25","updateTime":"2026-07-02 15:18:25"},"timestamp":1782976705885}
  19051. Forwarded URL = null
  19052. Redirected URL = null
  19053. Cookies = []
  19054. 15:18:25.889 DEBUG [gVbCASGV] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
  19055. 15:18:25.891 WARN [gVbCASGV] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 401 2ms
  19056. MockHttpServletRequest:
  19057. HTTP Method = POST
  19058. Request URI = /api/admin/trial-quota/config
  19059. Parameters = {}
  19060. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  19061. Body = {}
  19062. Session Attrs = {}
  19063. Handler:
  19064. Type = null
  19065. Async:
  19066. Async started = false
  19067. Async result = null
  19068. Resolved Exception:
  19069. Type = null
  19070. ModelAndView:
  19071. View name = null
  19072. View = null
  19073. Model = null
  19074. FlashMap:
  19075. Attributes = null
  19076. MockHttpServletResponse:
  19077. Status = 401
  19078. Error message = null
  19079. Headers = [X-Request-Id:"gVbCASGV", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19080. Content type = application/json;charset=UTF-8
  19081. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976705890}
  19082. Forwarded URL = null
  19083. Redirected URL = null
  19084. Cookies = []
  19085. 15:18:25.896 DEBUG [wnRyUL9v] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 | IP: 127.0.0.1
  19086. 15:18:25.897 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19087. 15:18:25.897 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  19088. 15:18:25.898 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19089. 15:18:25.900 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
  19090. 15:18:25.900 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 1(Long)
  19091. 15:18:25.902 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : <== Total: 1
  19092. 15:18:25.904 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.updateById : ==> Preparing: UPDATE t_trial_quota_config SET config_name=?, trial_days=?, daily_query_limit=?, monthly_watchlist_limit=?, enabled=?, config_type=?, applicable_user_type=?, priority=?, description=?, updated_by=?, update_time=? WHERE id=?
  19093. 15:18:25.904 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.updateById : ==> Parameters: 测试体验配置(已更新)(String), 20(Integer), 40(Integer), 300(Integer), true(Boolean), DEFAULT(String), NEW_USER(String), 2(Integer), 更新后的配置(String), 1(Long), 2026-07-02T15:18:25.904166600(LocalDateTime), 1(Long)
  19094. 15:18:25.908 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.updateById : <== Updates: 1
  19095. 15:18:25.908 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
  19096. 15:18:25.908 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 1(Long)
  19097. 15:18:25.910 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : <== Total: 1
  19098. 15:18:25.911 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19099. 15:18:25.911 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580639960276993(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.911296700(LocalDateTime), TRIAL(String), CONFIG_UPDATE(String), 更新体验配额配置(String), TRIAL_CONFIG(String), 1(Long), TRIAL_CONFIG:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.911296700(LocalDateTime)
  19100. 15:18:25.916 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  19101. 15:18:25.916 WARN [wnRyUL9v] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】更新体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:1, 结果: SUCCESS
  19102. 15:18:25.916 DEBUG [wnRyUL9v] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 更新体验配额配置
  19103. 15:18:25.916 DEBUG [wnRyUL9v] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 200 20ms
  19104. MockHttpServletRequest:
  19105. HTTP Method = PUT
  19106. Request URI = /api/admin/trial-quota/config/1
  19107. Parameters = {}
  19108. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"288"]
  19109. Body = {
  19110. "configName": "测试体验配置(已更新)",
  19111. "trialDays": 20,
  19112. "dailyQueryLimit": 40,
  19113. "monthlyWatchlistLimit": 300,
  19114. "enabled": true,
  19115. "configType": "DEFAULT",
  19116. "applicableUserType": "NEW_USER",
  19117. "priority": 2,
  19118. "description": "更新后的配置"
  19119. }
  19120. Session Attrs = {}
  19121. Handler:
  19122. Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
  19123. Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#updateConfig(Long, TrialQuotaConfig, HttpServletRequest)
  19124. Async:
  19125. Async started = false
  19126. Async result = null
  19127. Resolved Exception:
  19128. Type = null
  19129. ModelAndView:
  19130. View name = null
  19131. View = null
  19132. Model = null
  19133. FlashMap:
  19134. Attributes = null
  19135. MockHttpServletResponse:
  19136. Status = 200
  19137. Error message = null
  19138. Headers = [X-Request-Id:"wnRyUL9v", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19139. Content type = application/json
  19140. Body = {"code":200,"message":"操作成功","data":{"id":1,"configName":"测试体验配置(已更新)","trialDays":20,"dailyQueryLimit":40,"monthlyWatchlistLimit":300,"enabled":true,"configType":"DEFAULT","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":2,"description":"更新后的配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:26","updateTime":"2026-07-02 15:18:26"},"timestamp":1782976705916}
  19141. Forwarded URL = null
  19142. Redirected URL = null
  19143. Cookies = []
  19144. 15:18:25.922 DEBUG [CtA77fKC] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/9999 | IP: 127.0.0.1
  19145. 15:18:25.922 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19146. 15:18:25.923 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  19147. 15:18:25.924 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19148. 15:18:25.925 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
  19149. 15:18:25.925 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 9999(Long)
  19150. 15:18:25.927 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.T.selectById : <== Total: 0
  19151. 15:18:25.928 WARN [CtA77fKC] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=体验配额配置不存在
  19152. 15:18:25.928 DEBUG [CtA77fKC] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/9999 200 6ms
  19153. MockHttpServletRequest:
  19154. HTTP Method = PUT
  19155. Request URI = /api/admin/trial-quota/config/9999
  19156. Parameters = {}
  19157. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"213"]
  19158. Body = {
  19159. "configName": "不存在的配置",
  19160. "trialDays": 15,
  19161. "dailyQueryLimit": 20,
  19162. "monthlyWatchlistLimit": 100,
  19163. "enabled": true,
  19164. "configType": "DEFAULT",
  19165. "applicableUserType": "NEW_USER"
  19166. }
  19167. Session Attrs = {}
  19168. Handler:
  19169. Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
  19170. Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#updateConfig(Long, TrialQuotaConfig, HttpServletRequest)
  19171. Async:
  19172. Async started = false
  19173. Async result = null
  19174. Resolved Exception:
  19175. Type = com.xuekairui.common.BusinessException
  19176. ModelAndView:
  19177. View name = null
  19178. View = null
  19179. Model = null
  19180. FlashMap:
  19181. Attributes = null
  19182. MockHttpServletResponse:
  19183. Status = 200
  19184. Error message = null
  19185. Headers = [X-Request-Id:"CtA77fKC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19186. Content type = application/json
  19187. Body = {"code":404,"message":"体验配额配置不存在","data":null,"timestamp":1782976705928}
  19188. Forwarded URL = null
  19189. Redirected URL = null
  19190. Cookies = []
  19191. 15:18:25.931 DEBUG [JPUPEeF4] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 | IP: 127.0.0.1
  19192. 15:18:25.933 WARN [JPUPEeF4] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 401 2ms
  19193. MockHttpServletRequest:
  19194. HTTP Method = PUT
  19195. Request URI = /api/admin/trial-quota/config/1
  19196. Parameters = {}
  19197. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
  19198. Body = {}
  19199. Session Attrs = {}
  19200. Handler:
  19201. Type = null
  19202. Async:
  19203. Async started = false
  19204. Async result = null
  19205. Resolved Exception:
  19206. Type = null
  19207. ModelAndView:
  19208. View name = null
  19209. View = null
  19210. Model = null
  19211. FlashMap:
  19212. Attributes = null
  19213. MockHttpServletResponse:
  19214. Status = 401
  19215. Error message = null
  19216. Headers = [X-Request-Id:"JPUPEeF4", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19217. Content type = application/json;charset=UTF-8
  19218. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976705933}
  19219. Forwarded URL = null
  19220. Redirected URL = null
  19221. Cookies = []
  19222. 15:18:25.938 DEBUG [S2Qx5MXr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
  19223. 15:18:25.938 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19224. 15:18:25.938 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  19225. 15:18:25.941 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19226. 15:18:25.942 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.T.insert : ==> Preparing: INSERT INTO t_trial_quota_config ( config_name, trial_days, daily_query_limit, monthly_watchlist_limit, enabled, config_type, applicable_user_type, current_users, priority, description, created_by, updated_by, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19227. 15:18:25.942 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.T.insert : ==> Parameters: 待删除配置(String), 7(Integer), 10(Integer), 50(Integer), true(Boolean), COUPON(String), NEW_USER(String), 0(Integer), 99(Integer), 此配置将被删除(String), 1(Long), 1(Long), 2026-07-02T15:18:25.942390800(LocalDateTime), 2026-07-02T15:18:25.942390800(LocalDateTime)
  19228. 15:18:25.948 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.T.insert : <== Updates: 1
  19229. 15:18:25.948 INFO [S2Qx5MXr] [1] [ main] .x.u.s.TrialQuotaConfigService : 创建体验配额配置: id=3, name=待删除配置
  19230. 15:18:25.948 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19231. 15:18:25.949 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580640090300417(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.948758600(LocalDateTime), TRIAL(String), CONFIG_CREATE(String), 创建体验配额配置(String), TRIAL_CONFIG(String), 3(Long), TRIAL_CONFIG:3(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.948758600(LocalDateTime)
  19232. 15:18:25.954 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  19233. 15:18:25.954 WARN [S2Qx5MXr] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】创建体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:3, 结果: SUCCESS
  19234. 15:18:25.954 DEBUG [S2Qx5MXr] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 创建体验配额配置
  19235. 15:18:25.955 DEBUG [S2Qx5MXr] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 200 17ms
  19236. MockHttpServletRequest:
  19237. HTTP Method = POST
  19238. Request URI = /api/admin/trial-quota/config
  19239. Parameters = {}
  19240. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"271"]
  19241. Body = {
  19242. "configName": "待删除配置",
  19243. "trialDays": 7,
  19244. "dailyQueryLimit": 10,
  19245. "monthlyWatchlistLimit": 50,
  19246. "enabled": true,
  19247. "configType": "COUPON",
  19248. "applicableUserType": "NEW_USER",
  19249. "priority": 99,
  19250. "description": "此配置将被删除"
  19251. }
  19252. Session Attrs = {}
  19253. Handler:
  19254. Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
  19255. Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#createConfig(TrialQuotaConfig, HttpServletRequest)
  19256. Async:
  19257. Async started = false
  19258. Async result = null
  19259. Resolved Exception:
  19260. Type = null
  19261. ModelAndView:
  19262. View name = null
  19263. View = null
  19264. Model = null
  19265. FlashMap:
  19266. Attributes = null
  19267. MockHttpServletResponse:
  19268. Status = 200
  19269. Error message = null
  19270. Headers = [X-Request-Id:"S2Qx5MXr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19271. Content type = application/json
  19272. Body = {"code":200,"message":"操作成功","data":{"id":3,"configName":"待删除配置","trialDays":7,"dailyQueryLimit":10,"monthlyWatchlistLimit":50,"enabled":true,"configType":"COUPON","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":99,"description":"此配置将被删除","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:25","updateTime":"2026-07-02 15:18:25"},"timestamp":1782976705954}
  19273. Forwarded URL = null
  19274. Redirected URL = null
  19275. Cookies = []
  19276. 15:18:25.958 DEBUG [24mTnQRn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/3 | IP: 127.0.0.1
  19277. 15:18:25.959 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
  19278. 15:18:25.959 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 3(Long)
  19279. 15:18:25.960 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.selectById : <== Total: 1
  19280. 15:18:25.961 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.deleteById : ==> Preparing: DELETE FROM t_trial_quota_config WHERE id=?
  19281. 15:18:25.961 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.deleteById : ==> Parameters: 3(Long)
  19282. 15:18:25.966 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.deleteById : <== Updates: 1
  19283. 15:18:25.966 INFO [24mTnQRn] [1] [ main] .x.u.s.TrialQuotaConfigService : 删除体验配额配置: id=3
  19284. 15:18:25.967 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19285. 15:18:25.967 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580640153214977(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.966552800(LocalDateTime), TRIAL(String), CONFIG_DELETE(String), 删除体验配额配置(String), TRIAL_CONFIG(String), 3(Long), TRIAL_CONFIG:3(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.967078100(LocalDateTime)
  19286. 15:18:25.972 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  19287. 15:18:25.972 WARN [24mTnQRn] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】删除体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:3, 结果: SUCCESS
  19288. 15:18:25.972 DEBUG [24mTnQRn] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 删除体验配额配置
  19289. 15:18:25.973 DEBUG [24mTnQRn] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/3 200 15ms
  19290. MockHttpServletRequest:
  19291. HTTP Method = DELETE
  19292. Request URI = /api/admin/trial-quota/config/3
  19293. Parameters = {}
  19294. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA"]
  19295. Body = null
  19296. Session Attrs = {}
  19297. Handler:
  19298. Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
  19299. Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#deleteConfig(Long, HttpServletRequest)
  19300. Async:
  19301. Async started = false
  19302. Async result = null
  19303. Resolved Exception:
  19304. Type = null
  19305. ModelAndView:
  19306. View name = null
  19307. View = null
  19308. Model = null
  19309. FlashMap:
  19310. Attributes = null
  19311. MockHttpServletResponse:
  19312. Status = 200
  19313. Error message = null
  19314. Headers = [X-Request-Id:"24mTnQRn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19315. Content type = application/json
  19316. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976705972}
  19317. Forwarded URL = null
  19318. Redirected URL = null
  19319. Cookies = []
  19320. 15:18:25.978 DEBUG [Hf8fM7W8] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/9999 | IP: 127.0.0.1
  19321. 15:18:25.979 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19322. 15:18:25.979 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  19323. 15:18:25.981 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19324. 15:18:25.982 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
  19325. 15:18:25.982 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 9999(Long)
  19326. 15:18:25.984 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.T.selectById : <== Total: 0
  19327. 15:18:25.984 WARN [Hf8fM7W8] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=体验配额配置不存在
  19328. 15:18:25.985 DEBUG [Hf8fM7W8] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/9999 200 7ms
  19329. MockHttpServletRequest:
  19330. HTTP Method = DELETE
  19331. Request URI = /api/admin/trial-quota/config/9999
  19332. Parameters = {}
  19333. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA"]
  19334. Body = null
  19335. Session Attrs = {}
  19336. Handler:
  19337. Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
  19338. Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#deleteConfig(Long, HttpServletRequest)
  19339. Async:
  19340. Async started = false
  19341. Async result = null
  19342. Resolved Exception:
  19343. Type = com.xuekairui.common.BusinessException
  19344. ModelAndView:
  19345. View name = null
  19346. View = null
  19347. Model = null
  19348. FlashMap:
  19349. Attributes = null
  19350. MockHttpServletResponse:
  19351. Status = 200
  19352. Error message = null
  19353. Headers = [X-Request-Id:"Hf8fM7W8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19354. Content type = application/json
  19355. Body = {"code":404,"message":"体验配额配置不存在","data":null,"timestamp":1782976705984}
  19356. Forwarded URL = null
  19357. Redirected URL = null
  19358. Cookies = []
  19359. 15:18:25.989 DEBUG [SXHR5LJV] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/1 | IP: 127.0.0.1
  19360. 15:18:25.991 WARN [SXHR5LJV] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/1 401 2ms
  19361. MockHttpServletRequest:
  19362. HTTP Method = DELETE
  19363. Request URI = /api/admin/trial-quota/config/1
  19364. Parameters = {}
  19365. Headers = []
  19366. Body = null
  19367. Session Attrs = {}
  19368. Handler:
  19369. Type = null
  19370. Async:
  19371. Async started = false
  19372. Async result = null
  19373. Resolved Exception:
  19374. Type = null
  19375. ModelAndView:
  19376. View name = null
  19377. View = null
  19378. Model = null
  19379. FlashMap:
  19380. Attributes = null
  19381. MockHttpServletResponse:
  19382. Status = 401
  19383. Error message = null
  19384. Headers = [X-Request-Id:"SXHR5LJV", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19385. Content type = application/json;charset=UTF-8
  19386. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976705990}
  19387. Forwarded URL = null
  19388. Redirected URL = null
  19389. Cookies = []
  19390. 15:18:25.995 DEBUG [Yg7eMtMC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active | IP: 127.0.0.1
  19391. 15:18:25.996 DEBUG [Yg7eMtMC] [] [ main] .m.T.selectActiveDefaultConfig : ==> Preparing: SELECT * FROM t_trial_quota_config WHERE config_type = 'DEFAULT' AND enabled = true AND (effective_from IS NULL OR effective_from <= ?) AND (effective_to IS NULL OR effective_to >= ?) ORDER BY create_time DESC LIMIT 1
  19392. 15:18:25.996 DEBUG [Yg7eMtMC] [] [ main] .m.T.selectActiveDefaultConfig : ==> Parameters: 2026-07-02T15:18:25.996190900(LocalDateTime), 2026-07-02T15:18:25.996190900(LocalDateTime)
  19393. 15:18:25.998 DEBUG [Yg7eMtMC] [] [ main] .m.T.selectActiveDefaultConfig : <== Total: 1
  19394. 15:18:26.000 DEBUG [Yg7eMtMC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active 200 5ms
  19395. MockHttpServletRequest:
  19396. HTTP Method = GET
  19397. Request URI = /api/trial-quota/active
  19398. Parameters = {}
  19399. Headers = []
  19400. Body = null
  19401. Session Attrs = {}
  19402. Handler:
  19403. Type = com.xuekairui.user.controller.TrialQuotaConfigController
  19404. Method = com.xuekairui.user.controller.TrialQuotaConfigController#getActiveConfig()
  19405. Async:
  19406. Async started = false
  19407. Async result = null
  19408. Resolved Exception:
  19409. Type = null
  19410. ModelAndView:
  19411. View name = null
  19412. View = null
  19413. Model = null
  19414. FlashMap:
  19415. Attributes = null
  19416. MockHttpServletResponse:
  19417. Status = 200
  19418. Error message = null
  19419. Headers = [X-Request-Id:"Yg7eMtMC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19420. Content type = application/json
  19421. Body = {"code":200,"message":"操作成功","data":{"id":1,"configName":"测试体验配置(已更新)","trialDays":20,"dailyQueryLimit":40,"monthlyWatchlistLimit":300,"enabled":true,"configType":"DEFAULT","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":2,"description":"更新后的配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:26","updateTime":"2026-07-02 15:18:26"},"timestamp":1782976705998}
  19422. Forwarded URL = null
  19423. Redirected URL = null
  19424. Cookies = []
  19425. [INFO] Tests run: 13, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.561 s -- in 体验配额配置接口测试
  19426. [INFO] Running com.xuekairui.gateway.UserAuthFlowTest
  19427. 15:18:26.003 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.UserAuthFlowTest]: UserAuthFlowTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  19428. 15:18:26.005 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.UserAuthFlowTest
  19429. 15:18:28.973 DEBUG [r2cseZzj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
  19430. 15:18:28.974 INFO [r2cseZzj] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
  19431. 15:18:28.976 INFO [r2cseZzj] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
  19432. 15:18:28.976 DEBUG [r2cseZzj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 3ms
  19433. MockHttpServletRequest:
  19434. HTTP Method = POST
  19435. Request URI = /api/auth/sms/send
  19436. Parameters = {}
  19437. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
  19438. Body = {"phone":"13800138000","scene":"login"}
  19439. Session Attrs = {}
  19440. Handler:
  19441. Type = com.xuekairui.user.controller.AuthController
  19442. Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
  19443. Async:
  19444. Async started = false
  19445. Async result = null
  19446. Resolved Exception:
  19447. Type = null
  19448. ModelAndView:
  19449. View name = null
  19450. View = null
  19451. Model = null
  19452. FlashMap:
  19453. Attributes = null
  19454. MockHttpServletResponse:
  19455. Status = 200
  19456. Error message = null
  19457. Headers = [X-Request-Id:"r2cseZzj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19458. Content type = application/json
  19459. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976708976}
  19460. Forwarded URL = null
  19461. Redirected URL = null
  19462. Cookies = []
  19463. 15:18:28.976 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 短信验证码发送成功: 13800138000
  19464. 15:18:28.980 DEBUG [EQY2kT3x] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  19465. 15:18:28.983 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  19466. 15:18:28.983 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13811111111(String)
  19467. 15:18:28.984 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
  19468. 15:18:28.985 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, phone, nickname, login_source, status, role, membership_level, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19469. 15:18:28.985 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580652799041537(Long), 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:18:28.985081800(LocalDateTime), 2026-07-02T15:18:28.985081800(LocalDateTime)
  19470. 15:18:28.987 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
  19471. 15:18:28.987 INFO [EQY2kT3x] [] [ main] c.x.i.l.UserRegisteredListener : 收到用户注册事件: userId=2072580652799041537, inviteCode=null
  19472. 15:18:28.987 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
  19473. 15:18:28.988 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:28.987821900(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:28.985081800(LocalDateTime), 2026-07-02T15:18:28.985081800(LocalDateTime), 2072580652799041537(Long)
  19474. 15:18:28.990 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  19475. 15:18:28.991 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  19476. 15:18:28.991 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:28.987821900(LocalDateTime), 127.0.0.1(String), 1(Long), 0a6a111dbda23505146f843c81df8090eac8c472d0aa37e46affbb8ba2e2db26(String), ACTIVE(String), 2026-07-02T15:18:28.985081800(LocalDateTime), 2026-07-02T15:18:28.985081800(LocalDateTime), 2072580652799041537(Long)
  19477. 15:18:28.994 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  19478. 15:18:28.994 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19479. 15:18:28.994 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
  19480. 15:18:28.995 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19481. 15:18:28.995 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  19482. 15:18:28.995 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
  19483. 15:18:28.997 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  19484. 15:18:28.998 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  19485. 15:18:28.998 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  19486. 15:18:28.999 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.M.selectList : <== Total: 3
  19487. 15:18:29.000 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19488. 15:18:29.000 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580652866150401(Long), 2072580652799041537(Long), 用户1111(String), USER(String), 2026-07-02T15:18:28.999856900(LocalDateTime), USER(String), REGISTER(String), 用户注册(String), USER(String), 2072580652799041537(Long), USER:2072580652799041537(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:28.999856900(LocalDateTime)
  19489. 15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : <== Updates: 1
  19490. 15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户注册
  19491. 15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19492. 15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580652929064961(Long), 2072580652799041537(Long), 用户1111(String), USER(String), 2026-07-02T15:18:29.003118900(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 2072580652799041537(Long), USER:2072580652799041537(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.003652(LocalDateTime)
  19493. 15:18:29.006 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : <== Updates: 1
  19494. 15:18:29.006 DEBUG [EQY2kT3x] [2072580652799041537] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  19495. 15:18:29.011 DEBUG [EQY2kT3x] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 31ms
  19496. MockHttpServletRequest:
  19497. HTTP Method = POST
  19498. Request URI = /api/auth/sms/login
  19499. Parameters = {}
  19500. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
  19501. Body = {"phone":"13811111111","code":"123456","inviteCode":null}
  19502. Session Attrs = {}
  19503. Handler:
  19504. Type = com.xuekairui.user.controller.AuthController
  19505. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  19506. Async:
  19507. Async started = false
  19508. Async result = null
  19509. Resolved Exception:
  19510. Type = null
  19511. ModelAndView:
  19512. View name = null
  19513. View = null
  19514. Model = null
  19515. FlashMap:
  19516. Attributes = null
  19517. MockHttpServletResponse:
  19518. Status = 200
  19519. Error message = null
  19520. Headers = [X-Request-Id:"EQY2kT3x", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19521. Content type = application/json
  19522. Body = {"code":200,"message":"操作成功","data":{"userId":2072580652799041537,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzMDYzMTA4fQ.v7Rdq2D359acFHjosRrPudpfg8gdG3dQra_WCRKA0yLNwAg4Qqj4IOKsFRuWcPhj2SJZDGKuciAaGrh96jh_9w","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzNTgxNTA4fQ.h9vxbDHAcQtyODFhcmnDTsxfrr1uoeFUnkklPBNpyOypFiEtSd2xQluwbpRkl-X0gQ8NAqC6C3wocVFkuL6Diw","expiresIn":86400,"userInfo":{"id":2072580652799041537,"phone":"138****1111","nickname":"用户1111","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:28","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580652799041537,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":true,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976709009}
  19523. Forwarded URL = null
  19524. Redirected URL = null
  19525. Cookies = []
  19526. 15:18:29.011 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 新用户注册成功: userId=2072580652799041537, accessToken=eyJhbGciOiJIUzUxMiJ9...
  19527. 15:18:29.022 DEBUG [7wrskVtR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  19528. 15:18:29.023 DEBUG [7wrskVtR] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  19529. 15:18:29.024 DEBUG [7wrskVtR] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
  19530. 15:18:29.025 DEBUG [7wrskVtR] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  19531. 15:18:29.026 DEBUG [7wrskVtR] [2072580652799041537] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 4ms
  19532. MockHttpServletRequest:
  19533. HTTP Method = GET
  19534. Request URI = /api/membership/my
  19535. Parameters = {}
  19536. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoidG1wMjA3MjU4MDY1Mjc5OTA0MTUzNyIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.dy3Ji-99C8mDamSJHXUzr5PekyLkUZHpot47BkmTvPmJKjE9BN3KUPWjnmdkq5Ca5c73-ZBxeYTKPCIDDf2MnQ"]
  19537. Body = null
  19538. Session Attrs = {}
  19539. Handler:
  19540. Type = com.xuekairui.user.controller.MembershipController
  19541. Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
  19542. Async:
  19543. Async started = false
  19544. Async result = null
  19545. Resolved Exception:
  19546. Type = null
  19547. ModelAndView:
  19548. View name = null
  19549. View = null
  19550. Model = null
  19551. FlashMap:
  19552. Attributes = null
  19553. MockHttpServletResponse:
  19554. Status = 200
  19555. Error message = null
  19556. Headers = [X-Request-Id:"7wrskVtR", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19557. Content type = application/json
  19558. Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":2072580652799041537,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976709025}
  19559. Forwarded URL = null
  19560. Redirected URL = null
  19561. Cookies = []
  19562. 15:18:29.027 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 用户2072580652799041537为普通会员(PLUS),无过期时间,跳过校验
  19563. 15:18:29.030 DEBUG [v3wjy6TE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  19564. 15:18:29.031 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19565. 15:18:29.031 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
  19566. 15:18:29.033 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19567. 15:18:29.034 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19568. 15:18:29.034 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
  19569. 15:18:29.036 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19570. 15:18:29.037 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19571. 15:18:29.037 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
  19572. 15:18:29.038 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19573. 15:18:29.038 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  19574. 15:18:29.038 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
  19575. 15:18:29.040 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  19576. 15:18:29.041 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  19577. 15:18:29.041 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  19578. 15:18:29.042 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.M.selectList : <== Total: 3
  19579. 15:18:29.043 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 200 13ms
  19580. MockHttpServletRequest:
  19581. HTTP Method = GET
  19582. Request URI = /api/auth/user/info
  19583. Parameters = {}
  19584. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzMDYzMTA4fQ.v7Rdq2D359acFHjosRrPudpfg8gdG3dQra_WCRKA0yLNwAg4Qqj4IOKsFRuWcPhj2SJZDGKuciAaGrh96jh_9w"]
  19585. Body = null
  19586. Session Attrs = {}
  19587. Handler:
  19588. Type = com.xuekairui.user.controller.AuthController
  19589. Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
  19590. Async:
  19591. Async started = false
  19592. Async result = null
  19593. Resolved Exception:
  19594. Type = null
  19595. ModelAndView:
  19596. View name = null
  19597. View = null
  19598. Model = null
  19599. FlashMap:
  19600. Attributes = null
  19601. MockHttpServletResponse:
  19602. Status = 200
  19603. Error message = null
  19604. Headers = [X-Request-Id:"v3wjy6TE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19605. Content type = application/json
  19606. Body = {"code":200,"message":"操作成功","data":{"id":2072580652799041537,"phone":"138****1111","nickname":"用户1111","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:29","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580652799041537,"levelCode":"PLUS","version":null},"timestamp":1782976709042}
  19607. Forwarded URL = null
  19608. Redirected URL = null
  19609. Cookies = []
  19610. 15:18:29.043 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 获取用户信息成功
  19611. 15:18:29.046 DEBUG [4PmQaxXq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh | IP: 127.0.0.1
  19612. 15:18:29.051 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,role,token_version,refresh_token_hash,refresh_token_status,status FROM t_user WHERE (id = ?)
  19613. 15:18:29.051 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 2072580652799041537(Long)
  19614. 15:18:29.053 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  19615. 15:18:29.054 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, status=?, role=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, update_time=? WHERE id=?
  19616. 15:18:29.054 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13811111111(String), 1(Integer), USER(String), 1(Long), d17e2310b4458a0c4deca61b2ca4fba8ef855839d61947a962ec620c9acf2105(String), ACTIVE(String), 2026-07-02T15:18:29.054302500(LocalDateTime), 2072580652799041537(Long)
  19617. 15:18:29.055 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  19618. 15:18:29.055 DEBUG [4PmQaxXq] [] [ main] c.x.user.service.AuthService : 用户 2072580652799041537 Refresh Token 旋转成功
  19619. 15:18:29.057 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19620. 15:18:29.057 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
  19621. 15:18:29.058 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19622. 15:18:29.058 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  19623. 15:18:29.058 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
  19624. 15:18:29.060 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  19625. 15:18:29.060 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  19626. 15:18:29.060 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  19627. 15:18:29.061 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.M.selectList : <== Total: 3
  19628. 15:18:29.069 DEBUG [4PmQaxXq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh 200 23ms
  19629. MockHttpServletRequest:
  19630. HTTP Method = POST
  19631. Request URI = /api/auth/refresh
  19632. Parameters = {}
  19633. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"273"]
  19634. Body = {"refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzNTgxNTA4fQ.h9vxbDHAcQtyODFhcmnDTsxfrr1uoeFUnkklPBNpyOypFiEtSd2xQluwbpRkl-X0gQ8NAqC6C3wocVFkuL6Diw"}
  19635. Session Attrs = {}
  19636. Handler:
  19637. Type = com.xuekairui.user.controller.AuthController
  19638. Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)
  19639. Async:
  19640. Async started = false
  19641. Async result = null
  19642. Resolved Exception:
  19643. Type = null
  19644. ModelAndView:
  19645. View name = null
  19646. View = null
  19647. Model = null
  19648. FlashMap:
  19649. Attributes = null
  19650. MockHttpServletResponse:
  19651. Status = 200
  19652. Error message = null
  19653. Headers = [X-Request-Id:"4PmQaxXq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19654. Content type = application/json
  19655. Body = {"code":200,"message":"操作成功","data":{"userId":2072580652799041537,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.4RSruN_bqqKyuW_qQESH0VjgSxBiNipmzPGvCj9pSTVOSPPLdsdFyhj6PdyHGzH6Bq_oCnRlAH0XDKbCvd8RTQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzNTgxNTA5fQ.JlsjCap1plTXrGu24CeJOwMtEgqCdkVoanPFiWp3Y8Ung3G9KngDHTb0E7Hc92585-iMiTcIayeK2_rZR67r4A","expiresIn":86400,"userInfo":{"id":2072580652799041537,"phone":"138****1111","nickname":null,"avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":null,"loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580652799041537,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":null,"kickedDeviceInfo":null},"timestamp":1782976709067}
  19656. Forwarded URL = null
  19657. Redirected URL = null
  19658. Cookies = []
  19659. 15:18:29.069 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? Token刷新成功: eyJhbGciOiJIUzUxMiJ9...
  19660. 15:18:29.071 DEBUG [MjCQ8sML] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  19661. 15:18:29.075 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  19662. 15:18:29.075 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
  19663. 15:18:29.077 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
  19664. 15:18:29.077 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
  19665. 15:18:29.077 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.077377300(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:28(LocalDateTime), 2026-07-02T15:18:28(LocalDateTime), 1(Long)
  19666. 15:18:29.080 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  19667. 15:18:29.081 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  19668. 15:18:29.081 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.077377300(LocalDateTime), 127.0.0.1(String), 1(Long), 4505a47cd0b7d217f18677b6979a931878a44f585ed6f6f6e0f20b3d21beb495(String), ACTIVE(String), 2026-07-02T15:18:28(LocalDateTime), 2026-07-02T15:18:28(LocalDateTime), 1(Long)
  19669. 15:18:29.084 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  19670. 15:18:29.084 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19671. 15:18:29.084 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  19672. 15:18:29.086 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19673. 15:18:29.086 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  19674. 15:18:29.086 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  19675. 15:18:29.087 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  19676. 15:18:29.088 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  19677. 15:18:29.088 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  19678. 15:18:29.089 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  19679. 15:18:29.091 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19680. 15:18:29.091 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580653252026369(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:29.090535(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.090535(LocalDateTime)
  19681. 15:18:29.093 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
  19682. 15:18:29.093 DEBUG [MjCQ8sML] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  19683. 15:18:29.099 DEBUG [MjCQ8sML] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 28ms
  19684. MockHttpServletRequest:
  19685. HTTP Method = POST
  19686. Request URI = /api/auth/sms/login
  19687. Parameters = {}
  19688. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
  19689. Body = {"phone":"13800138000","code":"123456","inviteCode":null}
  19690. Session Attrs = {}
  19691. Handler:
  19692. Type = com.xuekairui.user.controller.AuthController
  19693. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  19694. Async:
  19695. Async started = false
  19696. Async result = null
  19697. Resolved Exception:
  19698. Type = null
  19699. ModelAndView:
  19700. View name = null
  19701. View = null
  19702. Model = null
  19703. FlashMap:
  19704. Attributes = null
  19705. MockHttpServletResponse:
  19706. Status = 200
  19707. Error message = null
  19708. Headers = [X-Request-Id:"MjCQ8sML", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19709. Content type = application/json
  19710. Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.9UWg603Q7O5F3vLqR5JD5aXPuZHi1GQz-R2BQ_4PldfA8i996hqzvHfqaPOt1ngiWynzRLuw-gehDY85JNzjWA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzNTgxNTA5fQ.LdHuIl8s135KBuw--e0Pclq9uVxiN4vmJnagvtpky-miHQ1H9KBF6vD7D1lgz0oxKTNroFdkUrVlHDsFtzniYg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:28","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976709098}
  19711. Forwarded URL = null
  19712. Redirected URL = null
  19713. Cookies = []
  19714. 15:18:29.099 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 老用户登录成功
  19715. 15:18:29.102 DEBUG [SFy6sNEH] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
  19716. 15:18:29.103 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19717. 15:18:29.103 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
  19718. 15:18:29.105 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19719. 15:18:29.106 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
  19720. 15:18:29.106 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Parameters: 2072580652799041537(Long), 1(Integer), 2026-07-02T15:18:29.106154400(LocalDateTime)
  19721. 15:18:29.109 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : <== Total: 0
  19722. 15:18:29.109 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  19723. 15:18:29.109 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Parameters:
  19724. 15:18:29.111 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : <== Total: 1
  19725. 15:18:29.112 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
  19726. 15:18:29.112 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectCount : ==> Parameters: VE6YLXWM(String)
  19727. 15:18:29.113 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectCount : <== Total: 1
  19728. 15:18:29.114 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19729. 15:18:29.114 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.insert : ==> Parameters: 2072580652799041537(Long), VE6YLXWM(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:18:29.111509200(LocalDateTime), 1(Integer), 2026-07-02T15:18:29.114170500(LocalDateTime), 2026-07-02T15:18:29.114170500(LocalDateTime)
  19730. 15:18:29.119 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.insert : <== Updates: 1
  19731. 15:18:29.120 INFO [SFy6sNEH] [2072580652799041537] [ main] c.x.i.service.InviteService : 用户 2072580652799041537 创建邀请码: VE6YLXWM
  19732. 15:18:29.120 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  19733. 15:18:29.120 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Parameters:
  19734. 15:18:29.122 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : <== Total: 1
  19735. 15:18:29.122 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19736. 15:18:29.122 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
  19737. 15:18:29.125 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19738. 15:18:29.125 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 23ms
  19739. MockHttpServletRequest:
  19740. HTTP Method = GET
  19741. Request URI = /api/invite/code
  19742. Parameters = {}
  19743. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzMDYzMTA4fQ.v7Rdq2D359acFHjosRrPudpfg8gdG3dQra_WCRKA0yLNwAg4Qqj4IOKsFRuWcPhj2SJZDGKuciAaGrh96jh_9w"]
  19744. Body = null
  19745. Session Attrs = {}
  19746. Handler:
  19747. Type = com.xuekairui.invite.controller.InviteController
  19748. Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
  19749. Async:
  19750. Async started = false
  19751. Async result = null
  19752. Resolved Exception:
  19753. Type = null
  19754. ModelAndView:
  19755. View name = null
  19756. View = null
  19757. Model = null
  19758. FlashMap:
  19759. Attributes = null
  19760. MockHttpServletResponse:
  19761. Status = 200
  19762. Error message = null
  19763. Headers = [X-Request-Id:"SFy6sNEH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19764. Content type = application/json
  19765. Body = {"code":200,"message":"操作成功","data":{"code":"VE6YLXWM","inviteLink":"https://app.zhijiayun.com/api/invite/VE6YLXWM","inviterNickname":"用户1111","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:29","status":1,"createTime":"2026-07-02 15:18:29","shareTitle":"用户1111 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是用户1111,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/VE6YLXWM填我的邀请码 VE6YLXWM 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/VE6YLXWM"},"timestamp":1782976709125}
  19766. Forwarded URL = null
  19767. Redirected URL = null
  19768. Cookies = []
  19769. 15:18:29.125 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 获取邀请码: VE6YLXWM
  19770. 15:18:29.125 DEBUG [sBkXgBU4] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  19771. 15:18:29.129 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
  19772. 15:18:29.129 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13911111111(String)
  19773. 15:18:29.130 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
  19774. 15:18:29.130 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, phone, nickname, login_source, status, role, membership_level, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19775. 15:18:29.131 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580653440770050(Long), 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:18:29.130807300(LocalDateTime), 2026-07-02T15:18:29.130807300(LocalDateTime)
  19776. 15:18:29.133 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
  19777. 15:18:29.133 INFO [sBkXgBU4] [] [ main] c.x.i.l.UserRegisteredListener : 收到用户注册事件: userId=2072580653440770050, inviteCode=VE6YLXWM
  19778. 15:18:29.134 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
  19779. 15:18:29.134 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : ==> Parameters: VE6YLXWM(String)
  19780. 15:18:29.136 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : <== Total: 1
  19781. 15:18:29.136 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19782. 15:18:29.136 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580653440770050(Long)
  19783. 15:18:29.137 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19784. 15:18:29.138 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (invitee_id = ?)
  19785. 15:18:29.138 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : ==> Parameters: 2072580653440770050(Long)
  19786. 15:18:29.141 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : <== Total: 1
  19787. 15:18:29.141 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
  19788. 15:18:29.141 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : ==> Parameters:
  19789. 15:18:29.143 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : <== Total: 1
  19790. 15:18:29.143 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND registered = ?)
  19791. 15:18:29.143 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : ==> Parameters: 2072580652799041537(Long), 1(Integer)
  19792. 15:18:29.145 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : <== Total: 1
  19793. 15:18:29.145 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_relation ( inviter_id, invitee_id, invite_code_id, registered, reward_granted, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
  19794. 15:18:29.145 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.insert : ==> Parameters: 2072580652799041537(Long), 2072580653440770050(Long), 1(Long), 1(Integer), 1(Integer), 1(Integer), 2026-07-02T15:18:29.145939900(LocalDateTime), 2026-07-02T15:18:29.145939900(LocalDateTime)
  19795. 15:18:29.148 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.insert : <== Updates: 1
  19796. 15:18:29.149 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_code SET user_id=?, code=?, max_uses=?, used_count=?, click_count=?, expire_time=?, status=?, create_time=?, update_time=? WHERE id=?
  19797. 15:18:29.150 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.updateById : ==> Parameters: 2072580652799041537(Long), VE6YLXWM(String), -1(Integer), 1(Integer), 0(Integer), 2026-08-01T15:18:29(LocalDateTime), 1(Integer), 2026-07-02T15:18:29(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 1(Long)
  19798. 15:18:29.152 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.updateById : <== Updates: 1
  19799. 15:18:29.153 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19800. 15:18:29.153 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
  19801. 15:18:29.155 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19802. 15:18:29.155 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  19803. 15:18:29.155 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
  19804. 15:18:29.157 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  19805. 15:18:29.157 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
  19806. 15:18:29.157 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectList : ==> Parameters: 2072580652799041537(Long), 1(Integer)
  19807. 15:18:29.160 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectList : <== Total: 0
  19808. 15:18:29.160 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19809. 15:18:29.160 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580653570793474(Long), 2072580652799041537(Long), PRO(String), INVITE(String), 2026-07-02T15:18:29.160374(LocalDateTime), 2026-08-01T15:18:29.160374(LocalDateTime), 1(Integer), 邀请奖励:邀请用户2072580653440770050注册(String), 2026-07-02T15:18:29.160374(LocalDateTime), 2026-07-02T15:18:29.160374(LocalDateTime)
  19810. 15:18:29.163 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.insert : <== Updates: 1
  19811. 15:18:29.163 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  19812. 15:18:29.163 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:18:29.160374(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 127.0.0.1(String), 1(Long), d17e2310b4458a0c4deca61b2ca4fba8ef855839d61947a962ec620c9acf2105(String), ACTIVE(String), 2026-07-02T15:18:29(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 2072580652799041537(Long)
  19813. 15:18:29.166 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  19814. 15:18:29.166 INFO [sBkXgBU4] [] [ main] c.x.u.s.MembershipService : 邀请奖励:用户2072580652799041537获得30天高级会员(PRO)
  19815. 15:18:29.166 INFO [sBkXgBU4] [] [ main] c.x.i.service.InviteService : 邀请奖励已发放: inviter=2072580652799041537, invitee=2072580653440770050, 会员=PRO/30天, 配额=0次
  19816. 15:18:29.166 INFO [sBkXgBU4] [] [ main] c.x.i.service.InviteService : 邀请成功: inviter=2072580652799041537, invitee=2072580653440770050
  19817. 15:18:29.167 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, inviter_id=?, token_version=?, create_time=?, update_time=? WHERE id=?
  19818. 15:18:29.167 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2072580652799041537(Long), 0(Long), 2026-07-02T15:18:29(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 2072580653440770050(Long)
  19819. 15:18:29.170 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  19820. 15:18:29.171 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
  19821. 15:18:29.171 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.170580900(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:29.130807300(LocalDateTime), 2026-07-02T15:18:29.130807300(LocalDateTime), 2072580653440770050(Long)
  19822. 15:18:29.174 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  19823. 15:18:29.175 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
  19824. 15:18:29.175 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.170580900(LocalDateTime), 127.0.0.1(String), 1(Long), 4b2ad3dd8251e2b79bae4d3903c7291a17989359d61ab6d3f32cee43c4349458(String), ACTIVE(String), 2026-07-02T15:18:29.130807300(LocalDateTime), 2026-07-02T15:18:29.130807300(LocalDateTime), 2072580653440770050(Long)
  19825. 15:18:29.178 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
  19826. 15:18:29.178 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  19827. 15:18:29.178 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580653440770050(Long)
  19828. 15:18:29.179 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  19829. 15:18:29.179 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  19830. 15:18:29.179 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580653440770050(Long)
  19831. 15:18:29.181 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  19832. 15:18:29.181 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  19833. 15:18:29.182 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  19834. 15:18:29.183 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.M.selectList : <== Total: 3
  19835. 15:18:29.184 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19836. 15:18:29.184 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580653633708033(Long), 2072580653440770050(Long), 用户1111(String), USER(String), 2026-07-02T15:18:29.183950400(LocalDateTime), USER(String), REGISTER(String), 用户注册(String), USER(String), 2072580653440770050(Long), USER:2072580653440770050(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.183950400(LocalDateTime)
  19837. 15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : <== Updates: 1
  19838. 15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户注册
  19839. 15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  19840. 15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580653696622594(Long), 2072580653440770050(Long), 用户1111(String), USER(String), 2026-07-02T15:18:29.187202(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 2072580653440770050(Long), USER:2072580653440770050(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.187202(LocalDateTime)
  19841. 15:18:29.190 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : <== Updates: 1
  19842. 15:18:29.190 DEBUG [sBkXgBU4] [2072580653440770050] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
  19843. 15:18:29.194 DEBUG [sBkXgBU4] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 69ms
  19844. MockHttpServletRequest:
  19845. HTTP Method = POST
  19846. Request URI = /api/auth/sms/login
  19847. Parameters = {}
  19848. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"63"]
  19849. Body = {"phone":"13911111111","code":"123456","inviteCode":"VE6YLXWM"}
  19850. Session Attrs = {}
  19851. Handler:
  19852. Type = com.xuekairui.user.controller.AuthController
  19853. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  19854. Async:
  19855. Async started = false
  19856. Async result = null
  19857. Resolved Exception:
  19858. Type = null
  19859. ModelAndView:
  19860. View name = null
  19861. View = null
  19862. Model = null
  19863. FlashMap:
  19864. Attributes = null
  19865. MockHttpServletResponse:
  19866. Status = 200
  19867. Error message = null
  19868. Headers = [X-Request-Id:"sBkXgBU4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19869. Content type = application/json
  19870. Body = {"code":200,"message":"操作成功","data":{"userId":2072580653440770050,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1MzQ0MDc3MDA1MCwic3ViIjoiMjA3MjU4MDY1MzQ0MDc3MDA1MCIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.1U1wmM_7Z-Otb4-NXVT5VxCWB6uJv1wHVWveYkKDJ4YvICu-eEa73Asj9TK5C0I4sDBfqOksWA2MHnWJtmhBQw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1MzQ0MDc3MDA1MCwic3ViIjoiMjA3MjU4MDY1MzQ0MDc3MDA1MCIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzNTgxNTA5fQ.JwI0JCVikX9Wi3dy_ELGmONoJ5QP5VvOap8bjW0kIkWuvUXnZXqad4PfJtkTG7eJGWaXyUQrgf3xzih4VRBxaQ","expiresIn":86400,"userInfo":{"id":2072580653440770050,"phone":"139****1111","nickname":"用户1111","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:29","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580653440770050,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":true,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976709194}
  19871. Forwarded URL = null
  19872. Redirected URL = null
  19873. Cookies = []
  19874. 15:18:29.195 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 带邀请码注册成功: inviteCode=VE6YLXWM
  19875. 15:18:29.199 DEBUG [Ty3a5BKf] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
  19876. 15:18:29.199 DEBUG [Ty3a5BKf] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  19877. 15:18:29.200 DEBUG [Ty3a5BKf] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580653440770050(Long)
  19878. 15:18:29.201 DEBUG [Ty3a5BKf] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  19879. 15:18:29.202 DEBUG [Ty3a5BKf] [2072580653440770050] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 3ms
  19880. MockHttpServletRequest:
  19881. HTTP Method = GET
  19882. Request URI = /api/membership/my
  19883. Parameters = {}
  19884. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoidG1wMjA3MjU4MDY1MzQ0MDc3MDA1MCIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1MzQ0MDc3MDA1MCwic3ViIjoiMjA3MjU4MDY1MzQ0MDc3MDA1MCIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.TaBQMhFVXqgnb3m2An40CCs_krqNd2bir7AjYeOdqOw-M7o_VvKIrPav9tqNnY2kJhTUfwfC-KcE4C5ZOjt8qQ"]
  19885. Body = null
  19886. Session Attrs = {}
  19887. Handler:
  19888. Type = com.xuekairui.user.controller.MembershipController
  19889. Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
  19890. Async:
  19891. Async started = false
  19892. Async result = null
  19893. Resolved Exception:
  19894. Type = null
  19895. ModelAndView:
  19896. View name = null
  19897. View = null
  19898. Model = null
  19899. FlashMap:
  19900. Attributes = null
  19901. MockHttpServletResponse:
  19902. Status = 200
  19903. Error message = null
  19904. Headers = [X-Request-Id:"Ty3a5BKf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19905. Content type = application/json
  19906. Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":2072580653440770050,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976709201}
  19907. Forwarded URL = null
  19908. Redirected URL = null
  19909. Cookies = []
  19910. 15:18:29.202 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 用户2072580653440770050为普通会员(PLUS),无过期时间,跳过校验
  19911. 15:18:29.205 DEBUG [ftMPk6pA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url | IP: 127.0.0.1
  19912. 15:18:29.206 DEBUG [ftMPk6pA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url 200 1ms
  19913. MockHttpServletRequest:
  19914. HTTP Method = GET
  19915. Request URI = /api/auth/wechat/url
  19916. Parameters = {state=[login]}
  19917. Headers = []
  19918. Body = null
  19919. Session Attrs = {}
  19920. Handler:
  19921. Type = com.xuekairui.user.controller.AuthController
  19922. Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)
  19923. Async:
  19924. Async started = false
  19925. Async result = null
  19926. Resolved Exception:
  19927. Type = null
  19928. ModelAndView:
  19929. View name = null
  19930. View = null
  19931. Model = null
  19932. FlashMap:
  19933. Attributes = null
  19934. MockHttpServletResponse:
  19935. Status = 200
  19936. Error message = null
  19937. Headers = [X-Request-Id:"ftMPk6pA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19938. Content type = application/json
  19939. Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=login#wechat_redirect","timestamp":1782976709205}
  19940. Forwarded URL = null
  19941. Redirected URL = null
  19942. Cookies = []
  19943. 15:18:29.206 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 获取微信登录URL成功
  19944. 15:18:29.208 DEBUG [7LT2PW8N] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
  19945. 15:18:29.215 WARN [7LT2PW8N] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1102, message=验证码错误或已过期
  19946. 15:18:29.216 DEBUG [7LT2PW8N] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 8ms
  19947. MockHttpServletRequest:
  19948. HTTP Method = POST
  19949. Request URI = /api/auth/sms/login
  19950. Parameters = {}
  19951. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
  19952. Body = {"phone":"13800138000","code":"000000","inviteCode":null}
  19953. Session Attrs = {}
  19954. Handler:
  19955. Type = com.xuekairui.user.controller.AuthController
  19956. Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
  19957. Async:
  19958. Async started = false
  19959. Async result = null
  19960. Resolved Exception:
  19961. Type = com.xuekairui.common.BusinessException
  19962. ModelAndView:
  19963. View name = null
  19964. View = null
  19965. Model = null
  19966. FlashMap:
  19967. Attributes = null
  19968. MockHttpServletResponse:
  19969. Status = 200
  19970. Error message = null
  19971. Headers = [X-Request-Id:"7LT2PW8N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  19972. Content type = application/json
  19973. Body = {"code":1102,"message":"验证码错误或已过期","data":null,"timestamp":1782976709215}
  19974. Forwarded URL = null
  19975. Redirected URL = null
  19976. Cookies = []
  19977. 15:18:29.216 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 错误验证码处理正确
  19978. 15:18:29.218 DEBUG [jSDRqb9v] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  19979. 15:18:29.219 WARN [jSDRqb9v] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 1ms
  19980. MockHttpServletRequest:
  19981. HTTP Method = GET
  19982. Request URI = /api/auth/user/info
  19983. Parameters = {}
  19984. Headers = []
  19985. Body = null
  19986. Session Attrs = {}
  19987. Handler:
  19988. Type = null
  19989. Async:
  19990. Async started = false
  19991. Async result = null
  19992. Resolved Exception:
  19993. Type = null
  19994. ModelAndView:
  19995. View name = null
  19996. View = null
  19997. Model = null
  19998. FlashMap:
  19999. Attributes = null
  20000. MockHttpServletResponse:
  20001. Status = 401
  20002. Error message = null
  20003. Headers = [X-Request-Id:"jSDRqb9v", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20004. Content type = application/json;charset=UTF-8
  20005. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976709219}
  20006. Forwarded URL = null
  20007. Redirected URL = null
  20008. Cookies = []
  20009. 15:18:29.219 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 未认证拦截正确
  20010. 15:18:29.223 DEBUG [UYD8C5WD] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
  20011. 15:18:29.223 WARN [UYD8C5WD] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
  20012. 15:18:29.223 WARN [UYD8C5WD] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
  20013. 15:18:29.223 WARN [UYD8C5WD] [] [ main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
  20014. 15:18:29.224 WARN [UYD8C5WD] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 1ms
  20015. MockHttpServletRequest:
  20016. HTTP Method = GET
  20017. Request URI = /api/auth/user/info
  20018. Parameters = {}
  20019. Headers = [Authorization:"Bearer invalid_token_xyz"]
  20020. Body = null
  20021. Session Attrs = {}
  20022. Handler:
  20023. Type = null
  20024. Async:
  20025. Async started = false
  20026. Async result = null
  20027. Resolved Exception:
  20028. Type = null
  20029. ModelAndView:
  20030. View name = null
  20031. View = null
  20032. Model = null
  20033. FlashMap:
  20034. Attributes = null
  20035. MockHttpServletResponse:
  20036. Status = 401
  20037. Error message = null
  20038. Headers = [X-Request-Id:"UYD8C5WD", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20039. Content type = application/json;charset=UTF-8
  20040. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976709223}
  20041. Forwarded URL = null
  20042. Redirected URL = null
  20043. Cookies = []
  20044. 15:18:29.224 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 无效Token拦截正确
  20045. [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.223 s -- in com.xuekairui.gateway.UserAuthFlowTest
  20046. [INFO] Running 关注/收藏接口测试
  20047. 15:18:29.227 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.WatchlistControllerTest]: WatchlistControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
  20048. 15:18:29.229 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.WatchlistControllerTest
  20049. 15:18:32.184 DEBUG [VKRCxL95] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist | IP: 127.0.0.1
  20050. 15:18:32.184 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20051. 15:18:32.185 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20052. 15:18:32.186 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20053. 15:18:32.187 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
  20054. 15:18:32.187 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 1(Integer)
  20055. 15:18:32.189 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.W.selectList : <== Total: 0
  20056. 15:18:32.190 DEBUG [VKRCxL95] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist 200 6ms
  20057. MockHttpServletRequest:
  20058. HTTP Method = GET
  20059. Request URI = /api/watchlist
  20060. Parameters = {}
  20061. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
  20062. Body = null
  20063. Session Attrs = {}
  20064. Handler:
  20065. Type = com.xuekairui.user.controller.WatchlistController
  20066. Method = com.xuekairui.user.controller.WatchlistController#list(HttpServletRequest)
  20067. Async:
  20068. Async started = false
  20069. Async result = null
  20070. Resolved Exception:
  20071. Type = null
  20072. ModelAndView:
  20073. View name = null
  20074. View = null
  20075. Model = null
  20076. FlashMap:
  20077. Attributes = null
  20078. MockHttpServletResponse:
  20079. Status = 200
  20080. Error message = null
  20081. Headers = [X-Request-Id:"VKRCxL95", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20082. Content type = application/json
  20083. Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976712189}
  20084. Forwarded URL = null
  20085. Redirected URL = null
  20086. Cookies = []
  20087. 15:18:32.192 DEBUG [hW43SNQL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist | IP: 127.0.0.1
  20088. 15:18:32.193 WARN [hW43SNQL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist 401 1ms
  20089. MockHttpServletRequest:
  20090. HTTP Method = GET
  20091. Request URI = /api/watchlist
  20092. Parameters = {}
  20093. Headers = []
  20094. Body = null
  20095. Session Attrs = {}
  20096. Handler:
  20097. Type = null
  20098. Async:
  20099. Async started = false
  20100. Async result = null
  20101. Resolved Exception:
  20102. Type = null
  20103. ModelAndView:
  20104. View name = null
  20105. View = null
  20106. Model = null
  20107. FlashMap:
  20108. Attributes = null
  20109. MockHttpServletResponse:
  20110. Status = 401
  20111. Error message = null
  20112. Headers = [X-Request-Id:"hW43SNQL", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20113. Content type = application/json;charset=UTF-8
  20114. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976712193}
  20115. Forwarded URL = null
  20116. Redirected URL = null
  20117. Cookies = []
  20118. 15:18:32.198 DEBUG [d7DeawZf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
  20119. 15:18:32.198 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20120. 15:18:32.198 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20121. 15:18:32.199 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20122. 15:18:32.203 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
  20123. 15:18:32.203 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
  20124. 15:18:32.204 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : <== Total: 1
  20125. 15:18:32.204 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20126. 15:18:32.204 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20127. 15:18:32.206 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20128. 15:18:32.206 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  20129. 15:18:32.206 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  20130. 15:18:32.208 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  20131. 15:18:32.208 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  20132. 15:18:32.208 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  20133. 15:18:32.210 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  20134. 15:18:32.211 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND drug_name = ? AND spec = ? AND status = ?)
  20135. 15:18:32.211 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 阿莫西林胶囊(String), 0.5g*24粒/盒(String), 1(Integer)
  20136. 15:18:32.212 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.selectList : <== Total: 0
  20137. 15:18:32.213 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.insert : ==> Preparing: INSERT INTO t_watchlist ( id, user_id, drug_name, spec, manufacturer, min_price, min_price_platform, last_price, price_change, last_check_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  20138. 15:18:32.214 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.insert : ==> Parameters: 2072580666346643457(Long), 1(Long), 阿莫西林胶囊(String), 0.5g*24粒/盒(String), 华北制药(String), 11.80(BigDecimal), yaobangmang(String), 11.80(BigDecimal), 0(BigDecimal), 2026-07-02T15:18:32.212956300(LocalDateTime), 1(Integer), 2026-07-02T15:18:32.213484400(LocalDateTime), 2026-07-02T15:18:32.213484400(LocalDateTime)
  20139. 15:18:32.216 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.insert : <== Updates: 1
  20140. 15:18:32.221 DEBUG [d7DeawZf] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 200 23ms
  20141. MockHttpServletRequest:
  20142. HTTP Method = POST
  20143. Request URI = /api/watchlist
  20144. Parameters = {}
  20145. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"137"]
  20146. Body = {"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药","minPrice":11.80,"minPricePlatform":"yaobangmang"}
  20147. Session Attrs = {}
  20148. Handler:
  20149. Type = com.xuekairui.user.controller.WatchlistController
  20150. Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)
  20151. Async:
  20152. Async started = false
  20153. Async result = null
  20154. Resolved Exception:
  20155. Type = null
  20156. ModelAndView:
  20157. View name = null
  20158. View = null
  20159. Model = null
  20160. FlashMap:
  20161. Attributes = null
  20162. MockHttpServletResponse:
  20163. Status = 200
  20164. Error message = null
  20165. Headers = [X-Request-Id:"d7DeawZf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20166. Content type = application/json
  20167. Body = {"code":200,"message":"操作成功","data":{"id":2072580666346643457,"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药","minPrice":11.80,"minPricePlatform":"yaobangmang","lastPrice":11.80,"priceChange":0,"lastCheckTime":"2026-07-02 15:18:32","createTime":"2026-07-02 15:18:32"},"timestamp":1782976712220}
  20168. Forwarded URL = null
  20169. Redirected URL = null
  20170. Cookies = []
  20171. 15:18:32.225 DEBUG [5R5TApsf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
  20172. 15:18:32.226 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20173. 15:18:32.226 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20174. 15:18:32.227 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20175. 15:18:32.229 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
  20176. 15:18:32.229 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
  20177. 15:18:32.230 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : <== Total: 1
  20178. 15:18:32.230 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20179. 15:18:32.230 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20180. 15:18:32.231 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20181. 15:18:32.231 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  20182. 15:18:32.231 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  20183. 15:18:32.233 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  20184. 15:18:32.233 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  20185. 15:18:32.233 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  20186. 15:18:32.235 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  20187. 15:18:32.235 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND drug_name = ? AND spec = ? AND status = ?)
  20188. 15:18:32.235 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 阿莫西林胶囊(String), 0.5g*24粒/盒(String), 1(Integer)
  20189. 15:18:32.237 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.selectList : <== Total: 1
  20190. 15:18:32.240 WARN [5R5TApsf] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4402, message=该药品已在关注列表中
  20191. 15:18:32.240 DEBUG [5R5TApsf] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 200 15ms
  20192. MockHttpServletRequest:
  20193. HTTP Method = POST
  20194. Request URI = /api/watchlist
  20195. Parameters = {}
  20196. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"87"]
  20197. Body = {"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药"}
  20198. Session Attrs = {}
  20199. Handler:
  20200. Type = com.xuekairui.user.controller.WatchlistController
  20201. Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)
  20202. Async:
  20203. Async started = false
  20204. Async result = null
  20205. Resolved Exception:
  20206. Type = com.xuekairui.common.BusinessException
  20207. ModelAndView:
  20208. View name = null
  20209. View = null
  20210. Model = null
  20211. FlashMap:
  20212. Attributes = null
  20213. MockHttpServletResponse:
  20214. Status = 200
  20215. Error message = null
  20216. Headers = [X-Request-Id:"5R5TApsf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20217. Content type = application/json
  20218. Body = {"code":4402,"message":"该药品已在关注列表中","data":null,"timestamp":1782976712240}
  20219. Forwarded URL = null
  20220. Redirected URL = null
  20221. Cookies = []
  20222. 15:18:32.244 DEBUG [9UmQbxk6] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
  20223. 15:18:32.245 DEBUG [9UmQbxk6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20224. 15:18:32.245 DEBUG [9UmQbxk6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20225. 15:18:32.248 DEBUG [9UmQbxk6] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20226. 15:18:32.249 WARN [9UmQbxk6] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 药品名称不能为空
  20227. 15:18:32.250 WARN [9UmQbxk6] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 400 6ms
  20228. MockHttpServletRequest:
  20229. HTTP Method = POST
  20230. Request URI = /api/watchlist
  20231. Parameters = {}
  20232. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"29"]
  20233. Body = {"drugName":"","spec":"test"}
  20234. Session Attrs = {}
  20235. Handler:
  20236. Type = com.xuekairui.user.controller.WatchlistController
  20237. Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)
  20238. Async:
  20239. Async started = false
  20240. Async result = null
  20241. Resolved Exception:
  20242. Type = org.springframework.web.bind.MethodArgumentNotValidException
  20243. ModelAndView:
  20244. View name = null
  20245. View = null
  20246. Model = null
  20247. FlashMap:
  20248. Attributes = null
  20249. MockHttpServletResponse:
  20250. Status = 400
  20251. Error message = null
  20252. Headers = [X-Request-Id:"9UmQbxk6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20253. Content type = application/json
  20254. Body = {"code":400,"message":"药品名称不能为空","data":null,"timestamp":1782976712249}
  20255. Forwarded URL = null
  20256. Redirected URL = null
  20257. Cookies = []
  20258. 15:18:32.252 DEBUG [B2wBRx6C] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
  20259. 15:18:32.252 WARN [B2wBRx6C] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 401 0ms
  20260. MockHttpServletRequest:
  20261. HTTP Method = POST
  20262. Request URI = /api/watchlist
  20263. Parameters = {}
  20264. Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"19"]
  20265. Body = {"drugName":"test"}
  20266. Session Attrs = {}
  20267. Handler:
  20268. Type = null
  20269. Async:
  20270. Async started = false
  20271. Async result = null
  20272. Resolved Exception:
  20273. Type = null
  20274. ModelAndView:
  20275. View name = null
  20276. View = null
  20277. Model = null
  20278. FlashMap:
  20279. Attributes = null
  20280. MockHttpServletResponse:
  20281. Status = 401
  20282. Error message = null
  20283. Headers = [X-Request-Id:"B2wBRx6C", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20284. Content type = application/json;charset=UTF-8
  20285. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976712252}
  20286. Forwarded URL = null
  20287. Redirected URL = null
  20288. Cookies = []
  20289. 15:18:32.258 DEBUG [KXegqxHK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist | IP: 127.0.0.1
  20290. 15:18:32.258 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20291. 15:18:32.258 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20292. 15:18:32.259 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20293. 15:18:32.260 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
  20294. 15:18:32.260 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 1(Integer)
  20295. 15:18:32.261 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.W.selectList : <== Total: 1
  20296. 15:18:32.262 DEBUG [KXegqxHK] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist 200 4ms
  20297. MockHttpServletRequest:
  20298. HTTP Method = GET
  20299. Request URI = /api/watchlist
  20300. Parameters = {}
  20301. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
  20302. Body = null
  20303. Session Attrs = {}
  20304. Handler:
  20305. Type = com.xuekairui.user.controller.WatchlistController
  20306. Method = com.xuekairui.user.controller.WatchlistController#list(HttpServletRequest)
  20307. Async:
  20308. Async started = false
  20309. Async result = null
  20310. Resolved Exception:
  20311. Type = null
  20312. ModelAndView:
  20313. View name = null
  20314. View = null
  20315. Model = null
  20316. FlashMap:
  20317. Attributes = null
  20318. MockHttpServletResponse:
  20319. Status = 200
  20320. Error message = null
  20321. Headers = [X-Request-Id:"KXegqxHK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20322. Content type = application/json
  20323. Body = {"code":200,"message":"操作成功","data":[{"id":2072580666346643457,"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药","minPrice":11.80,"minPricePlatform":"yaobangmang","lastPrice":11.80,"priceChange":0.00,"lastCheckTime":"2026-07-02 15:18:32","createTime":"2026-07-02 15:18:32"}],"timestamp":1782976712261}
  20324. Forwarded URL = null
  20325. Redirected URL = null
  20326. Cookies = []
  20327. 15:18:32.266 DEBUG [gSJPewXD] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist/stats | IP: 127.0.0.1
  20328. 15:18:32.267 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20329. 15:18:32.267 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20330. 15:18:32.268 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20331. 15:18:32.269 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1
  20332. 15:18:32.269 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countByUserId : ==> Parameters: 1(Long)
  20333. 15:18:32.270 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countByUserId : <== Total: 1
  20334. 15:18:32.270 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
  20335. 15:18:32.270 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
  20336. 15:18:32.271 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : <== Total: 1
  20337. 15:18:32.271 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20338. 15:18:32.271 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20339. 15:18:32.272 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20340. 15:18:32.272 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  20341. 15:18:32.272 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  20342. 15:18:32.273 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  20343. 15:18:32.274 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  20344. 15:18:32.274 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  20345. 15:18:32.275 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  20346. 15:18:32.276 DEBUG [gSJPewXD] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist/stats 200 10ms
  20347. MockHttpServletRequest:
  20348. HTTP Method = GET
  20349. Request URI = /api/watchlist/stats
  20350. Parameters = {}
  20351. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
  20352. Body = null
  20353. Session Attrs = {}
  20354. Handler:
  20355. Type = com.xuekairui.user.controller.WatchlistController
  20356. Method = com.xuekairui.user.controller.WatchlistController#stats(HttpServletRequest)
  20357. Async:
  20358. Async started = false
  20359. Async result = null
  20360. Resolved Exception:
  20361. Type = null
  20362. ModelAndView:
  20363. View name = null
  20364. View = null
  20365. Model = null
  20366. FlashMap:
  20367. Attributes = null
  20368. MockHttpServletResponse:
  20369. Status = 200
  20370. Error message = null
  20371. Headers = [X-Request-Id:"gSJPewXD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20372. Content type = application/json
  20373. Body = {"code":200,"message":"操作成功","data":{"monthlyUsed":1,"total":1,"monthlyLimit":50},"timestamp":1782976712275}
  20374. Forwarded URL = null
  20375. Redirected URL = null
  20376. Cookies = []
  20377. 15:18:32.279 DEBUG [QqPaRy56] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist/stats | IP: 127.0.0.1
  20378. 15:18:32.280 WARN [QqPaRy56] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist/stats 401 1ms
  20379. MockHttpServletRequest:
  20380. HTTP Method = GET
  20381. Request URI = /api/watchlist/stats
  20382. Parameters = {}
  20383. Headers = []
  20384. Body = null
  20385. Session Attrs = {}
  20386. Handler:
  20387. Type = null
  20388. Async:
  20389. Async started = false
  20390. Async result = null
  20391. Resolved Exception:
  20392. Type = null
  20393. ModelAndView:
  20394. View name = null
  20395. View = null
  20396. Model = null
  20397. FlashMap:
  20398. Attributes = null
  20399. MockHttpServletResponse:
  20400. Status = 401
  20401. Error message = null
  20402. Headers = [X-Request-Id:"QqPaRy56", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20403. Content type = application/json;charset=UTF-8
  20404. Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976712279}
  20405. Forwarded URL = null
  20406. Redirected URL = null
  20407. Cookies = []
  20408. 15:18:32.284 DEBUG [nFAP7s3K] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/watchlist/999999 | IP: 127.0.0.1
  20409. 15:18:32.285 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20410. 15:18:32.285 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20411. 15:18:32.286 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20412. 15:18:32.287 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.W.selectById : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE id=?
  20413. 15:18:32.287 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.W.selectById : ==> Parameters: 999999(Long)
  20414. 15:18:32.288 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.W.selectById : <== Total: 0
  20415. 15:18:32.290 WARN [nFAP7s3K] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4403, message=关注记录不存在
  20416. 15:18:32.291 DEBUG [nFAP7s3K] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/watchlist/999999 200 7ms
  20417. MockHttpServletRequest:
  20418. HTTP Method = DELETE
  20419. Request URI = /api/watchlist/999999
  20420. Parameters = {}
  20421. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
  20422. Body = null
  20423. Session Attrs = {}
  20424. Handler:
  20425. Type = com.xuekairui.user.controller.WatchlistController
  20426. Method = com.xuekairui.user.controller.WatchlistController#remove(HttpServletRequest, Long)
  20427. Async:
  20428. Async started = false
  20429. Async result = null
  20430. Resolved Exception:
  20431. Type = com.xuekairui.common.BusinessException
  20432. ModelAndView:
  20433. View name = null
  20434. View = null
  20435. Model = null
  20436. FlashMap:
  20437. Attributes = null
  20438. MockHttpServletResponse:
  20439. Status = 200
  20440. Error message = null
  20441. Headers = [X-Request-Id:"nFAP7s3K", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20442. Content type = application/json
  20443. Body = {"code":4403,"message":"关注记录不存在","data":null,"timestamp":1782976712290}
  20444. Forwarded URL = null
  20445. Redirected URL = null
  20446. Cookies = []
  20447. 15:18:32.295 DEBUG [d53S9AmD] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
  20448. 15:18:32.295 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20449. 15:18:32.295 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20450. 15:18:32.297 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20451. 15:18:32.301 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
  20452. 15:18:32.301 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
  20453. 15:18:32.302 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : <== Total: 1
  20454. 15:18:32.302 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
  20455. 15:18:32.302 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
  20456. 15:18:32.304 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
  20457. 15:18:32.304 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
  20458. 15:18:32.304 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
  20459. 15:18:32.305 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
  20460. 15:18:32.305 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
  20461. 15:18:32.305 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
  20462. 15:18:32.306 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
  20463. 15:18:32.307 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND drug_name = ? AND spec = ? AND status = ?)
  20464. 15:18:32.307 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 布洛芬缓释胶囊(String), 0.3g*20粒/盒(String), 1(Integer)
  20465. 15:18:32.308 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.selectList : <== Total: 0
  20466. 15:18:32.308 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.insert : ==> Preparing: INSERT INTO t_watchlist ( id, user_id, drug_name, spec, manufacturer, price_change, last_check_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  20467. 15:18:32.308 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.insert : ==> Parameters: 2072580666791239681(Long), 1(Long), 布洛芬缓释胶囊(String), 0.3g*20粒/盒(String), 中美史克(String), 0(BigDecimal), 2026-07-02T15:18:32.308302400(LocalDateTime), 1(Integer), 2026-07-02T15:18:32.308827700(LocalDateTime), 2026-07-02T15:18:32.308827700(LocalDateTime)
  20468. 15:18:32.310 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.insert : <== Updates: 1
  20469. 15:18:32.314 DEBUG [d53S9AmD] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 200 19ms
  20470. MockHttpServletRequest:
  20471. HTTP Method = POST
  20472. Request URI = /api/watchlist
  20473. Parameters = {}
  20474. Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"90"]
  20475. Body = {"drugName":"布洛芬缓释胶囊","spec":"0.3g*20粒/盒","manufacturer":"中美史克"}
  20476. Session Attrs = {}
  20477. Handler:
  20478. Type = com.xuekairui.user.controller.WatchlistController
  20479. Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)
  20480. Async:
  20481. Async started = false
  20482. Async result = null
  20483. Resolved Exception:
  20484. Type = null
  20485. ModelAndView:
  20486. View name = null
  20487. View = null
  20488. Model = null
  20489. FlashMap:
  20490. Attributes = null
  20491. MockHttpServletResponse:
  20492. Status = 200
  20493. Error message = null
  20494. Headers = [X-Request-Id:"d53S9AmD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20495. Content type = application/json
  20496. Body = {"code":200,"message":"操作成功","data":{"id":2072580666791239681,"drugName":"布洛芬缓释胶囊","spec":"0.3g*20粒/盒","manufacturer":"中美史克","minPrice":null,"minPricePlatform":null,"lastPrice":null,"priceChange":0,"lastCheckTime":"2026-07-02 15:18:32","createTime":"2026-07-02 15:18:32"},"timestamp":1782976712314}
  20497. Forwarded URL = null
  20498. Redirected URL = null
  20499. Cookies = []
  20500. 15:18:32.315 DEBUG [tGkcJwbP] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/watchlist/2072580666791239681 | IP: 127.0.0.1
  20501. 15:18:32.317 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.selectById : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE id=?
  20502. 15:18:32.317 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.selectById : ==> Parameters: 2072580666791239681(Long)
  20503. 15:18:32.318 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.selectById : <== Total: 1
  20504. 15:18:32.319 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.updateById : ==> Preparing: UPDATE t_watchlist SET user_id=?, drug_name=?, spec=?, manufacturer=?, price_change=?, last_check_time=?, status=?, create_time=?, update_time=? WHERE id=?
  20505. 15:18:32.319 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.updateById : ==> Parameters: 1(Long), 布洛芬缓释胶囊(String), 0.3g*20粒/盒(String), 中美史克(String), 0.00(BigDecimal), 2026-07-02T15:18:32(LocalDateTime), 0(Integer), 2026-07-02T15:18:32(LocalDateTime), 2026-07-02T15:18:32(LocalDateTime), 2072580666791239681(Long)
  20506. 15:18:32.322 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.updateById : <== Updates: 1
  20507. 15:18:32.326 DEBUG [tGkcJwbP] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/watchlist/2072580666791239681 200 11ms
  20508. MockHttpServletRequest:
  20509. HTTP Method = DELETE
  20510. Request URI = /api/watchlist/2072580666791239681
  20511. Parameters = {}
  20512. Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
  20513. Body = null
  20514. Session Attrs = {}
  20515. Handler:
  20516. Type = com.xuekairui.user.controller.WatchlistController
  20517. Method = com.xuekairui.user.controller.WatchlistController#remove(HttpServletRequest, Long)
  20518. Async:
  20519. Async started = false
  20520. Async result = null
  20521. Resolved Exception:
  20522. Type = null
  20523. ModelAndView:
  20524. View name = null
  20525. View = null
  20526. Model = null
  20527. FlashMap:
  20528. Attributes = null
  20529. MockHttpServletResponse:
  20530. Status = 200
  20531. Error message = null
  20532. Headers = [X-Request-Id:"tGkcJwbP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
  20533. Content type = application/json
  20534. Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976712325}
  20535. Forwarded URL = null
  20536. Redirected URL = null
  20537. Cookies = []
  20538. [INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.101 s -- in 关注/收藏接口测试
  20539. [INFO]
  20540. [INFO] Results:
  20541. [INFO]
  20542. [ERROR] Failures:
  20543. [ERROR] AuthControllerTest.getUserInfo_withExpiredToken_shouldReturn401:222 Status expected:<401> but was:<200>
  20544. [ERROR] EndToEndBusinessFlowTest.stage7_AdminReviewLicense:264 Status expected:<200> but was:<401>
  20545. [ERROR] EndToEndBusinessFlowTest.stage8_CheckAuditLogs:295 Status expected:<200> but was:<401>
  20546. [INFO]
  20547. [ERROR] Tests run: 381, Failures: 3, Errors: 0, Skipped: 0
  20548. [INFO]
  20549. [INFO] ------------------------------------------------------------------------
  20550. [INFO] Reactor Summary:
  20551. [INFO]
  20552. [INFO] zhijiayun-pharmacy 1.0-SNAPSHOT .................... SUCCESS [ 0.140 s]
  20553. [INFO] zhijiayun-common 1.0.0 ............................. SUCCESS [ 2.195 s]
  20554. [INFO] zhijiayun-user 1.0.0 ............................... SUCCESS [ 5.212 s]
  20555. [INFO] zhijiayun-payment 1.0.0 ............................ SUCCESS [ 2.564 s]
  20556. [INFO] zhijiayun-invite 1.0.0 ............................. SUCCESS [ 1.449 s]
  20557. [INFO] zhijiayun-gateway 1.0.0 ............................ FAILURE [01:35 min]
  20558. [INFO] ------------------------------------------------------------------------
  20559. [INFO] BUILD FAILURE
  20560. [INFO] ------------------------------------------------------------------------
  20561. [INFO] Total time: 01:47 min
  20562. [INFO] Finished at: 2026-07-02T15:18:32+08:00
  20563. [INFO] ------------------------------------------------------------------------
  20564. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.5.5:test (default-test) on project zhijiayun-gateway: There are test failures.
  20565. [ERROR]
  20566. [ERROR] See D:\project\zhijiayun-pharmacy\zhijiayun-gateway\target\surefire-reports for the individual test results.
  20567. [ERROR] See dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
  20568. [ERROR] -> [Help 1]
  20569. [ERROR]
  20570. [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
  20571. [ERROR] Re-run Maven using the -X switch to enable full debug logging.
  20572. [ERROR]
  20573. [ERROR] For more information about the errors and possible solutions, please read the following articles:
  20574. [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
  20575. [ERROR]
  20576. [ERROR] After correcting the problems, you can resume the build with the command
  20577. [ERROR] mvn <args> -rf :zhijiayun-gateway