app-service.js 442 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172
  1. if (typeof Promise !== "undefined" && !Promise.prototype.finally) {
  2. Promise.prototype.finally = function(callback) {
  3. const promise = this.constructor;
  4. return this.then(
  5. (value) => promise.resolve(callback()).then(() => value),
  6. (reason) => promise.resolve(callback()).then(() => {
  7. throw reason;
  8. })
  9. );
  10. };
  11. }
  12. ;
  13. if (typeof uni !== "undefined" && uni && uni.requireGlobal) {
  14. const global = uni.requireGlobal();
  15. ArrayBuffer = global.ArrayBuffer;
  16. Int8Array = global.Int8Array;
  17. Uint8Array = global.Uint8Array;
  18. Uint8ClampedArray = global.Uint8ClampedArray;
  19. Int16Array = global.Int16Array;
  20. Uint16Array = global.Uint16Array;
  21. Int32Array = global.Int32Array;
  22. Uint32Array = global.Uint32Array;
  23. Float32Array = global.Float32Array;
  24. Float64Array = global.Float64Array;
  25. BigInt64Array = global.BigInt64Array;
  26. BigUint64Array = global.BigUint64Array;
  27. }
  28. ;
  29. if (uni.restoreGlobal) {
  30. uni.restoreGlobal(Vue, weex, plus, setTimeout, clearTimeout, setInterval, clearInterval);
  31. }
  32. (function(vue) {
  33. "use strict";
  34. const _export_sfc = (sfc, props) => {
  35. const target = sfc.__vccOpts || sfc;
  36. for (const [key, val] of props) {
  37. target[key] = val;
  38. }
  39. return target;
  40. };
  41. const _sfc_main$C = {
  42. name: "privacy-popup",
  43. props: {
  44. visible: {
  45. type: Boolean,
  46. default: false
  47. },
  48. title: {
  49. type: String,
  50. default: "协议标题"
  51. },
  52. content: {
  53. type: String,
  54. // 备用,主要用 slot
  55. default: ""
  56. }
  57. },
  58. methods: {
  59. close() {
  60. this.$emit("close");
  61. }
  62. }
  63. };
  64. function _sfc_render$B(_ctx, _cache, $props, $setup, $data, $options) {
  65. return $props.visible ? (vue.openBlock(), vue.createElementBlock("view", {
  66. key: 0,
  67. class: "popup-mask",
  68. onClick: _cache[2] || (_cache[2] = vue.withModifiers(() => {
  69. }, ["stop"]))
  70. }, [
  71. vue.createElementVNode("view", { class: "popup-content" }, [
  72. vue.createElementVNode("view", { class: "popup-header" }, [
  73. vue.createElementVNode(
  74. "text",
  75. { class: "popup-title" },
  76. vue.toDisplayString($props.title),
  77. 1
  78. /* TEXT */
  79. ),
  80. vue.createElementVNode("view", {
  81. class: "close-icon",
  82. onClick: _cache[0] || (_cache[0] = (...args) => $options.close && $options.close(...args))
  83. }, "×")
  84. ]),
  85. vue.createElementVNode("scroll-view", {
  86. "scroll-y": "",
  87. class: "popup-body"
  88. }, [
  89. vue.renderSlot(_ctx.$slots, "default", {}, () => [
  90. vue.createElementVNode(
  91. "text",
  92. { class: "default-text" },
  93. vue.toDisplayString($props.content),
  94. 1
  95. /* TEXT */
  96. )
  97. ], true)
  98. ]),
  99. vue.createElementVNode("view", { class: "popup-footer" }, [
  100. vue.createElementVNode("button", {
  101. class: "confirm-btn",
  102. onClick: _cache[1] || (_cache[1] = (...args) => $options.close && $options.close(...args))
  103. }, "我知道了")
  104. ])
  105. ])
  106. ])) : vue.createCommentVNode("v-if", true);
  107. }
  108. const __easycom_0 = /* @__PURE__ */ _export_sfc(_sfc_main$C, [["render", _sfc_render$B], ["__scopeId", "data-v-af3fbef1"], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/components/privacy-popup/privacy-popup.vue"]]);
  109. function formatAppLog(type, filename, ...args) {
  110. if (uni.__log__) {
  111. uni.__log__(type, filename, ...args);
  112. } else {
  113. console[type].apply(console, [...args, filename]);
  114. }
  115. }
  116. function resolveEasycom(component, easycom) {
  117. return typeof component === "string" ? easycom : component;
  118. }
  119. const BASE_URL = "http://192.168.0.102:8080";
  120. const CLIENT_ID = "3";
  121. const PLATFORM_CODE = "FlfAppPlatformCodeX9kR7mT3wQ5vZ8nB1jY6pD4sL0hC2gA";
  122. const PLATFORM_ID = 2;
  123. const TENANT_ID = "000000";
  124. const TOKEN_KEY = "fulfiller_token";
  125. const USER_INFO_KEY = "fulfiller_user_info";
  126. function getToken() {
  127. return uni.getStorageSync(TOKEN_KEY) || "";
  128. }
  129. function setToken(token) {
  130. uni.setStorageSync(TOKEN_KEY, token);
  131. }
  132. function removeToken() {
  133. uni.removeStorageSync(TOKEN_KEY);
  134. }
  135. function isLoggedIn() {
  136. return !!getToken();
  137. }
  138. function removeUserInfo() {
  139. uni.removeStorageSync(USER_INFO_KEY);
  140. }
  141. function clearAuth() {
  142. removeToken();
  143. removeUserInfo();
  144. }
  145. function request(options = {}) {
  146. const {
  147. url,
  148. method = "GET",
  149. data,
  150. header = {},
  151. needToken = true
  152. } = options;
  153. const headers = {
  154. "Content-Type": "application/json;charset=utf-8",
  155. "clientid": CLIENT_ID,
  156. "X-Platform-Code": PLATFORM_CODE,
  157. ...header
  158. };
  159. if (needToken) {
  160. const token = getToken();
  161. if (token) {
  162. headers["Authorization"] = "Bearer " + token;
  163. }
  164. }
  165. return new Promise((resolve, reject) => {
  166. uni.request({
  167. url: BASE_URL + url,
  168. method: method.toUpperCase(),
  169. data,
  170. header: headers,
  171. success: (res) => {
  172. const statusCode = res.statusCode;
  173. const result = res.data;
  174. if (statusCode === 401) {
  175. clearAuth();
  176. uni.showToast({ title: "登录已过期,请重新登录", icon: "none" });
  177. setTimeout(() => {
  178. uni.reLaunch({ url: "/pages/login/login" });
  179. }, 1500);
  180. return reject(new Error("未授权"));
  181. }
  182. if (statusCode !== 200) {
  183. const msg = (result == null ? void 0 : result.msg) || `请求失败(${statusCode})`;
  184. uni.showToast({ title: msg, icon: "none" });
  185. return reject(new Error(msg));
  186. }
  187. if (result.code !== void 0 && result.code !== 200) {
  188. const msg = result.msg || "操作失败";
  189. uni.showToast({ title: msg, icon: "none" });
  190. return reject(new Error(msg));
  191. }
  192. resolve(result);
  193. },
  194. fail: (err) => {
  195. uni.showToast({ title: "网络异常,请稍后重试", icon: "none" });
  196. reject(err);
  197. }
  198. });
  199. });
  200. }
  201. function loginByPassword(username, password) {
  202. return request({
  203. url: "/auth/login",
  204. method: "POST",
  205. needToken: false,
  206. data: {
  207. tenantId: TENANT_ID,
  208. platformId: PLATFORM_ID,
  209. username,
  210. password,
  211. clientId: CLIENT_ID,
  212. grantType: "fulfiller_password"
  213. // 使用履约者专用认证策略
  214. }
  215. });
  216. }
  217. function loginBySms(phonenumber, smsCode) {
  218. return request({
  219. url: "/auth/login",
  220. method: "POST",
  221. needToken: false,
  222. data: {
  223. tenantId: TENANT_ID,
  224. platformId: PLATFORM_ID,
  225. phonenumber,
  226. smsCode,
  227. clientId: CLIENT_ID,
  228. grantType: "fulfiller_sms"
  229. // 使用履约者专用认证策略
  230. }
  231. });
  232. }
  233. function sendSmsCode(phonenumber) {
  234. return request({
  235. url: "/resource/sms/code",
  236. method: "GET",
  237. needToken: false,
  238. data: { phonenumber }
  239. });
  240. }
  241. function logout() {
  242. return request({
  243. url: "/auth/logout",
  244. method: "POST"
  245. });
  246. }
  247. const logic$9 = {
  248. data() {
  249. return {
  250. currentTab: 0,
  251. // 0: 免密, 1: 密码
  252. mobile: "",
  253. code: "",
  254. password: "",
  255. showPassword: false,
  256. isAgreed: false,
  257. countDown: 0,
  258. timer: null,
  259. showAgreementModal: false,
  260. agreementTitle: "",
  261. agreementContent: "",
  262. loginLoading: false
  263. };
  264. },
  265. methods: {
  266. showAgreement(type) {
  267. this.agreementTitle = type === 1 ? "用户服务协议" : "隐私政策";
  268. if (type === 1) {
  269. this.agreementContent = "1. 服务条款\n欢迎使用宠宝平台。您在使用本服务时需遵守以下条款...\n\n2. 用户责任\n用户需对自己的行为负责...\n\n3. 账号管理\n请妥善保管您的账号密码...";
  270. } else {
  271. this.agreementContent = "1. 信息收集\n为了提供服务,我们需要收集您的手机号、地理位置、设备信息等必要数据。\n\n2. 信息使用\n您的位置信息将用于订单匹配和路径规划;您的联系方式将用于接单通知和客户沟通。\n\n3. 信息保护\n我们将采取严格的安全措施保护您的个人信息,未经授权不会向第三方披露。";
  272. }
  273. this.showAgreementModal = true;
  274. },
  275. async getVerifyCode() {
  276. if (this.currentTab === 1)
  277. return;
  278. if (this.countDown > 0)
  279. return;
  280. if (!this.mobile || this.mobile.length !== 11) {
  281. uni.showToast({ title: "请输入正确的手机号", icon: "none" });
  282. return;
  283. }
  284. try {
  285. const res = await sendSmsCode(this.mobile);
  286. this.countDown = 60;
  287. this.timer = setInterval(() => {
  288. this.countDown--;
  289. if (this.countDown <= 0) {
  290. clearInterval(this.timer);
  291. }
  292. }, 1e3);
  293. const devCode = res.data;
  294. if (devCode) {
  295. this.code = devCode;
  296. uni.showToast({ title: "验证码: " + devCode, icon: "none", duration: 3e3 });
  297. } else {
  298. uni.showToast({ title: "验证码已发送", icon: "none" });
  299. }
  300. } catch (err) {
  301. formatAppLog("error", "at pages/login/logic.js:60", "发送验证码失败:", err);
  302. }
  303. },
  304. async handleLogin() {
  305. var _a;
  306. if (!this.isAgreed) {
  307. uni.showToast({ title: "请先同意用户协议", icon: "none" });
  308. return;
  309. }
  310. if (!this.mobile) {
  311. uni.showToast({ title: "请输入手机号", icon: "none" });
  312. return;
  313. }
  314. if (this.currentTab === 0) {
  315. if (!this.code) {
  316. uni.showToast({ title: "请输入验证码", icon: "none" });
  317. return;
  318. }
  319. } else {
  320. if (!this.password) {
  321. uni.showToast({ title: "请输入密码", icon: "none" });
  322. return;
  323. }
  324. }
  325. if (this.loginLoading)
  326. return;
  327. this.loginLoading = true;
  328. try {
  329. let res;
  330. if (this.currentTab === 0) {
  331. res = await loginBySms(this.mobile, this.code);
  332. } else {
  333. res = await loginByPassword(this.mobile, this.password);
  334. }
  335. const token = ((_a = res.data) == null ? void 0 : _a.access_token) || res.access_token;
  336. if (token) {
  337. setToken(token);
  338. }
  339. uni.showToast({ title: "登录成功", icon: "success" });
  340. setTimeout(() => {
  341. uni.switchTab({
  342. url: "/pages/home/index"
  343. });
  344. }, 1e3);
  345. } catch (err) {
  346. formatAppLog("error", "at pages/login/logic.js:114", "登录失败:", err);
  347. } finally {
  348. this.loginLoading = false;
  349. }
  350. },
  351. goToRecruit() {
  352. uni.navigateTo({
  353. url: "/pages/recruit/landing"
  354. });
  355. },
  356. goToForgotPwd() {
  357. uni.navigateTo({
  358. url: "/pages/login/reset-pwd-verify"
  359. });
  360. }
  361. }
  362. };
  363. const _imports_0$4 = "/static/header.png";
  364. const _imports_1$8 = "/static/logo.png";
  365. const _sfc_main$B = {
  366. ...logic$9,
  367. components: {
  368. PrivacyPopup: __easycom_0
  369. }
  370. };
  371. function _sfc_render$A(_ctx, _cache, $props, $setup, $data, $options) {
  372. const _component_privacy_popup = resolveEasycom(vue.resolveDynamicComponent("privacy-popup"), __easycom_0);
  373. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  374. vue.createElementVNode("view", { class: "banner-area" }, [
  375. vue.createElementVNode("image", {
  376. class: "banner-img",
  377. src: _imports_0$4,
  378. mode: "widthFix"
  379. })
  380. ]),
  381. vue.createElementVNode("view", { class: "content-card" }, [
  382. vue.createElementVNode("view", { class: "logo-wrapper" }, [
  383. vue.createElementVNode("image", {
  384. class: "logo-img",
  385. src: _imports_1$8,
  386. mode: "widthFix"
  387. })
  388. ]),
  389. vue.createElementVNode("view", { class: "tabs" }, [
  390. vue.createElementVNode(
  391. "view",
  392. {
  393. class: vue.normalizeClass(["tab-item", { active: _ctx.currentTab === 0 }]),
  394. onClick: _cache[0] || (_cache[0] = ($event) => _ctx.currentTab = 0)
  395. },
  396. [
  397. vue.createElementVNode("text", { class: "tab-text" }, "免密登录"),
  398. _ctx.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  399. key: 0,
  400. class: "tab-indicator"
  401. })) : vue.createCommentVNode("v-if", true)
  402. ],
  403. 2
  404. /* CLASS */
  405. ),
  406. vue.createElementVNode("view", { class: "divider" }),
  407. vue.createElementVNode(
  408. "view",
  409. {
  410. class: vue.normalizeClass(["tab-item", { active: _ctx.currentTab === 1 }]),
  411. onClick: _cache[1] || (_cache[1] = ($event) => _ctx.currentTab = 1)
  412. },
  413. [
  414. vue.createElementVNode("text", { class: "tab-text" }, "密码登录"),
  415. _ctx.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  416. key: 0,
  417. class: "tab-indicator"
  418. })) : vue.createCommentVNode("v-if", true)
  419. ],
  420. 2
  421. /* CLASS */
  422. )
  423. ]),
  424. vue.createElementVNode("view", { class: "form-area" }, [
  425. vue.createElementVNode("view", { class: "input-group" }, [
  426. vue.createElementVNode("view", { class: "area-code" }, [
  427. vue.createElementVNode("text", null, "+86"),
  428. vue.createElementVNode("text", { class: "arrow" }, "﹀")
  429. ]),
  430. vue.withDirectives(vue.createElementVNode(
  431. "input",
  432. {
  433. class: "input",
  434. type: "number",
  435. placeholder: "手机号",
  436. "placeholder-style": "color: #ccc",
  437. "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.mobile = $event),
  438. maxlength: "11"
  439. },
  440. null,
  441. 512
  442. /* NEED_PATCH */
  443. ), [
  444. [vue.vModelText, _ctx.mobile]
  445. ])
  446. ]),
  447. _ctx.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  448. key: 0,
  449. class: "input-group"
  450. }, [
  451. vue.withDirectives(vue.createElementVNode(
  452. "input",
  453. {
  454. class: "input",
  455. type: "number",
  456. placeholder: "验证码",
  457. "placeholder-style": "color: #ccc",
  458. "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.code = $event),
  459. maxlength: "6"
  460. },
  461. null,
  462. 512
  463. /* NEED_PATCH */
  464. ), [
  465. [vue.vModelText, _ctx.code]
  466. ]),
  467. vue.createElementVNode("view", {
  468. class: "get-code-btn",
  469. onClick: _cache[4] || (_cache[4] = (...args) => _ctx.getVerifyCode && _ctx.getVerifyCode(...args))
  470. }, [
  471. vue.createElementVNode(
  472. "text",
  473. { class: "code-text" },
  474. vue.toDisplayString(_ctx.countDown > 0 ? `${_ctx.countDown}s后重试` : "获取验证码"),
  475. 1
  476. /* TEXT */
  477. )
  478. ])
  479. ])) : vue.createCommentVNode("v-if", true),
  480. _ctx.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  481. key: 1,
  482. class: "input-group"
  483. }, [
  484. vue.withDirectives(vue.createElementVNode("input", {
  485. class: "input",
  486. password: !_ctx.showPassword,
  487. type: "text",
  488. placeholder: "请输入密码",
  489. "placeholder-style": "color: #ccc",
  490. "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => _ctx.password = $event)
  491. }, null, 8, ["password"]), [
  492. [vue.vModelText, _ctx.password]
  493. ]),
  494. vue.createElementVNode("view", {
  495. class: "eye-icon",
  496. onClick: _cache[6] || (_cache[6] = ($event) => _ctx.showPassword = !_ctx.showPassword)
  497. }, [
  498. _ctx.showPassword ? (vue.openBlock(), vue.createElementBlock("svg", {
  499. key: 0,
  500. class: "svg-icon",
  501. viewBox: "0 0 24 24",
  502. fill: "none",
  503. xmlns: "http://www.w3.org/2000/svg"
  504. }, [
  505. vue.createElementVNode("path", {
  506. d: "M12 4.5C7 4.5 2.73 7.61 1 12C2.73 16.39 7 19.5 12 19.5C17 19.5 21.27 16.39 23 12C21.27 7.61 17 4.5 12 4.5ZM12 17C9.24 17 7 14.76 7 12C7 9.24 9.24 7 12 7C14.76 7 17 9.24 17 12C17 14.76 14.76 17 12 17ZM12 9C10.34 9 9 10.34 9 12C9 13.66 10.34 15 12 15C13.66 15 15 13.66 15 12C15 10.34 13.66 9 12 9Z",
  507. fill: "#CCCCCC"
  508. })
  509. ])) : (vue.openBlock(), vue.createElementBlock("svg", {
  510. key: 1,
  511. class: "svg-icon",
  512. viewBox: "0 0 24 24",
  513. fill: "none",
  514. xmlns: "http://www.w3.org/2000/svg"
  515. }, [
  516. vue.createElementVNode("path", {
  517. d: "M12 7C7 7 2.73 10.11 1 14.5",
  518. stroke: "#CCCCCC",
  519. "stroke-width": "2",
  520. "stroke-linecap": "round"
  521. }),
  522. vue.createElementVNode("path", {
  523. d: "M23 14.5C21.27 10.11 17 7 12 7",
  524. stroke: "#CCCCCC",
  525. "stroke-width": "2",
  526. "stroke-linecap": "round"
  527. }),
  528. vue.createElementVNode("path", {
  529. d: "M12 7V4",
  530. stroke: "#CCCCCC",
  531. "stroke-width": "2",
  532. "stroke-linecap": "round"
  533. }),
  534. vue.createElementVNode("path", {
  535. d: "M16 8L18 5",
  536. stroke: "#CCCCCC",
  537. "stroke-width": "2",
  538. "stroke-linecap": "round"
  539. }),
  540. vue.createElementVNode("path", {
  541. d: "M8 8L6 5",
  542. stroke: "#CCCCCC",
  543. "stroke-width": "2",
  544. "stroke-linecap": "round"
  545. }),
  546. vue.createElementVNode("path", {
  547. d: "M20 10L22 8",
  548. stroke: "#CCCCCC",
  549. "stroke-width": "2",
  550. "stroke-linecap": "round"
  551. }),
  552. vue.createElementVNode("path", {
  553. d: "M4 10L2 8",
  554. stroke: "#CCCCCC",
  555. "stroke-width": "2",
  556. "stroke-linecap": "round"
  557. })
  558. ]))
  559. ])
  560. ])) : vue.createCommentVNode("v-if", true),
  561. _ctx.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  562. key: 2,
  563. class: "forgot-pwd"
  564. }, [
  565. vue.createElementVNode("text", {
  566. onClick: _cache[7] || (_cache[7] = (...args) => _ctx.goToForgotPwd && _ctx.goToForgotPwd(...args))
  567. }, "忘记密码?")
  568. ])) : vue.createCommentVNode("v-if", true),
  569. vue.createElementVNode("button", {
  570. class: "login-btn",
  571. onClick: _cache[8] || (_cache[8] = (...args) => _ctx.handleLogin && _ctx.handleLogin(...args))
  572. }, "登 录"),
  573. vue.createElementVNode("view", { class: "agreement" }, [
  574. vue.createElementVNode(
  575. "view",
  576. {
  577. class: vue.normalizeClass(["checkbox", { checked: _ctx.isAgreed }]),
  578. onClick: _cache[9] || (_cache[9] = ($event) => _ctx.isAgreed = !_ctx.isAgreed)
  579. },
  580. [
  581. _ctx.isAgreed ? (vue.openBlock(), vue.createElementBlock("text", {
  582. key: 0,
  583. class: "check-mark"
  584. }, "✓")) : vue.createCommentVNode("v-if", true)
  585. ],
  586. 2
  587. /* CLASS */
  588. ),
  589. vue.createElementVNode("text", { class: "agree-text" }, [
  590. vue.createTextVNode(" 我已经阅读并同意 "),
  591. vue.createElementVNode("text", {
  592. class: "link",
  593. onClick: _cache[10] || (_cache[10] = vue.withModifiers(($event) => _ctx.showAgreement(1), ["stop"]))
  594. }, "《用户服务协议》"),
  595. vue.createTextVNode(" 和 "),
  596. vue.createElementVNode("text", {
  597. class: "link",
  598. onClick: _cache[11] || (_cache[11] = vue.withModifiers(($event) => _ctx.showAgreement(2), ["stop"]))
  599. }, "《隐私政策》")
  600. ])
  601. ])
  602. ]),
  603. vue.createElementVNode("view", {
  604. class: "footer-recruit",
  605. onClick: _cache[12] || (_cache[12] = (...args) => _ctx.goToRecruit && _ctx.goToRecruit(...args))
  606. }, [
  607. vue.createElementVNode("view", { class: "recruit-badge" }, [
  608. (vue.openBlock(), vue.createElementBlock("svg", {
  609. class: "svg-icon flag-icon",
  610. viewBox: "0 0 24 24",
  611. fill: "none",
  612. xmlns: "http://www.w3.org/2000/svg",
  613. style: { "width": "30rpx", "height": "30rpx" }
  614. }, [
  615. vue.createElementVNode("path", {
  616. d: "M4 14V4H18L17 9L18 14H4Z",
  617. stroke: "#FF5722",
  618. "stroke-width": "2",
  619. "stroke-linejoin": "round"
  620. }),
  621. vue.createElementVNode("path", {
  622. d: "M4 22V14",
  623. stroke: "#FF5722",
  624. "stroke-width": "2",
  625. "stroke-linecap": "round"
  626. })
  627. ])),
  628. vue.createElementVNode("text", null, " 宠宝履约者招募")
  629. ])
  630. ]),
  631. vue.createVNode(_component_privacy_popup, {
  632. visible: _ctx.showAgreementModal,
  633. title: _ctx.agreementTitle,
  634. content: _ctx.agreementContent,
  635. onClose: _cache[13] || (_cache[13] = ($event) => _ctx.showAgreementModal = false)
  636. }, null, 8, ["visible", "title", "content"])
  637. ])
  638. ]);
  639. }
  640. const PagesLoginLogin = /* @__PURE__ */ _export_sfc(_sfc_main$B, [["render", _sfc_render$A], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/login/login.vue"]]);
  641. const logic$8 = {
  642. data() {
  643. return {
  644. statusBarHeight: 20
  645. // 默认状态栏高度
  646. };
  647. },
  648. onLoad() {
  649. const sysInfo = uni.getSystemInfoSync();
  650. this.statusBarHeight = sysInfo.statusBarHeight || 20;
  651. },
  652. methods: {
  653. goBack() {
  654. const pages = getCurrentPages();
  655. if (pages.length > 1) {
  656. uni.navigateBack();
  657. } else {
  658. uni.reLaunch({
  659. url: "/pages/login/login"
  660. });
  661. }
  662. },
  663. goToForm() {
  664. uni.navigateTo({
  665. url: "/pages/recruit/form"
  666. });
  667. }
  668. }
  669. };
  670. const _sfc_main$A = logic$8;
  671. function _sfc_render$z(_ctx, _cache, $props, $setup, $data, $options) {
  672. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  673. vue.createElementVNode(
  674. "view",
  675. {
  676. style: vue.normalizeStyle({ height: _ctx.statusBarHeight + "px" })
  677. },
  678. null,
  679. 4
  680. /* STYLE */
  681. ),
  682. vue.createElementVNode("view", { class: "nav-bar" }, [
  683. vue.createElementVNode("view", {
  684. class: "back-icon",
  685. onClick: _cache[0] || (_cache[0] = (...args) => _ctx.goBack && _ctx.goBack(...args))
  686. }, "‹")
  687. ]),
  688. vue.createElementVNode("view", { class: "header-area" }, [
  689. vue.createElementVNode("text", { class: "main-title" }, "加入宠宝履约者"),
  690. vue.createElementVNode("text", { class: "sub-title" }, "月薪最高可达1.5万元")
  691. ]),
  692. vue.createElementVNode("view", { class: "content-card" }, [
  693. vue.createElementVNode("view", { class: "benefit-item" }, [
  694. vue.createElementVNode("view", { class: "icon-circle icon-money" }, [
  695. vue.createElementVNode("text", { class: "icon-text" }, "¥")
  696. ]),
  697. vue.createElementVNode("view", { class: "info" }, [
  698. vue.createElementVNode("text", { class: "item-title" }, "1、收入可观"),
  699. vue.createElementVNode("text", { class: "item-desc" }, "小默配送为您提供一种全新的赚钱选择,利用空闲时间,获得更多收入。")
  700. ])
  701. ]),
  702. vue.createElementVNode("view", { class: "benefit-item" }, [
  703. vue.createElementVNode("view", { class: "icon-circle icon-loc" }, [
  704. vue.createElementVNode("text", { class: "icon-text" }, "📍")
  705. ]),
  706. vue.createElementVNode("view", { class: "info" }, [
  707. vue.createElementVNode("text", { class: "item-title" }, "2、地点灵活"),
  708. vue.createElementVNode("text", { class: "item-desc" }, "小默配送覆盖国内各城市与港澳台等地,您可随时就近使用。")
  709. ])
  710. ]),
  711. vue.createElementVNode("view", { class: "benefit-item" }, [
  712. vue.createElementVNode("view", { class: "icon-circle icon-clock" }, [
  713. vue.createElementVNode("text", { class: "icon-text" }, "🕒")
  714. ]),
  715. vue.createElementVNode("view", { class: "info" }, [
  716. vue.createElementVNode("text", { class: "item-title" }, "3、时间自由"),
  717. vue.createElementVNode("text", { class: "item-desc" }, "不必再受繁琐事务约束,加入小默配送,自由分配个人时间,为自己工作。")
  718. ])
  719. ])
  720. ]),
  721. vue.createElementVNode("view", { class: "footer-area" }, [
  722. vue.createElementVNode("button", {
  723. class: "join-btn",
  724. onClick: _cache[1] || (_cache[1] = (...args) => _ctx.goToForm && _ctx.goToForm(...args))
  725. }, "我要加入"),
  726. vue.createElementVNode("view", { class: "faq" }, [
  727. vue.createElementVNode("text", { class: "help-icon" }, "?"),
  728. vue.createTextVNode(" 常见问题 ")
  729. ])
  730. ])
  731. ]);
  732. }
  733. const PagesRecruitLanding = /* @__PURE__ */ _export_sfc(_sfc_main$A, [["render", _sfc_render$z], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/recruit/landing.vue"]]);
  734. function getMyProfile() {
  735. return request({
  736. url: "/fulfiller/fulfiller/my",
  737. method: "GET"
  738. });
  739. }
  740. function submitAudit(data) {
  741. return request({
  742. url: "/fulfiller/app/audit/submit",
  743. method: "POST",
  744. needToken: false,
  745. data
  746. });
  747. }
  748. function getAreaChildren(parentId = 0) {
  749. return request({
  750. url: "/fulfiller/app/area/children",
  751. method: "GET",
  752. needToken: false,
  753. data: { parentId }
  754. });
  755. }
  756. function uploadFile(filePath) {
  757. return new Promise((resolve, reject) => {
  758. uni.uploadFile({
  759. url: BASE_URL + "/fulfiller/app/upload",
  760. filePath,
  761. name: "file",
  762. header: {
  763. "clientid": CLIENT_ID,
  764. "X-Platform-Code": PLATFORM_CODE
  765. },
  766. success: (res) => {
  767. try {
  768. const data = JSON.parse(res.data);
  769. if (data.code === 200) {
  770. resolve(data);
  771. } else {
  772. uni.showToast({ title: data.msg || "上传失败", icon: "none" });
  773. reject(data);
  774. }
  775. } catch (e) {
  776. reject(e);
  777. }
  778. },
  779. fail: (err) => {
  780. uni.showToast({ title: "上传失败", icon: "none" });
  781. reject(err);
  782. }
  783. });
  784. });
  785. }
  786. function updateAvatar(avatar) {
  787. return request({
  788. url: "/fulfiller/fulfiller/my/avatar",
  789. method: "PUT",
  790. data: { avatar }
  791. });
  792. }
  793. function updateName(name) {
  794. return request({
  795. url: "/fulfiller/fulfiller/my/name",
  796. method: "PUT",
  797. data: { name }
  798. });
  799. }
  800. function updateStatus(status) {
  801. return request({
  802. url: "/fulfiller/fulfiller/my/status",
  803. method: "PUT",
  804. data: { status }
  805. });
  806. }
  807. function updateCity(cityCode, cityName) {
  808. return request({
  809. url: "/fulfiller/fulfiller/my/city",
  810. method: "PUT",
  811. data: { cityCode, cityName }
  812. });
  813. }
  814. function getAuthInfo() {
  815. return request({
  816. url: "/fulfiller/fulfiller/my/auth",
  817. method: "GET"
  818. });
  819. }
  820. function updatePhone(phone, code) {
  821. return request({
  822. url: "/fulfiller/fulfiller/my/phone",
  823. method: "PUT",
  824. data: { phone, code }
  825. });
  826. }
  827. function updatePassword(oldPassword, newPassword) {
  828. return request({
  829. url: "/fulfiller/fulfiller/my/password",
  830. method: "PUT",
  831. data: { oldPassword, newPassword }
  832. });
  833. }
  834. function deleteAccount() {
  835. return request({
  836. url: "/fulfiller/fulfiller/my/account",
  837. method: "DELETE"
  838. });
  839. }
  840. function updateAuthInfo(data) {
  841. return request({
  842. url: "/fulfiller/fulfiller/my/auth",
  843. method: "POST",
  844. data
  845. });
  846. }
  847. function getPendingOrders(params) {
  848. return request({
  849. url: "/order/subOrder/listPendingAccept",
  850. method: "GET",
  851. data: params
  852. });
  853. }
  854. function acceptOrder(orderId) {
  855. return request({
  856. url: "/order/subOrder/accept",
  857. method: "PUT",
  858. data: { orderId }
  859. });
  860. }
  861. function getOrderCount() {
  862. return request({
  863. url: "/order/subOrder/count",
  864. method: "GET"
  865. });
  866. }
  867. const logic$7 = {
  868. data() {
  869. return {
  870. formData: {
  871. mobile: "",
  872. code: "",
  873. name: "",
  874. gender: 1,
  875. // 1男 2女
  876. birthday: "",
  877. password: "",
  878. serviceType: [],
  879. city: "",
  880. station: "",
  881. stationId: null
  882. },
  883. showPwd: false,
  884. isAgreed: false,
  885. serviceTypes: ["宠物接送", "上门喂遛", "上门洗护"],
  886. // 验证码倒计时
  887. countDown: 0,
  888. timer: null,
  889. // 日期选择器相关
  890. showPicker: false,
  891. years: [],
  892. months: [],
  893. days: [],
  894. pickerValue: [0, 0, 0],
  895. tempYear: 0,
  896. tempMonth: 0,
  897. tempDay: 0,
  898. // 城市选择器相关(从后端加载)
  899. showCityPicker: false,
  900. selectStep: 0,
  901. selectedPathway: [],
  902. currentList: [],
  903. selectedCityId: null,
  904. // 站点选择器相关(从后端加载)
  905. showStationPicker: false,
  906. stationList: [],
  907. // 协议弹窗
  908. showPrivacy: false,
  909. privacyTitle: "",
  910. privacyContent: ""
  911. };
  912. },
  913. created() {
  914. this.initDateData();
  915. },
  916. beforeDestroy() {
  917. if (this.timer)
  918. clearInterval(this.timer);
  919. },
  920. methods: {
  921. initDateData() {
  922. const now = /* @__PURE__ */ new Date();
  923. const currentYear = now.getFullYear();
  924. for (let i = 1980; i <= currentYear + 5; i++) {
  925. this.years.push(i);
  926. }
  927. for (let i = 1; i <= 12; i++) {
  928. this.months.push(i);
  929. }
  930. for (let i = 1; i <= 31; i++) {
  931. this.days.push(i);
  932. }
  933. },
  934. // 打开选择器
  935. openPicker() {
  936. const dateStr = this.formData.birthday || "2000-01-01";
  937. const [y, m, d] = dateStr.split("-").map(Number);
  938. const yIndex = this.years.indexOf(y);
  939. const mIndex = this.months.indexOf(m);
  940. const dIndex = this.days.indexOf(d);
  941. this.pickerValue = [
  942. yIndex > -1 ? yIndex : 0,
  943. mIndex > -1 ? mIndex : 0,
  944. dIndex > -1 ? dIndex : 0
  945. ];
  946. this.tempYear = this.years[this.pickerValue[0]];
  947. this.tempMonth = this.months[this.pickerValue[1]];
  948. this.tempDay = this.days[this.pickerValue[2]];
  949. this.showPicker = true;
  950. },
  951. closePicker() {
  952. this.showPicker = false;
  953. },
  954. onPickerChange(e) {
  955. const val = e.detail.value;
  956. this.tempYear = this.years[val[0]];
  957. this.tempMonth = this.months[val[1]];
  958. this.tempDay = this.days[val[2]];
  959. },
  960. confirmPicker() {
  961. const mStr = this.tempMonth < 10 ? "0" + this.tempMonth : this.tempMonth;
  962. const dStr = this.tempDay < 10 ? "0" + this.tempDay : this.tempDay;
  963. this.formData.birthday = `${this.tempYear}-${mStr}-${dStr}`;
  964. this.closePicker();
  965. },
  966. toggleService(item) {
  967. const idx = this.formData.serviceType.indexOf(item);
  968. if (idx > -1) {
  969. this.formData.serviceType.splice(idx, 1);
  970. } else {
  971. this.formData.serviceType.push(item);
  972. }
  973. },
  974. // 验证码
  975. async getVerifyCode() {
  976. if (this.countDown > 0)
  977. return;
  978. if (!this.formData.mobile || this.formData.mobile.length !== 11) {
  979. uni.showToast({ title: "请输入正确的手机号", icon: "none" });
  980. return;
  981. }
  982. try {
  983. const res = await sendSmsCode(this.formData.mobile);
  984. this.countDown = 60;
  985. this.timer = setInterval(() => {
  986. this.countDown--;
  987. if (this.countDown <= 0)
  988. clearInterval(this.timer);
  989. }, 1e3);
  990. const devCode = res.data;
  991. if (devCode) {
  992. this.formData.code = devCode;
  993. uni.showToast({ title: "验证码: " + devCode, icon: "none", duration: 3e3 });
  994. } else {
  995. uni.showToast({ title: "验证码已发送", icon: "none" });
  996. }
  997. } catch (err) {
  998. formatAppLog("error", "at pages/recruit/logic.js:154", "发送验证码失败:", err);
  999. }
  1000. },
  1001. // 城市选择器 logic(从后端加载)
  1002. async openCityPicker() {
  1003. this.showCityPicker = true;
  1004. if (this.selectedPathway.length === 0) {
  1005. await this.resetCityPicker();
  1006. }
  1007. },
  1008. async resetCityPicker() {
  1009. this.selectStep = 0;
  1010. this.selectedPathway = [];
  1011. await this.loadAreaChildren(0);
  1012. },
  1013. closeCityPicker() {
  1014. this.showCityPicker = false;
  1015. },
  1016. async loadAreaChildren(parentId) {
  1017. try {
  1018. const res = await getAreaChildren(parentId);
  1019. this.currentList = (res.data || []).filter((item) => item.type !== 2).map((item) => ({
  1020. id: item.id,
  1021. name: item.name,
  1022. type: item.type,
  1023. parentId: item.parentId
  1024. }));
  1025. } catch (err) {
  1026. formatAppLog("error", "at pages/recruit/logic.js:186", "加载区域数据失败:", err);
  1027. this.currentList = [];
  1028. }
  1029. },
  1030. async selectCityItem(item) {
  1031. this.selectedPathway[this.selectStep] = item;
  1032. if (item.type === 0) {
  1033. this.selectStep++;
  1034. this.selectedPathway = this.selectedPathway.slice(0, this.selectStep);
  1035. await this.loadAreaChildren(item.id);
  1036. if (this.currentList.length === 0) {
  1037. this.selectedCityId = item.id;
  1038. this.confirmCity();
  1039. }
  1040. } else {
  1041. this.selectedCityId = item.id;
  1042. this.confirmCity();
  1043. }
  1044. },
  1045. async jumpToStep(step) {
  1046. this.selectStep = step;
  1047. if (step === 0) {
  1048. await this.loadAreaChildren(0);
  1049. } else {
  1050. const parent = this.selectedPathway[step - 1];
  1051. if (parent) {
  1052. await this.loadAreaChildren(parent.id);
  1053. }
  1054. }
  1055. },
  1056. confirmCity() {
  1057. const fullPath = this.selectedPathway.map((i) => i.name).join(" ");
  1058. this.formData.city = fullPath;
  1059. this.formData.station = "";
  1060. this.formData.stationId = null;
  1061. const lastSelected = this.selectedPathway[this.selectedPathway.length - 1];
  1062. if (lastSelected) {
  1063. this.loadStations(lastSelected.id);
  1064. }
  1065. this.closeCityPicker();
  1066. },
  1067. // 站点选择器(从后端加载,只取type=2的站点)
  1068. async loadStations(parentId) {
  1069. try {
  1070. const res = await getAreaChildren(parentId);
  1071. this.stationList = (res.data || []).filter((item) => item.type === 2).map((item) => ({
  1072. id: item.id,
  1073. name: item.name
  1074. }));
  1075. } catch (err) {
  1076. formatAppLog("error", "at pages/recruit/logic.js:245", "加载站点数据失败:", err);
  1077. this.stationList = [];
  1078. }
  1079. },
  1080. openStationPicker() {
  1081. if (this.stationList.length === 0) {
  1082. uni.showToast({ title: "请先选择工作城市", icon: "none" });
  1083. return;
  1084. }
  1085. this.showStationPicker = true;
  1086. },
  1087. closeStationPicker() {
  1088. this.showStationPicker = false;
  1089. },
  1090. selectStation(item) {
  1091. this.formData.station = item.name;
  1092. this.formData.stationId = item.id;
  1093. this.closeStationPicker();
  1094. },
  1095. openPrivacy() {
  1096. this.privacyTitle = "宠宝履约者说明";
  1097. this.privacyContent = "1. 履约职责\n作为宠宝履约者,您需要按照平台标准完成宠物接送、喂遛或洗护服务,确保宠物安全与健康。\n\n2. 结算方式\n服务费用将根据订单类型和距离计算,定期结算至您的账户。具体结算周期请查看钱包说明。\n\n3. 行为规范\n请在这个过程中保持专业,穿着整洁,礼貌待人。严禁虐待宠物,违反者将承担法律责任。";
  1098. this.showPrivacy = true;
  1099. },
  1100. goToAuth() {
  1101. if (!this.isAgreed) {
  1102. uni.showToast({ title: "请勾选协议", icon: "none" });
  1103. return;
  1104. }
  1105. if (!this.formData.mobile || this.formData.mobile.length !== 11) {
  1106. uni.showToast({ title: "请输入正确的手机号", icon: "none" });
  1107. return;
  1108. }
  1109. if (!this.formData.name) {
  1110. uni.showToast({ title: "请输入姓名", icon: "none" });
  1111. return;
  1112. }
  1113. if (this.formData.serviceType.length === 0) {
  1114. uni.showToast({ title: "请选择服务类型", icon: "none" });
  1115. return;
  1116. }
  1117. uni.setStorageSync("recruit_form_data", JSON.stringify(this.formData));
  1118. const services = JSON.stringify(this.formData.serviceType);
  1119. uni.navigateTo({
  1120. url: `/pages/recruit/auth?services=${services}`
  1121. });
  1122. }
  1123. }
  1124. };
  1125. const _sfc_main$z = {
  1126. ...logic$7,
  1127. components: {
  1128. PrivacyPopup: __easycom_0
  1129. }
  1130. };
  1131. function _sfc_render$y(_ctx, _cache, $props, $setup, $data, $options) {
  1132. const _component_privacy_popup = resolveEasycom(vue.resolveDynamicComponent("privacy-popup"), __easycom_0);
  1133. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  1134. vue.createElementVNode("view", { class: "card" }, [
  1135. vue.createElementVNode("view", { class: "form-item" }, [
  1136. vue.createElementVNode("text", { class: "label" }, "手机号"),
  1137. vue.createElementVNode("view", { class: "input-box" }, [
  1138. vue.createElementVNode("view", { class: "prefix-area" }, [
  1139. vue.createElementVNode("text", { class: "prefix" }, "+86"),
  1140. vue.createElementVNode("text", { class: "arrow-down" }, "﹀")
  1141. ]),
  1142. vue.withDirectives(vue.createElementVNode(
  1143. "input",
  1144. {
  1145. class: "input",
  1146. type: "number",
  1147. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.formData.mobile = $event)
  1148. },
  1149. null,
  1150. 512
  1151. /* NEED_PATCH */
  1152. ), [
  1153. [vue.vModelText, _ctx.formData.mobile]
  1154. ])
  1155. ])
  1156. ]),
  1157. vue.createElementVNode("view", { class: "form-item" }, [
  1158. vue.createElementVNode("text", { class: "label" }, "验证码"),
  1159. vue.createElementVNode("view", { class: "input-box" }, [
  1160. vue.withDirectives(vue.createElementVNode(
  1161. "input",
  1162. {
  1163. class: "input",
  1164. type: "number",
  1165. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.formData.code = $event),
  1166. placeholder: "验证码"
  1167. },
  1168. null,
  1169. 512
  1170. /* NEED_PATCH */
  1171. ), [
  1172. [vue.vModelText, _ctx.formData.code]
  1173. ]),
  1174. vue.createElementVNode(
  1175. "text",
  1176. {
  1177. class: "get-code-text",
  1178. onClick: _cache[2] || (_cache[2] = (...args) => _ctx.getVerifyCode && _ctx.getVerifyCode(...args))
  1179. },
  1180. vue.toDisplayString(_ctx.countDown > 0 ? _ctx.countDown + "s" : "获取验证码"),
  1181. 1
  1182. /* TEXT */
  1183. )
  1184. ])
  1185. ]),
  1186. vue.createElementVNode("view", { class: "form-item" }, [
  1187. vue.createElementVNode("text", { class: "label" }, "姓名"),
  1188. vue.createElementVNode("view", { class: "input-box" }, [
  1189. vue.withDirectives(vue.createElementVNode(
  1190. "input",
  1191. {
  1192. class: "input",
  1193. type: "text",
  1194. "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.formData.name = $event)
  1195. },
  1196. null,
  1197. 512
  1198. /* NEED_PATCH */
  1199. ), [
  1200. [vue.vModelText, _ctx.formData.name]
  1201. ])
  1202. ])
  1203. ]),
  1204. vue.createElementVNode("view", { class: "form-item" }, [
  1205. vue.createElementVNode("text", { class: "label" }, "性别"),
  1206. vue.createElementVNode("view", { class: "gender-group" }, [
  1207. vue.createElementVNode("view", {
  1208. class: "radio-item",
  1209. onClick: _cache[4] || (_cache[4] = ($event) => _ctx.formData.gender = 1)
  1210. }, [
  1211. vue.createElementVNode(
  1212. "text",
  1213. {
  1214. class: vue.normalizeClass(["radio-icon", { active: _ctx.formData.gender === 1 }])
  1215. },
  1216. vue.toDisplayString(_ctx.formData.gender === 1 ? "♂" : "○"),
  1217. 3
  1218. /* TEXT, CLASS */
  1219. ),
  1220. vue.createElementVNode(
  1221. "text",
  1222. {
  1223. class: vue.normalizeClass(["radio-label", { active: _ctx.formData.gender === 1 }])
  1224. },
  1225. " 男",
  1226. 2
  1227. /* CLASS */
  1228. )
  1229. ]),
  1230. vue.createElementVNode("view", {
  1231. class: "radio-item",
  1232. onClick: _cache[5] || (_cache[5] = ($event) => _ctx.formData.gender = 2)
  1233. }, [
  1234. vue.createElementVNode(
  1235. "text",
  1236. {
  1237. class: vue.normalizeClass(["radio-icon", { active: _ctx.formData.gender === 2 }])
  1238. },
  1239. vue.toDisplayString(_ctx.formData.gender === 2 ? "♀" : "○"),
  1240. 3
  1241. /* TEXT, CLASS */
  1242. ),
  1243. vue.createElementVNode(
  1244. "text",
  1245. {
  1246. class: vue.normalizeClass(["radio-label", { active: _ctx.formData.gender === 2 }])
  1247. },
  1248. " 女",
  1249. 2
  1250. /* CLASS */
  1251. )
  1252. ])
  1253. ])
  1254. ]),
  1255. vue.createElementVNode("view", { class: "form-item" }, [
  1256. vue.createElementVNode("text", { class: "label" }, "生日"),
  1257. vue.createElementVNode("view", {
  1258. class: "input-box",
  1259. onClick: _cache[6] || (_cache[6] = (...args) => _ctx.openPicker && _ctx.openPicker(...args))
  1260. }, [
  1261. vue.createElementVNode(
  1262. "text",
  1263. null,
  1264. vue.toDisplayString(_ctx.formData.birthday || "请选择生日"),
  1265. 1
  1266. /* TEXT */
  1267. ),
  1268. (vue.openBlock(), vue.createElementBlock("svg", {
  1269. class: "arrow-right",
  1270. style: { "width": "24rpx", "height": "24rpx", "margin-left": "auto" },
  1271. viewBox: "0 0 1024 1024",
  1272. version: "1.1",
  1273. xmlns: "http://www.w3.org/2000/svg"
  1274. }, [
  1275. vue.createElementVNode("path", {
  1276. d: "M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-45.056L382.592 149.312a29.12 29.12 0 0 0-41.728 0z",
  1277. fill: "#CCCCCC"
  1278. })
  1279. ]))
  1280. ])
  1281. ]),
  1282. vue.createElementVNode("view", { class: "form-item" }, [
  1283. vue.createElementVNode("text", { class: "label" }, "密码"),
  1284. vue.createElementVNode("view", { class: "input-box" }, [
  1285. vue.withDirectives(vue.createElementVNode("input", {
  1286. class: "input",
  1287. password: !_ctx.showPwd,
  1288. "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => _ctx.formData.password = $event),
  1289. placeholder: "设置登录密码"
  1290. }, null, 8, ["password"]), [
  1291. [vue.vModelText, _ctx.formData.password]
  1292. ]),
  1293. vue.createElementVNode("view", {
  1294. class: "monkey-icon",
  1295. onClick: _cache[8] || (_cache[8] = ($event) => _ctx.showPwd = !_ctx.showPwd)
  1296. }, [
  1297. _ctx.showPwd ? (vue.openBlock(), vue.createElementBlock("svg", {
  1298. key: 0,
  1299. class: "svg-icon",
  1300. viewBox: "0 0 24 24",
  1301. fill: "none",
  1302. xmlns: "http://www.w3.org/2000/svg"
  1303. }, [
  1304. vue.createElementVNode("path", {
  1305. d: "M12 4.5C7 4.5 2.73 7.61 1 12C2.73 16.39 7 19.5 12 19.5C17 19.5 21.27 16.39 23 12C21.27 7.61 17 4.5 12 4.5ZM12 17C9.24 17 7 14.76 7 12C7 9.24 9.24 7 12 7C14.76 7 17 9.24 17 12C17 14.76 14.76 17 12 17ZM12 9C10.34 9 9 10.34 9 12C9 13.66 10.34 15 12 15C13.66 15 15 13.66 15 12C15 10.34 13.66 9 12 9Z",
  1306. fill: "#CCCCCC"
  1307. })
  1308. ])) : (vue.openBlock(), vue.createElementBlock("svg", {
  1309. key: 1,
  1310. class: "svg-icon",
  1311. viewBox: "0 0 24 24",
  1312. fill: "none",
  1313. xmlns: "http://www.w3.org/2000/svg"
  1314. }, [
  1315. vue.createElementVNode("path", {
  1316. d: "M12 7C7 7 2.73 10.11 1 14.5",
  1317. stroke: "#CCCCCC",
  1318. "stroke-width": "2",
  1319. "stroke-linecap": "round"
  1320. }),
  1321. vue.createElementVNode("path", {
  1322. d: "M23 14.5C21.27 10.11 17 7 12 7",
  1323. stroke: "#CCCCCC",
  1324. "stroke-width": "2",
  1325. "stroke-linecap": "round"
  1326. }),
  1327. vue.createElementVNode("path", {
  1328. d: "M12 7V4",
  1329. stroke: "#CCCCCC",
  1330. "stroke-width": "2",
  1331. "stroke-linecap": "round"
  1332. }),
  1333. vue.createElementVNode("path", {
  1334. d: "M16 8L18 5",
  1335. stroke: "#CCCCCC",
  1336. "stroke-width": "2",
  1337. "stroke-linecap": "round"
  1338. }),
  1339. vue.createElementVNode("path", {
  1340. d: "M8 8L6 5",
  1341. stroke: "#CCCCCC",
  1342. "stroke-width": "2",
  1343. "stroke-linecap": "round"
  1344. }),
  1345. vue.createElementVNode("path", {
  1346. d: "M20 10L22 8",
  1347. stroke: "#CCCCCC",
  1348. "stroke-width": "2",
  1349. "stroke-linecap": "round"
  1350. }),
  1351. vue.createElementVNode("path", {
  1352. d: "M4 10L2 8",
  1353. stroke: "#CCCCCC",
  1354. "stroke-width": "2",
  1355. "stroke-linecap": "round"
  1356. })
  1357. ]))
  1358. ])
  1359. ])
  1360. ])
  1361. ]),
  1362. vue.createElementVNode("view", { class: "card" }, [
  1363. vue.createElementVNode("view", { class: "section-title" }, "服务类型"),
  1364. vue.createElementVNode("view", { class: "service-types" }, [
  1365. (vue.openBlock(true), vue.createElementBlock(
  1366. vue.Fragment,
  1367. null,
  1368. vue.renderList(_ctx.serviceTypes, (item, index) => {
  1369. return vue.openBlock(), vue.createElementBlock("view", {
  1370. class: vue.normalizeClass(["type-btn", { selected: _ctx.formData.serviceType.includes(item) }]),
  1371. key: index,
  1372. onClick: ($event) => _ctx.toggleService(item)
  1373. }, vue.toDisplayString(item), 11, ["onClick"]);
  1374. }),
  1375. 128
  1376. /* KEYED_FRAGMENT */
  1377. ))
  1378. ]),
  1379. vue.createElementVNode("view", { class: "form-item" }, [
  1380. vue.createElementVNode("text", { class: "label" }, "工作城市"),
  1381. vue.createElementVNode("view", {
  1382. class: "input-box",
  1383. onClick: _cache[9] || (_cache[9] = (...args) => _ctx.openCityPicker && _ctx.openCityPicker(...args))
  1384. }, [
  1385. vue.createElementVNode(
  1386. "text",
  1387. {
  1388. style: vue.normalizeStyle({ color: _ctx.formData.city ? "#333" : "#ccc" })
  1389. },
  1390. vue.toDisplayString(_ctx.formData.city || "请选择工作城市"),
  1391. 5
  1392. /* TEXT, STYLE */
  1393. ),
  1394. (vue.openBlock(), vue.createElementBlock("svg", {
  1395. class: "arrow-right",
  1396. style: { "width": "24rpx", "height": "24rpx", "margin-left": "auto" },
  1397. viewBox: "0 0 1024 1024",
  1398. version: "1.1",
  1399. xmlns: "http://www.w3.org/2000/svg"
  1400. }, [
  1401. vue.createElementVNode("path", {
  1402. d: "M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-45.056L382.592 149.312a29.12 29.12 0 0 0-41.728 0z",
  1403. fill: "#CCCCCC"
  1404. })
  1405. ]))
  1406. ])
  1407. ]),
  1408. vue.createElementVNode("view", { class: "form-item" }, [
  1409. vue.createElementVNode("text", { class: "label" }, "服务站点"),
  1410. vue.createElementVNode("view", {
  1411. class: "input-box",
  1412. onClick: _cache[10] || (_cache[10] = (...args) => _ctx.openStationPicker && _ctx.openStationPicker(...args))
  1413. }, [
  1414. vue.createElementVNode(
  1415. "text",
  1416. {
  1417. style: vue.normalizeStyle({ color: _ctx.formData.station ? "#333" : "#ccc" })
  1418. },
  1419. vue.toDisplayString(_ctx.formData.station || "请选择服务站点"),
  1420. 5
  1421. /* TEXT, STYLE */
  1422. ),
  1423. (vue.openBlock(), vue.createElementBlock("svg", {
  1424. class: "arrow-right",
  1425. style: { "width": "24rpx", "height": "24rpx", "margin-left": "auto" },
  1426. viewBox: "0 0 1024 1024",
  1427. version: "1.1",
  1428. xmlns: "http://www.w3.org/2000/svg"
  1429. }, [
  1430. vue.createElementVNode("path", {
  1431. d: "M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-45.056L382.592 149.312a29.12 29.12 0 0 0-41.728 0z",
  1432. fill: "#CCCCCC"
  1433. })
  1434. ]))
  1435. ])
  1436. ])
  1437. ]),
  1438. vue.createElementVNode(
  1439. "view",
  1440. {
  1441. class: vue.normalizeClass(["picker-mask", { show: _ctx.showCityPicker }]),
  1442. onClick: _cache[14] || (_cache[14] = (...args) => _ctx.closeCityPicker && _ctx.closeCityPicker(...args))
  1443. },
  1444. [
  1445. vue.createElementVNode("view", {
  1446. class: "picker-content",
  1447. onClick: _cache[13] || (_cache[13] = vue.withModifiers(() => {
  1448. }, ["stop"]))
  1449. }, [
  1450. vue.createElementVNode("view", { class: "picker-header" }, [
  1451. vue.createElementVNode("text", {
  1452. class: "picker-btn-cancel",
  1453. onClick: _cache[11] || (_cache[11] = (...args) => _ctx.closeCityPicker && _ctx.closeCityPicker(...args))
  1454. }, "取消"),
  1455. vue.createElementVNode("text", { class: "picker-title" }, "请选择工作城市"),
  1456. vue.createElementVNode("text", {
  1457. class: "picker-btn-confirm",
  1458. onClick: _cache[12] || (_cache[12] = (...args) => _ctx.confirmCity && _ctx.confirmCity(...args))
  1459. }, "确定")
  1460. ]),
  1461. vue.createElementVNode("view", { class: "picker-body" }, [
  1462. vue.createElementVNode("view", { class: "timeline-area" }, [
  1463. (vue.openBlock(true), vue.createElementBlock(
  1464. vue.Fragment,
  1465. null,
  1466. vue.renderList(_ctx.selectedPathway, (item, index) => {
  1467. return vue.openBlock(), vue.createElementBlock("view", {
  1468. class: "timeline-item",
  1469. key: index,
  1470. onClick: ($event) => _ctx.jumpToStep(index)
  1471. }, [
  1472. vue.createElementVNode("view", { class: "timeline-dot" }),
  1473. vue.createElementVNode(
  1474. "text",
  1475. null,
  1476. vue.toDisplayString(item.name),
  1477. 1
  1478. /* TEXT */
  1479. )
  1480. ], 8, ["onClick"]);
  1481. }),
  1482. 128
  1483. /* KEYED_FRAGMENT */
  1484. )),
  1485. _ctx.selectStep === _ctx.selectedPathway.length ? (vue.openBlock(), vue.createElementBlock("view", {
  1486. key: 0,
  1487. class: "timeline-item active"
  1488. }, [
  1489. vue.createElementVNode("view", { class: "timeline-dot" }),
  1490. vue.createElementVNode("text", null, "请选择")
  1491. ])) : vue.createCommentVNode("v-if", true)
  1492. ]),
  1493. vue.createElementVNode("scroll-view", {
  1494. "scroll-y": "",
  1495. class: "list-area"
  1496. }, [
  1497. (vue.openBlock(true), vue.createElementBlock(
  1498. vue.Fragment,
  1499. null,
  1500. vue.renderList(_ctx.currentList, (item, index) => {
  1501. return vue.openBlock(), vue.createElementBlock("view", {
  1502. class: "list-item",
  1503. key: item.id,
  1504. onClick: ($event) => _ctx.selectCityItem(item)
  1505. }, vue.toDisplayString(item.name), 9, ["onClick"]);
  1506. }),
  1507. 128
  1508. /* KEYED_FRAGMENT */
  1509. )),
  1510. _ctx.currentList.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  1511. key: 0,
  1512. style: { "padding": "20rpx", "color": "#999" }
  1513. }, " 无数据 ")) : vue.createCommentVNode("v-if", true)
  1514. ])
  1515. ])
  1516. ])
  1517. ],
  1518. 2
  1519. /* CLASS */
  1520. ),
  1521. vue.createElementVNode(
  1522. "view",
  1523. {
  1524. class: vue.normalizeClass(["picker-mask", { show: _ctx.showStationPicker }]),
  1525. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.closeStationPicker && _ctx.closeStationPicker(...args))
  1526. },
  1527. [
  1528. vue.createElementVNode("view", {
  1529. class: "picker-content",
  1530. onClick: _cache[16] || (_cache[16] = vue.withModifiers(() => {
  1531. }, ["stop"]))
  1532. }, [
  1533. vue.createElementVNode("view", {
  1534. class: "picker-header",
  1535. style: { "justify-content": "center", "position": "relative" }
  1536. }, [
  1537. vue.createElementVNode("text", {
  1538. class: "picker-btn-cancel",
  1539. style: { "position": "absolute", "left": "30rpx" },
  1540. onClick: _cache[15] || (_cache[15] = (...args) => _ctx.closeStationPicker && _ctx.closeStationPicker(...args))
  1541. }, "取消"),
  1542. vue.createElementVNode("text", { class: "picker-title" }, "选择服务站点")
  1543. ]),
  1544. vue.createElementVNode("scroll-view", {
  1545. "scroll-y": "",
  1546. class: "picker-list"
  1547. }, [
  1548. (vue.openBlock(true), vue.createElementBlock(
  1549. vue.Fragment,
  1550. null,
  1551. vue.renderList(_ctx.stationList, (item, index) => {
  1552. return vue.openBlock(), vue.createElementBlock("view", {
  1553. class: "station-item",
  1554. key: index,
  1555. onClick: ($event) => _ctx.selectStation(item)
  1556. }, vue.toDisplayString(item.name), 9, ["onClick"]);
  1557. }),
  1558. 128
  1559. /* KEYED_FRAGMENT */
  1560. ))
  1561. ])
  1562. ])
  1563. ],
  1564. 2
  1565. /* CLASS */
  1566. ),
  1567. vue.createElementVNode("view", { class: "footer-actions" }, [
  1568. vue.createElementVNode("view", { class: "agreement-row" }, [
  1569. vue.createElementVNode(
  1570. "view",
  1571. {
  1572. class: vue.normalizeClass(["checkbox", { checked: _ctx.isAgreed }]),
  1573. onClick: _cache[18] || (_cache[18] = ($event) => _ctx.isAgreed = !_ctx.isAgreed)
  1574. },
  1575. [
  1576. _ctx.isAgreed ? (vue.openBlock(), vue.createElementBlock("text", {
  1577. key: 0,
  1578. class: "check-mark"
  1579. }, "✓")) : vue.createCommentVNode("v-if", true)
  1580. ],
  1581. 2
  1582. /* CLASS */
  1583. ),
  1584. vue.createElementVNode("text", { class: "agree-text" }, [
  1585. vue.createTextVNode("我已阅读并同意 "),
  1586. vue.createElementVNode("text", {
  1587. style: { "color": "#2979ff" },
  1588. onClick: _cache[19] || (_cache[19] = vue.withModifiers((...args) => _ctx.openPrivacy && _ctx.openPrivacy(...args), ["stop"]))
  1589. }, "《宠宝履约者说明》")
  1590. ])
  1591. ]),
  1592. vue.createElementVNode("view", { class: "footer-btn-area" }, [
  1593. vue.createElementVNode("button", {
  1594. class: "submit-btn",
  1595. onClick: _cache[20] || (_cache[20] = (...args) => _ctx.goToAuth && _ctx.goToAuth(...args))
  1596. }, "下一步,实名认证")
  1597. ])
  1598. ]),
  1599. vue.createElementVNode(
  1600. "view",
  1601. {
  1602. class: vue.normalizeClass(["picker-mask", { show: _ctx.showPicker }]),
  1603. onClick: _cache[25] || (_cache[25] = (...args) => _ctx.closePicker && _ctx.closePicker(...args))
  1604. },
  1605. [
  1606. vue.createElementVNode("view", {
  1607. class: "picker-content",
  1608. onClick: _cache[24] || (_cache[24] = vue.withModifiers(() => {
  1609. }, ["stop"]))
  1610. }, [
  1611. vue.createElementVNode("view", { class: "picker-header" }, [
  1612. vue.createElementVNode("text", {
  1613. class: "picker-btn-cancel",
  1614. onClick: _cache[21] || (_cache[21] = (...args) => _ctx.closePicker && _ctx.closePicker(...args))
  1615. }, "取消"),
  1616. vue.createElementVNode("text", { class: "picker-title" }, "选择出生日期"),
  1617. vue.createElementVNode("text", {
  1618. class: "picker-btn-confirm",
  1619. onClick: _cache[22] || (_cache[22] = (...args) => _ctx.confirmPicker && _ctx.confirmPicker(...args))
  1620. }, "确定")
  1621. ]),
  1622. vue.createElementVNode("picker-view", {
  1623. class: "picker-view",
  1624. "indicator-style": "height: 50px;",
  1625. value: _ctx.pickerValue,
  1626. onChange: _cache[23] || (_cache[23] = (...args) => _ctx.onPickerChange && _ctx.onPickerChange(...args))
  1627. }, [
  1628. vue.createElementVNode("picker-view-column", null, [
  1629. (vue.openBlock(true), vue.createElementBlock(
  1630. vue.Fragment,
  1631. null,
  1632. vue.renderList(_ctx.years, (item, index) => {
  1633. return vue.openBlock(), vue.createElementBlock(
  1634. "view",
  1635. {
  1636. class: "picker-item",
  1637. key: index
  1638. },
  1639. vue.toDisplayString(item) + "年",
  1640. 1
  1641. /* TEXT */
  1642. );
  1643. }),
  1644. 128
  1645. /* KEYED_FRAGMENT */
  1646. ))
  1647. ]),
  1648. vue.createElementVNode("picker-view-column", null, [
  1649. (vue.openBlock(true), vue.createElementBlock(
  1650. vue.Fragment,
  1651. null,
  1652. vue.renderList(_ctx.months, (item, index) => {
  1653. return vue.openBlock(), vue.createElementBlock(
  1654. "view",
  1655. {
  1656. class: "picker-item",
  1657. key: index
  1658. },
  1659. vue.toDisplayString(item) + "月",
  1660. 1
  1661. /* TEXT */
  1662. );
  1663. }),
  1664. 128
  1665. /* KEYED_FRAGMENT */
  1666. ))
  1667. ]),
  1668. vue.createElementVNode("picker-view-column", null, [
  1669. (vue.openBlock(true), vue.createElementBlock(
  1670. vue.Fragment,
  1671. null,
  1672. vue.renderList(_ctx.days, (item, index) => {
  1673. return vue.openBlock(), vue.createElementBlock(
  1674. "view",
  1675. {
  1676. class: "picker-item",
  1677. key: index
  1678. },
  1679. vue.toDisplayString(item) + "日",
  1680. 1
  1681. /* TEXT */
  1682. );
  1683. }),
  1684. 128
  1685. /* KEYED_FRAGMENT */
  1686. ))
  1687. ])
  1688. ], 40, ["value"])
  1689. ])
  1690. ],
  1691. 2
  1692. /* CLASS */
  1693. ),
  1694. vue.createVNode(_component_privacy_popup, {
  1695. visible: _ctx.showPrivacy,
  1696. title: _ctx.privacyTitle,
  1697. content: _ctx.privacyContent,
  1698. onClose: _cache[26] || (_cache[26] = ($event) => _ctx.showPrivacy = false)
  1699. }, null, 8, ["visible", "title", "content"])
  1700. ]);
  1701. }
  1702. const PagesRecruitForm = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["render", _sfc_render$y], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/recruit/form.vue"]]);
  1703. const logic$6 = {
  1704. data() {
  1705. return {
  1706. formData: {
  1707. idType: "居民身份证",
  1708. name: "",
  1709. idNumber: "",
  1710. expiryDate: ""
  1711. },
  1712. idCardFront: "",
  1713. // 身份证正面本地预览路径
  1714. idCardBack: "",
  1715. // 身份证反面本地预览路径
  1716. idCardFrontOssId: "",
  1717. // 身份证正面 OSS ID
  1718. idCardBackOssId: "",
  1719. // 身份证反面 OSS ID
  1720. showDatePicker: false,
  1721. pickerValue: [0, 0, 0],
  1722. // YYYY-MM-DD
  1723. years: [],
  1724. months: [],
  1725. days: [],
  1726. serviceType: []
  1727. // 接收上一页的服务类型
  1728. };
  1729. },
  1730. onLoad(options) {
  1731. if (options.services) {
  1732. try {
  1733. this.serviceType = JSON.parse(options.services);
  1734. } catch (e) {
  1735. formatAppLog("error", "at pages/recruit/auth_logic.js:29", "Parse services failed", e);
  1736. }
  1737. }
  1738. this.initDateData();
  1739. this.restoreAuthData();
  1740. },
  1741. methods: {
  1742. // --- 日期选择器逻辑 (简化版, 仅示意) ---
  1743. initDateData() {
  1744. const date = /* @__PURE__ */ new Date();
  1745. const year = date.getFullYear();
  1746. for (let i = year; i <= year + 20; i++) {
  1747. this.years.push(i);
  1748. }
  1749. for (let i = 1; i <= 12; i++) {
  1750. this.months.push(i);
  1751. }
  1752. for (let i = 1; i <= 31; i++) {
  1753. this.days.push(i);
  1754. }
  1755. },
  1756. openDatePicker() {
  1757. },
  1758. onDateChange(e) {
  1759. this.formData.expiryDate = e.detail.value;
  1760. },
  1761. // --- 数据持久化(防止返回上一级丢失) ---
  1762. restoreAuthData() {
  1763. try {
  1764. const saved = uni.getStorageSync("recruit_auth_data");
  1765. if (saved) {
  1766. const d = JSON.parse(saved);
  1767. this.formData.name = d.name || "";
  1768. this.formData.idNumber = d.idNumber || "";
  1769. this.formData.expiryDate = d.expiryDate || "";
  1770. this.idCardFront = d.idCardFront || "";
  1771. this.idCardBack = d.idCardBack || "";
  1772. this.idCardFrontOssId = d.idCardFrontOssId || "";
  1773. this.idCardBackOssId = d.idCardBackOssId || "";
  1774. }
  1775. } catch (e) {
  1776. formatAppLog("error", "at pages/recruit/auth_logic.js:76", "恢复认证数据失败", e);
  1777. }
  1778. },
  1779. saveAuthData() {
  1780. try {
  1781. uni.setStorageSync("recruit_auth_data", JSON.stringify({
  1782. name: this.formData.name,
  1783. idNumber: this.formData.idNumber,
  1784. expiryDate: this.formData.expiryDate,
  1785. idCardFront: this.idCardFront,
  1786. idCardBack: this.idCardBack,
  1787. idCardFrontOssId: this.idCardFrontOssId,
  1788. idCardBackOssId: this.idCardBackOssId
  1789. }));
  1790. } catch (e) {
  1791. formatAppLog("error", "at pages/recruit/auth_logic.js:91", "保存认证数据失败", e);
  1792. }
  1793. },
  1794. // --- 图片上传(选择后自动上传到OSS) ---
  1795. chooseImage(side) {
  1796. uni.chooseImage({
  1797. count: 1,
  1798. sizeType: ["compressed"],
  1799. sourceType: ["album", "camera"],
  1800. success: async (res) => {
  1801. const tempPath = res.tempFilePaths[0];
  1802. if (side === "front") {
  1803. this.idCardFront = tempPath;
  1804. } else {
  1805. this.idCardBack = tempPath;
  1806. }
  1807. try {
  1808. uni.showLoading({ title: "上传中..." });
  1809. const uploadRes = await uploadFile(tempPath);
  1810. if (side === "front") {
  1811. this.idCardFrontOssId = uploadRes.data.ossId;
  1812. } else {
  1813. this.idCardBackOssId = uploadRes.data.ossId;
  1814. }
  1815. uni.hideLoading();
  1816. this.saveAuthData();
  1817. } catch (err) {
  1818. uni.hideLoading();
  1819. formatAppLog("error", "at pages/recruit/auth_logic.js:121", "上传身份证图片失败:", err);
  1820. }
  1821. }
  1822. });
  1823. },
  1824. // --- 提交 ---
  1825. goToQualifications() {
  1826. this.saveAuthData();
  1827. try {
  1828. const stored = uni.getStorageSync("recruit_form_data");
  1829. if (stored) {
  1830. const data = JSON.parse(stored);
  1831. data.realName = this.formData.name;
  1832. data.idNumber = this.formData.idNumber;
  1833. data.expiryDate = this.formData.expiryDate;
  1834. data.idCardFrontOssId = this.idCardFrontOssId;
  1835. data.idCardBackOssId = this.idCardBackOssId;
  1836. uni.setStorageSync("recruit_form_data", JSON.stringify(data));
  1837. }
  1838. } catch (e) {
  1839. formatAppLog("error", "at pages/recruit/auth_logic.js:158", "保存认证数据失败", e);
  1840. }
  1841. const services = JSON.stringify(this.serviceType);
  1842. uni.navigateTo({
  1843. url: `/pages/recruit/qualifications?services=${services}`
  1844. });
  1845. }
  1846. }
  1847. };
  1848. const _sfc_main$y = logic$6;
  1849. function _sfc_render$x(_ctx, _cache, $props, $setup, $data, $options) {
  1850. return vue.openBlock(), vue.createElementBlock("view", { class: "auth-container" }, [
  1851. vue.createElementVNode("view", { class: "top-tip" }, "请确保身份信息的准确,以免影响后续履约费用结算。"),
  1852. vue.createElementVNode("view", { class: "form-card" }, [
  1853. vue.createElementVNode("view", { class: "form-item" }, [
  1854. vue.createElementVNode("text", { class: "label" }, "证件类型"),
  1855. vue.createElementVNode("view", { class: "read-only-text" }, "居民身份证")
  1856. ]),
  1857. vue.createElementVNode("view", { class: "form-item" }, [
  1858. vue.createElementVNode("text", { class: "label" }, "真实姓名"),
  1859. vue.createElementVNode("view", { class: "gray-input-box" }, [
  1860. vue.withDirectives(vue.createElementVNode(
  1861. "input",
  1862. {
  1863. class: "input-area",
  1864. type: "text",
  1865. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.formData.name = $event),
  1866. placeholder: "证件姓名",
  1867. "placeholder-class": "input-placeholder"
  1868. },
  1869. null,
  1870. 512
  1871. /* NEED_PATCH */
  1872. ), [
  1873. [vue.vModelText, _ctx.formData.name]
  1874. ])
  1875. ])
  1876. ]),
  1877. vue.createElementVNode("view", { class: "form-item" }, [
  1878. vue.createElementVNode("text", { class: "label" }, "证件号码"),
  1879. vue.createElementVNode("view", { class: "gray-input-box" }, [
  1880. vue.withDirectives(vue.createElementVNode(
  1881. "input",
  1882. {
  1883. class: "input-area",
  1884. type: "idcard",
  1885. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.formData.idNumber = $event),
  1886. placeholder: "身份证号",
  1887. "placeholder-class": "input-placeholder"
  1888. },
  1889. null,
  1890. 512
  1891. /* NEED_PATCH */
  1892. ), [
  1893. [vue.vModelText, _ctx.formData.idNumber]
  1894. ])
  1895. ])
  1896. ]),
  1897. vue.createElementVNode("view", { class: "form-item" }, [
  1898. vue.createElementVNode("text", { class: "label" }, "有效日期"),
  1899. vue.createElementVNode("view", { class: "gray-input-box" }, [
  1900. vue.createElementVNode(
  1901. "picker",
  1902. {
  1903. mode: "date",
  1904. onChange: _cache[2] || (_cache[2] = (...args) => _ctx.onDateChange && _ctx.onDateChange(...args)),
  1905. style: { "width": "100%" }
  1906. },
  1907. [
  1908. vue.createElementVNode(
  1909. "view",
  1910. {
  1911. class: vue.normalizeClass(["input-area", { "input-placeholder": !_ctx.formData.expiryDate }])
  1912. },
  1913. vue.toDisplayString(_ctx.formData.expiryDate || "选择有效结束期限"),
  1914. 3
  1915. /* TEXT, CLASS */
  1916. )
  1917. ],
  1918. 32
  1919. /* NEED_HYDRATION */
  1920. ),
  1921. (vue.openBlock(), vue.createElementBlock("svg", {
  1922. class: "arrow-right",
  1923. viewBox: "0 0 1024 1024",
  1924. version: "1.1",
  1925. xmlns: "http://www.w3.org/2000/svg"
  1926. }, [
  1927. vue.createElementVNode("path", {
  1928. d: "M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-45.056L382.592 149.312a29.12 29.12 0 0 0-41.728 0z",
  1929. fill: "#CCCCCC"
  1930. })
  1931. ]))
  1932. ])
  1933. ])
  1934. ]),
  1935. vue.createElementVNode("view", { class: "upload-card" }, [
  1936. vue.createElementVNode("view", {
  1937. class: "upload-box",
  1938. onClick: _cache[3] || (_cache[3] = ($event) => _ctx.chooseImage("front"))
  1939. }, [
  1940. _ctx.idCardFront ? (vue.openBlock(), vue.createElementBlock("image", {
  1941. key: 0,
  1942. src: _ctx.idCardFront,
  1943. class: "preview-img",
  1944. mode: "aspectFill"
  1945. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock(
  1946. vue.Fragment,
  1947. { key: 1 },
  1948. [
  1949. (vue.openBlock(), vue.createElementBlock("svg", {
  1950. class: "camera-icon",
  1951. viewBox: "0 0 24 24",
  1952. fill: "none",
  1953. xmlns: "http://www.w3.org/2000/svg"
  1954. }, [
  1955. vue.createElementVNode("path", {
  1956. d: "M12 12C14.7614 12 17 9.76142 17 7C17 4.23858 14.7614 2 12 2C9.23858 2 7 4.23858 7 7C7 9.76142 9.23858 12 12 12Z",
  1957. fill: "#E0E0E0"
  1958. }),
  1959. vue.createElementVNode("circle", {
  1960. cx: "12",
  1961. cy: "12",
  1962. r: "3",
  1963. stroke: "#CCCCCC",
  1964. "stroke-width": "2"
  1965. }),
  1966. vue.createElementVNode("path", {
  1967. d: "M20 6H17.82L16.4 4.47C15.96 4 15.34 3.73 14.68 3.73H9.32C8.66 3.73 8.04 4 7.6 4.47L6.18 6H4C2.9 6 2 6.9 2 8V18C2 19.1 2.9 20 4 20H20C21.1 20 22 19.1 22 18V8C22 6.9 21.1 6 20 6ZM12 17C9.24 17 7 14.76 7 12C7 9.24 9.24 7 12 7C14.76 7 17 9.24 17 12C17 14.76 14.76 17 12 17Z",
  1968. fill: "#CCCCCC"
  1969. })
  1970. ])),
  1971. vue.createElementVNode("text", { class: "upload-text" }, "点击上传")
  1972. ],
  1973. 64
  1974. /* STABLE_FRAGMENT */
  1975. ))
  1976. ]),
  1977. vue.createElementVNode("text", { class: "card-label" }, "证件带照片面")
  1978. ]),
  1979. vue.createElementVNode("view", { class: "upload-card" }, [
  1980. vue.createElementVNode("view", {
  1981. class: "upload-box",
  1982. onClick: _cache[4] || (_cache[4] = ($event) => _ctx.chooseImage("back"))
  1983. }, [
  1984. _ctx.idCardBack ? (vue.openBlock(), vue.createElementBlock("image", {
  1985. key: 0,
  1986. src: _ctx.idCardBack,
  1987. class: "preview-img",
  1988. mode: "aspectFill"
  1989. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock(
  1990. vue.Fragment,
  1991. { key: 1 },
  1992. [
  1993. (vue.openBlock(), vue.createElementBlock("svg", {
  1994. class: "camera-icon",
  1995. viewBox: "0 0 24 24",
  1996. fill: "none",
  1997. xmlns: "http://www.w3.org/2000/svg"
  1998. }, [
  1999. vue.createElementVNode("path", {
  2000. d: "M20 6H17.82L16.4 4.47C15.96 4 15.34 3.73 14.68 3.73H9.32C8.66 3.73 8.04 4 7.6 4.47L6.18 6H4C2.9 6 2 6.9 2 8V18C2 19.1 2.9 20 4 20H20C21.1 20 22 19.1 22 18V8C22 6.9 21.1 6 20 6ZM12 17C9.24 17 7 14.76 7 12C7 9.24 9.24 7 12 7C14.76 7 17 9.24 17 12C17 14.76 14.76 17 12 17Z",
  2001. fill: "#CCCCCC"
  2002. })
  2003. ])),
  2004. vue.createElementVNode("text", { class: "upload-text" }, "点击上传")
  2005. ],
  2006. 64
  2007. /* STABLE_FRAGMENT */
  2008. ))
  2009. ]),
  2010. vue.createElementVNode("text", { class: "card-label" }, "证件国徽面")
  2011. ]),
  2012. vue.createElementVNode("view", { class: "footer-btn-area" }, [
  2013. vue.createElementVNode("button", {
  2014. class: "next-btn",
  2015. onClick: _cache[5] || (_cache[5] = (...args) => _ctx.goToQualifications && _ctx.goToQualifications(...args))
  2016. }, "下一步,完善资质")
  2017. ])
  2018. ]);
  2019. }
  2020. const PagesRecruitAuth = /* @__PURE__ */ _export_sfc(_sfc_main$y, [["render", _sfc_render$x], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/recruit/auth.vue"]]);
  2021. const logic$5 = {
  2022. data() {
  2023. return {
  2024. serviceTypes: [],
  2025. // 从上一页传递过来的服务类型列表
  2026. qualifications: {},
  2027. // 存储本地预览路径 { '宠物接送': ['path1', ...], ... }
  2028. qualOssIds: {}
  2029. // 存储OSS ID { '宠物接送': ['id1', ...], ... }
  2030. };
  2031. },
  2032. onLoad(options) {
  2033. if (options.services) {
  2034. try {
  2035. this.serviceTypes = JSON.parse(options.services);
  2036. this.serviceTypes.forEach((type) => {
  2037. this.qualifications[type] = [];
  2038. this.qualOssIds[type] = [];
  2039. });
  2040. } catch (e) {
  2041. formatAppLog("error", "at pages/recruit/qualifications_logic.js:21", "Parse services failed", e);
  2042. }
  2043. }
  2044. },
  2045. methods: {
  2046. chooseImage(serviceName) {
  2047. uni.chooseImage({
  2048. count: 9,
  2049. sizeType: ["compressed"],
  2050. sourceType: ["album", "camera"],
  2051. success: async (res) => {
  2052. if (!this.qualifications[serviceName]) {
  2053. this.qualifications[serviceName] = [];
  2054. this.qualOssIds[serviceName] = [];
  2055. }
  2056. for (const tempPath of res.tempFilePaths) {
  2057. this.qualifications[serviceName].push(tempPath);
  2058. this.$forceUpdate();
  2059. try {
  2060. const uploadRes = await uploadFile(tempPath);
  2061. this.qualOssIds[serviceName].push(uploadRes.data.ossId);
  2062. } catch (err) {
  2063. formatAppLog("error", "at pages/recruit/qualifications_logic.js:44", "上传资质图片失败:", err);
  2064. }
  2065. }
  2066. }
  2067. });
  2068. },
  2069. deleteImage(serviceName, index) {
  2070. this.qualifications[serviceName].splice(index, 1);
  2071. if (this.qualOssIds[serviceName]) {
  2072. this.qualOssIds[serviceName].splice(index, 1);
  2073. }
  2074. this.$forceUpdate();
  2075. },
  2076. goBackToForm() {
  2077. const pages = getCurrentPages();
  2078. if (pages.length > 2) {
  2079. uni.navigateBack({
  2080. delta: 2
  2081. });
  2082. } else {
  2083. uni.reLaunch({
  2084. url: "/pages/recruit/form"
  2085. });
  2086. }
  2087. },
  2088. async submit() {
  2089. let recruitData = {};
  2090. try {
  2091. const stored = uni.getStorageSync("recruit_form_data");
  2092. if (stored) {
  2093. recruitData = JSON.parse(stored);
  2094. }
  2095. } catch (e) {
  2096. formatAppLog("error", "at pages/recruit/qualifications_logic.js:80", "读取招募表单数据失败", e);
  2097. }
  2098. const allQualOssIds = [];
  2099. Object.values(this.qualOssIds).forEach((ids) => {
  2100. allQualOssIds.push(...ids);
  2101. });
  2102. const auditData = {
  2103. name: recruitData.name || "",
  2104. phone: recruitData.mobile || "",
  2105. password: recruitData.password || "",
  2106. gender: recruitData.gender === 1 ? "0" : "1",
  2107. birthday: recruitData.birthday || "",
  2108. serviceTypes: JSON.stringify(recruitData.serviceType || []),
  2109. city: recruitData.city || "",
  2110. stationId: recruitData.stationId || null,
  2111. realName: recruitData.realName || "",
  2112. idCard: recruitData.idNumber || "",
  2113. idValidDate: recruitData.expiryDate || "",
  2114. idCardFront: recruitData.idCardFrontOssId || null,
  2115. idCardBack: recruitData.idCardBackOssId || null,
  2116. qualifications: JSON.stringify(allQualOssIds)
  2117. };
  2118. uni.showLoading({ title: "提交中..." });
  2119. try {
  2120. await submitAudit(auditData);
  2121. uni.hideLoading();
  2122. uni.reLaunch({
  2123. url: "/pages/recruit/success"
  2124. });
  2125. } catch (err) {
  2126. uni.hideLoading();
  2127. formatAppLog("error", "at pages/recruit/qualifications_logic.js:116", "提交申请失败:", err);
  2128. }
  2129. }
  2130. }
  2131. };
  2132. const _sfc_main$x = logic$5;
  2133. function _sfc_render$w(_ctx, _cache, $props, $setup, $data, $options) {
  2134. return vue.openBlock(), vue.createElementBlock("view", { class: "qual-container" }, [
  2135. vue.createElementVNode("view", { class: "top-tip" }, "根据国家政策要求,请尽快完成实名认证与健康认证,否则无法开展配送业务。我们承诺将严格保管好您的个人信息。"),
  2136. _ctx.serviceTypes.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  2137. key: 0,
  2138. class: "empty-state"
  2139. }, [
  2140. vue.createElementVNode("text", { class: "empty-tip" }, "请返回第一步选择服务类型"),
  2141. vue.createElementVNode("button", {
  2142. class: "back-btn",
  2143. onClick: _cache[0] || (_cache[0] = (...args) => _ctx.goBackToForm && _ctx.goBackToForm(...args))
  2144. }, "返回选择")
  2145. ])) : vue.createCommentVNode("v-if", true),
  2146. (vue.openBlock(true), vue.createElementBlock(
  2147. vue.Fragment,
  2148. null,
  2149. vue.renderList(_ctx.serviceTypes, (type, index) => {
  2150. return vue.openBlock(), vue.createElementBlock("view", {
  2151. class: "qual-card",
  2152. key: index
  2153. }, [
  2154. vue.createElementVNode(
  2155. "view",
  2156. { class: "card-title" },
  2157. vue.toDisplayString(type) + "服务资质",
  2158. 1
  2159. /* TEXT */
  2160. ),
  2161. vue.createElementVNode("view", { class: "upload-wrapper" }, [
  2162. (vue.openBlock(true), vue.createElementBlock(
  2163. vue.Fragment,
  2164. null,
  2165. vue.renderList(_ctx.qualifications[type], (img, imgIndex) => {
  2166. return vue.openBlock(), vue.createElementBlock("view", {
  2167. class: "img-item",
  2168. key: imgIndex
  2169. }, [
  2170. vue.createElementVNode("image", {
  2171. src: img,
  2172. class: "preview-img",
  2173. mode: "aspectFill",
  2174. onClick: ($event) => _ctx.previewImage(type, imgIndex)
  2175. }, null, 8, ["src", "onClick"]),
  2176. vue.createElementVNode("view", {
  2177. class: "delete-btn",
  2178. onClick: vue.withModifiers(($event) => _ctx.deleteImage(type, imgIndex), ["stop"])
  2179. }, "×", 8, ["onClick"])
  2180. ]);
  2181. }),
  2182. 128
  2183. /* KEYED_FRAGMENT */
  2184. )),
  2185. vue.createElementVNode("view", {
  2186. class: "upload-box",
  2187. onClick: ($event) => _ctx.chooseImage(type)
  2188. }, [
  2189. vue.createElementVNode("text", { class: "plus-icon" }, "+"),
  2190. vue.createElementVNode("text", { class: "upload-text" }, "上传")
  2191. ], 8, ["onClick"])
  2192. ])
  2193. ]);
  2194. }),
  2195. 128
  2196. /* KEYED_FRAGMENT */
  2197. )),
  2198. vue.createElementVNode("view", { class: "footer-actions" }, [
  2199. vue.createElementVNode("button", {
  2200. class: "submit-btn",
  2201. onClick: _cache[1] || (_cache[1] = (...args) => _ctx.submit && _ctx.submit(...args))
  2202. }, "立即提交")
  2203. ])
  2204. ]);
  2205. }
  2206. const PagesRecruitQualifications = /* @__PURE__ */ _export_sfc(_sfc_main$x, [["render", _sfc_render$w], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/recruit/qualifications.vue"]]);
  2207. const logic$4 = {
  2208. data() {
  2209. return {
  2210. station: "民治街道第一站",
  2211. name: "张三哥",
  2212. phone: "+8613612345678"
  2213. };
  2214. },
  2215. methods: {
  2216. goHome() {
  2217. uni.reLaunch({
  2218. url: "/pages/login/login"
  2219. });
  2220. }
  2221. }
  2222. };
  2223. const _sfc_main$w = logic$4;
  2224. function _sfc_render$v(_ctx, _cache, $props, $setup, $data, $options) {
  2225. return vue.openBlock(), vue.createElementBlock("view", { class: "success-container" }, [
  2226. vue.createElementVNode("view", { class: "icon-area" }, [
  2227. (vue.openBlock(), vue.createElementBlock("svg", {
  2228. class: "success-icon",
  2229. viewBox: "0 0 1024 1024",
  2230. version: "1.1",
  2231. xmlns: "http://www.w3.org/2000/svg"
  2232. }, [
  2233. vue.createElementVNode("path", {
  2234. d: "M512 0C229.23 0 0 229.23 0 512s229.23 512 512 512 512-229.23 512-512S794.77 0 512 0z m0 960C264.58 960 64 759.42 64 512S264.58 64 512 64s448 200.58 448 448-200.58 448-448 448z",
  2235. fill: "#64D01D"
  2236. }),
  2237. vue.createElementVNode("path", {
  2238. d: "M743.08 335.78c-12.23-12.24-32.07-12.24-44.3 0L426.6 607.96 325.22 506.58c-12.24-12.24-32.07-12.24-44.3 0-12.24 12.24-12.24 32.07 0 44.3l124.58 124.58c6.12 6.12 14.14 9.17 22.15 9.17s16.03-3.05 22.15-9.17L743.08 380.08c12.24-12.24 12.24-32.07 0-44.3z",
  2239. fill: "#64D01D"
  2240. })
  2241. ])),
  2242. vue.createElementVNode("text", { class: "main-title" }, "提交成功")
  2243. ]),
  2244. vue.createElementVNode("text", { class: "sub-tip" }, "请保持手机畅通,等待平台工作人员与您联系"),
  2245. vue.createElementVNode("view", { class: "info-card" }, [
  2246. vue.createElementVNode("view", { class: "info-item" }, [
  2247. vue.createElementVNode("text", { class: "label" }, "服务站点:"),
  2248. vue.createElementVNode(
  2249. "text",
  2250. { class: "value" },
  2251. vue.toDisplayString(_ctx.station),
  2252. 1
  2253. /* TEXT */
  2254. )
  2255. ]),
  2256. vue.createElementVNode("view", { class: "info-item" }, [
  2257. vue.createElementVNode("text", { class: "label" }, "报 名 人 :"),
  2258. vue.createElementVNode(
  2259. "text",
  2260. { class: "value" },
  2261. vue.toDisplayString(_ctx.name),
  2262. 1
  2263. /* TEXT */
  2264. )
  2265. ]),
  2266. vue.createElementVNode("view", { class: "info-item" }, [
  2267. vue.createElementVNode("text", { class: "label" }, "联系手机:"),
  2268. vue.createElementVNode(
  2269. "text",
  2270. { class: "value" },
  2271. vue.toDisplayString(_ctx.phone),
  2272. 1
  2273. /* TEXT */
  2274. )
  2275. ])
  2276. ]),
  2277. vue.createElementVNode("view", {
  2278. class: "footer-btn",
  2279. onClick: _cache[0] || (_cache[0] = (...args) => _ctx.goHome && _ctx.goHome(...args))
  2280. }, "我知道了")
  2281. ]);
  2282. }
  2283. const PagesRecruitSuccess = /* @__PURE__ */ _export_sfc(_sfc_main$w, [["render", _sfc_render$v], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/recruit/success.vue"]]);
  2284. const _sfc_main$v = {
  2285. data() {
  2286. return {
  2287. mobile: "",
  2288. code: "",
  2289. countDown: 0,
  2290. timer: null
  2291. };
  2292. },
  2293. computed: {
  2294. mobileMask() {
  2295. if (!this.mobile)
  2296. return "";
  2297. return this.mobile.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
  2298. }
  2299. },
  2300. onLoad(options) {
  2301. if (options.mobile) {
  2302. this.mobile = options.mobile;
  2303. } else {
  2304. this.mobile = "13412346783";
  2305. }
  2306. },
  2307. methods: {
  2308. getVerifyCode() {
  2309. if (this.countDown > 0)
  2310. return;
  2311. this.countDown = 60;
  2312. this.timer = setInterval(() => {
  2313. this.countDown--;
  2314. if (this.countDown <= 0) {
  2315. clearInterval(this.timer);
  2316. }
  2317. }, 1e3);
  2318. uni.showToast({ title: "验证码已发送", icon: "none" });
  2319. },
  2320. nextStep() {
  2321. if (!this.code) {
  2322. uni.showToast({ title: "请输入验证码", icon: "none" });
  2323. return;
  2324. }
  2325. uni.navigateTo({
  2326. url: "/pages/login/reset-pwd-set"
  2327. });
  2328. }
  2329. }
  2330. };
  2331. function _sfc_render$u(_ctx, _cache, $props, $setup, $data, $options) {
  2332. return vue.openBlock(), vue.createElementBlock("view", { class: "reset-container" }, [
  2333. vue.createElementVNode("view", { class: "content" }, [
  2334. vue.createElementVNode(
  2335. "view",
  2336. { class: "tip-text" },
  2337. "请输入 +86 " + vue.toDisplayString($options.mobileMask) + " 收到的短信验证码,进行验证~",
  2338. 1
  2339. /* TEXT */
  2340. ),
  2341. vue.createElementVNode("view", { class: "input-group" }, [
  2342. vue.createElementVNode("text", { class: "label" }, "验证码"),
  2343. vue.createElementVNode("view", { class: "input-wrapper" }, [
  2344. vue.withDirectives(vue.createElementVNode(
  2345. "input",
  2346. {
  2347. class: "code-input",
  2348. type: "number",
  2349. maxlength: "6",
  2350. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.code = $event)
  2351. },
  2352. null,
  2353. 512
  2354. /* NEED_PATCH */
  2355. ), [
  2356. [vue.vModelText, $data.code]
  2357. ]),
  2358. vue.createElementVNode("view", {
  2359. class: "get-code-btn",
  2360. onClick: _cache[1] || (_cache[1] = (...args) => $options.getVerifyCode && $options.getVerifyCode(...args))
  2361. }, [
  2362. vue.createElementVNode(
  2363. "text",
  2364. { class: "btn-text" },
  2365. vue.toDisplayString($data.countDown > 0 ? `${$data.countDown}s` : "获取验证码"),
  2366. 1
  2367. /* TEXT */
  2368. )
  2369. ])
  2370. ])
  2371. ]),
  2372. vue.createElementVNode("button", {
  2373. class: "next-btn",
  2374. onClick: _cache[2] || (_cache[2] = (...args) => $options.nextStep && $options.nextStep(...args))
  2375. }, "下一步")
  2376. ])
  2377. ]);
  2378. }
  2379. const PagesLoginResetPwdVerify = /* @__PURE__ */ _export_sfc(_sfc_main$v, [["render", _sfc_render$u], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/login/reset-pwd-verify.vue"]]);
  2380. const _sfc_main$u = {
  2381. data() {
  2382. return {
  2383. pwd1: "",
  2384. pwd2: ""
  2385. };
  2386. },
  2387. methods: {
  2388. confirmReset() {
  2389. if (!this.pwd1 || !this.pwd2) {
  2390. uni.showToast({ title: "请输入密码", icon: "none" });
  2391. return;
  2392. }
  2393. if (this.pwd1 !== this.pwd2) {
  2394. uni.showToast({ title: "两次密码不一致", icon: "none" });
  2395. return;
  2396. }
  2397. uni.showToast({ title: "重置成功", icon: "success" });
  2398. setTimeout(() => {
  2399. uni.navigateBack({
  2400. delta: 2
  2401. // 返回到登录页
  2402. });
  2403. }, 1500);
  2404. }
  2405. }
  2406. };
  2407. function _sfc_render$t(_ctx, _cache, $props, $setup, $data, $options) {
  2408. return vue.openBlock(), vue.createElementBlock("view", { class: "reset-container" }, [
  2409. vue.createElementVNode("view", { class: "content" }, [
  2410. vue.createElementVNode("view", { class: "tip-text" }, "请输入新密码,并重新登录验证"),
  2411. vue.createElementVNode("view", { class: "input-form" }, [
  2412. vue.createElementVNode("view", { class: "input-row" }, [
  2413. vue.withDirectives(vue.createElementVNode(
  2414. "input",
  2415. {
  2416. class: "pwd-input",
  2417. type: "text",
  2418. password: "",
  2419. placeholder: "限12-20位字母和数字组合",
  2420. "placeholder-style": "color:#ccc",
  2421. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.pwd1 = $event)
  2422. },
  2423. null,
  2424. 512
  2425. /* NEED_PATCH */
  2426. ), [
  2427. [vue.vModelText, $data.pwd1]
  2428. ])
  2429. ]),
  2430. vue.createElementVNode("view", { class: "divider" }),
  2431. vue.createElementVNode("view", { class: "input-row" }, [
  2432. vue.withDirectives(vue.createElementVNode(
  2433. "input",
  2434. {
  2435. class: "pwd-input",
  2436. type: "text",
  2437. password: "",
  2438. placeholder: "限12-20位字母和数字组合",
  2439. "placeholder-style": "color:#ccc",
  2440. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.pwd2 = $event)
  2441. },
  2442. null,
  2443. 512
  2444. /* NEED_PATCH */
  2445. ), [
  2446. [vue.vModelText, $data.pwd2]
  2447. ])
  2448. ]),
  2449. vue.createElementVNode("view", { class: "divider" })
  2450. ]),
  2451. vue.createElementVNode("button", {
  2452. class: "confirm-btn",
  2453. onClick: _cache[2] || (_cache[2] = (...args) => $options.confirmReset && $options.confirmReset(...args))
  2454. }, "确定")
  2455. ])
  2456. ]);
  2457. }
  2458. const PagesLoginResetPwdSet = /* @__PURE__ */ _export_sfc(_sfc_main$u, [["render", _sfc_render$t], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/login/reset-pwd-set.vue"]]);
  2459. function getServiceList() {
  2460. return request({
  2461. url: "/service/list/listOnTaskHall",
  2462. method: "GET"
  2463. });
  2464. }
  2465. const logic$3 = {
  2466. data() {
  2467. return {
  2468. taskList: [],
  2469. currentFilter: "default",
  2470. // default, distance, time
  2471. filterCondition: "筛选条件",
  2472. sortDistance: "asc",
  2473. // asc, desc
  2474. sortTime: "asc",
  2475. scrollTop: 0,
  2476. // Track scroll position
  2477. isFilterShow: false,
  2478. tempFilter: {
  2479. service: null,
  2480. distance: "全部",
  2481. amount: "全部"
  2482. },
  2483. activeFilter: {
  2484. service: null,
  2485. distance: "全部",
  2486. amount: "全部"
  2487. },
  2488. workStatus: "working",
  2489. // working | resting
  2490. showConfirmModal: false,
  2491. showPetModal: false,
  2492. currentPetInfo: {},
  2493. showRejectModal: false,
  2494. rejectReason: "",
  2495. currentOrder: null,
  2496. showAcceptConfirmModal: false,
  2497. showNavModal: false,
  2498. navTargetItem: null,
  2499. navTargetPointType: "",
  2500. profile: null,
  2501. profileLoading: false,
  2502. serviceList: [],
  2503. orderStats: {
  2504. total: 0,
  2505. reject: 0,
  2506. award: 0,
  2507. punishment: 0
  2508. }
  2509. };
  2510. },
  2511. onPageScroll(e) {
  2512. this.scrollTop = e.scrollTop;
  2513. },
  2514. onLoad() {
  2515. this.checkWorkStatus();
  2516. this.loadServiceList();
  2517. this.loadTaskList();
  2518. },
  2519. onShow() {
  2520. this.checkWorkStatus();
  2521. if (isLoggedIn()) {
  2522. this.loadProfile();
  2523. this.loadOrderStats();
  2524. }
  2525. },
  2526. methods: {
  2527. async loadProfile() {
  2528. if (this.profileLoading)
  2529. return;
  2530. this.profileLoading = true;
  2531. try {
  2532. const res = await getMyProfile();
  2533. this.profile = res.data || null;
  2534. } catch (err) {
  2535. formatAppLog("error", "at pages/home/logic.js:71", "获取个人信息失败:", err);
  2536. } finally {
  2537. this.profileLoading = false;
  2538. }
  2539. },
  2540. async loadServiceList() {
  2541. try {
  2542. const res = await getServiceList();
  2543. this.serviceList = res.data || [];
  2544. } catch (err) {
  2545. formatAppLog("error", "at pages/home/logic.js:81", "获取服务类型失败:", err);
  2546. }
  2547. },
  2548. async loadOrderStats() {
  2549. try {
  2550. const res = await getOrderCount();
  2551. this.orderStats = res.data || { total: 0, reject: 0, award: 0, punishment: 0 };
  2552. } catch (err) {
  2553. formatAppLog("error", "at pages/home/logic.js:89", "获取订单统计失败:", err);
  2554. }
  2555. },
  2556. checkWorkStatus() {
  2557. const status = uni.getStorageSync("workStatus");
  2558. if (status) {
  2559. this.workStatus = status;
  2560. } else {
  2561. this.workStatus = "working";
  2562. uni.setStorageSync("workStatus", "working");
  2563. }
  2564. },
  2565. toggleFilter() {
  2566. if (this.workStatus === "resting")
  2567. return;
  2568. this.isFilterShow = !this.isFilterShow;
  2569. },
  2570. goToWorkStatus() {
  2571. uni.navigateTo({
  2572. url: "/pages/home/work-status"
  2573. });
  2574. },
  2575. startWork() {
  2576. this.showConfirmModal = true;
  2577. },
  2578. confirmStartWork() {
  2579. this.workStatus = "working";
  2580. uni.setStorageSync("workStatus", "working");
  2581. this.loadTaskList();
  2582. this.showConfirmModal = false;
  2583. uni.showToast({ title: "已开始接单", icon: "success" });
  2584. },
  2585. closeConfirmModal() {
  2586. this.showConfirmModal = false;
  2587. },
  2588. showPetProfile(item) {
  2589. this.currentPetInfo = item;
  2590. this.showPetModal = true;
  2591. },
  2592. closePetProfile() {
  2593. this.showPetModal = false;
  2594. },
  2595. openRejectModal(item) {
  2596. this.currentOrder = item;
  2597. this.rejectReason = "";
  2598. this.showRejectModal = true;
  2599. },
  2600. closeRejectModal() {
  2601. this.showRejectModal = false;
  2602. this.currentOrder = null;
  2603. },
  2604. confirmReject() {
  2605. if (!this.rejectReason.trim()) {
  2606. uni.showToast({ title: "请输入拒绝理由", icon: "none" });
  2607. return;
  2608. }
  2609. uni.showToast({ title: "已拒绝接单", icon: "success" });
  2610. this.showRejectModal = false;
  2611. },
  2612. openAcceptModal(item) {
  2613. this.currentOrder = item;
  2614. this.showAcceptConfirmModal = true;
  2615. },
  2616. closeAcceptModal() {
  2617. this.showAcceptConfirmModal = false;
  2618. this.currentOrder = null;
  2619. },
  2620. async confirmAccept() {
  2621. var _a;
  2622. if (!((_a = this.currentOrder) == null ? void 0 : _a.id))
  2623. return;
  2624. try {
  2625. await acceptOrder(this.currentOrder.id);
  2626. uni.showToast({ title: "接单成功", icon: "success" });
  2627. this.showAcceptConfirmModal = false;
  2628. this.currentOrder = null;
  2629. this.loadTaskList();
  2630. this.loadProfile();
  2631. } catch (err) {
  2632. formatAppLog("error", "at pages/home/logic.js:167", "接单失败:", err);
  2633. uni.showToast({ title: "接单失败", icon: "none" });
  2634. }
  2635. },
  2636. openNavigation(item, pointType) {
  2637. this.navTargetItem = item;
  2638. this.navTargetPointType = pointType;
  2639. this.showNavModal = true;
  2640. },
  2641. closeNavModal() {
  2642. this.showNavModal = false;
  2643. },
  2644. chooseMap(mapType) {
  2645. let item = this.navTargetItem;
  2646. let pointType = this.navTargetPointType;
  2647. let name = pointType === "start" ? item.startLocation : item.endLocation;
  2648. let address = pointType === "start" ? item.startAddress : item.endAddress;
  2649. this.showNavModal = false;
  2650. uni.openLocation({
  2651. latitude: 30.52,
  2652. // Mock lat
  2653. longitude: 114.31,
  2654. // Mock lng
  2655. name: name || "目的地",
  2656. address: address || "默认地址",
  2657. success: function() {
  2658. formatAppLog("log", "at pages/home/logic.js:193", "打开导航成功: " + mapType);
  2659. }
  2660. });
  2661. },
  2662. selectService(type) {
  2663. this.tempFilter.service = type;
  2664. },
  2665. selectDistance(type) {
  2666. this.tempFilter.distance = type;
  2667. },
  2668. selectAmount(type) {
  2669. this.tempFilter.amount = type;
  2670. },
  2671. resetFilter() {
  2672. this.tempFilter = {
  2673. service: null,
  2674. distance: "全部",
  2675. amount: "全部"
  2676. };
  2677. },
  2678. confirmFilter() {
  2679. this.activeFilter = { ...this.tempFilter };
  2680. this.isFilterShow = false;
  2681. uni.showToast({ title: "筛选已生效", icon: "none" });
  2682. },
  2683. closeFilter() {
  2684. this.isFilterShow = false;
  2685. },
  2686. goToDetail(item) {
  2687. formatAppLog("log", "at pages/home/logic.js:223", "Go to detail", item);
  2688. },
  2689. async loadTaskList() {
  2690. try {
  2691. const params = {
  2692. service: this.activeFilter.service,
  2693. minPrice: this.getMinPrice(),
  2694. maxPrice: this.getMaxPrice(),
  2695. pageNum: 1,
  2696. pageSize: 20
  2697. };
  2698. const res = await getPendingOrders(params);
  2699. this.taskList = (res.rows || []).map((item) => this.transformOrder(item));
  2700. } catch (err) {
  2701. formatAppLog("error", "at pages/home/logic.js:237", "获取订单列表失败:", err);
  2702. uni.showToast({ title: "加载失败", icon: "none" });
  2703. this.taskList = [];
  2704. }
  2705. },
  2706. getMinPrice() {
  2707. const amount = this.activeFilter.amount;
  2708. if (amount === "100以下")
  2709. return 0;
  2710. if (amount === "100-200")
  2711. return 1e4;
  2712. if (amount === "200-500")
  2713. return 2e4;
  2714. if (amount === "500以上")
  2715. return 5e4;
  2716. return void 0;
  2717. },
  2718. getMaxPrice() {
  2719. const amount = this.activeFilter.amount;
  2720. if (amount === "100以下")
  2721. return 1e4;
  2722. if (amount === "100-200")
  2723. return 2e4;
  2724. if (amount === "200-500")
  2725. return 5e4;
  2726. return void 0;
  2727. },
  2728. transformOrder(item) {
  2729. const service = this.serviceList.find((s) => s.id === item.service);
  2730. const serviceText = (service == null ? void 0 : service.name) || "未知";
  2731. const serviceIcon = (service == null ? void 0 : service.icon) || "";
  2732. const mode = (service == null ? void 0 : service.mode) || 0;
  2733. const isRoundTrip = mode === 1;
  2734. return {
  2735. id: item.id,
  2736. type: isRoundTrip ? 1 : item.service,
  2737. typeText: serviceText,
  2738. typeIcon: serviceIcon,
  2739. price: (item.price / 100).toFixed(2),
  2740. timeLabel: isRoundTrip ? "取货时间" : "服务时间",
  2741. time: item.serviceTime,
  2742. petAvatar: "/static/dog.png",
  2743. petName: item.petName,
  2744. petBreed: item.breed,
  2745. petGender: "M",
  2746. petAge: "",
  2747. petWeight: "",
  2748. petPersonality: "",
  2749. petHobby: "",
  2750. petRemark: "",
  2751. petTags: [],
  2752. petLogs: [],
  2753. startLocation: isRoundTrip ? item.fromAddress : "",
  2754. startAddress: isRoundTrip ? item.fromAddress : "",
  2755. startDistance: "0km",
  2756. endLocation: item.customerName + " " + item.customerPhone,
  2757. endAddress: item.toAddress,
  2758. endDistance: "0km",
  2759. serviceContent: "",
  2760. remark: item.remark || ""
  2761. };
  2762. },
  2763. setFilter(type) {
  2764. this.currentFilter = type;
  2765. if (type === "distance") {
  2766. this.sortDistance = this.sortDistance === "asc" ? "desc" : "asc";
  2767. uni.showToast({ title: `按距离${this.sortDistance === "asc" ? "升序" : "降序"}`, icon: "none" });
  2768. } else if (type === "time") {
  2769. this.sortTime = this.sortTime === "asc" ? "desc" : "asc";
  2770. uni.showToast({ title: `按时间${this.sortTime === "asc" ? "升序" : "降序"}`, icon: "none" });
  2771. }
  2772. },
  2773. showFilterDropdown() {
  2774. this.toggleFilter();
  2775. }
  2776. }
  2777. };
  2778. const _imports_0$3 = "/static/icons/bell.svg";
  2779. const _imports_3$2 = "/static/icons/nav_arrow.svg";
  2780. const _imports_2$3 = "/static/empty-rest.png";
  2781. const _sfc_main$t = {
  2782. ...logic$3
  2783. };
  2784. function _sfc_render$s(_ctx, _cache, $props, $setup, $data, $options) {
  2785. var _a, _b, _c;
  2786. return vue.openBlock(), vue.createElementBlock(
  2787. vue.Fragment,
  2788. null,
  2789. [
  2790. vue.createElementVNode("view", { class: "container" }, [
  2791. vue.createElementVNode(
  2792. "view",
  2793. {
  2794. class: "custom-nav-bar",
  2795. style: vue.normalizeStyle({ backgroundColor: _ctx.scrollTop > 20 ? "#fff" : "transparent" })
  2796. },
  2797. [
  2798. vue.createElementVNode("text", { class: "nav-title" }, "任务中心")
  2799. ],
  2800. 4
  2801. /* STYLE */
  2802. ),
  2803. vue.createElementVNode("view", { class: "nav-bg" }, [
  2804. vue.createElementVNode("view", { class: "bg-circle-left" }),
  2805. vue.createElementVNode("view", { class: "bg-circle-right" })
  2806. ]),
  2807. vue.createElementVNode("view", { class: "header-section" }, [
  2808. vue.createElementVNode("view", { class: "user-info" }, [
  2809. vue.createElementVNode("image", {
  2810. class: "avatar",
  2811. src: ((_a = _ctx.profile) == null ? void 0 : _a.avatarUrl) || "/static/touxiang.png",
  2812. mode: "aspectFill"
  2813. }, null, 8, ["src"]),
  2814. vue.createElementVNode("view", { class: "info-content" }, [
  2815. vue.createElementVNode("view", { class: "top-row" }, [
  2816. vue.createElementVNode(
  2817. "text",
  2818. { class: "name" },
  2819. vue.toDisplayString(((_b = _ctx.profile) == null ? void 0 : _b.name) || "未登录"),
  2820. 1
  2821. /* TEXT */
  2822. ),
  2823. vue.createElementVNode(
  2824. "view",
  2825. {
  2826. class: vue.normalizeClass(["status-pill", { "resting": _ctx.workStatus === "resting" }]),
  2827. onClick: _cache[0] || (_cache[0] = (...args) => _ctx.goToWorkStatus && _ctx.goToWorkStatus(...args))
  2828. },
  2829. [
  2830. vue.createElementVNode("view", { class: "status-dot-bg" }, [
  2831. _ctx.workStatus === "working" ? (vue.openBlock(), vue.createElementBlock("text", {
  2832. key: 0,
  2833. class: "check-mark"
  2834. }, "✔")) : (vue.openBlock(), vue.createElementBlock("text", {
  2835. key: 1,
  2836. class: "check-mark",
  2837. style: { "font-size": "16rpx", "line-height": "20rpx" }
  2838. }, "✕"))
  2839. ]),
  2840. vue.createElementVNode(
  2841. "text",
  2842. { class: "status-text" },
  2843. vue.toDisplayString(_ctx.workStatus === "working" ? "接单中" : "正在休息"),
  2844. 1
  2845. /* TEXT */
  2846. ),
  2847. vue.createElementVNode("text", { class: "arrow-down" }, "▼")
  2848. ],
  2849. 2
  2850. /* CLASS */
  2851. )
  2852. ]),
  2853. vue.createElementVNode("view", { class: "bottom-row" }, [
  2854. vue.createElementVNode(
  2855. "text",
  2856. { class: "city-label" },
  2857. "接单城市:" + vue.toDisplayString(((_c = _ctx.profile) == null ? void 0 : _c.cityName) || "暂无"),
  2858. 1
  2859. /* TEXT */
  2860. ),
  2861. vue.createElementVNode("text", { class: "city-arrow" }, ">")
  2862. ])
  2863. ]),
  2864. vue.createElementVNode("view", { class: "notification-box" }, [
  2865. vue.createElementVNode("image", {
  2866. class: "bell-img",
  2867. src: _imports_0$3
  2868. }),
  2869. vue.createElementVNode("view", { class: "badge-count" }, "2")
  2870. ])
  2871. ]),
  2872. vue.createElementVNode("view", { class: "stats-card" }, [
  2873. vue.createElementVNode("view", { class: "stat-item" }, [
  2874. vue.createElementVNode(
  2875. "text",
  2876. { class: "num" },
  2877. vue.toDisplayString(_ctx.orderStats.total),
  2878. 1
  2879. /* TEXT */
  2880. ),
  2881. vue.createElementVNode("text", { class: "label" }, "累计接单")
  2882. ]),
  2883. vue.createElementVNode("view", { class: "divider" }),
  2884. vue.createElementVNode("view", { class: "stat-item" }, [
  2885. vue.createElementVNode(
  2886. "text",
  2887. { class: "num" },
  2888. vue.toDisplayString(_ctx.orderStats.reject),
  2889. 1
  2890. /* TEXT */
  2891. ),
  2892. vue.createElementVNode("text", { class: "label" }, "拒接订单")
  2893. ]),
  2894. vue.createElementVNode("view", { class: "divider" }),
  2895. vue.createElementVNode("view", { class: "stat-item" }, [
  2896. vue.createElementVNode(
  2897. "text",
  2898. { class: "num" },
  2899. vue.toDisplayString(_ctx.orderStats.award),
  2900. 1
  2901. /* TEXT */
  2902. ),
  2903. vue.createElementVNode("text", { class: "label" }, "奖励订单")
  2904. ]),
  2905. vue.createElementVNode("view", { class: "divider" }),
  2906. vue.createElementVNode("view", { class: "stat-item" }, [
  2907. vue.createElementVNode(
  2908. "text",
  2909. { class: "num" },
  2910. vue.toDisplayString(_ctx.orderStats.punishment),
  2911. 1
  2912. /* TEXT */
  2913. ),
  2914. vue.createElementVNode("text", { class: "label" }, "惩罚订单")
  2915. ])
  2916. ])
  2917. ]),
  2918. vue.createElementVNode("view", { class: "task-header" }, [
  2919. vue.createElementVNode(
  2920. "view",
  2921. {
  2922. class: "header-inner",
  2923. style: vue.normalizeStyle({ backgroundColor: _ctx.scrollTop > 300 || _ctx.isFilterShow ? "#fff" : "transparent" })
  2924. },
  2925. [
  2926. vue.createElementVNode("view", { class: "left-title" }, [
  2927. vue.createElementVNode("view", { class: "orange-bar" }),
  2928. vue.createElementVNode("text", { class: "title" }, "任务大厅"),
  2929. vue.createElementVNode(
  2930. "text",
  2931. { class: "count" },
  2932. "- (" + vue.toDisplayString(_ctx.taskList.length) + "单)",
  2933. 1
  2934. /* TEXT */
  2935. )
  2936. ]),
  2937. vue.createElementVNode("view", { class: "filter-options" }, [
  2938. vue.createElementVNode(
  2939. "view",
  2940. {
  2941. class: vue.normalizeClass(["filter-item", { active: _ctx.currentFilter === "distance" }]),
  2942. onClick: _cache[1] || (_cache[1] = ($event) => _ctx.setFilter("distance"))
  2943. },
  2944. [
  2945. vue.createTextVNode(" 距离 "),
  2946. vue.createElementVNode("view", { class: "sort-icon" }, [
  2947. vue.createElementVNode(
  2948. "view",
  2949. {
  2950. class: vue.normalizeClass(["up", { active: _ctx.currentFilter === "distance" && _ctx.sortDistance === "asc" }])
  2951. },
  2952. null,
  2953. 2
  2954. /* CLASS */
  2955. ),
  2956. vue.createElementVNode(
  2957. "view",
  2958. {
  2959. class: vue.normalizeClass(["down", { active: _ctx.currentFilter === "distance" && _ctx.sortDistance === "desc" }])
  2960. },
  2961. null,
  2962. 2
  2963. /* CLASS */
  2964. )
  2965. ])
  2966. ],
  2967. 2
  2968. /* CLASS */
  2969. ),
  2970. vue.createElementVNode(
  2971. "view",
  2972. {
  2973. class: vue.normalizeClass(["filter-item", { active: _ctx.currentFilter === "time" }]),
  2974. onClick: _cache[2] || (_cache[2] = ($event) => _ctx.setFilter("time"))
  2975. },
  2976. [
  2977. vue.createTextVNode(" 时间 "),
  2978. vue.createElementVNode("view", { class: "sort-icon" }, [
  2979. vue.createElementVNode(
  2980. "view",
  2981. {
  2982. class: vue.normalizeClass(["up", { active: _ctx.currentFilter === "time" && _ctx.sortTime === "asc" }])
  2983. },
  2984. null,
  2985. 2
  2986. /* CLASS */
  2987. ),
  2988. vue.createElementVNode(
  2989. "view",
  2990. {
  2991. class: vue.normalizeClass(["down", { active: _ctx.currentFilter === "time" && _ctx.sortTime === "desc" }])
  2992. },
  2993. null,
  2994. 2
  2995. /* CLASS */
  2996. )
  2997. ])
  2998. ],
  2999. 2
  3000. /* CLASS */
  3001. ),
  3002. vue.createElementVNode("view", {
  3003. class: "dropdown",
  3004. onClick: _cache[3] || (_cache[3] = (...args) => _ctx.showFilterDropdown && _ctx.showFilterDropdown(...args))
  3005. }, [
  3006. vue.createElementVNode("text", null, "筛选条件"),
  3007. vue.createElementVNode("text", { class: "arrow-down" }, "﹀")
  3008. ])
  3009. ])
  3010. ],
  3011. 4
  3012. /* STYLE */
  3013. ),
  3014. _ctx.isFilterShow ? (vue.openBlock(), vue.createElementBlock("view", {
  3015. key: 0,
  3016. class: "filter-mask",
  3017. onClick: _cache[4] || (_cache[4] = (...args) => _ctx.closeFilter && _ctx.closeFilter(...args))
  3018. })) : vue.createCommentVNode("v-if", true),
  3019. vue.createElementVNode(
  3020. "view",
  3021. {
  3022. class: vue.normalizeClass(["filter-panel", { show: _ctx.isFilterShow }])
  3023. },
  3024. [
  3025. vue.createElementVNode("view", { class: "filter-section" }, [
  3026. vue.createElementVNode("text", { class: "section-title" }, "服务类型"),
  3027. vue.createElementVNode("view", { class: "options-grid" }, [
  3028. vue.createElementVNode(
  3029. "view",
  3030. {
  3031. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.service === null }]),
  3032. onClick: _cache[5] || (_cache[5] = ($event) => _ctx.selectService(null))
  3033. },
  3034. "全部",
  3035. 2
  3036. /* CLASS */
  3037. ),
  3038. (vue.openBlock(true), vue.createElementBlock(
  3039. vue.Fragment,
  3040. null,
  3041. vue.renderList(_ctx.serviceList, (item) => {
  3042. return vue.openBlock(), vue.createElementBlock("view", {
  3043. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.service === item.id }]),
  3044. key: item.id,
  3045. onClick: ($event) => _ctx.selectService(item.id)
  3046. }, vue.toDisplayString(item.name), 11, ["onClick"]);
  3047. }),
  3048. 128
  3049. /* KEYED_FRAGMENT */
  3050. ))
  3051. ])
  3052. ]),
  3053. vue.createElementVNode("view", { class: "filter-section" }, [
  3054. vue.createElementVNode("text", { class: "section-title" }, "距离"),
  3055. vue.createElementVNode("view", { class: "options-grid" }, [
  3056. vue.createElementVNode(
  3057. "view",
  3058. {
  3059. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "全部" }]),
  3060. onClick: _cache[6] || (_cache[6] = ($event) => _ctx.selectDistance("全部"))
  3061. },
  3062. "全部",
  3063. 2
  3064. /* CLASS */
  3065. ),
  3066. vue.createElementVNode(
  3067. "view",
  3068. {
  3069. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "2公里内" }]),
  3070. onClick: _cache[7] || (_cache[7] = ($event) => _ctx.selectDistance("2公里内"))
  3071. },
  3072. "2公里内",
  3073. 2
  3074. /* CLASS */
  3075. ),
  3076. vue.createElementVNode(
  3077. "view",
  3078. {
  3079. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "5公里内" }]),
  3080. onClick: _cache[8] || (_cache[8] = ($event) => _ctx.selectDistance("5公里内"))
  3081. },
  3082. "5公里内",
  3083. 2
  3084. /* CLASS */
  3085. ),
  3086. vue.createElementVNode(
  3087. "view",
  3088. {
  3089. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "10公里内" }]),
  3090. onClick: _cache[9] || (_cache[9] = ($event) => _ctx.selectDistance("10公里内"))
  3091. },
  3092. "10公里内",
  3093. 2
  3094. /* CLASS */
  3095. ),
  3096. vue.createElementVNode(
  3097. "view",
  3098. {
  3099. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "20公里内" }]),
  3100. onClick: _cache[10] || (_cache[10] = ($event) => _ctx.selectDistance("20公里内"))
  3101. },
  3102. "20公里内",
  3103. 2
  3104. /* CLASS */
  3105. ),
  3106. vue.createElementVNode(
  3107. "view",
  3108. {
  3109. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "50公里内" }]),
  3110. onClick: _cache[11] || (_cache[11] = ($event) => _ctx.selectDistance("50公里内"))
  3111. },
  3112. "50公里内",
  3113. 2
  3114. /* CLASS */
  3115. )
  3116. ])
  3117. ]),
  3118. vue.createElementVNode("view", { class: "filter-section" }, [
  3119. vue.createElementVNode("text", { class: "section-title" }, "金额"),
  3120. vue.createElementVNode("view", { class: "options-grid" }, [
  3121. vue.createElementVNode(
  3122. "view",
  3123. {
  3124. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "全部" }]),
  3125. onClick: _cache[12] || (_cache[12] = ($event) => _ctx.selectAmount("全部"))
  3126. },
  3127. "全部",
  3128. 2
  3129. /* CLASS */
  3130. ),
  3131. vue.createElementVNode(
  3132. "view",
  3133. {
  3134. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "100以下" }]),
  3135. onClick: _cache[13] || (_cache[13] = ($event) => _ctx.selectAmount("100以下"))
  3136. },
  3137. "100以下",
  3138. 2
  3139. /* CLASS */
  3140. ),
  3141. vue.createElementVNode(
  3142. "view",
  3143. {
  3144. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "100-200" }]),
  3145. onClick: _cache[14] || (_cache[14] = ($event) => _ctx.selectAmount("100-200"))
  3146. },
  3147. "100-200",
  3148. 2
  3149. /* CLASS */
  3150. ),
  3151. vue.createElementVNode(
  3152. "view",
  3153. {
  3154. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "200-500" }]),
  3155. onClick: _cache[15] || (_cache[15] = ($event) => _ctx.selectAmount("200-500"))
  3156. },
  3157. "200-500",
  3158. 2
  3159. /* CLASS */
  3160. ),
  3161. vue.createElementVNode(
  3162. "view",
  3163. {
  3164. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "500以上" }]),
  3165. onClick: _cache[16] || (_cache[16] = ($event) => _ctx.selectAmount("500以上"))
  3166. },
  3167. "500以上",
  3168. 2
  3169. /* CLASS */
  3170. )
  3171. ])
  3172. ]),
  3173. vue.createElementVNode("view", { class: "filter-actions" }, [
  3174. vue.createElementVNode("button", {
  3175. class: "action-btn reset",
  3176. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.resetFilter && _ctx.resetFilter(...args))
  3177. }, "重置"),
  3178. vue.createElementVNode("button", {
  3179. class: "action-btn confirm",
  3180. onClick: _cache[18] || (_cache[18] = (...args) => _ctx.confirmFilter && _ctx.confirmFilter(...args))
  3181. }, "确认")
  3182. ])
  3183. ],
  3184. 2
  3185. /* CLASS */
  3186. )
  3187. ]),
  3188. _ctx.workStatus === "working" ? (vue.openBlock(), vue.createElementBlock("scroll-view", {
  3189. key: 0,
  3190. "scroll-y": "",
  3191. class: "task-list"
  3192. }, [
  3193. (vue.openBlock(true), vue.createElementBlock(
  3194. vue.Fragment,
  3195. null,
  3196. vue.renderList(_ctx.taskList, (item, index) => {
  3197. return vue.openBlock(), vue.createElementBlock("view", {
  3198. class: "task-card",
  3199. key: index,
  3200. onClick: ($event) => _ctx.goToDetail(item)
  3201. }, [
  3202. vue.createElementVNode("view", { class: "card-header" }, [
  3203. vue.createElementVNode("view", { class: "type-badge" }, [
  3204. vue.createElementVNode("image", {
  3205. class: "type-icon",
  3206. src: item.typeIcon
  3207. }, null, 8, ["src"]),
  3208. vue.createElementVNode(
  3209. "text",
  3210. { class: "type-text" },
  3211. vue.toDisplayString(item.typeText),
  3212. 1
  3213. /* TEXT */
  3214. )
  3215. ]),
  3216. vue.createElementVNode(
  3217. "text",
  3218. { class: "price" },
  3219. "¥" + vue.toDisplayString(item.price),
  3220. 1
  3221. /* TEXT */
  3222. )
  3223. ]),
  3224. vue.createElementVNode("view", { class: "card-body" }, [
  3225. vue.createElementVNode("view", { class: "time-row" }, [
  3226. vue.createElementVNode(
  3227. "text",
  3228. { class: "label" },
  3229. vue.toDisplayString(item.timeLabel) + ":",
  3230. 1
  3231. /* TEXT */
  3232. ),
  3233. vue.createElementVNode(
  3234. "text",
  3235. { class: "value" },
  3236. vue.toDisplayString(item.time),
  3237. 1
  3238. /* TEXT */
  3239. )
  3240. ]),
  3241. vue.createElementVNode("view", { class: "pet-card" }, [
  3242. vue.createElementVNode("image", {
  3243. class: "pet-avatar",
  3244. src: item.petAvatar,
  3245. mode: "aspectFill"
  3246. }, null, 8, ["src"]),
  3247. vue.createElementVNode("view", { class: "pet-info" }, [
  3248. vue.createElementVNode(
  3249. "text",
  3250. { class: "pet-name" },
  3251. vue.toDisplayString(item.petName),
  3252. 1
  3253. /* TEXT */
  3254. ),
  3255. vue.createElementVNode(
  3256. "text",
  3257. { class: "pet-breed" },
  3258. "品种: " + vue.toDisplayString(item.petBreed),
  3259. 1
  3260. /* TEXT */
  3261. )
  3262. ]),
  3263. vue.createElementVNode("view", {
  3264. class: "pet-profile-btn",
  3265. onClick: vue.withModifiers(($event) => _ctx.showPetProfile(item), ["stop"])
  3266. }, "宠物档案", 8, ["onClick"])
  3267. ]),
  3268. vue.createElementVNode("view", { class: "route-info" }, [
  3269. item.type === 1 ? (vue.openBlock(), vue.createElementBlock(
  3270. vue.Fragment,
  3271. { key: 0 },
  3272. [
  3273. vue.createElementVNode("view", {
  3274. class: "route-item",
  3275. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "start"), ["stop"])
  3276. }, [
  3277. vue.createElementVNode("view", { class: "icon-circle start" }, "取"),
  3278. vue.createElementVNode("view", { class: "route-line-vertical" }),
  3279. vue.createElementVNode("view", { class: "address-box" }, [
  3280. vue.createElementVNode(
  3281. "text",
  3282. { class: "addr-title" },
  3283. vue.toDisplayString(item.startLocation),
  3284. 1
  3285. /* TEXT */
  3286. ),
  3287. vue.createElementVNode(
  3288. "text",
  3289. { class: "addr-desc" },
  3290. vue.toDisplayString(item.startAddress),
  3291. 1
  3292. /* TEXT */
  3293. )
  3294. ]),
  3295. vue.createElementVNode("view", { class: "distance-tag" }, [
  3296. vue.createElementVNode(
  3297. "text",
  3298. null,
  3299. vue.toDisplayString(item.startDistance),
  3300. 1
  3301. /* TEXT */
  3302. ),
  3303. vue.createElementVNode("image", {
  3304. class: "nav-arrow",
  3305. src: _imports_3$2
  3306. })
  3307. ])
  3308. ], 8, ["onClick"]),
  3309. vue.createElementVNode("view", {
  3310. class: "route-item",
  3311. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "end"), ["stop"])
  3312. }, [
  3313. vue.createElementVNode("view", { class: "icon-circle end" }, "送"),
  3314. vue.createElementVNode("view", { class: "address-box" }, [
  3315. vue.createElementVNode(
  3316. "text",
  3317. { class: "addr-title" },
  3318. vue.toDisplayString(item.endLocation),
  3319. 1
  3320. /* TEXT */
  3321. ),
  3322. vue.createElementVNode(
  3323. "text",
  3324. { class: "addr-desc" },
  3325. vue.toDisplayString(item.endAddress),
  3326. 1
  3327. /* TEXT */
  3328. )
  3329. ]),
  3330. vue.createElementVNode("view", { class: "distance-tag" }, [
  3331. vue.createElementVNode(
  3332. "text",
  3333. null,
  3334. vue.toDisplayString(item.endDistance),
  3335. 1
  3336. /* TEXT */
  3337. ),
  3338. vue.createElementVNode("image", {
  3339. class: "nav-arrow",
  3340. src: _imports_3$2
  3341. })
  3342. ])
  3343. ], 8, ["onClick"])
  3344. ],
  3345. 64
  3346. /* STABLE_FRAGMENT */
  3347. )) : (vue.openBlock(), vue.createElementBlock(
  3348. vue.Fragment,
  3349. { key: 1 },
  3350. [
  3351. vue.createElementVNode("view", {
  3352. class: "route-item",
  3353. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "end"), ["stop"])
  3354. }, [
  3355. vue.createElementVNode("view", { class: "icon-circle service" }, "服"),
  3356. vue.createElementVNode("view", { class: "address-box" }, [
  3357. vue.createElementVNode(
  3358. "text",
  3359. { class: "addr-title" },
  3360. vue.toDisplayString(item.endLocation),
  3361. 1
  3362. /* TEXT */
  3363. ),
  3364. vue.createElementVNode(
  3365. "text",
  3366. { class: "addr-desc" },
  3367. vue.toDisplayString(item.endAddress),
  3368. 1
  3369. /* TEXT */
  3370. )
  3371. ]),
  3372. vue.createElementVNode("view", { class: "distance-tag" }, [
  3373. vue.createElementVNode(
  3374. "text",
  3375. null,
  3376. vue.toDisplayString(item.endDistance),
  3377. 1
  3378. /* TEXT */
  3379. ),
  3380. vue.createElementVNode("image", {
  3381. class: "nav-arrow",
  3382. src: _imports_3$2
  3383. })
  3384. ])
  3385. ], 8, ["onClick"]),
  3386. item.serviceContent ? (vue.openBlock(), vue.createElementBlock("view", {
  3387. key: 0,
  3388. class: "service-content"
  3389. }, [
  3390. vue.createElementVNode("text", { class: "content-label" }, "服务内容:"),
  3391. vue.createElementVNode(
  3392. "text",
  3393. null,
  3394. vue.toDisplayString(item.serviceContent),
  3395. 1
  3396. /* TEXT */
  3397. )
  3398. ])) : vue.createCommentVNode("v-if", true)
  3399. ],
  3400. 64
  3401. /* STABLE_FRAGMENT */
  3402. ))
  3403. ]),
  3404. item.remark ? (vue.openBlock(), vue.createElementBlock("view", {
  3405. key: 0,
  3406. class: "remark-box"
  3407. }, [
  3408. vue.createElementVNode(
  3409. "text",
  3410. null,
  3411. "备注:" + vue.toDisplayString(item.remark),
  3412. 1
  3413. /* TEXT */
  3414. )
  3415. ])) : vue.createCommentVNode("v-if", true)
  3416. ]),
  3417. vue.createElementVNode("view", { class: "action-btns" }, [
  3418. vue.createElementVNode("button", {
  3419. class: "btn reject",
  3420. onClick: vue.withModifiers(($event) => _ctx.openRejectModal(item), ["stop"])
  3421. }, "拒绝", 8, ["onClick"]),
  3422. vue.createElementVNode("button", {
  3423. class: "btn accept",
  3424. onClick: vue.withModifiers(($event) => _ctx.openAcceptModal(item), ["stop"])
  3425. }, "接单", 8, ["onClick"])
  3426. ])
  3427. ], 8, ["onClick"]);
  3428. }),
  3429. 128
  3430. /* KEYED_FRAGMENT */
  3431. )),
  3432. vue.createElementVNode("view", { style: { "height": "120rpx" } })
  3433. ])) : (vue.openBlock(), vue.createElementBlock("view", {
  3434. key: 1,
  3435. class: "empty-state"
  3436. }, [
  3437. vue.createElementVNode("image", {
  3438. class: "empty-icon",
  3439. src: _imports_2$3,
  3440. mode: "aspectFit"
  3441. }),
  3442. vue.createElementVNode("text", { class: "empty-text" }, "当前处于休息中,暂时无法接单"),
  3443. vue.createElementVNode("button", {
  3444. class: "start-work-btn",
  3445. onClick: _cache[19] || (_cache[19] = (...args) => _ctx.startWork && _ctx.startWork(...args))
  3446. }, "开工接单")
  3447. ])),
  3448. _ctx.showConfirmModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3449. key: 2,
  3450. class: "modal-mask"
  3451. }, [
  3452. vue.createElementVNode("view", { class: "custom-modal" }, [
  3453. vue.createElementVNode("text", { class: "modal-title" }, "提示"),
  3454. vue.createElementVNode("text", { class: "modal-content" }, "是否确定结束休息,开始接单?"),
  3455. vue.createElementVNode("view", { class: "modal-btns" }, [
  3456. vue.createElementVNode("button", {
  3457. class: "modal-btn cancel",
  3458. onClick: _cache[20] || (_cache[20] = (...args) => _ctx.closeConfirmModal && _ctx.closeConfirmModal(...args))
  3459. }, "取消"),
  3460. vue.createElementVNode("button", {
  3461. class: "modal-btn confirm",
  3462. onClick: _cache[21] || (_cache[21] = (...args) => _ctx.confirmStartWork && _ctx.confirmStartWork(...args))
  3463. }, "确定")
  3464. ])
  3465. ])
  3466. ])) : vue.createCommentVNode("v-if", true),
  3467. _ctx.showPetModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3468. key: 3,
  3469. class: "pet-modal-mask",
  3470. onClick: _cache[25] || (_cache[25] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  3471. }, [
  3472. vue.createElementVNode("view", {
  3473. class: "pet-modal-content",
  3474. onClick: _cache[24] || (_cache[24] = vue.withModifiers(() => {
  3475. }, ["stop"]))
  3476. }, [
  3477. vue.createElementVNode("view", { class: "pet-modal-header" }, [
  3478. vue.createElementVNode("text", { class: "pet-modal-title" }, "宠物档案"),
  3479. vue.createElementVNode("view", {
  3480. class: "close-icon-btn",
  3481. onClick: _cache[22] || (_cache[22] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  3482. }, "×")
  3483. ]),
  3484. vue.createElementVNode("scroll-view", {
  3485. "scroll-y": "",
  3486. class: "pet-modal-scroll"
  3487. }, [
  3488. vue.createElementVNode("view", { class: "pet-base-info" }, [
  3489. vue.createElementVNode("image", {
  3490. class: "pm-avatar",
  3491. src: _ctx.currentPetInfo.petAvatar,
  3492. mode: "aspectFill"
  3493. }, null, 8, ["src"]),
  3494. vue.createElementVNode("view", { class: "pm-info-text" }, [
  3495. vue.createElementVNode("view", { class: "pm-name-row" }, [
  3496. vue.createElementVNode(
  3497. "text",
  3498. { class: "pm-name" },
  3499. vue.toDisplayString(_ctx.currentPetInfo.petName),
  3500. 1
  3501. /* TEXT */
  3502. ),
  3503. _ctx.currentPetInfo.petGender === "M" ? (vue.openBlock(), vue.createElementBlock("view", {
  3504. key: 0,
  3505. class: "pm-gender"
  3506. }, [
  3507. vue.createElementVNode("text", { class: "gender-icon" }, "♂"),
  3508. vue.createElementVNode("text", null, "公")
  3509. ])) : _ctx.currentPetInfo.petGender === "F" ? (vue.openBlock(), vue.createElementBlock("view", {
  3510. key: 1,
  3511. class: "pm-gender female"
  3512. }, [
  3513. vue.createElementVNode("text", { class: "gender-icon" }, "♀"),
  3514. vue.createElementVNode("text", null, "母")
  3515. ])) : vue.createCommentVNode("v-if", true)
  3516. ]),
  3517. vue.createElementVNode(
  3518. "text",
  3519. { class: "pm-breed" },
  3520. "品种:" + vue.toDisplayString(_ctx.currentPetInfo.petBreed),
  3521. 1
  3522. /* TEXT */
  3523. )
  3524. ])
  3525. ]),
  3526. vue.createElementVNode("view", { class: "pm-detail-grid" }, [
  3527. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  3528. vue.createElementVNode("text", { class: "pm-label" }, "年龄"),
  3529. vue.createElementVNode(
  3530. "text",
  3531. { class: "pm-val" },
  3532. vue.toDisplayString(_ctx.currentPetInfo.petAge || "未知"),
  3533. 1
  3534. /* TEXT */
  3535. )
  3536. ]),
  3537. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  3538. vue.createElementVNode("text", { class: "pm-label" }, "体重"),
  3539. vue.createElementVNode(
  3540. "text",
  3541. { class: "pm-val" },
  3542. vue.toDisplayString(_ctx.currentPetInfo.petWeight || "未知"),
  3543. 1
  3544. /* TEXT */
  3545. )
  3546. ]),
  3547. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  3548. vue.createElementVNode("text", { class: "pm-label" }, "性格"),
  3549. vue.createElementVNode(
  3550. "text",
  3551. { class: "pm-val" },
  3552. vue.toDisplayString(_ctx.currentPetInfo.petPersonality || "无"),
  3553. 1
  3554. /* TEXT */
  3555. )
  3556. ]),
  3557. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  3558. vue.createElementVNode("text", { class: "pm-label" }, "爱好"),
  3559. vue.createElementVNode(
  3560. "text",
  3561. { class: "pm-val" },
  3562. vue.toDisplayString(_ctx.currentPetInfo.petHobby || "无"),
  3563. 1
  3564. /* TEXT */
  3565. )
  3566. ]),
  3567. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  3568. vue.createElementVNode("text", { class: "pm-label" }, "备注"),
  3569. vue.createElementVNode(
  3570. "text",
  3571. { class: "pm-val" },
  3572. vue.toDisplayString(_ctx.currentPetInfo.petRemark || "无特殊过敏史"),
  3573. 1
  3574. /* TEXT */
  3575. )
  3576. ])
  3577. ]),
  3578. _ctx.currentPetInfo.petTags && _ctx.currentPetInfo.petTags.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  3579. key: 0,
  3580. class: "pm-tags"
  3581. }, [
  3582. (vue.openBlock(true), vue.createElementBlock(
  3583. vue.Fragment,
  3584. null,
  3585. vue.renderList(_ctx.currentPetInfo.petTags, (tag, index) => {
  3586. return vue.openBlock(), vue.createElementBlock(
  3587. "view",
  3588. {
  3589. class: "pm-tag",
  3590. key: index
  3591. },
  3592. vue.toDisplayString(tag),
  3593. 1
  3594. /* TEXT */
  3595. );
  3596. }),
  3597. 128
  3598. /* KEYED_FRAGMENT */
  3599. ))
  3600. ])) : vue.createCommentVNode("v-if", true),
  3601. vue.createElementVNode("view", { class: "pm-section-title" }, [
  3602. vue.createElementVNode("view", { class: "orange-bar" }),
  3603. vue.createElementVNode("text", null, "备注日志")
  3604. ]),
  3605. vue.createElementVNode("view", { class: "pm-log-list" }, [
  3606. (vue.openBlock(true), vue.createElementBlock(
  3607. vue.Fragment,
  3608. null,
  3609. vue.renderList(_ctx.currentPetInfo.petLogs, (log, lIndex) => {
  3610. return vue.openBlock(), vue.createElementBlock("view", {
  3611. class: "pm-log-item",
  3612. key: lIndex
  3613. }, [
  3614. vue.createElementVNode(
  3615. "text",
  3616. { class: "pm-log-date" },
  3617. vue.toDisplayString(log.date),
  3618. 1
  3619. /* TEXT */
  3620. ),
  3621. vue.createElementVNode(
  3622. "text",
  3623. { class: "pm-log-text" },
  3624. vue.toDisplayString(log.content),
  3625. 1
  3626. /* TEXT */
  3627. ),
  3628. vue.createElementVNode(
  3629. "text",
  3630. { class: "pm-log-recorder" },
  3631. vue.toDisplayString(log.recorder === "系统记录" ? "" : "记录人: ") + vue.toDisplayString(log.recorder),
  3632. 1
  3633. /* TEXT */
  3634. )
  3635. ]);
  3636. }),
  3637. 128
  3638. /* KEYED_FRAGMENT */
  3639. ))
  3640. ]),
  3641. vue.createElementVNode("view", { style: { "height": "40rpx" } }),
  3642. vue.createElementVNode("button", {
  3643. class: "pm-bottom-close",
  3644. onClick: _cache[23] || (_cache[23] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  3645. }, "关闭"),
  3646. vue.createElementVNode("view", { style: { "height": "20rpx" } })
  3647. ])
  3648. ])
  3649. ])) : vue.createCommentVNode("v-if", true)
  3650. ]),
  3651. _ctx.showRejectModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3652. key: 0,
  3653. class: "modal-mask"
  3654. }, [
  3655. vue.createElementVNode("view", { class: "custom-modal" }, [
  3656. vue.createElementVNode("text", { class: "modal-title" }, "拒绝接单"),
  3657. vue.withDirectives(vue.createElementVNode(
  3658. "textarea",
  3659. {
  3660. class: "reject-textarea",
  3661. "onUpdate:modelValue": _cache[26] || (_cache[26] = ($event) => _ctx.rejectReason = $event),
  3662. placeholder: "请输入拒绝理由(必填)",
  3663. maxlength: "100"
  3664. },
  3665. null,
  3666. 512
  3667. /* NEED_PATCH */
  3668. ), [
  3669. [vue.vModelText, _ctx.rejectReason]
  3670. ]),
  3671. vue.createElementVNode("view", { class: "modal-btns mt-30" }, [
  3672. vue.createElementVNode("button", {
  3673. class: "modal-btn cancel",
  3674. onClick: _cache[27] || (_cache[27] = (...args) => _ctx.closeRejectModal && _ctx.closeRejectModal(...args))
  3675. }, "取消"),
  3676. vue.createElementVNode("button", {
  3677. class: "modal-btn confirm",
  3678. onClick: _cache[28] || (_cache[28] = (...args) => _ctx.confirmReject && _ctx.confirmReject(...args))
  3679. }, "提交")
  3680. ])
  3681. ])
  3682. ])) : vue.createCommentVNode("v-if", true),
  3683. _ctx.showAcceptConfirmModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3684. key: 1,
  3685. class: "modal-mask"
  3686. }, [
  3687. vue.createElementVNode("view", { class: "custom-modal" }, [
  3688. vue.createElementVNode("text", { class: "modal-title" }, "接单确认"),
  3689. vue.createElementVNode("view", { class: "modal-content-box" }, [
  3690. vue.createElementVNode("text", { class: "modal-content-main" }, "请确认是否接收此订单?"),
  3691. vue.createElementVNode("text", { class: "modal-content-sub" }, "接单后请尽快通过电话联系用户")
  3692. ]),
  3693. vue.createElementVNode("view", { class: "modal-btns mt-30" }, [
  3694. vue.createElementVNode("button", {
  3695. class: "modal-btn cancel",
  3696. onClick: _cache[29] || (_cache[29] = (...args) => _ctx.closeAcceptModal && _ctx.closeAcceptModal(...args))
  3697. }, "再想想"),
  3698. vue.createElementVNode("button", {
  3699. class: "modal-btn confirm",
  3700. onClick: _cache[30] || (_cache[30] = (...args) => _ctx.confirmAccept && _ctx.confirmAccept(...args))
  3701. }, "确认接单")
  3702. ])
  3703. ])
  3704. ])) : vue.createCommentVNode("v-if", true),
  3705. _ctx.showNavModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3706. key: 2,
  3707. class: "nav-modal-mask",
  3708. onClick: _cache[36] || (_cache[36] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  3709. }, [
  3710. vue.createElementVNode("view", {
  3711. class: "nav-action-sheet",
  3712. onClick: _cache[35] || (_cache[35] = vue.withModifiers(() => {
  3713. }, ["stop"]))
  3714. }, [
  3715. vue.createElementVNode("view", { class: "nav-sheet-title" }, "选择地图进行导航"),
  3716. vue.createElementVNode("view", {
  3717. class: "nav-sheet-item",
  3718. onClick: _cache[31] || (_cache[31] = ($event) => _ctx.chooseMap("高德"))
  3719. }, "高德地图"),
  3720. vue.createElementVNode("view", {
  3721. class: "nav-sheet-item",
  3722. onClick: _cache[32] || (_cache[32] = ($event) => _ctx.chooseMap("腾讯"))
  3723. }, "腾讯地图"),
  3724. vue.createElementVNode("view", {
  3725. class: "nav-sheet-item",
  3726. onClick: _cache[33] || (_cache[33] = ($event) => _ctx.chooseMap("百度"))
  3727. }, "百度地图"),
  3728. vue.createElementVNode("view", { class: "nav-sheet-gap" }),
  3729. vue.createElementVNode("view", {
  3730. class: "nav-sheet-item cancel",
  3731. onClick: _cache[34] || (_cache[34] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  3732. }, "取消")
  3733. ])
  3734. ])) : vue.createCommentVNode("v-if", true)
  3735. ],
  3736. 64
  3737. /* STABLE_FRAGMENT */
  3738. );
  3739. }
  3740. const PagesHomeIndex = /* @__PURE__ */ _export_sfc(_sfc_main$t, [["render", _sfc_render$s], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/home/index.vue"]]);
  3741. const _sfc_main$s = {
  3742. data() {
  3743. return {
  3744. status: "working"
  3745. // working | resting
  3746. };
  3747. },
  3748. onShow() {
  3749. const savedStatus = uni.getStorageSync("workStatus");
  3750. if (savedStatus) {
  3751. this.status = savedStatus;
  3752. }
  3753. },
  3754. methods: {
  3755. toggleStatus() {
  3756. if (this.status === "working") {
  3757. this.status = "resting";
  3758. uni.setStorageSync("workStatus", "resting");
  3759. } else {
  3760. this.status = "working";
  3761. uni.setStorageSync("workStatus", "working");
  3762. }
  3763. }
  3764. }
  3765. };
  3766. function _sfc_render$r(_ctx, _cache, $props, $setup, $data, $options) {
  3767. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  3768. vue.createElementVNode("view", { class: "signboard-container" }, [
  3769. vue.createElementVNode("view", { class: "rope" }),
  3770. vue.createElementVNode("view", { class: "nail" }),
  3771. vue.createElementVNode(
  3772. "view",
  3773. {
  3774. class: vue.normalizeClass(["board", { "resting": $data.status === "resting" }])
  3775. },
  3776. [
  3777. vue.createElementVNode("view", { class: "screw top-left" }),
  3778. vue.createElementVNode("view", { class: "screw top-right" }),
  3779. vue.createElementVNode("view", { class: "screw bottom-left" }),
  3780. vue.createElementVNode("view", { class: "screw bottom-right" }),
  3781. vue.createElementVNode("view", { class: "board-inner" }, [
  3782. vue.createElementVNode(
  3783. "text",
  3784. { class: "status-text" },
  3785. vue.toDisplayString($data.status === "working" ? "接单中" : "休息中"),
  3786. 1
  3787. /* TEXT */
  3788. )
  3789. ])
  3790. ],
  3791. 2
  3792. /* CLASS */
  3793. )
  3794. ]),
  3795. vue.createElementVNode("view", { class: "status-desc" }, [
  3796. vue.createElementVNode(
  3797. "text",
  3798. null,
  3799. vue.toDisplayString($data.status === "working" ? "当前处于工作接单中,正常接收新订单" : "当前处于休息状态,暂停接收新订单"),
  3800. 1
  3801. /* TEXT */
  3802. )
  3803. ]),
  3804. vue.createElementVNode("view", { class: "action-area" }, [
  3805. vue.createElementVNode(
  3806. "button",
  3807. {
  3808. class: vue.normalizeClass(["action-btn", { "stop": $data.status === "working", "stopped": $data.status === "resting" }]),
  3809. onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleStatus && $options.toggleStatus(...args))
  3810. },
  3811. vue.toDisplayString($data.status === "working" ? "停止接单" : "已停止接单"),
  3812. 3
  3813. /* TEXT, CLASS */
  3814. ),
  3815. vue.createElementVNode("view", { class: "tips" }, [
  3816. $data.status === "working" ? (vue.openBlock(), vue.createElementBlock("text", { key: 0 }, "当您希望长时间不再接收订单时,请点击上方按钮停止接单,开启后需手动恢复。")) : (vue.openBlock(), vue.createElementBlock("text", { key: 1 }, "点击上方按钮恢复接单,开始接收新的任务推送。"))
  3817. ])
  3818. ])
  3819. ]);
  3820. }
  3821. const PagesHomeWorkStatus = /* @__PURE__ */ _export_sfc(_sfc_main$s, [["render", _sfc_render$r], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/home/work-status.vue"]]);
  3822. const logic$2 = {
  3823. data() {
  3824. return {
  3825. currentTab: 0,
  3826. tabs: ["待接送/服务", "配送/服务中", "已完成", "已拒绝"],
  3827. // Filter dropdown states
  3828. typeFilterOptions: ["全部类型", "接送", "喂遛", "洗护"],
  3829. currentTypeFilterIdx: 0,
  3830. activeDropdown: 0,
  3831. // 0 = none, 1 = type filter, 2 = time filter
  3832. hasTimeFilter: false,
  3833. // Custom Calendar State (Mock Feb 2026)
  3834. currentMonth: "2026年2月",
  3835. weekDays: ["日", "一", "二", "三", "四", "五", "六"],
  3836. calendarDays: [],
  3837. // Generated in onLoad or created
  3838. selectedDateRange: [],
  3839. // stores [start, end]
  3840. allOrderList: [
  3841. // === Tab 1: 待接送/服务 (Status: 接单) ===
  3842. { type: 1, typeText: "接送", typeIcon: "/static/icons/car.svg", statusText: "接单", price: "20.00", timeLabel: "取货时间", time: "2026/02/10 10:00", petAvatar: "/static/dog.png", petName: "哈士奇宝宝", petBreed: "哈士奇", startLocation: "武汉大学宠物店", startAddress: "武汉市洪山区珞喻路458号", startDistance: "0.5km", endLocation: "张** 189****8451", endAddress: "武汉市武昌区新区大道凤凰广场25号", endDistance: "2.5km", remark: "尽快接单。" },
  3843. { type: 2, typeText: "喂遛", typeIcon: "/static/icons/walk.svg", statusText: "接单", price: "30.00", timeLabel: "服务时间", time: "2026/02/10 14:00", petAvatar: "/static/dog.png", petName: "边牧", petBreed: "边境牧羊犬", endLocation: "李** 138****0001", endAddress: "武汉市洪山区保利花园", endDistance: "1.5km", serviceContent: "需自带牵引绳。", remark: "狗狗很活泼。" },
  3844. { type: 3, typeText: "洗护", typeIcon: "/static/icons/wash.svg", statusText: "接单", price: "60.00", timeLabel: "服务时间", time: "2026/02/10 16:00", petAvatar: "/static/dog.png", petName: "布偶", petBreed: "布偶猫", endLocation: "王** 139****0002", endAddress: "武汉市汉阳区钟家村", endDistance: "3.5km", serviceContent: "上门洗护、全身检查", remark: "猫咪怕水。" },
  3845. // === Tab 2: 配送/服务中 (Status: 出发/开始/到达等) ===
  3846. { type: 1, typeText: "接送", typeIcon: "/static/icons/car.svg", statusText: "出发", price: "25.00", timeLabel: "取货时间", time: "2026/02/11 09:00", petAvatar: "/static/dog.png", petName: "柯基", petBreed: "柯基犬", startLocation: "南湖宠物店", startAddress: "武汉市洪山区南湖大道", startDistance: "1.0km", endLocation: "陈** 158****0003", endAddress: "武汉市江夏区藏龙岛", endDistance: "6.5km", remark: "已接到狗狗,送往目的地。" },
  3847. { type: 2, typeText: "喂遛", typeIcon: "/static/icons/walk.svg", statusText: "开始", price: "35.00", timeLabel: "服务时间", time: "2026/02/11 15:00", petAvatar: "/static/dog.png", petName: "金毛", petBreed: "金毛寻回犬", endLocation: "赵** 159****0004", endAddress: "武汉市江汉区泛海国际", endDistance: "4.5km", serviceContent: "遛弯一小时", remark: "注意避开大型犬。" },
  3848. { type: 3, typeText: "洗护", typeIcon: "/static/icons/wash.svg", statusText: "开始", price: "80.00", timeLabel: "服务时间", time: "2026/02/11 18:00", petAvatar: "/static/dog.png", petName: "英短", petBreed: "英国短毛猫", endLocation: "钱** 177****0005", endAddress: "武汉市武昌区楚河汉街", endDistance: "2.0km", serviceContent: "深度去污、洗护", remark: "客户要求修剪指甲。" },
  3849. // === Tab 3: 已完成 (Status: 已完成) ===
  3850. { type: 1, typeText: "接送", typeIcon: "/static/icons/car.svg", statusText: "已完成", price: "40.00", timeLabel: "取货时间", time: "2026/02/12 10:00", petAvatar: "/static/dog.png", petName: "柴犬", petBreed: "柴犬", startLocation: "汉口宠物医院", startAddress: "武汉市江岸区解放大道", startDistance: "2.0km", endLocation: "孙** 186****0006", endAddress: "武汉市东西湖区金银湖", endDistance: "10.5km", remark: "安全抵达。" },
  3851. { type: 2, typeText: "喂遛", typeIcon: "/static/icons/walk.svg", statusText: "已完成", price: "28.00", timeLabel: "服务时间", time: "2026/02/12 16:00", petAvatar: "/static/dog.png", petName: "萨摩耶", petBreed: "萨摩耶犬", endLocation: "周** 188****0007", endAddress: "武汉市洪山区软件园", endDistance: "0.8km", serviceContent: "遛狗", remark: "遛得很开心。" },
  3852. { type: 3, typeText: "洗护", typeIcon: "/static/icons/wash.svg", statusText: "已完成", price: "120.00", timeLabel: "服务时间", time: "2026/02/12 19:00", petAvatar: "/static/dog.png", petName: "加菲", petBreed: "加菲猫", endLocation: "吴** 189****0008", endAddress: "武汉市青山区别区", endDistance: "5.0km", serviceContent: "全套美容洗护", remark: "客户非常满意。" },
  3853. // === Tab 4: 已拒绝 (Status: 已拒绝) ===
  3854. { type: 1, typeText: "接送", typeIcon: "/static/icons/car.svg", statusText: "已拒绝", price: "15.00", timeLabel: "取货时间", time: "2026/02/13 09:00", petAvatar: "/static/dog.png", petName: "吉娃娃", petBreed: "吉娃娃", startLocation: "宠物乐园", startAddress: "武汉市黄陂区盘龙城", startDistance: "3.0km", endLocation: "郑** 133****0009", endAddress: "武汉市汉南区", endDistance: "20.5km", remark: "路程太远。" },
  3855. { type: 2, typeText: "喂遛", typeIcon: "/static/icons/walk.svg", statusText: "已拒绝", price: "22.00", timeLabel: "服务时间", time: "2026/02/13 14:00", petAvatar: "/static/dog.png", petName: "博美", petBreed: "博美犬", endLocation: "刘** 134****0010", endAddress: "武汉市蔡甸区", endDistance: "15.0km", serviceContent: "公园遛弯", remark: "天气原因取消。" },
  3856. { type: 3, typeText: "洗护", typeIcon: "/static/icons/wash.svg", statusText: "已拒绝", price: "45.00", timeLabel: "服务时间", time: "2026/02/13 17:00", petAvatar: "/static/dog.png", petName: "暹罗", petBreed: "暹罗猫", endLocation: "张** 135****0011", endAddress: "武汉市新洲区", endDistance: "18.0km", serviceContent: "洗澡", remark: "时间冲突。" }
  3857. ],
  3858. showPetModal: false,
  3859. currentPetInfo: {},
  3860. showNavModal: false,
  3861. navTargetItem: null,
  3862. navTargetPointType: "",
  3863. // Popover control
  3864. activeCallItem: null,
  3865. // 备注输入弹窗
  3866. showRemarkInput: false,
  3867. remarkText: ""
  3868. };
  3869. },
  3870. created() {
  3871. this.initCalendar();
  3872. },
  3873. computed: {
  3874. orderList() {
  3875. return this.allOrderList.filter((item) => {
  3876. let matchTab = false;
  3877. if (this.currentTab === 0) {
  3878. matchTab = item.statusText === "接单";
  3879. } else if (this.currentTab === 1) {
  3880. let pickingTypes = ["到达", "出发", "送达"];
  3881. let serviceTypes = ["到达", "开始", "结束"];
  3882. if (item.type === 1) {
  3883. matchTab = pickingTypes.includes(item.statusText);
  3884. } else {
  3885. matchTab = serviceTypes.includes(item.statusText);
  3886. }
  3887. } else if (this.currentTab === 2) {
  3888. matchTab = item.statusText === "已完成";
  3889. } else if (this.currentTab === 3) {
  3890. matchTab = item.statusText === "已拒绝";
  3891. }
  3892. let matchType = true;
  3893. if (this.currentTypeFilterIdx > 0) {
  3894. matchType = item.type === parseInt(this.currentTypeFilterIdx);
  3895. }
  3896. let matchTime = true;
  3897. return matchTab && matchType && matchTime;
  3898. });
  3899. }
  3900. },
  3901. methods: {
  3902. getDisplayStatus(item) {
  3903. if (item.statusText === "已完成")
  3904. return "已完成";
  3905. if (item.statusText === "已拒绝")
  3906. return "已拒绝";
  3907. if (item.statusText === "接单") {
  3908. return item.type === 1 ? "待接送" : "待服务";
  3909. }
  3910. return item.type === 1 ? "配送中" : "服务中";
  3911. },
  3912. getStatusClass(item) {
  3913. let display = this.getDisplayStatus(item);
  3914. if (display === "已完成")
  3915. return "finish";
  3916. if (display === "已拒绝")
  3917. return "reject";
  3918. if (display === "配送中" || display === "服务中")
  3919. return "processing";
  3920. return "highlight";
  3921. },
  3922. goToDetail(item) {
  3923. uni.navigateTo({
  3924. url: `/pages/orders/detail?type=${item.type}`
  3925. });
  3926. },
  3927. showPetProfile(item) {
  3928. this.currentPetInfo = {
  3929. ...item,
  3930. petGender: "M",
  3931. petAge: "2岁",
  3932. petWeight: "15kg",
  3933. petPersonality: "活泼亲人,精力旺盛",
  3934. petHobby: "喜欢追飞盘,爱吃肉干",
  3935. petRemark: "肠胃较弱,不能乱喂零食;出门易爆冲,请拉紧牵引绳。",
  3936. petTags: ["拉响警报", "不能吃鸡肉", "精力旺盛"],
  3937. petLogs: [
  3938. { date: "2026-02-09 14:00", content: "今天遛弯拉了两次粑粑,精神状态很好。", recorder: "王阿姨" },
  3939. { date: "2026-02-08 10:30", content: "有些挑食,剩了小半碗狗粮。", recorder: "李师傅" },
  3940. { date: "2026-02-05 09:00", content: "建档。", recorder: "系统记录" }
  3941. ]
  3942. };
  3943. this.showPetModal = true;
  3944. },
  3945. closePetProfile() {
  3946. this.showPetModal = false;
  3947. },
  3948. openNavigation(item, pointType) {
  3949. this.navTargetItem = item;
  3950. this.navTargetPointType = pointType;
  3951. this.showNavModal = true;
  3952. },
  3953. closeNavModal() {
  3954. this.showNavModal = false;
  3955. },
  3956. chooseMap(mapType) {
  3957. let item = this.navTargetItem;
  3958. let pointType = this.navTargetPointType;
  3959. let name = pointType === "start" ? item.startLocation : item.endLocation;
  3960. let address = pointType === "start" ? item.startAddress : item.endAddress;
  3961. this.showNavModal = false;
  3962. uni.openLocation({
  3963. latitude: 30.52,
  3964. // Mock lat
  3965. longitude: 114.31,
  3966. // Mock lng
  3967. name: name || "目的地",
  3968. address: address || "默认地址",
  3969. success: function() {
  3970. formatAppLog("log", "at pages/orders/logic.js:159", "打开导航成功: " + mapType);
  3971. }
  3972. });
  3973. },
  3974. toggleCallMenu(item) {
  3975. if (this.activeCallItem === item) {
  3976. this.activeCallItem = null;
  3977. } else {
  3978. this.activeCallItem = item;
  3979. }
  3980. },
  3981. closeCallMenu() {
  3982. this.activeCallItem = null;
  3983. },
  3984. doCall(type) {
  3985. let phoneNum = "";
  3986. if (type === "merchant") {
  3987. phoneNum = "18900008451";
  3988. } else if (type === "customer") {
  3989. phoneNum = "13800000001";
  3990. }
  3991. if (phoneNum) {
  3992. uni.makePhoneCall({ phoneNumber: phoneNum });
  3993. }
  3994. this.activeCallItem = null;
  3995. },
  3996. reportAbnormal(item) {
  3997. uni.showToast({ title: "上报功能待开发", icon: "none" });
  3998. },
  3999. toggleDropdown(idx) {
  4000. if (this.activeDropdown === idx) {
  4001. this.activeDropdown = 0;
  4002. } else {
  4003. this.activeDropdown = idx;
  4004. }
  4005. },
  4006. closeDropdown() {
  4007. this.activeDropdown = 0;
  4008. },
  4009. selectType(index) {
  4010. this.currentTypeFilterIdx = index;
  4011. this.closeDropdown();
  4012. },
  4013. initCalendar() {
  4014. let days = [];
  4015. for (let i = 1; i <= 28; i++) {
  4016. days.push(i);
  4017. }
  4018. this.calendarDays = days;
  4019. this.selectedDateRange = [2, 4];
  4020. },
  4021. prevMonth() {
  4022. uni.showToast({ title: "上个月", icon: "none" });
  4023. },
  4024. nextMonth() {
  4025. uni.showToast({ title: "下个月", icon: "none" });
  4026. },
  4027. selectDateItem(day) {
  4028. if (this.selectedDateRange.length === 2) {
  4029. this.selectedDateRange = [day];
  4030. } else if (this.selectedDateRange.length === 1) {
  4031. let start = this.selectedDateRange[0];
  4032. if (day > start) {
  4033. this.selectedDateRange = [start, day];
  4034. } else if (day < start) {
  4035. this.selectedDateRange = [day, start];
  4036. } else {
  4037. this.selectedDateRange = [];
  4038. }
  4039. } else {
  4040. this.selectedDateRange = [day];
  4041. }
  4042. },
  4043. getDateClass(day) {
  4044. if (this.selectedDateRange.length === 0)
  4045. return "";
  4046. if (this.selectedDateRange.length === 1) {
  4047. return day === this.selectedDateRange[0] ? "is-start" : "";
  4048. }
  4049. let start = this.selectedDateRange[0];
  4050. let end = this.selectedDateRange[1];
  4051. if (day === start)
  4052. return "is-start";
  4053. if (day === end)
  4054. return "is-end";
  4055. if (day > start && day < end)
  4056. return "is-between";
  4057. return "";
  4058. },
  4059. resetTimeFilter() {
  4060. this.hasTimeFilter = false;
  4061. this.selectedDateRange = [];
  4062. uni.showToast({ title: "已重置服务时间", icon: "none" });
  4063. this.closeDropdown();
  4064. },
  4065. confirmTimeFilter() {
  4066. if (this.selectedDateRange.length === 0) {
  4067. uni.showToast({ title: "请先选择日期", icon: "none" });
  4068. return;
  4069. }
  4070. let text = this.selectedDateRange.length === 2 ? `${this.selectedDateRange[0]}日-${this.selectedDateRange[1]}日` : `${this.selectedDateRange[0]}日`;
  4071. uni.showToast({ title: "已应用: " + text, icon: "none" });
  4072. this.hasTimeFilter = true;
  4073. this.closeDropdown();
  4074. },
  4075. getMainActionText(item) {
  4076. if (item.statusText === "接单") {
  4077. return "到达打卡";
  4078. } else if (item.statusText === "到达" && item.type === 1) {
  4079. return "确认出发";
  4080. } else if (item.statusText === "到达" && item.type !== 1) {
  4081. return "开始服务";
  4082. } else if (item.statusText === "出发") {
  4083. return "送达打卡";
  4084. } else if (item.statusText === "开始") {
  4085. return "结束服务";
  4086. } else if (item.statusText === "送达" || item.statusText === "结束") {
  4087. return "服务完成";
  4088. }
  4089. return "查看详情";
  4090. },
  4091. mainAction(item) {
  4092. uni.navigateTo({
  4093. url: `/pages/orders/detail?type=${item.type}`
  4094. });
  4095. },
  4096. reportAbnormal(item) {
  4097. uni.navigateTo({
  4098. url: "/pages/orders/anomaly?orderId=" + (item.orderNo || "")
  4099. });
  4100. },
  4101. // 打开备注输入弹窗
  4102. openRemarkInput() {
  4103. this.remarkText = "";
  4104. this.showRemarkInput = true;
  4105. },
  4106. // 关闭备注输入弹窗
  4107. closeRemarkInput() {
  4108. this.showRemarkInput = false;
  4109. this.remarkText = "";
  4110. },
  4111. // 提交备注,追加到宠物档案日志列表
  4112. submitRemark() {
  4113. const text = this.remarkText.trim();
  4114. if (!text) {
  4115. uni.showToast({ title: "备注内容不能为空", icon: "none" });
  4116. return;
  4117. }
  4118. const now = /* @__PURE__ */ new Date();
  4119. const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")} ${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
  4120. if (!this.currentPetInfo.petLogs) {
  4121. this.$set(this.currentPetInfo, "petLogs", []);
  4122. }
  4123. this.currentPetInfo.petLogs.unshift({
  4124. date: dateStr,
  4125. content: text,
  4126. recorder: "我"
  4127. });
  4128. uni.showToast({ title: "备注已添加", icon: "success" });
  4129. this.closeRemarkInput();
  4130. }
  4131. }
  4132. };
  4133. const _sfc_main$r = {
  4134. ...logic$2
  4135. };
  4136. function _sfc_render$q(_ctx, _cache, $props, $setup, $data, $options) {
  4137. const _component_uni_icons = vue.resolveComponent("uni-icons");
  4138. return vue.openBlock(), vue.createElementBlock(
  4139. vue.Fragment,
  4140. null,
  4141. [
  4142. vue.createElementVNode("view", { class: "container" }, [
  4143. vue.createElementVNode("view", { class: "sticky-header" }, [
  4144. vue.createElementVNode("view", { class: "status-tabs" }, [
  4145. (vue.openBlock(true), vue.createElementBlock(
  4146. vue.Fragment,
  4147. null,
  4148. vue.renderList(_ctx.tabs, (tab, index) => {
  4149. return vue.openBlock(), vue.createElementBlock("view", {
  4150. class: vue.normalizeClass(["tab-item", { active: _ctx.currentTab === index }]),
  4151. key: index,
  4152. onClick: ($event) => _ctx.currentTab = index
  4153. }, [
  4154. vue.createElementVNode(
  4155. "text",
  4156. null,
  4157. vue.toDisplayString(tab),
  4158. 1
  4159. /* TEXT */
  4160. ),
  4161. _ctx.currentTab === index ? (vue.openBlock(), vue.createElementBlock("view", {
  4162. key: 0,
  4163. class: "indicator"
  4164. })) : vue.createCommentVNode("v-if", true)
  4165. ], 10, ["onClick"]);
  4166. }),
  4167. 128
  4168. /* KEYED_FRAGMENT */
  4169. ))
  4170. ]),
  4171. vue.createElementVNode("view", { class: "search-bar" }, [
  4172. vue.createElementVNode("view", { class: "search-input-box" }, [
  4173. vue.createElementVNode("input", {
  4174. class: "search-input",
  4175. placeholder: "搜索地址/电话/姓名",
  4176. "placeholder-class": "ph-style"
  4177. })
  4178. ])
  4179. ]),
  4180. vue.createElementVNode("view", { class: "filter-wrapper" }, [
  4181. vue.createElementVNode("view", { class: "filter-bar" }, [
  4182. vue.createElementVNode(
  4183. "view",
  4184. {
  4185. class: vue.normalizeClass(["filter-item", { "active": _ctx.activeDropdown === 1 }]),
  4186. onClick: _cache[0] || (_cache[0] = ($event) => _ctx.toggleDropdown(1))
  4187. },
  4188. [
  4189. vue.createElementVNode(
  4190. "text",
  4191. {
  4192. class: vue.normalizeClass({ "active-text": _ctx.activeDropdown === 1 || _ctx.currentTypeFilterIdx > 0 })
  4193. },
  4194. vue.toDisplayString(_ctx.currentTypeFilterIdx > 0 ? _ctx.typeFilterOptions[_ctx.currentTypeFilterIdx] : "全部类型"),
  4195. 3
  4196. /* TEXT, CLASS */
  4197. ),
  4198. vue.createElementVNode(
  4199. "view",
  4200. {
  4201. class: vue.normalizeClass(["triangle", _ctx.activeDropdown === 1 ? "up" : "down"])
  4202. },
  4203. null,
  4204. 2
  4205. /* CLASS */
  4206. )
  4207. ],
  4208. 2
  4209. /* CLASS */
  4210. ),
  4211. vue.createElementVNode(
  4212. "view",
  4213. {
  4214. class: vue.normalizeClass(["filter-item", { "active": _ctx.activeDropdown === 2 }]),
  4215. onClick: _cache[1] || (_cache[1] = ($event) => _ctx.toggleDropdown(2))
  4216. },
  4217. [
  4218. vue.createElementVNode(
  4219. "text",
  4220. {
  4221. class: vue.normalizeClass({ "active-text": _ctx.activeDropdown === 2 || _ctx.hasTimeFilter })
  4222. },
  4223. "服务时间",
  4224. 2
  4225. /* CLASS */
  4226. ),
  4227. vue.createElementVNode(
  4228. "view",
  4229. {
  4230. class: vue.normalizeClass(["triangle", _ctx.activeDropdown === 2 ? "up" : "down"])
  4231. },
  4232. null,
  4233. 2
  4234. /* CLASS */
  4235. )
  4236. ],
  4237. 2
  4238. /* CLASS */
  4239. )
  4240. ]),
  4241. _ctx.activeDropdown !== 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  4242. key: 0,
  4243. class: "dropdown-mask",
  4244. onClick: _cache[2] || (_cache[2] = (...args) => _ctx.closeDropdown && _ctx.closeDropdown(...args))
  4245. })) : vue.createCommentVNode("v-if", true),
  4246. _ctx.activeDropdown === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  4247. key: 1,
  4248. class: "dropdown-panel"
  4249. }, [
  4250. (vue.openBlock(true), vue.createElementBlock(
  4251. vue.Fragment,
  4252. null,
  4253. vue.renderList(_ctx.typeFilterOptions, (item, index) => {
  4254. return vue.openBlock(), vue.createElementBlock("view", {
  4255. class: vue.normalizeClass(["type-option", { "selected": _ctx.currentTypeFilterIdx === index }]),
  4256. key: index,
  4257. onClick: ($event) => _ctx.selectType(index)
  4258. }, [
  4259. vue.createElementVNode(
  4260. "text",
  4261. null,
  4262. vue.toDisplayString(item),
  4263. 1
  4264. /* TEXT */
  4265. )
  4266. ], 10, ["onClick"]);
  4267. }),
  4268. 128
  4269. /* KEYED_FRAGMENT */
  4270. ))
  4271. ])) : vue.createCommentVNode("v-if", true),
  4272. _ctx.activeDropdown === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  4273. key: 2,
  4274. class: "dropdown-panel calendar-panel"
  4275. }, [
  4276. vue.createElementVNode("view", { class: "custom-calendar-container" }, [
  4277. vue.createElementVNode("view", { class: "cal-header" }, [
  4278. vue.createVNode(_component_uni_icons, {
  4279. type: "left",
  4280. size: "18",
  4281. color: "#666",
  4282. onClick: _ctx.prevMonth
  4283. }, null, 8, ["onClick"]),
  4284. vue.createElementVNode(
  4285. "text",
  4286. { class: "cal-title" },
  4287. vue.toDisplayString(_ctx.currentMonth),
  4288. 1
  4289. /* TEXT */
  4290. ),
  4291. vue.createVNode(_component_uni_icons, {
  4292. type: "right",
  4293. size: "18",
  4294. color: "#666",
  4295. onClick: _ctx.nextMonth
  4296. }, null, 8, ["onClick"])
  4297. ]),
  4298. vue.createElementVNode("view", { class: "cal-weekdays" }, [
  4299. (vue.openBlock(true), vue.createElementBlock(
  4300. vue.Fragment,
  4301. null,
  4302. vue.renderList(_ctx.weekDays, (wk, idx) => {
  4303. return vue.openBlock(), vue.createElementBlock(
  4304. "text",
  4305. {
  4306. key: idx,
  4307. class: "wk-item"
  4308. },
  4309. vue.toDisplayString(wk),
  4310. 1
  4311. /* TEXT */
  4312. );
  4313. }),
  4314. 128
  4315. /* KEYED_FRAGMENT */
  4316. ))
  4317. ]),
  4318. vue.createElementVNode("view", { class: "cal-body" }, [
  4319. (vue.openBlock(true), vue.createElementBlock(
  4320. vue.Fragment,
  4321. null,
  4322. vue.renderList(_ctx.calendarDays, (day, idx) => {
  4323. return vue.openBlock(), vue.createElementBlock("view", {
  4324. key: idx,
  4325. class: vue.normalizeClass(["cal-day-box", _ctx.getDateClass(day)]),
  4326. onClick: ($event) => _ctx.selectDateItem(day)
  4327. }, [
  4328. vue.createElementVNode(
  4329. "view",
  4330. { class: "cal-day-text" },
  4331. vue.toDisplayString(day),
  4332. 1
  4333. /* TEXT */
  4334. )
  4335. ], 10, ["onClick"]);
  4336. }),
  4337. 128
  4338. /* KEYED_FRAGMENT */
  4339. ))
  4340. ])
  4341. ]),
  4342. vue.createElementVNode("view", { class: "calendar-actions" }, [
  4343. vue.createElementVNode("button", {
  4344. class: "cal-btn reset",
  4345. onClick: _cache[3] || (_cache[3] = (...args) => _ctx.resetTimeFilter && _ctx.resetTimeFilter(...args))
  4346. }, "重置"),
  4347. vue.createElementVNode("button", {
  4348. class: "cal-btn confirm",
  4349. onClick: _cache[4] || (_cache[4] = (...args) => _ctx.confirmTimeFilter && _ctx.confirmTimeFilter(...args))
  4350. }, "确定")
  4351. ])
  4352. ])) : vue.createCommentVNode("v-if", true)
  4353. ])
  4354. ]),
  4355. vue.createElementVNode("scroll-view", {
  4356. "scroll-y": "",
  4357. class: "order-list"
  4358. }, [
  4359. (vue.openBlock(true), vue.createElementBlock(
  4360. vue.Fragment,
  4361. null,
  4362. vue.renderList(_ctx.orderList, (item, index) => {
  4363. return vue.openBlock(), vue.createElementBlock("view", {
  4364. class: "order-card",
  4365. key: index,
  4366. onClick: ($event) => _ctx.goToDetail(item)
  4367. }, [
  4368. vue.createElementVNode("view", { class: "card-header" }, [
  4369. vue.createElementVNode("view", { class: "type-badge" }, [
  4370. vue.createElementVNode("image", {
  4371. class: "type-icon",
  4372. src: item.typeIcon
  4373. }, null, 8, ["src"]),
  4374. vue.createElementVNode(
  4375. "text",
  4376. { class: "type-text" },
  4377. vue.toDisplayString(item.typeText),
  4378. 1
  4379. /* TEXT */
  4380. )
  4381. ]),
  4382. vue.createElementVNode(
  4383. "text",
  4384. {
  4385. class: vue.normalizeClass(["status-badge", _ctx.getStatusClass(item)])
  4386. },
  4387. vue.toDisplayString(_ctx.getDisplayStatus(item)),
  4388. 3
  4389. /* TEXT, CLASS */
  4390. )
  4391. ]),
  4392. vue.createElementVNode("view", { class: "card-body" }, [
  4393. vue.createElementVNode("view", { class: "time-row" }, [
  4394. vue.createElementVNode("view", { class: "time-col" }, [
  4395. vue.createElementVNode(
  4396. "text",
  4397. { class: "label" },
  4398. vue.toDisplayString(item.timeLabel) + ":",
  4399. 1
  4400. /* TEXT */
  4401. ),
  4402. vue.createElementVNode(
  4403. "text",
  4404. { class: "value" },
  4405. vue.toDisplayString(item.time),
  4406. 1
  4407. /* TEXT */
  4408. )
  4409. ]),
  4410. vue.createElementVNode(
  4411. "text",
  4412. { class: "price" },
  4413. "¥" + vue.toDisplayString(item.price),
  4414. 1
  4415. /* TEXT */
  4416. )
  4417. ]),
  4418. vue.createElementVNode("view", { class: "pet-card" }, [
  4419. vue.createElementVNode("image", {
  4420. class: "pet-avatar",
  4421. src: item.petAvatar,
  4422. mode: "aspectFill"
  4423. }, null, 8, ["src"]),
  4424. vue.createElementVNode("view", { class: "pet-info" }, [
  4425. vue.createElementVNode(
  4426. "text",
  4427. { class: "pet-name" },
  4428. vue.toDisplayString(item.petName),
  4429. 1
  4430. /* TEXT */
  4431. ),
  4432. vue.createElementVNode(
  4433. "text",
  4434. { class: "pet-breed" },
  4435. "品种: " + vue.toDisplayString(item.petBreed),
  4436. 1
  4437. /* TEXT */
  4438. )
  4439. ]),
  4440. vue.createElementVNode("view", {
  4441. class: "pet-profile-btn",
  4442. onClick: vue.withModifiers(($event) => _ctx.showPetProfile(item), ["stop"])
  4443. }, "宠物档案", 8, ["onClick"])
  4444. ]),
  4445. vue.createElementVNode("view", { class: "route-info" }, [
  4446. item.type === 1 ? (vue.openBlock(), vue.createElementBlock(
  4447. vue.Fragment,
  4448. { key: 0 },
  4449. [
  4450. vue.createElementVNode("view", {
  4451. class: "route-item",
  4452. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "start"), ["stop"])
  4453. }, [
  4454. vue.createElementVNode("view", { class: "icon-circle start" }, "取"),
  4455. vue.createElementVNode("view", { class: "route-line-vertical" }),
  4456. vue.createElementVNode("view", { class: "address-box" }, [
  4457. vue.createElementVNode(
  4458. "text",
  4459. { class: "addr-title" },
  4460. vue.toDisplayString(item.startLocation),
  4461. 1
  4462. /* TEXT */
  4463. ),
  4464. vue.createElementVNode(
  4465. "text",
  4466. { class: "addr-desc" },
  4467. vue.toDisplayString(item.startAddress),
  4468. 1
  4469. /* TEXT */
  4470. )
  4471. ]),
  4472. vue.createElementVNode("view", { class: "distance-tag" }, [
  4473. vue.createElementVNode(
  4474. "text",
  4475. { class: "distance-text" },
  4476. vue.toDisplayString(item.startDistance),
  4477. 1
  4478. /* TEXT */
  4479. ),
  4480. vue.createElementVNode("view", { class: "nav-icon-circle" }, [
  4481. vue.createElementVNode("image", {
  4482. class: "nav-arrow",
  4483. src: _imports_3$2
  4484. })
  4485. ])
  4486. ])
  4487. ], 8, ["onClick"]),
  4488. vue.createElementVNode("view", {
  4489. class: "route-item",
  4490. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "end"), ["stop"])
  4491. }, [
  4492. vue.createElementVNode("view", { class: "icon-circle end" }, "送"),
  4493. vue.createElementVNode("view", { class: "address-box" }, [
  4494. vue.createElementVNode(
  4495. "text",
  4496. { class: "addr-title" },
  4497. vue.toDisplayString(item.endLocation),
  4498. 1
  4499. /* TEXT */
  4500. ),
  4501. vue.createElementVNode(
  4502. "text",
  4503. { class: "addr-desc" },
  4504. vue.toDisplayString(item.endAddress),
  4505. 1
  4506. /* TEXT */
  4507. )
  4508. ]),
  4509. vue.createElementVNode("view", { class: "distance-tag" }, [
  4510. vue.createElementVNode(
  4511. "text",
  4512. { class: "distance-text" },
  4513. vue.toDisplayString(item.endDistance),
  4514. 1
  4515. /* TEXT */
  4516. ),
  4517. vue.createElementVNode("view", { class: "nav-icon-circle" }, [
  4518. vue.createElementVNode("image", {
  4519. class: "nav-arrow",
  4520. src: _imports_3$2
  4521. })
  4522. ])
  4523. ])
  4524. ], 8, ["onClick"])
  4525. ],
  4526. 64
  4527. /* STABLE_FRAGMENT */
  4528. )) : (vue.openBlock(), vue.createElementBlock(
  4529. vue.Fragment,
  4530. { key: 1 },
  4531. [
  4532. vue.createElementVNode("view", {
  4533. class: "route-item",
  4534. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "end"), ["stop"])
  4535. }, [
  4536. vue.createElementVNode("view", { class: "icon-circle service" }, "服"),
  4537. vue.createElementVNode("view", { class: "address-box" }, [
  4538. vue.createElementVNode(
  4539. "text",
  4540. { class: "addr-title" },
  4541. vue.toDisplayString(item.endLocation),
  4542. 1
  4543. /* TEXT */
  4544. ),
  4545. vue.createElementVNode(
  4546. "text",
  4547. { class: "addr-desc" },
  4548. vue.toDisplayString(item.endAddress),
  4549. 1
  4550. /* TEXT */
  4551. )
  4552. ]),
  4553. vue.createElementVNode("view", { class: "distance-tag" }, [
  4554. vue.createElementVNode(
  4555. "text",
  4556. { class: "distance-text" },
  4557. vue.toDisplayString(item.endDistance),
  4558. 1
  4559. /* TEXT */
  4560. ),
  4561. vue.createElementVNode("view", { class: "nav-icon-circle" }, [
  4562. vue.createElementVNode("image", {
  4563. class: "nav-arrow",
  4564. src: _imports_3$2
  4565. })
  4566. ])
  4567. ])
  4568. ], 8, ["onClick"]),
  4569. item.serviceContent ? (vue.openBlock(), vue.createElementBlock("view", {
  4570. key: 0,
  4571. class: "service-content"
  4572. }, [
  4573. vue.createElementVNode("text", { class: "content-label" }, "服务内容:"),
  4574. vue.createElementVNode(
  4575. "text",
  4576. null,
  4577. vue.toDisplayString(item.serviceContent),
  4578. 1
  4579. /* TEXT */
  4580. )
  4581. ])) : vue.createCommentVNode("v-if", true)
  4582. ],
  4583. 64
  4584. /* STABLE_FRAGMENT */
  4585. ))
  4586. ]),
  4587. item.remark ? (vue.openBlock(), vue.createElementBlock("view", {
  4588. key: 0,
  4589. class: "remark-box"
  4590. }, [
  4591. vue.createElementVNode(
  4592. "text",
  4593. null,
  4594. "备注:" + vue.toDisplayString(item.remark),
  4595. 1
  4596. /* TEXT */
  4597. )
  4598. ])) : vue.createCommentVNode("v-if", true)
  4599. ]),
  4600. ["接单", "到达", "出发", "开始", "送达", "结束"].includes(item.statusText) ? (vue.openBlock(), vue.createElementBlock("view", {
  4601. key: 0,
  4602. class: "action-btns"
  4603. }, [
  4604. vue.createElementVNode("view", { class: "action-left" }, [
  4605. vue.createElementVNode("button", {
  4606. class: "btn normal",
  4607. onClick: vue.withModifiers(($event) => _ctx.toggleCallMenu(item), ["stop"])
  4608. }, "一键拨号", 8, ["onClick"]),
  4609. _ctx.activeCallItem === item ? (vue.openBlock(), vue.createElementBlock("view", {
  4610. key: 0,
  4611. class: "call-popover",
  4612. onClick: _cache[7] || (_cache[7] = vue.withModifiers(() => {
  4613. }, ["stop"]))
  4614. }, [
  4615. vue.createElementVNode("view", {
  4616. class: "call-pop-item",
  4617. onClick: _cache[5] || (_cache[5] = ($event) => _ctx.doCall("merchant"))
  4618. }, "联系商家"),
  4619. vue.createElementVNode("view", {
  4620. class: "call-pop-item",
  4621. onClick: _cache[6] || (_cache[6] = ($event) => _ctx.doCall("customer"))
  4622. }, "联系客户")
  4623. ])) : vue.createCommentVNode("v-if", true)
  4624. ]),
  4625. vue.createElementVNode("view", { class: "action-right" }, [
  4626. vue.createElementVNode("button", {
  4627. class: "btn normal",
  4628. onClick: vue.withModifiers(($event) => _ctx.reportAbnormal(item), ["stop"])
  4629. }, "异常上报", 8, ["onClick"]),
  4630. vue.createElementVNode("button", {
  4631. class: "btn primary",
  4632. onClick: vue.withModifiers(($event) => _ctx.mainAction(item), ["stop"])
  4633. }, vue.toDisplayString(_ctx.getMainActionText(item)), 9, ["onClick"])
  4634. ])
  4635. ])) : vue.createCommentVNode("v-if", true)
  4636. ], 8, ["onClick"]);
  4637. }),
  4638. 128
  4639. /* KEYED_FRAGMENT */
  4640. )),
  4641. vue.createElementVNode("view", { class: "loading-text" }, "已加载完"),
  4642. vue.createElementVNode("view", { style: { "height": "160rpx" } })
  4643. ]),
  4644. _ctx.activeCallItem ? (vue.openBlock(), vue.createElementBlock("view", {
  4645. key: 0,
  4646. class: "call-mask",
  4647. onClick: _cache[8] || (_cache[8] = (...args) => _ctx.closeCallMenu && _ctx.closeCallMenu(...args))
  4648. })) : vue.createCommentVNode("v-if", true)
  4649. ]),
  4650. _ctx.showPetModal ? (vue.openBlock(), vue.createElementBlock("view", {
  4651. key: 0,
  4652. class: "pet-modal-mask",
  4653. onClick: _cache[12] || (_cache[12] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  4654. }, [
  4655. vue.createElementVNode("view", {
  4656. class: "pet-modal-content",
  4657. onClick: _cache[11] || (_cache[11] = vue.withModifiers(() => {
  4658. }, ["stop"]))
  4659. }, [
  4660. vue.createElementVNode("view", { class: "pet-modal-header" }, [
  4661. vue.createElementVNode("text", { class: "pet-modal-title" }, "宠物档案"),
  4662. vue.createElementVNode("view", { class: "pm-header-actions" }, [
  4663. vue.createElementVNode("view", {
  4664. class: "pm-remark-btn",
  4665. onClick: _cache[9] || (_cache[9] = (...args) => _ctx.openRemarkInput && _ctx.openRemarkInput(...args))
  4666. }, "备注"),
  4667. vue.createElementVNode("view", {
  4668. class: "close-icon-btn",
  4669. onClick: _cache[10] || (_cache[10] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  4670. }, "×")
  4671. ])
  4672. ]),
  4673. vue.createElementVNode("scroll-view", {
  4674. "scroll-y": "",
  4675. class: "pet-modal-scroll"
  4676. }, [
  4677. vue.createElementVNode("view", { class: "pet-base-info" }, [
  4678. vue.createElementVNode("image", {
  4679. class: "pm-avatar",
  4680. src: _ctx.currentPetInfo.petAvatar,
  4681. mode: "aspectFill"
  4682. }, null, 8, ["src"]),
  4683. vue.createElementVNode("view", { class: "pm-info-text" }, [
  4684. vue.createElementVNode("view", { class: "pm-name-row" }, [
  4685. vue.createElementVNode(
  4686. "text",
  4687. { class: "pm-name" },
  4688. vue.toDisplayString(_ctx.currentPetInfo.petName),
  4689. 1
  4690. /* TEXT */
  4691. ),
  4692. _ctx.currentPetInfo.petGender === "M" ? (vue.openBlock(), vue.createElementBlock("view", {
  4693. key: 0,
  4694. class: "pm-gender"
  4695. }, [
  4696. vue.createElementVNode("text", { class: "gender-icon" }, "♂"),
  4697. vue.createElementVNode("text", null, "公")
  4698. ])) : _ctx.currentPetInfo.petGender === "F" ? (vue.openBlock(), vue.createElementBlock("view", {
  4699. key: 1,
  4700. class: "pm-gender female"
  4701. }, [
  4702. vue.createElementVNode("text", { class: "gender-icon" }, "♀"),
  4703. vue.createElementVNode("text", null, "母")
  4704. ])) : vue.createCommentVNode("v-if", true)
  4705. ]),
  4706. vue.createElementVNode(
  4707. "text",
  4708. { class: "pm-breed" },
  4709. "品种:" + vue.toDisplayString(_ctx.currentPetInfo.petBreed),
  4710. 1
  4711. /* TEXT */
  4712. )
  4713. ])
  4714. ]),
  4715. vue.createElementVNode("view", { class: "pm-detail-grid" }, [
  4716. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  4717. vue.createElementVNode("text", { class: "pm-label" }, "年龄"),
  4718. vue.createElementVNode(
  4719. "text",
  4720. { class: "pm-val" },
  4721. vue.toDisplayString(_ctx.currentPetInfo.petAge || "未知"),
  4722. 1
  4723. /* TEXT */
  4724. )
  4725. ]),
  4726. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  4727. vue.createElementVNode("text", { class: "pm-label" }, "体重"),
  4728. vue.createElementVNode(
  4729. "text",
  4730. { class: "pm-val" },
  4731. vue.toDisplayString(_ctx.currentPetInfo.petWeight || "未知"),
  4732. 1
  4733. /* TEXT */
  4734. )
  4735. ]),
  4736. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  4737. vue.createElementVNode("text", { class: "pm-label" }, "性格"),
  4738. vue.createElementVNode(
  4739. "text",
  4740. { class: "pm-val" },
  4741. vue.toDisplayString(_ctx.currentPetInfo.petPersonality || "无"),
  4742. 1
  4743. /* TEXT */
  4744. )
  4745. ]),
  4746. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  4747. vue.createElementVNode("text", { class: "pm-label" }, "爱好"),
  4748. vue.createElementVNode(
  4749. "text",
  4750. { class: "pm-val" },
  4751. vue.toDisplayString(_ctx.currentPetInfo.petHobby || "无"),
  4752. 1
  4753. /* TEXT */
  4754. )
  4755. ]),
  4756. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  4757. vue.createElementVNode("text", { class: "pm-label" }, "备注"),
  4758. vue.createElementVNode(
  4759. "text",
  4760. { class: "pm-val" },
  4761. vue.toDisplayString(_ctx.currentPetInfo.petRemark || "无特殊过敏史"),
  4762. 1
  4763. /* TEXT */
  4764. )
  4765. ])
  4766. ]),
  4767. _ctx.currentPetInfo.petTags && _ctx.currentPetInfo.petTags.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  4768. key: 0,
  4769. class: "pm-tags"
  4770. }, [
  4771. (vue.openBlock(true), vue.createElementBlock(
  4772. vue.Fragment,
  4773. null,
  4774. vue.renderList(_ctx.currentPetInfo.petTags, (tag, index) => {
  4775. return vue.openBlock(), vue.createElementBlock(
  4776. "view",
  4777. {
  4778. class: "pm-tag",
  4779. key: index
  4780. },
  4781. vue.toDisplayString(tag),
  4782. 1
  4783. /* TEXT */
  4784. );
  4785. }),
  4786. 128
  4787. /* KEYED_FRAGMENT */
  4788. ))
  4789. ])) : vue.createCommentVNode("v-if", true),
  4790. vue.createElementVNode("view", { class: "pm-section-title" }, [
  4791. vue.createElementVNode("view", { class: "orange-bar" }),
  4792. vue.createElementVNode("text", null, "备注日志")
  4793. ]),
  4794. vue.createElementVNode("view", { class: "pm-log-list" }, [
  4795. (vue.openBlock(true), vue.createElementBlock(
  4796. vue.Fragment,
  4797. null,
  4798. vue.renderList(_ctx.currentPetInfo.petLogs, (log, lIndex) => {
  4799. return vue.openBlock(), vue.createElementBlock("view", {
  4800. class: "pm-log-item",
  4801. key: lIndex
  4802. }, [
  4803. vue.createElementVNode(
  4804. "text",
  4805. { class: "pm-log-date" },
  4806. vue.toDisplayString(log.date),
  4807. 1
  4808. /* TEXT */
  4809. ),
  4810. vue.createElementVNode(
  4811. "text",
  4812. { class: "pm-log-text" },
  4813. vue.toDisplayString(log.content),
  4814. 1
  4815. /* TEXT */
  4816. ),
  4817. vue.createElementVNode(
  4818. "text",
  4819. { class: "pm-log-recorder" },
  4820. vue.toDisplayString(log.recorder === "系统记录" ? "" : "记录人: ") + vue.toDisplayString(log.recorder),
  4821. 1
  4822. /* TEXT */
  4823. )
  4824. ]);
  4825. }),
  4826. 128
  4827. /* KEYED_FRAGMENT */
  4828. ))
  4829. ]),
  4830. vue.createElementVNode("view", { style: { "height": "30rpx" } })
  4831. ])
  4832. ])
  4833. ])) : vue.createCommentVNode("v-if", true),
  4834. _ctx.showRemarkInput ? (vue.openBlock(), vue.createElementBlock("view", {
  4835. key: 1,
  4836. class: "remark-mask",
  4837. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.closeRemarkInput && _ctx.closeRemarkInput(...args))
  4838. }, [
  4839. vue.createElementVNode("view", {
  4840. class: "remark-sheet",
  4841. onClick: _cache[16] || (_cache[16] = vue.withModifiers(() => {
  4842. }, ["stop"]))
  4843. }, [
  4844. vue.createElementVNode("view", { class: "remark-sheet-header" }, [
  4845. vue.createElementVNode("text", { class: "remark-sheet-title" }, "添加备注"),
  4846. vue.createElementVNode("view", {
  4847. class: "close-icon-btn",
  4848. onClick: _cache[13] || (_cache[13] = (...args) => _ctx.closeRemarkInput && _ctx.closeRemarkInput(...args))
  4849. }, "×")
  4850. ]),
  4851. vue.withDirectives(vue.createElementVNode(
  4852. "textarea",
  4853. {
  4854. class: "remark-textarea",
  4855. "onUpdate:modelValue": _cache[14] || (_cache[14] = ($event) => _ctx.remarkText = $event),
  4856. placeholder: "请输入备注内容...",
  4857. maxlength: "500",
  4858. "auto-height": ""
  4859. },
  4860. null,
  4861. 512
  4862. /* NEED_PATCH */
  4863. ), [
  4864. [vue.vModelText, _ctx.remarkText]
  4865. ]),
  4866. vue.createElementVNode("view", {
  4867. class: "remark-submit-btn",
  4868. onClick: _cache[15] || (_cache[15] = (...args) => _ctx.submitRemark && _ctx.submitRemark(...args))
  4869. }, "提交备注")
  4870. ])
  4871. ])) : vue.createCommentVNode("v-if", true),
  4872. _ctx.showNavModal ? (vue.openBlock(), vue.createElementBlock("view", {
  4873. key: 2,
  4874. class: "nav-modal-mask",
  4875. onClick: _cache[23] || (_cache[23] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  4876. }, [
  4877. vue.createElementVNode("view", {
  4878. class: "nav-action-sheet",
  4879. onClick: _cache[22] || (_cache[22] = vue.withModifiers(() => {
  4880. }, ["stop"]))
  4881. }, [
  4882. vue.createElementVNode("view", { class: "nav-sheet-title" }, "选择地图进行导航"),
  4883. vue.createElementVNode("view", {
  4884. class: "nav-sheet-item",
  4885. onClick: _cache[18] || (_cache[18] = ($event) => _ctx.chooseMap("高德"))
  4886. }, "高德地图"),
  4887. vue.createElementVNode("view", {
  4888. class: "nav-sheet-item",
  4889. onClick: _cache[19] || (_cache[19] = ($event) => _ctx.chooseMap("腾讯"))
  4890. }, "腾讯地图"),
  4891. vue.createElementVNode("view", {
  4892. class: "nav-sheet-item",
  4893. onClick: _cache[20] || (_cache[20] = ($event) => _ctx.chooseMap("百度"))
  4894. }, "百度地图"),
  4895. vue.createElementVNode("view", { class: "nav-sheet-gap" }),
  4896. vue.createElementVNode("view", {
  4897. class: "nav-sheet-item cancel",
  4898. onClick: _cache[21] || (_cache[21] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  4899. }, "取消")
  4900. ])
  4901. ])) : vue.createCommentVNode("v-if", true)
  4902. ],
  4903. 64
  4904. /* STABLE_FRAGMENT */
  4905. );
  4906. }
  4907. const PagesOrdersIndex = /* @__PURE__ */ _export_sfc(_sfc_main$r, [["render", _sfc_render$q], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/orders/index.vue"]]);
  4908. const logic$1 = {
  4909. data() {
  4910. return {
  4911. orderType: 1,
  4912. // 1:接送, 2:喂遛, 3:洗护
  4913. // Define steps dynamically based on type
  4914. stepsPickup: ["接单", "到达", "出发", "送达", "完成"],
  4915. stepsWalkWash: ["接单", "到达", "开始", "结束", "完成"],
  4916. currentStep: 1,
  4917. // 0-indexed (1 means 到达)
  4918. // Mock Data
  4919. orderDetail: {
  4920. type: 1,
  4921. price: "20.00",
  4922. timeLabel: "取货时间",
  4923. time: "2026/02/10 10:00",
  4924. petAvatar: "/static/dog.png",
  4925. petName: "哈士奇宝宝",
  4926. petBreed: "哈士奇",
  4927. serviceTag: "宠物接送",
  4928. startLocation: "武汉大学宠物店",
  4929. startAddress: "武汉市洪山区珞喻路458号",
  4930. endLocation: "张** 189****8451",
  4931. endAddress: "武汉市武昌区新区大道凤凰广场A座一楼25号",
  4932. serviceContent: "这里是订单服务内容。",
  4933. remark: "这里是订单备注信息。",
  4934. orderNo: "T1001",
  4935. createTime: "2026/02/10 09:30",
  4936. progressLogs: [
  4937. { status: "您已接单", time: "2026-02-10 10:00" }
  4938. ]
  4939. },
  4940. // Modal states
  4941. showPetModal: false,
  4942. currentPetInfo: {},
  4943. showNavModal: false,
  4944. navTargetPointType: "",
  4945. // Upload Modal State
  4946. showUploadModal: false,
  4947. modalMediaList: [],
  4948. modalRemark: "",
  4949. // 宠护小结弹窗状态
  4950. showSumModal: false,
  4951. sumContent: "",
  4952. sumDate: "",
  4953. sumSigner: "张*哥",
  4954. // 宠物备注弹窗状态
  4955. showPetRemarkInput: false,
  4956. petRemarkText: ""
  4957. };
  4958. },
  4959. computed: {
  4960. steps() {
  4961. return this.orderType === 1 ? this.stepsPickup : this.stepsWalkWash;
  4962. },
  4963. displayStatusText() {
  4964. let status = this.steps[this.currentStep];
  4965. if (status === "已完成" || status === "完成")
  4966. return "已完成";
  4967. if (status === "已拒绝")
  4968. return "已拒绝";
  4969. if (status === "接单") {
  4970. return this.orderType === 1 ? "待接送" : "待服务";
  4971. }
  4972. return this.orderType === 1 ? "配送中" : "服务中";
  4973. },
  4974. currentStatusText() {
  4975. return this.steps[this.currentStep];
  4976. },
  4977. currentTaskTitle() {
  4978. let action = this.steps[this.currentStep];
  4979. if (action === "到达")
  4980. return "到达打卡";
  4981. if (action === "开始")
  4982. return "开始服务";
  4983. if (action === "出发")
  4984. return "确认出发";
  4985. if (action === "送达" || action === "结束")
  4986. return "服务完成";
  4987. return action;
  4988. },
  4989. currentTaskDesc() {
  4990. let action = this.steps[this.currentStep];
  4991. if (action === "到达") {
  4992. return "打卡穿着工装消毒站门口的照片或视频";
  4993. }
  4994. if (this.orderType === 1) {
  4995. if (action === "出发")
  4996. return "拍摄宠物上车/出发时的状态照片或视频";
  4997. if (action === "送达")
  4998. return "打卡确认送达的照片或视频";
  4999. } else if (this.orderType === 2) {
  5000. if (action === "开始")
  5001. return "开始服务并拍摄照片或视频";
  5002. if (action === "结束")
  5003. return "服务完成拍摄照片或视频";
  5004. } else if (this.orderType === 3) {
  5005. if (action === "开始")
  5006. return "开始服务并拍摄照片或视频";
  5007. if (action === "结束")
  5008. return "服务完成拍摄照片或视频";
  5009. }
  5010. return "请按要求提交照片或视频及备注";
  5011. }
  5012. },
  5013. onLoad(options) {
  5014. if (options.type) {
  5015. this.orderType = parseInt(options.type);
  5016. this.orderDetail.type = this.orderType;
  5017. if (this.orderType === 2 || this.orderType === 3) {
  5018. this.orderDetail.serviceTag = this.orderType === 2 ? "上门喂遛" : "上门洗护";
  5019. this.orderDetail.orderNo = this.orderType === 2 ? "W1002" : "X1003";
  5020. this.currentStep = 1;
  5021. }
  5022. }
  5023. },
  5024. methods: {
  5025. showPetProfile() {
  5026. this.currentPetInfo = {
  5027. ...this.orderDetail,
  5028. petGender: "M",
  5029. petAge: "2岁",
  5030. petWeight: "15kg",
  5031. petPersonality: "活泼亲人,精力旺盛",
  5032. petHobby: "喜欢追飞盘,爱吃肉干",
  5033. petRemark: "肠胃较弱,不能乱喂零食;出门易爆冲,请拉紧牵引绳。",
  5034. petTags: ["拉响警报", "不能吃鸡肉", "精力旺盛"],
  5035. petLogs: [
  5036. { date: "2026-02-09 14:00", content: "今天遛弯拉了两次粑粑,精神状态很好。", recorder: "王阿姨" },
  5037. { date: "2026-02-08 10:30", content: "有些挑食,剩了小半碗狗粮。", recorder: "李师傅" },
  5038. { date: "2026-02-05 09:00", content: "建档。", recorder: "系统记录" }
  5039. ]
  5040. };
  5041. this.showPetModal = true;
  5042. },
  5043. closePetProfile() {
  5044. this.showPetModal = false;
  5045. },
  5046. openPetRemarkInput() {
  5047. this.petRemarkText = "";
  5048. this.showPetRemarkInput = true;
  5049. },
  5050. closePetRemarkInput() {
  5051. this.showPetRemarkInput = false;
  5052. },
  5053. submitPetRemark() {
  5054. if (!this.petRemarkText.trim()) {
  5055. uni.showToast({ title: "备注内容不能为空", icon: "none" });
  5056. return;
  5057. }
  5058. const now = /* @__PURE__ */ new Date();
  5059. const date = `${now.getFullYear()}/${String(now.getMonth() + 1).padStart(2, "0")}/${String(now.getDate()).padStart(2, "0")}`;
  5060. if (!this.currentPetInfo.petLogs) {
  5061. this.currentPetInfo.petLogs = [];
  5062. }
  5063. this.currentPetInfo.petLogs.unshift({
  5064. date,
  5065. content: this.petRemarkText,
  5066. recorder: "张*哥"
  5067. });
  5068. this.closePetRemarkInput();
  5069. uni.showToast({ title: "备注已添加", icon: "success" });
  5070. },
  5071. goToAnomaly() {
  5072. uni.navigateTo({
  5073. url: "/pages/orders/anomaly?orderId=" + (this.orderDetail.orderNo || "")
  5074. });
  5075. },
  5076. callPhone() {
  5077. uni.makePhoneCall({ phoneNumber: "18900008451" });
  5078. },
  5079. openNavigation(type) {
  5080. this.navTargetPointType = type;
  5081. this.showNavModal = true;
  5082. },
  5083. closeNavModal() {
  5084. this.showNavModal = false;
  5085. },
  5086. chooseMap(mapType) {
  5087. let pointType = this.navTargetPointType;
  5088. let name = pointType === "start" ? this.orderDetail.startLocation : this.orderDetail.endLocation;
  5089. let address = pointType === "start" ? this.orderDetail.startAddress : this.orderDetail.endAddress;
  5090. this.showNavModal = false;
  5091. uni.openLocation({
  5092. latitude: 30.52,
  5093. // Mock lat
  5094. longitude: 114.31,
  5095. // Mock lng
  5096. name: name || "目的地",
  5097. address: address || "默认地址",
  5098. success: function() {
  5099. formatAppLog("log", "at pages/orders/detail-logic.js:187", "打开导航成功: " + mapType);
  5100. }
  5101. });
  5102. },
  5103. openUploadModal() {
  5104. this.modalMediaList = [];
  5105. this.modalRemark = "";
  5106. this.showUploadModal = true;
  5107. },
  5108. closeUploadModal() {
  5109. this.showUploadModal = false;
  5110. },
  5111. chooseModalMedia() {
  5112. uni.chooseImage({
  5113. count: 5 - this.modalMediaList.length,
  5114. success: (res) => {
  5115. this.modalMediaList = this.modalMediaList.concat(res.tempFilePaths);
  5116. uni.showToast({ title: "添加成功", icon: "none" });
  5117. }
  5118. });
  5119. },
  5120. removeModalMedia(index) {
  5121. this.modalMediaList.splice(index, 1);
  5122. },
  5123. getCurrentTime() {
  5124. const now = /* @__PURE__ */ new Date();
  5125. const y = now.getFullYear();
  5126. const m = String(now.getMonth() + 1).padStart(2, "0");
  5127. const d = String(now.getDate()).padStart(2, "0");
  5128. const h = String(now.getHours()).padStart(2, "0");
  5129. const min = String(now.getMinutes()).padStart(2, "0");
  5130. return `${y}/${m}/${d} ${h}:${min}`;
  5131. },
  5132. confirmUploadModal() {
  5133. if (this.modalMediaList.length === 0) {
  5134. uni.showToast({ title: "请上传至少一张图片或视频", icon: "none" });
  5135. return;
  5136. }
  5137. this.orderDetail.progressLogs.unshift({
  5138. status: this.currentTaskTitle,
  5139. time: this.getCurrentTime(),
  5140. medias: [...this.modalMediaList],
  5141. remark: this.modalRemark
  5142. });
  5143. if (this.currentStep < this.steps.length - 1) {
  5144. this.currentStep++;
  5145. }
  5146. this.closeUploadModal();
  5147. uni.showToast({ title: "打卡成功", icon: "success" });
  5148. if (this.currentStep === this.steps.length - 1) {
  5149. setTimeout(() => {
  5150. uni.showToast({ title: "订单已完成", icon: "none" });
  5151. }, 1500);
  5152. }
  5153. },
  5154. copyOrderNo() {
  5155. uni.setClipboardData({
  5156. data: this.orderDetail.orderNo,
  5157. success: () => {
  5158. uni.showToast({ title: "复制成功", icon: "none" });
  5159. }
  5160. });
  5161. },
  5162. openSumModal() {
  5163. const now = /* @__PURE__ */ new Date();
  5164. const y = now.getFullYear();
  5165. const m = String(now.getMonth() + 1).padStart(2, "0");
  5166. const d = String(now.getDate()).padStart(2, "0");
  5167. this.sumDate = `${y}/${m}/${d}`;
  5168. if (!this.sumContent) {
  5169. this.sumContent = "1. 精神/身体状态:\n2. 进食/饮水:\n3. 排泤情况:\n4. 卫生情况:\n5. 互动情况:\n6. 特殊情况/备注:";
  5170. }
  5171. this.showSumModal = true;
  5172. },
  5173. closeSumModal() {
  5174. this.showSumModal = false;
  5175. },
  5176. submitSumModal() {
  5177. if (!this.sumContent.trim()) {
  5178. uni.showToast({ title: "请填写服务内容", icon: "none" });
  5179. return;
  5180. }
  5181. this.closeSumModal();
  5182. uni.showToast({ title: "小结已提交", icon: "success" });
  5183. }
  5184. }
  5185. };
  5186. const _imports_14 = "/static/icons/phone_orange.svg";
  5187. const _imports_1$7 = "/static/icons/clock.svg";
  5188. const _imports_0$2 = "/static/icons/right_arrow_orange.svg";
  5189. const _imports_4$1 = "/static/icons/heart.svg";
  5190. const _imports_5 = "/static/icons/file.svg";
  5191. const _imports_1$6 = "/static/icons/camera_grey.svg";
  5192. const _imports_7 = "/static/icons/order_no.svg";
  5193. const _sfc_main$q = {
  5194. ...logic$1
  5195. };
  5196. function _sfc_render$p(_ctx, _cache, $props, $setup, $data, $options) {
  5197. return vue.openBlock(), vue.createElementBlock("view", { class: "detail-container" }, [
  5198. vue.createElementVNode("view", { class: "detail-header" }, [
  5199. vue.createElementVNode("view", { class: "status-row" }, [
  5200. vue.createElementVNode(
  5201. "text",
  5202. { class: "status-title" },
  5203. vue.toDisplayString(_ctx.displayStatusText),
  5204. 1
  5205. /* TEXT */
  5206. ),
  5207. vue.createElementVNode(
  5208. "text",
  5209. { class: "status-price" },
  5210. "¥" + vue.toDisplayString(_ctx.orderDetail.price),
  5211. 1
  5212. /* TEXT */
  5213. )
  5214. ]),
  5215. vue.createElementVNode("view", { class: "progress-bar" }, [
  5216. (vue.openBlock(true), vue.createElementBlock(
  5217. vue.Fragment,
  5218. null,
  5219. vue.renderList(_ctx.steps, (step, index) => {
  5220. return vue.openBlock(), vue.createElementBlock(
  5221. "view",
  5222. {
  5223. class: vue.normalizeClass(["step-item", { "active": index <= _ctx.currentStep }]),
  5224. key: index
  5225. },
  5226. [
  5227. vue.createElementVNode("view", { class: "step-circle-wrapper" }, [
  5228. index !== 0 ? (vue.openBlock(), vue.createElementBlock(
  5229. "view",
  5230. {
  5231. key: 0,
  5232. class: vue.normalizeClass(["step-line", { "active-line": index <= _ctx.currentStep }])
  5233. },
  5234. null,
  5235. 2
  5236. /* CLASS */
  5237. )) : vue.createCommentVNode("v-if", true),
  5238. vue.createElementVNode(
  5239. "view",
  5240. { class: "step-circle" },
  5241. vue.toDisplayString(index + 1),
  5242. 1
  5243. /* TEXT */
  5244. )
  5245. ]),
  5246. vue.createElementVNode(
  5247. "text",
  5248. { class: "step-text" },
  5249. vue.toDisplayString(step),
  5250. 1
  5251. /* TEXT */
  5252. )
  5253. ],
  5254. 2
  5255. /* CLASS */
  5256. );
  5257. }),
  5258. 128
  5259. /* KEYED_FRAGMENT */
  5260. ))
  5261. ])
  5262. ]),
  5263. vue.createElementVNode("scroll-view", {
  5264. "scroll-y": "",
  5265. class: "detail-content"
  5266. }, [
  5267. vue.createElementVNode("view", { class: "white-card pet-bar" }, [
  5268. vue.createElementVNode("image", {
  5269. class: "pb-avatar",
  5270. src: _ctx.orderDetail.petAvatar,
  5271. mode: "aspectFill"
  5272. }, null, 8, ["src"]),
  5273. vue.createElementVNode("view", { class: "pb-info" }, [
  5274. vue.createElementVNode("view", { class: "pb-name-row" }, [
  5275. vue.createElementVNode(
  5276. "text",
  5277. { class: "pb-name" },
  5278. vue.toDisplayString(_ctx.orderDetail.petName),
  5279. 1
  5280. /* TEXT */
  5281. ),
  5282. vue.createElementVNode(
  5283. "text",
  5284. { class: "pb-breed" },
  5285. "品种: " + vue.toDisplayString(_ctx.orderDetail.petBreed),
  5286. 1
  5287. /* TEXT */
  5288. )
  5289. ]),
  5290. vue.createElementVNode("view", { class: "pb-tags" }, [
  5291. vue.createElementVNode(
  5292. "text",
  5293. { class: "pb-tag" },
  5294. vue.toDisplayString(_ctx.orderDetail.serviceTag),
  5295. 1
  5296. /* TEXT */
  5297. )
  5298. ])
  5299. ]),
  5300. vue.createElementVNode("view", { class: "pb-actions" }, [
  5301. vue.createElementVNode("view", {
  5302. class: "pb-btn profile-btn",
  5303. onClick: _cache[0] || (_cache[0] = (...args) => _ctx.showPetProfile && _ctx.showPetProfile(...args))
  5304. }, "宠物档案"),
  5305. vue.createElementVNode("view", {
  5306. class: "pb-btn phone-btn",
  5307. onClick: _cache[1] || (_cache[1] = (...args) => _ctx.callPhone && _ctx.callPhone(...args))
  5308. }, [
  5309. vue.createElementVNode("image", {
  5310. class: "phone-icon",
  5311. src: _imports_14
  5312. })
  5313. ])
  5314. ])
  5315. ]),
  5316. vue.createElementVNode("view", { class: "white-card service-info-card" }, [
  5317. vue.createElementVNode("view", { class: "si-row time-row" }, [
  5318. vue.createElementVNode("image", {
  5319. class: "si-icon outline",
  5320. src: _imports_1$7
  5321. }),
  5322. vue.createElementVNode("view", { class: "si-content" }, [
  5323. vue.createElementVNode("text", { class: "si-label" }, "服务时间"),
  5324. vue.createElementVNode(
  5325. "text",
  5326. { class: "si-val" },
  5327. vue.toDisplayString(_ctx.orderDetail.time),
  5328. 1
  5329. /* TEXT */
  5330. )
  5331. ]),
  5332. vue.createElementVNode("view", { class: "si-action record-btn" }, [
  5333. vue.createElementVNode("text", null, "异常记录"),
  5334. vue.createElementVNode("image", {
  5335. class: "record-arrow",
  5336. src: _imports_0$2
  5337. })
  5338. ])
  5339. ]),
  5340. _ctx.orderDetail.type === 1 ? (vue.openBlock(), vue.createElementBlock(
  5341. vue.Fragment,
  5342. { key: 0 },
  5343. [
  5344. vue.createElementVNode("view", { class: "si-row addr-row start-addr" }, [
  5345. vue.createElementVNode("view", { class: "icon-circle start" }, "取"),
  5346. vue.createElementVNode("view", { class: "route-line-vertical" }),
  5347. vue.createElementVNode("view", { class: "si-content" }, [
  5348. vue.createElementVNode(
  5349. "text",
  5350. { class: "si-addr-title" },
  5351. vue.toDisplayString(_ctx.orderDetail.startLocation),
  5352. 1
  5353. /* TEXT */
  5354. ),
  5355. vue.createElementVNode(
  5356. "text",
  5357. { class: "si-addr-desc" },
  5358. vue.toDisplayString(_ctx.orderDetail.startAddress),
  5359. 1
  5360. /* TEXT */
  5361. )
  5362. ]),
  5363. vue.createElementVNode("view", {
  5364. class: "nav-btn-circle",
  5365. onClick: _cache[2] || (_cache[2] = ($event) => _ctx.openNavigation("start"))
  5366. }, [
  5367. vue.createElementVNode("image", {
  5368. class: "nav-arrow",
  5369. src: _imports_3$2
  5370. })
  5371. ])
  5372. ]),
  5373. vue.createElementVNode("view", { class: "si-row addr-row end-addr" }, [
  5374. vue.createElementVNode("view", { class: "icon-circle end" }, "送"),
  5375. vue.createElementVNode("view", { class: "si-content" }, [
  5376. vue.createElementVNode(
  5377. "text",
  5378. { class: "si-addr-title" },
  5379. vue.toDisplayString(_ctx.orderDetail.endLocation),
  5380. 1
  5381. /* TEXT */
  5382. ),
  5383. vue.createElementVNode(
  5384. "text",
  5385. { class: "si-addr-desc" },
  5386. vue.toDisplayString(_ctx.orderDetail.endAddress),
  5387. 1
  5388. /* TEXT */
  5389. )
  5390. ]),
  5391. vue.createElementVNode("view", {
  5392. class: "nav-btn-circle",
  5393. onClick: _cache[3] || (_cache[3] = ($event) => _ctx.openNavigation("end"))
  5394. }, [
  5395. vue.createElementVNode("image", {
  5396. class: "nav-arrow",
  5397. src: _imports_3$2
  5398. })
  5399. ])
  5400. ])
  5401. ],
  5402. 64
  5403. /* STABLE_FRAGMENT */
  5404. )) : (vue.openBlock(), vue.createElementBlock(
  5405. vue.Fragment,
  5406. { key: 1 },
  5407. [
  5408. vue.createElementVNode("view", { class: "si-row addr-row end-addr" }, [
  5409. vue.createElementVNode("view", { class: "icon-circle service" }, "服"),
  5410. vue.createElementVNode("view", { class: "si-content" }, [
  5411. vue.createElementVNode(
  5412. "text",
  5413. { class: "si-addr-title" },
  5414. vue.toDisplayString(_ctx.orderDetail.endLocation),
  5415. 1
  5416. /* TEXT */
  5417. ),
  5418. vue.createElementVNode(
  5419. "text",
  5420. { class: "si-addr-desc" },
  5421. vue.toDisplayString(_ctx.orderDetail.endAddress),
  5422. 1
  5423. /* TEXT */
  5424. )
  5425. ]),
  5426. vue.createElementVNode("view", {
  5427. class: "nav-btn-circle",
  5428. onClick: _cache[4] || (_cache[4] = ($event) => _ctx.openNavigation("end"))
  5429. }, [
  5430. vue.createElementVNode("image", {
  5431. class: "nav-arrow",
  5432. src: _imports_3$2
  5433. })
  5434. ])
  5435. ]),
  5436. vue.createElementVNode("view", { class: "si-row" }, [
  5437. vue.createElementVNode("image", {
  5438. class: "si-icon outline",
  5439. src: _imports_4$1
  5440. }),
  5441. vue.createElementVNode("view", { class: "si-content" }, [
  5442. vue.createElementVNode("text", { class: "si-label" }, "服务内容"),
  5443. vue.createElementVNode(
  5444. "text",
  5445. { class: "si-val" },
  5446. vue.toDisplayString(_ctx.orderDetail.serviceContent),
  5447. 1
  5448. /* TEXT */
  5449. )
  5450. ])
  5451. ])
  5452. ],
  5453. 64
  5454. /* STABLE_FRAGMENT */
  5455. )),
  5456. vue.createElementVNode("view", { class: "si-row" }, [
  5457. vue.createElementVNode("image", {
  5458. class: "si-icon outline custom-icon-file",
  5459. src: _imports_5
  5460. }),
  5461. vue.createElementVNode("view", { class: "si-content" }, [
  5462. vue.createElementVNode("text", { class: "si-label" }, "备注"),
  5463. vue.createElementVNode(
  5464. "text",
  5465. { class: "si-val" },
  5466. vue.toDisplayString(_ctx.orderDetail.remark || "无"),
  5467. 1
  5468. /* TEXT */
  5469. )
  5470. ])
  5471. ])
  5472. ]),
  5473. _ctx.currentStep < _ctx.steps.length - 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  5474. key: 0,
  5475. class: "white-card task-card"
  5476. }, [
  5477. vue.createElementVNode(
  5478. "text",
  5479. { class: "tc-title" },
  5480. "当前任务:" + vue.toDisplayString(_ctx.currentTaskTitle),
  5481. 1
  5482. /* TEXT */
  5483. ),
  5484. vue.createElementVNode(
  5485. "text",
  5486. { class: "tc-desc" },
  5487. vue.toDisplayString(_ctx.currentTaskDesc),
  5488. 1
  5489. /* TEXT */
  5490. ),
  5491. vue.createElementVNode("view", {
  5492. class: "full-media-add",
  5493. onClick: _cache[5] || (_cache[5] = (...args) => _ctx.openUploadModal && _ctx.openUploadModal(...args))
  5494. }, [
  5495. vue.createElementVNode("image", {
  5496. class: "upload-icon-large",
  5497. src: _imports_1$6
  5498. }),
  5499. vue.createElementVNode("text", { class: "upload-text-large" }, "上传图或视频")
  5500. ])
  5501. ])) : vue.createCommentVNode("v-if", true),
  5502. vue.createElementVNode("view", { class: "white-card base-info-card" }, [
  5503. vue.createElementVNode("view", { class: "bi-row" }, [
  5504. vue.createElementVNode("image", {
  5505. class: "si-icon outline",
  5506. src: _imports_7
  5507. }),
  5508. vue.createElementVNode("view", { class: "bi-content" }, [
  5509. vue.createElementVNode("text", { class: "bi-label" }, "订单编号"),
  5510. vue.createElementVNode("view", { class: "bi-val-row" }, [
  5511. vue.createElementVNode(
  5512. "text",
  5513. { class: "bi-val" },
  5514. vue.toDisplayString(_ctx.orderDetail.orderNo),
  5515. 1
  5516. /* TEXT */
  5517. ),
  5518. vue.createElementVNode("text", {
  5519. class: "bi-copy",
  5520. onClick: _cache[6] || (_cache[6] = (...args) => _ctx.copyOrderNo && _ctx.copyOrderNo(...args))
  5521. }, "复制")
  5522. ])
  5523. ])
  5524. ]),
  5525. vue.createElementVNode("view", { class: "bi-row" }, [
  5526. vue.createElementVNode("image", {
  5527. class: "si-icon outline",
  5528. src: _imports_1$7
  5529. }),
  5530. vue.createElementVNode("view", { class: "bi-content" }, [
  5531. vue.createElementVNode("text", { class: "bi-label" }, "下单时间"),
  5532. vue.createElementVNode(
  5533. "text",
  5534. { class: "bi-val" },
  5535. vue.toDisplayString(_ctx.orderDetail.createTime),
  5536. 1
  5537. /* TEXT */
  5538. )
  5539. ])
  5540. ])
  5541. ]),
  5542. vue.createElementVNode("view", { class: "white-card timeline-card" }, [
  5543. vue.createElementVNode("view", { class: "tl-title-row" }, [
  5544. vue.createElementVNode("view", { class: "orange-bar" }),
  5545. vue.createElementVNode("text", { class: "tl-title" }, "订单进度")
  5546. ]),
  5547. vue.createElementVNode("view", { class: "tl-list" }, [
  5548. (vue.openBlock(true), vue.createElementBlock(
  5549. vue.Fragment,
  5550. null,
  5551. vue.renderList(_ctx.orderDetail.progressLogs, (log, idx) => {
  5552. return vue.openBlock(), vue.createElementBlock("view", {
  5553. class: "tl-item",
  5554. key: idx
  5555. }, [
  5556. vue.createElementVNode("view", { class: "tl-marker active" }, [
  5557. vue.createElementVNode("view", { class: "tl-dot-inner" })
  5558. ]),
  5559. vue.createElementVNode("view", { class: "tl-content-row" }, [
  5560. vue.createElementVNode("view", { class: "tl-header" }, [
  5561. vue.createElementVNode(
  5562. "text",
  5563. { class: "tl-status" },
  5564. vue.toDisplayString(log.status),
  5565. 1
  5566. /* TEXT */
  5567. ),
  5568. vue.createElementVNode(
  5569. "text",
  5570. { class: "tl-time" },
  5571. vue.toDisplayString(log.time),
  5572. 1
  5573. /* TEXT */
  5574. )
  5575. ]),
  5576. log.medias && log.medias.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  5577. key: 0,
  5578. class: "tl-medias"
  5579. }, [
  5580. (vue.openBlock(true), vue.createElementBlock(
  5581. vue.Fragment,
  5582. null,
  5583. vue.renderList(log.medias, (img, midx) => {
  5584. return vue.openBlock(), vue.createElementBlock("image", {
  5585. class: "tl-img",
  5586. key: midx,
  5587. src: img,
  5588. mode: "aspectFill"
  5589. }, null, 8, ["src"]);
  5590. }),
  5591. 128
  5592. /* KEYED_FRAGMENT */
  5593. ))
  5594. ])) : vue.createCommentVNode("v-if", true),
  5595. log.remark ? (vue.openBlock(), vue.createElementBlock("view", {
  5596. key: 1,
  5597. class: "tl-remark"
  5598. }, [
  5599. vue.createElementVNode(
  5600. "text",
  5601. null,
  5602. vue.toDisplayString(log.remark),
  5603. 1
  5604. /* TEXT */
  5605. )
  5606. ])) : vue.createCommentVNode("v-if", true)
  5607. ])
  5608. ]);
  5609. }),
  5610. 128
  5611. /* KEYED_FRAGMENT */
  5612. ))
  5613. ])
  5614. ]),
  5615. vue.createElementVNode("view", { style: { "height": "140rpx" } })
  5616. ]),
  5617. vue.createElementVNode("view", { class: "bottom-action-bar" }, [
  5618. vue.createElementVNode("view", { class: "action-left" }, [
  5619. vue.createElementVNode("button", {
  5620. class: "action-btn outline grey-outline",
  5621. onClick: _cache[7] || (_cache[7] = (...args) => _ctx.goToAnomaly && _ctx.goToAnomaly(...args))
  5622. }, "异常上报"),
  5623. vue.createElementVNode("button", {
  5624. class: "action-btn outline orange-outline",
  5625. onClick: _cache[8] || (_cache[8] = (...args) => _ctx.openSumModal && _ctx.openSumModal(...args))
  5626. }, "宠护小结")
  5627. ]),
  5628. vue.createElementVNode("view", { class: "action-right" }, [
  5629. _ctx.currentStep < _ctx.steps.length - 1 ? (vue.openBlock(), vue.createElementBlock(
  5630. "button",
  5631. {
  5632. key: 0,
  5633. class: "action-btn primary",
  5634. onClick: _cache[9] || (_cache[9] = (...args) => _ctx.openUploadModal && _ctx.openUploadModal(...args))
  5635. },
  5636. vue.toDisplayString(_ctx.currentTaskTitle),
  5637. 1
  5638. /* TEXT */
  5639. )) : (vue.openBlock(), vue.createElementBlock("button", {
  5640. key: 1,
  5641. class: "action-btn primary grey-bg"
  5642. }, "已完成"))
  5643. ])
  5644. ]),
  5645. _ctx.showPetModal ? (vue.openBlock(), vue.createElementBlock("view", {
  5646. key: 0,
  5647. class: "pet-modal-mask",
  5648. onClick: _cache[13] || (_cache[13] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  5649. }, [
  5650. vue.createElementVNode("view", {
  5651. class: "pet-modal-content",
  5652. onClick: _cache[12] || (_cache[12] = vue.withModifiers(() => {
  5653. }, ["stop"]))
  5654. }, [
  5655. vue.createElementVNode("view", { class: "pet-modal-header" }, [
  5656. vue.createElementVNode("text", { class: "pet-modal-title" }, "宠物档案"),
  5657. vue.createElementVNode("view", { style: { "flex": "1" } }),
  5658. vue.createElementVNode("view", {
  5659. class: "pm-remark-btn",
  5660. onClick: _cache[10] || (_cache[10] = (...args) => _ctx.openPetRemarkInput && _ctx.openPetRemarkInput(...args))
  5661. }, "备注"),
  5662. vue.createElementVNode("view", {
  5663. class: "close-icon-btn",
  5664. onClick: _cache[11] || (_cache[11] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  5665. }, "×")
  5666. ]),
  5667. vue.createElementVNode("scroll-view", {
  5668. "scroll-y": "",
  5669. class: "pet-modal-scroll"
  5670. }, [
  5671. vue.createElementVNode("view", { class: "pet-base-info" }, [
  5672. vue.createElementVNode("image", {
  5673. class: "pm-avatar",
  5674. src: _ctx.currentPetInfo.petAvatar,
  5675. mode: "aspectFill"
  5676. }, null, 8, ["src"]),
  5677. vue.createElementVNode("view", { class: "pm-info-text" }, [
  5678. vue.createElementVNode("view", { class: "pm-name-row" }, [
  5679. vue.createElementVNode(
  5680. "text",
  5681. { class: "pm-name" },
  5682. vue.toDisplayString(_ctx.currentPetInfo.petName),
  5683. 1
  5684. /* TEXT */
  5685. ),
  5686. _ctx.currentPetInfo.petGender === "M" ? (vue.openBlock(), vue.createElementBlock("view", {
  5687. key: 0,
  5688. class: "pm-gender"
  5689. }, [
  5690. vue.createElementVNode("text", { class: "gender-icon" }, "♂"),
  5691. vue.createElementVNode("text", null, "公")
  5692. ])) : _ctx.currentPetInfo.petGender === "F" ? (vue.openBlock(), vue.createElementBlock("view", {
  5693. key: 1,
  5694. class: "pm-gender female"
  5695. }, [
  5696. vue.createElementVNode("text", { class: "gender-icon" }, "♀"),
  5697. vue.createElementVNode("text", null, "母")
  5698. ])) : vue.createCommentVNode("v-if", true)
  5699. ]),
  5700. vue.createElementVNode(
  5701. "text",
  5702. { class: "pm-breed" },
  5703. "品种:" + vue.toDisplayString(_ctx.currentPetInfo.petBreed),
  5704. 1
  5705. /* TEXT */
  5706. )
  5707. ])
  5708. ]),
  5709. vue.createElementVNode("view", { class: "pm-detail-grid" }, [
  5710. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  5711. vue.createElementVNode("text", { class: "pm-label" }, "年龄"),
  5712. vue.createElementVNode(
  5713. "text",
  5714. { class: "pm-val" },
  5715. vue.toDisplayString(_ctx.currentPetInfo.petAge || "未知"),
  5716. 1
  5717. /* TEXT */
  5718. )
  5719. ]),
  5720. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  5721. vue.createElementVNode("text", { class: "pm-label" }, "体重"),
  5722. vue.createElementVNode(
  5723. "text",
  5724. { class: "pm-val" },
  5725. vue.toDisplayString(_ctx.currentPetInfo.petWeight || "未知"),
  5726. 1
  5727. /* TEXT */
  5728. )
  5729. ]),
  5730. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  5731. vue.createElementVNode("text", { class: "pm-label" }, "性格"),
  5732. vue.createElementVNode(
  5733. "text",
  5734. { class: "pm-val" },
  5735. vue.toDisplayString(_ctx.currentPetInfo.petPersonality || "无"),
  5736. 1
  5737. /* TEXT */
  5738. )
  5739. ]),
  5740. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  5741. vue.createElementVNode("text", { class: "pm-label" }, "爱好"),
  5742. vue.createElementVNode(
  5743. "text",
  5744. { class: "pm-val" },
  5745. vue.toDisplayString(_ctx.currentPetInfo.petHobby || "无"),
  5746. 1
  5747. /* TEXT */
  5748. )
  5749. ]),
  5750. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  5751. vue.createElementVNode("text", { class: "pm-label" }, "备注"),
  5752. vue.createElementVNode(
  5753. "text",
  5754. { class: "pm-val" },
  5755. vue.toDisplayString(_ctx.currentPetInfo.petRemark || "无特殊过敏史"),
  5756. 1
  5757. /* TEXT */
  5758. )
  5759. ])
  5760. ]),
  5761. _ctx.currentPetInfo.petTags && _ctx.currentPetInfo.petTags.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  5762. key: 0,
  5763. class: "pm-tags-row"
  5764. }, [
  5765. (vue.openBlock(true), vue.createElementBlock(
  5766. vue.Fragment,
  5767. null,
  5768. vue.renderList(_ctx.currentPetInfo.petTags, (tag, ti) => {
  5769. return vue.openBlock(), vue.createElementBlock("view", {
  5770. class: "pm-tag-chip",
  5771. key: ti
  5772. }, [
  5773. vue.createElementVNode(
  5774. "text",
  5775. { class: "pm-tag-chip-text" },
  5776. vue.toDisplayString(tag),
  5777. 1
  5778. /* TEXT */
  5779. )
  5780. ]);
  5781. }),
  5782. 128
  5783. /* KEYED_FRAGMENT */
  5784. ))
  5785. ])) : vue.createCommentVNode("v-if", true),
  5786. vue.createElementVNode("view", { class: "pm-log-section" }, [
  5787. vue.createElementVNode("view", { class: "pm-log-header" }, [
  5788. vue.createElementVNode("view", { style: { "width": "6rpx", "height": "28rpx", "background": "#FF9800", "border-radius": "3rpx", "margin-right": "12rpx" } }),
  5789. vue.createElementVNode("text", { class: "pm-log-section-title" }, "备注日志")
  5790. ]),
  5791. (vue.openBlock(true), vue.createElementBlock(
  5792. vue.Fragment,
  5793. null,
  5794. vue.renderList(_ctx.currentPetInfo.petLogs, (log, lIndex) => {
  5795. return vue.openBlock(), vue.createElementBlock("view", {
  5796. class: "pm-log-item",
  5797. key: lIndex
  5798. }, [
  5799. vue.createElementVNode(
  5800. "text",
  5801. { class: "pm-log-date" },
  5802. vue.toDisplayString(log.date),
  5803. 1
  5804. /* TEXT */
  5805. ),
  5806. vue.createElementVNode(
  5807. "text",
  5808. { class: "pm-log-text" },
  5809. vue.toDisplayString(log.content),
  5810. 1
  5811. /* TEXT */
  5812. ),
  5813. log.recorder !== "系统记录" ? (vue.openBlock(), vue.createElementBlock(
  5814. "text",
  5815. {
  5816. key: 0,
  5817. class: "pm-log-recorder"
  5818. },
  5819. "记录人:" + vue.toDisplayString(log.recorder),
  5820. 1
  5821. /* TEXT */
  5822. )) : (vue.openBlock(), vue.createElementBlock("text", {
  5823. key: 1,
  5824. class: "pm-log-recorder system"
  5825. }, "系统记录"))
  5826. ]);
  5827. }),
  5828. 128
  5829. /* KEYED_FRAGMENT */
  5830. ))
  5831. ]),
  5832. vue.createElementVNode("view", { style: { "height": "30rpx" } })
  5833. ])
  5834. ])
  5835. ])) : vue.createCommentVNode("v-if", true),
  5836. _ctx.showPetRemarkInput ? (vue.openBlock(), vue.createElementBlock("view", {
  5837. key: 1,
  5838. class: "upload-modal-mask",
  5839. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.closePetRemarkInput && _ctx.closePetRemarkInput(...args))
  5840. }, [
  5841. vue.createElementVNode("view", {
  5842. class: "upload-modal-content",
  5843. onClick: _cache[16] || (_cache[16] = vue.withModifiers(() => {
  5844. }, ["stop"]))
  5845. }, [
  5846. vue.createElementVNode("view", { class: "um-header" }, [
  5847. vue.createElementVNode("text", { class: "um-title" }, "添加备注")
  5848. ]),
  5849. vue.createElementVNode("view", { class: "um-body" }, [
  5850. vue.withDirectives(vue.createElementVNode(
  5851. "textarea",
  5852. {
  5853. class: "um-textarea",
  5854. "onUpdate:modelValue": _cache[14] || (_cache[14] = ($event) => _ctx.petRemarkText = $event),
  5855. "auto-height": "",
  5856. placeholder: "请输入宠物备注内容...",
  5857. "placeholder-style": "color:#ccc; font-size:26rpx;"
  5858. },
  5859. null,
  5860. 512
  5861. /* NEED_PATCH */
  5862. ), [
  5863. [vue.vModelText, _ctx.petRemarkText]
  5864. ])
  5865. ]),
  5866. vue.createElementVNode("view", { class: "um-footer" }, [
  5867. vue.createElementVNode("button", {
  5868. class: "um-submit-btn active",
  5869. onClick: _cache[15] || (_cache[15] = (...args) => _ctx.submitPetRemark && _ctx.submitPetRemark(...args))
  5870. }, "确认提交")
  5871. ])
  5872. ])
  5873. ])) : vue.createCommentVNode("v-if", true),
  5874. _ctx.showNavModal ? (vue.openBlock(), vue.createElementBlock("view", {
  5875. key: 2,
  5876. class: "nav-modal-mask",
  5877. onClick: _cache[23] || (_cache[23] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  5878. }, [
  5879. vue.createElementVNode("view", {
  5880. class: "nav-action-sheet",
  5881. onClick: _cache[22] || (_cache[22] = vue.withModifiers(() => {
  5882. }, ["stop"]))
  5883. }, [
  5884. vue.createElementVNode("view", { class: "nav-sheet-title" }, "选择地图进行导航"),
  5885. vue.createElementVNode("view", {
  5886. class: "nav-sheet-item",
  5887. onClick: _cache[18] || (_cache[18] = ($event) => _ctx.chooseMap("高德"))
  5888. }, "高德地图"),
  5889. vue.createElementVNode("view", {
  5890. class: "nav-sheet-item",
  5891. onClick: _cache[19] || (_cache[19] = ($event) => _ctx.chooseMap("腾讯"))
  5892. }, "腾讯地图"),
  5893. vue.createElementVNode("view", {
  5894. class: "nav-sheet-item",
  5895. onClick: _cache[20] || (_cache[20] = ($event) => _ctx.chooseMap("百度"))
  5896. }, "百度地图"),
  5897. vue.createElementVNode("view", { class: "nav-sheet-gap" }),
  5898. vue.createElementVNode("view", {
  5899. class: "nav-sheet-item cancel",
  5900. onClick: _cache[21] || (_cache[21] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  5901. }, "取消")
  5902. ])
  5903. ])) : vue.createCommentVNode("v-if", true),
  5904. _ctx.showUploadModal ? (vue.openBlock(), vue.createElementBlock("view", {
  5905. key: 3,
  5906. class: "upload-modal-mask",
  5907. onClick: _cache[28] || (_cache[28] = (...args) => _ctx.closeUploadModal && _ctx.closeUploadModal(...args))
  5908. }, [
  5909. vue.createElementVNode("view", {
  5910. class: "upload-modal-content",
  5911. onClick: _cache[27] || (_cache[27] = vue.withModifiers(() => {
  5912. }, ["stop"]))
  5913. }, [
  5914. vue.createElementVNode("view", { class: "um-header" }, [
  5915. vue.createElementVNode(
  5916. "text",
  5917. { class: "um-title" },
  5918. "上传图或视频 (" + vue.toDisplayString(_ctx.modalMediaList.length) + "/5)",
  5919. 1
  5920. /* TEXT */
  5921. )
  5922. ]),
  5923. vue.createElementVNode("view", { class: "um-body" }, [
  5924. vue.createElementVNode("view", { class: "um-grid" }, [
  5925. (vue.openBlock(true), vue.createElementBlock(
  5926. vue.Fragment,
  5927. null,
  5928. vue.renderList(_ctx.modalMediaList, (img, idx) => {
  5929. return vue.openBlock(), vue.createElementBlock("view", {
  5930. class: "um-item",
  5931. key: idx
  5932. }, [
  5933. vue.createElementVNode("image", {
  5934. class: "um-preview",
  5935. src: img,
  5936. mode: "aspectFill"
  5937. }, null, 8, ["src"]),
  5938. vue.createElementVNode("view", {
  5939. class: "um-del",
  5940. onClick: ($event) => _ctx.removeModalMedia(idx)
  5941. }, "×", 8, ["onClick"])
  5942. ]);
  5943. }),
  5944. 128
  5945. /* KEYED_FRAGMENT */
  5946. )),
  5947. _ctx.modalMediaList.length < 5 ? (vue.openBlock(), vue.createElementBlock("view", {
  5948. key: 0,
  5949. class: "um-add",
  5950. onClick: _cache[24] || (_cache[24] = (...args) => _ctx.chooseModalMedia && _ctx.chooseModalMedia(...args))
  5951. }, [
  5952. vue.createElementVNode("image", {
  5953. class: "um-add-icon",
  5954. src: _imports_1$6
  5955. }),
  5956. vue.createElementVNode("text", { class: "um-add-text" }, "拍摄/上传")
  5957. ])) : vue.createCommentVNode("v-if", true)
  5958. ]),
  5959. vue.withDirectives(vue.createElementVNode(
  5960. "textarea",
  5961. {
  5962. class: "um-textarea",
  5963. "onUpdate:modelValue": _cache[25] || (_cache[25] = ($event) => _ctx.modalRemark = $event),
  5964. placeholder: "在此输入备注信息...",
  5965. "placeholder-style": "color:#ccc; font-size:26rpx;"
  5966. },
  5967. null,
  5968. 512
  5969. /* NEED_PATCH */
  5970. ), [
  5971. [vue.vModelText, _ctx.modalRemark]
  5972. ])
  5973. ]),
  5974. vue.createElementVNode("view", { class: "um-footer" }, [
  5975. vue.createElementVNode(
  5976. "button",
  5977. {
  5978. class: vue.normalizeClass(["um-submit-btn", { "active": _ctx.modalMediaList.length > 0 }]),
  5979. onClick: _cache[26] || (_cache[26] = (...args) => _ctx.confirmUploadModal && _ctx.confirmUploadModal(...args))
  5980. },
  5981. "确认提交",
  5982. 2
  5983. /* CLASS */
  5984. )
  5985. ])
  5986. ])
  5987. ])) : vue.createCommentVNode("v-if", true),
  5988. _ctx.showSumModal ? (vue.openBlock(), vue.createElementBlock("view", {
  5989. key: 4,
  5990. class: "sum-modal-mask",
  5991. onClick: _cache[32] || (_cache[32] = (...args) => _ctx.closeSumModal && _ctx.closeSumModal(...args))
  5992. }, [
  5993. vue.createElementVNode("view", {
  5994. class: "sum-modal-card",
  5995. onClick: _cache[31] || (_cache[31] = vue.withModifiers(() => {
  5996. }, ["stop"]))
  5997. }, [
  5998. vue.createElementVNode("scroll-view", {
  5999. "scroll-y": "",
  6000. class: "sum-modal-scroll"
  6001. }, [
  6002. vue.createElementVNode("view", { class: "sum-modal-inner" }, [
  6003. vue.createElementVNode("text", { class: "sum-modal-title" }, "宠物护理工作小结"),
  6004. vue.createElementVNode("view", { class: "sum-meta-row" }, [
  6005. vue.createElementVNode("text", { class: "sum-meta-label" }, "日期:"),
  6006. vue.createElementVNode(
  6007. "text",
  6008. { class: "sum-meta-val" },
  6009. vue.toDisplayString(_ctx.sumDate),
  6010. 1
  6011. /* TEXT */
  6012. )
  6013. ]),
  6014. vue.createElementVNode("view", { class: "sum-meta-row" }, [
  6015. vue.createElementVNode("text", { class: "sum-meta-label" }, "客户住址:"),
  6016. vue.createElementVNode(
  6017. "text",
  6018. { class: "sum-meta-val" },
  6019. vue.toDisplayString(_ctx.orderDetail.endAddress),
  6020. 1
  6021. /* TEXT */
  6022. )
  6023. ]),
  6024. vue.createElementVNode("view", { class: "sum-meta-row" }, [
  6025. vue.createElementVNode("text", { class: "sum-meta-label" }, "宠主姓名:"),
  6026. vue.createElementVNode(
  6027. "text",
  6028. { class: "sum-meta-val" },
  6029. vue.toDisplayString(_ctx.orderDetail.ownerName || "张**"),
  6030. 1
  6031. /* TEXT */
  6032. )
  6033. ]),
  6034. vue.createElementVNode("view", { class: "sum-section-title" }, "宠物信息"),
  6035. vue.createElementVNode("view", { class: "sum-pet-card" }, [
  6036. vue.createElementVNode("image", {
  6037. class: "sum-pet-avatar",
  6038. src: _ctx.orderDetail.petAvatar,
  6039. mode: "aspectFill"
  6040. }, null, 8, ["src"]),
  6041. vue.createElementVNode("view", { class: "sum-pet-info" }, [
  6042. vue.createElementVNode("view", { class: "sum-pet-name-row" }, [
  6043. vue.createElementVNode(
  6044. "text",
  6045. { class: "sum-pet-name" },
  6046. vue.toDisplayString(_ctx.orderDetail.petName),
  6047. 1
  6048. /* TEXT */
  6049. ),
  6050. vue.createElementVNode(
  6051. "text",
  6052. { class: "sum-pet-breed" },
  6053. "品种: " + vue.toDisplayString(_ctx.orderDetail.petBreed),
  6054. 1
  6055. /* TEXT */
  6056. )
  6057. ]),
  6058. vue.createElementVNode(
  6059. "text",
  6060. { class: "sum-pet-remark" },
  6061. vue.toDisplayString(_ctx.orderDetail.petNotes || "喜欢坐车,有点晗车,请注意通风。"),
  6062. 1
  6063. /* TEXT */
  6064. )
  6065. ])
  6066. ]),
  6067. vue.createElementVNode("view", { class: "sum-section-title" }, "服务内容记录"),
  6068. vue.withDirectives(vue.createElementVNode(
  6069. "textarea",
  6070. {
  6071. class: "sum-textarea",
  6072. "onUpdate:modelValue": _cache[29] || (_cache[29] = ($event) => _ctx.sumContent = $event),
  6073. "auto-height": "",
  6074. placeholder: "请填写服务内容...",
  6075. "placeholder-style": "color:#ccc"
  6076. },
  6077. null,
  6078. 512
  6079. /* NEED_PATCH */
  6080. ), [
  6081. [vue.vModelText, _ctx.sumContent]
  6082. ]),
  6083. vue.createElementVNode("view", { class: "sum-sign-row" }, [
  6084. vue.createElementVNode("text", { class: "sum-sign-label" }, "护宠师签名:"),
  6085. vue.createElementVNode(
  6086. "text",
  6087. { class: "sum-sign-val" },
  6088. vue.toDisplayString(_ctx.sumSigner),
  6089. 1
  6090. /* TEXT */
  6091. )
  6092. ]),
  6093. vue.createElementVNode("view", { style: { "height": "20rpx" } })
  6094. ])
  6095. ]),
  6096. vue.createElementVNode("view", { class: "sum-footer" }, [
  6097. vue.createElementVNode("button", {
  6098. class: "sum-submit-btn",
  6099. onClick: _cache[30] || (_cache[30] = (...args) => _ctx.submitSumModal && _ctx.submitSumModal(...args))
  6100. }, "提交小结")
  6101. ])
  6102. ])
  6103. ])) : vue.createCommentVNode("v-if", true)
  6104. ]);
  6105. }
  6106. const PagesOrdersDetail = /* @__PURE__ */ _export_sfc(_sfc_main$q, [["render", _sfc_render$p], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/orders/detail.vue"]]);
  6107. const _sfc_main$p = {
  6108. data() {
  6109. return {
  6110. // 已选异常类型
  6111. selectedType: "其他异常",
  6112. // 异常描述
  6113. anomalyDesc: "",
  6114. // 照片列表
  6115. photoList: [],
  6116. // 是否显示类型选择器
  6117. showTypeSheet: false,
  6118. // 异常类型列表
  6119. anomalyTypes: [
  6120. "无法联系用户",
  6121. "地址错误",
  6122. "宠物身体异常",
  6123. "设施损坏",
  6124. "用户拒收",
  6125. "其他异常"
  6126. ]
  6127. };
  6128. },
  6129. methods: {
  6130. // 打开类型选择器
  6131. openTypeSheet() {
  6132. this.showTypeSheet = true;
  6133. },
  6134. // 关闭类型选择器
  6135. closeTypeSheet() {
  6136. this.showTypeSheet = false;
  6137. },
  6138. // 选择异常类型
  6139. selectType(type) {
  6140. this.selectedType = type;
  6141. this.closeTypeSheet();
  6142. },
  6143. // 选择照片
  6144. choosePhoto() {
  6145. uni.chooseImage({
  6146. count: 5 - this.photoList.length,
  6147. sizeType: ["compressed"],
  6148. sourceType: ["album", "camera"],
  6149. success: (res) => {
  6150. this.photoList = [...this.photoList, ...res.tempFilePaths].slice(0, 5);
  6151. }
  6152. });
  6153. },
  6154. // 删除照片
  6155. removePhoto(idx) {
  6156. this.photoList.splice(idx, 1);
  6157. },
  6158. // 提交上报
  6159. submitAnomaly() {
  6160. if (!this.selectedType) {
  6161. uni.showToast({ title: "请选择异常类型", icon: "none" });
  6162. return;
  6163. }
  6164. if (this.photoList.length === 0) {
  6165. uni.showToast({ title: "请上传现场照片", icon: "none" });
  6166. return;
  6167. }
  6168. uni.showLoading({ title: "提交中..." });
  6169. setTimeout(() => {
  6170. uni.hideLoading();
  6171. uni.showToast({ title: "上报成功", icon: "success" });
  6172. setTimeout(() => {
  6173. uni.navigateBack();
  6174. }, 1500);
  6175. }, 1e3);
  6176. }
  6177. }
  6178. };
  6179. function _sfc_render$o(_ctx, _cache, $props, $setup, $data, $options) {
  6180. return vue.openBlock(), vue.createElementBlock("view", { class: "anomaly-container" }, [
  6181. vue.createElementVNode("scroll-view", {
  6182. "scroll-y": "",
  6183. class: "anomaly-scroll"
  6184. }, [
  6185. vue.createElementVNode("view", { class: "ano-card" }, [
  6186. vue.createElementVNode("view", { class: "ano-section-title" }, [
  6187. vue.createElementVNode("view", { class: "ano-title-bar" }),
  6188. vue.createElementVNode("text", { class: "ano-title-text" }, "异常类型")
  6189. ]),
  6190. vue.createElementVNode("view", {
  6191. class: "ano-type-row",
  6192. onClick: _cache[0] || (_cache[0] = (...args) => $options.openTypeSheet && $options.openTypeSheet(...args))
  6193. }, [
  6194. vue.createElementVNode(
  6195. "text",
  6196. {
  6197. class: vue.normalizeClass(["ano-type-val", { "placeholder": !$data.selectedType }])
  6198. },
  6199. vue.toDisplayString($data.selectedType || "其他异常"),
  6200. 3
  6201. /* TEXT, CLASS */
  6202. ),
  6203. vue.createElementVNode("image", {
  6204. class: "ano-right-arrow",
  6205. src: _imports_0$2
  6206. })
  6207. ])
  6208. ]),
  6209. vue.createElementVNode("view", { class: "ano-card" }, [
  6210. vue.createElementVNode("view", { class: "ano-section-title" }, [
  6211. vue.createElementVNode("view", { class: "ano-title-bar" }),
  6212. vue.createElementVNode("text", { class: "ano-title-text" }, "异常描述")
  6213. ]),
  6214. vue.withDirectives(vue.createElementVNode(
  6215. "textarea",
  6216. {
  6217. class: "ano-textarea",
  6218. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.anomalyDesc = $event),
  6219. placeholder: "请详细描述现场异常情况...",
  6220. "placeholder-style": "color:#ccc; font-size:28rpx;",
  6221. maxlength: "500"
  6222. },
  6223. null,
  6224. 512
  6225. /* NEED_PATCH */
  6226. ), [
  6227. [vue.vModelText, $data.anomalyDesc]
  6228. ])
  6229. ]),
  6230. vue.createElementVNode("view", { class: "ano-card" }, [
  6231. vue.createElementVNode("view", { class: "ano-section-title" }, [
  6232. vue.createElementVNode("view", { class: "ano-title-bar" }),
  6233. vue.createElementVNode("text", { class: "ano-title-text" }, "现场照片 (必填,最多5张)")
  6234. ]),
  6235. vue.createElementVNode("view", { class: "ano-photo-grid" }, [
  6236. (vue.openBlock(true), vue.createElementBlock(
  6237. vue.Fragment,
  6238. null,
  6239. vue.renderList($data.photoList, (img, idx) => {
  6240. return vue.openBlock(), vue.createElementBlock("view", {
  6241. class: "ano-photo-item",
  6242. key: idx
  6243. }, [
  6244. vue.createElementVNode("image", {
  6245. class: "ano-photo-preview",
  6246. src: img,
  6247. mode: "aspectFill"
  6248. }, null, 8, ["src"]),
  6249. vue.createElementVNode("view", {
  6250. class: "ano-photo-del",
  6251. onClick: ($event) => $options.removePhoto(idx)
  6252. }, "×", 8, ["onClick"])
  6253. ]);
  6254. }),
  6255. 128
  6256. /* KEYED_FRAGMENT */
  6257. )),
  6258. $data.photoList.length < 5 ? (vue.openBlock(), vue.createElementBlock("view", {
  6259. key: 0,
  6260. class: "ano-photo-add",
  6261. onClick: _cache[2] || (_cache[2] = (...args) => $options.choosePhoto && $options.choosePhoto(...args))
  6262. }, [
  6263. vue.createElementVNode("image", {
  6264. class: "ano-add-icon",
  6265. src: _imports_1$6
  6266. }),
  6267. vue.createElementVNode("text", { class: "ano-add-text" }, "上传")
  6268. ])) : vue.createCommentVNode("v-if", true)
  6269. ])
  6270. ]),
  6271. vue.createElementVNode("view", { style: { "height": "160rpx" } })
  6272. ]),
  6273. vue.createElementVNode("view", { class: "ano-footer" }, [
  6274. vue.createElementVNode("button", {
  6275. class: "ano-submit-btn",
  6276. onClick: _cache[3] || (_cache[3] = (...args) => $options.submitAnomaly && $options.submitAnomaly(...args))
  6277. }, "提交上报")
  6278. ]),
  6279. $data.showTypeSheet ? (vue.openBlock(), vue.createElementBlock("view", {
  6280. key: 0,
  6281. class: "ano-sheet-mask",
  6282. onClick: _cache[6] || (_cache[6] = (...args) => $options.closeTypeSheet && $options.closeTypeSheet(...args))
  6283. }, [
  6284. vue.createElementVNode("view", {
  6285. class: "ano-sheet",
  6286. onClick: _cache[5] || (_cache[5] = vue.withModifiers(() => {
  6287. }, ["stop"]))
  6288. }, [
  6289. vue.createElementVNode("text", { class: "ano-sheet-title" }, "选择异常类型"),
  6290. vue.createElementVNode("scroll-view", {
  6291. "scroll-y": "",
  6292. class: "ano-sheet-list"
  6293. }, [
  6294. (vue.openBlock(true), vue.createElementBlock(
  6295. vue.Fragment,
  6296. null,
  6297. vue.renderList($data.anomalyTypes, (type, idx) => {
  6298. return vue.openBlock(), vue.createElementBlock("view", {
  6299. class: "ano-sheet-item",
  6300. key: idx,
  6301. onClick: ($event) => $options.selectType(type)
  6302. }, [
  6303. vue.createElementVNode(
  6304. "text",
  6305. {
  6306. class: vue.normalizeClass(["ano-sheet-item-text", { "selected": $data.selectedType === type }])
  6307. },
  6308. vue.toDisplayString(type),
  6309. 3
  6310. /* TEXT, CLASS */
  6311. ),
  6312. $data.selectedType === type ? (vue.openBlock(), vue.createElementBlock("image", {
  6313. key: 0,
  6314. class: "ano-check-icon",
  6315. src: _imports_0$2
  6316. })) : vue.createCommentVNode("v-if", true)
  6317. ], 8, ["onClick"]);
  6318. }),
  6319. 128
  6320. /* KEYED_FRAGMENT */
  6321. ))
  6322. ]),
  6323. vue.createElementVNode("view", {
  6324. class: "ano-sheet-cancel",
  6325. onClick: _cache[4] || (_cache[4] = (...args) => $options.closeTypeSheet && $options.closeTypeSheet(...args))
  6326. }, "取消")
  6327. ])
  6328. ])) : vue.createCommentVNode("v-if", true)
  6329. ]);
  6330. }
  6331. const PagesOrdersAnomaly = /* @__PURE__ */ _export_sfc(_sfc_main$p, [["render", _sfc_render$o], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/orders/anomaly.vue"]]);
  6332. const _sfc_main$o = {
  6333. data() {
  6334. return {
  6335. tabs: ["全部", "已完成", "已拒绝"],
  6336. activeTab: 0,
  6337. orders: [
  6338. {
  6339. orderType: 1,
  6340. typeName: "接送",
  6341. typeIcon: "/static/icons/car.svg",
  6342. status: "完成",
  6343. finishTime: "2026/02/03 14:30",
  6344. serviceTime: "2026/02/10 10:00",
  6345. petName: "哈士奇宝宝",
  6346. petBreed: "哈士奇",
  6347. petAvatar: "/static/dog.png",
  6348. price: "20.00",
  6349. startName: "武汉大学宠物店",
  6350. startAddr: "武汉市洪山区珞喻路458号",
  6351. endName: "张** 189****8451",
  6352. endAddr: "武汉市武昌区新区大道凤凰广场A座",
  6353. serviceNote: ""
  6354. },
  6355. {
  6356. orderType: 2,
  6357. typeName: "喂遛",
  6358. typeIcon: "/static/icons/walk.svg",
  6359. status: "完成",
  6360. finishTime: "2026/02/03 15:00",
  6361. serviceTime: "2026/02/11 14:00",
  6362. petName: "金毛",
  6363. petBreed: "金毛寻回犬",
  6364. petAvatar: "/static/dog.png",
  6365. price: "35.00",
  6366. startName: "",
  6367. startAddr: "",
  6368. endName: "王女士 138****1234",
  6369. endAddr: "武汉市江汉区泛海国际居住区",
  6370. serviceNote: "需自带牵引绳,遛弯30分钟。"
  6371. },
  6372. {
  6373. orderType: 3,
  6374. typeName: "洗护",
  6375. typeIcon: "/static/icons/wash.svg",
  6376. status: "拒绝",
  6377. finishTime: "2026/02/03 09:30",
  6378. serviceTime: "2026/02/12 09:30",
  6379. petName: "Mimi",
  6380. petBreed: "布偶猫",
  6381. petAvatar: "/static/dog.png",
  6382. price: "50.00",
  6383. startName: "",
  6384. startAddr: "",
  6385. endName: "赵先生 159****9876",
  6386. endAddr: "武汉市汉阳区钟家村",
  6387. serviceNote: "上门洗澡,剪指甲。"
  6388. }
  6389. ]
  6390. };
  6391. },
  6392. computed: {
  6393. filteredOrders() {
  6394. if (this.activeTab === 0)
  6395. return this.orders;
  6396. if (this.activeTab === 1)
  6397. return this.orders.filter((o) => o.status === "完成");
  6398. return this.orders.filter((o) => o.status === "拒绝");
  6399. }
  6400. },
  6401. methods: {
  6402. switchTab(idx) {
  6403. this.activeTab = idx;
  6404. }
  6405. }
  6406. };
  6407. function _sfc_render$n(_ctx, _cache, $props, $setup, $data, $options) {
  6408. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  6409. vue.createElementVNode("view", { class: "stats-banner" }, [
  6410. vue.createElementVNode("view", { class: "banner-item" }, [
  6411. vue.createElementVNode("text", { class: "banner-num" }, "2546"),
  6412. vue.createElementVNode("text", { class: "banner-label" }, "累计接单")
  6413. ]),
  6414. vue.createElementVNode("view", { class: "banner-item" }, [
  6415. vue.createElementVNode("text", { class: "banner-num" }, "10"),
  6416. vue.createElementVNode("text", { class: "banner-label" }, "累计拒单")
  6417. ]),
  6418. vue.createElementVNode("view", { class: "banner-item" }, [
  6419. vue.createElementVNode("text", { class: "banner-num" }, "10"),
  6420. vue.createElementVNode("text", { class: "banner-label" }, "奖励单量")
  6421. ]),
  6422. vue.createElementVNode("view", { class: "banner-item" }, [
  6423. vue.createElementVNode("text", { class: "banner-num" }, "10"),
  6424. vue.createElementVNode("text", { class: "banner-label" }, "惩罚单量")
  6425. ]),
  6426. vue.createElementVNode("view", { class: "banner-item" }, [
  6427. vue.createElementVNode("text", { class: "banner-num" }, [
  6428. vue.createTextVNode("158"),
  6429. vue.createElementVNode("text", { class: "banner-unit" }, "天")
  6430. ]),
  6431. vue.createElementVNode("text", { class: "banner-label" }, "服务时长")
  6432. ])
  6433. ]),
  6434. vue.createElementVNode("view", { class: "tab-bar" }, [
  6435. (vue.openBlock(true), vue.createElementBlock(
  6436. vue.Fragment,
  6437. null,
  6438. vue.renderList($data.tabs, (tab, idx) => {
  6439. return vue.openBlock(), vue.createElementBlock("view", {
  6440. class: vue.normalizeClass(["tab-item", { active: $data.activeTab === idx }]),
  6441. key: idx,
  6442. onClick: ($event) => $options.switchTab(idx)
  6443. }, [
  6444. vue.createElementVNode(
  6445. "text",
  6446. null,
  6447. vue.toDisplayString(tab),
  6448. 1
  6449. /* TEXT */
  6450. ),
  6451. $data.activeTab === idx ? (vue.openBlock(), vue.createElementBlock("view", {
  6452. key: 0,
  6453. class: "tab-line"
  6454. })) : vue.createCommentVNode("v-if", true)
  6455. ], 10, ["onClick"]);
  6456. }),
  6457. 128
  6458. /* KEYED_FRAGMENT */
  6459. ))
  6460. ]),
  6461. vue.createElementVNode("scroll-view", {
  6462. "scroll-y": "",
  6463. class: "order-scroll"
  6464. }, [
  6465. vue.createElementVNode("view", { style: { "height": "16rpx" } }),
  6466. (vue.openBlock(true), vue.createElementBlock(
  6467. vue.Fragment,
  6468. null,
  6469. vue.renderList($options.filteredOrders, (order, idx) => {
  6470. return vue.openBlock(), vue.createElementBlock("view", {
  6471. class: "order-card",
  6472. key: idx
  6473. }, [
  6474. vue.createElementVNode("view", { class: "card-header" }, [
  6475. vue.createElementVNode("view", { class: "type-badge" }, [
  6476. vue.createElementVNode("image", {
  6477. class: "type-icon",
  6478. src: order.typeIcon
  6479. }, null, 8, ["src"]),
  6480. vue.createElementVNode(
  6481. "text",
  6482. { class: "type-text" },
  6483. vue.toDisplayString(order.typeName),
  6484. 1
  6485. /* TEXT */
  6486. )
  6487. ]),
  6488. vue.createElementVNode(
  6489. "text",
  6490. {
  6491. class: vue.normalizeClass(["status-text", order.status === "完成" ? "green" : "red"])
  6492. },
  6493. vue.toDisplayString(order.status === "完成" ? "完成:" : "拒绝:") + vue.toDisplayString(order.finishTime),
  6494. 3
  6495. /* TEXT, CLASS */
  6496. )
  6497. ]),
  6498. vue.createElementVNode(
  6499. "text",
  6500. { class: "service-time" },
  6501. "服务时间:" + vue.toDisplayString(order.serviceTime),
  6502. 1
  6503. /* TEXT */
  6504. ),
  6505. vue.createElementVNode("view", { class: "pet-card" }, [
  6506. vue.createElementVNode("image", {
  6507. class: "pet-avatar",
  6508. src: order.petAvatar,
  6509. mode: "aspectFill"
  6510. }, null, 8, ["src"]),
  6511. vue.createElementVNode("view", { class: "pet-info" }, [
  6512. vue.createElementVNode(
  6513. "text",
  6514. { class: "pet-name" },
  6515. vue.toDisplayString(order.petName),
  6516. 1
  6517. /* TEXT */
  6518. ),
  6519. vue.createElementVNode(
  6520. "text",
  6521. { class: "pet-breed" },
  6522. "品种: " + vue.toDisplayString(order.petBreed),
  6523. 1
  6524. /* TEXT */
  6525. )
  6526. ]),
  6527. vue.createElementVNode(
  6528. "text",
  6529. { class: "pet-price" },
  6530. "¥" + vue.toDisplayString(order.price),
  6531. 1
  6532. /* TEXT */
  6533. )
  6534. ]),
  6535. vue.createElementVNode("view", { class: "route-info" }, [
  6536. order.orderType === 1 ? (vue.openBlock(), vue.createElementBlock(
  6537. vue.Fragment,
  6538. { key: 0 },
  6539. [
  6540. vue.createElementVNode("view", { class: "route-item" }, [
  6541. vue.createElementVNode("view", { class: "icon-circle pickup" }, "取"),
  6542. vue.createElementVNode("view", { class: "route-connector" }),
  6543. vue.createElementVNode("view", { class: "address-box" }, [
  6544. vue.createElementVNode(
  6545. "text",
  6546. { class: "addr-title" },
  6547. vue.toDisplayString(order.startName),
  6548. 1
  6549. /* TEXT */
  6550. ),
  6551. vue.createElementVNode(
  6552. "text",
  6553. { class: "addr-desc" },
  6554. vue.toDisplayString(order.startAddr),
  6555. 1
  6556. /* TEXT */
  6557. )
  6558. ])
  6559. ]),
  6560. vue.createElementVNode("view", { class: "route-item" }, [
  6561. vue.createElementVNode("view", { class: "icon-circle deliver" }, "送"),
  6562. vue.createElementVNode("view", { class: "address-box" }, [
  6563. vue.createElementVNode(
  6564. "text",
  6565. { class: "addr-title" },
  6566. vue.toDisplayString(order.endName),
  6567. 1
  6568. /* TEXT */
  6569. ),
  6570. vue.createElementVNode(
  6571. "text",
  6572. { class: "addr-desc" },
  6573. vue.toDisplayString(order.endAddr),
  6574. 1
  6575. /* TEXT */
  6576. )
  6577. ])
  6578. ])
  6579. ],
  6580. 64
  6581. /* STABLE_FRAGMENT */
  6582. )) : (vue.openBlock(), vue.createElementBlock(
  6583. vue.Fragment,
  6584. { key: 1 },
  6585. [
  6586. vue.createElementVNode("view", { class: "route-item" }, [
  6587. vue.createElementVNode("view", { class: "icon-circle service" }, "服"),
  6588. vue.createElementVNode("view", { class: "address-box" }, [
  6589. vue.createElementVNode(
  6590. "text",
  6591. { class: "addr-title" },
  6592. vue.toDisplayString(order.endName),
  6593. 1
  6594. /* TEXT */
  6595. ),
  6596. vue.createElementVNode(
  6597. "text",
  6598. { class: "addr-desc" },
  6599. vue.toDisplayString(order.endAddr),
  6600. 1
  6601. /* TEXT */
  6602. )
  6603. ])
  6604. ]),
  6605. order.serviceNote ? (vue.openBlock(), vue.createElementBlock("view", {
  6606. key: 0,
  6607. class: "service-note-row"
  6608. }, [
  6609. vue.createElementVNode(
  6610. "text",
  6611. { class: "service-note-text" },
  6612. "服务内容:" + vue.toDisplayString(order.serviceNote),
  6613. 1
  6614. /* TEXT */
  6615. )
  6616. ])) : vue.createCommentVNode("v-if", true)
  6617. ],
  6618. 64
  6619. /* STABLE_FRAGMENT */
  6620. ))
  6621. ])
  6622. ]);
  6623. }),
  6624. 128
  6625. /* KEYED_FRAGMENT */
  6626. )),
  6627. $options.filteredOrders.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  6628. key: 0,
  6629. class: "empty-state"
  6630. }, [
  6631. vue.createElementVNode("text", { class: "empty-text" }, "暂无相关订单")
  6632. ])) : vue.createCommentVNode("v-if", true),
  6633. vue.createElementVNode("view", { style: { "height": "40rpx" } })
  6634. ])
  6635. ]);
  6636. }
  6637. const PagesMineOrderStats = /* @__PURE__ */ _export_sfc(_sfc_main$o, [["render", _sfc_render$n], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/order-stats.vue"]]);
  6638. const _sfc_main$n = {
  6639. data() {
  6640. return {
  6641. tabs: ["全部", "奖励", "惩罚"],
  6642. activeTab: 0,
  6643. selectedYear: 2026,
  6644. selectedMonth: 2,
  6645. // 月份选择器状态
  6646. showMonthPicker: false,
  6647. pickerYear: 2026,
  6648. pickerMonth: 2,
  6649. years: [2021, 2022, 2023, 2024, 2025, 2026],
  6650. months: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
  6651. yearScrollTop: 0,
  6652. monthScrollTop: 0,
  6653. // 奖惩记录列表
  6654. records: [
  6655. { date: "09-01", title: "单量奖励", desc: "超140单", amount: 560, status: "待入账", statusClass: "pending", type: "reward" },
  6656. { date: "08-01", title: "单量奖励", desc: "超470单", amount: 2050, status: "已入账", statusClass: "credited", type: "reward" },
  6657. { date: "09-02", title: "超时扣款", desc: "订单#T982 超时30分钟", amount: -15, status: "已扣款", statusClass: "deducted", type: "penalty" },
  6658. { date: "09-05", title: "高温补贴", desc: "8月份高温天气补贴", amount: 300, status: "已入账", statusClass: "credited", type: "reward" }
  6659. ]
  6660. };
  6661. },
  6662. computed: {
  6663. filteredList() {
  6664. if (this.activeTab === 0)
  6665. return this.records;
  6666. if (this.activeTab === 1)
  6667. return this.records.filter((r) => r.type === "reward");
  6668. return this.records.filter((r) => r.type === "penalty");
  6669. }
  6670. },
  6671. methods: {
  6672. switchTab(idx) {
  6673. this.activeTab = idx;
  6674. },
  6675. openMonthPicker() {
  6676. this.pickerYear = this.selectedYear;
  6677. this.pickerMonth = this.selectedMonth;
  6678. this.showMonthPicker = true;
  6679. },
  6680. closeMonthPicker() {
  6681. this.showMonthPicker = false;
  6682. },
  6683. confirmMonthPicker() {
  6684. this.selectedYear = this.pickerYear;
  6685. this.selectedMonth = this.pickerMonth;
  6686. this.closeMonthPicker();
  6687. },
  6688. goToAll() {
  6689. uni.navigateTo({ url: "/pages/mine/rewards-all" });
  6690. }
  6691. }
  6692. };
  6693. function _sfc_render$m(_ctx, _cache, $props, $setup, $data, $options) {
  6694. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  6695. vue.createElementVNode("view", { class: "top-banner" }, [
  6696. vue.createElementVNode("view", {
  6697. class: "month-btn",
  6698. onClick: _cache[0] || (_cache[0] = (...args) => $options.openMonthPicker && $options.openMonthPicker(...args))
  6699. }, [
  6700. vue.createElementVNode(
  6701. "text",
  6702. { class: "month-text" },
  6703. vue.toDisplayString($data.selectedYear) + "年" + vue.toDisplayString($data.selectedMonth) + "月 ▾",
  6704. 1
  6705. /* TEXT */
  6706. )
  6707. ]),
  6708. vue.createElementVNode("view", { class: "stats-grid" }, [
  6709. vue.createElementVNode("view", { class: "stats-cell" }, [
  6710. vue.createElementVNode("text", { class: "stats-label" }, "奖励订单"),
  6711. vue.createElementVNode("text", { class: "stats-num" }, [
  6712. vue.createTextVNode("3"),
  6713. vue.createElementVNode("text", { class: "stats-unit" }, "单")
  6714. ]),
  6715. vue.createElementVNode("view", { class: "stats-divider" }),
  6716. vue.createElementVNode("text", { class: "stats-sub" }, "累计 1258单")
  6717. ]),
  6718. vue.createElementVNode("view", { class: "stats-cell" }, [
  6719. vue.createElementVNode("text", { class: "stats-label" }, "惩罚订单"),
  6720. vue.createElementVNode("text", { class: "stats-num" }, [
  6721. vue.createTextVNode("1"),
  6722. vue.createElementVNode("text", { class: "stats-unit" }, "单")
  6723. ]),
  6724. vue.createElementVNode("view", { class: "stats-divider" }),
  6725. vue.createElementVNode("text", { class: "stats-sub" }, "累计 12单")
  6726. ]),
  6727. vue.createElementVNode("view", { class: "stats-cell" }, [
  6728. vue.createElementVNode("text", { class: "stats-label" }, "奖励金额"),
  6729. vue.createElementVNode("text", { class: "stats-num reward-num" }, "2910.00"),
  6730. vue.createElementVNode("view", { class: "stats-divider" }),
  6731. vue.createElementVNode("text", { class: "stats-sub" }, "累计 45800.00")
  6732. ]),
  6733. vue.createElementVNode("view", { class: "stats-cell" }, [
  6734. vue.createElementVNode("text", { class: "stats-label" }, "惩罚金额"),
  6735. vue.createElementVNode("text", { class: "stats-num penalty-num" }, "-15.00"),
  6736. vue.createElementVNode("view", { class: "stats-divider" }),
  6737. vue.createElementVNode("text", { class: "stats-sub" }, "累计 350.00")
  6738. ])
  6739. ])
  6740. ]),
  6741. vue.createElementVNode("view", { class: "list-header" }, [
  6742. vue.createElementVNode("view", { class: "tab-bar" }, [
  6743. (vue.openBlock(true), vue.createElementBlock(
  6744. vue.Fragment,
  6745. null,
  6746. vue.renderList($data.tabs, (tab, idx) => {
  6747. return vue.openBlock(), vue.createElementBlock("view", {
  6748. class: vue.normalizeClass(["tab-item", { active: $data.activeTab === idx }]),
  6749. key: idx,
  6750. onClick: ($event) => $options.switchTab(idx)
  6751. }, [
  6752. vue.createElementVNode(
  6753. "text",
  6754. null,
  6755. vue.toDisplayString(tab),
  6756. 1
  6757. /* TEXT */
  6758. ),
  6759. $data.activeTab === idx ? (vue.openBlock(), vue.createElementBlock("view", {
  6760. key: 0,
  6761. class: "tab-line"
  6762. })) : vue.createCommentVNode("v-if", true)
  6763. ], 10, ["onClick"]);
  6764. }),
  6765. 128
  6766. /* KEYED_FRAGMENT */
  6767. ))
  6768. ]),
  6769. vue.createElementVNode("view", {
  6770. class: "view-all-btn",
  6771. onClick: _cache[1] || (_cache[1] = (...args) => $options.goToAll && $options.goToAll(...args))
  6772. }, [
  6773. vue.createElementVNode("text", { class: "view-all-text" }, "查看全部 ›")
  6774. ])
  6775. ]),
  6776. vue.createElementVNode("view", { class: "record-list" }, [
  6777. (vue.openBlock(true), vue.createElementBlock(
  6778. vue.Fragment,
  6779. null,
  6780. vue.renderList($options.filteredList, (item, idx) => {
  6781. return vue.openBlock(), vue.createElementBlock("view", {
  6782. class: "record-item",
  6783. key: idx
  6784. }, [
  6785. vue.createElementVNode(
  6786. "view",
  6787. {
  6788. class: vue.normalizeClass(["ri-icon", item.amount > 0 ? "ri-reward" : "ri-penalty"])
  6789. },
  6790. [
  6791. vue.createElementVNode("text", { class: "ri-icon-text" }, "¥")
  6792. ],
  6793. 2
  6794. /* CLASS */
  6795. ),
  6796. vue.createElementVNode("view", { class: "ri-content" }, [
  6797. vue.createElementVNode("view", { class: "ri-title-row" }, [
  6798. vue.createElementVNode(
  6799. "text",
  6800. { class: "ri-date" },
  6801. vue.toDisplayString(item.date),
  6802. 1
  6803. /* TEXT */
  6804. ),
  6805. vue.createElementVNode(
  6806. "text",
  6807. { class: "ri-title" },
  6808. vue.toDisplayString(item.title),
  6809. 1
  6810. /* TEXT */
  6811. )
  6812. ]),
  6813. vue.createElementVNode(
  6814. "text",
  6815. { class: "ri-desc" },
  6816. vue.toDisplayString(item.desc),
  6817. 1
  6818. /* TEXT */
  6819. )
  6820. ]),
  6821. vue.createElementVNode("view", { class: "ri-right" }, [
  6822. vue.createElementVNode(
  6823. "text",
  6824. {
  6825. class: vue.normalizeClass(["ri-amount", item.amount > 0 ? "positive" : "negative"])
  6826. },
  6827. vue.toDisplayString(item.amount > 0 ? "+" : "") + vue.toDisplayString(item.amount.toFixed(2)),
  6828. 3
  6829. /* TEXT, CLASS */
  6830. ),
  6831. vue.createElementVNode(
  6832. "text",
  6833. {
  6834. class: vue.normalizeClass(["ri-status", item.statusClass])
  6835. },
  6836. vue.toDisplayString(item.status),
  6837. 3
  6838. /* TEXT, CLASS */
  6839. )
  6840. ])
  6841. ]);
  6842. }),
  6843. 128
  6844. /* KEYED_FRAGMENT */
  6845. )),
  6846. vue.createElementVNode("text", { class: "more-hint" }, "更多记录请点击上方的查看全部")
  6847. ]),
  6848. $data.showMonthPicker ? (vue.openBlock(), vue.createElementBlock("view", {
  6849. key: 0,
  6850. class: "picker-mask",
  6851. onClick: _cache[7] || (_cache[7] = (...args) => $options.closeMonthPicker && $options.closeMonthPicker(...args))
  6852. }, [
  6853. vue.createElementVNode("view", {
  6854. class: "picker-sheet",
  6855. onClick: _cache[6] || (_cache[6] = vue.withModifiers(() => {
  6856. }, ["stop"]))
  6857. }, [
  6858. vue.createElementVNode("view", { class: "picker-header" }, [
  6859. vue.createElementVNode("text", {
  6860. class: "picker-cancel",
  6861. onClick: _cache[2] || (_cache[2] = (...args) => $options.closeMonthPicker && $options.closeMonthPicker(...args))
  6862. }, "取消"),
  6863. vue.createElementVNode("text", { class: "picker-title" }, "选择时间"),
  6864. vue.createElementVNode("text", {
  6865. class: "picker-confirm",
  6866. onClick: _cache[3] || (_cache[3] = (...args) => $options.confirmMonthPicker && $options.confirmMonthPicker(...args))
  6867. }, "确定")
  6868. ]),
  6869. vue.createElementVNode("view", { class: "picker-body" }, [
  6870. vue.createElementVNode("scroll-view", {
  6871. "scroll-y": "",
  6872. class: "picker-column",
  6873. "scroll-top": $data.yearScrollTop,
  6874. onScroll: _cache[4] || (_cache[4] = (...args) => _ctx.onYearScroll && _ctx.onYearScroll(...args))
  6875. }, [
  6876. vue.createElementVNode("view", { style: { "height": "80rpx" } }),
  6877. (vue.openBlock(true), vue.createElementBlock(
  6878. vue.Fragment,
  6879. null,
  6880. vue.renderList($data.years, (year) => {
  6881. return vue.openBlock(), vue.createElementBlock("view", {
  6882. class: vue.normalizeClass(["picker-col-item", { "picker-selected": $data.pickerYear === year }]),
  6883. key: year,
  6884. onClick: ($event) => $data.pickerYear = year
  6885. }, vue.toDisplayString(year) + "年", 11, ["onClick"]);
  6886. }),
  6887. 128
  6888. /* KEYED_FRAGMENT */
  6889. )),
  6890. vue.createElementVNode("view", { style: { "height": "80rpx" } })
  6891. ], 40, ["scroll-top"]),
  6892. vue.createElementVNode("view", { class: "picker-highlight" }),
  6893. vue.createElementVNode("scroll-view", {
  6894. "scroll-y": "",
  6895. class: "picker-column",
  6896. "scroll-top": $data.monthScrollTop,
  6897. onScroll: _cache[5] || (_cache[5] = (...args) => _ctx.onMonthScroll && _ctx.onMonthScroll(...args))
  6898. }, [
  6899. vue.createElementVNode("view", { style: { "height": "80rpx" } }),
  6900. (vue.openBlock(true), vue.createElementBlock(
  6901. vue.Fragment,
  6902. null,
  6903. vue.renderList($data.months, (month) => {
  6904. return vue.openBlock(), vue.createElementBlock("view", {
  6905. class: vue.normalizeClass(["picker-col-item", { "picker-selected": $data.pickerMonth === month }]),
  6906. key: month,
  6907. onClick: ($event) => $data.pickerMonth = month
  6908. }, vue.toDisplayString(month) + "月", 11, ["onClick"]);
  6909. }),
  6910. 128
  6911. /* KEYED_FRAGMENT */
  6912. )),
  6913. vue.createElementVNode("view", { style: { "height": "80rpx" } })
  6914. ], 40, ["scroll-top"])
  6915. ])
  6916. ])
  6917. ])) : vue.createCommentVNode("v-if", true)
  6918. ]);
  6919. }
  6920. const PagesMineRewards = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["render", _sfc_render$m], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/rewards.vue"]]);
  6921. const _sfc_main$m = {
  6922. data() {
  6923. return {
  6924. tabs: ["全部", "奖励", "惩罚"],
  6925. activeTab: 0,
  6926. // 所有完整记录(按月分组)
  6927. allGroups: [
  6928. {
  6929. month: 9,
  6930. credited: 30,
  6931. pending: 0,
  6932. items: [
  6933. { date: "09-24", title: "高温补贴", desc: "9月份高温天气补贴", amount: 30, status: "已入账", statusClass: "credited", type: "reward" }
  6934. ]
  6935. },
  6936. {
  6937. month: 8,
  6938. credited: 2610,
  6939. pending: 0,
  6940. items: [
  6941. { date: "08-01", title: "单量奖励", desc: "超140单", amount: 560, status: "已入账", statusClass: "credited", type: "reward" },
  6942. { date: "07-01", title: "单量奖励", desc: "超470单", amount: 2050, status: "已入账", statusClass: "credited", type: "reward" }
  6943. ]
  6944. },
  6945. {
  6946. month: 7,
  6947. credited: 0,
  6948. pending: 0,
  6949. items: [
  6950. { date: "07-15", title: "超时扣款", desc: "订单#T98211 超时30分钟", amount: -15, status: "已扣款", statusClass: "deducted", type: "penalty" },
  6951. { date: "07-20", title: "客诉扣款", desc: "订单#T98222 餐品遗漏", amount: -50, status: "已扣款", statusClass: "deducted", type: "penalty" }
  6952. ]
  6953. }
  6954. ]
  6955. };
  6956. },
  6957. computed: {
  6958. filteredGroups() {
  6959. if (this.activeTab === 0)
  6960. return this.allGroups;
  6961. const typeKey = this.activeTab === 1 ? "reward" : "penalty";
  6962. return this.allGroups.map((g) => ({
  6963. ...g,
  6964. items: g.items.filter((i) => i.type === typeKey)
  6965. })).filter((g) => g.items.length > 0);
  6966. }
  6967. },
  6968. methods: {
  6969. switchTab(idx) {
  6970. this.activeTab = idx;
  6971. }
  6972. }
  6973. };
  6974. function _sfc_render$l(_ctx, _cache, $props, $setup, $data, $options) {
  6975. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  6976. vue.createElementVNode("view", { class: "tab-bar" }, [
  6977. (vue.openBlock(true), vue.createElementBlock(
  6978. vue.Fragment,
  6979. null,
  6980. vue.renderList($data.tabs, (tab, idx) => {
  6981. return vue.openBlock(), vue.createElementBlock("view", {
  6982. class: vue.normalizeClass(["tab-item", { active: $data.activeTab === idx }]),
  6983. key: idx,
  6984. onClick: ($event) => $options.switchTab(idx)
  6985. }, [
  6986. vue.createElementVNode(
  6987. "text",
  6988. null,
  6989. vue.toDisplayString(tab),
  6990. 1
  6991. /* TEXT */
  6992. ),
  6993. $data.activeTab === idx ? (vue.openBlock(), vue.createElementBlock("view", {
  6994. key: 0,
  6995. class: "tab-line"
  6996. })) : vue.createCommentVNode("v-if", true)
  6997. ], 10, ["onClick"]);
  6998. }),
  6999. 128
  7000. /* KEYED_FRAGMENT */
  7001. ))
  7002. ]),
  7003. vue.createElementVNode("scroll-view", {
  7004. "scroll-y": "",
  7005. class: "main-scroll"
  7006. }, [
  7007. (vue.openBlock(true), vue.createElementBlock(
  7008. vue.Fragment,
  7009. null,
  7010. vue.renderList($options.filteredGroups, (group, gIdx) => {
  7011. return vue.openBlock(), vue.createElementBlock("view", {
  7012. key: gIdx,
  7013. class: "month-group"
  7014. }, [
  7015. vue.createElementVNode("view", { class: "month-header" }, [
  7016. vue.createElementVNode(
  7017. "text",
  7018. { class: "month-title" },
  7019. vue.toDisplayString(group.month) + "月",
  7020. 1
  7021. /* TEXT */
  7022. ),
  7023. vue.createElementVNode("view", { class: "month-summary" }, [
  7024. vue.createElementVNode(
  7025. "text",
  7026. { class: "month-sum-text" },
  7027. "已入账¥" + vue.toDisplayString(group.credited.toFixed(2)),
  7028. 1
  7029. /* TEXT */
  7030. ),
  7031. vue.createElementVNode(
  7032. "text",
  7033. { class: "month-sum-text" },
  7034. " 待入账¥" + vue.toDisplayString(group.pending.toFixed(2)),
  7035. 1
  7036. /* TEXT */
  7037. )
  7038. ])
  7039. ]),
  7040. (vue.openBlock(true), vue.createElementBlock(
  7041. vue.Fragment,
  7042. null,
  7043. vue.renderList(group.items, (item, rIdx) => {
  7044. return vue.openBlock(), vue.createElementBlock("view", {
  7045. class: "record-item",
  7046. key: rIdx
  7047. }, [
  7048. vue.createElementVNode(
  7049. "view",
  7050. {
  7051. class: vue.normalizeClass(["ri-icon", item.amount > 0 ? "ri-reward" : "ri-penalty"])
  7052. },
  7053. [
  7054. vue.createElementVNode("text", { class: "ri-icon-text" }, "¥")
  7055. ],
  7056. 2
  7057. /* CLASS */
  7058. ),
  7059. vue.createElementVNode("view", { class: "ri-content" }, [
  7060. vue.createElementVNode("view", { class: "ri-title-row" }, [
  7061. vue.createElementVNode(
  7062. "text",
  7063. { class: "ri-date" },
  7064. vue.toDisplayString(item.date),
  7065. 1
  7066. /* TEXT */
  7067. ),
  7068. vue.createElementVNode(
  7069. "text",
  7070. { class: "ri-title" },
  7071. vue.toDisplayString(item.title),
  7072. 1
  7073. /* TEXT */
  7074. )
  7075. ]),
  7076. vue.createElementVNode(
  7077. "text",
  7078. { class: "ri-desc" },
  7079. vue.toDisplayString(item.desc),
  7080. 1
  7081. /* TEXT */
  7082. )
  7083. ]),
  7084. vue.createElementVNode("view", { class: "ri-right" }, [
  7085. vue.createElementVNode(
  7086. "text",
  7087. {
  7088. class: vue.normalizeClass(["ri-amount", item.amount > 0 ? "positive" : "negative"])
  7089. },
  7090. vue.toDisplayString(item.amount > 0 ? "+" : "") + vue.toDisplayString(item.amount.toFixed(2)),
  7091. 3
  7092. /* TEXT, CLASS */
  7093. ),
  7094. vue.createElementVNode(
  7095. "text",
  7096. {
  7097. class: vue.normalizeClass(["ri-status", item.statusClass])
  7098. },
  7099. vue.toDisplayString(item.status),
  7100. 3
  7101. /* TEXT, CLASS */
  7102. )
  7103. ])
  7104. ]);
  7105. }),
  7106. 128
  7107. /* KEYED_FRAGMENT */
  7108. ))
  7109. ]);
  7110. }),
  7111. 128
  7112. /* KEYED_FRAGMENT */
  7113. )),
  7114. vue.createElementVNode("view", { style: { "height": "40rpx" } })
  7115. ])
  7116. ]);
  7117. }
  7118. const PagesMineRewardsAll = /* @__PURE__ */ _export_sfc(_sfc_main$m, [["render", _sfc_render$l], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/rewards-all.vue"]]);
  7119. const logic = {
  7120. data() {
  7121. return {
  7122. showServicePopup: false,
  7123. showLogoutPopup: false,
  7124. profile: null,
  7125. profileLoading: false
  7126. };
  7127. },
  7128. onShow() {
  7129. if (isLoggedIn()) {
  7130. this.loadProfile();
  7131. }
  7132. },
  7133. methods: {
  7134. async loadProfile() {
  7135. if (this.profileLoading)
  7136. return;
  7137. this.profileLoading = true;
  7138. try {
  7139. const res = await getMyProfile();
  7140. this.profile = res.data || null;
  7141. } catch (err) {
  7142. formatAppLog("error", "at pages/mine/logic.js:27", "获取个人信息失败:", err);
  7143. } finally {
  7144. this.profileLoading = false;
  7145. }
  7146. },
  7147. navToSettings() {
  7148. uni.navigateTo({
  7149. url: "/pages/mine/settings/index"
  7150. });
  7151. },
  7152. navToProfile() {
  7153. uni.navigateTo({
  7154. url: "/pages/mine/settings/profile/index"
  7155. });
  7156. },
  7157. navToLevel() {
  7158. uni.navigateTo({
  7159. url: "/pages/mine/level/index"
  7160. });
  7161. },
  7162. navToNotification() {
  7163. uni.navigateTo({
  7164. url: "/pages/mine/message/index"
  7165. });
  7166. },
  7167. navToWallet() {
  7168. uni.navigateTo({
  7169. url: "/pages/mine/wallet/index"
  7170. });
  7171. },
  7172. navToPoints() {
  7173. uni.navigateTo({
  7174. url: "/pages/mine/points/index"
  7175. });
  7176. },
  7177. navToOrderStats() {
  7178. uni.navigateTo({
  7179. url: "/pages/mine/order-stats"
  7180. });
  7181. },
  7182. navToRewards() {
  7183. uni.navigateTo({
  7184. url: "/pages/mine/rewards"
  7185. });
  7186. },
  7187. openServicePopup() {
  7188. this.showServicePopup = true;
  7189. },
  7190. closeServicePopup() {
  7191. this.showServicePopup = false;
  7192. },
  7193. previewQRCode() {
  7194. uni.previewImage({
  7195. urls: ["/static/logo.png"]
  7196. });
  7197. },
  7198. openOnlineService() {
  7199. uni.showToast({
  7200. title: "正在跳转企业微信客服...",
  7201. icon: "none"
  7202. });
  7203. },
  7204. callServicePhone() {
  7205. uni.makePhoneCall({
  7206. phoneNumber: "400-123-4567"
  7207. });
  7208. },
  7209. logout() {
  7210. this.showLogoutPopup = true;
  7211. },
  7212. cancelLogout() {
  7213. this.showLogoutPopup = false;
  7214. },
  7215. async confirmLogout() {
  7216. this.showLogoutPopup = false;
  7217. try {
  7218. await logout();
  7219. } catch (e) {
  7220. }
  7221. clearAuth();
  7222. uni.reLaunch({
  7223. url: "/pages/login/login"
  7224. });
  7225. }
  7226. }
  7227. };
  7228. const _imports_0$1 = "/static/icons/motorbike.svg";
  7229. const _imports_1$5 = "/static/icons/location.svg";
  7230. const _imports_0 = "/static/icons/chevron_right_dark.svg";
  7231. const _imports_3$1 = "/static/icons/calendar.svg";
  7232. const _imports_4 = "/static/icons/settings.svg";
  7233. const _imports_1$4 = "/static/icons/crown.svg";
  7234. const _imports_6 = "/static/icons/chevron_right_gold.svg";
  7235. const _imports_3 = "/static/icons/chevron_right.svg";
  7236. const _imports_8 = "/static/icons/bell_linear.svg";
  7237. const _imports_9 = "/static/icons/money_linear.svg";
  7238. const _imports_10 = "/static/icons/headset_linear.svg";
  7239. const _imports_11 = "/static/icons/close_gray.svg";
  7240. const _imports_13 = "/static/icons/headset_green.svg";
  7241. const _imports_15 = "/static/icons/phone_green.svg";
  7242. const _sfc_main$l = {
  7243. ...logic
  7244. };
  7245. function _sfc_render$k(_ctx, _cache, $props, $setup, $data, $options) {
  7246. var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
  7247. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  7248. vue.createElementVNode("view", { class: "nav-bg" }, [
  7249. vue.createElementVNode("view", { class: "bg-circle-1" }),
  7250. vue.createElementVNode("view", { class: "bg-circle-2" })
  7251. ]),
  7252. vue.createElementVNode("view", { class: "header-section" }, [
  7253. vue.createElementVNode("view", { class: "title-bar" }, "个人中心"),
  7254. vue.createElementVNode("view", {
  7255. class: "user-card",
  7256. onClick: _cache[1] || (_cache[1] = (...args) => _ctx.navToProfile && _ctx.navToProfile(...args))
  7257. }, [
  7258. vue.createElementVNode("image", {
  7259. class: "avatar",
  7260. src: ((_a = _ctx.profile) == null ? void 0 : _a.avatarUrl) || "/static/touxiang.png",
  7261. mode: "aspectFill"
  7262. }, null, 8, ["src"]),
  7263. vue.createElementVNode("view", { class: "info-content" }, [
  7264. vue.createElementVNode("view", { class: "name-row" }, [
  7265. vue.createElementVNode(
  7266. "text",
  7267. { class: "name" },
  7268. vue.toDisplayString(((_b = _ctx.profile) == null ? void 0 : _b.name) || "未登录"),
  7269. 1
  7270. /* TEXT */
  7271. ),
  7272. vue.createElementVNode("view", { class: "tags" }, [
  7273. ((_c = _ctx.profile) == null ? void 0 : _c.status) === "0" ? (vue.openBlock(), vue.createElementBlock("view", {
  7274. key: 0,
  7275. class: "tag green"
  7276. }, "接单中")) : ((_d = _ctx.profile) == null ? void 0 : _d.status) === "1" ? (vue.openBlock(), vue.createElementBlock("view", {
  7277. key: 1,
  7278. class: "tag green"
  7279. }, "休息中")) : ((_e = _ctx.profile) == null ? void 0 : _e.status) === "2" ? (vue.openBlock(), vue.createElementBlock("view", {
  7280. key: 2,
  7281. class: "tag",
  7282. style: { "background": "#eee", "color": "#999" }
  7283. }, "已禁用")) : vue.createCommentVNode("v-if", true),
  7284. ((_f = _ctx.profile) == null ? void 0 : _f.workType) === "full_time" ? (vue.openBlock(), vue.createElementBlock("view", {
  7285. key: 3,
  7286. class: "tag blue"
  7287. }, "全职")) : vue.createCommentVNode("v-if", true),
  7288. vue.createElementVNode("image", {
  7289. class: "bike-icon",
  7290. src: _imports_0$1
  7291. })
  7292. ])
  7293. ]),
  7294. vue.createElementVNode("view", { class: "detail-row" }, [
  7295. vue.createElementVNode("image", {
  7296. class: "small-icon",
  7297. src: _imports_1$5
  7298. }),
  7299. vue.createElementVNode(
  7300. "text",
  7301. null,
  7302. vue.toDisplayString(((_g = _ctx.profile) == null ? void 0 : _g.stationName) || ((_h = _ctx.profile) == null ? void 0 : _h.cityName) || "暂无站点"),
  7303. 1
  7304. /* TEXT */
  7305. ),
  7306. vue.createElementVNode("image", {
  7307. class: "arrow-icon-small",
  7308. src: _imports_0
  7309. })
  7310. ]),
  7311. vue.createElementVNode("view", { class: "detail-row" }, [
  7312. vue.createElementVNode("image", {
  7313. class: "small-icon",
  7314. src: _imports_3$1
  7315. }),
  7316. vue.createElementVNode(
  7317. "text",
  7318. null,
  7319. "已注册" + vue.toDisplayString(((_i = _ctx.profile) == null ? void 0 : _i.registerDays) || 0) + "天",
  7320. 1
  7321. /* TEXT */
  7322. )
  7323. ])
  7324. ]),
  7325. vue.createElementVNode("image", {
  7326. class: "settings-icon",
  7327. src: _imports_4,
  7328. onClick: _cache[0] || (_cache[0] = vue.withModifiers((...args) => _ctx.navToSettings && _ctx.navToSettings(...args), ["stop"]))
  7329. })
  7330. ]),
  7331. vue.createElementVNode("view", { class: "vip-card" }, [
  7332. vue.createElementVNode("view", { class: "vip-left" }, [
  7333. vue.createElementVNode("image", {
  7334. class: "vip-icon",
  7335. src: _imports_1$4
  7336. }),
  7337. vue.createElementVNode("view", { class: "vip-text" }, [
  7338. vue.createElementVNode(
  7339. "text",
  7340. { class: "vip-title" },
  7341. vue.toDisplayString(((_j = _ctx.profile) == null ? void 0 : _j.levelName) || "普通履约者"),
  7342. 1
  7343. /* TEXT */
  7344. ),
  7345. vue.createElementVNode(
  7346. "text",
  7347. { class: "vip-desc" },
  7348. vue.toDisplayString(((_k = _ctx.profile) == null ? void 0 : _k.levelDesc) || "完成更多订单即可升级"),
  7349. 1
  7350. /* TEXT */
  7351. )
  7352. ])
  7353. ]),
  7354. vue.createElementVNode("view", {
  7355. class: "vip-btn",
  7356. onClick: _cache[2] || (_cache[2] = (...args) => _ctx.navToLevel && _ctx.navToLevel(...args))
  7357. }, [
  7358. vue.createElementVNode("text", null, "查看权益"),
  7359. vue.createElementVNode("image", {
  7360. class: "arrow-icon-small",
  7361. src: _imports_6
  7362. })
  7363. ])
  7364. ])
  7365. ]),
  7366. vue.createElementVNode("view", { class: "stats-panel" }, [
  7367. vue.createElementVNode("view", {
  7368. class: "stat-item",
  7369. onClick: _cache[3] || (_cache[3] = (...args) => _ctx.navToWallet && _ctx.navToWallet(...args))
  7370. }, [
  7371. vue.createElementVNode("view", { class: "stat-header" }, [
  7372. vue.createElementVNode("view", { class: "red-bar" }),
  7373. vue.createElementVNode("text", { class: "label" }, "我的钱包"),
  7374. vue.createElementVNode("image", {
  7375. class: "arrow-icon",
  7376. src: _imports_3
  7377. })
  7378. ]),
  7379. vue.createElementVNode("view", { class: "stat-value" }, [
  7380. vue.createElementVNode(
  7381. "text",
  7382. { class: "num" },
  7383. vue.toDisplayString(((_l = _ctx.profile) == null ? void 0 : _l.balance) || 0),
  7384. 1
  7385. /* TEXT */
  7386. ),
  7387. vue.createElementVNode("text", { class: "unit" }, "元")
  7388. ]),
  7389. vue.createElementVNode("text", { class: "sub-text" }, "账户余额")
  7390. ]),
  7391. vue.createElementVNode("view", { class: "divider" }),
  7392. vue.createElementVNode("view", {
  7393. class: "stat-item",
  7394. onClick: _cache[4] || (_cache[4] = (...args) => _ctx.navToOrderStats && _ctx.navToOrderStats(...args))
  7395. }, [
  7396. vue.createElementVNode("view", { class: "stat-header" }, [
  7397. vue.createElementVNode("view", { class: "green-bar" }),
  7398. vue.createElementVNode("text", { class: "label" }, "订单统计"),
  7399. vue.createElementVNode("image", {
  7400. class: "arrow-icon",
  7401. src: _imports_3
  7402. })
  7403. ]),
  7404. vue.createElementVNode("view", { class: "stat-value" }, [
  7405. vue.createElementVNode(
  7406. "text",
  7407. { class: "num" },
  7408. vue.toDisplayString(((_m = _ctx.profile) == null ? void 0 : _m.orderCount) || 0),
  7409. 1
  7410. /* TEXT */
  7411. ),
  7412. vue.createElementVNode("text", { class: "unit" }, "单")
  7413. ]),
  7414. vue.createElementVNode("text", { class: "sub-text" }, "累计服务单量")
  7415. ]),
  7416. vue.createElementVNode("view", { class: "divider" }),
  7417. vue.createElementVNode("view", {
  7418. class: "stat-item",
  7419. onClick: _cache[5] || (_cache[5] = (...args) => _ctx.navToPoints && _ctx.navToPoints(...args))
  7420. }, [
  7421. vue.createElementVNode("view", { class: "stat-header" }, [
  7422. vue.createElementVNode("view", { class: "orange-bar" }),
  7423. vue.createElementVNode("text", { class: "label" }, "我的积分"),
  7424. vue.createElementVNode("image", {
  7425. class: "arrow-icon",
  7426. src: _imports_3
  7427. })
  7428. ]),
  7429. vue.createElementVNode("view", { class: "stat-value" }, [
  7430. vue.createElementVNode(
  7431. "text",
  7432. { class: "num" },
  7433. vue.toDisplayString(((_n = _ctx.profile) == null ? void 0 : _n.points) || 0),
  7434. 1
  7435. /* TEXT */
  7436. ),
  7437. vue.createElementVNode("text", { class: "unit" }, "分")
  7438. ]),
  7439. vue.createElementVNode("text", { class: "sub-text" }, "可兑换权益")
  7440. ])
  7441. ]),
  7442. vue.createElementVNode("view", { class: "menu-list" }, [
  7443. vue.createElementVNode("view", {
  7444. class: "menu-item",
  7445. onClick: _cache[6] || (_cache[6] = (...args) => _ctx.navToNotification && _ctx.navToNotification(...args))
  7446. }, [
  7447. vue.createElementVNode("image", {
  7448. class: "menu-icon",
  7449. src: _imports_8
  7450. }),
  7451. vue.createElementVNode("text", { class: "menu-text" }, "消息中心"),
  7452. vue.createElementVNode("view", { class: "menu-right" }, [
  7453. vue.createElementVNode("view", { class: "red-dot" }),
  7454. vue.createElementVNode("image", {
  7455. class: "arrow-icon",
  7456. src: _imports_3
  7457. })
  7458. ])
  7459. ]),
  7460. vue.createElementVNode("view", {
  7461. class: "menu-item",
  7462. onClick: _cache[7] || (_cache[7] = (...args) => _ctx.navToRewards && _ctx.navToRewards(...args))
  7463. }, [
  7464. vue.createElementVNode("image", {
  7465. class: "menu-icon",
  7466. src: _imports_9
  7467. }),
  7468. vue.createElementVNode("text", { class: "menu-text" }, "我的奖惩"),
  7469. vue.createElementVNode("image", {
  7470. class: "arrow-icon",
  7471. src: _imports_3
  7472. })
  7473. ]),
  7474. vue.createElementVNode("view", {
  7475. class: "menu-item",
  7476. onClick: _cache[8] || (_cache[8] = (...args) => _ctx.openServicePopup && _ctx.openServicePopup(...args))
  7477. }, [
  7478. vue.createElementVNode("image", {
  7479. class: "menu-icon",
  7480. src: _imports_10
  7481. }),
  7482. vue.createElementVNode("text", { class: "menu-text" }, "联系客服"),
  7483. vue.createElementVNode("image", {
  7484. class: "arrow-icon",
  7485. src: _imports_3
  7486. })
  7487. ])
  7488. ]),
  7489. vue.createElementVNode("view", {
  7490. class: "logout-btn",
  7491. onClick: _cache[9] || (_cache[9] = (...args) => _ctx.logout && _ctx.logout(...args))
  7492. }, "退出登录"),
  7493. _ctx.showServicePopup ? (vue.openBlock(), vue.createElementBlock("view", {
  7494. key: 0,
  7495. class: "service-popup-mask",
  7496. onClick: _cache[15] || (_cache[15] = (...args) => _ctx.closeServicePopup && _ctx.closeServicePopup(...args))
  7497. }, [
  7498. vue.createElementVNode("view", {
  7499. class: "service-popup",
  7500. onClick: _cache[14] || (_cache[14] = vue.withModifiers(() => {
  7501. }, ["stop"]))
  7502. }, [
  7503. vue.createElementVNode("view", { class: "service-header" }, [
  7504. vue.createElementVNode("text", { class: "service-title" }, "联系客服"),
  7505. vue.createElementVNode("image", {
  7506. class: "close-icon",
  7507. src: _imports_11,
  7508. onClick: _cache[10] || (_cache[10] = (...args) => _ctx.closeServicePopup && _ctx.closeServicePopup(...args))
  7509. })
  7510. ]),
  7511. vue.createElementVNode("view", { class: "qr-section" }, [
  7512. vue.createElementVNode("text", { class: "qr-title" }, "客服二维码"),
  7513. vue.createElementVNode("image", {
  7514. class: "qr-img",
  7515. src: _imports_1$8,
  7516. onClick: _cache[11] || (_cache[11] = (...args) => _ctx.previewQRCode && _ctx.previewQRCode(...args))
  7517. }),
  7518. vue.createElementVNode("text", { class: "qr-desc" }, "点击查看大图")
  7519. ]),
  7520. vue.createElementVNode("view", { class: "service-list" }, [
  7521. vue.createElementVNode("view", {
  7522. class: "service-row",
  7523. onClick: _cache[12] || (_cache[12] = (...args) => _ctx.openOnlineService && _ctx.openOnlineService(...args))
  7524. }, [
  7525. vue.createElementVNode("image", {
  7526. class: "service-row-icon",
  7527. src: _imports_13
  7528. }),
  7529. vue.createElementVNode("view", { class: "service-info" }, [
  7530. vue.createElementVNode("text", { class: "service-name" }, "在线客服"),
  7531. vue.createElementVNode("text", { class: "service-desc" }, "企业微信专属客服在线解答")
  7532. ]),
  7533. vue.createElementVNode("image", {
  7534. class: "arrow-icon-small",
  7535. src: _imports_3
  7536. })
  7537. ]),
  7538. vue.createElementVNode("view", { class: "service-row" }, [
  7539. vue.createElementVNode("image", {
  7540. class: "service-row-icon",
  7541. src: _imports_14
  7542. }),
  7543. vue.createElementVNode("view", { class: "service-info" }, [
  7544. vue.createElementVNode("text", { class: "service-name" }, "客服电话"),
  7545. vue.createElementVNode("text", { class: "service-desc" }, "400-123-4567")
  7546. ]),
  7547. vue.createElementVNode("view", {
  7548. class: "call-btn",
  7549. onClick: _cache[13] || (_cache[13] = (...args) => _ctx.callServicePhone && _ctx.callServicePhone(...args))
  7550. }, [
  7551. vue.createElementVNode("image", {
  7552. class: "phone-icon-small",
  7553. src: _imports_15
  7554. }),
  7555. vue.createElementVNode("text", null, "拨打")
  7556. ])
  7557. ])
  7558. ])
  7559. ])
  7560. ])) : vue.createCommentVNode("v-if", true),
  7561. vue.createElementVNode(
  7562. "view",
  7563. {
  7564. class: vue.normalizeClass(["logout-popup-mask", { "show": _ctx.showLogoutPopup }]),
  7565. onClick: _cache[19] || (_cache[19] = (...args) => _ctx.cancelLogout && _ctx.cancelLogout(...args)),
  7566. onTouchmove: _cache[20] || (_cache[20] = vue.withModifiers(() => {
  7567. }, ["stop", "prevent"]))
  7568. },
  7569. [
  7570. vue.createElementVNode("view", {
  7571. class: "popup-modal",
  7572. onClick: _cache[18] || (_cache[18] = vue.withModifiers(() => {
  7573. }, ["stop"]))
  7574. }, [
  7575. vue.createElementVNode("text", { class: "popup-title" }, "退出登录"),
  7576. vue.createElementVNode("text", { class: "popup-desc" }, "确定要退出当前账号吗?\\n退出后需要重新登录才能使用完整功能。"),
  7577. vue.createElementVNode("view", { class: "popup-actions" }, [
  7578. vue.createElementVNode("view", {
  7579. class: "popup-btn cancel",
  7580. onClick: _cache[16] || (_cache[16] = (...args) => _ctx.cancelLogout && _ctx.cancelLogout(...args))
  7581. }, "取消"),
  7582. vue.createElementVNode("view", {
  7583. class: "popup-btn confirm",
  7584. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.confirmLogout && _ctx.confirmLogout(...args))
  7585. }, "确定")
  7586. ])
  7587. ])
  7588. ],
  7589. 34
  7590. /* CLASS, NEED_HYDRATION */
  7591. )
  7592. ]);
  7593. }
  7594. const PagesMineIndex = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["render", _sfc_render$k], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/index.vue"]]);
  7595. const _sfc_main$k = {
  7596. data() {
  7597. return {};
  7598. },
  7599. methods: {
  7600. navBack() {
  7601. uni.navigateBack({
  7602. delta: 1
  7603. });
  7604. },
  7605. navTo(type) {
  7606. let url = "";
  7607. switch (type) {
  7608. case "profile":
  7609. url = "/pages/mine/settings/profile/index";
  7610. break;
  7611. case "auth":
  7612. url = "/pages/mine/settings/auth/index";
  7613. break;
  7614. case "bank":
  7615. url = "/pages/mine/settings/bank/index";
  7616. break;
  7617. case "security":
  7618. url = "/pages/mine/settings/security/index";
  7619. break;
  7620. case "push":
  7621. url = "/pages/mine/settings/notification/index";
  7622. break;
  7623. case "about":
  7624. url = "/pages/mine/settings/about/index";
  7625. break;
  7626. default:
  7627. formatAppLog("log", "at pages/mine/settings/index.vue:104", "Navigate to:", type);
  7628. return;
  7629. }
  7630. uni.navigateTo({ url });
  7631. },
  7632. clearCache() {
  7633. uni.showToast({ title: "缓存已清理", icon: "none" });
  7634. }
  7635. }
  7636. };
  7637. function _sfc_render$j(_ctx, _cache, $props, $setup, $data, $options) {
  7638. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  7639. vue.createElementVNode("view", { class: "custom-header" }, [
  7640. vue.createElementVNode("view", {
  7641. class: "header-left",
  7642. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  7643. }, [
  7644. vue.createElementVNode("image", {
  7645. class: "back-icon",
  7646. src: _imports_0,
  7647. style: { "transform": "rotate(180deg)" }
  7648. })
  7649. ]),
  7650. vue.createElementVNode("text", { class: "header-title" }, "设置"),
  7651. vue.createElementVNode("view", { class: "header-right" })
  7652. ]),
  7653. vue.createElementVNode("view", { class: "header-placeholder" }),
  7654. vue.createElementVNode("view", { class: "group-card" }, [
  7655. vue.createElementVNode("view", {
  7656. class: "list-item",
  7657. onClick: _cache[1] || (_cache[1] = ($event) => $options.navTo("profile"))
  7658. }, [
  7659. vue.createElementVNode("text", { class: "item-title" }, "个人资料"),
  7660. vue.createElementVNode("image", {
  7661. class: "arrow-icon",
  7662. src: _imports_3
  7663. })
  7664. ]),
  7665. vue.createElementVNode("view", {
  7666. class: "list-item",
  7667. onClick: _cache[2] || (_cache[2] = ($event) => $options.navTo("auth"))
  7668. }, [
  7669. vue.createElementVNode("text", { class: "item-title" }, "认证信息"),
  7670. vue.createElementVNode("image", {
  7671. class: "arrow-icon",
  7672. src: _imports_3
  7673. })
  7674. ]),
  7675. vue.createElementVNode("view", {
  7676. class: "list-item",
  7677. onClick: _cache[3] || (_cache[3] = ($event) => $options.navTo("bank"))
  7678. }, [
  7679. vue.createElementVNode("text", { class: "item-title" }, "银行卡信息"),
  7680. vue.createElementVNode("view", { class: "item-right" }, [
  7681. vue.createElementVNode("view", { class: "tag-status" }, "已完善"),
  7682. vue.createElementVNode("image", {
  7683. class: "arrow-icon",
  7684. src: _imports_3
  7685. })
  7686. ])
  7687. ]),
  7688. vue.createElementVNode("view", {
  7689. class: "list-item no-border",
  7690. onClick: _cache[4] || (_cache[4] = ($event) => $options.navTo("security"))
  7691. }, [
  7692. vue.createElementVNode("text", { class: "item-title" }, "账号与安全"),
  7693. vue.createElementVNode("image", {
  7694. class: "arrow-icon",
  7695. src: _imports_3
  7696. })
  7697. ])
  7698. ]),
  7699. vue.createElementVNode("view", { class: "group-card" }, [
  7700. vue.createElementVNode("view", {
  7701. class: "list-item",
  7702. onClick: _cache[5] || (_cache[5] = ($event) => $options.navTo("push"))
  7703. }, [
  7704. vue.createElementVNode("text", { class: "item-title" }, "推送通知"),
  7705. vue.createElementVNode("view", { class: "item-right" }, [
  7706. vue.createElementVNode("text", { class: "item-value" }, "部分开启"),
  7707. vue.createElementVNode("image", {
  7708. class: "arrow-icon",
  7709. src: _imports_3
  7710. })
  7711. ])
  7712. ]),
  7713. vue.createElementVNode("view", { class: "list-item" }, [
  7714. vue.createElementVNode("view", { class: "item-row-left" }, [
  7715. vue.createElementVNode("text", { class: "item-title" }, "位置上报"),
  7716. vue.createElementVNode("text", { class: "item-subtitle" }, "每隔20分钟自动上报位置")
  7717. ]),
  7718. vue.createElementVNode("switch", {
  7719. checked: "",
  7720. color: "#FF5722",
  7721. style: { "transform": "scale(0.8)" }
  7722. })
  7723. ]),
  7724. vue.createElementVNode("view", {
  7725. class: "list-item",
  7726. onClick: _cache[6] || (_cache[6] = (...args) => $options.clearCache && $options.clearCache(...args))
  7727. }, [
  7728. vue.createElementVNode("text", { class: "item-title" }, "清理缓存"),
  7729. vue.createElementVNode("view", { class: "item-right" }, [
  7730. vue.createElementVNode("text", { class: "item-value" }, "105.14MB"),
  7731. vue.createElementVNode("image", {
  7732. class: "arrow-icon",
  7733. src: _imports_3
  7734. })
  7735. ])
  7736. ]),
  7737. vue.createElementVNode("view", {
  7738. class: "list-item no-border",
  7739. onClick: _cache[7] || (_cache[7] = ($event) => $options.navTo("about"))
  7740. }, [
  7741. vue.createElementVNode("text", { class: "item-title" }, "关于我们"),
  7742. vue.createElementVNode("view", { class: "item-right" }, [
  7743. vue.createElementVNode("text", { class: "item-value" }, "v2.0.6"),
  7744. vue.createElementVNode("image", {
  7745. class: "arrow-icon",
  7746. src: _imports_3
  7747. })
  7748. ])
  7749. ])
  7750. ])
  7751. ]);
  7752. }
  7753. const PagesMineSettingsIndex = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["render", _sfc_render$j], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/index.vue"]]);
  7754. const _sfc_main$j = {
  7755. data() {
  7756. return {
  7757. userInfo: {
  7758. name: "",
  7759. workType: "",
  7760. workStatus: "",
  7761. city: "",
  7762. avatar: "/static/touxiang.png",
  7763. stationName: ""
  7764. },
  7765. isStatusPickerShow: false,
  7766. isCityPickerShow: false,
  7767. // 城市级联选择器(与我要加入页面一致)
  7768. selectStep: 0,
  7769. selectedPathway: [],
  7770. currentCityList: [],
  7771. selectedCityId: null
  7772. };
  7773. },
  7774. onLoad() {
  7775. this.loadUserInfo();
  7776. uni.$on("updateName", (newName) => {
  7777. this.userInfo.name = newName;
  7778. });
  7779. },
  7780. onUnload() {
  7781. uni.$off("updateName");
  7782. },
  7783. methods: {
  7784. // 加载用户信息 @author steelwei
  7785. async loadUserInfo() {
  7786. uni.showLoading({ title: "加载中..." });
  7787. try {
  7788. const res = await getMyProfile();
  7789. if (res.code === 200) {
  7790. const data = res.data;
  7791. this.userInfo = {
  7792. name: data.realName || data.name,
  7793. workType: data.workType === "full_time" ? "全职" : "兼职",
  7794. workStatus: this.formatStatus(data.status),
  7795. city: data.cityName || "",
  7796. avatar: data.avatarUrl || "/static/touxiang.png",
  7797. stationName: data.stationName || "未分配站点"
  7798. };
  7799. } else {
  7800. uni.showToast({ title: res.msg || "加载失败", icon: "none" });
  7801. }
  7802. } catch (error) {
  7803. formatAppLog("error", "at pages/mine/settings/profile/index.vue:173", "加载用户信息失败:", error);
  7804. uni.showToast({ title: "网络错误", icon: "none" });
  7805. } finally {
  7806. uni.hideLoading();
  7807. }
  7808. },
  7809. // 格式化状态 @author steelwei
  7810. formatStatus(status) {
  7811. const statusMap = {
  7812. "busy": "接单中",
  7813. "resting": "休息中",
  7814. "disabled": "已禁用"
  7815. };
  7816. return statusMap[status] || status;
  7817. },
  7818. navBack() {
  7819. uni.navigateBack({ delta: 1 });
  7820. },
  7821. // 修改头像 @author steelwei
  7822. changeAvatar() {
  7823. uni.chooseImage({
  7824. count: 1,
  7825. success: async (res) => {
  7826. const tempFilePath = res.tempFilePaths[0];
  7827. uni.showLoading({ title: "上传中..." });
  7828. try {
  7829. const uploadRes = await uploadFile(tempFilePath);
  7830. if (uploadRes.code === 200) {
  7831. const avatarUrl = uploadRes.data.url;
  7832. const result = await updateAvatar(avatarUrl);
  7833. if (result.code === 200) {
  7834. this.userInfo.avatar = avatarUrl;
  7835. uni.showToast({ title: "修改成功", icon: "success" });
  7836. } else {
  7837. uni.showToast({ title: result.msg || "修改失败", icon: "none" });
  7838. }
  7839. }
  7840. } catch (error) {
  7841. formatAppLog("error", "at pages/mine/settings/profile/index.vue:218", "修改头像失败:", error);
  7842. uni.showToast({ title: "上传失败", icon: "none" });
  7843. } finally {
  7844. uni.hideLoading();
  7845. }
  7846. }
  7847. });
  7848. },
  7849. editName() {
  7850. uni.navigateTo({
  7851. url: `/pages/mine/settings/profile/edit-name?name=${this.userInfo.name}`
  7852. });
  7853. },
  7854. showStatusPicker() {
  7855. this.isStatusPickerShow = true;
  7856. },
  7857. closeStatusPicker() {
  7858. this.isStatusPickerShow = false;
  7859. },
  7860. // 选择状态 @author steelwei
  7861. async selectStatus(statusText) {
  7862. const statusMap = {
  7863. "接单中": "busy",
  7864. "休息中": "resting"
  7865. };
  7866. const status = statusMap[statusText];
  7867. try {
  7868. const res = await updateStatus(status);
  7869. if (res.code === 200) {
  7870. this.userInfo.workStatus = statusText;
  7871. uni.showToast({ title: "状态已更新", icon: "success" });
  7872. } else {
  7873. uni.showToast({ title: res.msg || "修改失败", icon: "none" });
  7874. }
  7875. } catch (error) {
  7876. formatAppLog("error", "at pages/mine/settings/profile/index.vue:258", "修改状态失败:", error);
  7877. uni.showToast({ title: "网络错误", icon: "none" });
  7878. } finally {
  7879. this.closeStatusPicker();
  7880. }
  7881. },
  7882. // 城市级联选择器(与我要加入页面一致) @author steelwei
  7883. async showCityPicker() {
  7884. this.isCityPickerShow = true;
  7885. if (this.selectedPathway.length === 0) {
  7886. await this.resetCityPicker();
  7887. }
  7888. },
  7889. async resetCityPicker() {
  7890. this.selectStep = 0;
  7891. this.selectedPathway = [];
  7892. await this.loadAreaChildren(0);
  7893. },
  7894. closeCityPicker() {
  7895. this.isCityPickerShow = false;
  7896. },
  7897. async loadAreaChildren(parentId) {
  7898. try {
  7899. const res = await getAreaChildren(parentId);
  7900. this.currentCityList = (res.data || []).filter((item) => item.type !== 2).map((item) => ({
  7901. id: item.id,
  7902. name: item.name,
  7903. type: item.type,
  7904. parentId: item.parentId
  7905. }));
  7906. } catch (err) {
  7907. formatAppLog("error", "at pages/mine/settings/profile/index.vue:293", "加载区域数据失败:", err);
  7908. this.currentCityList = [];
  7909. }
  7910. },
  7911. async selectCityItem(item) {
  7912. this.selectedPathway[this.selectStep] = item;
  7913. if (item.type === 0) {
  7914. this.selectStep++;
  7915. this.selectedPathway = this.selectedPathway.slice(0, this.selectStep);
  7916. await this.loadAreaChildren(item.id);
  7917. if (this.currentCityList.length === 0) {
  7918. this.selectedCityId = item.id;
  7919. this.confirmCity();
  7920. }
  7921. } else {
  7922. this.selectedCityId = item.id;
  7923. this.confirmCity();
  7924. }
  7925. },
  7926. async jumpToStep(step) {
  7927. this.selectStep = step;
  7928. if (step === 0) {
  7929. await this.loadAreaChildren(0);
  7930. } else {
  7931. const parent = this.selectedPathway[step - 1];
  7932. if (parent) {
  7933. await this.loadAreaChildren(parent.id);
  7934. }
  7935. }
  7936. },
  7937. // 确认城市选择 @author steelwei
  7938. async confirmCity() {
  7939. if (this.selectedPathway.length === 0) {
  7940. uni.showToast({ title: "请选择城市", icon: "none" });
  7941. return;
  7942. }
  7943. const cityName = this.selectedPathway.map((i) => i.name).join(" ");
  7944. const cityCode = String(this.selectedCityId);
  7945. try {
  7946. const res = await updateCity(cityCode, cityName);
  7947. if (res.code === 200) {
  7948. this.userInfo.city = cityName;
  7949. uni.showToast({ title: "修改成功", icon: "success" });
  7950. this.closeCityPicker();
  7951. this.selectedPathway = [];
  7952. } else {
  7953. uni.showToast({ title: res.msg || "修改失败", icon: "none" });
  7954. }
  7955. } catch (error) {
  7956. formatAppLog("error", "at pages/mine/settings/profile/index.vue:346", "修改城市失败:", error);
  7957. uni.showToast({ title: "网络错误", icon: "none" });
  7958. }
  7959. }
  7960. }
  7961. };
  7962. function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
  7963. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  7964. vue.createElementVNode("view", { class: "custom-header" }, [
  7965. vue.createElementVNode("view", {
  7966. class: "header-left",
  7967. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  7968. }, [
  7969. vue.createElementVNode("image", {
  7970. class: "back-icon",
  7971. src: _imports_0,
  7972. style: { "transform": "rotate(180deg)" }
  7973. })
  7974. ]),
  7975. vue.createElementVNode("text", { class: "header-title" }, "个人资料"),
  7976. vue.createElementVNode("view", { class: "header-right" })
  7977. ]),
  7978. vue.createElementVNode("view", { class: "header-placeholder" }),
  7979. vue.createElementVNode("view", { class: "group-card" }, [
  7980. vue.createElementVNode("view", {
  7981. class: "list-item",
  7982. onClick: _cache[1] || (_cache[1] = (...args) => $options.changeAvatar && $options.changeAvatar(...args))
  7983. }, [
  7984. vue.createElementVNode("text", { class: "item-title" }, "头像"),
  7985. vue.createElementVNode("view", { class: "item-right" }, [
  7986. vue.createElementVNode("image", {
  7987. class: "user-avatar",
  7988. src: $data.userInfo.avatar,
  7989. mode: "aspectFill"
  7990. }, null, 8, ["src"]),
  7991. vue.createElementVNode("image", {
  7992. class: "arrow-icon",
  7993. src: _imports_3
  7994. })
  7995. ])
  7996. ]),
  7997. vue.createElementVNode("view", {
  7998. class: "list-item",
  7999. onClick: _cache[2] || (_cache[2] = (...args) => $options.editName && $options.editName(...args))
  8000. }, [
  8001. vue.createElementVNode("text", { class: "item-title" }, "真实姓名"),
  8002. vue.createElementVNode("view", { class: "item-right" }, [
  8003. vue.createElementVNode(
  8004. "text",
  8005. { class: "item-value" },
  8006. vue.toDisplayString($data.userInfo.name),
  8007. 1
  8008. /* TEXT */
  8009. ),
  8010. vue.createElementVNode("image", {
  8011. class: "arrow-icon",
  8012. src: _imports_3
  8013. })
  8014. ])
  8015. ])
  8016. ]),
  8017. vue.createElementVNode("view", { class: "group-card" }, [
  8018. vue.createElementVNode("view", { class: "list-item" }, [
  8019. vue.createElementVNode("text", { class: "item-title" }, "工作类型"),
  8020. vue.createElementVNode(
  8021. "view",
  8022. { class: "tag-blue-outline" },
  8023. vue.toDisplayString($data.userInfo.workType),
  8024. 1
  8025. /* TEXT */
  8026. )
  8027. ]),
  8028. vue.createElementVNode("view", {
  8029. class: "list-item",
  8030. onClick: _cache[3] || (_cache[3] = (...args) => $options.showStatusPicker && $options.showStatusPicker(...args))
  8031. }, [
  8032. vue.createElementVNode("text", { class: "item-title" }, "工作状态"),
  8033. vue.createElementVNode("view", { class: "item-right" }, [
  8034. vue.createElementVNode(
  8035. "text",
  8036. { class: "item-value-black" },
  8037. vue.toDisplayString($data.userInfo.workStatus),
  8038. 1
  8039. /* TEXT */
  8040. ),
  8041. vue.createElementVNode("image", {
  8042. class: "arrow-icon",
  8043. src: _imports_3
  8044. })
  8045. ])
  8046. ])
  8047. ]),
  8048. vue.createElementVNode("view", { class: "group-card" }, [
  8049. vue.createElementVNode("view", {
  8050. class: "list-item",
  8051. onClick: _cache[4] || (_cache[4] = (...args) => $options.showCityPicker && $options.showCityPicker(...args))
  8052. }, [
  8053. vue.createElementVNode("text", { class: "item-title" }, "工作城市"),
  8054. vue.createElementVNode("view", { class: "item-right" }, [
  8055. vue.createElementVNode(
  8056. "text",
  8057. { class: "item-value" },
  8058. vue.toDisplayString($data.userInfo.city),
  8059. 1
  8060. /* TEXT */
  8061. ),
  8062. vue.createElementVNode("image", {
  8063. class: "arrow-icon",
  8064. src: _imports_3
  8065. })
  8066. ])
  8067. ]),
  8068. vue.createElementVNode("view", { class: "list-item no-border" }, [
  8069. vue.createElementVNode("text", { class: "item-title" }, "所属站点"),
  8070. vue.createElementVNode("view", { class: "item-right" }, [
  8071. vue.createElementVNode(
  8072. "text",
  8073. { class: "item-value" },
  8074. vue.toDisplayString($data.userInfo.stationName || "未分配站点"),
  8075. 1
  8076. /* TEXT */
  8077. )
  8078. ])
  8079. ])
  8080. ]),
  8081. $data.isStatusPickerShow ? (vue.openBlock(), vue.createElementBlock("view", {
  8082. key: 0,
  8083. class: "popup-mask",
  8084. onClick: _cache[9] || (_cache[9] = (...args) => $options.closeStatusPicker && $options.closeStatusPicker(...args))
  8085. }, [
  8086. vue.createElementVNode("view", {
  8087. class: "popup-content",
  8088. onClick: _cache[8] || (_cache[8] = vue.withModifiers(() => {
  8089. }, ["stop"]))
  8090. }, [
  8091. vue.createElementVNode("view", { class: "popup-title" }, "选择工作状态"),
  8092. vue.createElementVNode("view", {
  8093. class: "popup-item",
  8094. onClick: _cache[5] || (_cache[5] = ($event) => $options.selectStatus("接单中"))
  8095. }, "接单中"),
  8096. vue.createElementVNode("view", {
  8097. class: "popup-item",
  8098. onClick: _cache[6] || (_cache[6] = ($event) => $options.selectStatus("休息中"))
  8099. }, "休息中"),
  8100. vue.createElementVNode("view", {
  8101. class: "popup-cancel",
  8102. onClick: _cache[7] || (_cache[7] = (...args) => $options.closeStatusPicker && $options.closeStatusPicker(...args))
  8103. }, "取消")
  8104. ])
  8105. ])) : vue.createCommentVNode("v-if", true),
  8106. $data.isCityPickerShow ? (vue.openBlock(), vue.createElementBlock("view", {
  8107. key: 1,
  8108. class: "popup-mask",
  8109. onClick: _cache[13] || (_cache[13] = (...args) => $options.closeCityPicker && $options.closeCityPicker(...args))
  8110. }, [
  8111. vue.createElementVNode("view", {
  8112. class: "popup-content",
  8113. onClick: _cache[12] || (_cache[12] = vue.withModifiers(() => {
  8114. }, ["stop"]))
  8115. }, [
  8116. vue.createElementVNode("view", { class: "popup-header-row" }, [
  8117. vue.createElementVNode("text", {
  8118. class: "popup-btn-cancel",
  8119. onClick: _cache[10] || (_cache[10] = (...args) => $options.closeCityPicker && $options.closeCityPicker(...args))
  8120. }, "取消"),
  8121. vue.createElementVNode("text", { class: "popup-title-text" }, "请选择工作城市"),
  8122. vue.createElementVNode("text", {
  8123. class: "popup-btn-confirm",
  8124. onClick: _cache[11] || (_cache[11] = (...args) => $options.confirmCity && $options.confirmCity(...args))
  8125. }, "确定")
  8126. ]),
  8127. vue.createElementVNode("view", { class: "picker-body" }, [
  8128. vue.createElementVNode("view", { class: "timeline-area" }, [
  8129. (vue.openBlock(true), vue.createElementBlock(
  8130. vue.Fragment,
  8131. null,
  8132. vue.renderList($data.selectedPathway, (item, index) => {
  8133. return vue.openBlock(), vue.createElementBlock("view", {
  8134. class: "timeline-item",
  8135. key: index,
  8136. onClick: ($event) => $options.jumpToStep(index)
  8137. }, [
  8138. vue.createElementVNode("view", { class: "timeline-dot" }),
  8139. vue.createElementVNode(
  8140. "text",
  8141. null,
  8142. vue.toDisplayString(item.name),
  8143. 1
  8144. /* TEXT */
  8145. )
  8146. ], 8, ["onClick"]);
  8147. }),
  8148. 128
  8149. /* KEYED_FRAGMENT */
  8150. )),
  8151. $data.selectStep === $data.selectedPathway.length ? (vue.openBlock(), vue.createElementBlock("view", {
  8152. key: 0,
  8153. class: "timeline-item active"
  8154. }, [
  8155. vue.createElementVNode("view", { class: "timeline-dot" }),
  8156. vue.createElementVNode("text", null, "请选择")
  8157. ])) : vue.createCommentVNode("v-if", true)
  8158. ]),
  8159. vue.createElementVNode("scroll-view", {
  8160. "scroll-y": "",
  8161. class: "list-area"
  8162. }, [
  8163. (vue.openBlock(true), vue.createElementBlock(
  8164. vue.Fragment,
  8165. null,
  8166. vue.renderList($data.currentCityList, (item) => {
  8167. return vue.openBlock(), vue.createElementBlock("view", {
  8168. class: "list-item",
  8169. key: item.id,
  8170. onClick: ($event) => $options.selectCityItem(item)
  8171. }, vue.toDisplayString(item.name), 9, ["onClick"]);
  8172. }),
  8173. 128
  8174. /* KEYED_FRAGMENT */
  8175. )),
  8176. $data.currentCityList.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  8177. key: 0,
  8178. style: { "padding": "20rpx", "color": "#999" }
  8179. }, " 无数据 ")) : vue.createCommentVNode("v-if", true)
  8180. ])
  8181. ])
  8182. ])
  8183. ])) : vue.createCommentVNode("v-if", true)
  8184. ]);
  8185. }
  8186. const PagesMineSettingsProfileIndex = /* @__PURE__ */ _export_sfc(_sfc_main$j, [["render", _sfc_render$i], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/profile/index.vue"]]);
  8187. const _sfc_main$i = {
  8188. data() {
  8189. return {
  8190. authInfo: {
  8191. realName: "",
  8192. idCard: "",
  8193. idCardFront: "",
  8194. idCardBack: "",
  8195. serviceTypes: [],
  8196. authId: false,
  8197. authQual: false,
  8198. pendingAudit: false,
  8199. qualImages: []
  8200. }
  8201. };
  8202. },
  8203. onLoad() {
  8204. this.loadAuthInfo();
  8205. },
  8206. methods: {
  8207. navBack() {
  8208. uni.navigateBack({
  8209. delta: 1
  8210. });
  8211. },
  8212. async loadAuthInfo() {
  8213. try {
  8214. const res = await getAuthInfo();
  8215. if (res.code === 200 && res.data) {
  8216. this.authInfo = {
  8217. realName: res.data.realName || "",
  8218. idCard: res.data.idCard || "",
  8219. idCardFront: res.data.idCardFrontUrl || "",
  8220. idCardBack: res.data.idCardBackUrl || "",
  8221. serviceTypes: res.data.serviceTypeList || [],
  8222. authId: res.data.authId || false,
  8223. authQual: res.data.authQual || false,
  8224. pendingAudit: res.data.pendingAudit || false,
  8225. qualImages: res.data.qualImageUrls || []
  8226. };
  8227. }
  8228. } catch (e) {
  8229. formatAppLog("error", "at pages/mine/settings/auth/index.vue:133", "加载认证信息失败", e);
  8230. uni.showToast({ title: "加载失败", icon: "none" });
  8231. }
  8232. },
  8233. maskIdCard(idCard) {
  8234. if (!idCard || idCard.length < 8)
  8235. return idCard;
  8236. return idCard.substring(0, 4) + "**********" + idCard.substring(idCard.length - 4);
  8237. },
  8238. editAuth() {
  8239. uni.showModal({
  8240. title: "提示",
  8241. content: "修改认证信息需要重新审核,审核期间无法接单,确定要继续吗?",
  8242. success: (res) => {
  8243. if (res.confirm) {
  8244. uni.navigateTo({
  8245. url: "/pages/mine/settings/auth/edit"
  8246. });
  8247. }
  8248. }
  8249. });
  8250. }
  8251. }
  8252. };
  8253. function _sfc_render$h(_ctx, _cache, $props, $setup, $data, $options) {
  8254. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  8255. vue.createElementVNode("view", { class: "custom-header" }, [
  8256. vue.createElementVNode("view", {
  8257. class: "header-left",
  8258. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  8259. }, [
  8260. vue.createElementVNode("image", {
  8261. class: "back-icon",
  8262. src: _imports_0,
  8263. style: { "transform": "rotate(180deg)" }
  8264. })
  8265. ]),
  8266. vue.createElementVNode("text", { class: "header-title" }, "认证信息"),
  8267. vue.createElementVNode("view", { class: "header-right" })
  8268. ]),
  8269. vue.createElementVNode("view", { class: "header-placeholder" }),
  8270. vue.createElementVNode("view", { class: "card" }, [
  8271. vue.createElementVNode("view", { class: "section-header" }, [
  8272. vue.createElementVNode("view", { class: "orange-bar" }),
  8273. vue.createElementVNode("text", { class: "section-title" }, "身份认证"),
  8274. $data.authInfo.pendingAudit ? (vue.openBlock(), vue.createElementBlock("view", {
  8275. key: 0,
  8276. class: "tag-orange"
  8277. }, "认证中")) : $data.authInfo.authId ? (vue.openBlock(), vue.createElementBlock("view", {
  8278. key: 1,
  8279. class: "tag-green"
  8280. }, "已认证")) : (vue.openBlock(), vue.createElementBlock("view", {
  8281. key: 2,
  8282. class: "tag-gray"
  8283. }, "未认证"))
  8284. ]),
  8285. vue.createElementVNode("view", { class: "info-row" }, [
  8286. vue.createElementVNode("text", { class: "label" }, "真实姓名"),
  8287. vue.createElementVNode(
  8288. "text",
  8289. { class: "value" },
  8290. vue.toDisplayString($data.authInfo.realName || "未设置"),
  8291. 1
  8292. /* TEXT */
  8293. )
  8294. ]),
  8295. vue.createElementVNode("view", { class: "info-row" }, [
  8296. vue.createElementVNode("text", { class: "label" }, "证件号码"),
  8297. vue.createElementVNode(
  8298. "text",
  8299. { class: "value" },
  8300. vue.toDisplayString($options.maskIdCard($data.authInfo.idCard) || "未设置"),
  8301. 1
  8302. /* TEXT */
  8303. )
  8304. ]),
  8305. vue.createElementVNode("view", { class: "id-card-row" }, [
  8306. $data.authInfo.idCardFront ? (vue.openBlock(), vue.createElementBlock("view", {
  8307. key: 0,
  8308. class: "id-card-box green-bg"
  8309. }, [
  8310. vue.createElementVNode("image", {
  8311. class: "id-card-img",
  8312. src: $data.authInfo.idCardFront,
  8313. mode: "aspectFill"
  8314. }, null, 8, ["src"]),
  8315. vue.createElementVNode("view", { class: "corner-tag" }, "人像面")
  8316. ])) : (vue.openBlock(), vue.createElementBlock("view", {
  8317. key: 1,
  8318. class: "id-card-box green-bg"
  8319. }, [
  8320. vue.createElementVNode("text", { class: "id-text" }, "ID Front"),
  8321. vue.createElementVNode("view", { class: "corner-tag" }, "人像面")
  8322. ])),
  8323. $data.authInfo.idCardBack ? (vue.openBlock(), vue.createElementBlock("view", {
  8324. key: 2,
  8325. class: "id-card-box green-bg"
  8326. }, [
  8327. vue.createElementVNode("image", {
  8328. class: "id-card-img",
  8329. src: $data.authInfo.idCardBack,
  8330. mode: "aspectFill"
  8331. }, null, 8, ["src"]),
  8332. vue.createElementVNode("view", { class: "corner-tag" }, "国徽面")
  8333. ])) : (vue.openBlock(), vue.createElementBlock("view", {
  8334. key: 3,
  8335. class: "id-card-box green-bg"
  8336. }, [
  8337. vue.createElementVNode("text", { class: "id-text" }, "ID Back"),
  8338. vue.createElementVNode("view", { class: "corner-tag" }, "国徽面")
  8339. ]))
  8340. ])
  8341. ]),
  8342. vue.createElementVNode("view", { class: "card" }, [
  8343. vue.createElementVNode("view", { class: "section-header" }, [
  8344. vue.createElementVNode("view", { class: "orange-bar" }),
  8345. vue.createElementVNode("text", { class: "section-title" }, "服务类型")
  8346. ]),
  8347. vue.createElementVNode("view", { class: "tags-row" }, [
  8348. (vue.openBlock(true), vue.createElementBlock(
  8349. vue.Fragment,
  8350. null,
  8351. vue.renderList($data.authInfo.serviceTypes, (type, index) => {
  8352. return vue.openBlock(), vue.createElementBlock(
  8353. "view",
  8354. {
  8355. class: "service-tag",
  8356. key: index
  8357. },
  8358. vue.toDisplayString(type),
  8359. 1
  8360. /* TEXT */
  8361. );
  8362. }),
  8363. 128
  8364. /* KEYED_FRAGMENT */
  8365. )),
  8366. $data.authInfo.serviceTypes.length === 0 ? (vue.openBlock(), vue.createElementBlock("text", {
  8367. key: 0,
  8368. class: "empty-text"
  8369. }, "暂无服务类型")) : vue.createCommentVNode("v-if", true)
  8370. ])
  8371. ]),
  8372. vue.createElementVNode("view", { class: "card" }, [
  8373. vue.createElementVNode("view", { class: "section-header" }, [
  8374. vue.createElementVNode("view", { class: "orange-bar" }),
  8375. vue.createElementVNode("text", { class: "section-title" }, "资质证书")
  8376. ]),
  8377. vue.createElementVNode(
  8378. "text",
  8379. { class: "sub-title" },
  8380. vue.toDisplayString($data.authInfo.authQual ? "已认证" : "未认证"),
  8381. 1
  8382. /* TEXT */
  8383. ),
  8384. vue.createElementVNode("view", { class: "cert-row" }, [
  8385. (vue.openBlock(true), vue.createElementBlock(
  8386. vue.Fragment,
  8387. null,
  8388. vue.renderList($data.authInfo.qualImages, (img, index) => {
  8389. return vue.openBlock(), vue.createElementBlock("view", {
  8390. class: "cert-box yellow-bg",
  8391. key: index
  8392. }, [
  8393. vue.createElementVNode("image", {
  8394. class: "cert-img",
  8395. src: img,
  8396. mode: "aspectFill"
  8397. }, null, 8, ["src"])
  8398. ]);
  8399. }),
  8400. 128
  8401. /* KEYED_FRAGMENT */
  8402. )),
  8403. $data.authInfo.qualImages.length === 0 ? (vue.openBlock(), vue.createElementBlock("text", {
  8404. key: 0,
  8405. class: "empty-text"
  8406. }, "暂无资质证书")) : vue.createCommentVNode("v-if", true)
  8407. ])
  8408. ]),
  8409. vue.createElementVNode("view", { class: "bottom-btn-area" }, [
  8410. $data.authInfo.pendingAudit ? (vue.openBlock(), vue.createElementBlock("button", {
  8411. key: 0,
  8412. class: "action-btn disabled",
  8413. disabled: ""
  8414. }, "认证审核中...")) : (vue.openBlock(), vue.createElementBlock("button", {
  8415. key: 1,
  8416. class: "action-btn",
  8417. onClick: _cache[1] || (_cache[1] = (...args) => $options.editAuth && $options.editAuth(...args))
  8418. }, "修改认证信息")),
  8419. $data.authInfo.pendingAudit ? (vue.openBlock(), vue.createElementBlock("text", {
  8420. key: 2,
  8421. class: "tips"
  8422. }, "认证信息正在审核中,请耐心等待")) : (vue.openBlock(), vue.createElementBlock("text", {
  8423. key: 3,
  8424. class: "tips"
  8425. }, "修改认证信息需要重新审核,审核期间无法接单"))
  8426. ])
  8427. ]);
  8428. }
  8429. const PagesMineSettingsAuthIndex = /* @__PURE__ */ _export_sfc(_sfc_main$i, [["render", _sfc_render$h], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/auth/index.vue"]]);
  8430. const _sfc_main$h = {
  8431. data() {
  8432. return {
  8433. idCardFront: "",
  8434. idCardBack: "",
  8435. idCardFrontOssId: "",
  8436. idCardBackOssId: "",
  8437. serviceOptions: ["宠物接送", "上门喂遛", "上门洗护"],
  8438. selectedServices: [],
  8439. qualifications: {},
  8440. qualOssIds: {}
  8441. };
  8442. },
  8443. onLoad() {
  8444. this.loadAuthInfo();
  8445. },
  8446. methods: {
  8447. async loadAuthInfo() {
  8448. try {
  8449. uni.showLoading({ title: "加载中..." });
  8450. const res = await getAuthInfo();
  8451. if (res.code === 200 && res.data) {
  8452. this.idCardFront = res.data.idCardFrontUrl || "";
  8453. this.idCardBack = res.data.idCardBackUrl || "";
  8454. this.idCardFrontOssId = res.data.idCardFront || "";
  8455. this.idCardBackOssId = res.data.idCardBack || "";
  8456. this.selectedServices = res.data.serviceTypeList || [];
  8457. this.selectedServices.forEach((service) => {
  8458. this.qualifications[service] = [];
  8459. this.qualOssIds[service] = [];
  8460. });
  8461. if (res.data.qualImageUrls && res.data.qualImageUrls.length > 0) {
  8462. const firstService = this.selectedServices[0];
  8463. if (firstService) {
  8464. this.qualifications[firstService] = res.data.qualImageUrls;
  8465. }
  8466. }
  8467. }
  8468. uni.hideLoading();
  8469. } catch (e) {
  8470. uni.hideLoading();
  8471. formatAppLog("error", "at pages/mine/settings/auth/edit.vue:151", "加载认证信息失败", e);
  8472. uni.showToast({ title: "加载失败", icon: "none" });
  8473. }
  8474. },
  8475. navBack() {
  8476. uni.navigateBack({ delta: 1 });
  8477. },
  8478. chooseImage(side) {
  8479. uni.chooseImage({
  8480. count: 1,
  8481. sizeType: ["compressed"],
  8482. sourceType: ["album", "camera"],
  8483. success: async (res) => {
  8484. const tempPath = res.tempFilePaths[0];
  8485. if (side === "front") {
  8486. this.idCardFront = tempPath;
  8487. } else {
  8488. this.idCardBack = tempPath;
  8489. }
  8490. try {
  8491. uni.showLoading({ title: "上传中..." });
  8492. const uploadRes = await uploadFile(tempPath);
  8493. if (side === "front") {
  8494. this.idCardFrontOssId = uploadRes.data.ossId;
  8495. } else {
  8496. this.idCardBackOssId = uploadRes.data.ossId;
  8497. }
  8498. uni.hideLoading();
  8499. uni.showToast({ title: "上传成功", icon: "success" });
  8500. } catch (err) {
  8501. uni.hideLoading();
  8502. formatAppLog("error", "at pages/mine/settings/auth/edit.vue:183", "上传身份证图片失败:", err);
  8503. uni.showToast({ title: "上传失败", icon: "none" });
  8504. }
  8505. }
  8506. });
  8507. },
  8508. deleteImage(side) {
  8509. if (side === "front") {
  8510. this.idCardFront = "";
  8511. this.idCardFrontOssId = "";
  8512. } else {
  8513. this.idCardBack = "";
  8514. this.idCardBackOssId = "";
  8515. }
  8516. },
  8517. toggleService(service) {
  8518. const index = this.selectedServices.indexOf(service);
  8519. if (index > -1) {
  8520. this.selectedServices.splice(index, 1);
  8521. delete this.qualifications[service];
  8522. delete this.qualOssIds[service];
  8523. } else {
  8524. this.selectedServices.push(service);
  8525. this.qualifications[service] = [];
  8526. this.qualOssIds[service] = [];
  8527. }
  8528. this.$forceUpdate();
  8529. },
  8530. chooseQualImage(service) {
  8531. uni.chooseImage({
  8532. count: 9,
  8533. sizeType: ["compressed"],
  8534. sourceType: ["album", "camera"],
  8535. success: async (res) => {
  8536. if (!this.qualifications[service]) {
  8537. this.qualifications[service] = [];
  8538. this.qualOssIds[service] = [];
  8539. }
  8540. for (const tempPath of res.tempFilePaths) {
  8541. this.qualifications[service].push(tempPath);
  8542. this.$forceUpdate();
  8543. try {
  8544. uni.showLoading({ title: "上传中..." });
  8545. const uploadRes = await uploadFile(tempPath);
  8546. this.qualOssIds[service].push(uploadRes.data.ossId);
  8547. uni.hideLoading();
  8548. } catch (err) {
  8549. uni.hideLoading();
  8550. formatAppLog("error", "at pages/mine/settings/auth/edit.vue:233", "上传资质图片失败:", err);
  8551. }
  8552. }
  8553. }
  8554. });
  8555. },
  8556. deleteQualImage(service, index) {
  8557. this.qualifications[service].splice(index, 1);
  8558. if (this.qualOssIds[service]) {
  8559. this.qualOssIds[service].splice(index, 1);
  8560. }
  8561. this.$forceUpdate();
  8562. },
  8563. previewImage(service, index) {
  8564. uni.previewImage({
  8565. urls: this.qualifications[service],
  8566. current: index
  8567. });
  8568. },
  8569. async submitAuth() {
  8570. if (!this.idCardFront || !this.idCardBack) {
  8571. uni.showToast({ title: "请上传身份证正反面", icon: "none" });
  8572. return;
  8573. }
  8574. if (this.selectedServices.length === 0) {
  8575. uni.showToast({ title: "请选择服务类型", icon: "none" });
  8576. return;
  8577. }
  8578. for (const service of this.selectedServices) {
  8579. if (!this.qualifications[service] || this.qualifications[service].length === 0) {
  8580. uni.showToast({ title: `请上传${service}资质`, icon: "none" });
  8581. return;
  8582. }
  8583. }
  8584. uni.showModal({
  8585. title: "提示",
  8586. content: "修改认证信息需要重新审核,审核期间无法接单,确定要继续吗?",
  8587. success: (res) => {
  8588. if (res.confirm) {
  8589. this.doSubmit();
  8590. }
  8591. }
  8592. });
  8593. },
  8594. async doSubmit() {
  8595. const allQualOssIds = [];
  8596. Object.values(this.qualOssIds).forEach((ids) => {
  8597. allQualOssIds.push(...ids);
  8598. });
  8599. const submitData = {
  8600. idCardFront: this.idCardFrontOssId,
  8601. idCardBack: this.idCardBackOssId,
  8602. serviceTypes: JSON.stringify(this.selectedServices),
  8603. qualifications: JSON.stringify(allQualOssIds)
  8604. };
  8605. try {
  8606. uni.showLoading({ title: "提交中..." });
  8607. await updateAuthInfo(submitData);
  8608. uni.hideLoading();
  8609. uni.showToast({ title: "提交成功,等待审核", icon: "success", duration: 1500 });
  8610. setTimeout(() => {
  8611. uni.navigateBack({ delta: 1 });
  8612. }, 1500);
  8613. } catch (err) {
  8614. uni.hideLoading();
  8615. formatAppLog("error", "at pages/mine/settings/auth/edit.vue:303", "提交失败:", err);
  8616. uni.showToast({ title: "提交失败", icon: "none" });
  8617. }
  8618. }
  8619. }
  8620. };
  8621. function _sfc_render$g(_ctx, _cache, $props, $setup, $data, $options) {
  8622. return vue.openBlock(), vue.createElementBlock("view", { class: "edit-auth-container" }, [
  8623. vue.createElementVNode("view", { class: "custom-header" }, [
  8624. vue.createElementVNode("view", {
  8625. class: "header-left",
  8626. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  8627. }, [
  8628. vue.createElementVNode("image", {
  8629. class: "back-icon",
  8630. src: _imports_0,
  8631. style: { "transform": "rotate(180deg)" }
  8632. })
  8633. ]),
  8634. vue.createElementVNode("text", { class: "header-title" }, "修改认证信息"),
  8635. vue.createElementVNode("view", { class: "header-right" })
  8636. ]),
  8637. vue.createElementVNode("view", { class: "header-placeholder" }),
  8638. vue.createElementVNode("view", { class: "warning-tip" }, [
  8639. vue.createElementVNode("text", { class: "warning-icon" }, "⚠"),
  8640. vue.createElementVNode("text", { class: "warning-text" }, "若修改认证信息,将在审核通过后生效")
  8641. ]),
  8642. vue.createElementVNode("view", { class: "section-card" }, [
  8643. vue.createElementVNode("view", { class: "section-title" }, "身份认证"),
  8644. vue.createElementVNode("text", { class: "section-subtitle" }, "点击图片修改"),
  8645. vue.createElementVNode("view", { class: "id-card-row" }, [
  8646. vue.createElementVNode("view", {
  8647. class: "id-card-upload",
  8648. onClick: _cache[2] || (_cache[2] = ($event) => $options.chooseImage("front"))
  8649. }, [
  8650. $data.idCardFront ? (vue.openBlock(), vue.createElementBlock("image", {
  8651. key: 0,
  8652. src: $data.idCardFront,
  8653. class: "id-card-img",
  8654. mode: "aspectFill"
  8655. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock("view", {
  8656. key: 1,
  8657. class: "id-card-placeholder"
  8658. }, [
  8659. vue.createElementVNode("text", { class: "placeholder-text" }, "ID Front")
  8660. ])),
  8661. $data.idCardFront ? (vue.openBlock(), vue.createElementBlock("view", {
  8662. key: 2,
  8663. class: "delete-btn",
  8664. onClick: _cache[1] || (_cache[1] = vue.withModifiers(($event) => $options.deleteImage("front"), ["stop"]))
  8665. }, "×")) : vue.createCommentVNode("v-if", true),
  8666. vue.createElementVNode("view", { class: "corner-tag" }, "人像面")
  8667. ]),
  8668. vue.createElementVNode("view", {
  8669. class: "id-card-upload",
  8670. onClick: _cache[4] || (_cache[4] = ($event) => $options.chooseImage("back"))
  8671. }, [
  8672. $data.idCardBack ? (vue.openBlock(), vue.createElementBlock("image", {
  8673. key: 0,
  8674. src: $data.idCardBack,
  8675. class: "id-card-img",
  8676. mode: "aspectFill"
  8677. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock("view", {
  8678. key: 1,
  8679. class: "id-card-placeholder"
  8680. }, [
  8681. vue.createElementVNode("text", { class: "placeholder-text" }, "ID Back")
  8682. ])),
  8683. $data.idCardBack ? (vue.openBlock(), vue.createElementBlock("view", {
  8684. key: 2,
  8685. class: "delete-btn",
  8686. onClick: _cache[3] || (_cache[3] = vue.withModifiers(($event) => $options.deleteImage("back"), ["stop"]))
  8687. }, "×")) : vue.createCommentVNode("v-if", true),
  8688. vue.createElementVNode("view", { class: "corner-tag" }, "国徽面")
  8689. ])
  8690. ])
  8691. ]),
  8692. vue.createElementVNode("view", { class: "section-card" }, [
  8693. vue.createElementVNode("view", { class: "section-title" }, "服务类型"),
  8694. vue.createElementVNode("text", { class: "section-subtitle" }, "可多选"),
  8695. vue.createElementVNode("view", { class: "service-list" }, [
  8696. (vue.openBlock(true), vue.createElementBlock(
  8697. vue.Fragment,
  8698. null,
  8699. vue.renderList($data.serviceOptions, (service, index) => {
  8700. return vue.openBlock(), vue.createElementBlock("view", {
  8701. class: "service-item",
  8702. key: index,
  8703. onClick: ($event) => $options.toggleService(service)
  8704. }, [
  8705. vue.createElementVNode(
  8706. "text",
  8707. { class: "service-name" },
  8708. vue.toDisplayString(service),
  8709. 1
  8710. /* TEXT */
  8711. ),
  8712. vue.createElementVNode(
  8713. "view",
  8714. {
  8715. class: vue.normalizeClass(["check-icon", { active: $data.selectedServices.includes(service) }])
  8716. },
  8717. [
  8718. $data.selectedServices.includes(service) ? (vue.openBlock(), vue.createElementBlock("text", { key: 0 }, "✓")) : vue.createCommentVNode("v-if", true)
  8719. ],
  8720. 2
  8721. /* CLASS */
  8722. )
  8723. ], 8, ["onClick"]);
  8724. }),
  8725. 128
  8726. /* KEYED_FRAGMENT */
  8727. ))
  8728. ])
  8729. ]),
  8730. vue.createElementVNode("view", { class: "section-card" }, [
  8731. vue.createElementVNode("view", { class: "section-title" }, "资质证书"),
  8732. vue.createElementVNode("text", { class: "section-subtitle" }, "请上传对应服务的资质"),
  8733. (vue.openBlock(true), vue.createElementBlock(
  8734. vue.Fragment,
  8735. null,
  8736. vue.renderList($data.selectedServices, (service, index) => {
  8737. return vue.openBlock(), vue.createElementBlock("view", {
  8738. key: index,
  8739. class: "qual-section"
  8740. }, [
  8741. vue.createElementVNode(
  8742. "text",
  8743. { class: "qual-title" },
  8744. vue.toDisplayString(service) + "资质",
  8745. 1
  8746. /* TEXT */
  8747. ),
  8748. vue.createElementVNode("view", { class: "qual-upload-row" }, [
  8749. (vue.openBlock(true), vue.createElementBlock(
  8750. vue.Fragment,
  8751. null,
  8752. vue.renderList($data.qualifications[service], (img, imgIndex) => {
  8753. return vue.openBlock(), vue.createElementBlock("view", {
  8754. class: "qual-item",
  8755. key: imgIndex,
  8756. onClick: ($event) => $options.previewImage(service, imgIndex)
  8757. }, [
  8758. vue.createElementVNode("image", {
  8759. src: img,
  8760. class: "qual-img",
  8761. mode: "aspectFill"
  8762. }, null, 8, ["src"]),
  8763. vue.createElementVNode("view", {
  8764. class: "delete-btn",
  8765. onClick: vue.withModifiers(($event) => $options.deleteQualImage(service, imgIndex), ["stop"])
  8766. }, "×", 8, ["onClick"])
  8767. ], 8, ["onClick"]);
  8768. }),
  8769. 128
  8770. /* KEYED_FRAGMENT */
  8771. )),
  8772. vue.createElementVNode("view", {
  8773. class: "qual-upload-btn",
  8774. onClick: ($event) => $options.chooseQualImage(service)
  8775. }, [
  8776. vue.createElementVNode("text", { class: "plus-icon" }, "+")
  8777. ], 8, ["onClick"])
  8778. ])
  8779. ]);
  8780. }),
  8781. 128
  8782. /* KEYED_FRAGMENT */
  8783. )),
  8784. $data.selectedServices.length === 0 ? (vue.openBlock(), vue.createElementBlock("text", {
  8785. key: 0,
  8786. class: "empty-hint"
  8787. }, "请先选择服务类型")) : vue.createCommentVNode("v-if", true)
  8788. ]),
  8789. vue.createElementVNode("view", { class: "bottom-btn-area" }, [
  8790. vue.createElementVNode("button", {
  8791. class: "submit-btn",
  8792. onClick: _cache[5] || (_cache[5] = (...args) => $options.submitAuth && $options.submitAuth(...args))
  8793. }, "提交审核")
  8794. ])
  8795. ]);
  8796. }
  8797. const PagesMineSettingsAuthEdit = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["render", _sfc_render$g], ["__scopeId", "data-v-10d0f207"], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/auth/edit.vue"]]);
  8798. const _imports_1$3 = "/static/icons/shield.svg";
  8799. const _sfc_main$g = {
  8800. data() {
  8801. return {
  8802. hasShieldIcon: false
  8803. // 如果没有盾牌图标资源,暂时隐藏或用文字代替
  8804. };
  8805. },
  8806. methods: {
  8807. navBack() {
  8808. uni.navigateBack({
  8809. delta: 1
  8810. });
  8811. },
  8812. editBank() {
  8813. uni.showToast({ title: "跳转修改银行卡页", icon: "none" });
  8814. }
  8815. }
  8816. };
  8817. function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
  8818. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  8819. vue.createElementVNode("view", { class: "custom-header" }, [
  8820. vue.createElementVNode("view", {
  8821. class: "header-left",
  8822. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  8823. }, [
  8824. vue.createElementVNode("image", {
  8825. class: "back-icon",
  8826. src: _imports_0,
  8827. style: { "transform": "rotate(180deg)" }
  8828. })
  8829. ]),
  8830. vue.createElementVNode("text", { class: "header-title" }, "银行卡信息"),
  8831. vue.createElementVNode("view", { class: "header-right" })
  8832. ]),
  8833. vue.createElementVNode("view", { class: "header-placeholder" }),
  8834. vue.createElementVNode("view", { class: "bank-card" }, [
  8835. vue.createElementVNode("view", { class: "card-top" }, [
  8836. vue.createElementVNode("view", { class: "bank-info" }, [
  8837. vue.createElementVNode("view", { class: "bank-icon-circle" }, [
  8838. vue.createElementVNode("text", { class: "bank-icon-text" }, "招")
  8839. ]),
  8840. vue.createElementVNode("text", { class: "bank-name" }, "招商银行")
  8841. ]),
  8842. vue.createElementVNode("view", { class: "card-type" }, "储蓄卡")
  8843. ]),
  8844. vue.createElementVNode("view", { class: "card-number" }, "622588******1234"),
  8845. vue.createElementVNode("view", { class: "card-bg-circle" })
  8846. ]),
  8847. vue.createElementVNode("button", {
  8848. class: "action-btn",
  8849. onClick: _cache[1] || (_cache[1] = (...args) => $options.editBank && $options.editBank(...args))
  8850. }, "修改银行卡信息"),
  8851. vue.createElementVNode("view", { class: "security-tip" }, [
  8852. $data.hasShieldIcon ? (vue.openBlock(), vue.createElementBlock("image", {
  8853. key: 0,
  8854. class: "shield-icon",
  8855. src: _imports_1$3
  8856. })) : vue.createCommentVNode("v-if", true),
  8857. vue.createElementVNode("text", null, "信息已加密,仅用于收入发放")
  8858. ])
  8859. ]);
  8860. }
  8861. const PagesMineSettingsBankIndex = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["render", _sfc_render$f], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/bank/index.vue"]]);
  8862. const _sfc_main$f = {
  8863. data() {
  8864. return {
  8865. phone: "",
  8866. hasPassword: false
  8867. };
  8868. },
  8869. onLoad() {
  8870. this.loadProfile();
  8871. },
  8872. methods: {
  8873. navBack() {
  8874. uni.navigateBack({
  8875. delta: 1
  8876. });
  8877. },
  8878. async loadProfile() {
  8879. try {
  8880. const res = await getMyProfile();
  8881. if (res.code === 200 && res.data) {
  8882. this.phone = res.data.phone || "";
  8883. this.hasPassword = !!res.data.hasPassword;
  8884. }
  8885. } catch (e) {
  8886. formatAppLog("error", "at pages/mine/settings/security/index.vue:68", "加载个人信息失败", e);
  8887. }
  8888. },
  8889. maskPhone(phone) {
  8890. if (!phone || phone.length < 11)
  8891. return phone;
  8892. return phone.substring(0, 3) + "****" + phone.substring(7);
  8893. },
  8894. changeMobile() {
  8895. uni.navigateTo({
  8896. url: "/pages/mine/settings/security/change-phone"
  8897. });
  8898. },
  8899. changePassword() {
  8900. uni.navigateTo({
  8901. url: "/pages/mine/settings/security/change-password"
  8902. });
  8903. },
  8904. async deleteAccount() {
  8905. uni.showModal({
  8906. title: "警示",
  8907. content: "注销账号后将无法恢复,确定要继续吗?",
  8908. success: async (res) => {
  8909. if (res.confirm) {
  8910. try {
  8911. const result = await deleteAccount();
  8912. if (result.code === 200) {
  8913. uni.showToast({ title: "账号已注销", icon: "success" });
  8914. setTimeout(() => {
  8915. uni.reLaunch({ url: "/pages/login/login" });
  8916. }, 1500);
  8917. } else {
  8918. uni.showToast({ title: result.msg || "注销失败", icon: "none" });
  8919. }
  8920. } catch (e) {
  8921. formatAppLog("error", "at pages/mine/settings/security/index.vue:102", "注销账号失败", e);
  8922. uni.showToast({ title: "注销失败", icon: "none" });
  8923. }
  8924. }
  8925. }
  8926. });
  8927. }
  8928. }
  8929. };
  8930. function _sfc_render$e(_ctx, _cache, $props, $setup, $data, $options) {
  8931. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  8932. vue.createElementVNode("view", { class: "custom-header" }, [
  8933. vue.createElementVNode("view", {
  8934. class: "header-left",
  8935. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  8936. }, [
  8937. vue.createElementVNode("image", {
  8938. class: "back-icon",
  8939. src: _imports_0,
  8940. style: { "transform": "rotate(180deg)" }
  8941. })
  8942. ]),
  8943. vue.createElementVNode("text", { class: "header-title" }, "账号与安全"),
  8944. vue.createElementVNode("view", { class: "header-right" })
  8945. ]),
  8946. vue.createElementVNode("view", { class: "header-placeholder" }),
  8947. vue.createElementVNode("view", { class: "section-title-security" }, "安全设置"),
  8948. vue.createElementVNode("view", { class: "group-card" }, [
  8949. vue.createElementVNode("view", {
  8950. class: "list-item",
  8951. onClick: _cache[1] || (_cache[1] = (...args) => $options.changeMobile && $options.changeMobile(...args))
  8952. }, [
  8953. vue.createElementVNode("text", { class: "item-title" }, "手机号"),
  8954. vue.createElementVNode("view", { class: "item-right" }, [
  8955. vue.createElementVNode(
  8956. "text",
  8957. { class: "item-value" },
  8958. vue.toDisplayString($options.maskPhone($data.phone) || "未设置"),
  8959. 1
  8960. /* TEXT */
  8961. ),
  8962. vue.createElementVNode("image", {
  8963. class: "arrow-icon",
  8964. src: _imports_3
  8965. })
  8966. ])
  8967. ]),
  8968. vue.createElementVNode("view", {
  8969. class: "list-item",
  8970. onClick: _cache[2] || (_cache[2] = (...args) => $options.changePassword && $options.changePassword(...args))
  8971. }, [
  8972. vue.createElementVNode("text", { class: "item-title" }, "登录密码"),
  8973. vue.createElementVNode("view", { class: "item-right" }, [
  8974. vue.createElementVNode(
  8975. "text",
  8976. { class: "item-value" },
  8977. vue.toDisplayString($data.hasPassword ? "已设置" : "未设置"),
  8978. 1
  8979. /* TEXT */
  8980. ),
  8981. vue.createElementVNode("image", {
  8982. class: "arrow-icon",
  8983. src: _imports_3
  8984. })
  8985. ])
  8986. ])
  8987. ]),
  8988. vue.createElementVNode("view", { class: "section-title-security" }, "高级设置"),
  8989. vue.createElementVNode("view", { class: "group-card" }, [
  8990. vue.createElementVNode("view", {
  8991. class: "list-item no-border",
  8992. onClick: _cache[3] || (_cache[3] = (...args) => $options.deleteAccount && $options.deleteAccount(...args))
  8993. }, [
  8994. vue.createElementVNode("text", { class: "item-title" }, "注销账号"),
  8995. vue.createElementVNode("image", {
  8996. class: "arrow-icon",
  8997. src: _imports_3
  8998. })
  8999. ])
  9000. ])
  9001. ]);
  9002. }
  9003. const PagesMineSettingsSecurityIndex = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["render", _sfc_render$e], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/security/index.vue"]]);
  9004. const _sfc_main$e = {
  9005. data() {
  9006. return {
  9007. name: ""
  9008. };
  9009. },
  9010. onLoad(options) {
  9011. if (options.name) {
  9012. this.name = decodeURIComponent(options.name);
  9013. }
  9014. },
  9015. methods: {
  9016. navBack() {
  9017. uni.navigateBack({ delta: 1 });
  9018. },
  9019. // 提交修改 @author steelwei
  9020. async submitChange() {
  9021. if (!this.name || !this.name.trim()) {
  9022. uni.showToast({ title: "请输入姓名", icon: "none" });
  9023. return;
  9024. }
  9025. if (this.name.trim().length < 2) {
  9026. uni.showToast({ title: "姓名至少2个字符", icon: "none" });
  9027. return;
  9028. }
  9029. uni.showLoading({ title: "提交中..." });
  9030. try {
  9031. const res = await updateName(this.name.trim());
  9032. if (res.code === 200) {
  9033. uni.showToast({
  9034. title: "修改成功",
  9035. icon: "success",
  9036. duration: 2e3
  9037. });
  9038. uni.$emit("updateName", this.name.trim());
  9039. setTimeout(() => {
  9040. uni.navigateBack({ delta: 1 });
  9041. }, 2e3);
  9042. } else {
  9043. uni.showToast({
  9044. title: res.msg || "修改失败",
  9045. icon: "none"
  9046. });
  9047. }
  9048. } catch (error) {
  9049. formatAppLog("error", "at pages/mine/settings/profile/edit-name.vue:94", "修改姓名失败:", error);
  9050. uni.showToast({ title: "网络错误", icon: "none" });
  9051. } finally {
  9052. uni.hideLoading();
  9053. }
  9054. }
  9055. }
  9056. };
  9057. function _sfc_render$d(_ctx, _cache, $props, $setup, $data, $options) {
  9058. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9059. vue.createElementVNode("view", { class: "custom-header" }, [
  9060. vue.createElementVNode("view", {
  9061. class: "header-left",
  9062. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9063. }, [
  9064. vue.createElementVNode("image", {
  9065. class: "back-icon",
  9066. src: _imports_0,
  9067. style: { "transform": "rotate(180deg)" }
  9068. })
  9069. ]),
  9070. vue.createElementVNode("text", { class: "header-title" }, "修改姓名"),
  9071. vue.createElementVNode("view", { class: "header-right" })
  9072. ]),
  9073. vue.createElementVNode("view", { class: "header-placeholder" }),
  9074. vue.createElementVNode("view", { class: "form-card" }, [
  9075. vue.createElementVNode("view", { class: "form-item no-border" }, [
  9076. vue.createElementVNode("text", { class: "form-label" }, "真实姓名"),
  9077. vue.withDirectives(vue.createElementVNode(
  9078. "input",
  9079. {
  9080. class: "form-input",
  9081. type: "text",
  9082. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.name = $event),
  9083. placeholder: "请输入真实姓名",
  9084. "placeholder-class": "placeholder",
  9085. maxlength: "20"
  9086. },
  9087. null,
  9088. 512
  9089. /* NEED_PATCH */
  9090. ), [
  9091. [vue.vModelText, $data.name]
  9092. ])
  9093. ])
  9094. ]),
  9095. vue.createElementVNode("view", { class: "btn-area" }, [
  9096. vue.createElementVNode("button", {
  9097. class: "submit-btn",
  9098. onClick: _cache[2] || (_cache[2] = (...args) => $options.submitChange && $options.submitChange(...args))
  9099. }, "确认修改")
  9100. ]),
  9101. vue.createElementVNode("view", { class: "tips" }, [
  9102. vue.createElementVNode("text", { class: "tips-text" }, "• 请输入您的真实姓名"),
  9103. vue.createElementVNode("text", { class: "tips-text" }, "• 姓名将用于实名认证和订单服务")
  9104. ])
  9105. ]);
  9106. }
  9107. const PagesMineSettingsProfileEditName = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["render", _sfc_render$d], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/profile/edit-name.vue"]]);
  9108. const _sfc_main$d = {
  9109. data() {
  9110. return {
  9111. oldPassword: "",
  9112. newPassword: "",
  9113. confirmPassword: ""
  9114. };
  9115. },
  9116. methods: {
  9117. navBack() {
  9118. uni.navigateBack({ delta: 1 });
  9119. },
  9120. // 提交修改 @author steelwei
  9121. async submitChange() {
  9122. if (!this.oldPassword) {
  9123. uni.showToast({ title: "请输入旧密码", icon: "none" });
  9124. return;
  9125. }
  9126. if (!this.newPassword) {
  9127. uni.showToast({ title: "请输入新密码", icon: "none" });
  9128. return;
  9129. }
  9130. if (this.newPassword.length < 6 || this.newPassword.length > 20) {
  9131. uni.showToast({ title: "密码长度为6-20位", icon: "none" });
  9132. return;
  9133. }
  9134. if (this.newPassword !== this.confirmPassword) {
  9135. uni.showToast({ title: "两次密码输入不一致", icon: "none" });
  9136. return;
  9137. }
  9138. uni.showLoading({ title: "提交中..." });
  9139. try {
  9140. const res = await updatePassword(this.oldPassword, this.newPassword);
  9141. if (res.code === 200) {
  9142. uni.showToast({
  9143. title: "修改成功",
  9144. icon: "success",
  9145. duration: 2e3
  9146. });
  9147. setTimeout(() => {
  9148. uni.navigateBack({ delta: 1 });
  9149. }, 2e3);
  9150. } else {
  9151. uni.showToast({
  9152. title: res.msg || "修改失败",
  9153. icon: "none"
  9154. });
  9155. }
  9156. } catch (error) {
  9157. formatAppLog("error", "at pages/mine/settings/security/change-password.vue:109", "修改密码失败:", error);
  9158. uni.showToast({ title: "网络错误", icon: "none" });
  9159. } finally {
  9160. uni.hideLoading();
  9161. }
  9162. }
  9163. }
  9164. };
  9165. function _sfc_render$c(_ctx, _cache, $props, $setup, $data, $options) {
  9166. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9167. vue.createElementVNode("view", { class: "custom-header" }, [
  9168. vue.createElementVNode("view", {
  9169. class: "header-left",
  9170. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9171. }, [
  9172. vue.createElementVNode("image", {
  9173. class: "back-icon",
  9174. src: _imports_0,
  9175. style: { "transform": "rotate(180deg)" }
  9176. })
  9177. ]),
  9178. vue.createElementVNode("text", { class: "header-title" }, "修改密码"),
  9179. vue.createElementVNode("view", { class: "header-right" })
  9180. ]),
  9181. vue.createElementVNode("view", { class: "header-placeholder" }),
  9182. vue.createElementVNode("view", { class: "form-card" }, [
  9183. vue.createElementVNode("view", { class: "form-item" }, [
  9184. vue.createElementVNode("text", { class: "form-label" }, "旧密码"),
  9185. vue.withDirectives(vue.createElementVNode(
  9186. "input",
  9187. {
  9188. class: "form-input",
  9189. type: "password",
  9190. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.oldPassword = $event),
  9191. placeholder: "请输入旧密码",
  9192. "placeholder-class": "placeholder"
  9193. },
  9194. null,
  9195. 512
  9196. /* NEED_PATCH */
  9197. ), [
  9198. [vue.vModelText, $data.oldPassword]
  9199. ])
  9200. ]),
  9201. vue.createElementVNode("view", { class: "form-item" }, [
  9202. vue.createElementVNode("text", { class: "form-label" }, "新密码"),
  9203. vue.withDirectives(vue.createElementVNode(
  9204. "input",
  9205. {
  9206. class: "form-input",
  9207. type: "password",
  9208. "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $data.newPassword = $event),
  9209. placeholder: "请输入新密码(6-20位)",
  9210. "placeholder-class": "placeholder"
  9211. },
  9212. null,
  9213. 512
  9214. /* NEED_PATCH */
  9215. ), [
  9216. [vue.vModelText, $data.newPassword]
  9217. ])
  9218. ]),
  9219. vue.createElementVNode("view", { class: "form-item no-border" }, [
  9220. vue.createElementVNode("text", { class: "form-label" }, "确认密码"),
  9221. vue.withDirectives(vue.createElementVNode(
  9222. "input",
  9223. {
  9224. class: "form-input",
  9225. type: "password",
  9226. "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => $data.confirmPassword = $event),
  9227. placeholder: "请再次输入新密码",
  9228. "placeholder-class": "placeholder"
  9229. },
  9230. null,
  9231. 512
  9232. /* NEED_PATCH */
  9233. ), [
  9234. [vue.vModelText, $data.confirmPassword]
  9235. ])
  9236. ])
  9237. ]),
  9238. vue.createElementVNode("view", { class: "btn-area" }, [
  9239. vue.createElementVNode("button", {
  9240. class: "submit-btn",
  9241. onClick: _cache[4] || (_cache[4] = (...args) => $options.submitChange && $options.submitChange(...args))
  9242. }, "确认修改")
  9243. ])
  9244. ]);
  9245. }
  9246. const PagesMineSettingsSecurityChangePassword = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["render", _sfc_render$c], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/security/change-password.vue"]]);
  9247. const _sfc_main$c = {
  9248. data() {
  9249. return {
  9250. phone: "",
  9251. code: "",
  9252. countdown: 0,
  9253. timer: null
  9254. };
  9255. },
  9256. onUnload() {
  9257. if (this.timer) {
  9258. clearInterval(this.timer);
  9259. }
  9260. },
  9261. methods: {
  9262. navBack() {
  9263. uni.navigateBack({ delta: 1 });
  9264. },
  9265. // 发送验证码 @author steelwei
  9266. sendCode() {
  9267. if (!this.phone) {
  9268. uni.showToast({ title: "请输入手机号", icon: "none" });
  9269. return;
  9270. }
  9271. if (!/^1[3-9]\d{9}$/.test(this.phone)) {
  9272. uni.showToast({ title: "手机号格式不正确", icon: "none" });
  9273. return;
  9274. }
  9275. uni.showToast({ title: "验证码已发送", icon: "success" });
  9276. this.countdown = 60;
  9277. this.timer = setInterval(() => {
  9278. this.countdown--;
  9279. if (this.countdown <= 0) {
  9280. clearInterval(this.timer);
  9281. }
  9282. }, 1e3);
  9283. },
  9284. // 提交修改 @author steelwei
  9285. async submitChange() {
  9286. if (!this.phone) {
  9287. uni.showToast({ title: "请输入手机号", icon: "none" });
  9288. return;
  9289. }
  9290. if (!/^1[3-9]\d{9}$/.test(this.phone)) {
  9291. uni.showToast({ title: "手机号格式不正确", icon: "none" });
  9292. return;
  9293. }
  9294. if (!this.code) {
  9295. uni.showToast({ title: "请输入验证码", icon: "none" });
  9296. return;
  9297. }
  9298. uni.showLoading({ title: "提交中..." });
  9299. try {
  9300. const res = await updatePhone(this.phone, this.code);
  9301. if (res.code === 200) {
  9302. uni.showToast({
  9303. title: "修改成功",
  9304. icon: "success",
  9305. duration: 2e3
  9306. });
  9307. setTimeout(() => {
  9308. uni.navigateBack({ delta: 1 });
  9309. }, 2e3);
  9310. } else {
  9311. uni.showToast({
  9312. title: res.msg || "修改失败",
  9313. icon: "none"
  9314. });
  9315. }
  9316. } catch (error) {
  9317. formatAppLog("error", "at pages/mine/settings/security/change-phone.vue:139", "修改手机号失败:", error);
  9318. uni.showToast({ title: "网络错误", icon: "none" });
  9319. } finally {
  9320. uni.hideLoading();
  9321. }
  9322. }
  9323. }
  9324. };
  9325. function _sfc_render$b(_ctx, _cache, $props, $setup, $data, $options) {
  9326. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9327. vue.createElementVNode("view", { class: "custom-header" }, [
  9328. vue.createElementVNode("view", {
  9329. class: "header-left",
  9330. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9331. }, [
  9332. vue.createElementVNode("image", {
  9333. class: "back-icon",
  9334. src: _imports_0,
  9335. style: { "transform": "rotate(180deg)" }
  9336. })
  9337. ]),
  9338. vue.createElementVNode("text", { class: "header-title" }, "修改手机号"),
  9339. vue.createElementVNode("view", { class: "header-right" })
  9340. ]),
  9341. vue.createElementVNode("view", { class: "header-placeholder" }),
  9342. vue.createElementVNode("view", { class: "form-card" }, [
  9343. vue.createElementVNode("view", { class: "form-item" }, [
  9344. vue.createElementVNode("text", { class: "form-label" }, "新手机号"),
  9345. vue.withDirectives(vue.createElementVNode(
  9346. "input",
  9347. {
  9348. class: "form-input",
  9349. type: "number",
  9350. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.phone = $event),
  9351. placeholder: "请输入新手机号",
  9352. "placeholder-class": "placeholder",
  9353. maxlength: "11"
  9354. },
  9355. null,
  9356. 512
  9357. /* NEED_PATCH */
  9358. ), [
  9359. [vue.vModelText, $data.phone]
  9360. ])
  9361. ]),
  9362. vue.createElementVNode("view", { class: "form-item no-border" }, [
  9363. vue.createElementVNode("text", { class: "form-label" }, "验证码"),
  9364. vue.withDirectives(vue.createElementVNode(
  9365. "input",
  9366. {
  9367. class: "form-input",
  9368. type: "number",
  9369. "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $data.code = $event),
  9370. placeholder: "请输入验证码",
  9371. "placeholder-class": "placeholder",
  9372. maxlength: "6"
  9373. },
  9374. null,
  9375. 512
  9376. /* NEED_PATCH */
  9377. ), [
  9378. [vue.vModelText, $data.code]
  9379. ]),
  9380. vue.createElementVNode("button", {
  9381. class: "code-btn",
  9382. disabled: $data.countdown > 0,
  9383. onClick: _cache[3] || (_cache[3] = (...args) => $options.sendCode && $options.sendCode(...args))
  9384. }, vue.toDisplayString($data.countdown > 0 ? `${$data.countdown}s` : "获取验证码"), 9, ["disabled"])
  9385. ])
  9386. ]),
  9387. vue.createElementVNode("view", { class: "btn-area" }, [
  9388. vue.createElementVNode("button", {
  9389. class: "submit-btn",
  9390. onClick: _cache[4] || (_cache[4] = (...args) => $options.submitChange && $options.submitChange(...args))
  9391. }, "确认修改")
  9392. ]),
  9393. vue.createElementVNode("view", { class: "tips" }, [
  9394. vue.createElementVNode("text", { class: "tips-text" }, "• 修改手机号后,新手机号将作为登录账号"),
  9395. vue.createElementVNode("text", { class: "tips-text" }, "• 请确保新手机号可以正常接收短信")
  9396. ])
  9397. ]);
  9398. }
  9399. const PagesMineSettingsSecurityChangePhone = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["render", _sfc_render$b], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/security/change-phone.vue"]]);
  9400. const _sfc_main$b = {
  9401. data() {
  9402. return {};
  9403. },
  9404. methods: {
  9405. navBack() {
  9406. uni.navigateBack({
  9407. delta: 1
  9408. });
  9409. },
  9410. switchChange(type, e) {
  9411. formatAppLog("log", "at pages/mine/settings/notification/index.vue:41", "switch change", type, e.detail.value);
  9412. }
  9413. }
  9414. };
  9415. function _sfc_render$a(_ctx, _cache, $props, $setup, $data, $options) {
  9416. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9417. vue.createElementVNode("view", { class: "custom-header" }, [
  9418. vue.createElementVNode("view", {
  9419. class: "header-left",
  9420. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9421. }, [
  9422. vue.createElementVNode("image", {
  9423. class: "back-icon",
  9424. src: _imports_0,
  9425. style: { "transform": "rotate(180deg)" }
  9426. })
  9427. ]),
  9428. vue.createElementVNode("text", { class: "header-title" }, "推送通知设置"),
  9429. vue.createElementVNode("view", { class: "header-right" })
  9430. ]),
  9431. vue.createElementVNode("view", { class: "header-placeholder" }),
  9432. vue.createElementVNode("view", { class: "group-card" }, [
  9433. vue.createElementVNode("view", { class: "list-item" }, [
  9434. vue.createElementVNode("text", { class: "item-title" }, "系统消息通知"),
  9435. vue.createElementVNode(
  9436. "switch",
  9437. {
  9438. checked: "",
  9439. color: "#FF5722",
  9440. style: { "transform": "scale(0.8)" },
  9441. onChange: _cache[1] || (_cache[1] = ($event) => $options.switchChange("system", $event))
  9442. },
  9443. null,
  9444. 32
  9445. /* NEED_HYDRATION */
  9446. )
  9447. ]),
  9448. vue.createElementVNode("view", { class: "list-item no-border" }, [
  9449. vue.createElementVNode("text", { class: "item-title" }, "订单消息通知"),
  9450. vue.createElementVNode(
  9451. "switch",
  9452. {
  9453. checked: "",
  9454. color: "#FF5722",
  9455. style: { "transform": "scale(0.8)" },
  9456. onChange: _cache[2] || (_cache[2] = ($event) => $options.switchChange("order", $event))
  9457. },
  9458. null,
  9459. 32
  9460. /* NEED_HYDRATION */
  9461. )
  9462. ])
  9463. ]),
  9464. vue.createElementVNode("text", { class: "tips-text" }, "关闭通知后将收不到消息通知推送")
  9465. ]);
  9466. }
  9467. const PagesMineSettingsNotificationIndex = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["render", _sfc_render$a], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/notification/index.vue"]]);
  9468. const _sfc_main$a = {
  9469. data() {
  9470. return {};
  9471. },
  9472. methods: {
  9473. navBack() {
  9474. uni.navigateBack({
  9475. delta: 1
  9476. });
  9477. }
  9478. }
  9479. };
  9480. function _sfc_render$9(_ctx, _cache, $props, $setup, $data, $options) {
  9481. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9482. vue.createElementVNode("view", { class: "custom-header" }, [
  9483. vue.createElementVNode("view", {
  9484. class: "header-left",
  9485. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9486. }, [
  9487. vue.createElementVNode("image", {
  9488. class: "back-icon",
  9489. src: _imports_0,
  9490. style: { "transform": "rotate(180deg)" }
  9491. })
  9492. ]),
  9493. vue.createElementVNode("text", { class: "header-title" }, "关于我们"),
  9494. vue.createElementVNode("view", { class: "header-right" })
  9495. ]),
  9496. vue.createElementVNode("view", { class: "header-placeholder" }),
  9497. vue.createElementVNode("view", { class: "logo-area" }, [
  9498. vue.createElementVNode("image", {
  9499. class: "app-logo",
  9500. src: _imports_1$8,
  9501. mode: "aspectFit"
  9502. }),
  9503. vue.createElementVNode("text", { class: "app-name" }, "履约者APP"),
  9504. vue.createElementVNode("text", { class: "app-version" }, "Version 2.0.6")
  9505. ]),
  9506. vue.createElementVNode("view", { class: "group-card" }, [
  9507. vue.createElementVNode("view", { class: "list-item" }, [
  9508. vue.createElementVNode("text", { class: "item-title" }, "服务协议"),
  9509. vue.createElementVNode("image", {
  9510. class: "arrow-icon",
  9511. src: _imports_3
  9512. })
  9513. ]),
  9514. vue.createElementVNode("view", { class: "list-item" }, [
  9515. vue.createElementVNode("text", { class: "item-title" }, "隐私政策"),
  9516. vue.createElementVNode("image", {
  9517. class: "arrow-icon",
  9518. src: _imports_3
  9519. })
  9520. ]),
  9521. vue.createElementVNode("view", { class: "list-item no-border" }, [
  9522. vue.createElementVNode("text", { class: "item-title" }, "版本更新"),
  9523. vue.createElementVNode("view", { class: "item-right" }, [
  9524. vue.createElementVNode("view", { class: "badge-yellow" }, "1"),
  9525. vue.createElementVNode("image", {
  9526. class: "arrow-icon",
  9527. src: _imports_3
  9528. })
  9529. ])
  9530. ])
  9531. ])
  9532. ]);
  9533. }
  9534. const PagesMineSettingsAboutIndex = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["render", _sfc_render$9], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/settings/about/index.vue"]]);
  9535. const _imports_1$2 = "/static/icons/wallet_white.svg";
  9536. const _imports_2$2 = "/static/icons/arrow_right_gray.svg";
  9537. const _sfc_main$9 = {
  9538. data() {
  9539. return {
  9540. currentTab: 0,
  9541. list: [
  9542. {
  9543. title: "订单服务费用",
  9544. desc: "订单 T1002839 完成结算",
  9545. time: "2026-02-03 14:30",
  9546. amount: "20.00",
  9547. type: "income",
  9548. tag: "订单"
  9549. },
  9550. {
  9551. title: "奖励费用",
  9552. desc: "早高峰冲单奖励",
  9553. time: "2026-02-03 10:00",
  9554. amount: "15.00",
  9555. type: "income",
  9556. tag: "奖励"
  9557. },
  9558. {
  9559. title: "惩罚金额",
  9560. desc: "超时送达扣款",
  9561. time: "2026-02-02 18:20",
  9562. amount: "-10.00",
  9563. type: "expense",
  9564. tag: "惩罚"
  9565. },
  9566. {
  9567. title: "后台转账",
  9568. desc: "2026年1月工资发放",
  9569. time: "2026-02-01 09:00",
  9570. amount: "3500.00",
  9571. type: "income",
  9572. tag: "工资"
  9573. }
  9574. ]
  9575. };
  9576. },
  9577. computed: {
  9578. displayList() {
  9579. if (this.currentTab === 0)
  9580. return this.list;
  9581. if (this.currentTab === 1)
  9582. return this.list.filter((item) => item.type === "income");
  9583. if (this.currentTab === 2)
  9584. return this.list.filter((item) => item.type === "expense");
  9585. return [];
  9586. }
  9587. },
  9588. methods: {
  9589. navBack() {
  9590. uni.navigateBack();
  9591. },
  9592. navToBill() {
  9593. uni.navigateTo({
  9594. url: "/pages/mine/wallet/bill"
  9595. });
  9596. },
  9597. switchTab(index) {
  9598. this.currentTab = index;
  9599. }
  9600. }
  9601. };
  9602. function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
  9603. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9604. vue.createElementVNode("view", { class: "nav-bar" }, [
  9605. vue.createElementVNode("view", {
  9606. class: "nav-left",
  9607. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9608. }, [
  9609. vue.createElementVNode("image", {
  9610. class: "back-icon",
  9611. src: _imports_0
  9612. })
  9613. ]),
  9614. vue.createElementVNode("text", { class: "nav-title" }, "我的钱包"),
  9615. vue.createElementVNode("view", { class: "nav-right" })
  9616. ]),
  9617. vue.createElementVNode("view", { class: "wallet-card" }, [
  9618. vue.createElementVNode("view", { class: "bg-circle big" }),
  9619. vue.createElementVNode("view", { class: "bg-circle small" }),
  9620. vue.createElementVNode("view", { class: "card-content" }, [
  9621. vue.createElementVNode("view", { class: "card-top" }, [
  9622. vue.createElementVNode("view", { class: "app-info" }, [
  9623. vue.createElementVNode("image", {
  9624. class: "app-logo",
  9625. src: _imports_1$2,
  9626. mode: "aspectFit"
  9627. }),
  9628. vue.createElementVNode("text", { class: "app-name" }, "履约者APP")
  9629. ]),
  9630. vue.createElementVNode("view", {
  9631. class: "bill-btn",
  9632. onClick: _cache[1] || (_cache[1] = (...args) => $options.navToBill && $options.navToBill(...args))
  9633. }, [
  9634. vue.createElementVNode("text", null, "账单")
  9635. ])
  9636. ]),
  9637. vue.createElementVNode("view", { class: "balance-container" }, [
  9638. vue.createElementVNode("view", { class: "balance-main" }, [
  9639. vue.createElementVNode("text", { class: "balance-label" }, "账户余额 (元)"),
  9640. vue.createElementVNode("text", { class: "balance-num" }, "2575.00")
  9641. ]),
  9642. vue.createElementVNode("view", { class: "balance-pending" }, [
  9643. vue.createElementVNode("text", { class: "pending-label" }, "待入账 (元)"),
  9644. vue.createElementVNode("text", { class: "pending-num" }, "580.00")
  9645. ])
  9646. ])
  9647. ])
  9648. ]),
  9649. vue.createElementVNode("view", { class: "record-container" }, [
  9650. vue.createElementVNode("view", { class: "record-header" }, [
  9651. vue.createElementVNode("text", { class: "header-title" }, "最近账户余额变动记录"),
  9652. vue.createElementVNode("view", {
  9653. class: "header-more",
  9654. onClick: _cache[2] || (_cache[2] = (...args) => $options.navToBill && $options.navToBill(...args))
  9655. }, [
  9656. vue.createElementVNode("text", null, "查看全部"),
  9657. vue.createElementVNode("image", {
  9658. class: "more-icon",
  9659. src: _imports_2$2
  9660. })
  9661. ])
  9662. ]),
  9663. vue.createElementVNode("view", { class: "tabs-row" }, [
  9664. vue.createElementVNode(
  9665. "view",
  9666. {
  9667. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 0 }]),
  9668. onClick: _cache[3] || (_cache[3] = ($event) => $options.switchTab(0))
  9669. },
  9670. [
  9671. vue.createElementVNode("text", null, "全部"),
  9672. $data.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  9673. key: 0,
  9674. class: "tab-line"
  9675. })) : vue.createCommentVNode("v-if", true)
  9676. ],
  9677. 2
  9678. /* CLASS */
  9679. ),
  9680. vue.createElementVNode(
  9681. "view",
  9682. {
  9683. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 1 }]),
  9684. onClick: _cache[4] || (_cache[4] = ($event) => $options.switchTab(1))
  9685. },
  9686. [
  9687. vue.createElementVNode("text", null, "收入"),
  9688. $data.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  9689. key: 0,
  9690. class: "tab-line"
  9691. })) : vue.createCommentVNode("v-if", true)
  9692. ],
  9693. 2
  9694. /* CLASS */
  9695. ),
  9696. vue.createElementVNode(
  9697. "view",
  9698. {
  9699. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 2 }]),
  9700. onClick: _cache[5] || (_cache[5] = ($event) => $options.switchTab(2))
  9701. },
  9702. [
  9703. vue.createElementVNode("text", null, "支出"),
  9704. $data.currentTab === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  9705. key: 0,
  9706. class: "tab-line"
  9707. })) : vue.createCommentVNode("v-if", true)
  9708. ],
  9709. 2
  9710. /* CLASS */
  9711. )
  9712. ]),
  9713. vue.createElementVNode("view", { class: "record-list" }, [
  9714. (vue.openBlock(true), vue.createElementBlock(
  9715. vue.Fragment,
  9716. null,
  9717. vue.renderList($options.displayList, (item, index) => {
  9718. return vue.openBlock(), vue.createElementBlock("view", {
  9719. class: "list-item",
  9720. key: index
  9721. }, [
  9722. vue.createElementVNode("view", { class: "item-left" }, [
  9723. vue.createElementVNode(
  9724. "text",
  9725. { class: "item-title" },
  9726. vue.toDisplayString(item.title),
  9727. 1
  9728. /* TEXT */
  9729. ),
  9730. vue.createElementVNode(
  9731. "text",
  9732. { class: "item-desc" },
  9733. vue.toDisplayString(item.desc),
  9734. 1
  9735. /* TEXT */
  9736. ),
  9737. vue.createElementVNode(
  9738. "text",
  9739. { class: "item-time" },
  9740. vue.toDisplayString(item.time),
  9741. 1
  9742. /* TEXT */
  9743. )
  9744. ]),
  9745. vue.createElementVNode("view", { class: "item-right" }, [
  9746. vue.createElementVNode(
  9747. "text",
  9748. {
  9749. class: vue.normalizeClass(["item-amount", { income: item.type === "income", expense: item.type === "expense" }])
  9750. },
  9751. vue.toDisplayString(item.type === "income" ? "+" : "") + vue.toDisplayString(item.amount),
  9752. 3
  9753. /* TEXT, CLASS */
  9754. ),
  9755. vue.createElementVNode("view", { class: "item-tag" }, [
  9756. vue.createElementVNode(
  9757. "text",
  9758. null,
  9759. vue.toDisplayString(item.tag),
  9760. 1
  9761. /* TEXT */
  9762. )
  9763. ])
  9764. ])
  9765. ]);
  9766. }),
  9767. 128
  9768. /* KEYED_FRAGMENT */
  9769. ))
  9770. ])
  9771. ])
  9772. ]);
  9773. }
  9774. const PagesMineWalletIndex = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["render", _sfc_render$8], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/wallet/index.vue"]]);
  9775. const _sfc_main$8 = {
  9776. data() {
  9777. return {
  9778. currentTab: 0,
  9779. // 模拟数据结构
  9780. groups: [
  9781. {
  9782. month: "2月 2026",
  9783. income: "35.00",
  9784. expense: "10.00",
  9785. items: [
  9786. {
  9787. title: "订单服务费用",
  9788. desc: "订单完成",
  9789. time: "02-03 14:30",
  9790. amount: "20.00",
  9791. type: "income",
  9792. tag: "订单"
  9793. },
  9794. {
  9795. title: "奖励费用",
  9796. desc: "早高峰奖励",
  9797. // shortened to match ui better
  9798. time: "02-03 10:00",
  9799. amount: "15.00",
  9800. type: "income",
  9801. tag: "奖励"
  9802. },
  9803. {
  9804. title: "惩罚金额",
  9805. desc: "超时送达",
  9806. time: "02-02 18:20",
  9807. amount: "-10.00",
  9808. type: "expense",
  9809. tag: "惩罚"
  9810. }
  9811. ]
  9812. },
  9813. {
  9814. month: "1月 2026",
  9815. income: "3500.00",
  9816. expense: "100.00",
  9817. items: [
  9818. {
  9819. title: "后台转账",
  9820. desc: "1月工资发放",
  9821. time: "01-31 09:00",
  9822. amount: "3500.00",
  9823. type: "income",
  9824. tag: "工资"
  9825. },
  9826. {
  9827. title: "装备扣款",
  9828. desc: "装备费用",
  9829. time: "01-15 10:00",
  9830. amount: "-100.00",
  9831. type: "expense",
  9832. tag: "扣款"
  9833. }
  9834. ]
  9835. }
  9836. ]
  9837. };
  9838. },
  9839. computed: {
  9840. displayGroups() {
  9841. if (this.currentTab === 0)
  9842. return this.groups;
  9843. return this.groups.map((group) => {
  9844. const filteredItems = group.items.filter((item) => {
  9845. const type = this.currentTab === 1 ? "income" : "expense";
  9846. return item.type === type;
  9847. });
  9848. return {
  9849. ...group,
  9850. items: filteredItems
  9851. };
  9852. }).filter((group) => group.items.length > 0);
  9853. }
  9854. },
  9855. methods: {
  9856. navBack() {
  9857. uni.navigateBack();
  9858. },
  9859. switchTab(index) {
  9860. this.currentTab = index;
  9861. }
  9862. }
  9863. };
  9864. function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
  9865. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9866. vue.createElementVNode("view", { class: "nav-bar" }, [
  9867. vue.createElementVNode("view", {
  9868. class: "nav-left",
  9869. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9870. }, [
  9871. vue.createElementVNode("image", {
  9872. class: "back-icon",
  9873. src: _imports_0
  9874. })
  9875. ]),
  9876. vue.createElementVNode("text", { class: "nav-title" }, "账单明细"),
  9877. vue.createElementVNode("view", { class: "nav-right" })
  9878. ]),
  9879. vue.createElementVNode("view", { class: "content-area" }, [
  9880. vue.createElementVNode("view", { class: "tabs-row" }, [
  9881. vue.createElementVNode(
  9882. "view",
  9883. {
  9884. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 0 }]),
  9885. onClick: _cache[1] || (_cache[1] = ($event) => $options.switchTab(0))
  9886. },
  9887. [
  9888. vue.createElementVNode("text", null, "全部"),
  9889. $data.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  9890. key: 0,
  9891. class: "tab-line"
  9892. })) : vue.createCommentVNode("v-if", true)
  9893. ],
  9894. 2
  9895. /* CLASS */
  9896. ),
  9897. vue.createElementVNode(
  9898. "view",
  9899. {
  9900. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 1 }]),
  9901. onClick: _cache[2] || (_cache[2] = ($event) => $options.switchTab(1))
  9902. },
  9903. [
  9904. vue.createElementVNode("text", null, "收入"),
  9905. $data.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  9906. key: 0,
  9907. class: "tab-line"
  9908. })) : vue.createCommentVNode("v-if", true)
  9909. ],
  9910. 2
  9911. /* CLASS */
  9912. ),
  9913. vue.createElementVNode(
  9914. "view",
  9915. {
  9916. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 2 }]),
  9917. onClick: _cache[3] || (_cache[3] = ($event) => $options.switchTab(2))
  9918. },
  9919. [
  9920. vue.createElementVNode("text", null, "支出"),
  9921. $data.currentTab === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  9922. key: 0,
  9923. class: "tab-line"
  9924. })) : vue.createCommentVNode("v-if", true)
  9925. ],
  9926. 2
  9927. /* CLASS */
  9928. )
  9929. ]),
  9930. vue.createElementVNode("scroll-view", {
  9931. "scroll-y": "",
  9932. class: "bill-list"
  9933. }, [
  9934. (vue.openBlock(true), vue.createElementBlock(
  9935. vue.Fragment,
  9936. null,
  9937. vue.renderList($options.displayGroups, (group, gIndex) => {
  9938. return vue.openBlock(), vue.createElementBlock("view", {
  9939. key: gIndex,
  9940. class: "month-group"
  9941. }, [
  9942. vue.createElementVNode("view", { class: "group-header" }, [
  9943. vue.createElementVNode(
  9944. "text",
  9945. { class: "month-title" },
  9946. vue.toDisplayString(group.month),
  9947. 1
  9948. /* TEXT */
  9949. ),
  9950. vue.createElementVNode(
  9951. "text",
  9952. { class: "month-summary" },
  9953. "收入 ¥" + vue.toDisplayString(group.income) + " 支出 ¥" + vue.toDisplayString(group.expense),
  9954. 1
  9955. /* TEXT */
  9956. )
  9957. ]),
  9958. (vue.openBlock(true), vue.createElementBlock(
  9959. vue.Fragment,
  9960. null,
  9961. vue.renderList(group.items, (item, index) => {
  9962. return vue.openBlock(), vue.createElementBlock("view", {
  9963. class: "list-item",
  9964. key: index
  9965. }, [
  9966. vue.createElementVNode(
  9967. "view",
  9968. {
  9969. class: vue.normalizeClass(["item-icon-box", item.type])
  9970. },
  9971. [
  9972. vue.createElementVNode(
  9973. "text",
  9974. { class: "item-icon-symbol" },
  9975. vue.toDisplayString(item.type === "income" ? "+" : "-"),
  9976. 1
  9977. /* TEXT */
  9978. )
  9979. ],
  9980. 2
  9981. /* CLASS */
  9982. ),
  9983. vue.createElementVNode("view", { class: "item-center" }, [
  9984. vue.createElementVNode(
  9985. "text",
  9986. { class: "item-title" },
  9987. vue.toDisplayString(item.title),
  9988. 1
  9989. /* TEXT */
  9990. ),
  9991. vue.createElementVNode(
  9992. "text",
  9993. { class: "item-desc" },
  9994. vue.toDisplayString(item.time) + " " + vue.toDisplayString(item.desc),
  9995. 1
  9996. /* TEXT */
  9997. )
  9998. ]),
  9999. vue.createElementVNode("view", { class: "item-right" }, [
  10000. vue.createElementVNode(
  10001. "text",
  10002. {
  10003. class: vue.normalizeClass(["item-amount", { income: item.type === "income", expense: item.type === "expense" }])
  10004. },
  10005. vue.toDisplayString(item.type === "income" ? "+" : "") + vue.toDisplayString(item.amount),
  10006. 3
  10007. /* TEXT, CLASS */
  10008. ),
  10009. vue.createElementVNode("view", { class: "item-tag" }, [
  10010. vue.createElementVNode(
  10011. "text",
  10012. null,
  10013. vue.toDisplayString(item.tag),
  10014. 1
  10015. /* TEXT */
  10016. )
  10017. ])
  10018. ])
  10019. ]);
  10020. }),
  10021. 128
  10022. /* KEYED_FRAGMENT */
  10023. ))
  10024. ]);
  10025. }),
  10026. 128
  10027. /* KEYED_FRAGMENT */
  10028. )),
  10029. vue.createElementVNode("view", { class: "list-padding-bottom" })
  10030. ])
  10031. ])
  10032. ]);
  10033. }
  10034. const PagesMineWalletBill = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["render", _sfc_render$7], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/wallet/bill.vue"]]);
  10035. const _sfc_main$7 = {
  10036. data() {
  10037. return {
  10038. currentIndex: 2,
  10039. // 默认选中 L3
  10040. levels: [
  10041. {
  10042. id: "L1",
  10043. name: "青铜履约者",
  10044. score: "需成长值 0",
  10045. isCurrent: false,
  10046. benefits: [
  10047. { name: "新手任务", desc: "完成新手任务可获得额外奖励", icon: "/static/icons/reward.svg" }
  10048. ]
  10049. },
  10050. {
  10051. id: "L2",
  10052. name: "白银履约者",
  10053. score: "需成长值 200",
  10054. isCurrent: false,
  10055. benefits: [
  10056. { name: "新手任务", desc: "完成新手任务可获得额外奖励", icon: "/static/icons/reward.svg" },
  10057. { name: "优先派单", desc: "系统将优先为您派送附近的优质订单", icon: "" }
  10058. ]
  10059. },
  10060. {
  10061. id: "L3",
  10062. name: "黄金履约者",
  10063. score: "需成长值 500",
  10064. isCurrent: true,
  10065. benefits: [
  10066. { name: "极速提现", desc: "提现申请 2 小时内极速到账,无需等待。", icon: "" },
  10067. { name: "晋升奖励", desc: "晋升等级可获得现金红包奖励。", icon: "/static/icons/reward.svg" },
  10068. { name: "优先派单", desc: "系统将优先为您派送附近的优质订单。", icon: "" }
  10069. ]
  10070. },
  10071. {
  10072. id: "L4",
  10073. name: "钻石履约者",
  10074. score: "需成长值 2000",
  10075. isCurrent: false,
  10076. benefits: [
  10077. { name: "专属客服", desc: "享受 7x24 小时专属客服通道。", icon: "/static/icons/service.svg" },
  10078. { name: "生日礼包", desc: "生日当天获赠专属礼包。", icon: "/static/icons/reward.svg" },
  10079. { name: "装备免费换", desc: "每年可免费更换一套履约装备。", icon: "" },
  10080. { name: "医疗互助", desc: "享受平台提供的医疗互助保障。", icon: "" }
  10081. ]
  10082. }
  10083. ],
  10084. isPopupShow: false,
  10085. currentBenefit: null
  10086. };
  10087. },
  10088. computed: {
  10089. currentLevel() {
  10090. return this.levels[this.currentIndex];
  10091. }
  10092. },
  10093. methods: {
  10094. navBack() {
  10095. uni.navigateBack({
  10096. delta: 1
  10097. });
  10098. },
  10099. swiperChange(e) {
  10100. this.currentIndex = e.detail.current;
  10101. },
  10102. changeLevel(index) {
  10103. this.currentIndex = index;
  10104. },
  10105. showBenefitDetail(benefit) {
  10106. this.currentBenefit = benefit;
  10107. this.isPopupShow = true;
  10108. },
  10109. closePopup() {
  10110. this.isPopupShow = false;
  10111. }
  10112. }
  10113. };
  10114. function _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) {
  10115. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10116. vue.createElementVNode("view", { class: "custom-header" }, [
  10117. vue.createElementVNode("view", {
  10118. class: "header-left",
  10119. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10120. }, [
  10121. vue.createElementVNode("image", {
  10122. class: "back-icon",
  10123. src: _imports_0,
  10124. style: { "transform": "rotate(180deg)" }
  10125. })
  10126. ]),
  10127. vue.createElementVNode("text", { class: "header-title" }, "履约者等级权益"),
  10128. vue.createElementVNode("view", { class: "header-right" })
  10129. ]),
  10130. vue.createElementVNode("view", { class: "header-placeholder" }),
  10131. vue.createElementVNode("view", { class: "swiper-container" }, [
  10132. vue.createElementVNode("swiper", {
  10133. class: "level-swiper",
  10134. "previous-margin": "80rpx",
  10135. "next-margin": "80rpx",
  10136. current: $data.currentIndex,
  10137. onChange: _cache[1] || (_cache[1] = (...args) => $options.swiperChange && $options.swiperChange(...args))
  10138. }, [
  10139. (vue.openBlock(true), vue.createElementBlock(
  10140. vue.Fragment,
  10141. null,
  10142. vue.renderList($data.levels, (level, index) => {
  10143. return vue.openBlock(), vue.createElementBlock("swiper-item", {
  10144. key: index,
  10145. onClick: ($event) => $options.changeLevel(index)
  10146. }, [
  10147. vue.createElementVNode(
  10148. "view",
  10149. {
  10150. class: vue.normalizeClass(["level-card", "level-card-" + (index + 1)]),
  10151. style: vue.normalizeStyle({ transform: $data.currentIndex === index ? "scale(1)" : "scale(0.9)" })
  10152. },
  10153. [
  10154. vue.createElementVNode("view", { class: "card-content" }, [
  10155. vue.createElementVNode("view", { class: "card-header" }, [
  10156. vue.createElementVNode(
  10157. "view",
  10158. { class: "level-badge" },
  10159. vue.toDisplayString(level.id),
  10160. 1
  10161. /* TEXT */
  10162. ),
  10163. level.isCurrent ? (vue.openBlock(), vue.createElementBlock("view", {
  10164. key: 0,
  10165. class: "current-badge"
  10166. }, "当前等级")) : vue.createCommentVNode("v-if", true)
  10167. ]),
  10168. vue.createElementVNode(
  10169. "text",
  10170. { class: "level-name" },
  10171. vue.toDisplayString(level.name),
  10172. 1
  10173. /* TEXT */
  10174. ),
  10175. vue.createElementVNode(
  10176. "text",
  10177. { class: "level-score" },
  10178. vue.toDisplayString(level.score),
  10179. 1
  10180. /* TEXT */
  10181. ),
  10182. vue.createElementVNode("image", {
  10183. class: "crown-overlay",
  10184. src: _imports_1$4,
  10185. mode: "aspectFit"
  10186. })
  10187. ])
  10188. ],
  10189. 6
  10190. /* CLASS, STYLE */
  10191. )
  10192. ], 8, ["onClick"]);
  10193. }),
  10194. 128
  10195. /* KEYED_FRAGMENT */
  10196. ))
  10197. ], 40, ["current"]),
  10198. vue.createElementVNode("view", { class: "swiper-dots" }, [
  10199. (vue.openBlock(true), vue.createElementBlock(
  10200. vue.Fragment,
  10201. null,
  10202. vue.renderList($data.levels, (item, index) => {
  10203. return vue.openBlock(), vue.createElementBlock(
  10204. "view",
  10205. {
  10206. class: vue.normalizeClass(["dot", { active: $data.currentIndex === index }]),
  10207. key: index
  10208. },
  10209. null,
  10210. 2
  10211. /* CLASS */
  10212. );
  10213. }),
  10214. 128
  10215. /* KEYED_FRAGMENT */
  10216. ))
  10217. ])
  10218. ]),
  10219. vue.createElementVNode("view", { class: "benefits-title-row" }, [
  10220. vue.createElementVNode(
  10221. "text",
  10222. { class: "benefits-title" },
  10223. vue.toDisplayString($options.currentLevel.id) + " 专属权益",
  10224. 1
  10225. /* TEXT */
  10226. ),
  10227. vue.createElementVNode(
  10228. "text",
  10229. { class: "benefits-count" },
  10230. "(" + vue.toDisplayString($options.currentLevel.benefits.length) + ")",
  10231. 1
  10232. /* TEXT */
  10233. )
  10234. ]),
  10235. vue.createElementVNode("view", { class: "benefits-grid" }, [
  10236. (vue.openBlock(true), vue.createElementBlock(
  10237. vue.Fragment,
  10238. null,
  10239. vue.renderList($options.currentLevel.benefits, (benefit, index) => {
  10240. return vue.openBlock(), vue.createElementBlock("view", {
  10241. class: "benefit-item",
  10242. key: index,
  10243. onClick: ($event) => $options.showBenefitDetail(benefit)
  10244. }, [
  10245. vue.createElementVNode("view", { class: "benefit-icon-wrapper" }, [
  10246. benefit.icon ? (vue.openBlock(), vue.createElementBlock("image", {
  10247. key: 0,
  10248. class: "benefit-icon",
  10249. src: benefit.icon,
  10250. mode: "aspectFit"
  10251. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock(
  10252. "view",
  10253. {
  10254. key: 1,
  10255. class: "benefit-icon-placeholder"
  10256. },
  10257. vue.toDisplayString(benefit.name[0]),
  10258. 1
  10259. /* TEXT */
  10260. ))
  10261. ]),
  10262. vue.createElementVNode(
  10263. "text",
  10264. { class: "benefit-name" },
  10265. vue.toDisplayString(benefit.name),
  10266. 1
  10267. /* TEXT */
  10268. )
  10269. ], 8, ["onClick"]);
  10270. }),
  10271. 128
  10272. /* KEYED_FRAGMENT */
  10273. ))
  10274. ]),
  10275. vue.createElementVNode(
  10276. "view",
  10277. {
  10278. class: vue.normalizeClass(["popup-mask", { "show": $data.isPopupShow }]),
  10279. onClick: _cache[4] || (_cache[4] = (...args) => $options.closePopup && $options.closePopup(...args)),
  10280. onTouchmove: _cache[5] || (_cache[5] = vue.withModifiers(() => {
  10281. }, ["stop", "prevent"]))
  10282. },
  10283. [
  10284. vue.createElementVNode("view", {
  10285. class: "popup-modal",
  10286. onClick: _cache[3] || (_cache[3] = vue.withModifiers(() => {
  10287. }, ["stop"]))
  10288. }, [
  10289. vue.createElementVNode("view", { class: "popup-icon-wrapper" }, [
  10290. $data.currentBenefit && $data.currentBenefit.icon ? (vue.openBlock(), vue.createElementBlock("image", {
  10291. key: 0,
  10292. class: "benefit-icon-large",
  10293. src: $data.currentBenefit.icon,
  10294. mode: "aspectFit"
  10295. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock(
  10296. "view",
  10297. {
  10298. key: 1,
  10299. class: "benefit-icon-placeholder-large"
  10300. },
  10301. vue.toDisplayString($data.currentBenefit ? $data.currentBenefit.name[0] : ""),
  10302. 1
  10303. /* TEXT */
  10304. ))
  10305. ]),
  10306. vue.createElementVNode(
  10307. "text",
  10308. { class: "popup-title" },
  10309. vue.toDisplayString($data.currentBenefit ? $data.currentBenefit.name : ""),
  10310. 1
  10311. /* TEXT */
  10312. ),
  10313. vue.createElementVNode(
  10314. "text",
  10315. { class: "popup-desc" },
  10316. vue.toDisplayString($data.currentBenefit ? $data.currentBenefit.desc : ""),
  10317. 1
  10318. /* TEXT */
  10319. ),
  10320. vue.createElementVNode("button", {
  10321. class: "popup-btn",
  10322. onClick: _cache[2] || (_cache[2] = (...args) => $options.closePopup && $options.closePopup(...args))
  10323. }, "我知道了")
  10324. ])
  10325. ],
  10326. 34
  10327. /* CLASS, NEED_HYDRATION */
  10328. )
  10329. ]);
  10330. }
  10331. const PagesMineLevelIndex = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["render", _sfc_render$6], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/level/index.vue"]]);
  10332. const _imports_1$1 = "/static/icons/icon_order_msg.svg";
  10333. const _imports_2$1 = "/static/icons/icon_system_msg.svg";
  10334. const _sfc_main$6 = {
  10335. data() {
  10336. return {};
  10337. },
  10338. methods: {
  10339. navBack() {
  10340. uni.navigateBack();
  10341. },
  10342. navToOrderMsg() {
  10343. uni.navigateTo({
  10344. url: "/pages/mine/message/order"
  10345. });
  10346. },
  10347. navToSystemMsg() {
  10348. uni.navigateTo({
  10349. url: "/pages/mine/message/system"
  10350. });
  10351. }
  10352. }
  10353. };
  10354. function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
  10355. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10356. vue.createElementVNode("view", { class: "nav-bar" }, [
  10357. vue.createElementVNode("view", {
  10358. class: "nav-left",
  10359. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10360. }, [
  10361. vue.createElementVNode("image", {
  10362. class: "back-icon",
  10363. src: _imports_0,
  10364. style: { "transform": "rotate(180deg)" }
  10365. })
  10366. ]),
  10367. vue.createElementVNode("text", { class: "nav-title" }, "消息中心"),
  10368. vue.createElementVNode("view", { class: "nav-right" }, [
  10369. vue.createElementVNode("view", { class: "more-dots" }, [
  10370. vue.createElementVNode("view", { class: "dot" }),
  10371. vue.createElementVNode("view", { class: "dot" }),
  10372. vue.createElementVNode("view", { class: "dot" })
  10373. ])
  10374. ])
  10375. ]),
  10376. vue.createElementVNode("view", { class: "nav-placeholder" }),
  10377. vue.createElementVNode("view", { class: "message-list" }, [
  10378. vue.createElementVNode("view", {
  10379. class: "message-item",
  10380. onClick: _cache[1] || (_cache[1] = (...args) => $options.navToOrderMsg && $options.navToOrderMsg(...args))
  10381. }, [
  10382. vue.createElementVNode("view", { class: "icon-wrapper" }, [
  10383. vue.createElementVNode("image", {
  10384. class: "msg-icon",
  10385. src: _imports_1$1
  10386. }),
  10387. vue.createElementVNode("view", { class: "red-dot-badge" })
  10388. ]),
  10389. vue.createElementVNode("view", { class: "content-wrapper" }, [
  10390. vue.createElementVNode("view", { class: "top-row" }, [
  10391. vue.createElementVNode("text", { class: "msg-title" }, "订单消息"),
  10392. vue.createElementVNode("text", { class: "msg-time" }, "5分钟前")
  10393. ]),
  10394. vue.createElementVNode("text", { class: "msg-preview" }, "你收到一个站长手动派单的新订单")
  10395. ])
  10396. ]),
  10397. vue.createElementVNode("view", {
  10398. class: "message-item",
  10399. onClick: _cache[2] || (_cache[2] = (...args) => $options.navToSystemMsg && $options.navToSystemMsg(...args))
  10400. }, [
  10401. vue.createElementVNode("view", { class: "icon-wrapper" }, [
  10402. vue.createElementVNode("image", {
  10403. class: "msg-icon",
  10404. src: _imports_2$1
  10405. })
  10406. ]),
  10407. vue.createElementVNode("view", { class: "content-wrapper" }, [
  10408. vue.createElementVNode("view", { class: "top-row" }, [
  10409. vue.createElementVNode("text", { class: "msg-title" }, "系统消息"),
  10410. vue.createElementVNode("text", { class: "msg-time" }, "7天前")
  10411. ]),
  10412. vue.createElementVNode("text", { class: "msg-preview" }, "你的健康证明认证审核已通过。")
  10413. ])
  10414. ])
  10415. ])
  10416. ]);
  10417. }
  10418. const PagesMineMessageIndex = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["render", _sfc_render$5], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/message/index.vue"]]);
  10419. const _sfc_main$5 = {
  10420. methods: {
  10421. navBack() {
  10422. uni.navigateBack();
  10423. }
  10424. }
  10425. };
  10426. function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {
  10427. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10428. vue.createElementVNode("view", { class: "nav-bar" }, [
  10429. vue.createElementVNode("view", {
  10430. class: "nav-left",
  10431. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10432. }, [
  10433. vue.createElementVNode("image", {
  10434. class: "back-icon",
  10435. src: _imports_0,
  10436. style: { "transform": "rotate(180deg)" }
  10437. })
  10438. ]),
  10439. vue.createElementVNode("text", { class: "nav-title" }, "订单消息"),
  10440. vue.createElementVNode("view", { class: "nav-right" })
  10441. ]),
  10442. vue.createElementVNode("view", { class: "nav-placeholder" }),
  10443. vue.createElementVNode("view", { class: "msg-group" }, [
  10444. vue.createElementVNode("view", { class: "date-label" }, "2099-12-28"),
  10445. vue.createElementVNode("view", { class: "msg-card" }, [
  10446. vue.createElementVNode("view", { class: "card-header" }, [
  10447. vue.createElementVNode("text", { class: "card-title" }, "站长手动派单"),
  10448. vue.createElementVNode("view", { class: "red-dot" })
  10449. ]),
  10450. vue.createElementVNode("view", { class: "card-body" }, [
  10451. vue.createElementVNode("text", { class: "msg-text" }, "你收到一个新订单,请及时查看并接单。")
  10452. ]),
  10453. vue.createElementVNode("view", { class: "card-footer" }, [
  10454. vue.createElementVNode("text", { class: "order-id" }, "订单: 2099091503521"),
  10455. vue.createElementVNode("image", {
  10456. class: "arrow-icon",
  10457. src: _imports_3
  10458. })
  10459. ])
  10460. ]),
  10461. vue.createElementVNode("view", { class: "msg-card" }, [
  10462. vue.createElementVNode("view", { class: "card-header" }, [
  10463. vue.createElementVNode("text", { class: "card-title" }, "系统自动派单")
  10464. ]),
  10465. vue.createElementVNode("view", { class: "card-body" }, [
  10466. vue.createElementVNode("text", { class: "msg-text" }, "你收到一个新订单,请及时查看并接单。")
  10467. ]),
  10468. vue.createElementVNode("view", { class: "card-footer" }, [
  10469. vue.createElementVNode("text", { class: "order-id" }, "订单: 2099091503523"),
  10470. vue.createElementVNode("image", {
  10471. class: "arrow-icon",
  10472. src: _imports_3
  10473. })
  10474. ])
  10475. ])
  10476. ]),
  10477. vue.createElementVNode("view", { class: "msg-group" }, [
  10478. vue.createElementVNode("view", { class: "date-label" }, "2099-12-27"),
  10479. vue.createElementVNode("view", { class: "msg-card" }, [
  10480. vue.createElementVNode("view", { class: "card-header" }, [
  10481. vue.createElementVNode("text", { class: "card-title" }, "系统取消派单")
  10482. ]),
  10483. vue.createElementVNode("view", { class: "card-body" }, [
  10484. vue.createElementVNode("text", { class: "msg-text" }, "订单由于超时未接单已被系统取消。")
  10485. ]),
  10486. vue.createElementVNode("view", { class: "card-footer" }, [
  10487. vue.createElementVNode("text", { class: "order-id" }, "订单: 2099091503111"),
  10488. vue.createElementVNode("image", {
  10489. class: "arrow-icon",
  10490. src: _imports_3
  10491. })
  10492. ])
  10493. ])
  10494. ])
  10495. ]);
  10496. }
  10497. const PagesMineMessageOrder = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["render", _sfc_render$4], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/message/order.vue"]]);
  10498. const _sfc_main$4 = {
  10499. methods: {
  10500. navBack() {
  10501. uni.navigateBack();
  10502. },
  10503. navToDetail() {
  10504. uni.navigateTo({
  10505. url: "/pages/mine/message/detail"
  10506. });
  10507. }
  10508. }
  10509. };
  10510. function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
  10511. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10512. vue.createElementVNode("view", { class: "nav-bar" }, [
  10513. vue.createElementVNode("view", {
  10514. class: "nav-left",
  10515. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10516. }, [
  10517. vue.createElementVNode("image", {
  10518. class: "back-icon",
  10519. src: _imports_0,
  10520. style: { "transform": "rotate(180deg)" }
  10521. })
  10522. ]),
  10523. vue.createElementVNode("text", { class: "nav-title" }, "系统消息"),
  10524. vue.createElementVNode("view", { class: "nav-right" })
  10525. ]),
  10526. vue.createElementVNode("view", { class: "nav-placeholder" }),
  10527. vue.createElementVNode("view", { class: "sys-msg-list" }, [
  10528. vue.createElementVNode("view", { class: "date-label" }, "2023-11-01"),
  10529. vue.createElementVNode("view", {
  10530. class: "sys-card",
  10531. onClick: _cache[1] || (_cache[1] = (...args) => $options.navToDetail && $options.navToDetail(...args))
  10532. }, [
  10533. vue.createElementVNode("view", { class: "sys-header" }, [
  10534. vue.createElementVNode("text", { class: "sys-title" }, "账号审核通过"),
  10535. vue.createElementVNode("view", { class: "red-dot" })
  10536. ]),
  10537. vue.createElementVNode("view", { class: "sys-content" }, [
  10538. vue.createElementVNode("text", { class: "sys-text" }, "恭喜,您的健康证已通过审核,现在可以开始接单了。")
  10539. ]),
  10540. vue.createElementVNode("view", { class: "sys-footer" }, [
  10541. vue.createElementVNode("text", { class: "sys-time" }, "10:00"),
  10542. vue.createElementVNode("view", { class: "check-more" }, [
  10543. vue.createElementVNode("text", null, "查看详情"),
  10544. vue.createElementVNode("image", {
  10545. class: "arrow-icon-small",
  10546. src: _imports_3
  10547. })
  10548. ])
  10549. ])
  10550. ]),
  10551. vue.createElementVNode("view", { class: "sys-card" }, [
  10552. vue.createElementVNode("view", { class: "sys-header" }, [
  10553. vue.createElementVNode("text", { class: "sys-title" }, "活动奖励到账")
  10554. ]),
  10555. vue.createElementVNode("view", { class: "sys-content" }, [
  10556. vue.createElementVNode("text", { class: "sys-text" }, "您参与的“新手启航”活动奖励金 ¥50 已发放到您的账户。")
  10557. ]),
  10558. vue.createElementVNode("view", { class: "sys-footer" }, [
  10559. vue.createElementVNode("text", { class: "sys-time" }, "09:15"),
  10560. vue.createElementVNode("view", { class: "check-more" }, [
  10561. vue.createElementVNode("text", null, "查看详情"),
  10562. vue.createElementVNode("image", {
  10563. class: "arrow-icon-small",
  10564. src: _imports_3
  10565. })
  10566. ])
  10567. ])
  10568. ]),
  10569. vue.createElementVNode("view", { class: "date-label" }, "2023-10-30"),
  10570. vue.createElementVNode("view", { class: "sys-card" }, [
  10571. vue.createElementVNode("view", { class: "sys-header" }, [
  10572. vue.createElementVNode("text", { class: "sys-title" }, "系统维护通知")
  10573. ]),
  10574. vue.createElementVNode("view", { class: "sys-content" }, [
  10575. vue.createElementVNode("text", { class: "sys-text" }, "平台将于 11月5日 凌晨 02:00-04:00 进行系统维护,届时将无法接单。")
  10576. ]),
  10577. vue.createElementVNode("view", { class: "sys-footer" }, [
  10578. vue.createElementVNode("text", { class: "sys-time" }, "18:30"),
  10579. vue.createElementVNode("view", { class: "check-more" }, [
  10580. vue.createElementVNode("text", null, "查看详情"),
  10581. vue.createElementVNode("image", {
  10582. class: "arrow-icon-small",
  10583. src: _imports_3
  10584. })
  10585. ])
  10586. ])
  10587. ])
  10588. ])
  10589. ]);
  10590. }
  10591. const PagesMineMessageSystem = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["render", _sfc_render$3], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/message/system.vue"]]);
  10592. const _sfc_main$3 = {
  10593. methods: {
  10594. navBack() {
  10595. uni.navigateBack();
  10596. }
  10597. }
  10598. };
  10599. function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
  10600. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10601. vue.createElementVNode("view", { class: "nav-bar" }, [
  10602. vue.createElementVNode("view", {
  10603. class: "nav-left",
  10604. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10605. }, [
  10606. vue.createElementVNode("image", {
  10607. class: "back-icon",
  10608. src: _imports_0,
  10609. style: { "transform": "rotate(180deg)" }
  10610. })
  10611. ]),
  10612. vue.createElementVNode("text", { class: "nav-title" }, "消息详情"),
  10613. vue.createElementVNode("view", { class: "nav-right" })
  10614. ]),
  10615. vue.createElementVNode("view", { class: "nav-placeholder" }),
  10616. vue.createElementVNode("view", { class: "detail-content" }, [
  10617. vue.createElementVNode("text", { class: "detail-title" }, "账号审核通过"),
  10618. vue.createElementVNode("text", { class: "detail-time" }, "2023-11-01 10:00"),
  10619. vue.createElementVNode("view", { class: "detail-body" }, [
  10620. vue.createElementVNode("text", null, "尊敬的用户,您的健康认证资料已通过平台审核。作为履约者,您现在可以正常接收并处理订单。请确保您熟读平台规则,遵守交通法规,安全配送。祝您工作愉快!")
  10621. ]),
  10622. vue.createElementVNode("view", { class: "detail-footer" }, [
  10623. vue.createElementVNode("view", { class: "divider" }),
  10624. vue.createElementVNode("text", { class: "footer-text" }, "如有疑问,请咨询在线客服。")
  10625. ])
  10626. ])
  10627. ]);
  10628. }
  10629. const PagesMineMessageDetail = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["render", _sfc_render$2], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/message/detail.vue"]]);
  10630. const _imports_1 = "/static/icons/diamond_white.svg";
  10631. const _imports_2 = "/static/icons/star_decor.svg";
  10632. const _sfc_main$2 = {
  10633. data() {
  10634. return {
  10635. currentTab: 0,
  10636. list: [
  10637. {
  10638. title: "订单完成奖励",
  10639. desc: "订单 T1002839 完成",
  10640. time: "2026-02-05 18:42",
  10641. amount: "10",
  10642. type: "income",
  10643. tag: "订单"
  10644. },
  10645. {
  10646. title: "好评奖励",
  10647. desc: "获得五星好评",
  10648. time: "2026-02-05 19:00",
  10649. amount: "5",
  10650. type: "income",
  10651. tag: "奖励"
  10652. },
  10653. {
  10654. title: "超时扣分",
  10655. desc: "订单 T1002830 超时送达",
  10656. time: "2026-02-04 10:20",
  10657. amount: "-10",
  10658. type: "expense",
  10659. tag: "惩罚"
  10660. }
  10661. ]
  10662. };
  10663. },
  10664. computed: {
  10665. displayList() {
  10666. if (this.currentTab === 0)
  10667. return this.list;
  10668. const type = this.currentTab === 1 ? "income" : "expense";
  10669. return this.list.filter((item) => item.type === type);
  10670. }
  10671. },
  10672. methods: {
  10673. navBack() {
  10674. uni.navigateBack();
  10675. },
  10676. navToDetail() {
  10677. uni.navigateTo({
  10678. url: "/pages/mine/points/detail"
  10679. });
  10680. },
  10681. navToEquity() {
  10682. },
  10683. switchTab(index) {
  10684. this.currentTab = index;
  10685. }
  10686. }
  10687. };
  10688. function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
  10689. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10690. vue.createElementVNode("view", { class: "nav-bar" }, [
  10691. vue.createElementVNode("view", {
  10692. class: "nav-left",
  10693. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10694. }, [
  10695. vue.createElementVNode("image", {
  10696. class: "back-icon",
  10697. src: _imports_0
  10698. })
  10699. ]),
  10700. vue.createElementVNode("text", { class: "nav-title" }, "我的积分"),
  10701. vue.createElementVNode("view", { class: "nav-right" })
  10702. ]),
  10703. vue.createElementVNode("view", { class: "points-card" }, [
  10704. vue.createElementVNode("view", { class: "card-header" }, [
  10705. vue.createElementVNode("view", {
  10706. class: "equity-btn",
  10707. onClick: _cache[1] || (_cache[1] = (...args) => $options.navToEquity && $options.navToEquity(...args))
  10708. }, [
  10709. vue.createElementVNode("image", {
  10710. class: "equity-icon",
  10711. src: _imports_1
  10712. }),
  10713. vue.createElementVNode("text", null, "积分权益")
  10714. ]),
  10715. vue.createElementVNode("view", {
  10716. class: "detail-link",
  10717. onClick: _cache[2] || (_cache[2] = (...args) => $options.navToDetail && $options.navToDetail(...args))
  10718. }, [
  10719. vue.createElementVNode("text", null, "明细")
  10720. ])
  10721. ]),
  10722. vue.createElementVNode("view", { class: "card-body" }, [
  10723. vue.createElementVNode("text", { class: "label" }, "当前积分"),
  10724. vue.createElementVNode("text", { class: "value" }, "1200")
  10725. ]),
  10726. vue.createElementVNode("image", {
  10727. class: "bg-decor",
  10728. src: _imports_2,
  10729. mode: "aspectFit"
  10730. })
  10731. ]),
  10732. vue.createElementVNode("view", { class: "record-container" }, [
  10733. vue.createElementVNode("view", { class: "record-header" }, [
  10734. vue.createElementVNode("text", { class: "header-title" }, "最近积分变动"),
  10735. vue.createElementVNode("view", {
  10736. class: "header-more",
  10737. onClick: _cache[3] || (_cache[3] = (...args) => $options.navToDetail && $options.navToDetail(...args))
  10738. }, [
  10739. vue.createElementVNode("text", null, "查看全部"),
  10740. vue.createElementVNode("image", {
  10741. class: "more-icon",
  10742. src: _imports_3
  10743. })
  10744. ])
  10745. ]),
  10746. vue.createElementVNode("view", { class: "tabs-row" }, [
  10747. vue.createElementVNode(
  10748. "view",
  10749. {
  10750. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 0 }]),
  10751. onClick: _cache[4] || (_cache[4] = ($event) => $options.switchTab(0))
  10752. },
  10753. [
  10754. vue.createElementVNode("text", null, "全部"),
  10755. $data.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  10756. key: 0,
  10757. class: "tab-line"
  10758. })) : vue.createCommentVNode("v-if", true)
  10759. ],
  10760. 2
  10761. /* CLASS */
  10762. ),
  10763. vue.createElementVNode(
  10764. "view",
  10765. {
  10766. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 1 }]),
  10767. onClick: _cache[5] || (_cache[5] = ($event) => $options.switchTab(1))
  10768. },
  10769. [
  10770. vue.createElementVNode("text", null, "获取"),
  10771. $data.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  10772. key: 0,
  10773. class: "tab-line"
  10774. })) : vue.createCommentVNode("v-if", true)
  10775. ],
  10776. 2
  10777. /* CLASS */
  10778. ),
  10779. vue.createElementVNode(
  10780. "view",
  10781. {
  10782. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 2 }]),
  10783. onClick: _cache[6] || (_cache[6] = ($event) => $options.switchTab(2))
  10784. },
  10785. [
  10786. vue.createElementVNode("text", null, "扣减"),
  10787. $data.currentTab === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  10788. key: 0,
  10789. class: "tab-line"
  10790. })) : vue.createCommentVNode("v-if", true)
  10791. ],
  10792. 2
  10793. /* CLASS */
  10794. )
  10795. ]),
  10796. vue.createElementVNode("view", { class: "record-list" }, [
  10797. (vue.openBlock(true), vue.createElementBlock(
  10798. vue.Fragment,
  10799. null,
  10800. vue.renderList($options.displayList, (item, index) => {
  10801. return vue.openBlock(), vue.createElementBlock("view", {
  10802. class: "list-item",
  10803. key: index
  10804. }, [
  10805. vue.createElementVNode("view", { class: "item-left" }, [
  10806. vue.createElementVNode(
  10807. "text",
  10808. { class: "item-title" },
  10809. vue.toDisplayString(item.title),
  10810. 1
  10811. /* TEXT */
  10812. ),
  10813. vue.createElementVNode(
  10814. "text",
  10815. { class: "item-desc" },
  10816. vue.toDisplayString(item.desc),
  10817. 1
  10818. /* TEXT */
  10819. ),
  10820. vue.createElementVNode(
  10821. "text",
  10822. { class: "item-time" },
  10823. vue.toDisplayString(item.time),
  10824. 1
  10825. /* TEXT */
  10826. )
  10827. ]),
  10828. vue.createElementVNode("view", { class: "item-right" }, [
  10829. vue.createElementVNode(
  10830. "text",
  10831. {
  10832. class: vue.normalizeClass(["item-amount", { income: item.type === "income", expense: item.type === "expense" }])
  10833. },
  10834. vue.toDisplayString(item.type === "income" ? "+" : "") + vue.toDisplayString(item.amount),
  10835. 3
  10836. /* TEXT, CLASS */
  10837. ),
  10838. vue.createElementVNode("view", { class: "item-tag" }, [
  10839. vue.createElementVNode(
  10840. "text",
  10841. null,
  10842. vue.toDisplayString(item.tag),
  10843. 1
  10844. /* TEXT */
  10845. )
  10846. ])
  10847. ])
  10848. ]);
  10849. }),
  10850. 128
  10851. /* KEYED_FRAGMENT */
  10852. ))
  10853. ])
  10854. ])
  10855. ]);
  10856. }
  10857. const PagesMinePointsIndex = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$1], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/points/index.vue"]]);
  10858. const _sfc_main$1 = {
  10859. data() {
  10860. return {
  10861. currentTab: 0,
  10862. // 模拟数据结构
  10863. groups: [
  10864. {
  10865. month: "2月 2026",
  10866. income: "15",
  10867. expense: "10",
  10868. items: [
  10869. {
  10870. title: "订单完成奖励",
  10871. desc: "订单完成",
  10872. time: "02-05 18:42",
  10873. amount: "10",
  10874. type: "income",
  10875. tag: "订单"
  10876. },
  10877. {
  10878. title: "好评奖励",
  10879. desc: "五星好评",
  10880. time: "02-05 19:00",
  10881. amount: "5",
  10882. type: "income",
  10883. tag: "奖励"
  10884. },
  10885. {
  10886. title: "超时扣分",
  10887. desc: "订单超时",
  10888. time: "02-04 10:20",
  10889. amount: "-10",
  10890. type: "expense",
  10891. tag: "惩罚"
  10892. }
  10893. ]
  10894. },
  10895. {
  10896. month: "1月 2026",
  10897. income: "100",
  10898. expense: "0",
  10899. items: [
  10900. {
  10901. title: "新用户奖励",
  10902. desc: "注册赠送",
  10903. time: "01-10 09:00",
  10904. amount: "100",
  10905. type: "income",
  10906. tag: "系统"
  10907. }
  10908. ]
  10909. }
  10910. ]
  10911. };
  10912. },
  10913. computed: {
  10914. displayGroups() {
  10915. if (this.currentTab === 0)
  10916. return this.groups;
  10917. return this.groups.map((group) => {
  10918. const filteredItems = group.items.filter((item) => {
  10919. const type = this.currentTab === 1 ? "income" : "expense";
  10920. return item.type === type;
  10921. });
  10922. return {
  10923. ...group,
  10924. items: filteredItems
  10925. };
  10926. }).filter((group) => group.items.length > 0);
  10927. }
  10928. },
  10929. methods: {
  10930. navBack() {
  10931. uni.navigateBack();
  10932. },
  10933. switchTab(index) {
  10934. this.currentTab = index;
  10935. }
  10936. }
  10937. };
  10938. function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  10939. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10940. vue.createElementVNode("view", { class: "nav-bar" }, [
  10941. vue.createElementVNode("view", {
  10942. class: "nav-left",
  10943. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10944. }, [
  10945. vue.createElementVNode("image", {
  10946. class: "back-icon",
  10947. src: _imports_0
  10948. })
  10949. ]),
  10950. vue.createElementVNode("text", { class: "nav-title" }, "积分明细"),
  10951. vue.createElementVNode("view", { class: "nav-right" })
  10952. ]),
  10953. vue.createElementVNode("view", { class: "content-area" }, [
  10954. vue.createElementVNode("view", { class: "tabs-row" }, [
  10955. vue.createElementVNode(
  10956. "view",
  10957. {
  10958. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 0 }]),
  10959. onClick: _cache[1] || (_cache[1] = ($event) => $options.switchTab(0))
  10960. },
  10961. [
  10962. vue.createElementVNode("text", null, "全部"),
  10963. $data.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  10964. key: 0,
  10965. class: "tab-line"
  10966. })) : vue.createCommentVNode("v-if", true)
  10967. ],
  10968. 2
  10969. /* CLASS */
  10970. ),
  10971. vue.createElementVNode(
  10972. "view",
  10973. {
  10974. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 1 }]),
  10975. onClick: _cache[2] || (_cache[2] = ($event) => $options.switchTab(1))
  10976. },
  10977. [
  10978. vue.createElementVNode("text", null, "获取"),
  10979. $data.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  10980. key: 0,
  10981. class: "tab-line"
  10982. })) : vue.createCommentVNode("v-if", true)
  10983. ],
  10984. 2
  10985. /* CLASS */
  10986. ),
  10987. vue.createElementVNode(
  10988. "view",
  10989. {
  10990. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 2 }]),
  10991. onClick: _cache[3] || (_cache[3] = ($event) => $options.switchTab(2))
  10992. },
  10993. [
  10994. vue.createElementVNode("text", null, "扣减"),
  10995. $data.currentTab === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  10996. key: 0,
  10997. class: "tab-line"
  10998. })) : vue.createCommentVNode("v-if", true)
  10999. ],
  11000. 2
  11001. /* CLASS */
  11002. )
  11003. ]),
  11004. vue.createElementVNode("scroll-view", {
  11005. "scroll-y": "",
  11006. class: "bill-list"
  11007. }, [
  11008. (vue.openBlock(true), vue.createElementBlock(
  11009. vue.Fragment,
  11010. null,
  11011. vue.renderList($options.displayGroups, (group, gIndex) => {
  11012. return vue.openBlock(), vue.createElementBlock("view", {
  11013. key: gIndex,
  11014. class: "month-group"
  11015. }, [
  11016. vue.createElementVNode("view", { class: "group-header" }, [
  11017. vue.createElementVNode(
  11018. "text",
  11019. { class: "month-title" },
  11020. vue.toDisplayString(group.month),
  11021. 1
  11022. /* TEXT */
  11023. ),
  11024. vue.createElementVNode(
  11025. "text",
  11026. { class: "month-summary" },
  11027. "获取 " + vue.toDisplayString(group.income) + " 扣减 " + vue.toDisplayString(group.expense),
  11028. 1
  11029. /* TEXT */
  11030. )
  11031. ]),
  11032. (vue.openBlock(true), vue.createElementBlock(
  11033. vue.Fragment,
  11034. null,
  11035. vue.renderList(group.items, (item, index) => {
  11036. return vue.openBlock(), vue.createElementBlock("view", {
  11037. class: "list-item",
  11038. key: index
  11039. }, [
  11040. vue.createElementVNode(
  11041. "view",
  11042. {
  11043. class: vue.normalizeClass(["item-icon-box", item.type])
  11044. },
  11045. [
  11046. vue.createElementVNode(
  11047. "text",
  11048. { class: "item-icon-symbol" },
  11049. vue.toDisplayString(item.type === "income" ? "+" : "-"),
  11050. 1
  11051. /* TEXT */
  11052. )
  11053. ],
  11054. 2
  11055. /* CLASS */
  11056. ),
  11057. vue.createElementVNode("view", { class: "item-center" }, [
  11058. vue.createElementVNode(
  11059. "text",
  11060. { class: "item-title" },
  11061. vue.toDisplayString(item.title),
  11062. 1
  11063. /* TEXT */
  11064. ),
  11065. vue.createElementVNode(
  11066. "text",
  11067. { class: "item-desc" },
  11068. vue.toDisplayString(item.time) + " " + vue.toDisplayString(item.desc),
  11069. 1
  11070. /* TEXT */
  11071. )
  11072. ]),
  11073. vue.createElementVNode("view", { class: "item-right" }, [
  11074. vue.createElementVNode(
  11075. "text",
  11076. {
  11077. class: vue.normalizeClass(["item-amount", { income: item.type === "income", expense: item.type === "expense" }])
  11078. },
  11079. vue.toDisplayString(item.type === "income" ? "+" : "") + vue.toDisplayString(item.amount),
  11080. 3
  11081. /* TEXT, CLASS */
  11082. ),
  11083. vue.createElementVNode("view", { class: "item-tag" }, [
  11084. vue.createElementVNode(
  11085. "text",
  11086. null,
  11087. vue.toDisplayString(item.tag),
  11088. 1
  11089. /* TEXT */
  11090. )
  11091. ])
  11092. ])
  11093. ]);
  11094. }),
  11095. 128
  11096. /* KEYED_FRAGMENT */
  11097. ))
  11098. ]);
  11099. }),
  11100. 128
  11101. /* KEYED_FRAGMENT */
  11102. )),
  11103. vue.createElementVNode("view", { class: "list-padding-bottom" })
  11104. ])
  11105. ])
  11106. ]);
  11107. }
  11108. const PagesMinePointsDetail = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/points/detail.vue"]]);
  11109. __definePage("pages/login/login", PagesLoginLogin);
  11110. __definePage("pages/recruit/landing", PagesRecruitLanding);
  11111. __definePage("pages/recruit/form", PagesRecruitForm);
  11112. __definePage("pages/recruit/auth", PagesRecruitAuth);
  11113. __definePage("pages/recruit/qualifications", PagesRecruitQualifications);
  11114. __definePage("pages/recruit/success", PagesRecruitSuccess);
  11115. __definePage("pages/login/reset-pwd-verify", PagesLoginResetPwdVerify);
  11116. __definePage("pages/login/reset-pwd-set", PagesLoginResetPwdSet);
  11117. __definePage("pages/home/index", PagesHomeIndex);
  11118. __definePage("pages/home/work-status", PagesHomeWorkStatus);
  11119. __definePage("pages/orders/index", PagesOrdersIndex);
  11120. __definePage("pages/orders/detail", PagesOrdersDetail);
  11121. __definePage("pages/orders/anomaly", PagesOrdersAnomaly);
  11122. __definePage("pages/mine/order-stats", PagesMineOrderStats);
  11123. __definePage("pages/mine/rewards", PagesMineRewards);
  11124. __definePage("pages/mine/rewards-all", PagesMineRewardsAll);
  11125. __definePage("pages/mine/index", PagesMineIndex);
  11126. __definePage("pages/mine/settings/index", PagesMineSettingsIndex);
  11127. __definePage("pages/mine/settings/profile/index", PagesMineSettingsProfileIndex);
  11128. __definePage("pages/mine/settings/auth/index", PagesMineSettingsAuthIndex);
  11129. __definePage("pages/mine/settings/auth/edit", PagesMineSettingsAuthEdit);
  11130. __definePage("pages/mine/settings/bank/index", PagesMineSettingsBankIndex);
  11131. __definePage("pages/mine/settings/security/index", PagesMineSettingsSecurityIndex);
  11132. __definePage("pages/mine/settings/profile/edit-name", PagesMineSettingsProfileEditName);
  11133. __definePage("pages/mine/settings/security/change-password", PagesMineSettingsSecurityChangePassword);
  11134. __definePage("pages/mine/settings/security/change-phone", PagesMineSettingsSecurityChangePhone);
  11135. __definePage("pages/mine/settings/notification/index", PagesMineSettingsNotificationIndex);
  11136. __definePage("pages/mine/settings/about/index", PagesMineSettingsAboutIndex);
  11137. __definePage("pages/mine/wallet/index", PagesMineWalletIndex);
  11138. __definePage("pages/mine/wallet/bill", PagesMineWalletBill);
  11139. __definePage("pages/mine/level/index", PagesMineLevelIndex);
  11140. __definePage("pages/mine/message/index", PagesMineMessageIndex);
  11141. __definePage("pages/mine/message/order", PagesMineMessageOrder);
  11142. __definePage("pages/mine/message/system", PagesMineMessageSystem);
  11143. __definePage("pages/mine/message/detail", PagesMineMessageDetail);
  11144. __definePage("pages/mine/points/index", PagesMinePointsIndex);
  11145. __definePage("pages/mine/points/detail", PagesMinePointsDetail);
  11146. const _sfc_main = {
  11147. onLaunch: function() {
  11148. formatAppLog("log", "at App.vue:4", "App Launch");
  11149. },
  11150. onShow: function() {
  11151. formatAppLog("log", "at App.vue:7", "App Show");
  11152. },
  11153. onHide: function() {
  11154. formatAppLog("log", "at App.vue:10", "App Hide");
  11155. }
  11156. };
  11157. const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/App.vue"]]);
  11158. function createApp() {
  11159. const app = vue.createVueApp(App);
  11160. return {
  11161. app
  11162. };
  11163. }
  11164. const { app: __app__, Vuex: __Vuex__, Pinia: __Pinia__ } = createApp();
  11165. uni.Vuex = __Vuex__;
  11166. uni.Pinia = __Pinia__;
  11167. __app__.provide("__globalStyles", __uniConfig.styles);
  11168. __app__._component.mpType = "app";
  11169. __app__._component.render = () => {
  11170. };
  11171. __app__.mount("#app");
  11172. })(Vue);